![]() ![]() INFO - FAQ - CC2-Forum - CCPro-Forum |
|
' ============================================================================ ' ONTIMER-Funktion: Die BASIC-Interruptroutine jede Sekunde einmal starten ' In OCBASIC 1.12a_e1 für die Open-Maxi von Dietmar Harlos am 5. Oktober 2018 ' ============================================================================ ' Die BASIC-Interruptroutine startet normalerweise, wenn der Controller am ' IRQ-Pin eine negative Flanke detektiert. Aber in diesem Programm wird eine ' Assemblerroutine im Interrupt 50 mal pro Sekunde aufgerufen und setzt alle ' 50 Interrupts den Marker für den BASIC-Interrupt, wodurch die BASIC- ' Interruptroutine jede Sekunde einmal startet. ' Einen Code für die kleinen OM-Controller mit der gleichen Funktionalität ' befindet sich im ZIP-Archiv des OCBASIC-Compilers im Verzeichnis OM. ' --- Definitionen für das System -------------------------------------------- INCLUDE "omax.def" 'Definitionen für die Open-Maxi ' --- Definitionen des Anwenders --------------------------------------------- DIM a,b,c BYTE 'drei normale Variablen definieren ' --- Unsere eigene Assembler-Interruptroutine ------------------------------- ' Die folgende Assembler-Interruptroutine befindet sich im "20-ms-Interrupt" ' (genauer: "Timer/PWM-Module 1 - Channel 3 (TPM1CH3)") und wird auf der ' Open-Maxi alle 20 ms aufgerufen. ' Die folgende Subroutine 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. DEFINE mIrqReq &b00000010 'Maske zum Starten der BASIC-IRQ-Routine PROCEDURE iiar_TIM3 INLASM ! cbeqa #iTIM3,isiTIM3 'Falls kein Aufruf durch TIM3-Interrupt, ! jmp iiar_TIM3_ende+2 ' dann zur nächsten IIAR in der Kette. #isiTIM3 ! inc ,x 'in x steht die Adresse von FREERAM ! lda ,x ! cmp #50 ! blo isiTIM3_over ! clr ,x ! lda -3,x ! ora #mIrqReq ! sta -3,x #isiTIM3_over ' Durch Setzen des Carry-Flags (SEC) kann der User signalisieren, daß die ' Betriebssystemroutinen des Interrupts nachfolgend nicht aufgerufen werden, ' sondern der Interrupt unmittelbar beendet wird. Andernfalls ist das Flag ' mit dem Befehl CLC zu löschen. ! clc 'Betriebssystemfunktion soll aktiviert bleiben ! rts 'Rücksprung zum Betriebssystem END PROCEDURE #iiar_TIM3_ende 'hier hinter folgt die nächste IIAR '(sofern vorhanden) ' --- Das Hauptprogramm ------------------------------------------------------ #main ' Temporären Zwischenspeicher (FREERAM1) für die Assemblerroutine löschen FREERAM1=0 ' Wir hängen unsere eigene Assemblerroutine in den 20-ms-TIMER-Interrupt UIRTim3=ON ' Die Assemblerroutine im Interrupt wird nun 50 mal pro Sekunde aufgerufen ' und setzt nun alle 50 Interrupts den Marker für den BASIC-Interrupt, ' wodurch die BASIC-Interruptroutine jede Sekunde einmal startet. INTERRUPT irqrou 'Vereinbart die BASIC-Interruptroutine PrintSpc=ON 'SPACE vor einem dezimalen PRINT ausgeben ' Zur Demonstration nur ein einfaches Hauptprogramm. REPEAT PRINT HOUR;MINUTE;SECOND;TIMER FOR a=0 TO 24 PAUSE 1 'Ein PAUSE 25 würde den Start der BASIC-Interrupt- NEXT a 'routine um bis zu eine halbe Sekunde verzögern. UNTIL SECOND>=30 INTERRUPT OFF 'BASIC-Interruptroutine deaktivieren PRINT "Programmende." End2Host=ON 'Nach Programmende in den Host-Modus END 'Programmende, Neustart mit der Enter-Taste ' --- Subroutinen und Funktionen --------------------------------------------- ' Die BASIC-Interruptroutine. Sie startet normalerweise, wenn am IRQ-Pin eine ' negative Flanke detektiert wird. Beendet wird die Routine mit dem Befehl ' RETURN INTERRUPT. PROCEDURE irqrou PRINT "Hier ist die BASIC-Interrupt-Routine. TIMER ist";TIMER;"." RETURN INTERRUPT END PROCEDURE ' --- Ende des Programms ---------------------------------------------------- Passender Link: Bedienungsanleitung zur Open-Macro und Open-Maxi Meine Homepage: http://ccintern.dharlos.de |
Antwort schreiben |