Например TDA7294

 Форум РадиоКот • Просмотр темы - Опрос кнопок микроконтроллером
Форум РадиоКот
Здесь можно немножко помяукать :)



Текущее время: Ср мар 20, 2019 06:27:57



Часовой пояс: UTC + 3 часа [ Летнее время ]


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 316 ]     ... , , , , 16
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Обработка нажатия кнопки в AVR...
СообщениеДобавлено: Пт янв 11, 2019 12:21:24 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 82
Рейтинг сообщений: 1339
Зарегистрирован: Чт дек 28, 2006 09:19:56
Сообщений: 13257
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
BOB51 писал(а):
Как под Си...
так же, как и у пчёлок :)))

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка нажатия кнопки в AVR...
СообщениеДобавлено: Пт янв 11, 2019 16:19:39 
Первый раз сказал Мяу!
Аватар пользователя

Карма: 3
Рейтинг сообщений: 0
Зарегистрирован: Вт сен 27, 2011 08:28:44
Сообщений: 24
Откуда: Москва
Рейтинг сообщения: 0
Необходим алгоритм для определения последней устойчивой КОМБИНАЦИИ нажатых/активных кнопок, а не "поштучное" оценивание каждой кнопы в отдельности.
8)
Без схемотехники кноп затруднительно подсказать...
:dont_know:

Кнопки нажимаются на землю, подтянуты внутренними резисторами МК к питанию. Вот по поводу алгоритма как раз и тупняк. На асме когда писал, все получалось, на Сях туго идет.
Вот имеется прерывание, ну не совсем так конечно, итог работы этого прерывания - флаг разрешения опроса опроса кнопок, который выставляется через каждые 50мс. Получается мне надо считать все кнопки в одну переменную и куда-то положить это, а уже в следующем прерывании считать снова и сравнить с предыдущем результатом и выплюнуть статус кнопок в виде возвращаемого значения функции? Но уберет ли это дребезг? Антидребезг это ведь не просто опрос через определенный интервал, тут логика нужна. Я перед тем как написать поизучал и попробовал несколько алгоритмов. Специально для проверки написал конечный автомат - переключалку светодиода, по его работе очень хорошо видно что бывает, когда алгоритм кривой.

ARV писал(а):
по-моему, надо просто убрать все флаги и тупо выполнять в switch-е нужное действие по коду нажатой кнопки. в этом случае надо учитывать и комбинации нажатых кнопок. при необходимости после switch-а дожидаться отпускания кнопок.

Здравствуйте, Роман! Я так пробовал, убираешь флаги светодиоды начинают переключаться и не очень четко (см. про переключалку выше) с каждым новом заходом в опрос кнопок. Ведь у меня алгоритм такой, что я при первом нажатии что-то делаю, а потом выставляю флаг, что дело сделано и если что-то на линии - это дребезг, а интервала от первого "круга" до второго 50мс как раз хватает понять, дребезг или нет. В общем по вашему совету в дефолте свитча сейчас добавил условие: если переменная с кнопками равна нулю, то сбрасываем все флаги, иначе выставляем все флаги принудительно. Выглядит так, работает четко. Но я чувствую, что алгоритм кривой...
Код:
void buttons (void)
{
   btns=~PIND; //читаем PIND в переменную и инвертируем прочитанное
   btns=btns&((1<<BTN1)|(1<<BTN2)|(1<<BTN3)); //отсекаем лишние разряды, оставляем только кнопки

   switch(btns)
   {
      case (1<<BTN1): //если нажата кнопка 1
        if(~flags&(1<<BTN1)) //если флаг первой кнопки не установлен, то
           {
              flags|=(1<<BTN1); //устанавливаем флаг
            toggle(RED); //что-то делаем
         }   
          break; //и на выход

      case (1<<BTN2): //если нажата кнопка 2
        if(~flags&(1<<BTN2)) //если флаг второй кнопки не установлен, то
          {
               flags|=(1<<BTN2); //устанавливаем флаг
            toggle(YELLOW); //что-то делаем
          }
         break; //и на выход

      case (1<<BTN3): //если нажата кнопка 3
        if (~flags&(1<<BTN3)) //если флаг третьей кнопки не установлен, то
               {
            flags|=(1<<BTN3); //устанавливаем флаг
            toggle(GREEN); //что-то делаем
          }
       break; //и на выход

      default: //если не нажата ни одна кнопка или любая другая комбинация
        if (btns==0)
         {
          flags=0; //сбрасываем все флаги
              }
        else
         {
         flags=(1<<BTN1)|(1<<BTN2)|(1<<BTN3); //выставляем все флаги
         }
       break; //и на выход
   }
   keys=0; //сбрасываем флаг разрешения опроса кнопок
}

