PIC16F1503。 ポンプ甚手抌し車-2.ラむト

以前は音に぀いおでした。

私は最埌の投皿を未完成のたたにした。 芚えおいるなら、「たさに音」を拟うこずができたせんでした。 「盎芳による数字」を拟う詊みは、通垞の「ピりピり」よりもはるかに悪いこずが刀明したした...䞀方では、ずにかく-䞭囜のツむヌタヌから音はありたせんが、他方では-「汚れた仕事、䜎クラス」。 この堎合も、16 MHzのクロック呚波数を駆動したす...



䞀般的に、私はどこか間違ったこずをしたした。 翌日の倕方、音楜ずそのリテラシヌに関する教育プログラムは、以前よりもさらに倚くの質問を投げかけたした鋭い鋭さがあるようですが、鋭い鋭さはないようですが、代わりにEフラット。 しかし、私は「トレヌニングマニュアルで日本語を取る」こずに慣れおいないので、理解し続けたした。 同時に、顧客は仕様の倉曎に぀いお話し合いたしたおなじみの画像ではありたせんか。これは、「ボトムむルミネヌション」を远加するこずでした。 これは実際にはパトカヌであるず蚀う私のti病な詊みに察しお、それは黒人地区のパトカヌであるずいう答えが受け取られたした...

そもそも、音を消すこずにしたした。 呚波数ずPWMを倉曎し、分呚噚を255で1に蚭定し、7692 Hzず62 Hzの呚波数を取埗したした。 範囲は少し倉曎されたしたが、それでも-かなりです。

そしお、䜕かが分呚噚128で呚波数を枬定するように私を匕っ匵った。私は7692-62/ 2 = 3815Hzのようなものを埗るず思っおいたが、䜕らかの理由で私は125しか埗なかった...そしお私は、鹿のセヌタヌの私の奜きなプログラマヌのように、それは倜明け呚波数分呚噚の関係は線圢であるず誰が蚀ったのか いく぀かの䜙分な枬定により、私は絶察に正しいこずが瀺されたした。 オシロスコヌプず゚クセルを備えた小さなtrachytibidochは、このような矎しいHz-Timer画像を提䟛したした通垞のように、オリゞナルは投皿の最埌にアヌカむブにありたす。



今では、なぜ私の音がひどいものになったのかが明らかになりたした。 さらに、コメントの䞭で、圌らは2KBのROMに曲が詰められおいるドアベルに぀いお芚えおいたした...䜕を探すべきかを知っおいるずき、それは速いです。

最初ののようなスキヌムは、92歳の雑誌Radioの第8号に掲茉されたした。 シックな私にずっおタブレットがあった



そしお次のペヌゞ-ファヌムりェア自䜓。 さらに倚くのガグラヌゞず2月93日、「アマチュアラゞオ」が芋぀かりたす。 たったく同じ原理がありたすが、さらにメロディヌがありたす。

Excelを再床充電し2番目のタブのアヌカむブで、遅延をハヌドりェアから゜フトりェアに倉換したす。

いく぀かのコヌドを远加する

// come cool sound const uint8_t m1[31]={49,49,52,52,58,58,58,58,38,38,28,52,52,52,52,52,52,52,52,38,38,36,38,36,38,52,52,49,49,49,49}; const uint8_t m2[31]={49,42,38,38,49,42,38,42,49,52,58,52,49,42,52,65,49,42,38,38,49,42,38,42,49,52,58,42,49,42,52}; // play like this uint8_t c; for(c=0;c<31;c++) { PWM3_LoadDutyValue(m1[c]*2); TMR2_LoadPeriodRegister(m1[c]); __delay_ms(120); } 

そしお也杯 䞭囜のツむヌタヌからは、私の耳でさえ䞍快にならない非垞に認識可胜な音を聞くこずができたす。 原則ずしお、私たちは自分自身を誇りに思うこずができたす-新しい芁玠ベヌスで、私たちは「論理」に関する20幎のスキヌムを繰り返したした。 マシンがプレむできない堎合でも、い぀でもドアベルでリメむクできたす:)

䞀般的に、最高の「すごい」を怜玢するプロセスは継続したすが、原則ずしお音の問題は解決したした。 私たちは光に目を向けたす。

最初の投皿で曞いたように、ネむティブLEDは青色で非垞に明るいものでした。 さらに、私は青い光が赀いフィルタヌを通しお茝き、すべおの調和に違反しおいるこずにoutりたした。 したがっお、倉曎する必芁がありたす。

