INFO - FAQ - CC2-Forum - CCPro-Forum |
|
' =========================================================================== ' Demoprogramm: Freilaufender 32-Bit-ZĂ€hler in komfortabler 32-Bit-Arithmetik ' In OCBASIC 1.12a_e1 fĂŒr Open-Maxi von Dietmar Harlos am 7. September 2024 ' Am 13. September 2024 durch komfortable 32-Bit-Erweiterung ergĂ€nzt ' =========================================================================== ' Der AW60-Controller, auf dem die Open-Maxi basiert, besitzt unter anderem ' das freilaufende "Timer 1 Counter Register" (TPM1CNTH:TPM1CNTL), das mit ' einem Takt von 20e6/32 = 625 kHz um eins hochgezĂ€hlt/inkrementiert wird. ' Da das Register eine Auflösung von nur 16 Bit hat, zĂ€hlt es nur von 0 bis ' 65535 und lĂ€uft alle 65536/(20e6/32) = 104.8576 ms ĂŒber. Beim Ăberlauf ' wird der Interrupt "Timer/PWM-Module 1 - Overflow (TPM1OVF)" ausgelöst. ' In diesem Beispielprogramm wird gezeigt, wie man den Timer auf 32 Bit ' erweitert und so Zeitintervalle bis 114.5324612 Minuten messen kann. ' Es wird die Systemerweiterung "Komfortable 32-Bit-Arithmetik auf der ' Open-Maxi" verwendet. ' --- Definitionen ---------------------------------------------------------- INCLUDE "omax.def" 'Definitionen fĂŒr die Open-Maxi OPTION 32BIT '32-Bit freischalten (ab OCBASIC Version 1.12) DIM TIMER32 LONG '32-Bit-ZĂ€hler DIM TIMER32lw AS WORD[1] OF TIMER32 'LSW \ Low-Word DIM TIMER32hw AS WORD[2] OF TIMER32 'MSW / High-Word DIM ende LONG 'fĂŒr ĂŒberlauftolerante Timerabfrage DIM temphw WORD 'temporĂ€re Variable (Highword) ' --- Systemerweiterungen einbinden ----------------------------------------- INCLUDE "omax32.iia" '32-Bit-Erweiterung einbinden (fĂŒr Open-Maxi) ' --- Unsere eigene Assembler-Interruptroutine ------------------------------ ' Die folgende Assembler-Interruptroutine befindet sich im "Timer-Overflow- ' Interrupt" (genauer: "Timer/PWM-Module 1 - Overflow (TPM1OVF)"). Der ' Interrupt wird immer dann aufgerufen, wenn das "Timer 1 Counter Register" ' (TPM1CNTH:TPM1CNTL) von 65535 nach 0 ĂŒberlĂ€uft. ' Die folgende Subroutine muĂ am Anfang des Programms, vor dem ersten Befehl ' stehen und sollte zusammen mit den anderen Subroutinen bis inklusive ' UIRTOFL_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. PROCEDURE UIRTOFL_iiar INLASM ! cbeqa #iTOFL,isiTOFL 'Falls kein Aufruf durch TOFL-Interrupt, ! jmp UIRTOFL_iiar_next+2 ' dann zur nĂ€chsten IIAR in der Kette. #isiTOFL ! ldhx temphw 'temporĂ€res Highword inkrementieren ! aix #1 ! sthx temphw ' 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 ' TIMER32-Variable aktualisieren ' Aus CPU08RM.pdf: '"The next instruction after a CLI will not be executed if there was an ' interrupt pending prior to execution of the CLI instruction." '"If an interrupt is pending upon exit from the original interrupt service ' routine, it will also be serviced before the next instruction is executed." PROCEDURE getTIMER32 INLASM ! sti ! ldhx TPM1CNTH 'TPM1CNTH:TPM1CNTL lesen ! sthx TIMER32lw 'und als Lowword speichern ! bne getTIMER32_keintof 'springen, wenn es ungleich 0 ist ! cli 'Interrupts kurz aktivieren, um ! sti ' den TOFL-Interrupt aufzurufen #getTIMER32_keintof ! ldhx temphw 'temporĂ€res Highword lesen ! sthx TIMER32hw 'und als Highword speichern ! cli ! rts END PROCEDURE ' TPM1-Modul initialisieren PROCEDURE initTIMER32 INLASM ! bset bTOIE,TPM1SC 'TOFL-Interrupt aktivieren ! rts END PROCEDURE #UIRTOFL_iiar_next 'hier hinter folgt die nĂ€chste IIAR '(sofern vorhanden) ' --- Hauptprogramm --------------------------------------------------------- #main 'durch die IIAR am Programmbeginn wird ein "GOTO main" erzeugt PrintSpc=ON 'Bei PRINT dezimale Zahlen mit fĂŒhrendem Leerzeichen ausgeben End2Host=ON 'Bei Programmende (siehe END) gleich in den Host-Modus wechseln PRINT "Demoprogramm: Freilaufender 32-Bit-ZĂ€hler in komfortabler 32-Bit-Arithmetik" PRINT "===========================================================================" IF NOT IiarFnd THEN ?"INLINE-Interrupt-Assemblerroutine nicht gefunden!" : END RunOnErr=ON 'Fehler-Handling aktivieren IF ERR THEN 'Fehler-Handling (siehe Doku) WHILE TRUE ?"Fehler Nr. ";ERR PrintHex=ON ?"Adresse: $";ERRADR-UPROGBASE PrintHex=OFF PAUSE 25 WEND END IF URTok=ON '32-Bit-Erweiterung aktivieren UIRTofl=ON 'Timer-Overflow-Interrupt fĂŒr IIAR aktivieren initTIMER32 'Timer32 initialisieren getTIMER32 'Timer32-Variable aktualisieren WHILE NOT RXD ende=TIMER32+625000 '1 Sekunde Timeout WHILE ende-TIMER32>0 AND NOT RXD getTIMER32 'Timer32-Variable aktualisieren ' PAUSE 1 'bei Bedarf Strom sparen WEND ?TIMER;TIMER32 'TIMER und TIMER32 auf Ser. Schnittstelle ausgeben 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 |