|
|
@ -16,39 +16,51 @@ |
|
|
.ECHO "*** ERROR: CTC REQUIRES INTMODE 2!!!\n" |
|
|
.ECHO "*** ERROR: CTC REQUIRES INTMODE 2!!!\n" |
|
|
!!! ; FORCE AN ASSEMBLY ERROR |
|
|
!!! ; FORCE AN ASSEMBLY ERROR |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
|
|
|
; |
|
|
|
|
|
CTC_PREIO .EQU CTCBASE + CTCPRECH |
|
|
|
|
|
CTC_SCLIO .EQU CTCBASE + CTCTIMCH |
|
|
; |
|
|
; |
|
|
; CONFIGURATION |
|
|
|
|
|
; |
|
|
|
|
|
#IF (CTCMODE == CTCMODE_ZP) |
|
|
|
|
|
CTCPC .EQU CTCC ; PRESCALE CHANNEL |
|
|
|
|
|
CTCPCC .EQU 0 ; PRESCALE CHANNEL CONSTANT |
|
|
|
|
|
CTCTC .EQU CTCD ; TIMER CHANNEL |
|
|
|
|
|
CTCTCC .EQU 48 ; TIMER CHANNEL CONSTANT |
|
|
|
|
|
CTCTIVT .EQU INT_CTC0D ; TIMER CHANNEL IVT ENTRY |
|
|
|
|
|
|
|
|
#IF (CTCMODE == CTCMODE_CTR) |
|
|
|
|
|
CTC_DIV .EQU CTCOSC / 50 |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
|
|
|
#IF (CTCMODE == CTCMODE_Z2) |
|
|
|
|
|
CTCPC .EQU CTCA ; PRESCALE CHANNEL |
|
|
|
|
|
CTCPCC .EQU 0 ; PRESCALE CHANNEL CONSTANT |
|
|
|
|
|
CTCTC .EQU CTCB ; TIMER CHANNEL |
|
|
|
|
|
CTCTCC .EQU 72 ; TIMER CHANNEL CONSTANT |
|
|
|
|
|
CTCTIVT .EQU INT_CTC0B ; TIMER CHANNEL IVT ENTRY |
|
|
|
|
|
|
|
|
#IF (CTCMODE == CTCMODE_TIM16) |
|
|
|
|
|
CTC_DIV .EQU CTCOSC / 16 / 50 |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
|
|
|
#IF (CTCMODE == CTCMODE_EZ) |
|
|
|
|
|
CTCPC .EQU CTCC ; PRESCALE CHANNEL |
|
|
|
|
|
CTCPCC .EQU 0 ; PRESCALE CHANNEL CONSTANT |
|
|
|
|
|
CTCTC .EQU CTCD ; TIMER CHANNEL |
|
|
|
|
|
CTCTCC .EQU 72 ; TIMER CHANNEL CONSTANT |
|
|
|
|
|
CTCTIVT .EQU INT_CTC0D ; TIMER CHANNEL IVT ENTRY |
|
|
|
|
|
|
|
|
#IF (CTCMODE == CTCMODE_TIM256) |
|
|
|
|
|
CTC_DIV .EQU CTCOSC / 256 / 50 |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
#IF (CTCMODE == CTCMODE_RC) |
|
|
|
|
|
CTCPC .EQU CTCC ; PRESCALE CHANNEL |
|
|
|
|
|
CTCPCC .EQU 0 ; PRESCALE CHANNEL CONSTANT |
|
|
|
|
|
CTCTC .EQU CTCD ; TIMER CHANNEL |
|
|
|
|
|
CTCTCC .EQU 144 ; TIMER CHANNEL CONSTANT |
|
|
|
|
|
CTCTIVT .EQU INT_CTC0D ; TIMER CHANNEL IVT ENTRY |
|
|
|
|
|
|
|
|
.ECHO "CTC DIVISOR: " |
|
|
|
|
|
.ECHO CTC_DIV |
|
|
|
|
|
.ECHO "\n" |
|
|
|
|
|
; |
|
|
|
|
|
CTC_DIVHI .EQU ((CTC_DIV >> 8) & $FF) |
|
|
|
|
|
CTC_DIVLO .EQU (CTC_DIV & $FF) |
|
|
|
|
|
; |
|
|
|
|
|
CTCTIVT .EQU INT_CTC0A + CTCTIMCH |
|
|
|
|
|
; |
|
|
|
|
|
CTC_DEFCFG .EQU %01010011 ; CTC DEFAULT CONFIG |
|
|
|
|
|
CTC_CTRCFG .EQU %01010111 ; CTC COUNTER MODE CONFIG |
|
|
|
|
|
CTC_TIM16CFG .EQU %00010111 ; CTC TIMER/16 MODE CONFIG |
|
|
|
|
|
CTC_TIM256CFG .EQU %00110111 ; CTC TIMER/256 MODE CONFIG |
|
|
|
|
|
CTC_TIMCFG .EQU %11010111 ; CTC TIMER CHANNEL CONFIG |
|
|
|
|
|
; |||||||+-- CONTROL WORD FLAG |
|
|
|
|
|
; ||||||+--- SOFTWARE RESET |
|
|
|
|
|
; |||||+---- TIME CONSTANT FOLLOWS |
|
|
|
|
|
; ||||+----- AUTO TRIGGER WHEN TIME CONST LOADED |
|
|
|
|
|
; |||+------ RISING EDGE TRIGGER |
|
|
|
|
|
; ||+------- TIMER MODE PRESCALER (0=16, 1=256) |
|
|
|
|
|
; |+-------- COUNTER MODE |
|
|
|
|
|
; +--------- INTERRUPT ENABLE |
|
|
|
|
|
; |
|
|
|
|
|
#IF (CTCMODE == CTCMODE_CTR) |
|
|
|
|
|
CTC_PRECFG .EQU CTC_CTRCFG |
|
|
|
|
|
#ENDIF |
|
|
|
|
|
#IF (CTCMODE == CTCMODE_TIM16) |
|
|
|
|
|
CTC_PRECFG .EQU CTC_TIM16CFG |
|
|
|
|
|
#ENDIF |
|
|
|
|
|
#IF (CTCMODE == CTCMODE_TIM256) |
|
|
|
|
|
CTC_PRECFG .EQU CTC_TIM256CFG |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
@ -61,15 +73,7 @@ CTC_PREINIT: |
|
|
LD B,4 ; 4 CHANNELS |
|
|
LD B,4 ; 4 CHANNELS |
|
|
LD C,CTCBASE ; FIRST CHANNEL PORT |
|
|
LD C,CTCBASE ; FIRST CHANNEL PORT |
|
|
CTC_PREINIT1: |
|
|
CTC_PREINIT1: |
|
|
LD A,%01010011 ; CTCC CONTROL WORD VALUE |
|
|
|
|
|
; |||||||+-- 1=CONTROL WORD FLAG |
|
|
|
|
|
; ||||||+--- 1=SOFTWARE RESET |
|
|
|
|
|
; |||||+---- 0=TIME CONSTANT DOES NOT FOLLOW |
|
|
|
|
|
; ||||+----- 0=AUTO TRIGGER WHEN TIME CONST LOADED |
|
|
|
|
|
; |||+------ 1=RISING EDGE TRIGGER |
|
|
|
|
|
; ||+------- 0=PRESCALER OF 16 |
|
|
|
|
|
; |+-------- 1=COUNTER MODE |
|
|
|
|
|
; +--------- 0=NO INTERRUPTS |
|
|
|
|
|
|
|
|
LD A,CTC_DEFCFG ; CTC DEFAULT CONFIG |
|
|
OUT (C),A ; CTC COMMAND |
|
|
OUT (C),A ; CTC COMMAND |
|
|
INC C ; NEXT CHANNEL PORT |
|
|
INC C ; NEXT CHANNEL PORT |
|
|
DJNZ CTC_PREINIT1 |
|
|
DJNZ CTC_PREINIT1 |
|
|
@ -82,7 +86,7 @@ CTC_PREINIT1: |
|
|
; CTC USES 4 CONSECUTIVE VECTOR POSITIONS, ONE FOR |
|
|
; CTC USES 4 CONSECUTIVE VECTOR POSITIONS, ONE FOR |
|
|
; EACH CHANNEL. BELOW WE SET THE BASE VECTOR TO THE |
|
|
; EACH CHANNEL. BELOW WE SET THE BASE VECTOR TO THE |
|
|
; START OF THE IVT, SO THE FIRST FOUR ENTIRES OF THE |
|
|
; START OF THE IVT, SO THE FIRST FOUR ENTIRES OF THE |
|
|
; IVT CORRESPOND TO CTC CHANNELS A-D |
|
|
|
|
|
|
|
|
; IVT CORRESPOND TO CTC CHANNELS A-D. |
|
|
LD A,0 |
|
|
LD A,0 |
|
|
OUT (CTCBASE),A ; SETUP CTC BASE INT VECTOR |
|
|
OUT (CTCBASE),A ; SETUP CTC BASE INT VECTOR |
|
|
; |
|
|
; |
|
|
@ -91,31 +95,15 @@ CTC_PREINIT1: |
|
|
; CTC CHANNEL AS A PRESCALER AND ANOTHER AS THE ACTUAL |
|
|
; CTC CHANNEL AS A PRESCALER AND ANOTHER AS THE ACTUAL |
|
|
; TIMER INTERRUPT. THE PRESCALE CHANNEL OUTPUT MUST BE WIRED |
|
|
; TIMER INTERRUPT. THE PRESCALE CHANNEL OUTPUT MUST BE WIRED |
|
|
; TO THE TIMER CHANNEL TRIGGER INPUT VIA HARDWARE. |
|
|
; TO THE TIMER CHANNEL TRIGGER INPUT VIA HARDWARE. |
|
|
LD A,%01010111 ; PRESCALE CHANNEL CONTROL WORD VALUE |
|
|
|
|
|
; |||||||+-- 1=CONTROL WORD FLAG |
|
|
|
|
|
; ||||||+--- 1=SOFTWARE RESET |
|
|
|
|
|
; |||||+---- 1=TIME CONSTANT FOLLOWS |
|
|
|
|
|
; ||||+----- 0=AUTO TRIGGER WHEN TIME CONST LOADED |
|
|
|
|
|
; |||+------ 1=RISING EDGE TRIGGER |
|
|
|
|
|
; ||+------- 0=PRESCALER OF 16 (NOT USED) |
|
|
|
|
|
; |+-------- 1=COUNTER MODE |
|
|
|
|
|
; +--------- 0=NO INTERRUPTS |
|
|
|
|
|
OUT (CTCPC),A ; SETUP PRESCALE CHANNEL |
|
|
|
|
|
LD A,CTCPCC ; PRESCALE CHANNEL CONSTANT |
|
|
|
|
|
OUT (CTCPC),A ; SET PRESCALE CONSTANT |
|
|
|
|
|
; |
|
|
|
|
|
LD A,%11010111 ; TIMER CHANNEL CONTROL WORD VALUE |
|
|
|
|
|
; |||||||+-- 1=CONTROL WORD FLAG |
|
|
|
|
|
; ||||||+--- 1=SOFTWARE RESET |
|
|
|
|
|
; |||||+---- 1=TIME CONSTANT FOLLOWS |
|
|
|
|
|
; ||||+----- 0=AUTO TRIGGER WHEN TIME CONST LOADED |
|
|
|
|
|
; |||+------ 1=RISING EDGE TRIGGER |
|
|
|
|
|
; ||+------- 0=PRESCALER OF 16 (NOT USED) |
|
|
|
|
|
; |+-------- 1=COUNTER MODE |
|
|
|
|
|
; +--------- 1=ENABLE INTERRUPTS |
|
|
|
|
|
OUT (CTCTC),A ; SETUP TIMER CHANNEL |
|
|
|
|
|
LD A,CTCTCC ; TIMER CHANNEL CONSTANT |
|
|
|
|
|
OUT (CTCTC),A ; SET TIMER CONSTANT |
|
|
|
|
|
|
|
|
LD A,CTC_PRECFG ; PRESCALE CHANNEL CONFIGURATION |
|
|
|
|
|
OUT (CTC_PREIO),A ; SETUP PRESCALE CHANNEL |
|
|
|
|
|
LD A,CTC_DIVHI ; PRESCALE CHANNEL CONSTANT |
|
|
|
|
|
OUT (CTC_PREIO),A ; SET PRESCALE CONSTANT |
|
|
|
|
|
; |
|
|
|
|
|
LD A,CTC_TIMCFG ; TIMER CHANNEL CONTROL WORD VALUE |
|
|
|
|
|
OUT (CTC_SCLIO),A ; SETUP TIMER CHANNEL |
|
|
|
|
|
LD A,CTC_DIVLO ; TIMER CHANNEL CONSTANT |
|
|
|
|
|
OUT (CTC_SCLIO),A ; SET TIMER CONSTANT |
|
|
; |
|
|
; |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
@ -129,28 +117,39 @@ CTC_PRTCFG: |
|
|
; ANNOUNCE PORT |
|
|
; ANNOUNCE PORT |
|
|
CALL NEWLINE ; FORMATTING |
|
|
CALL NEWLINE ; FORMATTING |
|
|
PRTS("CTC:$") ; FORMATTING |
|
|
PRTS("CTC:$") ; FORMATTING |
|
|
|
|
|
; |
|
|
|
|
|
PRTS(" IO=0x$") ; FORMATTING |
|
|
|
|
|
LD A,CTCBASE ; GET BASE PORT |
|
|
|
|
|
CALL PRTHEXBYTE ; PRINT BASE PORT |
|
|
; |
|
|
; |
|
|
#IF (CTCTIMER) |
|
|
#IF (CTCTIMER) |
|
|
; |
|
|
; |
|
|
PRTS(" TIMER MODE=$") ; FORMATTING |
|
|
PRTS(" TIMER MODE=$") ; FORMATTING |
|
|
#IF (CTCMODE == CTCMODE_ZP) |
|
|
|
|
|
PRTS("ZP$") |
|
|
|
|
|
|
|
|
#IF (CTCMODE == CTCMODE_CTR) |
|
|
|
|
|
PRTS("COUNTER$") |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
#IF (CTCMODE == CTCMODE_Z2) |
|
|
|
|
|
PRTS("Z2$") |
|
|
|
|
|
|
|
|
#IF (CTCMODE == CTCMODE_TIM16) |
|
|
|
|
|
PRTS("TIMER/16$") |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
#IF (CTCMODE == CTCMODE_EZ) |
|
|
|
|
|
PRTS("EZ$") |
|
|
|
|
|
|
|
|
#IF (CTCMODE == CTCMODE_TIM256) |
|
|
|
|
|
PRTS("TIMER/256$") |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
#IF (CTCMODE == CTCMODE_RC) |
|
|
|
|
|
PRTS("RC$") |
|
|
|
|
|
|
|
|
; |
|
|
|
|
|
#IF (CTCDEBUG) |
|
|
|
|
|
PRTS(" PREIO=$") |
|
|
|
|
|
LD A,CTC_PREIO |
|
|
|
|
|
CALL PRTHEXBYTE |
|
|
|
|
|
; |
|
|
|
|
|
PRTS(" SCLIO=$") |
|
|
|
|
|
LD A,CTC_SCLIO |
|
|
|
|
|
CALL PRTHEXBYTE |
|
|
|
|
|
; |
|
|
|
|
|
PRTS(" DIV=$") |
|
|
|
|
|
LD BC,CTC_DIV |
|
|
|
|
|
CALL PRTHEXWORD |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
|
|
|
PRTS(" IO=0x$") ; FORMATTING |
|
|
|
|
|
LD A,CTCBASE ; GET BASE PORT |
|
|
|
|
|
CALL PRTHEXBYTE ; PRINT BASE PORT |
|
|
|
|
|
; |
|
|
; |
|
|
XOR A |
|
|
XOR A |
|
|
RET |
|
|
RET |
|
|
|