Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
12.02.2015, 02:12
|
|
Временная регистрация
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от omercury
|
Интересно, через сколько микросекунд стек затрёт регистры?
|
Значит эта программа не будет работать из за рекурсии даже если прототипы функций правильно объявлены?
Именно об этом предупреждает компилятор, говоря:
Функция "I_Want_sleep" не используются при расчете использования стека данных из-за положительных рекурсивных вызовов
Что же тогда делать? Нужно переделывать функцию "void led_on_off(void)" так, чтобы в ней не было функции засыпания??? Но как же тогда отправлять контроллер в спячку сразу же после выключения подсветки?
|
|
|
|
12.02.2015, 04:43
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от prosto_andriy
|
Что же тогда делать? Нужно переделывать функцию "void led_on_off(void)" так, чтобы в ней не было функции засыпания??? Но как же тогда отправлять контроллер в спячку сразу же после выключения подсветки?
|
А сразу сказать нельзя было?
|
|
|
Сказали "Спасибо" omercury
|
|
|
12.02.2015, 17:59
|
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Всем доброго времени суток.
Есть у меня экспериментальная плата, которую я делал, когда учил ассемблер на сайте Сергея Соколова. Только в ней включенное состояние светодиода - низкий уровень на выходе порта. Попытался я применить вашу задачу под нее, но на Си++, что то ничего не получается. Казалось бы и кода ничего, а память на триста с лишним процентов занимает и не компилируется, а если включаю оптимизатор ужимает от 40 - до 15, но пробовал дизасемблировать, то полный бред. Логики не пойму. В общем, я сделал все на много проще.
1. Режим сна - это выключено
2. Если включено, то только сканирование кнопки и в зависимости от длительности управление регистром сравнения таймера.
3. Если длительность нажатия короткая - то сон.
Все проверил на плате, все отлично работает. При просыпании зажигается с тем уровнем, с которым засыпал. При желании можно в прерывании INT0, при просыпании задать какой-то постоянный уровень. Запрещаю только прерывания INT0 во время работы. Менять режимы сна не стоит, так как МК заснет только после команды Sleep, а биты разрешения сна или запрещения рекомендуют менять на всякий случай.
И не забудьте, в проекте включение светодиода идет низким уровнем на выходе. Проект выполнен в AVR Studio 4
Всем удачи.
Последний раз редактировалось МВА; 12.02.2015 в 18:08.
|
|
|
|
12.02.2015, 20:15
|
|
Временная регистрация
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
omercury, большое спасибо за Ваш код! Но теперь получается, что короткое нажатие включает подсветку только на время удержания кнопки - стоит её отпустить, светодиод тут же гаснет и контроллер засыпает!
А вот от длинного нажатия, которое начинает менять яркость, контроллер просыпается нормально и подсветка гаснет по таймауту!!!
Насколько я понял, за включение/выключение в этом коде отвечает флаг «PWM_on»!Но в нём ли причина такого странного глюка?
|
|
|
|
12.02.2015, 22:03
|
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от prosto_andriy
|
omercury, большое спасибо за Ваш код! Но теперь получается, что короткое нажатие включает подсветку только на время удержания кнопки - стоит её отпустить, светодиод тут же гаснет и контроллер засыпает!
А вот от длинного нажатия, которое начинает менять яркость, контроллер просыпается нормально и подсветка гаснет по таймауту!!!
Насколько я понял, за включение/выключение в этом коде отвечает флаг «PWM_on»!Но в нём ли причина такого странного глюка?
|
Всем добрый вечер.
В коде, который я выкладывал на асме, у меня та-же самая проблема. это потому-что засыпание идет по признаку короткого нажатия. Я тут за пару минут подправил код(у меня этот бит называется Long, я просто дописал три строчки и искусственно установил его в прерывании INT0 (при просыпании) и он не засыпает опять. Может тебе сделать это в коде от omercury? пример изменения в моем коде я прилагаю. На С++ это должно вылиться в одну строчку, которую нужно прописать в прерывании INT0
|
|
|
|
12.02.2015, 22:35
|
|
Временная регистрация
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Посмотрел, в коде для обработки прерывания написано так:
PHP код:
|
interrupt [EXT_INT0] void ext_int0_isr(void) { GIMSK=0x00; //Disable External Interrupt-0 MCUCR=0x20; //Idle Mode interrupt by level TCCR0A=0xC3; //Fast PWM (Mode 3) Set OC0B on Compare Match, clear OC0B at TOP TCCR0B=0x03; //CLK/64 Enable Timer clr_var(); //Сброс переменных PWM_on = 0; led_on_off(); }
|
Я просто поменял местами два последние строчки, то есть стало так:
PHP код:
|
interrupt [EXT_INT0] void ext_int0_isr(void) { GIMSK=0x00; //Disable External Interrupt-0 MCUCR=0x20; //Idle Mode interrupt by level TCCR0A=0xC3; //Fast PWM (Mode 3) Set OC0B on Compare Match, clear OC0B at TOP TCCR0B=0x03; //CLK/64 Enable Timer clr_var(); //Сброс переменных led_on_off(); PWM_on = 0; }
|
И оно заработало нормально только вот почему, я толком и не понял
Последний раз редактировалось prosto_andriy; 12.02.2015 в 22:57.
|
|
|
|
12.02.2015, 23:05
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Магия! .
|
|
|
|
12.02.2015, 23:17
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
А засыпает нормально?
|
|
|
|
12.02.2015, 23:24
|
|
Временная регистрация
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Да нормально! Я вот сейчас ещё думаю, как прикрутить запоминание (сохранение её в EEPROM) уровня яркости!
Там две переменных: tmpPWM и PWM_start.
Нужно записывать tmpPWM в момент отпускания кнопки после длительного нажатия?
И ещё подскажите, пожалуйста, что делать, если длительность нажатия не помещается в переменную longkey, то есть превышает значение 0xFF
Нужно менять частоту таймера?
Последний раз редактировалось prosto_andriy; 13.02.2015 в 00:44.
|
|
|
|
13.02.2015, 01:20
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от prosto_andriy
|
Да нормально!
|
Странно, должно быть наоборот.
Сообщение от prosto_andriy
|
Там две переменных
|
Там одна переменная и одна константа.
Сообщение от prosto_andriy
|
И ещё подскажите, пожалуйста, что делать, если длительность нажатия не помещается в переменную longkey, то есть превышает значение 0xFF
|
Это тоже константа.
Сообщение от prosto_andriy
|
Нужно менять частоту таймера?
|
146 герц ещё нормально, можно предделитель увеличить, а можно изменить тип счётчика циклов таймера.
|
|
|
Сказали "Спасибо" omercury
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 22:54.
|
|