CTCモードのTimer1で時間遅延を生成する
p.300
PB6の出力をトグルする。
; スタックポインタの初期化マクロ .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 BEGIN: ; 待って、 RCALL DELAY ; PB6の出力をトグルして、 EOR R17, R16 OUT PORTB, R17 ; を無限に繰り返す。 RJMP BEGIN DELAY: ; Timer1をリセットして、 LDI R20, 0 STS TCNT1H, R20 STS TCNT1L, R20 ; Timer1のコンペア値Aを設定して、 LDI R20, 0xF0 STS OCR1AH, R20 LDI R20, 0x50 STS OCR1AL, R20 ; Timer1をCTCモードにし、CS10ビットを1 (クロックを1分周)にして、Timer1でカウントをスタートする。 LDI R20, 0 STS TCCR1A, R20 LDI R20, 1 << WGM12 | 1 << CS10 STS TCCR1B, R20 AGAIN: ; Timer1がコンペア値Aにマッチするまでとどまって、(すなわちコンペアマッチフラグAがセットされたら次の命令をスキップして、) ; Skip if Bit in I/O Register is Set SBIS TIFR1, OCF1A RJMP AGAIN ; Timer1のコンペアマッチフラグAがセットされたのでTimer1をストップして、 LDI R20, 0 STS TCCR1B, R20 ; Timer1のコンペアマッチフラグAをクリアして、 LDI R20, 1 << OCF1A OUT TIFR1, R20 ; 遅延函数ルーチンを抜ける。 RET