mikrocontroller.net

Forum: Compiler & IDEs Bytes in Long Typ schieben


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

bin mit dem Bit-Shift-Operator noch nicht so vertraut und wollte mal 
fragen ob das so funktioniert.

Ich habe ein Array mit 3 unsigned char Werten an der Stelle 5,4,3.
Diese Stellen eine 24 Bit Variable dar, die ich asuwerten möchte.

1.) Ich nehme dafür eine neue Variable vom Typ long

2.) Da die bits vertauscht sind muss ich mit dem MSB bei Stelle 5 
anfangen

unsigned long size;

size = array[5];
size = (size << 8);
size = array[4];
size = (size << 8);
size = array[4];

nun sollte size aus folgendem Wert bestehen:

size = 0x00array[5]array[4]array[3];

ist das so ok oder überschreibe ich mit size = array[4]; wieder alle 
Stellen ?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> bin mit dem Bit-Shift-Operator noch nicht so vertraut

Die verweendest du richtig, aber die Zuweisung nicht.

> ist das so ok oder überschreibe ich mit size = array[4]; wieder alle
> Stellen ?

Letzteres. Ändere es in:
size = array[5];
size = (size << 8);
size |= array[4];
size = (size << 8);
size |= array[3];

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich sag danke !

Autor: Herrpool (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hab das gefühl bei allen klappt es nur bei mir nicht ... ich möchte 
zwei bytes in eine 16bit variable schreiben. sollange ich nur die 
letzten 12 bits benutze funktioniert es tatellos. wenn ich aber zb FF 
und FF zusammenfügen will kommt 000001 raus und nicht FFFF. ich benutz 
einen mega32 und winavr.

uint8_t top = 0xFF;
uint8_t bottom = 0xFF;
uint16_t size=0;


size = top;
size = (size << 8);
size |= bottom;

müßte doch funktionieren oder?

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie gibst du den Wert von 'size' aus? Vielleicht wird da mit einer 
signed variablen gearbeitet, dann entspricht 0xffff üblicherweise 
(zumindest bei 16-Bit) dezimal -1. Was ist es denn für einen Compiler? 
Du könntest auch versuchen, 'top' und 'bottom' vor dem Speichern noch 
explizit nach 'uint16_t' zu casten.
Oder so:
size = ((uint16_t)top << 8) | (uint16_t)bottom;

Autor: Herrpool (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
besten dank!!! mittlerweile läuft es!! die ausgabe funktion nutze ich 
für alles mögliche deshalb war da eine abs() mit drin. einen unsigned 
scheint er nach abs() zum signed zumachen oder was auch immer, 
jedenfalls funktioniert das nun ohne ;)

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.