Moin moin,
mit viel Verspätung erstmal ein frohes neues Jahr !
Seit einer Woche versuche ich ein AD9850 Funktionsgenerator mit einem ATmega8 zum
Arbeiten zu bewegen. Um dem "Ding" den Lebensgeist einzuhauchen, ist nötig ein Frequenztuningbyte zu übermitteln. Im Anhang befindet sich ein Liniendiagramm. Dies kann seriell oder parallel geschehen. Ich versuche mich gerade an der seriellen Variante. Um das Tuningbyte (eigentlich ist ein WORD, oder?) habe ich folgende Gleichung: f_tuning=f_soll*2^32/125*10^6;
f_tuning=der zu schiebende Datenwert
f_soll=Wunschfrequenz
125*10^6=Taktfrequenz
Für die Frequenz sind lediglich die Bits 0 bis 31 entscheidend, der Rest ist für höhere Bestimmungen.
Frage:
f_soll=1kHz....
da komme ich mit meinem Taschenrechner auf: 1000011000110111
Nun habe ich beide Richtungen zum Schieben versucht, ohne Erfolg.
Eine ShiftOut-Funktion habe ich nicht..... gibts wohl nur beim Ardiuno.....
CodeBox C
Hat jemand Erfahrungen mit den AD-Dingern?
mit viel Verspätung erstmal ein frohes neues Jahr !
Seit einer Woche versuche ich ein AD9850 Funktionsgenerator mit einem ATmega8 zum
Arbeiten zu bewegen. Um dem "Ding" den Lebensgeist einzuhauchen, ist nötig ein Frequenztuningbyte zu übermitteln. Im Anhang befindet sich ein Liniendiagramm. Dies kann seriell oder parallel geschehen. Ich versuche mich gerade an der seriellen Variante. Um das Tuningbyte (eigentlich ist ein WORD, oder?) habe ich folgende Gleichung: f_tuning=f_soll*2^32/125*10^6;
f_tuning=der zu schiebende Datenwert
f_soll=Wunschfrequenz
125*10^6=Taktfrequenz
Für die Frequenz sind lediglich die Bits 0 bis 31 entscheidend, der Rest ist für höhere Bestimmungen.
Frage:
f_soll=1kHz....
da komme ich mit meinem Taschenrechner auf: 1000011000110111
Nun habe ich beide Richtungen zum Schieben versucht, ohne Erfolg.
Eine ShiftOut-Funktion habe ich nicht..... gibts wohl nur beim Ardiuno.....
CodeBox C
uint32_t tuning = 0b 00000000 00000000 10000110 00110111; // die ersten 16 Bits habe ich mit 0 //aufgefüllt, bei höheren Frequenzen stehen da entsprechende Werte uint32_t temp; uint32_t i; // Zähler in der For-Next-Schleife uint16_t test; while(i>=0) { //Dann schiebe ich das Ganze mit temp = tuning >> i; //Prüfen ob Bit 1 gesetzt: test = (temp & 1); //Dann 1 oder 0 an AD senden: Den W_Clck sowie die _delay_ms habe ich mal hier weggelassen.... if(test) { PORTC |= (1 << DATA); } else { PORTC &= ~(1 << DATA); } }
Hat jemand Erfahrungen mit den AD-Dingern?