• 締切済み

C言語によるPICプログラムについて

下のようなプログラムが組みたいです。 ある命令文を無限に繰り返す。  命令文:d4,d6,c6に順番に出力(on:500ms,off:1us)      出力のタイミングに関係なく、一定の間隔でa4に入力が入る その命令の途中(数秒後)で、a4に3回入力が入る時間を計測する。 計測後、命令文の繰返し終了。 わかりにくい説明ですが、よろしくお願いします。

みんなの回答

回答No.2

PICのC言語は未経験だが、1チップのアセンブラで開発した経験から言うと ・出力のタイミングを取るタイマを用意する。 ・出力先を示す変数を用意する。 ・a4の入力回数のカウンタを用意する。 ・経過時間をクリアする。 ・以下の処理を繰り返す。(無限ループ) ・・出力先を選択する。 ・・出力のタイミングなら出力する。 ・・a4に入力が有ればカウンタを+1する。 ・・カウンタが3なら経過時間を取得し、カウンタをクリアする。 といった感じになります。

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

>わかりにくい説明です そのように自覚されているのでしたら、 わかりやすく説明できるように考えたり努力したりしてみてくださいませんか?

katsuy
質問者

補足

すいません。 PIC877Aを使ってます。 3つのピン(d4,d6,c6)に順番に一定の時間出力します。 この動作をずっと繰り返します。 この間、別の間隔で他の1ピン(a4)に入力が入ります。 動作が始まってから数秒たった後に、a4に3回入力が入る時間を計ります。計測が終わったら、この動作を終了します。 上記の動作を行いたいのですが、上手くいきません。よろしくお願いします。

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

