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

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

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

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

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

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

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

 
Опции темы

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

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

Можно просто увеличить шаг или скорость. Ну и назначить нижний предел, наверное стоит.
Реклама:
omercury вне форума  
Непрочитано 16.04.2011, 18:08  
oleg_harp
Прописка
 
Регистрация: 25.08.2007
Сообщений: 193
Сказал спасибо: 11
Сказали Спасибо 57 раз(а) в 33 сообщении(ях)
oleg_harp на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

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

Тогда надо было китайский покупать и не париться. А здесь смысл сделать, да ещё не как у людей. Тьфу! Не как у других.
Вот последний вариант. Короткое нажатие - вкл/выкл. Длинное - плавно+/плавно-.m8_PWM+Key.zip

Дальше будет уже StepUP преобразователь и стабилизация тока независимо от заряда батареи. Ну и, естественно, защита от переразряда.

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

Почему так сложно?
...о чём, собственно речь...

На самом деле там всё просто. У меня есть проект, где нажатие кнопок проверяется 4 раза - надёжность, надёжность и надёжность... (здесь всего дважды, не считая отработки дребезга, но это везде одинаково).

Всегда говорил, да и, наверное, буду повторять, что любая программа состоит в основном из обработки ошибок. В том мастерство программиста и состоит, чтобы предусмотреть и обработать, то есть сделать штатными все возможные (а лучше и невозможные) нештатные ситуации (прошу пардона за тавтологию). Только в этом случае программа будет работать без "глюков" и зависаний (тут возможны ещё аппаратные проблемы, но это отдельный разговор. В этом случае все усилия программиста могут пойти прахом, но всегда можно быть уверенным, что проблема в другом. Делать всегда нужно стараться правильно, а плохо - само получится). Именно поэтому в том отрезке кода так много всевозможных условий. Этим отсекается сама возможность неверной реакции программы на внешние воздействия.

Последний раз редактировалось omercury; 16.04.2011 в 19:17.
omercury вне форума  
Непрочитано 17.04.2011, 20:38  
poligon_85
Временная регистрация
 
Аватар для poligon_85
 
Регистрация: 11.04.2011
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
poligon_85 на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от omercury Посмотреть сообщение
Вот последний вариант. Короткое нажатие - вкл/выкл. Длинное - плавно+/плавно-.Вложение 20666
Omercury, фантастика... Нет слов. Спасибо!

Сутки пытался понять код, безполезно.

Итак:
PHP код:
//Изменение яркости свечения (коэф. заполнения ШИМ)
void    bright_ch(void)
{
    b_count++;                    //Инкремент счётчика задержки
    if  (b_count›=PWM_del)        //Если досчитали
    {                   
        if  (Dir_on)            //Если предыдущее изменение было в +
        {   
            OCR2++;             //Уменьшаем яркость
            if  (OCR2==0){OCR2=0xFF;}  //Тормозим на минимуме
        }
        else                    //Если предыдущее изменение было в -
        {
            OCR2--;              //Увеличиваем яркость           
            if (OCR2==0xFF){ OCR2=0;}  //Тормозим на максимуме
        } 
        b_count = 0x00;        //Сброс четчика   
    }
} 
Этот кусок:
PHP код:
OCR2++;             //Уменьшаем яркость
  if  (OCR2==0) {OCR2=0xFF;}  //Тормозим на минимуме 
Почему когда мы увеличиваем OCR2 мы сравниваем его с нулем??? Ведь при увеличении OCR2 досчитает максимум до 255. Почему с нулем???

