Например TDA7294

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





Текущее время: Сб апр 19, 2025 23:42:24

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


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



Начать новую тему Ответить на тему  [ Сообщений: 71 ]    , , , 4
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Обработка кнопок, EXTI[0]
СообщениеДобавлено: Чт ноя 14, 2024 17:48:20 
Друг Кота
Аватар пользователя

Карма: 94
Рейтинг сообщений: 1462
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14922
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Тут два варианта - или поштучно сканируем регистр данных на вопрос "ху из активен?" с последующей (также поштучной) обработкой обнаруженной активности (как последняя версия у aleksey chilov)
Или смахиваем все линии возврата клавиатуры в единый байт (проводим дополнительную обработку антидребезга и интервалов удержания/отсутствия активности) и декодируем комбинацию через switch/case где напрямую подставляются или исполнительные функции или указатели на те исполнительные функции.
Все зависит в том числе и от схемы да функционала программы устройства, для которого та программа пишется...
:roll:


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

Карма: -11
Рейтинг сообщений: 160
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 1428
Рейтинг сообщения: 0
Gl.Registr = GPIOA->IDR;
switch(Gl.Registr){
case 0xFF76:
...
Ужас.... :facepalm: Других слов нет. Складывается впечатление что вы вообще не понимаете что такое GPIO. Все советы - напрасны.

Добавлено after 9 minutes 43 seconds:
Очевидно, что я посчитал число строк исключая "f() {}", то есть только строки где идет работа с пинами. Код не мой, писал товарищ, могу спросить можно ли его выложить, надо? Впрочем, я его понимаю на 90%, большинство остальных поймут на 10% ) Ваша недооценка возможностей C++ пропорциональна его незнанию, еще и помноженная на скептицизм, в таком случае за подобной сложности код можно даже и не браться.
Один пустой звон...
Я привёл код. Рабочий код. Который можно скомпилить и проверить. Который сам написал, а не стырил у какого-то "товарища". Раз я его написал - очевидно, что я его понимаю.
Вы приводите нечто невразумительное. Что ни проверить ни даже просто посмотреть - невозможно. И что очевидно и работать в принципе не может. И в чём сами же очевидно нифига не разбираетесь. При этом ещё сразу начинаете наезжать и пытаться чем-то меряться...
Что тут можно ещё сказать? По вашим постам всё ясно.
Очевидно, что я посчитал число строк исключая "f() {}", то есть только строки где идет работа с пинами. Код не мой, писал товарищ, могу спросить можно ли его выложить, надо? Впрочем, я его понимаю на 90%
Чем докажете? Раз не можете сами написать, а тырите откуда-то - очевидно совершенно не понимаете.
Я точно также могу про вас сказать - что вы нифига не понимаете вообще си, поэтому тырите чужие примеры.

jcxz писал(а):
код этот ваш делает следующую операцию:
Код:
u32 *p = ...;
p[6] = ~p[4] & 0xE0 | 0xE00000;
Какое отношение это имеет к теме опроса ног - вообще непонятно.... :dont_know:
Также очевидно, что ноги подключенные к кнопкам, настроены на ввод. Какой смысл в них что-то писать? Что это даст?

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

Добавлено after 5 minutes 35 seconds:
Теперь критика ваша, жду...
После всего написанного совет только один: Обратиться в раздел "Предлагаю работу".


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

Карма: 94
Рейтинг сообщений: 1462
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14922
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Вобщем...
Обсуждать кнопки, о схемном решении и задачах которых ничего неизвестно - равноценно бесконечному гаданию.
Решения удобные в одном случае будут "костылями" в другом.
Конкретно схема, что хотим от тех кнопок получить... Плюс учитываем остальную часть программы, в которой те кнопы использовать намерены...
:roll:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Обработка кнопок, EXTI[0]
СообщениеДобавлено: Пт ноя 15, 2024 14:19:31 
Потрогал лапой паяльник

