Цитата(mempfis_ @ May 15 2012, 01:13)

Моё мнение что проблема в параметрах входного фильтра - кажется завышена тау RC-цепочки и слишком затянут задний фронт.
Мне тоже так кажется. Входной фильтр должен быть, во-первых, линейным, а во-вторых, он должен фильтровать только то, что не может отфильтровать цифровой фильтр. Поэтому частота среза аналогового фильтра напрямую завязана с частотой взятия выборок, чем реже вы берете выборки - тем более инерционным должен быть аналоговый фильтр. А частота выборок зависит от того, как вы их берете. Если через АЦП (что для вашей задачи абсолютно бессмысленно), то выборки вам поневоле приходится брать редко, а затем тратить кучу времени на обработку ненужной информации.
Для такой задачи АЦП надо выбросить и забыть как страшный сон. Выборки надо брать компаратором, коим с успехом может служить цифровой вход микроконтроллера. Сответственно, тогда выборки можно брать намного чаще, скажем, раз в 100мкс, а требования к частоте среза аналогового фильтра, соответственно, снижаются.
Цитата(mempfis_ @ May 15 2012, 01:13)

Поначалу думал просто фиксировать состояния пинов в массив и если весь массив конкретного пина == 1 то вход в 1, и наоборот - если весь массив == 0 то вход в 0. Но тогда пришлось бы запоминать какое текущее состояние пина чтобы знать что мы ожидаем - заполнение нулями или еденицей.
Не надо ничего "ожидать". Заведите выходную переменную, эквивалент RS-триггера, которая хранит результат обработки. Если весь массив (т.е. сдвиговый регистр) единицы - устанавливаете выходную переменную в 1, если все нули - устанавливаете в 0. Куда уж проще.
Если хотите, то можете рассматривать этот алгоритм как доведенный до предельного упрощения медианный фильтр.
Цитата(mempfis_ @ May 15 2012, 01:13)

С медианным фильтром всё проще. Сохраняю текущее значение всех пинов в массив на место самого старого. Обнуляю переменную текущего состояния пинов, сколько пинов столько раз выполняю сортировку массива по возрастанию для каждого пина (массив копируется в промежуточный буффер с наложенной маской пина на каждый элемент, потом сортируется и возвращается средний элемент промежуточного буффера который содержит отфильтрованное состояние пина). Делаю OR переменной текущего состояния пинов с результатом фильтрации. И всё.
Вы мне живо напомнили некого студента, который задачу "определить, четное число или нечетное" решал так: завел два массива по миллиону слов, при инициализации заполнил их от счетчика по очереди, в один массив - четные, во второй - нечетные; для определения четное или нечетное число производил скоростной поиск сначала в одном массиве, затем в другом, если находил число - выдавал результат, если не находил - выдавал ошибку.