(µVision) Zahl mit 2 Nachkommastellen auf LCD ausgeben (ADC)

Gast #4945955
Lesenswert?

Hallo.
Programm: Keil µVision3
Poti: 0V - 255V
LCD: 2x20
Wie kann ich eine Zahl mit zwei Nachkommastellen auf einen LCD-Display 
ausgeben? Mit Float funktioniert das nicht. Man dreht am Poti und die 
Spannung verändert sich auf der LCD-Anzeige. Jetzt möchte ich es mit 
zwei Nachkommastellen versuchen (Also: z.B. 125,64V). Ich glaube man 
muss es mit Division mit Rest machen.
Könnte mir jemand das erklären?
Und vielleicht auch noch mir das Programm zeigen?

Mfg

Frank
Gast #4946171
Lesenswert?

Frank schrieb:
> ne ich will ohne float arbeiten

Also könntest du erstmal den Ganzzahlanteil und die übrig bleibenden 
Hunderstel ausrechnen. Auf die Anzeige gibst du dann den in einen String 
konvertierten Ganzzahlanteil, ein Komma"," und die ebenfalls in einen 
String gewandelten Hundertstel, letztere zweistellig ggf. mit führender 
"0".
Gast #4946178
Lesenswert?

Frank schrieb:
> Wie kann ich eine Zahl mit zwei Nachkommastellen auf einen LCD-Display
> ausgeben? Mit Float funktioniert das nicht.

So so, mit float funktioniert das nicht...

Fange doch erstmal klein an, indem du zunächst lernst, wie man zwischen 
Zeichenketten und Zahlen hin- und her-konvertiert. Sowas gehört zum 
Handwerkszeug eines jeden Programmierers.

Als nächstes lernst du, wie man ein einfaches Alpha-Display ansteuert.

..und behaupte lieber nicht, daß es mit float nicht gehen würde. Ich hab 
sowas schon so oft selber gemacht, daß ich mit absoluter Sicherheit 
sagen kann, daß es geht.

W.S.
Gast #4946211
Lesenswert?

Ich versuche in solchen Fällen auf einem µC float ehrer zu umgehen, auch 
wenn es manchmal ein bisschen problemorientieren Hirnschmalz verlangt. 
Bevor das Problem überhaupt sauber formuliert und strukturiert ist, 
lohnt es aber nicht, über die Umsetzung konkreter nachzudenken.
Gast #4946313
Lesenswert?

Matheprofessor schrieb:
> Wenn die Messergebnisse in 100 Centivolt quantisiert daherkomen
> wird er in den Nachkomma-Stellen niemals einen Wert ungleich 00
> sehen, egal ob er mit oder ohne float rechnet.

Eben, dann gibt es bei den Eingangsdaten keine Nachkommastellen und 
damit sie in der Anzeige wieder auftauchen:

Lothar M. schrieb:
> Und zwischen die 2. und die 3. Stelle ein Komma machen.
Gast #4946368
Lesenswert?

Lothar M. schrieb:
> Wenn dann meine ganzzahlige Cent-Rechnung
> fertig ist und ich das Ergebnis in Euro sehen möchte, dann gebe ich den
> Cent-Betrag aus und mache zwischen die 3. und 2. Stelle von rechts ein
> Komma.

Pfusch. Elender Pfusch.

So, dann stelle mal 7 Ct dar: ._7 oder so ähnlich. Bei deiner Geldbörse 
ist das unerheblich.. aber denk mal an negative Zahlen, damit wird das 
noch häßlicher: .-7 oder -._7 oder wie hätten's wir gern?

Nein, man kann zwar mit Centi-Sonstwas rechnen, aber zum Ausgeben sollte 
man es passend geraderücken. Also durch 100 teilen, ganzen Teil (ggf. 
mit Vorzeichen) ausgeben, dann Dezimalpunkt, dann gebrochenen Teil 
dranhängen.

W.S.
#4946390
Lesenswert?

Hi

W.S. schrieb:
> Pfusch. Elender Pfusch.

Ganz unrecht hat Er aber trotzdem nicht.
(und denke mir ein zwinkerndes Smiley an den Satz)
Bei 0-255 und <100 werden die führenden Nullen wohl entfallen, wenn von 
0,00 bis 2,55 angezeigt werden soll.

Man kann aber auch mit 8-bit-Zahlen (nahezu beliebig) große Zahlen durch 
ebenso beliebige Zahlen teilen - man braucht halt 'nur ne handvoll mehr 
davon'.
Auch bewegen wir uns da dann wieder beim Festkomma und ich muß mich 
selber um 'das Komma' kümmern.

Unterm Strich kann man (fast?) alles 'schriftlich' von Hand in Software 
berechnen - ist halt die Frage, wie sinnvoll Das hier ist, wenn ich eh 
schon mit Zahlenvariablen  mit zig Stellen unterwegs bin (also nicht auf 
8bit begrenzt).

MfG
Gast #4946399
Lesenswert?

