Это мое первое сообщение на этом форуме, прошу не пинать
Подскажите пожалуйста алгоритм преодаления дребезга контактов
1) с исключением повтора нажатия кнопки
2) без использования задрежки
в кратце о схеме
на одном входе atmega8 речезе АЦП подключено 10 кнопок, через резистры разных номиналов происходит деление напряжения.
алгоритм работы такой
1) настроено прерывание по изменению АЦП
2) если оно входит в заданный диапазон значений, то переменной присваивается номер нажатой кнопки (Key)
3) если этот номер повторяется в течении 100 преобразований то значит дребезга нет
4) вызываю функцию соответсвующей нажатой кнопке (функция тригерная - первый заход один результат, второй другой)
5) ...
вот тут и начинается проблема функия вызывается много раз
добавил еще один флаг, который обнуляется каждую секунду, стало лучше , но тк секундный таймер тикает постоянно, а нажатие может попасть в середину или конец секунды и соответственно происходит задвоение нажатия
Код: Выделить всё
//защита от дребезга и не только. если нажата какая-нибудь кнопка
//сравниваем совпадают ли текущее состояние и предыдущее
//если совпадают - проверяем счетчик comp, если нет обнуляем его
//кнопка считается нажатой если она удерживается в течении 100
if (Key)
{
if (Key == LastState)
{
if (comp > 100)
{
if (Key!=LastBut)
{
Key_p=Key;
out_trig(); // выполняю действия
LastBut = Key; // переменную lastBut сбрасываю каждую секунду
}
else
{
}
}
else
comp++;
}
else // сбрасываем счетчик
{
LastState = Key;
comp = 0;
}
}
else // кнопка не нажата
{
comp = 0;
KeyBuf = KEY_NULL;
LastState = KEY_NULL;
}
StartConvAdc(); //запускаем преобразование и выходим
ps
камень Atmega8
компилятор CodeVisionAVR



