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

Участник

Группа: Участник
Сообщений: 69
Регистрация: 17-09-05
Из: Kirov
Пользователь №: 8 659

|
Внесу свою реплику в дискуссию... Код #define _fDreb 5 //защита от дребезга (0.05 сек.) #define _fRepite 39 //время первого автоповтора (0.4 сек.) #define _nRepite 10 //время второго и последующего автоповтора (0.1 сек.)
//уровни напряжений для кнопок (_minKey1 > _minKey2 > _minKey3 > _minKey4) #define _minKey1 ... //минимальный уровень напряжения для кнопки 1 #define _minKey2 ... //минимальный уровень напряжения для кнопки 2 #define _minKey3 ... //минимальный уровень напряжения для кнопки 3 #define _minKey4 ... //минимальный уровень напряжения для кнопки 4 unsigned int ADCresult; unsigned char newHKey, oldHKey, drebCount; unsigned char _key;
ADCresult = ...; //данные с АЦП //... вызывается с частотой ~100 Гц newHKey = 0; if(ADCresult>=_minKey1) { newHKey = 0x01; //key1 } else if(ADCresult>=_minKey2) { newHKey = 0x02; //key2 } else if(ADCresult>=_minKey3) { newHKey = 0x04; //key3 } else { newHKey = 0x08; //key4 }; if((oldHKey!=newHKey)||(newHKey==0x0)) { _key = false; drebCount = _fDreb; } else { if((--drebCount)==0) { //расшифровываем нажатие на кнопки if(newHKey&0x01)key1=true; if(newHKey&0x02)key2=true; if(newHKey&0x04)key3=true; if(newHKey&0x08)key4=true; drebCount = _fRepite; //предполагаем повторное нажатие if(_key==false)drebCount = _nRepite; //устанавливаем ожидание 1-го нажатия _key = true; }; }; oldHKey = newHKey;
--------------------
В голове слышался грохот: рушились грандиозные планы...
|
|
|
|
Сообщений в этой теме
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 TamTam [quote name='Stas633' date='Jul 10 200... Jul 9 2006, 22:50 Velund С весовыми резисторами имеет смысл связываться тол... Jul 9 2006, 23:59  Stas633 Цитата(Velund @ Jul 10 2006, 03:59) С вес... Jul 10 2006, 07:45   Kovrov Цитата(Stas633 @ Jul 10 2006, 11:45) Мне ... Jul 10 2006, 08:46   defunct Цитата(Stas633 @ Jul 10 2006, 09:45) Инте... Feb 11 2010, 23:02 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 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
|
|
|