Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/170: Рейтинг темы: голосов - 170, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
1

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

30.08.2012, 18:21. Показов 32789. Ответов 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
0 / 0 / 0
Регистрация: 28.10.2010
Сообщений: 893
01.09.2012, 01:54 101
Author24 — интернет-сервис помощи студентам
Ошибка в том, что существует возможность на выходе получить две нажатых кнопки, а должна быть одна. В этом же смысл работы схемы?
0
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
01.09.2012, 03:37 102
я не в теме, но что значит "переиграть"? новый вопрос зададут? так все вопросы останутся без ответа.
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
01.09.2012, 09:11 103
Цитата Сообщение от инкер
Ошибка в том, что существует возможность на выходе получить две нажатых кнопки, а должна быть одна. В этом же смысл работы схемы?
Не знаток теории вероятностей, но нажать одновременно две кнопки с интевалом 1мкс (1Мгц быстродействие КМОП) по моему физически невозможно. Ну или вероятность этого исчезающе мала.
0
0 / 0 / 0
Регистрация: 02.11.2010
Сообщений: 499
01.09.2012, 10:01 104
Ну. блин, вы даете.
На релюхах сделайте
0
0 / 0 / 0
Регистрация: 21.10.2011
Сообщений: 1,860
01.09.2012, 10:04 105
на лампах! чтобы было труЪ.
0
0 / 0 / 0
Регистрация: 28.10.2010
Сообщений: 893
01.09.2012, 10:23 106
Цитата Сообщение от Ymk
я не в теме, но что значит "переиграть"? новый вопрос зададут? так все вопросы останутся без ответа.
Смотря какая цена вопроса. Штангистов перевзвешивают до грамма, спринтеры перестарты делают только из-за того, что кто-то рванул одновременно с выстрелом.
0
2 / 2 / 0
Регистрация: 25.05.2010
Сообщений: 3,609
01.09.2012, 11:02 107
Ни разу не глянул эту тему, а потом разобрало любопытство: что же так упорно народ перетирает? Смотрю, тут серьезный разговор, тока холивара еще нет. Редкий случай :)

Но, как это иногда и бывает, долгий и "бесполезный" разговор вдруг дал интересный поворот: тестирование системы. И тут, ИМХО, вылез критерий, по которому можно оценить и сравнить варианты: "метрологическое обеспечение". Действительно, система должна пользоваться 100%-ным доверием участников. Так? Значит, должна быть процедура тестирования, с понятными результатами. Какая процедура напрашивается? Правильно, одновременные нажатия (двух или более) кнопок.
Что получится во всех этих рандомизаторах или в честных "мгновеннорегистрирующих" устройствах? Получится, что при тестах система будет выдавать приоритет кнопок случайным образом. А как это выглядит для проверяющего? А вот как:

1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1

Да, друзья, вы тоже заметили, что я намухлевал! Почему это нулей больше? А потому, что случайность - она и есть случайность! Если продолжить ряд (и если система идеально честная), то вскорости мы увидим побольше единиц (вот, опять повод для возмущения), а потом посчитаем по всей совокупности - о-па! Так все гут! 50 на 50, без балды.
Но вопрос: доживет ли автор конструкции до того светлого момента, когда всем станет ясно, что 50 на 50? Или его забросают помидорами значительно раньше?
Вы понимаете, о чем я? Демонстрация честности системы должна быть короткой и бесспорной.
И как бы вы на ухищрялись с "честной" системой - ее проверка потребует долгой процедуры и хотя бы небольшой лекции по теории вероятностей. А уж если вы "поможете" системе рандомизировать ответы - есть вероятность того, что это искусственное подправление честности кто-то подловит другим тестом: постледовательным быстрым нажатием двух кнопок. И тогда рандомизатор сыграет злую шутку. Это как гистерезис...

Мое предложение: забудьте про индукцию и дедукцию микросекунды! Система должна выдавать результат "множественное нажатие" во всех случаях, если интервал между нажатиями меньше, чем какое-то время Х. Всегда.
И тогда тестовые одновременные нажатия дадут всегда "МНОЖЕСТВЕННОЕ", а постепенное разнесение их (если таковое смогут организовать) с какого-то момента даст четко преимущество реально первой нажатой кнопки.
Само время Х должно быть выбрано экспериментально как раз многократным нажатием. Сначала делаем его ноль, а потом растим до тех пор, пока не начнем получать всегда "МНОЖЕСТВЕННОЕ". И тут же прекратим его увеличивать. Все. Система готова к проверкам и работе.

