Forum: Mikrocontroller und Digitale Elektronik 8 Bit Umwandeln in Hexzahlen und ausgeben


von Stef (Gast)


Lesenswert?

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

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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...

von F. K. (freddy436)


Lesenswert?

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

von Stef (Gast)


Lesenswert?

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

von Stef (Gast)


Lesenswert?

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??

von F. K. (freddy436)


Lesenswert?

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.

von Stef (Gast)


Lesenswert?

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?

von F. K. (freddy436)


Lesenswert?

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

von Jörg X. (Gast)


Lesenswert?

btw.: "cout", "<<" oder ">>" mit was anderem als ints ist C++, kein C ;)

hth. Jörg

von Christian (Gast)


Lesenswert?

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 ...

von Jörg X. (Gast)


Lesenswert?

> 10000000 >> 4   = 00010000
> 00010000 << 4   = 10000000
eher:
0b10000000 >> 4 = 0b00001000
0b00001000 << 4 = 0b10000000

;) Jörg

von Uhu U. (uhu)


Lesenswert?

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...

von F. K. (freddy436)


Lesenswert?

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
Noch kein Account? Hier anmelden.