• 締切済み

A/DデータをSCIを利用してPCに表示したいのですが

H8/3052Fとポテンショメータ(通信ケーブルはRS232-C)を利用して得られるA/DデータをPCに表示させようとしています。 SCIとPCに最初から入っているハイパーターミナルを利用してA/Dデータを得たいのですが上手く行きません。 参考にしている資料のサンプルプログラム(文字をPCに返す)が上手く行ったのでそれと、A/Dデータ変換プログラムを組み合わせて行いました。 ですが、結果として文字列が表示されるものの数値データが帰ってきませんでした。 組みなおしましたが、出てくるのは文字(プログラム変更で無限に出る場合あり)と無限スペース(改行?)で進展しません。 考えとしては、文字データを返すプログラム文とは別に数値データを返すプログラム文にしないといけないのかな?と、思って調べたのですがこの考えを裏づけるものはありませんでした。(着目点が違うのかもしれませんが・・・)

みんなの回答

  • Interest
  • ベストアンサー率31% (207/659)
回答No.1

それほど長くないのであれば、ソースコード(全部)見せていただけますか?

rador
質問者

補足

int add,add1; char tmp[20] ; void ioinit( void ) ; void int_imia0( void ) ; void ituinit() ; void setGRA( double deg ) ; void adinit(void) { AD.ADCSR.BIT.ADF = 0; AD.ADCSR.BIT.ADIE = 0; AD.ADCSR.BIT.ADST = 0; AD.ADCSR.BIT.SCAN = 1; AD.ADCSR.BIT.CKS = 1; AD.ADCSR.BIT.CH = 1; } typedef enum { BR2400 = 80, BR4800 = 162, BR9600 = 80, BR19200 = 40, BR38400 = 19, BR57600 = 13, BR115200 = 5, } BaudRate; void initSCI1 (BaudRate b) { int i; SCI1.SCR.BYTE = SCI1.SMR.BYTE = 0; SCI1.BRR = b; for (i = 0; i < 3000; i++) ; SCI1.SCR.BYTE = 0x30; SCI1.SSR.BYTE; SCI1.SSR.BYTE = 0x80; } void SCI1_OUT_d (char c) { while (SCI1.SSR.BIT.TDRE == 0) ; SCI1.TDR = c; SCI1.SSR.BIT.TDRE = 0; } void SCI1_OUT_s (char *st) { while (*st) SCI1_OUT_d(*st++); } char SCI1_IN_d (void) { char c; while (!(SCI1.SSR.BYTE & 0x78)) ; if (SCI1.SSR.BIT.RDRF == 1) { c = SCI1.RDR; SCI1.SSR.BIT.RDRF = 0; } else { SCI1.SSR.BYTE &= 0x80; c = 0; } return c; } int cnt ; double T = 2.0 ; double A = 30.0 ; int main(void) { unsigned char rd = 0; int i; adinit(); ioinit(); ituinit(); initSCI1(BR19200); while( P4.DR.BIT.B4 ) ; //while(1) SCI1_OUT_s("WELCOME!!") ; cnt = 0 ; ITU.TSTR.BIT.STR0 = 1; EI; while(1){ AD.ADCSR.BIT.ADST = 1; while(AD.ADCSR.BIT.ADF == 0); add = AD.ADDRA >> 6; add1 = AD.ADDRB >> 6; AD.ADCSR.BIT.ADF = 0; add = (int)((add *(5.0/1024.0)*1000.0)+0.5); add1 = (int)((add1*(5.0/1024.0)*1000.0)+0.5); //sprintf(tmp,"%d",add) ; //SCI1_OUT_s(tmp) ; P5.DR.BIT.B0 = 1 ; } } void int_imia0 (void) { ITU0.TSR.BIT.IMFA = 0; ++cnt ; double w ; w = -A * (2.0*PI/T) * cos( (2.0*PI/T) * (double)(cnt)/500.0 ) ; setGRA( w ) ; P5.DR.BIT.B1 = 0 ; if( abs(w) < 8.58 ) P5.DR.BIT.B1 = 1 ; sprintf( tmp, "%d", add ) ; SCI1_OUT_s( "A/D1 : " ) ; SCI1_OUT_s( tmp ) ; } void ioinit(void) { PB.DDR = 0xff; P4.DDR = 0x00 ; P4.PCR.BYTE = 0xff ; P5.DDR = 0xff ; P5.DR.BIT.B0 = 0 ; P5.DR.BIT.B1 = 0 ; } void ituinit() { ITU0.TCR.BYTE = 0x22; ITU0.GRA = 12499; ITU0.TIER.BIT.IMIEA = 1; ITU0.TSR.BIT.IMFA = 0; ITU3.TCR.BYTE = 0x22; ITU4.TCR.BYTE = 0x22; ITU.TMDR.BIT.PWM3 = 1; ITU.TMDR.BIT.PWM4 = 1; ITU3.GRB = 62; ITU4.GRB = 62; } void setGRA(double deg) { if( abs( deg ) < 8.58){ deg = 0 ; }else if( abs( deg ) > 4537 ){ if( deg < 0 ){ deg=-4537 ; }else{ deg=4537 ; } } if( deg == 0 ){ ITU.TSTR.BIT.STR3 = 0 ; ITU.TSTR.BIT.STR4 = 0 ; }else if(deg>0){ ITU.TSTR.BIT.STR3 = 1 ; ITU.TSTR.BIT.STR4 = 0 ; ITU3.GRA = (180000.0*25.0/(8.0*deg))-1.0; } else{ deg *= -1 ; ITU.TSTR.BIT.STR3 = 0 ; ITU.TSTR.BIT.STR4 = 1 ; ITU4.GRA = (180000.0*25.0/(8.0*deg))-1.0; } } 以上です。コメントされているところを有効にしたりすると、無限改行?になったりします。 よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • H83052 シリアル通信 A/D変換データ送信 について

    毎回の質問失礼します。 現在H83052マイコンを使用して、センサで得た電圧値を1ms間隔でA/D変換させるプログラムを作成しています。 マイコンのA/D変換機能と、ITUタイマ機能を用いて測定を行うまでのプログラムの作成は何とか完了しました。 ここで、測定終了後データをどのようにして表示したらいいのかというところでとまっています。 データはA/D変換データ(data[]←int型)、A/D変換時の時間データ(time[]←long型)が、測定プログラム実行時に200個ずつ配列に保存されています。 これをそのままシリアル通信機能を用いてPC側に表示させるようにしたいのです。シリアル通信のH8側からPCへの送信の場合TDRにデータを書き込みそれをTxDより送信すると思うのですが、実際にTDRのアドレスは1バイトですので、データとしては入りません。1バイトごと分けて送信するという方法になってくるのではないかと考えていますが・・・ また、送信する時のコードとしては、数字データもアスキーコードとして送信されてしまうことになるのでしょうか? どなたか、わかることやアドバイスがあれば、回答よろしくお願いします。

  • マイコンを用いたバイナリー形式での通信の方法

    以下のようなハード環境とプログラムで、マイコンの変数値をPCへ取り込む環境(データロガー)を実現しております。ただし、更にデータの取り込み速度を向上させたく考えておりますが、その手段として、”バイナリー形式”での通信が適用できると情報を得ておりますが、具体的な手法が不明です。よろしくご教授をお願いします。 <環境> ・H8マイコン ・RS-232CでPCと接続 ・PCでのデータ取得は、ハイパーターミナルを利用 <プログラム> (1)送信する部分 H8のSCI3を利用して、1文字ずつ送信 以下具体的に作成したプログラムです void sci3_tx(char data){ while (SCI3.SSR.BIT.TDRE==0); SCI3.TDR=data; } (2)実際の送信 "1234"(←千二百三十四)と"3456"(←三千四百五十六)というデータを連続して送信したい場合には、 sci3_tx(1+48); sci3_tx(2+48); sci3_tx(3+48); sci3_tx(4+48); sci3_tx('\r'); sci3_tx('\n'); sci3_tx(3+48); sci3_tx(4+48); sci3_tx(5+48); sci3_tx(6+48); sci3_tx('\r'); sci3_tx('\n'); と処理し、ハイパーターミナルでデータを保存して、"1234"と"3456"を取り出しています。 <ご質問の詳細> (1) 上記のように2つの数値をバイナリー形式で送信するためには、どのように実施したらよいのでしょうか? 例えば、バイナリーの場合2の8乗であるので、 1234を送信する場合、255+255+255+255+214で、11111111、11111111、11111111、11111111、 11010110と送信して、加算処理をすればよろしいでしょうか? (→255を11111111と送信するプログラムもいまいち不明ですが) (2)バイナリー形式で送信する際の送信始め/終わりの区切りはどのように考えたらよろしいでしょうか? (3)バイナリー形式を受信できるソフト(ハイパーターミナルに対応するもの)は、何になりますでしょうか? 以上、いくつかのご質問をさせていただきましたが、参考となる情報(Web、書籍)がありましたら、合せてご紹介をお願いいたします。

  • Octaveのデータを保存し、gnuplotで表示

    現在、Octaveの計算結果の数値を保存しgnuplotでグラフ表示させたいと考えています。 ですが、for文を利用した際に最後のループの数値しか保存されません。 すべての数値を保存したいのですがどのようにすればよいかご意見をいただけないでしょうか。(mファイルで実行しています) また、保存したデータをグラフ化する際のgnuplotのコマンドを教えて頂けないでしょうか。 よろしくお願いします。 【参考プログラム】 for a=-2:1:2 for b=-2:1:2 printf("x(1)=%f x(2)=%f \n",a,b); printf("\n"); endfor endfor save nn.dat a b

  • Excel関数・A1が0の時A1とA2を表示しない

    タイトルのような関数を教えてください。 A1=別のシートから参照する数値 A2=文字列 で、 A1の数値が0値の時、A1とA2(文字)を表示しないようにさせたいです。 よろしくお願いいたします。

  • HTMLで各PCのDataを表示する

    WWWサーバにあるIndex.htmlから各Userが利用している 「C:\temp\User.txt」の内容を表示するにはどうしたら いいでしょうか? 今は、リンク先をクリックしても、カチッと音がして画面は一切更新されません。 ------ <a href="file://C:/temp/User.txt">個人データ表示</a> ------ ↑のように記述しているのですが、書き方を下のよう変えてみたのですがうまくいきません。 <a href="<file://C:/temp/User.txt>">個人データ表示</a> <a href="C:/temp/User.txt">個人データ表示</a> <a href="<127.0.0.1//C$/temp/User.txt>">個人データ表示</a> WWW_Server内に保管すれば表示されることは確認出来ましたが 各Userが利用しているPC内に保管して、各個人が直接 「User.txt」を編集出来るようにしたいと考えています。 どなたか知恵を貸して下さい。よろしくお願いします。

    • ベストアンサー
    • HTML
  • エクセルでデータを表示させたいのですが、可能でしょうか?

    エクセルでデータを表示させたいのですが、可能でしょうか? 表を添付させていただきました。 設定1には、ランダムにuとdの表示がされています。 設定2には、それぞれ数値が入っています。 設定3には、設定1でuかdの表示が入った際の数値が出るようにしています。 今回行いたいことは、条件1の欄に該当した設定2の数値を、条件の欄以降で、最初に表示された 設定3の数値から引いたものを表示の欄に出したいと思っています。 表の例の場合、D6に条件合致の「1」が入り、設定2の数値(B6)は「6」となります。 また、D6より下に位置して、設定3の欄で最初に表示される数値(C9)は、「9」と なりますので、E6には、「9-6=3」の数値が表示されるようにしたいのです。 説明が分かりずらくて恐縮ですが、表示させることが可能かどうかご教授願いますm(_ _)m

  • PCビスタのDドライブを区分利用したい

    PCを共同で使用する場合データファイルをDドライブで保存する場合 他のPC利用者からDドライブに保存したデータを見られないようにするには、良いほうほうがあれば教えてください

  • データの移動(Cドライブ→D)について

    あまりPCには詳しくないので教えていただきたいのですが、最近Cドライブの残量が少なくなったため、ディスクのクリーンアップやデフラグを行ったのですが、ほとんど容量が増えません。不要なプログラムも整理しましたがあまり改善されません。そこで、CドライブのデータをDドライブに移してCのデータを削除しようと思いますが、その方法が分かりません。Cドライブをクリックすると、「fjury」「pifmae」「program Files」「windows」「ユーザー」と表示されるのですが、右クリックして「送る」を表示させても移動先に「D」と表示されません。(「ドキュメント」とか「デスクトップ」というのはあるのですが) この場合どうすればCドライブのものをそっくりDに移すことができるのでしょうか。また、データを移してCのデータを消去してしまうだけで、今までどおりパソコンは作動するものでしょうか。よろしくお願いします。なお、PCのOSはVistaで、Dドライブも装備されています。

  • エクセル2010のデータを他のpcに移す

    エクセル2010のデータを同じ2010のノートPCに移動しました。 このとき、データは当然同じですが、たとえば、エラーチェックオプションは再設定しなければなりませんでした。 文字列として数値を入力していますが、エラーマークが表示されるためされないようにチェックを入れていたのに、新しいPCというかエクセルではなくなっていました。 そこまでは、コピーしてくれないのですよね。 他に、しなければならないことがあるのかなと思ったら気持ち悪いです。 思いつくものがあれば教えていただけませんか?

  • Excelで、数値データとして参照したいのに、文字列データとしてしか参照してくれません

    Excelで、ある数式セルに表示されたデータを、数値データとして参照したいのですが、どうやっても文字列データとしてしか認識してくれません。 具体的に書くと、 例えばセルA1に、FIND関数で他のセルから抜き出した半角数字のみのデータを表示しているとします。 そのA1の数値を、今度はセルA2で、 if(A1=1000,A1*2,A1/2) などと数式で参照したい時に、私のExcel(2002です)では、どうやってもA1=1000という条件式をきちんと判別してくれません。どうやら、FIND関数で抜き出したために文字列データとして扱われてしまっているようです。 その証拠に、A1が実際に「1000」の時に if(A1="1000",A1*2,A1/2) という風に1000をダブルクォーテーションで囲んで式を書くと、きちんとA1*2を実行してくれます(つまり、A1が実際に1000の時でも条件式の1000をダブルクォーテーションで囲まないと、きちんと判別してくれないという事です)。 この状態から抜け出せずに、どうにも困っています。 どうにかA1の「1000」というデータを文字列でなく数値データとして条件式で利用できるように出来ないものでしょうか。 乱文ですみませんが、よろしくお願いいたします。