// Automatic Antenna Changer Ver 7.0(2006/6/10) // PC is PIC16F876 with 20MHz // LCD is SC1602BSLB or SC1602BS*B // 機能 ;  //   @COM2から得たFT100周波数コードをEEROMのアドレスとしEEROMに書き込まれた内容でアンテナリレーを切り替える //   AFT100の周波数をAutomatic Antenna Changer の液晶に表示する。 // BFT100の周波数をFT847フォーマットに変換してCOM1に送り出す(ハムログ用)。 // アンテナリレーを変更するとき // RELAY No CPU ADRESS USEING BAND // RY1: C0 HF // RY2: C1 HF // RY3: C2 HF // RY4: C3 VHF/UHF // RY5: B3 REMOTE RELAY FOR 1.9MHz // Ham Log 側の設定 // 入力環境ー>リグ接続設定に入り FT847 にボチをつける。またタイマーコマンドにチェクを入れる。 ////////////////////////////////////////// #include <16f876.h> #device ADC=10 #include #fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP #use fast_io(a) #use delay(CLOCK=20000000) #define Bmode 0x00 //port B output mode #define Amode 0xff //port A input mode #define Cmode 0xA0 //port C mix mode #define PORTA 0X05 #define PORTB 0X06 #define PORTC 0X07 #use RS232(BAUD=4800,XMIT=PIN_C4 ,RCV=PIN_C5,STREAM=COM2) #use RS232(BAUD=4800,XMIT=PIN_C6 ,RCV=PIN_C7,STREAM=COM1) //////// Port define and link LCD library #define rs PIN_B0 //chip select #define rw PIN_B1 //read/write #define stb PIN_B2 //strobe #include /////////////////////////////////////////////// // The author of lcdlib5.c is Mr. Gokann Tetuya // PIC katuyou hand book p372 /////////////////////////////////////////////// static char *bandname[] = "1.9M=3.5M=4M =7M =10M =14M =18M =21M =24M =28M =50M =FM =144M=430M="; static int bandcode[] = {0x03,0x05,0x06,0x07,0x09,0x0B,0x0e,0x10,0x12,0x14,0x16,0x1b,0x1d,0x29}; static byte ft100_cmd[] = {10,10,10,10,16}; //header"16" is Confirm List(ft100 command). //Others are fillers. byte buffer[6]; long timeout; //COM1,COM2 timeout counter int *ptr; void print4(); void pdata(int flag); void wdata(int flag); int shiftp(int work); main(){ int flag; int work1; int work2; int buff; int32 longwork1; int32 longwork2; long adconv0; float frequency; set_tris_a(Amode); //high set input mode set_tris_b(Bmode); //lower set output port set_tris_c(Cmode); // setup_adc_ports(RA0_RA1_RA3_ANALOG); //RA0,RA1,RA2 ANALOG.OTHERS ARE DEGITAL setup_adc(ADC_CLOCK_DIV_32); lcd_init(); //initialize LCD lcd_cmd(0x0c); //Carsol not display lcd_clear(); //clear display lcd_data(" Ver 7.0 JA2DZF"); lcd_cmd(0xc0); //液晶2行目指定 lcd_data("Auto Antena changer"); fputs("Auto Antena changer ver7.0\n",COM1); fputs("If you want to go to edit mode, Hit any key\n",COM1); delay_ms(1000); timeout=0; while(!kbhit(COM1) && (++timeout<50000)) // Wait for keyboard data of personal cpu. delay_us(10); if (kbhit(COM1)){ fputs("\nWhen band name & data print, You can update band data",COM1); fputs("If not,please push enter key so next band data will display",COM1); fputs("q keyin,this routin end and hamlog mode will run",COM1); delay_ms(1); buff=fgetc(COM1); while(1){ ptr=bandname; //Set pointer. ptr is *bandname[] for(work2=0;work2<14;work2++){ //Now work2 are pointing band number fputs("",COM1); fputs("Ant=>54321",COM1); print4(); //Display band data pdata(work2); //work2 are pointing band number fprintf(COM1," "); for(work1=0;work1<6;work1++) buffer[work1]=0; work1=0; while(work1<5){ buff=fgetc(COM1); if(buff=='q') break; if(buff==13) break; //When carrige return input then go to next band if(buff=='0' || buff=='1'){ //if input data is 1 or 0 fputc(buff,COM1); buffer[work1]=buff; work1++; } else{ fputs(" input error",COM1); for(work1=0;work1<6;work1++) buffer[work1]=0; fprintf(COM1," %s",buffer); work1=0; } } if(buff=='q') break; if(buff!=13) wdata(work2); //13 is carrige return } //for if(buff=='q') break; } //while if(buff=='q') break; } //kbit lcd_clear(); while(1){ fputc(ft100_cmd[0],COM2); fputc(ft100_cmd[1],COM2); fputc(ft100_cmd[2],COM2); fputc(ft100_cmd[3],COM2); fputc(ft100_cmd[4],COM2); timeout=0; //time out set while(!kbhit(COM2) && (++timeout<50000)) // Wait for FT100 data. delay_us(10); if (kbhit(COM2)){ buffer[0]=fgetc(COM2); buffer[4]=fgetc(COM2); buffer[3]=fgetc(COM2); buffer[2]=fgetc(COM2); buffer[1]=fgetc(COM2); buffer[5]=fgetc(COM2); } delay_ms(50); ////////////////////////////////////////////////// ANT Relay Set Section flag=buffer[0]; //Set I-O port for ant relay work1=read_eeprom(flag); flag=shift_right(&work1,1,0); output_bit(PIN_C0,!flag); //RX1 ON flag=shift_right(&work1,1,0); output_bit(PIN_C1,!flag); //RX2 ON flag=shift_right(&work1,1,0); output_bit(PIN_C2,!flag); //RX3 ON flag=shift_right(&work1,1,0); output_bit(PIN_C3,!flag); //RX4 ON flag=shift_right(&work1,1,0); output_bit(PIN_B3,!flag); //RX5 ON ////////////////////////////////////////////////// Display frequency frequency=20.97152*buffer[4]; frequency=0.08192*buffer[3]+frequency; frequency=0.00032*buffer[2]+frequency; frequency=0.00000125*buffer[1]+frequency+0.0001; lcd_cmd(0x80); //set DDRAM address to Top position printf(lcd_data,"Freq.= %3.3fMHz ",frequency); ////////////////////////////////////////////////// Change FT100 Mode to FT847 Mode flag=buffer[5]; if(flag == 6 ) buffer[5]=8; //Convert to FT847 mode code. buffer[5] define mode (ssb cw fm) if(flag == 7 ) buffer[5]=8; ////////////////////////////////////////////////// Send freqency & mode to personal computer by FT847 mode longwork1=frequency*1000; buffer[1]=longwork1/10000; longwork2=buffer[1]; longwork1=longwork1-longwork2*10000; buffer[2]=longwork1/100; longwork2=buffer[2]; buffer[3]=longwork1-longwork2*100; work1=buffer[1]; work2=work1 /10; work1=work1-work2 *10; buffer[1]=work2 *16+work1; work1=buffer[2]; work2=work1 /10; work1=work1-work2 *10; buffer[2]=work2 *16+work1; work1=buffer[3]; work2=work1 /10; work1=work1-work2 *10; buffer[3]=work2 *16+work1; buffer[4]=0; //Edit buffer work1=buffer[5]; buffer[5]=work1 & 0x0f; fputc(buffer[1],COM1); fputc(buffer[2],COM1); fputc(buffer[3],COM1); fputc(buffer[4],COM1); fputc(buffer[5],COM1); } } void print4(){ int flag; for(flag=0;flag<5;flag++){ fputc(*ptr,COM1); ptr++; } } void pdata(int flag){ //output band data to COM1 int work1; int work2; work1=bandcode[flag]; work2=read_eeprom(work1); shift_left(&work2,1,0); shift_left(&work2,1,0); shift_left(&work2,1,0); flag=shift_left(&work2,1,0); if(flag==TRUE) fputc('1',COM1); else fputc('0',COM1); flag=shift_left(&work2,1,0); if(flag==TRUE) fputc('1',COM1); else fputc('0',COM1); flag=shift_left(&work2,1,0); if(flag==TRUE) fputc('1',COM1); else fputc('0',COM1); flag=shift_left(&work2,1,0); if(flag==TRUE) fputc('1',COM1); else fputc('0',COM1); flag=shift_left(&work2,1,0); if(flag==TRUE) fputc('1',COM1); else fputc('0',COM1); fputs("",COM1); } void wdata(int flag){ //write band data to EEROM int work1; int work2; work1=bandcode[flag]; work2=0; if(buffer[4]=='1') shift_right(&work2,1,1); //LSB bit data else shift_right(&work2,1,0); if(buffer[3]=='1') shift_right(&work2,1,1); else shift_right(&work2,1,0); if(buffer[2]=='1') shift_right(&work2,1,1); else shift_right(&work2,1,0); if(buffer[1]=='1') shift_right(&work2,1,1); else shift_right(&work2,1,0); if(buffer[0]=='1') shift_right(&work2,1,1); else shift_right(&work2,1,0); shift_right(&work2,1,0); shift_right(&work2,1,0); shift_right(&work2,1,0); //USB bit data write_eeprom(work1,work2); fprintf(COM1," wrote "); pdata(flag); }