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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.