Например TDA7294

Форум РадиоКот • Просмотр темы - Обработка кнопок, EXTI[0]
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Ср июн 18, 2025 12:57:55

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


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



Начать новую тему Ответить на тему  [ Сообщений: 71 ]  1, , ,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Обработка кнопок, EXTI[0]
СообщениеДобавлено: Пн ноя 11, 2024 17:16:30 
Нашел транзистор. Понюхал.

Зарегистрирован: Вс мар 27, 2022 09:38:17
Сообщений: 160
Рейтинг сообщения: 0
Добрый вечер кому как.
Подскажите пожалуйста варианты обработки кнопочек, для меню.
Спасибо.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка кнопок, EXTI[0]
СообщениеДобавлено: Пн ноя 11, 2024 18:51:07 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1337
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4559
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Покажите свои варианты, а мы оценим :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка кнопок, EXTI[0]
СообщениеДобавлено: Пн ноя 11, 2024 19:36:46 
Друг Кота
Аватар пользователя

Карма: 94
Рейтинг сообщений: 1466
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15038
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Вариантов огромное множество.
Зависит от схемы, компилятора и идеи самого устройства.
8)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка кнопок, EXTI[0]
СообщениеДобавлено: Вт ноя 12, 2024 07:34:19 
Нашел транзистор. Понюхал.

Зарегистрирован: Вс мар 27, 2022 09:38:17
Сообщений: 160
Рейтинг сообщения: 0
Ну, тут просто флаги и переменные...

Изображение

Добавлено after 4 minutes 5 seconds:
Потом просто хендлер с прерываниями по спаду и по фронту поднимает и опускает флажки при нажатии кнопок...
Нажата кнопка флаг true отжата false... Булий...

Изображение

Добавлено after 5 minutes 38 seconds:
Дальше настроил таймер 3 на 100Гц и в прерывании с частотой 100 ГЦ идёт опрос кнопок и обработка ADC и если флаг
кнопки true тогда накапливаем переменную при каждом входе в прерывание если флаг позволяет. Это такакя у меня попытка была создать короткие и долгие нажатия кнопок. Ну и всё... Дальше я завис...



Изображение

Добавлено after 5 minutes 6 seconds:
Хочу посмотреть другие решения, сколько людей столько и идей... Не хотелось бы прибегать к каким то библиотекам тем более всего 3 кнопки да и библиотеки все на HAL а я использую CMSIS, она меньше памяти хавает правда проблем в 1000.000 раз больше чем в HAL ..


Вернуться наверх
 
В продаже новые LED-драйверы XLC компании MEAN WELL с диммингом нового поколения

Компания MEAN WELL пополнила ассортимент своей широкой линейки светодиодных драйверов новым семейством XLC для внутреннего освещения. Главное отличие – поддержка широкого спектра проводных и беспроводных технологий диммирования. Новинки представлены в MEANWELL.market моделями с мощностями 25 Вт, 40 Вт и 60 Вт. В линейке есть модели, работающие как в режиме стабилизации тока (СС), так и в режиме стабилизации напряжения (CV) значением 12, 24 и 48 В.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Обработка кнопок, EXTI[0]
СообщениеДобавлено: Вт ноя 12, 2024 10:39:49 
Друг Кота

Карма: 68
Рейтинг сообщений: 1958
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 12867
Рейтинг сообщения: 0
А что, в АРМах теперь для флагов один бит нельзя? И проверки битов больше нет?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка кнопок, EXTI[0]
СообщениеДобавлено: Вт ноя 12, 2024 11:26:19 
Прорезались зубы
Аватар пользователя

Карма: 5
Рейтинг сообщений: 30
Зарегистрирован: Пн июл 04, 2016 16:51:22
Сообщений: 221
Откуда: Россия, Омск
Рейтинг сообщения: 0
Кто как, а я опрашиваю кнопки в основном потоке, когда код ничего не делает (внутри while (1) { .... __WFI(); } ) обычно после выхода из сна, а флаг "пора проверить кнопки" выставляется таймером.

Но суть это не меняет. Логика примерно та же:
- Читаем состояние.
- Увеличиваем/уменьшаем переменную (софт-фильтр), если она в нормальных пределах. Если она в ОСОБЫХ значениях - то это нажатие или длительное нажатие (или даже повторы)

Псевдокод:
Код:
if (ButtonFilter[N] == BTN_PRESS_DURATION) {
  DoPressCallback(N);
} else if (ButtonFilter[N] == BTN_LONG_PRESS_DURATION) {
  DoLongPressCallback(N);
} else if (ButtonFilter[N] == BTN_LONG_PRESS_REPEAT_DURATION) {
  DoPressRepeatCallback(N);
  ButtonFilter[N] -= BTN_REPEAT_DURATION;
}