Вы скажете: фигасе! Это что, переигрывать? Мой ответ прост: да, если это возможно.
А если невозможно, то добавить процедуру ЧЕСТНО СЛУЧАЙНОГО выбора. Жребий, грубо говоря. Причем, что важно, отделить его от устройства! Показать участникам, что устройство работает настолько честно, насколько электроника позволяет зафиксировать разновременность нажатия вот этих конкретных кнопочек. А когда этого не достаточно - мы включаем такое же честное устройство типа "орел-решка" (электроное или с монеткой, совмещенное с описываемым девайсом или отдельное - не суть важно).
0
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 2
01.09.2012, 12:13 108
Про случайные числа. Читал интервью с одним программистов, из команды писавших то ли героев, то ли еще какую-то пошаговую стратегию. Так вот, там на лучников можно было наложить проклятие, которое с вероятностью 50% (точно не помню) заставляло их промахиваться. В результате посыпались жалобы, что это проклятье вообще не дает лучниками пользоваться, что не может оно так часто срабатывать. И им пришлось вводить искусственное ограничение "честного" рандома:)
А в данном случае делать аппаратную защиту от дребезга и фиксацию первой нажатой кнопки, как мне кажется, будет вполне хватать. Учитывать длину проводов и особенности кнопок уже будет перебором.
Для тестирования - пусть каждая команда попытается за каждым столом быстрей других нажать на кнопку, раз так десять-двадцать. Если всегда будет побеждать один и тот же стол, значит есть проблемы.
0
TixoK
01.09.2012, 13:33 109
<Изображение удалено>
Пробежал тему, вроде такой мысли еще не было. Суть: в этой схеме ничего не надо перебирать/сканировать. При наступлении прерывания выходы PC0-PC3 становятся входами с включенной подтяжкой, а вход INT0 становится выходом с "0". Затем читаем (PINC & 0x0F). Где "0" - там нажато. На все, про все – четыре команды.
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
01.09.2012, 13:41 110
Да здесь уже стоит проблема в разной длине проводников к кнопкам, т. е. разном затухании в линии. Правда до терминаторов пока не дошло. Пока...
По моему, вся проблема выеденного яйца не стоит, упражняемся в красноречии.
Вдогонку, сколько предполагается ставить на кон? Если миллионы, закажите у фирмы, получите сертификат.
0
0 / 0 / 0
Регистрация: 28.10.2010
Сообщений: 893
01.09.2012, 14:09 111
Цитата Сообщение от TixoK
На все, про все – четыре команды.
Если уж ловить блох, то нужно ИЛИ от кнопок на INT0, в прерывании только чтение порта, в теле программы циклическая проверка регистра с копией порта, другие прерывания не использовать. Кнопка мембранного типа с конденсатором параллельно контактам гарантирует, что сигнал-инициатор прерывания доживет до момента чтения в неизменном виде.
0
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
01.09.2012, 16:02 112
1. псевдо-случайные числа должны быть хорошо случайными, неотличимыми от настоящих случайных. в настоящих случайных длинной последовательности нулей быть не должно с большущей вероятностью. скажем, на 20 попытках распределение должно составлять 50+-10%, этого вполне достаточно (и для контроля).

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

