#1 17.03.07 14:25
Устранение дребезга кнопки (прогр/аппар) - КАК?
Подскажите, пожалуйста, способы избавиться от дребезга. Задействовал кнопку мышиную, выяснилось, что она дребезг дает жуткий! Как можно снизить этот эффект? Аппаратно или отследить программно. В программе кнопка просто порождает прерывание (теоретически. Практически - множество прерываний)
Offline
#3 17.03.07 16:54
Re: Устранение дребезга кнопки (прогр/аппар) - КАК?
Не понял, что нужно программировать...
По идее, проблема аппаратная (микрушка накрылась - надо ее поменять ;-). Программно - буферируешь несколько событий нажатия-отпускания + время между ними. Потом этот буфер обрабатываешь (сглаживанием или еще чем) и выдаешь результат))
Offline
#4 17.03.07 22:29
Re: Устранение дребезга кнопки (прогр/аппар) - КАК?
обработка ведется контроллером. Реагировать необходимо "по нажатию". То есть нажал - произошло прерывание. Если обрабатывать по времени, сколько прошло с предыдущего такого же прерывания и т.п. - уже затраты. в принципе, раза 3 в секунду можно и действительно нажать. А если обрабатывать, запоминать, сравнивать... Время почти к этому приблизится. Проблема в том, что когда нажимаю кнопку (просто в данном случае взял от мышки - это может быть любая) контакт замыкается не сразу. Когда мышиную нажал четко и отпустил - дребезга меньше. А вот когда, скажем, два раза подряд нажимаешь - происходит по 4-5 а то и больше прерываний. Вот и получается, что вроде как нажал один раз, а прерываний много... как отсеять лишние?
Offline
#5 17.03.07 22:30
Re: Устранение дребезга кнопки (прогр/аппар) - КАК?
onibaka написал(а):
заюзай лучше мышку полностью с пс/2
В принципе, оно конеш можно... порт полупиэсный у меня на девайсе имеется... правда, я его для клавиатуры метил.... :))))))) но почему не вынести кнопку управления на внешнее устройство - например, мышь? )))))
Offline
#9 18.03.07 19:42
Re: Устранение дребезга кнопки (прогр/аппар) - КАК?
asp, я так прикидываю, конденсатор с резюкстором параллельно кнопке впендюрить... только вот как параметры прикинуть... чет слабо :( прикидываю, что постоянная времени цепи R*C должна быть в районе 10..50мс...
вообще, гугль по запросу "устранение дребезга контактов" рулит...
Offline
#10 18.03.07 20:33
#11 19.03.07 03:45
#12 19.03.07 18:17
#13 19.03.07 20:36
Re: Устранение дребезга кнопки (прогр/аппар) - КАК?
Исходник приблизительно следующий:
Код: Си:
...
#pragma vector = INT1_vect
__interrupt void btn_snd(void)
//Подпрограмма обработки нажатия кнопки посыла
{
b_send = TRUE;
};
...
int main()
{
...
while (1)
{
...
if (b_send)
{
for (int i = 0; i < c_LVal; i++)
{
USART_Transmit(c_RVal);
}
b_send = FALSE;
}
}
};Offline
#14 19.03.07 21:41
Re: Устранение дребезга кнопки (прогр/аппар) - КАК?
попробуй так:
Ножку порта, к которому подсоеденена кнопка, через резюк 10К цепляешь к Vпит, Кнопка комутирует порт(ногу порта) с землей.
прерывание генерируется по отрицательному фронту(1 -> 0) / либо по нулевому уровню.
Код::
#pragma vector = INT1_vect
__interrupt void btn_snd(void)
{
//здесь отключи все прерывания, чтобы вложенные не генерировались
for (int i = 0; i < c_LVal; i++)
USART_Transmit(c_RVal);
//здесь опять включи
};Offline
#15 19.03.07 22:43
Re: Устранение дребезга кнопки (прогр/аппар) - КАК?
proof, подсказка хороша, но я на несколько этапов дальше :) резюк подтягивающий задействован встроенный (просто не впаялся загодя, потом ради одного резюка не стал паяло греть). Встроенные работают вполне, осциллом смотрел переходы. Вложенные прерывания исключены. IAR при трансляции их дисаблит по умолчанию. Когда-то это понял, когда пытался вложенные создать. Работает только одно прерывание, если не ставить явного разрешения. При выходе из обработчика прерывания очищается флаг события прерывания. Прерывание по отрицательному фронту, чтобы не было двойного.
Offline
#16 19.03.07 23:16
#17 19.03.07 23:33
Re: Устранение дребезга кнопки (прогр/аппар) - КАК?
asp, а, блин, ступил я..) невнимательно твое сообщение прочитал. дальше можешь не читать наверн..)
asp, а мош не дребезг это вовсе? просто за то время, пока кнопка нажата, прерывание успевает несколько раз сгенериться. у меня была похожая байда, только я прерывания не использовал, а просто опрашивал порты, когда надо. в общем, решение такое. сразу после опроса порта добавил бесконечный цикл, выход из которого осуществляется по отжатию кнопки. помогло.)
я вот с таким алгоритмом пользую обычные кнопочки типа TS и все ок, никаких ложных срабатываний..)
а листинг функции-аналога getch() примерно такой.
Код::
char getch()
{
char key;
while(!(key=kbhit())); //ждать нажатия клавиши, код клавиши записать в буфер
while(kbhit()); // ждать отжатия клавиши
return key;
}здесь kbhit() - функция, проверяющая нажата ли кнопка. если нажата, то возвращает ее скан-код, иначе - 0.
Исправлено ramalla (19.03.07 23:47)
Offline

