Проблема: При срабатывании внешнего прерывания запускается TIMER1, в регистр OCR1A загружается значение угла. Если значение нуле, то нет прерывания по совпадению при нуле. Начиная от единицы МК ведет себя корректно. Импульсы смотрю осциллографом. Притом, совершенно случайно заметил следующее, я выключил макетную плату и появились импульсы, пока было достаточное питание на МК. То есть, что получилось. Сработало внешнее прерывание, запустился TIMER1, и так как теперь нет перезапуска таймера следующим внешним прерыванием, то TIMER1 перевалил и сработало прерывание по совпадению при нуле.
Как победить? Пока решение только одно. Если значение нуль, то принудительно запускаем генератор пачки импульсов.
На картинке тестовая программа. В регистр совпадения принудительно загружается значение на 5 мс, то есть получается меандр из пачек импульсов.
Пока именно так и сделал, при нуле принудительно запускаю генератор пачек импульсов. Но мне хотелось бы понять, почему нет прерывания при нуле сразу после запуска TIMER1.
CODE
//========================================================================
#pragma inline = forced
void set_timer1_on (void)
{
if (opening_angle != 0)
{
set_bit (TIFR, OCF1A);
TCNT1 = 0;
OCR1A = opening_angle;
set_bit (TIMSK, OCIE1A);
set_bit (SFIOR, PSR10);
TCCR1B = (1<<CS11);
}
else
{
Start_10_kGz ();
}
}
#pragma inline = forced
void set_timer1_off (void)
{
clr_bit (TIMSK, OCIE1A);
TCCR1B = 0;
}
#pragma vector = TIMER1_COMPA_vect
__interrupt void TIMER1_COMPA_handler (void)
{
set_timer1_off ();
Start_10_kGz ();
}
//========================================================================