Карма: -2
Рейтинг сообщений: 42
Зарегистрирован: Вт окт 01, 2024 15:22:33
Сообщений: 359
Рейтинг сообщения: 0
Один пустой звон...
Я привёл код. Рабочий код. Который можно скомпилить и проверить. Который сам написал, а не стырил у какого-то "товарища". Раз я его написал - очевидно, что я его понимаю.

Вы мне морочили голову убеждая, что макросы могут сделать то что я хочу, в итоге оказалось, что все нужно писать ручками. 30 строк кода только для чтения IDR в переменные, если предполагается использование любого из десятка портов, а чтение битиков вы даже не стали дописывать, то есть реально код еще больше. Никто так делать не станет, любой нормальный человек просто прочитает 3 раза с порта.

jcxz писал(а):
Вы приводите нечто невразумительное. Что ни проверить ни даже просто посмотреть - невозможно. И что очевидно и работать в принципе не может. И в чём сами же очевидно нифига не разбираетесь. При этом ещё сразу начинаете наезжать и пытаться чем-то меряться...

Что не может работать? Смотрите, 2010 год, либа для AVR, да на старом С++, да не настолько эффективна, но работает и уже можно было писать код типа:
Код:
typedef PinList<Pa1, Pa2, Pa3, Pb3, Pb4> MyPins;
MyPins::Write(0x55);

После этого стандарт C++ 5 раз существенно обновлялся и cейчас у меня read() выглядит так:
Код:
static uint32_t _inline_ read()
{
   return ports_.accumulate(readDummy(pins_), [](auto port) __inline__ {
      return readWrite<PinShift::Read>(GpioT<unbox<port>::port, 0xFFFF>::read(), getIndexedPins<unbox<port>::port>(pins_)); });
}

Где ports_ это:
Код:
static constexpr auto pins_ = TypeList<Pins...>::accumulate(TypeList<>{}, [](auto pin) { return expandPL<unbox<pin>>(); });
static constexpr auto realPins_ = pins_.remove([](auto pin) { return IsDummyPin<unbox<pin>>; });
static constexpr auto ports_ = realPins_.unique([](auto pin1, auto pin2) { return unbox<pin1>::port == unbox<pin2>::port; });

А, например, unique() это:
Спойлер
Код:
static consteval auto unique(auto pred) { return unique_(pred, TypeList<Ts...>{}); }

template<typename... In, typename... Out>
static consteval auto unique_(auto pred, TypeList<In...> in, TypeList<Out...> out = {})
{
   if constexpr (in.empty())
   {
      return out;
   }
   else
   {
      if constexpr (!out.contains(in.head(), pred))
         return unique_(pred, in.tail(), out.pushBack(in.head()));
      else
         return unique_(pred, in.tail(), out);
   }
}

Ну и помогла вам частичка кода? Склеивайте свои макросы в 2024 году и дальше, оставьте передовые технологии тем кто хотя бы хочет научиться чему-то новому )

jcxz писал(а):
Чем докажете? Раз не можете сами написать, а тырите откуда-то - очевидно совершенно не понимаете.

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

jcxz писал(а):
Полный бред... :facepalm: Вы даже не понимаете что такое GPIO и как он работает.
Как можно что-то читать (состояние кнопок) с пинов "настроенных на вывод"???

Я настроил на вывод, предварительно выполнив write(0b010) и проверил, что после write(~read()) в битах 7..5 порта оказывается 0b101, значит в том числе и чтение работает правильно. Пример демонстрировал работу с портами, одной строкой можно не только прочитать, но и записать, а если нужно только читать состояние кнопок, то настраиваем порты на вход и читаем, какие проблемы...


Вернуться наверх
 
Открыт интернет-магазин MEAN WELL.Market – весь ассортимент MEAN WELL, выгодные цены

