Официальный сайт студ.городка НГТУ
Программирование и БД » Устранение дребезга кнопки (прогр/аппар) - КАК? 

#1  17.03.07 14:25

asp
Профиль

Устранение дребезга кнопки (прогр/аппар) - КАК?

Подскажите, пожалуйста, способы избавиться от дребезга. Задействовал кнопку мышиную, выяснилось, что она дребезг дает жуткий! Как можно снизить этот эффект? Аппаратно или отследить программно. В программе кнопка просто порождает прерывание (теоретически. Практически - множество прерываний)

Offline

#2  17.03.07 15:20

Re: Устранение дребезга кнопки (прогр/аппар) - КАК?

заюзай лучше мышку полностью с пс/2
там наверняка аппаратно устраняетьс я  дребезг

Offline

#3  17.03.07 16:54

Re: Устранение дребезга кнопки (прогр/аппар) - КАК?

Не понял, что нужно программировать...

По идее, проблема аппаратная (микрушка накрылась - надо ее поменять ;-). Программно - буферируешь несколько событий нажатия-отпускания + время между ними. Потом этот буфер обрабатываешь (сглаживанием или еще чем) и выдаешь результат))

Offline

#4  17.03.07 22:29

asp
Профиль

Re: Устранение дребезга кнопки (прогр/аппар) - КАК?

обработка ведется контроллером. Реагировать необходимо "по нажатию". То есть нажал - произошло прерывание. Если обрабатывать по времени, сколько прошло с предыдущего такого же прерывания и т.п. - уже затраты. в принципе, раза 3 в секунду можно и действительно нажать. А если обрабатывать, запоминать, сравнивать... Время почти к этому приблизится. Проблема в том, что когда нажимаю кнопку (просто в данном случае взял от мышки - это может быть любая) контакт замыкается не сразу. Когда мышиную нажал четко и отпустил - дребезга меньше. А вот когда, скажем, два раза подряд нажимаешь - происходит по 4-5 а то и больше прерываний. Вот и получается, что вроде как нажал один раз, а прерываний много... как отсеять лишние?

Offline

#5  17.03.07 22:30

asp
Профиль

Re: Устранение дребезга кнопки (прогр/аппар) - КАК?

onibaka написал(а):

заюзай лучше мышку полностью с пс/2

В принципе, оно конеш можно... порт полупиэсный у меня на девайсе имеется... правда, я его для клавиатуры метил.... :))))))) но почему не вынести кнопку управления на внешнее устройство - например, мышь? )))))

Offline

#6  17.03.07 22:46

Re: Устранение дребезга кнопки (прогр/аппар) - КАК?

ну ты там тогда юзай усб порт 8)

Offline

#7  18.03.07 00:07

Re: Устранение дребезга кнопки (прогр/аппар) - КАК?

ээээ... фильтр простенький какой-нибудь не выход?

Offline

#8  18.03.07 14:31

asp
Профиль

Re: Устранение дребезга кнопки (прогр/аппар) - КАК?

Andron_, об этом фильтре и речь. Какие бывают, как можно устранить. Как расчитать/прикинуть параметры

Offline

#9  18.03.07 19:42

Re: Устранение дребезга кнопки (прогр/аппар) - КАК?

asp, я так прикидываю, конденсатор с резюкстором параллельно кнопке впендюрить... только вот как параметры прикинуть... чет слабо :( прикидываю, что постоянная времени цепи R*C должна быть в районе 10..50мс...
вообще, гугль по запросу "устранение дребезга контактов" рулит...

Offline

#10  18.03.07 20:33

Re: Устранение дребезга кнопки (прогр/аппар) - КАК?

Выложи исходник! может программно можно решить, без временных потерь.

Offline

#11  19.03.07 03:45

Maq
Профиль

Re: Устранение дребезга кнопки (прогр/аппар) - КАК?

проше решить аппаратно, там одна-пара мелких деталек:) точно не вспомню схему, давно видел, очень давно.

Offline

#12  19.03.07 18:17

Re: Устранение дребезга кнопки (прогр/аппар) - КАК?

Так как насчет исходника? у меня просто была такаяже трабла - решил программно, причем элементарно...

Offline

#13  19.03.07 20:36

asp
Профиль

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

asp
Профиль

Re: Устранение дребезга кнопки (прогр/аппар) - КАК?

proof, подсказка хороша, но я на несколько этапов дальше :) резюк подтягивающий задействован встроенный (просто не впаялся загодя, потом ради одного резюка не стал паяло греть). Встроенные работают вполне, осциллом смотрел переходы. Вложенные прерывания исключены. IAR при трансляции их дисаблит по умолчанию. Когда-то это понял, когда пытался вложенные создать. Работает только одно прерывание, если не ставить явного разрешения. При выходе из обработчика прерывания очищается флаг события прерывания. Прерывание по отрицательному фронту, чтобы не было двойного.

Offline

#16  19.03.07 23:16

Re: Устранение дребезга кнопки (прогр/аппар) - КАК?

От Slaerа:
У меня в книге по PIC есть схемка на МК для устранения дребезга контакта.

Offline

#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

#18  20.03.07 02:24

Re: Устранение дребезга кнопки (прогр/аппар) - КАК?

поставь одновибратор на выход, либо реагируй на продолжительнось нажатия, например, если ее удерживали менее 150мс то это дребезг или помеха, или отключай прерывание, на некоторое время, например 200мс после первого прерывания

Offline

Программирование и БД » Устранение дребезга кнопки (прогр/аппар) - КАК? 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.041 сек.
Выполнено 14 запросов.