外部割り込みを試す / ピン変化割り込みPCINT18 (PD2)

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

f:id:ti-nspire:20190625065641j:plain:h250 f:id:ti-nspire:20190625065652p:plain:h250