нужно реализовать обработку датчика, но не могу избавиться от дребезжания контактов.
Объясните как работает эта функция.
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