Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.82/78: Рейтинг темы: голосов - 78, средняя оценка - 4.82
Ommykytotor
0 / 0 / 0
Регистрация: 13.06.2013
Сообщений: 584
1

Несколько двойных кнопок на одно прерывание

02.10.2013, 18:34. Просмотров 14084. Ответов 32
Метки нет (Все метки)

Возникла необходимость подключить несколько кнопок, а прерываний мало и они нужны будут в другом месте. Обратил внимание, что почти все миниатюрные кнопочки имеют в своём составе 4 ноги, может для устойчивости но скорее всего там 2 независимые кнопки. Схема такая, половинки всех кнопок подключаются параллельно и заводятся на пин с прерыванием, другие половины в обычные порты или другими распространенными способами. Но тут возникает вопрос как быть с задержкой, ибо парная кнопка будет давать сложный дребезг а в процедуре долго оставаться нежелательно. Разумно ли сделать так?: После срабатывания внешнего прерывания в процедуре его обработки проверить PINX, где-то есть 1 всё нормально,ставим флаг. Если нет, запускать таймер и периодически опрашивать порт до появления где-нибудь единицы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.10.2013, 18:34
Ответы с готовыми решениями:

Четыре кнопки на одно прерывание
Возникла необходимость отслеживать четыре кнопки и мгновенно реагировать на...

Почему одно прерывание блокирует другое?
Не могу понять, что не так. В программе два прерывания. Одно прерывание по...

Как на несколько кнопок повесить одно событие
Здравствуйте! У меня есть на форме аж 40 кнопок, но на какую бы ни нажал...

прерывание кнопок мышки
Люди, подскажите, как эмитировать нажатие кнопок мышки (левой, правой) в Delphi?

Разработать программу для удаления двойных пробелов и двойных запятых
Привет всем, помогите разработать программу для удаления двойных пробелов и...

32
ImTuTb!
0 / 0 / 0
Регистрация: 04.03.2011
Сообщений: 594
02.10.2013, 18:39 2
http://lib.chipdip.ru/071/DOC000071159.pdf
0
Финский
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
02.10.2013, 19:03 3
Цитата Сообщение от Ommykytotor
запускать таймер и периодически опрашивать порт до появления где-нибудь единицы
А почему просто не опрашивать кнопки по таймеру? Без прерываний.
Можно еще вот эту тему почитать, может натолкнет на решение.
0
omokost
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,753
02.10.2013, 20:30 4
Цитата Сообщение от Ommykytotor
...Обратил внимание, что почти все миниатюрные кнопочки имеют в своём составе 4 ноги, может для устойчивости но скорее всего там 2 независимые кнопки...
Вот такой футпринт тактовой кнопки:


<Изображение удалено>
0
oomomstir
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,864
02.10.2013, 20:58 5
А диодное "или" всех кнопок - не?
0
Ommykytotor
0 / 0 / 0
Регистрация: 13.06.2013
Сообщений: 584
02.10.2013, 21:03 6
<Изображение удалено>
Ладно, вот картинка с подобной темы. Только порт обычный, на выход, по умолчанию 0. int0 подтянут к 1, прерывание по спаду.
Срабатывает кнопка, заходим в прерывание,переключаем порт на вход, где будет единица, значит та кнопка нажата.
А пока производится вход в прерывание, переключается на вход и опрашивается порт, кнопка дребезжать не начнет? Успеет ли пин встать на единицу до того как произойдет опрос?
0
DOOMSDOY
0 / 0 / 0
Регистрация: 13.07.2012
Сообщений: 566
02.10.2013, 21:29 7
можно как-то так:

