• 締切済み

c言語でpicにDelay関数を使いたい

pic16f84a用にLED点滅のソースコードを書きましたがエラー出て前に進めません。 コードは次の様になっています。 (前段略) #use delay(clock=20000000) void main(void) { TRISA = 0x00; PORTA = 0x03; TRISB = 0x00; PORTB = 0x00; while (1) { PORTA = 0x02; Delay_ms(1000); PORTA = 0x01; Delay_(1000); } } コード書き込み中にすでにDelayの箇所が2か所ともエラーの表示になってしまいます。 一応下記の様にdelya箇所をコメント化してビルドと,picに書き込みを行えます、そしてLEDも点滅できます。 while (1) { PORTA = 0x02; //Delay_ms(1000); PORTA = 0x01; //Delay_(1000); } } 参考のコードを正確に書き込みましたがこのような状況でしたので、   #use delay(clock=20000000) は自分が勝手に追加してみましたが結果はやはり同じでした。 何が原因なのでしょうか。 何方か教えて頂けませんか。お願いいたします。 自分の環境は、Windows8 MPLABX IDE2.10  XC8  PIC16F84A pickit3 です。

  • diwk85
  • お礼率83% (141/168)

みんなの回答

  • asciiz
  • ベストアンサー率70% (6641/9409)
回答No.1

>何が原因なのでしょうか。 delay() は実装依存です。 なぜかと言えば、機器ごとに実行速度が異なり、時刻の取り出し方も違うので、機器それぞれに、一定時間を測定して待つ、というプログラムは一般化できないためです。 で、XCでの delay()は、以下のようになっているとのこと。 >http://www49.atwiki.jp/129s_note/pages/16.html 「include "delays.h"」は使用不可で、xc.hをインクルードした後に_XTAL_FREQをPICのクロック周波数で宣言するようにとのこと。 実例はこちら、 >http://pastebin.com/ivHFck0m >#include <xc.h> >#define _XTAL_FREQ 20000000 頭にこう書いておいて、 > __delay_ms(1000); のように使えるはず、と。

diwk85
質問者

お礼

ありがとう御座いました。前に進めさおうです。 今後ともよろしくお願いいたします

