Forum: Mikrocontroller und Digitale Elektronik Dezimal zu 2er Komplement


von Alex (Gast)


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?

von Seltsam (Gast)


Lesenswert?

> int8_t value
  ^^^^^^

Für value < 0 ist ist das Bitmuster bereits ein Zweierkomplement.
https://secure.wikimedia.org/wikipedia/de/wiki/Zweierkomplement

Und hier?
Beitrag "2er Komplement beim MMA7455 wie bilden?"

von Kai S. (zigzeg)


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

von Alex (Gast)


Lesenswert?

Ich verstehe es so dass für positive Werte da Bitmuster bereits ein 2er 
Komplement ist

von Alex (Gast)


Lesenswert?

Leider klappt das auch nicht

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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

von Alex (Gast)


Lesenswert?

Hallo,

die Werte der Beschleunigung berechne ich korrekt.
Hier geht es um die Kalibrierung, dh ich muss 2er Komplement Zahlen in 
die Offset Register des Sensors schreiben

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Alex schrieb:
> ich muss 2er Komplement Zahlen in
> die Offset Register des Sensors schreiben
Jede normale vorzeichenbehaftete Binärzahl wird heute üblicherweise im 
Zweierkomplement dargestellt. Du mußt vermutlich ganz einfach gar 
nichts machen...

Oder sag doch mal die Stelle im DB, die dir solches Kopfzerbrechen 
macht.

von Alex (Gast)


Angehängte Dateien:

Lesenswert?

Ab S.14 wird die Kalibrierung erklärt
Wenn ich gar keine Umwandlungen mache, klappts auch nicht

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.