Hi Vladislav, hope you are having a nice day!
28 Июл 04, Vladislav Baliasov wrote to Alex Torres:
AT>> любому фронту.
VB> Может быть, так и ме было бы превильнее, хотя все равно не очень VB> понятно, как в этом случае определять смену направления и отсчитывать VB> щелчки в условиях дребезга и произвольной скорости.
А собственно, зачем вообще фильтровать дребезг? Если есть гаратия, что дребезг не возникнет по двум сигналам одновременно (т.е. на одном из фронтов дребезг еще не закончился, а на фронте второй фазы уже начался), то все промежуточные состояний не имеют значения, просто нужно ввести гистерезис на один шаг для выходного значения, если это допустимо по условиям задачи (получается "люфт" в 1/4 шага декодера).
Я использовал такой алгортим для для оптического декодера (подключен к PORTB пика, interrupt on change, однократное считывание порта, выборка значения приращения по таблице). Второй счетчик (выход функции) изменяется только в том случае, если его значение отличается больше чем на 1 единицу основного.
Еще был другой вариант: после прихода interrupt on change, оное запрещается и запускается таймер, с периодом в несколько раз меньшим интервала дребезга. По прерыванию таймера считывается порт, если это дребезг (колебания +-1), то ждем n-стаблиных (неменяющихся) отсчетов, после чего фиксируем изменения и снова разрешаем interrupt on change. Если при опросе по таймеру было два приращения подряд с одним знаком, то изменение фиксируем (значит скорость большая и отдребежать контакт не успевает) и снова продолжаем работать по таймеру, ожидая n-стабильных отсчетов.
В моем случае оба алгоритма вели себя достаточно хорошо, но первый проще.
WBR, AVB