Так и не дождался ответа.
Попробую развить мысль в одно лицо.
![Прикольно](images/smilies/icon_wink3.gif)
Картинка как раз для этого случая, воспользуемся.
![Нажмите на изображение для увеличения
Название: 480px-Счетчик_импульсов_реверсивный_режим_работы.jpg
Просмотров: 41
Размер: 20.5 Кб
ID: 46090](https://kazus.ru/forums/attachment.php?attachmentid=46090&thumb=1&d=1366623277)
Работаем по событиям (Events) на первом датчике, второй для контроля направления.
1) Простейший случай:
- положение 1, оба датчика освещены, на входах "0" (датчики замыкают на "землю");
- переход в положение 2, перекрывается датчик-1 и линия переходит в "1" - происходит Event posedge(положительный перепад). Проверяем датчик-2, на нем по прежнему "0" - значит происходит вращение вправо. Если бы было "1" - значит было бы вращение влево. Однозначно!
2)Чуть сложней, с подавлением дребезга:
- положение 1, оба датчика освещены, на входах "0" (датчики замыкают на "землю");
- переход в положение 2, перекрывается датчик-1 и линия переходит в "1" - происходит Event posedge(положительный перепад). Проверяем датчик-2, на нем по прежнему "0" - значит происходит вращение вправо. Запоминаем состояние датчика-2
в двух флагах (флаг-1 и флаг-2) и запускаем таймаут. Если в течение отсчёта таймаута произошло ещё одно такое же событие(положительный перепад) и состояние датчика-2 изменилось на противоположное (проверяем по флагу-2), то это однозначно интерпретируется как дрожание счётного механизма. Происходит перезапуск таймаута, сохранение положения датчика-2 только в флаг-2 и ожидание следующего события. Это действие может происходить сколь угодно большое количество раз - на работу устройства оно не оказывает совершенно никакого влияния. Если за время таймаута происходит ещё одно событие (уже третье), но состояние флага-2 и датчика-2 на этот раз совпали, то это следует интерпретировать как реверс счётного механизма. Выполняем инверсию флага-1 и делаем переход на анализ его состояния и исполнение описанного в следующем предложении.
Если же вышел таймаут до прихода следующего события, то анализируется флаг-1 и производятся необходимые действия в соответствии с логикой программы. Далее происходит сброс флагов и наступает ожидание следующего события.
В соответствии с таким алгоритмом работы счёт может выполняться на весьма высокой скорости, даже с резкой сменой направления, задержки появляются только при многократном "дрожании" счётного механизма.
Можно, конечно, анализировать все четыре состояния датчиков, но нужно ли?