Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 04.10.2011, 22:24  
niXto
Почётный гражданин KAZUS.RU
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: как устранить дребезг на вход INT0

В первом прерывании выполняем действие и устанавливаем флаг "Кнопка была нажата". Теперь ждем отпускания кнопки и по факту запускаем любую задержку на 50...100 мс. Если в это время нажимается кнопка - ничего не делаем (т.к. флаг уже стоит), а отсчет задержки начинаем сначала. Как только задержка выполнится - сбрасываем флаг и ждем нового нажатия кнопки
Реклама:
niXto вне форума  
Сказали "Спасибо" niXto
begun (05.10.2011)
Непрочитано 05.10.2011, 01:13  
begun
Гражданин KAZUS.RU
 
Регистрация: 18.07.2006
Сообщений: 858
Сказал спасибо: 228
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
begun на пути к лучшему
По умолчанию 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;

}
или Я не правильно Вас понял?
begun вне форума  
Непрочитано 05.10.2011, 01:20  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию 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 вне форума  
Сказали "Спасибо" Easyrider83
begun (05.10.2011)
Непрочитано 05.10.2011, 01:37  
Yurkin2007
Заблокирован
 
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
Yurkin2007 на пути к лучшему
По умолчанию Re: Как устранить дребезг на вход INT0

Я бы сделал так:

PHP код:
interrupt [EXT_INT0void ext_int0_isr(void)
{
    if(
x==0)
    { 
      
x=1;
      
putchar (ox47);
      
Timer1delay;
      
Timer1.Start;
     }

interrupt [Timer1void timer1_isr(void)
{
     
Timer1.Stop;
     
x=0;

В прерывании проверяем флаг х==0. Если флаг не установлен, то устанавливаем его, запускаем букву в UART, закладываем в счётчик таймера нужную задержку и запускаем таймер. И пока прерывание таймера не сбросит флаг х=0, больше не реагируем на нажимание кнопки. В результате, обработка кнопки не зависит от загруженности основного цикла ...
Ещё лучше - как предлагал И.Райдер: без флагов, просто тупо запрещать прерывание INT0 при первом срабатывании и запускать таймер, который в своём обработчике сначала будет сбрасывать все накопившиеся INT0.IF и затем вновь разрешать INT0.

Последний раз редактировалось Yurkin2007; 05.10.2011 в 01:39.
Yurkin2007 вне форума  
Сказали "Спасибо" Yurkin2007
begun (05.10.2011)
Непрочитано 05.10.2011, 11:14  
begun
Гражданин KAZUS.RU
 
Регистрация: 18.07.2006
Сообщений: 858
Сказал спасибо: 228
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
begun на пути к лучшему
По умолчанию 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 раза всеравно посылает лишние посылки.
Основываясь на Ваши ,ценные очень для меня советы,
Пробовал и запретить прерывания ,но пока не удается достичь однократной посылки.
Видимо Я всетаки чтото не допонимаю.Буду пробовать дальше.
begun вне форума  
Непрочитано 05.10.2011, 11:24  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию 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.
Easyrider83 вне форума  
Непрочитано 05.10.2011, 11:41  
begun
Гражданин KAZUS.RU
 
Регистрация: 18.07.2006
Сообщений: 858
Сказал спасибо: 228
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
begun на пути к лучшему
По умолчанию Re: Как устранить дребезг на вход INT0

Easyrider83

if(x=max_x) здесь должно стоять знак присвоения или ровнения?
begun вне форума  
Непрочитано 05.10.2011, 11:47  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: Как устранить дребезг на вход INT0

Сообщение от begun Посмотреть сообщение
Easyrider83

if(x=max_x) здесь должно стоять знак присвоения или ровнения?
Ровнения, конечно. Это последние отголоски бейсика у меня в голове жить мешают.
Easyrider83 вне форума  
Непрочитано 05.10.2011, 11:53  
st_1
Заблокирован
 
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
st_1 на пути к лучшему
По умолчанию Re: Как устранить дребезг на вход INT0

Сообщение от begun Посмотреть сообщение
Видимо Я всетаки чтото не допонимаю.Буду пробовать дальше.
Забудьте про INT...
Была тут темка про светодиодный фонарик... там кнопку разложили по полочкам... поищите...
st_1 вне форума  
Непрочитано 05.10.2011, 12:41  
begun
Гражданин KAZUS.RU
 
Регистрация: 18.07.2006
Сообщений: 858
Сказал спасибо: 228
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
begun на пути к лучшему
По умолчанию Re: Как устранить дребезг на вход INT0

INT0 нужен потому ,что по приоритету его прерывание стоит выше прерывания многих узлов
и соответственно его нажатие командует всеми процессами ,что необходимо для моей задачи.
Прерывание по таймеру ниже .К томуже реализация самой кнопки без дребезга в других случая не вызывает затруднении,
Только вот с INT0 проблема.
begun вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Эрудиция и смекалка slavar1 Отвлекитесь, эмбеддеры! 12765 06.04.2024 20:45
[Решено] Так, рассказик :)) Я долго ржал :)) DK Отвлекитесь, эмбеддеры! 7 31.08.2007 22:33
[Решено] Сборник перлов любителей кабельщины mikesmith Отвлекитесь, эмбеддеры! 135 14.08.2007 15:49
[Решено] Всем эмбеддерам посвящается... Decan Отвлекитесь, эмбеддеры! 0 24.10.2005 14:43


Часовой пояс GMT +4, время: 06:02.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot