avr-gcc-list
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[avr-gcc-list] OVF3 Causes Reset?


From: Kevin Neff
Subject: [avr-gcc-list] OVF3 Causes Reset?
Date: Mon, 17 Jan 2005 14:26:58 -0600 (CST)

I want a timer to interrupt my program periodically.  Below is the code
for the interrupt hadler and the code that initilizes the timer.

To debug this code I am using an LED.  After a hard reset, the LED stays
on for 8 seconds.  It is turned off at the end of the configuration
function and stays off until the interrupt trips (~15 sec), at which
point the LED turns on for 8 seconds.  My interpretation is that the
configuration function is called again, which is only possible if the
MCU is reset.

Any ideas on how to fix this?


----------



void configure_timer()
{

  // LED on
  DDRF = B0;
  PORTF = B0;
  delay( 8000 );
                                                                                
  // write high byte first, writing the low byte latches data
  TCNT3H = TIME_SLICE_LEN_H;
  TCNT3L = TIME_SLICE_LEN_L;
                                                                                
  // Enable timer interrupt.
  TIMSK  = 0;
  ETIMSK = B2;
                                                                                
  // Configure Timer/Counter #3 for normal mode.  The timer increments
  // and the counter is not cleared, it just overflows at 0xFFFF and
  // continues at 0x0000.  TOV3 is set when TCCR3A = TCCR3B = 0.
  //
  // To configure the timer in normal mode, WGMn3..0 must be set to zero.
  // WGMn3 and WGMn2 can be found in bits 4 and 3 of TCCRnB.  WGMn1 and
  // WGMn1 can be found in bits 1 and 0 of TCCRnA.
  TCCR3A = 0;
  TCCR3B = 0;

  // Configure clock source for timer.  The clock source can be set using
  // CS2..0, which can be found as bits 2, 1, and 0 of TCCRnB.
  //
  // Timer is on after this operation is executed.
  TCCR3B |= B2 | B0;
                                                                                
  // enable global interrupts
  sei();
            
  // LED off                                                                    
  PORTF = 0;
  delay( 1000 );
}




extern volatile uint8_t TIME_SLICE;
                                                                                
SIGNAL( SIG_OVERFLOW3 )
{
  // LED on
  PORTF = PINF | B0;
                                                                                
  // write high byte first, writing the low byte latches data
  TCNT3H = TIME_SLICE_LEN_H;
  TCNT3L = TIME_SLICE_LEN_L;
                                                                                
  if(  TIME_SLICE == SECTION1  )
    TIME_SLICE = SECTION2;
                                                                                
  else if(  TIME_SLICE == SECTION2  )
    TIME_SLICE = SECTION3;
                                                                                
  else if(  TIME_SLICE == SECTION3  )
    TIME_SLICE = SECTION1;
 
  // LED off
  PORTF = PINF & b0;
}





reply via email to

[Prev in Thread] Current Thread [Next in Thread]