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
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.
Die Frage ist leider zu unspezifisch. Auf welcher Plattform findet alles statt ? Taschenrechner, PC oder µController ? Dieter
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?
>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.
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
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...
Nachtrag: nach dem Teilen muß das hexadezimale Ergebnis latürnich noch in BCD oder ASCII gewandelt werden (was halt die LCD braucht).
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.