Hallo, ich versuche im Moment, 8 Bit, die ich erhalte, mithilfe von Bitmanipulation und einer If-Schleife in lesbar Hexzahlen umzuwandeln. temp_bwf = bwf; /* bwf sind die Daten, die ich erhalte */ temp_bwf &= 0xF0; /* glaube nicht, dass das stímmt */ TXBUF0 = temp_bwf; ??? temp_bwf = bwf; /* hier arbeite ich mit den letzten Nippel */ temp_bwf = temp_bwf >>4; temp_bwf &= 0x0F; TXBUF0 = temp_bwf; Mit den Bitmanipulationen kenne ich mich nicht so aus. Und das schlimmste ist, ích muss diesen Wirrwarr an Bits noch in 1-9 und A-F für Hex umwandlen. Mein größtes Problem jedoch ist der Nippelwirrwarr, ich habe dort keinen richtigen Durchblick. Nja, mal sehen, ob wer mir weiterhelfen kann. Danke
Stef wrote: > Mein größtes Problem jedoch ist der Nippelwirrwarr, ich habe dort keinen > richtigen Durchblick. > Ja das kann bei der Arbeit Mörderisch sein! o.O ein halbes byte heißt Nibble! Ich (vermute) das du eine Zahl in (lesbares) ASCII HEX umwandeln willst. Dein vorgehen ist da schon richtig, nur das du noch einen Offset draufaddieren mußt damits auch eine Buchstabe wird (schau dir mal die ASCII Tabelle an) Ansosnten bietet C auch funktionen wie sprintf die dir das abnehmen...
in zwei Nibbles zerlegen, dann sollte sowas gehen: if(nibble < 10) hex_char = 0x30 + nibble // 0x30 = ASCII 0 else hex_char = 0x41 - 10 + nibble // 0x41 = ASCII A
Das mit dem draufaddieren ist mir klar, denn sonst bekomme ich nur Smilys oder komische Zeichen, aber es funktioniert trotzdem noch nicht. Kann jemand vielleicht ein konkretes Beispiel bringen, wie es richtig aussehen müsste??? Danke
Achso, dank, war ich wieder einmal zu langsam Wie komme ich aber an das höhrere Paar Nippel dran?? Da habe ich noch keine konkrete Idee. Bis jetzt
1 | temp_bwf = bwf; |
2 | temp_bwf = temp_bwf >>4; |
3 | temp_bwf &= 0x0F; |
habe ich hier doch bloß das niedere Paar bearbeitet, oder nicht??
hier mal ein sehr einfaches beispiel:
1 | #include <iostream.h> |
2 | |
3 | int main() |
4 | {
|
5 | unsigned char nibble, byte, hex_char; |
6 | byte = 0x3A; |
7 | |
8 | // high nibble
|
9 | nibble = (byte >> 4); // shift |
10 | nibble &= 0x0F; // mask |
11 | if(nibble < 10) |
12 | {
|
13 | hex_char = 0x30 + nibble; |
14 | }
|
15 | else
|
16 | {
|
17 | hex_char = 0x41 - 10 + nibble; |
18 | }
|
19 | cout << hex_char; |
20 | |
21 | // low nibble
|
22 | nibble = (byte >> 0); // no shift |
23 | nibble &= 0x0F; // mask |
24 | if(nibble < 10) |
25 | {
|
26 | hex_char = 0x30 + nibble; |
27 | }
|
28 | else
|
29 | {
|
30 | hex_char = 0x41 - 10 + nibble; |
31 | }
|
32 | cout << hex_char; |
33 | }
|
Das ganze solltest du so aber nicht verwenden, besser in eine Schleife umbauen. Es ändert sich ja nur die die shift Zahl.
Danke, jetzt ist es auch gut zu verstehen. Super, nochmals danke. Nur eine Frage: was macht bei dir [c] cout << hex_char; [c/] Was ist bei dir cout und was machst du zum Schluß der Funktion?
cout ist ne alte standard Ausgabe Funktion (console). Beim µC Quellcode die zwei Zeilen durch entsprechende Ausgabe Funktionen (uart, lcd, etc.) oder was auch immer ersetzen. #include <iostream.h> brauchst du auch nicht beim µC
btw.: "cout", "<<" oder ">>" mit was anderem als ints ist C++, kein C ;) hth. Jörg
Hallo Stef, ähm, was willst du genau ? nZahl = 10; sprintf(szBuff, "0x%X\0", nZahl); szBuff = 0xA Im Beispiel oben hast du das höherwertige nible bearbeitet... 11111111 & 0xF0 = 11110000 11111111 & 0x0F = 00001111 10000000 >> 4 = 00010000 00010000 << 4 = 10000000 Hoffe das hilft ...
> 10000000 >> 4 = 00010000 > 00010000 << 4 = 10000000 eher: 0b10000000 >> 4 = 0b00001000 0b00001000 << 4 = 0b10000000 ;) Jörg
Es ist natürlich gut, wenn man solche Wandlungen mal selbst gemacht hat - dann weiß man, wies geht. Wenn man es gelernt hat, kann man auch die Standard-Funktion itoa dafür verwenden...
Uhu Uhuhu wrote: > Wenn man es gelernt hat, kann man auch die Standard-Funktion itoa dafür > verwenden... Gerade bei µCs machen eigene Lösungen meistens mehr Sinn. Die machen dann nur das was man auch genau braucht dabei sind sie meistens kleiner/schneller als Standardfunktionen.
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.