プロポからのパルス値解析ソースのコンパイルエラー(PICマイコン)

このQ&Aのポイント
  • プロポの1Chと2Chからの出力パルスをポートA0、A1ピンより、読み込みPC画面でその値を確認するためのコードですが、コンパイルが成功せずエラー行の表示はありません。使用コンパイラーはCCS社C(PCM版)、PICは16F873Aを使用しています。どこにコンパイル上の問題が生じているのかわからず、2つのチャンネルからの信号を読み取ることができるのかも不明です。ご教示いただけると幸いです。
  • プロポからのパルス値解析ソースのコンパイルエラー(PICマイコン)について
  • プロポの1Chと2Chからの出力パルスをポートA0、A1ピンより、読み込みPC画面でその値を確認するためのコードですが、コンパイルが成功せずエラー行の表示はありません。使用コンパイラーはCCS社C(PCM版)、PICは16F873Aを使用しています。2つのチャンネルからの信号を読み取ることができるのかも不明です。
回答を見る
  • ベストアンサー

プロポからのパルス値解析ソースのコンパイルエラー(PICマイコン)

プロポからのパルス値解析ソースのコンパイルエラー(PICマイコン) いつもこちらでお世話になっております。 さて下記ソースコードはプロポの1Chと2Chからの出力パルスを ポートA0、A1ピンより、読み込みPC画面でその値を 確認する為のコードのつもりですが、 コンパイルが成功出来ずエラー行の表示はないのですが、 HEXファイルが作成しないので、大変困っております。 使用コンパイラーはCCS社C(PCM版)、 PICは16F873Aを使用してます。 以下に、コードを記述します。 #include <16f873a.h> ====プリプロセッサ部分の記述は省略================= この部分の設定は既に、1Chのみ数値確認で実証済みを記述。 =============================================== void main() { int data,data1; set_tris_a(0x0f); setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256); while(1) { while (input(PIN_A0)); while (!(input(PIN_A0))); set_timer0(0); while (input(PIN_A0)); data = get_timer0(); printf("VALUE = %d\r\n",data); delay_ms(500); while (input(PIN_A1)); while (!(input(PIN_A1))); set_timer0(0); while (input(PIN_A1)); data1 = get_timer0(); printf("VALUE = %d\r\n",data1); delay_ms(500); } } 以上、while(1)コード内に構成上の問題があるのではと 思われますが何処にコンパイル上、無理が生じるのでしょうか? また、仮にこのコードでコンパイルが成功したとしても、 2つのチャンネルからの信号を読取る事が可能でしょうか? 目に留めて下さった方で、ご教示頂けるなら大変幸いです。 どうか宜しくお願いいたします。

  • kodoku
  • お礼率80% (101/125)

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

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

エラー内容が書かれていないので想像するしかありませんが、 コンパイルエラーが出るとしたら、関数宣言と呼出部との相違とか、マクロが定義されていないとか、そういうところの可能性が高いです。あるいは関数に見えてるのが実はマクロ定義された処理で、前提となる記述がされていないとか…… #エラーが出てるのはコンパイルであって、リンクとかじゃないんですよね? ロジック的な面で見ると、input関数とかset_timer、get_timerの動作仕様がわからないので正確なところはわかりませんが、これでパルスが正しく読み取れるようには思えません。 > while (input(PIN_A0)); > while (!(input(PIN_A0))); > set_timer0(0); > while (input(PIN_A0)); > data = get_timer0(); この部分の動作が何をやっているのか説明できますか?

kodoku
質問者

補足