Открыта удобная площадка с выгодными ценами, поставляющая весь ассортимент продукции, производимой компанией MEAN WELL – от завоевавших популярность и известных на рынке изделий до новинок. MEAN WELL.Market предоставляет гарантийную и сервисную поддержку, удобный подбор продукции, оперативную доставку по России. На сайте интернет-магазина посетители смогут найти обзоры, интересные статьи о применении, максимальный объем технических сведений.

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

Карма: 94
Рейтинг сообщений: 1462
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14922
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Насколько я понимаю С++ для АВРок прерогатива ардуиноIDE...
Так там уже свои "добавки" в референсе, коих вполне достаточно для работы...
:dont_know:
Зачем изворачиваться то? Чтоб потом долго вспоминать чего в прошлом месяце нашкарябано (и то с учётом всех "сопутствующих библиотек") или чтоб вражины долго выуживали истинное назначение написанного?
8)


Вернуться наверх
 
LED-драйверы MOSO - надежные решения для индустриальных приложений

Продукция MOSO предназначена в основном для индустриальных приложений, использует инновационные решения на основе более 200 собственных патентов для силовой электроники и соответствует международным стандартам. LED-драйверы MOSO применяются в системах наружного освещения разных отраслей, включая промышленность, сельское хозяйство, транспорт и железную дорогу. В ряде серий реализована возможность дистанционного контроля и программирования работы по заданному сценарию. Разберем решения MOSO подробнее>>
Не в сети
 Заголовок сообщения: Re: Обработка кнопок, EXTI[0]
СообщениеДобавлено: Пт ноя 15, 2024 20:05:38 
Это не хвост, это антенна

Карма: -11
Рейтинг сообщений: 160
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 1428
Рейтинг сообщения: 0
Вы мне морочили голову убеждая, что макросы могут сделать то что я хочу, в итоге оказалось, что все нужно писать ручками. 30 строк кода только для чтения IDR в переменные, если предполагается использование любого из десятка портов, а чтение битиков вы даже не стали дописывать, то есть реально код еще больше.
"30 строк кода" это что - много что-ль? :shock:
А сколько строк в тех си++ обёртках, что вы не показали?
Никто так делать не станет, любой нормальный человек просто прочитает 3 раза с порта.
А человеки, использующие HAL по вашему - нормальные? А ведь в файлах HAL там не "30 строчек", а ГОРАЗДО больше! Может и все 30 тысяч строк.
"Любого нормального человека" такой объём не напрягает? Почему тогда "30 строк" напрягают? 8)


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

По промокоду radiokot скидка 10%
Не в сети
 Заголовок сообщения: Re: Обработка кнопок, EXTI[0]
СообщениеДобавлено: Пт ноя 15, 2024 20:12:01 
Друг Кота
Аватар пользователя

Карма: 94
Рейтинг сообщений: 1462
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14922
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Обещаный черновик на 4 кнопы для адуринкоАВРки(нанка)... правда демка там примитивнейшая....
viewtopic.php?p=4649536#p4649536
Ибо... ЛЕЕЕНЬ....
:sleep:


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

Карма: 5
Рейтинг сообщений: 50
Зарегистрирован: Ср янв 04, 2012 11:57:40
Сообщений: 406
Откуда: Алчевск
Рейтинг сообщения: 3
Кнопки коммутируются на землю.
Завожу systick на 0,1сек. В обработчике читаю key = ((~GPIOA->IDR)>>5) & 0x07;
В основном цикле switch. Все.
И по дребезгу. Если нажатие не сработает - сработает через 0,1сек. А когда сработало - отпускаю или держу для повтора.
Если добавить счетчик можно обрабатывать и долгие нажатия, выключение например.


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

Карма: -2
Рейтинг сообщений: 42
Зарегистрирован: Вт окт 01, 2024 15:22:33
Сообщений: 359
Рейтинг сообщения: 0
30 строк кода" это что - много что-ль? :shock:
А сколько строк в тех си++ обёртках, что вы не показали?

