Timer0のコンペアマッチ割り込み

pp.333-334

今度はTimer0のコンペアマッチ割り込みを使ってみる。

  • メインループでは、PORTCに入力された値をPORTBから出力する。
  • それと並行して、Timer0がコンペアマッチするたびにPD4の出力をトグルする。

f:id:ti-nspire:20200510103107p:plain:h250 f:id:ti-nspire:20200512055927p:plain:h250 f:id:ti-nspire:20200512060207j:plain:h250

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

; 割り込みベクターテーブルを侵さないようにするため、マイコンのリセット後はただちに別の番地へ飛ぶことにする。
.ORG 0
    JMP MAIN

; Timer0コンペアマッチ割り込みAがかかると制御が0x1C番地に飛んでくるので、そこからさらに別の番地へ飛んで何かを実行する。
.ORG 0x1C
    JMP T0_CMA_ISR

.ORG 0x100
MAIN:
    INITSTACK

    ; Timer0のコンペア値A
    .EQU CM0A = 200

    ; PD4のIOをOUTにして、
    SBI DDRD, 4

    ; PC0~5のIOをINのまま内部プルアップして、
    LDI R20, 0b111111
    OUT PORTC, R20

    ; PB0~5のIOをOUTにして、
    OUT DDRB, R20

    ; Timer0のコンペア値Aを設定して、
    LDI R20, CM0A
    OUT OCR0A, R20

    ; Timer0をCTCモードに設定して、
    LDI R20, 1 << WGM01
    OUT TCCR0A, R20

    ; Timer0の分周比を1に設定してカウントを開始して、
    LDI R20, 1 << CS00
    OUT TCCR0B, R20

    ; Timer0コンペアマッチ割り込みを有効化して、
    LDI R20, 1 << OCIE0A
    STS TIMSK0, R20

    ; グローバル割り込みを有効化して、
    SEI

HERE:
    ; PC0~5に入力された値を読み取って、それをPB0~5に出力する。
    ; を繰り返す。
    IN R20, PINC
    OUT PORTB, R20
    RJMP HERE

.ORG 0x200
T0_CMA_ISR:
    ; Timer0がコンペアマッチしたら、PD4の出力をトグルする。
    IN R16, PORTD
    LDI R17, 1 << PD4
    EOR R16, R17
    OUT PORTD, R16
    RETI

f:id:ti-nspire:20200512055247p:plain:w400