p.338
今度は外部割り込みINT0を試す。
INT0 (PD2)へ入力される信号のfalling edgeが検出されるたびにPB1の出力をトグルしてみる。入力は念のためローパスとシュミットトリガとでディバウンスしたので、INT0 (PD2)は内部プルアップしない。
; スタックポインタの初期化マクロ .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