![]() ![]() INFO - FAQ - CC2-Forum - CCPro-Forum |
|
' =========================================================================== ' Demoprogramm: Assembler-Interruptroutine im BEEP-Interrupt ' In OCBASIC 1.12a_e1 für Open-Maxi von Dietmar Harlos am 07. 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. ' --- Definitionen ---------------------------------------------------------- INCLUDE "omax.def" 'Definitionen für die Open-Maxi DIM zaehler WORD 'Zähler ' --- 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 ! aix #1 ! sthx zaehler ! 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;zaehler ' PAUSE 10 WEND ?:?"Programmende." END 'Zurück in den Hostmodus. Neustart mit RETURN-Taste. ' --- Programmende --------------------------------------------------------- Passender Link: Infosite zu den OM-Mikrocontrollern Meine Homepage: http://ccintern.dharlos.de |
Antwort schreiben |