PIC16F877でLCD SC1602BS*Bを駆動する際のエラー

このQ&Aのポイント
  • MPLAB IDE v8.30を使用して、PIC16F877でLCD SC1602BS*B を駆動しようとしていますが、エラーが発生しています。
  • エラーはillegal # directive "byte", function declared implicit int, undefined identifier "PIN_D0"などの3種類です。
  • どこが問題なのかわかりません。プログラムとヘッダーを記載しました。
回答を見る
  • ベストアンサー

PIC16F877のビルドについての質問です。

PIC初心者です。 MPLAB IDE v8.30を使用して、PIC16F877でLCD SC1602BS*B を駆動しようとしていますが、メインプログラムを書く前に、最初の段階(おそらくは設定かインクルードの方法)でつまづいてしまい、エラーだらけになってしまいます。 ・ConfigureのSelectDiviceは、16F877を選択 ・ネットで見つけた"lcd_lib3.c"をヘッダとしてインクルード   http://www.picfun.com/p877frame.html ・出てくるエラーは、  ・illegal # directive "byte"  ・ function declared implicit int ・ undefined identifier "PIN_D0" 等の3種類のエラーです。 どこが悪いのでしょうか? 以下にプログラムと ヘッダーを記載します。 #include<pic.h> //////// link LCD library #include <lcd_lib3.c> // コンフィギュレーションワードの設定 __CONFIG(UNPROTECT & PWRTEN & HS & WRTEN & DEBUGEN & LVPDIS & BORDIS & WDTDIS); // プロトタイプ宣言 static void pic_init(); // メイン関数 void main(void){ int cnt,j; pic_init(); lcd_init();//initialize LCD } // =============== PICの初期化 ======================= static void pic_init() { //OSCCON = 0x71;// INTOSC 8MHz //ANSEL = 0x00;// AN未使用 //ANSELH = 0x00;// AN未使用 ADCON1 = 7; //すべてデジタルI/O PORTA = 0x00; PORTB = 0x00; PORTC = 0x00; PORTD = 0x00; PORTE = 0x00; TRISA = 0x00; TRISB = 0x00; TRISC = 0x00; //TRISD = 0x00; TRISE = 0x00; //OPTION = 0x88;// TMR0プリスケーラ:なし //INTCON = 0xA8;// GIE:1 ,T0IE:1 ,RBIE:1 } "lcd_lib3.c"の内容 /////////////////////////////////////////////// // LCD control Library // functions are below // lcd_init()-------- initialize // lcd_ready()------- busy check // lcd_cmd(cmd)------ send command // lcd_data(string)-- display string // lcd_clear() ------ clear display ////////////////////////////////////////////// ////// port define to port D #byte port = 8 //port D #define set_tris_x set_tris_d #define rs PIN_D0 #define rw PIN_D1 #define stb PIN_D2 /////////// lcd ready check function int lcd_ready(){ static int higha; int high,low; set_tris_x(0xF0); //upper is input output_low(rs); output_high(rw); //read mode output_high(stb); high=port & 0xF0; //input upper output_low(stb); output_high(stb); low=port & 0xF0; //input lower output_low(stb); set_tris_x(0); return(high | (low>>4)); //end check } ////////// lcd display data function void lcd_data(int asci){ port = (asci & 0xF0) | (port & 0x0F); //set upper data output_low(rw); //set write output_high(rs); //set rs high output_high(stb); //strobe output_low(stb); asci=asci<<4; port = asci | (port & 0x0F); //set lower data output_high(stb); //strobe output_low(stb); while(bit_test(lcd_ready(),7)); } ////////// lcd command out function void cmdout(int cmd){ port = (cmd & 0xF0) | (port & 0x0F); //set upper data output_low(rw); //set write output_low(rs); //set rs low output_high(stb); //strobe output_low(stb); cmd=cmd<<4; port = cmd | (port & 0x0F); //set lower data output_high(stb); //strobe output_low(stb); } void lcd_cmd(int cmd){ cmdout(cmd); while(bit_test(lcd_ready(),7)); //end check } ////////// lcd display clear function void lcd_clear(){ lcd_cmd(1); //initialize command } ///////// lcd initialize function void lcd_incmd(int cmd){ port = (cmd & 0xF0) | (port & 0x0F); //mode command output_low(rw); //set write output_low(rs); //set rs low output_high(stb); //strobe output_low(stb); delay_us(100); } void lcd_init(){ set_tris_x(0); //initialise delay_ms(15); lcd_incmd(0x30); //8bit mode set lcd_incmd(0x30); //8bit mode set lcd_incmd(0x30); //8bit mode set lcd_incmd(0x20); //4bit mode set lcd_cmd(0x2E); //DL=0 4bit mode lcd_cmd(0x08); //disolay off C=D=B=0 lcd_cmd(0x0D); //display on C=D=1 B=0 lcd_cmd(0x06); //entry I/D=1 S=0 }

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

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

