24 bit signed in einer 32bit variablen?

Gast #3076104
Lesenswert?

oh man, da hab ich mir echt nichts einfaches Ausgesucht.

Ich lese per SPI 1 byte weise 32 bit aus.

jedoch ist das eine 24 Bit variable mit Bit 23 als sign Bit

Hinzu kommt das mir nicht ganz klar ist wo Microchip XC18 das sign bit 
haben will da gab es doch auch eine Besonderheit.

Mal ein Beispiel:

Wenn ich hier also -8 als Zahl darstellen will
1
0000 XXXX S0000000000000000001000
2
(X = egal, S = Sign Bit)
3
Bit 23 = 1 bedeutet dann wohl negative Zahl.
4
0000 XXXX 10000000000000000001000

Nur wie kann ich diese Zahl dann verwenden z.b. in einer 32 Bit signed 
variable?
Einfach ein left shift? wird nicht gehen da ziehe ich ja die hintere 1 
(entsporicht 8) auf eine ganz andere Stelle.
Angehängte Dateien:
Gast #3076170
Lesenswert?

>Ich checks nicht.

Viele andere auch nicht. Macht es euch doch nicht so schwer.
Betrachte erstmal jedes Byte was per SPI übertragen wird als
unsigned. SPI kennt kein Vorzeichen. Dann schiebt man den
ganzen Kram unsigned an die richtigen Stellen:

uint32_t temp =  ((uint32_t)MSB << 16) + ((uint32_t)MLSB << 8) + LSB;

So, jetzt stehen die Bytes an der richtigen Stelle in temp.
Dann musst du abfragen ob die Zahl negativ ist. Das Vorzeichen
steht in MSB D7. Wenn 1 dann musst du die oberen 8 Bits von temp
alle auf 1 setzen. Wenn Null machst du gar nichts.

if(MSB & 0x80) temp |= 0xFF000000;

Jetzt noch einen beherzten cast auf signed:

int32_t temp2 = (int32_t)temp;

Fertig.


Oder ein union nehmen und darin rumpfuschen.
#3076197
Lesenswert?

simon schrieb:
> Mal ein Beispiel:
>
> Wenn ich hier also -8 als Zahl darstellen will
1
0000 XXXX S0000000000000000001000
2
 (X = egal, S = Sign Bit)
3
 Bit 23 = 1 bedeutet dann wohl negative Zahl.
4
0000 XXXX 10000000000000000001000

Martin B. schrieb:
> Setze einfach die höchsten 8 Bit ([31:24]) gleich Bit 23 (also dem MSB
> von [23:0]).
>
> Dank Zweierkomplement klappt das :)

Das ist aber kein Zweierkomplement im Beispiel.
Gast #3076317
Lesenswert?

> Der XC8 beherrscht auch 24 Bit Variablen, schau mal nach, ob das deiner
> auch kann.

Nicht alle, also schon beim wechsel auf XC32 gibts dann Probleme.


Also dadurch das dieser IC verschiedene Register hat macht es nicht 
einfach eine einzige funktion zu schreiben die damit klar kommt.

es gibt 32, 24(wird als 32 uebertragen), 16 , 8

Und jedesmal natürlich signed und unsigned.

Da bleibt einem doch nur für jeden einzelnen dieser fälle was zu 
schreiben.
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren