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

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

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

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

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

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

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

 
Опции темы
Непрочитано 09.02.2015, 20:41  
МВА
Гражданин KAZUS.RU
 
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
МВА на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от prosto_andriy Посмотреть сообщение
Насчет старшего полубайта я наконец-то понял
если написать так:
PHP код:
while (1)
      {    
            if  (
KeyEXE)
            {  
                
MCUCR=0x10;  //  бит "спящего режима" SE (Sleep Enable)  ставим в ноль, чтобы контроллер мог "проснуться"
                
key_scan();
            }  
            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")           //Усыпляем МК  
            
}
      }

то контроллер нормально просыпается при нажатии кнопки!!!

В общем, с авто-засыпанием и пробуждением проблема наконец-то решилась!
Однако я хочу сделать так, чтобы при подаче питания контроллер по умолчанию был в Power Down Mode и просыпался лишь при нажатии кнопки!
Написал вот так, но он не просыпается!!!
PHP код:
while (1)
      {    
          
MCUCR=0x30;
          
#asm("sleep")
            
if  (KeyEXE)
            {  
                
MCUCR=0x10;
                
key_scan();
            }  
            if  (
systemClock › secundes)
            {
                
systemClock 0;   
                                
PWM_on 1;
                                
led_on_off();       
                
TCCR0B=0;   //Disable timer
                
MCUCR=0x30;   // -----
                
GIMSK=0x40//Enable External Interrupt-0
                #asm("sleep")           //Усыпляем МК  
            
}
      }

Если добавить строку разрешающую прерывания:
PHP код:
while (1)
      {    
                
MCUCR=0x30;   // -----
                
GIMSK=0x40//Enable External Interrupt-0
                #asm("sleep")
            
if  (KeyEXE)
            {   
                
                
MCUCR=0x10;
                
key_scan(); 
                
             }  
            if  (
systemClock › secundes)
            {
                
systemClock 0;   
                                
PWM_on 1;
                                
led_on_off();       
                
TCCR0B=0;   //Disable timer
                
MCUCR=0x30;   // -----
                
GIMSK=0x40//Enable External Interrupt-0
                #asm("sleep")           //Усыпляем МК  
            
}
      } 
то происходит вообще непонятно что - контроллер то реагирует на кнопку, то нет : такое вчечатление, что он запутался
может кто-нибудь подскажет почему так происходит

Доброго времени суток всем.
Извините, но я давно не писал на Си, но с первого взгляда у меня появились замечания. Я не понял зачем усыплять контроллер в самом начале главного цикла. И в спящий режим лучше переводить контроллер, когда фонарь выключен по истечении нескольких секунд, а по прерыванию производить включение фонаря, и если кнопка нажата более какого-то времени - производить управление яркостью. Прикладываю, если у кого-то нет, для наглядности описание управления спящим режимом. И еще одно. Для таких целей, как фонарь, зачем использовать частоту в 8 Мгц и кварц. Вполне достаточно и внутреннего генератора на 1 Мгц.
Вложения:
Тип файла: doc Doc1.doc (207.0 Кб, 43 просмотров)
Реклама:

Последний раз редактировалось МВА; 09.02.2015 в 20:46.
МВА вне форума  
Непрочитано 09.02.2015, 22:15  
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от prosto_andriy Посмотреть сообщение
то происходит вообще непонятно что - контроллер то реагирует на кнопку, то нет : такое вчечатление, что он запутался
может кто-нибудь подскажет почему так происходит
Да поменяйте просто местами
PHP код:
                GIMSK=0x40//Enable External Interrupt-0 
и
PHP код:
                MCUCR=0x30;   // ----- 
То есть сначала включите внешнее прерывание, а потом отправляйте МК в Power Down.
omercury вне форума  
Непрочитано 09.02.2015, 22:35  
prosto_andriy
Временная регистрация
 
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
prosto_andriy на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от МВА Посмотреть сообщение
Я не понял зачем усыплять контроллер в самом начале главного цикла.
Да, действительно Вы правы - я эти строки не туда вставил – не сообразил сначала, что while (1) это ведь бесконечный цикл (пока контроллер включен он его и отрабатывает)! Нужно, наверное было их в void main(void) запихнуть! Или нет?

Последний раз редактировалось prosto_andriy; 09.02.2015 в 22:46.
prosto_andriy вне форума  
Непрочитано 10.02.2015, 00:01  
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от prosto_andriy Посмотреть сообщение
Да, действительно Вы правы
Неправ.

Вы условия посмотрели, при которых выполняются те участки кода?


Хотя...
Пока сами по всем граблям не пройдёте, ничему не научитесь.
omercury вне форума  
Непрочитано 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  
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию 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, он туда не войдёт...
omercury вне форума  
Непрочитано 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  
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

prosto_andriy, У Вас в начале файла есть определения:
Код:
#define shortkey  0x80    //80 . Константа - минимум для короткого нажатия
#define longkey   0xFE    //240. Константа - минимум для длинного нажатия
#define PWM_del   0x0A    //15.  Константа задержки изменения яркости
Константа shortkey определяет, колько раз таймер должен досчитать до переполнения (256 тиков), чтобы считать нажатие коротким. Это время равно 1,71мс*128=218 миллисекундам(0,218 секунды), всё, что короче, считается дребезгом. Поиграйте этой константой.
omercury вне форума  
Непрочитано 10.02.2015, 13:54  
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от МВА Посмотреть сообщение
А цикл начинается:
while (1)
У кого?

Я вообще-то про свой код, исходный.
prosto_andriy там "управил" - только держись...
omercury вне форума  
Непрочитано 10.02.2015, 14:35  
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

prosto_andriy, держите исправленный вариант.
Мы с Вами забыли при "побудке" изменить режим сна и он на первом же цикле таймера
уходил в глубокий даун не включив внешнее прерывание.
Вложения:
Тип файла: zip t13_PWM+Key.zip (2.4 Кб, 25 просмотров)

Последний раз редактировалось omercury; 10.02.2015 в 15:02.
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, время: 18:19.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot