www.mikrocontroller.net

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


Autor: S. G. (goeck)
Datum:

Bewertung
0 lesenswert
nicht 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.
// ----------------------------------------------------------------------------
/*!@details This function gets the mode register content.
 * @return  24 bit wide mode register content
 */
uint32_t AD7193_getModeReg()
{
    uint32_t mode = 0;
    uint8_t in3, in2, in1;
    
    // tell the ADC, that we want to read the Mode register
    RESET(ADC_CS);
    AD7193_readFromRegister(MODE);
    in3 = spi_putc(0xff);
    in2 = spi_putc(0xff);
    in1 = spi_putc(0xff);
    SET(ADC_CS);

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

    return mode;
}

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

Vielen Dank für euere Hinweise
Stefan

Autor: S. G. (goeck)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Niemand, der dazu eine Idee hat?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: S. G. (goeck)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: S. G. (goeck)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: S. G. (goeck)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.