From 2c1530d33fbc388c3ab8767319080a4b94b31bc5 Mon Sep 17 00:00:00 2001 From: Michael Colton Date: Sat, 7 May 2016 15:01:37 -0600 Subject: [PATCH] Control of the new frequency synth is pretty much working (not completely optimized, probably isn't taking full advantage of its resolution, and doesn't cover its full range yet) the PSDR can now tune from 2.5MHz to 175MHz! Sensitivity isn't great (currently around -90dbm on 7MHz and about -80-85dbm on 146.4MHz. Still pretty cool! --- Hardware/PSDR.sch | Bin 525699 -> 525874 bytes Source/src/dds.c | 80 +++++++++++------------ Source/src/i2c.c | 117 ++++++++++++++++++++++----------- Source/src/main.c | 163 ++++++++++++++++++++++++++++++---------------- 4 files changed, 228 insertions(+), 132 deletions(-) diff --git a/Hardware/PSDR.sch b/Hardware/PSDR.sch index 4e8ba91eef7134133cee513f86594389c25c251b..7fb5bf80ff77385fd9a0a75dd19935b3b8c64e9a 100644 GIT binary patch delta 6231 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 diff --git a/Source/src/dds.c b/Source/src/dds.c index f5156c9..deac8fd 100644 --- a/Source/src/dds.c +++ b/Source/src/dds.c @@ -44,43 +44,43 @@ long long freqToReg(long long frequency) } -void setFreq(long frequency) -{ - long long freg = freqToReg(frequency); - - - //HAL_GPIO_WritePin(ddsReset.port, ddsReset.pin, 1); - ddsPrefix(); - //sendToDds(0x2100, 0x2100); - //sendToDds(0x0010001100000000 , 0x0010001100000000); - sendToDds(0b0010001000000000 , 0b0010001000000000); - ddsSuffix(); - - //HAL_GPIO_WritePin(ddsReset.port, ddsReset.pin, 0); - //HAL_GPIO_WritePin(ddsReset.port, ddsReset.pin, 1); - //sendToDds(0x50c7); - //sendToDds(0x4000); - ddsPrefix(); - sendToDds(((freg & 0b0011111111111111) | 0b0100000000000000), - ((freg & 0b0011111111111111) | 0b0100000000000000)); - ddsSuffix(); - ddsPrefix(); - sendToDds(((freg >> 14 & 0b0011111111111111) | 0b0100000000000000), - (((freg >> 14) & 0b0011111111111111) | 0b0100000000000000)); - ddsSuffix(); - ddsPrefix(); - //sendToDds(0xc000, 0xc000); - sendToDds(0xc000, 0xc000 | 3072); - ddsSuffix(); - // ddsPrefix(); - // sendToDds(0b1100000000000000); - // ddsSuffix(); - - - - // ddsPrefix(); - // sendToDds(0x2000, 0x2000); - // ddsSuffix(); - -// HAL_GPIO_WritePin(ddsReset.port, ddsReset.pin, 0); -} +//void setFreq(long frequency) +//{ +// long long freg = freqToReg(frequency); +// +// +// //HAL_GPIO_WritePin(ddsReset.port, ddsReset.pin, 1); +// ddsPrefix(); +// //sendToDds(0x2100, 0x2100); +// //sendToDds(0x0010001100000000 , 0x0010001100000000); +// sendToDds(0b0010001000000000 , 0b0010001000000000); +// ddsSuffix(); +// +// //HAL_GPIO_WritePin(ddsReset.port, ddsReset.pin, 0); +// //HAL_GPIO_WritePin(ddsReset.port, ddsReset.pin, 1); +// //sendToDds(0x50c7); +// //sendToDds(0x4000); +// ddsPrefix(); +// sendToDds(((freg & 0b0011111111111111) | 0b0100000000000000), +// ((freg & 0b0011111111111111) | 0b0100000000000000)); +// ddsSuffix(); +// ddsPrefix(); +// sendToDds(((freg >> 14 & 0b0011111111111111) | 0b0100000000000000), +// (((freg >> 14) & 0b0011111111111111) | 0b0100000000000000)); +// ddsSuffix(); +// ddsPrefix(); +// //sendToDds(0xc000, 0xc000); +// sendToDds(0xc000, 0xc000 | 3072); +// ddsSuffix(); +// // ddsPrefix(); +// // sendToDds(0b1100000000000000); +// // ddsSuffix(); +// +// +// +// // ddsPrefix(); +// // sendToDds(0x2000, 0x2000); +// // ddsSuffix(); +// +//// HAL_GPIO_WritePin(ddsReset.port, ddsReset.pin, 0); +//} diff --git a/Source/src/i2c.c b/Source/src/i2c.c index 2783951..e22df78 100644 --- a/Source/src/i2c.c +++ b/Source/src/i2c.c @@ -175,13 +175,13 @@ unsigned char Reg_Store[][3] = { { 29,0x90,0xFF}, { 30,0xB0,0xFF}, { 31,0xC0,0xFF}, - { 32,0xE3,0xFF}, - { 33,0xE3,0xFF}, + { 32,0xC0,0xFF}, + { 33,0xCC,0xFF}, { 34,0xE3,0xFF}, { 35,0x00,0xFF}, { 36,0x06,0x1F}, - { 37,0x00,0x1F}, - { 38,0x00,0x1F}, + { 37,0x06,0x1F}, + { 38,0x06,0x1F}, { 39,0x00,0x1F}, { 40,0x63,0xFF}, { 41,0x0C,0x7F}, @@ -191,18 +191,18 @@ unsigned char Reg_Store[][3] = { { 45,0x00,0xFF}, { 46,0x00,0xFF}, { 47,0x14,0x3F}, - { 48,0x37,0xFF}, + { 48,0x2B,0xFF}, { 49,0x00,0xFF}, - { 50,0xC4,0xFF}, - { 51,0x07,0xFF}, + { 50,0xC2,0xFF}, + { 51,0x27,0xFF}, { 52,0x10,0xFF}, - { 53,0x00,0xFF}, - { 54,0x57,0xFF}, - { 55,0x00,0xFF}, - { 56,0x00,0xFF}, + { 53,0xD9,0xFF}, + { 54,0x02,0xFF}, + { 55,0x84,0xFF}, + { 56,0x01,0xFF}, { 57,0x00,0xFF}, { 58,0x00,0xFF}, - { 59,0x01,0xFF}, + { 59,0xB7,0xFF}, { 60,0x00,0xFF}, { 61,0x00,0xFF}, { 62,0x00,0x3F}, @@ -213,18 +213,18 @@ unsigned char Reg_Store[][3] = { { 67,0x00,0xFF}, { 68,0x00,0xFF}, { 69,0x00,0xFF}, - { 70,0x00,0xFF}, + { 70,0x01,0xFF}, { 71,0x00,0xFF}, { 72,0x00,0xFF}, { 73,0x00,0x3F}, { 74,0x10,0xFF}, - { 75,0x00,0xFF}, - { 76,0x00,0xFF}, - { 77,0x00,0xFF}, + { 75,0x38,0xFF}, + { 76,0xC3,0xFF}, + { 77,0x20,0xFF}, { 78,0x00,0xFF}, { 79,0x00,0xFF}, { 80,0x00,0xFF}, - { 81,0x00,0xFF}, + { 81,0x09,0xFF}, { 82,0x00,0xFF}, { 83,0x00,0xFF}, { 84,0x00,0x3F}, @@ -240,20 +240,20 @@ unsigned char Reg_Store[][3] = { { 94,0x00,0xFF}, { 95,0x00,0x3F}, { 96,0x10,0x00}, - { 97,0x21,0xFF}, - { 98,0x2E,0xFF}, - { 99,0x80,0xFF}, - {100,0x8F,0xFF}, - {101,0x50,0xFF}, - {102,0x01,0xFF}, - {103,0xA0,0xFF}, - {104,0x2E,0xFF}, - {105,0x63,0xFF}, + { 97,0x9D,0xFF}, + { 98,0x34,0xFF}, + { 99,0x1C,0xFF}, + {100,0x00,0xFF}, + {101,0x00,0xFF}, + {102,0x00,0xFF}, + {103,0x0D,0xFF}, + {104,0x00,0xFF}, + {105,0x00,0xFF}, {106,0x80,0xBF}, {107,0x00,0xFF}, {108,0x00,0xFF}, {109,0x00,0xFF}, - {110,0x00,0xFF}, + {110,0x40,0xFF}, {111,0x00,0xFF}, {112,0x00,0xFF}, {113,0x00,0xFF}, @@ -491,8 +491,7 @@ unsigned char Reg_Store[][3] = { { 92,0x00,0x00}, { 93,0x00,0x00}, { 94,0x00,0x00}, - {255, 0, 0xFF} }; // set page bit to 0 - //End of file + {255, 0, 0xFF} }; @@ -713,9 +712,23 @@ write_Si5338(230, 0x00); // OEB_ALL = 0 // } //while(1); + + + +write_Si5338(31, 0xC1); //output driver off? + +//Start us at a known frequency (in this case 14.06 which equals 7.03) +//TODO: Make this start at whatever the unit is supposed to power up at. Not hard coded +writeMultiSynthParameters(MULTISYNTH0, 201, 697, 703); +write_Si5338(31, 0xC0); //output driver off? } -void i2cLoop() { + +unsigned long long vcoFreq = 2840000000; +double correctionFactor = 1; +void setFreq(unsigned long frequency) +{ +//void i2cLoop() { // put your main code here, to run repeatedly: //delay(400); //write_Si5338(31, 0xC1); //output driver off? @@ -736,11 +749,30 @@ void i2cLoop() { // if( integer >= 500) integer = 8; // //} while (true); +//double desiredFrequency = 150.5; +//double measuredFrequency = 150.48806; + + +// correctionFactor = desiredFrequency/measuredFrequency; + +// frequency *= correctionFactor; + + frequency *= 2; //because the flipflops will devide it back down by 2 + +if(frequency < 5000000) return; +if(frequency > 350000000) return; -long integer = 199; -long neumerator = 0; +unsigned long integer = vcoFreq / frequency; + +//if((integer % 2) != 0) integer++; + + + +unsigned long remainder = vcoFreq % frequency; + + //do //{ @@ -752,7 +784,7 @@ long neumerator = 0; // integer++; //} - //if( integer >= 500) integer = 8; +// if( integer >= 500) integer = 8; //neumerator = (analogRead(A3) * 10); //578914 referal nu 801 435 7764 john thank you //integer = (analogRead(A2) /10) + 150; @@ -760,12 +792,23 @@ long neumerator = 0; //} while (true); - write_Si5338(31, 0xC0); //output driver off? + //write_Si5338(31, 0xC0); //output driver off? //delay(400); - write_Si5338(31, 0xC1); //output driver off? - writeMultiSynthParameters(MULTISYNTH0, 397, 0, 10000UL); - write_Si5338(31, 0xC0); //output driver off? + + + +while(frequency > 100000) //This value should be fine tuned. I thought the numerator and denominator could be 30 bits, but it seems to be less than 24 + { + remainder /= 2; + frequency /= 2; + } + + //write_Si5338(31, 0xC1); //output driver off? + writeMultiSynthParameters(MULTISYNTH0, integer, remainder , frequency); + //writeMultiSynthParameters(MULTISYNTH0, 232, 44960 , 122220); + //writeMultiSynthParameters(MULTISYNTH0, integer, /*neumerator*/ 0 , 1000000UL); + //write_Si5338(31, 0xC0); //output driver off? } diff --git a/Source/src/main.c b/Source/src/main.c index 852909f..190a040 100644 --- a/Source/src/main.c +++ b/Source/src/main.c @@ -988,52 +988,67 @@ void drawSMeter() enum menuItems { - oneMhzPlace = 0, - hundredKhzPlace = 1, - tenKhzPlace = 2, - oneKhzPlace = 3, - hundredHzPlace = 4, - tenHzPlace = 5, - oneHzPlace = 6, - filterLower = 7, - filterUpper = 8, - modeMenu = 9, - volumeMenu = 10, + volumeMenuItem = 0, + modeMenuItem, + megahertzMenuItem, + hundredKilohertzMenuItem, + tenKilohertzMenuItem, + kilohertzMenuItem, + hundredHertzMenuItem, + tenHertzMenuItem, + hertzMenuItem, + filterLowMenuItem, + filterHighMenuItem }; +//enum menuItems +//{ +// oneMhzPlace = 0, +// hundredKhzPlace = 1, +// tenKhzPlace = 2, +// oneKhzPlace = 3, +// hundredHzPlace = 4, +// tenHzPlace = 5, +// oneHzPlace = 6, +// filterLower = 7, +// filterUpper = 8, +// modeMenu = 9, +// volumeMenu = 10, +//}; + void updateMenu() { switch(menuPos) { - case oneMhzPlace: + case megahertzMenuItem: frequencyDialMultiplier = 1000000; updateVfo(); break; - case hundredKhzPlace: + case hundredKilohertzMenuItem: frequencyDialMultiplier = 100000; updateVfo(); break; - case tenKhzPlace: + case tenKilohertzMenuItem: frequencyDialMultiplier = 10000; updateVfo(); break; - case oneKhzPlace: + case kilohertzMenuItem: frequencyDialMultiplier = 1000; updateVfo(); break; - case hundredHzPlace: + case hundredHertzMenuItem: frequencyDialMultiplier = 100; updateVfo(); break; - case tenHzPlace: + case tenHertzMenuItem: frequencyDialMultiplier = 10; updateVfo(); break; - case oneHzPlace: + case hertzMenuItem: frequencyDialMultiplier = 1; updateVfo(); break; - case filterLower: + case filterLowMenuItem: encoderPos = getPos(); if(encoderPos != encoderLastPos) { @@ -1045,7 +1060,7 @@ void updateMenu() populateCoeficients(filterUpperLimit - filterLowerLimit, mode, filterLowerLimit); } break; - case filterUpper: + case filterHighMenuItem: encoderPos = getPos(); if(encoderPos != encoderLastPos) { @@ -1057,7 +1072,7 @@ void updateMenu() populateCoeficients(filterUpperLimit - filterLowerLimit, mode, filterLowerLimit); } break; - case modeMenu: + case modeMenuItem: encoderPos = getPos(); if(encoderPos != encoderLastPos) { @@ -1069,7 +1084,7 @@ void updateMenu() //Right now all this does is turns the AM decoder on and off, I guess. } break; - case volumeMenu: + case volumeMenuItem: encoderPos = getPos(); if(encoderPos != encoderLastPos) { @@ -1114,11 +1129,13 @@ enum modes AM = 2 }; + + void updateDisplay(uint8_t force) { displayUpdating = 1; - static char freqChar[14]; - static char lastFreqChar[] = {'$','$','$','$','$','$','$','$','$','$','$','$','$','$',}; + static char freqChar[15]; + static char lastFreqChar[] = {'$','$','$','$','$','$','$','$','$','$','$','$','$','$','$',}; //Draw elements that don't normally change. Static icons, etc. if(force) @@ -1127,54 +1144,83 @@ void updateDisplay(uint8_t force) Adafruit_GFX_drawColorBitmap(150, 90, bitmapMode, 40,12, MASKWHITE); Adafruit_GFX_fillTriangle(126,119,136,124,136,114,ILI9340_WHITE); Adafruit_GFX_drawColorBitmap(150, 136, bitmapFilter, 47,12, MASKWHITE); - drawNumber('.', freqHOffset + 16*2, freqVOffset + 0, MASKWHITE); - drawNumber('.', freqHOffset + 16*6, freqVOffset + 0, MASKWHITE); + drawNumber('.', freqHOffset + 16*3, freqVOffset + 0, MASKWHITE); + drawNumber('.', freqHOffset + 16*7, freqVOffset + 0, MASKWHITE); Adafruit_GFX_drawColorBitmap(142, 162, bitmapSMeter, 155, 10, MASKWHITE); //Adafruit_GFX_drawColorBitmap(320 - 45 - 2, 240 - 46 - 2, bitmapHadLogo, 45, 46, MASKWHITE); } - sprintf(&freqChar, "%8d", vfoAFrequency); + sprintf(&freqChar, "%9d", vfoAFrequency); //So on each of these elements, we update when the value changes, when we're forced to, when the item becomes selected, or unselected. - if(freqChar[0] != lastFreqChar[0] || force || (menuPos != menuLastPos && (menuPos == 0 || menuLastPos == 0))) + if(freqChar[0] != lastFreqChar[0] + || force + || (menuPos != menuLastPos && (menuPos == megahertzMenuItem + || menuLastPos == megahertzMenuItem))) { - drawNumber(freqChar[0], freqHOffset + 16*0, freqVOffset + 0, menuPos == 0 ? MASKRED : MASKWHITE); + drawNumber(freqChar[0], freqHOffset + 16*0, freqVOffset + 0, + menuPos == megahertzMenuItem ? MASKRED : MASKWHITE); } - if(freqChar[1] != lastFreqChar[1] || redItems[0] || force || (menuPos != menuLastPos && (menuPos == 0 || menuLastPos == 0))) + if(freqChar[1] != lastFreqChar[1] + || redItems[0] + || force + || (menuPos != menuLastPos && (menuPos == megahertzMenuItem + || menuLastPos == megahertzMenuItem))) { - drawNumber(freqChar[1], freqHOffset + 16*1, freqVOffset + 0, menuPos == 0 ? MASKRED : MASKWHITE); + drawNumber(freqChar[1], freqHOffset + 16*1, freqVOffset + 0, + menuPos == megahertzMenuItem ? MASKRED : MASKWHITE); } - if(freqChar[2] != lastFreqChar[2] || force || (menuPos != menuLastPos && (menuPos == 1 || menuLastPos == 1))) + if(freqChar[2] != lastFreqChar[2] + || force + || (menuPos != menuLastPos && (menuPos == megahertzMenuItem + || menuLastPos == megahertzMenuItem))) { - drawNumber(freqChar[2], freqHOffset + 16*3, freqVOffset + 0, menuPos == 1 ? MASKRED : MASKWHITE); + drawNumber(freqChar[2], freqHOffset + 16*2, freqVOffset + 0, + menuPos == megahertzMenuItem ? MASKRED : MASKWHITE); } - if(freqChar[3] != lastFreqChar[3] || force || (menuPos != menuLastPos && (menuPos == 2 || menuLastPos == 2))) + if(freqChar[3] != lastFreqChar[3] + || force + || (menuPos != menuLastPos && (menuPos == hundredKilohertzMenuItem + || menuLastPos == hundredKilohertzMenuItem))) { - drawNumber(freqChar[3], freqHOffset + 16*4, freqVOffset + 0, menuPos == 2 ? MASKRED : MASKWHITE); + drawNumber(freqChar[3], freqHOffset + 16*4, freqVOffset + 0, + menuPos == hundredKilohertzMenuItem ? MASKRED : MASKWHITE); } - if(freqChar[4] != lastFreqChar[4] || force || (menuPos != menuLastPos && (menuPos == 3 || menuLastPos == 3))) + if(freqChar[4] != lastFreqChar[4] + || force + || (menuPos != menuLastPos && (menuPos == tenKilohertzMenuItem + || menuLastPos == tenKilohertzMenuItem))) { - drawNumber(freqChar[4], freqHOffset + 16*5, freqVOffset + 0, menuPos == 3 ? MASKRED : MASKWHITE); + drawNumber(freqChar[4], freqHOffset + 16*5, freqVOffset + 0, + menuPos == tenKilohertzMenuItem ? MASKRED : MASKWHITE); } - if(freqChar[5] != lastFreqChar[5] || force || (menuPos != menuLastPos && (menuPos == 4 || menuLastPos == 4))) + if(freqChar[5] != lastFreqChar[5] || force || (menuPos != menuLastPos && (menuPos == kilohertzMenuItem || menuLastPos == kilohertzMenuItem))) { - drawNumber(freqChar[5], freqHOffset + 16*7, freqVOffset + 0, menuPos == 4 ? MASKRED : MASKWHITE); + drawNumber(freqChar[5], freqHOffset + 16*6, freqVOffset + 0, menuPos == kilohertzMenuItem ? MASKRED : MASKWHITE); } - if(freqChar[6] != lastFreqChar[6] || force || (menuPos != menuLastPos && (menuPos == 5 || menuLastPos == 5))) + if(freqChar[6] != lastFreqChar[6] || force || (menuPos != menuLastPos && (menuPos == hundredHertzMenuItem || menuLastPos == hundredHertzMenuItem))) { - drawNumber(freqChar[6], freqHOffset + 16*8, freqVOffset + 0, menuPos == 5 ? MASKRED : MASKWHITE); + drawNumber(freqChar[6], freqHOffset + 16*8, freqVOffset + 0, menuPos == hundredHertzMenuItem ? MASKRED : MASKWHITE); } - if(freqChar[7] != lastFreqChar[7] || force || (menuPos != menuLastPos && (menuPos == 6 || menuLastPos == 6))) + if(freqChar[7] != lastFreqChar[7] || force || (menuPos != menuLastPos && (menuPos == tenHertzMenuItem || menuLastPos == tenHertzMenuItem))) { - drawNumber(freqChar[7], freqHOffset + 16*9, freqVOffset + 0, menuPos == 6 ? MASKRED : MASKWHITE); + drawNumber(freqChar[7], freqHOffset + 16*9, freqVOffset + 0, menuPos == tenHertzMenuItem ? MASKRED : MASKWHITE); } + if(freqChar[8] != lastFreqChar[8] || force || (menuPos != menuLastPos && (menuPos == hertzMenuItem || menuLastPos == hertzMenuItem))) + { + drawNumber(freqChar[8], freqHOffset + 16*10, freqVOffset + 0, menuPos == hertzMenuItem ? MASKRED : MASKWHITE); + } vfoALastFreq = vfoAFrequency; strcpy(lastFreqChar, freqChar); int redrawFilterBar = 0; - if(mode != modeLast || filterLowerLimit != filterLastLowerLimit || force || (menuPos != menuLastPos && (menuPos == 7 || menuLastPos == 7))) + if(mode != modeLast + || filterLowerLimit != filterLastLowerLimit + || force + || (menuPos != menuLastPos && (menuPos == filterLowMenuItem + || menuLastPos == filterLowMenuItem))) { sprintf(&freqChar, "%4d", filterLowerLimit * 40); //Adafruit_GFX_setTextSize(2); @@ -1184,7 +1230,7 @@ void updateDisplay(uint8_t force) for(i = 0; i < 4; i++) { //Adafruit_GFX_write(freqChar[i]); - drawNumberSmall(freqChar[i], 205 + (i * 9), 137, menuPos == 7 ? MASKRED : MASKWHITE); + drawNumberSmall(freqChar[i], 205 + (i * 9), 137, menuPos == filterLowMenuItem ? MASKRED : MASKWHITE); } //Adafruit_GFX_setTextSize(3); @@ -1192,7 +1238,11 @@ void updateDisplay(uint8_t force) filterLastLowerLimit = filterLowerLimit; } - if(mode != modeLast || filterUpperLimit != filterLastUpperLimit || force || (menuPos != menuLastPos && (menuPos == 8 || menuLastPos == 8))) + if(mode != modeLast + || filterUpperLimit != filterLastUpperLimit + || force + || (menuPos != menuLastPos && (menuPos == filterHighMenuItem + || menuLastPos == filterHighMenuItem))) { sprintf(&freqChar, "%-4d", filterUpperLimit * 40); //Adafruit_GFX_setTextSize(2); @@ -1202,7 +1252,7 @@ void updateDisplay(uint8_t force) for(i = 0; i < 4; i++) { //Adafruit_GFX_write(freqChar[i]); - drawNumberSmall(freqChar[i], 250 + (i * 9), 137, menuPos == 8 ? MASKRED : MASKWHITE); + drawNumberSmall(freqChar[i], 250 + (i * 9), 137, menuPos == filterHighMenuItem ? MASKRED : MASKWHITE); } //Adafruit_GFX_setTextSize(3); @@ -1211,14 +1261,14 @@ void updateDisplay(uint8_t force) } - if(afGainLast != afGain || force || (menuPos != menuLastPos && (menuPos == volumeMenu || menuLastPos == volumeMenu))) + if(afGainLast != afGain || force || (menuPos != menuLastPos && (menuPos == volumeMenuItem || menuLastPos == volumeMenuItem))) { sprintf(&freqChar, "%-4f", afGain * 100); int i; for(i = 0; i < 4; i++) { //Adafruit_GFX_write(freqChar[i]); - drawNumberSmall(freqChar[i], 250 + (i * 9), 10, menuPos == volumeMenu ? MASKRED : MASKWHITE); + drawNumberSmall(freqChar[i], 250 + (i * 9), 10, menuPos == volumeMenuItem ? MASKRED : MASKWHITE); } afGainLast = afGain; @@ -1248,18 +1298,21 @@ void updateDisplay(uint8_t force) } - if(mode != modeLast || force || (menuPos != menuLastPos && (menuPos == 9 || menuLastPos == 9))) + if(mode != modeLast + || force + || (menuPos != menuLastPos && (menuPos == modeMenuItem + || menuLastPos == modeMenuItem))) { switch(mode) { case LSB: - Adafruit_GFX_drawColorBitmap(196, 91, bitmapLSB, 28, 9, menuPos == 9 ? MASKRED : MASKWHITE); + Adafruit_GFX_drawColorBitmap(196, 91, bitmapLSB, 28, 9, menuPos == modeMenuItem ? MASKRED : MASKWHITE); break; case USB: - Adafruit_GFX_drawColorBitmap(196, 91, bitmapUSB, 28, 9, menuPos == 9 ? MASKRED : MASKWHITE); + Adafruit_GFX_drawColorBitmap(196, 91, bitmapUSB, 28, 9, menuPos == modeMenuItem ? MASKRED : MASKWHITE); break; case AM: - Adafruit_GFX_drawColorBitmap(196, 91, bitmapAM, 28, 9, menuPos == 9 ? MASKRED : MASKWHITE); + Adafruit_GFX_drawColorBitmap(196, 91, bitmapAM, 28, 9, menuPos == modeMenuItem ? MASKRED : MASKWHITE); break; } @@ -1500,8 +1553,8 @@ void updateVfo() vfoAFrequency += frequencyDialMultiplier * (encoderLastPos - encoderPos); - if(vfoAFrequency < 1) vfoAFrequency = 1; - if(vfoAFrequency > 37500000) vfoAFrequency = 37500000; + if(vfoAFrequency < 2500000) vfoAFrequency = 2500000; //Currently, the code can only corectly drive down to 5MHz/2 = 2.5MHz + if(vfoAFrequency > 175000000) vfoAFrequency = 175000000; //Currently, the code can only correctly drive up to 350MHz/2 = 175MHz encoderLastPos = encoderPos; }