Страница 1 из 1

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

Добавлено: Ср фев 03, 2016 17:41:10
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;
		}
			
		}
}
что я сделал не так?

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

Добавлено: Чт фев 04, 2016 06:46:17
Enigm

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

Добавлено: Пт фев 05, 2016 04:23:18
Qwq
Enigm писал(а):Вам в помощь http://trolsoft.ru/ru/calc#AvrTimer8
Посчитан то он правильно.
Гугление и эксперименты привели меня к выводу что overflow срабатывает в момент когда в счетном регистре возникает 0.соответственно ести у нас есть прерывание по совпадению то одновременно будет обрабатываться переполнение(сначала совпадение, потом переполнение).