// 赤外線パルスカウンターRS232-C版 // 1017k26kpulse232.c // 簡易RS232-C送信ユニット仕様 #include<12f683.h> #fuses INTRC_IO,NOWDT,PUT,NOPROTECT,NOMCLR,NOBROWNOUT //ウオッチドックタイマ無し、パワーアップタイマ使用 //プロテクト無し、MCLRなし #use delay(CLOCK=8000000) //8MHz駆動 //#use rs232(baud=300,xmit=PIN_A2,parity=N,bits=8) RS232C設定パターン // GP 5 4 3 2 1 0 // 0 0 1 0 0 0 #byte GP=5 #bit IRSIG=GP.3 #bit led1=GP.5 #bit led2=GP.4 #bit led3=GP.1 #bit led4=GP.0 #bit txd=GP.2 #define ON 1 #define OFF 0 #define HI 1 #define LOW 0 #define LEDALLON 0x33 #define LEDALLOFF 0x0c #define tx_delay 833 //833 1200bps long th_count,al_count,el_count,rd_count;//パルスカウント用 char str[50]; int counter,cycl_count,al_duty,el_duty,th_duty,rd_duty; void rs_send(unsigned char c)//簡易RS23C一文字出力 { char i; c=~c; txd=1; delay_us(tx_delay); for(i=0;i<8;i++){ txd=0x01 & (c>>i); delay_us(tx_delay); } txd=0; delay_us(tx_delay); } void rs_printf()//簡易RS232C出力関数 { int i; i=0; while(str[i]!='\0'){ rs_send(str[i]); i++; } } #INT_RTCC//LED点滅ソフトウェアPWM void led_pwm() { set_timer0(178); if(cycl_count <= al_duty){ led1=ON; } else{ led1=OFF; } if(cycl_count <= el_duty){ led2=ON; } else{ led2=OFF; } if(cycl_count <= th_duty){ led3=ON; } else{ led3=OFF; } if(cycl_count <= rd_duty){ led4=ON; } else{ led4=OFF; } cycl_count++; cycl_count %=10; } //メインルーチン void main(){ int i,gcount; char c; setup_oscillator(OSC_8MHz); setup_comparator(NC_NC);//デジタル入力切り替え setup_adc_ports(NO_ANALOGS); //アナログ未使用 setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256); //内部2MHz=0.5μS動作、(256-78)*256*0.5^-6=10ms 10*10=100ms:LED PWM周期 set_tris_a(0x08);//GP3入力、他は出力 for(i=0;i<40;i++){ str[i]=' '; } for(i=0;i<3;i++){ GP=LEDALLON; delay_ms(250); GP=LEDALLOFF; delay_ms(250); } enable_interrupts(INT_RTCC);//timer0割り込み許可 enable_interrupts(GLOBAL);//割り込み全体許可 set_timer0(78); sprintf(str," \n"); rs_printf(); sprintf(str,"\n*** Ir Pulse Counter RS232-C Ver1.0 ***\n\r\n"); rs_printf(); while(1){//ギャップ検出ルーチン enable_interrupts(INT_RTCC);//timer0割り込み許可 gcount=0; while(gcount < 30){ if(IRSIG==HI){ delay_us(100); gcount++; } else{ gcount=0; } } While(IRSIG==HI){ } disable_interrupts(INT_RTCC); // 1ch(エルロン) al_count=0; while(IRSIG==LOW){//Low、Hiループは1回10μSに調整済み delay_us(6); al_count=al_count+1; } while(IRSIG==HI){ delay_us(6); al_count=al_count+1; } // 2ch(エレベータ) el_count=0; while(IRSIG==LOW){//Low、Hiループは1回10μSに調整済み delay_us(6); el_count=el_count+1; } while(IRSIG==HI){ delay_us(6); el_count=el_count+1; } // 3ch(スロットル) th_count=0; while(IRSIG==LOW){//Low、Hiループは1回10μSに調整済み delay_us(6); th_count=th_count+1; } while(IRSIG==HI){ delay_us(6); th_count=th_count+1; } // 4ch(ラダー) rd_count=0; while(IRSIG==LOW){//Low、Hiループは1回10μSに調整済み delay_us(6); rd_count=rd_count+1; } while(IRSIG==HI){ delay_us(6); rd_count=rd_count+1; } enable_interrupts(INT_RTCC);//timer0割り込み許可 //エルロンの処理 if(al_count <120){ al_duty=3; } else if(al_count <150){ al_duty=6; } else if(al_count <160){ al_duty=10; } else if(al_count <190){ al_duty=6; } else{ al_duty=3; } //エレベータ処理 if(el_count <120){ el_duty=3; } else if(el_count <150){ el_duty=6; } else if(el_count <160){ el_duty=10; } else if(el_count <190){ el_duty=6; } else{ el_duty=3; } //スロットル処理 if(th_count <120){ th_duty=10; } else if(th_count <150){ th_duty=3; } else if(th_count <160){ th_duty=5; } else if(th_count <190){ th_duty=7; } else{ th_duty=7; } //ラダー処理 if(rd_count <120){ rd_duty=3; } else if(rd_count <150){ rd_duty=6; } else if(rd_count <160){ rd_duty=10; } else if(rd_count <190){ rd_duty=6; } else{ rd_duty=3; } //簡易RS232Cデータ送信 sprintf(str,"ch1:"); rs_printf(); sprintf(str,"%ld",al_count); rs_printf(); sprintf(str,"0us "); rs_printf(); sprintf(str,"ch2:"); rs_printf(); sprintf(str,"%ld",el_count); rs_printf(); sprintf(str,"0us "); rs_printf(); sprintf(str,"ch3:"); rs_printf(); sprintf(str,"%ld",th_count); rs_printf(); sprintf(str,"0us "); rs_printf(); sprintf(str,"ch4:"); rs_printf(); sprintf(str,"%ld",rd_count); rs_printf(); sprintf(str,"0us \n\r"); rs_printf(); } }