mikrocontroller.net

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


Autor: Markus C. (ljmarkus)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

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

Autor: Markus C. (ljmarkus)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ROFL (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
evtl. mal einen "Angst-cast" ausprobieren und maskieren:

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

Autor: Markus C. (ljmarkus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ROFL

supi, danke, so funktioniert es.


mfg,
Markus

Autor: Matthias Lipinsky (lippy)
Datum:

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

Wobei man einen der beiden Casts weglassen kann.

Autor: eProfi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Detlev T. (detlevt)
Datum:

Bewertung
0 lesenswert
nicht 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.

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.