Der Nachfolger des WDR-Computerclub mit Wolfgang Back und Wolfgang Rudolph - ...und immer ein Bit übrigbehalten!


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Dezi zu Hex Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Norbert - 25.11.2017 19:03)
 Als Antwort auf DEMO: Temperaturwert in °C mit Nachkommastellen von Dietmar - 25.11.2017 0:43
Norbert nutzt:  Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi
> \' ---------------------------------------------------------------------------
> \' 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

Bisherige Antworten:

Re: Dezi zu Hex (von Dietmar - 25.11.2017 20:02)
    Re: Dezi zu Hex (von Norbert - 26.11.2017 1:41)
        Re: Dezi zu Hex (von Dietmar - 26.11.2017 1:51)
            Re: Dezi zu Hex (von Norbert - 26.11.2017 2:28)
    Vereinfachung bei Open-Macro und Open-Maxi (von Dietmar - 26.11.2017 1:40)
        Re: Vereinfachung bei Open-Macro und Open-Maxi (von Norbert - 26.11.2017 11:37)
            IEEEFP.BAS(158): Adressierungsart nicht erlaubt (von Dietmar - 26.11.2017 16:52)
                Re: IEEEFP.BAS(158): Adressierungsart nicht erlaubt (von Norbert - 26.11.2017 18:58)
                    Zweierkomplement (von Dietmar - 26.11.2017 20:33)