Производительное чтение ADC у atMega328P

Обсуждаем цифровые устройства...
Ответить
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 36
Зарегистрирован: Чт июн 25, 2015 20:53:36

Сообщение Browny »

Уважаемые коты, очень нужна ваша помощь и опыт.
Есть необходимость обслуживать 8 кнопок, кнопки идут попарно, каждая вторая через резистор. Каждая пара кнопок "висит" на ADC1..ADC4 (A1..A4).

Очень хочется максимально "разгрузить" обработку кнопок, максимально увеличить производительность.
Как делаю: вешаю обработчик ISR(ADC_vect), выбираю ногу ADC1 с помощью ADMUX, запускаю прерывание. Жду прерывания, в обработчике читаю значение на ноге, меняю ногу на следующую, "взвожу" срабатывание прерывания (ADCSRA |= (1<<ADSC)). Таким образом циклически опрашиваю ноги A1..A4. Для каждой ноги в течение 5..10 циклов (настраивается макроопределением) накапливаю статистику значений (всего 3 значения: 1020 - нет нажатия, 66 - левая кнопка, 15 - правая кнопка). Конечно, учитываю небольшие отклонения +-5. Статистика - для отлавливания дребезга, который довольно ощутим. После прохождения N циклов и накопления статистики, беру индекс из максимума от накопленной статистики. То есть сколько было значений 1020, сколько 66, сколько 15. На основании этого принимаю решение, какая кнопка нажата. Затем всё повторяется по новой.

Что подсказывает ваш опыт, как лучше оптимизировать этот алгоритм? Будет ли быстрее работать вариант, если все ноги опрашивать последовательно, в едином вызове обработчика, после срабатывания прерывания на первой ноге (вместо циклического перебора с "взведением" нового прерывания для следующей ноги)?

Спасибо за ответ!
P.S. код, как только вылижу, выложу сюда. Пока весь грязный...
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4732
Зарегистрирован: Ср сен 18, 2013 10:08:26
Откуда: Санкт-Петербург

Сообщение Gisteresis »

Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 36
Зарегистрирован: Чт июн 25, 2015 20:53:36

Сообщение Browny »

Gisteresis, спасибо, но это подбор оптимальной аппаратной схемы под кнопки. В данном случае, аппаратное решение уже менять не буду, пишу код. Упреждая возмущение, мне не нужен готовый код - мне нужен совет, какой вариант выбрать, и два из них я написал: 1) обрабатывать по одной ноге за прерывание и инициировать новое прерывание на срабатывание ADC 2) словить обработку ADC по одной ноге и последовательно перебрать остальные 3 ноги прямо в обработчике прерывания
Может, есть ещё варианты, например, "повесить" чтение на таймер.

В общем, как будет дома время, я выложу пример кода, что уже есть.
Ответить

Вернуться в «Цифровая техника»