Forum: Mikrocontroller und Digitale Elektronik Fixpunktnachkommastellen zu BCD


von Nico (Gast)


Lesenswert?

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!

von Max H. (hartl192)


Lesenswert?

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.

von Route_66 H. (route_66)


Lesenswert?

Nico schrieb:
> Aber geht es nicht auch irgendwie effizienter

Effizient in welcher Hinsicht - Geschwindigkeit, Codegröße, 
Speicherverbrauch, Übersichtlichkeit?

von Nico (Gast)


Lesenswert?

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.

von Nico (Gast)


Lesenswert?

Danke!

von Route_66 H. (route_66)


Lesenswert?

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
von Nico (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.