Дело понемногу продвигается. Написал промежуточную (тестовую) программу распознавания факта нажатия с фильтрацией помех. Но под конец голова была уже ватная, поэтому при опробовании даже не удивился, что не заработало (скорее удивился бы если бы заработало). Лёг спать. На следующий день, начал её переосмысливать и понял, что написал я её в принципе криво, проще новую написать, чем эту до ума доводить. Ну и алгоритм несколько изменил.
И даже полностью есть понимание как её написать.
Но тут вылез один (ага тысячи их были, так что не один, а очередной) подводный камень.
Дело вот в чём. Программа на данной стадии использует два таймера, для разных целей, с разными прерываниями и разными обработчиками. Один таймер используется для алгоритма дешифрации, второй для неотносящегося к нему процесса. И нежелательно, чтобы эти таймеры как-то друг на друга влияли. Даже более того, было бы хорошо, если бы во время обработки одного прерывания, могло бы сработать прерывание от другого таймера (правда если это критично растянет время обработки, то может выйти косяк).
Теперь кусок кода:
ldi r16,0b00000001;Заносим в регистр маску
in r17,TIMSK ;считываем в другой регистр текущие настройки таймеров
or r17,r16 ;ставим нужный бит не изменяя остальных
out TIMSK,r17 ;разрешаем прерывание при переполнении таймера
;(сбрасываем таймер)
Так вот, разрешая прерывание, тем самым сбрасываю таймер. При этом делаю это так чтобы другие биты (в данном случае нужен 0-й и только он) не изменились. А всё потому, что 6-й бит отвечает за другой таймер ! И вроде бы всё нормально... однако терзают меня смутные сомненья. Да конечно, значение бита в конечном итоге не изменится, но ! Но его туда всё равно записываю (хоть и то-же самое). Так вот, вопрос, просто по самому факту записи, другой таймер не сбросится ли ?
PS Речь о ATmega16
PPS Да... простой вопрос, а нафлудил...