aBoomest 0 1 февраля, 2014 Опубликовано 1 февраля, 2014 (изменено) · Жалоба Здравствуйте. Возникло несколько вопросов. В статье от TI http://processors.wiki.ti.com/index.php/MS...hPad_PushButton есть формула по расчету емкости конденсатора в зависимости от подтягивающего резистора и времени дребезга. Как определить время дребезга. Производители (по моим расспросам) не особо знают это значение, а уж продавцы кнопочек и подавно. Откуда берется коэффициент 0.69? Как програмно можно избавиться от дребезга? В программе делаю прерывание от кнопки (схема и диаграмма сигналов приведена на рисунке) Бит P1IES устанавливаю в ноль (сбрасываю), т.е. прерывание возникает при отпускании кнопки (согласно схемы). Картинка с осциллографа (нарастает не быстро т.к. есть параллельный кондерчик) Работает нормально. Однако в 20-30% нажатий прерывание так же возникает и при 1->0 переходе (импульс красного цвета на первой схеме) Плюс картинка с осциллографа Что это может быть? Изменено 2 февраля, 2014 пользователем aBoomest Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
miheyk 0 1 февраля, 2014 Опубликовано 1 февраля, 2014 (изменено) · Жалоба Время дребезга для кнопки вряд ли какой производитель Вам скажет. Это не тумблер и не реле, где контакты доводятся. Известен лишь порядок - десятки мс. Продолжительность дребезга напрямую зависит от скорости, силы нажатия и степени износа механики. Для расчета используется известная формула тау RC-цепи. Полное время успокоения от дребезга t = 5 * тау. Вот схема под эту формулу. П.Хоровиц, У.Хилл - Искусство схемотехники, глава 9.04/Дребезг контактов механического ключа. Эта схема гарантированно защитит от дребезга, в отличие от схемы в статье, о чем автор и написал. А коэффициент 0.69 видимо автор получил эмпирически с учетов емкости порта МК, чтобы формула точнее вычисляла. На последней картинке не понял, что изображено - что такое красное, что синее? Программная обработка дребезга основана на чтении состоянии порта через промежутки времени - например, после срабатывания прерывания делаем паузу на время дребезга, далее читаем порт 10 раз подряд через 1 мс., если все значение = 1, значит кнопка гарантировано нажата. Лично всегда делаю защиту от дребезга как на схеме и никаких проблем. Что это может быть? Если речь о красном выбросе на осциллограмме, то это похоже на запись 1 в порт. Изменено 1 февраля, 2014 пользователем Mihey_K Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aBoomest 0 2 февраля, 2014 Опубликовано 2 февраля, 2014 (изменено) · Жалоба Спасибо за ответ. Подредактировал 1-й пост, чтоб было удобнее. Получается так что при нажатии кнопки время разряда будет С2R2, а при отпускании время заряда (R1+R2)C2 ? На счет картинок. На первой картинке схематично показано то, что на второй и третей картинках подтверждено осциллограммами. Прерывание у меня должно возникать при отпускании кнопки т.к. P1IES &= ~MyButtonBit. Это первая картинка синенький импульс и вторая картинка - осциллограмма. Хорошо работает. Но в 20-30% нажатий прерывание возникает ТАКЖЕ и в момент нажатия кнопки (однако этого не должно быть). Это первая картинка - красный импульс (он появляется не всегда), а так же подтверждение этому третья картинка - осциллограмма. Что это может быть? Изменено 3 февраля, 2014 пользователем aBoomest Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
miheyk 0 2 февраля, 2014 Опубликовано 2 февраля, 2014 · Жалоба Сделайте схему первую, что по земле, с таким же номиналами. Там время разряда 5 * R2 * C2, время заряда 5 * (R1 + R2) * C2. Если не поможет, то код в студию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aBoomest 0 3 февраля, 2014 Опубликовано 3 февраля, 2014 · Жалоба Спасибо за советы. Получилось так. Работает вроде бы стабильно: никаких лишних импульсов пока не наблюдал. Я конечно раньше в кнопки осциллографом не тыкался (не приходилось), но как-то кажется что фронты очень уж пологие. Или я преувеличиваю? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
V_G 8 3 февраля, 2014 Опубликовано 3 февраля, 2014 · Жалоба Я делаю без конденсаторов, чисто программно. По первому прерыванию от кнопки все последующие прерывания запрещаются. На время дребезга (с запасом) заводится таймаут (часто - по прерыванию от таймера, но можно сделать по-разному). По завершении таймаута сбрасываются пришедшие запросы на прерывания от кнопок (дребезг), считывается актуальное состояние кнопок и вновь разрешаются прерывания от них. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aBoomest 0 4 февраля, 2014 Опубликовано 4 февраля, 2014 · Жалоба А можно вместо 100К поставить например 47К, чтоб чуть уменьшить постоянную времени, или это не желательно (не рекомендовано)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
miheyk 0 5 февраля, 2014 Опубликовано 5 февраля, 2014 · Жалоба А можно вместо 100К поставить например 47К, чтоб чуть уменьшить постоянную времени, или это не желательно (не рекомендовано)?Можете как угодно в любую сторону менять номиналы R и/или C для получения требуемой постоянной времени. На 47k получите ~20 мс. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться