Servus zusammen,
ich versuche gerade mit mehr oder weniger Erfolg einen MCP4822 dual-DAC via SPI anzusteuern. Aber so recht will es nicht klappen.
Hab nun mal ein kleines seperates Programm geschrieben um es zu testen.
Am Anfang werden die beiden Wandler DACA und DACB auf 0 gesetzt. Das funktioniert.
Nach betätigen eines Tasters werden die beiden Wandler mit dem Wert 4095 gefüttert. Klappt auch, beide geben ca. 2,03 Volt aus.
Mit jedem weiteren Tastendruck werden beide Wandlerwerte um 128 verringert. Jetz geht aber nur noch DACB mit. DACA bleibt auf 2,03 Volt stehen und ich weiß nicht warum.
Ich verwende einen ATmega328PU mit intern 8Mhz und CKDIV8.
Seltsam erscheint mir, dass der MCP4822 lt. Datenblatt die Daten bei steigender Flanke einliest. Das ist beim ATmega Mode 0/0 oder 1/1.
Aber da geht gar nichts. Nur bei folgender Einstellung geht überhaupt was rüber:
ldi temp1, (1<<SPE) | (1<<MSTR) | (0<<DORD) | (0<<SPR0) | (0<<CPOL) | (1<<CPHA)
out SPCR, temp1
Wenn ich das Datenblatt richtig lesen kann, taktet der ATmega dann bei fallender Flanke.
Der Wandler verträgt Signale bis 25Mhz. Da bin ich weit drunter. Hat jemand eine Ahnung wie schnell der SPI-CLK beim ATmega max. sein kann/darf? Bei normalem Amateur-Platinenlayout.
Ich Weiß aus Erfahrung, dass man die kleinen Fehler im Code oft einfach nicht mehr sieht. Evtl weiß jemand Rat.
Der Aufbau sieht folgendermaßen aus:
An der SPI-Schnittstelle hängt der Wandler. Signale sind am Oszi erkennbar.
An PortB0 ist eine Led angeschlossen. Die zeigt mir bei jedem Tastendruck an, das sich was tut (an/aus).
An PortB1 ist der Taster angeschlossen.
CS für den Wandler ist mit SS (Port B2) verbunden und mit einem 10k Widersand nach + verbunden. LDAC ist an GND.
Der Taster wird per TimerIRQ entprellt.
Ich vermute es liegt an den Steuerbits des Wandlers. Aber Anfangs geht es ja.
Den Code hab ich mit angehängt, und hoffentlich nichts wichtiges vergessen. Falls mir jemand einen hinweis geben kann bin ich sehr dankbar. Im Netz findet sich wenig zu dem Wandler und wen, dann in C. C verstehe ich aber leider nicht.
Danke und Gruss
Gottfried
ich versuche gerade mit mehr oder weniger Erfolg einen MCP4822 dual-DAC via SPI anzusteuern. Aber so recht will es nicht klappen.
Hab nun mal ein kleines seperates Programm geschrieben um es zu testen.
Am Anfang werden die beiden Wandler DACA und DACB auf 0 gesetzt. Das funktioniert.
Nach betätigen eines Tasters werden die beiden Wandler mit dem Wert 4095 gefüttert. Klappt auch, beide geben ca. 2,03 Volt aus.
Mit jedem weiteren Tastendruck werden beide Wandlerwerte um 128 verringert. Jetz geht aber nur noch DACB mit. DACA bleibt auf 2,03 Volt stehen und ich weiß nicht warum.
Ich verwende einen ATmega328PU mit intern 8Mhz und CKDIV8.
Seltsam erscheint mir, dass der MCP4822 lt. Datenblatt die Daten bei steigender Flanke einliest. Das ist beim ATmega Mode 0/0 oder 1/1.
Aber da geht gar nichts. Nur bei folgender Einstellung geht überhaupt was rüber:
ldi temp1, (1<<SPE) | (1<<MSTR) | (0<<DORD) | (0<<SPR0) | (0<<CPOL) | (1<<CPHA)
out SPCR, temp1
Wenn ich das Datenblatt richtig lesen kann, taktet der ATmega dann bei fallender Flanke.
Der Wandler verträgt Signale bis 25Mhz. Da bin ich weit drunter. Hat jemand eine Ahnung wie schnell der SPI-CLK beim ATmega max. sein kann/darf? Bei normalem Amateur-Platinenlayout.
Ich Weiß aus Erfahrung, dass man die kleinen Fehler im Code oft einfach nicht mehr sieht. Evtl weiß jemand Rat.
Der Aufbau sieht folgendermaßen aus:
An der SPI-Schnittstelle hängt der Wandler. Signale sind am Oszi erkennbar.
An PortB0 ist eine Led angeschlossen. Die zeigt mir bei jedem Tastendruck an, das sich was tut (an/aus).
An PortB1 ist der Taster angeschlossen.
CS für den Wandler ist mit SS (Port B2) verbunden und mit einem 10k Widersand nach + verbunden. LDAC ist an GND.
Der Taster wird per TimerIRQ entprellt.
Ich vermute es liegt an den Steuerbits des Wandlers. Aber Anfangs geht es ja.
Den Code hab ich mit angehängt, und hoffentlich nichts wichtiges vergessen. Falls mir jemand einen hinweis geben kann bin ich sehr dankbar. Im Netz findet sich wenig zu dem Wandler und wen, dann in C. C verstehe ich aber leider nicht.
Danke und Gruss
Gottfried