// PIC16F886 Configuration Bit Settings // 'C' source line config statements // SDR#3 // CONFIG1 #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled ) #pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled) #pragma config MCLRE = ON // RE3/MCLR pin function select bit ) #pragma config CP = OFF // Code Protection bit #pragma config CPD = OFF // Data Code Protection bit #pragma config BOREN = OFF // Brown Out Reset Selection bits (BOR disabled) #pragma config IESO = OFF // Internal External Switchover bit #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enabled bit #pragma config LVP = OFF // Low Voltage Programming Enable bit // CONFIG2 #pragma config BOR4V = BOR21V // Brown-out Reset Selection bit (Brown-out2.1V) #pragma config WRT = OFF // Flash Program Memory (Write protection off) #include #include #include #define _XTAL_FREQ 12800000 //X'tal OSC 12.8MHz #define si5351_xtal 24999242 //Si5351 X'tal Freq //#define slv_addres 0xC0 //Si5351 Addres 0b1100 000 //#define RS PORTBbits.RB2 //LCD RS端子はPB2とする //#define STB PORTBbits.RB3 //LCD STB端子はPB3とする char reg_addres, addres, data, tx_data, rs_t_data, vfo_flag, intrpt_flag; char updwn_flag, start_flag, att_flag, agc_flag, write_flag, read_flag, rcv_flag; char delaycount, breakin_flag, cwmode, fix_flag, txtorx_flag; char clk2_on, clk2_off, main_loop, t, att; int vco_div, vfo_selsw; char gate_open_flag, txon_flag, cmd, timer_loop, ptt_on; char rcv_buf[4]; long out_freq, vco_freq, freq, fix_freq, tune_freq, memo_freq; long signed offset; short long counter_H; long p1, p2, p3; //Si5351パラメーター static void interrupt isr(); //interrup void pic_init(); //PIC初期化 long get_freq(); void i2c_send(unsigned char, unsigned char); //Reg address, Data void i2c_send2(unsigned char); //MCP4018 Data void send_byte(unsigned char); void rsc_send(); //USART void idlei2c(); void si5351_init(); //si5351初期化 void si5351_clk0set(long out_freq); //Si5351_CLK0周波数設定 //void si5351_clk0set1(long out_freq); //Si5351_CLK0周波数設定 void si5351_clk1set(long out_freq); //Si5351_CLK1周波数設定 void si5351_getpara(long out_freq, long vco_freq); void si5351_setregster(long p1, long p2, long p3, char addres); void mcp4018_attset(char att); //MCP4018分圧比設定 void f_data_serial(long); void bin_to_dec(); //周波数データー2進10進変換 //===========割り込み処理=================== static void interrupt isr(void) { //RX状態からTX切り替え処理 if(INTCONbits.INTF == 1) //INT端子割り込みか? { T2CONbits.TMR2ON = 0; //TMR2 Counter stop T1CONbits.TMR1ON = 0; //TMR1 Counter stop __delay_ms(10); //Key DWNチャタリング待ち while(!TXSTAbits.TRMT); //Wait for send { TXREG = 'T'; //'T' cmand send } while(!TXSTAbits.TRMT); //Wait for send PCへコマンド送信 { TXREG = 0x0D; //'\r' cmand send } while(!TXSTAbits.TRMT); //Wait for send { TXREG = 0x0A; //'\n' cmand send } PORTCbits.RC2 = 1; //TXON LED PORTAbits.RA5 = 1; //EXT PTT H PORTAbits.RA2 = 1; //AF Mute PORTBbits.RB4 = 1; //AGC OFFリレーON timer_loop = 0; //loop_count reset txon_flag = 1; //TXON //PLL 7.936MHzに切り替え p1 = 2738; p2 = 44800; p3 = 65536; addres = 26; si5351_setregster(p1, p2, p3, addres); //Si5351_VFOB周波数設定 if ( PORTBbits.RB0 == 0) //送信中なら { ptt_on = 1; // PTT or Key Down中 } while (ptt_on < 10) //送信中 { if (cwmode == 1) //CWモードならSi5351 CLK2 ON { i2c_send(3,clk2_on); //OUT CONT reg,CLK0,2 Enable PORTAbits.RA3 = 1; //Side tone ON } else { //CWモード以外なら何もしない } if (PORTBbits.RB0 == 1) //送信断なら { ptt_on = 15; //ptt強制終了させる PORTCbits.RC2 = 0; //TXLED OFF PORTAbits.RA3 = 0; //Side tone OFF PORTAbits.RA5= 0; //EXT PTT L } intrpt_flag = 1; //RX>TX切り替え割り込みフラグセット } //TXからRXへの切り替え処理 i2c_send(3,clk2_off); //OUT CONT reg,CLK0 Enabl CLCK2 Disable txtorx_flag = 1; //受信切り替えフラグセットしMainへ戻る timer_loop = 0; //loop_count reset TMR1H = 0; //TMR1 Reset TMR1L = 0; //TMR1 Reset counter_H = 0; //counter_H Reset INTCONbits.INTF = 0; //割り込みフラグクリア } /*周波数カウンター用タイマー割り込み処理*/ if(PIR1bits.TMR2IF == 1) //TMR2 10ms interrupt then { timer_loop++; //loop count up PIR1bits.TMR2IF = 0; //Flag Clear if (timer_loop > 9) //10ms x timer_loop =100ms { timer_loop = 0; //loop_count reset T1CONbits.TMR1ON = 0; //T1 Gate close T2CONbits.TMR2ON = 0; //T2 gate close PORTCbits.RC5 = 1; __delay_ms(1); //Key DWNチャタリング待ち PORTCbits.RC5 = 0; } } if(PIR1bits.TMR1IF == 1) //TMR1 interrup then { counter_H++; //counter_H; TMR1H overfllow PIR1bits.TMR1IF = 0; //Flag Clear } /* RSC-232C 受信割り込み処理*/ if(PIR1bits.RCIF == 1) //受信割り込みか? { if((RCSTAbits.OERR ) || (RCSTAbits.FERR )) //エラー時 { RCSTA = 0; //USART無効 RCSTA = 0x90; //USART再有効化 } else //正常受信なら { rcv_flag = 1; //受信データ有フラグセット cmd = RCREG; //受信データ?をcmdとして PIR1bits.RCIF = 0; //割り込みフラグクリア //チューニングデーター処理 if ( ('0' <= cmd) && (cmd <= '9') ) //数字データーなら { rcv_buf[t] = cmd;//数字データーを格納 t++; if ( t > 2 ) //配列桁数は3桁とする { t = 0; //tをリセット tune_freq = atol(rcv_buf); //数値に変換 char rcv_buf[] = {'0'}; //Buff Clear } } } } INTCONbits.INTF = 0; //割り込みフラグクリア } //=============PICの初期化====================== void pic_init() { ANSEL = 0x00; // Analog入力無し ANSELH = 0x00; // B PORT Analog入力無し TRISA = 0x00; // RA0-5 OUTPUT TRISB = 0x01; // RB1-7:out RB0:INT TRISC = 0x99; //RC0,CountIN RC1,TXON RC3,RC4 SDA/SCL:inputRC7 UART入力 //RC2,OUT PORTB = 0x00; //PORTB All=0 PORTC = 0x00; //PORTC All=0 SSPCON = 0x28; // SSP enable & I2C Master mode, //200kbps = Fosc / (4 * (SSPADD+1)) SSPADD = 0x1F; // 0x00では動作せず /* UART初期化 割り込み設定*/ TXSTA = 0x24; //TXSTA送信モード設定 BRGH=1 RCSTA = 0x90; //RCSTA受信モード設定 BAUDCTL = 0x08; //BAUDCON 16bit設定 SPBRG = 166; //19200bps PIE1bits.TMR1IE = 1; //TMR1割り込み許可 PIE1bits.TMR2IE = 1; //TMR2割り込み許可 PIR1bits.RCIF = 0; //受信割り込みフラグクリア OPTION_REGbits.INTEDG = 0; //INT端子立ち下がり割り込み INTCONbits.INTF = 0; //外部割り込みフラグクリア PIE1bits.RCIE = 1; //USART割り込み許可 INTCONbits.INTE = 1; //外部割り込み許可 INTCONbits.PEIE = 1; //周辺許可 INTCONbits.GIE = 1; //グローバル許可 PORTA = 0b00000000; //PORTA出力 Reset /*****TMR1,2 set*********/ T1CON = 0x22; //EXT SYNC IN,T1 DIV 1/4 TMR1 OFF T2CON = 0x4A; //Post 1/10, Pre 1/16, TMR2 OFF // PR2 = 0x7C; //preset 124 PR2 = 0xC7; //preset 199 return; } //===========RSC-232 TX=========================== void rsc_send(rs_t_data) { while(!TXSTAbits.TRMT); //TX待ち { TXREG = rs_t_data; //送信実行 } } //===========I2C コマンド送信====================== void i2c_send( char reg_addres, char data) { const char slv_addres = 0xC0; //Si5351 0b1100 000_ idlei2c(); //アイドル待ち SSPCON2bits.SEN = 1; //スタート出力 while (SSPCON2bits.SEN); //スタート終了待ち send_byte(slv_addres); //Si5351 addres+マスタ送信 send_byte(reg_addres); //Si5351 Regster送信 send_byte(data); //Si5351 set data送信 SSPCON2bits.PEN = 1; //stop 出力 while (SSPCON2bits.PEN) ; //ストップ終了待ち } //===========MCP4018 I2C コマンド送信====================== void i2c_send2( char data) { const char slv_addres = 0x5E; //Si5351 0b0010 1111+R/Wbit_ idlei2c(); //アイドル待ち SSPCON2bits.SEN = 1; //スタート出力 while (SSPCON2bits.SEN); //スタート終了待ち send_byte(slv_addres); //MCP4018 addres+マスタ送信 send_byte(data); //MCP4018 set data送信 SSPCON2bits.PEN = 1; //stop 出力 while (SSPCON2bits.PEN) ; //ストップ終了待ち } /**アイドル待ちサブ関数*/ static void idlei2c(void) { while (SSPCON2bits.SEN || SSPCON2bits.PEN || SSPCON2bits.RCEN || SSPCON2bits.ACKEN || SSPSTATbits.R_nW); } //===========I2C 1Byte送信======================= static void send_byte(char tx_data) { SSPBUF = tx_data; //データーセット送信開始 while (SSPSTATbits.BF); //送信終了待ち while (SSPCON2bits.ACKSTAT); //ACK返信待ち idlei2c(); //アイドル待ち } //===========Si5351初期設定======================= void si5351_init() { i2c_send(3,0xFF); //OUT CONT Reg3,全出力OFF i2c_send(16,0x80); //CLK0 CONT Reg16,PWR DWN i2c_send(17,0x80); //CLK1 CONT Reg17,PWR DWN i2c_send(18,0x80); //CLK2 CONT Reg18,PWR DWN } //===========Si5351 パラメーター計算======================= void si5351_getpara(long out_freq, long vco_freq) { int div; //分周数 int a; //PLL freq =(a+b/c)の係数 int d; long pllfreq; //PLL周波数 long b; long c, x; long e; //(128 * (float)b / 0xFFFF )を計算 long si5351_div1000; //si5351xtal周波数を桁落とし // long P1; //Si5351パラメーター // long P2; // short long P3; div = vco_freq / out_freq; //VCOを仮設定して分周比を計算 div = div >> 1; //右へシフトして偶数化 div = div << 1; pllfreq = div * out_freq; //PLL周波数は出力周波数の偶数倍にする a = pllfreq / si5351_xtal; // // pllfreq = pllfreq / 1000; // long計算に収める為3桁丸め c = 65536; si5351_div1000 = si5351_xtal / 1000; // long計算に収める為3桁丸め x = pllfreq % si5351_xtal / 1000; // long計算に収める為3桁丸め b = x * c / si5351_div1000; vco_div = div; e = (128 * b) / c; //128*(float)b/0xFFFF /*Si5351 PLL用パラメーター計算*/ // P1 = 128 * a + (long)(128 * (float)b / 0xFFFF ) - 512; p1 = 128 * a + e - 512; // P2 = 128 * b - c * (long)(128 * (float) b / 0xFFFF); p2 = 128 * b - c * e; p3 = c; } //===========Si5351レジスター設定======================= void si5351_setregster(long p1, long p2, long p3, char addres) { i2c_send(addres, (p3 & 0x0FF00) >> 8); //MSNA_P3[15:8],P3書き込み i2c_send(addres + 1, (p3 & 0x000FF)); //MSNA_P3[7:0],P3 i2c_send(addres + 2, (p1 & 0x30000) >> 16); //MSNA_P1[17:16],P1 i2c_send(addres + 3, (p1 & 0x0FF00) >> 8); //MSNA_P1[15:8],P1 i2c_send(addres + 4, (p1 & 0x000FF)); //MSNA_P1[7:0],P1 i2c_send(addres + 5, ((p3 & 0xF0000) >> 12) | ((p2 & 0xF0000) >> 16)); ////上位4bit分 下位4bit分MSNA_P2[19:16],P2 i2c_send(addres + 6, (p2 & 0x0FF00) >> 8); //MSNA_P2[15:8],P2 i2c_send(addres + 7, (p2 & 0x000FF)); //MSNA_P2[7:0],P2 /* Si5351Aマルチシンセ分周設定レジスター P2=0 P3=1 */ /*P1-P3計算*/ // P1 = 128 * d -512; // P2 = 0; // P3 = 1; // i2c_send(addres + 16, (P3 & 0x0FF00) >> 8); //MSN0_P3[15:8],P3書き込み // i2c_send(addres + 17, (P3 & 0x000FF)); //MSN0_P3[7:0],P3 // i2c_send(addres + 18, (P1 & 0x30000) >> 16); //MSN0_P1[17:16],P1 // i2c_send(addres + 19, (P1 & 0x0FF00) >> 8); //MSN0_P1[15:8],P1 // i2c_send(addres + 20, (P1 & 0x000FF)); //MSN0_P1[7:0],P1 // i2c_send(addres + 21, ((P3 & 0xF0000) >> 12) | ((P2 & 0xF0000) >> 16)); ////上位4bit分 下位4bit分MSN0_P2[19:16],P2 // i2c_send(addres + 22, (P2 & 0x0FF00) >> 8); //MSN0_P2[15:8],P2 // i2c_send(addres + 23, (P2 & 0x000FF)); //MSN0_P2[7:0],P2 /*ここまでSi5351A周波数設定完了*/ i2c_send(177,0xA0); //PLL A b reset i2c_send(16,0x4F); //CLK0 POWER UP & 8mA i2c_send(17,0x6F); //CLK1 POWER UP & PLLB Select i2c_send(18,0x0F); //CLK2 Power up 8mA PLLA selct //i2c_send(3,0xFE); //OUT CONT reg,CLK0 Enable i2c_send(3,vfo_selsw); //OUT CONT reg,CLK0 Enable } //======Frequency Counter Function========= long get_freq(void) { long counter_M; long counter_L; timer_loop = 0; counter_H = counter_H << 16; //count_H * 0x10000 counter_M = TMR1H; //get TMR1H count counter_M = counter_M << 8; //counter_M * 0x100 counter_L = TMR1L; //get TMR1L count freq =( counter_H + counter_M + counter_L ) << 2; //4*freq TMR1H = 0; //TMR1 Reset TMR1L = 0; //TMR1 Reset counter_H = 0; //counter_H Reset return (freq); } //============周波数データの2進10進変換======= void bin_to_dec() { long convert_c; //2^0 to 2^18 int i; //2進10進変換処理 out_freq = 0; //out_freq reset for (i=0; i<20; i=i+1) //0-19bitまで2進10進変換 { if ((fix_freq & 0x01) == 1) //LSBが1判定 { if ( i<15 ){ convert_c = 0x01 << i; } //convert_c=2^0 to 2^15 if (i == 15) { convert_c = 32768; } //2^15 if (i == 16) { convert_c = 65536; } //2^16 // out_freq = out_freq + convert_c; } if (i == 17) { convert_c = 131072; } //2^17 // out_freq = out_freq + convert_c; } if (i == 18) { convert_c = 262144; } //2^18 // out_freq = out_freq + convert_c; } if (i == 19) { convert_c = 524288; } //2^19 out_freq = out_freq + convert_c; } fix_freq = fix_freq >> 1; } out_freq = out_freq * 10; //Gate Time 0.1secなので10倍にする } //===========Si5351_CLK0周波数設定======== void si5351_clk0set(long out_freq) { vco_freq = 650000000; //VCO A Freq 650MHz仮設定 addres = 26; //si5351 Start_Addres 26 si5351_getpara(out_freq, vco_freq); //Si5351_PLLAパラメーター計算 si5351_setregster(p1, p2, p3, addres); //Si5351_VFOA周波数設定 addres = 42; //シンセ0設定 p1 = 128 * vco_div - 512; p2 = 0; p3 = 1; si5351_setregster(p1, p2, p3, addres); //Si5351_シンセ0設定 } //===========Si5351_CLK1周波数設定======== void si5351_clk1set(long out_freq) { vco_freq = 800000000; //VCO B Freq 800MHz仮設定 addres = 34; //VFO B Start_Addres 34 si5351_getpara(out_freq, vco_freq); //Si5351_PLLBパラメーター計算 si5351_setregster(p1, p2, p3, addres); //Si5351_VFOB周波数設定 addres = 50; //シンセ1設定 p1 = 128 * vco_div - 512; p2 = 0; p3 = 1; si5351_setregster(p1, p2, p3, addres); //Si5351_シンセ1設定 PORTAbits.RA2 = 1 ; //周波数変更時AFミュート __delay_ms(250); PORTAbits.RA2 = 0; //ミュート解除     } //===========MCP4018分圧比設定======== void mcp4018_attset(char att) { i2c_send2(att); //中点タップ設定 PORTBbits.RB5 = 1; //ATTリレー制御 if(agc_flag == 0) //AGC OFFなら { PORTBbits.RB4 = 1; //AGC OFF制御 } else //RF AGC ONなら { PORTBbits.RB4 = 0; //RF AGC有効 } } //==============MAIN====================== void main() { long T0_freq = 0; long T1_freq; long delta_freq; int meas_loop; vfo_selsw = 0xFE; //Si5351reg3設定 CLK0 Enable clk2_on = 0xFA; clk2_off = 0xFE; pic_init(); //PIC初期設定 si5351_init(); //Si5351初期設定 // out_freq = 7960000; //VFO A OUT 7.960MHz p1 = 2748; //VCO A 7.96MHzパラメーター設定 p2 = 33664; p3 = 65536; addres = 26; //si5351 Start_Addres 26 // si5351_getpara(out_freq, vco_freq); //Si5351_PLLAパラメーター計算 si5351_setregster(p1, p2, p3, addres); //Si5351_VFOA周波数設定 addres = 42; //シンセ0設定 p1 = 9728; //128*vco_div - 512 p2 = 0; //e=0 f=1とする p3 = 1; si5351_setregster(p1, p2, p3, addres); //Si5351_シンセ0設定 */ /* out_freq = 5400000; //VFO B OUT 5.4MHz vco_freq = 800000000; //VCO B Freq 800MHz仮設定 addres = 34; //VFO B Start_Addres 34 si5351_getpara(out_freq, vco_freq); //Si5351_PLLBパラメーター計算 // p1 = 3524; // p2 = 50304; // p3 = 65536; si5351_setregster(p1, p2, p3, addres); //Si5351_VFOB周波数設定 addres = 50; //シンセ1設定 p1 = 128 * vco_div - 512; p2 = 0; p3 = 1; si5351_setregster(p1, p2, p3, addres); //Si5351_シンセ1設定 */ addres = 58; //シンセ2設定 Fout 1.966.000MHz p1 = 40823; p2 = 896; p3 = 65536; si5351_setregster(p1, p2, p3, addres); //Si5351_シンセ2設定 timer_loop = 0; intrpt_flag = 0; //割り込みフラグリセット meas_loop = 0; //Freq Meas回数Reset delta_freq = 0; //周波数ドリフト リセット main_loop = 0; //割り込み後の測定ループ回数リセット offset = 0; //LCD周波数表示OFFSET 0kHzとする fix_flag = 0; //si5351動作フラグリセット vfo_flag = 1; //VFO選択flag初期セット txon_flag = 0; //txon_flag初期化 受信時 //カウンタースタート T2CONbits.TMR2ON = 1; //TMR2 Counter start T1CONbits.TMR1ON = 1; //TMR1 Counter start //MCP4018 初期設定 i2c_send2(0x0F); //中点タップ15相当 while(1) { if (txtorx_flag == 1) //TX割り込み処理から受信にもどす { // out_freq = 7960000; CLK0を受信周波数に切り替え p1 = 2748; p2 = 33664; p3 = 65536; addres = 26; si5351_setregster(p1, p2, p3, addres); //Si5351_VFOB周波数設定 // __delay_ms(5); //Key DWNチャタリング待ち 2022.11.15 txon_flag = 0; //TXOFF while(!TXSTAbits.TRMT); //Wait for send PC^コマンド送信 { TXREG = 'R'; //'R' cmand send } while(!TXSTAbits.TRMT); //Wait for send { TXREG = 0x0D; //'\r' cmand send } while(!TXSTAbits.TRMT); //Wait for send { TXREG = 0x0A; //'\n' cmand send } PORTAbits.RA2 = 0 ; //AFミュートOFF if ((att_flag == 1) && (agc_flag == 0)){ PORTBbits.RB4 = 1; //AGC OFF継続 } else { PORTBbits.RB4 = 0; //AGC OFF解除 } intrpt_flag = 2; //TX>RX割り込みフラグセット txon_flag = 0; //TXOFF txtorx_flag = 0; T2CONbits.TMR2ON = 1; //TMR2 Counter start T1CONbits.TMR1ON = 1; //TMR1 Counter start } if(T2CONbits.TMR2ON == 0) //TMR2 Gate close then { // PORTCbits.RC5 = 1; // __delay_ms(5); // PORTCbits.RC5 = 0; freq = get_freq(); //T0時のfreq data取得 fix_freq = freq; //VFO Fix周波数 T1_freq = freq + offset; //offset +/-1.5kHz or 700Hz or 0kHz delta_freq = delta_freq + (T1_freq - T0_freq); //Fドリフト加算 if ((delta_freq > 2) | (delta_freq < -2) | start_flag == 1) //Fドリフト+/-20Hz以上なら { if (!(updwn_flag == 1) || (txtorx_flag = 0)) { INTCONbits.INTE = 0; //外部割り込み禁止 f_data_serial(T1_freq); // Freq_data to serial data function INTCONbits.INTE = 1; //外部割り込み許可 } delta_freq = 0; //Fドリフト分リセット meas_loop = 0; //RS-232送信回数リセット } if (start_flag == 1) { start_flag = 0; } T0_freq = T1_freq; //T1時FreqをT0時Freqと置き換え // intrpt_flag = 0; //割り込み発生フラグリセット /* RSC-232C 受信コマンド処理 2021.9.29 */ if(rcv_flag == 1) //受信割り込みcmd有なら { switch(cmd) //受信cmdの判定 { case 't': //PC>PIC TX CMD受信 PORTCbits.RC2 = 1; //TX LED ON PORTAbits.RA5= 1; //EXT PTT H break; case 'r': //PC>PIC RX CMD受信 PORTCbits.RC2 = 0; //TX LED OFF PORTAbits.RA5= 0; //EXT PTT L break; case 'm': //7.195メモリーCH選択 out_freq = 5229000; //VFO B 7.195MHz si5351_clk1set(out_freq); //Si5351 CLK1周波数設定 break; case 'n': //7.025メモリーCH選択 out_freq = 5059000; //VFO B 7.025MHz si5351_clk1set(out_freq); //Si5351 CLK1周波数設定 break; //VFO to Si5351切り替えコマンド受信 case 'F': //si5351 コマンド // fix_flag = 1; //VFO>Si5351切り替えフラグセット // vfo_flag = 0; vfo_selsw = 0xFC; //Si5351reg3設定 CLK0,1 Enable clk2_on = 0xF8; //Si5351reg3設定 CLK0,1,2 Enable clk2_off = 0xFC; //Si5351reg3設定 CLK0,1 Enable //Si5351に切り替え bin_to_dec(); //Si5351用に周波数変換 si5351_clk1set(out_freq); //Si5351 CLK1周波数設定 i2c_send(3,vfo_selsw); //OUT CONT reg,CLK0,1 Enable PORTAbits.RA4 = 1; //VFO EXT選択リレーON break; //Si5351 to VFO切り替えコマンド受信 case 'V': //VFO Fixコマンド //vfo_flag = 1; //Si5351>VFO切り替えフラグセット //fix_flag = 0; vfo_selsw = 0xFE; //Si5351reg3設定 CLK0 Enable CLK1 Disable clk2_on = 0xFA; //Si5351reg3設定 CLK0,2 Enable clk2_off = 0xFE; //Si5351reg3設定 CLK0 Enable PORTAbits.RA4 = 0; //VFO EXT選択リレーOFF i2c_send(3,vfo_selsw); //OUT CONT reg,CLK1 Disable break; //FT-301 TX IFのINT/EXT切り替え処理 case 'I': //TX IF INT選択時 // ext_flag = 0; //TX IF 内部 PORTCbits.RC1 = 0; //TX IF INT break; case 'E': //TX IF EXT選択時 // ext_flag = 1; //TX IF 外部 PORTCbits.RC1 = 1; //TX IF EXT break; case 'S': //PC側 STARTボタン TXSTA = 0x24; //TXSTA送信許可設定 TXEN=1 BRGH=1 start_flag = 1; //PC側 SDR START break; //START停止の処理 case 'Z': //停止 TXSTA = 0x04; //TXSTA送信禁止設定 TXEN=0 BRGH=1 break; //TX MODE切り替え処理 case 'c': //CW Mode時 cwmode = 1; //cw時 PORTAbits.RA0 = 1; //CW時リレー制御 // PORTAbits.RA0 = 0; //CW時リレー制御 break; case 'o': //CW以外のモード時 cwmode = 0; PORTAbits.RA0 = 0 ; //cw以外でもATTリレーON break; //メモリーCHに書き込み処理 case 'w': //メモリーへのライト動作 // write_flag = 1; //書き込みフラグセット memo_freq = T1_freq; //現在の周波数をメモ break; //メモリーCHからの読み出し処理 case 'R': //メモリーからリード動作 // read_flag = 1; //読み出しフラグセット fix_freq = memo_freq; bin_to_dec(); //Si5351用に周波数変換 si5351_clk1set(out_freq); //Si5351 CLK1周波数設定 /* vco_freq = 800000000; //VCO B Freq 800MHz仮設定 addres = 34; //VFO B Start_Addres 34 si5351_getpara(out_freq, vco_freq); //Si5351_PLLBパラメーター計算 si5351_setregster(p1, p2, p3, addres); //Si5351_VFOB周波数設定 addres = 50; //シンセ1設定 p1 = 128 * vco_div - 512; p2 = 0; p3 = 1; si5351_setregster(p1, p2, p3, addres); //Si5351_シンセ1設定 PORTAbits.RA2 = 1 ; //周波数変更時AFミュート __delay_ms(250); PORTAbits.RA2 = 0; //ミュート解除 */ // read_flag = 0; //flag reset break; //MCP4018分圧比設定コマンド処理 case 'a': //RF ATT -6db処理 att_flag = 1; //att選択フラグセット att = 0x2B; //中点タップ-6db相当 mcp4018_attset(att); break; case 'b': //RF ATT -12db処理 att_flag = 1; //att選択フラグセット att = 0x4C; //中点タップ-6db相当 mcp4018_attset(att); break; case 'e': //ATT OFF処理 att_flag = 0; //att選択フラグクリアー i2c_send2(0x00); //中点タップ-0db相当 if(agc_flag == 0) //AGC OFFなら { PORTBbits.RB5 = 0; //ATTリレー制御 PORTBbits.RB4 = 1; //AGC OFF制御 } else //RF AGC ONなら { PORTBbits.RB5 = 1; //ATTリレー制御 } break; case 'g': //RF AGC 選択処理 agc_flag = 1; //agcフラグセット PORTBbits.RB4 = 0; //AGC OFFリレー解除 PORTBbits.RB5 = 1; //AGC回路ON // PORTBbits.RB6 = 0; //AGC Fast off // PORTBbits.RB7 = 1; //AGC Long On break; case 'd': //AGC OFF選択処理 agc_flag = 0; //agcフラグクリア PORTBbits.RB4 = 1; //AGC OFFリレーON if (att_flag == 0) //attがoffなら { PORTBbits.RB5 = 0; //AGC,ATT回路スル? } else //attがonなら { PORTBbits.RB5 = 1; //AGC,ATT回路有効 } break; case 'h': //BPF N/Wide選択処理 PORTBbits.RB3 = 1; //BPF Narrow選択 break; case 'i': //BPF N/Wide選択処理 PORTBbits.RB3 = 0; //BPF wide選択 break; case 'j': //Pre AMP ON/OFF選択処理 PORTBbits.RB2 = 1; //Pre AMP ON選択 break; case 'k': //Pre AMP ON/OFF選択処理 PORTBbits.RB2 = 0; //Pre AMP OFF選択 break; default: break; } //ここまでswitch{}処理 cmd = 'z'; //コマンドクリア rcv_flag = 0; //rcv_flagクリアー //チューニング座標データー処理 if (tune_freq > 0) //tune必要なら { switch(tune_freq) { case 128: //127基準として out_freq = out_freq - 20; //20Hz UP break; case 126: out_freq = out_freq + 20; //20Hz DWN break; default: break; } if (tune_freq > 128) //-24kHzの座標は127とする { tune_freq = (tune_freq - 127) * 63; //座標1ピクセル=63Hz out_freq = out_freq + tune_freq; } else if (tune_freq < 126) { tune_freq = (127 - tune_freq) * 63; //座標1ピクセル=63Hz out_freq = out_freq - tune_freq; } //Si5351周波数設定 PORTAbits.RA2 = 1 ; //周波数変更時AFミュート i2c_send(3,0xFE); //OUT CONT CLK1 Disable vco_freq = 800000000; //VCO B Freq 800MHz仮設定 addres = 34; //VFO B Start_Addres 34 si5351_getpara(out_freq, vco_freq); //Si5351_PLLBパラメーター計算 si5351_setregster(p1, p2, p3, addres); //Si5351_VFOB周波数設定 addres = 50; //シンセ1設定 p1 = 128 * vco_div - 512; p2 = 0; p3 = 1; si5351_setregster(p1, p2, p3, addres); //Si5351_シンセ1設定 PORTAbits.RA2 = 1 ; //周波数変更時AFミュート __delay_ms(250); PORTAbits.RA2 = 0; //ミュート解除 tune_freq = 0; //tune freq clear } // rcv_flag = 0; //rcv_flagクリアー //ここまでtune処理 meas_loop = meas_loop + 1; //meas_loop カウントアップ if (meas_loop > 5) //10回ループカウントしたら { meas_loop = 0; //meas_loop reset } updwn_flag = 0; } if ((intrpt_flag == 2) | (updwn_flag == 1)) { main_loop = main_loop + 1; } if (main_loop > 5) { intrpt_flag = 0; main_loop = 0; // updwn_flag = 0; } T2CONbits.TMR2ON = 1; //TMR2 Counter start T1CONbits.TMR1ON = 1; //TMR1 Counter start } } // return; } //=======Frequency Data to Serial======== void f_data_serial(long freq) { // freq = 1249982 - freq; //VFO周波数を7MHzに補正値(-18)を減算し変換 freq = freq + 196600; //VFO周波数+2nd LO if (intrpt_flag == 0) //正常データーなら処理開始 { char loop_count; //buf read counter char *ptr; //pointer char freq_buf[11] = {0}; //make Buf char serial_buf[13] = {0};//make Buf ltoa (freq_buf,freq,10); //freq_data to ASCII // ltoa (freq_buf,fix_freq,10); //freq_data to ASCII serial_buf[0] = freq_buf[0]; //Insert '.' to freq_date ex 712345 >7.123.45 serial_buf[2] = freq_buf[1]; serial_buf[3] = freq_buf[2]; serial_buf[4] = freq_buf[3]; serial_buf[6] = freq_buf[4]; serial_buf[7] = freq_buf[5]; serial_buf[1] = 0x2E; //. serial_buf[5] = 0x2E; //. serial_buf[8] = 0x4D; //M serial_buf[9] = 0x48; //H serial_buf[10] = 0x7A; //z serial_buf[11] = 0x0D; //改行 serial_buf[12] = 0x0A; //改行 ptr = &serial_buf[0]; //ポインターにアドレスset[] // rs_t_data = *ptr; //Buff[0]set // INTCONbits.INTE = 0; //外部割り込み禁止 for (loop_count = 0; loop_count < 14; loop_count++) //buf[0]-buf[12]読み出し { rs_t_data = *ptr; //Buff[0]set if (txon_flag == 0) //RX時なら { rsc_send(rs_t_data); //rs_t_data transmit by RSC-232 } // lcd_data(rs_t_data); //LCD表示 rs_t_data = *ptr++; //freq_buff adress up } // INTCONbits.INTE = 1; //外部割り込み許可 } }