mikrocontroller.net

Forum: Compiler & IDEs Binär --> Hex


Autor: Matthias Jung (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe ein Bitfeld, mit lauter binären Werten bestimmt.
struct
  {
     unsigned char 3_3V:1;
     unsigned char 5V:1;
     unsigned char 12V:1;
     unsigned char _12V:1;
     unsigned char STDBY:1;
     unsigned char TEMP_Lueft:1;
     unsigned char OK:1;
     unsigned char no_sysFail:1;
     } Status_Request;

Es gibt doch bestimmt eine schlaue Funktion, die mir daraus den
entsprechenden hex Wert berechnet.

Danke schon mal

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm ne union.

  union Convert
  {
    struct Leider_hast_du_der_struct_keinen_Namen_gegeben Status;
    unsigned char Value;
  }

  union Convert tmp;
  tmp.Status = Status_Request;
  unsigned char i = tmp.Value;

Wenn ich mirs recht überlege, könnte das auch mit
einem simplen cast gehen:

  unsigned char i = (unsigned char)Status_Request;

schlimmstenfalls müsste man machen:

  unsigned char i = *(unsigned char*)&Status_Request;

Oder du könntest überhaupt deine struct verändern:


struct
{
  union
  {
    unsigned char AllBits;
    struct
    {
      unsigned char 3_3V:1;
      unsigned char 5V:1;
      unsigned char 12V:1;
      unsigned char _12V:1;
      unsigned char STDBY:1;
      unsigned char TEMP_Lueft:1;
      unsigned char OK:1;
      unsigned char no_sysFail:1;
    }
  } Status_Request;

dann kannst du über STDBY etc. die einzelnen Bits setzten
und über AllBits kannst du auf alle Bits gemeinsam zugreifen.

Der Möglichkeiten sind da viele. Nur eines noch: Einen
Variablennamen ala 5V oder 12V wird der der Compiler nicht
akzeptieren. Namen von Variablen können nicht mit einer Ziffer
beginnen.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ooops. Da hab ich wohl eine schliessende } vergessen.
Sah gleich so seltsam aus:

struct
{
  union
  {
    unsigned char AllBits;
    struct
    {
      unsigned char 3_3V:1;
      unsigned char 5V:1;
      unsigned char 12V:1;
      unsigned char _12V:1;
      unsigned char STDBY:1;
      unsigned char TEMP_Lueft:1;
      unsigned char OK:1;
      unsigned char no_sysFail:1;
    }
  }
} Status_Request;

Autor: Matthias Jung (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, für die ausführliche Auswahl, werds gleich mal probieren. Das
Variablen Namen Problem hab ich schon behoben.
Danke

Autor: Matthias Jung (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab doch noch mal ne Frage!

Ich brauche "AllBits" in Hex, also wenn vorher 0101 1100 brauch ich
die Binärzahl als Hex, dementsprechend hier 5C. Wo, oder mit was wird
das bei deinen Vorschlägen gewandelt?

Vielleicht bin ich auch nur zu kurzsichtig um es zu sehen, dann sorry.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Definiere ,,in Hex''.  Willst du es auf einer UART ausgeben?
Dann brauchst du einen String und eine Routine, die dir eine
interne (Binär-)Zahl in einen String umwandelt, z. B. itoa()
oder sprintf().  Oder was soll sonst damit passieren?

Autor: Matthias Jung (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau, das habe ich vor, das Ganze soll  über den UART ausgegeben
werden. Das Ausgabeformat, ist schon fest, daher in hex.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, dann halt nach itoa() oder sprintf() gucken im Manual.
sprintf() kann das auf jeden Fall [sprintf(buf, "%02x", i);],
ist nur die Frage, ob du den Code-Overhead tolerieren kannst,
da es eine eierlegende Wollmilchsau ist.

Autor: Matthias Jung (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist denn Code-Overhead?
Also den Beschreibungen nach, müsste es auch mit ITOA() gehen. Ich
werds mal mit itoa() probieren. Allerdings muss ich dann mein Bitfeld
von char in int abändern, damit es mir itoa() in einen String im Hex
Zahlensystem wandeln kann.
Danke für deine Hilfe

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ITOA() gibt es nicht.  C ist case sensitive.

Das Problem von itoa() ist nur, dass du keine Vornullen direkt
ausgegeben bekommst, das müsstest du dir mit der Hand dran
stricken.

> Allerdings muss ich dann mein Bitfeld von char in int abändern,
> damit es mir itoa() in einen String im Hex Zahlensystem wandeln
> kann.

Wie kommst du darauf?  Hast du die Parameterübergabe von C nicht
verstanden?

Allerdings sollte der "char" wohl "unsigned char" sein, damit du
nicht in sign extension Probleme rennst, oder gleich "uint8_t"
(Definition steht in <stdint.h>, C99 genormt).  Außerdem besser
utoa() benutzen oder den Wert erst nach (unsigned int) casten.

> Was ist denn Code-Overhead?

Die Codegröße, die sprintf() mit sich herumschleppt, da es eben
alles Mögliche und Unmögliche konvertieren kann.  (Lediglich
Gleitkomma ist in der Standardversion weggelassen.)

Ist also einfach eine Frage, wie viel Platz du im ROM übrig hast.
sprintf() ist die Rundum-Sorglos-Version, da es alle Dinge wie
führende Nullen, Hexziffern wahlweise in Groß- oder
Kleinbuchstaben etc. pp. erledigt.  Wenn ich Platz im ROM habe,
würde ich dem stets den Vorzug vor einer do-it-yourself-Lösung
geben.  Denk dran, ROM sparen ist gut und schön, aber Atmel gibt
dir nichts zurück, wenn du von 16 KB ROM nur 12 KB benutzt. ;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.