
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
||
|
' =========================================================================== ' Demoprogramm: Assembler-Interruptroutine im BEEP-Interrupt in 32 Bit ' In OCBASIC 1.12a_e1 für Open-Maxi von Dietmar Harlos am 08. Juni 2022 ' =========================================================================== ' Manchmal möchte man auf der Open-Maxi eine Assemblerroutine in zeitlichen ' Abständen aufrufen lassen. Wenn dafür kein anderer Interrupt mehr frei ist, ' kann man den BEEP-Interrupt für diese Aufgabe verwenden. Der zeitliche ' Abstand ist dann mit dem BASIC-Befehl "BEEP" konfigurierbar. Mittels ' "BEEP wert,0,0" kann die Aufrufhäufigkeit eingestellt werden; wobei ' wert=625000/Aufrufe_pro_Sekunde ist. ' In diesem Programm wurde der Zähler auf 32 Bit erweitert. Dabei werden die ' Softwareroutinen aus "Grundrechenarten in 32 Bit für Open-Macro und ' Open-Maxi" verwendet. ' --- 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 zaehler LONG 'Zähler DIM zlw WORD[1] OF zaehler 'LSW DIM zhw WORD[2] OF zaehler 'MSW ' --- Unsere eigene Assembler-Interruptroutine ------------------------------ ' Die folgende Assembler-Interruptroutine befindet sich im "BEEP-Interrupt" ' und wird gestartet, wenn eine halbe Periode des Signals vorüber ist. ' Sobald der Interrupt auftritt, wird die Assemblerroutine aufgerufen, wobei ' im Akkumulator der Wert #iTIM2 und im X-Register die Adresse von FREERAM ' übergeben wird. Beendet werden muß die Routine mit RTS. Falls mit ' gelöschtem Carry-Bit ("CLC") beendet wird, führt das Betriebssystem ' die Systemfunktionen zum Interrupt weiter aus. Wird dagegen mit gesetztem ' Carry-Bit ("SEC", bzw. "STC") beendet, ignoriert das System den Interrupt. ' Die folgende Subroutine muß am Anfang des Programms, vor dem ersten Befehl ' stehen und sollte sinnvollerweise in einer INCLUDE-Datei untergebracht werden. ' Das Schlüsselwort INLASM kennzeichnet die folgende PROCEDURE als ' Assemblerroutine (IAR). Dadurch, und daß sie unmittelbar am Anfang ' des Programms steht, wird sie zu einer IIAR, also zu einer Assembler- ' Interruptroutine, die bei einem aktivierten User-Interrupt gestartet wird. ' Der OCBASIC-Compiler setzt automatisch ein "GOTO main" vor diese Routine. PROCEDURE UIRTim2_iiar INLASM ! cbeqa #iTIM2,tim2_is 'Unterscheidung der Interruptquellen ! jmp UIRTim2_iiar_next+2 'zur nächsten IIAR in der Kette springen #tim2_is ! ldhx zaehler+2 ! aix #1 ! sthx zaehler+2 ! bne tim2_keinueberlauf ! ldhx zaehler ! aix #1 ! sthx zaehler #tim2_keinueberlauf ! clc 'Carry-Flag löschen (Betriebssystem verarbeitet den Interrupt) ! rts 'Rücksprung zum Betriebssystem END PROCEDURE #UIRTim2_iiar_next 'hier hinter folgt die nächste IIAR '(sofern vorhanden) ' --- Hauptprogramm --------------------------------------------------------- #main 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 "BEEP-Interrupt" PRINT "==============" ' Initialisierungen: UIRTim2=ON 'User-Assemblerroutine für TIM2 (BEEP-Interrupt) aktivieren BEEP 6,0,0 ' wert = 625000 / f ' Hauptschleife des Programms: WHILE TRUE ?timer;" "; 'disable 'eigentlich müssen die Interrupts deaktiviert werden alw=zlw ahw=zhw 'enable print32 ? ' PAUSE 10 WEND ?:?"Programmende." END 'Zurück in den Hostmodus. Neustart mit RETURN-Taste. ' --- Subroutinen und Funktionen -------------------------------------------- PROC disable INLASM ! sei ' die Interrupts deaktivieren ! rts END PROC PROC enable INLASM ! cli ' die Interrupts wieder aktivieren ! rts END PROC ' --- 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 |