Например TDA7294

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





Текущее время: Чт июн 19, 2025 19:37:49

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


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



Начать новую тему Ответить на тему  [ Сообщений: 71 ]    , 2, ,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Обработка кнопок, EXTI[0]
СообщениеДобавлено: Вт ноя 12, 2024 14:19:00 
Это не хвост, это антенна

Карма: -10
Рейтинг сообщений: 171
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 1483
Рейтинг сообщения: 0
придется читать с порта по разу на каждую кнопку )
Зачем?
Не нужно никаких чтений "по разу на кнопку".

Пины в хедере - это уже дикий оверхед
Когда потребуется немного изменить схему и перенести кнопки на другие пины, и потребуется перелопатить много кода, то так думать перестанете. 8)
Или когда понадобится перенести кусок кода в новый проект.


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

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


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

Зарегистрирован: Вт окт 01, 2024 15:22:33
Сообщений: 419
Рейтинг сообщения: 0
jcxz писал(а):
Зачем?
Не нужно никаких чтений "по разу на кнопку".

Затем, что если пины задефайнены как "A, 7", "A, 6" и "A, 5", то, видимо, планируется получить что-то типа "GPIOA, 7"..., тогда для одного чтения придется сравнить все 3 GPIO между собой, а потом еще возможны 3 варианта когда совпадает порт для двух пинов и можно читать всего 2 раза ) А если пинов будет больше? По нормальному это задача со звездочкой для C++ )


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

Карма: -10
Рейтинг сообщений: 171
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 1483
Рейтинг сообщения: 0
Да, недавно кто-то подобное как раз спрашивал, и вроде бы, никто не захотел перелопачивать половину кода...
Именно. А если бы те исходники (обитателя телескопа) написаны были по уму, то изменить нужно было только в одном месте.
Всегда стараюсь следовать правилу: Константа должна быть описана только однажды и в одном месте.
Если нужны какие-то константы, порождаемые от данной (дочерние), то пишу в #define формулу. Вместо явного вычисления. Компилятор железный - не сломается от несколькоих лишних вычислений.
Если это конечно возможно. Если невозможно, то через ASSERT_STATIC() делаю проверку и генерацию ошибки компиляции при несовместимых значениях констант.

Когда проект становится значительно больше "Hello world" - это очень сильно помогает не утонуть.


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

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

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

Зарегистрирован: Вс мар 27, 2022 09:38:17
Сообщений: 160
Рейтинг сообщения: 0
Хочу обратится тут к гуру ARM "jcxz" там спрашивалось типа

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

Там речь вообще шла о флагах прерываний а именно о регистре (EXTI_PR).
Если не сбросить флаг тогда там на всегда и останется всё. Да и что такое макросы я знаю.
Побитовые операции тоже. Ходил в школу рассказывали. Человек на умничал тут настроение испортил
и успокоился. Вот другой человек по нормальному привёл кусок кода, по человечески помог, и спасибо ему!
"AlanDrakes"
Теперь я перенастрою регистры отключу прерывания и сделаю по таймеру, я спросил варианты человек ответил и помог.
И теперь я пропишу макросы для удобства и всё будет работать на ура!


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

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


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

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

Карма: -10
Рейтинг сообщений: 171
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 1483
Рейтинг сообщения: 0
Затем, что если пины задефайнены как "A, 7", "A, 6" и "A, 5", то, видимо, планируется получить что-то типа "GPIOA, 7"..., тогда для одного чтения придется сравнить все 3 GPIO между собой
Не понял - что нужно сравнивать, но вот:
Код:
#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;  //операция одного чтения.
и т.д.


, а потом еще возможны 3 варианта когда совпадает порт для двух пинов и можно читать всего 2 раза ) А если пинов будет больше? По нормальному это задача со звездочкой для C++ )
Если портов много, то - создаём битмап портов:
#define BTN_PORT_MAP (PORT(PIN_BUTTON1) | PORT(PIN_BUTTON2) | ...)
а затем из этого битмапа - набор операций чтения GPIOx->IDR, в набор переменных iA, iB, iC, ....
Тоже - с помощью макросов. Никакие громоздкие си++ тут не нужны.
Но правильнее все кнопки посадить на минимально-возможное кол-во портов. Чтобы уменьшить число необходимых чтений GPIO в ISR и уменьшить время его выполнения.

Добавлено after 12 minutes 32 seconds:
Классно. Когда пнули, оказалось, что всё знает, а мы дураки. И оказывается, правильно и неправильно - это теперь вариантами называется :)))

Не, нифига не знает. :)))
Пишет, что знает что такое"побитовые операции", но при этом так и не понял почему обращение к EXPI_PR нужно только одно. Одно высказывание противоречит другому.
И почему плохо читать 6 раз - скорее всего тоже не понял.
Просто тупо скопипастит сейчас чужой код, а потом, когда что-то не станет работать - опять прибежит сюда. :)))


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

Зарегистрирован: Вт окт 01, 2024 15:22:33
Сообщений: 419
Рейтинг сообщения: 0
Если портов много, то - создаём битмап портов:
#define BTN_PORT_MAP (PORT(PIN_BUTTON1) | PORT(PIN_BUTTON2) | ...)
а затем из этого битмапа - набор операций чтения GPIOx->IDR, в набор переменных iA, iB, iC, ....
Тоже - с помощью макросов. Никакие громоздкие си++ тут не нужны.

В том и дело, что если читать в набор переменных iA, iB, iC из GPIOx->IDR, то будет 3 чтения с порта, даже если он одинаков для всех пинов.


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