3. схема с заведением по ИЛИ на одно прерывание и дальнейшим чтением из порта ущербна! городить огород, чтобы прерывание пришло, а из порта прочиталось, что ни одна кнопка не нажата - это ппц. тупой цикл из опроса порта и то лучше будет.
0
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
01.09.2012, 17:17 113
прерывание пришло, а из порта прочиталось, что ни одна кнопка не нажата
- это в каких условиях возможно?
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
01.09.2012, 17:30 114
[QUOTE="Финский"][QUOTE="Цитата:[/QUOTE]
прерывание пришло, а из порта прочиталось, что ни одна кнопка не нажата
- это в каких условиях возможно?
Не зафиксирово аппаратно триггером, еще раз повторюсь, это какие же руки должны быть у игроков, что они могуть жмакать быстрее логики?
0
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
01.09.2012, 17:34 115
в условиях дребезга (руки-то тут не при чем). факт нажатия мы словить - словили, а чье оно из 4х кнопок - можем не узнать. в любом случае, такая ситуация, как и нажатие более одной кнопки сразу, должна быть как-то обработана.

причем, если в случае одноврем. нажатий мы можем кнопкам дать приоритет (не намеренно) и это никто не заметит без тщательного тестирования, то в случае чтения из порта, что ни одна кнопка не нажата, может случиться эпикфэйл.
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
01.09.2012, 18:01 116
Ну так смотрим, сколько денег на кону. Если играем по копеечке, а Рабинович начал возбухать с спорном случае - в пятак ему.
Если игра на миллионы - вызываем представителей фирмы/поставщика и в бубен им. С последующем возмещением издержек.
Если вы все это напроектировали - в бубен вам. Насчет возмещения придумают за вас.
Диалектика....
0
0 / 0 / 0
Регистрация: 12.04.2010
Сообщений: 3,260
01.09.2012, 19:59 117
О чем вы говорите? Какие проверки системы? Как проверить систему "на честность", и где гарантия того, что проверяющая система будет честна? В общем, это все фигня. В любом случае, спорить с этой электроникой никто не будет, поскольку в любом случае посчитают, что она права.
Даже если, чисто гипотетически, предположить, что произошло действительно одновременное нажатие, вероятность которого стремиться к бесконечности, тогда рандом - и все. Никто никогда не докажет, что он нажал кнопку раньше. Да и кнопки все разные. У одной чуть слабее пружина, и нажимается она с меньшим усилием на доли микрограмма, что увеличит скорость ее нажатия. А в другой ситуации нажатие происходило немного другой частью ладони или пальца, где кожа ближе к кости, и меньше амортизирующий эффект плоти. Да и как тут уже писали, провода обрезали на микрометр короче, или вставили в разъем на тот же микрометр глубже - уже изменилось время реакции системы на нажатие кнопки. Давайте уже не будем вдаваться в такие крайности.
0
0 / 0 / 0
Регистрация: 21.10.2011
Сообщений: 1,860
01.09.2012, 20:01 118
ага, а то так можно договориться до помещения всей системы в контролируемые условия.
0
0 / 0 / 0
Регистрация: 28.09.2010
Сообщений: 4,283
01.09.2012, 20:09 119
>> вероятность которого стремиться к бесконечности
Мой мозг требует компенсацию за моральный ущерб! %)
0
2 / 2 / 0
Регистрация: 25.05.2010
Сообщений: 3,609
01.09.2012, 20:32 120
Цитата Сообщение от Ymk
2. речь идет о вполне конкретной игре, поэтому переиграть здесь хз как получится, ибо к моменту нажатия вопрос уже задан. только жребий вручную. но почему бы не переложить это на плечи девайса?
По-моему, единственный человек, кто прочел мой постинг. Ну, и на том спасибо!

Сторонники супер-пупер быстродействующей системы на самом деле просто увлеклись чистой задачей получения супер-пупер быстродействующей системы. В полнейшем отрыве от реальной задачи. Что ж, это тоже интересно, само по себе. И решения предложены классные. Особенно на аппаратном защелкивании - ух, как быстро! Но я эти решения не обсуждаю, мне интереснее привязка к поставленной задаче.

А вот с этим уже НЕ НАДО думать о микросекундах. Вообще не надо. Нужно либо считать, что системе верят, либо делать систему, выдерживающую проверку.
Если системе верят, то абсолютно пофик, какой канал зафиксируется, если сигналы приходят в интервале нескольких миллисекунд. Визуально все выглядит прекрасно. И тогда решение с МК вполне катит. И даже тупое опрашивание (без прерывания) - вполне. Кто хочет поспорить - расскажите, как будете доказывать, что несколько миллисекунд реакции - это слишком много. Пожалуйста, подробненько.
Если же система должна выдерживать тестирование - то только предложенный мною подход. А именно (для тех, кто не читал мои фантазии выше): система честно говорит "МНОЖЕСТВЕННОЕ", когда более одного нажатия приходит в интервале Х (я думаю, это будут десятки миллисекунд, но, повторяю, опыт покажет). И потом уже можно бросать (хорошо, в том же девайсе, Ymk прав) жеребок. Это очень честно, это можно доказать даже если игра на миллионы. Собственно, я понятия не имею, о какой игре идет речь. Телевизора у меня нет и я его не смотрю никогда.
0
01.09.2012, 20:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.09.2012, 20:32
Помогаю со студенческими работами здесь

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

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

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

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

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


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

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