Forum: Mikrocontroller und Digitale Elektronik aktuellen ADC-Wert per UART übertragen


von Alex M. (masterix)


Angehängte Dateien:

Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

Hi

Du muss auf jeden Fall das H-Byte vom ADC auslesen (auch wenn du es 
nicht brauchst) sonst ist der ADC 'blockiert'.

MfG Spess

von STK500-Besitzer (Gast)


Lesenswert?

>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.

von Tom (Gast)


Lesenswert?

Hallo Alex.

Datenblatt S. 198, oberer Absatz.

Grüße.

von Alex M. (masterix)


Angehängte Dateien:

Lesenswert?

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.

von STK500-Besitzer (Gast)


Lesenswert?

>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...).

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
Noch kein Account? Hier anmelden.