外部割り込みを試す / INT0 (PD2)
https://github.com/ti-nspire/AVR/tree/master/helloInterrupt
INT0 (PD2)、INT1 (PD3)へは、立ち上がり、立ち下がり、変化したとき、ローレベルのとき、という4種類で割り込みがかけられる。
PD2、PD3を含めすべてのIOピンへはピン変化割り込み(PCINT)がかけられる。
下のコードは、whileループでLチカをしている最中にタクトスイッチから外部割り込みをかける。今のところしくみはまったくわからない。
#include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> ISR(INT0_vect){ if(bit_is_clear(PIND, PD2)){PORTB |= (1 << PB1);} // PD2に接続したタクトスイッチが押されていれば、PB1に接続したLEDを点けることにする。 else {PORTB &= ~(1 << PB1);} // PD2に接続したタクトスイッチが押されていなければ、PB1に接続したLEDを消すことにする。 } void initInterrupt0(){ EIMSK |= (1 << INT0); // INT0 (外部割り込み要求0イネーブル)を有効化する。 EICRA |= (1 << ISC00); // INT0のロジックが変化したときに割り込み要求を生成する。 sei(); // (グローバル)割り込みイネーブルビットをセットする。 } int main(){ DDRB = 0xff; // ポートBのIOを全部OUTにする。そこにLEDをつなぐ。 PORTD |= (1 << PD2); // ポートDのPD2 (デフォルトのIOはIN)を内部プルアップする。そこにタクトスイッチをつなぐ。 initInterrupt0(); while(1){ _delay_ms(200); PORTB ^= (1 << PB0); } return 0; }