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');
Weil ein int auf dem AVR nur 16 bit hat, und die Zwischenergebnisse int sind, wenn du nicht explizit auf was größeres castest.
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()?
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.
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.
SCNR als Assembler-Befehl wäre lustig. Heißt aber nur "Sorry, could not resist"
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.