Главная » Статьи » Полезная информация

Обработка большого количества кнопок на одном прерывании


 Используя в проектах большое количество кнопок, постоянно сталкиваюсь с проблемой нехватки количества внешних прерываний. Вроде выбрал подходящий по нафаршированности камень, есть все что надо - АЦП, 2 юарта, много флэша, а вот прерываний нехватает...
 Или чаще наоборот, небольшой проект, на который с лихвой хватит ресурсов tiny2313, и нужно обрабатывать много внешних событий (таких как нажатие на кнопки). Брать камень крупнее не спортивно, да и жалко когда ресурсы будут низачто простаивать :), поэтому был найден простой способ как, использовав всего один вход прерывания, обработать практически неограниченное количество кнопок.

 Суть метода в том, чтобы одним прерыванием фиксировать нажатие любой кнопки. А уже в обработчике прерывания просканировать и узнать какая именно кнопка была нажата.



Для примера вот небольшая схемка:







Диоды D1-D4 предназначены для того чтобы разделить кнопки между собой. Резисторы можно ставить номиналом по 4,7-10 кОм.


и тестовая программка для микроконтроллера

$regfile = "attiny2313.dat"
$crystal = 1000000
$baud = 1200

Dim W As Byte              'переменная с номером нажатой кнопки

'кнопки
Config Portb.= Input
Config Portb.= Input
Config Portb.= Input
Config Portb.= Input

Config Portd.= Output    'сюда подключается светодиод индикации
Portd.= 0

Config Int0 = Falling      'прерывание по нисходящему фронту
On Int0 Button
Enable Interrupts          'разрешаем прерывания
Enable Int0

'Основной цикл программы
Do

Print W                    'печатаем номер нажатой кнопки
= 0
Idle                       'и засыпаем

Loop

End

'обработчик прерывания
Button:
'здесь мы в цикле сканируем все подключенные кнопки
Do
 If Pinb.= 0 Then
  W = 1
 End If

 If Pinb.= 0 Then
  W = 2
 End If

 If Pinb.= 0 Then
  W = 3
 End If

 If Pinb.= 0 Then
  W = 4
 End If
Pulseout Portd , 6 , 2500  'мигнем светодиодом
Loop Until W <> 0          'если дребезг помешал вычислению нажатой кнопки, повторяем

Waitms 10
Gifr = 64                  'сброс флага прерывания

Return

 
 Светодиод на схеме не показан, из программы думаю ясно, что он подключается к ножке PortD.6


 В программе организован спящий режим микроконтроллера, из которого его можно вывести прижав вывод INT0 к земле. Это делается нажатием любой кнопки. В обработчике прерывания происходит сканирование портов МК к которым подключены кнопки и если на одном из них ноль - значит нажата эта самая кнопка. Дальше присваиваем некой переменной значение соответствующее нажатой кнопки, мигаем светодиодом и уходим в основной цикл, где печатаем номер кнопки и снова даем команду микроконтроллеру "уснуть".

 Номер кнопки в примере печатается в терминал на скорости 1200 бод.



 Как видно это очень простой способ, который подойдет под различные задачи. А поменяв немного алгоритм сканирования портов, можно организовать обработку одновременно нескольких кнопок. 



Категория: Полезная информация | Добавлено: 13.03.2013
Просмотров: 38534 | Комментарии: 22 | Теги: Idle, схемы | Рейтинг: 5.0/9
Всего комментариев: 22
22 qewin   (30.04.2017 22:31) [Материал]
exersizze Спасибо! Ещё походил по инету и нашел вот это ( bascomavr.3bb.ru/viewtopic.php?id=1122 ) даже попробовал, работает ну и экономим диоды ! ;-)))

0  
21 exersizze   (29.04.2017 19:44) [Материал]
Теоретически да. И необходимо будет прописать условие, если на PB0..PB3 остался высокий уровень. Думаю должно работать.

20 qewin   (24.04.2017 10:35) [Материал]
Mожно ли исходя из схемы на прямую подцепить кнопку на ножку (PD2)? Будет обрабатывать 5?

19 toddy_123   (02.12.2015 17:38) [Материал]
Спасибо вам Большое! очень помогло, хочу сделать автомат подачи звонков на атмеге16
можно сказать на один шаг уже больше. Всем добра и здоровья!

18 sany2   (18.03.2014 16:36) [Материал]
Ну если не переписывать код,то общий провод кнопок на плюс перекинуть,а общий резисторов на минус.

17 ktoj   (18.03.2014 14:17) [Материал]
у меня кнопки(датчики) на размыкание, подскажите как изменить схему?

+1   Спам
16 max   (03.09.2013 15:01) [Материал]
1N4148

