Перейти к содержанию
    

Прерывания от кнопок

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Обычные четырехногие кнопки для пайки на плату имеют

2 замыкаемых/размыкаемых по нажатию контакта.

Используй одну пару ног, как определение нажатой кнопки на любой вход.

Другую пару контактов соедини впослед у всех кнопок и заведи на вход

прерывания.

Можешь разбить кнопки на две группы и подключить к двум ногам прерываний.

Удачи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Обычные четырехногие кнопки для пайки на плату имеют

2 замыкаемых/размыкаемых по нажатию контакта.

Используй одну пару ног, как определение нажатой кнопки на любой вход.

Другую пару контактов соедини впослед у всех кнопок и заведи на вход

прерывания.

Можешь разбить кнопки на две группы и подключить к двум ногам прерываний.

Удачи.

Об этом я думал. Но ситуация такая, что неизвестно какие попадутся кнопки (устройство будет в автомобиле пыхтеть, затем и sleep, чтобы greenpeace не возмущался :)). Вариант - поставить элемент 4ИЛИ, но имхо некрасиво.

Группы кнопок это хорошо, понатыкать диодов для шифратора, но опять-таки некрасиво. А вот прерывание непосредственно от кнопки с порта - вот это было бы изящно. Есть среди AVR-ов такой контроллер.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Такая возможность есть у ... ну, скажем так, чипов поновее. Например, Tiny26 и все меги. И даже заказать - по фронту, спаду или изменению.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть в семействе AVR чип которого можно разбудить изменением лог. уровня на входе порта?.

Конечно есть, самый маленький tiny11/12, как раз на четыре кнопки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но ситуация такая, что ..устройство будет в автомобиле пыхтеть....

 

Для автомобиля, с его помехами, предложение пустить

кучу кнопок на прерывания представляется мне

не слишком удачным.

Уж лучше использовать одно прерывание от таймера

и от него опрашивать кнопки. Полагаю, ~10 мСек вполне

подойдет.

:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Реально есть 4 кнопки...  прерывания ..

 

А, чуть не забыл !

Повесить "дребезг контактов" на прерывание - это КРУТО !

А четыре дребезга на четыре прерывания - это вообще "до отказа КРУТО" !!!

:biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как вариант - использовать АЦП (всего 1 вывод), а клаву сделать виде делителя напряжения. Фильтровать от автомобильных помех RC (или LC) цепью на входе АЦП и/или программно.

Камень из осьминогов: Tiny13 или15 . Если надо больше ног: Tiny26, mega48/8/88…

Удачи!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Повесить "дребезг контактов" на прерывание - это КРУТО !

А четыре дребезга на четыре прерывания - это вообще "до отказа КРУТО" !!!

:biggrin:

Да оно не так страшно как кажется, ведь по прерыванию нужно только

разбудить контроллер, а затем идет стандартный опрос по таймеру.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

На самом деле все очень просто:

Одну из двух ног всех 4-х или более кнопок цепляешь на какие-нибудь свободные ноги микроконтроллера и подтягиваешь эти ноги к плюсу через резисторы (лучше внешние). Оставшиеся ноги кнопок цепляешь к земле. На выводах кнопок, которые подключены к микроконтроллеру, делаешь "логическое и" (диод от кажной кнопки анодом к выводу прерывания MCU, вывод прерывания подтягиваешь к единице)

Вход внешнего прерывания программируешь для срабатывания по уровню логического нуля.

Подобная схема включения позволит, кроме всего прочего, отслеживать нажатие нескольких кнопок одновременно.

По поводу дребезга:

после пробуждения опрашивай состояние кнопок, скажем, через 100 или 200 мс и всего делов :)

По поводу применения 2313 в автоэлектроннике (из личного опыта):

абсолютно неблагодарное занятие - схема будет самопроизвольно перезапускаться от любой помехи (даже от разряда статики на корпус авто). Причем это полностью не исключить никакими схемотехническими ухищрениями (ну, если только будешь использовать гальваническую развязку по питанию и по всем входам-выходам). Все это определяется особенностями реализации самого MCU.

Благоразумнее использовать последние версии чипов, например, мегу8.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть вопрос по алгоритму защиты от дребезга контактов.

Я поразмыслил и вижу два варианта:

Начинается с выводом МК из спячки нажатием на любую кнопку. Дребезг контактов в цифре представляет собой последовательность нулей и единиц с преобладанием первых (активный уровень у нас нуль).

1. Запускаем таймер, выдаются прерывания каждые, скажем 50 мс, поверяем все 4 кнопки, как только находим на какой-то из них нуль делаем вывод о нажатии.

2. Запускаем таймер как и в предыдущем пункте, проводим 50 итераций. Для каждой кнопки считаем общее количество нулей и единиц отдельно. Затем подытоживаем. При превышении количества нулей над единицами, скажем в три раза, делаем вывод о нажатии.

На практике кто какой алгоритм использовал? Есть какие-то другие варианты?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я делаю так. По внешнему прерыванию от нажатия кнопки проц просыпается и считывает код нажатой клавиши, снимает внешнее прерывание и запускает таймер на 250мс и производит какие то действия по обработке реакции на однократное нажатие, по прерыванию переполнения таймера считываем код нажатой клавиши, если код тот же - то считаю вторым нажатием (чтоб пользователь не мацал клаву и не портил себе нервы) и опять заряжаем таймер на 250 мс производим соответствующие действия по обработке 2 - х кратного нажатия и т.д. - считаем все многократным нажатием. Если при очередном переполнении таймера код считанной кнопки изменился то это идет как первое нажатие другой клавиши. Если же при прерывании таймера нет нажатой клавиши, то опять производим какие то действия (засыпаем, обрабатываем что вызвалось нажатием клавиши и т.п.). Все просто. А 250 мс - это засело со времен института, вроде как оптимальное время сканирования клавиатуры. Если устройство критично к потреблению, то можно сделать чтоб проц сам себе управлял питанием. Т.е. - нажали кнопку - подали питание - по прерыванию RESET он оживился и обработал клаву как написано выше, после чего сам себе отрубил питание.. При работе с ЖКИ и клавиатурой бывает удобна идея системного таймера, когда один таймер формирует сетку частот на сканирование клавы и на вывод в ЖКИ (если использовать порт с ЖКИ только на вывод, не считывая его бит состояния).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

[q]проц просыпается и считывает код нажатой клавиши[/q]

А может так оказаться, что мы считываем уровень, а вместо нуля получится единица из-за дребезга и тогда облом, кнопка не будет воспринята сразу, и через 250 мс, с меньшей вероятностью, но также может считаться единица вместо нуля, полсекунды холостого простоя многовато. Может время поменьше установить.

Кстати, ATTiny 2313 точно имеет режим пробуждения по изменению уровня в порту. Может на нём и сделаю. Хотя у меня завалялся один 2313 из старой серии. И ATTiny13 также имеет этот режим. ATTiny11/12 в документации без подробностей по прерываниям.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...