• ベストアンサー

H8/3664FのAD変換について

初めまして。 現在大学でH8/3664FでのAD変換を行っているのですが、 AD変換とその値に対する出力への動作が上手くいきません。 分かる方、ご教授お願いいたします。 現状は、1.7V程度の信号をADコンバータ端子(AN1)に入力しています。 AD変換を行い、条件として1V以上のときは出力に設定した 端子(P11)から5V出力しダイオードを光らせようと思っています。 プログラムは以下のように組んでいます。 おかしいところがあればご指摘お願いします。 void main(void){ IO.PMR1.BYTE=0x00; /* ポート1入出力ポート*/ IO.PCR1=0xff; /* ポート1出力*/ /*AD変換の初期設定*/ AD.CSR.BIT.ADST=0; /*AD変換機能停止*/ AD.CSR.BIT.SCAN=1; /*スキャンモード*/ AD.CSR.BIT.CKS=1; /*高速変換*/ TW.TCRW.BIT.CCLR=1; /* TCNTがGRAでクリア */ TW.TCRW.BIT.CKS=3; /* クロックφ/8 */ TW.GRA=40000; /* パルスの周期20ミリ秒 */ TW.TMRW.BIT.CTS=1; /* カウントスタート */ while(1){ /* 20ミリ秒間のカウントは約8880となる. */ if(TW.TSRW.BIT.IMFA==1){ TW.TSRW.BIT.IMFA=0; AD.CSR.BIT.ADST=1; /*AD変換機能開始*/ while(AD.CSR.BIT.ADF==0){}; /*AD変換終了待ち*/ AD.CSR.BIT.ADF=0; /*変換終了フラグクリア*/ AD.CSR.BIT.ADST=0; /*AD変換機能停止*/ x0=(int)(AD.DRA>>6); /*x0に値を格納*/ if(x0>100){/*1V以上の場合*/ IO.PDR1.BIT.B2=1; }else{ IO.PDR1.BIT.B2=0; }

  • 科学
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

まず、ソースコードがコメントどうり動作するものと仮定します。 1.A/D コントロール/ステータスレジスタ (ADCSR)の設定について CH2,CH1,CH0の設定を行っていないので、この値が初期値と推測されます。この場合には、スキャンモード(SCAB=1)でA/D変換させると、(16.3.2 A/D コントロール/ステータスレジスタ ADCSR に記載されているとおり)AN0だけが変換されるようですね。 AN1を変換するには、SCAN,CH2,CH1,CH0へ適切な値の組み合わせを設定しなければならないようです。 AN1だけを変換するには SCAN=0,CH2=0,CH1=0,CH0=1 AN0,AN1を連続して変換するには SCAN=1,CH2=0,CH1=0,CH0=1 AN0,AN1,AN2を連続して変換するには SCAN=1,CH2=0,CH1=1,CH0=0 AN0,AN1,AN2,AN3を連続して変換するには SCAN=1,CH2=0,CH1=1,CH0=1 2.A/D データレジスタの読み出しについて AN1の変換結果は、(16.3.1 A/D データレジスタA~D ADDRA~D に記載のあるとおり)ADDRBへ格納される様なので、ADDRBを読み出す必要があるようですね。 (AD.DRAがADDRBを示すように宣言されていれば問題なさそうです) 3.A/D変換の結果の判定について ハードウェアマニュアル にはA/D変換のフルスケールの電圧がどうなるか記載が見つからなかったのですが、図16.1 A/D 変換器のブロック図から、フルスケール電圧をAVccに近い電圧かそれ以下と推定すると、変換結果の値100が1.0Vとなる場合のフルスケールの電圧は、(1.0/100*1023)V=10.23V付近と推定されますが、(20.2.4 A/D 変換特性によると)AVccは3.3~5.5Vしか印加できないので、変換結果を100と比較したのでは、1.0V以上と判定できないことがわかります。 AN1に1.0Vを印加した場合のA/D変換結果がどうなるかを確認して、比較する値を決めた方がよさそうです。

参考URL:
http://documentation.renesas.com/jpn/products/mpumcu/rjj09b0149_h83664.pdf
hana_I
質問者

お礼

回答ありがとうございます。 チャネルとレジスタの設定を行ったらダイオードが光りました!! ずっと悩んでいたのでホントに助かりました! 教えて頂いたH8のマニュアルも重宝させていただきます。

その他の回答 (1)

  • richardo
  • ベストアンサー率20% (11/53)
回答No.2

 アプローチ方法が良くないな。 ・出力をON/OFFするプログラムを作りテストする。 ・A/D変換が行われているか調べるため、データをヘキサでLCD 表示器などに出力する。  ここでA/Dが上手く行かなかったら、プログラムが間違えていないか質問すればいいのです。  その前にCPUの端子にアナログ信号が入っているか確認。  A/D値が予定値と違うのであれば、アナログ入力インピーダンス によって分圧され電圧が下がったと考えられる。  全段が片電源オペアンプであれば、0V付近まで振れないなどの トラブルが予想されます。  このように幾つかの可能性を考えて原因を分けないといけません。  いきなりA/D変換のプログラムがおかしいと断定しては行けません。

hana_I
質問者

お礼

H8を使った電子装置の製作が初めてだったのと知識の無さで プログラムが間違っているだけだと思っていました。 今回は運よくプログラムの修正だけでダイオードは光りましたが、 もっと考えるべき面があると教えられました。 これからはもっといろんな角度から原因を探っていくようにします。 ありがとうございました!

関連するQ&A

  • H8を使ってモータを、正逆回転するプログラムについてです。 よろしくお

    H8を使ってモータを、正逆回転するプログラムについてです。 よろしくお願いします。 H8(3067F.h)を使って2.5Vを基準として、2.5Vより上5.0まで正転し、2.5V以下0Vなら逆転、2.5Vなら静止するプログラムを作成したいのですが正逆回転のところで困っています。 #include <3067F.h> #pragma interrupt(adi) void initITU(void); void initITU1(void); void initAD(void); void initPA(void); main() { initPA(); initAD(); initITU(); initITU1(); /* Initalize ITU ch1 */ ITU.TSTR.BIT.STR1 = 1; /* Start ITU ch1 */ AD.CSR.BIT.ADST = 1; /* A/D変換 start */ while(1){ ; } } void initPA(void){ PADDR = 0xff; /* PortA 出力モード */ PADR.BYTE = 0x00; /* PA Clear */ } void initAD(void){ AD.CR.BIT.TRGE = 0; /* AD変換外部トリガ開始禁止 */ AD.CSR.BYTE = 0x00; /* ADCSR初期化, ch0のみ */ AD.CSR.BIT.ADIE = 1; /* AD変換終了後割り込み */ AD.CSR.BIT.CKS = 0; /* AD変換時間 : 135ステート */ AD.CSR.BIT.SCAN = 0; /* 単一モード */ } void initITU(void) { ITU.TSTR.BYTE = 0x00; ITU.TSNC.BYTE = 0x00; ITU.TISRA.BYTE = 0x00; /* Disable Interruption */ ITU.TISRB.BYTE = 0x00; /* Disable Interruption */ ITU.TISRC.BYTE = 0x00; /* Disable Interruption */ } void initITU1(void) { ITU.TMDR.BIT.PWM1 = 1; /* CH1 PWM mode */ ITU1.TCR.BYTE = 0x20; /* clear GRA comparematch,1/clock */ ITU1.GRA = 0; /* A/D変換器の保証bitは上位8bit */ ITU1.GRB = 0; ITU1.TIOR.BYTE = 0X00; /* prohibit GRA&GRB'output of comparematch */ } void adi(void) { AD.CSR.BIT.ADST = 0; /* A/D変換停止 */ if(AD.DRA && 0x80) /* open */ { PADR.BIT.B1 = 1; PADR.BIT.B2 = 0; ITU1.GRB = (AD.DRA >> 8); } else{ (AD.DRA - 0x80) = 0 /* close */ PADR.BIT.B1 = 1; PADR.BIT.B2 = 0; ITU1.GRB = (AD.DRA >> 8); } AD.CSR.BIT.ADF = 0; AD.CSR.BIT.ADST = 1; /* A/D変換開始 */ }  プログラムは、このようになっています。 AD変換停止後のif文のあたりでコンパイルできなくなるのですがどうしたらいいでしょうか? お願いします。

  • H8/3048、AD/DA変換プログラムについて。

    H8/3048、AD/DA変換について質問です。 ポート7のAN0・AN1を入力に使い、DA0・DA1で出力される変換プログラムを作成して実験したところ AN0→DA0への変換は出力されたのですが、AN1→DA1への変換が出力できません。なぜ出力されないのかわかりません。 どうしたらいいか教えてください、お願いします。 AN0がDA1でも出力されているかと思いましたが違いました。 #include <no_float.h> #include <stdio.h> #include <machine.h> #include "h8_3048.h" void init (void); double get_ad0 (void); double get_ad1 (void); void out_da0 (double); void out_da1 (double); void wait (void); int main (void) { double ad0,ad1; int d; init(); //初期化 // set_ccr(0x00); //全体の割り込み許可 //AD DA変換----------- while(1){ ad0=get_ad0(); ad1=get_ad1(); for(d=0;d<1000;d++); out_da0(ad0); out_da1(ad1); } return 0; } void init(void) { /* ポートの入出力設定 */ P1DDR = 0xff; P2DDR = 0xff; P3DDR = 0xff; P4DDR = 0xff; P5DDR = 0xff; P6DDR = 0xf0; // CPU基板上のDIP SW P8DDR = 0xff; P9DDR = 0xf7; PADDR = 0xff; // LED基板 PBDDR = 0xff; // A/Dの初期設定(単一モード) AD_CSR = 0x00; // A/Dの初期設定(スキャンモード使用AN0-AN1) // AD_CSR = 0x11; //ITU0 1ms毎の割り込み ITU0_TCR = 0x20; ITU0_GRA = 24575; ITU0_IER = 0x01; ITU_STR = 0x01; // D/Aの初期設定 DA_CR=0xc0; //DA0E1,DA0E0:1 D/Aアウトプットネーブル DAE:0 ch0,1 独立制御 } double get_ad0(void) { int i; double ad; AD_CSR |=0x20; //ADST:1 AD開始 while(!(AD_CSR & 0x80)); //ADF:1 エンドフラグをチェック AD_CSR &=0x7f; i=AD_DRA>>6;// i=0-1023 ad=i*5.0/1024.0; // 0-1024 を 0-5vに変換 return ad; } double get_ad1(void) { int i; double ad; AD_CSR |=0x20; //ADST:1 AD開始 while(!(AD_CSR & 0x80)); //ADF:1 エンドフラグをチェック AD_CSR &=0x7f; i=AD_DRB>>6; //i=0-1024 ad=i*5.0/1024.0; // 0-1024 を 0-5vに変換 return ad; } void out_da0(double d) { DA_DR0=(int)(d*255/5.0); } void out_da1(double d) { DA_DR1=(int)(d*255/5.0); } void wait(void) { long Loop=200000; while(Loop--); }

  • H8を使って、モータの正逆回転を制御するプログラムを作成したいのですが

    H8を使って、モータの正逆回転を制御するプログラムを作成したいのですがうまくいきません。よろしくお願いします。  h8 <3067F.h>を使ってDC電圧を入力してモータを制御するプログラムなのですが、入力電圧が2.5V(0x80)時は静止、2.5V(0x80)以上なら正回転、2.5V(0x80)以下なら逆回転するようにしたいのですがうまくいきません。プログラムはこんな感じです。 #include <3067F.h> #pragma interrupt(adi) void initITU(void); void initITU1(void); void initAD(void); void initPA(void); main() { initPA(); initAD(); initITU(); initITU1(); /* Initalize ITU ch1 */ ITU.TSTR.BIT.STR1 = 1; /* Start ITU ch1 */ AD.CSR.BIT.ADST = 1; /* A/D変換 start */ while(1){ ; } } void initPA(void){ PADDR = 0xff; /* PortA 出力モード */ PADR.BYTE = 0x00; /* PA Clear */ } void initAD(void){ AD.CR.BIT.TRGE = 0; /* AD変換外部トリガ開始禁止 */ AD.CSR.BYTE = 0x00; /* ADCSR初期化, ch0のみ */ AD.CSR.BIT.ADIE = 1; /* AD変換終了後割り込み */ AD.CSR.BIT.CKS = 0; /* AD変換時間 : 135ステート */ AD.CSR.BIT.SCAN = 0; /* 単一モード */ } void initITU(void) { ITU.TSTR.BYTE = 0x00; ITU.TSNC.BYTE = 0x00; ITU.TISRA.BYTE = 0x00; /* Disable Interruption */ ITU.TISRB.BYTE = 0x00; /* Disable Interruption */ ITU.TISRC.BYTE = 0x00; /* Disable Interruption */ } void initITU1(void) { ITU.TMDR.BIT.PWM1 = 1; /* CH1 PWM mode */ ITU1.TCR.BYTE = 0x20; /* clear GRA comparematch,1/clock */ ITU1.GRA = 0; /* A/D変換器の保証bitは上位8bit */ ITU1.GRB = 0; ITU1.TIOR.BYTE = 0X00; /* prohibit GRA&GRB'output of comparematch */ } void adi(void) { AD.CSR.BIT.ADST = 0; /* A/D変換停止 */ if(ITU1.GRB > 0x80)            2.5v以上かの場合分け { ITU1.GRB = (AD.DRA - 0x80 >> 8); ここで正回転の方向と速度を決める。 PADR.BIT.B1 = 1; PADR.BIT.B2 = 0; } else                    その他 { ITU1.GRB = (0x80 - AD.DRA >> 8); ここで逆回転の方向と速度を決める。 PADR.BIT.B1 = 0;               PADR.BIT.B2 = 1; } AD.CSR.BIT.ADF = 0; AD.CSR.BIT.ADST = 1; /* A/D変換開始 */ }  if文のところで、減算を行い正なら正回転、elseは減算したら負になり逆回転する命令にしたいのですがどうしたらいいでしょうか。 よろしくお願いします。

  • AD変換した結果を出力する方法は?

    H8マイコンを利用してAD変換し、その結果をパソコンの画面に出力したいのですが何をすればいいのかわかりません。出力の形は整理しやすい形で出力したいと考えています。テキスト形式などは可能でしょうか? プログラムは二つの入力(AN0とAN1)をスキャンしながらAD変換します。 最後に AD.CSR.BIT.ADST = 0; /* A/Dコンバータを止める*/ adhenkan[0] = ADDRA; /*AN0の結果をadhenkan[0]に格納する*/ adhenkan[1] = ADDRB; /*AN1の結果をadhenkan[2]に格納する*/ AD.CSR.BIT.ADF = 0; } AD変換したデータをadhenkan[1],adhenkan[2]に格納した後にどうすればいいのかわかりません。

  • h8マイコンで AD変換ができなくて困っています

    マイコンでAD変換をしようと思っています>< #include<3048.h> void ioinit(); void adinit(); int i; int ADDRA; main() { ioinit(); adinit(); while(1){ AD.ADCSR.BIT.ADST = 1; // A/D変換スタート while(AD.ADCSR.BIT.ADF==1); // A/D変換終了まで待つ int i = ADDRA; // レジスタに格納された値をiとする if (i>=0xA5){ // 電圧が6.5vより高くなった場合 P5.DR.BYTE = 0x01; } else if (i<=0x19){ // 電圧が1vより小さくなった場合 P5.DR.BYTE = 0x02; } else if (0x19<=i<=0xA5){ // それ以外の電圧だった場合 P5.DR.BYTE = 0x03; } AD.ADCSR.BIT.ADF=0; //フラグクリア } } // I/OポートDDR設定 void ioinit() { P5.DDR=0xff; } // A/D変換設定 void adinit() { AD.ADCSR.BYTE = 0x33; } このプログラムでAD変換がまったくできません><電圧を変えていくことでP5につながっているLEDで変換結果を見たいと思っています。ADDRAのプログラムあたりがおかしいと思っています;;ちなみにポート7に電圧計とつなげています。その電圧値を変えていくことで結果を見ようとしています。0xA5は6.5Vのときの反応だから回路も分圧させたものにして10Vまでの対応にしました><どこがおかしいのか教えていただけるとてもうれしいです><助けてください;;

  • AD変換

    H8/3664でのAD変換についての質問なのですが、このマイコンだと通常8つあるAD変換をスキャンモードで1度で4つまでしか処理できないのですが グループ0のAN0とグループ1のAN4が同一レジスタで結果が格納されていると思われますが この二つを1度に処理したいのですが、どのようなプログラムにすればいいのですか? AD変換あたりのプログラムを抜粋したので、後半のAD.ADDRB をAN4のAD.ADDRAに変えた場合のプログラムを教えて下さい char aflag=0; //割り込みフラグ void main(void) { char carray0[20],carray1[20],carray2[20]; long ad_data_0,ad_data_1,arrey0,arrey1,ad0,ad1,t,G_data,A_data,hensa_now,hensa_mae,A_out_put; int i; timervset(); timeraset(); IO.PDR5.BYTE = 0xff; // ポート7の出力設定をあらかじめ1に設定 IO.PCR7 = 0x00; // ポート7を全て入力ポートに設定(タクトSW1,SW2,SW3) IO.PCR5 = 0xff; // ポート5を全て出力ポートに設定 IO.PCR1 = 0xa0; // ポート1のP15,P17を出力ポートに Init_rs(); //通信の初期化 AD.ADDRA=0; AD.ADDRB=0; AD.ADDRC=0; AD.ADDRD=0; //AD変換設定 //A/Dコンバータ設定 AD.ADCSR.BYTE = 0x33; // (0011 0011)*/ // スキャンモード,高速変換(70ステート),入力端子:AN0~AN3 set_imask_ccr(0); //割り込み可 while(1) { if(aflag==1){ aflag=0; ad_data_0=AD.ADDRA >> 6; // 「>>」:シフト演算子(ビットを右に6ずらす) ad0=ad_data_0*5000/1024; LToStr(G_data,carray0);//グローブ角度表示 rs_puts("ch.0="); rs_puts(carray0); rs_crlf(); wait(1); G_data=(ad0-2333)*(-0.0426);//グローブ角度 ad_data_1=AD.ADDRB >> 6; // 「>>」:シフト演算子(ビットを右に6ずらす) ad1=ad_data_1*5000/1024; LToStr(A_data,carray1);//アーム角度表示 rs_puts("ch.1="); rs_puts(carray1); rs_crlf(); wait(1);

  • H8/3052について

    こんにちは。 現在秋月書店のH8/3052のマイコンを使ってイエローのC言語で 声の周波数を調べるという卒研をやっています。 声の周波数を調べるためにA/D変換を使ってやろうと思っていますが、 エラーが出ました。その前に周波数を調べられるかそうかはまだわかりませんが・・・。エラーの内容は 未定義のシンボルです DDR でした、 あと、周波数を調べるため、A/D変換するためのポートはP7でよろしいでしょうか? 皆さんのご指摘お願いいたします。 プログラムの一部を載せます。 #include <3048F.H> #define E_SIG 0x20 #define RS_SIG 0x10 void ioinit(void) { P7.DDR = 0xff; //ポート3を全ビット出力に設定 } void adinit(void) { AD.CSR.BIT.ADF = 0; //ADFフラグクリア AD.CSR.BIT.SCAN = 0; //単一モード選択 AD.CSR.BIT.CKS = 1; //クロックセレクト AD.CSR.BIT.CH = 0; //チャネルセレクト AN0単一モード } です。よろしくお願いします。

  • H8/3048マイコンAD/DA変換について

    初めて投稿させていただきます。  AKI-H8/3048キットでAD/DA変換をC言語で行いたいの ですがうまくいきません。  C言語ではどうやって記述すればいいのでしょうか? ご助言お待ちしています。  参考までに作成したAD/DA変換ソースコードを記します。 ちなみに入力端子AN0は可変抵抗器、出力端子DA1はLCDに 接続しています。 (可変抵抗器からの電圧増減に従ってLCDの表示を変化 させたい) #include <3048f.h> #include <stdio.h> main(){ int a; while(1){ AD.CSR.BYTE = 0x28; while(AD.CSR.BIT.ADF == 0){} a = AD.DRA; AD.CSR.BIT.ADF = 0; DA.DR1 = (unsigned char)((a >> 8)&0x00ff); } }

  • H8 3664Fのプログラム

    タクトスイッチのチャタリングを回避し、奇数回めのONで LEDの交互点灯を(タイマを使って) やろうとしていますが、なかなかうまくいきません。 入門者でお恥ずかしいですが、下記コードの誤りをご指摘頂けませんでしょうか? 宜しくお願い致します。 以下、コード。 #include <3664.h> //プロトタイプ宣言 void main(void); int SW_Read(void); // 入力SWの状態読み込み 関数 void wait(int); // nミリ秒待つウエイト 関数 void wait1ms(void); // 1ミリ秒待つウエイト 関数 void IOinit(void); // I/O の初期化 関数 void main(void) { if (SW_Read()==1) { IO.PDR8.BIT.B0 = 1; // ポート8のビット0を出力ON IO.PDR8.BIT.B1 = 0; // ポート8のビット1を出力OFF DI; // 割り込み禁止 TA.TMA.BYTE = 0x0A; // タイマーA、低速発信・0.25sec設定(タイマーのカウント開始) IRR1.BIT.IRRTA = 0; // タイマーA 検知フラグをゼロクリア IENR1.BIT.IENTA =1; // 割り込み許可 EI; // 割り込み許可 } else { } while(1) { } } /////////////////// I/Oの初期化 void IOinit(void) { IO.PCR8 = 0x03; // ポートコントロールレジスタ: ポート8のビット0・1を出力に設定 // その他のビットは入力に設定 IO.PDR8.BIT.B0 = 0; // ポート8のビット0を出力OFF IO.PDR8.BIT.B1 = 0; // ポート8のビット1を出力OFF IO.PCR1 = 0x00; // ポートコントロールレジスタ: ポート1を全ビット0とし、入力に設定 } /////////////////// タイマーA関数 void int_timera (void) // タイマーA関数 { IO.PDR8.BIT.B0 = ~IO.PDR8.BIT.B0; // ポート8のビット0を反転して出力(赤)LED用 IO.PDR8.BIT.B1 = ~IO.PDR8.BIT.B1; // ポート8のビット1を反転して出力(緑)LED用 IRR1.BIT.IRRTA = 0; // タイマーA検知フラグをゼロクリア } /////////////////// スイッチの状態読み込み int SW_Read(void) { int sw1; //スイッチ状態読み込み1回目 int sw2; //スイッチ状態読み込み2回目 int val; //スイッチの状態判定値の入力値 int memval; //入力信号の全回の値 int numcnt; //奇数偶数判定ループ用カウンタ while(1) //モニタリング { sw1 = IO.PDR1.BIT.B7; // スイッチの状態読み込み1回目 wait(10); // 10mS待つ sw2 = IO.PDR1.BIT.B7; // スイッチの状態読み込み2回目 memval=val; //現行のスイッチ状態判定値をメモリに入れ替える if(sw1==1 & sw2==1) // スイッチ読み込み1回目と2回目共にONだったら { //スイッチ状態判定を<押した>と見なして、 val=1; } else { val=0; } if(memval==0 & val==1) //パルスの前後状態を比較し、新規に立ち上がりONであれば、 { numcnt=++numcnt; if(numcnt%2!=0) //ループカウンタが奇数だったら { return(1); // 1を返す } else { } } else { } } } //////////////////// nミリ秒待つウェイト関数 void wait(int time) { int i; // ループカウンタ for(i = 0 ; i < time ; i++) // time回数分ループ wait1ms(); // 1ミリ秒のウェイト関数を呼び出す } //////////////////// 1ミリ秒待つウェイト関数 void wait1ms(void) { int i; // ループカウンタ for(i = 0 ; i < 2662 ; i++); // 1ミリ秒の間ループする } 以上、宜しくお願い申し上げます。

  • H8マイコンで割り込みが任意の周期で設定できない

    タイマーVで主にTV.TCRV0.BIT.CKS, TV.TCRV1.BIT.ICKS,TV.TCORAで設定すると思うのですが任意の周期になりません。 特に~~~に入る文がタイマーVによって設定した割り込み周期ごとに処理するように作成したのですが,うまくいきません。使用しているマイコンはH8の3694です。 作成したプログラムは以下の通りです。お気付きの点がございましたらご教授お願いいたします。 #include <3694.h> // H8 Tinyの内部I/O定義 #include <stdio.h> #define TCNT 400 // TCNT = 20MHz / (PWM周期=50kHz) #define Ref 240 #define pai 3.141519 unsigned int AdcResult1; // 出力電圧のAD変換出力の16bit変数 void InitH8(void) { //----------------------- // A/Dコンバータ設定 //----------------------- AD.ADCSR.BYTE = 0; // A/D変換停止 AD.ADCSR.BIT.ADIE = 1; // A/D変換割り込み許可 AD.ADCSR.BIT.SCAN =1; // スキャンモード AD.ADCSR.BIT.CKS = 1; // 高速変換 AD.ADCSR.BIT.CH = 001; // AN0-1 //タイマV設定 TV.TCRV0.BIT.CCLR = 1; // コンペアマッチAでTCNクリア TV.TCRV0.BIT.CKS = 3;   //20GHz/128=15.6KHz TV.TCRV1.BIT.ICKS =1; // TV.TCRV0.BIT.CMIEA = 1; // タイマVのコンペアAによる割り込み許可 TV.TCNTV = 0; // タイマカウンタクリア TV.TCORA =156 - 1; // タイムコンスタントレジスタA設定 15.6kHz / 156= 1kHz // タイマW 設定 TW.TMRW.BIT.CTS = 0; // TCNTカウント停止 TW.TCRW.BIT.CCLR = 1; // コンペアマッチAによりTCNTをクリア TW.TIOR0.BIT.IOB = 1; // コンペアマッチBによりFTIOB端子へ0出力 TW.TCRW.BIT.CKS = 0; // 内部クロックφ/1 = 20MHzでカウント } void int_ad (void) { ~~~ } void int_timerv(void) { TV.TCSRV.BIT.CMFA = 0; // タイマV割込みフラグクリア AD.ADCSR.BIT.ADST = 1; // AD変換開始 } void main(void) { DI; InitH8(); // H8_3694設定 EI; // 割込み許可 while(1); // 割込み待ち }