Убрал цикл из майна - результат тот же.
Попробовал вынести все вычисления в обработчик внешнего прерывания, убрав т.о. все возможные неоднозначности. Тоже самое.
Например если в обработчике сделать так
if(PIND & 0b01000000)
{
channel_start[2] = t; // Старт импульса
channel_end[1] = t; // Стоп импульса
channel[1] = channel_end[1] - channel_start[1];
if(channel[1]>1995) channel[1] = 1995; // ПРОБЛЕМНОЕ МЕСТО
return;
}
if(PIND & 0b00100000)
{
channel_start[3] = t; // Старт импульса
channel_end[2] = t; // Стоп импульса
channel[2] = channel_end[2] - channel_start[2];
return;
}
То один канал где нет проверки будет нормально работать, а где есть значение будет скакать от текущего к максимуму.
Буду копать дальше, но пока вообще не понятно почему так происходит. Причем число можно поставить любое, например if(channel[1]>65000) channel[1] = 1995; результат тот же. Это условие иногда срабатывает, хотя это невозможно.