Господа, большое спасибо за помощь! А то я в дефолте уже пытался еще один свитч нагородить... В общем получились четкие однократные "бабушкины" кнопки, что и хотел!

_________________
Меня Вадег зовут.
Извените от слова - Веник, Извините от слова - Вина.


Вернуться наверх
 
JLCPCB, 10 прототипов ПП всего за $2 и 2 дня доставка!

Крупнейший производитель печатных плат в Китае, 300,000+ заказчиков, 10,000+ он-лайн заказов в день.

Рассчитайте цену онлайн:https://jlcpcb.com/quote

Не в сети
 Заголовок сообщения: Re: Опрос кнопок микроконтроллером
СообщениеДобавлено: Пт янв 11, 2019 19:19:15 
Друг Кота
Аватар пользователя

Карма: 79
Рейтинг сообщений: 700
Зарегистрирован: Вт мар 16, 2010 23:02:27
Сообщений: 9005
Откуда: ДОНЕЦК (ЮГО-ВОСТОК ua/DPR)
Рейтинг сообщения: 0
Вариант кнопы на адурине (вобщем тот же Си) - учебно-тренировочный проект.
Вложение:
max72t3.rar [54.83 KiB]
Скачиваний: 15

Антидребезг плюс смена функционала (секундомер - пуск-стоп-сброс)
То же на switch и флагах но в режиме поллинга, а не по прерыванию.
:dont_know:


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $88 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay
Не в сети
 Заголовок сообщения: Re: Опрос кнопок микроконтроллером
СообщениеДобавлено: Пт янв 11, 2019 19:41:28 
Первый раз сказал Мяу!
Аватар пользователя

Карма: 3
Рейтинг сообщений: 0
Зарегистрирован: Вт сен 27, 2011 08:28:44
Сообщений: 24
Откуда: Москва
Рейтинг сообщения: 0
Вариант кнопы на адурине (вобщем тот же Си) - учебно-тренировочный проект.

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

_________________
Меня Вадег зовут.
Извените от слова - Веник, Извините от слова - Вина.


Вернуться наверх
 
Впервые на русском языке! «Поваренная книга разработчика аналоговых схем: аналого-цифровые преобразователи»

Практическое руководство «Разработчика аналоговой электроники по аналого-цифровым преобразователям», созданной инженерами компании Texas Instruments. Руководство содержит конкретные схемотехнические примеры, пошаговые инструкции с формулами, позволяющими адаптировать схему к конкретному проекту. Результаты расчетов дополнительно проверяются в программе SPICE-моделирования.
Подробнее...
Не в сети
 Заголовок сообщения: Re: Опрос кнопок микроконтроллером
СообщениеДобавлено: Сб янв 12, 2019 00:47:23 
Друг Кота

Карма: 28
Рейтинг сообщений: 555
Зарегистрирован: Чт май 05, 2011 22:26:34
Сообщений: 4485
Откуда: Украина, Славутич
Рейтинг сообщения: 0
Да нормально убирает дребезг опрос с интервалом. Верней, работа кнопки перестаёт зависеть от дребезга. Если мозгами пораскинуть - когда опрос приходится на отсутствующий дребезг т.е. или точно нажата или точно отпущена у нас проблем нет никаких, а вот когда опрашиваем в момент дребезга - появляется неопределённость кнопка может считаться нажатой или отпущеной - одно из двух, и эта неопределённость не страшна сама по себе, ведь мы знаем если движение толкателя кнопки начато то к следующему опросу оно точно закончится и дребезг гарантированно пройдет. Страшно становится когда мы после первого чтения сразу же читаем второй раз, и попадаем скорей всего на тот же дребезг и ту же неопределённость, и вот тут начинается веселье - в первое чтение мы видим что кнопка нажата, второе - отпущена, регистрируем клик... потом ещё один, пятый десятый... и всё это менее чем за 1мс. Но если между чтением кнопки мы выдерживаем интервал НЕ МЕНЕЕ чем длится дребезг кнопки, то мы можем быть уверены что второе чтение точно не попадёт на дребезг, несмотря на момент первого чтения - приходился он на начало дребезга или конец... в худшем случае, если считываем в момент дребезга и выпадает состояние "отпущена" мы зарегистрируем кнопку следующим опросом, когда точно дребезга уже не будет.