スタッシュから赀いLEDを取り出し、点灯させたした。 最初の問題明るさが異なりたす。 青は非垞に明るいです。 「隠し堎所から」に倉曎したす-ただ違いたす。 もちろん、远加の抵抗を消音するこずもできたすが、それはあたりにも単玔です。 最埌にRGB LEDに到達し、奇跡が起こりたした 同じ明るさのすべおの色で茝いおいたす。 原則ずしお、「最も安い」の50ほどの費甚がかかるため、驚くこずではありたせん。

私はすべおのニヌズシャンデリアの赀ず青の郚分、ヘッドラむト、䞋郚に4぀のRGB LEDを䜿甚するこずにしたした。 私のLEDには共通のカ゜ヌドがあるため、3RGB* 4ピヌス-制埡のために12本の脚が必芁です。 繰り返しになりたすが、マむクロコントロヌラヌには12通垞14、ただし2぀の電源のレッグしかなく、その1぀は「入力」リセットに割り圓おられ、もう1぀は「音楜」の䞋に割り圓おられたす。 そしお、他のどこかで、スむッチを切っお予備を残す必芁がありたす。

通垞、このような堎合、圌らはたさにそれを行っおいたす。ある皮の「ポヌト゚クスパンダヌ」を䜿甚しおむンストヌルしたす。 最も䞀般的なオプションは、シフトレゞスタタむプ74HC595です。 しかし、2番目のチップを䞊べお配眮するこずは、砎綻し、予算を完党に超過したす。 すべおのプロゞェクトがこれを行うず、パむには䜕も残りたせん...そしお、studiovsemoe.comの私たちは本圓に食べるのが倧奜きです:)

したがっお、私は反察に行き、コントロヌラヌですべおを行いたす。 このように足を広げたすすべお出口たで



そしお、私はこのようにLEDを接続したすい぀ものように、アヌカむブ内の完党な回路



図では、各LEDを3぀の個別のLEDに「分割」しお、動䜜原理を明確にしたした。 たあ、䜕らかの理由で、抵抗は10kで止たりたしたが、実際には200-300オヌムです。 その結果、4x3 LEDマトリックスができたした。

重芁このスキヌムは1-2-3 LEDにのみ適しおいたす。 さらに接続する予定がある堎合-L298のような特別なドラむバヌを䜿甚しおください-さもなければ、マむクロ回路の出力を流れる電流が倧きすぎたす。

コヌドを远加する

 LATCbits.LATC0 = 1; // RED LATCbits.LATC1 = 1; // GREEN LATCbits.LATC2 = 1; // BLUE LATCbits.LATC3 = 0; LATCbits.LATC4 = 0; LATCbits.LATC5 = 0; LATAbits.LATA5 = 0; 


ここでは、レッグC0〜C2を1に蚭定し、C3〜C5ずA5をれロに蚭定したす。 すべおが正しく組み立おられおいる堎合は、すべおのLEDを「癜色光」で点灯する必芁がありたす。

どうした ご存知のように、電流は電䜍の高い堎所から䜎い堎所に流れたす。 そしお、片方の足には1たたは+ 3Vがあり、もう片方の足には-0がありたす。LEDが点灯したす。 それらずそれらの脚にファむル0たたは1があれば、䜕も燃えたせん。 ずころで、回路の汎甚性もここから珟れたす-私のような共通のカ゜ヌドではなく、共通のアノヌドを持぀LEDがある堎合、コヌド内で0から1に倉曎するだけで機胜したす。

その結果、脚C0〜C2の状態を組み合わせお、グロヌの色を遞択できたす。たた、他のLEDが4぀のうちどれを点灯するかを遞択できるため、元の12脚の代わりに7幎かかりたす。 あたりクヌルではありたせんシフトレゞスタを䜿甚するず2぀実行できたすが、この目的には十分すぎるほどです。

ただし、少なくずも2぀のLEDを異なる色シャンデリアずヘッドラむト、ヘッドラむト、ボトムなどで同時に点灯する必芁がありたす。 ここでは、䞖界ず同じくらい叀いトリックを䜿甚したす。LEDをすばやく切り替えお、目的の色をオンにしたす。 十分に速く行われた堎合、目はちら぀きに気付かないでしょう。

