Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

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

 
Опции темы

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

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

Весь код целиком в прерывании. В while (1) ничего нет. Должно отрабатываться кратковременное нажатие без проблем. Но четкого срабатывания нет. Нажимаешь - светодиод горит, отпускаешь - гаснет. Срабатывает через раз.
Код:
#define button PINB.0 

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++;
    if (cnt›65534) {
      cnt=201;
      }
    }
  else {
    cnt=0;
    long_push=0;
    }

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

...

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
TCCR0=0x03;
TCNT0=0x06;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 1000,000 kHz
// Mode: Fast PWM top=FFh
// OC2 output: Non-Inverted PWM
ASSR=0x00;
TCCR2=0x00;        // при старте всё выключено
TCNT2=0x00;
OCR2=0x00;         //

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;

// Global enable interrupts
#asm("sei")
Реклама:

Последний раз редактировалось poligon_85; 11.04.2011 в 23:04.
poligon_85 вне форума  
Непрочитано 11.04.2011, 23:38  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Отследить короткое и продолжительное нажатие кнопки в фонаре. Как???

Жирненький МК для такой задачки - хватило бы и младшей "Тиньки" с головой...
Начну, как всегда, с вопросов:
- Где устанавливается флаг state до условия
Код:
if (state) {                          // и проверяем усл
?

Что Вы хотите получить - понятно. Давайте решим как...

Длинное нажатие определяется по переполнению счётчика.
Короткое нажатие определяется в момент отпускания кнопки.
Определяемся с переменными. Необходимо: счетчик для определения времени нажатия кнопки(в Вашем случае достаточно байта). Бит для хранения предыдущего состояния кнопки(для короткого нажатия). Его же можно использовать как флаг состояния. Счётчик циклов задержки на изменение компаратора ШИМ. В общем пока всё.

Алгоритм обработки таков: Структура обработчика прерывания
Если кнопка нажата
...Если флаг не установлен -› установить флаг. выход.
...Если флаг установлен -› инкремент счетчика.
......Если счётчик досчитал до длинного нажатия -› начинаем менять компаратор ШИМ. Декремент счётчика(увеличивать-то его больше никчему). выход.
Если кнопка не нажата -› проверяем флаг состояния кнопки
...Если флаг установлен - › проверяем счётчик времени нажатия кнопки
......Если меньше длинного
.........Если больше минимального времени -› включаем/выключаем фонарь. сброс переменных. выход.
.........Иначе - это был "дребезг". сброс переменных. выход.
...Если флаг не установлен -› сброс переменных. выход.

Где-то так.

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

Код:
 
    if (button == 0) {
         if (cnt ‹65534) cnt++;
         if (cnt›200) mode = 2// добавил переменную mode(режим или состояние) =2 это длинного нажатия дождались...
          if ((cnt‹200) &&(cnt›25)) mode = 1// короткое нажатие
    }
    else {
         cnt=0;
         short_push = 0;
         long_push = 0;
    }
// здесь закончили с определением состояния кнопки
  if (mode == 1) {    
     short_push = 1;// ещё добавил переменную для ясности..здесь может быть и другой код
// дальше сбрасываем все переменные
     mode = 0;//здесь косяк)))
     cnt = 0;//и здесь косяк)))
// что бы потребовалось новое нажатие
  }
    
  if (mode == 2)  long_push = 1;
  else long_push = 0;
}
В общем типа того мне видится, но проверить код не могу...обычно разрисовываю для себя на бумаге как конечный автомат...а сейчас недосуг
ЗЫ. всё равно накосячил )))) в общем идея такая...но вряд ли сегодня у меня получится)))

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

Сообщение от omercury Посмотреть сообщение
Жирненький МК для такой задачки - хватило бы и младшей "Тиньки" с головой...
Во-первых есть в наличии. Во-вторых это только начало

