
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
||
![]() ' =========================================================================== ' 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 "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 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 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 END IF blw=100 bhw=0 dividieren IF debug THEN ?"1.34*messung="; print32 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 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 ? 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 |