早速 不明解な質問にも係わらず、ご回答頂きありがとうございます。CCS-Cコンパイラーは、独自の決まりがあり、一般的C言語からすると難解な部分が多々あります。それでは動作部分の解説してみます。 1.while(input(PIN_A0)); 2.while(!(input(PIN_A0))); 3.set_timer0(0); 4.while(input(PIN_A0)); 5.data = get_timer0(); 行頭の番号で解説します。 まず、パルス幅の途中からカウントしないように 1.A0ピンがhigh+5v(パルス入力)状態から   パルスがlow-5vに下がる迄を繰返し調べる。 2.その後パルスがlowからhighに立ち上り変化するまで繰返し調べる。 3.2.の状態を感知すると同時に、内蔵のタイマー0カウンターを   0に初期設定する。(カウント開始) 4.次に、A0ピンのhighの状態がある時間続く。   その間、timer0カウンターが、内部でカウントしている。   その後A0ピンの状態がlowになると、その時点でカウントが終了。 5.ここで、timer0カウンターに読込んだカウント数を変数dataへ代入する。   と言う様な動作予定の説明になりますが、その後の動作説明では、dataの数値を   ハイパーターミナル通信ソフトを介して、PC画面でモニター表示させ、0.5秒後に   次のピンA1も同様な流れで繰返し、data1 の数値をモニター表示させする。   その後については、コード作成してありませんが、読込んだdata,data1の数値で   プロポのスティック位置を判定し、それぞれのサーボに任意の動作をさせる。   これが、最終目的です。   エラー表示についてですが、エラー行が無いので伝えられないのですが、   Build completed successfullyとならない為、オブジェクトファイルが生成されません。 以上が動作の説明で、解かりずらいかと思われますが、何かの解決の手がかりにでもなればと 再度お願い申しあげます。   

その他の回答 (1)

回答No.2

エラーメッセージが表示されないのに、何故コンパイルエラーだとわかったのでしょうか? もしも何らかのメッセージが表示されたのならそれを示さないと回答できないと思います。 まさかちゃんとコンパイラが実行できてないとかではないでしょうね?

