かふぇルネでRX621におけるAD変換(ADC)の使い方についてスレッドが立っていましたので、ADCの事例を紹介します。
ADCの使用にあたり、RX621には12ビットADC(S12AD)と10ビットADC(ADa)がありますが、スレッドではADaを使いたい様子なのでこちらで行います。
I/O機能の設定ですが、RX62系はRX63系と比べてマルチファンクションピンコントローラー(MPC)がないため、マルチプレクスされているI/O機能の設定は周辺機能側の設定が優先されます。ポートI/Oとして利用する場合は注意が必要ですが、周辺機能を使いたい場合は複雑な設定が必要ないのでやりやすいですね。(個人的にはMPCで集中管理された方が分かりやすいと思っています)
AD0.ADCSR = 0x00; /* snigle mode, AN0/AN4 */ /* ADC stop */ /* ADC intrp. disable */ AD0.ADCR. = 0x0A; /* single mode */ /* CKS: PCLK */ /* TRGS: software, unit0/1 */ AD0.ADDPR.BIT.DPSEL = 0;/* LSB */
ADCSRではシングルモード時のチャネル選択、ADCの停止、割込みの不使用を設定しています。
ADCRでは動作モード(シングルモード)、ADCの動作クロック、ADC開始トリガ(ソフトウェア)を設定しています。
ADDPRではADCデータのフォーマット(10bitデータを左詰め:MSBするか、右詰め:LSBするか)を設定しています。
ADCの基本事項はこれだけです。AN0はP40/IRQ8とマルチプレクスされていますが、ポートファンクションレジスタ:PF8IRQであえて設定しない限りリセット後のデフォルトで競合することはありません。
ADCの結果をインジケータにポート出力する場合、設定が必要です。
PORTA.DDR = 0xff; /* output */ PORTA.DR = 0x00; /* clear data */ PORTA.ODR = 0xff; /* O.D. ext.pull-up */
例ではPORTAを利用しています。
DDRでは入出力の方向として出力を設定しています。DRではデータをクリア(0)しています。ODRでは外付けLEDのようなものを考慮してオープンドレイン出力を指定しています。オープンドレイン出力を指定しておくと外付け電圧で駆動でき、外部電源が許容する電流も流せるようになります。
ではADCの開始です。
unsigned short usADDT; ~中略~ for(【初期処理】; 【継続条件】; 【ループ処理】){ AD0.ADCSR.BIT.ADST = 1; nop(); for(; AD0.ADCSR.BIT.ADST;) /* wait adc complete */ nop(); usADDT = AD0.ADDRA >> 2; /* valid AN0 MSB8 */ PORTA.DR = (unsigned char)usADDT; }
ADCの開始トリガをソフトウェアに指定していますので、ADSTビットを1にすることによりADCが開始します。直後のnop()はADC開始までのタイムラグ調整用ですので、幾つか挿入する必要があるかもしれません。
ADC中はADSTビットが1になっていますので、for文の継続条件でADC完了待ちを表現しています。for文中にはADSTビットへの連続アクセスを避けるためにnop()を挿入しています。
ADSTビットが0になり、ADCが完了したら変換DATAを取り出します。今回はアナログの振れを考慮し、上位10ビットのみ取り出しています。あとはインジケータ用のポートの出力するだけです。
構造体、ビットフィールド、キャストが正しくない可能性がありますが、各人で修正してください。