Forum: Mikrocontroller und Digitale Elektronik AVR-Code ignoriert Operation


von Morn (Gast)


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!

von Peter II (Gast)


Lesenswert?

Morn schrieb:
> Was macht der AVR-GCC hier im Vergleich zum Visual Studio
> möglicherweise anders?

das auf deinem PC ein int 32bit hat auf dem Atmel aber nur 16bit.
1
state.newPos|= ((uint16_t)command.value)<<16;

von Morn (Gast)


Lesenswert?

newPos ist als "signed long" definiert (=32 Bit!?), sollte also passen.

command.value ist ein "unsigned short".

von Hans (Gast)


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;

von Morn (Gast)


Lesenswert?

Arrgh...ja klar...danke!!!!!

von Peter II (Gast)


Lesenswert?

Morn schrieb:
> newPos ist als "signed long" definiert (=32 Bit!?), sollte also passen.

das spielt keine rolle, die Daten sind schon weg bevor sie in er 
Variabel landen.

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.