Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
04.10.2011, 22:24
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: как устранить дребезг на вход INT0
В первом прерывании выполняем действие и устанавливаем флаг "Кнопка была нажата". Теперь ждем отпускания кнопки и по факту запускаем любую задержку на 50...100 мс. Если в это время нажимается кнопка - ничего не делаем (т.к. флаг уже стоит), а отсчет задержки начинаем сначала. Как только задержка выполнится - сбрасываем флаг и ждем нового нажатия кнопки
|
|
|
|
05.10.2011, 01:13
|
|
Гражданин KAZUS.RU
Регистрация: 18.07.2006
Сообщений: 866
Сказал спасибо: 230
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
|
Re: как устранить дребезг на вход INT0
Easyrider83
Извиняюсь,но если нужно будет нажимать кнопку несколько раз подряд, успеется ли обработка в основном цикле опускания флага?
Если Вас не очень это затруднит, можно попросить дать примерный код?
niXto
если Я правильно понял , то код будет выглядеть так;
interrupt [EXT_INT0] void ext_int0_isr(void)
{
putchar (ox47);
if (PIND.2)==0; //вход INT0
x=1;
delay_ms(50);
if(PIND.2==0)
x=0;
}
или Я не правильно Вас понял?
|
|
|
|
05.10.2011, 01:20
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: как устранить дребезг на вход INT0
Сообщение от begun
|
interrupt [EXT_INT0] void ext_int0_isr(void)
{
putchar (ox47);
if (PIND.2)==0; //вход INT0
x=1;
delay_ms(50);
if(PIND.2==0)
x=0;
}
или Я не правильно Вас понял?
|
ЭТО что такое?
Опрашивайте лучше кнопку по таймеру. INT0 для кнопки удобнее применять для пробуждения из sleep.
|
|
|
Сказали "Спасибо" Easyrider83
|
|
|
05.10.2011, 01:37
|
|
Заблокирован
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
|
Re: Как устранить дребезг на вход INT0
Я бы сделал так:
PHP код:
|
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if(x==0)
{
x=1;
putchar (ox47);
Timer1= delay;
Timer1.Start;
}
}
interrupt [Timer1] void timer1_isr(void)
{
Timer1.Stop;
x=0;
}
|
В прерывании проверяем флаг х==0. Если флаг не установлен, то устанавливаем его, запускаем букву в UART, закладываем в счётчик таймера нужную задержку и запускаем таймер. И пока прерывание таймера не сбросит флаг х=0, больше не реагируем на нажимание кнопки. В результате, обработка кнопки не зависит от загруженности основного цикла ...
Ещё лучше - как предлагал И.Райдер: без флагов, просто тупо запрещать прерывание INT0 при первом срабатывании и запускать таймер, который в своём обработчике сначала будет сбрасывать все накопившиеся INT0.IF и затем вновь разрешать INT0.
Последний раз редактировалось Yurkin2007; 05.10.2011 в 01:39.
|
|
|
Сказали "Спасибо" Yurkin2007
|
|
|
05.10.2011, 11:14
|
|
Гражданин KAZUS.RU
Регистрация: 18.07.2006
Сообщений: 866
Сказал спасибо: 230
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
|
Re: Как устранить дребезг на вход INT0
interrupt [EXT_INT0] void ext_int0_isr(void)
{
x++;
if(x==1)
putchar(0x47);
}
---
--
while(1)
--
--
if(PIND.2==0) //вход INT0
x1=0;
if(PIND.2==1)
x1++;
if(x1›0x444)
x=0;
вроде этот код должен сработать но 1-2 раза всеравно посылает лишние посылки.
Основываясь на Ваши ,ценные очень для меня советы,
Пробовал и запретить прерывания ,но пока не удается достичь однократной посылки.
Видимо Я всетаки чтото не допонимаю.Буду пробовать дальше.
|
|
|
|
05.10.2011, 11:24
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Как устранить дребезг на вход INT0
Делайте по таймеру
Код:
|
#define max_x 100
char x=0;
----
void interrupt TMR0
{
if (кнопка нажата)
{
x++;
if (x==max_x)
{
поднять флаг срабатывания
}
}
else
{x=0;}
} |
Последний раз редактировалось Easyrider83; 05.10.2011 в 11:46.
|
|
|
|
05.10.2011, 11:41
|
|
Гражданин KAZUS.RU
Регистрация: 18.07.2006
Сообщений: 866
Сказал спасибо: 230
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
|
Re: Как устранить дребезг на вход INT0
Easyrider83
if(x=max_x) здесь должно стоять знак присвоения или ровнения?
|
|
|
|
05.10.2011, 11:47
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Как устранить дребезг на вход INT0
Сообщение от begun
|
Easyrider83
if(x=max_x) здесь должно стоять знак присвоения или ровнения?
|
Ровнения, конечно. Это последние отголоски бейсика у меня в голове жить мешают.
|
|
|
|
05.10.2011, 11:53
|
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
|
Re: Как устранить дребезг на вход INT0
Сообщение от begun
|
Видимо Я всетаки чтото не допонимаю.Буду пробовать дальше.
|
Забудьте про INT...
Была тут темка про светодиодный фонарик... там кнопку разложили по полочкам... поищите...
|
|
|
|
05.10.2011, 12:41
|
|
Гражданин KAZUS.RU
Регистрация: 18.07.2006
Сообщений: 866
Сказал спасибо: 230
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
|
Re: Как устранить дребезг на вход INT0
INT0 нужен потому ,что по приоритету его прерывание стоит выше прерывания многих узлов
и соответственно его нажатие командует всеми процессами ,что необходимо для моей задачи.
Прерывание по таймеру ниже .К томуже реализация самой кнопки без дребезга в других случая не вызывает затруднении,
Только вот с INT0 проблема.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:50.
|
|