Nehmen wir einmal 8 Stellen an, daher die Rückgabe ist ein long. Wenn die Werte zu groß sind, werden nur die letzten 8 Stellen zurückgegeben. Sollen es nur 4 Stellen sein, die Typen von bcdval und des Rückgabewertes auf unsigend int ändern.
unsigned long BCDencode (unsigned long binval) {
unsigned long bcdval = 0;
for (int i=0; binval && i < sizeof(bcdval) * 8; i+=4) {
bcdval += (binval % 10) << i;
binval /= 10;
}
return bcdval;
}
Und weil es so lustig ist, gleich den Decode dazu:
unsigned long BCDdecode (unsigned long bcdval) {
unsigned long binval = 0;
for (int i=1; bcdval; i *=10) {
binval += (bcdval & 0xf) * i;
bcdval >>= 4;
}
return binval;
}
Im ernst:
Als Augabe der Umwandlung dezimal -> BCD ist es für DE8MSH nicht notwendig eine Array mit den BCD-Werten für jede Stelle zu haben um diese dann einzeln Stelle für Stelle über die Serielle Schnittstelle zu schicken?
Nein danke, Code testen wird nur zur Arbeit, und zu Arbeit gehört auch Lohn. Deshalb poste ich entweder Code, den ich irgendwo herumliegen habe oder Zeugs, das mir so in den Sinn kommt. Nur wenn es ein wirklich interessantes Problem ist, wird es auch ausprobiert.
Also ich möchte, oder muss :), von 52 (kHz) bis 29.999 (kHz) umwandeln.
Es werden 5 Byte seriell übertragen. Das erste Byte ist der Befehl. Z.B. 0x0A (10) für "Stelle Frequenz auf" und dann die vier Byte für die Frequenz. Also z.B. 0x0A 0x01 0x42 0x30 0x00 für 14.230,00 kHz.