Это первый момент. И второй:
PHP код:
//Сканирование кнопки
void    key_scan(void)
{
    if  KeyPress                //Если кнопка нажата
    {                            //Проверим, давно ли её нажали
        if (KeyNew)             //Если флаг установлен (значит "давно")
        {                                          
            count++;          //Увеличиваем счётчик задержки
            if  (count›longkey) //Если длинное нажатие
            {
                bright_ch();    //Начинаем менять компаратор ШИМ
                count--;        //Декремент счетчика(увеличивать-то его больше никчему)
        
              //дальше я теряю нить...
             // зачем уменьшать count ? 
И получается что пока кнопку держат программа упирается в bright_ch () и дальше не идет? А именно
PHP код:
if (OCR2==0xFF){ OCR2=0;}  //Тормозим на максимуме 
Правильно?

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

Начнём по-очереди.
PHP код:
b_count++;                    //Инкремент счётчика задержки 
if  (b_count›=PWM_del)        //Если досчитали 
Таймер работает на частоте 31250 переполнений в секунду. Переменная b_count делит эту частоту на своё значение - 10, чтобы яркость не менялась слишком быстро. IF - как раз и отслеживает это деление.
PHP код:
if  (Dir_on)            //Если изменение в +
        {   
            OCR2++;             //Уменьшаем яркость
            if  (OCR2==0){OCR2=0xFF;}  //Тормозим на минимуме
        }
//*********** коментарии остались от предыдущего варианта.************* 
Здесь идёт проверка направления изменения яркости. Далее само изменение. Выход МК работает так: таймер считает по-кругу от "0" до "255". При совпадении значений в счётчике таймера и в регистре OCR2 на выходе появляется единичка. Далее, при переходе счётчика из "255" в "0" выход переключается в "0". То есть, чем больше значение в OCR2, тем короче будет импульс и тем ниже яркость.
Сообщение от poligon_85 Посмотреть сообщение
Почему с нулем???
По-Вашему "255" - и всё? Жизнь остановилась?! Следующее за "255" будет число "256". В двоичном формате это выглядит так - ( 1 0000 0000 ). Так как регистр 8-ми битный в нём останется "0". С ним и сравниваю.

То же самое в другую сторону при уменьшении. При переходе через "0" идёт "заём". Поэтому 0-1=255

Сообщение от poligon_85 Посмотреть сообщение
И получается что пока кнопку держат программа упирается в bright_ch () и дальше не идет?
Правильно?
Абсолютно верно.

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

Момент 2.
Сообщение от poligon_85 Посмотреть сообщение
PHP код:
count++; //Увеличиваем счётчик задержки
 if (count›longkey) //Если длинное нажатие
 {
 bright_ch(); //Начинаем менять компаратор ШИМ
 count--; //Декремент счетчика(увеличивать-то его больше никчему)
//дальше я теряю нить...
 // зачем уменьшать count ? 
в первой строке идёт инкремент счётчика. Если при выполнении условия (долгом нажатии) продолжать увеличивать счётчик, он, в конце концов, перескочит "255" и станет "0" "1" и т.д. Это приведёт к невыполнению условия
PHP код:
if  (count›longkey) //Если длинное нажатие 
то есть к сбросу переменных и прекращению увеличения яркости. И так до следующего раза, когда счётчик досчитает до longkey. Увеличение будет работать "рывками" в диапазоне от longkey до "255".

Последний раз редактировалось omercury; 17.04.2011 в 21:16. Причина: некрасиво было...
omercury вне форума  
Непрочитано 17.04.2011, 22:38  
oleg_harp
Прописка
 
Регистрация: 25.08.2007
Сообщений: 193
Сказал спасибо: 11
Сказали Спасибо 57 раз(а) в 33 сообщении(ях)
oleg_harp на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

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

Сообщение от oleg_harp Посмотреть сообщение
посмотрел Ваш код
Теперь это достояние общественности...
Да и флаг означает Новое Нажатие Кнопки (или Только-что Нажали).
omercury вне форума  
Непрочитано 17.04.2011, 23:00  
oleg_harp
Прописка
 
Регистрация: 25.08.2007
Сообщений: 193
Сказал спасибо: 11
Сказали Спасибо 57 раз(а) в 33 сообщении(ях)
oleg_harp на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Цитата:
Да и флаг означает Новое Нажатие Кнопки (или Только-что Нажали
). Вот и я об этом же, что Новое Нажатие Кнопки он (флаг) у Вас только в момент установки, а "Кнопка уже нажата" во всех остальных проверках, коих больше. KeyNew и "уже была нажата", согласитесь не одно и то же. Ну, Ваше дело.
oleg_harp вне форума  
 
Опции темы

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

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


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