Юрий_СВ (22.07.2013 17:11, просмотров: 226) ответил zeleny на не совсем понятна логика вашего прерывания. Вот мой вариант (под Ардуино-Мега8), пока никаких заскоков не замечено:
Логика перывания такая : Т.к. захваты происходят редко (реже, чем раз за период) - обрабатываю захват по флагу захвата в прерывании по переполнению таймера.
Главная проблема - понять к какому периоду таймера (значению tacho.cnt_high) относится захваченное значение.
Дальше немного запутаней...
Ещё надо учитывать непостоянство времени входа в прерывание.
Если есть захват при 1-й проверке, то смотрю на текущее состояние таймера (icap->tcnt_1).
Если захват из нового периода - он должен быть меньше значения таймера.
Иначе он из старого периода (tacho.cnt_high-1).
Но если вход в текущее прерывание затянется, а вход в предыдущее произошёл быстрее, то можно перепутать и принять захват из прошлого периода (произошедший сразу после 1-й проверки) за захват в новом периоде.
Для этого есть 2-я проверка захвата.
Ранний захват прошлого периода будет обслужен 2-й проверкой.
А значит захват после 2-й проверки предыдущего периода будет иметь гарантировано большее значение, чем захват до 1-й проверки нового периода.