Hallo! Wie wandelt man mit einem AVR (ASM) die Fixpunktnachkommastellen zu BCD um? Beispiel: .75 dezimal entspricht bei 4 Bit Nachkommastellen 1100 binär - also dezimal 12. Die 75 als Ganzzahl kann ich errechnen, indem ich die 12 mit 100 multipliziere (wegen 4 Bit ergeben sich maximal 2 dezimale Nachkommastellen) und anschliessend durch 16 dividiere (2^4). Danach kann ich eine Routine wie die in AppNote 204 verwenden, um die BCD-Codes zu erhalten. Aber geht es nicht auch irgendwie effizienter über irgendwelche cleveren Bit-Schiebereien, Algorithmen oder dergleichen bzw. ohne die Multiplikation und Division? Die erscheinen mir etwas aufwändig für die Aufgabenstellung. Danke im Voraus und Gruss!
Nico schrieb: > Aber geht es nicht auch irgendwie effizienter über irgendwelche cleveren > Bit-Schiebereien, Algorithmen oder dergleichen bzw. ohne die > Multiplikation und Division? Die Division durch 16 geht mit 4 Rechtsshifts, eventuell durch Nibble Swap optimierbar, Multiplikation geht bei ATmegas in Hardware.
Nico schrieb: > Aber geht es nicht auch irgendwie effizienter Effizient in welcher Hinsicht - Geschwindigkeit, Codegröße, Speicherverbrauch, Übersichtlichkeit?
Max H. schrieb: > Die Division durch 16 geht mit 4 Rechtsshifts, eventuell durch Nibble > Swap optimierbar, Multiplikation geht bei ATmegas in Hardware. Stimmt. Das habe ich beides übersehen. Damit sieht das gleich viel eleganter aus. Das probiere ich. Route 66 schrieb: > Effizient in welcher Hinsicht Geschwindigkeit. Der Rest scheint mit kein Problem zu sein.
Nico schrieb: > Geschwindigkeit. Der Rest scheint mit kein Problem zu sein. Deine 4 binären Nachkommastellen ergeben 16 mögliche BCD-Werte. Bei zweistelliger dezimaler Nachkommastelle sind das 16 Bytes, bei vierstelliger dezimaler Nachkommastelle 16 Words. Für Dein Beispiel (zwei dez. Nachkommastellen aus 4 binären) ergibt sich eine Tabelle von 16 Bytes BCD-Code, also: 00 06 12 19... und für den 12ten Wert findet man dann 75. Über einen Zeiger ist der Zugriff einfach. Auch nichtlineare Zusammenhänge oder spezielle Rundungsregeln (Abschneiden, kaufmännisch, immer Aufrunden...) sind möglich. Nennt sich Lookup-Table (LUT). Für zwei Nachkommastellen geht es weder schneller noch mit weniger Speicher.
:
Bearbeitet durch User
Route 66 schrieb: > Nennt sich Lookup-Table (LUT). Klar, das geht natürlich auch. Das gefällt mir gut, obwohl ich in diesem Fall von absehen würde. Für die Zukunft behalte ich mir das im Hinterkopf. Nochmals danke!
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.