Вернуться наверх
 
Впервые на русском языке! Работаем с микроконтроллерами STM32F7(на основе STM32F7 Online Training)

Цикл материалов на основе STM32F7 Online Training от компании STMicroelectronics.
Описаны функциональные блоки и инструменты разработки для семейства микроконтроллеров STM32F7, охватывающие тематику системной периферии, памяти, безопасности, аналоговой периферии, цифровой периферии, таймеров, экосистемы.
Подробнее...
Не в сети
 Заголовок сообщения: Re: Опрос кнопок микроконтроллером
СообщениеДобавлено: Пн фев 18, 2019 09:45:05 
Открыл глаза

Зарегистрирован: Пн дек 19, 2016 11:20:28
Сообщений: 43
Рейтинг сообщения: 0
Дабы не плодить новой темы про энкодер, задам вопрос сюда, ибо энкодер, это те же кнопки :)

Подскажите, нужен ли триггер шмитта для подключения энкодера к МК? Я поставил RC фильтры для устранения дребезга, но фронты сигналов от этого стали не вертикальными.
Собственно нужен ли для восстановления фронта триггер шмитта или это "масло маслянное" и в МК уже все на входе есть?

P.S. МК AVR.


Вернуться наверх
 


В сети
 Заголовок сообщения: Re: Опрос кнопок микроконтроллером
СообщениеДобавлено: Пн фев 18, 2019 11:17:55 
Друг Кота

Карма: 51
Рейтинг сообщений: 624
Зарегистрирован: Пт мар 07, 2008 07:54:43
Сообщений: 3459
Откуда: Ижевск
Рейтинг сообщения: 0
Триггер Шмитта не нужен, а вот резистор подтяжки примерно 1...2к здорово помогает от дребезга.
Так работает энкодер со встроенными подтяжками

Так работает тот же энкодер с внешними подтяжками


Вложения:
Валкодер3.PNG [122.38 KiB]
Скачиваний: 47
valcoder 001_1.jpg [46.79 KiB]
Скачиваний: 38
Вернуться наверх
 


Не в сети
 Заголовок сообщения: Re: Опрос кнопок микроконтроллером
СообщениеДобавлено: Пн фев 18, 2019 12:28:30 
Друг Кота

Карма: 28
Рейтинг сообщений: 555
Зарегистрирован: Чт май 05, 2011 22:26:34
Сообщений: 4485
Откуда: Украина, Славутич
Рейтинг сообщения: 0
Там не нужно подавление дребезга. Оно наоборот только портит всё.


Вернуться наверх
 
Prist.ru- удобный сайт для поиска, сравнения и покупки радиоизмерительных и электроизмерительных приборов, таких как: осциллограф, анализатор спектра, генератор сигналов, частотомер, мультиметр, лабораторный источник питания и др. На сайте есть актуальная информация о ценах и наличии приборов на складе.

Не в сети
 Заголовок сообщения: Re: Опрос кнопок микроконтроллером
СообщениеДобавлено: Чт мар 14, 2019 17:32:35 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 13
Рейтинг сообщений: 219
Зарегистрирован: Ср янв 16, 2008 09:34:04
Сообщений: 2062
Откуда: KMV
Рейтинг сообщения: 0
Появилась надобность в алгоритме опроса кнопок, чтобы он умел отслеживать короткие и длинные нажатия. При этом не использовать тупых задержек, а опрос кнопок вести по прерыванию от таймера с частотой 100 Гц. У меня с наскока победить не удалось. То короткие нажатия хорошо ловит, но не ловит длинные, то наоборот. Начал уже на бумаге алгоритмы накидывать, но все получается какое-то корявое.
Сегодня случайно нашел нарисованный алгоритм, реализовал его в коде, но и он не пашет.
Оригинал.
Изображение
Стал внимательно изучать, и что-то мне кажется, с ним не все гладко и есть ошибки. Помогите довести алгоритм до ума!
Изображение

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

