22Bit Wert durch 100 dividieren und auf LCD ausgeben

Gast
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.
Gast
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?
Gast
>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.
Gast
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
Gast
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...
Gast
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?
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.