Forum: Mikrocontroller und Digitale Elektronik AD9833 mit SPI an MEGA32, output passt nicht


von Serge W. (serge_w)


Angehängte Dateien:

Lesenswert?

Hi zusammen
Ich versuche gerade, mit nem MEGA32 über hardware SPI dem AD9833 ein 
sinussignal zu entlocken, allerdings erfolglos bis anhin. Ich hab das 
gefühl, das der DSS output völlig unabhängig von meiner software ist, 
deshalb wäre es natürlich am naheliegensten, wenn die SPI kommunikation 
noch nicht ordnungsgemäss funktioniert.
In diesem PDF wird erklärt, was man dem DSS alles senden muss, damit ein 
400Hz Sinus rauskommt:

http://www.analog.com/static/imported-files/application_notes/AN-1070.pdf

ich habe nun versucht, diese Datenwörter zu übertragen.
Mein code habe ich mal angehängt. Ich habe die steuerwörter aus dem PDF 
jeweils in 2 8 bit einheiten gesplittet, und sende diese dann separat. 
Am ausgang erhalte ich allerdings nur hochfrequenten noise.

kann mir jemand einen tipp geben?

grüsse
serge

von tom (Gast)


Lesenswert?

...wäre evtl. hilfreich wenn Du Deine HW-Beschaltung noch postest

von Bernd N (Gast)


Lesenswert?


von Serge W. (serge_w)


Angehängte Dateien:

Lesenswert?

hier noch meine beschaltung des dss

von tom (Gast)


Lesenswert?

upps, recht hochohmige serienwiderstände in den datenleitungen. da wirst 
du bei höheren clockrates auf der spi probleme bekommen.
wozu die angst-R's ? der AD9833 hat doch nur eingänge, kann nix treiben 
dort. spendier lieber 10k pullups, damit da beim power-on nix 
rumzappelt.

von Serge W. (serge_w)


Lesenswert?

ich hab das analog zu diesem funktionengenerator aufgebaut:

http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CEkQFjAA&url=http%3A%2F%2Fwww.elektroda.pl%2Frtvforum%2Fdownload.php%3Fid%3D426662&ei=aXIvUKbBL6_b4QSV6oGoCw&usg=AFQjCNFXYVW5v06xUfR8tISL9J4nQXz3UA&sig2=I_TXy6g4jy4R6XMVPFGQQw

auf seite 5.

Du würdest also die Datenleitungen direkt verbinden mit jeweils 10k 
pullup? Sollte denn mein programm so funktionieren wie ich es 
geschrieben hab?

Ich war mir eben nicht sicher wegen der übertragsfunktion, welche wie 
folgt ausschaut:

void SPI_TX(int a)
{
SPDR=a;
while(!(SPSR &(1<<SPIF))); //wait until SPIF get high
}


ist die while schleife so korrekt? Wird das SPIF vom AD9833 auf high 
gesetzt nachdem die daten übertragen wurden?

grüsse Serge

von Serge W. (serge_w)


Lesenswert?

hoi, ich nochmal
Ich denk ich hab das (oder zumindest ein) Problem gefunden. Bei meinem 
programm wird SS nach 8 bits wieder auf high gesetzt, und dann kommen 
die nächsten 8. Ich muss aber SS für 16 bits auf low halten, deshalb 
muss ich SS manuell steuern.

Ich bin nun etwas verwirrt wie das zu bewerkselligen ist. Der DSS 
verlangt ja, das SS (und damit FSYNC) low geht, während dem SCLK auf 
high ist. Wenn ich also in meinem Programm vor der Datenübertragung 
einfach SS low setze, kann das ja nicht gehen.

viele grüsse
serge

von 121212qw (Gast)


Lesenswert?

Hi

>Ich denk ich hab das (oder zumindest ein) Problem gefunden. Bei meinem
>programm wird SS nach 8 bits wieder auf high gesetzt, und dann kommen
>die nächsten 8.

In deinem Programm wir SS nur einmal auf H gesetzt und dann nicht weiter 
angerührt. Also bleibt es H.

>Ich muss aber SS für 16 bits auf low halten, deshalb
>muss ich SS manuell steuern.

Das musst du sowieso. Auch bei 8 Bit.

MfG Spess

von Serge W. (serge_w)


Lesenswert?

hallo, ich habe nun meine anweisungsblöcke wie folgt umgeschrieben:

  _delay_us(1000);
  PORTB&=~(1<<SS);
  steuerwort=0b01010000;
  SPI_TX(steuerwort);
  steuerwort=0b11000111;
  SPI_TX(steuerwort);
  PORTB|=(1<<SS);
usw...

es klappt aber immer noch nicht wunschgemäss. Was mir auffällt ist, dass 
meistens wenn ich ein neues (oder auch dasselbe) programm auf den AVR 
lade, das resultat jeweils anders ist. Manchmal hab ich nur noise, 
manchmal ein sinus mit verschiedenen frequenzen, hatte auch schon 
dreieckspannung und auch rechteck...

seltsam

lg

von E-Mail (wird nicht angezeigt) (Gast)


Lesenswert?

>Der DSS verlangt ja, das SS (und damit FSYNC) low geht, während dem SCLK >auf 
high ist.

Bei SPI gibt es vier Modi, die sich im inaktiven Clock-Pegel
und in der aktiven Clock-Flanke unterscheiden.
Hast Du das berücksichtigt?

> Wird das SPIF vom AD9833 auf high gesetzt nachdem die daten übertragen
> wurden?

Wie soll das gehen? Du hast ja nur Leitungen in Richtung Slave.

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.