¿ªÔÆÌåÓý

bitx40 VFO


 

I?bought you?trx without DDS.? I'm making DDS witch Arduino Nano and?AD8950 module. I have?any questions.
What is?ferquency VFO (4.8 - 5 MHz for 7-7.2 MHz) ?
How many ?volts should?signal output DDS?
Output signal from VFO on the board? should connect GND or? breake path ?

Regards , adam


Billy Shepherd
 

¿ªÔÆÌåÓý

I'm doing the same with the same AD9850 and Arduino. I have the BITX40 built and the DDS is built per these links:




I hesitate to answer questions...just wanted you to know I'm attempting the same and waiting for someone to answer lol


From: [email protected] [[email protected]] on behalf of Adam Sliwa [sq9tla@...]
Sent: Wednesday, March 01, 2017 1:52 AM
To: [email protected]
Subject: [BITX20] bitx40 VFO

I?bought you?trx without DDS.? I'm making DDS witch Arduino Nano and?AD8950 module. I have?any questions.
What is?ferquency VFO (4.8 - 5 MHz for 7-7.2 MHz) ?
How many ?volts should?signal output DDS?
Output signal from VFO on the board? should connect GND or? breake path ?

Regards , adam


Billy Shepherd
 

¿ªÔÆÌåÓý

Also, here is the code that worked or my Arduino Mega

/*
Main code by Richard Visokey AD7C - www.ad7c.com
Revision 2.0 - November 6th, 2013
*/

// Include the library code
#include <LiquidCrystal.h>
#include <rotary.h>
#include <EEPROM.h>

//Setup some items
#define W_CLK 8?? // Pin 8 - connect to AD9850 module word load clock pin (CLK)
#define FQ_UD 9?? // Pin 9 - connect to freq update pin (FQ)
#define DATA 10?? // Pin 10 - connect to serial data load pin (DATA)
#define RESET 11? // Pin 11 - connect to reset pin (RST)
#define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); }
Rotary r = Rotary(2,3); // sets the pins the rotary encoder uses.? Must be interrupt pins.
LiquidCrystal lcd(12, 13, 7, 6, 5, 4); // I used an odd pin combination because I need pin 2 and 3 for the interrupts.
int_fast32_t rx=7200000; // Starting frequency of VFO
int_fast32_t rx2=1; // variable to hold the updated frequency
int_fast32_t increment = 10; // starting VFO update increment in HZ.
int buttonstate = 0;
String hertz = "10 Hz";
int? hertzPosition = 5;
byte ones,tens,hundreds,thousands,tenthousands,hundredthousands,millions ;? //Placeholders
String freq; // string to hold the frequency
int_fast32_t timepassed = millis(); // int to hold the arduino miilis since startup
int memstatus = 1;? // value to notify if memory is current or old. 0=old, 1=current.





int ForceFreq = 1;? // Change this to 0 after you upload and run a working sketch to activate the EEPROM memory.? YOU MUST PUT THIS BACK TO 0 AND UPLOAD THE SKETCH AGAIN AFTER STARTING FREQUENCY IS SET!




void setup() {
? pinMode(A0,INPUT); // Connect to a button that goes to GND on push
? digitalWrite(A0,HIGH);
? lcd.begin(16, 2);
? attachInterrupt(0,MyIsr,CHANGE);
attachInterrupt(1,MyIsr,CHANGE);
?
? pinMode(FQ_UD, OUTPUT);
? pinMode(W_CLK, OUTPUT);
? pinMode(DATA, OUTPUT);
? pinMode(RESET, OUTPUT);
? pulseHigh(RESET);
? pulseHigh(W_CLK);
? pulseHigh(FQ_UD);? // this pulse enables serial mode on the AD9850 - Datasheet page 12.
? lcd.setCursor(hertzPosition,1);???
? lcd.print(hertz);
?? // Load the stored frequency?
? if (ForceFreq == 0) {
??? freq = String(EEPROM.read(0))+String(EEPROM.read(1))+String(EEPROM.read(2))+String(EEPROM.read(3))+String(EEPROM.read(4))+String(EEPROM.read(5))+String(EEPROM.read(6));
??? rx = freq.toInt();?
? }
}


