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

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

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

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

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

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

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

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

Сообщение от МВА Посмотреть сообщение
ЭТИ ДВЕ СТРОЧКИ, ЭТО ОДНО И ТОЖЕ.
Я в курсе, просто так нагляднее.

Сообщение от МВА Посмотреть сообщение
PS. В проекте у omercury есть ошибка TIMSK0=0x02;//Timer Overflow Interrupt (надо инициализировать число 0x01) иначе не будет прерывания по переполнению.
Да ну?
Миниатюры:
Нажмите на изображение для увеличения
Название: Image1.jpg
Просмотров: 16
Размер:	17.5 Кб
ID:	76482  
Реклама:
omercury вне форума  
Непрочитано 07.03.2015, 23:28  
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

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

Сообщение от МВА Посмотреть сообщение
Мы говорим о записи в TCNT в прерывании о переполнении.
Мы говорим о прерывании по внешнему сигналу.
Я уже написал, что В ДАННОМ ПРИЛОЖЕНИИ сброс счетчика делать не обязательно, но если хочется, то лучше сделать это до включения таймера.
omercury вне форума  
Непрочитано 07.03.2015, 23:52  
prosto_andriy
Временная регистрация
 
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
prosto_andriy на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от omercury Посмотреть сообщение
delay_ms(2000);
Да, Вы правы, только вначале нужно убрать два слеша перед строкой
PHP код:
//#include ‹delay.h› 
Возможно, я задаю очень глупый вопрос, но можно ли обойтись в данном случае без delay_ms ??? Можно ли отсчитать те несколько секунд тем же таймером?
prosto_andriy вне форума  
Непрочитано 08.03.2015, 00:09  
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от prosto_andriy Посмотреть сообщение
Возможно, я задаю очень глупый вопрос, но можно ли обойтись в данном случае без delay_ms ??? Можно ли отсчитать те несколько секунд тем же таймером?
Безусловно.
Замените эти две процедуры:
PHP код:
//Включение/выключение подсветки
void    BACKLIGHT_on_off(void)
{
    if  (
BACKLIGHT_on)                //Если флаг установлен (включен)
    
{    
        
led_on 0;//выключить светодиод
        
BACKLIGHT_on 0//сбросить флаг его включения
        
systemClock secundes 2;    //Здесь вбить желаемое количество секунд задержки, сейчас 2
    
}
    else                        
//А если выключен - включить
    
{   
        
led_on 1;      // включить светодиод
        
BACKLIGHT_on 1;  // установить флаг включения   
    
}                                               
}


void I_Want_Sleep(void)
{
    
systemClock 0;
    
TCCR0B=0;                           //Disable timer
    
MCUCR=0x30;                         //PowerDown Mode interrupt by level
    
GIMSK=0x40;                         //Enable External Interrupt-0
    #asm("sleep")           //Усыпляем МК  

omercury вне форума  
Сказали "Спасибо" omercury
prosto_andriy (08.03.2015)
Непрочитано 08.03.2015, 01:36  
prosto_andriy
Временная регистрация
 
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
prosto_andriy на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

В это трудно поверить, но светодиод не включается, хотя все остальные функции работают!!! Проверял мультиметром!
В общем:
1. После подачи питания контроллер в "глубокую спячку" уходит!
2. После нажатия кнопки тоже начинает "дремать" (потребляя 3 мА, а не 6 мА)
3. Через указанное время (константа secundes) "засыпает" (ток становится меньше 0,5 мA)!

Но светодиод НЕ включается!!! Вот код
Если же убрать слеши перед строкой
PHP код:
//TCCR0A |= ((1‹‹COM0A1)|(1‹‹COM0A0)); //Зашибись, а ножку Пушкин подключит? 
то светодиод зажигается даже от едва заметного касания кнопки, и кнопкой уже не выключается!!! Гаснет только через заданное время

И ещё несколько нюансов чтобы не ждать 15 минут, через которые светодиод должен выключиться я изменил строку (поставил 10 вместо 900)
PHP код:
#define secundes 10    // количество секунд для автоотключения 
Также в начале проги ввел еще одну константу
PHP код:
#define button_delay 2 // задержка (секунд) 
которая используется здесь:
PHP код:
systemClock secundes button_delay;    //Здесь вбить желаемое количество секунд задержки 
Вложения:
Тип файла: txt Tiny13_button_and_LED_CORRECTED.txt (5.2 Кб, 34 просмотров)

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

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

Сообщение от prosto_andriy Посмотреть сообщение
В это трудно поверить, но светодиод не включается
Есть замечания по функции Key_scan:
//Сканирование кнопки
void key_scan(void)
{


if KeyPress //Если кнопка нажата. ЕСЛИ КНОПКА НАЖАТА МЫ ВОШЛИ В ЭТУ ФУНКЦИЮ
{
count++; //Увеличиваем счётчик задержки. ПОСЛЕ ИНКРЕМЕНТА, ЕСЛИ СЧЕТЧИК НЕ ДОСТИГ МЫ ПРОПУСКАЕМ ЭТУ ИНСТРУКЦИЮ
if (count›longkey) //Если длинное нажатие
{
BACKLIGHT_on_off();
count--; // "замораживаем" значение счетчика
} //Выход

else
{
count=0; // сбрасываем счетчик
} //Выход

systemClock = 0; //Сброс таймаута выключения подсветки.
}

else // если кнопка не нажата...
{#asm("sleep")} // ...микроконтроллер "засыпает"
}

1. В третьей строке отсутствуют круглые скобки в условии, поэтому, есть подозрение, что функция выполняется всегда, когда есть разрешение опроса (KeyEXE=1), в первом проходе включит, а во втором заснет.
2. переменная count увеличивается в цикле, а не в прерывании, поэтому она достигнет макс. значения за миллисекунды, особенно, если учесть, что переменная - unsigned char. Поэтому длинного нажатия кнопки - просто не может быть.

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

Сообщение от МВА Посмотреть сообщение
2. переменная count увеличивается в цикле, а не в прерывании, поэтому она достигнет макс. значения за миллисекунды, особенно, если учесть, что переменная - unsigned char. Поэтому длинного нажатия кнопки - просто не может быть.
Ага, кто-то убрал сброс флага разрешения опроса кнопки.
Кто бы это мог быть?
omercury вне форума  
Непрочитано 08.03.2015, 14:51  
МВА
Гражданин KAZUS.RU
 
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
МВА на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от omercury Посмотреть сообщение
Ага, кто-то убрал сброс флага разрешения опроса кнопки.
Кто бы это мог быть?
Только что прогнал пошагово в AVR Studio, правда для этого пришлось переделать кучу инициализаций, и вот что увидел:
После инкремента, если условие не выполняется, тогда выполняется else и переменная снова сбрасывается. Поэтому она не должна никогда достигнуть своего значения.
Кстати, следом сбрасывается и systemClock. И если отпускаем кнопку, то сразу выполняется команда, без предварительной подготовки #asm("sleep")

Последний раз редактировалось МВА; 08.03.2015 в 15:01.
МВА вне форума  
 

Закладки
Опции темы

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

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, время: 16:27.


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