AVR-Code ignoriert Operation

Gast #4239314
Lesenswert?
• ▲
▼
Hi,

ich habe hier mit meinem AVR-GCC-generierten Code ein paar seltsame 
Probleme. Das lustige daran: der gleiche Code läuft in einer Simulation 
unter Visual Studio und da klappt alles problemlos.

Ich übertrage Daten zu meinem AVR immer 3-Byte-weise, 1 Byte Kommando 
der Rest Daten. Um einen 32-Bit-Wert zu übertragen sind also zwei 
Aufrufe notwendig, in denen jeweils die unteren bzw. die oberen 16 Bit 
gesendet werden:
1
signed long    newPos;
2

3
// erste Übertragung, untere 16 Bit
4
state.newPos=command.value;
5
...
6
// zweite Übertragung, obere 16 Bit
7
state.newPos|=command.value<<16;

Mein Problem: die Daten der zweiten Übertragung werden nicht verwendet! 
in state.newPos stehen anschließend nur die unteren 16 Bit. Was läuft da 
falsch? Was macht der AVR-GCC hier im Vergleich zum Visual Studio 
möglicherweise anders?

"command.value" ist dabei ein "unsigned short".

Danke!
Gast #4239328
Lesenswert?
• ▲
▼
Die Berechnung wird als unsigned int durchgeführt, der auf dem AVR nur 
16 Bit breit ist. Wenn Du die 16 Bit nach links schiebst, fallen sie 
alle raus und es bleiben nur noch Nullen.

Du musst die Berechnung also in 32 Bit durchführen:
1
state.newPos |= ((uint32_t) command.value) << 16;

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.