タイマー0 / CTCモード / 途中でコンペア値をロードし直す

p.478

これまではコンペア値を固定していたが、ここではプログラムの途中でコンペア値をロードし直して随時パルス幅が変更できるようにする。
f:id:ti-nspire:20200717102926p:plain:w500

 ; PD6 (OC0A)のIOをOUTにする。
    SBI DDRD, PD6

BEGIN:
    ; Loの長さを設定する
    LDI R20, 0
    OUT OCR0A, R20

    ; コンペアマッチ時にOC0A (PD6)をセット。CTCモード。
    LDI R20, (1 << COM0A1) | (1 << COM0A0) | (1 << WGM01)
    OUT TCCR0A, R20

    ; 1024分周してカウント。
    LDI R20, (1 << CS02) | (1 << CS00)
    OUT TCCR0B, R20

L1:
    ; コンペア値Aにマッチするまでとどまる。SBISはSkip if Bit in I/O Register is Set。
    SBIS TIFR0, OCF0A
    RJMP L1

    ; コンペア値AにマッチしたらコンペアマッチAフラグをクリアする。
    SBI TIFR0, OCF0A

    ; Hiの長さを設定する。
    LDI R20, 255
    OUT OCR0A, R20

    ;  コンペアマッチ時にOC0A (PD6)をクリア。CTCモード。
    LDI R20, (1 << COM0A1) | (1 << WGM01)
    OUT TCCR0A, R20

L2:
    ; コンペア値Aにマッチするまでとどまる。SBISはSkip if Bit in I/O Register is Set。
    SBIS TIFR0, OCF0A
    RJMP L2

    ; コンペア値AにマッチしたらコンペアマッチAフラグをクリアする。
    SBI TIFR0, OCF0A

    RJMP BEGIN