Hex-Nibble in short int umwandeln (8051)

Gast #1055042
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?
Gast
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.
Gast
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?
Gast
>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
Gast
>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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.