Hallo,
ich habe leider ein kleines Problem mit meinem MCP4922.
Die Ansteuerung per SPI funktioniert, aber aus irgendeinem Grund ergeben die Daten die ich dem DAC sende nicht die richtigen Spannungen.
Hier mein Bascom-Code
Hier das genaue Problem :Code:$regfile = "m32def.dat" $framesize = 40 $swstack = 32 $hwstack = 32 $crystal = 8000000 $baud = 19200 Enable Interrupts Config Com1 = 19200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0 ' zum debuggen Config Portd.7 = Output Dim Spioutput As Word Dim Dacdata As Word Dim I As Word I = 0 Portd.7 = 0 Spioutput = 0 Dacdata = 0 'Config Spi = Hard , Interrupt = On , Data Order = Msb , Master = Yes , Polarity = High , Phase = 1 , Clockrate = 64 , Noss = 0 'testweise auf Softspi umgestellt, kein Unterschied Config Spi = Soft , Din = Pinb.6 , Dout = Portb.5 , Ss = Portb.2 , Clock = Portb.7 , Mode = 3 , Ss = None Spiinit Do 'Main For I = 0 To 4095 ' entspricht &B0000_0000_0000_0000-0000_1111_1111_1111 Dacdata = I Spioutput = 12288 + Dacdata ' 12288 entspricht &B0011_0000_0000_0000 ' also GN=1(Vref*1) und SHDN auf 1 (disabled) Waitms 200 ' damit man die Änderungen auch sehen kann Portd.7 = 0 Waitus 20 Spiout Spioutput , 2 Waitus 20 Portd.7 = 1 Waitus 20 Next I Loop 'erwartet wird eine Sägezahnkurve von GND-5V
An den VoutA ist eine LED mit Vorwiderstand angeschlossen. Diese fadet zwar, allerdings viel zu schnell und mit grossen Helligkeitssprüngen. Gebe ich "Spioutput" auf der seriellen Schnittstelle aus, so fällt auf das die LED noch innerhalb der FOR schleife aus und angeht, wobei die Intervalle unterschiedlich lange sind.
Ich werde das Gefühl nicht los das mein Datenformat für den DAC nicht stimmen (also die 12 Bit).
Vielleicht seht ihr ja mehr als ich.
MfG
Burga
So leute habe meinen Fehler gefunden.
Habe jetzt das Senden an den DAC in 2 Schritte unterteilt und damit gelöst.
Hier der Code :
Anscheinend treten beim Senden von 2 Bytes Bitverschiebungen auf, die wohl erst auf einem digitalem Osziloskop auftauchen. Tja hab ich als Azubi nicht, Pech gehabtCode:$regfile = "m32def.dat" $framesize = 40 $swstack = 32 $hwstack = 32 $crystal = 8000000 $baud = 19200 Enable Interrupts Config Com1 = 19200 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0 ' zum debuggen Config Portd.7 = Output Dim Spioutputlsb As Byte Dim Spioutputmsb As Byte Dim I As Byte Dim J As Byte I = 0 J = 0 Portd.7 = 0 Spioutputlsb = 0 Spioutputmsb = 0 Config Spi = Hard , Interrupt = On , Data Order = Msb , Master = Yes , Polarity = High , Phase = 1 , Clockrate = 64 , Noss = 0 'testweise auf Softspi umgestellt, kein Unterschied 'Config Spi = Soft , Din = Pinb.6 , Dout = Portb.5 , Ss = Portb.2 , Clock = Portb.7 , Mode = 3 , Ss = None Spiinit Waitms 5 Do 'Main For J = 0 To 15 For I = 0 To 255 ' entspricht &B_0000_0000-_1111_1111 und damit dem lowbyte Spioutputlsb = I Spioutputmsb = J + 48 'also GN=1(Vref*1) und SHDN auf 1 (disabled) 'entspricht entspricht &B_0011_0000-_0011_1111 und damit dem high byte Waitms 5 ' damit man die Änderungen auch sehen kann Portd.7 = 0 Waitus 1 Spiout Spioutputmsb , 1 Waitus 1 Spiout Spioutputlsb , 1 Waitus 1 Portd.7 = 1 Waitus 1 Next I Next J Loop 'erwartet wird eine Sägezahnkurve von GND-5V
Hoffe trotzdem euch hiermit geholfen zu haben.
Geändert von Burga (14.11.2011 um 21:00 Uhr) Grund: Typo
Lesezeichen