Аналоговые кнопки... Схема уже была выше, но выложе щё раз всё вместе.
Порт натраивается таким образом, чтобы в исходном состоянии на выходе было Z-состояние. Это сделано для того, чтоы работали и обычные кнопки, т.е. тиня им не мешала. Значит подтяжки на кнонках оставляем, но на схеме их нет - они есть на основной схеме.
Далее, считаем "коды" кнопок исходя из входного напряжения. Получается не совсем точно, т.к. реальные измерения дают другой результат. Итого получилась такая таблица:
Рекомендую после сборки померять напряжение на входе тиньки и пересчитать по формуле: code = U * 1023 / 5. Где 5 - напряжение питания. Как видно из таблицы ошибка при измерении получается всего 2-3 единицы. Ошибка установленная в программе -плюс/минус 20. Это сделано и на компенсацию температурного коэфициента сопротивлений и на сопротивление линий.
Прошивка в прикреплённых файлах.
Используется массив значений (по умолчанию 3) в который каждые 20 мс записывается новое значение с АЦП (по очереди - типа FIFO). Далее проверяется отличие всех значений на удвоенную ошибку. Если отклонение меньше, то значит на входе устоявшееся напряжение. Далее проверяем, входит ли полученное значение в коридор (+- ошибка) какого-нибудь кода кнопки. Если входит, то переводим выход в нулевое состояние и удерживаем, пока код попадает в корридор. Тем самым можно обрабатывать и длительные нажатия в самом КК. Подавление дребезга - 60мс.
В том же архиве, в папке EXE есть HEX для прошивки, но рекомендую собрать схему, померять полученные значения и забить их в исходник и скомпилировать (CodeVisionAVR v2.05.3). Фьюзы прописаны в проекте (установлены, т.е. равны "0" CKSEL1, SUT0, остальные не установлены, т.е. = "1")
Дэвайс проверен в железе. Только БОД не включен, т.к. включенный и настроенный на 4,3В он держал тиньку постоянно в ресете. С этим надо разобраться. И осталось подключить его вместо кнопок и попробовать, успеет ли он стартонуть раньше, чем АТмега и отработать нажатую кнопку при включении питания...
UPD: поменял прошивку и теперь берётся 3 значения через 10мс. Итого 30мс - антидребезг.