![]() ![]() INFO - FAQ - CC2-Forum - CCPro-Forum |
|
' ---------------------------------------------------------------------------- ' TIMER-Takt auf der Open-Maxi erhöhen, mit Korrektur der Systemfunktionen ' In OCBASIC 1.11a für Open-Maxi von Dietmar Harlos am 18. April 2018. ' ---------------------------------------------------------------------------- ' Nicht korrigiert wurde das Signal am Testpin. ' Im Kapitel 10 ("Timer/PWM (S08TPMV2)") im Data Sheet zum MC9S08AW60-Mikro- ' controller ist das Timer-Modul beschrieben: ' https://www.nxp.com/docs/en/data-sheet/MC9S08AW60.pdf ' ---------------------------------------------------------------------------- INCLUDE "omax.def" 'Definitionen für die Open-Maxi ' ---------------------------------------------------------------------------- DIM zaehler BYTE 'Variable der TIM3-Interruptroutine ' --- Unsere eigene Assembler-Interruptroutine ------------------------------- ' Die folgende Assembler-Interruptroutine befindet sich im "20-ms-Interrupt" ' der Open-Maxi und wird standardmäßig alle 20 ms ausgelöst und zählt ' die Uhr und die TIMER-Systemvariable weiter und generiert die PAUSE- ' Verzögerung und das TEST-Signal. Auch DCF77 wird hier ausgewertet. ' Und die FREQ1- und FREQ2-Messungen werden beendet. ' 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 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 zaehler 'Zähler um eins erhöhen ! lda zaehler ! cmpa #8 'jeder 8. Interrupt wird ans OS gemeldet ! beq isiTIM3_os ! lda TPM1C3VL ! add #$d4 '(625 kHz) * (20 ms) = 12500 = $30d4 ! sta TPM1C3VL ! lda TPM1C3VH ! adc #$30 ! sta TPM1C3VH ! inc TIMER+1 'TIMER, freilaufend ! bne isiTIM3_noovf ! inc TIMER #isiTIM3_noovf ' 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. ! sec 'Betriebssystemfunktion deaktivieren ! rts 'Rücksprung zum Betriebssystem #isiTIM3_os ! clr zaehler ! clc 'Betriebssystemfunktion aktivieren ! rts 'Rücksprung zum Betriebssystem END PROC #iiar_TIM3_ende 'hier hinter folgt die nächste IIAR '(sofern vorhanden) ' --- Das Hauptprogramm ------------------------------------------------------ #main UIRTim3=ON 'Userroutine für den TIM3-Interrupt aktivieren ' "Timer x Status and Control Register (TPMxSC)": ' Es enthält die "Prescale Divisor Selection". Sie gibt vor, welcher Divisor ' für die "TPM clock" gewählt wird. Auf der Original-C-Control (CC1 V1.1) ' beträgt dieser Takt 500 kHz. 'TPM1SC=&b00001101 'BUSCLK/32 = 625 kHz, TIMER-Takt 50 Hz (Standard) 'TPM1SC=&b00001100 'BUSCLK/16 = 1.250 MHz, TIMER-Takt 100 Hz 'TPM1SC=&b00001011 'BUSCLK/8 = 2.500 MHz, TIMER-Takt 200 Hz TPM1SC=&b00001010 'BUSCLK/4 = 5.000 MHz, TIMER-Takt 400 Hz PrintSpc=ON 'SPACE vor einem dezimalen PRINT ausgeben WHILE TRUE PAUSE 1 PRINT TIMER;SECOND 'TIMER und Sekunde auf Serieller Schnittstelle ausgeben WEND End2Host=ON 'Nach Programmende in den Host-Modus END 'Programmende Meine Homepage: http://ccintern.dharlos.de |
Antwort schreiben |