Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
13.02.2015, 01:53
|
|
Временная регистрация
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от omercury
|
...можно предделитель увеличить, а можно изменить тип счётчика циклов таймера.
|
Вы имеете ввиду заменить char на int?
А если изменить предделитель, отредактировав строку
TCCR0B=0x03; то частота ШИМ тоже ведь измениться??? Разве нет?
Последний раз редактировалось prosto_andriy; 13.02.2015 в 01:59.
|
|
|
|
13.02.2015, 03:27
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
char и int схожи, размер один, int может быть отрицательным (-127..127), char нет.
Смотрите описания типов int/uint 8/16/32_t ну и других.
|
|
|
|
13.02.2015, 06:14
|
|
Временная регистрация
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Подскажите пожалуйста, как сделать так, чтобы светодиод вкл./выкл. не одиночным коротким нажатием, а двойным???
Я немного изменил код сканирования кнопки, и получилось так:
PHP код:
|
void key_scan(void)
{
if KeyPress //Если кнопка нажата
{ //Проверим, давно ли её нажали
if (KeyNew) //Если флаг установлен (значит "давно")
{
count++; //Увеличиваем счётчик задержки
if (count›longkey) //Если длинное нажатие
{
bright_ch(); //Начинаем менять компаратор ШИМ
count--; //Декремент счетчика(увеличивать-то его больше никчему)
PWM_on = 1;
} //Выход
}
else //Нажали только что, на это и укажем
{
KeyNew = 1; //Устанавливаем флаг
} //Выход
systemClock = 0; //Сброс таймаута выключения подсветки
}
else //Если кнопка не нажата Это может означать,
{ //что её и не нажимали или только что отпустили, вот это и проверим даьше
if (KeyNew) //Если флаг установлен (только что отпустили)
{ //Проверим, до скольки успели досчитать
if (count‹longkey) //Если меньше длинного(короткое нажатие)
{//Можно было и объединить, но не люблю я двойные условия, МК их всё равно по очереди сделает
if (count›shortkey) //Если больше минимального (короткое, но не дребезг)
{
button_short_pressed_count++;
if (button_short_pressed_count=2)
{ led_on_off(); //Включаем/выключаем фонарь
}
} //Иначе - Это был дребезг
}
else {Dir_on=~Dir_on;} //Меняем направление изменения яркости
}
clr_var(); //Сброс переменных
} //Выход
KeyEXE = 0; //Запрет опроса кнопок
#asm("sleep") //Усыпляем МК
}
|
Но дело в том, что контроллер всё равно реагирует на одиночные нажатия, а не на двойные! Непонятно почему? Ведь я добавил счетчик нажатий и условие, когда он должен срабатывать? Подскажите пожалуйста, что неправильно? Компилируется, как ни странно без ошибок.
|
|
|
|
18.02.2015, 22:51
|
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Доброго времени суток всем.
Трудно сказать, что там у тебя в коде, но там присутствуют противоречия. Я не стал сильно углубляться после того, как нашел парочку, хотя скорее, одно просто не влияет на программу. Я уже писал, что на Си у меня почему-то не очень получается. Но, я думаю, этот вопрос можно решить, если кодировать нажатия по принципу асинхронной передачи данных. Что-то вроде такого алгоритма:
1. на прерываниях сделан счетчик предделителя, который генерирует тактовые импульсы.
2. По фронту нажатия кнопки (для входов с подтяжкой - это отрицательный фронт) устанавливается признак работы декодера, обнуляется счетчик тактовых импульсов и регистр кода.
3. по тактовым импульсам проверяется, нажата ли кнопка, и записывается, а если не нажата не записывается 1 в нулевой бит и сдвигается влево. Частота тактирования должна быть в два раза больше скорости нажатия кнопок.
4. когда счетчик досчитает до 4, это 5 тактов, меркер работы декодера сбрасывается, выставляется меркер готовности кода в регистре.
5. в программе, когда признак готовности выставлен, можно по инструкции switch - case: выделить нужную подпрограмму и оттуда сделать желаемое действие.
Я написал, правда на асме, образец, но напичкал почти каждую строчку комментариями. Думаю, должно быть понятно. Проэкт в AVR Studio прилагаю.
Пока все.
|
|
|
|
18.02.2015, 23:02
|
|
Гражданин KAZUS.RU
Регистрация: 27.11.2012
Адрес: 30км от Софии
Сообщений: 732
Сказал спасибо: 89
Сказали Спасибо 310 раз(а) в 180 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Для кнопки подходит сие железно
If нога = 1 Then
иф счетчик ноги ‹ 255 тхен
счетчик ноги = счетчик ноги + 1
else
if счетчик ноги › 1 тхен
счетчик ноги = счетчик ноги - 1
end if
If счетчик ноги › 200 then
бит ноги = 1
Енд иф
If счетчик ноги ‹ 100 then
бит ноги = 0
Енд иф
Такие вещи. С гистерезисом и уборкой помех.
|
|
|
|
19.02.2015, 11:50
|
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от 3d cube
|
Для кнопки подходит сие железно
If нога = 1 Then
иф счетчик ноги ‹ 255 тхен
счетчик ноги = счетчик ноги + 1
else
if счетчик ноги › 1 тхен
счетчик ноги = счетчик ноги - 1
end if
If счетчик ноги › 200 then
бит ноги = 1
Енд иф
If счетчик ноги ‹ 100 then
бит ноги = 0
Енд иф
Такие вещи. С гистерезисом и уборкой помех.
|
Всем доброго времени суток.
Если я правильно понял, то код получается такой:
unsigned char count = 0
while(1)
{
if(PINB&1‹‹1)
{
if(count‹255)
count=count+1;
}else{
if(count›1)
count=count-1;
}
if(count›200)
PORTB=PORTB|1‹‹0;
if(count‹100)
PORTB=PORTB&~(1‹‹0);
}
Но, такой код, подходит больше не для кнопки, а для задержки какого-нибудь сигнала от продолжительности сигнала на ноге от подачи до его снятия.
Например, можно использовать для задержки искрообразования, в зависимости от продолжительности замкнутого контакта, при условии, что условие первой функции if будет инвертировано, а сигнал искрообразования подаваться по отрицательному фронту PORTB.0
В этом коде при высоком уровне на ноге - счетчик будет считать вверх, а при низком - вниз. а выход будет переключаться при порогах равных 200 и 100.
Если я неправильно понял написанный Вами алгоритм, тогда приношу извинения за критику кода, хотя код действительно очень простой и его можно переделать под кнопку, правда он уже не будет таким простым.
пока все.
Последний раз редактировалось МВА; 19.02.2015 в 11:55.
|
|
|
|
19.02.2015, 16:50
|
|
Временная регистрация
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Правильнее всего наверно обрабатывать нажатие кнопки по такому алгоритму (см. рис).
|
|
|
|
19.02.2015, 17:14
|
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от prosto_andriy
|
Правильнее всего наверно обрабатывать нажатие кнопки по такому алгоритму (см. рис).
|
Думаю, это не самое хорошее решение. В программе нужно избегать замкнутых циклов так, как это сильно тормозит программу. Из приведенного алгоритма, если кнопка не нажата (не 0) то и программа никогда не дойдет до конца. А если там нужно еще что-то делать?...
|
|
|
|
19.02.2015, 17:22
|
|
Гражданин KAZUS.RU
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от МВА
|
Думаю, это не самое хорошее решение. В программе нужно избегать замкнутых циклов так, как это сильно тормозит программу.
|
Смотря какая программа - иногда нужно избегать, иногда можно и не избегать (например если используется RTOS).
Сообщение от МВА
|
А если там нужно еще что-то делать?...
|
Либо организовывать автомат, который запоминает состояние алгоритма и периодически вызывается, или весь алгоритм выделить в задачу RTOS.
|
|
|
|
19.02.2015, 17:37
|
|
Временная регистрация
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Так ведь этот алгоритм можно реализовать с помощью прерывания, а когда оно отработает выставлять соответствующий флаг, чтобы контроллер "имел в виду", включено устройство или выключено!
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:17.
|
|