Hallo,
ich möchte einen LTC2756 18 Bit DAC über SPI an einem Atmega32
ansteuern.
Initialisieren funktioniert Ausgabe von Werten mittels Byteweiser
Übergabe
funktioniert auch (high mid Low)
Wenn ich die untenaufgeführte Funktion in einer Schleife von 0 bis 2^18
-1 aufrufe geht alles gut bis zu dem Wert 65536.
Hier springt meine Spannung wieder auf 0.
Welchen Fehler mache ich hier?
Oliver F. schrieb:> Wenn ich die untenaufgeführte Funktion in einer Schleife von 0 bis 2^18> -1 aufrufe geht alles gut bis zu dem Wert 65536.
Und wie sehen Schleife und zugehörige Variablendeklarationen aus?
Wie sieht der Parameter aus, den du der Funktion übergibst? Aktuell
sendest du nämlich nur 2. bis 4. Byte deines 32-Bit-Parameters und das
auch in der vermutlich falschen Reihenfolge.
Dass der Chip noch einen Controllcode zusammen mit dem DAC-Wert möchte
beachtest du in deiner Schleife?
Es würde übrigends reichen, für b1 bis b4 uint8_t zu nehmen, dann kannst
du dir auch das &0xFF sparen um auf 8 Bit zu kürzen.
HAllo
schon mal Danke,
hier ist ein weitere Code Auschnitt:
Ich durchalaufe hier die Tabelle von 0 -71 was bis zum wert 61860 auch
funktionier dann fangt die Spannung wieder bei O an bei 131072 passiert
das wieder.
Es muss irgendwie an der Konvertierung liegen
Also soweit ich das beim überfliegen sehe schreibst du erst den
Steuercode 48 = 0011 0000 als 8 Bit Wert, soweit korrekt. Allerdings
macht deine Funktion SPIWrite24() für mich wenig Sinn. Die sollte doch
eigentlich den Parameter passend aufbereiten und dann raussenden?
Von den restlichen 24 Bit die nach dem Steuercode zu senden sind, sind
die ersten 18 der Wert für den DAC und danach folgen noch 6 Bit
Don't-care. Du sendest allerdings die niederwertigsten 8 Bit garnicht
welche in b1 liegen. Danach folgt dann in der falschen Reihenfolge der
Rest, das heißt die letzten 6 Bit von b4 werden vom DAC dann auch
ignoriert.
Dass da überhaupt etwas sinnvolles rauskommt ist finde ich echt
erstaunlich. Ich würde dir empfehlen erstmal den Code dahingehend zu
bearbeiten, dass der Wert korrekt rausgesendet wird, vermutlich erledigt
sich dadurch dann auch das von dir beobachtete Fehlverhalten.
Nachdem deine Eingangswerte maximal 18 Bit haben würde ich in der
Funktion SPIWrite24() die Daten erstmal um 6 nach links shiften und dann
die unteren 3 Byte beginnend mit dem höchstwertigsten versenden.
Also sowas wie
Data = Data << 6;
while(!(SPSR & (1<<SPIF)));
SPDR = (Data >> 16);
while(!(SPSR & (1<<SPIF)));
SPDR = (Data >> 8);
while(!(SPSR & (1<<SPIF)));
SPDR = Data&0xFF;
Oliver F. schrieb:> Es muss irgendwie an der Konvertierung liegen
Tut es wohl auch.
Deine Konstanten sollten vom Datentyp unsigned /long/ sein, also z.B.
165151UL