Quick Timer Question

So we set up a timer to trigger an interrupt every time it overflows. However, I could not get OpenTimer1(), ReadTimer1(), etc. to work, so we had to manually set up the timer.

My question is, how do I get the timer to overflow faster? Right now it overflows 3 or 4 times per loop.

Timer setup code:

T1CONbits.T1CKPS0 = 1; // 1:8 Prescale (clock=1.25MHz/each tick=800ns)
T1CONbits.T1CKPS1 = 1;

T1CONbits.TMR1CS = 0; // = 0 Timer uses internal clock
TMR1H = 0x85; // Sets most significant byte
TMR1L = 0xED; // Sets least significant byte
T1CONbits.TMR1ON = 1; // Turns on Timer1
IPR1bits.TMR1IP = 0; // Sets Timer1 as low priority
PIE1bits.TMR1IE = 1; // Enables Timer1 overflow interrupt
INTCONbits.GIEL = 1; // Enables low priority interruptions

You need to store a new value in TMR1H and TMR1L each time you service the interrupt. That value counts up every tick until it overflows and triggers the interrupt again. To make it happen faster, use a larger number to start with.

0x85ED is 34825 decimal, giving 31251 ticks until it overflows at 65536. At 800 ns per tick, that’s 25 milliseconds. If you want to drop that to 5 milliseconds, you need 6250 ticks. Store 59286 in the timer, 0xE796.

Great, thanks alot! You also answered another question I had regarding the amount of time per tick (800 ns). Thanks!

Here’s an example of using the library calls.
In User_Initialization() (user_routines.c)


OpenTimer1(TIMER_INT_ON &
	 T3_16BIT_RW &
	 T3_SOURCE_INT &
	 T3_PS_1_8);
 
// #ticks = elapsed_time(sec) * 10**7 / prescale 
// #ticks = .004sec * 10**7 / 8 #ticks = 5000
// Maximum for 16-bit 65535 - 5000 (4ms) = 60535
 
WriteTimer1(60535); /* Preload timer to overflow after 4ms */

In InterruptHandlerLow () (user_routines_fast.c)


if (PIR1bits.TMR1IF) /* TIMER 1 INTERRUPT */
{
   PIR1bits.TMR1IF = 0; // clear the interrupt flag
   WriteTimer1(60535); /* Reset Timer to overflow in 4ms */
}