Chapter 3. レッスン
3.5 レッスン 4: A/D 変換
PICkit™ 3 スタータキット ユーザガイド
DS41628B_JP - p.56 2015 Microchip Technology Inc.
PIC18F14K22のANSELレジスタは多少異なりますが、機能は同じです。各PIC MCU
のデータシートに示したレジスタ定義の表では、一番上の行に各ビットの機能の詳細 (既定値の状態等)を表示しています。ANSA0ビットは読み書き可能で、パワーオン
リセット(POR)とブラウンアウト リセット(BOR)時の既定値はアナログ入力です。
BORは、電源電圧がコンフィグレーション ワードで設定したしきい値より下がると 発生します。
3.5.4.1.2 ADCON0
ADCON0はADCの動作を制御します。bit 0はADCモジュールのイネーブルビット
です。bit 1はA/D変換を開始するためのビットで、bit <6:2>はADCが読み出すチャ
ンネルを選択します。
このレッスンでは、ADCを有効にしてRA4を入力チャンネルに選択します。ADCON1 レジスタ(後述)で内部参照電圧を選択し、A/D変換クロックを8TOSCとします。チャ ンネル変更後、ADCサンプリング コンデンサのセトリングに約5 μs必要です。最後
に ADCON0レジスタの GOビットをセットすると変換が開始します。GOビットには
DONEフラグとしての役割もあります。つまり、変換が完了するとADCはGOビットを ハードウェアでクリアします。変換結果はADRESH:ADRESLレジスタペアに格納さ れます。
変換結果の上位4ビットをコピーして、PORTCに接続されたLEDに表示します。
3.5.4.2 PIC16
3.5.4.3 PIC18
3.5.4.3.1 ADCON1
PIC16のADCON1レジスタとPIC18のADCON2レジスタは、プロセッサクロック
速度と変換速度の比を選択します。ADCは1ビットの変換に少なくとも1.6 μsを必 要とするため、この設定が重要です。クロックが速すぎても遅すぎても精度が低下し ます。プロセッサクロック速度を高くした場合、変換速度を維持するには分周値を大 きくする必要があります。
10ビットの変換結果を右詰めと左詰めのどちらで格納するかは、ADFMビット(bit <7>) で選択します。このプログラムでは左詰めを選択しているため、下位 2 ビットが
ADRESLレジスタに格納され、上位8ビットがADRESHレジスタに格納されます。
しかし実際にこのプログラムで使うのはADRESHレジスタの上位4ビットのみです。
ADC参照電圧は、VDDまたはVREFに接続した別の参照電圧のどちらかを参照電圧指 定ビットで選択します。
表3-15: ADCの変換結果は左詰めフォーマットで格納され、青で示したビットがLATCにコピー
される。bit 6がDS1を制御し、bit 7がDS2を制御する(以下同様)
レジスタ ADRESH ADRESL
結合後 のbit #
9 8 7 6 5 4 3 2 1 (LSb) 0
表3-16: 新しく学ぶエンハンスト ミッドレンジのレジスタ
レジスタ 目的
ADCON1 変換結果のフォーマット、変換速度、参照電圧
表3-17: 新しく学ぶPIC18のレジスタ
レジスタ 目的
ADCON1 参照電圧
ADCON2 変換結果のフォーマット、変換速度
3.5.5 新しく学ぶ命令 3.5.5.1 両デバイス共通
3.5.5.1.1 SWAPF
ニブルを入れ換えます。ニブルは4ビットの事で、1バイトは2個のニブルで構成さ れます。以下に例を示します。
例3-19:
ADCを実行します。ADRESHにはA/D変換結果のb'10100011’が格納されます。
例3-20:
図3-3: SWAPFの図解
表3-18: 新しく学ぶ両デバイス共通の命令
命令 英語名 目的
SWAPF Swapf nibbles in f ニブルを入れ換える
表3-19: SWAPF実行前
レジスタ 値
WREG B’01100110’
表3-20: SWAPF実行前
レジスタ 値
ADRESH B’10100011’
表3-21: SWAPF実行後
レジスタ 値
WREG B’0011-1010’
ADRESH B’1010-0011’
movlw b’01100110’
swapf ADRESH, w ; now perform the swapf and save in WREG, leaving ADRESH intact
ADRESH
WREG
1 0 1 0 0 0 1 1
1 0 1 0
0 0 1 1
PICkit™ 3 スタータキット ユーザガイド
DS41628B_JP - p.58 2015 Microchip Technology Inc.
3.5.6 アセンブリ
3.5.6.1 エンハンスト ミッドレンジ
A/D変換結果を左詰めで格納している事に注意します。このため、swapf命令を使っ て上位4ビットをLATCに代入できます。
例3-21:
ドル記号($)はアドレスカウンタの現在の値を表します。「$-1」は、goto命令のジャ ンプ先を(現在のアドレス - 1)、すなわち1つ前の命令とするようアセンブラに指示 しています。
3.5.6.2 PIC18 例3-22:
ここでは「1」の代わりに「$-2」としている事に注意します。これは非常に重要な 違いです。PIC18のプログラムメモリはバイト単位でアドレス指定できますが、PIC18 の命令ワードは2バイト長です。1つ前の命令は、アドレス空間では2バイト前に相 当します。PIC18の命令のアドレスは常に偶数です。
3.5.7 C言語
3.5.7.1 両デバイス共通 例3-23:
ここではADRESHレジスタを右方向へ4回シフトしています。符号なし変数に対す
るシフトは論理シフトです。以下に例を示します。
;Start the ADC
nop ;requried ADC delay of 8uS => (1/(Fosc/4)) = (1/(500KHz/4)) = 8uS banksel ADCON0
bsf ADCON0, GO ;start the ADC
btfsc ADCON0, GO ;this bit will be cleared when the conversion is complete goto $-1 ;keep checking the above line until GO bit is clear ;Grab Results and write to the LEDs
swapf ADRESH, w ;Get the top 4 MSbs (remember that the ADC result is LEFT justified!) Banksel LATC
movwf LATC ;move into the LEDs bra MainLoop
表3-22: シフト前のADRESH
シフト前のADRESH
Bit # MSb (7) 6 5 4 3 2 1 LSb (0)
値 0 1 0 1 1 1 0 1
goto $-1 ;keep checking the above line until GO bit is clear
goto $-2 ;keep checking the above line until GO bit is clear
__delay_us(5); //wait for ADC charging cap to settle GO = 1;
while (GO) continue; //wait for conversion to be finished LATC = (ADRESH >> 4); //grab the top 4 MSbs
LEDはピン<RC3:RC0>に接続されているため、この一時作業領域レジスタの内容を LATCに代入する事ができます。PORTCレジスタのそれ以外のビットは無視できます。
ポテンショメータを時計方向に回しても、LEDはなかなか点灯しません。これは、A/D 変換結果の上位4ビットを表示しているためで、電圧を大きく変化させないとこれら のビットには影響しません。自習課題として、下位ニブル(bit 0~3)をLATCに代入 して試してみましょう。LEDの状態がより頻繁に変化します。
表3-23: シフト後の一時作業領域レジスタ
シフト後のADRESH
Bit # MSb (7) 6 5 4 3 2 1 LSb (0)
値 0 0 0 0 0 1 0 1
ADRESH >> 4; //grab the top 4 MSbs
PICkit™ 3 スタータキット ユーザガイド
DS41628B_JP - p.60 2015 Microchip Technology Inc.