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

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

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

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

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

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

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

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

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

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

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

Момент 2.
Сообщение от poligon_85 Посмотреть сообщение
PHP код:
count++; //Увеличиваем счётчик задержки
 
if (countlongkey//Если длинное нажатие
 
{
 
bright_ch(); //Начинаем менять компаратор ШИМ
 
count--; //Декремент счетчика(увеличивать-то его больше никчему)
//дальше я теряю нить...
 // зачем уменьшать count ? 
в первой строке идёт инкремент счётчика. Если при выполнении условия (долгом нажатии) продолжать увеличивать счётчик, он, в конце концов, перескочит "255" и станет "0" "1" и т.д. Это приведёт к невыполнению условия
PHP код:
if  (countlongkey//Если длинное нажатие 
то есть к сбросу переменных и прекращению увеличения яркости. И так до следующего раза, когда счётчик досчитает до 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.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
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, время: 18:23.


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