Hallo Leute, hoffentlich kennen sich ein paar von euch aus mit dem Thema DDS-Oszillatoren. Ich habe hier einen AD9951 der von einem PIC 16f876 gesteuert werden soll und zwar über SPI. Leider macht der DDS an seinem Ausgang keinen Mucks (Gleichspannung 0V). Im Prinzip ist alles richtig angeschlossen, Versorgungsspannungen habe ich nachgemessen und auch die SPI (Signale auf den Leitungen mit dem Oszi angeschaut) ist OK, Taktsignal liegt auch an. Wenns jemanden gibt, der sich mit der Sache auskennt, poste ich gerne auch Schaltplan und etwas Code... MFG
So hier sind Schaltplan und Code: Initialisierung der SPI: bcf SSPCON, CKP ;clock idle: low level bsf SSPCON, SSPM0 ;clock=fosc/16, master mode bcf SSPSTAT, CKE ;transmission on rising edge bsf SSPCON, SSPEN ;SPI aktivieren Frequenzwort ändern: movlw b'00000100' ;Register ansprechen movwf SSPBUF call warteSPI ;warte bis SPI-Übertragung fertig movlw b'00000000' ;Frequenzwort auf irgendeinen Wert setzen movwf SSPBUF call warteSPI movlw b'10001111' movwf SSPBUF call warteSPI movlw b'00000000' movwf SSPBUF call warteSPI movlw b'00000000' movwf SSPBUF call warteSPI bsf PORTC, 6 ;I/O Update (an Pin 6 von PortC zum DDSChip) nop bcf PORTC, 6 die Routine warteSPI: warteSPI nochmal2 btfss PIR1, SSPIF goto nochmal2 bcf PIR1, SSPIF return An der Konfiguration vom DDS-Chip selbst wird nach dem Power-Up nichts verändert. Zuerst wird die SPI vom PIC initialisiert, dann das Frequenzwort geändert. Aber am Ausgang liegt einfach keine Schwingung an. Gibt es da irgendwas, was man beachten muss, damit der Chip was ausspuckt ?? Danke P.M.
Was sagt denn das Datenblatt - muss man eventuell CS/ nach jedem Transfer auf High ziehen?
/CS: This pin functions as an active low chip select that allows multiple devices to share the IO-Bus. -> Also bei nur einem Chip auf 0 legen.
Der DDS-Baustein selbst muß ja auch initialisiert werden. Hast du das gemacht?
Ich verwende die default-Einstellungen, dann brauche ich den Chip doch eigentlich auch nicht zu initialisieren, oder? Mfg
Ueblicherweise muss man CS nach einem Befehl wieder hoch nehmen. <Nachschau...> Seite 21 des Datenblattes sagt das auch so. So ein komplexer chip macht default gar nichts wuerde ich mal sagen.
Naja auf Seite 21 ist das im Signalgraphen mal so eingezeichnet. Wenn man mehrere Chips benutzt ist das auch richtig! Aber wenn man blos einen hat? ... Hier http://www.dl5mgd.de/dds/Bilder/Ad9951.png hat das jemand fest auf Masse gelegt - so wie ich - und es scheint zu funktionieren. Das mit der Initialisierung ist so eine Sache. Ich würde das ja gerne machen, wenn es was zu initalisieren gäbe. Die Standardeinstellungen sind zwar nicht der Wahrheit letzter Schluss - der Chip sollte damit aber trotzdem was ausgeben. Ich hab auch schon probiert das ein oder andere umszustellen - aber ohne Erfolg... :/
Stimmt. Ok, dieses CS ist eine etwas eigensinnige Implementation des SPI. Ueblicherweise wird das reingeclockte auf CS steigend gelatcht, dh uebernommen. Diese Funktion wird nun vomteilweise vom IOSync uebernommen. Mit IOSync nach tief beginnt der Zyklus. Der sollte nicht immer tief sein, denk ich. Woher weiss der chip welches bit was bedeutet ? Ein Glitch auf SCLK und es stimmt nie mehr was..... Welche Clockinput mode ist denn default aktiv ?
also zum IOSYNC: Asynchronous Active High Reset of the Serial Port Controller. When high, the current I/O operation is immediately terminated, enabling a new I/O operation to commence once IOSYNC is returned low. If unused, ground this pin; do not allow this pin to float. Sprich: Willst du einen "Kommunikationprozess" mittendrin abbrechen, dann setzt du IOSYNC auf 1. Da ich von diesem Feature aber keinen Gebrauch mache, liegt es auf GND. Die Kommunikation läuft, wie du sicher bemerkt hast über SPI. Das erste Byte gibt die Adresse von dem an, was im DDS-Chip geändert werden soll. Die Bytes danach sind die Daten. Also beim Frequenzwort erst die Adresse (00000100) danach die 4 Byte des Frequenzwortes (hier: 000000000, 10001111, 000000000 und 000000000). Danach wird der IO-Update Pin kurz auf 1 gesetzt (strobe). Damit ist der Kommunikationsprozess abgeschlossen. default clockmode: über den clockmodepin (im Schaltplan rechts unten - schwer zu lesen, sry). Der liegt bei mir auf GND - also interner Oszillator aus. Das REFCLCK-Multiplier Register steht auf 0 - also keine Multiplikation (= den Takt direkt übernehmen)
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.