For use the module with fake FT232R you can use original software named FT Prog (read User manual too). Must change the PID from 0000 in 6001 (like at original chipset):
If this method not work you can use a modified 2 inf files in original driver directory
or add 2 modified inf files like me:
In ftdibus.inf and ftdiport.inf (or ftdibus2.inf and ftdiport2.inf) must replace VID_0403&PID_6001 with VID_0403&PID_0000.
who work fine with SWTFT library from Smoke and Wires, I write a sketch for a virtual keyboard... after some tests, I decided to use the DDS module with AD9850 (see article Signal generator with AD9850 and Arduino) together with this display and made a "touch screen DDS".
Display is made as a shield for Arduino Uno/Mega boards and use a lot of outputs...
I designed a intermediate shield for disconnect the microSD and connect the AD9850 module:
I use this sketch for DDS with AD9850, Arduino and rotary encoder:
/*Main code by Richard Visokey AD7C - http://www.ad7c.comRevision 2.0 - November 6th, 2013adapted sketch 1.2 - january 1st, 2015 - by Nicu Florica - http://www.tehnic.go.rohttp://nicuflorica.blogspot.ro/http://arduinotehniq.blogsopt.com/*/// 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(13, 12, 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 = 1; // starting VFO update increment in HZ.int buttonstate = 0;
String hertz = "1 Hz";
int hertzPosition = 6;
byte ones,tens,hundreds,thousands,tenthousands,hundredthousands,millions ; //PlaceholdersString freq; // string to hold the frequency
int_fast32_t timepassed = millis(); // int to hold the arduino miilis since startupint memstatus = 1; // value to notify if memory is current or old. 0=old, 1=current.int ForceFreq = 0; // 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!voidsetup() {
pinMode(A0,INPUT); // Connect to a button that goes to GND on pushdigitalWrite(A0,HIGH);
lcd.begin(16, 2);
PCICR |= (1 << PCIE2);
PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
sei();
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();
}
}
voidloop() {
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();
}
}
}
ISR(PCINT2_vect) {
unsignedchar result = r.process();
if (result) {
if (result == DIR_CW){rx=rx+increment;}
else {rx=rx-increment;};
if (rx >=30000000){rx=rx2;}; // UPPER VFO LIMITif (rx <=1){rx=rx2;}; // LOWER VFO LIMIT
}
}
// frequency calc from datasheet page 8 = <sys clock> * <frequency tuning word>/2^32void 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 linevoid 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 == 1){increment = 10; hertz = "10 Hz"; hertzPosition=5;}
elseif(increment == 10){increment = 50; hertz = "50 Hz"; hertzPosition=5;}
elseif (increment == 50){increment = 100; hertz = "100 Hz"; hertzPosition=4;}
elseif (increment == 100){increment = 500; hertz="500 Hz"; hertzPosition=4;}
elseif (increment == 500){increment = 1000; hertz="1 kHz"; hertzPosition=6;}
elseif (increment == 1000){increment = 2500; hertz="2.5 kHz"; hertzPosition=4;}
elseif (increment == 2500){increment = 5000; hertz="5 kHz"; hertzPosition=6;}
elseif (increment == 5000){increment = 10000; hertz="10 kHz"; hertzPosition=5;}
elseif (increment == 10000){increment = 100000; hertz="100 kHz"; hertzPosition=4;}
elseif (increment == 100000){increment = 1000000; hertz="1 MHz"; hertzPosition=6;}
else{increment = 1; hertz = "1 Hz"; hertzPosition=6;};
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
lcd.setCursor(1,15);
lcd.print("*");
delay(500);
lcd.setCursor(1,15);
lcd.print(" ");
};
Now, I have in tests a new version with a TFT display with touch using a homemade shield from Arduino:
I made a movie with a preliminary test for DDS with AD9850 and TFT display with touch...