реклама на сайте
подробности

 
 
> getting-started-project-at91sam9g20, Как работают обработчики прерываний нажатий на кнопки?
wmakc
сообщение Jun 30 2011, 18:48
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 111
Регистрация: 2-03-10
Пользователь №: 55 768



нужно реализовать обработку датчика, но не могу избавиться от дребезжания контактов.
Объясните как работает эта функция.

CODE
void ISR_Bp1(void)
{
static unsigned int lastPress = 0;

// Check if the button has been pressed
if (!PIO_Get(&pinPB1)) {

// Simple debounce method: limit push frequency to 1/DEBOUNCE_TIME
// (i.e. at least DEBOUNCE_TIME ms between each push)
if ((timestamp - lastPress) > DEBOUNCE_TIME) {

lastPress = timestamp;

// Toggle LED state
pLedStates[0] = !pLedStates[0];
if (!pLedStates[0]) {

LED_Clear(0);
}
}
}
}


Если я правильно понимаю, то первоначально lastPress = 0 и условие выполнится сразу как только timestamp будет больше DEBOUNCE_TIME, а в программе это 500 милисекунд. А чтобы избавиться от дребезжания нужно чтобы в течение 500 миллисекунд значение PIO не поменялось.

вот так вроде работает, но внутри прерывания крутится цикл, да и PIO проверяется постоянно.
CODE
void ISR_Bp1(void)
{
if (!PIO_Get(&pinPB1))
{
lastPress = timestamp;
while((timestamp- lastPress)<DEBOUNCE_TIME)
{
if(PIO_Get(&pinPB1))
{
return;
}
}
pLedStates[0] = !pLedStates[0];
if (!pLedStates[0])
{
LED_Clear(0);
}
}


Сообщение отредактировал wmakc - Jun 30 2011, 18:49
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
ar__systems
сообщение Jul 2 2011, 13:05
Сообщение #2


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



первый код просто не рабочий. timestamp у вас кто обновляет - или это на регистр таймера заdefinено? Второй хоть и рабочий (с оговорками), но весьма корявый именно ввиду цикла в прерывании.

и это ведь простейшая алгоритмическая задача...

500мс слишком много. Возьмите 50мс.
Go to the top of the page
 
+Quote Post
wmakc
сообщение Jul 3 2011, 19:29
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 111
Регистрация: 2-03-10
Пользователь №: 55 768



Цитата(ar__systems @ Jul 2 2011, 17:05) *
первый код просто не рабочий. timestamp у вас кто обновляет - или это на регистр таймера заdefinено? Второй хоть и рабочий (с оговорками), но весьма корявый именно ввиду цикла в прерывании.

и это ведь простейшая алгоритмическая задача...

500мс слишком много. Возьмите 50мс.


timestamp это счетчик таймера, обновляется в его прерывании.
Понимаю что корявый, но никогда не занимался этим, поэтому и спрашиваю как лучше сделать.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 3 2011, 20:06
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(wmakc @ Jul 3 2011, 23:29) *
Понимаю что корявый, но никогда не занимался этим, поэтому и спрашиваю как лучше сделать.

Опрашивайте кнопки по таймеру. Решение о нажатии или отжатии кнопки принимается по условию стабильности уровня в течение N циклов таймера.
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Jul 3 2011, 20:54
Сообщение #5


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Цитата(wmakc @ Jul 3 2011, 15:29) *
timestamp это счетчик таймера, обновляется в его прерывании.

Два уровня прерываний только для анти-дребезга? Сильно.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 19:49
Рейтинг@Mail.ru


Страница сгенерированна за 0.01393 секунд с 7
ELECTRONIX ©2004-2016