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!
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.