Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прерывания от кнопок
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
over
Есть в семействе AVR чип которого можно разбудить изменением лог. уровня на входе порта? Реально есть 4 кнопки, нужно чтобы контроллер впадал в спячку при отпускании кнопки и завершении операции и соотв. будился при нажатии любой кнопки. В 2313 есть только два входа внешнего прерывания что маловато. Можно подвесить что-нибудь снаружи, но теряется кайф использования микроконтроллера.
RayDen
Обычные четырехногие кнопки для пайки на плату имеют
2 замыкаемых/размыкаемых по нажатию контакта.
Используй одну пару ног, как определение нажатой кнопки на любой вход.
Другую пару контактов соедини впослед у всех кнопок и заведи на вход
прерывания.
Можешь разбить кнопки на две группы и подключить к двум ногам прерываний.
Удачи.
over
Цитата(RayDen @ Jan 20 2005, 20:05)
Обычные четырехногие кнопки для пайки на плату имеют
2 замыкаемых/размыкаемых по нажатию контакта.
Используй одну пару ног, как определение нажатой кнопки на любой вход.
Другую пару контактов соедини впослед у всех кнопок и заведи на вход
прерывания.
Можешь разбить кнопки на две группы и подключить к двум ногам прерываний.
Удачи.
*

Об этом я думал. Но ситуация такая, что неизвестно какие попадутся кнопки (устройство будет в автомобиле пыхтеть, затем и sleep, чтобы greenpeace не возмущался smile.gif). Вариант - поставить элемент 4ИЛИ, но имхо некрасиво.
Группы кнопок это хорошо, понатыкать диодов для шифратора, но опять-таки некрасиво. А вот прерывание непосредственно от кнопки с порта - вот это было бы изящно. Есть среди AVR-ов такой контроллер.
nml
Цитата(over @ Jan 20 2005, 19:39)
Есть в семействе AVR чип которого можно разбудить изменением лог. уровня на входе порта? Реально есть 4 кнопки, нужно чтобы контроллер впадал в спячку при отпускании кнопки и завершении операции и соотв. будился при нажатии любой кнопки. В 2313 есть только два входа внешнего прерывания что маловато. Можно подвесить что-нибудь снаружи, но теряется кайф использования микроконтроллера.
*

Такая возможность есть у ... ну, скажем так, чипов поновее. Например, Tiny26 и все меги. И даже заказать - по фронту, спаду или изменению.
halfdoom
Цитата(over @ Jan 20 2005, 20:39)
Есть в семействе AVR чип которого можно разбудить изменением лог. уровня на входе порта?.
*

Конечно есть, самый маленький tiny11/12, как раз на четыре кнопки.
-Tумблер-
Цитата(over @ Jan 20 2005, 20:21)
Но ситуация такая, что ..устройство будет в автомобиле пыхтеть....
*


Для автомобиля, с его помехами, предложение пустить
кучу кнопок на прерывания представляется мне
не слишком удачным.
Уж лучше использовать одно прерывание от таймера
и от него опрашивать кнопки. Полагаю, ~10 мСек вполне
подойдет.
smile.gif
KRS
В Atiny2313 есть же Pin Change Interrupt
-Tумблер-
Цитата(over @ Jan 20 2005, 19:39)
Реально есть 4 кнопки...  прерывания ..
*


А, чуть не забыл !
Повесить "дребезг контактов" на прерывание - это КРУТО !
А четыре дребезга на четыре прерывания - это вообще "до отказа КРУТО" !!!
biggrin.gif
sseett
Как вариант - использовать АЦП (всего 1 вывод), а клаву сделать виде делителя напряжения. Фильтровать от автомобильных помех RC (или LC) цепью на входе АЦП и/или программно.
Камень из осьминогов: Tiny13 или15 . Если надо больше ног: Tiny26, mega48/8/88…
Удачи!
halfdoom
Цитата(-Tумблер- @ Jan 21 2005, 18:56)
Повесить "дребезг контактов" на прерывание - это КРУТО !
А четыре дребезга на четыре прерывания - это вообще "до отказа КРУТО" !!!
biggrin.gif
*

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


