Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Temperaturwert in Double umwandeln (https://www.delphipraxis.net/209816-temperaturwert-double-umwandeln.html)

OlliWW 26. Jan 2022 09:21

Delphi-Version: 5

Temperaturwert in Double umwandeln
 
Hallo,

Ich suche gerade einen einfachen Weg mit Delphi einen Temperaturwert, der über eine Schnittstelle kommt, in einen Double umzuwandeln.

Gesendet wird er in 2 Byte Werten, hier ein Beispiel:

LowerByte: $50
HigherByte: $05

Als Ergebnis müsste rauskommen: +5,3125°C.

Berechnet wird das im Zweikomplement:

Higherbyte:
bit7: sign (also Positiv oder Negativ)
bit6: 64 °C.
bit5: 32 °C.
bit4: 16 °C.
bit3: 8 °C.
bit2: 4 °C.
bit1: 2 °C.
bit0: 1 °C.

Für: $05 kommt 5 (Grad Celsius) raus

LowerByte:
bit7: 1/2 °C.
bit6: 1/4 °C.
bit5: 1/8 °C.
bit4: 1/16 °C.
bit3-0: keine Bewertung

Für $50 kommt 0,3125 raus

zusammen addiert: 5,3125

Um das Higherbyte umzuwandeln habe ich bereits einen kurzen Weg gefunden:
Delphi-Quellcode:
  iHigherByte: Integer;
  sHigherByte: ShortInt absolute iHigherByte;
Weise ich iHigherByte nun $50 zu, wird dies korrekt umgewandelt. Aber irgendwie tue ich mich mit der Nachkommastelle schwer. Ich kann natürlich einen Loop schreiben und das händisch auswerten und addieren.

Gibt es dazu einen kürzeren Weg?

Uwe Raabe 26. Jan 2022 09:44

AW: Temperaturwert in Double umwandeln
 
Delphi-Quellcode:
var
  data: Word;
  temp: Double;
begin
  data := $5005;
  temp := ShortInt(Lo(data)) + (Hi(data) shr 4)/16;
end;

OlliWW 26. Jan 2022 09:51

AW: Temperaturwert in Double umwandeln
 
Wahnsinn, danke :)
Da habe ich gestern eine lange Zeit drüber nachgedacht.

OlliWW 26. Jan 2022 10:48

AW: Temperaturwert in Double umwandeln
 
So jetzt habe ich noch eine weitere Schnittstelle, da sind die Temperaturwerte wie folgt definiert:

LOW: Temperature in 0.1°C resolution int16_t Lower Byte
HIGH: Temperature HB Temperature in 0.1°C resolution int16_t Higher Byte

In meinem Beispiel hab ich:
LOW: $27
HIGH: $FF

Es sollte -12,9 Grad rauskommen, da funktioniert der oben genannte Code aber nicht.

(Und ja: Ich frage mich warum im Jahr 2022 noch Werte so kompliziert übermitteln muss :wall:)

Uwe Raabe 26. Jan 2022 12:00

AW: Temperaturwert in Double umwandeln
 
Zitat:

Zitat von OlliWW (Beitrag 1501205)
LOW: Temperature in 0.1°C resolution int16_t Lower Byte
HIGH: Temperature HB Temperature in 0.1°C resolution int16_t Higher Byte

In meinem Beispiel hab ich:
LOW: $27
HIGH: $FF

Es sollte -12,9 Grad rauskommen

Also nach der Beschreibung müssten das -21,7 Grad ergeben.
Delphi-Quellcode:
  data := $FF27;
  temp := Int16(data)/10;

himitsu 26. Jan 2022 12:39

AW: Temperaturwert in Double umwandeln
 
Delphi-Quellcode:
iHigherByte: Integer
falsch
denn das sind 4 und nicht 2 Byte,

also wenn, dann SmallInt


Außerdem ist "iHigherByte" ebenfalls falsch, denn es ist der komplette Wert und nicht nur das eine Byte.

DeddyH 26. Jan 2022 13:57

AW: Temperaturwert in Double umwandeln
 
Du hast aber schon gemerkt, dass es bereits Antworten gab und der gezeigte Ausgangscode somit gar nicht mehr aktuell ist?

himitsu 26. Jan 2022 15:26

AW: Temperaturwert in Double umwandeln
 
Heißt aber nicht, dass man die restlichen Fehler nicht dennoch nennen darf ... nicht dass noch wer Anders sich sowas abguckt und damit er andere Stellen nicht auch weiterhin so baut.

OlliWW 26. Jan 2022 19:03

AW: Temperaturwert in Double umwandeln
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1501210)
Zitat:

Zitat von OlliWW (Beitrag 1501205)
LOW: Temperature in 0.1°C resolution int16_t Lower Byte
HIGH: Temperature HB Temperature in 0.1°C resolution int16_t Higher Byte

In meinem Beispiel hab ich:
LOW: $27
HIGH: $FF

Es sollte -12,9 Grad rauskommen

Also nach der Beschreibung müssten das -21,7 Grad ergeben.
Delphi-Quellcode:
  data := $FF27;
  temp := Int16(data)/10;

Du hast vollkommen recht. Vor lauter Hexzahlen habe ich den falschen Wert genommen.
Es ist nicht FF27 sondern FF7F. Sorry.

Vielen Dank für die Hilfe das hat mir viele Stunden Kopfzerbrechen bereitet. :thumb:

freimatz 27. Jan 2022 07:17

AW: Temperaturwert in Double umwandeln
 
Zitat:

Zitat von OlliWW (Beitrag 1501205)
(Und ja: Ich frage mich warum im Jahr 2022 noch Werte so kompliziert übermitteln muss :wall:)

Vielleicht weil
a) auf der anderen Seite keine CPU mit GHerz werkelt sondern ein kleiner Microcontroller oder noch was kleineres und die Werte der A/D-Wandler halt so liefert? Und ...
b) ... der Entwickler sich dachte soll sich doch der drum kümmern der bequem entwickeln und debuggen kann?
c) Das Ding in Geräten zum Einsatz kommt wo Stromverbrauch wesentlich ist?
d) Auf der anderen Seite das so eine alter S... wie ich gemacht hat, der gar nicht verstehen kann, was da so schwierig sein kann?
...
Nur einige Erklärungsversuche. :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:14 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz