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
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.
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.
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
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
Hi
Wenn die Eingangsspannung den Wert der Referenzspannung überschreitet
gibt der ADC 1023 aus. In deinem Fall gehört ein Spannungsteiler vor den
ADC.
MfG Spess
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
Hi
>Das verwundert mich ein wenig.
Mich ehrlich gesagt auch. Deine Initialisierung sieht OK aus. Hast du
mal die Referenzspannung am VREF-Pin gemessen?
MfG Spess
Hi
Ich kenne deine Hardware nicht. Entweder wird AREF irgendwo auf VCC
gelegt (nicht gut für die interne Referenz) oder deine Initialisierung
wird nicht ausgeführt (->Simulator).
MfG Spess
simulator keine ahung :-(
ist ein myavr-usb board. will eigentlich nur eine 12V spannung mittels
poti regeln und mit dem adc messen. Ist das so überhaupt möglich?
mfg Elko