//* Original AD9851 DDS sketch by Andrew Smallbone at www.rocketnumbernine.com #include LiquidCrystal lcd(19,18,17,16,15,14); // lcd pin Nano pin lcd pin Nano pin // 14 A0 13 A1 // 12 A2 11 A3 // 6 A4 4 A5 const int HOLD = 7; // pin 7 is used to set one of two times for each frequency (see article) #define W_CLK 2 // Pin 2 - connect to AD9850 module clock pin (CLK) #define FQ_UD 3 // Pin 3 - connect to freq update pin (FQ) #define DATA 4 // Pin 4 - connect to serial data load pin (DATA) #define RESET 5 // Pin 5 - connect to reset pin (RST). #define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); } // 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 } } // frequency calc from datasheet page 8 = * /2^32 void sendFrequency(double frequency) { int32_t freq = frequency * 4294967295/125000677; 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 } void setup() { // configure arduino data pins for output pinMode(HOLD, INPUT); // make pin 7 high (300mSec) or low (2500mSec) for display time lcd.begin(16,2); //lcd.setCursor(0,0); //lcd.print("FOR WSPR 1500Hz"); 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 - Datasheet page 12 figure 10 } void loop() { lcd.setCursor(1,0); lcd.print("28.126100 Mhz"); sendFrequency(28126100); // freq if (digitalRead (HOLD) == HIGH) { delay (2500); } else { delay (300); } lcd.setCursor(0,0); lcd.print(" "); lcd.setCursor(1,1); lcd.print("24.926100 Mhz"); sendFrequency(24926100); // freq if (digitalRead (HOLD) == HIGH) { delay (2500); } else { delay (300); } lcd.setCursor(1,1); lcd.print(" "); lcd.setCursor(1,0); lcd.print("21.096100 Mhz"); sendFrequency(21096100); // freq if (digitalRead (HOLD) == HIGH) { delay (2500); } else { delay (300); } lcd.setCursor(1,0); lcd.print(" "); lcd.setCursor(1,1); lcd.print("18.106100 Mhz"); sendFrequency(18106100); // freq if (digitalRead (HOLD) == HIGH) { delay (2500); } else { delay (300); } lcd.setCursor(1,1); lcd.print(" "); lcd.setCursor(1,0); lcd.print("14.097100 Mhz"); sendFrequency(14097100); // freq if (digitalRead (HOLD) == HIGH) { delay (2500); } else { delay (300); } lcd.setCursor(1,0); lcd.print(" "); lcd.setCursor(1,1); lcd.print("10.140200 Mhz"); sendFrequency(10140200); // freq if (digitalRead (HOLD) == HIGH) { delay (2500); } else { delay (300); } lcd.setCursor(1,1); lcd.print(" "); lcd.setCursor(1,0); lcd.print("07.040100 Mhz"); sendFrequency(7.040100e6); // freq if (digitalRead (HOLD) == HIGH) { delay (2500); } else { delay (300); } lcd.setCursor(1,0); lcd.print(" "); lcd.setCursor(1,1); lcd.print("05.288700 Mhz"); sendFrequency(5.288700e6); // freq if (digitalRead (HOLD) == HIGH) { delay (2500); } else { delay (300); } lcd.setCursor(1,1); lcd.print(" "); lcd.setCursor(1,0); lcd.print("03.594100 Mhz"); sendFrequency(3.594100e6); // freq if (digitalRead (HOLD) == HIGH) { delay (2500); } else { delay (300); } lcd.setCursor(1,0); lcd.print(" "); lcd.setCursor(1,1); lcd.print("01.836600 Mhz"); sendFrequency(1.836600e6); // freq if (digitalRead (HOLD) == HIGH) { delay (2500); } else { delay (300); } lcd.setCursor(1,1); lcd.print(" "); }