Зарегистрирован: Вс мар 27, 2022 09:38:17
Сообщений: 160
Рейтинг сообщения: 0
Опять тоже самое!
Хотел бы использовать готовые решения использовал бы библиотеку 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;
}
}


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

Карма: -10
Рейтинг сообщений: 171
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 1483
Рейтинг сообщения: 0
В том и дело, что если читать в набор переменных iA, iB, iC из GPIOx->IDR, то будет 3 чтения с порта, даже если он одинаков для всех пинов.
Такое может быть если кодонаписатель совсем безголовый. 8)
У вменяемого будет одно чтение. Подумайте - как. Там всё просто.

Добавлено after 2 minutes 53 seconds:
оказалось, что всё знает, а мы дураки.

Вот видите какую галиматью пишет:
if((GPIOA->IDR & (1 << 7)) == 0){ // Кнопка ОК
Flag.SET_Ok = true;

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

"Не в коня корм"..... :)))


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

Карма: 68
Рейтинг сообщений: 1958
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 12867
Рейтинг сообщения: 0
На и успокойся!!!

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

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

невозможно успокоиться от подобного ужаса, не коррелирующего с заявленными знаниями.

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

Добавлено after 59 seconds:
jcxz, да, не в коня...


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

Зарегистрирован: Вт окт 01, 2024 15:22:33
Сообщений: 419
Рейтинг сообщения: 0
Такое может быть если кодонаписатель совсем безголовый. 8)
У вменяемого будет одно чтение. Подумайте - как. Там всё просто.

На всякий случай уточню, а то вдруг действительно безголовый ) Один и тот же код из примитивных макросов будет читать один раз из GPIOx->IDR если все пины с одного порта, но будет читать 3 раза, если порты все разные, в остальных случаях будет 2 чтения? Как он это будет делать не сравнивая порты друг с другом, раз уж ты не понимаешь что нужно сравнивать? )

ps. Ага, мы битман портов вручную создаем и он будет ассоциирован с нашими пинами? Громоздкий C++ это все автоматически при компиляции делает, мне такое даже с голову сразу не пришло ) Хотя все равно не понятно... Если пина 3, а порт 1, то в битмапе портов будет один порт, но читать все равно нужно не GPIOx->IDR, который volatile, а значение уже прочитанное из него. Нужен рабочий пример )


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

Зарегистрирован: Вс мар 27, 2022 09:38:17
Сообщений: 160
Рейтинг сообщения: 0
Давайте умники!
3 кнопки.
притянуты к +.
Обработчик один на 4 пина.
Нужно поднять флаг по спаду и сбросить по нарастанию.
Давайте, покажите как вы это видите...
В отладчике всё работает. Или отладчик тоже "Не в коня корм?"
По одному из портов происходит прерывание, там проверяется по какому, дальше флаг.
Вы чё там??? Пьяные???
Вы крутые программисты покажите тогда как это должно быть или не алё?

Добавлено after 1 minute 16 seconds:
STM32F103C6T6 на всякий случай


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

Карма: 68
Рейтинг сообщений: 1958
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 12867
Рейтинг сообщения: 0
Да пофиг, какой мк.
Человеку, который пишет if (a = 0) then b = true else if (a !=0 ) then b = false вместо b = a, можно посоветовать лишь читать книжки по программированию. Общие книжки, а не для STM32F103C6T6.


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

Карма: 94
Рейтинг сообщений: 1466
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15042
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Собственно опять "кнопы преткновения"?
:))
Да еще и под СИ, где особой разницы между МК не наблюдается...
Одна часть прожки - обработчик линий возврата кнопок, вторая - обработчик полученных данных.
Сколько раз уже вылизывалось во всевозможных вариантах...
8)
Не все ли равно, сколько раз читать данные с ЛВК в буфер результата (одной операцией с единого порта или собирать в несколько приемов в общий буфер -накопитель) - для механических кнопок те интервалы совершенно мизерные по сравнению с интервалом антидребезга. Вылизать более оптимальный вариант под конкретный МК и схему - это уже задача вопрошающего.
Может дальше смотреть надо - работа по фиксации данных, антидребезгу, обработка системы подмены функционала нажатой комбинации, длительность удержания, контроль покоя, контроль интервала без обращений к клавиатуре (автоотключение сканирования), контроль интервала "залипания" (повреждение клавиатуры).
Следующий шаг - подменные функции для конкретных комбинаций в разных программах (соответственно разделам менюшки устройства).
:wink:


Последний раз редактировалось BOB51 Вт ноя 12, 2024 18:12:07, всего редактировалось 1 раз.

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

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


Последний раз редактировалось Martian Вт ноя 12, 2024 18:11:33, всего редактировалось 1 раз.

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

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

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 раз.

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

Карма: 68
Рейтинг сообщений: 1958
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 12867
Рейтинг сообщения: 0
Ни в чём, если Вы - индус. Они так писали раньше.
А если надо 10 раз проделать одну и ту же операцию, Вы цикл напишите, или 10 раз строчку скопируете?


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

Карма: 94
Рейтинг сообщений: 1466
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15042
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Так ежли проблем нету - зачем все вышесказанное в обсуждении?
:wink:
Нюансы системы "кнопы + менюшки" позже повылазят (ежли их в самом начале не удалось узреть).
Боно будет, да поздно (код переделывать ой как влом обычно).
:tea: 8)


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

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


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

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

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


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

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


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

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


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