Forum: Mikrocontroller und Digitale Elektronik DDS Oszillator will nicht


von P. Müller (Gast)


Lesenswert?

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

von Zacc (Gast)


Lesenswert?

Ja, mach das bitte. Vielleicht hilfts.

von P. Müller (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Andreas (Gast)


Lesenswert?

Was sagt denn das Datenblatt - muss man eventuell CS/ nach jedem 
Transfer auf High ziehen?

von P. Müller (Gast)


Lesenswert?

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

von YAG (Gast)


Lesenswert?

Der DDS-Baustein selbst muß ja auch initialisiert werden. Hast du das 
gemacht?

von P. Müller (Gast)


Lesenswert?

Ich verwende die default-Einstellungen, dann brauche ich den Chip doch 
eigentlich auch nicht zu initialisieren, oder?

Mfg

von Zacc (Gast)


Lesenswert?

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.

von P. Müller (Gast)


Lesenswert?

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

von Zacc (Gast)


Lesenswert?

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 ?

von P.Müller (Gast)


Lesenswert?

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