A/D変換について

このQ&Aのポイント
  • 卒業研究でH8/3052のマイコンボートを使用し、A/D変換において未定義のシンボルエラーが発生しています。プログラムの間違いかヘッダファイルの問題か判断できず、アドバイスを求めています。
  • 卒業研究でH8/3052のマイコンボートを使用し、A/D変換を行っていますが、未定義のシンボルエラーが発生しています。プログラムかヘッダファイルの問題か判断できず、アドバイスをいただきたいです。
  • 卒業研究でH8/3052のマイコンボートを使用し、A/D変換において未定義のシンボルエラーが出ています。プログラムの間違いかヘッダファイルの問題かわからず、助言をお願いします。
回答を見る
  • ベストアンサー

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からコピーしたものです。 皆さんのご指摘よろしくお願いいたします。

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

  • ベストアンサー
  • ricardo_
  • ベストアンサー率19% (14/72)
回答No.4

No3 です。ヘッダファイルは自分用に改造したかも知れない。  自分のヘッダファイルも載せておきます。 /************************************************************************/ /* === 15章 A/D変換器 === */ /* #define AD (*(volatile struct st_ad *)0xFFFFE0) /* A/D Address*/ /* マニュアル 15.3 によると、上位バイトを読んでから下位バイトを読む。 */ /* よって unsigned int DRA はおかしい */ /************************************************************************/ struct st_ad {unsigned int DRA, /* A/Dデータ・レジスタA */ DRB, /* A/Dデータ・レジスタB */ DRC, /* A/Dデータ・レジスタC */ DRD ; /* A/Dデータ・レジスタD */ /*----------------------------------------------------------*/ union {unsigned char BYTE; struct {unsigned char ADF:1, ADIE:1, ADST:1, SCAN:1, CKS:1, CH:3 ; } BIT ; } CSR ; /* A/Dコントロール/ステータス・レジスタ*/ /*----------------------------------------------------------*/ union {unsigned char BYTE; struct {unsigned char TRGE:1, reserve:7 ; } BIT ; } CR ; /* A/Dコントロール・レジスタ */ } ;

a061124
質問者

お礼

参考にしてみたらできました。 ご教授、ありがとうございました。

その他の回答 (3)

  • ricardo_
  • ベストアンサー率19% (14/72)
回答No.3

 自分の過去のプログラムを見ると以下のようになっていました。 あなたの AD.ADCSR.BIT.ADF = 0; //ADFフラグクリア となっている部分を AD.CSR.BIT.ADF = 0; //ADFフラグクリア とすれば動くかも知れない。もちろん、その後の3行も同じ。  3048と3052はROMに書き込むハードが違うぐらいなので、ヘッダは共通して使えます。  ROMライタを作るので無ければ、問題有りません。 /*=== A/Dの設定 (マニュアル15章)===*/ DUMMY = AD.CSR.BYTE ; /* ADF をダミーリード 割り込みフラグが立っている時のための処理 */ AD.CR.BYTE = AD.CSR.BYTE = 0x00 ; /* リセット時と同じ値にする */ /* ADF : 1 で A/D 変換終了 */ /* ADIE : 1 で A/D 変換終了割り込み許可 */ /* ADST : 1 で A/D 変換スタート */ /* SCAN  1:スキャンモード 0:単一モード*/ /* CKS : 変換クロック数選択 */ /* CH2,1,0 : チャネル選択 */ /* ADCR:"TRGE, XXX,XXXX" 外部トリガによるA/D変換制御 */ /* 0:禁止 1:ADTRG の立ち下がりで変換開始 */ AD.CSR.BYTE = 0x57 ; /* 0101 0111 ADF=0, ADIE=1, ADST=0, SCAN=1, CKS=0, AN4-7 */

  • chie65535
  • ベストアンサー率43% (8519/19367)
回答No.2

