View Single Post
  #1   Spotlight this post!  
Unread 15-03-2004, 13:33
roknjohn roknjohn is offline
Registered User
#1051
Team Role: Engineer
 
Join Date: Jan 2003
Location: Marion
Posts: 31
roknjohn is an unknown quantity at this point
Timer interrupt hic-cupping - HELP

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.