Trying to set up a 32-bit 10Mhz timer...
I initialized Timer1 like this:
Code:
volatile unsigned int tmsClock = 0;
void Initialize_Timer_1(void)
{
TMR1L = 0x00;
TMR1H = 0x00;
T1CONbits.T1CKPS0 = 0; // 1:1 prescaler 10Mhz
T1CONbits.T1CKPS1 = 0;
T1CONbits.T1OSCEN = 0; // oscillator disabled
T1CONbits.TMR1CS = 0; // use the internal clock
T1CONbits.RD16 = 1; // timer 1 register operations are done in one 16-bit access
PIE1bits.TMR1IE = 1; // Enable interrupt on overflow
IPR1bits.TMR1IP = 0; // overflow interrupt is low priority
T1CONbits.TMR1ON = 1; // Timer 1 is enablED
}
void Timer_1_Int_Handler(void)
{
// this function will be called when a timer 1 interrupt occurs
tmsClock++;
}
The handler simply increments a 16-bit counter, every 0.00655 seconds, which rolls over every 429.49 seconds. Then, I wrote these functions to fetch the 32bit snapshot of the timer:
Code:
unsigned int GetTick(void) //Gets 16-bit timer value
{
unsigned char Temp_Buf; // 8-bit temporary buffer
unsigned int Timer_Snapshot; // 16-bit variable
Temp_Buf = TMR1L; // TMR1L must be read before TMR1H
Timer_Snapshot = TMR1H;
Timer_Snapshot <<= 8; // move TMR1H data to the upper half of the variable
Timer_Snapshot += Temp_Buf; // we now have all sixteen bits
return Timer_Snapshot;
}
unsigned long GetTime(void) //Gets 32-bit timer value
{
unsigned long ThisTick;
ThisTick=tmsClock;
ThisTick <<= 16; //Mutliply by 65536
ThisTick += GetTick(); //Add timer snapshot
return ThisTick;
}
Now GetTime() works as intended, except every second or two I get a strange (really large) value returned. Any ideas?
BTW: I discovered this error around 3:00am on ship day, which was wreaking havoc on our autonomuous code. Without a controller to test on, I haven't been able to trace the problem.