F675のADコンバーターは4CHで10bit分解能。
ただし、4CH分のADコンバーターを内蔵しているのではなく、CHセレクタで4つのうちの1つをセレクトしてADする。
8bitで使用する場合は、データを左詰めして2バイトのレジスタに取り込み、うち上位8ビットのレジスタ(ADRESH)を読み出すことで上位8ビット分のデータを取得できる。このとき下位2ビット(ADRESL)は特に処理せず捨てる。
10bitで使用する場合は、データを右詰めして2バイトのレジスタに取り込み、それぞれ(ADRESH/ADRESL)を読み出して汎用メモリーにコピーする。このとき、ADRESHはBank0だが、ADRESLはBank1に存在するため、AD結果のデータを読み出す前にBank切り替えを行う必要がある。
2CHのAD値を取り込む例。
1CH分読み出してはCHセレクタを切り替えて、他のCHの取り込みを行う。
AD結果は汎用メモリーにコピーしておく。
;--------------------------------------------------------------------------- ; AD変換 その1 ; 取り込み後のデータは、AD1_DATAに保存する ;--------------------------------------------------------------------------- MOVLW B'00000001' ; 左詰(ADRESHに8bitデータ)、REF=Vdd、AD電源ON MOVWF ADCON0 ; AN0をセレクト BCF ADCON0,2 ; AN0でアナログ変換(CHS0クリア) BCF ADCON0,3 ; AN0でアナログ変換(CHS1クリア) MOVLW D'20' ; 1ms x 20をセット CALL WAIT_1msec_w ; WAIT実行 BCF PIR1,ADIF ; ADIF を 0 に(A/D 変換終了時このビットが 1 になる) BSF ADCON0,GO ; GO (start) bit を立てて A/D 変換開始 EXEC_AD1: BTFSC ADCON0,GO ; A/D 変換終了したか? 0 なら次をスキップ GOTO EXEC_AD1 ; 変換中なのでループ MOVF ADRESH,W ; A/D 変換値を読み出して MOVWF AN1_DATA ; 汎用メモリに保存 ;--------------------------------------------------------------------------- ; AD変換 その2 ;--------------------------------------------------------------------------- ; AN1をセレクト BSF ADCON0,2 ; AN1でアナログ変換(CHS0セット) BCF ADCON0,3 ; AN1でアナログ変換(CHS1クリア) MOVLW D'20' ; 1ms x 20をセット CALL WAIT_1msec_w ; WAIT実行 BCF PIR1,ADIF ; ADIF を 0 に(A/D 変換終了時このビットが 1 になる) BSF ADCON0,GO ; GO (start) bit を立てて A/D 変換開始 EXEC_AD2: BTFSC ADCON0,GO ; A/D 変換終了したか? 0 なら次をスキップ GOTO EXEC_AD2 ; 変換中なのでループ MOVF ADRESH,W ; A/D 変換値を読み出して MOVWF AN2_DATA ; 汎用メモリに保存
10ビット分解能を使用するために、データは右詰めにして、下位8ビットと上位2ビットを読み出して、結果を別々のメモリーに保存する。
;--------------------------------------------------------------------------- ; AD変換 その1(10ビット) ; 取り込み後のデータは、AD1_DATAH(9-8bit)とAD1_DATAL(7-0bit)に保存する ; ADRESHはBank0、ADRESLはBank0にあるので、切り替えが必要。 ;--------------------------------------------------------------------------- MOVLW B'10000001' ; 右詰(ADRESLに8bitデータ)、REF=Vdd、AD電源ON MOVWF ADCON0 ; AN0をセレクト BCF ADCON0,2 ; AN0でアナログ変換(CHS0クリア) BCF ADCON0,3 ; AN0でアナログ変換(CHS1クリア) MOVLW D'50' ; 1ms x 50をセット(長めにする) CALL WAIT_1msec_w ; WAIT実行 BCF PIR1,ADIF ; ADIF を 0 に(A/D 変換終了時このビットが 1 になる) BSF ADCON0,GO ; GO (start) bit を立てて A/D 変換開始 EXEC_AD1: BTFSC ADCON0,GO ; A/D 変換終了したか? 0 なら次をスキップ GOTO EXEC_AD1 ; 変換中なのでループ MOVF ADRESH,W ; A/D 変換値(上位)を読み出して MOVWF AN1_DATAH ; 汎用メモリに保存 BANKSEL ADRESL ; Bank1に切り替え MOVF ADRESL,W ; A/D 変換値(下位)を読み出して MOVWF AN1_DATAL ; 汎用メモリに保存 BANKSEL GPIO ; Bank0に切り替え