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
Versuchs mal hier: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#16-Bit_Portregister_.28ADC.2C_ICR1.2C_OCR1.2C_TCNT1.2C_UBRR.29 und hier: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#ADC_.28Analog_Digital_Converter.29 Da steht eigendlich alles drinn was man darüber wissen musss und wie man es anspricht/ausliest. Grüße Puppetmaster
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
Die Referenzspannung gibt die höchst mögliche Spannung an die du messen kanst. wenn du jetzt Aref=2,56V hast kanst du nicht 5,5V messen!
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
@spess: eine sehr gute idee... verwunderlicherweise 5.5V an avcc und aref... aber warum??? kennt da jemand eine antwort zu??? gruss elko
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
Hi Ich kenne die myavr-Umgebung nicht. Sieh mal in der Hilfe nach. MfG Spess
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.