Когда потребуется немного изменить схему и перенести кнопки на другие пины, и потребуется перелопатить много кода, то так думать перестанете. Или когда понадобится перенести кусок кода в новый проект.
Зачем? Не нужно никаких чтений "по разу на кнопку".
Затем, что если пины задефайнены как "A, 7", "A, 6" и "A, 5", то, видимо, планируется получить что-то типа "GPIOA, 7"..., тогда для одного чтения придется сравнить все 3 GPIO между собой, а потом еще возможны 3 варианта когда совпадает порт для двух пинов и можно читать всего 2 раза ) А если пинов будет больше? По нормальному это задача со звездочкой для C++ )
Да, недавно кто-то подобное как раз спрашивал, и вроде бы, никто не захотел перелопачивать половину кода...
Именно. А если бы те исходники (обитателя телескопа) написаны были по уму, то изменить нужно было только в одном месте. Всегда стараюсь следовать правилу: Константа должна быть описана только однажды и в одном месте. Если нужны какие-то константы, порождаемые от данной (дочерние), то пишу в #define формулу. Вместо явного вычисления. Компилятор железный - не сломается от несколькоих лишних вычислений. Если это конечно возможно. Если невозможно, то через ASSERT_STATIC() делаю проверку и генерацию ошибки компиляции при несовместимых значениях констант.
Когда проект становится значительно больше "Hello world" - это очень сильно помогает не утонуть.
Компания MEAN WELL пополнила ассортимент своей широкой линейки светодиодных драйверов новым семейством XLC для внутреннего освещения. Главное отличие – поддержка широкого спектра проводных и беспроводных технологий диммирования. Новинки представлены в MEANWELL.market моделями с мощностями 25 Вт, 40 Вт и 60 Вт. В линейке есть модели, работающие как в режиме стабилизации тока (СС), так и в режиме стабилизации напряжения (CV) значением 12, 24 и 48 В.
Зарегистрирован: Вс мар 27, 2022 09:38:17 Сообщений: 160
Рейтинг сообщения:0
Хочу обратится тут к гуру ARM "jcxz" там спрашивалось типа
( 1. Зачем сброс флагов - тремя операциями вместо одной? 2. Чтение GPIOA->IDR то же самое - зачем 6(!) чтений вместо одного??? )
Там речь вообще шла о флагах прерываний а именно о регистре (EXTI_PR). Если не сбросить флаг тогда там на всегда и останется всё. Да и что такое макросы я знаю. Побитовые операции тоже. Ходил в школу рассказывали. Человек на умничал тут настроение испортил и успокоился. Вот другой человек по нормальному привёл кусок кода, по человечески помог, и спасибо ему! "AlanDrakes" Теперь я перенастрою регистры отключу прерывания и сделаю по таймеру, я спросил варианты человек ответил и помог. И теперь я пропишу макросы для удобства и всё будет работать на ура!
Затем, что если пины задефайнены как "A, 7", "A, 6" и "A, 5", то, видимо, планируется получить что-то типа "GPIOA, 7"..., тогда для одного чтения придется сравнить все 3 GPIO между собой
, а потом еще возможны 3 варианта когда совпадает порт для двух пинов и можно читать всего 2 раза ) А если пинов будет больше? По нормальному это задача со звездочкой для C++ )
Если портов много, то - создаём битмап портов: #define BTN_PORT_MAP (PORT(PIN_BUTTON1) | PORT(PIN_BUTTON2) | ...) а затем из этого битмапа - набор операций чтения GPIOx->IDR, в набор переменных iA, iB, iC, .... Тоже - с помощью макросов. Никакие громоздкие си++ тут не нужны. Но правильнее все кнопки посадить на минимально-возможное кол-во портов. Чтобы уменьшить число необходимых чтений GPIO в ISR и уменьшить время его выполнения.
Классно. Когда пнули, оказалось, что всё знает, а мы дураки. И оказывается, правильно и неправильно - это теперь вариантами называется
Не, нифига не знает. Пишет, что знает что такое"побитовые операции", но при этом так и не понял почему обращение к EXPI_PR нужно только одно. Одно высказывание противоречит другому. И почему плохо читать 6 раз - скорее всего тоже не понял. Просто тупо скопипастит сейчас чужой код, а потом, когда что-то не станет работать - опять прибежит сюда.
Если портов много, то - создаём битмап портов: #define BTN_PORT_MAP (PORT(PIN_BUTTON1) | PORT(PIN_BUTTON2) | ...) а затем из этого битмапа - набор операций чтения GPIOx->IDR, в набор переменных iA, iB, iC, .... Тоже - с помощью макросов. Никакие громоздкие си++ тут не нужны.
В том и дело, что если читать в набор переменных iA, iB, iC из GPIOx->IDR, то будет 3 чтения с порта, даже если он одинаков для всех пинов.
Такое может быть если кодонаписатель совсем безголовый. У вменяемого будет одно чтение. Подумайте - как. Там всё просто.
На всякий случай уточню, а то вдруг действительно безголовый ) Один и тот же код из примитивных макросов будет читать один раз из GPIOx->IDR если все пины с одного порта, но будет читать 3 раза, если порты все разные, в остальных случаях будет 2 чтения? Как он это будет делать не сравнивая порты друг с другом, раз уж ты не понимаешь что нужно сравнивать? )
ps. Ага, мы битман портов вручную создаем и он будет ассоциирован с нашими пинами? Громоздкий C++ это все автоматически при компиляции делает, мне такое даже с голову сразу не пришло ) Хотя все равно не понятно... Если пина 3, а порт 1, то в битмапе портов будет один порт, но читать все равно нужно не GPIOx->IDR, который volatile, а значение уже прочитанное из него. Нужен рабочий пример )
Зарегистрирован: Вс мар 27, 2022 09:38:17 Сообщений: 160
Рейтинг сообщения:0
Давайте умники! 3 кнопки. притянуты к +. Обработчик один на 4 пина. Нужно поднять флаг по спаду и сбросить по нарастанию. Давайте, покажите как вы это видите... В отладчике всё работает. Или отладчик тоже "Не в коня корм?" По одному из портов происходит прерывание, там проверяется по какому, дальше флаг. Вы чё там??? Пьяные??? Вы крутые программисты покажите тогда как это должно быть или не алё?
Добавлено after 1 minute 16 seconds: STM32F103C6T6 на всякий случай
Да пофиг, какой мк. Человеку, который пишет if (a = 0) then b = true else if (a !=0 ) then b = false вместо b = a, можно посоветовать лишь читать книжки по программированию. Общие книжки, а не для STM32F103C6T6.
Собственно опять "кнопы преткновения"? Да еще и под СИ, где особой разницы между МК не наблюдается... Одна часть прожки - обработчик линий возврата кнопок, вторая - обработчик полученных данных. Сколько раз уже вылизывалось во всевозможных вариантах... Не все ли равно, сколько раз читать данные с ЛВК в буфер результата (одной операцией с единого порта или собирать в несколько приемов в общий буфер -накопитель) - для механических кнопок те интервалы совершенно мизерные по сравнению с интервалом антидребезга. Вылизать более оптимальный вариант под конкретный МК и схему - это уже задача вопрошающего. Может дальше смотреть надо - работа по фиксации данных, антидребезгу, обработка системы подмены функционала нажатой комбинации, длительность удержания, контроль покоя, контроль интервала без обращений к клавиатуре (автоотключение сканирования), контроль интервала "залипания" (повреждение клавиатуры). Следующий шаг - подменные функции для конкретных комбинаций в разных программах (соответственно разделам менюшки устройства).
Последний раз редактировалось BOB51 Вт ноя 12, 2024 18:12:07, всего редактировалось 1 раз.
Так ежли проблем нету - зачем все вышесказанное в обсуждении? Нюансы системы "кнопы + менюшки" позже повылазят (ежли их в самом начале не удалось узреть). Боно будет, да поздно (код переделывать ой как влом обычно).
Зарегистрирован: Вс мар 27, 2022 09:38:17 Сообщений: 160
Рейтинг сообщения:0
Я понял о чём вы. Там действительно отладчик показал что при нажатии любой из кнопок он пробегает по всем условиям и пере сбрасывает флаги... Извиняюсь за свои психи. Я почему то об этом как-то даже и не думал... Сделаю по другому. Тут нужно подумать...
Последний раз редактировалось aleksey chilov Вт ноя 12, 2024 20:16:48, всего редактировалось 2 раз(а).
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения