Обработчик ДПКВ
Posted: 21 Sep 2015, 10:18
В общем ситуация такая:
В релизе за 14 год в файле CKPS.c имитация пропущенных зубьев делается на таймере 0.
Есть там вот такие строки:
Так вот если значение low byte = 0, т.е в TCNT0 записывается значение 255, то у меня протеус 7,7 моделирует срабатывание прерывания по переполнению аж на следующий раз, т.е через 256 тиков таймера 0.
Если TCNT0 = 254; - то все нормально.
Написал уже прошивку на асме для тестирования таймера - в АВР студии такого пропуска нет. В протеусе есть.
Вот не совсем пойму документацию, вроде как если писать в TCNT0, то сравнения по следующему такту игнорируется:
All CPU write operations to the TCNT0 Register will block any compare match that occur in the
next timer clock cycle, even when the timer is stopped. This feature allows OCR0 to be initialized
to the same value as TCNT0 without triggering an interrupt when the Timer/Counter clock is
enabled.
Еще не ясен мне момент - зачем обнулять таймер если он и так только что обнулился аппаратно?
В релизе за 14 год в файле CKPS.c имитация пропущенных зубьев делается на таймере 0.
Есть там вот такие строки:
Code: Select all
void set_timer0(uint16_t value)
{
TCNT0_H = _AB(value, 1);
TCNT0 = ~(_AB(value, 0)); //One's complement is faster than 255 - low byte
Если TCNT0 = 254; - то все нормально.
Написал уже прошивку на асме для тестирования таймера - в АВР студии такого пропуска нет. В протеусе есть.
Вот не совсем пойму документацию, вроде как если писать в TCNT0, то сравнения по следующему такту игнорируется:
All CPU write operations to the TCNT0 Register will block any compare match that occur in the
next timer clock cycle, even when the timer is stopped. This feature allows OCR0 to be initialized
to the same value as TCNT0 without triggering an interrupt when the Timer/Counter clock is
enabled.
Еще не ясен мне момент - зачем обнулять таймер если он и так только что обнулился аппаратно?
Code: Select all
ISR(TIMER0_OVF_vect)
{
if (TCNT0_H!=0) //Did high byte exhaust (ñòàðøèé áàéò íå èñ÷åðïàí) ?
{
TCNT0 = 0; // кажись лишнее?
--TCNT0_H;
}