Hallo Leute,
ich nutze einen ATMega328PA, um einen ADC AD7193 auszulesen. Dazu habe
ich eine C Bibliothek geschrieben, die ich auch veröffentlichen werde,
falls sie sich bewähren sollte.
Momentan verusche ich einige Register auszulesen und die Default Werte
(laut Datenblatt) zu bekommen. Das klappt auch bei 4 von 5 Registern.
Leidglich bei einem der wichtigsten, dem Mode Register bekomme ich
ständig 0xFFA0FF, obwohl der StartUp Wert 0x080060 sein sollte. Ebenso
kann ich, wenn ich über SPI etwas dort rein schreibe, kaum meine
gesetzten Bits finden. Das funktioniert nur mit dem "High Nibble" von 24
Bit. Ich lese und setze Inhalte auf dem Mode Register mit der gleichen
Routine, wie ich das auch auf dem ebenfalls 24Bit breiten Config
Register tue. Hier mal meine Leseroutine für die 24Bit Register.
Schwer zu sagen ohne vollständigen Code. Wie sehen z.B. RESET,
AD7193_readFromRegister, spi_putc und SET aus? Wie immer, am besten
kompletten Code posten.
So, nachdem ich mir erst mal eine neue Platine gebastelt habe, da die
alte zu verhunzt war, habe ich immer noch das exakt gleiche Problem.
Registerinhalte sind alle, wie im datenblatt beschrieben, nur der des
MODE Registers ist 0xFFA0FF anstatt 0x080060.
Ich habe mal die gesamte Bibliothek und die Helferdateien angehängt, die
wichtig sind.
Was ich auch mal probiert habe: die Funktion, die den Inhalt des CONF
Registers holt - der genau dem Datenblatt entspricht - verwendet, um das
MODE Register auszulesen...und schon bekomme ich wieder nur die 0xFFA0FF
zurück.
Ich weiß nicht, was ich falsch mache, oder ob ich überhaupt was falsch
mache.
Danke euch für eure Hilfe.
Grüße
Ok, ich hab es gestern selbst gelöst. Zumindest habe ich ein Workaround
gefunden.
Ich setze das Serielle Interface direkt nach dem Start-Up zweimal zurück
(40 High Bits an DIN schicken, Datenblatt S. 37), und frage dann das
MODE Register ab. Siehe da, der Startwert von 0x080060 ist lesbar. Nun
lässt sich der ADC auch seiner Funktion nach verwenden und spuckt gute
Werte für Eingangsspannungen aus. An meinem Code an sich war wenig
falsch, auch wenn ein Schnitzer in der AD7193_getData() Funktion drin
ist/war.
Hallo zusammen,
habe ein kleines Update:
- FIX: Kommentare ausgebessert
- FIX: in getData() adcDate war eine 8 Bit Variable, die keine 24Bit
ADC Wert halten konnte; wurde also immer überschrieben mit dem MSB; als
32Bit UINT eingeführt
- FIX: MISO wird während des Einlesens auf Low gesetzt, statt auf High
gezogen zu werden
- FIX: waitForDataReady() hat DataReady nicht erkannt und nie ausgelöst
+ mehr Enums eingeführt und Routinen darauf umgestellt
+ neue Funktion, um serielles Interface auf Startzustand
zurückzusetzen: resetSerial()
+ neue Funktion, um Integer-Rohwert in [V] zu wandeln: raw2Voltage()
Freu mich auf Rückmeldungen und gelungene Projekte mit der Bibliothek.
Grüße
Stefan