void loop() {
? if (rx != rx2){???
??????? showFreq();
??????? sendFrequency(rx);
??????? rx2 = rx;
????? }
?????
? buttonstate = digitalRead(A0);
? if(buttonstate == LOW) {
??????? setincrement();???????
??? };

? // Write the frequency to memory if not stored and 2 seconds have passed since the last frequency change.
??? if(memstatus == 0){??
????? if(timepassed+2000 < millis()){
??????? storeMEM();
??????? }
????? }??
}


void MyIsr(void) {
? unsigned char result = r.process();
? if (result) {???
??? if (result == DIR_CW){rx=rx+increment;}
??? else {rx=rx-increment;};??????
????? if (rx >=30000000){rx=rx2;}; // UPPER VFO LIMIT
????? if (rx <=1000000){rx=rx2;}; // LOWER VFO LIMIT
? }
}



// frequency calc from datasheet page 8 = <sys clock> * <frequency tuning word>/2^32
void sendFrequency(double frequency) {?
? int32_t freq = frequency * 4294967295/125000000;? // note 125 MHz clock on 9850.? You can make 'slight' tuning variations here by adjusting the clock frequency.
? for (int b=0; b<4; b++, freq>>=8) {
??? tfr_byte(freq & 0xFF);
? }
? tfr_byte(0x000);?? // Final control byte, all 0 for 9850 chip
? pulseHigh(FQ_UD);? // Done!? Should see output
}
// transfers a byte, a bit at a time, LSB first to the 9850 via serial DATA line
void tfr_byte(byte data)
{
? for (int i=0; i<8; i++, data>>=1) {
??? digitalWrite(DATA, data & 0x01);
??? pulseHigh(W_CLK);?? //after each bit sent, CLK is pulsed high
? }
}

void setincrement(){
? if(increment == 10){increment = 50; hertz = "50 Hz"; hertzPosition=5;}
? else if (increment == 50){increment = 100;? hertz = "100 Hz"; hertzPosition=4;}
? else if (increment == 100){increment = 500; hertz="500 Hz"; hertzPosition=4;}
? else if (increment == 500){increment = 1000; hertz="1 Khz"; hertzPosition=6;}
? else if (increment == 1000){increment = 2500; hertz="2.5 Khz"; hertzPosition=4;}
? else if (increment == 2500){increment = 5000; hertz="5 Khz"; hertzPosition=6;}
? else if (increment == 5000){increment = 10000; hertz="10 Khz"; hertzPosition=5;}
? else if (increment == 10000){increment = 100000; hertz="100 Khz"; hertzPosition=4;}
? else if (increment == 100000){increment = 1000000; hertz="1 Mhz"; hertzPosition=6;}?
? else{increment = 10; hertz = "10 Hz"; hertzPosition=5;};?
?? lcd.setCursor(0,1);
?? lcd.print("??????????????? ");
?? lcd.setCursor(hertzPosition,1);
?? lcd.print(hertz);
?? delay(250); // Adjust this delay to speed up/slow down the button menu scroll speed.
};

void showFreq(){
??? millions = int(rx/1000000);
??? hundredthousands = ((rx/100000)%10);
??? tenthousands = ((rx/10000)%10);
??? thousands = ((rx/1000)%10);
??? hundreds = ((rx/100)%10);
??? tens = ((rx/10)%10);
??? ones = ((rx/1)%10);
??? lcd.setCursor(0,0);
??? lcd.print("??????????????? ");
?? if (millions > 9){lcd.setCursor(1,0);}
?? else{lcd.setCursor(2,0);}
??? lcd.print(millions);
??? lcd.print(".");
??? lcd.print(hundredthousands);
??? lcd.print(tenthousands);
??? lcd.print(thousands);
??? lcd.print(".");
??? lcd.print(hundreds);
??? lcd.print(tens);
??? lcd.print(ones);
??? lcd.print(" Mhz? ");
??? timepassed = millis();
??? memstatus = 0; // Trigger memory write
};

