|
Дребезг контактов, Как избежать? |
|
|
|
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 10 2006, 07:45
|

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

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

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(Stas633 @ Jul 10 2006, 09:45)  Интересно, каким же алгоритмом пользуются производители автомагнитол? Не знаю как производители магнитол, а я пользуюсь алгоритмом откладывания события: Код const PROGMEM U8 transTab[] = { 200, 167, 125, 99, 83, 71, 61, 55, 49, 44, 40, 37, 35, 32, 30, 28 };
// это задачка, которая запускается с периодом 5ms // сканирует АЦП канал, и преобразует показания АЦП в индекс от 0x0 до 0xF, // индекс представляет собой код, где каждый бит соответствует одной нажатой кнопке. void kbr_ScanTask(void) { U8 val = kbr_AdcChanRead( kbrContext.AdcChan ); U8 i; U8 NewStatus = 0;
for(i = 0; i < sizeof(transTab); i++) { if (val > pgm_read_byte_near( transTab + i )) { NewStatus = i; break; } }
if (NewStatus != kbrContext.status) { kbrContext.status = NewStatus; if (NULL != kbrContext.StatusChange_CB) { // register keyboard status change handler to be executed after 50 ms (to filter out all false events) Kernel_SetTask( kbrContext.StatusChange_CB, 50, TASK_RUN_ONCE ); } } } И при изменении статуса клавиатуры (в данном случае 4 кнопки на 1 канал АЦП), сканирующая задачка ставит в очередь на исполнение через __50ms__ "Keyboard Status Change event". За эти 50ms задача сканирует канал АЦП еще 10 раз (т.к. она выполяется раз в 5ms) и если статус будет изменяться (дребезг), то запуск event'a будет откладываться. Когда состояние АЦП установится - т.е. на протяжении 10 следующих подряд сканирований состояние не изменится, event таки отработает. Это есть, одна из возможных, реализация "Интервального" алгоритма, упомянутого resident'ом
|
|
|
|
Сообщений в этой теме
Labinskiy Nikolay Дребезг контактов Jul 9 2006, 18:55 Yura_K Код int i;
for (i=0;i<3;i++)
_dela... Jul 9 2006, 19:13 rezident Есть два стандартных способа опроса клавиатуры с у... Jul 9 2006, 19:25 Stas633 Цитата(rezident @ Jul 9 2006, 23:25) Есть... Jul 9 2006, 22:32   Kovrov Цитата(Stas633 @ Jul 10 2006, 11:45) Мне ... Jul 10 2006, 08:46 upc2 Можно с использованием флагов.В прерывании устанав... Jul 10 2006, 04:32 Kovrov Такой вариант обхода дребезга - пользуюсь когда мн... Jul 10 2006, 06:17 rezident При использовании ADC и "аналоговой" кла... Jul 10 2006, 09:27 Stas633 Цитата(rezident @ Jul 10 2006, 13:27) При... Jul 10 2006, 10:40 Kovrov по профилю работы часто приходится общаться с проф... Jul 10 2006, 11:36 Stas633 Цитата(Kovrov @ Jul 10 2006, 15:36) .... ... Jul 10 2006, 11:52 BVU Программных алгоритмов антидребезга может быть дос... Jul 10 2006, 13:01 fantasy Внесу свою реплику в дискуссию...
Код#define _fDr... Jul 10 2006, 15:19 Labinskiy Nikolay Всем спасибо за ответы - пойду экспериментировтаь Jul 10 2006, 16:36 dio Понимаю что вопрос тупой, но всё таки ...
Упростил... Jul 19 2006, 17:58 smk Как выяснилось в моем случае, полезно обеспечивать... Feb 10 2010, 17:48 Marian Цитата(smk @ Feb 10 2010, 19:48) Как выяс... Feb 11 2010, 13:49 rezident Цитата(smk @ Feb 10 2010, 22:48) Иначе ск... Feb 11 2010, 15:53 Oleg_IT Как-то уже приводил здесь этот код.
Кодunsigned l... Feb 11 2010, 09:23 Lexdaw А я по опросу входа (кнопки) сдвигаю регистр влево... Feb 11 2010, 13:24 Corvus А простой инкремент/декремент чем не угодил? Feb 11 2010, 13:47  ReAl Цитата(Corvus @ Feb 11 2010, 15:47) А про... Feb 12 2010, 05:56   Corvus Цитата(ReAl @ Feb 12 2010, 08:56) Если Вы... Feb 12 2010, 09:09 smk Нет, просто события внутри микроконтроллера опереж... Feb 11 2010, 17:08 sonycman Цитата(smk @ Feb 11 2010, 21:08) Нет, про... Feb 11 2010, 17:17 rezident Цитата(smk @ Feb 11 2010, 22:08) Нет, про... Feb 11 2010, 17:25 Oleg_IT Товарищ смешивает две задачи, устранения дребезга ... Feb 11 2010, 19:27 rezident Цитата(Oleg_IT @ Feb 12 2010, 00:27) Това... Feb 11 2010, 21:31 smk Цитатая лично на точно таких же принципах
о чем то... Feb 12 2010, 06:58 muravei Цитата(smk @ Feb 12 2010, 09:58) в следст... Feb 12 2010, 08:18 rezident Цитата(smk @ Feb 12 2010, 11:58) Действие... Feb 12 2010, 14:26 smk КодЧтобы так сильно не рисковать стоит проверять ... Feb 12 2010, 09:30 andr_doy давно и с большим успехом пользую следущий код
//.... Feb 12 2010, 09:50 sonycman Цитата(ReAl @ Feb 12 2010, 09:56) Да ещё ... Feb 12 2010, 13:42
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|