Уважаемые коты, очень нужна ваша помощь и опыт.
Есть необходимость обслуживать 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. код, как только вылижу, выложу сюда. Пока весь грязный...
Есть необходимость обслуживать 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. код, как только вылижу, выложу сюда. Пока весь грязный...
