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
...wäre evtl. hilfreich wenn Du Deine HW-Beschaltung noch postest
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.
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
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
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
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
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.