「lcd_lib3.c」は http://www.picfun.com/ の PICの基礎で紹介されている書籍から「CCS社 PIC C Compiler」の形式の様ですね。 そのために記述形式が MPLAB IDE v8.30 と合わないのでしょう。 がんばって形式を書き換えるか、MPLAB IDE v8.30で使える情報のある他の参考になるサイトを探すのがよさそうですね

ryou4649
質問者

お礼

どうして動かないのか、全然わからず困っていたのですが、そういうことだったんですね。 ありがとうございました。

その他の回答 (1)

  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.1

>どこが悪いのでしょうか? 少なくとも1つは使い方の説明を読んでないからです。 >・出てくるエラーは、 > ・illegal # directive "byte" > ・ function declared implicit int >・ undefined identifier "PIN_D0" >等の3種類のエラーです。 エラーメッセージを抜粋していませんか? 出力されているエラーメッセージはそのまま書きましょう(エラーメッセージの意味がわからない人が、なぜ抜粋できるのか私にはわからない)。 >・illegal # directive "byte" >#byte port = 8 //port D #byte は標準的なCにはありません。 >・ function declared implicit int 関数をプロトタイプ宣言や定義するより前に使用していた場合、Cコンパイラはその関数の戻り値の型をintとしてみなします。 >・ undefined identifier "PIN_D0" Cコンパイラは PIN_D0 なんて識別子は知らないといってます。 どこかで定義されていますか?

ryou4649
質問者

補足

初心者で申し訳ありません。 エラーについては、上記3種類がいくつも出ているので、原因は同じかと思い省略してしまいました。 >Cコンパイラは PIN_D0 なんて識別子は知らないといってます。 >どこかで定義されていますか? やはりそうなんですか。 私もやや疑問に思ったのですが、上記HPには、そのままインクルードすれば使えると書いてあったので…