На самом деле все очень просто:
Одну из двух ног всех 4-х или более кнопок цепляешь на какие-нибудь свободные ноги микроконтроллера и подтягиваешь эти ноги к плюсу через резисторы (лучше внешние). Оставшиеся ноги кнопок цепляешь к земле. На выводах кнопок, которые подключены к микроконтроллеру, делаешь "логическое и" (диод от кажной кнопки анодом к выводу прерывания MCU, вывод прерывания подтягиваешь к единице)
Вход внешнего прерывания программируешь для срабатывания по уровню логического нуля.
Подобная схема включения позволит, кроме всего прочего, отслеживать нажатие нескольких кнопок одновременно.
По поводу дребезга:
после пробуждения опрашивай состояние кнопок, скажем, через 100 или 200 мс и всего делов smile.gif
По поводу применения 2313 в автоэлектроннике (из личного опыта):
абсолютно неблагодарное занятие - схема будет самопроизвольно перезапускаться от любой помехи (даже от разряда статики на корпус авто). Причем это полностью не исключить никакими схемотехническими ухищрениями (ну, если только будешь использовать гальваническую развязку по питанию и по всем входам-выходам). Все это определяется особенностями реализации самого MCU.
Благоразумнее использовать последние версии чипов, например, мегу8.
over
Всё прочитал. Благодарю. Особенно Trid. Попробую отчитаюсь.
over
Есть вопрос по алгоритму защиты от дребезга контактов.
Я поразмыслил и вижу два варианта:
Начинается с выводом МК из спячки нажатием на любую кнопку. Дребезг контактов в цифре представляет собой последовательность нулей и единиц с преобладанием первых (активный уровень у нас нуль).
1. Запускаем таймер, выдаются прерывания каждые, скажем 50 мс, поверяем все 4 кнопки, как только находим на какой-то из них нуль делаем вывод о нажатии.
2. Запускаем таймер как и в предыдущем пункте, проводим 50 итераций. Для каждой кнопки считаем общее количество нулей и единиц отдельно. Затем подытоживаем. При превышении количества нулей над единицами, скажем в три раза, делаем вывод о нажатии.
На практике кто какой алгоритм использовал? Есть какие-то другие варианты?
Stas
Я делаю так. По внешнему прерыванию от нажатия кнопки проц просыпается и считывает код нажатой клавиши, снимает внешнее прерывание и запускает таймер на 250мс и производит какие то действия по обработке реакции на однократное нажатие, по прерыванию переполнения таймера считываем код нажатой клавиши, если код тот же - то считаю вторым нажатием (чтоб пользователь не мацал клаву и не портил себе нервы) и опять заряжаем таймер на 250 мс производим соответствующие действия по обработке 2 - х кратного нажатия и т.д. - считаем все многократным нажатием. Если при очередном переполнении таймера код считанной кнопки изменился то это идет как первое нажатие другой клавиши. Если же при прерывании таймера нет нажатой клавиши, то опять производим какие то действия (засыпаем, обрабатываем что вызвалось нажатием клавиши и т.п.). Все просто. А 250 мс - это засело со времен института, вроде как оптимальное время сканирования клавиатуры. Если устройство критично к потреблению, то можно сделать чтоб проц сам себе управлял питанием. Т.е. - нажали кнопку - подали питание - по прерыванию RESET он оживился и обработал клаву как написано выше, после чего сам себе отрубил питание.. При работе с ЖКИ и клавиатурой бывает удобна идея системного таймера, когда один таймер формирует сетку частот на сканирование клавы и на вывод в ЖКИ (если использовать порт с ЖКИ только на вывод, не считывая его бит состояния).
over
[q]проц просыпается и считывает код нажатой клавиши[/q]
А может так оказаться, что мы считываем уровень, а вместо нуля получится единица из-за дребезга и тогда облом, кнопка не будет воспринята сразу, и через 250 мс, с меньшей вероятностью, но также может считаться единица вместо нуля, полсекунды холостого простоя многовато. Может время поменьше установить.
Кстати, ATTiny 2313 точно имеет режим пробуждения по изменению уровня в порту. Может на нём и сделаю. Хотя у меня завалялся один 2313 из старой серии. И ATTiny13 также имеет этот режим. ATTiny11/12 в документации без подробностей по прерываниям.
Stas
Дребезг появляется в момент нажатия / размыкания кнопки, в момент удержания - он маловероятен, если же конечно Вы не используете отечественные силовые кнопки с огромным усилием нажатия. Первое нажатие клавиши фиксируется по внешнему прерыванию, возникает дребезг от замыкания пластины с контактами внутри клавиши, мы входим в прерывание и запрещаем его, запускаем таймер (на дребезг нам делается все равно, а за 250 мс он угомонится) и продолжаем опрос по таймеру через 250 мс, для определения вторичного нажатия (если имеет место быть удержание клавиши). Как определили что клаву мацать закончили (при очередном прерывании нет повтора нажатой кнопки), то опять разрешаем внешнее прерывание. И все по новому циклу, ждем внешнее прерывание. Для устранения эффекта притормаживания устройства при быстром наборе, в каждом прерывании по таймеру надо смотреть на нажатие новой клавиши, те новый прочитаный код совпал с прошлым кодом или нет. Если нет, то определяется нажатие другой кнопки. Время 250 - это на любителя, за 50 - не каждый успеет палец убрать. Реально я делал время сканирования в пределе 200 - 300 мс, работало аж самому нравилось как. blush.gif
Пришелец
Нормально работает опрос 1 раз в 50 мс (с нормальными кнопками).

Если код изменился (и !=0) то считается новое нажатие.
smile.gif
sav6622
Я устраняю дребезг следующим образом: организуется вспомогательный счетчик(например 128), опрашивается вход с какой-то дискретностью, при 1 увеличиваю счетчик, при 0 соответсвенно уменьшаю на 1, после чего решаю по превышению счетчиком определнной границы имеется ли-что то на входе, причем замечу границу не обязательно делать посередине, надо смотреть в зависимости от предназначения.
veter
у меня реализовано следующее:

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


Многие AVR имеют прерывание по изменению состояния выводов.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.