- ベストアンサー
C言語・PICにおける割り込み回数によるLED点滅速度の変更方法
- C言語・PICにおいて、割り込み回数を調整してLEDの点滅速度を変更する方法を教えてください。
- 割り込みを使用してLEDを点滅させるプログラムにおいて、割り込みが発生するたびにカウンタ変数をインクリメントし、一定の回数に達したらLEDの出力を反転する処理を実装しています。しかし、点滅速度が変わらずに困っています。
- 上記のプログラムにおいて、割り込み回数をカウントするための変数がうまく機能していない可能性があります。変数の初期化やインクリメントの方法を確認してみてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
a++ 時に TOIF=0 が無いのですが? (メインプログラムに戻らずに割り込みにの多重実行になっているのでは)
その他の回答 (4)
- KAZUMI2003
- ベストアンサー率37% (77/208)
アタ(チェック) 値○
お礼
No.3の方の通りでした。 回答ありがとうございました!
- KAZUMI2003
- ベストアンサー率37% (77/208)
まず、TOIFとTOIEは違うものなのですよね? まあ、それはどうでも、ですが。TOIFをどこか他でで制御しないと、この関数は一回だけ10をカウントしてPORTAとPORTBに操作をしてTOIFはゼロになってそれっきりですが、そういう意図でしょうか? さて、その操作ですが、シンボル名から、PORTAとPORTBはIOポートだと推測しますが、それは、書き込んだ値が読み返せるものなのでしょうか?PORTA ^=0xffは、PORTAから値を読み、それと0xffの排他的論理和を、PORTAに書き込む、という動作をします。前に書き込んだアタがちゃんと読み出せるのでしょうか?
お礼
回答ありがとうございます! T0IE はタイマー割り込みの許可を設定するものです。 これが0だと割り込みは不許可になり動作せず、1だと許可されて動作します。 T0IF はタイマークロックが入ってくると加算される箱のようなものです。 これがいっぱいになると割り込みハンドラが呼ばれるようです。 呼んだあとは自動的に0に戻り、また加算されていきます。 その繰り返しで一定周期に割り込みハンドラを呼び、LEDの出力を反転させているのです。 要するに違うものです。 そもそも点滅はしているので、問題なく0xffの排他的論理和をPORTA,Bに書き込んでいます。 つまり読み込んでもいます。 と、思っています(汗) PICマイコンは今までの経験上、PORTに書き込んだ値は読み出せます。 私が使っていたマイコンが、たまたま読み出せただけかもしれませんが。。。
- Tacosan
- ベストアンサー率23% (3656/15482)
このプログラムだけで 「割り込み」があったときに peko という関数を呼び出す かどうかはわからんのだけど, それは大丈夫?
お礼
点滅はしているので、割り込み自体は発生しているようです! 回答ありがとうございました。
- koujikuu
- ベストアンサー率43% (429/993)
割り込み処理にreturnが必要ですか?
お礼
早速の回答ありがとうございます。 returnを外しても症状は変わりませんでした。 しかし、returnはなくてもいいようですね! 参考になりました。
お礼
素晴らしい!!!その通りでした! そうですよね、a++時にもTOIF=0しておかないと戻らないですよね(汗) 一応改善後のプログラム(改善したとこのみ)を書いておきます。 void interrupt peko(void) { if(T0IF) { T0IF = 0; if(a==10) { PORTA ^= 0xff; PORTB ^= 0xff; a=0; } else { a++; } } } T0IF = 0;をifの外に出しただけです。 これで無事に点滅が遅くなりました。 回答ありがとうございました!