ノーマルモードのTimer0で生成した時間遅延に何サイクルを要しているか数える

p.279

1回のループに何サイクルかかっているのかを1命令ずつ数え上げてみる。クロックとの対応を見るため、PB0からクロックが出力されるようヒューズを設定した。
f:id:ti-nspire:20200416071936p:plain:w400

今、クロックはノミナル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)。
    f:id:ti-nspire:20200416064926p:plain:h315 f:id:ti-nspire:20200416070756j:plain:h315

  • クロックを数えてみると確かにH側もL側も35サイクルを要している。
    f:id:ti-nspire:20200416065104p:plain:w500 f:id:ti-nspire:20200416065112p:plain:w500