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

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

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

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

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

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

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

 
Опции темы
Непрочитано 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.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Отследить короткое и продолжительное нажатие кнопки в фонаре. Как???

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

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

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

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

Где-то так.

Последний раз редактировалось omercury; 11.04.2011 в 23:48.
omercury вне форума  
Непрочитано 11.04.2011, 23:43  
кротоВ
Заблокирован
 
Регистрация: 06.11.2010
Сообщений: 267
Сказал спасибо: 13
Сказали Спасибо 108 раз(а) в 65 сообщении(ях)
кротоВ на пути к лучшему
По умолчанию 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.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Отследить короткое и продолжительное нажатие кнопки в фонаре. Как???

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

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

upd. наверху подправил.
omercury вне форума  
Непрочитано 11.04.2011, 23:59  
кротоВ
Заблокирован
 
Регистрация: 06.11.2010
Сообщений: 267
Сказал спасибо: 13
Сказали Спасибо 108 раз(а) в 65 сообщении(ях)
кротоВ на пути к лучшему
По умолчанию 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.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
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.RU
 
Регистрация: 09.12.2007
Сообщений: 536
Сказал спасибо: 57
Сказали Спасибо 53 раз(а) в 45 сообщении(ях)
igel_izh2126 на пути к лучшему
По умолчанию Re: Отследить короткое и продолжительное нажатие кнопки в фонаре. Как???

где то я не понял идею
а зачем для кнопки компаратор?
igel_izh2126 вне форума  
Непрочитано 12.04.2011, 00:15  
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
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, время: 14:26.


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