//FSK_DDS v1.3 2016.02.23
//ARDUINO UNO + AD9850
#define CLK 8 //UNO:PORT_B0
#define FQ 9 //UNO:PORT_B1
#define DATA 10 //UNO:PORT_B2
#define RST 11 //UNO:PORT_B3
long mark = 7035000; // ***** Set operating frequency here in Hz. *****
void shortPulse (char PIN)
{
digitalWrite(PIN, 1);
digitalWrite(PIN, 0);
}
void setFreq(double freq)
{
//--calculate
int32_t d_Phase = freq * pow(2, 32) / 125000000;
//--send first 32bit
for (int i=0; i<32; i++, d_Phase>>=1)
{
if(d_Phase & 1 == 1)
{
PORTB |= _BV(2); //--data
}
else
{
PORTB &= ~_BV(2); //--data
}
//--short pulse clk
PORTB |= _BV(0);
PORTB &= ~_BV(0);
}
//--send rest 8bit
PORTB &= ~_BV(2); //--data
for (int i=0; i<8; i++)
{
//--short pulse clk
PORTB |= _BV(0);
PORTB &= ~_BV(0);
}
//--finish, short pulse fq
PORTB |= _BV(1);
delayMicroseconds(30);
PORTB &= ~_BV(1);
}
void setup()
{
pinMode(CLK, OUTPUT);
pinMode(FQ, OUTPUT);
pinMode(DATA, OUTPUT);
pinMode(RST, OUTPUT);
//--reset
shortPulse(RST);
shortPulse(CLK);
//--change mode
shortPulse(FQ);
//--start,mark=idle
delay(100);
setFreq(mark);
delay(500);
}
void loop()
{
static boolean state1 = 1;
static boolean state2 = 0;
static long space = mark - 170;
if(digitalRead(6) == 0) //--trx control
{
setFreq(2);
state1 = 0;
delay(44);
}
else
{
state2 = digitalRead(7); //--fsk keying input
if(state2 != state1)
{
if(state2 == 1)
{
setFreq(mark);
}
else
{
setFreq(space);
}
state1 = state2;
}
}
}