Forum: Haus & Smart Home KNX: 16-Bit Float: negative Zahl


von Holger (Gast)


Lesenswert?

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

von Max M. (jens2001)


Lesenswert?

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
von Holger (Gast)


Lesenswert?

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...

von Holger (Gast)


Angehängte Dateien:

Lesenswert?

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...

von Walter T. (nicolas)


Lesenswert?

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
von zitter_ned_aso (Gast)


Lesenswert?

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

von Walter T. (nicolas)


Lesenswert?

Mist. Klammern vergessen bei dem ganzen Herumgeeditiere.

von zitter_ned_aso (Gast)


Lesenswert?

hier kannst du von 2er Komplement nach dezimal umwandeln:

https://www.exploringbinary.com/twos-complement-converter/

(hoffentlich rechnet es korrekt ;-)

von Holger (Gast)


Lesenswert?

jetzt ist alles klar. Vielen Dank!

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.