Forum: Mikrocontroller und Digitale Elektronik Merkwürdige Registerinhalte beim ADC AD7193


von S. G. (goeck)


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

von S. G. (goeck)


Lesenswert?

Niemand, der dazu eine Idee hat?

von Peter (Gast)


Lesenswert?

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.

von S. G. (goeck)


Angehängte Dateien:

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

von S. G. (goeck)


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.

von S. G. (goeck)


Angehängte Dateien:

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.