外部割り込みINT0

p.338

今度は外部割り込みINT0を試す。

INT0 (PD2)へ入力される信号のfalling edgeが検出されるたびにPB1の出力をトグルしてみる。入力は念のためローパスとシュミットトリガとでディバウンスしたので、INT0 (PD2)は内部プルアップしない。

f:id:ti-nspire:20200514063438p:plain:h315

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

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

; INT0割り込みがかかると制御が0x02番地に飛んでくるので、そこからさらに別の番地へ飛んで何かを実行する。
.ORG INT0addr ; 0x02
    JMP EX0_ISR ; 3 cycles

.ORG 0x100
MAIN:
    INITSTACK

    ; INT0のfalling edgeで割り込むことにして、
    LDI R20, 1 << ISC01
    STS EICRA, R20

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

    ; INT0割り込みを有効化して、
    SBI EIMSK, INT0
    ;LDI R20, 1 << INT0
    ;OUT EIMSK, R20

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

HERE:
    RJMP HERE

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

f:id:ti-nspire:20200514064336p:plain:w600