i doubt i will understand how you came to that conclusion. you will need a different strategy if you plan additional interrupt usage as there can only be one interrupt handler, dt's elapsed timer takes it over entirelyI didn't comprehend the depth of this statement, until now. I thought I was just forced to accept using Timer1 in the routines, and adapt my main code to use other timers.
by the way the newer chips are easier to use
i called this dlapsed.pbp,
usage demoCode:'**************************************************************** '* Name : ELAPSED.PBP * '* Author : Darrel Taylor * '* Notice : Copyright (c) 2003 * '* Date : 12/16/2003 * '* Notes : its based on this * '**************************************************************** '* Name : DLAPSED.PBP * '* Author : Richard * '* Date : 2024-10-05 * '* Notes : for 16F18877 or similar * ' a) @32MHz * ' b) Used Timer3 * '**************************************************************** Define INTHAND _ClockCount ' Tell PBP Where the code starts on an interrupt Ticks VAR BYTE ' 1/100th of a second Seconds VAR BYTE Minutes VAR BYTE Hours VAR BYTE Days VAR WORD R0save VAR WORD R1save VAR WORD ZERO VAR BIT CountDown VAR BIT SecondsChanged VAR BIT MinutesChanged VAR BIT HoursChanged VAR BIT DaysChanged VAR BIT CountDown = 0 SecondsChanged = 1 MinutesChanged = 1 Goto OverElapsed ' ------------------------------------------------------------------------------ Asm TimerConst = 45537 ; 100Hz ; ----------------- ADD TimerConst to TMR3H:TMR3L 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 TMR3H:TMR3L and restart Timer3 RELOAD_TIMER macro ADD2_TIMER BSF T3CON,TMR3ON ; 1 ; Turn Timer3 back on CHK?RP PIR4 bcf PIR4, TMR3IF ; Clear Timer3 Interrupt Flag endm ; ----------------- Load TimerConst into TMR3H:TMR3L LOAD_TIMER macro EndAsm T3CON.0 = 0 ; Turn OFF Timer3 TMR3L = 0 TMR3H = 0 Asm ADD2_TIMER endm EndAsm ' ------[ This is the Interrupt Handler ]--------------------------------------- ClockCount: ' Note: this is being handled as an ASM interrupt @ RELOAD_TIMER ; Reload Timer3 R0save = R0 ; Save 2 PBP system vars that are used during R1save = R1 ; the interrupt Ticks = Ticks + 1 if Ticks = 100 then Ticks = 0 IF CountDown THEN IF Seconds > 0 THEN Seconds = Seconds - 1 SecondsChanged = 1 IF Seconds = 0 THEN IF Days = 0 THEN IF Hours = 0 THEN IF Minutes = 0 THEN GOSUB StopTimer ; Zero reached ZERO = 1 ENDIF ENDIF ENDIF ENDIF ELSE IF Minutes > 0 THEN Minutes = Minutes - 1 Seconds = 59 SecondsChanged = 1 MinutesChanged = 1 ELSE IF Hours > 0 THEN Hours = Hours - 1 Minutes = 59 Seconds = 59 SecondsChanged = 1 MinutesChanged = 1 HoursChanged = 1 ELSE IF Days > 0 THEN Days = Days - 1 Hours = 23 Minutes = 59 Seconds = 59 SecondsChanged = 1 MinutesChanged = 1 HoursChanged = 1 DaysChanged = 1 ELSE ; Zero already reached, shouldn't get here GOSUB StopTimer ZERO = 1 ENDIF ENDIF ENDIF ENDIF ELSE ; Counting Up 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 ENDIF R1 = R1save ; Restore the PBP system vars R0 = R0save @ RETFIE ; Restore context and return from interrupt '-----====[ END OF TMR3 Interrupt Handler ]====--------------------------------- StartTimer: IF NOT ZERO THEN T3CLK = 1 ; clock source t3con = $20 ; prescaler PIR4.2 = 0 ; (TMR3IF) Clear Timer3 Interrupt Flag PIE4.2 = 1 ; (TMR3IE) Enable TMR3 overflow interrupt INTCON.6 = 1 ; (PEIE) Enable peripheral interrupts INTCON.7 = 1 ; (GIE) Enable global interrupts T3CON.0 = 1 ; (TMR3ON) Start Timer3 ENDIF return ; ----------------- StopTimer: T3CON.0 = 0 ; Turn OFF Timer3 return ; ----------------- ResetTime: ZERO = 0 R0save = T3CON.0 ; Save TMR3ON bit T3CON.0 = 0 ; Turn OFF Timer3 TMR3L = 0 TMR3H = 0 @ LOAD_TIMER ; Load TimerConst T3CON.0 = R0save ; Restore TMR3ON bit Ticks = 0 Seconds = 0 Minutes = 0 Hours = 0 Days = 0 SecondsChanged = 1 return OverElapsed:
Code:#CONFIG __config _CONFIG1, _FEXTOSC_OFF & _RSTOSC_HFINT32 & _CLKOUTEN_OFF & _CSWEN_OFF & _FCMEN_ON __config _CONFIG2, _MCLRE_ON & _PWRTE_OFF & _LPBOREN_OFF & _BOREN_ON & _BORV_LO & _ZCD_OFF & _PPS1WAY_OFF & _STVREN_ON & _DEBUG_OFF __config _CONFIG3, _WDTCPS_WDTCPS_11 & _WDTE_ON & _WDTCWS_WDTCWS_7 & _WDTCCS_LFINTOSC __config _CONFIG4, _WRT_OFF & _SCANE_available & _LVP_ON __config _CONFIG5, _CP_OFF & _CPD_OFF #ENDCONFIG DEFINE OSC 32 ANSELA = 0 TRISA = %11101111 INCLUDE "DLAPSED.PBP " ' Elapsed Timer Routines Days = 0 ' set initial time Hours = 0 Minutes = 1 Seconds = 0 ZERO = 0 GOSUB StartTimer Main: IF SecondsChanged THEN Lata.4 = !Lata.4 ' flash led on porta.4 SecondsChanged = 0 ENDIF GOTO Main end




Bookmarks