|
Дребезг контактов, Как избежать? |
|
|
|
Jul 9 2006, 18:55
|

Участник

Группа: Новичок
Сообщений: 27
Регистрация: 5-07-06
Из: Украина, Донецк
Пользователь №: 18 606

|
Кнопка замыкает ножку на землю. Mega16 Код #include <avr/io.h> #include <avr/interrupt.h>
#define F_CPU 8000000UL // 8 MHz #include <util/delay.h>
ISR(INT2_vect) { int i; for (i=0;i<3;i++) _delay_ms(10); if ((PINB & 0x04)==0) // ножка внешнего прерывания PORTA ^= 1; }
int main() { PORTA = 0; DDRA = 0xFF;
PORTB = 0xFF; DDRB = 0x00; MCUCSR &= ~_BV(ISC2); // по заднему фронту (H->L) GICR = _BV (INT2); sei ();
for(;;) return(0); } Идея вроде бы правильная, но на практике срабатывает плоховато... В чем ошибка?
Сообщение отредактировал Labinskiy Nikolay - Jul 9 2006, 18:59
--------------------
If you can't make it good - don't make it look good ;)
|
|
|
|
|
Jul 9 2006, 19:13
|
Частый гость
 
Группа: Свой
Сообщений: 185
Регистрация: 5-05-06
Из: Ekaterinburg, Russia
Пользователь №: 16 821

|
Код int i; for (i=0;i<3;i++) _delay_ms(10); Во-первых, НЕОБХОДИМО ИЗБАВИТЬСЯ от задержек в прерывании. Всякие delay вынести в основной цикл. Во-вторых, я бы сделал следующим образом: считывал 3 раза уровень на нужном выводе, а после принимал решение m из n (в данном случае 2 из 3) о нажатии кнопки (естественно, в основном цикле).
--------------------
Чудес не бывает - бывает мало знаний и опыта!
|
|
|
|
|
Jul 9 2006, 19:25
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Есть два стандартных способа опроса клавиатуры с устранением дребезга контактов. 1. Интервальный. Состояние кнопок опрашивается с интервалом заведомо превышающим время дребезга. Процедуру опроса удобно запускать в каком-нибудь таймерном прерывании с периодом 10-15 мс. Если состояние клавиатуры между двумя соседними вызовами процедуры одинаково, то оно считается устойчивым. 2. Счетчик состояния. При вызове процедуры подсчитывается (программно) количество совпадений одинакового состояния клавиши. Если до окончания счета состояние меняется, то счетчик сбрасывается и перезапускается. Состояние считается устойчивым, если счетчик совпадений досчитал до заранее определенного (алгоритмически, экспериментально или интуитивно  ) числа (например, 15). Поскольку в вашем случае процедура определения состояния кнопки запускается по прерыванию от этой конопки, то думаю вам подойдет второй алгоритм. Попробуйте такой алгоритм. Код #define COUNT_END 10 #define COUNT_PERIOD 15
ISR(INT2_vect) { int i=0, j=0; while (i<COUNT_END) { if ((PINB & 0x04)==0) { i++; j=0; } else { i=0; j++; } if (j>COUNT_PERIOD) break; } PORTA ^= 1; }
|
|
|
|
|
Jul 9 2006, 22:32
|

Частый гость
 
Группа: Свой
Сообщений: 105
Регистрация: 6-01-06
Пользователь №: 12 901

|
Цитата(rezident @ Jul 9 2006, 23:25)  Есть два стандартных способа опроса клавиатуры с устранением дребезга контактов. 1. Интервальный.... .....Если состояние клавиатуры между двумя соседними вызовами процедуры одинаково, то оно считается устойчивым..... Будет ли верным, на Ваш взгляд, определять состояние нажатой кнопки так: в начале определять "КАКАЯ-ТО ИЗ КНОПОК НАЖАТА", а через время на устранение дребезга - "КАКАЯ КНОПКА НАЖАТА"? Особенно если клавиатура - не матрица кнопок, а резистивный делитель, как во многих автомагнитолах (пример схемы в файле). Каким алгоритмом пользуются производители автомагнитол? Спасибо. Для справки: Весовые резисторы подобраны всегда так, что диапазон напряжения делителя делится поровну, по числу кнопок. С уважением.
Эскизы прикрепленных изображений
|
|
|
|
|
Jul 10 2006, 07:45
|

Частый гость
 
Группа: Свой
Сообщений: 105
Регистрация: 6-01-06
Пользователь №: 12 901

