- ベストアンサー
PICのプログラミングでdelay関数が正しく動作しない理由とは?
- PICのプログラミングで16F88をC言語でプログラムしています。しかし、HI-TECH cでコンパイルしたところ、delay関数が正しく動作しない問題が発生しました。includeの設定に問題がある可能性がありますが、原因を特定できません。
- 現在、delayが正しく動作するか確認するために下記のプログラムを作成しています。しかし、何かおかしい箇所があるかもしれません。ご指摘いただければ幸いです。
- //RB0~RB4にはLEDを接続 #include <pic.h> #include <htc.h> #define _XTAL_FREQ 8000000 // 8Mhz __CONFIG(0x3F22); void main(){ TRISA = 0b00000100; TRISB = 0b00000000; PORTB = 0b00000101; __delay_ms(500); PORTB = 0b00000111; }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
(1)#include は<pic.h>か、<htc.h>のどちらか一方にして下さい。ビルド時には、特に問題は有りませんが、現在は<htc.h>を使いのが普通です。 (2)組込みマイコン等のmainプログラムは、プログラムの何処かで永久ロープ構造になる様にして下さい。 組込みマイコンのmainプログラムは、電源投入後にいきなり動く唯一のプログラムでああり、パソコン等の用にOSという巨大な管理プログラムや、ランタイムルーチンから呼出されて動くタスクでは有りません。 従って、main関数が終了してしまうと、リセット起動と同様な状態となり、またmain関数の先頭から実行し始めてしまいます。 PORTB= 0b00000111; while(1); } の様に、今回はプログラムの最後にwhile(1);が必要です。 (3)お使いのHI TECH C のバージョンは何番でしょうか?現在の最新のバージョンは9.83です。なるべく最新のバージョンを使用して下さい。 バージョンによって、__delay_ms() や、__delay_us()の使用できる値の範囲が異なります。 もしも、点滅にしたいのであれば、PORTB = の部分を以下の様にすれば、点滅になるはずです。試してみて下さい。 //RB0~RB4にはLEDを接続 #include <htc.h> #define _XTAL_FREQ 8000000 // 8Mhz __CONFIG(0x3F22); void main(){ TRISA= 0b00000100; TRISB= 0b00000000; while(1){ PORTB= 0b00000101; __delay_ms(500); PORTB= 0b00000111; __delay_ms(500); } } 頑張って下さいね。
その他の回答 (1)
- neorg
- ベストアンサー率54% (235/433)
http://www.eleki-jack.com/mycom2/2012/07/pic16f887hitech_c22.html ここの『delay関数を作るをみると』 HI-TECH Cの場合にコンパイル時に待ち時間を計算するため引数に変数を渡せないようですので関数を作ってみたらどうでしょう
お礼
回答ありがとうございます 現在プログラミングの環境から離れてしまったので、戻り次第試してみたいと思います。