mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit 32Bit Variablen


Autor: Ralf Ramsauer (rralf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Bei mir klappt absolut kein vernünftiges Arbeiten mit 32Bit Variablen ( 
unsigned long, uint32_t )

Beispiel:

uint32_t foo;
foo = (1<<18);

sollte ja eigentlich gehen
Compiler sagt:
warning: left shift count >= width of type

Wie kann das sein? Egal was ich mach, ich kann nur die ersten 16bit 
erreichen, der Rest existiert quasi gar nicht.

Vielen Dank!

rralf

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Ralf Ramsauer (rralf)

>warning: left shift count >= width of type

Klar, weil 1 eine 16 Bit 1 ist, weil alle Konstanten implizit vom Typ 
int sind.

Probier mal

foo = (1L<<18);

MFG
Falk

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Konstante Zahlen sind beim avr-gcc standardmäßig 16 Bit breit, um sie 
auf 32 Bit zu kriegen muss man am Ende L (long) bzw UL (unsigned long) 
anfügen. Also foo = (1UL<<18);

Autor: Ralf Ramsauer (rralf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Heil am Sack.
Ich hab mir heute stundenlang den Kopf darüber zerschlagen warum das 
nicht geht, und ich hab mir sowas in der Art schon fast gedacht.

Ich wollte von meinem Computer per Uart eine 32Bit Variable auf den AVR 
übertragen, also hab ich die am PC in 4Bytes gesplittet und die auf dem 
AVR rübergeschickt, welcher die dann wieder zusammenbauen sollte. 16Bits 
gingen wunderbar, aber was drüber war ging nicht.

Würde dann folgender Code funktionieren ( am AVR ):
unsigned char bytes[4];
bytes = ..... // bytes soll jetzt mal schon die richtigen werte enthalten.
unsigned long foo;

foo = (unsigned long)bytes[0] | (unsigned long)bytes[1]<<8 | (unsigned long)bytes[2]<<16UL | (unsigned long)bytes[3]<<24UL;

Tausend Dank!

Ralf

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bau dir ne union, 4 char, ein long. Brauchst du nichts zu shiften und 
anderen Kram.

Autor: Ralf Ramsauer (rralf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Davon hab ich schon mal gelesen.
Beitrag "32bit long in 4 byte aufteilen"
Wie schaut das dann aus?

Sowas wie:
typedef union {
  unsigned char b[4];
  unsigned long l;
} typ_mixed;

Und wenn ich dann b fülle steht in l automatisch der long wert oder was?

Danke!

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
rischtisch

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Ralf Ramsauer (rralf)

>Und wenn ich dann b fülle steht in l automatisch der long wert oder was?

Ja, denn die Variablen liegen "übereinander" an der gleichen Adresse, 
NICHT hintereinander wie in einem stuct.

MfG
Falk

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nur aufpassen beim Eintüten -big/little endian.

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.