Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
29.04.2011, 19:53
|
|
Прописка
Регистрация: 25.08.2007
Сообщений: 193
Сказал спасибо: 11
Сказали Спасибо 57 раз(а) в 33 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от artyomugr
|
ни каких проблем нет при быстром нажатии и отпускании
|
Я рад за Вас. Насчёт того, что Ваш код будет работать через раз, я погорячился, но когда речь идёт о надежности, гиперболы уместны. Ваш код будет работать 99 раз через раз (или что-то около того).
Сообщение от artyomugr
|
там все решает задержка delay_ms(100);
|
Не всё. Смотрите: Допустим, Вы после короткого нажатия отпускаете кнопку перед окончанием delay_ms() в момент, когда на пине 1 из за дребезга. Ваш код фиксирует отпускание кнопки (выполняется соответствующее действие), затем опять короткое нажатие, во время которого ничего не происходит, и после этого уже реальное отпускание кнопки, которое повторяет предыдущее действие. Таким образом одно ложное срабатывание (отпускание кнопки). Если это , как у Вас, то всё работает. А если это изменение состояния (декремент, инкремент, да мало ли что), то это косячок. А это может быть не только дребезг, а помеха-иголка, резкое сотрясение устройства ....
Так что Вам выбирать. Может, для меню и не страшно.
|
|
|
|
29.04.2011, 20:26
|
|
Вид на жительство
Регистрация: 05.04.2008
Адрес: Украина, Ахтырка
Сообщений: 302
Сказал спасибо: 148
Сказали Спасибо 31 раз(а) в 30 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Можно так модернезировать код если боимся дребезга по отжатию
Теоретически Вы абсолютно правы, но на практике я никогда не заморачиваюсь с защитой от дребезга по отжатию, и все работает хорошо.
С ув. Артем
if (butt==0){
delay_ms(100);
if (butt==0){// дополнительная защита от дребезга контактов.
flags=1; // ставим флаг если кнопка нажата
tmr++;
if (tmr›40){
led_1=1;
flags=0; // выполнили команду сбрасываем флаг
tmr=0; // и сбрасываем счетчик
}
}
}
if (butt!=0){ // если кнопка отжата и флаг установлен
delay_ms(100);
if (butt!=0){ // если боимся дребезга по отжатию то эта проблема решается так
tmr=0;
if (flags==1){
led_2=1; // выполняем следующую команду
flags=0;
}
}
}
// дополнительная защита от переполнения переменной
if (tmr›100){
tmr=0;
}
Последний раз редактировалось artyomugr; 29.04.2011 в 20:37.
|
|
|
|
01.02.2015, 16:13
|
|
Временная регистрация
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Мне очень понравился этот код! Я бы до такого не додумался
Действительно, для регулировки яркости светодиодов - это, пожалуй, оптимальный вариант! Думаю, он идеально подошел бы мне для управления подсветкой дисплея!
Остается добавить только отключение подсветки и впадание контроллера в "спячку" (например через 15 минут бездействия)!
Знаю, что это делается командой ... но куда именно её "прикрутить"?
Нужно добавить в программу ещё одну переменную и еще один счетчик (на основе таймера), который будет считать до записанного в переменную значения?
Если да, подскажите пожалуйста, как правильно это написать? Заранее спасибо!
|
|
|
|
01.02.2015, 19:02
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Организовывается свободнобегущий программный таймер, после любого нажатия кнопки таймер сбрасывается. Если таймер достиг определённого значения (ваши 15мин.), то уход в слип.
|
|
|
|
01.02.2015, 21:44
|
|
Временная регистрация
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Если бы я делал это на ATMega, а не на ATtiny13, то конечно можно было бы просто заюзать ещё один таймер и написать примерно так:
Код:
|
while (1)
{
--› запустить таймер
if (KeyEXE)
{
key_scan();
--› сбросить таймер в этом месте
}
}
} |
Но в ATtiny13 таймер ведь только один и причём 8-битный!!! Вот я и теряюсь в догадках, как этот код переделать, не задействуя ещё одного таймера?
К сожалению в программинге - "чайник", поэтому решил спросить у опытных форумчан. Подскажите пожалуйста, если не сложно!
Последний раз редактировалось prosto_andriy; 01.02.2015 в 21:59.
|
|
|
|
01.02.2015, 21:59
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
На основе уже использующегося аппаратного таймера сделать таймер программный - то есть инкремент счетных регистров по срабатыванию переполнения аппаратного таймера.
|
|
|
|
02.02.2015, 02:12
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от STM32F0
|
Организовывается свободнобегущий программный таймер
|
Сообщение от NewWriter
|
На основе уже использующегося аппаратного таймера сделать таймер программный
|
Ну да, так и есть.
Сообщение от prosto_andriy
|
Остается добавить только отключение подсветки и впадание контроллера в "спячку" (например через 15 минут бездействия)!
|
Да он и так там почти всё время спит, пока его не беспокоят.
Единственное, не понял смысла этого действия...
Зачем нужно постоянно менять яркость подсветки?
P.S.
Чуть не забыл:
При программировании надо снять бит CLKDIV8, а то будет выключаться через 2 часа...
Последний раз редактировалось omercury; 02.02.2015 в 02:28.
|
|
|
Сказали "Спасибо" omercury
|
|
|
02.02.2015, 14:33
|
|
Временная регистрация
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от omercury
|
Зачем нужно постоянно менять яркость подсветки?
|
Для экономии батарейки - дело в том, что мультиметр, в который я хочу добавить подсветку, питается от обычной 9В "кроны"!
Конечно менять уровень подсветки можно было бы автоматически, если запихнуть в прибор фоторезистор и подключить его к АЦП микроконтроллера! Но я подумал, что проще "прикрутить" регулировку яркости к кнопке вкл./выкл.
Большое спасибо за код
|
|
|
|
02.02.2015, 19:15
|
|
Временная регистрация
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Появился ещё один вопрос: как подключить встроенный подтягивающий резистор к выводу кнопки (обозначен как B1)!
Для этого достаточно лишь заменить в коде строку
на Или нет? Подскажите пожалуйста!
|
|
|
|
04.02.2015, 01:15
|
|
Временная регистрация
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Подскажите пожалуйста, что означает такое сообщение при прошивке, точнее при верификации!
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:15.
|
|