_________________
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.


Вернуться наверх
 
Хороший помощник- половина работы!
Надежные источники питания, осциллографы, паяльные станции, цифровые микроскопы в интернет-магазине "Суперайс".
Индивидуальные скидки, акции, бесплатная доставка

Не в сети
 Заголовок сообщения: Re: Опрос кнопок микроконтроллером
СообщениеДобавлено: Чт мар 14, 2019 19:11:37 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 82
Рейтинг сообщений: 1339
Зарегистрирован: Чт дек 28, 2006 09:19:56
Сообщений: 13257
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
вы сформулируйте, что такое длинные и короткие нажатия.
я вот понимаю короткое нажатие это просто нажатие, а долгое - это автоповтор нажатой кнопки. однако, бывают случаи, когда код нажатой на 0,1 сек кнопуи и код нажатой на 1,5 сек кнопки должны отличаться. соответственно, и алгоритмы разные...

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Опрос кнопок микроконтроллером
СообщениеДобавлено: Чт мар 14, 2019 20:11:27 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 13
Рейтинг сообщений: 219
Зарегистрирован: Ср янв 16, 2008 09:34:04
Сообщений: 2062
Откуда: KMV
Рейтинг сообщения: 0
Короткое - это клик кнопкой. С учетом подавления дребезга, как на картинке, пусть будет 100мс. Длинное нажатие - 2 секунды.
Судя по картинке с алгоритмом, короткое нажатие там выставляется b1 минимум через 200 мс. Вначале считаем 100 мс при нажатой кнопке и выставляется бит b0. А затем после отпускания кнопки, на количество тиков в первом счетчике. А там их может быть вплоть до времени длительного нажатия. Это снижает реакцию системы на следующее нажатие. Это второй ошибочный, на мой взгляд, момент в этом алгоритме. Надо по-другому: проверять при отпускании кнопки бит b0 и счетчик1. Если оба имеют не нулевые значения, то считать коротким нажатием.

_________________
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Опрос кнопок микроконтроллером
СообщениеДобавлено: Чт мар 14, 2019 21:50:58 
Друг Кота

Карма: 28
Рейтинг сообщений: 555
Зарегистрирован: Чт май 05, 2011 22:26:34
Сообщений: 4485
Откуда: Украина, Славутич
Рейтинг сообщения: 0
Там защита от дребезга уже не нужна. Сам опрос каждые 10мс и есть защита от дребезга для кнопок с дребезгом меньше 10мс. В чем смысл алгоритма? Считайте прерывания, отслеживайте отпускание кнопки - если оно произошло до того как счетчик досчитает до 250 - значит это короткое, если счетчик досчитает 250 - регистрировать как длинное и ждать отпускание кнопки. После отпускания сбросить счетчик времени нажатия.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Опрос кнопок микроконтроллером
СообщениеДобавлено: Чт мар 14, 2019 22:00:36 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 13
Рейтинг сообщений: 219
Зарегистрирован: Ср янв 16, 2008 09:34:04
Сообщений: 2062
Откуда: KMV
Рейтинг сообщения: 0
соответственно, и алгоритмы разные...

На мой дилетантский взгляд, с точки зрения опроса кнопок, алгоритм ничем не отличается. В данном конкретном случае надо отслеживать два типа событий: длинное нажатие на кнопку и короткое.
А каким образом эти события будут дальше в программе обрабатываться, на суть алгоритма не влияет.
Alexeyslav писал(а):
Сам опрос каждые 10мс и есть защита от дребезга

Не уверен в этом. По крайней мере надо будет отслеживать в данном случае отличается ли код кнопки через 10 мс от предыдущего. Дребезги всякие бывают.
Ранее, когда делал защиту от дребезга на задержках, наиболее стабильно отслеживался клик после паузы в 100 мс с несколькими промежуточными проверками кнопки. При 50 мс я ловил ложные срабатывания.

