Перейти к содержанию
    

Прерывания по кнопке

Здравствуйте.

Возникло несколько вопросов.

В статье от TI

http://processors.wiki.ti.com/index.php/MS...hPad_PushButton

есть формула по расчету емкости конденсатора в зависимости от подтягивающего резистора и времени дребезга.

Как определить время дребезга. Производители (по моим расспросам) не особо знают это значение, а уж продавцы кнопочек и подавно.

Откуда берется коэффициент 0.69?

Как програмно можно избавиться от дребезга?

 

В программе делаю прерывание от кнопки (схема и диаграмма сигналов приведена на рисунке)

zmb955.jpg

 

Бит P1IES устанавливаю в ноль (сбрасываю), т.е. прерывание возникает при отпускании кнопки (согласно схемы).

15ebiux.jpg

Картинка с осциллографа (нарастает не быстро т.к. есть параллельный кондерчик)

Работает нормально.

 

Однако в 20-30% нажатий прерывание так же возникает и при 1->0 переходе (импульс красного цвета на первой схеме)

Плюс картинка с осциллографа

29v1p53.jpg

 

Что это может быть?

Изменено пользователем aBoomest

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Время дребезга для кнопки вряд ли какой производитель Вам скажет. Это не тумблер и не реле, где контакты доводятся. Известен лишь порядок - десятки мс. Продолжительность дребезга напрямую зависит от скорости, силы нажатия и степени износа механики. Для расчета используется известная формула тау RC-цепи. Полное время успокоения от дребезга t = 5 * тау. Вот схема под эту формулу.

button.jpg

П.Хоровиц, У.Хилл - Искусство схемотехники, глава 9.04/Дребезг контактов механического ключа.

Эта схема гарантированно защитит от дребезга, в отличие от схемы в статье, о чем автор и написал. А коэффициент 0.69 видимо автор получил эмпирически с учетов емкости порта МК, чтобы формула точнее вычисляла.

На последней картинке не понял, что изображено - что такое красное, что синее?

Программная обработка дребезга основана на чтении состоянии порта через промежутки времени - например, после срабатывания прерывания делаем паузу на время дребезга, далее читаем порт 10 раз подряд через 1 мс., если все значение = 1, значит кнопка гарантировано нажата.

Лично всегда делаю защиту от дребезга как на схеме и никаких проблем.

 

Что это может быть?

Если речь о красном выбросе на осциллограмме, то это похоже на запись 1 в порт.

Изменено пользователем Mihey_K

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответ.

Подредактировал 1-й пост, чтоб было удобнее.

 

Получается так что при нажатии кнопки время разряда будет С2R2, а при отпускании время заряда (R1+R2)C2 ?

 

На счет картинок.

На первой картинке схематично показано то, что на второй и третей картинках подтверждено осциллограммами.

Прерывание у меня должно возникать при отпускании кнопки т.к. P1IES &= ~MyButtonBit. Это первая картинка синенький импульс и вторая картинка - осциллограмма. Хорошо работает.

 

Но в 20-30% нажатий прерывание возникает ТАКЖЕ и в момент нажатия кнопки (однако этого не должно быть). Это первая картинка - красный импульс (он появляется не всегда), а так же подтверждение этому третья картинка - осциллограмма.

 

Что это может быть?

Изменено пользователем aBoomest

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сделайте схему первую, что по земле, с таким же номиналами. Там время разряда 5 * R2 * C2, время заряда 5 * (R1 + R2) * C2. Если не поможет, то код в студию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за советы.

Получилось так.

34zmzyr.jpg

Работает вроде бы стабильно: никаких лишних импульсов пока не наблюдал. Я конечно раньше в кнопки осциллографом не тыкался (не приходилось), но как-то кажется что фронты очень уж пологие. Или я преувеличиваю?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я делаю без конденсаторов, чисто программно.

По первому прерыванию от кнопки все последующие прерывания запрещаются. На время дребезга (с запасом) заводится таймаут (часто - по прерыванию от таймера, но можно сделать по-разному). По завершении таймаута сбрасываются пришедшие запросы на прерывания от кнопок (дребезг), считывается актуальное состояние кнопок и вновь разрешаются прерывания от них.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А можно вместо 100К поставить например 47К, чтоб чуть уменьшить постоянную времени, или это не желательно (не рекомендовано)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А можно вместо 100К поставить например 47К, чтоб чуть уменьшить постоянную времени, или это не желательно (не рекомендовано)?
Можете как угодно в любую сторону менять номиналы R и/или C для получения требуемой постоянной времени. На 47k получите ~20 мс.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...