Hello, I am new to to this forum and am looking for help regarding timer issue. I am using a 18F4523 with a 4Mhz clock. Timer 0 is configured for 8 bit 1/64 prescaler (16.384ms/tick) which I am displaying hour:min:sec to LCD display. The problem is that the time is 52 seconds faster every minute. I have gone over the code umpteen times and do not no why it is acting as it is. The object of the program is to condition a device at a certain temperature for 3 days then test the device and continue for the next 5 days testing every day. See code for possible error.
Thanks mfsparkyCode:'Define LCD registers and bits DEFINE LCD_DREG PORTD DEFINE LCD_DBIT 4 DEFINE LCD_RSREG PORTE DEFINE LCD_RSBIT 0 DEFINE LCD_EREG PORTE DEFINE LCD_EBIT 1 low PORTE.2 pause 100 TRISB.0 = 1 ' Set PORTB bit 0 as input external pullups TRISB.1 = 1 ' Set PORTB bit 1 as input external pullups TRISB.2 = 1 ' Set PORTB bit 2 as input external pullups TRISB.3 = 0 ' Set PORTB bit 3 as output TRISB.4 = 0 ' Set PORTB bit 4 as output TRISB.5 = 0 ' Set PORTB bit 5 as output ' Set TMR0 to interrupt every 16.384 milliseconds INTCON = $E0 ' Enable TMR0 interrupts TMR0IF var INTCON.2 ' Timer0 interrupt flag T0CON = $45 ' Set timer0 register - timer off, ' internal instruction clock, 1:64 prescale TMR0ON var T0CON.7 ' Timer0 on bit ' Timer 1 used to blink LEDs ' Set TMR1 to interrupt every 500 milliseconds T1CON = $31 ' Set prescaler to 1:8 and timer1 on TMR1IF var PIR1.0 ' Timer1 interrupt flag TMR1ON var T1CON.0 ' Timer1 on bit PIE1.0 = 1 ' Timer1 enabled TMR1H = $0B ' preset for timer1 MSB register TMR1L = $DC ' preset for timer1 LSB register TMR1IF = 0 ' Clear timer1 interrupt flag ADCON1 = $0F ' Set channels all digital '---------------------------Declare Variables----------------------------------- reset_pb var PORTB.0 ' 4.7K external pullup resistor Reset button cycle_pb var PORTB.1 ' 4.7K external pullup resistor Inc Cycle button alarm_in var PORTB.2 ' 4.7K external pullup resistor Alarm indication done_LED var PORTB.3 ' Done indication LED cond_LED var PORTB.4 ' Condition LED alrm_LED var PORTB.5 ' Alarm from temperature controller LED hour Var byte ' Define hour variable minute Var byte ' Define minute variable second Var byte ' Define second variable ticks Var byte ' Define pieces of seconds variable for timer0 ticks1 var byte ' Define pieces of seconds variable for timer1 update Var bit ' Define variable to indicate update of LCD i Var byte ' Debounce loop variable cond_days var byte ' Days of conditioning = 60 cycles var byte ' Test cycles = 10 do_once var bit ' Only do one time flag do_once1 var bit ' Only do one time flag ready var bit ' Flag for cycles push button ready counts var byte ' Counter for alarms hr var bit ' Flag to indicate 24hrs has passed timer1 var bit ' Flag to blink LED's hour = 0 ' Reset hour minute = 0 ' Reset minute second = 0 ' Reset second low done_LED ' Turn off LED low cond_LED ' Turn off LED low alrm_LED ' Turn off LED update = 1 ' Set to update LCD display do_once = 0 ' Reset flag do_once1 = 0 ' Reset flag counts = 0 ' Reset flag read 100, cond_days ' Load condition days from memory read 101, cycles ' Load cycles from memory On Interrupt Goto ISR ' Jump to interrupt service routine main: if reset_pb = 0 then ' Reset button pressed cond_days = 0 cycles = 0 second = 0 minute = 0 hour = 0 low done_LED low cond_LED low alrm_LED do_once = 0 ' Flag for temp in range do_once1 = 0 ' Flag for temp out of range update = 1 endif If update = 1 Then ' Check for time to update screen INTCON = $00 ' No interrupts during lcdout write lcdout,$FE,1 lcdout,$FE,$C0," ",dec2 hour, ":",dec2 minute,":",dec2 second lcdout,$FE,$94," CONDITION DAYS: ",dec cond_days lcdout,$FE,$D4," TEST CYCLES: ", dec cycles update = 0 ' Screen updated INTCON = $E0 ' Enable interrupts Endif if cycles = 5 and cond_days = 8 then ' Condition for 3 days and TMR0ON = 0 ' cycle for 5 = 8 total days TMR1ON = 0 INTCON = $00 low cond_led high done_led goto main endif if alarm_in = 0 then if do_once1 = 0 then ' Temperature out of range TMR0ON = 0 ' Turn off timer0 TMR1ON = 0 ' Turn off timer1 high alrm_LED low done_LED low cond_LED do_once = 0 do_once1 = 1 endif endif if alarm_in = 1 then ' Temperature in range if do_once = 0 then T0CON = $C5 ' Turn on timer 0, 8 bit, 1/64 prescaler TMR1ON = 1 ' Turn on timer 0 TMR1IF = 0 ' Clear timer 0 interrupt flag low alrm_LED do_once = 1 do_once1 = 0 endif endif if hr = 1 then if do_once = 1 then T0CON = $25 cond_days = cond_days + 1 write 100,cond_days second = 0 minute = 0 hour = 0 do_once = 0 if cond_days > 3 then ready = 1 ' change according to test requirement endif hr = 0 endif if cond_days > 3 and cycles < 6 then ' Change according to test requirements if ready = 1 then ' 24 hours passed ready for cycle T0CON = $25 ' Set timer0 register - timer off, internal instruction clock, 1/64 prescale if cycles < 6 then ' Change according to test requirements if cycle_pb = 0 then gosub Debounce cycles = cycles + 1 write 101, cycles second = 0 minute = 0 hour = 0 low done_LED do_once = 0 ready = 0 update = 1 endif endif endif endif if timer1 = 1 then if cond_days < 9 then ' Change according to test requirements if ready = 1 then low cond_led else toggle cond_LED endif endif if cond_days > 3 and cycles < 6 then ' Change according to test requirements if ready = 1 then toggle done_LED endif endif timer1 = 0 endif goto main ' Interrupt routine to handle each timer tick Disable ' Disable interrupts during interrupt handler ISR: if TMR0IF = 1 then ticks = ticks + 1 ' Count pieces of seconds If ticks < 61 Then tiexit ' 61 ticks per second (16.384ms per tick) ticks = 0 ' One second elasped - update time second = second + 1 If second > 59 Then minute = minute + 1 second = 0 If minute > 59 Then minute = 0 hour = hour + 1 if hour >= 24 then hr = 1 ' Set flag 24hrs passed endif endif update = 1 ' Set to update LCD endif if TMR1IF = 1 then timer1 = 1 TMR1H = $0B ' preset for timer1 MSB register TMR1L = $DC ' preset for timer1 LSB register TMR1IF = 0 endif resume tiexit: TMR0IF = 0 ' Reset timer interrupt flag TMR0H = $00 TMR0L = $00 resume debounce: For i = 1 to 25 Pause 10 ' 10ms at a time so no interrupts are lost Next i Resume end




Bookmarks