// CCPハニービー用赤外線2ch送信機 トリム対応型,送信フォーマット改良 //  1114k26tx2_honey_sub2.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; int stflag,stcount,band,bzcount,pbit; int temp,aero,honey; int ird[21]; //VR入力をADコンバータより読み出し、各変数にセットする。 void adc_in(void) { set_adc_channel(0); delay_us(20); th_adc=read_adc(); th_out=th_adc/16;// 8bit to 4bit set_adc_channel(1); delay_us(20); rd_adc=read_adc(); rd_out=rd_adc/16;// 8bit to 4 bit set_adc_channel(3); delay_us(20); vdd_adc=read_adc(); } // 38kHz変調出力関数 // 13μS On、13μS OFFを38回繰り返して1msのONを作る void ir1ms(){ //38KHzでONを1.1ms継続(Aero,Honey) 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継続(Aero,Honey) int i; for(i=0;i<21;i++){ //38kHz変調になるように調整済み IROUT=ON; delay_us(13); IROUT=OFF; delay_us(6); } } //送信データ=1の変調 void ir1a(){// for aero ir1ms(); delay_us(1500); } void ir1h(){// for honey bee ir1ms(); delay_us(600); } //送信デ−タ=0の変調 void ir0a(){// for aero ir1ms(); delay_us(500); } void ir0h(){// for honey ir05ms(); delay_us(600); } void vdd_check(){// 電圧チェック・・6.5V以下でブザーがONになるように半固定抵抗を調整すること。 if(vdd_adc <220){// for AD converter 8bit BUZ=ON; } } /* 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 */ void go_honey(){ int i; ird[0]=1;ird[1]=0;ird[2]=0;ird[3]=1;ird[4]=1;//送信データ スタートビット初期化 ird[20]=0;//送信データエンドビット初期化 adc_in();//A/Dコンバータ読み込み IROUT=OFF; BUZ=OFF; if(band==1){//Aバンドの場合 ird[5]=0;ird[6]=0; } else if(band==0){//Bバンドの場合 ird[5]=0;ird[6]=1; } if(th_out==15){//15はスロットル範囲外 th_out=14; } for(i=0;i<4;i++){// スロットルデータ生成 ird[7 to 10] th_out=th_out & 0x0f;//上位4bitマスク temp=th_out; temp=temp & 0x01;//1bit取り出し if(temp==1){ ird[10-i]=1;//10bit目が下位のため } else{ ird[10-i]=0; } th_out=th_out >> 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; } ir1ms();//ird[0]は1.5msを送信(1.6ms) ir05ms(); for(i=1;i<21;i++){//赤外線送信 ird[0 to 20]送信 if (ird[i]==1){ ir1h(); } else{ ir0h(); } } IROUT=OFF; vdd_check();// 電圧チェック・・6.5V以下でブザーがONになるように半固定抵抗を調整すること。 delay_ms(200);//周期 } //メインルーチン void main() { int i; 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(); if(th_adc > 12){//Bバンド選択:スロットルフルハイ band=0; bzcount=3; } else{//Aバンド選択:スロットル最スロー band=1; bzcount=2; } while(th_adc > 4){//スロットルローになるまで待つ adc_in(); } for(i=0;i