RX62Nの12bitAD変換器を動かすプログラムのサンプルです。MTU0のTGRAのコンペアマッチを使い一定間隔で変換を行います。AD変換結果の読み出しに割り込みを使用しています。
- #include <stdio.h>
- #include <machine.h>
- #include "iodefine.h"
- #include "vect.h"
- #define PCLK 48 //PCLK = 48MHz
- /*
- * MTU0の初期化
- * TGRAのコンペアマッチでAD変換をスタートさせる
- *
- * 12bit A/Dコンバータ初期化
- * AN0のみ使用
- */
- void initMTU0_S12AD(void)
- {
- MSTP(MTU0) = 0; //タイマMTU0回路動作
- MTU0.TCR.BIT.CCLR = 1; //TGRAコンペアマッチでカウンタクリア
- MTU0.TCR.BIT.CKEG = 0; //クロックエッジ選択ビット (使用しない)
- MTU0.TCR.BIT.TPSC = 3; //PCLK/64でカウント
- MTU0.TMDR.BIT.MD = 0; //通常動作
- MTU0.TIER.BIT.TTGE = 1; //A/D変換開始要求の発生を許可
- MTU0.TCNT = 0;
- MTU0.TGRA = PCLK*1000000L/64L/1000L - 1L; // PCLK = 48MHzで1秒間に1000回AD変換を行う
- MSTP(S12AD) = 0; // 12bit AD変換回路動作
- delay_ms(100); // AD変換回路が安定するのを待つ
- PORT4.DDR.BIT.B0 = 0; // AN0を使用するためデジタル入力に
- S12AD.ADCSR.BIT.CKS = 3; // クロック PCLK/1
- S12AD.ADCSR.BIT.EXTRG = 0; // A/D開始トリガ選択レジスタ(ADSTRGR)で選択されたタイマ要因による、スキャン変換の開始を選択
- S12AD.ADCSR.BIT.TRGE = 1; // 外部トリガ(ADTRG0#)または、MTU、TMRトリガによるスキャン変換を許可
- S12AD.ADCSR.BIT.ADIE = 1; // スキャン終了後のS12ADI0割り込み発生の許可
- IR(S12AD,ADI) = 0; // 割り込みフラグクリア
- IEN(S12AD,ADI) = 1; // 割込み許可
- IPR(S12AD,ADI) = 0x01; // 割り込み優先順位設定
- S12AD.ADANS.BIT.ANS = 0x01; // AN0のみ変換
- S12AD.ADCER.BIT.ADRFMT = 0; // 保存データは右詰め
- S12AD.ADSTRGR.BIT.ADSTRS = 1; // TRG0AN_0トリガで変換開始
- MTUA.TSTR.BIT.CST0 = 1; // タイマMTU0スタート
- }
- /*
- * S12AD ADI
- * AD変換終了で呼び出される割り込み関数
- * AD変換の結果を表示
- */
- //
- void Excep_S12AD_ADI(void)
- {
- int ans;
- ans = S12AD.ADDR0;
- printf("AD value %d\n",ans);
- }
- int main(void)
- {
- volatile int i;
- Initialization();
- initMTU0_S12AD(); //AD変換初期化
- printf("A/D converter test.\n");
- while (1) {
- //何もしない 割込みで動作
- }
- }