И условия:
0 < BTN_PRESS_DURATION < BTN_LONG_PRESS_DURATION < BTN_LONG_PRESS_REPEAT_DURATION
BTN_REPEAT_DURATION > 0
BTN_REPEAT_DURATION > (BTN_LONG_PRESS_REPEAT_DURATION - BTN_LONG_PRESS_DURATION)

Например, BTN_PRESS_DURATION = 50мс
BTN_LONG_PRESS_DURATION = 500мс
BTN_LONG_PRESS_REPEAT_DURATION = 800мс
BTN_REPEAT_DURATION = 200мс

Таким образом счётчик фильтра кнопки будет считать с нуля (у меня каждую милисекунду просыпается контроллер, ибо SysTickRate = 1kHz), на отметке 50мс после нажатия кнопки (считается, что антидребезг работает и устранил момент искрения контактов) сработает "Нажатие", затем через 450мс отработает "Длительное нажатие" (можно поднять до 1с), ещё через 300 запустятся повторы и счётчик будет сброшен на значение 600мс и продолжёт тикать вверх до 800, генерируя новый "повтор".
И так циклически, пока кнопку не отпустят.

Естественно, длительности нужно подбирать "под свои потребности"


Спойлер
Код:
#define BTN_FILTER         50
uint8_t Buttons_Tmr[3];

void ButtonsRd(void) {
   // Power
   if (GPIOA->IDR & GPIO_IDR_5) {
      if (Buttons_Tmr[0] < BTN_FILTER * 5) {
         Buttons_Tmr[0]++;
         if (Buttons_Tmr[0] == BTN_FILTER * 5) {
            Buttons_Tmr[0]++;
            OnBtnPress(0);
         }
      }
   } else {
      if (Buttons_Tmr[0]) {
         Buttons_Tmr[0]--;
      }
   }
   // Next
   if (GPIOA->IDR & GPIO_IDR_9) {
      if (Buttons_Tmr[1] < BTN_FILTER) {
         Buttons_Tmr[1]++;
         if (Buttons_Tmr[1] == BTN_FILTER) {
            Buttons_Tmr[1]++;
            OnBtnPress(1);
         }
      }
   } else {
      if (Buttons_Tmr[1]) {
         Buttons_Tmr[1]--;
      }
   }
   // Mode
   if (GPIOA->IDR & GPIO_IDR_10) {
      if (Buttons_Tmr[2] < BTN_FILTER) {
         Buttons_Tmr[2]++;
         if (Buttons_Tmr[2] == BTN_FILTER) {
            Buttons_Tmr[2]++;
            timer = 0;
            OnBtnPress(2);
         }
      }
   } else {
      if (Buttons_Tmr[2]) {
         Buttons_Tmr[2]--;
      }
   }
}

int main(void) {
// Инициализация пропущена, оставлен только основной цикл
   while(1) {
      __WFI();
      ButtonsRd();
      Job();
   }
}

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

А тут - использую, но без повторов:
Код:
void ButtonFilfer(uint8_t ButtonNumber, uint8_t Direction) {
   if (Direction) {
      BtnFilter[ButtonNumber]++;
      if (BtnFilter[ButtonNumber] == BUTTON_PRESS_DURATION) {
         // OnPress()
         OnButtonPress(ButtonNumber);
      } else if (BtnFilter[ButtonNumber] == BUTTON_LONG_PRESS_DUR) {
         // On LongPress()
         OnButtonLongPress(ButtonNumber);
      } else if (BtnFilter[ButtonNumber] > BUTTON_LONG_PRESS_DUR) {
         BtnFilter[ButtonNumber] = BUTTON_LONG_PRESS_DUR;
      }
   } else {
      if (BtnFilter[ButtonNumber]) {
         BtnFilter[ButtonNumber] = 0;
         OnButtonRelease(ButtonNumber);
      } else {
         BtnFilter[ButtonNumber] = 0;
         OnButtonRelease(ButtonNumber);
      }
   }
}


Вернуться наверх
 
Распродажа паяльного оборудования ATTEN!
Паяльные станции, паяльники и аксессуары по самой выгодной цене.

По промокоду radiokot скидка 10%
Не в сети
 Заголовок сообщения: Re: Обработка кнопок, EXTI[0]
СообщениеДобавлено: Вт ноя 12, 2024 11:39:43 
Это не хвост, это антенна

Карма: -10
Рейтинг сообщений: 171
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 1482
Рейтинг сообщения: 0
Потом просто хендлер с прерываниями по спаду и по фронту поднимает и опускает флажки при нажатии кнопок...
1. Зачем сброс флагов - тремя операциями вместо одной?
2. Чтение GPIOA->IDR то же самое - зачем 6(!) чтений вместо одного??? :shock:
3. Вместо прерывания EXTI лучше использовать периодическое прерывание.