Сообщение от omercury Посмотреть сообщение
- Где устанавливается флаг state до условия
Код:
if (state) {                          // и проверяем усл
Код:
// глобальная переменная
volatile bit state = 0;
Сообщение от omercury Посмотреть сообщение
Длинное нажатие определяется по переполнению...
Сделал вроде то же самое (см. код выше). Напрочь запутался.
poligon_85 вне форума  
Непрочитано 11.04.2011, 23:58  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Отследить короткое и продолжительное нажатие кнопки в фонаре. Как???

Сообщение от poligon_85 Посмотреть сообщение
Код:
// глобальная переменная
volatile bit state = 0;
Где сброшена вижу, где устанавливается, чтобы выполнилось то условие?

Сообщение от poligon_85 Посмотреть сообщение
Сделал вроде то же самое (см. код выше). Напрочь запутался.
Очень быстро меняется значение компаратора. Нужно с задержечкой. Но не nop-ами внутри прерывания, а через второй счётчик.

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

Наши не сдаются
Код:
    if (button == 0) {
         if (cnt ‹65534) cnt++;
         if (cnt›200) mode = 2// добавил переменную mode(режим или состояние) =2 это длинного нажатия дождались...
          if ((cnt‹200) &&(cnt›25)) mode = 1// короткое нажатие
    }
    else {
         cnt=0;
         long_push = 0;
         If (mode =1) short_push = 1;// cбрасываем её при переключении режимаshort_push = 0 там же сбрасываем и mode... в 0;
    }
//-----------------------------    
  if (mode == 2)  long_push = 1;
  else long_push = 0;
}
кротоВ вне форума  
Непрочитано 12.04.2011, 00:05  
poligon_85
Временная регистрация
 
Аватар для poligon_85
 
Регистрация: 11.04.2011
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
poligon_85 на пути к лучшему
Вопрос Re: Отследить короткое и продолжительное нажатие кнопки в фонаре. Как???

Сообщение от omercury Посмотреть сообщение
Где сброшена вижу, где устанавливается, чтобы выполнилось то условие?
Код:
if ((cnt › 25) && (cnt ‹ 200)) {        // подавляем дребезг 50 мс
    if (state) {                        // и проверяем условие короткого нажатия
      OCR2=0x00;
      TCCR2=0x00;    // выключили ШИМ, остановили таймер   (выкл)
      state = 0;
      }
    else {
      OCR2=0xFF;
      TCCR2=0x6A;    // включили ШИМ на полную, запустили таймер    (вкл)
      state = 1;
      }
    }
poligon_85 вне форума  
Непрочитано 12.04.2011, 00:11  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Отследить короткое и продолжительное нажатие кнопки в фонаре. Как???

Вот именно. Пока статус не установлен, изменить статус невозможно. Замкнутый круг.
Компилятор, скорее всего, это условие вообще выкинул, как невыполнимое в принцыпе...

дополню:
Сообщение от poligon_85 Посмотреть сообщение
Код:
if ((cnt › 25) && (cnt ‹ 200)) {        // подавляем дребезг 50 мс
    if (state) {                        // и проверяем условие короткого нажатия
      OCR2=0x00;
      TCCR2=0x00;    // выключили ШИМ, остановили таймер   (выкл)
      state = 0;
      }
    else {
      OCR2=0xFF;
      TCCR2=0x6A;    // включили ШИМ на полную, запустили таймер    (вкл)
      state = 1;
      }
    }

Последний раз редактировалось omercury; 12.04.2011 в 00:14.
omercury вне форума  
Непрочитано 12.04.2011, 00:13  
igel_izh2126
Гражданин KAZUS.RUN
 
Регистрация: 09.12.2007
Сообщений: 535
Сказал спасибо: 57
Сказали Спасибо 53 раз(а) в 45 сообщении(ях)
igel_izh2126 на пути к лучшему
По умолчанию Re: Отследить короткое и продолжительное нажатие кнопки в фонаре. Как???

где то я не понял идею
а зачем для кнопки компаратор?
igel_izh2126 вне форума  
Непрочитано 12.04.2011, 00:15  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Отследить короткое и продолжительное нажатие кнопки в фонаре. Как???

Сообщение от igel_izh2126 Посмотреть сообщение
где то я не понял идею
а зачем для кнопки компаратор?
Имелся в виду цифровой компаратор сравнения внутри модуля таймера в режиме PWM.
omercury вне форума  
 
Опции темы

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

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, время: 16:31.


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