Помогите с таймером2 в CTC внутри Atmega8

Обсуждаем контроллеры компании Atmel.
Ответить
Qwq
Встал на лапы
Сообщения: 87
Зарегистрирован: Пт ноя 02, 2007 18:18:26
Контактная информация:

Помогите с таймером2 в CTC внутри Atmega8

Сообщение Qwq »

начал пробовать - какая то фигня настроил в стс, в оср2 записал зачение, а таймер умудряется каким-то макаром улететь TIMER2_OVF_vect

Вот код :

Код: Выделить всё

#define F_CPU 8000000 //8 мгц

#include <avr/io.h>
#include <avr/interrupt.h>


#define Timer2IntON TIMSK|= (1<<OCIE2|1<<TOIE2);//set bits
#define Timer2IntOFF TIMSK&= ~(1<<OCIE2|1<<TOIE2);//clear bits

unsigned char Coffs[3]={0,};

void Timer2Setup(void)
{
  //запустит таймер2 на клоке1, по совпадению с 200 тогда период таймера будет равен 10^-5 = 25 микросекунд

Coffs[1] = 0;
Coffs[2] = 0;
  OCR2 = 199; //нужно 200 тиков, счет с 0

  TCCR2 = 0;
  TCCR2 |= ( 0 << WGM20 | 0 << COM21 | 0 << COM20 | 1 << WGM21 | 0 << CS22 | 0 << CS21 | 1 << CS20);
  /*
  //FOC2 = 0
  //WGM20 = 0 + WGM21 =1 |CTC mode
  //COM21 = 0  \
  //COM20  = 0 | port disconnected
  //WGM21 = 1
  //CS22 =0
  //CS21 =0
  //CS20=1 //CPU clock
  */
  //теперь разрешим от него прерывания
  Timer2IntON

}

ISR( TIMER2_OVF_vect )
{
   Coffs[1]++;
   //готово TODO: обработать эксепшен сюды я попасть не должен!
}
ISR( TIMER2_COMP_vect )
{
Coffs[2]++;
}

int main(void)
{
       Timer2Setup(); //setup timer2 //считает отрезки по 25 микросекунд

       sei();

      char a = 0;

       while (1)
       {
         
         if (a <250)
         {
            a++;
         }
      else {
         a = 0;
      }
         
      }
}

что я сделал не так?
Аватара пользователя
Enigm
Говорящий с текстолитом
Сообщения: 1663
Зарегистрирован: Вт апр 03, 2012 20:36:41
Откуда: Сочи

Re: Помогите с таймером2 в CTC внутри Atmega8

Сообщение Enigm »

Qwq
Встал на лапы
Сообщения: 87
Зарегистрирован: Пт ноя 02, 2007 18:18:26
Контактная информация:

Re: Помогите с таймером2 в CTC внутри Atmega8

Сообщение Qwq »

Enigm писал(а):Вам в помощь http://trolsoft.ru/ru/calc#AvrTimer8

Посчитан то он правильно.
Гугление и эксперименты привели меня к выводу что overflow срабатывает в момент когда в счетном регистре возникает 0.соответственно ести у нас есть прерывание по совпадению то одновременно будет обрабатываться переполнение(сначала совпадение, потом переполнение).
Ответить

Вернуться в «AVR»