aktuellen ADC-Wert per UART übertragen

OP #1306686
Hallo Forummitglieder,

momentan experimentiere ich mit einem atmega8 µC auf einem Pollin 
Entwicklungsboard.Ich versuche erfolgslos einen aktuell gewandelten 
AD-Wert per UART auf dem Hyperterminal darzustellen.

Mein Programm soll 15 mal das aktuelle low Byte des ADC über UART 
senden.
Über einen Poti ändere ich den zu wandelnden analogen Spannungswert am 
µC-Eingang.

Ausgabe am Hyperterminal:
-------------------------
Es werden stets 15 gleiche Zahlen ausgegeben, wenn ADCL an UDR übergeben 
wird. Nach dem Reset des µC ändert sich diese Zahl.
Übergebe ich dem UDR das high Byte des ADC, so ändern sich die 15 Zahlen 
sofort je nach Potistellung.

Übrigens das Tutorial zu den beiden Themen UART und ADC habe ich mir 
angeschaut und auch das auslesen des ADCW behebt mein Problem nicht.


Wieso ändern sich im HT die übertragenen Werte des ADCL nicht sofort, 
wie bei dem ADCH, sondern erst nach dem RESET?
Ist eventuell ein Fehler in meinem Code?
Kann jemand helfen?

Danke im Voraus.

PS: Bin kein µC Profi. Arbeite mich gerade durch das Tutorial.
Angehängte Dateien:
Gast
>PS: Bin kein µC Profi. Arbeite mich gerade durch das Tutorial.
Sonst würdest du ja auch nicht zu diesem Thema eine Frage stellen...

>UDR=x+0x30;  //Ausgabe von ADCL + 0x30 für spätere Anwendung
Lass das 0x30 erst mal weg.

Ich vermute, dass du Probleme mit dem Delay hast. Ob das wirklich noch 
5000ms bei der Taktfrequenz hinbekommt, kann ich nicht sagen, da ich es 
nie benutze.
Lass es doch einfach mal weg und lass dir statt der 15 Mal dauernd Werte 
ausgeben.

Noch was viel besseres: Der Wert des ADC wird erst beim Auslesen des 
ADCH-Registers wieder geändert.
Wenn man nur 8bit-Messungen machen will, dann sollte man das ADLAR-Bit 
ensprechend behandeln und nur das obere ADC-Byte auslesen.
OP
Klasse. Es funktioniert.
Allen Vielen Dank für die promte Antwort.

Fehlerquelle:
-------------
Bei dem Zugriff auf einen 10 Bit AD-Wert über 2 Register (ADCL und ADCH)
muss nach Datenblatt des ATMEGA8 zunächst das ADCL und dann das ADCH 
ausgelesen werden. Das war mein Fehler. Andersherum wird scheinbar 
bereits nach dem Auslesen des ADCH das gesamte Register ADC gesperrt 
(access re-enable S.198).
Hoffe, dass ich das so richtig verstanden habe.

Mein aktuelles Programm gibt nun den aktuell gewandelten 10 Bit AD-Wert 
(counts) dezimal im Hyperterminal wieder.

Allen ein schönes WE.
Angehängte Dateien:
Gast
>Andersherum wird scheinbar bereits nach dem Auslesen des ADCH das gesamte 
>Register ADC gesperrt

Gesperrt wird das Register, wenn man das ADCL ausliest, damit der Wert 
im ADCH auch zum ADCL passt.
Sobald ADCH ausgelesen wurde, kann das Register wieder (durch den ADC) 
beschrieben werden bzw. wenn man nur das ADCH ausliest.

Wenn man nur 8Bits-breite ADC-Werte braucht, setzt man das ADLAR-Bit und 
liest dann nur das ADCH-Register aus. (Hatte ich ja oben schon 
geschrieben...).

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.