Тут два варианта - или поштучно сканируем регистр данных на вопрос "ху из активен?" с последующей (также поштучной) обработкой обнаруженной активности (как последняя версия у aleksey chilov) Или смахиваем все линии возврата клавиатуры в единый байт (проводим дополнительную обработку антидребезга и интервалов удержания/отсутствия активности) и декодируем комбинацию через switch/case где напрямую подставляются или исполнительные функции или указатели на те исполнительные функции. Все зависит в том числе и от схемы да функционала программы устройства, для которого та программа пишется...
Очевидно, что я посчитал число строк исключая "f() {}", то есть только строки где идет работа с пинами. Код не мой, писал товарищ, могу спросить можно ли его выложить, надо? Впрочем, я его понимаю на 90%, большинство остальных поймут на 10% ) Ваша недооценка возможностей C++ пропорциональна его незнанию, еще и помноженная на скептицизм, в таком случае за подобной сложности код можно даже и не браться.
Один пустой звон... Я привёл код. Рабочий код. Который можно скомпилить и проверить. Который сам написал, а не стырил у какого-то "товарища". Раз я его написал - очевидно, что я его понимаю. Вы приводите нечто невразумительное. Что ни проверить ни даже просто посмотреть - невозможно. И что очевидно и работать в принципе не может. И в чём сами же очевидно нифига не разбираетесь. При этом ещё сразу начинаете наезжать и пытаться чем-то меряться... Что тут можно ещё сказать? По вашим постам всё ясно.
Очевидно, что я посчитал число строк исключая "f() {}", то есть только строки где идет работа с пинами. Код не мой, писал товарищ, могу спросить можно ли его выложить, надо? Впрочем, я его понимаю на 90%
Чем докажете? Раз не можете сами написать, а тырите откуда-то - очевидно совершенно не понимаете. Я точно также могу про вас сказать - что вы нифига не понимаете вообще си, поэтому тырите чужие примеры.
Какое отношение это имеет к теме опроса ног - вообще непонятно.... Также очевидно, что ноги подключенные к кнопкам, настроены на ввод. Какой смысл в них что-то писать? Что это даст?
Это же пример, скучно просто читать с порта ) Естественно пины были сконфигурированы на вывод. В данном случае у нас 3 подряд идущих пина, а может быть 30, с разных портов, в любом порядке, и этот мой код продолжит работать без никаких модификаций. То что результат выглядит как простое чтение из порта с накладыванием маски и записью обратно лишь подтверждает оптимизирующую природу используемого алгоритма...
Полный бред... Вы даже не понимаете что такое GPIO и как он работает. Как можно что-то читать (состояние кнопок) с пинов "настроенных на вывод"??? Дальнейший ваш бред не вижу смысла даже читать... Ни работы микроконтроллера не понимаете ни в си не разбираетесь...
Вобщем... Обсуждать кнопки, о схемном решении и задачах которых ничего неизвестно - равноценно бесконечному гаданию. Решения удобные в одном случае будут "костылями" в другом. Конкретно схема, что хотим от тех кнопок получить... Плюс учитываем остальную часть программы, в которой те кнопы использовать намерены...
Один пустой звон... Я привёл код. Рабочий код. Который можно скомпилить и проверить. Который сам написал, а не стырил у какого-то "товарища". Раз я его написал - очевидно, что я его понимаю.
Вы мне морочили голову убеждая, что макросы могут сделать то что я хочу, в итоге оказалось, что все нужно писать ручками. 30 строк кода только для чтения IDR в переменные, если предполагается использование любого из десятка портов, а чтение битиков вы даже не стали дописывать, то есть реально код еще больше. Никто так делать не станет, любой нормальный человек просто прочитает 3 раза с порта.
jcxz писал(а):
Вы приводите нечто невразумительное. Что ни проверить ни даже просто посмотреть - невозможно. И что очевидно и работать в принципе не может. И в чём сами же очевидно нифига не разбираетесь. При этом ещё сразу начинаете наезжать и пытаться чем-то меряться...
Что не может работать? Смотрите, 2010 год, либа для AVR, да на старом С++, да не настолько эффективна, но работает и уже можно было писать код типа:
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 писал(а):
Полный бред... Вы даже не понимаете что такое GPIO и как он работает. Как можно что-то читать (состояние кнопок) с пинов "настроенных на вывод"???
Я настроил на вывод, предварительно выполнив write(0b010) и проверил, что после write(~read()) в битах 7..5 порта оказывается 0b101, значит в том числе и чтение работает правильно. Пример демонстрировал работу с портами, одной строкой можно не только прочитать, но и записать, а если нужно только читать состояние кнопок, то настраиваем порты на вход и читаем, какие проблемы...
Приглашаем 3 декабря 2024 на вебинар, посвященный силовым модулям ведущего китайского производителя SUNCO - одного из мировых лидеров по производству дискретных полупроводниковых компонентов. На вебинаре вы узнаете о новинках, включая модули 17 класса в корпусе E3, и контроле качества на всех этапах производства. Вы также узнаете о новейших продуктах – IGBT-, SiC-, диодных и тиристорных модулях, погрузитесь в современные топологии, сравните характеристики IGBT-чипов разных поколений.
Насколько я понимаю С++ для АВРок прерогатива ардуиноIDE... Так там уже свои "добавки" в референсе, коих вполне достаточно для работы...
Зачем изворачиваться то? Чтоб потом долго вспоминать чего в прошлом месяце нашкарябано (и то с учётом всех "сопутствующих библиотек") или чтоб вражины долго выуживали истинное назначение написанного?
Всплески перенапряжения являются серьезной угрозой надежности работы радиоэлектронных устройств. Причины их появления различны, это могут быть коммутационные переходные процессы в системе электропитания устройств, разряды молний, электростатические разряды. Для создания эффективной и современной системы защиты от ЭСР компания SUNCO разработала надежные и качественные супрессоры, представляющие собой TVS- и ESD-диоды, а также сборки на их основе. Компоненты SUNCO не только не уступают, но часто превосходят по характеристикам аналогичную продукцию других брендов.
Вы мне морочили голову убеждая, что макросы могут сделать то что я хочу, в итоге оказалось, что все нужно писать ручками. 30 строк кода только для чтения IDR в переменные, если предполагается использование любого из десятка портов, а чтение битиков вы даже не стали дописывать, то есть реально код еще больше.
"30 строк кода" это что - много что-ль? А сколько строк в тех си++ обёртках, что вы не показали?
Никто так делать не станет, любой нормальный человек просто прочитает 3 раза с порта.
А человеки, использующие HAL по вашему - нормальные? А ведь в файлах HAL там не "30 строчек", а ГОРАЗДО больше! Может и все 30 тысяч строк. "Любого нормального человека" такой объём не напрягает? Почему тогда "30 строк" напрягают?
Кнопки коммутируются на землю. Завожу systick на 0,1сек. В обработчике читаю key = ((~GPIOA->IDR)>>5) & 0x07; В основном цикле switch. Все. И по дребезгу. Если нажатие не сработает - сработает через 0,1сек. А когда сработало - отпускаю или держу для повтора. Если добавить счетчик можно обрабатывать и долгие нажатия, выключение например.
30 строк кода" это что - много что-ль? А сколько строк в тех си++ обёртках, что вы не показали?
В C++ обертках кода много, однако когда ими пользуешься, то написать придется всего несколько строк. Одной строкой описал используемые пины, другой прочел значение с порта, третьей можно настроить режим всех пинов сразу. Потом будет какой-нибудь дисплей с 8/16 битной шиной и точно так же можно передать все пины одной строкой, внутри записать все данные вместе с RS и WR, т.е. 10 или 18 бит, одной write(). Все оптимизировано и протестировано, написав несколько строк тяжело накосячить. Теперь возвращаемся к вашему варианту... Я посчитал, что на моих STM32 максимум 8 разных портов может быть, соответственно получаем такое:
Это ведь не универсальный код, он написан конкретно для 3 кнопок и привязан к пинам этих кнопок, сколько здесь мест в которых можно ошибиться? И как его дописать чтобы f() делала то же, что моя:
Код:
uint32_t val = pins.read();
Мало прочитать из порта в переменные, дальше что? ) Возьмем первую ветку:
Если мы попали внутрь, значит одна, две или три кнопки висят на этом порту, будет проверять все три по отдельности и переносить биты? Для каждого порта? Сколько десятков строк будет занимать законченная версия? )
jcxz писал(а):
А человеки, использующие HAL по вашему - нормальные? А ведь в файлах HAL там не "30 строчек", а ГОРАЗДО больше! Может и все 30 тысяч строк. "Любого нормального человека" такой объём не напрягает? Почему тогда "30 строк" напрягают?
Человеки пользуются HAL потому что он уже написан и сколько там тысяч строк для них не имеет значения. Разницу между сложностью написания библиотек и сложностью их использования не видите?
Сейчас этот форум просматривают: tonyk и гости: 13
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения