Цитата(Anjey_N @ Nov 14 2007, 12:49)

Вопрос такой:
В системе стоит механический валкодер. Опрашиваю его я вот так
Суть вопроса вот какая. Частота опроса входного сигнала должна быть минимум вдвое больше его частоты с которой он изменяется. Это очевидный факт. Но реализовать это в случае
многократного пересечения валкодером края одной метки, когда он колеблется возле этого самого края сложно...
И не нужно!. Тем более, если валкодер обрабатывается аппаратным прерыванием (к вопросу о том как прибору сделать "DoS" путём перепиливания тупой ножёвкой жгута проводов...)
Решение, вкратце таково: алгоритм модифицируется таким образом, что при прохождении края какой-либо метки в одном направлении её прохождение в обратном направлении попросту не фиксируется (запрещается прерывание, например). А фиксируется только прохождение следующего края метки в том же направлении (+1 к позиции) или прохождение не только что пройденного, а предшествующего ему края метки в обратном направлении (-2 к позиции). Может смутно объяснил. Советую просто расписать код Грея в круге и тогда легко будет понять как это работает, и что для реализации алгоритма достаточно запретить (допустим, валкодер имеет два выхода) прерывание от того выхода, который вызвал вот прямо сейчас прерывание -- т.е. поочерёдно разрешается прерывание от первого или второго выхода.
Алгоритм полностью решает проблему "дребезга", когда валкодер колеблется на краю метки (быстрая смена +1, -1, +1, -1...) -- не имея возможности его, валкодер, опрашивать с достаточно большой частотой можно потерять в точности, или же, используя прерывания легко заблокировать весь микроконтроллер исключительно в процессе обработки прерываний от валкодера. С описанным алгоритмом подобных проблем нет.