Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
16.04.2011, 14:26
|
|
Временная регистрация
Регистрация: 11.04.2011
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Дальше if KeyPress //Если кнопка нажата
Я не понимаю почему нельзя это сделать сразу в прерывании??????
PHP код:
|
if (PINB.0 == 0) {} //Если кнопка нажата
|
P.S. Кстати я понял почему у меня трудности перевода...
if (b_count›PWM_del) !!!!
Моя логика никогда бы так не написала...
А вот так: (b_count › 10) отсюда и путаница в буквах
Опять же почему bright_ch() ??? Почему не считать отдельной переменной прям по ходу выполнения??? Зачем функция??? Я вот в этом путаюсь
Последний раз редактировалось poligon_85; 16.04.2011 в 14:35.
|
|
|
|
16.04.2011, 14:33
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Можно и в прерывании, но это привычка. В прерывании долго находиться нельзя. ЗАКОН. Пока задача всего одна - это проскочит, а если попытаться сделать ещё какую-нибудь задачу, то может случиться наложение прерываний и тогда будет отложено что-нибудь важное. В данном случае не важно, изменится яркость немедленно, или через пару десятков микросекунд.
P.S. добавлять начал в предыдущий пост...
|
|
|
|
16.04.2011, 14:39
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Цитата:
|
А вот так: (b_count › 10) отсюда и путаница в буквах
|
Это тоже работать будет. Прокатывает в малых проектах. Но здесь константа посреди кода. Если понадобится изменить задержки, в Вашем случае придётся лопатить весь код. В моём варианте меняется константа в дефайне и весь код перестроен.
То же самое с функциями. Её один раз отладил - и вызывай сколько влезет. Да и нагляднее так. Всего одна строка, а уже понятно, что это изменение КЗ.
Опять же написание программы упрощается. В том месте, откуда я её вызвал, я просто обозначил её наличие - действие. Как она будет работать, можно подумать и позже. Это называется блочное программирование. Так большая задача делится на некоторое количество малых. Упрощается работа. Опять же, функции можно вставлять из предыдущих наработок. Глупо писать каждую программу "с нуля". Через какое-то время и у Вас соберётся библиотека функций, которую Вы будете просто подключать к проекту.
Последний раз редактировалось omercury; 16.04.2011 в 14:46.
|
|
|
|
16.04.2011, 14:42
|
|
Временная регистрация
Регистрация: 11.04.2011
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от omercury
|
В прерывании долго находиться нельзя. ЗАКОН.
|
Да это понятно. Просто какая разница будет там инкрементироваться переменная или выполняться функция??? По времени одно и то же... Функция - это инкрементирование переменной в "оболочке", просто для быстрого вызова. Время одно и то же будет, ни там ни там прерывание мы не задержим.
Просто видно исходя из опыта вы так пишете, а я глядя на это туплю. Ладно, хватит лирики.
Как и для чего функция bright_ch() понял. Осенило меня сейчас.
Цитата:
|
...каждый одиннадцатый вход в неё...
|
clr_var() тем более понятно.
key_scan() вот пока в голове не укладывается и
PHP код:
|
#asm("sleep") //Усыпляем МК
|
А как его разбудить???
P.S. Кстати вылезла проблема максимальной яркости. Фонарик её просто проскакивает. Надо по идее чтобы при достижении max яркости фонарик один раз моргнул и это сигнал для меня что надо кнопку отпустить, а не то уменьшаться яркость начнет.
Последний раз редактировалось poligon_85; 16.04.2011 в 14:51.
|
|
|
|
16.04.2011, 14:50
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от poligon_85
|
Просто какая разница буд
|
Разница огромна. За время выполнения опроса кнопки и прочего можно выполнить ещё кучу всего. Кнопка, по понятиям МК, опрашивается очень редко. Что же он в это время совсем ничего делать не должен?
Сообщение от poligon_85
|
А как его разбудить???
|
Проснётся он от прерывания. Придёт Таймер и разбудит.
С включением/выключением всё понятно?
PHP код:
|
//Включение/выключение фонаря void led_on_off(void) { if (PWM_on) //Если флаг установлен (включен) { tmpPWM = OCR2; //Сохраняем компаратор OCR2=0xFF; //Гасим свет PWM_on = 0; //Сбросили флаг } else //А если выключен - включить { OCR2=tmpPWM;//PWM_start; //Включаем PWM_on = 1; //Установили флаг } }
|
Последний раз редактировалось omercury; 16.04.2011 в 14:54.
|
|
|
|
16.04.2011, 15:04
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Ну и писать программку я начал с этой функции:
PHP код:
|
//Сканирование кнопки void key_scan(void) { if KeyPress //Если кнопка нажата { //Проверим, давно ли её нажали if (KeyNew) //Если флаг установлен (значит "давно") { count++; //Увеличиваем счётчик задержки if (count›longkey) //Если длинное нажатие { bright_ch(); //Начинаем менять компаратор ШИМ count--; //Декремент счетчика(увеличивать-то его больше никчему) PWM_on = 1; } //Выход } else //Нажали только что, на это и укажем { KeyNew = 1; //Устанавливаем флаг } //Выход } else //Если кнопка не нажата Это может означать, { //что её и не нажимали или только что отпустили, вот это и проверим даьше if (KeyNew) //Если флаг установлен (только что отпустили) { //Проверим, до скольки успели досчитать if (count‹longkey) //Если меньше длинного(короткое нажатие) {//Можно было и объединить, но не люблю я двойные условия, МК их всё равно по очереди сделает if (count›shortkey) //Если больше минимального (короткое, но не дребезг) { led_on_off(); //Включаем/выключаем фонарь } //Иначе - Это был дребезг } } clr_var(); //Сброс переменных } //Выход KeyEXE = 0; //Запрет опроса кнопок #asm("sleep") //Усыпляем МК }
|
...сначала задал логику работы всей программке(самое сложное), а потом занялся мелочами - исполнением конкретных малых задач.
Сообщение от poligon_85
|
Кстати вылезла проблема максимальной яркости.
|
Сейчас сделаем. Надо немного дописать функцию изменения яркости...
Последний раз редактировалось omercury; 16.04.2011 в 15:52.
|
|
|
|
16.04.2011, 15:22
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Теперь она выглядит вот так:
PHP код:
|
#include ‹delay.h› //Подключили библиотеку задержек ........................... //Изменение яркости свечения(коэф. заполнения ШИМ) void bright_ch(void) { b_count++; //Инкремент счётчика задержки if (b_count›=PWM_del) //Если досчитали { OCR2--; //Меняем скважность if (OCR2==0) { OCR2=0xFF; delay_ms(500); //На полсекунды гасим свет OCR2=0; //Снова включаем его на полную яркость delay_ms(2000); //Ждём 2 секунды, чтобы отпустили кнопку } b_count = 0x00; //Сброс счетчика } }
|
Наверху, где подключали описание МК надо подключить библиотеку задержек.
За время её выполнения таймер сработает 80 раз, но это ничего не изменит пока мы не отработаем эту функцию, потому, что всё это не в прерывании.
На всякий случай весь файл m8_PWM+Key_c.zip
Последний раз редактировалось omercury; 16.04.2011 в 19:00.
|
|
|
|
16.04.2011, 17:30
|
|
Временная регистрация
Регистрация: 11.04.2011
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Тут срочно пришлось уехать. Только вернулся. omercury, спасибо, сейчас сяду разбираться.
|
|
|
|
16.04.2011, 17:40
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Может при крайних значениях яркости просто останавливать изменение? Без моргания.
|
|
|
|
16.04.2011, 17:48
|
|
Прописка
Регистрация: 25.08.2007
Сообщений: 193
Сказал спасибо: 11
Сказали Спасибо 57 раз(а) в 33 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от omercury
|
Может при крайних значениях яркости просто останавливать изменение? Без моргания.
|
Да, мне кажется, по-хорошему в фонарике плавная регулировка, вообще не нужна, 2-3 значения фиксированных при переключении кнопкой, как в китайских. Я думаю, ТС для учёбы и спортивного интереса это делает.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:25.
|
|