Servus zusammen, ich muss um den AD9833 anzusteuern 2 14-Bit Codewörter übertragen. Da meine AVR Kenntnisse fast 0 sind, wollte ich mal fragen, ob mir hier jmd. helfen kann... Leider kommt der AD9833 nicht in Wallung, ich vermute aber einen gravierenden Fehler in meinem Code... Besten Dank für alle Hinweise ! Lg Christian //includes ////////// #include "avr/io.h" //defines ///////// #define DDS_MCLK 24000000 /* DDS Clock */ #define DDS_CONSTANT 268435456 /* 2^28 */ #define DDS_DDR DDRD /* data direction reg*/ #define DDS_PORT PORTD #define DDS_SDATA PIN0 #define DDS_SCLCK PIN1 #define DDS_FSYNC PIN2 //predeclarations void DDS_WriteBits(int16_t nValue); //calculate codeword: //CW = (Freq / DDS_MCLK) * DDS_CONSTANT //for 5 mhz with 25 MHz clock: 0x33333333 int main(void) { //variables /////////// int32_t dwFreq = 5000000; int32_t dwCodeWord = (dwFreq / DDS_MCLK) * DDS_CONSTANT; //port init DDS_DDR = 0xFF; //all output DDS_WriteBits(dwCodeWord & 0xFFFF); DDS_WriteBits((dwCodeWord & 0x0000FFFF) << 16); while(1) { } return 0; } void DDS_WriteBits(int16_t nValue) { DDS_PORT &= ~_BV(DDS_FSYNC); SPDR = (nValue >> 8) & 0xFF; while(!(SPSR & _BV(SPIF))); SPDR = nValue & 0xFF; while(!(SPSR & _BV(SPIF))); DDS_PORT |= _BV(DDS_FSYNC); }
Servus, niemand der da helfen kann ? Ich habe am Code weiter gemchat und bekomme nun mittlerweile ein Signal aus dem AD9833, aber es bestehen immer noch 2 Probleme: 1. Die errechnete Frequenz wird nicht erreicht (statt 1 MHz messe ich 150 KHz) 2. Wenn ich die Freuquenz veränder stürzt der Prozessor nach einigen (5 - 10 Schaltvorgängen ab) Lg Christian
Hallo Christian, Frage: Warum benutzt Du nicht das SPI-Interface vom AVR (richtigen mode aber einstellen, spi mode2 und vorher CLK auf high setzen, bevor Du es als Output konfigurierst !) ? Wenn ich mich recht erinnere muss der AD9833 auch noch richtig grundinitialisiert werden, bevor Du da die erwarteten Frequenzen herausbekommst. Nach Power-On Reset haben benötigte interne Register nämlich undefinierte Zustände lt. datasheet. Irgendwo hier im Forum oder über google findest Du C-code dazu. Gutt lack, Tom.
Hallo Tomas, danke für die Antwort, ich habe den SPI Bus sinnigerweise für den Programmierdongel vorgesehen, werde es am Wochenende aber mal mit SPI versuchen... Lg Christian
Die SPI pins kann man doppelt besetzen, denn der Programmieradapter ist nur waehrend Reset=0 aktiv, und sollte waehrend Reset=1 auf tristate sein.
...hmmm - gönne Dir ruhig einen JTAG-Dongle. Damit kannst Du dann vernünftig source-level debugging machen. Burn-and-learn über ISP ist nicht mehr ganz Stand der Technik. Gruss, Tomas.
Hallo, danke für die Infos, mittlerweile habe ich es aber am laufen -> siehe Codesammlung Lg Christian
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.