p.278
一定の時間が経過するたびにPB6の出力をトグルする。コードはほぼテキストのままである。クロックは内蔵の8 MHz、初期カウント値を0xF2
にした結果、約4.8 usの時間遅延が生成された。
; スタックポインタの初期化マクロ .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, 0b01000000 OUT PORTB, R17 ; PB6をトグルするためのマスクビットをセットして、 LDI R16, 0b01000000 BEGIN: ; 待って、 RCALL DELAY ; PB6の出力をトグルして、 EOR R17, R16 OUT PORTB, R17 ; を無限に繰り返す。 RJMP BEGIN DELAY: ; Timer0の初期カウント値を設定して、 LDI R20, 0xF2 OUT TCNT0, R20 ; Timer0をノーマルモードにして、 LDI R20, 0 OUT TCCR0A, R20 ; CS00ビット(ビット0)を1 (クロックを1分周)にしてTimer0でカウントをスタートする。 LDI R20, 1 OUT TCCR0B, R20 AGAIN: ; Timer0がオーバーフローするまでとどまって、(すなわちTOV0がセットされたら次の命令をスキップして、) ; Skip if Bit in I/O Register is Set SBIS TIFR0, TOV0 RJMP AGAIN ; Timer0がオーバーフローしたらTimer0をストップして、 LDI R20, 0 OUT TCCR0B, R20 ; Timer0のオーバーフローフラグ(ビット0)をクリアして、 LDI R20, 1 OUT TIFR0, R20 ; 遅延函数を抜ける。 RET