Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
16.04.2011, 12:57
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
poligon_85, Вторая ножка светодиода осталась на "земле"? Если да, то вот изменённый исходник. Этот вариант запоминает яркость светодиода при выключении, а при включении её восстанавливает. Если при выключенном фонаре долго удерживать кнопку, регулировка начинается с нуля. Всё свободное время МК спит.
PHP код:
|
.............................
//Сканирование кнопки
void key_scan(void)
{
............................
KeyEXE = 0; //Запрет опроса кнопок
#asm("sleep") //Усыпляем МК
}
....................
// Time/Counter 2 initialization
// Clock source: System Clock
// Clock value: 7,813 kHz *4 = 31.25kHz
// Mode: Fast PWM top=0xFF
// OC2 output: Inverted PWM
ASSR=0x00;
TCCR2=0x7C;//6C;//6F;
|
Изменил режим таймера и добавил спящий режим.
m8_PWM+Key.zip
|
|
|
|
16.04.2011, 13:00
|
|
Прописка
Регистрация: 25.08.2007
Сообщений: 193
Сказал спасибо: 11
Сказали Спасибо 57 раз(а) в 33 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от poligon_85
|
Не понимаю ваш исходник... Что делает функция bright_ch () ?
|
О! Вы мало спали. Это не моя функция и не мой исходник. Вы уже запутались Мой исходник приложен. Кстати, если не трудно, проверьте в реале!
|
|
|
|
16.04.2011, 13:08
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Цитата:
|
Таймер 2 занимается генерацией ШИМ, зачем там:
|
Не только. Чтобы не использовать второй таймер - TIMER0, я сделал тактирование от того же TIMER2. Он же всё равно уже работает.
В прерывании таймера только устанавливается флаг разрешения опроса кнопок. Реально компилятор ещё сохранил SREG, но сделал это правильно(на мой взгляд) - в регистр.
PHP код:
|
;interrupt [TIM2_OVF] void Time2_ovf_isr(void)
;_Time2_ovf_isr:
ST -Y,R30
IN R30,SREG
; //Разрешение опроса кнопок
SET
BLD R2,0
OUT SREG,R30
LD R30,Y+
RETI
|
|
|
|
|
16.04.2011, 13:10
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от poligon_85
|
Не понимаю ваш исходник... Что делает функция bright_ch () ?
|
Bright Change - изменение яркости. Все имена стараюсь давать со смыслом.
Эта функция изменяет яркость. Можно было сделать и в цикле опроса кнопок, но так нагляднее.
|
|
|
|
16.04.2011, 13:11
|
|
Временная регистрация
Регистрация: 11.04.2011
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
omercury, работает в железе как надо. Спасибо. Но я не понимаю почему такой сложный код... Неужели нельзя как по простому. Чтобы даже дибилу, т.е. мне, понятно было.
И опять же, почему:
Код:
|
// Time 0 overflow interrupt service routine
// раз в 8 mS
interrupt [TIM2_OVF] void Time2_ovf_isr(void)
{
KeyEXE = 1; //Разрешение опроса кнопок
} |
Если таймер занимается генерацией ШИМа.
|
|
|
|
16.04.2011, 13:47
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Давайте тогда буду объяснять, почему так, а не как-то иначе с самого начала.
Функция main(). С неё начинает работать программа. Сначала идёт инициализация, а в конце есть бесконечный цикл В нём МК дальше и будет крутиться, пока чего-нибудь не произойдёт. В нашем случае пока не сработает прерывание работы МК по переполнению счётчика таймера2.
ЗЫ. Это только у меня такие тормоза 5 минут назад были, или у всех?
|
|
|
|
16.04.2011, 13:53
|
|
Временная регистрация
Регистрация: 11.04.2011
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
main(); While(1); - это я понимаю. Получается у нас таймер 2 и ШИМ генерирует и интервалы считает?????
Просто я подсчет интервалов на Таймере 0 пытался сделать.
P.S. У меня тоже форум минут 10 не грузился
|
|
|
|
16.04.2011, 14:04
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от poligon_85
|
Получается у нас таймер 2 и ШИМ генерирует и интервалы считает?????
|
Конечно! Зачем использовать 2 таймера для простейшей задачи?
По функциям объяснять?
oleg_harp, Ваш работает, но сильно моргает(где-то раз 8-10 в секунду). Возможно низка частота ШИМ, а может где-то что-то проваливается.
|
|
|
|
16.04.2011, 14:21
|
|
Временная регистрация
Регистрация: 11.04.2011
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от omercury
|
По функциям объяснять?
|
Ну если не сложно... Ну вот такой тяжелый случай
Итак, стаботало прерывание таймера.
KeyEXE = 1; - зафиксировали это.
Запустили сканирование кнопок key_scan();
Последний раз редактировалось poligon_85; 16.04.2011 в 14:23.
|
|
|
|
16.04.2011, 14:26
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Случай нормальный.
PHP код:
|
//Изменение яркости свечения(коэф. заполнения ШИМ) void bright_ch(void) { b_count++; //Инкремент счётчика задержки if (b_count›PWM_del) //Если досчитали { OCR2--; //Меняем скважность b_count = 0x00; //Сброс четчика } }
|
Эта функция меняет коэффициент заполнения ШИМ. В нашем случае каждый одиннадцатый вход в неё. (#define PWM_del 0x0A)
PHP код:
|
//Сброс переменных void clr_var(void) { count = 0; //Сбросили счётчик задержки срабатывания кнопки b_count = 0; //Сбросили счётчик задержки шага изменения PWM KeyNew = 0; //Сбрасываем флаг }
|
Здесь всё понятно. Обнуляются переменные.
Чтоб не многопостить, дописываю сюда.
Последний раз редактировалось omercury; 16.04.2011 в 14:28.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:26.
|
|