реклама на сайте
подробности

 
 
> Дребезг контактов, Как избежать?
Labinskiy Nikola...
сообщение Jul 9 2006, 18:55
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 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 ;)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rezident
сообщение Jul 9 2006, 19:25
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Есть два стандартных способа опроса клавиатуры с устранением дребезга контактов.
1. Интервальный. Состояние кнопок опрашивается с интервалом заведомо превышающим время дребезга. Процедуру опроса удобно запускать в каком-нибудь таймерном прерывании с периодом 10-15 мс. Если состояние клавиатуры между двумя соседними вызовами процедуры одинаково, то оно считается устойчивым.
2. Счетчик состояния. При вызове процедуры подсчитывается (программно) количество совпадений одинакового состояния клавиши. Если до окончания счета состояние меняется, то счетчик сбрасывается и перезапускается. Состояние считается устойчивым, если счетчик совпадений досчитал до заранее определенного (алгоритмически, экспериментально или интуитивно smile.gif ) числа (например, 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;
}
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Labinskiy Nikolay   Дребезг контактов   Jul 9 2006, 18:55
- - Yura_K   Код int i; for (i=0;i<3;i++) _dela...   Jul 9 2006, 19:13
|- - 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
- - 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


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 17:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.01376 секунд с 7
ELECTRONIX ©2004-2016