TIMER1 should be possible to still counting when the PIC is in SLEEP mode, but i dont get it to work.
I have modded DT Elapsed_INT18.bas to work with a second 32.768kHz crystal on T1OSO and T1OSI:
I am not 100% sure of the T1CON settings (red in the code)Code:'**************************************************************** '* Name : Elapsed_INT-18.bas * '* Author : Darrel Taylor * '* Date : JUL 11, 2006 * '* Version : 1.0 * '* Notes : Must have DT_INTS-18.bas loaded first * '**************************************************************** DISABLE DEBUG ; syntax = Handler IntSource, Label, Type, ResetFlag? DEFINE Elapsed_Handler TMR1_INT, _ClockCount, PBP, yes ; the above define can be used in the INT_LIST macro, if desired (optional) Seconds var byte Minutes var byte Hours var byte Days var word SecondsChanged var bit MinutesChanged var bit HoursChanged var bit DaysChanged var bit SecondsChanged = 1 MinutesChanged = 1 Goto OverElapsed ' ------------------------------------------------------------------------------ ' To calculate a constant for a different crystal frequency - see this web page ' http://www.picbasic.co.uk/forum/showthread.php?t=2031 ' ------------------------------------------------------------------------------ Asm TimerConst = 08000h ; For 32,768 kHz ; ----------------- ADD TimerConst to TMR1H:TMR1L ADD2_TIMER macro ; CHK?RP T1CON BCF T1CON,TMR1ON, 0 ; Turn off timer MOVLW LOW(TimerConst) ; 1 ADDWF TMR1L,F, 0 ; 1 ; reload timer with correct value 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 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 ]--------------------------------------- ClockCount: @ RELOAD_TIMER ; Reload TIMER1 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 @ INT_RETURN ; Restore context and return from interrupt '-----====[ END OF TMR1 Interrupt Handler ]====--------------------------------- StartTimer: T1CON.0 = 1 ; (TMR1ON) Start TIMER1 T1CON.1 = 1 ; (TMR1CS) Use External clock from RC0/T1OSO/T13CKI pin T1CON.2 = 1 ; (T1SYNC) Do not synchronize external clock input T1CON.3 = 1 ; (T1OSCEN) Disable External Oscillator T1CON.6 = 0 ; (T1RUN) Device clock is derived from another source 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 Seconds = 0 Minutes = 0 Hours = 0 Days = 0 SecondsChanged = 1 MinutesChanged = 1 HoursChanged = 1 DaysChanged = 1 return OverElapsed: ENABLE DEBUG
If i just send the data out without SLEEP via USART it works like a charm! But if i add:
@ SLEEP
HSEROUT [DEC2 Hours,DEC2 Minutes,DEC2 Seconds]
(WDT on, WDTPS = 128 in settings)
It don't work, i just get strange results like "Ò‚‚‚‚Ò‚‚‚‚Ò‚‚Ò‚S‚Ò‚‚Ò" in hypertrm
Any ideas?
It is PIC18F4550 and yes i have looked in the manual!




Bookmarks