void storeMEM(){
? //Write each frequency section to a EPROM slot.? Yes, it's cheating but it works!
?? EEPROM.write(0,millions);
?? EEPROM.write(1,hundredthousands);
?? EEPROM.write(2,tenthousands);
?? EEPROM.write(3,thousands);
?? EEPROM.write(4,hundreds);??????
?? EEPROM.write(5,tens);
?? EEPROM.write(6,ones);??
?? memstatus = 1;? // Let program know memory has been written
};



From: [email protected] [[email protected]] on behalf of Adam Sliwa [sq9tla@...]
Sent: Wednesday, March 01, 2017 1:52 AM
To: [email protected]
Subject: [BITX20] bitx40 VFO

I?bought you?trx without DDS.? I'm making DDS witch Arduino Nano and?AD8950 module. I have?any questions.
What is?ferquency VFO (4.8 - 5 MHz for 7-7.2 MHz) ?
How many ?volts should?signal output DDS?
Output signal from VFO on the board? should connect GND or? breake path ?

Regards , adam


Jack Purdum
 

The Arduino String processing functions carry a lot of overhead and can fragment your memory. If you can, avoid the String class objects and use C strings (note lowercase 's') using char arrays instead. The following example shows a simple way to store and retrieve a frequency from EEPROM. The two functions of interest are the StoreFrequency() and RetrieveFrequency().

#include <EEPROM.h>

#define FREQOFFSET ?10 ? ?// Byte address of where frequency is stored

union eUnion{
? byte v[sizeof(long)]; ? ? ? ? ? ?// Array with enough elements to hold a long data type
? long num;
} myUnion;

/
? ? Purpose: To store a long data type into EEPROM

? ? Parameter list:
? ? ? ? eUnion m ? ? ? ?// A union with a 4-element byte array, and a long

? ?Return type:
? ? ? ? void

? ? CAUTION: This code assumes that FREQOFFSET defines the address of the long in the EEPROM memory space
/
void StoreFrequency(eUnion m){ ? ? ? ? ? ?// Write frequency to EEPROM
? int i;
? for (i = 0; i < sizeof(long); i++)
? ? EEPROM.write(FREQOFFSET + i, m.v[i]);
}

/
? ? Purpose: To retrieve a long data type from EEPROM

? ? Parameter list:
? ? ? ? eUnion m ? ? ? ?// A union with a 4-element byte array, and a long

? ?Return type:
? ? ? ? void

? ? CAUTION: This code assumes that FREQOFFSET defines the address of the long in the EEPROM memory space
/
long RetrieveFrequency(eUnion m) { ? ? ?// Read a frequency from EEPROM
? ? int i;
? for (i = 0; i < sizeof(long); i++)
? ? m.v[i] = EEPROM.read(FREQOFFSET + i);

? return m.num;
}
void setup() {

? long frequency = 7040000L;
? long rF;
?
? Serial.begin(9600);
? Serial.print("Frequency = ");
? Serial.println(frequency);

? myUnion.num = frequency; ? ? ? ? ?// Store frequency in union
? StoreFrequency(myUnion); ? ? ? ? ?// write it to EEPROM

? rF = RetrieveFrequency(myUnion); ?// Retrieve it
? Serial.print("Retrieved Frequency = ");
? Serial.println(rF);
}

void loop() {
}

A union in C is a little chunk of memory that's capable of holding the largest member of whatever is defined in the union. Since frequency is expressed as a long, we need to reserve 4 bytes of memory (e.g., sizeof(long)). We then assign the frequency into the union with the statement:
? myUnion.num = frequency; ? ? ? ? ?// Store frequency in union
The StoreFrequency() function simply writes that frequency to EEPROM as 4 bytes of data. It could care less that it's a long. To the compiler, it's just 4 bytes of data. Likewise, RetrieveFrequency() simply reads those same 4 bytes of data back into the byte array named v[]?that is part of the union. The code has no clue what those 4 bytes are, but we know it's the frequency, so we treat them as a long and return that value with the statement:

? return m.num;

This is a pretty simple way to read and write to EEPROM. The nice thing about unions is that it doesn't have to contend with how the compiler stored the byte-order of the data (e.g., the Endian Problem).

Jack, W8TEE


From: Billy Shepherd <billy.shepherd@...>
To: [email protected]
Sent: Tuesday, April 4, 2017 12:36 PM
Subject: Re: [BITX20] bitx40 VFO

