Forum: Mikrocontroller und Digitale Elektronik ADC Wert am 2x16 Display ausgeben


von Bernhard Bauer (Gast)


Lesenswert?

Hallo allerseits,

ich bin nicht mehr ganz Anfänger in Sachen AVR Programmierung und
beschätige mich jetzt mit der Spannungsmessung und Ausgabe an einem
Display (2x16, AtMega8). Daher meine Frage:

Ich habe die ADC Routine soweit, dass ich den Wert im ADCH bzw. ADCL
Register habe. Aber wie kann ich nun diesen Wert umwandeln, dass z.B.
"3,9 Volt" am Display erscheint.
Vielleicht könnte hier jemand feritge Umwandlungs und LCD Routinen
posten, die mir (und auch anderen) hilfreich sein können.

Ich wäre auch für eine stichpunktartige Beschreibung für die
Vorgehensweise des Problems dankbar.
Vielen Dank schon mal.

Gruß
Bernhard

von Bernhard Bauer (Gast)


Lesenswert?

Fast hätte ich es vergessen: Ich programmieren in Assembler. Bitte nur
diese Codes posten, da ich die anderen Programmiersprachen wenig
beherrsche.

von Jens D. (jens) Benutzerseite


Lesenswert?

=)
ich hoffe, du kannst mit grossen zahlen umgehen =)
also; datenblatt schauen lesen

da steht eine kleine formal
Vmess = ADCW / Vref * 1023

von Oliver Gringel (Gast)


Lesenswert?

Hallo,

Eine "Binär nach BCD"-Routine findest du hier:
http://www.avr-asm-tutorial.net/avr_de/rechnen/index.html
Routinen zur Ausgabe auf LCDs findest du hier im Forum, oder auch auf
der angegebenen Seite.

Gruß

Oliver

von Jan (Gast)


Lesenswert?

Jens, deine Formel stimmt so nicht ganz. Sie müsste lauten
Vmess = ADCW * Vref / 1023

von Hannes L. (hannes)


Lesenswert?


von TravelRec. (Gast)


Lesenswert?

Die 10-Bit Zahl, die in den ADC-Registern steht, muß in 10-er Potenzen
zerlegt werden. Das geht schnell und einfach mit der
Subtraktionmethode. Zuerst subtrahierst Du von der Zahl 1.000, ist das
Ergebnis größer 0, dann inkrementierst Du einen Zähler, der vorher 0
war. Ist das Ergebnis <0, dann speicherst Du den momentanen Zählerwert
in einer Speicherzelle. Dieser Wert ist später die 1000er Ziffer. Dann
setzt Du den Zähler wieder auf 0 und subtrahierst 100 sooft, bis das
Ergebnis wieder < 0 wird und so weiter und so fort. Die verbleibenden
Einer werden direkt in die Speicherzelle für die Einer-Ziffern
übernommen. Um diese Einzel-Ziffern jetzt in ASCII für das Display zu
wandeln, addierst Du einfach zu jeder die 48 (dez.) und schon biste
fertig. Ein Komma schiebst Du an geeigneter Stelle als ASCII-Zeichen in
das Display, Texte wie "Volt" ebenso oder aus einer .db-Tabelle (in
Gänsefüßchen kannst Du dort direkt Text eintragen, abgesehen von
Umlauten, die gesondert codiert sind). Im Datenblatt zum Display
findest Du eine Zeichentabelle.

von Simon K. (simon) Benutzerseite


Lesenswert?

1 Post, 1 Lösung
Er kam, schrieb, und siegte

Mal ehrlich: Das isses doch im Groben, den Rest solltest du dir selber
ergooglen oder er-wiki-en.

von Hannes L. (hannes)


Lesenswert?

Und in wenigen Tagen hat der Nächste die selbe Frage.

Wobei mir zum "Messen von Volt" (Spannungsmessung) der AVR zu schade
und zu ungenau ist. Das macht ein Billig-Digital-Multimeter viel
besser, genauer und billiger.

...

von gerd (Gast)


Lesenswert?

@Hannes

Das ist ja grade das Schöne an der Hardware von den AVRs: Da ist alles
drin, ohne Aufpreis. Und meistens will man ja nicht nur die Spannung
messen, sondern auch was damit machen. Zum Beispiel malnehmen, oder
auch mal was schalten, oder was einstellen, u.v.a.m.

Und wenn wir schon bei Genauigkeit sind: Welches Multimeter ist schon
genauer als 10 Bit? Ich hab keins von der Sorte. Alles nur Schätzeisen.
Und in der Realität, beim Messen, klappert meist nicht nur die letzte
Stelle.

mfg
gerd

von Hannes L. (hannes)


Lesenswert?

@Gerd:

Na wer die letzte Stelle des Multimeters ernst nimmt, der ist doch
selbst schuld...

Aber ich nutze den ADC des AVRs auch gerne:
http://www.brummbaerhannes.de/hannes/avr/uiwa/uiwa.html
http://www.brummbaerhannes.de/hannes/avr/schaltmo/schaltmodul.html
http://www.brummbaerhannes.de/hannes/avr/impkorr/impulskorr.html

Nur eben nicht als reines Voltmeter. Die interne Hardware habe ich
inzwischen auch schon schätzen gelernt, da rennst du bei mir offene
Türen ein. Es ist nur Schade, dass Einige diese Hardware-Features nicht
effizient nutzen können, da sie meinen, das Benutzen einer Hochsprache
erspart den Blick ins Datenblatt... ;-(

Bit- & Bytebruch...
...HanneS...

von Bernhard Bauer (Gast)


Lesenswert?

Hallo nochmal,

ich habe jetzt nur noch ein Problem: Ich benutze, die interne
Referenzspannung von 2,56 Volt. Die ADC Auflösungg beträgt aber 1024,
dh. ich kann auf 2,5mV genau messen. Muß ich den ADC Wert dann nicht
irgendwie durch 4 teilen, bevor ich ihn in BCD umforme, und auf dem
Display ausgebe?
Noch eine Frage: Brauche ich für eine BCD Ziffer ein komplettes
Register, oder ist es auch möglich zwei BCD Ziffern in ein Register zu
schreiben.
Für Antworten und eine prinzipielle Vorgehensweise wäre ich sehr
dankbar.

MfG
Bernhard

von Hannes L. (hannes)


Lesenswert?

Natürlich muss der vom ADC ermittelte Wert auf den Messbereich skaliert
werden. Einige Hinweise dazu solltest du hier finden:

http://www.mikrocontroller.net/forum/read-1-241240.html#241445
http://www.mikrocontroller.net/forum/read-1-183626.html#184150

BCD als Zwischenergebnis bekomme ich garnicht, ich wandle meist gleich
in ASCII um und sende die einzelnen Zeichen sofort zum LCD.

Die interne Referenz ist zwar relativ stabil, hat aber eine starke
Exemplarstereuung (siehe Datenblatt).

...

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.