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

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

  1. Onkel

    Onkel Гуру

    брежневского нет, есть правильный. Возможно, "брежневский" в вашем понимании совпадает с общепринятым "правильным". А в ответ на вашу шутку подумайте, почему по Сирии из Каспийского моря стреляли брежневскими (1976-1982 г. разработки и запуска в производство, "Калибр"), а не путинскими (а есть ли такие, кстати?) крылатыми ракетами.
     
  2. DrProg

    DrProg Вечный нерд

    Ну понятно. Что то такое у вас есть, но мне не понять и потому надо просто принять что оно круче.

    Для энкодера можно сделать по другому, и я делал. Но мы то тут про антидребезг кнопки говорили. По существу: чем мой вариант совсем уж неприемлем? Мне кажется имеет право на существование. Спасибо за саму идею, мне понравилось его придумать.
     
  3. AlexU

    AlexU Гуру

    В данной теме обсуждались вопросы решения проблем с дребезгом кнопок путем внесения задержек или использования таймеров. Что касается использования таймера -- хочется произнести фразу одного товарища: "чудны крестьянски дети". Эту фразу он произносил, когда люди пытались сделать что-либо странным, чудным способом. Что касается задержек, то это один из простых, но самых неэффективных способов -- контроллер простаивает "решая проблему с дребезгом", хотя мог бы заниматься полезным делом. Но немного отвлечёмся от дребезга. В голове крутиться только один вопрос: "нажатие кнопок -- это асинхронное событие, которое может наступить в любой момент времени. Почему для обработки таких асинхронных событий не использовать прерывания, которые именно для этого и придуманы?". DrProg, Вы в свое время задавались вопросом -- где можно использовать прерывания? Вот Вам ответ. Теперь вернемся к дребезгу, ранее задавал вопрос -- время дребезга замерялось при нажатии кнопки или при отпускании? Дело в том, что конструкция тактовой кнопки такая, что в момент нажатия кнопки дребезга почти нет, его можно не учитывать. А вот в момент отпускания, всё зависит от того как быстро Вы отпустите кнопку -- время дребезга может превысить 500 мсек.

    Вот небольшой пример использования прерываний с подавлением дребезга в функциях обработчиках прерываний -- использовал в качестве теста времени дребезга:
    Код (C++):


    #include "LiquidCrystal3WI.h"


    LiquidCrystal3WI lcd(8, 9, 10);


    volatile unsigned int buttons[] = {0, 0, 0}; // хранение количества нажатий кнопок

    volatile unsigned long buttonsTime[] = {0, 0, 0}; // хранение времени последнего срабатывания прерывания


    #define HANDLE_BUTTON(i) ( { \
        unsigned long t = millis();            /* время срабатывания прерывания */ \
        if ((t - buttonsTime[i]) > 500) {    /* проверяем, что после последнего срабатывания прошло 0,5 сек */ \
            buttons[i]++;                     /* увеличиваем счётчик нажатий */ \
            buttonsTime[i] = t;             /* запоминаем время */ \
        } \
    } \
    )



    // функция -- обработчик прерывания INT0 -- кнопка №1, подключенная к пину 2
    // пин подтянут к +5V, кнопка замыкает пин на GND
    void buttonInt_1() {
        if (digitalRead(2) == LOW) HANDLE_BUTTON(0);
    }

    // функция -- обработчик прерывания PCINT2 -- кнопки №2 и №3, подключенные к пинам 4 и 5 соответственно
    // пины подтянуты к +5V, кнопки замыкают пины на GND
    inline void buttonInt_2() {
        if (digitalRead(4) == LOW) HANDLE_BUTTON(1);
        if (digitalRead(5) == LOW) HANDLE_BUTTON(2);
    }

    // регистрируем обработчик прерывания PCINT2 (пины RX, TX, 2, 3, 4, 5, 6, 7)
    ISR(PCINT2_vect) {
        buttonInt_2();
    }

    void setup() {

        // подтягиваем пины к +5V
        pinMode(2, INPUT_PULLUP);
        pinMode(4, INPUT_PULLUP);
        pinMode(5, INPUT_PULLUP);

        // очищаем флаги прерываний INT0, INT1
        EIFR = 3;
        // очищаем флаги прерываний PCINT0, PCINT1, PCINT2
        PCIFR = 7;

        // регистрируем обработчик прерывания INT0
        attachInterrupt(0, buttonInt_1, CHANGE);

        // активируем обработку прерываний на пинах 4 и 5
        PCMSK2 = 0x30;
        // активируем обработчик прерывания PCINT2
        PCICR = 4;

        delay(500); // просто так
    }

    void loop() {

        // выводим на дисплей количество нажатий кнопок
        lcd.setCursor(0, 0);
        for (uint8_t i = 0; i < 3; i++) {
            lcd.print(buttons[i], 10);
            lcd.print("  ");
        }
    }
     
    Как видно, считывание состояний кнопок происходит через 0,5 сек после последнего нажатия, т.к. только с таким временем количество ложных срабатываний стремиться к нулю.

    PS: дребезг -- это одна из бед. Вторая -- это скорость нарастания или спада фронта импульса. Поэтому применяя конденсаторы [с резисторами] нужно грамотно разводить схему, а то можно не решить проблему с ложными срабатываниями, а наоборот ухудшить ситуацию -- количество ложных срабатываний возрастёт. В этом случае спасут триггеры Шмитта.
     
    Tomasina и DrProg нравится это.
  4. DrProg

    DrProg Вечный нерд

    Опять вы со своими триггерами. А что касается кнопки, чаще всего не надо ждать ее нажатие в любой момент, а только в определенный. Да и функции у одной и той же кнопки могут быть разные в разных частях программы. К тожу же у avr -ов всего два аппаратных прерывания по сигналу извне, а если надо больше?
    Что до крестьянских детей, то согласен, такой способ борьбы с дребезгом через таймер использовать врядли кто будет в реальности. Интересен сам факт, что это возможно. Опять же упражнение для бестолковой головы.
     
  5. AlexU

    AlexU Гуру

    Не внимательно код примера посмотрели. В нём три сигнала -- три кнопки. Поддержка аппаратных прерываний есть на всех сигнальных входах.
     
  6. DrProg

    DrProg Вечный нерд

    Честно говоря вообще пока не смотрел, ибо в дороге. )
    На мой взгляд аппаратные прерывания хороши, но не во всех случаях. Например счетчики это их конек. Тут не спорю. И не только для кнопок.
    Но если задачи для кнопок меняются в процессе, как чаще всего у меня бывает, то воспользоваться таким способом сложнее. Хоть и возможно.
     
  7. AlexU

    AlexU Гуру

    FIFO буфер поможет решить проблемы.
     
    DrProg нравится это.
  8. 9xA59kK

    9xA59kK Гик

    А что за помехи ??
     
  9. DrProg

    DrProg Вечный нерд

    Длинные провода (десятки метров) не всегда экранированные, расположенные рядом с силовыми кабелями иногда просаживаются несмотря на притяжку к +5 на несколько микро(милли)сек, чего без обработки хватает чтобы МК сработал как на сигнал. Не всегда получается сделать разводку правильно, иногда она уже готова неправильно без возможности замены. Решается или аппаратно RC-цепью или программно, схоже с антидребезгом, только пауза подбирается в зависимости от ситуации опытным путем или после статистики замеров осциллографом. Чаще просто с запасом.
     
  10. 9xA59kK

    9xA59kK Гик

    Длинные провода - это управление нагрузкой или это кнопки управления и т.п.? Можно использовать питание 12 или 24V вольта стабилизированными БП. Использовать раздельное питание МК и управление силовой частью. У меня на работе длинна соединений достигает 100- 200 метров без проблем, хотя помех очень много. и разного рода и в том числе идут вместе с силовыми(~380V) в одном кабеле(что не рекомендую).
     
  11. DrProg

    DrProg Вечный нерд

    Сигналы от датчиков, кнопок и прочих герконов.
     
  12. 9xA59kK

    9xA59kK Гик

    Я думаю надо стремиться к промышленным стандартам , с управляющими и измерительными сигналами в 24V,36V(можно и меньше но.....). Ну и не забывать про RC или LC фильтры, как в цепях управления так и в высоковольтных цепях мощной нагрузки. Тогда и большая часть помех будет не почЁм. И вообще фильтры, снаберы и т.п надо ставить везде, во всех устройствах. А то наши браться китайцы предпочитают в ширпотребе экономить и вообще их не ставить, а потом проблемы всякие вылазят.
    ps\ Вот недавний пример. купил мой знакомый видеорегистратор в авто "и вдруг" у него на автомагнитоле "перестало" радио работать. Проверили все, оказалось этот самый регистратор гонит зверскую высокочастотную помеху в цепях питания, которая глушит радиоприемник. Вскрыли адаптер питания регистратора, а там почти ничего нету, кроме микросхемы импульсного стабилизатора. Самое интересное, что в монтажной плате, предусмотрено место и разводка под радиоэлементы фильтров, но их там небыло.
     
  13. 9xA59kK

    9xA59kK Гик

    "Важно, чтобы провода к кнопке S1 были как можно короче. Если кнопку надо вынести на большое расстояние от схемы замка, или если работа замка ожидается в условиях сильных электромагнитных помех, то необходима защита порта P3.2 (см. рис.)."

    [​IMG]
     
    rico, AlexU и DrProg нравится это.
  14. Onkel

    Onkel Гуру

    странная схема. Говорим про помехоустойчивость - и ставим резистор. Чем подтягиваем? Встроеным резистором, который то ли 30 КОм, то ли 50 кОм? Оксиморон. Резистор 1к должен быть на подтяжке к +5 (или саму кнопку 1К подтягиваем к +5), а кнопка подключена напрямую, а диоды надо быстрые шоттки bat34. А кд521 где ж теперь найдешь?
     
    Последнее редактирование: 29 янв 2016
    rico нравится это.
  15. 9xA59kK

    9xA59kK Гик

    Схема стандартная, особенно если соединяем длинными проводами , ну а детали можно всегда заменить аналогами любыми. Резистор 1к в этой схеме не для подтяжки, а для защиты по току.
    На эту тему интересная статья, с диаграммами. Есть книги но не могу найти.
     
    Последнее редактирование: 30 янв 2016
  16. 9xA59kK

    9xA59kK Гик

    upload_2016-1-30_13-15-37.png Еще пример.
     
    Последнее редактирование: 30 янв 2016
    AlexU нравится это.
  17. Onkel

    Onkel Гуру

    стандартная схема содержит подтяжку.
     
  18. 9xA59kK

    9xA59kK Гик

    Вовсе не обязательно. Схем много разного рода. Подтяжа может быть реализована в МК.
     
    Последнее редактирование: 30 янв 2016
  19. 9xA59kK

    9xA59kK Гик

    upload_2016-1-30_14-1-50.png
    ВОт еще немного это из книги "Рюмик 1000 и одна микроконтроллерная схема Вып. 1 2010". Очень полезная книга , там много полезного.
     
    Последнее редактирование: 30 янв 2016
  20. Onkel

    Onkel Гуру

    я выше написал - в мк резистор подтяжки имеет сопротивление 30-50 ком, а то и больше. Где 30 ком, там никакой помехоустойчивости. 1 кОм - еще терпимо, не зря же в rs485 120 Ом.
    Что же до Рюмика - имхо не очень грамотно составленная компиляция, разномастно и в разнобой.