pp. 298-299
一定の時間が経過するたびにPB6をトグルする。
TCNT1
レジスタが16ビットであることを除けば、コードそのものはTimer0、Timer2と変わらない。
; スタックポインタの初期化マクロ .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, 0xD8 STS TCNT1H, R20 LDI R20, 0xF0 STS TCNT1L, R20 ; Timer1をノーマルモードにして、 LDI R20, 0 STS TCCR1A, R20 STS TCCR1B, R20 ; CS10ビットを1 (クロックを1分周)にしてTimer1をスタートする。 LDI R20, 1 << CS10 STS TCCR1B, R20 AGAIN: ; Timer1がオーバーフローするまでとどまって、(すなわちTOV1がセットされたら次の命令をスキップして、) ; Skip if Bit in I/O Register is Set SBIS TIFR1, TOV1 RJMP AGAIN ; Timer1がオーバーフローしたのでTimer1をストップして、 LDI R20, 0 STS TCCR1B, R20 ; Timer1のオーバーフローフラグをクリアして、 LDI R20, 1 << TOV1 OUT TIFR1, R20 ; 時間遅延ルーチンを抜ける。 RET