DCF77 -> Verständnis BCD -> Uli-Radig's Code

Gast #367189
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!
Gast #367190
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
Gast #367191
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.