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

 
 
> Дребезг контактов, Как избежать?
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
Ответов
TamTam
сообщение Jul 9 2006, 22:50
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 293
Регистрация: 14-03-06
Пользователь №: 15 254



[quote name='Stas633' date='Jul 10 2006, 02:32' post='132459']
[quote name='rezident' post='132434' date='Jul 9 2006, 23:25']

Каким алгоритмом пользуются производители автомагнитол?

Спасибо.

Для справки: Весовые резисторы подобраны всегда так, что диапазон напряжения делителя делится поровну, по числу кнопок.

С уважением.
[/quote]

Судя по схеме подключения они используют 1 канал АЦП, а резюки подобраны так для того чтоб можно было определить нажатие 2-х кнопок сразу, а не спутать его с нажатием другой кнопки
Go to the top of the page
 
+Quote Post
Velund
сообщение Jul 9 2006, 23:59
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 693
Регистрация: 19-11-04
Пользователь №: 1 177



С весовыми резисторами имеет смысл связываться только тогда, когда есть уверенность в долговременной надежности самих кнопок и не будет конденсации влаги никогда. Иначе получится как у доблестной фирмы Моторола в радиостанциях CP-50 - при активном использовании максимум год и надо менять "резинку" клавиш с проводящими пятачками, предварительно отмыв до блеска пленочную плату что под ней на держатель наклеена. Иначе "нажимается" все что угодно, кроме того что надо, часто само по себе.
Go to the top of the page
 
+Quote Post
Stas633
сообщение Jul 10 2006, 07:45
Сообщение #4


Частый гость
**

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



Цитата(Velund @ Jul 10 2006, 03:59) *
С весовыми резисторами имеет смысл связываться только тогда, когда есть уверенность в долговременной надежности самих кнопок и не будет конденсации влаги никогда......


Не во всем согласен с Вами. Вы ведете речь о "резиновой" клавиатуре. А сопротивление замкнутого контакта у нее от десятков (новая) до сотен (старая) ом. У "кнопочной" (контактной) клавиатуры значение сопротивления в процессе эксплуатации меняется от десятых долей до единиц ома.
Для весовых резисторов сопротивлением в единицы кОм, согласитесь, это большая разница.

Да и эксплуатациую в салоне автомобиля "тепличными" условиями, назвать трудно. Наоборот, изделие будет подвержено частой смене температурно-влажностного режима. И тем не менее, во всех (кроме тех, где процессор объединен с PLL) автомагнитолах используется схема с весовымы резисторами. Правда "резиновой" клавиатуры на магнитолах я не встречал никогда.

Имея же в "распоряжении" ADC "на борту" AVR'a считаю целесообразным "связываться" с весовыми резисторами, чтобы выводы портов оставить "свободными" для иных нужд. Вопрос - как правильно и оптимально защититься от "ложных" срабатываний на всем периоде эксплуатации?

To Kovrov.

Описанный Вами метод, есть ни что иное, как "Счетчик состояния", используя терминологию rezident. Если быть точным, то это "мажоритарный" метод принятия решения.

Мне кажеться он не удобен, в силу непредсказуемости времени окончания работы алгоритма. Хотя для правильного определения нажатия кнопки - метод самый верный. ("200%" - согласен).


Интересно, каким же алгоритмом пользуются производители автомагнитол?

С уважением.
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 11 2010, 23:02
Сообщение #5


кекс
******

Группа: Свой
Сообщений: 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'ом
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
- - 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


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

 


RSS Текстовая версия Сейчас: 28th June 2025 - 20:44
Рейтинг@Mail.ru


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