diff --git a/ubitx_20/cw_autokey.ino b/ubitx_20/cw_autokey.ino index c9dba8b..93fc748 100644 --- a/ubitx_20/cw_autokey.ino +++ b/ubitx_20/cw_autokey.ino @@ -297,7 +297,7 @@ void controlAutoCW(){ displayScrolStep = 0; } - printLineFromEEPRom(0, 2, cwStartIndex + displayScrolStep + CW_DATA_OFSTADJ, cwEndIndex + CW_DATA_OFSTADJ); + printLineFromEEPRom(0, 2, cwStartIndex + displayScrolStep + CW_DATA_OFSTADJ, cwEndIndex + CW_DATA_OFSTADJ, 0); byte diplayAutoCWLine = 0; if ((displayOption1 & 0x01) == 0x01) diff --git a/ubitx_20/ubitx.h b/ubitx_20/ubitx.h new file mode 100644 index 0000000..0729320 --- /dev/null +++ b/ubitx_20/ubitx.h @@ -0,0 +1,79 @@ +/************************************************************************* + header file for C++ by KD8CEC +----------------------------------------------------------------------------- + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +**************************************************************************/ +#define WSPR_COUNT 443 //WSPR_MESSAGE_COUNT +#define WSPR_MESSAGE1 444 // +#define WSPR_MESSAGE2 490 // +#define WSPR_MESSAGE3 536 // +#define WSPR_MESSAGE4 582 // + +#define WSPR_BAND_COUNT 3 + +#define TX_SSB 0 +#define TX_CW 1 + + +extern void printLine1(const char *c); +extern void printLine2(const char *c); +extern void printLineF(char linenmbr, const __FlashStringHelper *c); +extern void printLineFromEEPRom(char linenmbr, char lcdColumn, byte eepromStartIndex, byte eepromEndIndex, char offsetType); +extern byte delay_background(unsigned delayTime, byte fromType); +extern int btnDown(void); +extern char c[30]; +extern char b[30]; + +extern unsigned long frequency; + +#define printLineF1(x) (printLineF(1, x)) +#define printLineF2(x) (printLineF(0, x)) + + +/** + * The second set of 16 pins on the Raduino's bottom connector are have the three clock outputs and the digital lines to control the rig. + * This assignment is as follows : + * Pin 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + * GND +5V CLK0 GND GND CLK1 GND GND CLK2 GND D2 D3 D4 D5 D6 D7 + * These too are flexible with what you may do with them, for the Raduino, we use them to : + * - TX_RX line : Switches between Transmit and Receive after sensing the PTT or the morse keyer + * - CW_KEY line : turns on the carrier for CW + */ + +#define TX_RX (7) +#define CW_TONE (6) +#define TX_LPF_A (5) +#define TX_LPF_B (4) +#define TX_LPF_C (3) +#define CW_KEY (2) + +//we directly generate the CW by programmin the Si5351 to the cw tx frequency, hence, both are different modes +//these are the parameter passed to startTx +#define TX_SSB 0 +#define TX_CW 1 + +extern void si5351bx_init(void); +extern void si5351bx_setfreq(uint8_t clknum, uint32_t fout); +extern void si5351_set_calibration(int32_t cal); +extern void initOscillators(void); +extern void Set_WSPR_Param(void); +extern void TXSubFreq(unsigned long P2); + +extern void startTx(byte txMode, byte isDisplayUpdate); +extern void stopTx(void); + +extern void SendWSPRManage(void); +extern byte WsprMSGCount; + + diff --git a/ubitx_20/ubitx_20.ino b/ubitx_20/ubitx_20.ino index 2beacab..48d2746 100644 --- a/ubitx_20/ubitx_20.ino +++ b/ubitx_20/ubitx_20.ino @@ -38,6 +38,7 @@ */ #include #include +#include "ubitx.h" /** The main chip which generates upto three oscillators of various frequencies in the @@ -589,7 +590,7 @@ void startTx(byte txMode, byte isDisplayUpdate){ updateDisplay(); } -void stopTx(){ +void stopTx(void){ inTx = 0; digitalWrite(TX_RX, 0); //turn off the tx @@ -1109,7 +1110,8 @@ void setup() //Serial.begin(9600); lcd.begin(16, 2); - printLineF(1, F("CECBT v1.04")); + //printLineF(1, F("CECBT v1.05")); + printLineF(1, F("CE v1.05_W")); Init_Cat(38400, SERIAL_8N1); initMeter(); //not used in this build @@ -1117,7 +1119,7 @@ void setup() if (userCallsignLength > 0 && ((userCallsignLength & 0x80) == 0x80)) { userCallsignLength = userCallsignLength & 0x7F; - printLineFromEEPRom(0, 0, 0, userCallsignLength -1); //eeprom to lcd use offset (USER_CALLSIGN_DAT) + printLineFromEEPRom(0, 0, 0, userCallsignLength -1, 0); //eeprom to lcd use offset (USER_CALLSIGN_DAT) delay(500); } else { diff --git a/ubitx_20/ubitx_idle.ino b/ubitx_20/ubitx_idle.ino index 663a291..87aa25e 100644 --- a/ubitx_20/ubitx_idle.ino +++ b/ubitx_20/ubitx_idle.ino @@ -32,14 +32,6 @@ void updateLine2Buffer(char isDirectCall) if (ritOn) { strcpy(line2Buffer, "RitTX:"); - /* - line2Buffer[0] = 'R'; - line2Buffer[1] = 'i'; - line2Buffer[2] = 't'; - line2Buffer[3] = 'T'; - line2Buffer[4] = 'X'; - line2Buffer[5] = ':'; - */ //display frequency tmpFreq = ritTxFrequency; diff --git a/ubitx_20/ubitx_menu.ino b/ubitx_20/ubitx_menu.ino index c531305..0f678ca 100644 --- a/ubitx_20/ubitx_menu.ino +++ b/ubitx_20/ubitx_menu.ino @@ -10,8 +10,7 @@ * - If the menu item is clicked on, then it is selected, * - If the menu item is NOT clicked on, then the menu's prompt is to be displayed */ -#define printLineF1(x) (printLineF(1, x)) -#define printLineF2(x) (printLineF(0, x)) +#include "ubitx.h" //Current Frequency and mode to active VFO by KD8CEC void FrequencyToVFO(byte isSaveFreq) @@ -64,11 +63,13 @@ void menuBand(int btn){ btnPressCount = 0; if (tuneTXType > 0) { //Just toggle 0 <-> 2, if tuneTXType is 100, 100 -> 0 -> 2 tuneTXType = 0; - printLineF2(F("General mode")); + //printLineF2(F("General mode")); + printLineF2(F("General")); } else { tuneTXType = 2; - printLineF2(F("Ham band mode")); + //printLineF2(F("Ham band mode")); + printLineF2(F("Ham band")); } delay_background(1000, 0); printLine2ClearAndUpdate(); @@ -179,7 +180,7 @@ void menuIFSSetup(int btn){ if (isIFShift == 1) printLineF2(F("IF Shift Change?")); else - printLineF2(F("IF Shift:Off, On?")); + printLineF2(F("IF Shift On?")); } else { isIFShift = 1; @@ -219,9 +220,11 @@ void menuIFSSetup(int btn){ if (btnDown() || ifShiftValue == 0) { isIFShift = 0; - printLineF2(F("IF Shift is OFF")); + //printLineF2(F("IF Shift is OFF")); + //printLineF2(F("OFF")); + //clearLine2(); setFrequency(frequency); - delay_background(1500, 0); + //delay_background(1500, 0); } //menuOn = 0; @@ -339,7 +342,8 @@ void menuCHMemory(int btn, byte isMemoryToVfo){ if (selectChannel >= 20 || selectChannel <=-1) { - strcpy(c, "Exit setup?"); + //strcpy(c, "Exit setup?"); + strcpy(c, "Exit?"); } else { @@ -603,9 +607,9 @@ void menuVfoToggle(int btn) void menuRitToggle(int btn){ if (!btn){ if (ritOn == 1) - printLineF2(F("RIT:On, Off?")); + printLineF2(F("RIT Off?")); else - printLineF2(F("RIT:Off, On?")); + printLineF2(F("RIT On?")); } else { if (ritOn == 0){ @@ -633,20 +637,21 @@ void menuSplitOnOff(int btn){ else { if (splitOn == 1){ splitOn = 0; - printLineF2(F("Split Off!")); + //printLineF2(F("Split Off!")); + printLineF2(F("[OFF]")); } else { splitOn = 1; if (ritOn == 1) ritOn = 0; - printLineF2(F("Split On!")); + //printLineF2(F("Split On!")); + printLineF2(F("[ON]")); } menuClearExit(500); } } - //Function to disbled transmission //by KD8CEC void menuTxOnOff(int btn, byte optionType){ @@ -756,23 +761,29 @@ void menuCWSpeed(int btn){ menuClearExit(1000); } +void displayEmptyData(void){ + printLineF2(F("Empty data")); + delay_background(2000, 0); +} + + //Builtin CW Keyer Logic by KD8CEC void menuCWAutoKey(int btn){ if (!btn){ - printLineF2(F("CW AutoKey Mode?")); - return; + printLineF2(F("Memory Keyer")); + return; } //Check CW_AUTO_MAGIC_KEY and CW Text Count EEPROM.get(CW_AUTO_COUNT, cwAutoTextCount); if (EEPROM.read(CW_AUTO_MAGIC_KEY) != 0x73 || cwAutoTextCount < 1) { - printLineF2(F("Empty CW data")); - delay_background(2000, 0); + displayEmptyData(); return; } - printLineF1(F("Press PTT to Send")); + //printLineF1(F("Press PTT to Send")); + printLineF1(F("PTT to Send")); delay_background(500, 0); updateDisplay(); beforeCWTextIndex = 255; //255 value is for start check @@ -780,6 +791,27 @@ void menuCWAutoKey(int btn){ menuOn = 0; } +//Standalone WSPR Beacone +void menuWSPRSend(int btn){ + if (!btn){ + printLineF2(F("WSPR Beacon")); + return; + } + + WsprMSGCount = EEPROM.read(WSPR_COUNT); + + if (WsprMSGCount < 1) + { + displayEmptyData(); + return; + } + + SendWSPRManage(); + menuClearExit(1000); +} + + + //Modified by KD8CEC void menuSetupCwDelay(int btn){ int knob = 0; @@ -836,12 +868,6 @@ void menuSetupTXCWInterval(int btn){ } printLineF1(F("Press, set Delay")); - /* - strcpy(b, "Start Delay:"); - itoa(tmpTXCWInterval,c, 10); - strcat(b, c); - printLine2(b); - */ delay_background(300, 0); while(!btnDown()){ @@ -1261,8 +1287,6 @@ void doMenu(){ while (!btnDown()) { - //Check_Cat(0); //To prevent disconnections - //delay(50); //debounce delay_background(50, 0); if (isNeedDisplay) { @@ -1307,42 +1331,87 @@ void doMenu(){ btnState = btnDown(); if (i > 0){ - if (modeCalibrate && select + i < 220) + if (modeCalibrate && select + i < 240) select += i; - if (!modeCalibrate && select + i < 120) + if (!modeCalibrate && select + i < 130) select += i; } - //if (i < 0 && select - i >= 0) + if (i < 0 && select - i >= -10) select += i; //caught ya, i is already -ve here, so you add it - if (select < -5) - menuExit(btnState); - else if (select < 10) - menuBand(btnState); - else if (select < 20) - menuVfoToggle(btnState); - else if (select < 30) - menuSelectMode(btnState); - else if (select < 40) - menuRitToggle(btnState); - else if (select < 50) - menuIFSSetup(btnState); - else if (select < 60) - menuCWSpeed(btnState); - else if (select < 70) - menuSplitOnOff(btnState); //SplitOn / off - else if (select < 80) - menuCHMemory(btnState, 0); //VFO to Memroy - else if (select < 90) - menuCHMemory(btnState, 1); //Memory to VFO - else if (select < 100) - menuCWAutoKey(btnState); - else if (select < 110) - menuSetup(btnState); - else if (select < 120) - menuExit(btnState); - + //if -> switch reduce program memory 200byte + switch (select / 10) + { + case 0 : + menuBand(btnState); + break; + case 1 : + menuVfoToggle(btnState); + break; + case 2 : + menuSelectMode(btnState); + break; + case 3 : + menuRitToggle(btnState); + break; + case 4 : + menuIFSSetup(btnState); + break; + case 5 : + menuCWSpeed(btnState); + break; + case 6 : + menuSplitOnOff(btnState); //SplitOn / off + break; + case 7 : + menuCHMemory(btnState, 0); //VFO to Memroy + break; + case 8 : + menuCHMemory(btnState, 1); //Memory to VFO + break; + case 9 : + menuCWAutoKey(btnState); + break; + case 10 : + menuWSPRSend(btnState); + break; + case 11 : + menuSetup(btnState); + break; + case 12 : + menuExit(btnState); + break; + case 13 : + menuSetupCalibration(btnState); //crystal + break; + case 14 : + menuSetupCarrier(btnState); //lsb + break; + case 15 : + menuSetupCWCarrier(btnState); //lsb + break; + case 16 : + menuSetupCwTone(btnState); + break; + case 17 : + menuSetupCwDelay(btnState); + break; + case 18 : + menuSetupTXCWInterval(btnState); + break; + case 19 : + menuSetupKeyType(btnState); + break; + case 20 : + menuADCMonitor(btnState); + break; + case 21 : + menuTxOnOff(btnState, 0x01); //TX OFF / ON + break; + default : + menuExit(btnState); break; + } /* else if (select < 130 && modeCalibrate) menuSetupCalibration(btnState); //crystal @@ -1366,30 +1435,6 @@ void doMenu(){ menuExit(btnState); */ - else if (modeCalibrate) - { - if (select < 130) - menuSetupCalibration(btnState); //crystal - else if (select < 140) - menuSetupCarrier(btnState); //lsb - else if (select < 150) - menuSetupCWCarrier(btnState); //lsb - else if (select < 160) - menuSetupCwTone(btnState); - else if (select < 170) - menuSetupCwDelay(btnState); - else if (select < 180) - menuSetupTXCWInterval(btnState); - else if (select < 190) - menuSetupKeyType(btnState); - else if (select < 200) - menuADCMonitor(btnState); - else if (select < 210) - menuTxOnOff(btnState, 0x01); //TX OFF / ON - else if (select < 220) - menuExit(btnState); - } - Check_Cat(0); //To prevent disconnections } diff --git a/ubitx_20/ubitx_si5351.ino b/ubitx_20/ubitx_si5351.ino index 6d16af2..8a1cb56 100644 --- a/ubitx_20/ubitx_si5351.ino +++ b/ubitx_20/ubitx_si5351.ino @@ -1,3 +1,19 @@ +/************************************************************************************ + * KD8CEC + * kd8cec@gmail.com http://www.hamskey.com + * + * Merge two SI5351 Librarys + * KE7ER's fixed vco and variable Clocks Configure values + * G3ZIL's fixed Clock Configure Value and variable VCO + * * I have combined the two libraries above. All licenses follow the above library. + * + * PLL-A is generated by fixing 850Mhz clock. All output clocks use PLL-A to + * generate the frequency. This is the method used in QRP radios such as uBITX. + * When switching to WSPR transmission mode, PLL-B operates for the base frequency to transmit WSPR. + * The output clock channel that controls the frequency is connected to the PLL-B. + * The WSPR protocol is generated by changing the clock of the PLL-B. + ************************************************************************************/ + // ************* SI5315 routines - tks Jerry Gaffke, KE7ER *********************** // An minimalist standalone set of Si5351 routines. @@ -119,5 +135,29 @@ void initOscillators(){ si5351bx_setfreq(0, cwmCarrier + (isIFShift ? ifShiftValue : 0)); } +//============================================================ +// ADD FUNCTIONS by KD8CEC +//============================================================ +uint8_t Wspr_Reg1[8] = {0xFF,0xFE, 0x00, 0, 0, 0, 0, 0}; //3, 4, 5, 6, 7 +uint8_t Wspr_Reg2[8] = {0, 1, 0, 0, 0, 0, 0, 0}; //2, 3, 4 + +void Set_WSPR_Param(void) +{ + i2cWrite(18, 128); + i2cWriten(34, Wspr_Reg1, 8); + i2cWriten(58, Wspr_Reg2, 8); + i2cWrite(177, 128); + i2cWrite(18, 111); + + si5351bx_clken &= ~(1 << 2); + i2cWrite(3, si5351bx_clken); +} + +void TXSubFreq(unsigned long P2) +{ + i2cWrite(40, (P2 & 65280) >> 8); + i2cWrite(41, P2 & 255); +} + diff --git a/ubitx_20/ubitx_ui.ino b/ubitx_20/ubitx_ui.ino index ad55426..c5089ea 100644 --- a/ubitx_20/ubitx_ui.ino +++ b/ubitx_20/ubitx_ui.ino @@ -9,7 +9,7 @@ //#define printLineF2(x) (printLineF(0, x)) //returns true if the button is pressed -int btnDown(){ +int btnDown(void){ if (digitalRead(FBUTTON) == HIGH) return 0; else @@ -173,7 +173,7 @@ void printLineF(char linenmbr, const __FlashStringHelper *c) } #define LCD_MAX_COLUMN 16 -void printLineFromEEPRom(char linenmbr, char lcdColumn, byte eepromStartIndex, byte eepromEndIndex) { +void printLineFromEEPRom(char linenmbr, char lcdColumn, byte eepromStartIndex, byte eepromEndIndex, char offsetTtype) { if ((displayOption1 & 0x01) == 0x01) linenmbr = (linenmbr == 0 ? 1 : 0); //Line Toggle @@ -182,7 +182,7 @@ void printLineFromEEPRom(char linenmbr, char lcdColumn, byte eepromStartIndex, b for (byte i = eepromStartIndex; i <= eepromEndIndex; i++) { if (++lcdColumn <= LCD_MAX_COLUMN) - lcd.write(EEPROM.read(USER_CALLSIGN_DAT + i)); + lcd.write(EEPROM.read((offsetTtype == 0 ? USER_CALLSIGN_DAT : WSPR_MESSAGE1) + i)); else break; } diff --git a/ubitx_20/ubitx_wspr.cpp b/ubitx_20/ubitx_wspr.cpp new file mode 100644 index 0000000..2568378 --- /dev/null +++ b/ubitx_20/ubitx_wspr.cpp @@ -0,0 +1,190 @@ +/********************************************************************************** +WSPR SENDER for uBITX by KD8CEC +Some of the code that sends WSPR referenced the code in G3ZIL. +Thanks to G3ZIL for sharing great code. + +Due to the limited memory of uBITX, I have implemented at least only a few of the codes in uBITX. + +Thanks for testing +Beta Tester : + +----------------------------------------------------------------------------- + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +**********************************************************************************/ + +#include +#include +#include "ubitx.h" + +//begin of test +byte WsprToneCode[164]; + +long lastTime=0; +unsigned long TX_MSNB_P2; // Si5351 register MSNB_P2 PLLB for Tx +unsigned long TX_P2; // Variable values for MSNB_P2 which defines the frequencies for the data + +extern int enc_read(void); + +byte WsprMSGCount = 0; +#define PTT (A3) + +#define WSPR_BAND1 401 + +extern uint8_t Wspr_Reg1[8]; //3, 4, 5, 6, 7 +extern uint8_t Wspr_Reg2[8]; //2, 3, 4 + +void SendWSPRManage() +{ + int knob = 0; + byte knobPosition = 0; + char isNeedDisplayInfo = 0; + char nowSelectedIndex = 0; + char nowWsprStep = 0; //0 : select Message, 1 : select band, 2 : send + char selectedWsprMessageIndex = -1; + char selectedWsprBandIndex = -1; + + unsigned long WsprTXFreq = 0; + unsigned int WsprMultiChan = 0; + unsigned long prevFreq; + char loopIndex; + + delay_background(500, 0); + + //Readed WsprMSGCount, WsprTone + while(1) + { + knob = enc_read(); + + if (knobPosition > 0 && knob < 0) + knobPosition--; + else if (knob > 0 && (knobPosition <= (nowWsprStep == 0 ? WsprMSGCount : WSPR_BAND_COUNT) * 10 -2)) + knobPosition++; + + nowSelectedIndex = knobPosition / 10; + + if (nowWsprStep == 0) //select Message status + { + printLineF2(F("WSPR:")); + + if (selectedWsprMessageIndex != nowSelectedIndex) + { + selectedWsprMessageIndex = nowSelectedIndex; + int wsprMessageBuffIndex = selectedWsprMessageIndex * 46; + + //Display WSPR Name tag + printLineFromEEPRom(0, 6, wsprMessageBuffIndex, wsprMessageBuffIndex + 4, 1); + + //Load WSPR Tonecode + //Read Tone Code + for (int i = 0; i < 41; i++) + { + byte readData = EEPROM.read(WSPR_MESSAGE1 + 5 + (wsprMessageBuffIndex) + i); //NAME TAG 5, MESSAGE 41 = 46 + WsprToneCode[i * 4 + 0] = readData & 3; + WsprToneCode[i * 4 + 1] = (readData >> 2) & 3; + WsprToneCode[i * 4 + 2] = (readData >> 4) & 3; + WsprToneCode[i * 4 + 3] = (readData >> 6) & 3; + } + } + else if (btnDown()) + { + nowWsprStep = 1; //Change Status to Select Band + knobPosition = 0; + nowSelectedIndex = 0; + delay_background(500, 0); + } + } + else if (nowWsprStep == 1) + { + //printLineF2(F("Select Band")); + if (selectedWsprBandIndex != nowSelectedIndex) + { + selectedWsprBandIndex = nowSelectedIndex; + int bandBuffIndex = WSPR_BAND1 + selectedWsprBandIndex * 14; + + EEPROM.get(bandBuffIndex, WsprTXFreq); + EEPROM.get(bandBuffIndex + 4, WsprMultiChan); + + /* + //3, 4, 5, 6, 7 + Wspr_Reg1[3] = EEPROM.read(bandBuffIndex + 6); + Wspr_Reg1[4] = EEPROM.read(bandBuffIndex + 7); + Wspr_Reg1[5] = EEPROM.read(bandBuffIndex + 8); + Wspr_Reg1[6] = EEPROM.read(bandBuffIndex + 9); + Wspr_Reg1[7] = EEPROM.read(bandBuffIndex + 10); + */ + for (loopIndex = 3; loopIndex < 8; loopIndex++) + Wspr_Reg1[loopIndex] = EEPROM.read(bandBuffIndex + loopIndex + 3); + + /* + Wspr_Reg2[2] = EEPROM.read(bandBuffIndex + 11); + Wspr_Reg2[3] = EEPROM.read(bandBuffIndex + 12); + Wspr_Reg2[4] = EEPROM.read(bandBuffIndex + 13); + */ + //2, 3, 4 + for (loopIndex = 2; loopIndex < 5; loopIndex++) + Wspr_Reg2[loopIndex] = EEPROM.read(bandBuffIndex + loopIndex + 9); + + TX_MSNB_P2 = ((unsigned long)Wspr_Reg1[5] & 0x0F) << 16 | ((unsigned long)Wspr_Reg1[6]) << 8 | Wspr_Reg1[7]; + } + + ltoa(WsprTXFreq, b, DEC); + if (digitalRead(PTT) == 0) + strcpy(c, "SEND:"); + else + strcpy(c, "PTT->"); + + strcat(c, b); + printLine1(c); + + if (digitalRead(PTT) == 0) + { + //printLineF1(F("Transmitting")); + //SEND WSPR + prevFreq = frequency; + frequency = WsprTXFreq; + startTx(TX_CW, 0); + + //Start WSPR + Set_WSPR_Param(); + digitalWrite(CW_KEY, 1); + + for (int i = 0; i < 162; i++) + { // Now this is the message loop + lastTime = millis(); // Store away the time when the last message symbol was sent + TX_P2 = TX_MSNB_P2 + WsprMultiChan * WsprToneCode[i]; // This represents the 1.46 Hz shift and is correct only for the bands specified in the array + TXSubFreq(TX_P2); // TX at the appropriate channel frequency for.... + + //if (btnDown()) + // break; + + while (millis() < lastTime + 683){} // .... 0,683 seconds + } + + digitalWrite(CW_KEY, 0); + stopTx(); + frequency = prevFreq; + + selectedWsprBandIndex = -1; + } //end of PTT Check + else if (btnDown()) + { + return; + } + + } //end of status check + + //delay_background(50, 1); + } //end of while +} +