関連するQ&A

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

    #include <16f873a.h> #fuses HS,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOLVP #define use_portb_lcd TRUE #use delay (clock=10000000) #include <lcd.c> void port_ini(void); void lcd_express(int); void motor_drive(int); main() { int mode; port_ini(); while(1){ mode = (input_a() & 0b00000110); lcd_express(mode); motor_drive(mode); } } void port_ini(void) { setup_adc_ports(NO_ANALOGS); setup_counters(RTCC_INTERNAL,RTCC_DIV_2); port_b_pullups(FALSE); set_tris_a(0xff); set_tris_b(0x00); set_tris_c(0x00); output_b(0x00); output_c(0x00); lcd_init(); } void lcd_express(int disp) { lcd_gotoxy(1,1); lcd_putc("<DC-motor mode>"); delay_ms(5); lcd_gotoxy(1,2); switch(disp){ case 0:{ lcd_putc("- Go!Go! -"); break; } case 2:{ lcd_putc("- L-Bend -"); break; } case 4:{ lcd_putc("- R-Bend -"); break; } case 6:{ lcd_putc("- R-Turn!-"); break; } default: break; } } void motor_drive(int mode) { switch(mode){ case 0:{ output_c(0b00110000); break; } case 2:{ output_c(0b00111000); break; } case 4:{ output_c(0b01110000); break; } case 6:{ output_c(0b01010000); delay_ms(800); while(!(4==(input_a() & 0b00000110))){} output_c(0b00101000); delay_ms(100); break; } default:break; } } この文でlcdに何も表示しないようにしたいのですがどこを消せばいいのでしょうか? あと、void文などもできれば消して動かせるようにしたいのですが、どのようにすればいいでしょうか? ちなみにプログラムは、SW1・2を押しているときに、それぞれ片方タイヤを回転させ、両方押しているときに両方回転させて前進、両方押していないときは後退するというプログラムです。 ×字の台に張られた黒いテープをたどって最終的に真ん中でとまるという競技のプログラムです。 できればlcd関連のプログラムをすべて消したいです。

  • pic 16f84a割り込み処理について

    pic cともに初心者です。 至らないところなどございますが、よろしければご教授くださいm(__)m 現在pic 16f84aで、電球の明るさ(交流100v)を決まったタイミングでフェードインフェードアウトさせる回路を製作しています。 コンパイラはccs社のpcm、MPLAB使用です。 基本的なプログラムの構成についての疑問です。 まず (1)インターバルタイマを使用し、タイマを10msec(約)に再セット。 変数icount で秒数をはかり、 メイン関数では、それを元にduty という変数(0-255)を変化させます。 #int_timer0 void intval(){ set_timer0(0x3c); icount++; } その処理に平行して (2)ゼロクロスパルスの割り込みをRB0への入力から発生させます。 RB0にはハードから入力(H_to_L)がはいるように出来ており これも10msec毎です。 #int_EXT void isr(){ int i if((duty > 10) & (duty < 250)){ delay_us(200); for(i = 0; i <(255-duty); i++){ delay_us(38); output_low(PIN_C5); delay_us(100); output_high(PIN_C5); } else{ if(duty <= 10){ output_high(PIN_C5); } else{ output_low(PIN_C5); }} メイン関数では duty を icount(時間)によって、変化させる関数を書きます。 25秒かけて、消灯状態から(duty= 0)点灯(duty = 255)まで スムーズに変化させます。 疑問点は 上記の二つの割り込みは、ともに10msec 毎で、(2)の割り込みに至っては いちど割り込むとdelay が多いので10msecの間ほとんど割り込み禁止です。 こういう場合でも、問題なく二つの割り込みは動いてくれるのでしょうか?(1)のカウントがある程度正確に動いてくれないと、秒数が狂ってしまうので、不安です。 また、この段階で、考え方そのものが間違っていないかも わかりません。 よろしければ、ご意見などいただけると幸いです。 なにとぞ、よろしくお願いいたします。

  • PIC16F88に書き込んだプログラムについて

    以前、直流電圧と電流を測定する回路を製作し、その時書いたプログラムでは正常にLCDに表示されていたのですが、最近になって測定した電圧および電流を1秒間に8回更新するように書き替えました。しかしLCDに正常に表示されなくなりました。 プログラムと回路図を掲載しますのでどなたか、どうすればいいか教えてください。 よろしくお願い致します。 ////////////////////以下プログラム/////////////////////////////////////////////////// <lcd.c> #include <pic.h> //#include "lcd.h" //#include "delay.h" #define _XTAL_FREQ 4000000 #define LCD_RS RA0 #define LCD_RW RA7 #define LCD_EN RA6 #define LCD_DATA PORTB #define LCD_STROBE() ((LCD_EN = 1),(LCD_EN=0)) /* write a byte to the LCD in 4 bit mode */ void lcd_write(unsigned char c) { //DelayUs(40); __delay_us(40); LCD_DATA = ( ( c >> 4 ) & 0x0F ); LCD_STROBE(); LCD_DATA = ( c & 0x0F ); LCD_STROBE(); } /* * Clear and home the LCD */ void lcd_clear(void) { LCD_RS = 0; lcd_write(0x1); //DelayMs(2); __delay_ms(2); } /* write a string of chars to the LCD */ void lcd_puts(const char * s) { LCD_RS = 1; // write characters while(*s) lcd_write(*s++); } /* write one character to the LCD */ void lcd_putch(char c) { LCD_RS = 1; // write characters lcd_write( c ); } /* * Go to the specified position */ void lcd_goto(unsigned char pos) { LCD_RS = 0; lcd_write(0x80+pos); } /* initialise the LCD - put into 4 bit mode */ void lcd_init() { char init_value; //ADCON1 = 0x06; // Disable analog pins on PORTA init_value = 0x3; //TRISA=0; //TRISB=0; LCD_RS = 0; LCD_EN = 0; LCD_RW = 0; //DelayMs(15); // wait 15mSec after power applied, __delay_ms(15); LCD_DATA = init_value; LCD_STROBE(); //DelayMs(5); __delay_ms(5); LCD_STROBE(); //DelayUs(200); __delay_us(200); LCD_STROBE(); //DelayUs(200); __delay_us(200); LCD_DATA = 2; // Four bit mode LCD_STROBE(); lcd_write(0x28); // Set interface length //lcd_write(0xF); // Display On, Cursor On, Cursor Blink lcd_write(0x0C); lcd_clear(); // Clear screen //lcd_write(0x6); // Set entry Mode lcd_write(0x07); } <main.c> #include <pic.h> #include <stdlib.h> #include "lcd.h" #define _LEGACY_HEADERS #define _XTAL_FREQ 4000000 __CONFIG(FOSC_INTOSCIO & WDTE_OFF & PWRTE_ON & MCLRE_OFF & BOREN_OFF & LVP_OFF & CPD_OFF & WRT_OFF & CCPMX_RB0 & CP_OFF); __CONFIG(FCMEN_OFF & IESO_OFF); unsigned int ADConv(unsigned char ch) { ADCON0=(ch<<3)&0x38; ADCS2=0; ADCS1=0; ADCS0=1; ADON=1; ADIF=0; __delay_us(20); GO_DONE=1; while(GO_DONE); return (ADRESH<<8) | ADRESL; } unsigned short Code2mV(unsigned char ch) { unsigned short ret; ret=0; ret += ADConv(ch)<<1; ret += ADConv(ch)>>1; ret += ADConv(ch)>>3; ret += ADConv(ch)>>4; ret += ADConv(ch)>>5; return ret; } void ioport(void) { CMCON=0x07; ANSEL= 0b00001110; TRISA = 0b00001110; PORTA=0x00; TRISB = 0b00000000; PORTB=0x00; } void main(void) { static double data, offset; static unsigned int v ,i,n1,n0; static unsigned char buf[8], cnt,tmp1[2],tmp2[2]; OSCCON = 0b01100000; // �N���b�N��8Mhz ioport(); ADCON1=0b11100000; lcd_init(); lcd_write(0x0D); lcd_goto(0); lcd_puts("Starting"); lcd_goto(0x40); lcd_puts("DC Meter"); __delay_ms(2500); lcd_clear(); offset=0.0; while (1) { data=0.0; for(cnt=0; cnt<10; cnt++) { data += Code2mV(1); } data /= 10.0; data *= 2.4287109375; data *= 11.0; data -= offset; v=(unsigned int)(data); n1=(unsigned int)(v/1000); n0=v-1000*n1; itoa(tmp2,n1,10); itoa(tmp1,n0,10); lcd_goto(1); lcd_puts(tmp2); lcd_goto(3); lcd_putch('.'); lcd_puts(tmp1); lcd_goto(6); lcd_puts("V"); data =0.0; for(cnt=0; cnt<10; cnt++) { data += Code2mV(2); } data /= 10.0; data *= 2.4287109375; data /= 11.0; offset = data; i=(unsigned int)(10.0 * data); itoa(buf,i,10); lcd_goto(9); lcd_puts(buf); lcd_goto(13); lcd_puts("mA"); __delay_ms(125); } }

  • C言語でLEDを点灯させるプログラムです

    C言語を使ってLEDを点灯させるプログラムです。 以下のプログラムを変更して、Aポートの入力(下位4ビット) と、Cポートの入力(下位4ビット)を加算した値をBポートに出力しなさい 。 という問題なのですが、加算した値を出力するにはどうプログラムを記述すればいいか 分かりません。教えてください。 また、加算するというのは、たとえばどういうふうにしろ ということなのか、教えてください。 #include<18F452/h> #device HIGH_INTS=TRUE #priority ext,rb #fuses NOOSCSEN,HS,BORV45,NOBROWNOUT,PUT #fuses WDT128,NOWDT #fuses NODEBUG,NOLVP,NOSTVREN #fuses NOPROTECT,NOCPD,NOCPB #fuses NOWRT,NOWRTD,NOWRTB,NOWRTC,NOEBTR,NOEBTRB #use delay (CLOCK=20000000) #use fast_io(A) #use fast_io(B) #use fast_io(C) #use fast_io(D) #use fast_io(E) #byte port_a=0xf80 #byte port_b=0xf81 #byte port_c=0xf82 #byte port_d=0xf83 #byte port_e=0xf84 int i=0,j=0; void main() { if(input(PIN_b4)){output_high(PIN_d4);} else{output_low(PIN_d4);} if(input(PIN_b5)){output_high(PIN_d5);} else{output_low(PIN_d5);} if(input(PIN_b6)){output_high(PIN_d6);} else{output_low(PIN_d6);} if(input(PIN_b7)){output_high(PIN_d7);} else{output_low(PIN_d7);} while(1) { output_c(0b10101010); } }

  • PIC16F819のADC機能について

     PIC16F819のA/D変換プログラムをC言語で作りたいのですが、参考になるサイトや本がないのでどこから手をつけていいのかまったく分かりません。  試しにPICC Compilerの期間限定版をダウンロードして、その中にあったサンプルプログラムを見てみました。PIC16F87X用のADCのサンプルプログラムがあったので、とりあえずMPLABでコンパイルしてみましたが、ADGOの部分でエラーが出てしまいました。どうもPIC16F819ではADGOが使用できないようですが、どうすれば改善されるのでしょうか?  分かる方がいましたら、御教授よろしくおねがいします。 サンプルプログラム #include <pic.h> __CONFIG(DEBUGEN&WDTDIS&LVPDIS); /***Sample code to set up the A2D module********/ void init_a2d(void){ ADCON0=0; ADCON1=0; ADON=1; } /***Return an 8 bit result**********************/ unsigned char read_a2d(unsigned char channel){ channel&=0x07; ADCON0&=0xC5; ADCON0|=(channel<<3); ADGO=1; while(ADGO)continue; return(ADRESH); } /***Main関数*************************************/ void main(void){ unsigned char x; init_a2d(); GIE=0; TRISB=0xF0; for(;;){ x=read_a2d(1); PORTB=(8>>(x>>6)); } }

  • PICによる7セグLED3桁制御

    PICによる7セグLED3桁制御 度々こちらに、お世話になっております。 今回は、3桁のLEDを1から999までカウント表示する プログラムに取組んでいるところ希望通りに、動いてはくれません。 このソースのベースは2桁(1から99までカウントUP)の ソースコードを変更して、3桁表示させる様にしてみました。 コード概要はtimer0割込みで3.2msのインターバルタイムの間、 LEDをダイナミック点灯させ、timer1では、100msのインターバルタイムを 10回繰り返し(1秒毎に)counterを1プラスしてLEDの表示を1ずつ 増して999まで表示後、また000から繰返すと言う単純な動作のものです。 main()関数内はtimer0とtimer1の割込み設定及び 割込み開始、許可を繰返すだけです。 問題の#timer0,#timer1割込み関数処理部分における実行結果は、 000から111と言う具合に3桁が同時にカウント表示されてしまい、 しかも繰り上がる時間は1秒毎の筈が、100秒毎になります。 このコードはCCS-Cコンパイラに準拠していて、 標準Cとは多少異なる部分があり解りにくいと思いますが どうかどなた様からも検証より不具合コード部分のご指摘と修正を 頂くことが出来るなら、大変光栄に思います。 そこで、PICにおけるconfigu部分は省き、概ねのコードを記します。 //// 1:static long int number; 2:static int counter; 3:int const LED_SEG[11]= {0x7E,0xCC,...略} 4:#int_timer0 5:void isr() { 6:static int a,b,c = 0; 7:int x; 8:out_low(PIN_C0); // LED 1桁目off 9:out_low(PIN_C1); // LED 2桁目0ff 10:out_low(PIN_C2);// LED 3桁目0ff 11:a = number % 10; 12:x = number/10; 13:b = x % 10; 14:c = x / 10; 15:output_b(LED_SEG[a]); 16:output_high(PIN_C0);//1桁目ON 17:output_b(LED_SEG[b]); 18:output_high(PIN_C1);//2桁目ON 19:output_b(LED_SEG[c]); 20:output_high(PIN_C2);//3桁目ON } 21:#int_timer1 22:void isr() { 23:set_timer1(0x0BDC);//100ms再設定 24:counter++; 25:if(counter>9)//10回か { 26:counter = 0; 27:number++; } 28:if(number>1000) { 29:number = 0; } } 30:void main() { 略 31:setup_timer0(3.2msセット) 32:setup_timer1(100msセット) 33:timer0割り込み許可 34:timer1割り込み許可 35:GLOBAL全体割り込み許可 36:while(1){} } //// 以上宜しくお願いいたします。

  • PIC16F819

    PIC16F819のADコンバータを使用しています。 RA0からアナログ信号を入力して、PORTBのそれぞれのピンから1bitずつ(計8bit)のデジタル信号を出力させるためのプログラムを書いてみましたが、まったく動作しません。レジスタの設定なども変えてみましたが動作しませんでした。特にPORTBを全てHighにした場合、なぜかRB6とRB7からの出力を確認することができませんでした。 動作しない原因がまったく分からないので困っています。原因が分かる方がおられましたらご教授お願いします。 #include <pic.h> __CONFIG(DEBUGEN&WDTDIS&LVPDIS&HS&PWRTEN); void init_a2d(void){  ADCON0=0x40;  ADCON1=0x40;  ADON=1; } unsigned char read_a2d(unsigned char channel){  channel&=0x07;  ADCON0&=0xC5;  ADCON0|=(channel<<3);  GODONE=1;  while(GODONE)continue;  return(ADRESH); } void main(void){  unsigned char x1;  init_a2d(); //initialise the A2D module  GIE=0; // we don't want interrupts  TRISB=0x00;     // PORTB will be used in output mode  PORTB=0x00;  x1=read_a2d(1); // sample the analog value on RA0  PORTB=x1; }

  • 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の周波数を出力することは可能でしょうか? もし不足の部分や誤っていることがあったら教えてください。

  • 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プログラミング

    テストプログラムとして以下のようなプログラムを作ってみました。 RB0を一定時間だけHIGHにした後に、LOWに戻すプログラムなのですが、テスターで測定したところRB0は結果的にHIGHのままでした。wait関数が間違っているのかと思いましたが、どう考えても文法的な間違いはないと思います。 原因がまったく分からないので、分かる方がいましたらヒントだけでもいいので是非教えてください。よろしくお願いします。 PIC16F819 セラロック20MHz #include <pic.h> __CONFIG(DEBUGEN&WDTDIS&LVPDIS&HS&PWRTEN); #define voltage 5.0 void wait(int a){ int i,j; for(i=0;i<=30000;i++) for(j=0;j<=2000*a;j++); } void init_a2d(void){ ADCON0=0x80; ADCON1=0x00; ADON=1; } unsigned char read_a2d(unsigned char channel){ channel&=0x07; ADCON0&=0xC5; ADCON0|=(channel<<3); // GODONE=1; // while(GODONE)continue; ADCON0|=0x04; while(ADCON0&0x04)continue; return(ADRESH); } void main(void){ int i,j; unsigned char x; double y; init_a2d(); GIE=0; TRISB=0x00; PORTB=0x00; RB0=1;    wait(5); RB0=0; }

専門家に質問してみよう