|
Цитата(Velund @ Jul 10 2006, 03:59)  С весовыми резисторами имеет смысл связываться только тогда, когда есть уверенность в долговременной надежности самих кнопок и не будет конденсации влаги никогда...... Не во всем согласен с Вами. Вы ведете речь о "резиновой" клавиатуре. А сопротивление замкнутого контакта у нее от десятков (новая) до сотен (старая) ом. У "кнопочной" (контактной) клавиатуры значение сопротивления в процессе эксплуатации меняется от десятых долей до единиц ома. Для весовых резисторов сопротивлением в единицы кОм, согласитесь, это большая разница. Да и эксплуатациую в салоне автомобиля "тепличными" условиями, назвать трудно. Наоборот, изделие будет подвержено частой смене температурно-влажностного режима. И тем не менее, во всех (кроме тех, где процессор объединен с PLL) автомагнитолах используется схема с весовымы резисторами. Правда "резиновой" клавиатуры на магнитолах я не встречал никогда. Имея же в "распоряжении" ADC "на борту" AVR'a считаю целесообразным "связываться" с весовыми резисторами, чтобы выводы портов оставить "свободными" для иных нужд. Вопрос - как правильно и оптимально защититься от "ложных" срабатываний на всем периоде эксплуатации? To Kovrov. Описанный Вами метод, есть ни что иное, как "Счетчик состояния", используя терминологию rezident. Если быть точным, то это "мажоритарный" метод принятия решения. Мне кажеться он не удобен, в силу непредсказуемости времени окончания работы алгоритма. Хотя для правильного определения нажатия кнопки - метод самый верный. ("200%" - согласен). Интересно, каким же алгоритмом пользуются производители автомагнитол? С уважением.
|
|
|
|
|
Jul 10 2006, 08:46
|

Мастер-фломастер
   
Группа: Свой
Сообщений: 611
Регистрация: 29-12-05
Пользователь №: 12 700

|
Цитата(Stas633 @ Jul 10 2006, 11:45)  Мне кажеться он не удобен, в силу непредсказуемости времени окончания работы алгоритма. Хотя для правильного определения нажатия кнопки - метод самый верный. ("200%" - согласен). почемуже не предсказуем? у меня этот алгоритм в моей программе "крутиться" всегда другое дело время реакции зависит от самого дребезга... ну вот тут действительно дребезг - вещь непредсказуемая если кнопка грязью забилась да ещё при этом еле нажмать....
--------------------
Вон ПОПОВ, клоун клоуном, а радио изобрел!!
|
|
|
|
|
Jul 10 2006, 10:40
|

Частый гость
 
Группа: Свой
Сообщений: 105
Регистрация: 6-01-06
Пользователь №: 12 901

|
Цитата(rezident @ Jul 10 2006, 13:27)  При использовании ADC и "аналоговой" клавитуры считаю более логичным избавляться от дребезга путем введения интегрирующего звена на входе АЦП. То бишь RC нужно. Тут в соседний теме уже давали ссылку на пример матричной "аналоговой" клавиатуры. http://www.ustr.net/electronics/akeys.shtmlНе согласен принципиально. Дребезг контактов в "аналоговой" (поддерживаю такое определение) клавиатуре - это увеличение напряжения на входе ADC, из-за высокого сопротивления нажимаемой кнопки в начале "нажатия". А интегрирующее звено, по природе своей - "накопитель". То есть призвано устранять "провалы", накапливать напряжение. Что только усугубит последствия дребезга, увеличив время установления конечного напряжения. Как (хорошо или плохо) работает схема по ссылке я не знаю. Но думаю, что со "старыми" кнопками устойчивых значений до ТЫСЯЧНЫХ долей вольта НЕ ПОЛУЧИТЬ! Интерсно было бы узнать мнение конструктора после некоторого периода эксплуатации. Спасибо. С уважением.
|
|
|
|
|
Jul 10 2006, 11:52
|

Частый гость
 
Группа: Свой
Сообщений: 105
Регистрация: 6-01-06
Пользователь №: 12 901

|
Цитата(Kovrov @ Jul 10 2006, 15:36)  .... и все это идет через делитель...... Интегратор??
|
|
|
|
|
Jul 10 2006, 13:01
|

Профессионал
    
Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264

|
Программных алгоритмов антидребезга может быть достаточно много, но на мой взгляд самыми классическим критериями (на все случаи жизни для обработки состояний клавиатуры) по которым можно написать такие алгоритмы должны основываться на построении следующего замкнутого графа: 1. Определение состояния надежно-разомкнутого контакта (группы контактов). 2. Определение состояния первого замыкания контакта. Это и есть начало дребезга, который должен игнорироваться до определения следующего состояния (3). 3. Определение состояния надежно-замкнутого контакта (группы контактов). 4. Определение состояния первого размыкания контакта. Есть начало дребезга, который должен игнорироваться до определения следующего состояния (1).
Так же можно заметить, что ни одна программная реализация антидребезга не будет работать столь надежно, как его аппаратная реализация. Пример этому может служить механические свойства самого контакта ('пружинистость' материала, его механическое старение, устойчивость к внешней среде - окисление), что в последствии очень существенно меняет характеристику дребезга (длительность и форму). К примеру, когда приходится делать надежную систему, я всегда использую триггеры.
--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|