Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Непрочитано 16.04.2011, 12:57  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию 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
Реклама:
omercury вне форума  
Непрочитано 16.04.2011, 13:00  
oleg_harp
Прописка
 
Регистрация: 25.08.2007
Сообщений: 193
Сказал спасибо: 11
Сказали Спасибо 57 раз(а) в 33 сообщении(ях)
oleg_harp на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от poligon_85 Посмотреть сообщение
Не понимаю ваш исходник... Что делает функция bright_ch () ?
О! Вы мало спали. Это не моя функция и не мой исходник. Вы уже запутались Мой исходник приложен. Кстати, если не трудно, проверьте в реале!
Вложения:
Тип файла: rar Kazus.rar (57.8 Кб, 52 просмотров)
oleg_harp вне форума  
Непрочитано 16.04.2011, 13:08  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию 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 
omercury вне форума  
Непрочитано 16.04.2011, 13:10  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от poligon_85 Посмотреть сообщение
Не понимаю ваш исходник... Что делает функция bright_ch () ?
Bright Change - изменение яркости. Все имена стараюсь давать со смыслом.
Эта функция изменяет яркость. Можно было сделать и в цикле опроса кнопок, но так нагляднее.
omercury вне форума  
Непрочитано 16.04.2011, 13:11  
poligon_85
Временная регистрация
 
Аватар для poligon_85
 
Регистрация: 11.04.2011
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
poligon_85 на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

omercury, работает в железе как надо. Спасибо. Но я не понимаю почему такой сложный код... Неужели нельзя как по простому. Чтобы даже дибилу, т.е. мне, понятно было.

И опять же, почему:
Код:
// Time 0 overflow interrupt service routine
// раз в 8 mS
interrupt [TIM2_OVF] void Time2_ovf_isr(void)
{ 
    KeyEXE = 1;          //Разрешение опроса кнопок
}
Если таймер занимается генерацией ШИМа.
poligon_85 вне форума  
Непрочитано 16.04.2011, 13:47  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Давайте тогда буду объяснять, почему так, а не как-то иначе с самого начала.
Функция main(). С неё начинает работать программа. Сначала идёт инициализация, а в конце есть бесконечный цикл
Код:
 While(1);
В нём МК дальше и будет крутиться, пока чего-нибудь не произойдёт. В нашем случае пока не сработает прерывание работы МК по переполнению счётчика таймера2.

ЗЫ. Это только у меня такие тормоза 5 минут назад были, или у всех?
omercury вне форума  
Непрочитано 16.04.2011, 13:53  
poligon_85
Временная регистрация
 
Аватар для poligon_85
 
Регистрация: 11.04.2011
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
poligon_85 на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

main(); While(1); - это я понимаю. Получается у нас таймер 2 и ШИМ генерирует и интервалы считает?????

Просто я подсчет интервалов на Таймере 0 пытался сделать.

P.S. У меня тоже форум минут 10 не грузился
poligon_85 вне форума  
Непрочитано 16.04.2011, 14:04  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от poligon_85 Посмотреть сообщение
Получается у нас таймер 2 и ШИМ генерирует и интервалы считает?????
Конечно! Зачем использовать 2 таймера для простейшей задачи?
По функциям объяснять?

oleg_harp, Ваш работает, но сильно моргает(где-то раз 8-10 в секунду). Возможно низка частота ШИМ, а может где-то что-то проваливается.
omercury вне форума  
Непрочитано 16.04.2011, 14:21  
poligon_85
Временная регистрация
 
Аватар для poligon_85
 
Регистрация: 11.04.2011
Сообщений: 54
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
poligon_85 на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от omercury Посмотреть сообщение
По функциям объяснять?
Ну если не сложно... Ну вот такой тяжелый случай

Итак, стаботало прерывание таймера.

KeyEXE = 1; - зафиксировали это.

Запустили сканирование кнопок key_scan();

Последний раз редактировалось poligon_85; 16.04.2011 в 14:23.
poligon_85 вне форума  
Непрочитано 16.04.2011, 14:26  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию 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.
omercury вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Книги dosikus Электронная библиотека 11242 29.12.2015 23:45
Как правильно отследить импульс sdsrem Микроконтроллеры, АЦП, память и т.д 8 17.08.2010 21:28
[Решено] Третье Послание Человечеству lelkanet Отвлекитесь, эмбеддеры! 201 06.01.2010 00:33


Часовой пояс GMT +4, время: 19:29.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.