Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
09.02.2015, 20:41
|
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Доброго времени суток всем.
Извините, но я давно не писал на Си, но с первого взгляда у меня появились замечания. Я не понял зачем усыплять контроллер в самом начале главного цикла. И в спящий режим лучше переводить контроллер, когда фонарь выключен по истечении нескольких секунд, а по прерыванию производить включение фонаря, и если кнопка нажата более какого-то времени - производить управление яркостью. Прикладываю, если у кого-то нет, для наглядности описание управления спящим режимом. И еще одно. Для таких целей, как фонарь, зачем использовать частоту в 8 Мгц и кварц. Вполне достаточно и внутреннего генератора на 1 Мгц.
Последний раз редактировалось МВА; 09.02.2015 в 20:46.
|
|
|
|
09.02.2015, 22:15
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от prosto_andriy
|
то происходит вообще непонятно что - контроллер то реагирует на кнопку, то нет : такое вчечатление, что он запутался
может кто-нибудь подскажет почему так происходит
|
Да поменяйте просто местами
PHP код:
|
GIMSK=0x40; //Enable External Interrupt-0
|
и
PHP код:
|
MCUCR=0x30; // -----
|
То есть сначала включите внешнее прерывание, а потом отправляйте МК в Power Down.
|
|
|
|
09.02.2015, 22:35
|
|
Временная регистрация
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от МВА
|
Я не понял зачем усыплять контроллер в самом начале главного цикла.
|
Да, действительно Вы правы - я эти строки не туда вставил – не сообразил сначала, что while (1) это ведь бесконечный цикл (пока контроллер включен он его и отрабатывает)! Нужно, наверное было их в void main(void) запихнуть! Или нет?
Последний раз редактировалось prosto_andriy; 09.02.2015 в 22:46.
|
|
|
|
10.02.2015, 00:01
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от prosto_andriy
|
Да, действительно Вы правы
|
Неправ.
Вы условия посмотрели, при которых выполняются те участки кода?
Хотя...
Пока сами по всем граблям не пройдёте, ничему не научитесь.
|
|
|
|
10.02.2015, 12:28
|
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от omercury
|
Да поменяйте просто местами
PHP код:
|
GIMSK=0x40; //Enable External Interrupt-0
|
и
PHP код:
|
MCUCR=0x30; // -----
|
То есть сначала включите внешнее прерывание, а потом отправляйте МК в Power Down.
|
Всем доброго времени суток.
Неважно в каком порядке вы впишите эти строки. Важно, чтобы это было до команды sleep, потому что МК отправится спать после нее. Да и прерывания можно включить до бесконечного цикла и больше не трогать. Если команда sleep стоит в начале бесконечного цикла и выполняется безусловно, то представьте, что МК заснуло в sleep по условию :
[ if (systemClock › secundes)
{
systemClock = 0;
PWM_on = 1;
led_on_off();
TCCR0B=0; //Disable timer
MCUCR=0x30; // режим "глубокой спячки" POWER DOWN включен!
GIMSK=0x40; //Enable External Interrupt-0
#asm("sleep") //Усыпляем МК
}
]
а при выходе по прерыванию выполняется следующая команда за sleep. А следующее у нас что?... Начало цикла и опять МК заснет. Вот и получается, что визуально МК то реагирует, то не реагирует на кнопку. Это зависит от того где он заснет.
Последний раз редактировалось МВА; 10.02.2015 в 12:31.
|
|
|
|
10.02.2015, 13:35
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от МВА
|
А следующее у нас что?... Начало цикла
|
И что с того?
Код:
|
if (systemClock › secundes)
{
systemClock = 0;
PWM_on = 1;
led_on_off();
TCCR0B=0; //Disable timer
MCUCR=0x30; // режим "глубокой спячки" POWER DOWN включен!
GIMSK=0x40; //Enable External Interrupt-0
#asm("sleep") //Усыпляем МК
} |
Пока systemClock не досчитает до secundes, он туда не войдёт...
|
|
|
|
10.02.2015, 13:39
|
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от omercury
|
И что с того?
Код:
|
if (systemClock › secundes)
{
systemClock = 0;
PWM_on = 1;
led_on_off();
TCCR0B=0; //Disable timer
MCUCR=0x30; // режим "глубокой спячки" POWER DOWN включен!
GIMSK=0x40; //Enable External Interrupt-0
#asm("sleep") //Усыпляем МК
} |
Пока systemClock не досчитает до secundes, он туда не войдёт...
|
А цикл начинается:
while (1)
{
MCUCR=0x30; // -----
GIMSK=0x40; //Enable External Interrupt-0
#asm("sleep") __________!!!!!!___________________
if (KeyEXE)
{ ......
|
|
|
|
10.02.2015, 13:52
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
prosto_andriy, У Вас в начале файла есть определения:
Код:
|
#define shortkey 0x80 //80 . Константа - минимум для короткого нажатия
#define longkey 0xFE //240. Константа - минимум для длинного нажатия
#define PWM_del 0x0A //15. Константа задержки изменения яркости |
Константа shortkey определяет, колько раз таймер должен досчитать до переполнения (256 тиков), чтобы считать нажатие коротким. Это время равно 1,71мс*128=218 миллисекундам(0,218 секунды), всё, что короче, считается дребезгом. Поиграйте этой константой.
|
|
|
|
10.02.2015, 13:54
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от МВА
|
А цикл начинается:
while (1)
|
У кого?
Я вообще-то про свой код, исходный.
prosto_andriy там "управил" - только держись...
|
|
|
|
10.02.2015, 14:35
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
prosto_andriy, держите исправленный вариант.
Мы с Вами забыли при "побудке" изменить режим сна и он на первом же цикле таймера
уходил в глубокий даун не включив внешнее прерывание.
Последний раз редактировалось omercury; 10.02.2015 в 15:02.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:19.
|
|