AVRマイコン 外部割り込み
AVRでの割り込み処理についてメモしておきます。使用する言語は、C言語、使用するAVRは、ATmega88P。
割り込み
割り込みとは、CPUの行っている処理をなんらかのイベントにより、処理を分けること。CPU内部から発せられる物、0除算などは、内部割り込み、CPU外部から発せられる物、入力機器からの入力などは、外部割り込みに分類される。
今回は、AVRの汎用IOポートの割り込みを検出する。なので、外部割り込み。
AVRには、割り込みに使用できる専用ポート、INT0、INT1がある。
全てのポートで、ポートの変化を検出しており、この割り込みが発生する。今回はこちらを使う。
プログラムリスト
#include <avr/io.h>
#inlcude <avr/interrupt.h>
ISR(PCINT0_vect) // ポートB用
{
// 割り込みが発生 ここにその処理を記述
}
ISR(PCINT1_vect) // ポートC用
{
}
ISR(PCINT2_vect) // ポートD用
{
}
int main()
{
// ポートの入力を設定する
DDRB = 0b00000000;
DDRC = 0b00000000;
DDRD = 0b00000000;
// 割り込みポートの有効にする
PCICR = _BV(PCIE0) | _BV(PCIE1) | _BV(PCIE2);
// 割り込みポートを指定する
PCMSK0 = _BV(PCINT0) | _BV(PCINT1) | _BV(PCINT2) | _BV(PCINT3) |
_BV(PCINT4) | _BV(PCINT5) | _BV(PCINT6) | _BV(PCINT7);
PCMSK1 = _BV(PCINT8) | _BV(PCINT9) | _BV(PCINT10) | _BV(PCINT11) |
_BV(PCINT12) | _BV(PCINT13) | _BV(PCINT14);
PCMSK2 = _BV(PCINT16) | _BV(PCINT17) | _BV(PCINT18) | _BV(PCINT19) |
_BV(PCINT20) | _BV(PCINT21) | _BV(PCINT22) | _BV(PCINT23);
// 割り込みを有効にする
sei();
// 終了しないようにする
while(1);
return 0;
}
解説
上記のプログラムリストでは、全てのポートで割り込みが有効。
ただし、PC6(PCINT14/~RESET)は、フューズでリセットを無効にしないと有効にならない。有効にしてしまうと、ISP書き換えが使用できなくなるので注意。
PCICRレジスタで、割り込みの設定をする。PCIE0、1、2は、それぞれポートB、C、Dに対応。
PCMSKレジスタで、ポートでどのビットを有効にするかを決定。PCMSK0、1、2は、それぞれポートB、C、Dに対応。
PCMSKレジスタは、DDRやPORT、PINと同様に設定可。
sei関数を使って、割り込みを有効にする。_enable_interrupt()でも可能。
最後に、プログラムが終了しないようにする。
割り込みが発生すると、ISR関数で指定した内容が実行される。関数終了後は、割り込みが発生した命令の場所に戻る。
もし、割り込みが発生したときに、AVRマイコンが勝手にリセットされてしまう場合は、ISR関数が正しく指定されていない可能性がある。PCINT0_vectなどは、AVRマイコンによって違うので注意。
この外部割り込みについての資料があまりなかったので、メモしておきました。ここのプログラムリストについては、即席で作った物で、テストしていないので、注意してください。似たようなプログラムでチェックはしています。
コメントする