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
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".
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.
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.
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.
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.
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.
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.
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" ;-)
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
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.
Stefan schrieb:> Must doch nur Float nach String umkonventieren> lassen und gut ist.
Kleine Hinweisliste für angehenden Sherlock Holmes:
Frank schrieb:> Poti: 0V - 255VFrank schrieb:> Mit Float funktioniert das nicht.Matheprofessor schrieb:> Wenn die Messergebnisse in 100 Centivolt quantisiert daherkomen
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.
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.
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.
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
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.
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.