ADC + ATMEGA8 + Spannung messen

Gast #944797
Lesenswert?

Hallo Leute,

ich wollte mal fragen, ob mir jemand bei einer Verständnisfrage helfen 
kann. Also ich würde gerne mit dem Adc des Mega8 eine Spannung einlesen. 
Nun bin ich beim Durchabreiten diverser Beiträge über dieses Zitat 
gestolpert, welcher laut Datenblatt auch korrekt ist.
>"Es muss grundsätzlich immer das ADCH ausgelesen werden! Steht auch im
>Datenblatt. Abgesehen davon, dass es sinnfrei ist, nur das Low-Byte
>auszuwerten, wird das Ergebnisregister erst wieder freigegeben, wenn
>ADCH gelesen wurde. Wird nur ADCL gelesen, dann kann der ADC keinen
>neuen Wert im Ergebnisregister ablegen. Ist klar, dass Du immer den
>selben Wert ausliest. Wenn Du nur 8 Bit Auflösung brauchst, dann setze
>ADLAR und lies nur das High-Byte aus. Dann gibts auch keine Probleme."

Nun zu meiner Frage: Gilt diese Aussage für 2 8bit Variablen (uint8_t), 
wo ich die Register einzeln auslesen muss?
Wenn ich den ADC-Wert mit ADCW auslese und in eine 16bit Variable 
(uint16_t) ablege, sollte das doch auch ohne die oben genannte Aktion 
klappen, oder? Wäre für jeden Tip sehr dankbar...
schönes WE
Elko
Gast #944901
Lesenswert?

uint16_t Analog;

Analog = ADC;

der Code sollte ausreichen.

Wenn du es komplizierter, aber vielleicht verständlicher haben willst.
Dieser Code ist meines Wissens nach gleichwertig:

uint16_t Analog;

Analog = ADCL;
Analog += (ADCH<<8);

Ich hoffe das hat deine Frage geklärt, wenn du nur 8-Bit brauchst weiss 
ich gerade auch nicht wie man das macht.

ich kann mir vorstellen, dass das so geht:

uint16_t Analog16;
uint8_t Analog8;

Analog16 = ADC; //10-bit Analogwert in 16bit Variablen speichern
Analog8 = (Analog16>>2); //den 10-bit Wert um zwei Stellen nach rechts
                         //schieben, danach ist es ein 8-bit Wert

Bin mir nicht sicher ob das geht, da uint16_t und uint8_t evtl. 
inkompatibel ist.
#944909
Lesenswert?

Elko wrote:
> Nun zu meiner Frage: Gilt diese Aussage für 2 8bit Variablen (uint8_t),
> wo ich die Register einzeln auslesen muss?
Ich verstehe nicht ganz, was Du genau machen willst. Die Reihenfolge des 
Auslesens der Register muss grundsätzlich eingehalten werden. Wenn Du 
den ADC-Wert nicht als 16-Bit-Wert auslesen willst, sondern die beiden 
Ergebnis-Teilregister einzeln weiterverarbeiten willst, dann muss 
trotzdem erst ADCL in eine entsprechende 8-Bit-Variable geladen werden 
und dann ADCH.

> Wenn ich den ADC-Wert mit ADCW auslese und in eine 16bit Variable
> (uint16_t) ablege, sollte das doch auch ohne die oben genannte Aktion
> klappen, oder?
Wenn Du ADCW benutzt, dann übernimmt der Compiler die Sache mit der 
Reihenfolge. Wenn man nicht die volle Auflösung benötigt, sondern eben 
nur maximal 8 Bit, dann kann man durch Setzen von ADLAR dafür sorgen, 
dass das Ergebnis linksbündig abgelegt wird und die 8 MSB im ADCH 
stehen. Dann genügt es, nur ADCH auszulesen.
Gast #945010
Lesenswert?

Vielen Dank für die Antworten.
Das war halt eine Verständnisfrage, die jetzt so langsam aufleuchtet. 
Allerdings habe ich nun das Problem, den ADCWert auf einem Display 
auszugeben. Werd mich heut mal bissl in die thematik einarbeiten. Zur 
Zeit gibt mein Display nur wirre zahlen aus, ich denke dass die 
Konvertierung des ADC soweit ok ist, ich habe Werte von 0-1024 (mit LEDs 
und IF abfragen geprüft. Wenn ich allerdings die Zahl auf dem Display 
ausgeben will, dann kommen Zahlen von ca 360 bis 570 raus. Ich denke, 
dass ich noch ein Wurm bei der Displaydarstellung habe.

Danke nochmal und Schönen Sonntag
Elko
Gast #945259
Lesenswert?

Hallo lieben user,

also das mit der LCD anzeige funktioniert jetzt auch soweit. Ich kann 
mir eine Spannung von 0-5.5 über den ADWandler in 0-1023 schritte 
einteilen. Allerdings habe ich nun das Problem, dass ich laut 
Umrechnungsformel U=Vref*adwert/1024 mit Vref 2.56V und einem ADwert von 
1023 eine Spannung anliegen habe von ca 2.56V. Gemessen sind es jedoch 
5.5? Wenn ich für Vref die 5.5V in die Formel einsetze, passt der Wert. 
Was läuft da schief? Ich habe durch setzen der bits die interne 
Referenzspannung ausgewählt. Oder wieder ein denkfehler? Vorteiler ist 
auf 8 gesetzt. (Mega8 3.6Mhz)

Würd mich über eine kleine Hilfe sehr freuen

MFG Elko
Gast #945340
Lesenswert?

Danke an alle,

das mit dem Spannungsteiler habe ich zwar noch nicht getan, weil ich 
dachte dass ich bis 5V locker anlegen kann, aber werd mich gleich 
dranstzen. Nur ich messe tatsächlich am ADC erst bei 5.5V die 1023 und 
nicht bei 2.56 weil da ist der adcwert rund die hälfte. Das verwundert 
mich ein wenig.
ADMUX = (1<<REFS1) | (1<<REFS0) |(1<<MUX2)|(1<<MUX0) ist hier vielleicht 
mein Wurm?

Besten Dank
Elko

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