Forum: Mikrocontroller und Digitale Elektronik 16bit -> 2*8bit und 2*8bit -> 16bit


von Markus C. (ljmarkus)


Lesenswert?

Guten Morgen,

komme mit der umrechnung nicht klar. Hoffe Ihr könnt mir helfen.

AVR M8515 und CVAVR


16bit Zahl in 2 8bit zerlegen:

Sender:
Adresse ist 16bit

Data[0] = Adresse >> 8;
Data[1] = (char) Adresse;
-------------------------------------------

Empfänger:
Adresse ist wieder 16bit

Adresse = Data[0]<<8 + Data[1];



nur leider stimmt das Ergebnis nicht. Wo liegt mein Fehler ?


Danke, Markus

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Was heißt den "stimmt nicht"?.
Sende/Empfangsreihengfolge ggf falsch?

von Markus C. (ljmarkus)


Lesenswert?

wenn ich Adresse 1 sende reagiert der Empfänger auf keiner Adresse.
Sende ich den Wert 256 dann reagiert der Empfäner auf 256.
Sende ich den Wert 257 dann reagiert der Empfäger immer noch auf 256

von ROFL (Gast)


Lesenswert?

evtl. mal einen "Angst-cast" ausprobieren und maskieren:

Adresse = ((int)(Data[0])<<8) | ((int)(Data[1]) & 0x00ff);

von Markus C. (ljmarkus)


Lesenswert?

@ROFL

supi, danke, so funktioniert es.


mfg,
Markus

von Matthias L. (Gast)


Lesenswert?

Das ist kein Angstcast, das muss einfach vorher sein:
1
Adresse =   (  (uint16_t) Data[0] << 8 )
2
          | (  (uint16_t) Data[1]      );

Wobei man einen der beiden Casts weglassen kann.

von eProfi (Gast)


Lesenswert?

Das Problem ist die Priorität von << und +.

Der Compiler rechnet nämlich die Zeile
Adresse = Data[0]<<8 + Data[1];

so:
Adresse = Data[0]<<(8 + Data[1]);

Du brauchst nur eine Klammer, nämlich so:
Adresse = (Data[0]<<8) + Data[1];

Richtig rechnet er ohne Klammer so:
Adresse = Data[0]*256 + Data[1];

Denn hier gilt PvS (Punkt vor Strich).



Da auf einem 8-bit-Rechner das ganze Geschiebe überflüssig ist, würde 
ich eine union empfehlen. Habe ich ja schon oft genug hier gepostet.

von Detlev T. (detlevt)


Lesenswert?

Klammern sind notwendig, weil die Addition eine höhere Priorität als der 
Shift-Operator hat. Auf einem 8-Bit-Rechner sollte man zudem 
sicherstellen, dass die Shift-Operation nicht in 8 Bit ausgeführt wird, 
weil sonst die Bits im Nirwana verschwinden. Ein expliziter Cast auf 
16-Bit ist sicher nicht falsch.

Halbwegs ordentliche Compiler sind in der Lage, einen Shift um 8-Bits 
einen Kopierbefehl zu optimieren. Ein explizites Handling mit 
union-Datentypen ist daher meist überflüssig.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.