Das Open-Control-Projekt - Die Alternative zur C-Control-I


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 

 Demoprogramm: Rechnen mit einer Quadratischen Gleichung in 32-Bit Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 20.05.2022 15:54)
Dietmar nutzt:  Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi, Open-Mini Station


' ===========================================================================
' Demoprogramm: Rechnen mit einer Quadratischen Gleichung in 32-Bit
' In OCBASIC 1.12a_e1 f├╝r Open-Maxi von Dietmar Harlos am 12. Mai 2022
' ===========================================================================

' Es wird eine Quadratische Gleichung mittels 32-Bit-Festkommaarithmetik
' berechnet. Dabei werden die Softwareroutinen aus "Grundrechenarten in
' 32 Bit f├╝r Open-Macro und Open-Maxi" verwendet. Dieses Programm ist gut
' kommentiert, so da├č es keine Schwierigkeiten macht, eine ├Ąhnliche Rechnung
' in einem eigenen Programm umzusetzen. Es ist beschrieben, worauf man bei
' der Berechnung mittels 32-Bit-Festkommaarithmetik achten mu├č.

' Zum Rechnen unter Windows eignet sich gut das Computeralgebrasystem
' "MuPAD Light 2.5.3". Hier in unserem Forum gibt es folgenden Downloadlink:

' http://ccintern.dharlos.de/forum/lesen.php?eintrag=17192

' --- Definitionen ----------------------------------------------------------

INCLUDE "omax.def"               'Definitionen f├╝r 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 alw AS WORD[1] OF a  'LSW    'fuer den Zugriff in BASIC
DEFINE ahw AS WORD[2] OF a  'MSW

DEFINE b1 AS BYTE[1] OF b   'LSB    '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   'MSB

DEFINE blw AS WORD[1] OF b  'LSW    'fuer den Zugriff in BASIC
DEFINE bhw AS WORD[2] OF b  'MSW

DIM templ WORD                   'Zwischenspeicher
DIM temph WORD

DIM bitarray BYTE                'ein Bitarray
DIM debug    BIT[1] OF bitarray  'ist HIGH, wenn Debugging aktiv

DIM messung WORD                 'ein Me├čwert vom AD-Wandler
DIM ergebnis WORD                'das Ergebnis der Berechnung

DEFINE adinput   AD[1]           'Eingang des Analog-Digital-Wandlers

' --- Hauptprogramm ---------------------------------------------------------

PrintSpc=ON    'Bei PRINT dezimale Zahlen mit f├╝hrendem Leerzeichen ausgeben
End2Host=ON    'Bei Programmende (siehe END) gleich in den Host-Modus wechseln

' Titel:

PRINT
PRINT "Quadratische Gleichung"
PRINT "======================"

' Initialisierungen:

debug=ON 'OFF 'ON   'Zwischenschritte anzeigen

' Die AD-Ports liefern standardm├Ą├čig gerundete 8-Bit-Werte zwischen 0 und 255
' zur├╝ck, was den Spannungswerten 0 Volt bis 5 Volt entspricht. Mit folgendem
' Befehl wird auf gerundete 10 Bit umgeschaltet.

ADC1CFG=&b01001000  'AD-Wandler auf gerundete 10 Bit

' Hauptschleife des Programms:

