Forum: Mikrocontroller und Digitale Elektronik [xmega] ultoa() funktioniert nach Bit-Shiften nicht richtig


von Holger M. (_holger)


Lesenswert?

Hallo Freunde!

Ich möchte aus 3 Byte einen 24bit Wert erzeugen, und diesen dann mit der 
ASF-funktion "ultoa()" für die Ausgabe auf einem LCD-Display in einen 
string umwandeln.

Grob umrissen ist das der code:
1
uint8_t buffer[8];
2
uint32_t result;
3
uint32_t string[10];
4
5
result = ((uint32_t)(buffer[0] << 16) & 0xFF0000)  // spi_buffer[0]=0xFE
6
    + ((uint32_t)(buffer[1] << 8) & 0x00FF00)  // spi_buffer[0]=0xDB
7
    + (uint32_t)(buffer[2] & 0x0000FF);      // spi_buffer[0]=0xA9
8
ultoa(result, &string, 16);
9
lcd_print_string(string,0,0,&twi_lcd_packet);    // Ausgabe: DBA9
10
11
ultoa(0xFEDBA9, &string, 16);
12
lcd_print_string(string,0,1,&twi_lcd_packet);    // Ausgabe: FEDBA9

Bitshifte ich mir "result" zurecht fehlt das high-byte in der Ausgabe.
Übergebe ich ultoa den Wert "0xFEDBA9" direkt wird er komplett 
ausgegeben.

Hat jemand eine Idee, was ich hier falsch mache?

Danke!

Holger.

von Peter II (Gast)


Lesenswert?

was steht denn in buffer[0] drin?

das  & 0xFF0000 ist nicht notwendig.

von Detlev T. (detlevt)


Lesenswert?

(buffer[0] << 16) ist gleich null, da Berechnungen in C lt. Standard als 
int durchgeführt werden - und der ist auf AVRs halt nur 16 Bit groß (im 
Gegensatz zum PC)

Also auf unsigned long casten.

von Thosch (Gast)


Lesenswert?

Holger M. schrieb:
> Hat jemand eine Idee, was ich hier falsch mache?
recht offensichtlich: Deine Typecasts passen nicht...

(buffer[0] << 16)
-> dieser Ausdruck liefert 0, da nur 16-bittig geschoben wird.

also typecasten, bevor Du schiebst:
(((uint32_t)buffer[0]) << 16)

Gruß,
Thosch

von Holger M. (_holger)


Lesenswert?

Thosch schrieb:
> also typecasten, bevor Du schiebst:
> (((uint32_t)buffer[0]) << 16)
>
> Gruß,
> Thosch

Ui, herzlichen Dank für die vielen raschen Antworten!

Typecasten bevor ich schiebe ist die Lösung.
Jetzt bekomm ich auch nach dem shiften alle drei bytes angezeigt :)

Dankeschön!!

Holger.

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.