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

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


 Используя в проектах большое количество кнопок, постоянно сталкиваюсь с проблемой нехватки количества внешних прерываний. Вроде выбрал подходящий по нафаршированности камень, есть все что надо - АЦП, 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
Просмотров: 23075 | Комментарии: 19 | Теги: Idle, схемы | Рейтинг: 5.0/8
Всего комментариев: 19
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 какого номинала?

+3   Спам
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)
Отличное решение. Сохранил на будущее.

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






   EasyEDA:  бесплатный редактор схем

   ✓ Создание схем
   ✓ Возможность симуляции
   ✓ Быстрое создание печатных плат
   ✓ Интуитивно понятный интерфейс

   Нарисуй свою схему прямо сейчас!
   Изготовление печатных плат   https://easyeda.com/order
авторизация
Логин:
Пароль:
Комментарии
Когда не хватает ног. Часть 2. Сдвиговый регистр 74HC595
08.12.2016 - exersizze:
yorx выдалось немного свободного времени, проверил в симуляторе. Проблема...
Логгер температуры 2.0
05.12.2016 - Evgeny6873:
Хотел повторить схему и долго ждал дисплей, два раза заказывал с Китая, пришел. ...
Когда не хватает ног. Часть 2. Сдвиговый регистр 74HC595
01.12.2016 - yorx:
Доброго времени суток, exersizze попробовал Ваш код все равно не работает как на...
Помни об усадке!
30.11.2016 - pchela5:
Автомобильные никакие не лезут?
Помни об усадке!
29.11.2016 - AlekS:
Виктор, спасибо.
С заменой транса в зиму, перестройка не комельфо) Валяет...
Управляем микроконтроллером с ПК по UART
29.11.2016 - exersizze:
Михаил, для работы с инфракрасными датчиками и диодами есть команды RC5SE...
Управляем микроконтроллером с ПК по UART
29.11.2016 - Михаил:
Всем привет.
Подскажите как переменную S передать по инфракрасному каналу...
Помни об усадке!
29.11.2016 - pchela5:
> Если ленту светодиодную порезать и соединить последовательно
Только ...
Когда не хватает ног. Часть 2. Сдвиговый регистр 74HC595
29.11.2016 - exersizze:
yorx, вывод Q7 ' первой микросхемы соединен с DS второй микросхемы? С...


Лучшие цены на 3D принтеры
успей сделать себе подарок к Новому Году! ;)


Prusa i3

Prusa i3 от 12500 р.



Rostoсk

Rostock от 15000 р.