• ベストアンサー

PICで1μsの待機時間を作りたい

現在PIC18F2431の制御プログラムを組んでいます。 INTOSC 8M を使って1μsと3μsの待機時間を作りたくて下記のような、空のループを用意しました。 for(i=0; i<1; i++) ; しかしこれではどう頑張っても6μsよりも小さくすることが出来ません。 何か良い方法はないでしょうか? どうかご教授ください

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

  • ベストアンサー
  • kusa_mochi
  • ベストアンサー率76% (1599/2089)
回答No.1

自分はPICのプログラミングをしたことは無いが、アセンブラ(機械語)じゃダメなのかな? 最高クロックで40MHzみたいなので、アセンブラで直接記述する以外で正確なμ秒単位のループは難しいのでは。 #メインロジックは高級言語でも良いが、待機時間の部分はアセンブラで関数を作って呼び出すとか

t_and_d
質問者

お礼

なるほどアセンブラですか。アレあんまり使ったことがないんで出来るかどうかわかんないですがやってみます。 回答ありがとう御座いました。

t_and_d
質問者

補足

すいません。質問を少し訂正します。 「INTOSC 8Mを使って」では意味が良く分かりませんね。 内部クロック8MHzを使って、です。 変な記述をしてすいませんでした。

関連するQ&A

  • PICのプログラミングについて質問です

    現在PICを制御するためのプログラムを組んでおり、その中で「連続で二回スイッチを押すとループを脱出」という動作をさせようと考え、以下のようなものを組んでみましたが、うまくループから脱出してくれませんでした。 悪い場所はなんとなくわかっているのですが・・・希望のように動作させるにはどのようにプログラムを組めばいいのか考えつかず困っています (;--) while(t == 3) { for( i = 0; i < 3000; ){ if(RA1 == 0) { for ( k = 0; k< 3000; ){ if(RA1 == 0) { t = 4; break;   } else { k++; DelayMs(1); } } } else { i++; DelayMs(1); } } }

  • pic12f675の待ち時間関数について

    初めて質問します。 現在pic12f675で遊んでいるのですが、 http://homepage3.nifty.com/mitt/pic/picc/picc675_04_1.html にある、 // =================== 50uSウェイトルーチン =============== static void wait_50uS() { unsigned int cnt; unsigned int i; cnt = 2; for (i=0 ; i<cnt ; i++) { NOP(); } } の意味がわかりません。 特にfor (i=0 ; i<cnt ; i++) { NOP(); } の箇所です。 これでなぜ、50μsの待ち時間関数になるのでしょうか? どなたか答えてくれませんか?

  • PIC(PIC16F57-I/P)と押しボタンスイッチ8個を使用して、

    PIC(PIC16F57-I/P)と押しボタンスイッチ8個を使用して、簡単なピアノのようなものを作ってみようと思っています。 ドレミファソラシドと各音をファイルで用意しておき、押しボタンを押せば、 それぞれの音が出るようなものを考えています。 PICでどのようなC言語プログラムをすれば可能でしょうか。 できれば、プログラムと構成図と一緒に教えていただきたいです。

  • PIC18でのPWM制御について

    PICで充放電の制御をしているのですが、PICのPWMモードで12V、1kHzの信号を出す必要が出てきました。 PWMモードは触ったことがなく、調べながら作る時間も余りないので、厚かましいとは思いますが、 どなたかアセンブラまたはc言語でのプログラムを教えていただけませんでしょうか。 使用チップはPIC18F2580です。 よろしくお願いします。

  • PICアセンブラ、これって変?

    PIC16F84でのアセンブラなのですが、下記のプログラムで・・・。 MAIN     MOVLW B'00000000'     MOVWF PORTB     BTFSC PORTA,3     GOTO  FINISH     GOTO  MAIN FINISH     MOVLW B'11111111'     MOVWF PORTB     END PortAが入力、Bが出力なのですが、MAINでループしながら待機、 PortAの3bitめがHになったらPortBをすべて立てて終了という感じに なると思いますが、上手くいかないんです。 3bit目にあらかじめ+5Vを印加しておくと、一瞬でPortBがすべて立つのですが、 ループ中にやっても何も変化がありません。 ループしていないか、判定ができていないかのどちらかなのですが・・・。 デバッグしてみても、きちんとループ・判定できているのですが いざ焼いてみると動作しません。わかりますでしょうか。

  • PICを同期させて制御する方法を教えてください。

    PICを同期させて制御する方法を教えてください。 PIC16F84Aを使用して、複数個をLEDを制御したいと考えています。 LEDの制御基盤を複数作り、同じプログラムを入れてもLEDの点灯タイミングが 同期して動きません。 複数個のPICを同期させて制御するにはどうしたらいいのですか? 5個以上のPICを使用したいと考えています。 教えてください。 よろしくお願いします。

  • usartによるpic18fからpic16fへの…

    usartによるpic18fからpic16fへのデータの受け渡しについて いつもお世話になります。 pic18f2680からpic16f690へデータを渡すためにusartを使用して行おうとしていますがうまくいきません。 送り側(18f2680)で i=3 itoa(i,f);//int f,char i putsUSART(f); 上記のように送信し, 受け側(16f690)で     c= getc();//int c printf("%u",c); と、受けたところ000000000000000000000000510と表示されてしまいます。 printfなどの書式を変えても問題が治りません。 どなたかお詳しい方がいらっしゃいましたらご教授よろしくお願い致します。

  • プログラムの実行回数

    Cのプログラムの式が何回繰り返されるのかが分かりません。 ご教授願います main等は省略 int i,j,s; s=0; for(i=0;i<=n;++i){ for(j=m;j>=1;j=j/2){ s=s+i-j; } } このプログラムの二重ループ内は何度繰り返されるのでしょうか?

  • PICのプログラミングについてです

    PICのプログラムについて質問です。 PIC初心者なのですが下のアドレスの永久回転こまを作ろうと取り組んでいます。 http://homepage3.nifty.com/mitt/pic/pic6_10.html 「磁気センサからの入力でコマの位置と回転速度」と書いてあるのですが PICにはどのような入力が入って位置や速度を判別するのでしょうか? 入力はアナログ入力でしょうか? またこのサイトではPIC16F648Aで作成したらしいのですが 今手元に16F876(Aはついてません)しかありませんでした。 ためしにMPLABでコンパイルしてみたら(16F876と設定して) undefined identifier "CMCON" とでてきました。スペルミスでもないですし、このPICには コンパレータを制御する機能はないのでしょうか? ちなみにエラーの文章はPICの初期設定の部分で コンパレータ未使用にするため CMCON = 0x07; と入力した部分です。(プログラムの全容はサイトに記載されています) この部分をごっそり消すと別のエラーが出ます。 わかる方どうか力を貸してください。 ご回答よろしくお願いします。

  • PICで内部タイマーを使わずカウントダウンする方法

    こんにちは。 今回、PICのプログラムをアセンブラで組むことになりました。 その中で「100ミリ秒間、あるポートからの入力を監視する」という部分があり、 これを内部タイマーなどは使わずに実装するとします。 自分なりには、 PICのクロック数とループ内のサイクル数で 何回ループを回せばよいのかを予め計算しておいて その回数だけループを回せばよいのかな? と考えました。。。 しかしループ内のサイクルがせいぜい数μSですので、 100mSecとなると10万回単位でループを回さなければなりません。 しかしPICでは変数が8Bitしか無いので255までしかカウントできないと思うのですが、 こういう大きい数字のカウントをしたい場合、どうしたら良いのでしょうか? 宜しくお願いします。