p.295
CTCモードのTimer2で生成した時間遅延を利用してPB6をトグルする。
Timer0と大きく違うのは、★
で示した行だけである。OUT
の代わりにSTS
を使う。
; スタックポインタの初期化マクロ .MACRO INITSTACK LDI R20, HIGH(RAMEND) OUT SPH, R20 LDI R20, LOW(RAMEND) OUT SPL, R20 .ENDMACRO ; スタックポインタを初期化して、 INITSTACK ; PB6のIOをOUTにして、 SBI DDRB, 6 ; PB6からHを出力して、(トグルの初期値なのでLにしても同じ) LDI R17, 1 << PB6 OUT PORTB, R17 ; PB6をトグルするためのマスクビットをセットして、 LDI R16, 1 << PB6 ; Timer2のコンペア値Aを設定して、 LDI R20, 10 STS OCR2A, R20 ; ★ ; Timer2をCTCモードにして、 LDI R20, 1 << WGM21 STS TCCR2A, R20 ; ★ BEGIN: ; 待って、 RCALL DELAY ; PB6の出力をトグルして、 EOR R17, R16 OUT PORTB, R17 ; を無限に繰り返す。 RJMP BEGIN DELAY: ; Timer2をリセットして、 LDI R20, 0 STS TCNT2, R20 ; ★ ; CS20ビットを1 (クロックを1分周)にしてTimer2でカウントをスタートする。 LDI R20, 1 << CS20 STS TCCR2B, R20 ; ★ AGAIN: ; Timer2がコンペア値Aにマッチするまでとどまって、(すなわちコンペアマッチフラグAがセットされたら次の命令をスキップして、) ; Skip if Bit in I/O Register is Set SBIS TIFR2, OCF2A RJMP AGAIN ; Timer2のコンペアマッチフラグAがセットされたらTimer2をストップして、 LDI R20, 0 STS TCCR2B, R20 ; ★ ; Timer2のコンペアマッチフラグAをクリアして、 LDI R20, 1 << OCF2A OUT TIFR2, R20 ; 遅延函数ルーチンを抜ける。 RET