Продолжительность дребезга кнопки

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем DrProg, 26 янв 2016.

  1. DrProg

    DrProg Вечный нерд

    Амперка, как и Джереми Блюм приводят в качестве примера задержку в 10мс. Для большинства задач такая задержка практически незаметна. Но иногда, например если МК параллельно занят динамической индикацией, этот delay(10) может стать проблемой. Намеренно обойдя тему аппаратного подавления дребезга, которую здесь поднимали неоднократно, решил посмотреть что же на самом деле происходит на кнопке при ее нажатии и отпускании. Перепробовал с пяток тактовых кнопок двух размеров, ни на одной дребезг не превысил 1мкс. Таким образом, если верить результатам, программное подавление может выглядеть так:
    Код (C++):
    delayMicroseconds(1);
    Что в 10 000 раз быстрее рекомендованного. В чем же причина? Кнопки мне попались такие замечательные, оба осциллографа бессовестно лгут или опыт проведен некорректно?
     
    ИгорьК нравится это.
  2. ИгорьК

    ИгорьК Гуру

    Не может. Как же мне нравятся ваши сообщения!!!
     
    Onkel нравится это.
  3. DrProg

    DrProg Вечный нерд

    This function works very accurately in the range 3 microseconds and up. - Это что ли? Означает лишь то, что точная задержка менее 3 микросекунд не гарантирована, то есть delayMicroseconds(1) возможно будет длиться дольше и тем более переждет дребезг (в 3000 раз быстрее заявленного). И потом, такое допущение наверняка сделано для минимальной или почти минимальной частоты МК, то есть 1МГц. Большинство Ардуин же работает на 16, есть мнение, что этого хватит для обработки таймером 1мкс.

    В любом случае мысль интересная, надо проверить.
     
    ИгорьК нравится это.
  4. ИгорьК

    ИгорьК Гуру

    Это что ли.
     
  5. DrProg

    DrProg Вечный нерд

    Вот простейший скетч генерирующий задержку 1мкс в состоянии HIGH всего порта на Меге 2560:
    Код (C++):
    void setup() {
    DDRB = 0b11111111;
    }

    void loop() {
    PORTB = 0b00000000;
    delayMicroseconds(1);
    PORTB = 0b11111111;
    delayMicroseconds(1);
    PORTB = 0b00000000;
    }
    Вот картинка, доказывающая, что 1мкс вполне себе держится как и должна:
    [​IMG]
    Уж не знаю к радости или огорчению скептиков.
     
    BGreen и ИгорьК нравится это.
  6. ИгорьК

    ИгорьК Гуру

    Конечно к радости вашего поклонника в моем лице :) вы не заметили?
     
  7. DrProg

    DrProg Вечный нерд

    Заметил, что последнюю неделю или две мои посты лишились поклонника. Кому то прогул и выговор!
     
    ИгорьК нравится это.
  8. ИгорьК

    ИгорьК Гуру

    Лишь бы не домашнее задание :)
     
  9. ИгорьК

    ИгорьК Гуру

    Что там за дельта Т 6.67 мкс?
     
  10. DrProg

    DrProg Вечный нерд

    Разница между маркерами, они тут выставлены с прошлого какого то измерения.

    Сетка в вертикальном масштабе 1 клетка - 1мкс.
     
    ИгорьК нравится это.
  11. ИгорьК

    ИгорьК Гуру

    Тогда похоже
     
  12. Onkel

    Onkel Гуру

    похоже на сферического доктора в вакууме. это только в том случае, если мк ничего не делает, запрещены все прерывания и пр. В реальности 1 мкс конечно мало , да и то тут в докторском доказательстве присутствует небольшая хитрость - используются команды мк, а не ide.
     
  13. DrProg

    DrProg Вечный нерд

    Никто не настаивает строго на 1 мкс, это практическая величина, которой достаточно для пропуска дребезга. Реально можно сделать значительно больше с учетом всех нагрузок (а какие пр. кроме прерываний могут помешать делею?). Например 10мкс или 10мкс, даже 1 млс, но 10 мс это явно перебор, если конечно не использовать ржавый дедушкин рубильник. Информация может быть полезна тем, для кого задержка 10мс критична. Лично я не понижал пропуск слепо доверяя примерам, но все нужно проверять время от времени.
     
    ИгорьК нравится это.
  14. Onkel

    Onkel Гуру

    информация очень вредна тем, для кого задержка 10 мс критична, ибо информация ваша неправильна. Если кому задержка 10 мс критична, надо обойтись без задержки, а просто узнать состояние пина через 10 мс, это займет при правильном подходе 10 тактов. У меня дребезг 0,3 с, но я не испытываю проблем с задержкой 0.3 с потому что никаких задержек у меня нет. изменение пина вызывает прерывание , в котором настраивается другое прерывание, затем мк продолжает выполнять свою работу. а через 0,3 с прерывание по таймеру проверяет пин- и если не дребезг, то вызывается функция обработки нажатия кнопки.
     
    Последнее редактирование: 26 янв 2016
  15. AlexU

    AlexU Гуру

    Время дребезга при замыкании или размыкании кнопки?
     
  16. ostrov

    ostrov Гуру

    Для меня это актуально! Не поделитесь кодом антидребезга без задержки? Спасибо.
     
  17. Onkel

    Onkel Гуру

    если только чуть попозже. я пока не разобрался, как в ide ардуины работать напрямую с регистрами мк и прерываниями. В С это гораздо гораздо проще - просто пишешь и все. Но сделаю, как раз дополню пример с сервомашинкой, а то там тоже все через регистры.
    Вроде должны быть функции в Ide работы с регистрами, чую должны быть. Время будет - посмотрю стандартные библиотеки, они с прерываниями работают.
     
  18. Unixon

    Unixon Оракул Модератор

    Почему вас это смутило? Скетч же просто присоединяется остальному сишному коду в качестве инклуда и скармливается компилятору. Вы уже пишете на самом обычном C / C++.

    См. arduino-1.0.6/hardware/arduino/cores/arduino/main.cpp
     
  19. Onkel

    Onkel Гуру

    не , не смутило, просто физически не дошел.
    как называется функция , вызываемая по переполнению счетчика таймера 0?
     
  20. DrProg

    DrProg Вечный нерд

    Мне тоже интересно как программный антидребезг реализуется через прерывание таймера. И насколько это проще и правильнее.
     
    ИгорьК нравится это.