Weis nicht was du für einen komischen
Compiler benutzt. Kenne den nicht. Aber wenn ich
das lösen müßte wären das 3 Zeilen Code und das
Ergebniss stände auf dem Display.
Must doch nur Float nach String umkonventieren
lassen und gut ist. Braucht natürlich viel Speicher,
aber das ist am einfachsten.
Moderator (Firma: Titel) Persönliche Seite #4946870
Lesenswert?

W.S. schrieb:
> Pfusch. Elender Pfusch.
Naja, ich nenne es stattdessen Festpunktarithmetik und verschiebe den 
Punkt soweit nach rechts, bis ich nur noch Ganzzahlen habe und mit 
Integern rechnen kann.
So brauche ich für die Addition von 1,23 Euro und 2,45 Euro keinen Float 
mitsamt Rundungseffekten, Sonden addiere 123 und 245 Cent. Und nur für 
die Ausgabe muss ich mir dann noch Gedanken machen...

Stefan schrieb:
> Aber wenn ich das lösen müßte wären das 3 Zeilen Code und das
> Ergebniss stände auf dem Display.
Es geht nicht darum, wie viele Zeilen das im Editor sind (bei 
ausreichend breitem Bildschirm passt das auch in 1 Zeile) sondern darum, 
wie viele Ressourcen und Rechenzeit dieser Code dann tatsächlich 
braucht.
Gast #4947004
Lesenswert?

Es geht hier nicht um Ressorsen
und rechenzeit sondern um es mit
Float geht oder nicht. Der TO meinte
ja das es nicht geht, was aber nicht
stimmt. Dann muss man auch nicht
mit ganzen zahlen rechnen.
Gast #4947064
Lesenswert?

Lothar M. schrieb:
> So brauche ich für die Addition von 1,23 Euro und 2,45 Euro keinen Float
> mitsamt Rundungseffekten, Sonden addiere 123 und 245 Cent. Und nur für
> die Ausgabe muss ich mir dann noch Gedanken machen...

Eben, eben, die Ausgabe.

Genau DAS war's, was ich bereits umrissen habe.
Rechnen kann man mit Festkomma allemal, keine Frage.
Aber mit deinem simplen Komma "zwischen die 3. und 2. Stelle von rechts" 
bist du schlichtweg zu kurz gesprungen. Jedenfalls für nen Mod.

nochmal im Telegrammstil:
ganz:= Zahl /100;
bruch:= Zahl mod 100;
if Zahl < 0
then v:= '-' und Zahl:= -Zahl
else v:= ' ';

Text:= v + IntToString(ganz) + '.' + GebrochenToString(bruch);


W.S.
#4947830
Lesenswert?

Hi

Vll aber auch so:

Cursor auf letzte Komma-Stellen-Position setzen

Zahlneu=Zahl/10
Ziffer=Zahl%10 (springt in Assembler von alleine mit raus ...)
Ziffer=Ziffer + "0"
Ausgabe Ziffer, Cursor-Position '1x nach links'
Zahl=Zahlneu

Zahlneu=Zahl/10
Ziffer=Zahl%10 (springt in Assembler von alleine mit raus ...)
Ziffer=Ziffer + "0"
Ausgabe Ziffer, Cursor-Position '1x nach links'
Zahl=Zahlneu

<--- hier ist 'zwischen 2. und 3. Stelle

Zahlneu=Zahl/10
Ziffer=Zahl%10 (springt in Assembler von alleine mit raus ...)
... hier kommt der 'Dot' dazu ...
Ziffer=Ziffer + "0" + 'Dot' (für den Punkt der 7-Segment-Anzeige)
Ausgabe Ziffer

Die Berechnung kann als Funktion/in einer Schleife aufgerufen werden, 
ähnlich wie das Versenden ans das Display.

Woher jetzt eine negative Zahl kommt ... meine Bytes sind ALLE im 
Bereich 0-255

MfG

PS: Auch ein MOD muß nicht weiter springen können, als das 'gemeine 
Volk' - Aufräumen, Ja, Das muß Er können
Moderator (Firma: Titel) Persönliche Seite #4947866
Lesenswert?

W.S. schrieb:
> bist du schlichtweg zu kurz gesprungen. Jedenfalls für nen Mod.
Und was hätte im Zweifelsfall das eine mit dem anderen zu tun? Merke 
"Mod != God"...

Was heraus kommt,  ist, dass jede Lösung, die zum Ziel führt, 
hinreichend ist.
Und ich komme Dank Hardwaredesign eben eher mit Integern und 
verschobenen Kommas zurecht und ans Ziel. Andere nehmen einen schnellen 
Prozessor und Float.

Patrick J. schrieb:
> Zahlneu=Zahl/10
Ich würde hier in Hardware bei einem 16-bit Integer eher eine 
Multiplikation mit 6554 machen und dann aus dem 32-Bit Ergebnis das 
obere Wort verwenden, die "Division" durch 65536 bekomme ich somit 
"kostenlos". Mathematisch also (x*6554)/65536 ~= x/10.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren