https://github.com/ti-nspire/AVR/tree/master/helloInterrupt_PCINT
外部割り込みを試す / INT0 (PD2) -と同じことを今度はピン変化割り込みPCINT18 (PD2)で実行してみる。
割り込みを使うときは、ISR(割り込みベクタ)
を定義しておいたうえで、割り込みに必要なレジスタビットをセットする。ピン変化割り込みをかけるときは、ポート(バンク)を指定したうえでピンを指定する。ピン変化割り込みはステータスの変化したことしかわからない。ピン変化割り込みはすべてのIOで利用できる。
#include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> ISR(PCINT2_vect){ // PCINT2_vectはポートDのピン変化割り込みベクタ(PCINT0ならポートB、PCINT1ならポートC)。 if(bit_is_clear(PIND, PD2)){PORTB |= (1 << PB1);} // PD2に接続したタクトスイッチが押されていれば、PB1に接続したLEDを点けることにする。 else {PORTB &= ~(1 << PB1);} // PD2に接続したタクトスイッチが押されていなければ、PB1に接続したLEDを消すことにする。 } void initPCINT18(){ PCICR |= (1 << PCIE2); // ポートDのピン変化割り込みを有効化する(PCIE0ならポートB、PCIE1ならポートC)。 PCMSK2 = (1 << PD2); // PD2から割り込みをかける(PCMSK0ならポートBの、PCMSK1ならポートCの任意のピン)。 sei(); // (グローバル)割り込みイネーブルビットをセットする。 } int main(){ DDRB = 0xff; // ポートBのIOを全部OUTにする。そこにLEDをつなぐ。 PORTD |= (1 << PD2); // ポートDのPD2 (デフォルトのIOはIN)を内部プルアップする。そこにタクトスイッチをつなぐ。 initPCINT18(); while(1){ _delay_ms(200); PORTB ^= (1 << PB0); } return 0; }