Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: getting-started-project-at91sam9g20
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
wmakc
нужно реализовать обработку датчика, но не могу избавиться от дребезжания контактов.
Объясните как работает эта функция.

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);
}
}
ar__systems
первый код просто не рабочий. timestamp у вас кто обновляет - или это на регистр таймера заdefinено? Второй хоть и рабочий (с оговорками), но весьма корявый именно ввиду цикла в прерывании.

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

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

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

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


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

Опрашивайте кнопки по таймеру. Решение о нажатии или отжатии кнопки принимается по условию стабильности уровня в течение N циклов таймера.
ar__systems
Цитата(wmakc @ Jul 3 2011, 15:29) *
timestamp это счетчик таймера, обновляется в его прерывании.

Два уровня прерываний только для анти-дребезга? Сильно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.