タイマー0 / Phase Correct PWMモード / Waveform Generationモード1

pp.529-530

non-invertingモードでのデューティは(コンペア値)×2/(255×2) = (コンペア値)/255。だからFast PWMと違ってデューティ0%にできる(invertingモード時もデューティ100%にできる)。オーバーフローフラグは、昇って降りてBOTTOM時に立つ。
f:id:ti-nspire:20200722101419p:plain:w500

; スタックポインタの初期化マクロ
.MACRO INITSTACK
    LDI R20, HIGH(RAMEND)
    OUT SPH, R20
    LDI R20, LOW(RAMEND)
    OUT SPL, R20
.ENDMACRO

    INITSTACK

    ; OC0A (PD6)、OC0B (PD5)からPWM波を出力する。
    LDI R20, (1 << PD6) | (1 << PD5)
    OUT DDRD, R20

    ; コンペア値Aをセットする。
    LDI R20, 51
    OUT OCR0A, R20

    ; コンペア値Bをセットする。
    LDI R20, 102
    OUT OCR0B, R20

    ; Aはup-counting時にコンペアマッチでクリア、down-counting時にコンペアマッチでセットしてみる。
    ; Bはup-counting時にコンペアマッチでセット、down-counting時にコンペアマッチでクリアしてみる。
    ; Waveform Generationモード1 (Phase Correct PWMモード, TOP値は0xFF)
    LDI R20, (1 << COM0A1) | (1 << COM0B1) | (1 << COM0B0) | (1 << WGM00)
    OUT TCCR0A, R20
    
    ; 8分周してカウントする。
    LDI R20, (1 << CS01)
    OUT TCCR0B, R20