WHILE NOT RXD

  messung=adinput
  messung=1000 '1023   'Beispiel

  ?
  ?"messung="messung

  IF debug THEN
    ?
    ?"Zwischenschritte:"
  END IF

  ' Ab hier die Formel "32000-1.34*messung+0.000125*messung^2" mittels 32-Bit-Festkommaarithmetik berechnen

  'messung^2

  'Der AD-Wandler liefert 10-Bit-Werte zur├╝ck. Sie liegen also im Wertebereich
  ' zwischen 0 und 2^10-1. Gehen also bis 1023. 1023^2 ist 1046529. Dieser Wert
  ' kann nicht in einer 16-Bit-Variable (Typ: WORD) gespeichert werden, denn er
  ' ist zu gro├č. Es w├╝rde ein ├ťberlauf auftreten.

  'Die L├Âsung ist 32-Bit-Arithmetik. Eine 32-Bit-Variable (Typ: LONG) kann
  ' Zahlen zwischen -2147483648 bis 2147483647 speichern. Demnach kann kein
  ' ├ťberlauf auftreten und es darf in 32-Bit gerechnet werden.

  'Die gr├Â├čte Variablenart, die die Open-Maxi in BASIC kennt, ist WORD. Deshalb
  ' bestehen Zugriffe auf LONG-Variablen aus zwei Befehlen: Dem unteren und
  ' oberen WORD der LONG-Variable.

  alw=messung
  ahw=0
  blw=messung
  bhw=0
  multiplizieren

  IF debug THEN
    ?"messung^2=";
    print32
    PRINT
  END IF

  '0.000125*messung^2
  '1/0.000125 = 8000

  'Die Multiplikation mit der Zahl 0.000125 kann einfacher durch eine Division
  ' mit dem Kehrwert 8000 durchgef├╝hrt werden.

  blw=8000
  bhw=0
  dividieren

  IF debug THEN
    ?"0.000125*messung^2=";
    print32
    PRINT
  END IF

  '0.000125*messung^2 zwischenspeichern

  'Das Zwischenergebnis brauchen wir unten noch, deshalb wird es in einer
  ' Variablen zwischengespeichert. Zu beachten ist, da├č die Open-Maxi nur mit
  ' WORD-Variablen arbeiten kann. Es sind deshalb zwei Befehle notwendig, um
  ' die LONG-Variable zu speichern.

  templ=alw
  temph=ahw

  '1.34*messung

  'Die Multiplikation mit 1.34 wird durch 134/100 ersetzt. Es wird also mit
  ' der Zahl 100 skaliert, die Multiplikation durchgef├╝hrt und zum Schlu├č
  ' durch 100 dividiert, um das Ergebnis zu erhalten.

  alw=134
  ahw=0
  blw=messung
  bhw=0
  multiplizieren

  IF debug THEN
    ?"134*messung=";
    print32
    PRINT
  END IF

  blw=100
  bhw=0
  dividieren

  IF debug THEN
    ?"1.34*messung=";
    print32
    PRINT
  END IF

  '32000-1.34*messung

  'Jetzt wird der Term "1.34*messung" von 32000 abgezogen.

  blw=alw
  bhw=ahw
  alw=32000
  ahw=0
  subtrahieren

  IF debug THEN
    ?"32000-1.34*messung=";
    print32
    PRINT
  END IF

  ' 32000-1.34*messung+0.000125*messung^2

  'Das Zwischenergebnis "0.000125*messung^2" wird zur├╝ckgeholt und hinzuaddiert.

  blw=templ   '0.000125*messung^2 zur├╝ckholen
  bhw=temph
  addieren

  IF debug THEN
    ?"32000-1.34*messung+0.000125*messung^2=";
    print32
    PRINT
    ?
  END IF

  'Das Ergebnis steht in der unteren WORD-H├Ąlfte von der LONG-Variablen "a".

  ergebnis=alw
  ?"ergebnis="ergebnis

  PAUSE 50

WEND

?:?"Programmende."
END            'Zur├╝ck in den Hostmodus. Neustart mit RETURN-Taste.

' --- INCLUDE-Dateien -------------------------------------------------------

INCLUDE "32BITASM.PRO"    'INCLUDE-Datei f├╝r 32-Bit-Arithmetik auf Open-Maxi
INCLUDE "OM_FW.PRO"       'INCLUDE-Datei f├╝r Firmwareroutinen

' --- Programmende ---------------------------------------------------------


Passender Link: Infosite zu den OM-Mikrocontrollern

Meine Homepage: http://ccintern.dharlos.de

 Antwort schreiben

Bisherige Antworten:

Demoprogramm: Rechnen mit einer Quadratischen Gleichung in 32-Bit II (von Dietmar - 20.05.2022 15:57)