15 BlYur   (03.09.2013 14:22) [Материал]
Диоды D1-D4 какого номинала?

+4   Спам
14 Вольдемор   (13.06.2013 22:01) [Материал]
Блин как вы так умудряетесь красиво писать программы, я сколько не писал свои, хоть и работают но такая белиберда в коде капец, терпения не хватает писать столько коментов, респект!
Ваши программы многому научили, подсказали, спасибо!
Ждём новых проектов.

13 svadon   (31.05.2013 18:40) [Материал]
А если использовать PCF8574, то тремя проводками можно подключить сразу 16 кнопок по I2C и это без учета возможностей каскадирования микросхемы. Всего в системе можно использовать 7 микросхем PCF8574 х 16 кнопок = 112 кнопок.
Стоит копейки и избавляет от головной боли.

12 pchela5   (19.03.2013 14:34) [Материал]
Кстати, в данном камушке прерывание можно и от ног непосредственно получить - PCINT которое - но, надо лезть в даташит, разбираться в регистрах и т.д. и т.п. Иногда проще вставить 4 диода и резистор :)

11 exersizze   (19.03.2013 00:50) [Материал]
По поводу сканирования клавиатуры по таймеру согласен с kip96 хорошая идея, но в той задаче в которой столкнулся это решение не подошло. А именно большую часть времени устройство должно спать и просыпаться только тогда когда от него это требуется:) тоесть нажмут кнопку. А не тогда когда произойдет переполнение таймера. Иначе батарейки быстро склеят ласты.

10 kip96   (15.03.2013 00:03) [Материал]
Да и таймер для этих целей можно использовать, даже если все тамеры заняты, в любом иожно найти место, для обработки кнопок, времени мнго это не займёт.

9 kip96   (14.03.2013 23:58) [Материал]
Нечто подобное, как писал pchela5, я делал, только с динамической индикацией. Т.е. при очередном срабатывании по таймеру, проверяем пин, не важно какой, или сколько. Скажем в часах, где 4 цифры, на один пин можно повесить 4 кнопки, 2-8 кнопок, 3-12, и т.д. Реакция на нажатие, как понимаете, мгновенная.
А вообще реализаций полно, только включй сооброжалку. К примеру, команда GETRC, даёт возможность подключить резистивную клаву(как под АЦП)на тини2313. Я, при помощи этой команды, количество воды в летем душе измеряю уже 2 года.

8 AlekS   (14.03.2013 20:04) [Материал]
Это практичное и хорошее решение, особо в длинном счете, max прав.
Если нужно не проктично, до 21 кей и 2 провода связи с МК + прерывание, то можно это РСА8885ТС + сенсор кей.

+1   Спам
7 exersizze   (14.03.2013 19:49) [Материал]
Да да, главное чтобы программа обрабатывала нажатие в момент когда это происходит, а не когда до этого дойдет очередь в программе. Иначе, как сказал max,  это создает большие неудобства.
А по количеству занимаемых портов, так можно использовать кучу методов: от матрицования до использования расширителей портов.

+2   Спам
6 max   (14.03.2013 19:33) [Материал]
Это обычная аналоговая клавиатура. При длинном коде и при всяких разных временных задержках придется долго кнопку жать пока дойдет до очередного преобразования аналога, поэтому использовать только прерывание.

+1   Спам
5 serg_52   (14.03.2013 19:00) [Материал]
Мне понравилось вот так:
http://easyelectronics.ru/multipleksirovanie.html
Подобное видел в автомагнитоле Sony.

Чтобы создать прерывание, я бы добавил монтажное ИЛИ на D1...D4 и R1, как сделал уважаемый Автор.

Число ног будет 2 вместо 1+N кнопок.
Покритикуйте :)

+2   Спам
4 max   (14.03.2013 18:34) [Материал]
А прикол в том, что при длинном коде и при всяких разных временных задержках придется долго кнопку жать, поэтому лучше использовать прерывание. Используя такую схему можно использовать одно прерывание и кучу кнопок.

3 Dust   (14.03.2013 18:17) [Материал]
А в чем прикол? использовать 4 кнопки на пяти портах? это если я захочу подключить 9 кнопок мне надо занять 10 портов? или я, что то не так понял!!!

2 pchela5   (14.03.2013 16:22) [Материал]
Нечто подобное, только без использования прерываний - в цикле Do-Loop - реализовано итальянским коллегой и мной немножко доработано в статьях про DDS. Но там один вход и четыре/пять выходов, совмещенных с выводом информации на дисплей 1602, т.е. можно перенести клавиатуру на 5 кнопок и дисплей на один порт.

1 youhim   (14.03.2013 12:01) [Материал]
Отличное решение. Сохранил на будущее.

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]






авторизация
Логин:
Пароль: