Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
11.03.2015, 19:56
|
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от prosto_andriy
|
А я думал, что проще константу времени автоотключения оставить!
Выставить её например в 60 (то есть 1 мин.), и в зависимости от того, сколько раз инкрементируется счетчик, множить на соответствующее значение! Например:
- прошла 1 секунда после нажатия - множим на 1
- 2 секунды на 2;
- 3 на 4
- 4 на 8
Я очень плохо разбираюсь в программировании, но мне кажется здесь можно обойтись и без умножения, достаточно сдвигать один бит, если я не ошибаюсь, влево! Или нет?
|
Всем доброго времени суток.
Я, думаю, что Вы будете очень ограничены с математическим алгоритмом, только кратные величины, а через сase - Вы можете делать, все-что угодно. даже сразу увеличивать время, а потом уменьшить при большей длительности нажатия.
А насчет делителей, ну, может я где-то сбился. Я просмотрел - Вы сразу обсуждали делители и их реинит, а остановились на режимах. Ну, я и решил напомнить, на всякий случай.
|
|
|
|
07.04.2015, 18:35
|
|
Временная регистрация
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
К сожалению, я очень плохо разбираюсь в синтаксисе C++, поэтому не знаю, как правильно написать код, но по-мойму там будет достаточно изменить функцию void key_scan(void) на int key_scan(int) и добавить в неё строку
перед обнулением счетчика длительности нажатия кнопки! То есть написать так:
PHP код:
|
//Сканирование кнопки
void key_scan(void)
{
M.KeyEXE = 0; //Запрет опроса кнопок, который кто-то выкинул)))))
//Вся логика работы поменялась, теперь его место здесь
if (KeyPress) //Если кнопка нажата. ЕСЛИ КНОПКА НАЖАТА МЫ ВОШЛИ В ЭТУ ФУНКЦИЮ
{
if (count›=longkey) //Если длинное нажатие
{
if(!(M.F_longkey))
{
M.F_longkey=1;
BACKLIGHT_on_off();
return count; // ‹‹‹‹-------------------возвращаем значение счетчика длительности нажатия
count=0; // сбрасываем счетчик когда кнопка не нажата
}
} //Выход
count++; //Увеличиваем счётчик задержки.
// Его надо делать ПОСЛЕ проверки условия, иначе может быто перепрлнение.
systemClock = 0; //Сброс таймаута выключения подсветки.
}
else // если кнопка не нажата...
{
M.F_longkey=0;
count=0; // сбрасываем счетчик когда кнопка не нажата
asm("sleep");
} // ...микроконтроллер "засыпает"
}
|
А строку
PHP код:
|
#define secundes 10 // количество секунд для автоотключения
|
Заменить на
PHP код:
|
int secundes = count * 100; // 100 - это для примера, можно написать и 1000
|
Мне кажется, этот вариант проще всего! Или нет?
|
|
|
|
07.04.2015, 19:06
|
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от prosto_andriy
|
Мне кажется, этот вариант проще всего! Или нет?
|
Всем доброго времени суток.
Думаю нет. Так работать не должно.
Переменная count - определяет порог срабатывания (длинное/короткое) после длинного она обнулится, а после короткого заснет.
Надо менять программу так, чтобы она и дальше увеличивалась, а после отпускания переписывалась в secundes, а уже после этого обнулялась. И еще, когда программа достигнет команды return, то программа будет выходить из функции при одном и том же значении count. так что строка count=0;после команды return скорее всего никогда не выполнится.
Последний раз редактировалось МВА; 07.04.2015 в 19:14.
|
|
|
|
08.04.2015, 05:06
|
|
Временная регистрация
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Обнаружил странный глюк в предыдущем варианте кода! Почему-то ATtiny13A входит в режим "крепкого сна" только по таймеру автоотключения!
А вот после нажатия кнопки (даже когда светодиод гаснет) полностью не засыпает!!!
Непонятно, почему так происходит?
Я уже кучу вариантов перепробовал, меняя MCUCR=0x20; на MCUCR=0x30; но все равно ничего не получилось - контроллер либо засыпает так, что его не разбудишь, либо засыпает не полностью после выключения светодиода кнопкой!
Не могу понять, что нужно исправить? Подскажите пожалуйста!
|
|
|
|
08.04.2015, 20:53
|
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от prosto_andriy
|
Обнаружил странный глюк в предыдущем варианте кода! Почему-то ATtiny13A входит в режим "крепкого сна" только по таймеру автоотключения!
А вот после нажатия кнопки (даже когда светодиод гаснет) полностью не засыпает!!!
Непонятно, почему так происходит?
Я уже кучу вариантов перепробовал, меняя MCUCR=0x20; на MCUCR=0x30; но все равно ничего не получилось - контроллер либо засыпает так, что его не разбудишь, либо засыпает не полностью после выключения светодиода кнопкой!
Не могу понять, что нужно исправить? Подскажите пожалуйста!
|
Всем доброго времени суток.
Все правильно, так это и будет работать. У тебя режим глубокого сна включается при загрузке программы, или по истечению тайм-аута. после включения, на кнопку вообще не должен реагировать. Нет включать выключать он будет, потому-что реверсируется бит включения и выключения, и больше ничего, правда после истечения тайм-аута он уснет даже с выключенной лампой. Надо в функции key_scan проверять длину нажатия, или дeлать else на count›=longkey в ней выключать подсветку и потом функция "Я хочу спать!" Или еще проще, вставь эту функцию в тело условия выключения фонаря.
Кстати, погоняй в AVR Studio (чтоб долго не ждать прерываний используй контекстное меню работать до курсора), и сам все увидишь.
Последний раз редактировалось МВА; 10.04.2015 в 20:06.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 06:22.
|
|