0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
02.10.2013, 21:32 8
Один канал АЦП может поддерживать 32 кнопки
0
Kosym
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 801
02.10.2013, 21:42 9
мне не нравится реализация кнопок через прерывание Int, всё равно надо ещё антидребезг городить. Лучше сразу опрос кнопок по таймеру сделать, так проще отслеживать изменения состояния клавиатуры.
0
Ommykytotor
0 / 0 / 0
Регистрация: 13.06.2013
Сообщений: 584
02.10.2013, 21:50 10
Ну антидребезг она же отмена прерывания на 50мс, всё равно кнопки не часто нажимаются.
0
DOOMSDOY
0 / 0 / 0
Регистрация: 13.07.2012
Сообщений: 566
02.10.2013, 21:58 11
Цитата Сообщение от Kosym
мне не нравится реализация кнопок через прерывание Int, всё равно надо ещё антидребезг городить. Лучше сразу опрос кнопок по таймеру сделать, так проще отслеживать изменения состояния клавиатуры.
Зато нажатие кнопки может будить контроллер даже из глубочайшего сна.
0
Ommykytotor
0 / 0 / 0
Регистрация: 13.06.2013
Сообщений: 584
02.10.2013, 22:18 12
КМОП Десятично-двоичный шифратор, если младший бит его на прерывание,итого 5 кнопок 4 ноги. Внешний антидребезг.
Поискал такие, они разные. Который с 9тью входами и 4 выходами найти не удалось.
0
Ommykytotor
0 / 0 / 0
Регистрация: 13.06.2013
Сообщений: 584
02.10.2013, 23:36 13
Есть другие, входов всего 8, 3 выхода под двоичный код и служебные выходы. На одном из служебных встает единица если пришло что-то на вход, итого если этот выход на прерывание а остальные 3 выхода на информацию - 8 кнопок займут 4 ноги МК.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
03.10.2013, 00:07 14
Неважно сколько кнопок, но на прерывание их вешать есть смысл только в одном случае: батареечное питание и глубокий сон МК.
Человеко-интерфейс очень медленный. разброс в мкс, даже мс тут ВООБЩЕ погоды не делают. Дребезг контактов опять же. Так что, если нет задачи сделать устройство с низким потреблением тока, не копайте себе мозг. Кнопки можно спокойно опрашивать в основном цикле.
Некоторые правила программирования:
Никаких долгих циклов в подпрограммах. Проверка условий, выполнение кода, выход. Если используется какой-то системный таймер, то выполнение всех подпрограмм при любых обстоятельствах не более одного тика системного таймера. Примеры основного цикла на асме и си:
Код
Main:
wdr
rcall   Service_Timers
rcall   Drv_Lcd
rcall   KBD_DRV
rcall   Proc_Game
rjmp   Main

void main (void)
{
init_sys_timer ();

sei ();

while (1)
{
wdt_risit ();
service_timers ();
kbd_drv ();
drv_char_dsp ();
}
}
0
Ommykytotor
0 / 0 / 0
Регистрация: 13.06.2013
Сообщений: 584
03.10.2013, 00:23 15
Спасибо. Пригодится. Но всё равно подсократить количество выводов никогда не помешает.А прерывание как опция. Да и необязательно тут должны висеть кнопки, а что-нибудь гораздо более быстродействующее где необходимо прерывание, всего одно.
2313 у нас стоят 100р с лишним а что-то другое в разы больше.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
03.10.2013, 01:12 16
Если уж совсем хило с МК и деньгами, тогда посмотрите в сторону сдвиговых регистров. 74HC165. 1 регистр - 8 кнопок. 2 - 16 и т.д. Лапы МК: такт., данные, защелкивание данных, сброс регистров по вкусу. Итого максимум 4 лапы МК на 8*n регистров.
0
Bytt
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
03.10.2013, 07:53 17
Цитата Сообщение от Финский
Цитата Сообщение от Ommykytotor
запускать таймер и периодически опрашивать порт до появления где-нибудь единицы
А почему просто не опрашивать кнопки по таймеру? Без прерываний.
Можно еще вот эту тему почитать, может натолкнет на решение.
А таймер опрашивать как, тоже без прерываний?
0
sbum
0 / 0 / 0
Регистрация: 04.08.2012
Сообщений: 102
03.10.2013, 09:43 18
Кажется то, что надо:
http://www.chipenable.ru/index.php/prog ... ast-1.html
0
Финский
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
03.10.2013, 10:55 19
Цитата Сообщение от Ommykytotor
Возникла необходимость подключить несколько кнопок, а прерываний мало и они нужны будут в другом месте.
Цитата Сообщение от Bytt
А таймер опрашивать как, тоже без прерываний?
ТС, как и я, подразумевал внешние прерывания. А для опроса кнопок по таймеру, конечно, не обойдется без прерываний таймера.
0
Dimys_K
0 / 0 / 0
Регистрация: 06.11.2011
Сообщений: 191
03.10.2013, 19:12 20
Решение с АЦП хорошо, но только чтобы побаловаться. В температуре это работать не будет. Резисторы поплывут и вся схема рассыпется сразу. Вы сначала разберитесь что вам нужно, написать красиво программу или сэкономить ноги. Самый простой способ это написать функцию обработки кнопок, которая будет вызываться в основном цикле по флагу, который устанавливаеся в обработчике прерывания таймера.
0
03.10.2013, 19:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.10.2013, 19:12

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

Как подписать двести кнопок на одно событие
Есть 200 кнопок. Клик по каждой из них должен вызвать какой-то код, одинаковый...

Одно контекстное меню для нескольких кнопок
Как осуществить контекстное меню для несколько кнопок? Например в контекстном...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru