Forum: Compiler & IDEs DCF77 -> Verständnis BCD -> Uli-Radig's Code


von Thomas (Gast)


Lesenswert?

Hallo

ich habe ein kleines Verständnis Problem mit dem Code von Uli-Radig.

Vorgeschichte:
Ich empfange via DCF77 Empfänger z.B. die Sieben-Bits der Minuten.
Die 7-Bits sind BCD-Codiert.
d.h. habe ich z.B. folgende BIT-Folge:
0100101 dann sind das ganze 25 Minuten (BCD!!!).
So - Werte ich das ganze als Integer aus, dann habe ich natürlich den
Wert 37. Diesen Wert kann ich nun mit Hex2Dec wandeln.
z.B.
37-((37/16)*6) ergibt im Integer den Wert 25 (Vorsicht - C-Code - Es
zählt nur das ganzzahlige Ergebnis der Division!).

Uli schreibt folgendes:
//Berechnung der Minuten BCD to HEX
mm = rx_buffer->Min-((rx_buffer->Min/16)*6);

So, dass was mich irritiert ist der Kommentar! Ich mache hier doch
keine BCD to HEX Wandlung sondern richtig genommen eine HEX to DEC
Wandlung!

Bitte um bestätigung - ansonsten muss ich mich wohl nochmal mit den
Grundlagen beschäftigen!

von Joachim (Gast)


Lesenswert?

Hallo,

unter BCD versteht man "binary coded decimal", d.h.
die niederwertigen 4 Bit sind als binäre Zahl zu interpretieren und die
höherwertigen 4 Bit sind ebenfalls als binäre Zahl zu interpretieren.
Die höherwertige Zahl ist die Zehnerstelle.

Die BCD-Darstellung soll nun in eine binäre Darstellung (oben
mißverständlich als "HEX" bezeichnet) umgewandelt werden. D.h. alle 8
Bit sollen als eine binäre Zahl interpretiert werden.

Das verwendete Verfahren führt nun eine Stellenwertkorrektur durch.
D.h. die höherwertigen 4 Bit bedeuten in der BCD-Darstellung den
Stellenwert 10 (weil es die Zehnerstelle ist).
In der Binärdarstellung haben sie jedoch den Stellenwert 16, weil die
Stelle um 4 Bit nach links verschoben ist.

Wenn ich nun den BCD-Wert binär interpretiere muß ich die Zehnerstelle
um das Produkt 6*Zehnerstelle verringern bzw. korrigieren.

Ich hoffe, dass das so verständlich ist.

Gruß
Joachim

von rkhb (Gast)


Lesenswert?

Man muss zwischen Darstellung und Interpretation unterscheiden:

"0100101" ist eine Zeichenfolge (String) mit 7 Einsen oder Nullen.
Diese Darstellung nennt man binär. In diesem Fall sollen die hinteren 4
Bits als Zahl zwischen 0 und 9 und die vorderen 3 Bits als Zahl zwischen
0 und 7 interpretiert werden. Es handelt sich somit um eine "binär
codierte Dezimalzahl". Die Interpretation ergibt den Wert 25
(dezimal).

Sollen sämtliche 7 Bits als Zahl interpretiert werden, dann hat
"0100101" den Wert 37 (dezimal). Hexadezimal würde der Wert 37 erst,
wenn ich ihn als "25" darstellen würde. Die Zeichenfolge "25" wäre
also oben BCD und hier HEX, obwohl sie für das Auge identisch ist. Man
könnte diese Zahl eine "binär codierte Hexadezimalzahl" nennen, aber
"Integer" ist kürzer und einfacher.

Da printf in der main.c nicht mit BCD umgehen kann, muss man die BCD in
Integer umwandeln. "%d" in der Formatanweisung bedeutet: Interpretiere
den übergebenen Integerwert als Dezimalzahl. Damit wird noch einmal eine
Umwandlungsroutine gestartet: INT to ASCII. Ich hätte es für geschickter
gehalten, die BCD-Zahl gleich in ASCII umzuwandeln:

(BCD & 0x0Fh) | 0x30
(BCD >> 4) | 0x30

und dann dem printf-String zwei char zu übergeben.

viele grüße
ralph

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.