Forum: Mikrocontroller und Digitale Elektronik 22Bit Wert durch 100 dividieren und auf LCD ausgeben


von Gregor_V (Gast)


Lesenswert?

Hallo,
Ich müsste einen 22Bit Wert durch 100 dividieren, damit danach ein
16Bit Wert herauskommt, welcher danach wiederum auf einer LCD augegeben
wird.

Gibt es hierfür eine einfache möglichkeit das zu realisieren?

mfg Gregor

von Benedikt (Gast)


Lesenswert?

Wie würdest du es im Kopf machen ?
Ganz einfach: Das Komma um 2 Stellen verschieben. Dasselbe wird man
auch bei einem uC machen, denn das ist sehr viel schneller, als den
Wert durch 100 zu teilen und dann auszugeben.

von dds5 (Gast)


Lesenswert?

Die Frage ist leider zu unspezifisch. Auf welcher Plattform findet alles
statt ?  Taschenrechner, PC oder µController ?

Dieter

von Gregor_V (Gast)


Lesenswert?

Ich habe einen ATMEGA 16 und programmiere in Assembler.

Ich muss bei einem Tacho die gefahrene Strecke anzeigen, das mache ich,
indem ich bei jeder Radumdrehung z.B 86cm hinzuaddiere.

Wie kann ich also die Kommastelle hier verschieben?

von Benedikt (Gast)


Lesenswert?

>Wie kann ich also die Kommastelle hier verschieben?

Wenn du in Assembler programmierst hast du irgendeine Routine, die den
Wert auf dem LCD ausgibt. Und da musst du einfach vor der Ausgabe der
10er Stelle ein Komme ans LCD senden.

von dds5 (Gast)


Lesenswert?

Da die 22 Bit wahrscheinlich auf drei 8 Bit Register verteilt sind
könnte man z. B. durch 128 teilen indem man 7 mal nach rechts schiebt
(oder einmal links und das niederwertigste Byte wegwerfen). Um eine
Teilung durch 100 zu erreichen vergrößert man einfach den Pro Impuls
addierten Wert um den Faktor 1,28.
X mal 1,28 / 128 = X / 100
Sebstverständlich gibt es noch meherere andere Lösungen, aber das
dürfte mit Assembler die kürzeste und schnellste sein.

Dieter

von Gregor_V (Gast)


Lesenswert?

ja, nur ist eine 22Bit BIN2BCD Routine aufwendiger zu realisieren als
eine 16Bit Ausgabe, und ich habe auch leider nicht mehr allzu viel
freie Register...

von dds5 (Gast)


Lesenswert?

Nachtrag:
nach dem Teilen muß das hexadezimale Ergebnis latürnich noch in BCD
oder ASCII gewandelt werden (was halt die LCD braucht).

von Gregor_V (Gast)


Lesenswert?

Um eine BCD Zahl in den Standard ASCII Code für LCDs umzuwandeln muss
man soweit ich weiß ja eigentlich eh nur 48 dazuaddieren.

Aber wie kann ich in Assembler einen Kommawert als Faktor hinzufügen?

von Philipp Sªsse (Gast)


Lesenswert?

Allgemein, um eine große Zahl als ASCII auszugeben:

Starte mit dem ASCII-Wert von '0' in einem Register. Nun durchlaufe
eine Schleife, in der Du jedesmal 1.000.000 von Deinem
Wert abziehst und (falls das ging), Dein Register inkrementierst. Ist
die Zahl schon zu klein, schreibst Du den Wert raus. Und das gleiche
machst Du dann für 100.000, 10.000 usw. Ist schneller und einfacher als
alles, selbst wenn Du mal drei-Byte-Werte subtrahieren mußt. Nach den
hunderten kann man aufhören, wenn der Rest nicht angezeigt werden
soll.

Speziell in diesem Fall: Du brauchst keine cm, sondern immer nur Meter.
Dieter hat also Recht: ändere Deine Zählbasis! Ich würde es so machen,
daß Du in zwei Bytes nachher direkt Deine Meter stehen hast. Also
müssen im dritten Byte 256stel-Meter stehen. Also zählst Du pro
Umdrehung 220 zu diesem Byte hinzu, der Übertrag kommt auf das Wort, in
dem die Meter stehen.

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.