_________________
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Опрос кнопок микроконтроллером
СообщениеДобавлено: Чт мар 14, 2019 23:04:25 
Друг Кота

Карма: 28
Рейтинг сообщений: 555
Зарегистрирован: Чт май 05, 2011 22:26:34
Сообщений: 4485
Откуда: Украина, Славутич
Рейтинг сообщения: 0
Кнопка которая брынчит на 50мс - надо выкидывать. Может конечно это и не дребезг у ней вовсе, а особенность конструкции когда происходит разрыв контакта при сильном нажатии. В любом случае таким низкокачественным конопкам место в мусорном ведре. Но если хочется такие кнопки всё же использовать, ставь скорость 10 опросов в секунду всеравно надежно различить нажатие такой кнопки будет трудно с большей скорсотью, но это уже добавит дискомфорт в пользование устройством и будет ужаснейшим решением с точки зрения пользовательского опыта. Проще кнопки поменять.
Отслеживать состояние кнопок проще простого - заводишь их всех в регистр, сравниваешь функцией XOR с предыдущим состоянием и там где остаётся "1" - значит в тех кнопках произошли изменения а какие это изменения узнаёшь с текущего состояния - "1" значит произошло нажатие "0" - отпускание.
Досихпор эта логика не давала сбоев при исправных кнопках.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Опрос кнопок микроконтроллером
СообщениеДобавлено: Пт мар 15, 2019 09:53:22 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 13
Рейтинг сообщений: 219
Зарегистрирован: Ср янв 16, 2008 09:34:04
Сообщений: 2062
Откуда: KMV
Рейтинг сообщения: 0
заводишь их всех в регистр, сравниваешь функцией XOR с предыдущим состоянием

Интересный метод. С точки зрения логики красивый, можно отслеживать одновременное нажатие кнопок. Но практически я такой реализации нигде не встречал, и сам не делал, естественно. Надо обмозговать.

Добавлено after 31 minute 53 seconds:
Переделал алгоритм в соответствии с моими размышлениями здесь https://radiokot.ru/forum/viewtopic.php ... 8#p3591468
и все заработало. dec Сч1 - это зло

_________________
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Опрос кнопок микроконтроллером
СообщениеДобавлено: Пт мар 15, 2019 10:00:38 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 82
Рейтинг сообщений: 1339
Зарегистрирован: Чт дек 28, 2006 09:19:56
Сообщений: 13257
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
я опрашиваю матричную клавиатуру по таймеру каждые 50 мс (для борьбы с дребезгом) и вызываю вот такую функцию:
Код:
static void key_repeater(char kk){
   MAKE_TIMER(TR, 0, 0);
   static char old_kk;

   if(kk == 0){
      timer_stop(&TR);
   } else {
      if(old_kk != kk){
         timer_start(&TR, 1000, 0);
         put_message(QUEUE, MSG_KEY, kk, 0);
      } else {
         if(timeout(&TR)){
            timer_start(&TR, 300, 0);
            put_message(QUEUE, MSG_KEY, kk, 0);
         }
      }
   }
   old_kk = kk;
}
тут я применяю программный таймер TR и очередь сообщений, через которую моя программа узнает о том, что кнопка нажата (т.е. как бы опроса нет, есть обработка события "кнопка нажата").

алгоритм должен легко просмариваться по коду.
если символ kk равен 0 - это значит, не нажата ни одна кнопка, в этом случае таймер TR останавливается и все.
если же символ не нулевой, то происходит сравнение его с тем значением, что было при предыдущем вызове функции.
если они разные, значит, обнаружено первичное нажаие кнопки (клик). в этом случае запускается таймера на период 1 сек и посылается сообщение в очередь с кодом кнопки.
если предыдущее и текущее значение символа одинаковы, то сообщение посылается только посл истечения таймера, причем в этом случае он заново переустанавливается на интервал 300 мс.

в итоге имеем:
1. реакцию на однократное нажатие - клик
2. реакция на долгое удержание: после 1 сек удержания начинается автоповтор кода 3 раза в секунду.

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


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 316 ]     ... , , , , 16



Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на форуме

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


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

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


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y