Add Support SDR Receiver and improve ATT

This commit is contained in:
phdlee 2018-04-07 21:32:01 +09:00
parent 23f1b7cd5c
commit 689cfda09e
3 changed files with 99 additions and 11 deletions

View File

@ -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;

View File

@ -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)
{

View File

@ -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 :