
Originally Posted by
longpole001
each 100th is 10ms on the i/o debug section btw
My output pin changes state every 2.5ms at 64MHz.
Code:
'***************************************************************************
'* Name : Elapsed_INT-18.bas *
'* Author : Darrel Taylor *
'* Date : JUL 11, 2006 : 7/11/2010 *
'* Version : 1.2 *
'* Notes : Must have DT_INTS-18.bas loaded first *
'* ver 1.2: Now works at any OSC frequency without using the prescaler *
'***************************************************************************
DISABLE DEBUG
; syntax = Handler IntSource, Label, Type, ResetFlag?
DEFINE Elapsed_Handler TMR1_INT, _ClockCount, asm, yes
; the above define can be used in the INT_LIST macro, if desired (optional)
EL_Ticks VAR BYTE ; Counts timer Overflows
EL_100th VAR BYTE
;T1Post VAR BYTE ; Timer1 postscaler
EL_Seconds VAR BYTE
EL_Minutes VAR BYTE
EL_Hours VAR BYTE
EL_Days VAR WORD
EL_100thChanged VAR BIT
EL_SecondsChanged VAR BIT ; idicates that the value has changed
EL_MinutesChanged VAR BIT
EL_HoursChanged VAR BIT
EL_DaysChanged VAR BIT
GOSUB ResetTime ; initialize the Elapsed Timer
Goto OverElapsed ; skip over the routines
' -------------- calc timer reload Constants -------------------------------
ASM
T1PS = 1 ; start with 1:1 postscaler
TimerConst = ((OSC*1000000)/4/100) ; how many timer ticks will it take
while TimerConst > 65400 ; if it's more than the timer can count
T1PS = T1PS * 2 ; double the postscaler
TimerConst = TimerConst / 2 ; halve the count
endw
TimerConst = 65536 - TimerConst + 8 ; final reload value
; ----------------- ADD TimerConst to TMR1H:TMR1L -------------------------
ADD2_TIMER macro
BCF T1CON,TMR1ON, 0 ; 1 Turn off timer
MOVLW LOW(TimerConst) ; 1
ADDWF TMR1L,F, 0 ; 1
BTFSC STATUS,C ; 1/2
INCF TMR1H,F, 0 ; 1
MOVLW HIGH(TimerConst) ; 1
ADDWF TMR1H,F, 0 ; 1
endm
; ----------------- ADD TimerConst to TMR1H:TMR1L and restart TIMER1 ------
RELOAD_TIMER macro
ADD2_TIMER
BSF T1CON,TMR1ON, 0 ; 1 Turn TIMER1 back on (8 cycles)
endm
; ----------------- Load TimerConst into TMR1H:TMR1L ----------------------
LOAD_TIMER macro
MOVE?CT 0, T1CON,TMR1ON
MOVE?CB 0, TMR1L
MOVE?CB 0, TMR1H
ADD2_TIMER
endm
ENDASM
' ------[ This is the Interrupt Handler ]-----------------------------------
T1PS CON EXT
ClockCount:
@ RELOAD_TIMER ; Reload TIMER1
EL_Ticks = EL_Ticks + 1 ; each tick is 2.5ms
IF LATD.3 = 0 THEN ' debug
LATD.3 = 1
ELSE
LATD.3 = 0
ENDIF
if EL_ticks // T1PS = 0 THEN ' if modulas of tips (4) = 0
IF LATD.3 = 0 THEN ' debug
LATD.3 = 1
ELSE
LATD.3 = 0
ENDIF
EL_100th = EL_100th + 1
EL_100thChanged = 1
IF EL_100TH = 100 THEN
EL_100TH = 0
EL_Seconds = EL_Seconds + 1
EL_SecondsChanged = 1
IF EL_Seconds = 60 THEN
EL_Seconds = 0
EL_Minutes = EL_Minutes + 1
EL_MinutesChanged = 1
eNDIF
IF EL_Minutes = 60 THEN
EL_Minutes = 0
EL_Hours = EL_Hours + 1
EL_HoursChanged = 1
ENDIF
IF EL_Hours = 24 THEN
EL_Hours = 0
EL_Days = EL_Days + 1
EL_DaysChanged = 1
ENDIF
eNDIF
endif
' Ticks = Ticks + 1
' IF Ticks = 100 THEN
' Ticks = 0
' T1Post = T1Post + 1
' IF T1Post = T1PS THEN
' T1Post = 0
' Seconds = Seconds + 1
' SecondsChanged = 1
' IF Seconds = 60 THEN
' Seconds = 0
' Minutes = Minutes + 1
' MinutesChanged = 1
' ENDIF
' IF Minutes = 60 THEN
' Minutes = 0
' Hours = Hours + 1
' HoursChanged = 1
' ENDIF
' IF Hours = 24 THEN
' Days = Days + 1
' DaysChanged = 1
' Hours = 0
' ENDIF
' ENDIF
' ENDIF
@ INT_RETURN ; Restore context and return from interrupt
'-----====[ END OF TMR1 Interrupt Handler ]====-----------------------------
StartTimer:
T1CON = 1 ; 1:1, FOSC4, TMR1ON
RETURN
; --------------------------------------------------------------------------
StopTimer:
T1CON.0 = 0 ; Turn OFF Timer1
RETURN
; --------------------------------------------------------------------------
BitSave VAR BIT
ResetTime:
BitSave = T1CON.0 ; Save TMR1ON bit
@ LOAD_TIMER ; Load TimerConst
T1CON.0 = BitSave ; Restore TMR1ON bit
; T1Post = 0 ; clear the postscaler
EL_Ticks = 0
EL_100th = 0
EL_Seconds = 0
EL_Minutes = 0
EL_Hours = 0
EL_Days = 0
EL_100thChanged = 1
EL_SecondsChanged = 1 ; indicate everything has changed
EL_MinutesChanged = 1 ; so that 00:00:00 is processed
EL_HoursChanged = 1
EL_DaysChanged = 1
RETURN
OverElapsed:
ENABLE DEBUG
Bookmarks