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!

This commit is contained in:
Michael Colton 2016-05-07 15:01:37 -06:00
parent 53263f2416
commit 2c1530d33f
4 changed files with 228 additions and 132 deletions

Binary file not shown.

View File

@ -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);
//}

View File

@ -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?
}

View File

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