From 689cfda09e064752950519dd1a95bc55cd7a260c Mon Sep 17 00:00:00 2001 From: phdlee Date: Sat, 7 Apr 2018 21:32:01 +0900 Subject: [PATCH] Add Support SDR Receiver and improve ATT --- ubitx_20/cat_libs.ino | 36 ++++++++++++++++++++++++ ubitx_20/ubitx_20.ino | 61 +++++++++++++++++++++++++++++++++++------ ubitx_20/ubitx_menu.ino | 13 +++++++-- 3 files changed, 99 insertions(+), 11 deletions(-) diff --git a/ubitx_20/cat_libs.ino b/ubitx_20/cat_libs.ino index c9dca396..2285d526 100644 --- a/ubitx_20/cat_libs.ino +++ b/ubitx_20/cat_libs.ino @@ -611,6 +611,34 @@ void WriteEEPRom_FT817(byte fromType) Serial.write(ACK); } +const byte anlogPinIndex[6] = {A0, A1, A2, A3, A6, A7}; + +//Read ADC Value by uBITX Manager Software +void ReadADCValue(void) +{ + //ADC MAP for uBITX + int readedADCValue; + //5BYTES + //CAT_BUFF[0] [1] [2] [3] [4] //4 COMMAND + //0 READ ADDRESS + readedADCValue = analogRead(anlogPinIndex[CAT_BUFF[0]]); + CAT_BUFF[0] = readedADCValue >> 8; + CAT_BUFF[1] = readedADCValue; + SendCatData(2); + Serial.write(ACK); +} + +void SetIFSValue(void) +{ + //Set IFShift Value + isIFShift = CAT_BUFF[0]; + ifShiftValue = CAT_BUFF[1] + CAT_BUFF[2] * 256; + setFrequency(frequency); + SetCarrierFreq(); + updateLine2Buffer(1); //option, perhap not need + Serial.write(ACK); +} + //void CatRxStatus(byte fromType) void CatRxStatus(void) //for remove warning { @@ -768,6 +796,14 @@ void Check_Cat(byte fromType) WriteEEPRom_FT817(fromType); break; + case 0xDD: //Read uBITX ADC Data + ReadADCValue(); //Call by uBITX Manager Program + break; + + case 0xDE: //IF-Shift Control by CAT + SetIFSValue(); // + break; + case 0xE7 : //Read RX Status CatRxStatus(); break; diff --git a/ubitx_20/ubitx_20.ino b/ubitx_20/ubitx_20.ino index 3b674b7e..13a871d7 100644 --- a/ubitx_20/ubitx_20.ino +++ b/ubitx_20/ubitx_20.ino @@ -10,7 +10,9 @@ //#define UBITX_DISPLAY_LCD2404P //24 x 04 LCD //#define UBITX_DISPLAY_LCD2404I //I2C type 24 x 04 LCD -//#define ENABLE_FACTORYALIGN +//Compile Option +#define ENABLE_FACTORYALIGN +#define ENABLE_ADCMONITOR //Starting with Version 1.07, you can read ADC values directly from uBITX Manager. So this function is not necessary. /** @@ -145,7 +147,12 @@ int count = 0; //to generally count ticks, loops, etc #define CW_SIDETONE 24 #define CW_SPEED 28 -//AT328 has 1KBytes EEPROM +//KD8CEC EEPROM MAP +#define ADVANCED_FREQ_OPTION1 240 //Bit0: use IFTune_Value, Bit1 : use Stored enabled SDR Mode, Bit2 : dynamic sdr frequency +#define IF1_CAL 241 +#define ENABLE_SDR 242 +#define SDR_FREQUNCY 243 + #define CW_CAL 252 #define VFO_A_MODE 256 #define VFO_B_MODE 257 @@ -326,11 +333,12 @@ unsigned long dbgCount = 0; //not used now unsigned char txFilter = 0; //which of the four transmit filters are in use boolean modeCalibrate = false;//this mode of menus shows extended menus to calibrate the oscillators and choose the proper //beat frequency - + +byte advancedFreqOption1; //255 : Bit0: use IFTune_Value, Bit1 : use Stored enabled SDR Mode, Bit2 : dynamic sdr frequency byte attLevel = 0; //ATT : RF Gain Control (Receive) <-- IF1 Shift, 0 : Off, ShiftValue is attLevel * 100; attLevel 150 = 15K char if1TuneValue = 0; //0 : OFF, IF1 + if1TuneValue * 100; // + - 12500; byte sdrModeOn = 0; //SDR MODE ON / OFF -unsigned long SDR_Center_Freq = 32000000; +unsigned long SDR_Center_Freq; //DEFAULT Frequency : 32000000 unsigned long beforeIdle_ProcessTime = 0; //for check Idle time byte line2DisplayStatus = 0; //0:Clear, 1 : menu, 1: DisplayFrom Idle, @@ -501,12 +509,30 @@ void setFrequency(unsigned long f){ setTXFilters(f); unsigned long appliedCarrier = ((cwMode == 0 ? usbCarrier : cwmCarrier) + (isIFShift && (inTx == 0) ? ifShiftValue : 0)); - long if1AdjustValue = ((inTx == 0) ? (attLevel * 200) : 0) + (if1TuneValue * 50); //if1Tune RX, TX Enabled, ATT : only RX Mode + long if1AdjustValue = ((inTx == 0) ? (attLevel * 100) : 0) + (if1TuneValue * 100); //if1Tune RX, TX Enabled, ATT : only RX Mode if (sdrModeOn && (inTx == 0)) //IF SDR { - si5351bx_setfreq(2, 44999500 + if1AdjustValue + f); - si5351bx_setfreq(1, 44999500 + if1AdjustValue + SDR_Center_Freq + 2390); + //Fixed Frequency SDR (Default Frequency : 32Mhz, available change sdr Frequency by uBITX Manager) + //Dynamic Frequency is for SWL without cat + //Offset Frequency + Mhz, + //Example : Offset Frequency : 30Mhz and current Frequncy is 7.080 => 37.080Mhz + // Offset Frequency : 30Mhz and current Frequncy is 14.074 => 34.074Mhz + + //Dynamic Frequency + //if (advancedFreqOption1 & 0x04 != 0x00) + // if1AdjustValue += (f % 10000000); + + si5351bx_setfreq(2, 44991500 + if1AdjustValue + f); + si5351bx_setfreq(1, 44991500 + + if1AdjustValue + + SDR_Center_Freq + + ((advancedFreqOption1 & 0x04) == 0x00 ? 0 : (f % 10000000)) + + 2390); + /* + si5351bx_setfreq(2, 44999500 + f); + si5351bx_setfreq(1, 44999500 + SDR_Center_Freq + 2390); + */ } else { @@ -880,7 +906,7 @@ void initSettings(){ printLineF(1, F("Init EEProm...")); //initial all eeprom - for (unsigned int i = 32; i < 1024; i++) //protect Master_cal, usb_cal + for (unsigned int i = 64; i < 1024; i++) //protect Master_cal, usb_cal EEPROM.write(i, 0); //Write Firmware ID @@ -1033,6 +1059,25 @@ void initSettings(){ isIFShift = ifShiftValue != 0; } + //Advanced Freq control + EEPROM.get(ADVANCED_FREQ_OPTION1, advancedFreqOption1); + + //use Advanced Frequency Control + if (advancedFreqOption1 & 0x01 != 0x00) + { + EEPROM.get(IF1_CAL, if1TuneValue); + + //Stored Enabled SDR Mode + if (advancedFreqOption1 & 0x02 != 0x00) + { + EEPROM.get(ENABLE_SDR, sdrModeOn); + } + } + + EEPROM.get(SDR_FREQUNCY, SDR_Center_Freq); + if (SDR_Center_Freq == 0) + SDR_Center_Freq = 32000000; + //default Value (for original hardware) if (cwAdcSTFrom >= cwAdcSTTo) { diff --git a/ubitx_20/ubitx_menu.ino b/ubitx_20/ubitx_menu.ino index 07160eef..094e594d 100644 --- a/ubitx_20/ubitx_menu.ino +++ b/ubitx_20/ubitx_menu.ino @@ -290,6 +290,7 @@ void menuCHMemory(int btn, byte isMemoryToVfo){ //Analog pin monitoring with CW Key and function keys connected. //by KD8CEC +#ifdef ENABLE_ADCMONITOR void menuADCMonitor(int btn){ int adcPinA0 = 0; //A0(BLACK, EncoderA) int adcPinA1 = 0; //A1(BROWN, EncoderB) @@ -359,6 +360,7 @@ void menuADCMonitor(int btn){ menuClearExit(0); } +#endif //VFO Toggle and save VFO Information, modified by KD8CEC void menuVfoToggle(int btn) @@ -467,6 +469,7 @@ void menuSDROnOff(int btn) printLineF2(F("[ON]")); } + EEPROM.put(ENABLE_SDR, sdrModeOn); setFrequency(frequency); menuClearExit(500); } @@ -954,14 +957,14 @@ void menuATTSetup(int btn){ char needApplyChangeValue = 1; if (!btn){ - if (isIFShift == 1) + if (attLevel != 0) printLineF2(F("ATT Change?")); else printLineF2(F("ATT On?")); } else { - attLevel = getValueByKnob(5, attLevel, 0, 200, 5, "ATT", 2); //2 : (SetFrequency), targetValue, minKnobValue, maxKnobValue, stepSize + attLevel = getValueByKnob(5, attLevel, 0, 250, 5, "ATT", 2); //2 : (SetFrequency), targetValue, minKnobValue, maxKnobValue, stepSize delay_background(500, 0); //for check Long Press function key if (btnDown() || attLevel == 0) @@ -1229,7 +1232,7 @@ void doMenu(){ btnState = btnDown(); if (i > 0){ - if (modeCalibrate && select + i < 240) + if (modeCalibrate && select + i < 250) select += i; else if (!modeCalibrate && select + i < 150) select += i; @@ -1306,10 +1309,14 @@ void doMenu(){ case 21 : menuSetupKeyType(btnState); break; +#ifdef ENABLE_ADCMONITOR case 22 : menuADCMonitor(btnState); break; case 23 : +#else + case 22 : +#endif menuTxOnOff(btnState, 0x01); //TX OFF / ON break; default :