関連する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 16F84A でLEDが点滅しない

    どんな事をしても、LEDが点滅しません何が原因なのかわかりません。何方か教えて頂けませんか。 環境は、Windowos8 MPLAB X IDE XC8 PICkit3  Pickit3対応ICSP書き込みアダブターです。 PICは PIC16F84A を使用しています。ソースコードは下記のようにしてあります。  #include <xc.h> // #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF. // CONFIG #pragma config FOSC = EXTRC // Oscillator Selection bits (RC oscillator) #pragma config WDTE = ON // Watchdog Timer (WDT enabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (Power-up Timer is disabled) #pragma config CP = OFF // Code Protection bit (Code protection disabled) #define_XTAL_FREQ 20000000 void main(void) { TRISA = 0x00; PORTA = 0x031; TRISB = 0x00; PORTB = 0x00; while (1) { PORTA = 0x02; Delay_ms(1000); PORTA = 0x01; Delay_(1000); } } ------------回路  PIC16F84A      ------------   18  RA1-----1Kオーム----- (K)LED(A)----←  5V      17  RA0----- 1Kオーム-----(K)LED(A)----←  5V     16  OSC1----             セラロック20MHZ -------- GND   15  OSC2----   14 VDD---------------← 5V    4  MCLR--------------← 5V 5 VSS----------------- GND   コンパイルも、書き込みもできましたが駄目でした。いろいろ試みましたが成功しません。 コンフィギレーションに決定的な間違いがあるのではないか?疑っております。 よろしくお願いいたします。

  • 16F88を用いてLEDの点灯パターンを制御する

    16F88を用いてLEDの点灯パターンを制御するプログラムを作ったのですが、思うように動作してくれません。 電源を入れたときはLEDはすべて消灯しており、スタートのためのスイッチを押すとすべてのLEDが3回点滅するはずなのですが、実際のところ、全てのLEDが点灯しっぱなしになってしまいます。 心当たりはコンフィギュレーションビットの設定が間違っている、PICの出力が間違っている(A/Dが正しく設定されていない)といったことを考えたのですが、結局解決には至りませんでした。 ほぼ同じプログラムを16F84Aにて作ったところ正常に作動したため、PICの移行に伴って不具合が生じてしまったのでしょうか。 どなたかお力をお貸しください。 プログラムはMPLAB v8.85 にて作成しており、コンパイラはHI-TECH ANSI C Compiler で、書き込みにはPICKIT2を用いています。 RB0~7にLEDが接続されており、RA0にスイッチが接続されています。 以下、ソースコードになります。 #define _LEGACY_HEADERS #include <htc.h> #define _XTAL_FREQ 20000000 __CONFIG ( HS & WDTDIS & PWRTDIS & UNPROTECT & MCLREN & BOREN & LVPDIS & DEBUGDIS & IESODIS & FCMDIS); void kaeru(void){ ////////////準備点灯3回////////////// PORTB=0xFF; __delay_ms(500); PORTB=0x00; __delay_ms(500); PORTB=0xFF; __delay_ms(500); PORTB=0x00; __delay_ms(500); PORTB=0xFF; __delay_ms(500); PORTB=0x00; __delay_ms(800); //////////////////////////////////// //スペースの都合で省略しています。 } void main(void) { ANSEL=0b00000000;//16F88のPORTAのA/D変換の無効化 OPTION=0x7F;//PORTBのプルアップ PORTA=0x00;//初期設定 PORTB=0x00;//初期設定 TRISA=0x01;//RA0を入力 TRISB=0x00;//RB0~7を出力 if(RA0==1) kaeru(); }

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

    使用するPICは16F84Aで、MPLAB IDEv8.88を使ってこのようなプログラムを作りました。 #include"pic.h" static void pic_init(); static void Delay_ms(unsigned char ms); static void Delay_1ms(); void main(){ pic_init(); while(1) { RB0 = 1 ; Delay_ms(250); Delay_ms(250); Delay_ms(250); RB0 = 0 ; Delay_ms(250); Delay_ms(250); Delay_ms(250); } static void pic_init() { // GPIO = 0b00000000; TRISA = 0xFF ; TRISB = 0x00 } static void Delay_ms(unsigned char ms) { unsigned char c; for (c=ms ; c>0 ; c--) { Delay_1ms(); } } static void Delay_1ms() { unsigned int cnt; unsigned int i; cnt = 76; for (i=0 ; i<cnt ; i++) { NOP(); } } ポートB0の出力を0から1にするプログラムなのですが、実行すると Error [314] C:\Users\moriwaki\Desktop\PIC program\step_test2.c; 52.24 ";" expected Error [254] C:\Users\moriwaki\Desktop\PIC program\step_test2.c; 77.0 undefined variable: "pic_init" ********** Build failed! ********** というエラーが出ます。このようなエラーが出る原因を教えて頂けないでしょうか。お願いします。

  • PICマイコンでLEDの点滅をC言語で記述法を教えてください

    PICマイコン(PIC16F84A)にLEDを1個接続し点滅だけのプログラムをC言語で記述を書きたいのですが、教えていただけないでしょうか? CCS社のコンパイラを用いた時の記述の書き方を教えていただけないでしょうか? 条件は、 ・電池を繋げるとLEDが点滅、スイッチ素子は用いません。 ・LEDは1秒間隔で点滅し、永遠に点滅 ・LEDは、PICマイコン(PIC16F84A)の9番ピン(RB3に該当)に接続 ・水晶発振子は、10MHzを使用。 ・コンパイラは、CCS社を使用 私が分かる範囲は下記なのですが、これから先の記述方法が分かりません。 #include <16f84a.h> #fuses HS, NOWDT, NOPROTECT #use delay(clock=10000000) #byte port_b=6 main() { この中身の記述方法が分かりません。 教えていただけないでしょうか? } よろしくお願いします。

  • picのループ

    昨日、picの割り込みに関してご質問させていただいたものです。 割り込みに関しては皆様のおかげで解決できましたが、別の問題に直面いたしました。 while(1)を1回処理した後は、動作が停止してしまい、割り込みも受け付けなくなってしまいます。 #INT_RB//割り込み定義 void RB_isr(){         割り込み処理        } void main() { while(1) { output_low(PIN_C4); delay_ms(200); output_high(PIN_C4); delay_ms(200); //自動起動ボタンONで起動 if(input(PIN_B6) == 0) { 入力があった場合の処理          } } } 上記のように、while(1)の先頭部に動作確認用のled点滅プログラムをいれていますが、入力があった場合の処理が終了した後はledも点滅しません。 入力があった場合の処理の最後にリレーをoffしているのですが、その処理はきちんと行われています。 どうしてこのようなことがおこるのか分かる方がいらっしゃいましたら、ご教授ねがいます。

  • LEDの点灯(C言語,PIC)

    PICを用いてLEDを点滅させます. #INT_RTCC rtcc_pulse() { counter++; if(counter == t){ counter = 0; LED1_ON(); delay_ms(10); } else{ LED1_OFF(); } この関数のtの値を変調させ,OFFの時間を徐々に増やしていき,それを繰り返したいのですが,やり方がわからず困ってます. tはfor(t=52;t<=152;t+=10)のように増やしていきたいです.

  • PICプログラミングに対する質問

    PIC16F627Aを使い、160KHzの周波数を外部に出力したいのですが、うまくいきません。 仕様はこのようになっています。 セラロックとして10MHzを使っています。(20MHzを使うことも考えている) 電源は5Vです。 開発環境はMPLAB IDEに CCS社Cコンパイラを使っています。 現在のプログラムはこのようになっています。 //////////////////////////////////////////////////////////////////////// //タイマ0を用いて160KHzの周波数を出力する //3.1μsでタイマ0の割り込み //////////////////////////////////////////////////////////////////////// #include<16f627a.h> #fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP  //コンフィグレーションの設定 #use delay(CLOCK = 10000000)      //発振子の周波数10MHz  //delay_ms()の使用 //定数の定義 #byte  PORTA=0x05 #bytePORTB=x06 #byte TMR0 = 0x01 #bit T0IF = 0x0B.2 //タイマ0割り込み処理 #INT_RTCC //タイマ0の割り込み処理関数の宣言 void rtcc_isr(void) { T0IF=0; //タイマ0の割り込みフラグ TMR0=0xF8; //タイマ0の初期値 PORTA^=0x04; //PORTAの出力反転 } //メイン関数 void main(void){ set_tris_a(0xF8); //出力ポートの設定 set_tris_b(0xF7); //出力ポートの設定 setup_timer_0(RTCC_INTERNAL | RTCC_DIV_1);//プリスケーラを使用しない set_timer0(0x0); //TMR0に0x0を書き込む enable_interrupts(INT_RTCC); //タイマ0の割り込み許可 enable_interrupts(GLOBAL); //グローバルの許可 PORTB = 0x7F; //出力 while(1){ //割り込みを待つ delay_ms(1); //1μs } } ///////////////////////////////////////////////////////////////////// このようなプログラムで160KHzの周波数を出力することは可能でしょうか? もし不足の部分や誤っていることがあったら教えてください。

  • PICのコンフィグレーションワードの書き方

    MPLAB + PICC-Lite + PICkit2 で PIC16F877(20MHz)を使用しようとしています。 今まで、16F627Aを使用していて、今回が初めての16F877です。最初にDポートのLED4つを点滅させるプログラムを実行しようとしました。 最初、ディパッガーでも動かなかったのですが、MPLAB IDEのConfigureメニューのConfiguration BitsをHSに変更したら動きました。 ところがPICkitを外して、16F877単体で動きません。 おそらく、コンフィグレーションワードで、HSを書き込まなければだめらしいということは、わかったのですが、その書き方がわかりません。 現在のソースファイルは以下の通りです。 ----------------------- #include <pic.h> void delay(void) { unsigned char i, j; for (i = 0; i < 254; i++) { for (j = 0; j < 254; j++) { } } } void main(void) { TRISD = 0; unsigned char led = 0x01; do { PORTD = led; if (led == 0x08) { led = 0x01; } else { led <<= 1; } delay(); } while (1); }

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

    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); } } } } このようなプログラムにしたのですが、受信側が送信側の操作に反応せず、 電源プラグを挿しただけで動作してしまいました。 すみませんが、誰か解る方がいたら教えてくれませんか?

専門家に質問してみよう