関連するQ&A

  • 超音波センサについて教えてください

    超音波センサについてなのですが、パラレルポートを使って制御しようとしているのですがなかなかうまくいきません。 浅草ギ研さんからでているPING)))を使っているのですが、サンプルプログラムがPICを使用してのもので、 トリガをうってやれば、350マイクロ秒ホールドオフした後、音波を出して帰ってきた時の時間で距離を出すというものです。 プログラム全文 #include <12F675.h> #fuses INTRC_IO,NOWDT,NOPROTECT,NOMCLR,BROWNOUT //内部4MHzクロック指定 #use delay(clock=4000000) //delayを使えるようにする #use rs232(baud=9600,xmit=PIN_A5,rcv=PIN_A3,parity=N,bits=8) //シリアル設定 //(上の行説明)GP5を送信、GP3を受信に設定。 //12F675の場合は初期値がADCモードになっているので、デジタル入力を使う場合は事前にADCなどを切る必要がある。 //16F84などのPICはこの処理は不要。(初期値がデジタルIOだったり、ADCが無かったりする。) //コンパレータとADCを切るために特殊レジスタを操作します。とりあえずアドレスを割り当て。(アドレスはデータシートに書いてある) #byte CMCON=0x19 #byte GPIO=0x05 #byte ANSEL=0x9F void main(void){  set_tris_a(0x00); output_low(PIN_A0); //GP0をLowに(とりあえず。) //コンパレータなどを切って、デジタルIOピンにする処理 GPIO=0x00; //以下3行はデジタルIOに切り替える手順 CMCON=0x07; ANSEL=0x00; //タイマ0を設定(内部クロック使用の場合は4クロックで1カウントなので注意) setup_timer_0(RTCC_INTERNAL | RTCC_DIV_128); delay_ms(1000); //PINGが正常に立ち上がるまで待つ printf("START\r\n"); while(1){ set_tris_a(0x00); //GP0を出力に //トリガパルス出力 output_high(PIN_A0); //トリガパルス立ち上げ delay_us(5); output_low(PIN_A0); //トリガパルス立ち下げ //GP0を入力に切り替え set_tris_a(0x01); //GP0を入力に //パルス幅測定 while (!(input(PIN_A0))); //パルス立ち上がりまで待つ set_timer0(0); //タイマーをリセット(カウント開始) while (input(PIN_A0)); //パルスの立下りまで待つ printf("Dist=%u\r\n\r\n",get_timer0()); //結果出力 delay_ms(500); //0.5mSウェイト } } こんな感じです。 全体的にわからないんですが、 特に while (!(input(PIN_A0))); //パルス立ち上がりまで待つ set_timer0(0); //タイマーをリセット(カウント開始) while (input(PIN_A0)); //パルスの立下りまで待つ この部分のlinuxのC言語への書き換え方がわからなくて苦労しています。 どなたか教えてもらえないでしょうか? OSはVine linuxです。言語はC言語です。

  • C言語のPICプログラミングなんですが、

    C言語のPICプログラミングなんですが、 これのどこがおかしいか教えてください。 if(input(PIN_B1)) { while(input(PIN_B2) == 0) { output_high(PIN_B7); //前進後進パルス出力 delay_us(50); //変換待ち output_low(PIN_B7); delay_us(16000); //共通遅延16000us } break; } if(input(PIN_B1)) { while(input(PIN_B2) == 0) { output_high(PIN_B7); //前進後進パルス出力 delay_us(50); //変換待ち output_low(PIN_B7); delay_us(16000); //共通遅延16000us } break; }

  • PICマイコンによる乱数の表示について

    度々こちらで、お助け頂いております。 さて、今回の主旨はPICマイコンによりLCD表示器へ6個の数字を 表示する方法についてご質問させていただきました。 プログラミングはPIC用コンパイラCCS社のCコンパイラを使用し、 Micro chip社のMPLABと統合動作させています。 一般的なC言語と異なる部分があり、扱づらい面のあるコンパイラです。 では、問題のソースコードを次に記述します。 細部の設定や定義は省いて記述してあります。 1.void main() 2. { 3.int data,i; 4.srand((unsigned)time(ULL)); 5.data = 0; 6.表示器の初期化 7.カーソル位置をHomeへ 8.while(1) 9.{ 10.入力信号判定式 11.for(i = 0; i < 6; i++) 12. { 13. data=rand( )%6 + 1; 14. printf(lcd_data"%3d",data); 15. } 16.入力信号判定式 17.break; 18. } 19. } 以上、これだけのソースコードですが、コンパイルすると、 行番4コードがコンパイルエラーとなります。 (※英語のメッセージは読取れません。(勉強不足)) PICに関するrand( )とsrand( )関数について、いろいろと調べてみましたが、 それらに該当する項目が見当たりません。 そこで、行番4の部分をsrand(data);に変更したら、何とかコンパイル成功します。 それをPICに書込み、ターゲットに実装試験してみると、 100回乱数表示のうち、18回同じ組合せの数が出てしまいます。 どうも、srandの初期化が上手く出来てないみたいですが・・・ 何処が不具合となっているのでしょうか? また、同じソースコードをパソコンの標準Cで試してみると、 130回とも全てランダムに画面表示されます。 そこでどなた様か、PICに詳しい方のお知恵を拝借し、 ご指南頂けるなら、大変幸いに思います。 何卒宜しくお願い申し上げます。

  • PICマイコンができること

    PICは入力信号によって「Yes」か「No」かを出力させるという仕事はできるが、入力信号をそのまま出力させるという仕事はできないものなのでしょうか? 今、PICマイコンに入力する信号は、サーボモータを動かすためのパルス信号であり、サーボモータが右に動くときと、左に動くときとで別々のポートから信号を出力させることを考えてます。 そのために、入力信号のパルス幅をタイマーで計測し、判断させているのですが、問題は判断項目(while や if)が加わると入力信号をそのまま出力することができないことです。 一応、PIC16F84Aを用いて10MHzの内部クロックで 1.判断項目がないとき入力信号をそのまま出力(別々に出力はしない) 2.判断項目は同じとして出力を入力信号にせず、5Vにして別々に出力 の2つについて実際にできました。 結構、厳しい条件ですがPICに期待しすぎなのかわからなくなったので質問しました。 よろしくお願いします。

  • PICマイコン <>内の数字の意味

    PICマイコンのデータシート内で<>に囲まれた数字があるのですがどういった意味があるのでしょうか?添付図はPIC12F683のデータシート(P31)です。 MOVLW 07h   ;Set GP<2:0> to MOVLW 0Ch   ;Set GP<3:2> as inputs MOVWF TRISIO ;and set GP<5:4,1:0> 右側コメントの<>内の数字です。 宜しくお願いいたします。

  • C言語でプログラミングし、PICマイコンでLEDを制御する

    現在PICを使ってLEDを制御する事を勉強しています。 3つのLEDを3秒間隔で点灯させ、それを無限に繰り返すプログラムを考えてみました。LEDは一つのポートに一つのLEDを割り振るのではなく、ICを使って制御しています。 これを発展させ、待ち時間の3秒間にRA2ポートに入力があるとLEDの点灯をその場所で停止させ、もう一度RA2ポートに入力するとループが再開するといった内容にしようと考えていますが、調べてもどうすればいいのか分かりません、分かる方は教えて頂けないでしょうか # include <16f84a.h> # fuses HS, NOWDT, NOPROTECT # use delay(clock=20000000) int flag, sec, count; main() //main関数の開始宣言 { set_tris_a(0x10); set_tris_b(0x10); #use fast_io(a) //port_aの高速処理を行う設定 #use fast_io(b) //port_bの高速処理を行う設定 while(1){ //無限ループのwhile文の宣言 output_low(PIN_A0); //RA0の出力 output_low(PIN_B5); //RB5の出力 output_low(PIN_B6); //RB6の出力 output_low(PIN_B7); //RB7の出力 //LED1が点灯 delay_ms( 3000 ) ; //3秒待つ   output_high(PIN_A0); //RA0の出力 output_low(PIN_B5); //RB5の出力 output_low(PIN_B6); //RB6の出力 output_low(PIN_B7); //RB7の出力 //LED2が点灯 delat_ms( 3000 ) ; //3秒待つ        output_low(PIN_A0); //RA0の出力 output_high(PIN_B5); //RB5の出力 output_low(PIN_B6); //RB6の出力 output_low(PIN_B7); //RB7の出力 //LED3が点灯 delay_ms( 3000 ) ; //3秒待つ }

  • PICマイコン 動作せず、教えて下さい。

    PICマイコン初心者です。 PICマイコン(PIC16F877)をHI-TEC社のPICCでコンパイルして、Buildしたものを 焼き込んで電源印可しますが全然動作せず。  出力に設定しているピン(PORTB)の電圧をみると全て3.8Vぐらいになっています。(不定??)  ちなみに出力PinはVdd(5V) => 発光D => 抵抗 => PORTBと接続されています。  どこが悪いか教えて頂きたく。  *** ソース ファイル ****   #include"pic.h"   void main(void){ unsigned long i; TRISA = 0x00; TRISB = 0x00;   while(1){ PORTB = 0b11111111; //RB0をLowに設定 for(i=0;i<20000000;i++); PORTB = 0b11111110; //RB1をLowに設定 for(i=0;i<40000000;i++); PORTB = 0b11111101; //RB2をLowに設定 for(i=0;i<15000000;i++);          }        }

  • PICマイコン PGMの引継ぎ

    PICマイコン初級者です。 仕事の関係で、先輩の作ったPIC_PGMを引き継ぐことになり、勉強しながら教えてもらっています。しかし十分理解できないところもあり、困っています。 他人の書いたPIC_PGMを初級者にも効率的に引き継ぐ方法はありませんでしょうか? いきなりソースコードを一通り解読する前に、フローチャートなどにまとめるのが先決でしょうか? 参考までにPGMの大まかな内容としては、  PCからUSBで電源供給を受けて光源をパルス発光 →複数の受光素子で受光→それぞれの受光素子の電圧値をAD変換してPCへ送信 →データをリアルタイムで表示(VBAで作ったソフト上にて) となります。 A4で10ページ分になります。 十分な内容をお伝えできていないかも知れませんので、可能な範囲でアドバイス頂けると助かります。 よろしくお願い致します。

  • PIC マイコンの原因不明の破壊

    PIC16F873A を使用してます RB ポートの入力に変化があったとき、RB の内容によってあるパターンを1秒間だけ RC に出力する内容で動作させています ところが、おそらく電源の ON/OFF のタイミングで RB ポートが壊れてしまいます 具体的な症状として、入力ポートにもかかわらず勝手に Low 状態(著しく電圧が下がる状態)になり、そのまま Low 状態と誤認識してしまいます 一度 Low に落ちてしまったピンは、プログラムを書き直してもずっと Low の状態です RB ポートのうち、どのポートが壊れるのかはランダムです 複数壊れる場合もあります RB へのプルアップ抵抗は 100K Ωです 電源はバッテリーから DCDC コンバーター(OBR05SC0512)で5Vにしたものを供給しています ノイズ対策の為、DCDC コンバーターは別の基盤に取り付け、該当の基盤から離しています 4.98V で安定出力しているようです PIC の電源付近にノイズ対策のため、積層セラミックコンデンサの 104 を置いてます 該当箇所のプログラムは以下のとおりです if (InputMemory != input_b()) { InputMemory = nput_b(); if ((!input(PIN_B0)) && (CountStart != TRUE)) { output_c(Speed0); } else if ((!input(PIN_B1)) && (CountStart != TRUE)) { output_c(Speed1); } else if ((!input(PIN_B2)) && (CountStart != TRUE)) { output_c(Speed2); } else if ((!input(PIN_B3)) && (CountStart != TRUE)) { output_c(Speed3); } else if ((!input(PIN_B4)) && (CountStart != TRUE)) { output_c(Speed4); } else if ((!input(PIN_B5)) && (CountStart != TRUE)) { output_c(Speed5); } CountStart = TRUE; TimerCount = 0; for (; CountStart == TRUE; ) { if (InputMemory == input_b()) { TimerCount++; delay_ms(100); if (TimerCount == 10) { output_c(0b11111111); CountStart = FALSE; } } else { CountStart = FALSE; } } } else { output_c(0b11111111); } お手数ですが、ご解答よろしくお願いいたします

  • 思い通りに動かせず、困っています

    ZIG100BeeモジュールとPIC12F675を2つずつ使って回路を作ろうとしているのですが、 ZIGBeeがどんなプログラムで動くのか、検索しても全く解りません。 送信側PIC 4ピン→1kΩ抵抗でプルアップ+スイッチ 7ピン→ZIGBeeTxDに接続 6ピン→ZIGBeeRxDに接続 受信側PIC 4ピン→ZIGBeeTxDに接続 5ピン→ZIGBeeRxDに接続 7ピン→LEDアノード側に接続 6ピン→ブザー+側に接続 このような回路で、送信側スイッチを押すと受信側LEDが点灯、ブザーが鳴るようにしたいのです。 送信側プログラム #include<12F675.h> #byte GPIO =0x09 #byte TRISTO =0x85 #byte CMCON = 0x19 #byte ANSEL =0x9F #fuses INTRC_IO,NOWDT,PUT,NOPROTECT,NOMCLR,NOBROWNOUT #use delay(clock=4000000) #use rs232(BAUD=9600,xmit=PIN_A1,rcv=PIN_A0,bits=8) #use fast_io(a) void main() { set_tris_a(0x09); delay_ms(50); while(1){ if(input(PIN_A3)==0x00){ putc(0x00); delay_ms(50); output_A(0x09); } } } 受信側プログラム #include<12f675.h> #byte GPIO =0x05 #byte TRISTO =0x85 #byte CMCON = 0x19 #byte ANSEL = 0x9F #fuses INTRC_IO, NOWDT, PUT, NOPROTECT,NOMCLR,NOBROWNOUT #use delay(clock = 4000000) #use rs232(BAUD = 9600, XMIT = PIN_A2, RCV = PIN_A3,bits = 8) #use fast_io(A) void main() { set_tris_A(0x08); delay_ms(50); while(1) { if(input(PIN_A3)== 0x00) { if(kbhit()) { delay_ms(500); output_high(PIN_A0); delay_ms(500); output_low(PIN_A1); } } } } このようなプログラムにしたのですが、受信側が送信側の操作に反応せず、 電源プラグを挿しただけで動作してしまいました。 すみませんが、誰か解る方がいたら教えてくれませんか?