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

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

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

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

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

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

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

 
Опции темы

Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Непрочитано 11.04.2011, 20:08  
poligon_85
Временная регистрация
 
Аватар для poligon_85
 
Регистрация: 11.04.2011
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
poligon_85 на пути к лучшему
Вопрос Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Здравствуйте. Хочу регулировать яркость светодиода в фонаре при помощи только одной кнопки.

1. Кратковременное нажатие кнопки - включение/выключение
2. Длительное удержание кнопки (во включенном состоянии) - регулировка яркости "по кругу" (от нуля до полного, от полного до нуля и т.д.). Отпустили кнопку - остались на текущей яркости. Краткое нажатие - полностью выключили. Ну думаю понятно. Так вот. Контроллер Mega8. Кварц 8 МГц. Запускаю Timer2 -› Fast PWM -› Делитель 8
Код:
for (i=0;i‹255;i++) {    //Плавно повышаем яркость
  OCR2++;
  delay_ms(20);
}
       
for (i=0;i‹255;i++) {    //Плавно понижаем яркость
  OCR2--;
  delay_ms(20);
}
Собственно всё работает. Плавно разгорается, плавно гаснет. Тут понятно. Дальше сижу туплю. Как привязать всё это к кнопке??? Вкл/выкл понятно:
Код:
if (PINB.0 == 0) {
  delay_ms(40);
  if (PINB.0 == 0) {
    PORTB.3^=1;
  }
}
А как быть с долгим удержанием? Как его обработать??? Да ещё так чтобы при удержании OCR2 по кругу гонять 0-255-0 ?
Реклама:
poligon_85 вне форума  
Непрочитано 11.04.2011, 20:55  
кротоВ
Заблокирован
 
Регистрация: 06.11.2010
Сообщений: 265
Сказал спасибо: 12
Сказали Спасибо 107 раз(а) в 64 сообщении(ях)
кротоВ на пути к лучшему
По умолчанию Re: Отследить короткое и продолжительное нажатие кнопки в фонаре. Как???

Отказаться от delay и делать всё в прерываниях таймера...
кротоВ вне форума  
Непрочитано 11.04.2011, 21:12  
кротоВ
Заблокирован
 
Регистрация: 06.11.2010
Сообщений: 265
Сказал спасибо: 12
Сказали Спасибо 107 раз(а) в 64 сообщении(ях)
кротоВ на пути к лучшему
По умолчанию Re: Отследить короткое и продолжительное нажатие кнопки в фонаре. Как???

Проверяете в таймерном прерывании (100 Гц например) нажата ли кнопка и если нажата то увеличиваете переменную счётчика (CNT например) на 1 (если не нажата››› то сбрасываем CNT = 0...если счётчик досчитал до 10 - значит "дребезга контактов" не было - а значит если ШИМ был равен нулю›››делаем его 255...и наоборот если 255 то 0. Включаем выключаем типа.
Если CNT›=100 (значит нажатие больше 1 сек)...включаем флаг регулировка яркости и разрешаем работу вашей процедуры регулировки(только без задержек, поскольку она вызывается из процедуры обработки таймера с нужной вам скоростью)...типа того...
кротоВ вне форума  
Непрочитано 11.04.2011, 21:30  
poligon_85
Временная регистрация
 
Аватар для poligon_85
 
Регистрация: 11.04.2011
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
poligon_85 на пути к лучшему
Вопрос Re: Отследить короткое и продолжительное нажатие кнопки в фонаре. Как???

Код:
#define button PINB.0 

volatile bit push = 0;
volatile unsigned char cnt = 1;
volatile bit state = 0;

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
  // Reinitialize Timer 0 value
  TCNT0=0x06;          // срабатывание каждые 2 мс
  
  if (button == 0) {
    cnt++;
    }
  else {
    cnt--;
    }

  if (cnt == 15){        // подавляем дребезг 20 мс
    cnt=14;
    push = 1;
    }

  if (cnt‹1){
    cnt=1;
    push = 0;
    }
  
}
Код:
while (1)
      { 
        if (push == 1) {
          if (state == 0) {
            OCR2=0x1E;
            TCCR2=0x6A;  // включили ШИМ
            state = 1;
            }
          else {
            OCR2=0x00;
            TCCR2=0x00;  // выключили ШИМ
            state = 0;
            }
		  }
      };
Не работает. Не отрабатывает нажатие (или через раз)
poligon_85 вне форума  
Непрочитано 11.04.2011, 21:43  
aleksandr-zh
Гражданин KAZUS.RUN
 
Регистрация: 03.12.2004
Сообщений: 932
Сказал спасибо: 822
Сказали Спасибо 609 раз(а) в 216 сообщении(ях)
aleksandr-zh на пути к лучшему
По умолчанию Re: Отследить короткое и продолжительное нажатие кнопки в фонаре. Как???

