Срабатывание "кнопок"

Тема в разделе "Arduino & Shields", создана пользователем Михаил123, 29 июн 2021.

  1. SergeiL

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

    Могу создать тему про очень быструю и компактную обработку входов (не важно кнопки, контакты) с параллельным устранением дребезга по всем каналам на вертикальных счетчиках, но в 2016г. я ее создавал, и как то не поняли их.
     
  2. Рокки1945

    Рокки1945 Гуру

    Тачка на прокачку:rolleyes:
     
  3. Рокки1945

    Рокки1945 Гуру

    Да интересно.
     
  4. parovoZZ

    parovoZZ Гуру

    Рецепт очень простой - опрашиваем входы с периодом не меньше, чем период дребезга. Я чаще 20мс никогда не опрашиваю и никогда этот антидребезг не использовал.
     
  5. SergeiL

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

    С кнопками на коротких проводах или на плате в 5 см от контроллера в корпусе - это нормально.
    А вот с более длинными проводами или датчиками, подключенными по проводам, которые не в корпусе - это вопрос обстановки вокруг. Как раз как в теме ТС.

    ИМХО, короткая импульсная помеха, пришедшаяся на период опроса, будет рассмотрена как сигнал срабатывания.
    Я именно по этому и спрашивал ТС, как он обрабатывает входы.

    Мы опрашиваем вход - там «0» сменился на «1», импульс короткий, 1 мс, да и меньше может быть.
    Через 1мс уже «0».
    Но мы-то этого не узнаем.
    Через 20мс посчитаем что сигнал поменялся на «0».

    Я вот как раз за вариант с проверкой устоявшегося состояния.
    И практика показывает, что при таком алгоритме, отсутствие каких либо ложных срабатываний (лет 10) - это лучший вариант для опроса датчиков и кнопок.

    Например каждые 10мс проверяем состояние входа.
    3 последних значения запоминаем.

    Можно и больше, делал и на 7 последних значений, плюс одно текущее. Итого - 8 значений подряд.
    При этом разница между 4 и 8 проверяемыми значениями - это плюс 1 переменная uint8_t (8 бит) для 8 входов и меньше и плюс одна строчка Си кода! Разницы в надежности не увидел, может у меня условия нормальные.
    При этом никаких циклов для проверки, все 8 входов обрабатываются параллельно!
    Можно и до 16-ти, до 32-ух входов параллельно обрабатывать на установившееся состояние.
    Естественно при этом увеличится количество команд контроллера.
    Но количество команд контроллера сильно не пропорционально увеличивается, и это прикольно. Значительно меньше!!!

    Смысл в чем:
    Если 3 последних значения и только что полученное (четвертое), отличаются от текущего логического - состояние входа изменилось.
    То есть, каждые 10мс проверяем вход. Если текущее логическое состояние входа - «0» и 4 раза подряд получаем «1» - считаем, что вывод перешел в «1».
    Если текущее логическое состояние входа - «1» и 4 раза подряд получаем «0» - считаем, что вывод перешел в «0»
    Всегда ждем последние 4 ожидаемых значения, если проскочило не ожидаемое - перехода не будет, снова ждем подряд 4 ожидаемых значения.
    И в чем прикольно - это половина экрана по коду на Си, без циклов, и для параллельной обработки от 1-го до 32-ух входов на AVR .

    Завтра отпишусь.
    Сегодня вечером сильно порезал код с рабочей железки (раз в 30, но иначе, как мне показалось, новичкам будет сложно разобраться), выкладывал тут исходный вариант, но похоже не понятен код был...
    Потом из за непонятных мне настроений хозяев форума я попросил удалить все мои темы и их удалили. Там была тема от 2016-го года про обработку входов. К сожалению, сейчас их не восстановить. Искал в удаленных - не нашел. Потихоньку будем восстановливать.

    Завтра проверю на Ардуиновской железке. Без проверки ничего не выкладываю - принципиально.
    На обычном AVR код раза в два короче, завтра объясню - почему.
    Но это не принципиально.
    На Ардуино - тоже все сильно оптимальней получается.
     
    Михаил123 и Рокки1945 нравится это.
  6. Рокки1945

    Рокки1945 Гуру

    Вставлю свои 2 рупии. Что есть мип - какова его длительность? Нано микро? Ну упало на входе до логического нуля ну завис МК там подождал опять опросил если там снова нуль тогда обработка. И потом есть защита от статики диод или прессор на входе. Вообще с этим никогда не заморачивайся. Другое дело не про..ать его, вот тут да. Я заводил переменную бульевого типа, пришел нуль этой переменной единичку потом в цикл ждём пока вход не станет положительным, в if выполняем действие булеву сбрасываем чтобы не заходить в цикле в условие.
     
  7. SergeiL

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

    Ну в вот булевым типом в Си не все так хорошо было. Сейчас стало лучше!
    Спасибо @Asper Daffy за помощь в этом, сейчас с обновлением стандарта все стало лучше, чем раньше.
    Раньше каждая булевая переменная занимала как минимум 8 бит.
    Я по этому, по привычке, распихиваю флаги по битам в переменной флагов.
     
  8. parovoZZ

    parovoZZ Гуру

    Что такое период опроса? Между опросами состояние кнопки может быть каким угодно.

    Если уж вдаваться в такие дебри, то и опрашивать кнопки надо хаотично, т.к. помеха имеет именно такой характер.

    Наличие помех на объекте говорит о том, что их необходимо исследовать и отнести к какому-либо классу. А уже потом применять методы защиты от них. В типовых промышленных контроллерах входной ток дискретных входов порядка 10мА при напряжении 24в.
     
  9. сделал следующее решение: поставил еще одну кнопку. Пока она не нажата - сигналы с 2 других не считываются. сутки полет нормальный.
     
  10. испытаю - отпишусь.
    не охота везде ставить 3 кнопку.
     
  11. Месяц на сдвоенных кнопках - нет проблем.