Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прерывания по кнопке
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
aBoomest
Здравствуйте.
Возникло несколько вопросов.
В статье от TI
http://processors.wiki.ti.com/index.php/MS...hPad_PushButton
есть формула по расчету емкости конденсатора в зависимости от подтягивающего резистора и времени дребезга.
Как определить время дребезга. Производители (по моим расспросам) не особо знают это значение, а уж продавцы кнопочек и подавно.
Откуда берется коэффициент 0.69?
Как програмно можно избавиться от дребезга?

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


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

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

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


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

П.Хоровиц, У.Хилл - Искусство схемотехники, глава 9.04/Дребезг контактов механического ключа.
Эта схема гарантированно защитит от дребезга, в отличие от схемы в статье, о чем автор и написал. А коэффициент 0.69 видимо автор получил эмпирически с учетов емкости порта МК, чтобы формула точнее вычисляла.
На последней картинке не понял, что изображено - что такое красное, что синее?
Программная обработка дребезга основана на чтении состоянии порта через промежутки времени - например, после срабатывания прерывания делаем паузу на время дребезга, далее читаем порт 10 раз подряд через 1 мс., если все значение = 1, значит кнопка гарантировано нажата.
Лично всегда делаю защиту от дребезга как на схеме и никаких проблем.

Цитата
Что это может быть?

Если речь о красном выбросе на осциллограмме, то это похоже на запись 1 в порт.
aBoomest
Спасибо за ответ.
Подредактировал 1-й пост, чтоб было удобнее.

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

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

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

Что это может быть?
Mihey_K
Сделайте схему первую, что по земле, с таким же номиналами. Там время разряда 5 * R2 * C2, время заряда 5 * (R1 + R2) * C2. Если не поможет, то код в студию.
aBoomest
Спасибо за советы.
Получилось так.

Работает вроде бы стабильно: никаких лишних импульсов пока не наблюдал. Я конечно раньше в кнопки осциллографом не тыкался (не приходилось), но как-то кажется что фронты очень уж пологие. Или я преувеличиваю?
V_G
Я делаю без конденсаторов, чисто программно.
По первому прерыванию от кнопки все последующие прерывания запрещаются. На время дребезга (с запасом) заводится таймаут (часто - по прерыванию от таймера, но можно сделать по-разному). По завершении таймаута сбрасываются пришедшие запросы на прерывания от кнопок (дребезг), считывается актуальное состояние кнопок и вновь разрешаются прерывания от них.
aBoomest
А можно вместо 100К поставить например 47К, чтоб чуть уменьшить постоянную времени, или это не желательно (не рекомендовано)?
Mihey_K
Цитата
А можно вместо 100К поставить например 47К, чтоб чуть уменьшить постоянную времени, или это не желательно (не рекомендовано)?
Можете как угодно в любую сторону менять номиналы R и/или C для получения требуемой постоянной времени. На 47k получите ~20 мс.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.