Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Mit Korrektur der Systemfunktionen Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 19.04.2018 21:47)
 Als Antwort auf TIMER-Takt auf der Open-Maxi erhöhen von Dietmar - 18.04.2018 2:05
Dietmar nutzt:  Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi, Open-Mini M-Unit, Open-Mini Station
' ----------------------------------------------------------------------------
' 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

Bisherige Antworten: