INFO - FAQ - CC2-Forum - CCPro-Forum |
|
' =========================================================================== ' Demoprogramm: "TPM1 Channel 0"-Interrupt (TPM1CH0) nutzen ' In OCBASIC 1.12a_e1 fĂŒr Open-Maxi von Dietmar Harlos am 11. Juni 2022 ' =========================================================================== ' In diesem Beispielprogramm wird demonstriert, wie eine Assemblerinterrupt- ' routine in den "TPM1 Channel 0"-Interrupt eingebunden werden kann. Die ' WORD-Variable "intervall" gibt vor, nach welcher Zeit die Interruptroutine ' gestartet werden soll. Der Timer TPM1 lĂ€uft standardmĂ€Ăig mit einer ' Frequenz von BUSCLK/32 = 625 kHz. Deshalb wird der Interrupt nach der Zeit ' "intervall/(20e6/32)" gestartet. Die Timer-Register haben eine Breite von ' 16 Bit. Deshalb ist im hier vorliegenden Fall die maximale Zeitverzögerung, ' nach der der Interrupt auftreten kann, auf "65536/(20e6/32)" gleich ' 0.1048576 Sekunden begrenzt. ' --- Definitionen ---------------------------------------------------------- INCLUDE "omax.def" 'Definitionen fĂŒr die Open-Maxi DIM zaehler WORD 'ZĂ€hler DIM intervall WORD 'Aufruf-Zeitintervall festlegen ' --- Unsere eigene Assembler-Interruptroutine ------------------------------ ' Die folgende Assembler-Interruptroutine befindet sich im "TPM1 Channel 0"- ' Interrupt und wird gestartet, wenn ein Intervall vorĂŒber ist. ' Sobald der Interrupt auftritt, wird die Assemblerroutine aufgerufen, wobei ' im Akkumulator der Wert #iTIM0 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 zusammen mit den anderen Subroutinen bis inklusive ' UIRTim0_iiar_next 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 UIRTim0_iiar INLASM ! cbeqa #iTIM0,tim0_is 'Unterscheidung der Interruptquellen ! jmp UIRTim0_iiar_next+2 'zur nĂ€chsten IIAR in der Kette springen #tim0_is ! ldhx zaehler 'Debugging-ZĂ€hler inkrementieren ! aix #1 ! sthx zaehler ! clc 'Carry-Flag löschen (Betriebssystem verarbeitet den Interrupt) ! rts 'RĂŒcksprung zum Betriebssystem END PROCEDURE ' Der TPM1C0 ist standardmĂ€Ăig deaktiviert. Hier wird er als "Output Compare - ' Software compare only" aktiviert. PROCEDURE initTPM1C0 INLASM ! sti ! mov #%01010000,TPM1C0SC 'Output Compare ("Software compare only") ! jsr nextTPM1C0 ! bclr bCH0F,TPM1C0SC 'Channel 0 Flag Bit (CH0F) im TPM1C0SC loeschen ! cli ! rts END PROCEDURE ' Den nĂ€chsten Aufrufzeitpunkt des TPM1C0-Interrupts festlegen PROCEDURE nextTPM1C0 INLASM ! lda TPM1CNTL 'nĂ€chsten Aufrufzeitpunkt festlegen ! add intervall+1 ! sta TPM1C0VL ! lda TPM1CNTH ! adc intervall ! sta TPM1C0VH ! rts END PROCEDURE #UIRTim0_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 "TPM1CH0-Interrupt" PRINT "=================" ' Initialisierungen: UIRTim0=ON 'User-Assemblerroutine fĂŒr TIM0 (TPM1CH0) aktivieren intervall=50000 '50000/(20e6/32)= 0.08 Sekunden (gleich 4 Timer-Ticks) initTPM1C0 ' Hauptschleife des Programms: WHILE TRUE IF zaehler THEN ?timer;zaehler zaehler=0 'ZĂ€hler resetten intervall=50000 '50000/(20e6/32)= 0.08 Sekunden (gleich 4 Timer-Ticks) nextTPM1C0 END IF 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 |