Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
16.04.2011, 17:52
|
#131
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Можно просто увеличить шаг или скорость. Ну и назначить нижний предел, наверное стоит.
|
|
|
|
16.04.2011, 18:08
|
#132
|
Прописка
Регистрация: 25.08.2007
Сообщений: 193
Сказал спасибо: 11
Сказали Спасибо 57 раз(а) в 33 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от omercury
|
Можно просто увеличить шаг или скорость.
|
Так это и получится китайский фонарик, что есть гуд. Выкл. - 1 - 2 ...- Max - Выкл.
|
|
|
|
16.04.2011, 18:15
|
#133
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Тогда надо было китайский покупать и не париться. А здесь смысл сделать, да ещё не как у людей. Тьфу! Не как у других.
Вот последний вариант. Короткое нажатие - вкл/выкл. Длинное - плавно+/плавно-. m8_PWM+Key.zip
Дальше будет уже StepUP преобразователь и стабилизация тока независимо от заряда батареи. Ну и, естественно, защита от переразряда.
Последний раз редактировалось omercury; 16.04.2011 в 18:30.
|
|
|
|
16.04.2011, 18:44
|
#134
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Почему так сложно?
...о чём, собственно речь...
На самом деле там всё просто. У меня есть проект, где нажатие кнопок проверяется 4 раза - надёжность, надёжность и надёжность... (здесь всего дважды, не считая отработки дребезга, но это везде одинаково).
Всегда говорил, да и, наверное, буду повторять, что любая программа состоит в основном из обработки ошибок. В том мастерство программиста и состоит, чтобы предусмотреть и обработать, то есть сделать штатными все возможные (а лучше и невозможные) нештатные ситуации (прошу пардона за тавтологию). Только в этом случае программа будет работать без "глюков" и зависаний (тут возможны ещё аппаратные проблемы, но это отдельный разговор. В этом случае все усилия программиста могут пойти прахом, но всегда можно быть уверенным, что проблема в другом. Делать всегда нужно стараться правильно, а плохо - само получится). Именно поэтому в том отрезке кода так много всевозможных условий. Этим отсекается сама возможность неверной реакции программы на внешние воздействия.
Последний раз редактировалось omercury; 16.04.2011 в 19:17.
|
|
|
|
17.04.2011, 20:38
|
#135
|
Временная регистрация
Регистрация: 11.04.2011
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
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.
|
|
|
|
17.04.2011, 20:58
|
#136
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
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.
|
|
|
|
17.04.2011, 21:14
|
#137
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
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.
Причина: некрасиво было...
|
|
|
|
17.04.2011, 22:38
|
#138
|
Прописка
Регистрация: 25.08.2007
Сообщений: 193
Сказал спасибо: 11
Сказали Спасибо 57 раз(а) в 33 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
omercury, посмотрел Ваш код. Рекомендую для хорошей читаемости сменить название переменной KeyNew, не отражающее смысла, и вводящее в заблуждение, на что-то типа Key_was_pushed.
|
|
|
|
17.04.2011, 22:48
|
#139
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от oleg_harp
|
посмотрел Ваш код
|
Теперь это достояние общественности...
Да и флаг означает Новое Нажатие Кнопки (или Только-что Нажали).
|
|
|
|
17.04.2011, 23:00
|
#140
|
Прописка
Регистрация: 25.08.2007
Сообщений: 193
Сказал спасибо: 11
Сказали Спасибо 57 раз(а) в 33 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Цитата:
|
Да и флаг означает Новое Нажатие Кнопки (или Только-что Нажали
|
). Вот и я об этом же, что Новое Нажатие Кнопки он (флаг) у Вас только в момент установки, а "Кнопка уже нажата" во всех остальных проверках, коих больше. KeyNew и "уже была нажата", согласитесь не одно и то же. Ну, Ваше дело.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:25.
|
|