Merkwürdige Registerinhalte beim ADC AD7193

OP #1832319
Lesenswert?

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.
1
// ----------------------------------------------------------------------------
2
/*!@details This function gets the mode register content.
3
 * @return  24 bit wide mode register content
4
 */
5
uint32_t AD7193_getModeReg()
6
{
7
    uint32_t mode = 0;
8
    uint8_t in3, in2, in1;
9
    
10
    // tell the ADC, that we want to read the Mode register
11
    RESET(ADC_CS);
12
    AD7193_readFromRegister(MODE);
13
    in3 = spi_putc(0xff);
14
    in2 = spi_putc(0xff);
15
    in1 = spi_putc(0xff);
16
    SET(ADC_CS);
17

18
    // now begin shifting everything to the left,
19
    // then fill up lowest available byte with read bytes
20
    mode  = ((uint32_t)in3) << 16L;
21
    mode |= ((uint32_t)in2) << 8L;
22
    mode |= (uint32_t)in1;
23

24
    return mode;
25
}

Habe schon mit Analog Kontakt aufgenommen, aber da rührt sich nichts.

Vielen Dank für euere Hinweise
Stefan
OP #1839790
Lesenswert?

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
Angehängte Dateien:
OP #1841221
Lesenswert?

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.
OP #2447829
Lesenswert?

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
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren