• 締切済み

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関連のプログラムをすべて消したいです。

みんなの回答

  • tokichim
  • ベストアンサー率42% (88/205)
回答No.2

ソースをみた限りですが… > この文でlcdに何も表示しないようにしたいのですがどこを消せばいいのでしょうか? 簡単にすませるならlcd_express()を以下のようにします。後で元に戻したくなるかもしれないので関数の書式はとりあえず変えない。 void lcd_express(int disp) {  delay_ms(5); /* タイミングが変わるとまずいかもなので残す */ } > あと、void文などもできれば消して動かせるようにしたいのですが、どのようにすればいいでしょうか? ? 意味がわかりません。無駄な記述はないと思いますが? 前の方にある3行の関数プロトタイプ文のことをいっているのでしたら、これは必要なものです。「こういう関数を中で使っている」とプログラムがわかりやすくなる効果もありますので、消さない方が得策です。

  • penta1331
  • ベストアンサー率64% (16/25)
回答No.1

関数名などを見るだけでも、ある程度予想できると思いますよ。 少しは考えてみましたか? main()の中の"lcd_express(mode);"をコメントアウト。 それでもサイズが小さくならないようなら、先頭の"#include <lcd.c>"をコメントアウト。 あと、コメントアウトした関数を削除。

関連するQ&A

  • 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 }

  • 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! ********** というエラーが出ます。このようなエラーが出る原因を教えて頂けないでしょうか。お願いします。

  • 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); } }

  • PICでのプログラミングについて教えて下さい。

    現在電圧計を製作していて4桁の7セグダイナミック点灯で行き詰っております(超初心者です)。 PICは16F873Aを使用、コンパイラはCCS、書き込みはピックライタ、あとシリアルデバッカを使用しています。 外部から電圧をかけそれをAD変換し、AD変換結果(0~5V)を7セグに表示させようとしています。 一応今の状態でも電圧表示はできていることはできているのですが一桁目から4桁目まで目で追えるくらい遅いスピードでこれを改善したいです。ソースは下記のソースを製作しました。この状態で3日間悩んでおります...知恵をお貸しいただけないでしょうか。 よろしくお願いします。 #include <16F873a.h> #device ADC=10 //A/D変換10bitモード #use fast_io(A) /* TRISレジスタの設定が必要 */ #use fast_io(B) #use fast_io(C) #use delay (clock=10000000) //10MHz #use RS232( BAUD = 9600, XMIT = PIN_C6, RCV = PIN_C7, PARITY = N, BITS = 8 ) #fuses HS,NOWDT,PUT,NOPROTECT,NOBROWNOUT,NOLVP #define VOLTAGE PIN_A0 // (in) #define CORRENT PIN_A1 // (in) #define VREF1 PIN_A2 // (in) #define VREF2 PIN_A3 // (in) #define RESERVE1 PIN_A4 // (out) #define RESERVE2 PIN_A5 // (out) #define LED_DP PIN_B0 // (out) #define LED_A PIN_B1 // (out) #define LED_B PIN_B2 // (out) #define LED_C PIN_B3 // (out) #define LED_D PIN_B4 // (out) #define LED_E PIN_B5 // (out) #define LED_F PIN_B6 // (out) #define LED_G PIN_B7 // (out) #define DIG_0 PIN_C0 // (out) #define DIG_1 PIN_C1 // (out) #define DIG_2 PIN_C2 // (out) #define DIG_3 PIN_C3 // (out) #define INI_TRIS_A_VAL 0x0F // 7:x 6:x 5:out 4:out 3in 2:in 1:in 0:in #define INI_TRIS_B_VAL 0x00 // 7:out 6:out 5:out 4:out 3out 2:out 1:out 0:out #define INI_TRIS_C_VAL 0x80 // 7:in 6:out 5:out 4:out 3:out 2:out 1:out 0:out int ct;//数字の更新間隔 long val;//表示する数字 int digit;//表示する桁 //表示パターン int segment_data[]={0x81,0xF3,0x49,0x61,0x33,0x25,0x05,0xF1,0x01,0x31}; char st[4]; void main() { float ata1,data2,data3,data4; long data5; long val; SET_TRIS_A( INI_TRIS_A_VAL ); SET_TRIS_B( INI_TRIS_B_VAL ); SET_TRIS_C( INI_TRIS_C_VAL ); setup_adc_ports(AN0_AN1_VSS_VREF); setup_adc(ADC_CLOCK_DIV_32); //Fosc/32 最高速度 digit=0; ct=1;//数字を更新する周期 val=0;//表示する値 while(1) { output_low(RESERVE2); //動作ランプ //////////////////////電圧測定///////////////////////////////// set_adc_channel(0); delay_us(50); //アクイジションタイム待ち(マイクロ秒) data1 = read_adc(); //AD変換結果読み込み printf("ADC V %9.3f \r\n", data1 ); //AD変換データ表示 data2 = (data1 * 4.959695) / 1024; //BCDに変換 printf("Volt %6.3f \r\n", data2 ); //変換データ表示 data5 = data2 * 1000 ; //data2を整数に変換 val = data5 ; printf("val %ld \r\n", val); //整数にし表示 /////////////////////7SEG表示////////////////////////////////// ct --; if(ct == 0){//数字の更新 st[3]=val/1000; //4桁目数値取り出し st[2]=val/100-st[3]*10;//3桁目数値取り出し st[1]=val/10-((st[3]*100)+(st[2]*10));//2桁目数値取り出し st[0]=val%10;//あまり val++; if(val==1000) val=0; ct=20; } if(digit== 3){//第4桁の表示 output_b( segment_data[st[3]]); output_bit(DIG_0,1);  //4桁表示開始 output_low(LED_DP);  //小数点表示  delay_us (5); //表示期間(ミリ秒) output_bit(DIG_0,0); //表示を消す output_high(LED_DP); //小数点を消す delay_us(50); //待ち(マイクロ秒) } if(digit== 2){ output_b( segment_data[st[2]]); output_bit(DIG_1,1); delay_ms (5); output_bit(DIG_1,0); delay_us(50); } if(digit== 1){ output_b( segment_data[st[1]]); output_bit(DIG_2,1); delay_ms (5); output_bit(DIG_2,0); delay_us(50); } if(digit == 0){ output_b( segment_data[st[0]]); output_bit(DIG_3,1); delay_ms (5); output_bit(DIG_3,0); delay_us(50); } digit ++;//表示桁を変更 if(digit ==4 ) digit=0; } }

  • C言語のPICプログラミングなんですが、

    C言語のPICプログラミングなんですが、 これのどこがおかしいか教えてください。 if(input(PIN_B1)) { while(input(PIN_B2) == 0) { output_high(PIN_B7); //前進後進パルス出力 delay_us(50); //変換待ち output_low(PIN_B7); delay_us(16000); //共通遅延16000us } break; } if(input(PIN_B1)) { while(input(PIN_B2) == 0) { output_high(PIN_B7); //前進後進パルス出力 delay_us(50); //変換待ち output_low(PIN_B7); delay_us(16000); //共通遅延16000us } break; }

  • ニキシー管時計の自作について

    ニキシー管時計を自作しているのですか、スイッチ入力のプログラムが分かりません。 #include <16f1938.h> #fuses INTRC_IO,NOWDT,NOPROTECT,NOCPD,NOMCLR,NOPUT,NOBROWNOUT,NOIESO #use delay(clock=16MHZ) // クロック周波数は16MHz #byte RA = 0x0c //RAをポートAのアドレス0Ch番地に設定 #bit MODE_SW = RA.0 #bit UP_SW = RA.1 #bit DOWN_SW = RA.2 #bit NIXI_8 = RA.6 #bit NIXI_9 = RA.7 #byte RB = 0x0d //RBをポートBのアドレス0Dh番地に設定 #byte RC = 0x0e //RCをポートCのアドレス0Eh番地に設定 void io_init(void); // i/o設定関数 signed int sec=56,min=34,hour=12; void disp_nixi(int v); int flag=0; /*-------------------------------------- timer0割り込み 1ms間隔 ---------------------------------------*/ #INT_TIMER0 void timer0(void) { static signed int flag=0; static signed long m_sec=0;//msカウンタ set_timer0(131); //256-125 =131 125* 8us = 1000us //全て消灯 RB=0x00; disp_nixi(10); delay_us(10); m_sec++; if(m_sec>1000){ sec++; m_sec=0; } if(sec>60){ min++; sec=0; } if(min>60){ hour++; min=0; } if(hour>=24){ hour=0; } if(flag<6)flag++; else flag=0; switch(flag){ case 0: disp_nixi(sec%10); RB=0x01;//1桁ON break; case 1: disp_nixi(sec/10); RB=0x02;//2桁ON //RB=0x02;//2桁ON break; case 2: disp_nixi(min%10); RB=0x04;//3桁ON break; case 3: disp_nixi(min/10); RB=0x08;//4桁ON break; case 4: disp_nixi(hour%10); RB=0x10;//5桁ON break; case 5: disp_nixi(hour/10); RB=0x20;//6桁ON break; }//end switch } // end timer0(void) void main(void) { long int flag=0,i; io_init(); while(1){ //ここにプログラムを書きたいです }// end while() } // end main(void) void io_init(void){ setup_oscillator(OSC_16MHZ); // 内部クロックを16MHzに設定 RA=0x00; RB=0x00; RC=0x00; setup_adc_ports(NO_ANALOGS); // ポートAはデジタルI/Oに設定 //timer0の設定 setup_timer_0(RTCC_INTERNAL | RTCC_DIV_32); // 4ck 1命令 4/16M = 0.25us 0.25us*32 : 1ct = 8us タイマ0のモード設定 set_timer0(131); //256-125 =131 125* 8us = 1000us // TRIS_aの設定 A0~A7:入力 1111 1111 A2:sw2 A1:sw1 A1:sw1 set_tris_a(0x3f); // TRIS_bの設定 set_tris_b(0x00); //H-side ドライブ0~5 // TRIS_cの設定 set_tris_c(0x00); //7~4:free  C3~0:L-side ドライブ // TRIS_eの設定 set_tris_e(0xff); enable_interrupts(INT_TIMER0);//tmr0割り込み許可 enable_interrupts(GLOBAL);//グローバル割込み許可 } void disp_nixi(int v){ switch(v){ case 0: NIXI_8 =0; NIXI_9 =0; RC=0b10000000; break; case 1: NIXI_8 =0; NIXI_9 =1; RC=0b00000000; break; case 2: NIXI_8 =0; NIXI_9 =0; RC=0b00010000; break; case 3: NIXI_8 =1; NIXI_9 =0; RC=0b00000000; break; case 4: NIXI_8 =0; NIXI_9 =0; RC=0b00000010; break; case 5: NIXI_8 =0; NIXI_9 =0; RC=0b00000100; break; case 6: NIXI_8 =0; NIXI_9 =0; RC=0b00001000; break; case 7: NIXI_8 =0; NIXI_9 =0; RC=0b00000001; break; case 8: NIXI_8 =0; NIXI_9 =0; RC=0b01000000; break; case 9: NIXI_8 =0; NIXI_9 =0; RC=0b00100000; break; default : NIXI_8 =0; NIXI_9 =0; RC=0b00000000; } } ↑のプログラムのwhile文部分にプログラムを書きたいのですが、 どのようなプログラムを書いたらよいのでしょうか。 教えていただけると助かります。

  • このプログラムを見てください(C言語) m( _ _ )m

    現在乱数を使ったプログラムを作っています。 下のプログラムでコンパイルではエラーがでませんが、実行するとデバッグエラーが出てきます。コンパイラにはbccを使っています。恐らく原因は別の関数でbに値を代入してそれをaに代入しているからだろうと思いますが、なぜこれがいけないのかが分かりません。 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <conio.h> int ran, a=1, b, c; void test(void){ b=8; } void main(){ srand(time(NULL)); a=b;//ここを無くすとなぜかエラーが出ない。 while(1){ ran=rand()%(a*2)+1; switch(ran){ case 1: c=1; break; case 2: c=1; break; case 3: c=1; break; case 4: c=2; break; case 5: c=2; break; case 6: c=3; break; case 7: c=3; break; case 8: c=4; break; } printf("%d",c);printf("何か押してください\n");getch(); } }

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

  • Arduino 条件式

    Arduinoでシリアルモニタを使用しています。 それで、入力した数字を条件式で判断し、真ならLEDを光らせるプログラムを作りたいのですが、入力した数字をどのようなコードで描いたらいいでしょうか? ちなみに、if (Serial.readString() <= 40) { と書いたらダメでした。 #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); int RST = 3; int RstFlag = 0; int Tr = 4; int TrFlag = 0; int LED = 2; //初期設定 void setup() { pinMode(RST, INPUT); pinMode(Tr, INPUT); pinMode(LED, OUTPUT); lcd.init(); lcd.backlight(); //起動後一回のみ表示 lcd.setCursor(2, 0); lcd.print("Lab"); delay(2000); lcd.clear(); //シリアル通信開始 Serial.begin(9600); } void loop() { RstFlag = digitalRead(RST); TrFlag = digitalRead(Tr); lcd.setCursor(0, 0); lcd.print("Auto Mode"); lcd.setCursor(0, 1); lcd.print("Trigger = "); //シリアルポートにデータがあるか判断 if (Serial.available()) { delay(100); lcd.clear(); //データがある場合の動作 if (Serial.available() > 0) { //print"ln"はモニタに入力後改行するコマンド Serial.println("LCD Received!"); //Serial.readString():データを”文字列”として読み込む lcd.setCursor(10, 1); lcd.print(Serial.readString() + "s"); } } if (RstFlag == 0) { delay(100); lcd.clear(); Serial.println("LCD Clear!"); } /*if ( ○○○ <= 40) { //仮に40とする delay(100); Serial.println("Trigger Out!"); digitalWrite(LED, HIGH); delay(200); digitalWrite(LED, LOW); delay(200); digitalWrite(LED, HIGH); delay(200); digitalWrite(LED, LOW); delay(200); } */ length(readString()); }

  • 複数の戻り値

    関数にポインタを渡して、結果を格納してもらう方法で 複数の戻り値を得ようとしたのですがうまく行きません どうしたら複数戻せますか? ---ソース--- #include <stdio.h> #include <stdlib.h> void check(int a,char *b,char *c); void main(void){ int a; char *b,*c; int i; char *va[5]={"2","3"}; for(i=0;i<5;i++){ //ここ何とかなったらwhileにしとこ if(va[i]!=NULL){ a=atoi(va[i]); check(a,b,c); printf("%s%s\n",b,c); } } } void check(int a,char *b,char *c){ switch(a){ case 0: b="0:×\n"; c="0:○\n"; break; case 1: b="1:×\n"; c="1:○\n"; break; case 2: b="2:×\n"; c="2:○\n"; break; case 3: b="3:×\n"; c="3:○\n"; break; case 4: b="4:×\n"; c="4:○\n"; break; } }

専門家に質問してみよう