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

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

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

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

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

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

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

 
Опции темы
Непрочитано 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
Сообщений: 267
Сказал спасибо: 13
Сказали Спасибо 108 раз(а) в 65 сообщении(ях)
кротоВ на пути к лучшему
По умолчанию Re: Отследить короткое и продолжительное нажатие кнопки в фонаре. Как???

Отказаться от delay и делать всё в прерываниях таймера...
кротоВ вне форума  
Непрочитано 11.04.2011, 21:12  
кротоВ
Заблокирован
 
Регистрация: 06.11.2010
Сообщений: 267
Сказал спасибо: 13
Сказали Спасибо 108 раз(а) в 65 сообщении(ях)
кротоВ на пути к лучшему
По умолчанию 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.RU
 
Регистрация: 03.12.2004
Сообщений: 932
Сказал спасибо: 824
Сказали Спасибо 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
Сообщений: 267
Сказал спасибо: 13
Сказали Спасибо 108 раз(а) в 65 сообщении(ях)
кротоВ на пути к лучшему
По умолчанию 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
Сообщений: 267
Сказал спасибо: 13
Сказали Спасибо 108 раз(а) в 65 сообщении(ях)
кротоВ на пути к лучшему
По умолчанию 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, время: 01:24.


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