
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
||
|
> \' --------------------------------------------------------------------------- > \' PT1000-Meßmodul: Temperaturwert in °C mit Nachkommastellen umwandeln > \' mittels \"Grundrechenarten in 32 Bit\" auf allen OM-Controllern > \' von Dietmar Harlos am 24. November 2017 > \' --------------------------------------------------------------------------- > > \'INCLUDE \"omac.def\" \'Definitionen fuer die Open-Macro > INCLUDE \"omax.def\" \'Definitionen fuer die Open-Maxi > > \' --------------------------------------------------------------------------- > > DEFINE a AS LONG \'Erster 32-Bit-Akkumulator (1. Operand & Rechenergebnis) > DEFINE b AS LONG \'Zweiter 32-Bit-Akkumulator (2. Operand) > DEFINE c AS LONG \'Dritter 32-Bit-Akkumulator (temp. fuer DIV und PRINT32) > > DEFINE a1 AS BYTE[1] OF a \'LSB \'fuer den Zugriff in BASIC > DEFINE a2 AS BYTE[2] OF a > DEFINE a3 AS BYTE[3] OF a > DEFINE a4 AS BYTE[4] OF a \'MSB > > DEFINE b1 AS BYTE[1] OF b \'fuer den Zugriff in BASIC > DEFINE b2 AS BYTE[2] OF b > DEFINE b3 AS BYTE[3] OF b > DEFINE b4 AS BYTE[4] OF b > > DEFINE t AS LONG \'Zwischenspeicher > DEFINE t1 AS BYTE[1] OF t > DEFINE t2 AS BYTE[2] OF t > DEFINE t3 AS BYTE[3] OF t > DEFINE t4 AS BYTE[4] OF t > > DIM stellen BYTE \'Zähler für dezimale Stellen > > \' --------------------------------------------------------------------------- > > \' Demo: Das Meßmodul liefert Werte zwischen 12000 und 55000, was einer > \' Temperatur von -68.5°C bis +603.375°C entspricht. Die Rechenvorschrift > \' dafür lautet: Wert / 64 - 256. > > \' 17772=$0000456C -> 21.6875 > > a4=&h00 > a3=&h00 > a2=&h45 > a1=&h6C > > \' 55000=$0000D6D8 -> 603.375 > > \' a4=&h00 > \' a3=&h00 > \' a2=&hd6 > \' a1=&hd8 > > \' 12000=$00002EE0 -> -68.5 > > \' a4=&h00 > \' a3=&h00 > \' a2=&h2e > \' a1=&he0 > > \' Geeignet (mit dem Faktor 32768) skalieren: > > \' 2147483647/55000=39045.15722, also 32768 > > b4=&h00 > b3=&h00 > b2=&h80 > b1=&h00 > > multiplizieren > > \' Durch 64 rechnen: > > \' /64 > > b4=&h00 > b3=&h00 > b2=&h00 > b1=64 > > dividieren > > \' Minus 256, dabei Skalierung beachten: > > \' 256*32768=8388608=$00800000 > > b4=&h00 > b3=&h80 > b2=&h00 > b1=&h00 > > subtrahieren > > \' Negatives Ergebnis behandeln: > > IF a4 AND &h80 THEN > SYS negate_a > PUT ASC(\"-\") > END IF > > \' A in T retten: > > t1=a1 > t2=a2 > t3=a3 > t4=a4 > > \' Vorkommaanteil ausgeben, dabei Skalierung beachten: > > \' 710656/32768=21.6875 > > b4=&h00 > b3=&h00 > b2=&h80 > b1=&h00 > > dividieren > > print32 > PUT ASC(\".\") > > \' A aus T zurückholen: > > a1=t1 > a2=t2 > a3=t3 > a4=t4 > > \' Auf Nachkommaanteil reduzieren, dabei Skalierung beachten: > > b4=&h00 > b3=&h00 > b2=&h80 > b1=&h00 > > modulo > > \' Nachkommaanteil ausgeben: > > FOR stellen=1 TO 4 > > \' *10 > > b4=&h00 > b3=&h00 > b2=&h00 > b1=10 > > multiplizieren > > t1=a1 > t2=a2 > t3=a3 > t4=a4 > > b4=&h00 > b3=&h00 > b2=&h80 > b1=&h00 > > dividieren > > print32 > > a1=t1 > a2=t2 > a3=t3 > a4=t4 > > \' MOD 32768 > > b4=&h00 > b3=&h00 > b2=&h80 > b1=&h00 > > modulo > > NEXT stellen > > PRINT \"°C\" > > \' Programmende > > End2Host=ON > END > > \' --------------------------------------------------------------------------- > > INCLUDE \"32BITASM.PRO\" \'INCLUDE-Datei für 32-Bit-Arithmetik > > \' --------------------------------------------------------------------------- > > INCLUDE \"OM_FW.PRO\" \'INCLUDE-Datei für Firmwareroutinen > > \' --------------------------------------------------------------------------- > Hallo, das Programm verarbeit Werte groesser als 32768 und liefert genaue Ergebnisse hinter dem Komma. Das hat Diettmar gut gelöst. Nur habe ich ein Problem: in OC-Basic kann ich mit Zahlen groesser als 32768 nicht rechnen. Meine Frage: Wie kann ich einen Dezimalwert beispielsweise 34567 anders als manuell in die Bytes a1, a2, a3, a4 übertragen? Freundliche Grüße Norbert |
| Antwort schreiben |