ベストアンサー ※ ChatGPTを利用し、要約された質問です(原文:AD変換した結果を出力する方法は?) AD変換結果の出力方法とは? 2003/12/18 06:22 このQ&Aのポイント H8マイコンを使用してAD変換した結果をパソコンの画面に出力する方法について教えてください。AD変換されたデータはadhenkan[1]とadhenkan[2]に格納されますが、その後の処理方法が分かりません。テキスト形式などで出力することは可能でしょうか? 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]に格納した後にどうすればいいのかわかりません。 質問の原文を閉じる 質問の原文を表示する みんなの回答 (1) 専門家の回答 質問者が選んだベストアンサー ベストアンサー seiuchi4 ベストアンサー率37% (71/189) 2003/12/18 08:21 回答No.1 H8マイコンですとSCIがついていますよね。 H8マイコンはどの様にお使いでしょうか? 基板上に乗せて単独基板としてお使いでしょうか? A/D変換したら、SCIを使用してパソコンと シリアル通信を行う事でデータのやり取りが出来ます。 (MAX232Cなどでチャージポンプする必要がありますが) シリアルでのやりとりなので、プロトコルを規定すれば バイナリデータでもテキストデータでもやり取りすることができますよ。 なお、A/D変換結果が何ボルトなのかは Vrefを変換bit長で分解すればわかります。 8bit時 ADin/255×Vref 10bit時 ADin/1024×Vref (ADinはA/D変換結果) 開発環境などがわからないため、概略での回答とさせていただきます。 質問者 お礼 2003/12/19 09:55 回答ありがとうございます。 H8マイコンは付属のマザーボードにのせたまま使っております。(開発キット買いました) パソコンとH8はRS232Cを利用してやり取りを行っています。 >A/D変換したら、SCIを使用してパソコンと シリアル通信を行う事でデータのやり取りが出来ます。 >(MAX232Cなどでチャージポンプする必要がありますが) これはA/D変換した後にMAX232Cを使用するということですか?それとも出力されたデータを一度MAX232Cを通してから、H8マイコンでA/Dするのですか? プロトコルをどのように設定したらいいのか、見当がつかないのですが、A/D変換した後にADDRA、ADDRBに取り込んだものは 例えば コマンドプロンプトなんかで参照する?って感じにやるのですか? 質問ばかりですいません。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 カテゴリ [技術者向] コンピュータープログラミング・開発C・C++・C# 関連するQ&A 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; } 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/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--); } ネットワークエンジニアとは?技術職の未来を考える OKWAVE コラム AD変換精度に関して。 組み込み系の質問なんですが、 マイコンの特性として、 ・10ビットAD変換の精度が±3LSB ・8ビットAD変換の精度が±1LSB のマイコンがあったとします。 このとき、10ビットAD変換を行い、その結果をシフトして、 上位8ビットで取り出すと、このときのAD変換精度は ・8ビットAD変換の精度が±0LSB と同じ考えとなるのでしょうか? 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マイコンで 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までの対応にしました><どこがおかしいのか教えていただけるとてもうれしいです><助けてください;; 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単一モード } です。よろしくお願いします。 マイコンM16C_AD変換 ルネサスのM16Cについて勉強しております。 AD変換のプログラムをCで書いています。 AD変換開始モードをソフトウェアトリガを選択した場合、 変換停止時は自動でADSTビットが0になり変換が終わる という動きをするのですが、 この動き(ADSTビット=0)、自動で行われる物もプログラム内に記述しないとだめなのでしょうか? A/D変換について こんにちは。 卒業研究でH8/3052(秋月書店)のマイコンボートを使って実験しています。 ファックションジュネレータを使って周波数の様子をA/D変換で調べたいです。その結果をLCDで表示出すという流れでプログラム作っていましたが以下のようなエラーが出ました。 これは未定義のシンボルですADCSR、 これは未定義のシンボルですADDRA、 がたくさんでました。 これはプログラムが間違ってるのか、ヘッダファイルが間違ってるのか自分の実力では判断できないので皆さんの意見をお願いいたします。 一応プログラムを載せます。 長いので一部だけのせたいと思います。 #include <3048.H> #define E_SIG 0x20 #define RS_SIG 0x10 void ioinit(void) { P3.DDR = 0xff; //ポート3を全ビット出力に設定 } void adinit(void) { AD.ADCSR.BIT.ADF = 0; //ADFフラグクリア AD.ADCSR.BIT.SCAN = 0; //単一モード選択 AD.ADCSR.BIT.CKS = 1; //クロックセレクト AD.ADCSR.BIT.CH = 0; //チャネルセレクト AN0単一モード } ・ ・ ・ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ ヘッダファイルはマイコンを買ったときに付属していたCDからコピーしたものです。 皆さんのご指摘よろしくお願いいたします。 H8/3052 周波数について こんにちわ。 大学の研究で声の周波数をH8/3052で 示そうと考えています。周期を使ったプログラムですが、 声をA/D変換された電圧で、電圧が0になった所を0.125秒間で何回かカウントして d = 0.1025 * 2 / count; //一周期分=半周期×2倍÷カウント(0になった数) F=1/d (周波数=1/周期)を使い、ある範囲の周波数内になったらLEDが光るというプログラムを作りたいのですが、何も表示されません。皆様の知識をお借りしたいです。よろしくお願いします。プログラム乗せますのでご指摘お願いします。 //A/Dコンバータテストプログラム //AN0からの入力電圧をLCDに表示 #include <3048F.h> #include <io.h> #define E_SIG 0x20 #define RS_SIG 0x10 void ioinit(void) { P5.DDR = 0xff; } 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単一モード } void wait(void) { int t = 1000; while(t--); } int main(void) { int add; //変換された信号を記憶する int i; int t; int b; int d; int f; int v; int count; ioinit(); adinit(); wait(); //電源ONで15ms以上待ち while(1) { AD.CSR.BIT.ADST = 1; //A/D変換スタート while(AD.CSR.BIT.ADF == 0); //変換終了を待つ add = AD.DRA >> 6; //AN0入力、6ビット右にシフト、大切 AD.CSR.BIT.ADF = 0; //フラグクリア add=(int)((add*(5.0/1024.0)*1000.0)+0.5);//入力データを電圧値に換算 v=add; while(b = 8500) //0.125s間 { while(b--); if(0==v) //0Vになったときカウント { count++; } } d = 0.1025 * 2 / count; //半周期×2倍÷カウント(0になった数) f = 1 / d; //F=1/T (周波数= 1 ÷ 周期) } wait(); if(4000<=f<=8000) //周波数Fが4000~8000Hzになったら実行 { lcdxy2(); //2行目指定 dsp1g(" O K "); //2行目クリア wait(); } } } 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/3048FでのAD変換について どうしても分からないので教えていただきたいのですが、H8/3048FでのAD変換は単一モードとスキャンモードがあります。このスキャンモードは最大で4ch分を AD変換することは理解しています。 私はセンサを6個使用して、これらの6個のセンサが 返す値をAD変換して常時取りこみたいと考えています。H8/3048Fでこの考えを実現できる方法はあるのでしょうか? それとも、4個はスキャンモードでAD変換して、残り の2個は別のADコンバータが必要なのでしょうか? 宜しくお願いします。 AIは使う人の年齢や市場にも影響する?人工知能の可能性 OKWAVE コラム 現在H8/3694Fのマイコンを使っていてKXM52-1050という加 現在H8/3694Fのマイコンを使っていてKXM52-1050という加速度センサから 加速度の電圧値を読み取ろうとしているんですがどうしてもX、Y、Z軸の値が 正常に出ません誰か助けてください。製作環境Gccで製作しています。 ソースはメインプログラムだけですが載せておきます。 void main(void) // メインルーチン { int sw; // swの状態を格納するための変数定義 long k; // A/D変換の変数定義 long ad,sei,syou; // A/D変換の値(整数部,小数部)を格納する変数の定義 long ad1,sei1,syou1; long ad2,sei2,syou2; unsigned long ad_data[3]; // A/D変換結果を格納する配列変数を定義 sw = 0; // swの初期化 set_adc(); // H8 A/Dコンバータを設定する init_lcd(); // LCDをイニシャライズする AD.ADCSR.BIT.ADST = 1; // A/D変換開始 //タクトスイッチが押されるまで、待機 while(1){ while(!AD.ADCSR.BIT.ADF); // 変換終了待ち ad_data[0] = (unsigned long)AD.ADDRA >> 6; // AN0 A/D変換結果を変数(ad_data[0])に格納 ad_data[1] = (unsigned long)AD.ADDRB >> 6; // AN1 A/D変換結果を変数(ad_data[1])に格納 ad_data[2] = (unsigned long)AD.ADDRC >> 6; // AN2 A/D変換結果を変数(ad_data[2])に格納 AD.ADCSR.BIT.ADF = 0; // 変換終了フラグをクリア for( k=0; k<=1; k++){ sw = IO.PDRB.BIT.B7; // swにsw14の状態を格納する ad = (unsigned long) ad_data[0]; // 0~5[V]=0~1023でA/D変換値を取得 sei = ad * 5 / 1023; // 電圧値の整数部1桁 syou = (ad * 5 - sei * 1023) * 100L / 1023; // 電圧値の小数部2桁 for( k=1; k<=2; k++){ ad1 = (unsigned long) ad_data[1]; // 0~5[V]=0~1023でA/D変換値を取得 sei1 = ad1 * 5 / 1023; // 電圧値の整数部1桁 syou1 = (ad1 * 5 - sei1 * 1023) * 100L / 1023; // 電圧値の小数部2桁 for( k=2; k<=3; k++){ ad2 = (unsigned long) ad_data[2]; // 0~5[V]=0~1023でA/D変換値を取得 sei2 = ad2 * 5 PICでのAD変換について PIC16F873を使って、入力信号のAD変換をして、基準値との差により、PWM信号を生成しようとしています。 変換結果の上位8bitがADRESHレジスタに格納されるということなのですが、PWMの周波数を確保するため、できればこの8bitの値をを7bitに落としたいと考えています。 何か方法があれば教えてください。 ADコンバーター デルタシグマ型のADコンバーターが広く使われてるそうです 基本構成の回路でコンパレーターから出た1ビットデジタルデータはデシメーション回路というブロック図に入っています その出力がAD変換された16ビットのデーターが出ていますが、このデシメーション回路とはどんなディジタル回路なのでしょうか? 単純にカウンターで1ビットデーターを数えるだけではダメのようです。 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コンバーターについて ADC0804LCNというADコンバーターを使い、入力電圧(0~+5)を8ビットの2進数に変換したいと考えてます。1つのICが高いので、購入する前に質問があります。 この1つのICのみでAD変換はできるでしょうか?それとも何かほかのICも使わなきゃならないでしょうか? よろしくお願いします。 picマイコンのデータ保存方法について PIC16F785を使った実験を行おうとしています。 SPM0404UD5(超音波マイクロホン)を使用して超音波の発生を検知する回路を作成し、その結果に関して。(どれだけの距離で検知できるか、その時の出力値はどれほどか)確認することを目的としています。 PIC16F785にはADコンバータが内蔵されているので、これを利用しようと思っています。 お聞きしたいのは実験結果の出力に関してです。 ADコンバータを通した場合、データはどのような形で出力されるのでしょうか(電圧値?それとも別の何か?) 実験結果の出力について、どのような方法で出力結果を確認できるでしょうか。 シリアル通信を考えていたのですが応答性が追いつかないだろうという指摘を受けました。 現在PICマイコンにデータを保存する方法を考えていますが、ほかに方法はあるでしょうか。 また、実験で得られたデータをpicマイコンに保存するにはどうすればいいでしょう。 どういったアプローチでプログラムを組めばいいのか、助言をお願いします。 PICマイコンをアセンブラでAD変換をした時に、、 現在PICマイコンの16f88を用いてアセンブラでAD変換の勉強をしています。とりあえずいろいろなサイトやデータシートを見てAD変換した結果をPORTBに出力させるテスト用のプログラムを完成させたのですが、AD変換の結果を格納するADRESLのデータをうまく読み込むことができませんでした。その時のプログラムは(結果は左詰め,X_Lは自分で定義した変数) BSF STATUS,RP0 MOVF ADRESL,W MOVWF X_L ;ADRESLの結果をX_Lに保存 BCF STATUS,RP0 MOVF X_L,W MOVWF PORTB こんな感じです。わざわざADRESLの結果をX_Lに保存しなくても直接出力することもできるんですが気にしないで下さい。で、このプログラムだとPORTBにつないだ全てのLEDが点灯します。 ところがプログラムを以下の様に書き変えたら見事にADRESLレジスタの中身が出力できました。何が起きたのでしょうか?バンクの切り替えの前にWレジスタをX_Lレジスタに書き込むのと、バンクを切り替えてからWレジスタをX_Lレジスタに書き込むのとでは結果が同じになると思うのですが、、、。 BSF STATUS,RP0 MOVF ADRESL,W BCF STATUS,RP0 MOVWF X_L MOVF X_L,W MOVWF PORTB ハイパーターミナル出力の処理方法 (AD変換) シリアルポート(COM1)で取得した IC (MCP3208) のAD変換された電圧データを処理しようとしています。そのプロセスは、(1) MCP3208のCSピンをH-Lで1連のデータをハイパーターミナルで取得(・ m の列に漢字が少し混ざっているようなデータです。) (2) コピーしてアスキーコード変換 (3) 12bit のデジタル出力コード(MSBより) に相当するビット列をさがす (4) CH0~7 のデータ列を切り分ける というプランです。この方法でデジタル変換されたデータを取得できるでしょうか。今のところ、(3)の部分で電圧データにあたるビット列が見つからないという感じです。何か良い方法がありましたら教えて頂ければ助かります。よろしく御願い致します。 注目のQ&A 「You」や「I」が入った曲といえば? Part2 結婚について考えていない大学生の彼氏について 関東の方に聞きたいです 大阪万博について 駅の清涼飲料水自販機 不倫の慰謝料の請求について 新型コロナウイルスがもたらした功績について教えて 旧姓を使う理由。 回復メディアの保存方法 好きな人を諦める方法 小諸市(長野県)在住でスキーやスノボをする方の用具 カテゴリ [技術者向] コンピューター プログラミング・開発 Microsoft ASPC・C++・C#CGIJavaJavaScriptPerlPHPVisual BasicHTMLXMLCSSFlashAJAXRubySwiftPythonパフォーマンス・チューニングオープンソース開発SEOスマートフォンアプリ開発その他(プログラミング・開発) カテゴリ一覧を見る OKWAVE コラム 突然のトラブル?プリンター・メール・LINE編 携帯料金を賢く見直す!格安SIMと端末選びのポイントは? 友達って必要?友情って何だろう 大震災時の現実とは?私たちができる備え 「結婚相談所は恥ずかしい」は時代遅れ!負け組の誤解と出会いの掴み方 あなたにピッタリな商品が見つかる! OKWAVE セレクト コスメ化粧品 化粧水・クレンジングなど 健康食品・サプリ コンブチャなど バス用品 入浴剤・アミノ酸シャンプーなど スマホアプリ マッチングアプリなど ヘアケア 白髪染めヘアカラーなど インターネット回線 プロバイダ、光回線など
お礼
回答ありがとうございます。 H8マイコンは付属のマザーボードにのせたまま使っております。(開発キット買いました) パソコンとH8はRS232Cを利用してやり取りを行っています。 >A/D変換したら、SCIを使用してパソコンと シリアル通信を行う事でデータのやり取りが出来ます。 >(MAX232Cなどでチャージポンプする必要がありますが) これはA/D変換した後にMAX232Cを使用するということですか?それとも出力されたデータを一度MAX232Cを通してから、H8マイコンでA/Dするのですか? プロトコルをどのように設定したらいいのか、見当がつかないのですが、A/D変換した後にADDRA、ADDRBに取り込んだものは 例えば コマンドプロンプトなんかで参照する?って感じにやるのですか? 質問ばかりですいません。