При таком кривом обработчике прерываний иногда будут создаваться ситуации, когда кнопка оказывается залипшей в нажатом состоянии (или будут пропуски нажатий). Из-за того, что читаете GPIOA->IDR много раз вместо одного.
Подумайте - что будет, если кнопка изменит состояние между вашими чтениями?

PS: Для вставки кода здесь есть соответствующий тэг "Code". (вместо картинок)


Последний раз редактировалось jcxz Вт ноя 12, 2024 11:43:16, всего редактировалось 2 раз(а).

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка кнопок, EXTI[0]
СообщениеДобавлено: Вт ноя 12, 2024 11:40:23 
Нашел транзистор. Понюхал.

Зарегистрирован: Вс мар 27, 2022 09:38:17
Сообщений: 160
Рейтинг сообщения: 0
Обработчик у вас интересный. Пожалуй я его возьму к себе в проект. Только у меня контролер не спит но я могу поместить обработчик в хендлер по таймеру там у меня он на 100Гц настроен думаю этого вполне достаточно будет.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка кнопок, EXTI[0]
СообщениеДобавлено: Вт ноя 12, 2024 11:52:54 
Это не хвост, это антенна

Карма: -10
Рейтинг сообщений: 171
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 1482
Рейтинг сообщения: 0
Дальше настроил таймер 3 на 100Гц и в прерывании с частотой 100 ГЦ идёт опрос кнопок
Зачем тогда EXTI, если уже есть периодическое прерывание?
Какой-то бурелом..... :facepalm:

Добавлено after 1 minute 55 seconds:
А что, в АРМах теперь для флагов один бит нельзя? И проверки битов больше нет?
Автор один и тот же порт, содержащий все кнопки, читает 6 раз! А вы про битовые переменные.... 8)
Он в принципе не понимает что такое "биты". Судя по коду. :dont_know:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка кнопок, EXTI[0]
СообщениеДобавлено: Вт ноя 12, 2024 11:59:40 
Нашел транзистор. Понюхал.

Зарегистрирован: Вс мар 27, 2022 09:38:17
Сообщений: 160
Рейтинг сообщения: 0
Чё вы несёте??? Какие 6 раз???
Там прерывание настроено по фронту и по спаду на каждый пин порта "А" который опрашивается. Порт в нуле флаг поднялся, второе прерывание когда порт в +3,3 когда кнопку бросил флаг сбросился чё не понятно какие 6 раз читайте внимательно что написанно


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка кнопок, EXTI[0]
СообщениеДобавлено: Вт ноя 12, 2024 12:01:54 
Это не хвост, это антенна

Карма: -10
Рейтинг сообщений: 171
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 1482
Рейтинг сообщения: 4
Примерно так:
Код:
enum {BUT_1, BUT_2, BUT_3, ...};
uint volatile buttons = 0;

void Isr()
{
  EXTI->PR = EXTI_PR_PR5 | EXTI_PR_PR6 | EXTI_PR_PR7;
  uint i = GPIOA->IDR, c = 0;
  if (!(i & 1 << 7)) c += 1 << BUT_1;
  if (!(i & 1 << 6)) c += 1 << BUT_2;
  if (!(i & 1 << 5)) c += 1 << BUT_3;
  buttons = c;
}
Также обращаем внимание на volatile.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка кнопок, EXTI[0]
СообщениеДобавлено: Вт ноя 12, 2024 12:02:08 
Нашел транзистор. Понюхал.

Зарегистрирован: Вс мар 27, 2022 09:38:17
Сообщений: 160
Рейтинг сообщения: 0
EXTI настраивал дамал флагами как-то кнопки отслеживать но можно и без них я пробовал варианты какие лучше


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка кнопок, EXTI[0]
СообщениеДобавлено: Вт ноя 12, 2024 12:03:42 
Это не хвост, это антенна

Карма: -10
Рейтинг сообщений: 171
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 1482
Рейтинг сообщения: 0
Чё вы несёте??? Какие 6 раз???
"Несёте" это вы.

чё не понятно какие 6 раз читайте внимательно что написанно
Ясно. Гопник детектед.
Дальше в своём говнокоде бултыхайтесь сами.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка кнопок, EXTI[0]
СообщениеДобавлено: Вт ноя 12, 2024 12:40:54 
Друг Кота

Карма: 68
Рейтинг сообщений: 1958
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 12867
Рейтинг сообщения: 0
EXTI настраивал думал флагами как-то кнопки отслеживать но можно и без них я пробовал варианты какие лучше

