Обработка кнопок, EXTI[0]

Кто любит RISC в жизни, заходим, не стесняемся.
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: Обработка кнопок, EXTI[0]

Сообщение jcxz »

[uquote="Adrift",url="/forum/viewtopic.php?p=4648243#p4648243"]придется читать с порта по разу на каждую кнопку )[/uquote]Зачем?
Не нужно никаких чтений "по разу на кнопку".

[uquote="Adrift",url="/forum/viewtopic.php?p=4648243#p4648243"]Пины в хедере - это уже дикий оверхед[/uquote]Когда потребуется немного изменить схему и перенести кнопки на другие пины, и потребуется перелопатить много кода, то так думать перестанете. 8)
Или когда понадобится перенести кусок кода в новый проект.
Реклама
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

Re: Обработка кнопок, EXTI[0]

Сообщение Martian »

Да, недавно кто-то подобное как раз спрашивал, и вроде бы, никто не захотел перелопачивать половину кода...
Реклама
Adrift
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Вт окт 01, 2024 15:22:33

Re: Обработка кнопок, EXTI[0]

Сообщение Adrift »

jcxz писал(а):Зачем?
Не нужно никаких чтений "по разу на кнопку".
Затем, что если пины задефайнены как "A, 7", "A, 6" и "A, 5", то, видимо, планируется получить что-то типа "GPIOA, 7"..., тогда для одного чтения придется сравнить все 3 GPIO между собой, а потом еще возможны 3 варианта когда совпадает порт для двух пинов и можно читать всего 2 раза ) А если пинов будет больше? По нормальному это задача со звездочкой для C++ )
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: Обработка кнопок, EXTI[0]

Сообщение jcxz »

[uquote="Martian",url="/forum/viewtopic.php?p=4648277#p4648277"]Да, недавно кто-то подобное как раз спрашивал, и вроде бы, никто не захотел перелопачивать половину кода...[/uquote]Именно. А если бы те исходники (обитателя телескопа) написаны были по уму, то изменить нужно было только в одном месте.
Всегда стараюсь следовать правилу: Константа должна быть описана только однажды и в одном месте.
Если нужны какие-то константы, порождаемые от данной (дочерние), то пишу в #define формулу. Вместо явного вычисления. Компилятор железный - не сломается от несколькоих лишних вычислений.
Если это конечно возможно. Если невозможно, то через ASSERT_STATIC() делаю проверку и генерацию ошибки компиляции при несовместимых значениях констант.

Когда проект становится значительно больше "Hello world" - это очень сильно помогает не утонуть.
Реклама
Эиком - электронные компоненты и радиодетали
aleksey chilov
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Вс мар 27, 2022 09:38:17

Re: Обработка кнопок, EXTI[0]

Сообщение aleksey chilov »

Хочу обратится тут к гуру ARM "jcxz" там спрашивалось типа

( 1. Зачем сброс флагов - тремя операциями вместо одной?
2. Чтение GPIOA->IDR то же самое - зачем 6(!) чтений вместо одного??? )

Там речь вообще шла о флагах прерываний а именно о регистре (EXTI_PR).
Если не сбросить флаг тогда там на всегда и останется всё. Да и что такое макросы я знаю.
Побитовые операции тоже. Ходил в школу рассказывали. Человек на умничал тут настроение испортил
и успокоился. Вот другой человек по нормальному привёл кусок кода, по человечески помог, и спасибо ему!
"AlanDrakes"
Теперь я перенастрою регистры отключу прерывания и сделаю по таймеру, я спросил варианты человек ответил и помог.
И теперь я пропишу макросы для удобства и всё будет работать на ура!
Реклама
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

Re: Обработка кнопок, EXTI[0]

Сообщение Martian »

Классно. Когда пнули, оказалось, что всё знает, а мы дураки. И оказывается, правильно и неправильно - это теперь вариантами называется :)))
Реклама
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: Обработка кнопок, EXTI[0]

Сообщение jcxz »