>卒業研究でH8/3052(秋月書店)のマイコンボートを使って実験しています。 確認するけど、秋月のH8/3052なんだよね? 秋月キットのCDROMに3052.hってのが入ってるから、そのファイルを見てみよう。 そうすると、ADCSRに相当するレジスタは「CSR」って定義されてるのが判る。 1. #include <3048.H> を #include <3052.h> に変える。 2-1. 3052.hを見ながら「AD.ADCSR」は「AD.CSR」に、同様に「AD.ADDRA」は「AD.DRA」に書き変えて行く。 または 2-2. #include <3052.h> の直後、 #define E_SIG 0x20 の直前に、3052.hを見ながら #define ADDRA DRA #define ADDRB DRB #define ADDRC DRC #define ADCSR CSR のように「ADDRAはDRAに読み替えをする」と言う定義を必要なだけ書き足す。 「2-1.」と「2-2.」は「どっちか片方」だけで良いです。 「H8/3052」を使うなら「3052.h」をインクルードしなきゃダメっすよ。3048と3052はインタフェースレジスタのアドレス配置が違うからね。

a061124
質問者

お礼

いろいろとご指摘ありがとうございます。 皆さんの意見を参考にした結果できました。 ご教授ありがとうございます。

  • pyonmae
  • ベストアンサー率64% (40/62)
回答No.1

こんにちは。 ADCSRだのADDRAだのは、その、マイコンを買ったときに付属していた<3048.H>とやらで宣言されているはずなので、その内容が分からない事には、他人にはもっと判断できません。 と言いたいのですが、ヘッダファイル名でググってみたら、いろんな人がソースを公開していました。 違いも確認できますので、ちょっと覗いてみてはいかがでしょうか。

a061124
質問者

お礼

情報足りなくて申し訳ありませんでした。 少ない情報でのご意見ありがとうございます。

関連するQ&A

  • 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マイコンで 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で 示そうと考えています。周期を使ったプログラムですが、 声を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(); } } }

  • 3048fマイコンでのA/D変換について

    マイコン初心者ですが今3048fマイコンを使ってA/D変換をしようとしているんですが、うまくいかないので教えて頂きたいです。 プログラムは下の通りです。 #include <3048.h> /* メイン関数 *****************************************/ void main(void){ int ad_data; P1.DDR = 0xff; /*port1出力に設定 表示LED */ P4.DDR = 0x00; /*port4入力に設定 操作用sw1~4 */ P4.PCR.BYTE = 0xff; /*port4プルアップon */ AD.ADCSR.BYTE = 0x33; /* SCAN MODE / CH0~3  */ while(AD.ADCSR.BIT.ADF == 0){} /* 4CH分の変換終了を待つ */ while(1){ if(P4.DR.BIT.B4 == 0){ /* sw1の時 */ ad_data = AD.ADDRA>>8; } else if(P4.DR.BIT.B5 == 0){ /* sw2の時 */ ad_data = AD.ADDRB>>8; } else if(P4.DR.BIT.B6 == 0){ /* sw3の時 */ ad_data = AD.ADDRC>>8; } else if(P4.DR.BIT.B7 == 0){ /* sw4の時 */ ad_data = AD.ADDRD>>8; } P1.DR.BYTE = ad_data & 0xFF; /*上位8bit分だけ表示させる */ } } このように4チャンネル分の0~5vのアナログ信号をスキャンモードでA/D変換し、それぞれ対応したスイッチを押すことによって現在どのくらいの電圧が来ているかLEDに2進数で表示させようとしています。しかしsw1とsw2、sw3とsw4がそれぞれ同じ値を表示しています。例えば、sw1を押したらADDRAの値が表示されますが、sw2を押しても同じADDRAの値が表示されます。またsw3とsw4も同じでどちらを押してもADDRCの値が表示されます。 4チャンネル分を同時にA/D変換することは元々出来ないのでしょうか?いろいろ調べてはいますが理由が分かりせん・・・ADDRA=ADDRB、でADDRC=ADDRDなのでしょうか?分かりにくいとは思いますが教えて頂けると幸いです。よろしくお願いいたします。

  • 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); // 割込み待ち }

  • 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文のあたりでコンパイルできなくなるのですがどうしたらいいでしょうか? お願いします。

  • 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/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

  • 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; }

  • 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);

専門家に質問してみよう