外部割り込みを試す / INT0 (PD2)

https://github.com/ti-nspire/AVR/tree/master/helloInterrupt

INT0 (PD2)、INT1 (PD3)へは、立ち上がり、立ち下がり、変化したとき、ローレベルのとき、という4種類で割り込みがかけられる。

PD2、PD3を含めすべてのIOピンへはピン変化割り込み(PCINT)がかけられる。

下のコードは、whileループでLチカをしている最中にタクトスイッチから外部割り込みをかける。今のところしくみはまったくわからない。

f:id:ti-nspire:20190624111120p:plain:h250

#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;
}