I think I have some other problems lurking in the woodwork. Debugging right now to narrow the search.
Code:'**************************************************************** '* Name : ELAPSED.PBP * '* Author : Darrel Taylor * '* Notice : Copyright (c) 2003 * '* Date : 12/16/2003 * '* Notes : * '**************************************************************** Define INTHAND _ClockCount ' Tell PBP Where the code starts on an interrupt Include "ASM_INTS.pbp" ' ASM Interrupt Stubs Ticks var byte ' 1/100th of a second Seconds var byte Minutes var byte Hours var byte Days var word AccuTicks var word AccuSeconds var word AccuMinutes var word AccuHours var word AccuDays var word R0save var word R1save var word SecondsChanged var bit : SecondsChanged = 1 MinutesChanged var bit : MinutesChanged = 1 HoursChanged var bit DaysChanged var bit 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 = 03CB7h EndIF ; ----------------- ADD TimerConst to TMR1H:TMR1L ADD2_TIMER macro CHK?RP T1CON BCF T1CON,TMR1ON ; Turn off timer MOVLW LOW(TimerConst) ; 1 ADDWF TMR1L,F ; 1 ; reload timer with correct value BTFSC STATUS,C ; 1/2 INCF TMR1H,F ; 1 MOVLW HIGH(TimerConst) ; 1 ADDWF TMR1H,F ; 1 endm ; ----------------- ADD TimerConst to TMR1H:TMR1L and restart TIMER1 RELOAD_TIMER macro ADD2_TIMER BSF T1CON,TMR1ON ; 1 ; Turn TIMER1 back on CHK?RP PIR1 bcf PIR1, TMR1IF ; Clear Timer1 Interrupt Flag endm ; ----------------- Load TimerConst into TMR1H:TMR1L LOAD_TIMER macro EndAsm T1CON.0 = 0 ; Turn OFF Timer1 TMR1L = 0 TMR1H = 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 Ticks = Ticks + 1 AccuTicks = AccuTicks + 1 if Ticks = 100 then Ticks = Ticks-100 Seconds = Seconds + 1 AccuSeconds = AccuSeconds + 1 SecondsChanged = 1 if Seconds = 60 then Minutes = Minutes + 1 AccuMinutes = AccuMinutes + 1 MinutesChanged = 1 Seconds = 0 endif if Minutes = 60 then Hours = Hours + 1 AccuHours = AccuHours + 1 HoursChanged = 1 Minutes = 0 endif if Hours = 24 then Days = Days + 1 AccuDays = AccuDays + 1 DaysChanged = 1 Hours = 0 endif endif R1 = R1save ; Restore the PBP system vars R0 = R0save @ INT_RETURN ; Restore context and return from interrupt '-----====[ END OF TMR1 Interrupt Handler ]====--------------------------------- StartTimer: T1CON.1 = 0 ; (TMR1CS) Select FOSC/4 Clock Source T1CON.3 = 0 ; (T1OSCEN) Disable External Oscillator PIR1.0 = 0 ; (TMR1IF) Clear Timer1 Interrupt Flag PIE1.0 = 1 ; (TMR1IE) Enable TMR1 overflow interrupt INTCON.6 = 1 ; (PEIE) Enable peripheral interrupts INTCON.7 = 1 ; (GIE) Enable global interrupts T1CON.0 = 1 ; (TMR1ON) Start TIMER1 return ; ----------------- StopTimer: T1CON.0 = 0 ; Turn OFF Timer1 return ; ----------------- ResetTime: R0save = T1CON.0 ; Save TMR1ON bit T1CON.0 = 0 ; Turn OFF Timer1 TMR1L = 0 TMR1H = 0 @ LOAD_TIMER ; Load TimerConst T1CON.0 = R0save ; Restore TMR1ON bit Ticks = 0 Seconds = 0 Minutes = 0 Hours = 0 Days = 0 AccuTicks = 0 AccuSeconds = 0 AccuMinutes = 0 AccuHours = 0 AccuDays = 0 SecondsChanged = 1 return OverElapsed:




Bookmarks