Это метод тыка. Даже если получите рабочий вариант, это не даст опыта и знаний.
Надо по науке: изучить язык, изучить контроллер, продумать алгоритм. И вот тогда идти на форум и спрашивать непонятное. Но, скорее всего, с таким вопросом уже не придёте - не будет непонятного, или же быстро разберётесь сами.
jcxz привёл код, так что, больше и говорить нечего.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка кнопок, EXTI[0]
СообщениеДобавлено: Вт ноя 12, 2024 13:13:19 
Это не хвост, это антенна

Карма: -10
Рейтинг сообщений: 171
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 1482
Рейтинг сообщения: 0
jcxz привёл код, так что, больше и говорить нечего.
По уму в той процедуре ещё хорошо бы после:
Код:
EXTI->PR = EXTI_PR_PR5 | EXTI_PR_PR6 | EXTI_PR_PR7;
добавить какую-то синхронизацию перед чтением IDR. Чтобы быть уверенным, что запись в EXTI->PR реально выполнилась к моменту чтения IDR.
Например так (обратным чтением):
Код:
EXTI->PR = EXTI_PR_PR5 | EXTI_PR_PR6 | EXTI_PR_PR7;
uint j = EXTI->PR;
uint i = GPIOA->IDR, c = 0;
...
Потому как EXTI и GPIO - разная периферия, а значит - может находиться на разных сегментах шин МК.
Иначе - есть вероятность сбросить событие переключения состояния кнопки до его чтения.

Но это уже - не для ТС. Ему - не читать. Иначе - есть опасность поумнеть. 8)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка кнопок, EXTI[0]
СообщениеДобавлено: Вт ноя 12, 2024 13:17:30 
Нашел транзистор. Понюхал.

Зарегистрирован: Вс мар 27, 2022 09:38:17
Сообщений: 160
Рейтинг сообщения: 0
За код спасибо!
Меня и интересовали методы реализации опроса кнопок.
Хотел посмотреть кто как делает чтоб не придумывать то что давно придумано.
Ну ничего, разберёмся по маленьку...


Последний раз редактировалось aleksey chilov Вт ноя 12, 2024 13:23:59, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка кнопок, EXTI[0]
СообщениеДобавлено: Вт ноя 12, 2024 13:20:41 
Мучитель микросхем

Зарегистрирован: Вт окт 01, 2024 15:22:33
Сообщений: 419
Рейтинг сообщения: 0
Код:
  uint i = GPIOA->IDR, c = 0;
  if (!(i & 1 << 7)) c += 1 << BUT_1;
  if (!(i & 1 << 6)) c += 1 << BUT_2;
  if (!(i & 1 << 5)) c += 1 << BUT_3;
  buttons = c;
}

Тут напрашивается функция которая будет битики переносить:
Код:
uint32_t i = GPIOA->IDR;
buttons = moveBit(i, 7, BUT_1) | moveBit(i, 6, BUT_2) | moveBit(i, 5, BUT_3);


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка кнопок, EXTI[0]
СообщениеДобавлено: Вт ноя 12, 2024 13:22:46 
Это не хвост, это антенна

Карма: -10
Рейтинг сообщений: 171
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 1482
Рейтинг сообщения: 0
Тут напрашивается функция которая будет битики переносить:
Код:
uint32_t i = GPIOA->IDR;
buttons = moveBit(i, 7, BUT_1) | moveBit(i, 6, BUT_2) | moveBit(i, 5, BUT_3);
Конечно, так лучше. Но для начинающих может быть уже сложно. Не все они знают - что такое макросы. :wink:

Ещё лучше описать пины кнопок в хидере:
Код:
#define PIN_BUTTON1        A, 7
#define PIN_BUTTON2        A, 6
#define PIN_BUTTON3        A, 5
...
и ссылаться через них, а не через "магические числа".
PS: Это для тех, кто знает - что такое "макрос". :wink:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка кнопок, EXTI[0]
СообщениеДобавлено: Вт ноя 12, 2024 13:35:34 
Друг Кота

Карма: 68
Рейтинг сообщений: 1958
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 12867
Рейтинг сообщения: 0
buttons = GPIOA->IDR & mask; ;)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка кнопок, EXTI[0]
СообщениеДобавлено: Вт ноя 12, 2024 13:43:24 
Мучитель микросхем

Зарегистрирован: Вт окт 01, 2024 15:22:33
Сообщений: 419
Рейтинг сообщения: 0
Ещё лучше описать пины кнопок в хидере:
Код:
#define PIN_BUTTON1        A, 7
#define PIN_BUTTON2        A, 6
#define PIN_BUTTON3        A, 5
...

Пины в хедере - это уже дикий оверхед, придется читать с порта по разу на каждую кнопку )


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

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


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

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


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

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


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