[uquote="Adrift",url="/forum/viewtopic.php?p=4648283#p4648283"]Затем, что если пины задефайнены как "A, 7", "A, 6" и "A, 5", то, видимо, планируется получить что-то типа "GPIOA, 7"..., тогда для одного чтения придется сравнить все 3 GPIO между собой[/uquote]Не понял - что нужно сравнивать, но вот:

Код: Выделить всё

#define PORT2(port, pin)    port
#define PIN2(port, pin)     pin
#define PORT(port_pin)      PORT2(port_pin)
#define PIN(port_pin)       PIN2(port_pin)

uint i = concat(GPIO, PORT(PIN_BUTTON1))->IDR;  //операция одного чтения.
и т.д.
[uquote="Adrift",url="/forum/viewtopic.php?p=4648283#p4648283"], а потом еще возможны 3 варианта когда совпадает порт для двух пинов и можно читать всего 2 раза ) А если пинов будет больше? По нормальному это задача со звездочкой для C++ )[/uquote]Если портов много, то - создаём битмап портов:
#define BTN_PORT_MAP (PORT(PIN_BUTTON1) | PORT(PIN_BUTTON2) | ...)
а затем из этого битмапа - набор операций чтения GPIOx->IDR, в набор переменных iA, iB, iC, ....
Тоже - с помощью макросов. Никакие громоздкие си++ тут не нужны.
Но правильнее все кнопки посадить на минимально-возможное кол-во портов. Чтобы уменьшить число необходимых чтений GPIO в ISR и уменьшить время его выполнения.

Добавлено after 12 minutes 32 seconds:
[uquote="Martian",url="/forum/viewtopic.php?p=4648326#p4648326"]Классно. Когда пнули, оказалось, что всё знает, а мы дураки. И оказывается, правильно и неправильно - это теперь вариантами называется :)))[/uquote]
Не, нифига не знает. :)))
Пишет, что знает что такое"побитовые операции", но при этом так и не понял почему обращение к EXPI_PR нужно только одно. Одно высказывание противоречит другому.
И почему плохо читать 6 раз - скорее всего тоже не понял.
Просто тупо скопипастит сейчас чужой код, а потом, когда что-то не станет работать - опять прибежит сюда. :)))
Adrift
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Вт окт 01, 2024 15:22:33

Re: Обработка кнопок, EXTI[0]

Сообщение Adrift »

[uquote="jcxz",url="/forum/viewtopic.php?p=4648329#p4648329"]Если портов много, то - создаём битмап портов:
#define BTN_PORT_MAP (PORT(PIN_BUTTON1) | PORT(PIN_BUTTON2) | ...)
а затем из этого битмапа - набор операций чтения GPIOx->IDR, в набор переменных iA, iB, iC, ....
Тоже - с помощью макросов. Никакие громоздкие си++ тут не нужны.[/uquote]
В том и дело, что если читать в набор переменных iA, iB, iC из GPIOx->IDR, то будет 3 чтения с порта, даже если он одинаков для всех пинов.
aleksey chilov
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Вс мар 27, 2022 09:38:17

Re: Обработка кнопок, EXTI[0]

Сообщение aleksey chilov »

Опять тоже самое!
Хотел бы использовать готовые решения использовал бы библиотеку HAL+ CubeMX и готовую библиотеку.


На и успокойся!!!

void EXTI9_5_IRQHandler(void){
EXTI->PR = (EXTI_PR_PR5|EXTI_PR_PR6|EXTI_PR_PR7); // Сбросить флаг прерывания!
//EXTI->PR = EXTI_PR_PR6; // Сбросить флаг прерывания!
//EXTI->PR = EXTI_PR_PR7; // Сбросить флаг прерывания!
// asm("nop");
// asm("nop");

if((GPIOA->IDR & (1 << 7)) == 0){ // Кнопка ОК
Flag.SET_Ok = true;

}else if((GPIOA->IDR & (1 << 7)) != 0){
Flag.SET_Ok = false;
}

if((GPIOA->IDR & (1 << 6)) == 0){ // Кнопка V+
Flag.VOL_plus = true;

}else if((GPIOA->IDR & (1 << 6)) != 0){
Flag.VOL_plus = false;
}

if((GPIOA->IDR & (1 << 5)) == 0){ // Кнопка V-
Flag.VOL_minus = true;

}else if((GPIOA->IDR & (1 << 5)) != 0){
Flag.VOL_minus = false;
}
}
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: Обработка кнопок, EXTI[0]

