Вот тебе код, который задает таймер на каждые 160 тактов. Правда в реальности по-моему не 160, а 159-161 такт. В среднем получается ровно 160.
Только я тебе говорю - пробовать надо на других скоростях - выстави таймер 60 раз в секунду. Для этого надо исправить
TCCR2B |= (1<<CS21) | (1<<CS20) | (1<<CS22);
чтобы делитель был 1024
и tcnt2=0 - чтобы считал до 256. Получится 16 000 000 / 1024/256=61 герц и экспериментируй. А потом уже можно будет оптимизировать для работы с реальной скоростью.
Просто 160 тактов - на обработку прерывания с серьезным дерганием ногами - очень мало.
Код:
#define tcnt2 251
void setup(void)
{
TIMSK2 &= ~(1<<TOIE2); //разрешения прерывания по переполнению таймера/счетчика Т2
TCCR2A &= ~((1<<WGM21) | (1<<WGM20));// Режим работы таймера/счетчика
TCCR2B &= ~(1<<WGM22);// Режим работы таймера/счетчика
ASSR &= ~(1<<AS2); //Выбор источника синхронизации таймера если AS2=0 от системного генератора
TIMSK2 |= (1<<TOIE2);//Разрешение прерывания по переполнению Т2.
TCCR2B &= ~(1<<CS22); // эта и следующая строка задает таймер увеличение TCNT2 каждые 32 такта.
TCCR2B |= (1<<CS21) | (1<<CS20);
// tcnt2 = 251; 32 такта делителя * (256-251)=160 тактов. То есть каждые 10 мкс.
TCNT2 = tcnt2;
sei();
}
ISR(TIMER2_OVF_vect)
{
TCNT2 = tcnt2; // это вызывается каждые 160 тактов процессора.
}