Обсуждаем контроллеры компании Atmel.
Ответить

[Решено]TIMER1 - прерывание по совпадению

Вс сен 02, 2012 14:42:49

Добрый день, Форумчане! Помогите пожалуйста разобраться с таймером1. Необходимо после отлавливания внешнего прерывания INT0 запустить таймер1 с прерыванием по совпадению. Период таймера от 200 до 20000. Внешнее прерывание я отлавливаю и запускаю таймер1, но прерывания нет, хотя таймер тикает и при совпадении обнуляется и идет дальше по кругу - в отладчике смотрел...Помогите найти, где я накосячил...Работаю в avr studio, мк atmega16. Вот код:
Код:
void INCUBATOR_Init()
{
   //TIME_Init();
   
   DDRB  &= (1 << 0) | (1 << 1);
   PORTB |= (1 << 0) | (1 << 1);
   
   DDRC |= (1 << 0);
   PORTC &= ~(1 << 0);
   
   DDRD  &= ~(1 << 2);
   PORTD |= (1 << 2);
   
   GICR  |= (1 << INT0); //разрешили прерывание
   MCUCR = 0x00;
   
   SREG |= (1 << 7);
}
//----------
ISR(INT0_vect)
{
   if(!enableZeroCross)
   {
      enableZeroCross = true;
      
      OCR1A   = delay_dimmer; // Значение для сравнения
      TCNT1   = 0;     // счетчик в ноль
      TCCR1B |= (1 << CS10) | ( 1<< WGM12);  // без предделителя и режим СТС по совпадению
      TIMSK  = (1 << OCIE1A); // Разрешить прерывание при совпадении TCNT1 и OCR1A
   }
}
//----------
ISR(TIMER1_COMPA_vect)
{
   if(enableZeroCross)
   {
      TCNT1 = 0;
      TCCR1B = 0x00;
      
      PORTC |= (1 << 0); // включить симмистор
      _delay_us(50);
      PORTC &= ~(1 << 0);
      enableZeroCross = false;   
   }
}
Ответить