Also, here is the code that worked or my Arduino Mega

/*
Main code by Richard Visokey AD7C - www.ad7c.com
Revision 2.0 - November 6th, 2013
*/

// Include the library code
#include <LiquidCrystal.h>
#include <rotary.h>
#include <EEPROM.h>

//Setup some items
#define W_CLK 8?? // Pin 8 - connect to AD9850 module word load clock pin (CLK)
#define FQ_UD 9?? // Pin 9 - connect to freq update pin (FQ)
#define DATA 10?? // Pin 10 - connect to serial data load pin (DATA)
#define RESET 11? // Pin 11 - connect to reset pin (RST)
#define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); }
Rotary r = Rotary(2,3); // sets the pins the rotary encoder uses.? Must be interrupt pins.
LiquidCrystal lcd(12, 13, 7, 6, 5, 4); // I used an odd pin combination because I need pin 2 and 3 for the interrupts.
int_fast32_t rx=7200000; // Starting frequency of VFO
int_fast32_t rx2=1; // variable to hold the updated frequency
int_fast32_t increment = 10; // starting VFO update increment in HZ.
int buttonstate = 0;
String hertz = "10 Hz";
int? hertzPosition = 5;
byte ones,tens,hundreds,thousands,tenthousands,hundredthousands,millions ;? //Placeholders
String freq; // string to hold the frequency
int_fast32_t timepassed = millis(); // int to hold the arduino miilis since startup
int memstatus = 1;? // value to notify if memory is current or old. 0=old, 1=current.





int ForceFreq = 1;? // Change this to 0 after you upload and run a working sketch to activate the EEPROM memory.? YOU MUST PUT THIS BACK TO 0 AND UPLOAD THE SKETCH AGAIN AFTER STARTING FREQUENCY IS SET!




void setup() {
? pinMode(A0,INPUT); // Connect to a button that goes to GND on push
? digitalWrite(A0,HIGH);
? lcd.begin(16, 2);
? attachInterrupt(0,MyIsr,CHANGE);
attachInterrupt(1,MyIsr,CHANGE);
?
? pinMode(FQ_UD, OUTPUT);
? pinMode(W_CLK, OUTPUT);
? pinMode(DATA, OUTPUT);
? pinMode(RESET, OUTPUT);
? pulseHigh(RESET);
? pulseHigh(W_CLK);
? pulseHigh(FQ_UD);? // this pulse enables serial mode on the AD9850 - Datasheet page 12.
? lcd.setCursor(hertzPosition,1);???
? lcd.print(hertz);
?? // Load the stored frequency?
? if (ForceFreq == 0) {
??? freq = String(EEPROM.read(0))+String(EEPROM.read(1))+String(EEPROM.read(2))+String(EEPROM.read(3))+String(EEPROM.read(4))+String(EEPROM.read(5))+String(EEPROM.read(6));
??? rx = freq.toInt();?
? }
}


void loop() {
? if (rx != rx2){???
??????? showFreq();
??????? sendFrequency(rx);
??????? rx2 = rx;
????? }
?????
? buttonstate = digitalRead(A0);
? if(buttonstate == LOW) {
??????? setincrement();???????
??? };

? // Write the frequency to memory if not stored and 2 seconds have passed since the last frequency change.
??? if(memstatus == 0){??
????? if(timepassed+2000 < millis()){
??????? storeMEM();
??????? }
????? }??
}


void MyIsr(void) {
? unsigned char result = r.process();
? if (result) {???
??? if (result == DIR_CW){rx=rx+increment;}
??? else {rx=rx-increment;};??????
????? if (rx >=30000000){rx=rx2;}; // UPPER VFO LIMIT
????? if (rx <=1000000){rx=rx2;}; // LOWER VFO LIMIT
? }
}



