タイマー0 / Fast PWMモード / Waveform Generationモード3

pp.522-524
f:id:ti-nspire:20200721134224p:plain:w500

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

INITSTACK

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

    ; Waveform Generator Aはnon-invertingモードにする(コンペアマッチでクリア、BOTTOMでセット)。
    ; Waveform Generator Bはinvertingモードにする(コンペアマッチでセット、BOTTOMでクリア)。
    ; Waveform Generationモード3 (0xFFがTOP)。
    LDI R20, (1 << COM0A1) | (1 << COM0B1) | (1 << COM0B0) | (1 << WGM01) | (1 << WGM00)
    OUT TCCR0A, R20
    
    ; コンペア値Aをセットする。
    ; デューティ = (127+1)/256 = 50%。
    LDI R20, 127
    OUT OCR0A, R20

    ; コンペア値Bをセットする。
    ; invertingモードにしているので負側のデューティ = (63+1)/256 = 25%。
    LDI R20, 63
    OUT OCR0B, R20

    ; 8 MHzを8分周してカウントする。だから1カウントが1 us。
    LDI R20, (1 << CS01)
    OUT TCCR0B, R20

f:id:ti-nspire:20200721095214p:plain:w500