народ, нубский вопрос есть 2 пина к которым подключено что-то типа кнопки, как только 1н упал на землю что-то делаю сейчас я засунул опрос этих пинов в 1н из потоков который раз в 250мс их опрашивает, и если 2 раза подрят пин в 0 то что-то делаю получаеться задержка в срабатывании в 0.5сек, и как-бы хрен с ней, в моем случае это не особо критично, но хочется сделать хорошо, отсюда вопрос если я повешу на эти пины вневшее прерывание например по спаду, в прерывании буду будить нужный поток и далее делать что мне нужно, я не заимею гемороя в виде дребезга или ещё какой радости ?

Комментарии: 26

  1. Viktor

    Насколько я знаю, в прерывание по нажатию кнопки стоит вставлять вывод из всякиз LPM, ELPM. По крайней мере для пиков я такие рекомендации читал. А насчет дребезга - поставь кондер на 1 мкф.)

    • Viacheslav

      если тупо повесить на прерывание, то получишь кучу вложенных прерываний и race conditions

      • Viktor

        И что за МК?

        • Denis

          stm32

          • Viktor

            А точнее.

            • Denis

              stm32f103c8t6

              • Viacheslav

                Но вообще 250мс задержка для антидребезга - это перебор. Хватит и 5-10мс.

                • Denis

                  да у меня просто другой поток который делает полезную работу с такими задержками трудится, я в него и всунул, как-бы не хочется сильно МК нагружать опросом только кнопки

                  • Viacheslav

                    Ну сделай еще один поток, на idle приоритете и все. опрос кнопки не дорогой

                  • Viktor

                    А в самом МК нет ничего для антидребезга?

                    • Viacheslav

                      и как вариант - кнопку повесить на прерывание, а в прерывании тупо запускать поток для антидребезга и уходить из него. а в том потоке уже ждать 10 мс , делать что надо и стопорить поток

                      • Denis

                        может сделать приостановленный поток если сработало прерывание то запрещаем его и будим поток, в потоке с задержкой в 10-50мс опрашиваем кнопку и если нажата то делаем что нужно и снова разрешаем прерывание с яыка снял

                    • Bogdan

                      Ну в целом, иногда бывает - аппаратные фильтры. Сканируют пин раз в n тактов, и пропускают уровень, если m последовательных отчётов были одинаковы. Но, емнип, в данной стмке такого нет

                      • Viktor

                        Или CCL/CLC.

                        • Bogdan

                          Это ещё более редкий тип периферии

      • Dmytro

        Это, простите, где такое бывает? Обычно в обработчике отключаются прерывания, а одинаковые не копятся

        • Viacheslav

          Но можно и не отключать (большинство об этом вообще не знают) :)

          • Dmytro

            Отключается автоматически. Включается тоже автоматически - после выхода из обработчика. Отсюда и рекомендации - делать обработчики максимально короткими

            • Viacheslav

              Автоматически = Фреймворк за вас делает :) в тех же пиках и арм можно понаделать вложенных прерываний пока стек не кончится

          • Denis

            Не, ну ок, я поймал прерывание по спаду фронта, запретил прерывание, и сделал вывод что кнопка нажата. А как в этой схеме мне понять что ее отпустили ? Т.е. опять нужно сколько-то подождать и снова разрешить прерывание ... Вариант со спящим потоком которы будится по прерыванию мне кажется самым правильным, поправьте если ошибаюсь.

            • Anonim

              Хм, а вот и ответ на вопрос зачем может быть нужно прерывание по уровню.

              • Denis

                Верно, но не в прерывании же задержку на антидребезг делать ...

            • Viacheslav

              Ну есть прерывания и по падению фронта

  2. Sky

    Можно просто кнопку пропустить через rc вч фильтр ~100Гц.

    • Denis

      схемотехнику не хотелось-бы переделывать

      • Sky

        Если сама кнопка не припаяна рядом с мк то можно навесом и просто спрятать в термоусадку.

Не нашли ответ?

Вам также может быть интересно