www.mikrocontroller.net

Forum: Compiler & IDEs Umwandlung von 16 Bit in 8 Bit


Autor: LtData (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich möchte gerne einen 32 Bit Wert vom Typ uint32_t übertragen und zwar 
über 8 I/O Pins. Also müsste ich die Variable in 4 vom Typ uint8_t 
splitten.
Wie mache ich das am besten?

Vielen Dank!

Autor: Christian Schifferle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
union {
uint23_t u32;
uint8_t u8[4];
} x;

// 32-Bit Wert einschreiben:
x.u32 = <irgend ein wert>;

// Die 8-Bit Werte auslesen
a = x.u8[0];
a = x.u8[1];
a = x.u8[2];
a = x.u8[3];

Es geht auch über bit shift befehle, aber mit unions ist es viel 
komfortabler.

Gruss
Christian

Autor: Benno Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geht das eigentlich auch, wenn man einen signed long hat und diese in 4 
unsigned chars wandeln möchte?

also etwa so in der art:

  union
  {
    long s32;
    unsigned char u8[4];
  } x;

was ist das LSB und was das HSB?

Autor: Christian Schifferle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Logisch, du musst bloss aufpassen, wo das Vorzeichenbit bei der 
long-Komponente liegt. Üblicherweise ist dies das höchstwertige Bit.

HSB = Höchstwertiges Bit bzw. Byte, wird meistens jedoch als MSB (Most 
Significant Bit) bezeichnet.
LSB = Niederwertigestes Bit bzw. Byte (Lowest significant Bit).

Zur Erklärung:
Wenn du die Dezimalzahl 4712 anschaust, dann ist 2 das niederwertigste 
und 4 das höchstwertigste Zeichen. Genau so geht es auch mit Binärzahlen 
und anderen Zahlensystemen.

Gruss
Christian

Autor: Benno Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> HSB = Höchstwertiges Bit bzw. Byte, wird meistens
> jedoch als MSB (Most Significant Bit) bezeichnet.
> LSB = Niederwertigestes Bit bzw. Byte (Lowest
> significant Bit).

Klar, nur wo liegt dieses im Array?

ist x.u8[0] das niederwertigste bit, oder das höherwertigste?

Autor: Christian Schifferle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hängt davon ab, wie long-Werte im Zielsystem abgebildet werden.
Die union legt einfach die verschiedenen Variablendeklarationen 
übereinander. So gesehen wird wahrscheinlich u8[0] das höchstwertige 
Byte bezeichnen.
Ich würde es aber zuerst sicherheitshalber mal ausprobieren.
Setze dazu x.s32 = 0x12345678
uind lies danach die 4 Bytes aus, dann weisst du genau wie dieselben im 
Speicher abgelegt sind. Die einzelnen Werte der vier Bytes x.u8[0] bis 
x.u8[3] betragen 0x12, 0x34, 0x56 und 0x78.

Gruss
Christian

Autor: Benno Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gute Idee! Habs ausprobiert und festgestellt das in x.u8[0] das HSB 
steckt, wie du schon sagtest.

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.