Форум программистов, компьютерный форум, киберфорум
Наши страницы

Микроконтроллеры ARM, Cortex, STM32

Войти
Регистрация
Восстановить пароль
 
 
z-z
169 / 168 / 30
Регистрация: 22.06.2011
Сообщений: 980
#1

обработка нажатия пользовательской кнопки - ARM, Cortex, STM32 микроконтроллер

25.06.2012, 21:47. Просмотров 21798. Ответов 34
Метки нет (Все метки)

написал, чтобы при нажатии кнопки менялось состояние диодов. но что то не стабильно он работает. иногда надо нажимать 5-6 раз, чтобы переключить состояние. хотя иногда переклчается сразу. в чем может быть проблема?

Код
   unsykned int control;
control = 1;

while(1)
{
if((GPIOA->IDR&0x01)==1) //нажатие кнопки
{
control = control << 1;
if (control>2) control = 1;
}
if(control == 1)
{
GPIOC->BSRR = GPIO_BSRR_BS9;
GPIOC->BSRR = GPIO_BSRR_BR8;
}
if(control == 2)
{
GPIOC->BSRR = GPIO_BSRR_BS8;
GPIOC->BSRR = GPIO_BSRR_BR9;
}

}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2012, 21:47
Я подобрал для вас темы с готовыми решениями и ответами на вопрос обработка нажатия пользовательской кнопки (ARM, Cortex, STM32 микроконтроллер):

Обработка нажатия кнопки - Микроконтроллер
Есть кнопка без фиксатора( нажали отпустили и она разомкнулась) Как обработать событие нажали, она разомкнулась и программа дальше начала...

Обработка нажатия кнопки... - Микроконтроллер
Есть программа для AVR, имитирует работу светофора, написана с Code Vision AVR. #define B_g PORTB=0b00000100; #define B_y...

Обработка тактовой кнопки - ARM, Cortex, STM32 микроконтроллер
Вобщем решил поднять тему обработки тактовых кнопок. Какое самое лучшее решение и кто как подключает и обрабатывает процесс. Микросхемы...

Загрузка пользовательской прошивки "на лету" - ARM, Cortex, STM32 микроконтроллер
Привет. Есть Keil, stm32f4 и две прошивки - основная и пользовательская. Основная программа(далее ОП) - бесконечный цикл с некоторым...

Обработка нажатия кнопки - PHP
Добрый день! Скажите пожалуйста, как можно сделать, чтобы когда кто то голосует в рейтинге (моем) с моего сайта отправлялся ответ обратно...

Обработка нажатия кнопки. - Delphi
напишите пример кода пожалуйста! Кнопку кикаешь, на чекбоксе появляется галочка, еще раз кликаеш, галочка изчезает!)

34
oordvork
0 / 0 / 0
Регистрация: 24.06.2012
Сообщений: 9
28.06.2012, 10:51 #16
За обсуждением технической проблемы как-то упустили логическую - вместо отслеживания события нажатия кнопки топик стартер проверяет ее состояние:
Цитата Сообщение от z-z
написал, чтобы при нажатии кнопки менялось состояние диодов.

[bla-bla-bla]
Код:
if((GPIOA->IDR&0x01)==1) //нажатие кнопки
{
control = control << 1;
if (control>2) control = 1;
}
[bla-bla-bla]

