ピン変化割り込み

p.341
今度はピン変化割り込みを試す。入力信号のロジックが変化するたびに割り込みがかかる。ピン変化割り込みは外部割り込み(INT0、INT1)と違ってすべてのGPIOで利用できる。
f:id:ti-nspire:20200518074636p:plain:h260 f:id:ti-nspire:20200518074723j:plain:h260

; スタックポインタの初期化マクロ
.MACRO INITSTACK
    LDI R20, HIGH(RAMEND)
    OUT SPH, R20
    LDI R20, LOW(RAMEND)
    OUT SPL, R20
.ENDMACRO

; 割り込みベクターテーブルを侵さないようにするため、マイコンのリセット後はただちに別の番地へ飛ぶことにする。
.ORG 0
    JMP MAIN

; PCINT2割り込み(PORTDピン変化割り込み)がかかると制御が0x0A番地に飛んでくるので、そこからさらに別の番地へ飛んで何かを実行する。
.ORG PCI2addr ; 0x0A
    JMP PCINT2_ISR

.ORG 0x100
MAIN:
    INITSTACK

    ; PB1のIOをOUTにして、
    SBI DDRB, 1

    ; PB1の出力を最初は0にして、
    CBI PORTB, 1

    ; PD4からピン変化割り込みをかけることにして、
    LDI R20, 1 << 4
    STS PCMSK2, R20

    ; PCINT2割り込みを有効化して、
    LDI R20, 1 << PCIE2
    STS PCICR, R20

    ; グローバル割り込みを有効化して、
    SEI

HERE:
    RJMP HERE

.ORG 0x200
PCINT2_ISR:
    ; PCINT2割り込みがかかったらPB1の出力をトグルする。
    IN R16, PORTB
    LDI R17, 1 << PB1
    EOR R16, R17
    OUT PORTB, R16
    RETI