ADコンバーター / 変換完了をポーリングで確認する
p.436
ここではテキストどおり変換完了割り込みフラグ(ADIF)をポーリングで監視しているが、ADCペリフェラル / CdSを使った明るさセンサー / 上位3ビット値(0~7)だけを8セグメントLEDバーに表示する -のように変換開始ビット(ADSC)がクリアされるのを監視するのでも同じである。変換結果の上位2ビットをポートBへ、下位8ビットをポートDへ出力して確認する。基準電圧にはAVCCをそのまま用いた。
; スタックポインタの初期化マクロ .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