Forum: Mikrocontroller und Digitale Elektronik Daten zum AD9833 in C übertragen


von Christian (Gast)


Lesenswert?

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);
}

von Christian (Gast)


Angehängte Dateien:

Lesenswert?

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

von Tomas K. (Firma: tktronic) (tktronic)


Lesenswert?

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.

von Christian (Gast)


Lesenswert?

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

von so nicht (Gast)


Lesenswert?

Die SPI pins kann man doppelt besetzen, denn der Programmieradapter ist 
nur waehrend Reset=0 aktiv, und sollte waehrend Reset=1 auf tristate 
sein.

von Tomas (Gast)


Lesenswert?

...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.

von Christian (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.