- 締切済み
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);
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- pyonmae
- ベストアンサー率64% (40/62)
こんにちは。 8つあるAD変換をすべて使用=グループをまたいだAD変換 という事なのです。 つまり、レジスタが4つしかない以上、8つのAD変換を同時に使うという事がもう無理なのです。 挙げられたサイトのプログラムは、確かにスキャンモードを使用していますが、グループ毎の変換終了割り込みでグループを切り替えて再スタートをかけています。 グループ0→グループ1→グループ0→・・・とすごい勢いで「グループをまたいだ変換」を行っています。 もちろん、これでも目的の動作は行えますが、気になる点もあります。 ・割り込みが頻繁にかかって、多くのCPU処理をADのグループ切替えに持っていかれる。 ・AD変換動作中にもかかわらず強引に再スタートをかけるので、せっかくやりかかったAD変換が無駄になる。処理的にもスマートでない。 そもそも、そこまでスキャンモードにこだわらなければならないほど、リアルタイムにセンサを読まなければならないのか、ご検討下さい。 私なら、次の2案で検討します。 1. 先の回答に書いたように、都度都度AD変換をスタートする。 2. AD変換専用のタスクを立ち上げる。
- pyonmae
- ベストアンサー率64% (40/62)
こんにちは。 いきなりですが、結論から言いますと「できません」。 「グローブ角度」センサと、「アーム角度」センサを同一グループのアナログ入力端子に割り振るか、それが無理なら都度都度チャンネルを指定してAD変換を起動するようなソフトを実装する必要があると思います。 グループをまたいでしまうと、スキャンモードは全くといっていいほどメリットは無いでしょう。 蛇足ながら、業務で使用するシステムならば、スキャンモードで回しておいて不定なタイミングでレジスタ直値を測定値として採用する、といったようなルーズな仕様はあまり感心しないところです。 平均化するなどノイズ対策が必要でしょうし、アプリ中でハードウェアを直接叩くというのも見た感じあまりよろしくありません。 今一度設計から見直される事を、望むところであります。 もう一つ蛇足ながら、このご質問ですと、「C C++」カテゴリには相応しくないと思われます。
補足
回答ありがとうございました。 ご指摘いただいた点は検討してみます。 私の質問で至らない点があったので補足しますと 同一レジスタを1度に処理するということではなくただ単に8つあるAD変換をすべて使用したいという意図でした。 グループをまたいでAD変換したいというわけではなく、1度に4つまでしかAD変換ができないのでそれ以上使用したいので、そのようなときにはどういったようにプログラムすればよいかという質問内容のほうが正しかったです。すみませんでした。「グローブ角度1」センサをグループ0のAN0、「アーム角度1」センサをグループ0のAN1で1セットとしていった時に、「グローブ角度3」センサをグループ1のAN4、「アーム角度3」センサをグループ1のAN5という様にしたいので教えて下さい。 出来るようなサイトも載ってました http://rur.mech.tuat.ac.jp/~h8_tech/a-d.htm