Forum: Mikrocontroller und Digitale Elektronik (µVision) Zahl mit 2 Nachkommastellen auf LCD ausgeben (ADC)


von Frank (Gast)


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

von Cbf600 (Gast)


Lesenswert?

Wo hängts denn? Umwandlung von float zu char?

von Selbstlernender (Gast)


Lesenswert?


von Frank (Gast)


Lesenswert?

ne ich will ohne float arbeiten

von Wolfgang (Gast)


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

von Ohne Worte (Gast)


Lesenswert?

Frank schrieb:
> Poti: 0V - 255V

Zuerst mal die Aufgabenstellung richtig darstellen.

von Selbstlernender (Gast)


Lesenswert?

Frank schrieb:
> Könnte mir jemand das erklären?
> Und vielleicht auch noch mir das Programm zeigen?

Warum machst Du Deine Hausaufgaben nicht selbst?

https://www.mikrocontroller.net/articles/Festkommaarithmetik

von W.S. (Gast)


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.

von Holger (Gast)


Lesenswert?

W.S. schrieb:
> Ich hab
> sowas schon so oft selber gemacht, daß ich mit absoluter Sicherheit
> sagen kann, daß es geht.

+1

mee too :-)

von Wolfgang (Gast)


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Frank schrieb:
> ne ich will ohne float arbeiten
Dann solltest du in Centivolt rechnen. Und zwischen die 2. und die 3. 
Stelle ein Komma machen.

von Matheprofessor (Gast)


Lesenswert?

Lothar M. schrieb:
> Dann solltest du in Centivolt rechnen.

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.

von Forist (Gast)


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Es ist einfach so, wie wenn ich z.B. beim Geld nicht in 1,23 Euro 
sondern in 123 Cent rechne. 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.

von W.S. (Gast)


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.

von Wolfgang (Gast)


Lesenswert?

W.S. schrieb:
> aber denk mal an negative Zahlen, damit wird das
> noch häßlicher: .-7 oder -._7 oder wie hätten's wir gern?

Du verlierst das Problem aus den Augen. Es geht um ein

Frank schrieb:
> Poti: 0V - 255V

Das Zeichen "-" ist kein Minus-Zeichen, sondern bedeutet "bis" ;-)

von Patrick J. (ho-bit-hun-ter)


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

von Stefan (Gast)


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.

von Ohne Worte (Gast)


Lesenswert?

Stefan schrieb:
> Must doch nur Float nach String umkonventieren
> lassen und gut ist.

Kleine Hinweisliste für angehenden Sherlock Holmes:

Frank schrieb:
> Poti: 0V - 255V

Frank schrieb:
> Mit Float funktioniert das nicht.

Matheprofessor schrieb:
> Wenn die Messergebnisse in 100 Centivolt quantisiert daherkomen

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

: Bearbeitet durch Moderator
von Stefan (Gast)


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.

von W.S. (Gast)


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.

von Patrick J. (ho-bit-hun-ter)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

: Bearbeitet durch Moderator
von Wolfgang (Gast)


Lesenswert?

W.S. schrieb:
> if Zahl < 0
> then v:= '-' und Zahl:= -Zahl

Wo bitte steht in der Aufgabenstellung irgendetwas von negativen 
Zahlen? Lies doch einfach mal.

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.