Hi,
wenn ich mit dem AVR-ADC (Ref.Spannung 5V) von 0-20V messen möchte, habe
ich ja die Möglichkeit einen Spannungsteiler davor zu schalten.
Aber wie löse ich das programmiertechnisch mit dem Komma?
Da man das Komma ja manuell setzen muss, würde es statt 12V 1,2V oder
statt 13V 1,3V anzeigen. Hat da jemand eine Lösung parat?
Gruß
Du könntest ja auch 1:4 teilen, dann hast du 0...5V.
Wie man programmtechnisch dann das Ergebnis wieder mit 4 multipliziert,
solltest du eigentlich wissen....
C und kein ASM benutzen. Dann kannst ganz einfach mit Nachkommastellen
rechnen.
In ASM gehen Berechnungen mit Nachkommastellen zwar auch, aber das
Ausgeben als ASCII Zeichenkette ist aufwendiger.
Oh oh, das sieht aus als hätte ich mich falsch oder schlecht
ausgedrückt.
Erstmal, ich programmiere in Assembler.
Ich benutze natürlich Festkommaarithmetik, aber ich muss dann das Komma
ja manuell setzen.
Beispiel:
Ich lasse eine Zahl ausgeben, dann kommt das Komma und danach lasse ich
noch 3 Stellen ausgeben.
1. Annahme: Die zu messende Spannung beträgt 3,5V.
Ausgabe am LCD: 3,500V. Perfekt
2. Annahme: Die zu messende Spannung beträgt 12,45V
Ausgabe am LCD: 1,245V (Komma an der 2. Stelle)
Das ist das Problem. Wie löse ich das mit der 'Kommaverschiebung'?
Gruß
Du kannst natürlich nicht einfach sagen: "Setze das Komma nach der
ersten Stelle". Du musst vorher schon gucken, ob die gemessene Spannung
bzw. eben der ADC-Wert "10V" überschreitet und dann ggf. das Komma eine
Stelle später setzen.
Hi,
weiß nit welches Teiler-Verhältnis dein Spannungsteiler hat. Aber nehmen
wir mal an, der ist 1:4. Dann prüfste einfach , ob der ADC-Wert größer
als 2,5 Volt ist (ADC-WERT >= 512). Falls die Bedingung erfüllt ist,
setzt du die Nachkommastelle erst nach der zweiten Zahl, anderfalls nach
der ersten.
In ASM bei 1:4 Teiler und ADLAR = 0, schauste im ADCH Register ob
grösser als 0x02.
Gruß
Festkomma bedeutet im übrigen ja auch nicht, dass du eine fixe Anzahl an
Vorkommastellen hast, sondern dass die Anzahl der Nachkommastellen
fixiert ist.
Der Fall:
> 1. Annahme: Die zu messende Spannung beträgt 3,5V.> Ausgabe am LCD: 3,500V. Perfekt> 2. Annahme: Die zu messende Spannung beträgt 12,45V> Ausgabe am LCD: 1,245V (Komma an der 2. Stelle)
kann daher gar nicht auftreten, denn im einen Fall hättest du 3
Nachkommastellen und im anderen Fall nur 2. Wenn bei deiner ganzen
Umrechnerei sich für 3,5 Volt intern ein Zahlenwert von 3500 ergibt,
dann muss bei 12,45 Volt sich ein interner Wert von 12450 ergben.
Und egal wie du es drehst und wendest, das Komma ist (vom rechten
Rand weg gezählt) immer vor der dritten Ziffer.
Da kann man durch ändern der Zahl eigentlich auch beliebig viele
Vorkomma und Nachkommastellen ausgeben lassen.
Ich hätte das nun so verstanden, dass der interne Zahlenwert viel größer
ist, und man halt nur einen Teil von der Zahl ausgibt.
Also so z.B. interner Wert: 123654789
Ausgabe eine Vorkommastelle, drei Nachkommastellen ergibt: 1,236
Oder habe ich das falsch verstanden?
Gor Na Kosh wrote:
> Allerdings versteh ich dann das Beispiel> (http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC) hier auf> dieser Seite nicht.
Tja.
Hier hat es sich der Autor billig gemacht.
Da er weiß, dass der Vorkommaanzeil sich nie in den Bereich über 10
bewegen wird, setzt er einfach das Komma nach der ersten Stelle von
links.
In dem Fall (und nur in dem Fall) ist das gleichbedeutend mit: "Setze
das Komma vor der dritten Stelle von rechts"
> Also so z.B. interner Wert: 123654789> Ausgabe eine Vorkommastelle, drei Nachkommastellen ergibt: 1,236
Der interne Wert 123654789 mit 3 Nachkommastellen ausgegeben müsste
auf der Anzeige 123654,789 ergeben. Alles andere ist Pfusch :-)
Warum hat es sich der Autor einfach gemacht?
Relativ simpel: Wenn ich das Komma während der Ausgabe einflechten kann,
braucht man nichts zwischenzuspeichern. Im korrekten Fall, muss ich aber
wissen wieviele Stellen insgesamt ausgegeben werden, damit ich vor der
dritt-letzten Ziffer das Komma einflechten kann.
Oder aber ich sorge wieder dafür, dass die Gesamtzahl an auszugebenden
Stellen immer gleich ist. Notfalls müssen halt ein paar führende Nullen
eingeplant werden.
Zahlenwert: 3500 -> Ausgabe 03,500
Zahlenwert: 12450 -> Ausgabe 12,450
Jetzt ist die Anzahl der Vorkommastellen wieder in beiden Fällen
identisch, nämlich 2 (weil die Zahl immer aus 5 Ziffern besteht). Und
damit ist es wiederrum egal, ob ich das Komma vor der dritt-letzten
Ziffer oder nach der zweiten einfüge. Im Endeffekt kommt wieder beides
aufs gleiche raus.
(Und führende Nullen kann man bei der Ausgabe wiederrum prima
unterdrücken)
Hi,
danke erstmal für die ausführliche Antwort.
>Oder aber ich sorge wieder dafür, dass die Gesamtzahl an auszugebenden>Stellen immer gleich ist.
Das hört sich einfacher an, als immer im ADCH Register nachzuschauen, ob
die Zahl >=512 ist. Wie könnte man das bewerkstelligen?