色を点滅させようずしたす意味は衚蚘法から理解できるず思いたす

 LATCbits.LATC3 = 0; LATCbits.LATC4 = 0; LATCbits.LATC5 = 0; LATAbits.LATA5 = 0; while(1) { LATCbits.LATC0 = 1; LATCbits.LATC1 = 0; LATCbits.LATC2 = 0; __delay_ms(50); LATCbits.LATC0 = 0; LATCbits.LATC1 = 1; LATCbits.LATC2 = 0; __delay_ms(50); LATCbits.LATC0 = 0; LATCbits.LATC1 = 0; LATCbits.LATC2 = 1; __delay_ms(50); } 


そしお、LEDがどれほど矎しく点滅し、色を分類しおいるかを確認したす...

原則ずしお、ポヌトで盎接動䜜するように曞き換えるこずができたす-それは簡単です。

 while(1) { LATC=0b00000001; __delay_ms(50); LATC=0b00000010; __delay_ms(50); LATC=0b00000100; __delay_ms(50); } 


違いは䜕ですか 違いは 最初のオプションはすべおのバむンディングで89バむト、2番目のオプションは8バむトの青の差を取りたす。 さお、2番目の方が速く動䜜したす:)

理解できない堎合は、蚭蚈

 LATC=0b00000001; 


完党に類䌌

 LATCbits.LATC0 = 1; LATCbits.LATC1 = 0; LATCbits.LATC2 = 0; LATCbits.LATC3 = 0; LATCbits.LATC4 = 0; LATCbits.LATC5 = 0; LATCbits.LATC6 = 0; LATCbits.LATC7 = 0; 


短所はどこですか 欠点は、いく぀かのコントロヌラヌでは有甚な䜕かのために最も重芁なビットを䞎えるこずができ、すべおをそこに抌し蟌み、汚れた手で登るずいうこずです...

マむナスはどこですか もう1぀のマむナス点は、「恐怖」に察凊する必芁があるこずです。 たあ、これは私たちのような才胜にずっお䟡倀のないこずです。 ネカの鉄片がそれに埓事しおいたす。

サりンドを担圓するタむマヌがありたす。 いいえ、圌には觊れたせんが、圌の隣人には觊れたす。 倉曎のために、TIM1を䜿甚したす

TIM2ずの違いは䜕ですか たず、粟床が高い-TIM2の範囲が255の郚分に分割されおいる堎合、ここでは65535に分割されたす。぀たり、呚波数をより正確に取埗できたす。 第二に、圌は䜕にも執着せず、​​圌には䜕も執着したせん。 そしお最埌に、その出力をマむクロコントロヌラヌの足元に持ち蟌むこずができたす。 これはほずんど必芁ないので、割り蟌みを蚱可し、割り蟌みハンドラヌでLEDを点滅させたす。

䞀般的に、このように蚭定したす



ここでの䞻なこずは、割り蟌みを含めるこずず、関数の各割り蟌みを呌び出すこずに泚意を払うこずです最終行。

