' This is an modification of Darrel Taylor's Elapsed_INT ' See: http://darreltaylor.com/DT_INTS-18/downloads.html ' ' ' This Assumes that you are the 16 bit TIMER1 with a prescale of 1:1 ' This will give an interrupt every 1 mSec ' mSec_Ticks VAR WORD Timer_On_Bit VAR BIT Goto OverTimer1Control Asm ; ----------------- This will establish the Reload for 1 mSec Interrupts ; It will only run at compile time IF OSC == 4 TimerReload = 0FC20h ;64544 EndIF If OSC == 8 TimerReload = 0F838h ;63544 EndIF If OSC == 10 TimerReload = 0F644h ;63044 EndIF If OSC == 16 TimerReload = 0F068h ;61544 EndIF If OSC == 20 TimerReload = 0EC80h ;60544 EndIF If OSC == 40 TimerReload = 0D8F7h ;55543 EndIF ; ----------------- ADD TimerReload to TMR1H:TMR1L ADD2_TIMER macro BCF T1CON,TMR1ON, 0 ; Turn off timer MOVLW LOW(TimerReload) ; 1 ADDWF TMR1L,F, 0 ; 1 ; reload timer with correct value BTFSC STATUS,C ; 1/2 INCF TMR1H,F, 0 ; 1 MOVLW HIGH(TimerReload) ; 1 ADDWF TMR1H,F, 0 ; 1 endm ; ----------------- ADD TimerReload to TMR1H:TMR1L and restart TIMER1 ---------- RELOAD_TIMER macro ADD2_TIMER BSF T1CON,TMR1ON, 0 ; 1 ; Turn TIMER1 back on endm ; ----------------- Load TimerReload into TMR1H:TMR1L -------------------------- LOAD_TIMER macro MOVE?CT 0, T1CON,TMR1ON MOVE?CB 0, TMR1L MOVE?CB 0, TMR1H ADD2_TIMER endm EndAsm ;---- Interrupt Handler ---- UpdateTickCount: @ RELOAD_TIMER ; Runs the code to Reload the Timer with correct Value mSec_Ticks = mSec_Ticks + 1 @ INT_RETURN ;--------------------------- ;----Start Timer ---- StartTimer: T1CON.1 = 0 ; (TMR1CS) Select FOSC/4 Clock Source T1CON.3 = 0 ; (T1OSCEN) Disable External Oscillator T1CON.0 = 1 ; (TMR1ON) Start TIMER1 return ;-------------------- ;----Start Timer ---- StopTimer: T1CON.0 = 0 ; Turn OFF Timer1 return ;-------------------- ;----Reset Timer ---- ResetTime: Timer_On_Bit = T1CON.0 ; Save TMR1ON bit @ LOAD_TIMER ; Load TimerConst T1CON.0 = Timer_On_Bit ; Restore TMR1ON bit mSec_Ticks = 0 return ;-------------------- OverTimer1Control: ENABLE DEBUG