Страница 9 из 26
Re: Помогите опросить кнопку
Добавлено: Ср апр 16, 2014 15:14:32
Gudd-Head
shads писал(а):Подключение через INT0 или INT1
О, у меня так: 2 кнопки повесил на внешние прерывания. Но вопрос не об этом.
А что если для различения одиночного/длинного нажатия использовать постоянно крутящийся таймер со временем переполнения ≈256 мс? И считать сколько раз он перпеполнился пока нажата кнопка.
Плюс в том, что он будет настроен всего 1 раз в начале проги.
Минус — погрешность 256 мс если его не обнулять.
Re: Помогите опросить кнопку
Добавлено: Ср апр 16, 2014 16:01:29
Alexeyslav
Конечно. для 2 сек "длинного" нажатия этого хватит.
Re: Помогите опросить кнопку
Добавлено: Ср апр 16, 2014 16:23:03
Gudd-Head
Вот только как понять что кнопку не отпустили на долю секунды? А что её именно постоянно держали?
Re: Помогите опросить кнопку
Добавлено: Ср апр 16, 2014 16:37:11
Alexeyslav
Сработает прерывание же. сбрасываешь счетчик и признак ожидания длинного нажатия.
Re: Помогите опросить кнопку
Добавлено: Ср апр 16, 2014 16:44:30
Gudd-Head
В том-то и дело, не хотел я выходить из обработчика прерывания пока таймер крутится (не переполнился).
Нехорошо, конечно, висеть в прерывании. Но мне и спешить-то некуда

Re: Помогите опросить кнопку
Добавлено: Ср апр 16, 2014 16:55:24
Alexeyslav
Если не выходишь из прерывания, то можно и обычные задержки использовать, по милисекундам накручивать в цикле и как насчитаешь 2000мс - выполнять функцию. Один фиг работа программы будет остановлена.
Re: Помогите опросить кнопку
Добавлено: Ср апр 16, 2014 18:38:20
zero648
Gudd-Head писал(а):В том-то и дело, не хотел я выходить из обработчика прерывания пока таймер крутится (не переполнился).
Нехорошо, конечно, висеть в прерывании. Но мне и спешить-то некуда

В теле обработчика сбрасываем флаг переполнения нужного таймера, далее организовать бесконечный цикл проверки флага переполнения таймера и при установке флага увеличивать счетчик переполнений, проверяем количество переполнений и если мало, то сбросываем флаг и возвращаемся в цикл проверки флага переполнения, если переполнений хватает, то выходим из прерывания,
глушим этот канал INT до тех пор пока кнопка еще в нажатом состоянии, ну или что-то типа того, выполняем нужный код этого события.
Re: Помогите опросить кнопку
Добавлено: Ср апр 16, 2014 20:14:57
Alexeyslav
Как-то это совсем неправильно и расточительно. Зачем в прерывании задерживаться? По нажатию сбрасываем счетчик, а по отпусканию проверяем сколько насчитал переполнений таймер и выполняем нужную функцию. Но... все это хорошо, а в реальности получим облом из-за дребезга контактов. Если уж гоняем таймер впустую, то пусть там же и опрашивается кнопка. Кнопка нажата? +1 в счетчик, кнопка только что отпущена? проверяем счетчик выполняем нужную функцию и сбрасываем счетчик.
Прерывания на копку нужно использовать только тогда когда нужна мгновенная реакция, например защита в станке.
Re: Помогите опросить кнопку
Добавлено: Ср апр 16, 2014 23:27:06
zero648
... а по отпусканию проверяем сколько насчитал переполнений таймер и выполняем нужную функцию
Кстати, вот это тоже не правильно, считать нужно во время удержания кнопки, а иначе не понятно, сколько уже продержали, передержали или недодержали, узнаем когда отпустим получается.
Re: Помогите опросить кнопку
Добавлено: Ср апр 16, 2014 23:36:52
ARV
Alexeyslav писал(а):Прерывания на копку нужно использовать только тогда когда нужна мгновенная реакция, например защита в станке.
когда-то я уже писал... видимо, пора повторять
прерывания для кнопок - это вообще в подавляющем большинстве случаев глупость. и даже для защиты станка мгновенная реакция (напомню: для скромненького AVR с тактовой частотой 1 МГц время реакции на внешний запрос прерывания составит порядка 16 микросекунд) совершнеео не требуется!
мышечная реакция специально тренированного человека редко превышает 50 миллисекунд, у большинства обычных людей она около 100 миллисекунд и более. время срабатывания реле в станке примерно того же порядка. остановка шпинделя или там еще какой-то движущейся части займет уже секунды...
поэтому по всему добиваться микросекундной реакции на нажатие кнопки совершенно бессмысленно...
Re: Помогите опросить кнопку
Добавлено: Чт апр 17, 2014 00:39:54
shads
Gudd-Head писал(а):Вот только как понять что кнопку не отпустили на долю секунды? А что её именно постоянно держали?
Я уже лет 10 пользуюсь первым вариантом отсюда
http://asis-kbr.ru/forum/viewtopic.php?f=13&t=173
И защита от дребезга есть и длинные\короткие нажатия отличает...
Re: Помогите опросить кнопку
Добавлено: Чт апр 17, 2014 01:35:04
Alexeyslav
Ну, тогда смотреть на счетчик он будет расти только если кнопка удерживается, иначе он находится в нуле.
А насчет защиты, когда-то показывали по телевизору изобретение некой защиты - не то что шпиндель, а пила останавливается после подачи сигнала настолько быстро что зубья проходят не больше милиметра. Это именно счет идет на микросекунды. Хотя тут конечно микроконтроллеру уже не место, если он вдруг будет находится в обработке другого прерывания за это время пила может оттяпать палец...
Re: Помогите опросить кнопку
Добавлено: Ср май 07, 2014 16:27:22
.Lexx.
Создал вначале крупную (по-моему) программку с 16 светодиодами не запахало. В итоге дошёл до 2 светиков и 2 кнопок. Не понимаю почему при нажатии и последующем отжатии светодиоды продолжают мигать. Действие ПИНД.1 также не помогло.
Re: Помогите опросить кнопку
Добавлено: Ср май 07, 2014 18:31:38
Halex
.Lexx. писал(а):Не понимаю почему при нажатии и последующем отжатии светодиоды продолжают мигать. Действие ПИНД.1 также не помогло.
А мне вот непонятно назначение резисторов в вашей схеме (фрагмент). Догадываюсь, что наступил "летний сезон", отопление отрубили, а на улице хоть и май, но не подарок. Видимо Вы решили этими резисторами квартиру погреть. Ну, так они же нарисованные!!! В натуре греть будут, а на экране - нет. Да, для сугрева надо бы и уменьшить номинал на несколько порядков...
Для незнакомых с Протеусом поясню, что те стрелки вверх без обозначений - шина питания VCC=+5V. Приятного просмотра...