珟圚、最埌のtmr1.cファむルには、64マむクロ秒ごずに呌び出される関数がありたすちなみに、幅広い機胜[リロヌド倀]フィヌルドに泚意しおくださいにより、この倀を「4秒に1回」に倉曎できたす。

 void TMR1_ISR(void) { // Clear the TMR1 interrupt flag PIR1bits.TMR1IF = 0; TMR1H = (timer1ReloadVal >> 8); TMR1L = timer1ReloadVal; // Add your TMR1 interrupt custom code } 


拡匵可胜で構成可胜なコヌドが倧奜きなので、LEDを担圓する2぀のファむルをプロゞェクトに远加したす

led.h
 // basic colors #define RED 1 #define GREEN 2 #define BLUE 4 #define OFF 0 // set led N to color C void setLed(uint8_t n,uint8_t c); // get color of led N uint8_t getLed(uint8_t n); extern volatile uint8_t lc[4]; // How LED connected #define _LED1_ LATCbits.LATC3 #define _LED2_ LATCbits.LATC4 #define _LED3_ LATCbits.LATC5 #define _LED4_ LATAbits.LATA5 #define _LEDR_ LATCbits.LATC0 #define _LEDG_ LATCbits.LATC1 #define _LEDB_ LATCbits.LATC2 


次に、led.cに色付きの「䜜業」を远加したす

 volatile uint8_t lc[4]; // current led colors 0 - off void setLed(uint8_t n,uint8_t c) { lc[n]=c; } uint8_t getLed(uint8_t n) { return lc[n]; } 


そしお、割り蟌みハンドラヌコヌド

 switch(current_led) { case 0: _LED1_=0; _LED2_=1; _LED3_=1; _LED4_=1; break; case 1: _LED1_=1; _LED2_=0; _LED3_=1; _LED4_=1; break; case 2: _LED1_=1; _LED2_=1; _LED3_=0; _LED4_=1; break; case 3: _LED1_=1; _LED2_=1; _LED3_=1; _LED4_=0; break; } if((lc[current_led]&RED)==RED) _LEDR_=1; else _LEDR_=0; if((lc[current_led]&GREEN)==GREEN) _LEDG_=1; else _LEDG_=0; if((lc[current_led]&BLUE)==BLUE) _LEDB_=1; else _LEDB_=0; current_led++; if(current_led>3) current_led=0; 


最埌に、確認コヌドを曞く以倖にやるこずはありたせん。

 setLed(0,RED); setLed(1,GREEN); setLed(2,BLUE); setLed(3,RED+GREEN+BLUE); __delay_ms(50); setLed(1,RED); setLed(2,GREEN); setLed(3,BLUE); setLed(0,RED+GREEN+BLUE); __delay_ms(50); setLed(2,RED); setLed(3,GREEN); setLed(0,BLUE); setLed(1,RED+GREEN+BLUE); __delay_ms(50); setLed(3,RED); setLed(0,GREEN); setLed(1,BLUE); setLed(2,RED+GREEN+BLUE); __delay_ms(50); 


コンパむルしお実行し、完党な䞍満を取埗したす。 䜕も点滅せず、オヌバヌフロヌしたせん。 なんで 考えたり探したりするこずからあなたを救いたす 64マむクロ秒ごずに割り蟌みを生成するように蚭定したためです。 そしお、プロセッサは62キロヘルツで動䜜したした。 ぀たり、1クロックサむクルには16マむクロ秒かかりたす。 プロセッサが䞊蚘のコマンドをすべお4クロックサむクルで積み重ねるこずができるず信じおいる人はいたすか 信じられたせん。 その結果、マむクロコントロヌラヌはタむマヌ割り蟌みハンドラヌで氞久にハングアップしたす。

論理的掚論実際には、通垞の遞択により、1぀の割り蟌みが3ミリ秒たたはタむマヌカりンタヌのFFC0のオヌダヌで凊理されるこずがわかりたす。

䜕が芋える ちら぀きのある色を倉えるLEDが芋えたす。 そしお、「玔癜」は芋えたせん。 その理由は䜕ですか 理由は時間、たたはむしろ頻床です。 LEDは今どのように機胜したすか 3msはオンです-9msはオンではありたせん。 25のカバレッゞで80ヘルツのPWM呚波数。 経隓から、私は目が200ヘルツからどこかにPWMに気づかないこずを知っおいたす。

どうする 最も簡単な方法は、頻床を䞊げるこずです。 遅かれ早かれ、目はちら぀きに気づかなくなりたす。 サりンド呚波数が「フロヌトアりェむ」であっおも、TIM2での予備分呚噚の可胜な倀-11、14、116、164を調べたす。 呚波数は62KHzになりたした。぀たり、62 * 4 = 250KHz、62 * 16 = 1MHz、たたは62 * 64 = 4MHzを蚭定できたす。

最善は善の敵です。そのため、マむクロコントロヌラヌの呚波数を1 MHzに蚭定し、分呚噚を1:16に倉曎しお、ファヌムりェアを再床満たしたす。 やった ちら぀きがなくなりたした。



確かに、いく぀かの色...実際にはそうではありたせん。 いいえ、これらは私が写真を撮ったiPhoneの䞍具合ではありたせん。 それは本圓に赀のような赀だけです実際には癜赀青緑があるはずです。 たた、必芁な50ミリ秒ずはたったく異なり、スむッチは䞀皮の緩慢です。

問題は䜕ですか 繰り返したすが、悪圹の物理孊者は私たちを時流に乗せたした180マむクロ秒3ms / 16で、LEDには「燃え䞊がる」時間がありたせん。 結果は、写真に芋えるものです。

䜕ができたすか 繰り返しになりたすが、「額」゜リュヌションは、LEDが点灯した埌に遅延を突くように頌みたす。 原則ずしお、解決策は良いです。 しかし、プログラマヌに有利なスタヌトを切る方が良いです。

なんで 思考実隓を行い、さらに2぀のLEDを远加したしょう。 25のカバレッゞでPWMを䜿甚しおいた堎合、16になりたす。 さらに4぀远加するず、10に枛少したす。 これは、結果のデザむンが機胜するように、頻床ず遅延ずセックスする方法を遞択する必芁がある方法です。

したがっお、アルゎリズムをもう䞀床芋おみたしょう。 圌は今このように芋える

-珟圚のLEDをオンにし、残りをオフにしたす
-珟圚のLEDの赀チャンネルに䜕かがありたすか はいの堎合は、赀チャネルをオンにし、そうでない堎合はオフにしたす
-珟圚のLEDには緑色のチャンネルに䜕かがありたすか はいの堎合、緑色のチャネルをオンにし、そうでない堎合はオフにしたす
-珟圚のLEDには青色のチャンネルに䜕かがありたすか はいの堎合は、青チャネルをオンにし、そうでない堎合はオフにしたす


そしお今、私たちは各LEDにより倚くの遅延を詰め蟌みたす...再びフリッカヌを取埗し、再び呚波数を䞊げたす。 完党な䞍適栌性ず暗いコヌナヌでのすすり泣きが埅っおいたす。

すすり泣きたくないので、アルゎリズムを次のものに倉曎したす

-チャンネルNをオンにしたす赀、緑、青
-LED M0,1,2,3、...で、珟圚のチャンネルHを点灯する必芁がありたすか はいの堎合は、オンにしたす。 そうでない堎合は、オフにしたす。
-Mのサむクルを繰り返したす
-最埌のLEDが点灯するたで埅ちたしょう。
-Hのサむクルを繰り返したす

違いはそれほど倧きくないようですが、違いを感じおください。PWMLEDの数に関係なく、それらは33いっぱいになりたす。 確認したす。

1぀のチャネルのコヌド残りは完党に䌌おいたす。 定矩はフルバヌゞョンでも芋るこずができたすが、名前は明確になるず思いたす。

 _LEDR_=_LEDON_; if ((lc[0] & RED) == RED) _LED1_ = _LEDOFF_; // INVERTED! else _LED1_ = _LEDON_; if ((lc[1] & RED) == RED) _LED2_ = _LEDOFF_; // INVERTED! else _LED2_ = _LEDON_; if ((lc[2] & RED) == RED) _LED3_ = _LEDOFF_; // INVERTED! else _LED3_ = _LEDON_; if ((lc[3] & RED) == RED) _LED4_ = _LEDOFF_; // INVERTED! else _LED4_ = _LEDON_; for(leds=0;leds<80;leds++) current_led++; _LEDR_=_LEDOFF_; 


そしお感心したす。



これは写真ではそれほどよく芋えたせんが、実際には、緑が緑に倉わり、青が青に倉わりたす。

さお、「フィナヌレのように」に倉わりたす。

 setLed(3,RED+GREEN+BLUE); setLed(2,GREEN); setLed(0,RED); __delay_ms(100); setLed(0,OFF); setLed(1,BLUE); __delay_ms(100); setLed(1,OFF); 


シャンデリアがりむンク ヘッドラむトが茝いおいたす そしお、底はすべおずおも緑です 䞀般に、私たちの取り組みにおける完党か぀無条件の成功。 かっこいいです モチベヌションには他に䜕が必芁ですか :)少し沈黙したす:)顧客ぞの結果の予備衚瀺は、完党な承認ず仕事のための远加のリ゜ヌスの割り圓おを受け取りたした「お父さん、あず2晩は非垞に静かになりたす」ず他の芪の脅迫

このこずによるボヌナスほずんどNYPDの点滅暙準

 uint8_t c; setLed(3, RED + GREEN + BLUE); setLed(2, GREEN); while (1) { setLed(0, RED); setLed(1, OFF); __delay_ms(40); for (c = 0; c < 10; c++) { setLed(0, OFF); __delay_ms(10); setLed(0, RED); __delay_ms(10); } setLed(1, BLUE); setLed(0, OFF); __delay_ms(40); for (c = 0; c < 10; c++) { setLed(1, OFF); __delay_ms(10); setLed(1, BLUE); __delay_ms(10); } } 


ショヌダりンのための最も思慮深い質問この堎合__delay_ms_X_が蚭定された_X_ msの5倍以䞊䌑止するのはなぜですか

しかし、それだけではありたせん。 次に、最も重芁な質問である「 このビゞネスをオフにする方法 」を怜蚎したす。

い぀ものように、すべおの完党なセットがここにありたすmultik.org/pic/policelight.rar

Source: https://habr.com/ru/post/J250229/


All Articles