Ja steruję AD9850 bez żadnej biblioteki.
Definicje: (piny przykładowe)
Kod:
#define W_CLK 1
#define FQ_UD 2
#define DATA 3
#define RESET 4
#define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); }
W funkcji setup()
Kod:
pinMode(FQ_UD, OUTPUT);
pinMode(W_CLK, OUTPUT);
pinMode(DATA, OUTPUT);
pinMode(RESET, OUTPUT);
pulseHigh(RESET);
pulseHigh(W_CLK);
pulseHigh(FQ_UD);
Później wysyłam częstotliwość wywołując funkcję sendFrequency(czestotliwosc);
W miejsce "częstotliwosc" możesz wpisać swój textfield.
Bajt do chipa wysyłam w postaci przekształconej według wzoru z AD9850 datasheet strona 8:
Therelationship of the output frequency, reference clock, and tuning
word of the AD9850 is determined by the formula:
fOUT = (∆ Phase × CLKIN)/2^32
where:
∆ Phase = value of 32-bit tuning word
CLKIN = input reference clock frequency in MHz
fOUT = frequency of the output signal in MHz
Kod:
void sendFrequency(double frq) {
int32_t f = frq * 4294967295/125000000;
//i takiego bajta wysyłam do czipa AD9850 funkcją trf_byte()
for (int b=0; b<4; b++, f>>=8) {
tfr_byte(f & 0xFF);
}
tfr_byte(0x000); //
pulseHigh(FQ_UD);
}
void tfr_byte(byte data)
{
for (int i=0; i<8; i++, data>>=1) {
digitalWrite(DATA, data & 0x01);
pulseHigh(W_CLK);
}
}
Taki sposób sterowania działa najlepiej.
Próbowałem różnych bibliotek i albo miałem problemy z obsługą przerwań, albo operatory nie pracowały na pinach jak należy, a tu masz ładny bezproblemowy kod.
Chociaż jak sobie właśnie przejrzałem bibliotekę do obsługi AD9850, to stwierdzam, że Ameryki nie odkryłem.
No ale u mnie śmiga pieknie, a to jest najważniejsze.