В C++ обертках кода много, однако когда ими пользуешься, то написать придется всего несколько строк. Одной строкой описал используемые пины, другой прочел значение с порта, третьей можно настроить режим всех пинов сразу. Потом будет какой-нибудь дисплей с 8/16 битной шиной и точно так же можно передать все пины одной строкой, внутри записать все данные вместе с RS и WR, т.е. 10 или 18 бит, одной write(). Все оптимизировано и протестировано, написав несколько строк тяжело накосячить. Теперь возвращаемся к вашему варианту... Я посчитал, что на моих STM32 максимум 8 разных портов может быть, соответственно получаем такое:

Спойлер
Код:
//.h
#define PIN_BUTTON1 A, 7
#define PIN_BUTTON2 A, 6
#define PIN_BUTTON3 A, 5
//.cpp
#define PIOIX_A 0
#define PIOIX_B 1
#define PIOIX_C 2
#define PIOIX_D 3
#define PIOIX_E 4
#define PIOIX_F 5
#define PIOIX_G 6
#define PIOIX_H 7
#define PORT_IX2(port, pin)  PIOIX_##port
#define PORT_IX(port_pin)    PORT_IX2(port_pin)
#define BTN_PORT_MAP (1u << PORT_IX(PIN_BUTTON1) | 1u << PORT_IX(PIN_BUTTON2) | 1u << PORT_IX(PIN_BUTTON3))

void f()
{
  #if BTN_PORT_MAP & 1 << 0
  uint iA = GPIOA->IDR;
  #endif
  #if BTN_PORT_MAP & 1 << 1
  uint iB = GPIOB->IDR;
  #endif
  #if BTN_PORT_MAP & 1 << 2
  uint iC = GPIOC->IDR;
  #endif
  #if BTN_PORT_MAP & 1 << 3
  uint iD = GPIOD->IDR;
  #endif
  #if BTN_PORT_MAP & 1 << 4
  uint iE = GPIOE->IDR;
  #endif
  #if BTN_PORT_MAP & 1 << 5
  uint iF = GPIOF->IDR;
  #endif
  #if BTN_PORT_MAP & 1 << 6
  uint iG = GPIOG->IDR;
  #endif
  #if BTN_PORT_MAP & 1 << 7
  uint iH = GPIOH->IDR;
  #endif

  ......
}

Это ведь не универсальный код, он написан конкретно для 3 кнопок и привязан к пинам этих кнопок, сколько здесь мест в которых можно ошибиться? И как его дописать чтобы f() делала то же, что моя:
Код:
uint32_t val = pins.read();

Мало прочитать из порта в переменные, дальше что? ) Возьмем первую ветку:
Код:
  #if BTN_PORT_MAP & 1 << 0
  uint iA = GPIOA->IDR;
  #endif

Если мы попали внутрь, значит одна, две или три кнопки висят на этом порту, будет проверять все три по отдельности и переносить биты? Для каждого порта? Сколько десятков строк будет занимать законченная версия? )

jcxz писал(а):
А человеки, использующие HAL по вашему - нормальные? А ведь в файлах HAL там не "30 строчек", а ГОРАЗДО больше! Может и все 30 тысяч строк.
"Любого нормального человека" такой объём не напрягает? Почему тогда "30 строк" напрягают? 8)

Человеки пользуются HAL потому что он уже написан и сколько там тысяч строк для них не имеет значения. Разницу между сложностью написания библиотек и сложностью их использования не видите?


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

Карма: 68
Рейтинг сообщений: 1955
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 12867
Рейтинг сообщения: 0
эк куда вас всех занесло...
а я вот решил глянуть - а всё-таки есть генераторы меню, вот, первая попавшаяся ссылка: https://github.com/forntoh/LcdMenu здесь примерчиков кучка: https://lcdmenu.forntoh.dev/reference/s ... index.html


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

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


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

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


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

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


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

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


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