|
|
@ -19,6 +19,12 @@ CTC_TIMCFG .EQU %11010111 ; CTC TIMER CHANNEL CONFIG |
|
|
; |+-------- COUNTER MODE |
|
|
; |+-------- COUNTER MODE |
|
|
; +--------- INTERRUPT ENABLE |
|
|
; +--------- INTERRUPT ENABLE |
|
|
; |
|
|
; |
|
|
|
|
|
;================================================================================================== |
|
|
|
|
|
; ONLY IM2 IMPLEMENTED BELOW. I DON'T SEE ANY REASONABLE WAY TO IMPLEMENT AN IM1 TIMER BECAUSE |
|
|
|
|
|
; THE CTC PROVIDES NO WAY TO DETERMINE IF IT WAS THE CAUSE OF AN INTERRUPT OR A WAY TO |
|
|
|
|
|
; DETERMINE WHICH CHANNEL CAUSED AN INTERRUPT. |
|
|
|
|
|
;================================================================================================== |
|
|
|
|
|
; |
|
|
#IF (INTMODE != 2) |
|
|
#IF (INTMODE != 2) |
|
|
.ECHO "*** WARNING: CTC TIMER DISABLED -- INTMODE 2 REQUIRED!!!\n" |
|
|
.ECHO "*** WARNING: CTC TIMER DISABLED -- INTMODE 2 REQUIRED!!!\n" |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
@ -36,11 +42,52 @@ CTC_TIMCFG .EQU %11010111 ; CTC TIMER CHANNEL CONFIG |
|
|
!!! ; FORCE AN ASSEMBLY ERROR |
|
|
!!! ; FORCE AN ASSEMBLY ERROR |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
; ONLY IM2 IMPLEMENTED BELOW. I DON'T SEE ANY REASONABLE WAY TO |
|
|
|
|
|
; IMPLEMENT AN IM1 TIMER BECAUSE THE CTC PROVIDES NO WAY TO |
|
|
|
|
|
; DETERMINE IF IT WAS THE CAUSE OF AN INTERRUPT OR A WAY TO |
|
|
|
|
|
; DETERMINE WHICH CHANNEL CAUSED AN INTERRUPT. |
|
|
|
|
|
; |
|
|
|
|
|
|
|
|
;================================================================================================== |
|
|
|
|
|
; TIMER SETUP |
|
|
|
|
|
; |
|
|
|
|
|
; A PERIODIC INTERRUPT TIMER CAN BE SETUP USING EITHER THE CPU SYSTEM CLOCK OR AN EXTERNAL |
|
|
|
|
|
; OSCILLATOR CONNECTED TO THE CTC. THE DEFACTO PERIOD FOR THIS TIMER IS 50Hz OR 60Hz. |
|
|
|
|
|
; |
|
|
|
|
|
; THE DESIRED TIMER PERIOD IS SET IN THE CONFIGURATION: |
|
|
|
|
|
; TICKFREQ .SET 60 ; OR |
|
|
|
|
|
; TICKFREQ .SET 50 |
|
|
|
|
|
; |
|
|
|
|
|
; THIS DRIVER USES TWO CTC CHANNELS TO CREATE A TWO STEP DIVIDER THAT DIVIDES THE CPU SYSTEM |
|
|
|
|
|
; CLOCK OR EXTERNAL OSCILLATOR INTO A PERIODIC TICK THAT GENERATES AN INTERRUPT. |
|
|
|
|
|
; |
|
|
|
|
|
; THE CPU CLOCK OR CTC EXTERNAL OSCILLATOR NEEDS TO BE LESS THAN 3.932160MHz FOR A 60HZ TIMER |
|
|
|
|
|
; TICK OR 3.276800MHz FOR A 50Hz TIMER TICK. |
|
|
|
|
|
; |
|
|
|
|
|
; THE CHANNELS USED ARE DEFINED BY THE CTCPRECH AND CTCTIMCH DEFINITIONS - TYPICALLY 2 & 3. |
|
|
|
|
|
; EXTERNAL HARDWARE MUST BE CONFIGURED TO MATCH THIS CONFIGURATION. |
|
|
|
|
|
; |
|
|
|
|
|
; EACH CHANNEL SUCCESSIVELY DIVIDES THE CLOCK OR OSCILLATOR FREQUENCY DOWN TO A 50 OR 60Hz TICK. |
|
|
|
|
|
; THE FIRST DIVIDER CHANNEL IS THE PRESCALER, THE SECOND IS THE TIMER CHANNEL. |
|
|
|
|
|
; |
|
|
|
|
|
; IF CTCMODE IS CTCMODE_CTR THEN THE OSCILLATOR CONNECTED TO CTC PRESCALER CHANNEL IS USED. |
|
|
|
|
|
; |
|
|
|
|
|
; THE CONFIGURATION FILES DEFINE THE OSCILLATOR FREQUENCY THAT IS CONNECTED TO THE PRESCALER |
|
|
|
|
|
; CHANNEL. I.E. THE EXTERNAL HARDWARE CONNECTED TO THE CTC. |
|
|
|
|
|
; |
|
|
|
|
|
; FOR A 60Hz TIMER WITH A 3.579545Mhz OSCILLATOR USE: |
|
|
|
|
|
; CTCMODE .SET CTCMODE_CTR |
|
|
|
|
|
; TICKFREQ .SET 60 |
|
|
|
|
|
; CTCOSC .SET 3579545 |
|
|
|
|
|
; |
|
|
|
|
|
; IF CTCMODE IS CTCMODE_TIM16 OR CTCMODE_TIM256 THE CPU SYSTEM CLOCK FREQUENCY IS USED. |
|
|
|
|
|
; |
|
|
|
|
|
; THIS MODE HAS LIMITED VALUE AS MANY SYSTEMS OPERATE ABOVE THE USABLE TOP FREQUENCY. |
|
|
|
|
|
; THE CONFIGURATION FILE MUST BE UPDATED TO MATCH YOUR CPU CLOCK FREQUENCY. |
|
|
|
|
|
; |
|
|
|
|
|
; FOR A 60Hz TIMER WITH A 2Mhz OSCILLATOR USE: |
|
|
|
|
|
; CTCMODE .SET CTCMODE_TIM256 |
|
|
|
|
|
; TICKFREQ .SET 60 |
|
|
|
|
|
; CTCOSC .SET 2000000 |
|
|
|
|
|
; |
|
|
|
|
|
; NOTE THAT IF CPU SPEED IS CHANGED IN THIS MODE, THE TIMER SPEED WILL ALSO CHANGE. |
|
|
|
|
|
; |
|
|
|
|
|
;================================================================================================== |
|
|
|
|
|
; |
|
|
CTC_PREIO .EQU CTCBASE + CTCPRECH |
|
|
CTC_PREIO .EQU CTCBASE + CTCPRECH |
|
|
CTC_SCLIO .EQU CTCBASE + CTCTIMCH |
|
|
CTC_SCLIO .EQU CTCBASE + CTCTIMCH |
|
|
; |
|
|
; |
|
|
@ -88,7 +135,16 @@ CTCTIVT .EQU INT_CTC0A + CTCTIMCH |
|
|
; |
|
|
; |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
|
|
|
;================================================================================================== |
|
|
|
|
|
; CTC PRE-INITIALIZATION |
|
|
|
|
|
; |
|
|
|
|
|
; CHECK TO SEE IF A CTC EXISTS. IF IT EXISTS, ALL FOUR CTC CHANNELS ARE PROGRAMMED TO: |
|
|
|
|
|
; INTERRUPTS DISABLED, COUNTER MODE, RISING EDGE TRIGGER, RESET STATE. |
|
|
; |
|
|
; |
|
|
|
|
|
; IF THE CTCTIMER CONFIGURATION IS SET, THEN A PERIOD INTERRUPT TIMER IS SET UP USING CTC CHANNELS |
|
|
|
|
|
; 2 (CTCPRECH) & 3 (CTCTIMCH). THE TIMER WILL BE SETUP TO 50 OR 60HZ DEPENDING ON CONFIGURATION |
|
|
|
|
|
; SETTING TICKFREQ. CHANNEL 3 WILL GENERATE THE TICK INTERRUPT.. |
|
|
|
|
|
;================================================================================================== |
|
|
; |
|
|
; |
|
|
CTC_PREINIT: |
|
|
CTC_PREINIT: |
|
|
CALL CTC_DETECT ; DO WE HAVE ONE? |
|
|
CALL CTC_DETECT ; DO WE HAVE ONE? |
|
|
@ -136,7 +192,9 @@ CTC_PREINIT1: |
|
|
XOR A |
|
|
XOR A |
|
|
RET |
|
|
RET |
|
|
; |
|
|
; |
|
|
; |
|
|
|
|
|
|
|
|
;================================================================================================== |
|
|
|
|
|
; DRIVER INITIALIZATION |
|
|
|
|
|
;================================================================================================== |
|
|
; |
|
|
; |
|
|
CTC_INIT: ; MINIMAL INIT |
|
|
CTC_INIT: ; MINIMAL INIT |
|
|
CTC_PRTCFG: |
|
|
CTC_PRTCFG: |
|
|
@ -199,7 +257,10 @@ CTC_PRTCFG1: |
|
|
XOR A |
|
|
XOR A |
|
|
RET |
|
|
RET |
|
|
; |
|
|
; |
|
|
; |
|
|
|
|
|
|
|
|
;================================================================================================== |
|
|
|
|
|
; DETECT CTC BY CHECKING REGISTER CAN BE WRITTEN AND READ, AND THEN BY SETTING UP ONE CHANNEL IN |
|
|
|
|
|
; TIMER MODE AND CHECKING IT IS COUNTING DOWN. |
|
|
|
|
|
;================================================================================================== |
|
|
; |
|
|
; |
|
|
CTC_DETECT: |
|
|
CTC_DETECT: |
|
|
LD A,CTC_TIM256CFG |
|
|
LD A,CTC_TIM256CFG |
|
|
|