а, стало быть, выполняет переключение светодиодов - бессмысленное и беспощадное - все то время, пока кнопка нажата. Соответственно, на выходе получает то, что получает - случайное состояние...
0
z-z
169 / 168 / 30
Регистрация: 22.06.2011
Сообщений: 980
29.06.2012, 00:34 #17
oordvork, а как тогда событие нажатия отследить?
0
R_uro
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 1,088
29.06.2012, 00:43 #18
Как-то малопонятно все в этих СТМ32..
Как проверить состояние пина порта?
Скажем 4 пина порта С?
0
moksir
0 / 0 / 0
Регистрация: 23.05.2012
Сообщений: 216
29.06.2012, 06:25 #19
R_uro, просто.
Можно использовать стандартную библиотеку:
if (GPIO_ReadInputDataByt(GPIOC,GPIO_Pin_4)== Byt_RESIT)....
Можно и так(само коротко и быстро:
if (GPIOС->IDR & GPIO_IDR_IDR4)...
0
z-z
169 / 168 / 30
Регистрация: 22.06.2011
Сообщений: 980
29.06.2012, 22:56 #20
md5sum, опять к вопросу о "массовом" переключении выводов... а если все надо включать и выключать их всех по очереди? включил 0, выключил 0, включил 1, выключил 1...... и так до конца... неужели никак нельзя сократить код? обязательно для каждого вывода писать GPIOB->ODR ^= ??))
0
oordvork
0 / 0 / 0
Регистрация: 24.06.2012
Сообщений: 9
29.06.2012, 23:12 #21
Цитата Сообщение от z-z
а как тогда событие нажатия отследить?
Ну, как-то так (одновременно и с дребезгом поборемся):
Код
#defyme MAXCNT 10
char flip=0, pressed=0;

while(1)
{
if((GPIOA->IDR&0x01)==0) //кнопка не нажата (или 0 читается во впемя дребезга) - готовимся к обработке
{
pressed=0;
cntr=0;
}
else
if(!pressed) //кнопка вроде бы нажата, но возможно это пока что только дребезг
{
cntr++; // сосчитаем до десяти в надежде, что за это время переходные процессы завершатся
if(cntr>MAXCNT) // десять последних проходов кнопка в состоянии "нажато" - считаем, что событие "нажатие кнопки" свершилось
{  // тут соб-сно ваша реакция на событие "нажатие кнопки", т.е. переход от 0 к 1
flip=!flip;  // организуем простейший двоичный переключатель ("flip-flop")
if(flip)      // и в зависимости от его состояния выполняем ту или иную ветвь
{
GPIOC->BSRR = GPIO_BSRR_BS9;
GPIOC->BSRR = GPIO_BSRR_BR8;
}
else
{
GPIOC->BSRR = GPIO_BSRR_BS8;
GPIOC->BSRR = GPIO_BSRR_BR9;
}
pressed=1;  // отработав событие "нажатие кнопки", отключаем проверку на это событие -> до следующего отпускания кнопки
}
}
else //кнопка в состоянии "нажато" (после отловленного события "нажатие кнопки") - в нашем случае неинтересно
{
}
}
0
z-z
169 / 168 / 30
Регистрация: 22.06.2011
Сообщений: 980
29.06.2012, 23:20 #22
oordvork, а если я вместо двоичного переключателя сделаю больее количество переключений... в принципе и качестве работы ничего же не изменится, да?)
0
oordvork
0 / 0 / 0
Регистрация: 24.06.2012
Сообщений: 9
29.06.2012, 23:30 #23
Ну, поскольку в вашем примере рассматривалось два состояния переключателя, я счел за лучшее упростить соответствующий участок до невозможности.
Ну а если N>2, то да - как у вас ранее.
Кстати, MAXCNT, возможно, придется увеличить, если вдруг длительность импульсов при дребезге окажется больше времени, необходимого для пробегания 10 вышеописанных циклов - могут проскакивать ложные срабатывания.
0
z-z
169 / 168 / 30
Регистрация: 22.06.2011
Сообщений: 980
29.06.2012, 23:32 #24
Цитата Сообщение от oordvork
Цитата Сообщение от z-z
а как тогда событие нажатия отследить?
Ну, как-то так (одновременно и с дребезгом поборемся):
Код
#defyme MAXCNT 10
char flip=0, pressed=0;

