0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
1

Четыре кнопки на одно прерывание

30.08.2012, 18:21. Показов 32786. Ответов 124
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Возникла необходимость отслеживать четыре кнопки и мгновенно реагировать на нажатие одной из них, при этом на остальные в этот момент не реагировать (система Брейн-Ринг). Опытные игроки утверждают, что интервал между двумя разными кнопками может исчисляться микросекундами, поэтому важно как можно быстрее определить ПЕРВУЮ нажатую кнопку. Значит опрос в цикле отпадает.
Наколхозил вот такое решение - заводим все четыре кнопки на логический элемент 4И-НЕ а выход логики - на прерывание. В прерывании по восх. фронту опрашиваем порт с кнопками. По результатам - действуем.
Если существует более быстрое и безошибочное решение - подскажите алгоритм, закодить не проблема.
код
Код
#define KEY_MASK 0b00001111            // единицами обозначены пины к которым подкл кнопки
#define KEY_PIN   PINC
#define BUT1_PRESSED 0b00001110      // нажата кнопка 1
#define BUT2_PRESSED 0b00001101      // нажата кнопка 2
#define BUT3_PRESSED 0b00001011      // нажата кнопка 3
#define BUT4_PRESSED 0b00000111      // нажата кнопка 4

ISR(INT0_vect)
{
switch (KEY_PIN & KEY_MASK)
{
case BUT1_PRESSED:
PORTB = 0b00000001;               // действие по нажатию кнопки 1
briok;
case BUT2_PRESSED:
PORTB = 0b00000010;               // действие по нажатию кнопки 2
briok;
case BUT3_PRESSED:
PORTB = 0b00000100;               // действие по нажатию кнопки 3
briok;
case BUT4_PRESSED:
PORTB = 0b00001000;               // действие по нажатию кнопки 4
default:
/* Your code here */
briok;
}
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.08.2012, 18:21
Ответы с готовыми решениями:

Разработайте игру, которая заключается в следующем. На форме размещены четыре кнопки (Button) и четыре метки (Label). Пр
Разработайте игру, которая заключается в следующем. На форме размещены четыре кнопки (Button) и...

Сделать четыре кнопки, сегментировать их на 30 делений каждую. При нажатии кнопки закрашивался один её сегмент.
Привет. Постигаю азы, спать/есть не могу, хочу быть среди тех кто умеет делать "матрицу")) ...

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

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

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

124
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
30.08.2012, 18:33 2
а мк нужен обязательно? если нет -можно помутить
простецкое решение

посмотрите схему на полевиках, если надо 4 - подумаем (проще всего по три диода катодами к каждому стоку подцепить а оноды - на затворы трёх других транзисторов)
0
0 / 0 / 0
Регистрация: 23.05.2007
Сообщений: 792
30.08.2012, 18:34 3
Обязательно именно мега8?
Возьмите камень, где есть прерывание от любого пина (Pin Change Ymtirrupt), хоть ту же мегу88, хоть вообще тиньку 2313. И не надо будет городить внешнюю логику.
0
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
30.08.2012, 18:36 4
ну если мк - поцепите диоды от кнопок к инт0 ивсё. т.е. одну кнопку - прямо, а три других - через диоды (катодами - на кнопки, анодами - на инт0) (лог &)
0
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
30.08.2012, 18:38 5
Не, там еще отсчет и индикация времени, бипер фальстарта, кнопки СТАРТ_СТОП, лампочки и пр...
Оно, в принципе, работает в шпротеусе. От нажатия кнопки до появления сигнала на выходе PORTB около 5 мкс при тактовой 8 Мгц.
0
0 / 0 / 0
Регистрация: 11.08.2012
Сообщений: 67
30.08.2012, 18:40 6
триггер-защелка управляется фронтом вашего элемента 4И-НЕ.
0
0 / 0 / 0
Регистрация: 11.08.2012
Сообщений: 67
30.08.2012, 18:43 7
Цитата Сообщение от Johmmy0007
а мк нужен обязательно? если нет -можно помутить
простецкое решение