関連するQ&A

  • C言語(PIC関連ですが・・・)

    センサーが接続されたPICマイコンでDCモータを制御する際に、前のセンサーと次のセンサーの間隔が長く、DCモータが停止してしまうので、前のセンサーの信号を次のセンサーの信号が入力されるまで保持されるようなプログラムを作りたいのですが、どのようなプログラムにしたらよいでしょうか・・・ ちなみに、下が試作プログラムの一部です。 if(b== 0x39) //センサ1が入力されたとき { PORTA = 0b00000010; Delay_ms(1); PORTC = 0b00000000; Delay_ms(1); PORTD = 0b00000001; Delay_us(350); PORTD = 0b00000000; Delay_us(300); } if(b== 0x3d) //センサ2が入力されたとき { PORTA = 0b00000001; Delay_ms(1); PORTC = 0b00000000; Delay_ms(1); PORTD = 0b00000001; Delay_us(325); PORTD = 0b00000000; Delay_us(300); }

  • PICのA/Dを使うプログラムについて質問です

    今、電子ドラムを作っているのですが、プログラムが上手く作動せず困っています。 知恵を貸していただけたら幸いです。 センサー部が叩かれると電圧が上昇するようにしてあるのですが、PICでHighと認識されるほど電圧が上がらないので、A/D変換を使い入力を判定しているのですが、2つ以上の入力のプログラムが上手く行きません。 Pinごとに順番にA/D変換し、一定値以上なら変数にpinごとに割り振った2進数を加算し、入力pinすべての判定が終わったときの変数の値別にswitch文で出力を変え、70ms出力するようなプログラムをつくりました。 入力が1pinだけの同様のプログラムは動くのですが、入力を複数にすると動きません。 このように複数のA/D変換をほぼ同時にする方法は無いでしょうか? デバイスは16F877/20-SP 言語はCでCCS-Cコンパイラーを使っています。 回答よろしくお願い致します。

  • 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のプログラムカウンタについて

    プログラムカウンタでポートAに4bitの2進数を入力して、変換された2進数のデータをポートBに出力させることはできたのですが、 ポートCにも違うデータを同時に出力させたいのですが、どういった命令文を作ったらいいでしょうか? 例えば、ポートAが「HLHL」の入力の時にポートBでは「HLLH」、ポートCでは「LLHL」を出力させる方法です。 言語はアセンブラ、マイコンはPIC16F886です。 よろしくお願いします。

  • PICでスピードメーターを作るためのプログラムについて

    PIC16F84Aを使用してスピードメーターを自作することを目指しているのですが、 まだ初心者なのでどういったプログラムを組めばよいのかが分からないのですが自分なりに方法を考えてみました。 それは、 車速パルス間の時間をタイマーで計測し、その結果に応じてあらかじめ用意した表示用のデータを出力する。 データを出力したら次のパルス間の計測結果が出るまで表示を続け、次の計測結果が出たらそれを新たに出力する。 というものです。 一般的なメーターもこういう原理なのかも知れませんが・・・。 「Timer0」「プリスケーラ」「割り込み」というものを使用したりするようですが、 正直言ってこれらの具体的な使用方法が分かりませんのでとりあえずスピードメーターを簡素化?したものを学習用として作ることにしました。 それは PICのピンにタクトスイッチを取り付け(チャタリング対策もする)、入力用にする(割り込みが出来るRA4でいいのかな?)。 RBのポートを7セグ表示用のICへ繋ぐ。 という回路で、 電源を入れるとタイマーが計測をはじめ、タクトスイッチを押すと押すまでの時間に応じて結果をポートBに出力する。 電源ON→スイッチ1回目→結果を出力すると同時に2回目までの計測を開始→スイッチ2回目→結果を出力すると同時に3回目までの計測を開始・・・と続く。 この回路での計測結果と出力データの関係は以下のようにします。(適当に考えたものですが) 計測結果が 10秒以上・・・00を表示(2桁はダイナミック点灯で表示) 9~10秒・・・01を表示(厳密には9秒以上10秒未満) 8~9秒・・・・02を表示(厳密には8秒以上9秒未満、以下同じ) 7~8秒・・・・03を表示 6~7秒・・・・04を表示 5~6秒・・・・05を表示 4~5秒・・・・06を表示 3~4秒・・・・07を表示 2~3秒・・・・08を表示 1~2秒・・・・09を表示 0~1秒・・・・10を表示 というものを試しに作ってみようと思います。 アセンブリ言語を使ってプログラムを作るのですが、 Timer0やプリスケーラ、割り込みをプログラムの流れの中でどのように利用すればよいでしょうか? 出来たらソースを作って頂いてそれで詳しく説明を書いていただけると非常に助かります。

  • PICプログラムについて

    こんにちは 早速ですが質問です。 PIC16A84を使用しています。発振は4Mhzを使用しようと考えています。 入力Aの信号ONで出力Aの信号を(通常ON)をを25mSec間OFFし次にONを25mSecと入力Aの信号がONの間繰り返すのですが、この他に、入力Bと出力Bがあり、入力A、出力Aと同じ動きをするのですが、入力AとBが同時にONしたときのプログラム方法がわかりません。(プログラムの同時進行の場合のプログラミング方法) わかりずらいですがよろしくお願い致します。

  • C言語 タイマーのソースについて

    C言語でタイマーを使ってprintf文を記述することで 「1秒経過」、「2秒経過」、「3秒経過」のように表示させたいのですが、どのように表示させるのでしょうか? タイマーの間隔は、できれば1 [ms]だとうれしいてす。 回答お願いします

  • C言語

    ストップウォッチの一時停止の機能をもつプログラムを作成しているのですが、上手く動作しません。 (一時停止し、再開してもその状態から再開できない状態) #include <windows.h> #include <mmsystem.h> #include <stdio.h> #include <conio.h> #pragma comment(lib, "winmm.lib") int main(void) { int command;//キーボード入力の文字判別用変数 int quit_flag = 1;//プログラム終了フラグ 0で停止 int c_flag = 0;//カウント状態取得用フラグ 1:カウント中,0:停止中 int h,m,s,ms;//左から,時間,分,秒,ミリ秒 int b,c,d,e; int a; int f,g,i; DWORD start,cur; printf("使い方:小文字の's'でカウントスタート.カウント中,小文字の's'で停止.次の's'でまた0からスタート\n"); printf("使い方:どんな状態でも小文字の'r'でカウントリセットして停止\n"); printf("使い方:qでプログラム終了\n\n"); printf("使い方:tを押すと一時停止.一時停止中,tで計測再開\n"); h=m=s=ms=0; b=c=d=e=0; while(quit_flag != 0)//quit_flagが0以外ならループ { while(!_kbhit())//何かキーが押されるまでループ { if(c_flag != 0)//c_flagが0以外であればカウント中ということ. { h=m=s=ms = timeGetTime() - start; b=h/3600000; c=(m/60000)%60; d=(s/1000)%60; e=ms%1000; cur=timeGetTime(); ms=(cur-g); f=ms; } printf("%02d:%02d:%02d:%03d\r",b,c,d,e); } command=_getch();//ループを抜けるために押されたキーの内容をcommandに代入. if(command=='s' && c_flag == 0) { printf("\n計測開始\n"); c_flag = 1; start = timeGetTime() ; h=m=s=ms=0; } else if(command=='t' && c_flag != 0) { printf("\n一時停止\n"); c_flag = 0; a=c_flag; //計測開始時にtを押すとバグが発生するため } else if(command=='t' && a==0) { printf("\n計測再開\n"); c_flag = 1; f=timeGetTime(); } else if(command=='s') { printf("\n計測中止\n"); c_flag = 0; } else if(command=='r') { printf("\nカウンタリセット,停止\n"); c_flag = 0; h=m=s=ms=0; } else if(command=='q') { printf("\n終了\n"); quit_flag = 0; } else if(command=='l' && c_flag==1) { c_flag=0; printf("\nラップ\n"); printf("%02d:%02d:%02d:%03d\n",h/3600000,(m/60000)%60,(s/1000)%60,ms%1000); c_flag=1; } } return 0; } 差分をとれば良いと聞いたのですが、どのようにとれば良いか全く分からなくて困っています。 ソースコードを修正または適宣追加をしてくだされば幸いです。

  • C言語のプログラミング (基礎)教えてください。

    以下のような問題があります。 プログラムを作ってみたのですが、 コンパイルすると無限ループになったり、 正しく結果が出ません。 どのように直せば良いか教えていただけると助かります。 よろしくお願いします。 整数が入力される度に今までの合計を出力するプログラムを作成しなさい。なお、0 が入力されたら終了するものとする。 ただし、繰り返しの命令は while 文を使用し、条件は常に真 ( 1 ) とし、break 文を使うこと。 ▼実行例 整数:1     合計:1 整数:2     合計:3 整数:3     合計:6 整数:0 ******************************** #include<stdio.h> int main(void) { int n,sum; sum=0; while(1){ printf("¥n整数:"); scanf ("%d", &n); sum=sum+n; printf("¥n    合計:%d", sum); scanf ("%d", &sum);          if(n==0){ break;   } } }

  • C言語

    ストップウォッチの一時停止の機能およびラップ機能をもつプログラムを作成しているのですが、上手く動作しません。 (一時停止し、再開してもその状態から再開できない状態) (ラップのほうはスピリットで出力されてしまう) #include <windows.h> #include <mmsystem.h> #include <stdio.h> #include <conio.h> #pragma comment(lib, "winmm.lib") int main(void) { int command;//キーボード入力の文字判別用変数 int quit_flag = 1;//プログラム終了フラグ 0で停止 int c_flag = 0;//カウント状態取得用フラグ 1:カウント中,0:停止中 int h,m,s,ms;//左から,時間,分,秒,ミリ秒 int b,c,d,e; int a; int f,g,i; DWORD start,cur; printf("使い方:小文字の's'でカウントスタート.カウント中,小文字の's'で停止.次の's'でまた0からスタート\n"); printf("使い方:どんな状態でも小文字の'r'でカウントリセットして停止\n"); printf("使い方:qでプログラム終了\n\n"); printf("使い方:tを押すと一時停止.一時停止中,tで計測再開\n"); printf("使い方:lを押すとラップをとる.\n"); h=m=s=ms=0; b=c=d=e=0; while(quit_flag != 0)//quit_flagが0以外ならループ { while(!_kbhit())//何かキーが押されるまでループ { if(c_flag != 0)//c_flagが0以外であればカウント中ということ. { h=m=s=ms = timeGetTime() - start; b=h/3600000; c=(m/60000)%60; d=(s/1000)%60; e=ms%1000; cur=timeGetTime(); ms=(cur-g); f=ms; } printf("%02d:%02d:%02d:%03d\r",b,c,d,e); } command=_getch();//ループを抜けるために押されたキーの内容をcommandに代入. if(command=='s' && c_flag == 0) { printf("\n計測開始\n"); c_flag = 1; start = timeGetTime() ; h=m=s=ms=0; } else if(command=='t' && c_flag != 0) { printf("\n一時停止\n"); c_flag = 0; a=c_flag; //計測開始時にtを押すとバグが発生するため } else if(command=='t' && a==0) { printf("\n計測再開\n"); c_flag = 1; f=timeGetTime(); } else if(command=='s') { printf("\n計測中止\n"); c_flag = 0; } else if(command=='r') { printf("\nカウンタリセット,停止\n"); c_flag = 0; h=m=s=ms=0; } else if(command=='q') { printf("\n終了\n"); quit_flag = 0; } else if(command=='l' && c_flag==1) { c_flag=0; printf("\nラップ\n"); printf("%02d:%02d:%02d:%03d\n",h/3600000,(m/60000)%60,(s/1000)%60,ms%1000); c_flag=1; } } return 0; } 差分をとれば良いと聞いたのですが、どのようにとれば良いか全く分からなくて困っています。 上記のソースコードを基に適宣追加をしてくだされば幸いです。

このQ&Aのポイント
  • P-touch QL650TDの電源は入っているのに、データを編集し転送すると本体との通信ができなくなりました。
  • Windowsのパソコンを使用して無線LANで接続しています。
  • デジタル回線を使用しています。
回答を見る