p.279
1回のループに何サイクルかかっているのかを1命令ずつ数え上げてみる。クロックとの対応を見るため、PB0からクロックが出力されるようヒューズを設定した。
今、クロックはノミナル8 MHzなので1サイクルは1 ÷ 8 MHz = 0.125 us。下のプログラムは1ループに35サイクルかかるので、1ループは0.125 us * 35 = 4.375 usになるはずである。
.MACRO INITSTACK LDI R20, HIGH(RAMEND) OUT SPH, R20 LDI R20, LOW(RAMEND) OUT SPL, R20 .ENDMACRO INITSTACK SBI DDRB, 6 LDI R17, 0b01000000 OUT PORTB, R17 LDI R16, 0b01000000 .EQU COUNT = 0xF6; カウント初期値 ; コメントにサイクル数を示す。カッコ内は(実行前のカウント値:実行後のカウント値)。 BEGIN: RCALL DELAY ; 3 EOR R17, R16 ; 1 OUT PORTB, R17 ; 1 RJMP BEGIN ; 2 DELAY: LDI R20, COUNT ; 1 OUT TCNT0, R20 ; 1(F6) LDI R20, 0 ; 1(F6) OUT TCCR0A, R20 ; 1(F6) LDI R20, 1 ; 1(F6) OUT TCCR0B, R20 ; 1(F6) ここからカウントを開始 AGAIN: SBIS TIFR0, TOV0 ; 1(F6:F7) 1(F9:FA) 1(FC:FD) 1(FF:00, 実行後にTOV0が立つ) 2(02:04, TOV0が立っているので次の命令をスキップ) RJMP AGAIN ; 2(F7:F9) 2(FA:FC) 2(FD:FF) 2(00:02) _(__) LDI R20, 0 ; 1(04:05) OUT TCCR0B, R20 ; 1(05:06, ここまででカウントを停止) LDI R20, 1 ; 1(06) OUT TIFR0, R20 ; 1(06) RET ; 4(06)
約4.4 usの時間遅延が生成された。クロックはノミナルより少し低くて約7.9 MHzであった。黄色がPB6、緑色がCLKO (PB0)。
クロックを数えてみると確かにH側もL側も35サイクルを要している。