Hallo, ich habe gerade ein Projekt, bei dem ich KNX-Daten mit einem µC auswerten muß. Die Temperatur wird in 16-Bit Gleitkomma übertragen (DPT09), wobei die Aufteilung der Bits bei KNX etwas "besonders" ist: Bit 0...10: Mantisse (11 Bit) Bit 11..14: Exponent (4 Bit) Bit 15: Vorzeichen (1 Bit) Die KNX-Berechnung des Temperaturwertes ist wie folgt: Mantisse * 0,01 * 2^Exponent Positive Werte sind mir klar, aber wie ist das mit negativen Zahlen? Ich hätte erwartet, daß der einzige Unterschied das 15. Byte ist, scheint aber nicht so zu sein. Hier z.B. folgende KNX-Werte: -1°C: KNX-Wert 0x899C -2°C: KNX-Wert 0x8738 -3°C: KNX-Wert 0x86D4 -10°C: KNX-Wert 0x8418 -20°C: KNX-Wert 0x8030 -30°C: KNX-Wert 0x8A24 Wie komme ich vom KNX-Wert auf die entsprechende negative Temperatur? Grüße Holger
Holger schrieb: > hätte erwartet, daß der einzige Unterschied das 15. Byte ist, scheint > aber nicht so zu sein. Wiso? > Wie komme ich vom KNX-Wert auf die entsprechende negative Temperatur? Hast du's mal mit rechnen versucht? Mal die Bits auf, separier sie nach V,E,M. und rechne aus.
:
Bearbeitet durch User
Hallo Max M. mache ich einen Fehler? Hier ein Beispiel: Beispiel -10°C: 0x8418 = 0b1000 0100 0001 1000 Vorzeichen: 1 (Minus) Exponent: 0b0000 Mantisse: 0b100 0001 1000 ==> 524 (dezimal) Mantisse * 0,01 * 2^Exponent 524 * 0,01 * 2^0 = 5,24 ==> 5,24 ist nicht 10...
Habe was gefunden (siehe Anhang). Das mit " two’s complement notation" (zweierkomplement) bringt mich auch nicht wirklich weiter. Irgend wie stehe ich auf dem Schlauch...
Holger schrieb: > Das mit " two’s complement notation" > (zweierkomplement) bringt mich auch nicht wirklich weiter. -2^11+0x418 * 2^0 -> -1000 Klingt doch sinnvoll. -2^11+0x224 * 2^1 -> -3000. Passt auch bei den anderen.
:
Bearbeitet durch User
Holger schrieb: > Beispiel -10°C: > 0x8418 = 0b1000 0100 0001 1000 > Vorzeichen: 1 (Minus) > Exponent: 0b0000 > Mantisse: 0b100 0001 1000 ==> 524 (dezimal) > > Mantisse * 0,01 * 2^Exponent > 524 * 0,01 * 2^0 = 5,24
1 | Die Mantisse ist dann falsch. (2er Komplement) |
2 | |
3 | 0b1000 0100 0001 1000 |
4 | |
5 | Exponent-Bits löschen: |
6 | |
7 | 0b1xxx x10000011000 = 0b1100 0001 1000 (2er Komplement-Darstellung der Mantisse) |
8 | |
9 | Umwandeln (eine 1 dazu addieren und alles negieren) liefert: |
10 | Mantisse=-1000 |
11 | |
12 | |
13 | -1000*0,01*2^0=-10 |
hier kannst du von 2er Komplement nach dezimal umwandeln: https://www.exploringbinary.com/twos-complement-converter/ (hoffentlich rechnet es korrekt ;-)
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.