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
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.
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
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.
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?
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 ?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.