Here is the elasped timer code I modified to use T3 and go to the thousandths. Also I have the interrupt set up as INTLHAND
Code:
'****************************************************************
'* Name : ELAPSED.PBP *
'* Author : Darrel Taylor *
'* Notice : Copyright (c) 2003 *
'* Date : 12/16/2003 *
'* Notes : *
'****************************************************************
disable debug
Define INTLHAND _ClockCount ' Tell PBP Where the code starts on an interrupt
Include "ASM_INTS-18.bas" ' ASM Interrupt Stubs
Ticks var Word ' 1/1000th of a second
Seconds var byte
Minutes var byte
Hours var byte
Days var word
R0save var word
R1save var word
R4save var word
SecondsChanged var bit
MinutesChanged var bit
HoursChanged var bit
DaysChanged var bit
SecondsChanged = 1
MinutesChanged = 1
Goto OverElapsed
' ------------------------------------------------------------------------------
Asm
IF OSC == 4 ; Constants for 100hz interrupt from Timer1
TimerConst = 0D8F7h ; Executed at compile time only
EndIF
If OSC == 8
TimerConst = 0B1E7h
EndIF
If OSC == 10
TimerConst = 09E5Fh
EndIF
If OSC == 20
TimerConst = 0EC80h
EndIF
If OSC == 40
TimerConst = 03CB7h
EndIF
; ----------------- ADD TimerConst to TMR1H:TMR1L
ADD2_TIMER macro
CHK?RP T3CON
BCF T3CON,TMR3ON ; Turn off timer
MOVLW LOW(TimerConst) ; 1
ADDWF TMR3L,F ; 1 ; reload timer with correct value
BTFSC STATUS,C ; 1/2
INCF TMR3H,F ; 1
MOVLW HIGH(TimerConst) ; 1
ADDWF TMR3H,F ; 1
endm
; ----------------- ADD TimerConst to TMR1H:TMR1L and restart TIMER1
RELOAD_TIMER macro
ADD2_TIMER
BSF T3CON,TMR3ON ; 1 ; Turn TIMER1 back on
CHK?RP PIR2
bcf PIR2, TMR3IF ; Clear Timer1 Interrupt Flag
endm
; ----------------- Load TimerConst into TMR1H:TMR1L
LOAD_TIMER macro
EndAsm
T3CON.0 = 0 ; Turn OFF Timer1
TMR3L = 0
TMR3H = 0
Asm
ADD2_TIMER
endm
EndAsm
' ------[ This is the Interrupt Handler ]---------------------------------------
ClockCount: ' Note: this is being handled as an ASM interrupt
@ INT_START
@ RELOAD_TIMER ; Reload TIMER1
R0save = R0 ; Save 2 PBP system vars that are used during
R1save = R1 ; the interrupt
R4save = R4
Ticks = Ticks + 1
if Ticks = 1000 then
Ticks = Ticks-1000
Seconds = Seconds + 1
SecondsChanged = 1
if Seconds = 60 then
Minutes = Minutes + 1
MinutesChanged = 1
Seconds = 0
endif
if Minutes = 60 then
Hours = Hours + 1
HoursChanged = 1
Minutes = 0
endif
if Hours = 24 then
Days = Days + 1
DaysChanged = 1
Hours = 0
endif
endif
R4 = R4save ; Restore the PBP system vars
R1 = R1save
R0 = R0save
@ INT_RETURN ; Restore context and return from interrupt
'-----====[ END OF TMR1 Interrupt Handler ]====---------------------------------
StartTimer:
T3CON.1 = 0 ; (TMR1CS) Select FOSC/4 Clock Source
T3CON.3 = 0 ; (T1OSCEN) Disable External Oscillator
PIR2.1 = 0 ; (TMR1IF) Clear Timer1 Interrupt Flag
PIE2.1 = 1 ; (TMR1IE) Enable TMR1 overflow interrupt
INTCON.6 = 1 ; (PEIE) Enable peripheral interrupts
INTCON.7 = 1 ; (GIE) Enable global interrupts
T3CON.0 = 1 ; (TMR1ON) Start TIMER1
@ if OSC == 40
T3CON.5 = 0 ; Prescaler = 1:2
T3CON.4 = 1
@ endif
return
; -----------------
StopTimer:
T3CON.0 = 0 ; Turn OFF Timer1
return
; -----------------
ResetTime:
R0save = T3CON.0 ; Save TMR1ON bit
T3CON.0 = 0 ; Turn OFF Timer1
TMR3L = 0
TMR3H = 0
@ LOAD_TIMER ; Load TimerConst
T3CON.0 = R0save ; Restore TMR1ON bit
Ticks = 0
Seconds = 0
Minutes = 0
Hours = 0
Days = 0
SecondsChanged = 1
return
OverElapsed:
enable debug
Bookmarks