Forum: Mikrocontroller und Digitale Elektronik Bytes schieben Atmega644P


von MosKiller (Gast)


Lesenswert?

Hallo in die Runde,

ich habe ein großes Problem, ich habe 3 Bytes mit Daten.
Diese 3 Bytes sind 3*8 24 Bit eines 32 Bit Datenworts, die Aufnahme 
mache ich mit einem Byte-Array anstatt mit einer 32 Bit Variable da ich 
so leichter die Daten vorverarbeiten kann.


Jetzt möchte ich die Daten wieder in 24 Bit schieben um ein Word zu 
haben.



dmsa->LenghtMeasured = ((dmsa->readData[3] << 16) | (dmsa->readData[4] 
<< 8) | dmsa->readData[5]);

So sieht das ganze dann aus.
Aber das funktioniert wohl nicht, denn wenn ich das ausgeben möchte, 
habe ich für Bits > 15 immer 1. Warum?!


usart_ltoa((uint8_t)(dmsa->LenghtMeasured >> 16));
      usart_putc(',');
      usart_ltoa((uint8_t)(dmsa->LenghtMeasured >> 8));
      usart_putc(',');
      usart_ltoa((uint8_t)dmsa->LenghtMeasured);
      usart_putc('\n');

von Sebastian (Gast)


Lesenswert?

Weil ein int auf dem AVR nur 16 bit hat, und die Zwischenergebnisse int 
sind, wenn du nicht explizit auf was größeres castest.

von holger (Gast)


Lesenswert?

Was für ein Datentyp ist dmsa->LenghtMeasure?

dmsa->LenghtMeasured = (((uint32_t)dmsa->readData[3] << 16) | 
((uint32_t)dmsa->readData[4]
<< 8) | dmsa->readData[5]);

Die Länge ist ja wohl unsigned. Warum also nicht usart_ultoa()?

von MosKiller (Gast)


Lesenswert?

Danke für die Antworten.
LengthMeasure ist uint32_t


dmsa->LenghtMeasured = (((uint32_t)dmsa->readData[3] << 16) | 
((uint32_t)dmsa->readData[4] << 8) | dmsa->readData[5]);


Hiermit geht es schon. Danke. Dummer Fehler.
Ich hatte es vorher bevor ich hier gefragt hatte so:

dmsa->LenghtMeasured = ((uint32_t)(dmsa->readData[3] << 16) | 
(uint32_t)(dmsa->readData[4] << 8) | dmsa->readData[5]);


Das hatte aber nicht geklappt.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

inline_baustelle {
  bulldozer->bits
}

SCNR

von MosKiller (Gast)


Lesenswert?

Ben B. schrieb:
> inline_baustelle {
>   bulldozer->bits
> }
>
> SCNR

Was ist SCNR?
Was meinst du mit dem Beispiel?
Ein Bit-Array oder Bitfeld will ich nicht anlegen worauf ich zugreifen 
kann.

von Sebastian Rietig (Gast)


Lesenswert?

SCNR als Assembler-Befehl wäre lustig.
Heißt aber nur "Sorry, could not resist"

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

> SCNR als Assembler-Befehl wäre lustig.
Das wäre dann HCF.

> Heißt aber nur "Sorry, could not resist"
Yep, dummer Scherz, der mir gerade in den Sinn kam und wo ich's nicht 
lassen konnte, andere daran teilhaben zu lassen bzw. das Forum mal ein 
wenig zu erheitern... :)

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.