// 2008.01.06 M.Fujinawa // // CCS PIC コンパイラー用 赤外線2チャンネル受信機 // // GP0,GP1:エルロンマグネットアクチュエーターPWM出力 // GP2:スロットルPWM出力 // GP3;赤外線受光素子入力(Futaba専用) // #include "10F200.H" #FUSES NOWDT //No Watch Dog Timer #FUSES NOPROTECT //Code not protected from reading #FUSES NOMCLR //Master Clear pin used FOR I/O #use delay(clock=4000000) #byte TMR0 = 1//TIMER0 address #byte GPIO = 6//IO address #define AILE 2 #define ELEV 3 #define THRO 4 #define RUDD 5 #define PWMCNT 20 #define OFFSET 29 char rp1,rp2; char chsel; char Tmrl; char rpwm; char flag; char cnt; char gp; void main(void) { // 初期設定 set_tris_b(0x08); setup_timer_0 (DISABLE_PULLUPS|RTCC_INTERNAL|RTCC_DIV_1); GPIO = 0; // ゼロで初期化 rp1 = 0; rp2 = 0; chsel = 0; Tmrl = 0; rpwm = 0; flag = 0; cnt = 0; gp = 0; TMR0 = 0; while(TRUE) { while(TMR0 & 0x80); TMR0 = (256 - 30); //-->赤外線入力 if(flag & 0x02) { if((GPIO & 0x08) == 0) { //赤外線がHi から Loへ flag &= 0xfd; if(flag & 1) { //ギャップ検出 chsel = 2; flag &= 0xfe; Tmrl = 0; goto SKIP; } if(Tmrl >(OFFSET+PWMCNT+6) || Tmrl < (OFFSET-5)) { chsel = (RUDD+1); } Tmrl -= OFFSET; if(Tmrl & 0x80) { //マイナス Tmrl = 0; } if(chsel == AILE) { //エルロン rp2 = Tmrl-(PWMCNT/2); gp &= 0xfe; gp &= 0xfd; if(rp2 & 0x80) { rp2 = (PWMCNT/2); rp2 -= Tmrl; if(rp2 > 1) { gp |= 0x01; } }else if(rp2 > 1) { gp |= 0x02; } rp2 <<= 1; if(rp2 < rpwm) { GPIO &= 0xfe; GPIO &= 0xfd; } chsel++; cnt = 0; }else if(chsel == ELEV) { //エレベーター chsel++; cnt = 0; }else if(chsel == THRO) { //スロットル rp1 = Tmrl; gp &= 0xfb; if(rp1) { gp |= 0x04; } if(rp1 < rpwm) { GPIO &= 0xfb; } chsel++; cnt = 0; }else if(chsel == RUDD) { //ラダー chsel++; cnt = 0; } Tmrl = 0; }else { if(Tmrl == 114) { //4mmsec経過 flag |= 1; //ギャップ検出 Tmrl = 0; cnt++; if(cnt & 0x20) { //32カウント cnt = 0; if(rp1) { if(--rp1 == 0) { gp = 0; } } } } } }else if(GPIO & 0x08) { //赤外線がLo から Hiへ flag |= 2; } //<-- SKIP: //-->PWM 出力 if(rpwm == 0) { GPIO = gp; }else { if(rp1 == rpwm) { GPIO &= 0xfb; } if(rp2 == rpwm) { GPIO &= 0xfd; GPIO &= 0xfe; } } rpwm++; if(rpwm == PWMCNT) { rpwm= 0; } //<-- Tmrl++; } }