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

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

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

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

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

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

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

Ответ
Опции темы

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

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

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

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

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

Сообщение от МВА Посмотреть сообщение
Мы говорим о записи в TCNT в прерывании о переполнении.
Мы говорим о прерывании по внешнему сигналу.
Я уже написал, что В ДАННОМ ПРИЛОЖЕНИИ сброс счетчика делать не обязательно, но если хочется, то лучше сделать это до включения таймера.
omercury вне форума   Ответить с цитированием
Непрочитано 07.03.2015, 23:52   #374
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   #375
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
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   #376
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   #377
МВА
Гражданин KAZUS.RUN
 
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 841
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
МВА на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от omercury Посмотреть сообщение
Да ну?
Прошу прощения, я просто перепутал маску и число.
МВА вне форума   Ответить с цитированием
Непрочитано 08.03.2015, 13:23   #378
МВА
Гражданин KAZUS.RUN
 
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 841
Сказал спасибо: 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   #379
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от МВА Посмотреть сообщение
2. переменная count увеличивается в цикле, а не в прерывании, поэтому она достигнет макс. значения за миллисекунды, особенно, если учесть, что переменная - unsigned char. Поэтому длинного нажатия кнопки - просто не может быть.
Ага, кто-то убрал сброс флага разрешения опроса кнопки.
Кто бы это мог быть?
omercury вне форума   Ответить с цитированием
Непрочитано 08.03.2015, 14:51   #380
МВА
Гражданин KAZUS.RUN
 
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 841
Сказал спасибо: 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, время: 05:32.


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