// RC受信機用マグネットアクチュエータユニット // 1005k26ir2rx.c #include<12f683.h> #fuses INTRC_IO,NOWDT,PUT,NOPROTECT,NOMCLR,NOBROWNOUT //ウオッチドックタイマ無し、パワーアップタイマ使用 //プロテクト無し、MCLRなし #use delay(CLOCK=8000000) //8MHz駆動 #byte GP=5 #bit RXSIG=GP.3 #bit rcoil1=GP.0 #bit rcoil2=GP.1 #bit lcoil1=GP.4 #bit lcoil2=GP.5 #bit LED=GP.2 #define ON 1 #define OFF 0 #define HI 1 #define LOW 0 #define rcoil 0x03 #define lcoil 0x30 signed long rx_count;//パルスカウント用 int on_coil,cycl_count,coil_duty; #int_rtcc void coil_pwm() { set_timer0(6); if(cycl_count < coil_duty){ GP=on_coil; } else{ GP=OFF; } cycl_count++; cycl_count %=9; } //メインルーチン main(){ int i; setup_comparator(NC_NC);//デジタル入力切り替え setup_oscillator(OSC_8MHz); setup_adc_ports(NO_ANALOGS); //アナログ未使用 setup_timer_0(RTCC_INTERNAL | RTCC_DIV_8);// マグネットアクチュエータ周期 set_tris_a(0x08);//GP3入力、他は出力 enable_interrupts(INT_RTCC); //timer0割り込み許可 enable_interrupts(GLOBAL); //割り込み全体許可 set_timer0(6); cycl_count=coil_duty=0; //起動時LED点滅 for(i=0;i<3;i++){ LED=ON; delay_ms(500); LED=OFF; delay_ms(200); } while(1){ // 受信機信号立ち上がり検出 while(RXSIG==LOW){ } //パルスカウント disable_interrupts(INT_RTCC); //timer0割り込み禁止 rx_count=0; while(RXSIG==HI){//Low、Hiループは1回10μSに調整済み delay_us(6); rx_count=rx_count+1; } enable_interrupts(INT_RTCC);//timer0割り込み許可 //マグネットアクチュエータ処理 if(rx_count<107){ //フタバパルス下限 1070μS rx_count=107; } if(rx_count>197){ //フタバパルス上限1970μ rx_count=197; } rx_count=rx_count-100; if(rx_count<47){ //左スティック on_coil=rcoil; rx_count=-(rx_count-52)/5; //エルロン分解能9段階 } else if(rx_count>57){ //右スティック on_coil=lcoil; rx_count=(rx_count-52)/5; } else{ //47<ニュートラル<57 GP=OFF; rx_count=0; LED=ON;//ニュートラルでLED点灯 } coil_duty=rx_count; } }