Время переполнения Timer2 на Atmega328P.
- Войдите на сайт для отправки комментариев
Чт, 19/12/2019 - 14:18
Добрый день.
Разбираюсь с таймерами на arduino. Для тестов использую arduino nano. Как основную инструкцию использую статью на хабре. Согласно формулам указанным в статье делаю расчет за сколько должен переполнится таймер и сработать перываение. Расчетные значения не совпадают с реальными показателями при установленных делителях: 64, 256, 1024. Замеры делаю с помощью DSO138(Может он показывает не правду?!). Почему так проиходит? Может кто проверить результаты на своем оборудовании и с нормальным осциллографом?
Значения CS12,CS11,CS10 нужно раскомментировать в зависимости от тестируемого делителя.
Используемый код для тестирования:
void setup() { pinMode(7, OUTPUT); cli(); TCCR2A = 0; TCCR2B = 0; //TCCR2B |= (1<<CS12); //TCCR2B |= (1<<CS11); //TCCR2B |= (1<<CS10); TIMSK2 |= (1<<TOIE2); sei(); } void loop() { // put your main code here, to run repeatedly: } ISR(TIMER2_OVF_vect){ digitalWrite(7, !digitalRead(7)); }
не вижу где вы включаете прерывание по переполнению?
Вот этой строчкой TIMSK2 |= (1<<TOIE2). Ориентировался по таблице.
Кажется разобрался. Я выставлял не правильные значения делителей. Смотрел в таблицу для Timer1.
Надо было настраивать по этой для Timer2.
DSO138 - нормальный прибор для такой работы. Даже не думайте.
Вот такая программа отлично работает (в т.ч. и на DSO138)
Пока писал, Вы, похоже, уже сами разобрались.
Спасибо за enum. Элегантное решение получается. :)
Кроме делителей ещё TCNT2 не занулялось, digitalWrite() оверхедил...
Про digitalWrite я понимал, но вот изначально выставлять таймер в 0. Даже не задумывался про это. Спасибо.
В данном случае оно, может и не важно, но если по ходу пьесы останавливать/стартовать таймер, то можно получить неожиданный результат. TCNT сам при старте не зануляется, продолжает тикать в том же режиме, как и перед остановкой: