|
Прерывания от кнопок |
|
|
|
Jan 20 2005, 16:39
|
Группа: Новичок
Сообщений: 11
Регистрация: 20-01-05
Пользователь №: 2 086

|
Есть в семействе AVR чип которого можно разбудить изменением лог. уровня на входе порта? Реально есть 4 кнопки, нужно чтобы контроллер впадал в спячку при отпускании кнопки и завершении операции и соотв. будился при нажатии любой кнопки. В 2313 есть только два входа внешнего прерывания что маловато. Можно подвесить что-нибудь снаружи, но теряется кайф использования микроконтроллера.
|
|
|
|
|
Jan 20 2005, 17:05
|

Участник

Группа: Новичок
Сообщений: 18
Регистрация: 21-12-04
Из: С-Петербург
Пользователь №: 1 584

|
Обычные четырехногие кнопки для пайки на плату имеют 2 замыкаемых/размыкаемых по нажатию контакта. Используй одну пару ног, как определение нажатой кнопки на любой вход. Другую пару контактов соедини впослед у всех кнопок и заведи на вход прерывания. Можешь разбить кнопки на две группы и подключить к двум ногам прерываний. Удачи.
--------------------
"Лучше один хороший гвоздь, чем десять плохих микросхем..."
|
|
|
|
|
Jan 20 2005, 17:21
|
Группа: Новичок
Сообщений: 11
Регистрация: 20-01-05
Пользователь №: 2 086

|
Цитата(RayDen @ Jan 20 2005, 20:05) Обычные четырехногие кнопки для пайки на плату имеют 2 замыкаемых/размыкаемых по нажатию контакта. Используй одну пару ног, как определение нажатой кнопки на любой вход. Другую пару контактов соедини впослед у всех кнопок и заведи на вход прерывания. Можешь разбить кнопки на две группы и подключить к двум ногам прерываний. Удачи. Об этом я думал. Но ситуация такая, что неизвестно какие попадутся кнопки (устройство будет в автомобиле пыхтеть, затем и sleep, чтобы greenpeace не возмущался  ). Вариант - поставить элемент 4ИЛИ, но имхо некрасиво. Группы кнопок это хорошо, понатыкать диодов для шифратора, но опять-таки некрасиво. А вот прерывание непосредственно от кнопки с порта - вот это было бы изящно. Есть среди AVR-ов такой контроллер.
|
|
|
|
|
Jan 20 2005, 20:24
|

Частый гость
 
Группа: Свой
Сообщений: 86
Регистрация: 13-06-04
Из: Minsk
Пользователь №: 29

|
Цитата(over @ Jan 20 2005, 19:39) Есть в семействе AVR чип которого можно разбудить изменением лог. уровня на входе порта? Реально есть 4 кнопки, нужно чтобы контроллер впадал в спячку при отпускании кнопки и завершении операции и соотв. будился при нажатии любой кнопки. В 2313 есть только два входа внешнего прерывания что маловато. Можно подвесить что-нибудь снаружи, но теряется кайф использования микроконтроллера. Такая возможность есть у ... ну, скажем так, чипов поновее. Например, Tiny26 и все меги. И даже заказать - по фронту, спаду или изменению.
|
|
|
|
|
Jan 21 2005, 12:05
|

Частый гость
 
Группа: Свой
Сообщений: 146
Регистрация: 4-11-04
Из: Московская область
Пользователь №: 1 040

|
Цитата(over @ Jan 20 2005, 20:21) Но ситуация такая, что ..устройство будет в автомобиле пыхтеть.... Для автомобиля, с его помехами, предложение пустить кучу кнопок на прерывания представляется мне не слишком удачным. Уж лучше использовать одно прерывание от таймера и от него опрашивать кнопки. Полагаю, ~10 мСек вполне подойдет.
--------------------
- ЗАМЕНЯТЬ ДЕТАЛИ НА ХОДУ ВОСПРЕЩАЕТСЯ !!! -
|
|
|
|
|
Jan 21 2005, 14:56
|

Частый гость
 
Группа: Свой
Сообщений: 146
Регистрация: 4-11-04
Из: Московская область
Пользователь №: 1 040

|
Цитата(over @ Jan 20 2005, 19:39) Реально есть 4 кнопки... прерывания .. А, чуть не забыл ! Повесить "дребезг контактов" на прерывание - это КРУТО ! А четыре дребезга на четыре прерывания - это вообще "до отказа КРУТО" !!!
--------------------
- ЗАМЕНЯТЬ ДЕТАЛИ НА ХОДУ ВОСПРЕЩАЕТСЯ !!! -
|
|
|
|
|
Jan 24 2005, 14:19
|
Местный
  
Группа: Свой
Сообщений: 252
Регистрация: 29-12-04
Пользователь №: 1 728

|
Цитата(over @ Jan 20 2005, 20:39) Есть в семействе AVR чип которого можно разбудить изменением лог. уровня на входе порта? Реально есть 4 кнопки, нужно чтобы контроллер впадал в спячку при отпускании кнопки и завершении операции и соотв. будился при нажатии любой кнопки. В 2313 есть только два входа внешнего прерывания что маловато. Можно подвесить что-нибудь снаружи, но теряется кайф использования микроконтроллера. На самом деле все очень просто: Одну из двух ног всех 4-х или более кнопок цепляешь на какие-нибудь свободные ноги микроконтроллера и подтягиваешь эти ноги к плюсу через резисторы (лучше внешние). Оставшиеся ноги кнопок цепляешь к земле. На выводах кнопок, которые подключены к микроконтроллеру, делаешь "логическое и" (диод от кажной кнопки анодом к выводу прерывания MCU, вывод прерывания подтягиваешь к единице) Вход внешнего прерывания программируешь для срабатывания по уровню логического нуля. Подобная схема включения позволит, кроме всего прочего, отслеживать нажатие нескольких кнопок одновременно. По поводу дребезга: после пробуждения опрашивай состояние кнопок, скажем, через 100 или 200 мс и всего делов  По поводу применения 2313 в автоэлектроннике (из личного опыта): абсолютно неблагодарное занятие - схема будет самопроизвольно перезапускаться от любой помехи (даже от разряда статики на корпус авто). Причем это полностью не исключить никакими схемотехническими ухищрениями (ну, если только будешь использовать гальваническую развязку по питанию и по всем входам-выходам). Все это определяется особенностями реализации самого MCU. Благоразумнее использовать последние версии чипов, например, мегу8.
|
|
|
|
|
Jan 28 2005, 20:18
|
Группа: Новичок
Сообщений: 11
Регистрация: 20-01-05
Пользователь №: 2 086

|
Всё прочитал. Благодарю. Особенно Trid. Попробую отчитаюсь.
|
|
|
|
|
Jan 29 2005, 18:01
|
Группа: Новичок
Сообщений: 11
Регистрация: 20-01-05
Пользователь №: 2 086

|
Есть вопрос по алгоритму защиты от дребезга контактов. Я поразмыслил и вижу два варианта: Начинается с выводом МК из спячки нажатием на любую кнопку. Дребезг контактов в цифре представляет собой последовательность нулей и единиц с преобладанием первых (активный уровень у нас нуль). 1. Запускаем таймер, выдаются прерывания каждые, скажем 50 мс, поверяем все 4 кнопки, как только находим на какой-то из них нуль делаем вывод о нажатии. 2. Запускаем таймер как и в предыдущем пункте, проводим 50 итераций. Для каждой кнопки считаем общее количество нулей и единиц отдельно. Затем подытоживаем. При превышении количества нулей над единицами, скажем в три раза, делаем вывод о нажатии. На практике кто какой алгоритм использовал? Есть какие-то другие варианты?
|
|
|
|
|
Jan 29 2005, 18:29
|
Местный
  
Группа: Свой
Сообщений: 464
Регистрация: 1-10-04
Из: Челябинск
Пользователь №: 751

|
Я делаю так. По внешнему прерыванию от нажатия кнопки проц просыпается и считывает код нажатой клавиши, снимает внешнее прерывание и запускает таймер на 250мс и производит какие то действия по обработке реакции на однократное нажатие, по прерыванию переполнения таймера считываем код нажатой клавиши, если код тот же - то считаю вторым нажатием (чтоб пользователь не мацал клаву и не портил себе нервы) и опять заряжаем таймер на 250 мс производим соответствующие действия по обработке 2 - х кратного нажатия и т.д. - считаем все многократным нажатием. Если при очередном переполнении таймера код считанной кнопки изменился то это идет как первое нажатие другой клавиши. Если же при прерывании таймера нет нажатой клавиши, то опять производим какие то действия (засыпаем, обрабатываем что вызвалось нажатием клавиши и т.п.). Все просто. А 250 мс - это засело со времен института, вроде как оптимальное время сканирования клавиатуры. Если устройство критично к потреблению, то можно сделать чтоб проц сам себе управлял питанием. Т.е. - нажали кнопку - подали питание - по прерыванию RESET он оживился и обработал клаву как написано выше, после чего сам себе отрубил питание.. При работе с ЖКИ и клавиатурой бывает удобна идея системного таймера, когда один таймер формирует сетку частот на сканирование клавы и на вывод в ЖКИ (если использовать порт с ЖКИ только на вывод, не считывая его бит состояния).
|
|
|
|
|
Jan 29 2005, 19:03
|
Группа: Новичок
Сообщений: 11
Регистрация: 20-01-05
Пользователь №: 2 086

|
[q]проц просыпается и считывает код нажатой клавиши[/q] А может так оказаться, что мы считываем уровень, а вместо нуля получится единица из-за дребезга и тогда облом, кнопка не будет воспринята сразу, и через 250 мс, с меньшей вероятностью, но также может считаться единица вместо нуля, полсекунды холостого простоя многовато. Может время поменьше установить. Кстати, ATTiny 2313 точно имеет режим пробуждения по изменению уровня в порту. Может на нём и сделаю. Хотя у меня завалялся один 2313 из старой серии. И ATTiny13 также имеет этот режим. ATTiny11/12 в документации без подробностей по прерываниям.
|
|
|
|
|
Jan 29 2005, 19:32
|
Местный
  
Группа: Свой
Сообщений: 464
Регистрация: 1-10-04
Из: Челябинск
Пользователь №: 751

|
Дребезг появляется в момент нажатия / размыкания кнопки, в момент удержания - он маловероятен, если же конечно Вы не используете отечественные силовые кнопки с огромным усилием нажатия. Первое нажатие клавиши фиксируется по внешнему прерыванию, возникает дребезг от замыкания пластины с контактами внутри клавиши, мы входим в прерывание и запрещаем его, запускаем таймер (на дребезг нам делается все равно, а за 250 мс он угомонится) и продолжаем опрос по таймеру через 250 мс, для определения вторичного нажатия (если имеет место быть удержание клавиши). Как определили что клаву мацать закончили (при очередном прерывании нет повтора нажатой кнопки), то опять разрешаем внешнее прерывание. И все по новому циклу, ждем внешнее прерывание. Для устранения эффекта притормаживания устройства при быстром наборе, в каждом прерывании по таймеру надо смотреть на нажатие новой клавиши, те новый прочитаный код совпал с прошлым кодом или нет. Если нет, то определяется нажатие другой кнопки. Время 250 - это на любителя, за 50 - не каждый успеет палец убрать. Реально я делал время сканирования в пределе 200 - 300 мс, работало аж самому нравилось как.
|
|
|
|
|
Feb 3 2005, 12:21
|
Участник

Группа: Свой
Сообщений: 68
Регистрация: 2-02-05
Из: Россия
Пользователь №: 2 377

|
Я устраняю дребезг следующим образом: организуется вспомогательный счетчик(например 128), опрашивается вход с какой-то дискретностью, при 1 увеличиваю счетчик, при 0 соответсвенно уменьшаю на 1, после чего решаю по превышению счетчиком определнной границы имеется ли-что то на входе, причем замечу границу не обязательно делать посередине, надо смотреть в зависимости от предназначения.
|
|
|
|
|
Feb 4 2005, 17:26
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 2-02-05
Пользователь №: 2 385

|
Цитата(over @ Jan 20 2005, 19:39) Есть в семействе AVR чип которого можно разбудить изменением лог. уровня на входе порта? Реально есть 4 кнопки, нужно чтобы контроллер впадал в спячку при отпускании кнопки и завершении операции и соотв. будился при нажатии любой кнопки. В 2313 есть только два входа внешнего прерывания что маловато. Можно подвесить что-нибудь снаружи, но теряется кайф использования микроконтроллера. Многие AVR имеют прерывание по изменению состояния выводов.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|