// frequency calc from datasheet page 8 = <sys clock> * <frequency tuning word>/2^32
void sendFrequency(double frequency) {?
? int32_t freq = frequency * 4294967295/125000000;? // note 125 MHz clock on 9850.? You can make 'slight' tuning variations here by adjusting the clock frequency.
? for (int b=0; b<4; b++, freq>>=8) {
??? tfr_byte(freq & 0xFF);
? }
? tfr_byte(0x000);?? // Final control byte, all 0 for 9850 chip
? pulseHigh(FQ_UD);? // Done!? Should see output
}
// transfers a byte, a bit at a time, LSB first to the 9850 via serial DATA line
void tfr_byte(byte data)
{
? for (int i=0; i<8; i++, data>>=1) {
??? digitalWrite(DATA, data & 0x01);
??? pulseHigh(W_CLK);?? //after each bit sent, CLK is pulsed high
? }
}

void setincrement(){
? if(increment == 10){increment = 50; hertz = "50 Hz"; hertzPosition=5;}
? else if (increment == 50){increment = 100;? hertz = "100 Hz"; hertzPosition=4;}
? else if (increment == 100){increment = 500; hertz="500 Hz"; hertzPosition=4;}
? else if (increment == 500){increment = 1000; hertz="1 Khz"; hertzPosition=6;}
? else if (increment == 1000){increment = 2500; hertz="2.5 Khz"; hertzPosition=4;}
? else if (increment == 2500){increment = 5000; hertz="5 Khz"; hertzPosition=6;}
? else if (increment == 5000){increment = 10000; hertz="10 Khz"; hertzPosition=5;}
? else if (increment == 10000){increment = 100000; hertz="100 Khz"; hertzPosition=4;}
? else if (increment == 100000){increment = 1000000; hertz="1 Mhz"; hertzPosition=6;}?
? else{increment = 10; hertz = "10 Hz"; hertzPosition=5;};?
?? lcd.setCursor(0,1);
?? lcd.print("??????????????? ");
?? lcd.setCursor(hertzPosition,1);
?? lcd.print(hertz);
?? delay(250); // Adjust this delay to speed up/slow down the button menu scroll speed.
};

void showFreq(){
??? millions = int(rx/1000000);
??? hundredthousands = ((rx/100000)%10);
??? tenthousands = ((rx/10000)%10);
??? thousands = ((rx/1000)%10);
??? hundreds = ((rx/100)%10);
??? tens = ((rx/10)%10);
??? ones = ((rx/1)%10);
??? lcd.setCursor(0,0);
??? lcd.print("??????????????? ");
?? if (millions > 9){lcd.setCursor(1,0);}
?? else{lcd.setCursor(2,0);}
??? lcd.print(millions);
??? lcd.print(".");
??? lcd.print(hundredthousands);
??? lcd.print(tenthousands);
??? lcd.print(thousands);
??? lcd.print(".");
??? lcd.print(hundreds);
??? lcd.print(tens);
??? lcd.print(ones);
??? lcd.print(" Mhz? ");
??? timepassed = millis();
??? memstatus = 0; // Trigger memory write
};

void storeMEM(){
? //Write each frequency section to a EPROM slot.? Yes, it's cheating but it works!
?? EEPROM.write(0,millions);
?? EEPROM.write(1,hundredthousands);
?? EEPROM.write(2,tenthousands);
?? EEPROM.write(3,thousands);
?? EEPROM.write(4,hundreds);??????
?? EEPROM.write(5,tens);
?? EEPROM.write(6,ones);??
?? memstatus = 1;? // Let program know memory has been written
};



From: [email protected] [[email protected]] on behalf of Adam Sliwa [sq9tla@...]
Sent: Wednesday, March 01, 2017 1:52 AM
To: [email protected]
Subject: [BITX20] bitx40 VFO

I?bought you?trx without DDS.? I'm making DDS witch Arduino Nano and?AD8950 module. I have?any questions.
What is?ferquency VFO (4.8 - 5 MHz for 7-7.2 MHz) ?
How many ?volts should?signal output DDS?
Output signal from VFO on the board? should connect GND or? breake path ?

Regards , adam



Jack Purdum
 

Billy:

I know that no one sits there spinning their tuning encoder 24/7, stopping every 2.1 seconds along the way. But if someone did do that, the EEPROM may become suspect after 139 days. I would suggest the following small changes:

#define EPAUSE ? ?60000L ? ?// Place after the #include preprocessor directives...


// then in loop()

