Dezimal zu 2er Komplement

Gast #2062169
Lesenswert?

Hallo zusammen,

zu meiner Schande schaffe ich es nicht eine negative Dezimalzahl ins 2er 
Komplement umzurechnen.
Hier meine Umrechnungsfunktion:
1
uint8_t dec2comp(int8_t value)
2
{
3
    uint8_t x;
4
    if(value < 0)
5
    {
6
        x = ~value;
7
        x++;
8
    }
9
    else
10
        x = value;
11

12
    return x;
13
}

Ich benötige dies um einen MMA7455 Beschleunigungsensor zu kalibrieren.
Wenn die umzuwandelnden Werte positiv sind, funktioniert meine 
Kalibrierungsroutine. Falls sie negativ sind, klappt es nicht.

Daraus folgere ich dass ich korrekt in die Register des 
Beschleunigungssensors schreibe.

Hat jemand von euch eine Idee?
#2062198
Lesenswert?

Alex schrieb:
> zu meiner Schande schaffe ich es nicht eine negative Dezimalzahl ins 2er
> Komplement umzurechnen.

Ich glaube hier ist ein Denkfehler. Normalerweise sind negative Zahlen 
IMMER in 2er Komplement Binaer-Darstellung.

Du kannst also vermutlich einfach 'value' benutzen, ganz ohne 
"Umrechnung".

Was Deine Funktion macht ist, alle negativen Zahlen in positive 
umzuwandeln, d.h. das Vorzeichen "wegzuschmeissen" ("Betragsfunktion", 
engl. "ABS").

ZigZeg
Moderator (Firma: Titel) Persönliche Seite #2062231
Lesenswert?

Alex schrieb:
> zu meiner Schande schaffe ich es nicht eine negative Dezimalzahl ins 2er
> Komplement umzurechnen.
Du willst vermutlich einfach den Betrag der Beschleunigung?
Dann dürfte das hier Sinn machen:
1
   if (value<0) x = -value;
2
   else         x = value;

BTW:
Die Zahlendarstellung aus dem DB kommt von Verilog:
10 Bit Darstellung:
Signed byte data (2’s complement): 0g = 10’h000
8 Bit Darstellung:
Signed byte data (2’s complement): 0g = 8’h00

Breite_'_Basis_Wert ==>
10 Bits, Hex 000 = 10'h000
8 Bits, Hex 00   = 8'h00

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