while(1)
{
if((GPIOA->IDR&0x01)==0) //кнопка не нажата (или 0 читается во впемя дребезга) - готовимся к обработке
{
pressed=0;
cntr=0;
}
else
if(!pressed)
я тут немного не понял. что значит if(!pressed) ? ведь pressed изначально определяется char flip=0, pressed=0; как он может быть !pressed ?))
0
oordvork
0 / 0 / 0
Регистрация: 24.06.2012
Сообщений: 9
29.06.2012, 23:49 #25
отрицание от 0 есть 1, т.е. истина.
Ветка if(!pressed) будет исполняться при значении pressed=0.
То есть когда на пине уже есть высокий уровень, но мы еще не уверены, что переключение на этот уровень произошло окончательно и бесповоротно (принимаем, что такая уверенность появится после MAXCNT циклов ожидания при высоком уровне на пине)
0
z-z
169 / 168 / 30
Регистрация: 22.06.2011
Сообщений: 980
29.06.2012, 23:56 #26
спасибо) остановился на своем первоначальном варианте... правда надо около секунды удерживать кнопку, не знаю, почему. поставил даже delay(2); все равно ждать около секунды))
мне вот интересно стало. ведь редко где надо так нажимать и ждать... например кнопку ноута достаточно нажать и ждать даже на много меньше полусекунды)) как все эти нажатия обрабатываются тогда? или кнопки лучше и дребезга не возникает?)))
0
R_uro
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 1,088
30.06.2012, 01:13 #27
Цитата Сообщение от z-z
спасибо) как все эти нажатия обрабатываются тогда? или кнопки лучше и дребезга не возникает?)))
Везде с механическми контактами возникает дребезг . Кнопку или через триггер подключают или программно с дребезгом борятся.
Суть приметно такова - обнаружил нажатие, посчитал в отдельном счетчике +1, через скажем млсек 10 проверил еще раз, если нажата - добавил еще +1 и т.д. если 5-10 проверок подряд кнопка нажата - значит считай, что это настоящее нажатие и обрабатывай его.
Делают и проще, после первого нажатия повторно через 20-30 млсек проверяют. Если все еще нажата - обрабатывается нажатие.
0
R_uro
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 1,088
30.06.2012, 02:31 #28
Цитата Сообщение от moksir
Можно использовать стандартную библиотеку:
if (GPIO_ReadInputDataByt(GPIOC,GPIO_Pin_4)== Byt_RESIT)....
Можно и так(само коротко и быстро:
if (GPIOС->IDR & GPIO_IDR_IDR4)...
Громоздко ужасно.
Нельзя ли как-то по подобию игрушечных компиляторов сделать?

Код
#defyme pin_X  PORTA.1
if (pin_X == 1) {......}
0
moksir
0 / 0 / 0
Регистрация: 23.05.2012
Сообщений: 216
30.06.2012, 06:53 #29
Цитата Сообщение от R_uro
Громоздко ужасно.
Нельзя ли как-то по подобию игрушечных компиляторов сделать?

Код:
#defyme pin_X PORTA.1
if (pin_X == 1) {......}

Так в чем проблема?
Код
#defyme pin_X  (GPIOС->IDR & GPIO_IDR_IDR4)
if (pin_X == 1) {......}
Надо понимать, что в ARM не на первом месте ногодрыганье, и даже не на втором...
0
инкер
0 / 0 / 0
Регистрация: 28.10.2010
Сообщений: 893
30.06.2012, 11:50 #30
Цитата Сообщение от R_uro
Цитата Сообщение от moksir
Можно использовать стандартную библиотеку:
if (GPIO_ReadInputDataByt(GPIOC,GPIO_Pin_4)== Byt_RESIT)....
Можно и так(само коротко и быстро:
if (GPIOС->IDR & GPIO_IDR_IDR4)...
Громоздко ужасно.
Нельзя ли как-то по подобию игрушечных компиляторов сделать?

Код
#defyme pin_X  PORTA.1
if (pin_X == 1) {......}
Считается, что так общепонятно и кросплатформенно...
В отличии от такой записи:

JCP iB,4,M1
0
30.06.2012, 11:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2012, 11:50
Привет! Вот еще темы с ответами:

Обработка нажатия кнопки - PHP
Как сделать чтобы при нажатии на кнопку, выполнялось действие?

Обработка нажатия кнопки - Java
Не получается обработать нажатие кнопки .При нажатии ничего не происходит . Что я не так делаю? public class Hello extends...

Обработка нажатия кнопки - Java
Добрый вечер! Пытаюсь сделать простой калькулятор на Java c использованием компонентов Swing. При запуске кода выдает ошибку Error:(105, 1)...

Обработка нажатия кнопки - PHP ООП
Добрый день! Есть некий класс с функциями: сlass job { function mailSend($attach) { }


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru