Easyelectronics.ru

Электроника для всех
Текущее время: 24 апр 2018, 02:12

Часовой пояс: UTC + 5 часов



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 18 ] 
Автор Сообщение
 Заголовок сообщения: Алгоритмы определения зажатой кнопки
СообщениеДобавлено: 12 фев 2017, 14:24 
Заглядывает иногда

Зарегистрирован: 07 фев 2017, 01:12
Сообщения: 35
Доброго времени суток всем.

Подскажите пожалуйста, какие есть возможные алгоритмы определния зажатой кнопки? То есть, зажали, и удерживаем несколько секунд.

Первый, что влетел в голову (но не уверен в работоспособности):

1. Настраиваем прерывание на возрастание фронта.
2. Как только получили прерывание:
2.1 Переключаем режим прерывания на падение фронта.
2.2 Включаем таймер.
3. При отжатии повторно срабатывает прерывание (по падению фронта)
4. Считываем по таймеру, прошло ли достаточно времени.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритмы определения зажатой кнопки
СообщениеДобавлено: 12 фев 2017, 15:27 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 4199
Человек не будет отпускать зажатую кнопку. Тайминг надо проверять (и) при нажатой кнопке.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритмы определения зажатой кнопки
СообщениеДобавлено: 12 фев 2017, 15:35 
Старожил

Зарегистрирован: 19 июн 2012, 14:17
Сообщения: 3440
Использовать аппаратный таймер и прерывание ради кнопки? А если их несколько?

Обычно проверку кнопок выносят в функцию, которую потом периодически вызывают с заданным интервалом, например 50мс.
В самой функции можно посчитать количество вызовов пока кнопка была зажата и исходя из этого принять решение о длительности нажатия. Например до 2х50мс это дребезг/помеха, от 2х50мс до 20х50мс короткое нажатие, от 20х50мс длинное нажатие.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритмы определения зажатой кнопки
СообщениеДобавлено: 12 фев 2017, 15:51 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 394
Смотря какой проц. Для stm32, я делаю так:
на ноге кнопки включаю EXTI по фронту и по спаду
в SysTick_Handler добавляю функцию автодекремента, SysTimer настроен на частоту 1кГц(через него же реализую delay), создаю глобальную переменную отсчетов. Далее по прерыванию проверяю прерывание по фронту или по спаду. Если по фронту то заношу в переменную допустим 10000 (10 секунд) и отрабатываю нажатие. Если по спаду проверяю переменную если она 0 значит кнопку удерживали более десяти секунд, если не 0 то 10000 - (переменная) = (милс) удержания кнопки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритмы определения зажатой кнопки
СообщениеДобавлено: 12 фев 2017, 16:11 
Старожил
Аватара пользователя

Зарегистрирован: 05 фев 2013, 00:58
Сообщения: 2716
Откуда: Тольятти
Кнопки лучше повесить на регулярное прерывание таймера. Обычно на него же можно повесить индикацию.
В прерывании также устраняется дребезг. Примерно вот так:

Если кнопка нажата, начинаем увеличивать интегратор. Сравниваем с двумя порогами - коротким и длинным. По короткому взводим один флаг, по длинному другой. При отпущенной кнопке интегратор резко роняем до значения, немного меньшее чем короткое, и продолжаем его уменьшать. Когда доходит до 0, перестаем уменьшать, и взводим флаг "отпущена". В основной программе имеем три флажка: получено короткое нажатие, получено длинное нажатие, и кнопку отпустили, и ветвимся по switch-case или обрабатываем другим способом, как нам надо. И не забываем сбрасывать флажок при переходе на его обработку.

Этот подход позволяет написать обработку один раз и забыть про него. Также он легко наращивается по аналогии до нужного количества кнопок. Также можно свободно дорабатывать основное тело без головняков, связанных с кнопками.

На саму кнопку я прерывание никогда не вешаю. Мне не нравится, что дребезг в несколько десятков фронтов заставит процессор все их обрабатывать. Мне кажется, что он что-нибудь пропустит :).

PS. Прерывание по таймеру должно быть настроено так, чтобы вызывалось не менее 100 раз в секунду, чтобы кнопки не тупили. Можно и чаще, если необходима динамическая индикация. Константы подбираются экспериментально.
.
Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритмы определения зажатой кнопки
СообщениеДобавлено: 12 фев 2017, 18:13 
Старожил
Аватара пользователя

Зарегистрирован: 05 фев 2010, 16:57
Сообщения: 2115
Откуда: Нальчик
iev91 писал(а):
...........
Ой... редко можно встретить такого единомышленника, практически первый раз встречаю... )))
Я тоже раньше, при каждом упоминании кнопок, пытался изложить этот алгоритм... потом надоело)

Картинка - красиво нарисована, сам нарисовал или где то готовое было?

У меня отличие алгоритма только в том, что есть отдельный флаг нажатой кнопки и два отдельных счетчика
Первый счетчик - счетчик дребезга (работает и при нажатии и при отпускании... при достижении крайних положений перекидывает флаг нажатия)
Второй счетчик - счетчик длительного удержания (начинает считать после сработки первого счетчика)

Мой последний вариант кстати использует кроме короткого и длинного нажатия еще и авто повтор при удержании...
Что именно выбрать в конкретном месте программы, длинное нажатие или авто повтор - можно решить исходя из нужного алгоритма...
Например там где по длинному нажатию нужен вход в меню - опрашивается именно флаг длинного нажатия, а там где нужно изменять значение на дисплее - опрашивается флаг авто повтора...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритмы определения зажатой кнопки
СообщениеДобавлено: 12 фев 2017, 19:34 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3447
Откуда: Новосибирск
Тут почитайте.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритмы определения зажатой кнопки
СообщениеДобавлено: 12 фев 2017, 19:42 
Старожил
Аватара пользователя

Зарегистрирован: 05 фев 2013, 00:58
Сообщения: 2716
Откуда: Тольятти
ShadS писал(а):
Я тоже раньше, при каждом упоминании кнопок, пытался изложить этот алгоритм... потом надоело)

Странно, что строго раз в 3 месяца один и тот же вопрос всплывает в неизменном виде.
Цитата:
Картинка - красиво нарисована, сам нарисовал или где то готовое было?

Да токо што намалевал за 7 минут. Сам алгоритм для клавиш разрабатывался где-то в конце 80-х, когда я занимался построением своего первого ПК на Z80. У меня была клавиатура Оливетти примерно на 80 кнопок с раскладкой ЙЦУКЕНГ, я сделал все обработки, в том числе и автоповтор. Разница в том, что там получается массив интеграторов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритмы определения зажатой кнопки
СообщениеДобавлено: 16 окт 2017, 18:11 
Старожил
Аватара пользователя

Зарегистрирован: 06 авг 2014, 22:46
Сообщения: 283
Подскажите как лучше организовать обработку отдельных клавишь и их сочитаний (коротких, длинных) и
в перспективе для нескольких "слушателей состояний" и сочитания до 3-4 кнопок (знаю как сделать
железно и что бы работало, но пока есть время немножко извращаюсь и перфекционирую^^).

В программе отсутствуют задержки типа "delay" в ожидании событий, все по флагам/таймерам.

Сейчас пока мысль крутится вокруг кольцевого буфера где под каждую кнопку
выделяю 2 бита для шифровки состояния (не нажата, щелчок, двойной щелчок, удержание). Но опрос
и заполнение буфера никак не могу "красиво" оформить, что-то мысль не идет.
Опрос портов с интервалом 10мс (опрашиваю примерно как описал iev91, на каждую кнопку свой счетчик).
Никак не могу решить как лучше организовать.

Надеюсь понятно выразил мысль, что-то каша в голове)))))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритмы определения зажатой кнопки
СообщениеДобавлено: 16 окт 2017, 18:24 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3447
Откуда: Новосибирск
Что-то исчезли ссылки. Нашел замену. Там найдете ссылку на архив цикла статей Татарчевского. Искомое в 8 части.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритмы определения зажатой кнопки
СообщениеДобавлено: 16 окт 2017, 18:36 
Старожил
Аватара пользователя

Зарегистрирован: 06 авг 2014, 22:46
Сообщения: 283
demiurg1978 писал(а):
Что-то исчезли ссылки. Нашел замену. Там найдете ссылку на архив цикла статей Татарчевского. Искомое в 8 части.

Благодарю!
Исчерпывающий ответ)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритмы определения зажатой кнопки
СообщениеДобавлено: 16 окт 2017, 18:51 
Старожил
Аватара пользователя

Зарегистрирован: 18 апр 2017, 03:01
Сообщения: 835
Ещё есть особенность простой матричной клавиатуры (без диода на каждую кнопку) о которой не все знают - с комбинациями из более чем двух кнопок могут быть проблемы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритмы определения зажатой кнопки
СообщениеДобавлено: 16 окт 2017, 18:56 
Старожил
Аватара пользователя