Сообщение jcxz »

[uquote="Adrift",url="/forum/viewtopic.php?p=4648336#p4648336"]В том и дело, что если читать в набор переменных iA, iB, iC из GPIOx->IDR, то будет 3 чтения с порта, даже если он одинаков для всех пинов.[/uquote]Такое может быть если кодонаписатель совсем безголовый. 8)
У вменяемого будет одно чтение. Подумайте - как. Там всё просто.

Добавлено after 2 minutes 53 seconds:
[uquote="Martian",url="/forum/viewtopic.php?p=4648326#p4648326"]оказалось, что всё знает, а мы дураки.[/uquote]
Вот видите какую галиматью пишет:
[uquote="aleksey chilov",url="/forum/viewtopic.php?p=4648339#p4648339"]if((GPIOA->IDR & (1 << 7)) == 0){ // Кнопка ОК
Flag.SET_Ok = true;

}else if((GPIOA->IDR & (1 << 7)) != 0){
Flag.SET_Ok = false;
}[/uquote]
"Не в коня корм"..... :)))
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

Re: Обработка кнопок, EXTI[0]

Сообщение Martian »

[uquote="aleksey chilov",url="/forum/viewtopic.php?p=4648339#p4648339"]На и успокойся!!!

if((GPIOA->IDR & (1 << 7)) == 0){ // Кнопка ОК
Flag.SET_Ok = true;

}else if((GPIOA->IDR & (1 << 7)) != 0){
Flag.SET_Ok = false;
}[/uquote]
невозможно успокоиться от подобного ужаса, не коррелирующего с заявленными знаниями.

Код: Выделить всё

Flag.SET_Ok = здесь то, что сравнивается с чем-то;
если уж охота подобное.

Добавлено after 59 seconds:
jcxz, да, не в коня...
Adrift
Вымогатель припоя
Сообщения: 543
Зарегистрирован: Вт окт 01, 2024 15:22:33

Re: Обработка кнопок, EXTI[0]

Сообщение Adrift »

[uquote="jcxz",url="/forum/viewtopic.php?p=4648344#p4648344"]Такое может быть если кодонаписатель совсем безголовый. 8)
У вменяемого будет одно чтение. Подумайте - как. Там всё просто.[/uquote]
На всякий случай уточню, а то вдруг действительно безголовый ) Один и тот же код из примитивных макросов будет читать один раз из GPIOx->IDR если все пины с одного порта, но будет читать 3 раза, если порты все разные, в остальных случаях будет 2 чтения? Как он это будет делать не сравнивая порты друг с другом, раз уж ты не понимаешь что нужно сравнивать? )

ps. Ага, мы битман портов вручную создаем и он будет ассоциирован с нашими пинами? Громоздкий C++ это все автоматически при компиляции делает, мне такое даже с голову сразу не пришло ) Хотя все равно не понятно... Если пина 3, а порт 1, то в битмапе портов будет один порт, но читать все равно нужно не GPIOx->IDR, который volatile, а значение уже прочитанное из него. Нужен рабочий пример )
aleksey chilov
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Вс мар 27, 2022 09:38:17

Re: Обработка кнопок, EXTI[0]

Сообщение aleksey chilov »

Давайте умники!
3 кнопки.
притянуты к +.
Обработчик один на 4 пина.
Нужно поднять флаг по спаду и сбросить по нарастанию.
Давайте, покажите как вы это видите...
В отладчике всё работает. Или отладчик тоже "Не в коня корм?"
По одному из портов происходит прерывание, там проверяется по какому, дальше флаг.
Вы чё там??? Пьяные???
Вы крутые программисты покажите тогда как это должно быть или не алё?

Добавлено after 1 minute 16 seconds:
STM32F103C6T6 на всякий случай
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

Re: Обработка кнопок, EXTI[0]

Сообщение Martian »