? ? ? if(timepassed +?EPAUSE < millis()){ ?// If I hang around for more than a minute...

This would make it pretty easy for someone to change the I'm-just-tuning-around delay to some other value that better-suits their tuning preferences. Sometimes I paused for several seconds listening to a transmission before moving on. Most of the time, I would not need to preserve that particular frequency in EEPROM as I do a hunt-and-pounce type of movement.

Jack, W8TEE


From: Billy Shepherd <billy.shepherd@...>
To: [email protected]
Sent: Tuesday, April 4, 2017 12:36 PM
Subject: Re: [BITX20] bitx40 VFO

Also, here is the code that worked or my Arduino Mega

/*
Main code by Richard Visokey AD7C - www.ad7c.com
Revision 2.0 - November 6th, 2013
*/

// Include the library code
#include <LiquidCrystal.h>
#include <rotary.h>
#include <EEPROM.h>

//Setup some items
#define W_CLK 8?? // Pin 8 - connect to AD9850 module word load clock pin (CLK)
#define FQ_UD 9?? // Pin 9 - connect to freq update pin (FQ)
#define DATA 10?? // Pin 10 - connect to serial data load pin (DATA)
#define RESET 11? // Pin 11 - connect to reset pin (RST)
#define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); }
Rotary r = Rotary(2,3); // sets the pins the rotary encoder uses.? Must be interrupt pins.
LiquidCrystal lcd(12, 13, 7, 6, 5, 4); // I used an odd pin combination because I need pin 2 and 3 for the interrupts.
int_fast32_t rx=7200000; // Starting frequency of VFO
int_fast32_t rx2=1; // variable to hold the updated frequency
int_fast32_t increment = 10; // starting VFO update increment in HZ.
int buttonstate = 0;
String hertz = "10 Hz";
int? hertzPosition = 5;
byte ones,tens,hundreds,thousands,tenthousands,hundredthousands,millions ;? //Placeholders
String freq; // string to hold the frequency
int_fast32_t timepassed = millis(); // int to hold the arduino miilis since startup
int memstatus = 1;? // value to notify if memory is current or old. 0=old, 1=current.





int ForceFreq = 1;? // Change this to 0 after you upload and run a working sketch to activate the EEPROM memory.? YOU MUST PUT THIS BACK TO 0 AND UPLOAD THE SKETCH AGAIN AFTER STARTING FREQUENCY IS SET!




void setup() {
? pinMode(A0,INPUT); // Connect to a button that goes to GND on push
? digitalWrite(A0,HIGH);
? lcd.begin(16, 2);
? attachInterrupt(0,MyIsr,CHANGE);
attachInterrupt(1,MyIsr,CHANGE);
?
? pinMode(FQ_UD, OUTPUT);
? pinMode(W_CLK, OUTPUT);
? pinMode(DATA, OUTPUT);
? pinMode(RESET, OUTPUT);
? pulseHigh(RESET);
? pulseHigh(W_CLK);
? pulseHigh(FQ_UD);? // this pulse enables serial mode on the AD9850 - Datasheet page 12.
? lcd.setCursor(hertzPosition,1);???
? lcd.print(hertz);
?? // Load the stored frequency?
? if (ForceFreq == 0) {
??? freq = String(EEPROM.read(0))+String(EEPROM.read(1))+String(EEPROM.read(2))+String(EEPROM.read(3))+String(EEPROM.read(4))+String(EEPROM.read(5))+String(EEPROM.read(6));
??? rx = freq.toInt();?
? }
}


void loop() {
? if (rx != rx2){???
??????? showFreq();
??????? sendFrequency(rx);
??????? rx2 = rx;
????? }
?????
? buttonstate = digitalRead(A0);
? if(buttonstate == LOW) {
??????? setincrement();???????
??? };

? // Write the frequency to memory if not stored and 2 seconds have passed since the last frequency change.
??? if(memstatus == 0){??
????? if(timepassed+2000 < millis()){
??????? storeMEM();
??????? }
????? }??
}


void MyIsr(void) {
? unsigned char result = r.process();
? if (result) {???
??? if (result == DIR_CW){rx=rx+increment;}
??? else {rx=rx-increment;};??????
????? if (rx >=30000000){rx=rx2;}; // UPPER VFO LIMIT
????? if (rx <=1000000){rx=rx2;}; // LOWER VFO LIMIT
? }
}



// frequency calc from datasheet page 8 = <sys clock> * <frequency tuning word>/2^32
void sendFrequency(double frequency) {?
? int32_t freq = frequency * 4294967295/125000000;? // note 125 MHz clock on 9850.? You can make 'slight' tuning variations here by adjusting the clock frequency.
? for (int b=0; b<4; b++, freq>>=8) {
??? tfr_byte(freq & 0xFF);
? }
? tfr_byte(0x000);?? // Final control byte, all 0 for 9850 chip
? pulseHigh(FQ_UD);? // Done!? Should see output
}
// transfers a byte, a bit at a time, LSB first to the 9850 via serial DATA line
void tfr_byte(byte data)
{
? for (int i=0; i<8; i++, data>>=1) {
??? digitalWrite(DATA, data & 0x01);
??? pulseHigh(W_CLK);?? //after each bit sent, CLK is pulsed high
? }
}

void setincrement(){
? if(increment == 10){increment = 50; hertz = "50 Hz"; hertzPosition=5;}
? else if (increment == 50){increment = 100;? hertz = "100 Hz"; hertzPosition=4;}
? else if (increment == 100){increment = 500; hertz="500 Hz"; hertzPosition=4;}
? else if (increment == 500){increment = 1000; hertz="1 Khz"; hertzPosition=6;}
? else if (increment == 1000){increment = 2500; hertz="2.5 Khz"; hertzPosition=4;}
? else if (increment == 2500){increment = 5000; hertz="5 Khz"; hertzPosition=6;}
? else if (increment == 5000){increment = 10000; hertz="10 Khz"; hertzPosition=5;}
? else if (increment == 10000){increment = 100000; hertz="100 Khz"; hertzPosition=4;}
? else if (increment == 100000){increment = 1000000; hertz="1 Mhz"; hertzPosition=6;}?
? else{increment = 10; hertz = "10 Hz"; hertzPosition=5;};?
?? lcd.setCursor(0,1);
?? lcd.print("??????????????? ");
?? lcd.setCursor(hertzPosition,1);
?? lcd.print(hertz);
?? delay(250); // Adjust this delay to speed up/slow down the button menu scroll speed.
};

void showFreq(){
??? millions = int(rx/1000000);
??? hundredthousands = ((rx/100000)%10);
??? tenthousands = ((rx/10000)%10);
??? thousands = ((rx/1000)%10);
??? hundreds = ((rx/100)%10);
??? tens = ((rx/10)%10);
??? ones = ((rx/1)%10);
??? lcd.setCursor(0,0);
??? lcd.print("??????????????? ");
?? if (millions > 9){lcd.setCursor(1,0);}
?? else{lcd.setCursor(2,0);}
??? lcd.print(millions);
??? lcd.print(".");
??? lcd.print(hundredthousands);
??? lcd.print(tenthousands);
??? lcd.print(thousands);
??? lcd.print(".");
??? lcd.print(hundreds);
??? lcd.print(tens);
??? lcd.print(ones);
??? lcd.print(" Mhz? ");
??? timepassed = millis();
??? memstatus = 0; // Trigger memory write
};

void storeMEM(){
? //Write each frequency section to a EPROM slot.? Yes, it's cheating but it works!
?? EEPROM.write(0,millions);
?? EEPROM.write(1,hundredthousands);
?? EEPROM.write(2,tenthousands);
?? EEPROM.write(3,thousands);
?? EEPROM.write(4,hundreds);??????
?? EEPROM.write(5,tens);
?? EEPROM.write(6,ones);??
?? memstatus = 1;? // Let program know memory has been written
};



From: [email protected] [[email protected]] on behalf of Adam Sliwa [sq9tla@...]
Sent: Wednesday, March 01, 2017 1:52 AM
To: [email protected]
Subject: [BITX20] bitx40 VFO

I?bought you?trx without DDS.? I'm making DDS witch Arduino Nano and?AD8950 module. I have?any questions.
What is?ferquency VFO (4.8 - 5 MHz for 7-7.2 MHz) ?
How many ?volts should?signal output DDS?
Output signal from VFO on the board? should connect GND or? breake path ?

Regards , adam