mikrocontroller.net

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


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Joachim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: rkhb (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.