ADコンバーター / 変換完了をポーリングで確認する

p.436

ここではテキストどおり変換完了割り込みフラグ(ADIF)をポーリングで監視しているが、ADCペリフェラル / CdSを使った明るさセンサー / 上位3ビット値(0~7)だけを8セグメントLEDバーに表示する -のように変換開始ビット(ADSC)がクリアされるのを監視するのでも同じである。変換結果の上位2ビットをポートBへ、下位8ビットをポートDへ出力して確認する。基準電圧にはAVCCをそのまま用いた。
f:id:ti-nspire:20200628140315p:plain:h315

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

    INITSTACK

    ; 変換結果の上位バイトをポートBに、下位バイトをポートCに出力したいので、両ポートのIOを全部OUTにする。
    LDI R16, 0xFF
    OUT DDRB, R16
    OUT DDRD, R16

    ; 基準電圧にAVCCを使う。
    LDI R16, (1 << REFS0)
    STS ADMUX, R16

READ_ADC:
    ; CPUクロックを128分周してADCへ供給する。ADCペリフェラルをイネーブルにする。変換を開始する。
    LDI R16, (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0) | (1 << ADEN) | (1 << ADSC)
    STS ADCSRA, R16

KEEP_POLLING:
    ; 変換完了割り込みフラグ(ADIF)がセットされるまでとどまって、セットされたらクリアする。
    LDS R16, ADCSRA
    SBRS R16, ADIF ; SBRSはSkip if Bit in Register is Set。
    RJMP KEEP_POLLING
    LDI R16, (1 << ADIF)
    STS ADCSRA, R16

    ; 変換開始フラグ(ADSC)がクリアされるまでとどまる。
    ;LDS R16, ADCSRA
    ;SBRC R16, ADSC ; SBRCはSkip if Bit in Register is Cleared。
    ;RJMP KEEP_POLLING
    
    ; 下位8ビットを先に読み出す。
    LDS R16, ADCL
    OUT PORTD, R16

    ; 上位2ビットを読み出す。
    LDS R16, ADCH
    OUT PORTB, R16

    ; を繰り返す。
    RJMP READ_ADC