Здравствуйте! Помогите разобраться. Подключил к тини2313 матрицу 4х4 кнопки. подтягивающие резисторы внутренние, выходы притянуты к нулю, входы к плюсу. диодов нет. При нажатии кнопки происходит прерывание PCINT0-5(в зависимости от кнопки), затем по очереди устанавливаю каждую строку в лог1 и проверяю значение столбца. Так вот когда подключен программатор все работает отлично, а когда отключен контроллер через 1-3 нажатия перезагружается. в чем может быть проблема? вот исходник:
решил проблему. во время обработки складывалась очередь прерываний. судя по всему изза дребезга контактов. добавил в конец функции EIFR=0x20(перед глобальным разрешением прерываний) и все заработало
rush писал(а):решил проблему. во время обработки складывалась очередь прерываний. судя по всему изза дребезга контактов. добавил в конец функции EIFR=0x20(перед глобальным разрешением прерываний) и все заработало
Жаль на обработку клавы тратить прерывания. Кроме того, прерывания нужно стараться использовать как можно меньше.
прерывания нужно использовать как можно больше, что бы не отвлекать силы процессора на отслеживание событий в основном цикле. Но использовать прерывания нужно правильно. Например завести таймер и по прерыванию выставлять флаг (скажем каждые 5mSec), в основном цикле по этому флагу опрашивать клавиатуру и инкрементировать счетчик по факту нажатия кнопки, если досчитал до 3-4, значит 15-20mSec уверенного контакта кнопки, можно принимать решение, что кнопка нажата.
s64 писал(а):прерывания нужно использовать как можно больше, что бы не отвлекать силы процессора на отслеживание событий в основном цикле. Но использовать прерывания нужно правильно. Например завести таймер и по прерыванию выставлять флаг (скажем каждые 5mSec), в основном цикле по этому флагу опрашивать клавиатуру и инкрементировать счетчик по факту нажатия кнопки, если досчитал до 3-4, значит 15-20mSec уверенного контакта кнопки, можно принимать решение, что кнопка нажата.
да так, но не так часто ставить флаг, через 20-30mSec достаточно и отсекать одинаковые нажатия т.е. реагировать на изменение.
а если прерывание то его и запрещать на теже 20-30mSec. но проблема наверно в том что надо внешние резисторы на 5-10 кОм
s64 писал(а):прерывания нужно использовать как можно больше, что бы не отвлекать силы процессора на отслеживание событий в основном цикле.
Коллега, Вам не кажется, что в этом предложении первая часть противоречит второй? Если контроллер будет постоянно висеть в обработчиках прерываний, на главный цикл не останется времени!
А вот про флаговый автомат Вы правильно говорите. Достаточно завести один таймер, установить пару-тройку флагов - и вперёд.
s64 писал(а): но проблема наверно в том что надо внешние резисторы на 5-10 кОм
Нет, не в резисторах. И если уж делать клаву на прерываниях (хотя повторяю - это неверно), то параллельно кнопкам нужно ставить керамику на 0,1 uF - это будет аппаратное подавление дребезга. Или в обработчике PCINT первой командой ставить запрет этого же прерывания, а после выхода разрешать - это будет программное подавление дребезга.
программа в главном цикле долшна спать, просыпатся по прерываниям, отрабатывать флаги и дальше спать
про резистор, ток через кнопку долшен быть достаточный чтоб различать состояния
за 5mSec пройдет любой дребезг если кнопка нормальная, а прерывание запрещать не до конца обработчика,а на некоторое время.
А то он этот дребезг и будет обрабатывать.
Про конденсатор тоже в учебнике написано?
с емкостью линии обычно наоборот борются.
Сколько вы думаете, работает обработчик прерывания?
2-3 микро именно микросекунд, а 5 микросекунд это 40 тактов при 8МГц,
выходите вы из обработчика и тут через 10 или 100, даже через 1000 (1милисекунду) дребезг, в любом случае это лишний раз отвлекаться.
Спать или не спать это Ваше дело, кнопки на прерываниях нужны только чтобы будить контроллер, и то из состояния глубокого сна.
А если он не спит, просто опрашивать через интервал и все.
Теперь, если все флаги сброшены то у вас пустой цикл, который не чего не делает, жрет такты процессора и электроэнергию, подсуньте такую программу виндовсу - даже мышь перестанет шевелиться.
Про ток: в любой замкнутой цепи течет ток, даже если он несколько микроампер
если линия подтянута резистором к питанию, и прижать ее к земле кнопкой, то через нее потечет ток, а если сопротивление будет большое, то линия будет реагировать не только на кнопку, но и на "вспышки на солнце".
Уважаемый BVS! Мне жалко своего времени на дискуссию с Вами ни о чём. Вы не только не хотите читать учебники, но и на этом форуме не освоили элементарных основ из обучалки.
Нескромный вопрос - сколько Вам лет?