Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
04.10.2011, 21:01
|
|
Гражданин KAZUS.RU
Регистрация: 18.07.2006
Сообщений: 874
Сказал спасибо: 234
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
|
Как устранить дребезг на вход INT0
Здравствуйте друзья!
На вход INT0 стоит кнопка при нажатии которого должно отработаться
однократная оиерация ,однако из за дребезга контакта операция отрабатывается многократно.
введение задержки не помогает , так как прерывание запоминается и повторяется.После исчерпания своих возможностей решил очередной раз обратиться к опытным товарищам за помошь
Я делаю так:
interrupt [EXT_INT0] void ext_int0_isr(void)
{
delay_ms(20);
putchar (ox47);
}
и в терминале ,при отправлении через УАРТ, вместо одного появляется
2-3-4 символа.
В непрерывном цикле это делается без проблем ,однако тут загвостка.
Может опытным товаришам это в улыбку ,но что делать ,одним легко удается все, другим труднее.
Буду благодарен за любой совет.
|
|
|
|
04.10.2011, 21:15
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: как устранить дребезг на вход INT0
паузы в прерываниях запрещены!
прерывание должно выполниться и снять флаг INTCON.INT0IE, чтобы выключить само себя. Апосля основная программа, отработав сигнал с кнопки, должно включить это прерывание снова.
|
|
|
|
04.10.2011, 21:16
|
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
|
Re: как устранить дребезг на вход INT0
Вешать кнопки на ИНТы, как ДЕЛАЙить в прерывании - моветон...
Меняйте подход к задаче...
|
|
|
|
04.10.2011, 21:22
|
|
Почётный гражданин KAZUS.RU
Регистрация: 22.06.2004
Адрес: Харьков
Сообщений: 1,488
Сказал спасибо: 3,207
Сказали Спасибо 3,010 раз(а) в 686 сообщении(ях)
|
Re: как устранить дребезг на вход INT0
Поставьте подтяжку на +питания 2-5 кОм. Поставьте кондесатор параллельно кнопке 0,1мкФ. Настройте прерывание INT по спадающему фронту. В обработке не делайте задержку, просто выставляйте флаг события (было нажатие). В основном цикле обрабатывайте этот флаг (отправляйте символ) и сбрасывайте флаг.
Как-то так.
|
|
|
|
04.10.2011, 21:29
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.05.2005
Адрес: Саратов.ru
Сообщений: 1,548
Сказал спасибо: 384
Сказали Спасибо 737 раз(а) в 417 сообщении(ях)
|
Re: как устранить дребезг на вход INT0
В прерывании установка флага воздействия на кнопку, в основном цикле обработка антидребезга и формирование сигнала нажатия. Либо вообще отказаться от прерываний по кнопке, и обрабатывать нажатие в основном цикле, хотя это уже зависит от конкретной задачи (энергопотребление и т.п.).
|
|
|
|
04.10.2011, 21:35
|
|
Почётный гражданин KAZUS.RU
Регистрация: 22.06.2004
Адрес: Харьков
Сообщений: 1,488
Сказал спасибо: 3,207
Сказали Спасибо 3,010 раз(а) в 686 сообщении(ях)
|
Re: как устранить дребезг на вход INT0
Сообщение от Easyrider83
|
паузы в прерываниях запрещены!
|
Не запрещены - если прерывание от кнопки одно (нет других прерываний) и микроконтроллер не PIC.
|
|
|
|
04.10.2011, 21:38
|
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
|
Re: как устранить дребезг на вход INT0
|
|
|
|
04.10.2011, 21:41
|
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
|
Re: как устранить дребезг на вход INT0
Сообщение от lsa
|
Поставьте подтяжку на +питания 2-5 кОм. Поставьте кондесатор параллельно кнопке 0,1мкФ.
|
Порочная практика... Затяжка фронтов... не всё кнопки проглатывают разряд ёмкости... некоторые начинают болеть... и даже сдыхать...
|
|
|
|
04.10.2011, 22:08
|
|
Гражданин KAZUS.RU
Регистрация: 18.07.2006
Сообщений: 874
Сказал спасибо: 234
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
|
Re: как устранить дребезг на вход INT0
друзья ,Благодарю за оперативные советы ,однако предложенные варианты последующей обработки нажатия в основном цикле
вызивают задержку выполнения ,если в это время программа находится на другом месте.
Мне же нужно мгновенное выполнение, т.е. остановка основного цикла при нажатии и незамедлительное выполнение.
Значит получается, что в самом прерывании трудно это осуществить?
|
|
|
|
04.10.2011, 22:24
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: как устранить дребезг на вход INT0
Сообщение от begun
|
Значит получается, что в самом прерывании трудно это осуществить?
|
Все просто - по прерыванию INT0 поднимаете флаг какой-нибудь битовой переменной и выключаете прерывание INT0. Потом, когда будет свободное время, в основном цикле этот флаг обработаете и опустите.
Думаю, даже ядовитый Первый со мной согласится.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:19.
|
|