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
Fast hätte ich es vergessen: Ich programmieren in Assembler. Bitte nur diese Codes posten, da ich die anderen Programmiersprachen wenig beherrsche.
=) ich hoffe, du kannst mit grossen zahlen umgehen =) also; datenblatt schauen lesen da steht eine kleine formal Vmess = ADCW / Vref * 1023
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
Jens, deine Formel stimmt so nicht ganz. Sie müsste lauten Vmess = ADCW * Vref / 1023
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.
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.
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. ...
@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
@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...
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.