Зарегистрирован: 06 авг 2014, 22:46
Сообщения: 283
h4lf писал(а):
Ещё есть особенность простой матричной клавиатуры (без диода на каждую кнопку) о которой не все знают - с комбинациями из более чем двух кнопок могут быть проблемы.

У меня не матрица, 1 пин = 1 конпка. 100 ногий МК позволяет такие вольности)
Пока нет проектов где нужно что-то более "крестовины" + пара кнопок.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритмы определения зажатой кнопки
СообщениеДобавлено: 16 окт 2017, 19:20 
Старожил
Аватара пользователя

Зарегистрирован: 18 апр 2017, 03:01
Сообщения: 835
foton6, ну тогда и нет такой проблемы. Я предупредил, потому что в той статье Татарчевского матричная клавиатура.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритмы определения зажатой кнопки
СообщениеДобавлено: 16 окт 2017, 21:05 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3447
Откуда: Новосибирск
Значит вы невнимательно читали. В статье в одной фразе вся суть: обработка всех кнопок, при любом количестве и включении, матрица, просто кнопки, как одна кнопка. Для большинства проектов этого достаточно. Когда требуется отслеживание нескольких кнопок, делаются автоматы для требуемого колва кнопок.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритмы определения зажатой кнопки
СообщениеДобавлено: 16 окт 2017, 22:41 
Старожил
Аватара пользователя

Зарегистрирован: 18 апр 2017, 03:01
Сообщения: 835
demiurg1978, это я невнимательно читал? Да, сама программа может обрабатывать любые кнопки в любом сочетании, так как каждой кнопке соответствует свой отдельный бит. Вот только из-за аппаратного ограничения обычной матрицы эта фраза из статьи:
Цитата:
Таким образом, каждой клавише и каждому сочетанию нажатых клавиш соответствует уникальный скан-код
не соответствует действительности. И программно это не исправляется, но если не нужны сочетания больше чем из двух кнопок - то можно сделать программный фильтр.

Надо сказать, что в начале там ставилась задача корректно обрабатывать только сочетания двух клавиш. А фильтр можно сделать в функции, которая преобразует скан-код в код клавиши (функция GetKeyCode реализация которой в статье не приведена), и скорее всего он там получится сам собой.

ЗЫ: сами статьи годные, мне понравились. Наверное потому, что ещё до их прочтения я (скорее интуитивно) старался писать в автоматном стиле.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритмы определения зажатой кнопки
СообщениеДобавлено: 17 окт 2017, 13:19 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 1741
Я так сделал

Show button.h


Show button.c



Show tim_isr.c



Show main_loop_task.c


Так работает
https://yadi.sk/i/LVKLOLhq3Np6q6


Последний раз редактировалось Pingvin 18 окт 2017, 21:17, всего редактировалось 9 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритмы определения зажатой кнопки
СообщениеДобавлено: 18 окт 2017, 18:37 
Старожил
Аватара пользователя

Зарегистрирован: 06 авг 2014, 22:46
Сообщения: 283
Pingvin писал(а):
Я так сделал
....
Так работает
https://yadi.sk/i/LVKLOLhq3Np6q6


Спасибо, ковыряю, гляжу)
В следующий раз засуньте код в тег кода, а затем под спойлер, а
то без отступов как-то глаза текут)))))))

Я пока так сделал, над реализацией обработчика сижу еще:
Show Пример создания и инициализации кнопок (MAIN.c)

Show Макрос для создания (Buttons.h)

Show Инициализация (Buttons.с)

Тут мне 1 костыль не нравится, рожденный из-за не знания как без него обойтись:
Вовремя создания конпок, макросами генерируются структуры ButtonsStruct, и что бы их связать между собой
использую указатели с кнопки на кнопку и потом один из указателей надо передать в Init функцию.
Вот от этого хотелосьбы избавится, что бы "пользователю" надо было написать только
Код:
d_ButtonCreat(Buttons_UP, GPIOC, 0);            //__Кнопка "Вверх";

И инициализация простая типа void/void.
Был бы рад подсказакам по костылю.)))

P.S.
Pingvin, спасибо, что тег кода добавили!!! Я сейчас морально решился разгребать без отступов все эти
скобочки, БАХ, а тут все красиво)))))))


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 18 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB