// CCPハニービー用赤外線2ch送信機 トリム対応型 //  1011k26tx2_honey_trim.c PIC12F683用 #include<12f683.h> #DEVICE ADC=8 //ADコンバータを8bitで使用 #fuses INTRC_IO,NOWDT,PUT,NOPROTECT,NOMCLR //ウオッチドックタイマ無し、パワーアップタイマ使用 //プロテクト無し、MCLRなし #use delay(CLOCK=8000000)//8MHz駆動 #byte GP=5 #bit IROUT=GP.2 //赤外線LEDドライブ #bit BUZ=GP.5 //電圧監視用ブザー #bit SW=GP.3 //ジョイスティック内蔵プッシュスイッチ #define ON 1 #define OFF 0 #define HI 1 #define LOW 0 long th_adc,rd_adc,vdd_adc; int th_out,rd_out; // 38kHz変調出力関数 // 13μS On、13μS OFFを38回繰り返して1msのONを作る void ir1ms(){ //38KHzでONを1.1ms継続 int i; for(i=0;i<42;i++){ //38kHz変調になるように調整済み IROUT=ON; delay_us(13); IROUT=OFF; delay_us(6); } } void ir05ms(){ //38KHzでONを0.55ms継続 int i; for(i=0;i<21;i++){ //38kHz変調になるように調整済み IROUT=ON; delay_us(13); IROUT=OFF; delay_us(6); } } //VR入力をADコンバータより読み出し、各変数にセットする。 void adc_in(void) { set_adc_channel(0); delay_us(20); th_adc=read_adc();//スロットル th_out=th_adc/16;//スロットル8bitから4bitへ変換 set_adc_channel(1); delay_us(20); rd_adc=read_adc();//ラダー rd_out=rd_adc/16;//ラダー8bitから4bitへ変換 set_adc_channel(3); delay_us(20); vdd_adc=read_adc();//電源電圧 } //データ=1の変調 void ir1(){ ir1ms(); delay_us(600); } //デ−タ=0の変調 void ir0(){ ir05ms(); delay_us(600); } //メインルーチン void main() { int i,pbit,band,bzcount,temp; int ird[21]; /* ird[0 to 4:start];ird[5 to 6:band];ird[7 to 10:throttle];ird[11 to 14:trim] ird[15 to 17:rudder]:ird[18 to 19:parity];ird[20:end] */ /* GP 5 4 3 2 1 0 BZ VD SW L RD TH 0 1 1 0 1 1 =1b */ set_tris_a(0x1b); setup_adc_ports(sAN0 | sAN1 | sAN3 | VSS_VDD); //ADコンバータ使用宣言 setup_adc(ADC_CLOCK_DIV_32); //ADコンバータクロック setup_oscillator(OSC_8MHz); BUZ=OFF; adc_in();//Bバンド選択:スロットルフルハイ if(th_adc > 12){ band=0; bzcount=3; } else{//Aバンド選択:スロットル最スロー band=1; bzcount=2; } while(th_adc > 2){//スロットルローになるまで待つ adc_in(); } for(i=0;i> 1;//右1bitシフト } //ラダートリムデータ生成 ird(11 to 14) if(SW==1){ for(i=11;i<=14;i++){//ノートリム ird[i]=0; } } else{//スイッチが押された場合 if(rd_out <=5){//左トリム for(i=11;i<=14;i++){ ird[i]=1; BUZ=ON; } } else if(rd_out >=10){//右トリム for(i=11;i<=13;i++){ ird[i]=0; BUZ=ON; } ird[14]=1; } } /* ラダースティック位置:(0 1) (2 3) (4 5) (6 7 8 9) (10 11) (12 13) (14 15) ラダー送信データ:   101 110  111 ニュートラル  001   010   010 */ if(rd_out <=6){//ラダー送信データ生成 ird[15]=1;//左 if(rd_out <=2){ ird[16]=0;ird[17]=1; } else if(rd_out <=4){ ird[16]=1;ird[17]=0; } else if(rd_out <=6){ ird[16]=1;ird[17]=1; } } else{ ird[15]=0;//右・センター if(rd_out <=8){ ird[16]=0;ird[17]=0; } else if(rd_out <=10){ ird[16]=0;ird[17]=1; } else if(rd_out <=12){ ird[16]=1;ird[17]=0; } else{ ird[16]=1;ird[17]=1; } } pbit=0;//送信データよりパリティカウント計算 for(i=3;i<=15;i=i+2){ pbit=pbit+ird[i]*2;//2bit目 pbit=pbit+ird[i+1];//1bit目 } if(ird[17]==1){ pbit=pbit+ird[17]*2;//ラダーは3bitのため4bitと考える } pbit=pbit & 0x03;//下位3bit有効 if(pbit==0){//送信用パリティデータ生成 ird[18]=1;ird[19]=1; } else if(pbit==1){ ird[18]=0;ird[19]=1; } else if(pbit==2){ ird[18]=1;ird[19]=0; } else if(pbit==3){ ird[18]=0;ird[19]=0; } for(i=0;i<21;i++){//赤外線送信 ird[0 to 20]送信 if (ird[i]==1){ ir1(); } else{ ir0(); } } IROUT=OFF; // 電圧チェック・・6.5V以下でブザーがONになるように半固定抵抗を調整すること。 if(vdd_adc < 220){//AD Converter 8bit BUZ=ON; } delay_ms(220);//周期 } }