Да пофиг, какой мк.
Человеку, который пишет if (a = 0) then b = true else if (a !=0 ) then b = false вместо b = a, можно посоветовать лишь читать книжки по программированию. Общие книжки, а не для STM32F103C6T6.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15571
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Обработка кнопок, EXTI[0]

Сообщение BOB51 »

Собственно опять "кнопы преткновения"?
:))
Да еще и под СИ, где особой разницы между МК не наблюдается...
Одна часть прожки - обработчик линий возврата кнопок, вторая - обработчик полученных данных.
Сколько раз уже вылизывалось во всевозможных вариантах...
8)
Не все ли равно, сколько раз читать данные с ЛВК в буфер результата (одной операцией с единого порта или собирать в несколько приемов в общий буфер -накопитель) - для механических кнопок те интервалы совершенно мизерные по сравнению с интервалом антидребезга. Вылизать более оптимальный вариант под конкретный МК и схему - это уже задача вопрошающего.
Может дальше смотреть надо - работа по фиксации данных, антидребезгу, обработка системы подмены функционала нажатой комбинации, длительность удержания, контроль покоя, контроль интервала без обращений к клавиатуре (автоотключение сканирования), контроль интервала "залипания" (повреждение клавиатуры).
Следующий шаг - подменные функции для конкретных комбинаций в разных программах (соответственно разделам менюшки устройства).
:wink:
Последний раз редактировалось BOB51 Вт ноя 12, 2024 18:12:07, всего редактировалось 1 раз.
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

Re: Обработка кнопок, EXTI[0]

Сообщение Martian »

А ведь наверняка есть кодогенератор для меню? Типа, пишем дерево меню, а потом все метания по узлам переносятся в сиподобное что-то...
Последний раз редактировалось Martian Вт ноя 12, 2024 18:11:33, всего редактировалось 1 раз.
aleksey chilov
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Вс мар 27, 2022 09:38:17

Re: Обработка кнопок, EXTI[0]

Сообщение aleksey chilov »

Я могу написать вот так:

if(!(GPIOA->IDR & (1 << 7))){ // Кнопка ОК
Flag.SET_Ok = true;

}else if((GPIOA->IDR & (1 << 7))){
Flag.SET_Ok = false;
}

if(!(GPIOA->IDR & (1 << 6))){ // Кнопка V+
Flag.VOL_plus = true;

}else if((GPIOA->IDR & (1 << 6))){
Flag.VOL_plus = false;
}

if(!(GPIOA->IDR & (1 << 5))){ // Кнопка V-
Flag.VOL_minus = true;

}else if((GPIOA->IDR & (1 << 5))){
Flag.VOL_minus = false;
}


Всё работает и так.
В чём проблема???

Добавлено after 1 minute 8 seconds:
В прерывании проверяется пин. Что там не так?


Изображение
Последний раз редактировалось aleksey chilov Вт ноя 12, 2024 18:14:27, всего редактировалось 1 раз.
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

Re: Обработка кнопок, EXTI[0]

Сообщение Martian »

Ни в чём, если Вы - индус. Они так писали раньше.
А если надо 10 раз проделать одну и ту же операцию, Вы цикл напишите, или 10 раз строчку скопируете?
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15571
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Обработка кнопок, EXTI[0]

Сообщение BOB51 »

Так ежли проблем нету - зачем все вышесказанное в обсуждении?
:wink:
Нюансы системы "кнопы + менюшки" позже повылазят (ежли их в самом начале не удалось узреть).
Боно будет, да поздно (код переделывать ой как влом обычно).
:tea: 8)
aleksey chilov
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Вс мар 27, 2022 09:38:17

Re: Обработка кнопок, EXTI[0]

Сообщение aleksey chilov »

Я понял о чём вы.
Там действительно отладчик показал что при нажатии любой из кнопок
он пробегает по всем условиям и пере сбрасывает флаги...
Извиняюсь за свои психи.
Я почему то об этом как-то даже и не думал...
Сделаю по другому.
Тут нужно подумать...
Последний раз редактировалось aleksey chilov Вт ноя 12, 2024 20:16:48, всего редактировалось 2 раза.
Ответить

Вернуться в «ARM»