Timer0のコンペアマッチ割り込み
pp.333-334
今度はTimer0のコンペアマッチ割り込みを使ってみる。
- メインループでは、PORTCに入力された値をPORTBから出力する。
- それと並行して、Timer0がコンペアマッチするたびにPD4の出力をトグルする。
; スタックポインタの初期化マクロ .MACRO INITSTACK LDI R20, HIGH(RAMEND) OUT SPH, R20 LDI R20, LOW(RAMEND) OUT SPL, R20 .ENDMACRO ; 割り込みベクターテーブルを侵さないようにするため、マイコンのリセット後はただちに別の番地へ飛ぶことにする。 .ORG 0 JMP MAIN ; Timer0コンペアマッチ割り込みAがかかると制御が0x1C番地に飛んでくるので、そこからさらに別の番地へ飛んで何かを実行する。 .ORG 0x1C JMP T0_CMA_ISR .ORG 0x100 MAIN: INITSTACK ; Timer0のコンペア値A .EQU CM0A = 200 ; PD4のIOをOUTにして、 SBI DDRD, 4 ; PC0~5のIOをINのまま内部プルアップして、 LDI R20, 0b111111 OUT PORTC, R20 ; PB0~5のIOをOUTにして、 OUT DDRB, R20 ; Timer0のコンペア値Aを設定して、 LDI R20, CM0A OUT OCR0A, R20 ; Timer0をCTCモードに設定して、 LDI R20, 1 << WGM01 OUT TCCR0A, R20 ; Timer0の分周比を1に設定してカウントを開始して、 LDI R20, 1 << CS00 OUT TCCR0B, R20 ; Timer0コンペアマッチ割り込みを有効化して、 LDI R20, 1 << OCIE0A STS TIMSK0, R20 ; グローバル割り込みを有効化して、 SEI HERE: ; PC0~5に入力された値を読み取って、それをPB0~5に出力する。 ; を繰り返す。 IN R20, PINC OUT PORTB, R20 RJMP HERE .ORG 0x200 T0_CMA_ISR: ; Timer0がコンペアマッチしたら、PD4の出力をトグルする。 IN R16, PORTD LDI R17, 1 << PD4 EOR R16, R17 OUT PORTD, R16 RETI