я на днях делал:
http://bascomavr.3bb.ru/viewtopic.php?id=528
aleksandr-zh вне форума  
Непрочитано 11.04.2011, 21:47  
oleg_harp
Прописка
 
Регистрация: 25.08.2007
Сообщений: 193
Сказал спасибо: 11
Сказали Спасибо 57 раз(а) в 33 сообщении(ях)
oleg_harp на пути к лучшему
По умолчанию Re: Отследить короткое и продолжительное нажатие кнопки в фонаре. Как???

Сообщение от poligon_85 Посмотреть сообщение
е работает. Не отрабатывает нажатие (или через раз)
Если смотреть бегло, то Вы дребезг некорректно отрабатываете. Делайте всё в таймере, как Вам кротоВ написал.
oleg_harp вне форума  
Непрочитано 11.04.2011, 22:11  
кротоВ
Заблокирован
 
Регистрация: 06.11.2010
Сообщений: 265
Сказал спасибо: 12
Сказали Спасибо 107 раз(а) в 64 сообщении(ях)
кротоВ на пути к лучшему
По умолчанию Re: Отследить короткое и продолжительное нажатие кнопки в фонаре. Как???

Код:
 
    if ((button == 0) & (cnt‹200)) {//ну например так...выше 200 не поднимется
        cnt++;
    }
    else {
        cnt = 0;//не cnt--; сбрасываем в ноль нафиг ))))
    }

    if (cnt == 15){        // подавляем дребезг 20 мс
          push = 1;
    }

     if (cnt‹1){
           push = 0;
    }
кротоВ вне форума  
Непрочитано 11.04.2011, 22:25  
Гость
 
Сообщений: n/a
По умолчанию Re: Отследить короткое и продолжительное нажатие кнопки в фонаре. Как???

Если не лень, то разберётесь.
http://www.elektronika.lt/_sys/stora...ktronikaLT.zip
 
Непрочитано 11.04.2011, 22:31  
poligon_85
Временная регистрация
 
Аватар для poligon_85
 
Регистрация: 11.04.2011
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
poligon_85 на пути к лучшему
Вопрос Re: Отследить короткое и продолжительное нажатие кнопки в фонаре. Как???

Код:
volatile bit long_push = 0;
volatile unsigned int cnt = 0;
volatile bit state = 0;

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
  // Reinitialize Timer 0 value
  TCNT0=0x06;          // срабатывание каждые 2 мс
  
  if (button == 0) {
    cnt++;
    }
  else {
    cnt=0;
    }

  if ((cnt › 15) && (cnt ‹ 200)) {        // подавляем дребезг 30 мс
    cnt=0;                                // и проверяем условие короткого нажатия
    if (state) {
      OCR2=0x00;
      TCCR2=0x00;    // выключили ШИМ, остановили таймер   (выкл)
      state = 0;
      }
    else {
      OCR2=0xFF;
      TCCR2=0x6A;    // включили ШИМ на полную, запустили таймер    (вкл)
      state = 1;
      }
    }
    
  if (cnt › 200) {   // длинное нажатие
    cnt=0;
    long_push = 1;
    } 
}
Чего дальше делать не соображу.

1. Где long_push сбросить?
2. Если держим очень долго, cnt может стать больше 65535. Где её сбросить?

Последний раз редактировалось poligon_85; 11.04.2011 в 22:37.
poligon_85 вне форума  
Непрочитано 11.04.2011, 22:32  
кротоВ
Заблокирован
 
Регистрация: 06.11.2010
Сообщений: 265
Сказал спасибо: 12
Сказали Спасибо 107 раз(а) в 64 сообщении(ях)
кротоВ на пути к лучшему
По умолчанию Re: Отследить короткое и продолжительное нажатие кнопки в фонаре. Как???

Сообщение от кротоВ Посмотреть сообщение
Код:
 
    if ((button == 0) & (cnt‹200)) {//ну например так...выше 200 не поднимется
        cnt++;
    }
    else {
        cnt = 0;//не cnt--; сбрасываем в ноль нафиг ))))
    }

    if (cnt == 15){        // подавляем дребезг 20 мс
          push = 1;
    }

     if (cnt‹1){
           push = 0;
    }
Ан...нет...тормознул
Код:
    if (button == 0) {
         if(cnt‹200) cnt++;//ну например так...выше 200 не поднимется
    }
    else {
        cnt = 0;//не cnt--; сбрасываем в ноль нафиг ))))
    }

    if (cnt == 15){        // подавляем дребезг 20 мс
          push = 1;
    }

     if (cnt‹1){
           push = 0;
    }
кротоВ вне форума  
 
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Книги dosikus Электронная библиотека 11242 29.12.2015 23:45
Как правильно отследить импульс sdsrem Микроконтроллеры, АЦП, память и т.д 8 17.08.2010 21:28
[Решено] Третье Послание Человечеству lelkanet Отвлекитесь, эмбеддеры! 201 06.01.2010 00:33


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


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.