Forum: Mikrocontroller und Digitale Elektronik RAM-Wert negativ, LByte HBYte als 2er-Komplement?


von daniel (Gast)


Lesenswert?

Moin Leute,

ich habe hier einen Sensor bei dem die Werte im RAm stehen.

Angeben ist die Bitzahl mit 0-15 und einem Value Range von 
-32768...32767

Mit I2C kann ich auf die entsprechende RAM-Adresse zugreifen und bekomme 
dann jeweils ein HighByte und ein LowByte.

Beispielsweise den Wert: LByte:7C HBYte:75

ist ja 757C=30067, wie bekomme ich raus ob das ein negativer Wert ist?

Wenn das MSB ne 1 ist? Bei diesem Wert wäre ja das höchste Bit, Bit15 =0 
also ist das in diesem Beispiel: +30067?

Sobald das Bit15 ne 1 ist müsste ich das 2er Komplement rückwärts 
anwenden um den negativen Wert zu bestimmen?

Grüße

von Karl H. (kbuchegg)


Lesenswert?

daniel schrieb:
> Moin Leute,
>
> ich habe hier einen Sensor bei dem die Werte im RAm stehen.
>
> Angeben ist die Bitzahl mit 0-15 und einem Value Range von
> -32768...32767
>
> Mit I2C kann ich auf die entsprechende RAM-Adresse zugreifen und bekomme
> dann jeweils ein HighByte und ein LowByte.
>
> Beispielsweise den Wert: LByte:7C HBYte:75


Wenn du die beiden Bytes hast und zu einem 16 Bit Wert zusammensetzt, 
dann machst du das alles mit unsigned Datentypen.
Aber: Das endgültige Ergebnis weist du dann ganz einfach einem int16_t 
zu und hast damit dann eine Variable, bei der die Bits dann richtig als 
vorzeichenbehaftete Zahl interpretiert werden.

Disclaimer: natürlich nur, wenn du vom Sensor bereits korrekte Bytes im 
Sinne eines 2-er Komplements bekommst. Aber davon gehe ich jetzt erst 
mal aus.

von daniel (Gast)


Lesenswert?

Hi vielen Dank für deine Antwort.

Karl Heinz Buchegger schrieb:

> Wenn du die beiden Bytes hast und zu einem 16 Bit Wert zusammensetzt,
> dann machst du das alles mit unsigned Datentypen.


das ist klar, (HighByte*256)+LowByte

> Aber: Das endgültige Ergebnis weist du dann ganz einfach einem int16_t
> zu und hast damit dann eine Variable, bei der die Bits dann richtig als
> vorzeichenbehaftete Zahl interpretiert werden.

das versteh ich nicht ganz, woher weiß ich dann ob es sich um eine 
negative bzw. positive Zahl handelt? An dem höchsten Bit (in meinem Fall 
Bit15), sprich durch einen Check des MSB, 0=+, 1=-?

------------------
Ich weiß leider nicht ob der Sensor die Bytes als 2er Komplement ins RAM 
packt, dazu schweigt sich das Datenblatt aus. Es ist halt nur angegeben 
das der Wert zwischen -32768 bis +32768 liegen kann.

Also kann ich davon ausgehen das es im Sinne eines 2er Komplements 
bereitgestellt wird?

Es könnte ja auch sein das man einfach beim MSB ne 0 für + ne 1 für - 
dazupackt alle anderen Bits ergeben die dezimal-Zahl.

Das letztere macht weniger Sinn?

Grüße

von Karl H. (kbuchegg)


Lesenswert?

daniel schrieb:
> Hi vielen Dank für deine Antwort.
>
> Karl Heinz Buchegger schrieb:
>
>> Wenn du die beiden Bytes hast und zu einem 16 Bit Wert zusammensetzt,
>> dann machst du das alles mit unsigned Datentypen.
>
>
> das ist klar, (HighByte*256)+LowByte
>
>> Aber: Das endgültige Ergebnis weist du dann ganz einfach einem int16_t
>> zu und hast damit dann eine Variable, bei der die Bits dann richtig als
>> vorzeichenbehaftete Zahl interpretiert werden.
>
> das versteh ich nicht ganz, woher weiß ich dann ob es sich um eine
> negative bzw. positive Zahl handelt? An dem höchsten Bit (in meinem Fall
> Bit15), sprich durch einen Check des MSB, 0=+, 1=-?

Im Prinzip: ja.

Aber: Was interessiert dich das?

  int16_t Wert = (int16_t)( (HighByte*256)+LowByte );

und du kannst mit Wert rechnen wie du lustig bist. Als int16_t hat der 
ein Vorzeichen

  if( Wert < 0 )
    printf( "Wert ist negativ" );


> Ich weiß leider nicht ob der Sensor die Bytes als 2er Komplement ins RAM
> packt, dazu schweigt sich das Datenblatt aus. Es ist halt nur angegeben
> das der Wert zwischen -32768 bis +32768 liegen kann.

Bei diesen Vorgaben ist anzunehmen, dass es sich um 2-er Komplement 
handelt. Wäre es was anderes, wäre das vermerkt.

> Es könnte ja auch sein das man einfach beim MSB ne 0 für + ne 1 für -
> dazupackt alle anderen Bits ergeben die dezimal-Zahl.
>
> Das letztere macht weniger Sinn?

Genau. Für den kleinen µC im Sensor macht das keinen Unterschied. Es 
erschwert aber die Verwendung des Sensors.


Einfach mal ausprobieren. Dann weißt du es genau.

von Dietrich L. (dietrichl)


Lesenswert?

daniel schrieb:
> Ich weiß leider nicht ob der Sensor die Bytes als 2er Komplement ins RAM
> packt, dazu schweigt sich das Datenblatt aus. Es ist halt nur angegeben
> das der Wert zwischen -32768 bis +32768 liegen kann.

Nur mal so am Rande: Welcher Sensor ist das denn?

von daniel (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:

>> Karl Heinz Buchegger schrieb:

> Aber: Was interessiert dich das?

Weil ich das Vorzeichen bei der Rechnung berücksichtigen muss.

Der uC weiß ja gar nicht das es das 2er komplement ist, er sieht ja eine 
ganz normale dezimalzahl ohne Vorzeichen oder irre ich mich?

T_comp=T_1-T_2

T_2 steht im Ram wenn ich T_1 und T_2 beispielsweise in Matlab 
vearbeitet wird , erkennt Matlab das die Zahl im 2er komplenet ?

von Andreas B. (andreas_b77)


Lesenswert?

daniel schrieb:
> Der uC weiß ja gar nicht das es das 2er komplement ist, er sieht ja eine
> ganz normale dezimalzahl ohne Vorzeichen oder irre ich mich?

Ja. Das sind erst mal gar keine Dezimalzahlen, sondern Binärzahlen. 
Zweitens rechnet auch jeder µC mit 2er Komplement (für 
vorzeichenbehaftete Zahlen). Also kann man die zusammengesetzte Zahl 
direkt verwenden.

von daniel (Gast)


Lesenswert?

Hi , der uC vielleicht.

Aber wie sieht das bei Matlab aus?

Ich sende jewiels High und LowByte an Matlab und füge dort beide 
zusammen.

Matlab spuckt mir aber keine negative Zahl aus.

Beispiel: -30000 in Hex: 8AD0 LowByte=D0 HighByte=8A

Matlab spuckt mir 35536dez aus

Bei Matlab muss mans wohl selber machen?

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.