Forum: Mikrocontroller und Digitale Elektronik Hex-Nibble in short int umwandeln (8051)


von doublex (Gast)


Lesenswert?

Hallo,

ich habe folgende Funktion
1
void outHexByte(unsigned char ch)
2
{   
3
  outNibble(ch / 16);  // shift um 4 Stellen nach rechts
4
  outNibble(ch); 
5
}

mit der ich aus einem HEX-Nibbel ein HexByte zusammensetze.

Wenn ich aus den Nibbeln ein HexWord zur Ausgabe eines "short int" 
machen will, könnte ich das doch mit der CAST-Funktion machen:
1
void outHexWord(unsigned char ch)
2
{
3
  short int lo, hi, word;
4
 
5
  lo = (short int) outNibble(ch / 16);  // shift um 4 Stellen
6
  hi = (short int) outNibble(ch);
7
        word = lo + hi;
8
}

Das funktioniert nicht. Der Comp. (Keil µvision) macht Probleme wegen 
Typenverträglichkeit. Wie funktioniert das?

von Matthias L. (Gast)


Lesenswert?

???

Was willst du tun und was wird angemeckert?

von doublex (Gast)


Lesenswert?

Ich habe die Funktion outNibble()
1
 void outNibble(unsigned char ch)
2
{
3
  if ((ch & 0x0f) < 10)
4
  {
5
    outChar((ch & 0x0f) + '0');
6
  }
7
  else outChar((ch & 0x0f) + '7');
8
}

aus der ich wie oben beschrieben ein outHexByte() mache. Jetzt möchte 
ich aus outNibble() ein outHexWord() zur Ausgabe eines "short int" 
machen.

von Matthias L. (Gast)


Lesenswert?

du willst also aus einem short-int (16bit) eine ausgabe in form eine 
asci-strings machen?

Wie wäre es mt itoa() ?

Oder soll die Ausgabe als hex-Zahl erfolgen?

von doublex (Gast)


Lesenswert?

Nein, ich möchte aus einem ASCII-Sting in Hex ein short int machen! (Ich 
sollte mich echt mal ein besser ausdrücken).

von doublex (Gast)


Lesenswert?

Wenn ich beispielsweise 0x2F übergebe sollte 47d (8-Bit) rauskommen.

von Matthias L. (Gast)


Lesenswert?

>Nein, ich möchte aus einem ASCII-Sting in Hex ein short int machen! (Ich
>sollte mich echt mal ein besser ausdrücken).

Also sowas hast du:
string  '3E43'
und daraus soll eine 0x3E43 in einer int-Var stehen?


Das ist aber genau andersrum als deine bisherigen Erklärungen

von doublex (Gast)


Lesenswert?

Wenn ich outHexWord(0x2F) aufrufe sollte nach meinem Verständnis 
(welches noch nicht weit reicht) 47 (dezimal rauskommen), da die 
Wortbreite des 8051 8 Bit beträgt.

von Matthias L. (Gast)


Lesenswert?

>Wenn ich outHexWord(0x2F) aufrufe sollte nach meinem Verständnis
>(welches noch nicht weit reicht) 47 (dezimal rauskommen), da die
>Wortbreite des 8051 8 Bit beträgt.

DU verstehst es nict. 0x27 und 47 ist dieselbe Zahl! Nur durch 
unterschiedliche Basen^(*) dargestellt! Da braucht erstmal nix 
umgerechnet werden.
Deshalb passsen ja in 8bit auch nur so dezimal krumme Werte von 0..255 
rein. Hexadezimal, also zur Basis 16 dargestellt, ergibt das die 
"gerade" Zahl von 0..0xFF.

Anders sieht es aus, wenn du den Inhalt des 8bit-Registers (oder einer 
8bit Variable) auf einem Display ausgeben willst. Dann musst du das in 
einen String umwandeln.

Davon hast du aber nichts erwähnt, obwohl das das vermuten lässt:
outChar((ch & 0x0f) + '0');
                      ^^^^


(*)
Das ist dasselbe, als ob ich sage, der Monitor kostet entweder 100Euro, 
oder 200DM. Das ist genau dasselbe, nur durch unterschiedliche Basen 
(hier: Währungen) dargestellt.

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.