Re: Помогите опросить кнопку
Добавлено: Ср май 07, 2014 20:30:54
.Lexx.
Ошибся в схеме, действительно.
Сначала дорогой друг хотел послать вас нах_*Й... За ваш прекраснейший ответ. Ибо по существу, ответа как такового не было.
В итоге сам нашёл ошибку.
Ошибка элементарная, и очень обидная. Неправильно расставил подтягивающие резисторы, ибо в моей схеме выводы ATMEG висят в воздухе при не нажатой кнопке.
Re: Помогите опросить кнопку
Добавлено: Ср май 07, 2014 20:34:03
Аlex
.Lexx. писал(а):Ибо по существу, ответа как такового не было.
Ответ, как раз и был по существу, если Вы до сих пор не поняли этого. Отсюда
Halex и говорил про нагрев, ибо они тупо на питании висят, а не делают подтяжку портов.
ЗЫ: Вовремя Вы свой пост снесли, ещё бы пару минут и ушли бы в БАНьку за оскорбления ...
Re: Помогите опросить кнопку
Добавлено: Ср май 07, 2014 20:57:40
Halex
.Lexx. писал(а):В итоге сам нашёл ошибку.
Только не повторите ее "натюрлих", в смысле - в железе. Если намерены разместить кнопки со стороны + питания - поставьте последовательно токоограничивающие резисторы, а то попалите порты, а я опять виноватым буду, что на это Вам не указал.
Аlex писал(а):Ответ, как раз и был по существу...
Спасибо за понимание. Ибо, ибо ... (ну как там у Бендера в "12-ти стульях" ... не смог закончить мысль). А если серьёзно, то смысл своих подсказок как раз и вижу не в тупом "тыканье носом", а чтобы спрашивающий сам увидел косяк - это лучше и на дольше запоминается. Вроде получилось...
Ну, и, в конце то концов, с праздником нас, РадиоКотов!!! Выше антенны (ИМХО - хвосты) - дальше радиосвязь (ИМХО - "пометим" территорию)!!!
Re: Помогите опросить кнопку
Добавлено: Сб авг 16, 2014 12:30:45
B@R5uk
Какое обычно время надо выждать, чтобы гарантировать, что дребезг кнопки закончился?
У меня идея опрашивать миниклавиатуру по прерыванию от таймера. При этом не хочется сильно заморачиваться. Если я поставлю достаточно редкое время опроса (допустим 0,016 с), то не вылезут ли какие-нибудь бяки у этого алгоритма?
То есть может ли длительность дребезга оказаться длиннее 0,016 с?
Re: Помогите опросить кнопку
Добавлено: Сб авг 16, 2014 14:53:39
Alexeyslav
Смотря какие кнопки, 16мс - это нормальный период для нормальных неразболтаных кнопок а для разболтаных дребезг может не закончится никогда.
Re: Помогите опросить кнопку
Добавлено: Сб авг 16, 2014 15:25:29
B@R5uk
Спасибо. У меня пока герконовые кнопки от какой-то старой советской вычислительной машины (или станка). Время дребезга вообще как-то нормируется? А то я пробовал измерять количество импульсов, возникающих во время включения и выключения этих герконов, их там попадалось чуть ли не до десяти.