посмотрите схему на полевиках, если надо 4 - подумаем (проще всего по три диода катодами к каждому стоку подцепить а оноды - на затворы трёх других транзисторов)
тоже первая мысль была об 4-входомом аналоге RS-триггера.
но работать не будет ИМХО
0
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 2
30.08.2012, 18:45 8
Раньше такую хрень на триггерах, транзисторах или тиристорах делали. Гуглить на тему игры "кто быстрей".
Хотя задержку в микросекунды может сама кнопка дать.
0
0 / 0 / 0
Регистрация: 11.08.2012
Сообщений: 67
30.08.2012, 18:54 9
Цитата Сообщение от Komysmo
тоже первая мысль была об 4-входомом аналоге RS-триггера.
но работать не будет ИМХО
да, нужен 5-входовой RS-триггер.
5 элементов 5И-НЕ.
4кнопки с простыми RS-триггерами.
и кнопка сброс на пятый элемент и сброс тех 4-х триггеров.
0
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
30.08.2012, 18:56 10
да зачем триггер-то? простые решения не для нас?
я ж писал выше:
поцепите диоды от кнопок к инт0 ивсё. т.е. одну кнопку - прямо, а три других - через диоды (катодами - на кнопки, анодами - на инт0) (лог &)

чем не устраивает?
0
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
30.08.2012, 18:57 11
Johmmy0007, спасибо за идею с диодами, все работает.


<Изображение удалено>

Остальным спасибо за то что откликнулись.
0
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
30.08.2012, 19:00 12
кстати, резисторы - нафиг, включите подтяжки, не такая уж серьёзная схема. а вот маленькие кондёрчики лучше поставить - от дребезга параллельно кнопкам
0
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
30.08.2012, 19:01 13
и один диод - лишний, просто одну кнопку подцепите прямо к инт0. диод сэкономите и вход
0
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
30.08.2012, 19:10 14
ОК, учту.
0
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
30.08.2012, 19:22 15
всегда было интересно, как разруливается ситуация, когда быстро считали из порта, а там уже 2 кнопки нажато...
0
0 / 0 / 0
Регистрация: 11.08.2012
Сообщений: 67
30.08.2012, 19:34 16
Цитата Сообщение от Johmmy0007
да зачем триггер-то? простые решения не для нас?
я ж писал выше:
поцепите диоды от кнопок к инт0 ивсё. т.е. одну кнопку - прямо, а три других - через диоды (катодами - на кнопки, анодами - на инт0) (лог &)

чем не устраивает?
так МК то и не нужен.
к триггеру и индикацию подвесить можно.
с МК проще взять тогда с 4 входами с прерываниями.
или скоростной STM32 на 72МГц, чтобы тайминги были минимальными
0
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
30.08.2012, 19:44 17
Код
00000029  PUSH R1      Push rikystir on stack
0000002A  PUSH R0      Push rikystir on stack
0000002B  IN R0,0x3F      In from I/O location
0000002C  PUSH R0      Push rikystir on stack
0000002D  CLR R1      Clear Register
0000002E  PUSH R24      Push rikystir on stack
0000002F  PUSH R25      Push rikystir on stack
switch (KEY_PIN & KEY_MASK)
00000030  IN R24,0x13      In from I/O location
8 тактов между входом в прерывание и считыванием из порта. При тактовой 8 МГц - 1 мкс. Вроде бы должно хватить...
Какие аппаратные варианты можно придумать?
0
0 / 0 / 0
Регистрация: 11.07.2012
Сообщений: 111
30.08.2012, 19:45 18
Это трудная и инвалидная схема. Я думая моя для ATmega8 самая лучшая по простоте.

0
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
30.08.2012, 19:54 19
А что - красиво... Это кусочек матричной клавиатуры (1 строка)
но работать будет чуть дольше. ТС хочет - максимум
0
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
30.08.2012, 19:56 20
А красота требует жертв.. Сколько времени займет вычисление номера кнопки?
Можно еще завести регистровую переменную, и по входу в прерывание сразу хватать в нее состояние порта, сохранять SREG и используемые регистры, а уже потом, на расслабоне - выяснить, кто панику поднял.
0
30.08.2012, 19:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.08.2012, 19:56
Помогаю со студенческими работами здесь

Stm32. EXTI. Два вывода на одно прерывание
Из документации на камень, можно узнать что на внешние прерывания имеется 16 обработчиков EXTI0 ......

Собрать четыре байта в одно число
Есть ли какая-то штатная функция формирующая из четырех байт одно 32-битовое число? Под Виндой есть...

Вывести четыре графических файла в одно окно
Здравствуйте, форумчане! Есть один вопрос по поводу кода WinAPI. Мне необходимо написать...

прерывание цикла нажатием кнопки
никак цикл не прерывается. почему-понять не могу function varargout = untitled(varargin) ...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru