Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

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

 
Опции темы

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

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

Спасибо за код! Подскажите, пожалуйста, где в нем теперь этот режим сна изменяется (какая это строка)? К сожалению, в программировании я «чайник», поэтому многие казалось бы очевидные для Вас вещи мне непонятны!
Тестировал и старый и новый код на Attiny13A и обнаружил в них одинаковый «баг» - контроллер «пропускает» первое короткое нажатие кнопки! Я несколько раз пробовал уменьшать значения в строке
PHP код:
#define shortkey  0x80    //80 . Константа - минимум для короткого нажатия 
Дошел даже до значения 0x10, и все равно первое нажатие контроллер словно не замечает! На второе и т.д. реагирует (вкл./выкл.) светодиод! Непонятно почему так происходит?
И ещё мне интересно, можно ли все-таки сделать так, чтобы при включении контроллер по умолчанию был в режиме Power Down и выходил из него только после нажатия кнопки, включающей подсветку???

То есть алгоритм примерно такой:

Подача питания --› контроллер сразу уходит в Power Down
Если кнопка нажата --› выход из спящего режима и включение подсветки
Повторное нажатие --› выкл. подсветки и уход в «спячку» снова.
Реклама:
prosto_andriy вне форума  
Непрочитано 11.02.2015, 00:04  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от prosto_andriy Посмотреть сообщение
где в нем теперь этот режим сна изменяется (какая это строка)?
MCUCR=0x20; //Idle Mode interrupt by level
в обработке внешнего прерывания.

Сообщение от prosto_andriy Посмотреть сообщение
И ещё мне интересно, можно ли все-таки сделать так, чтобы при включении контроллер по умолчанию был в режиме Power Down и выходил из него только после нажатия кнопки, включающей подсветку???
Чтоб не переписывать инит, вынес "колыбельную" в отдельную подпрограмму.
Ловите.

Сообщение от prosto_andriy Посмотреть сообщение
То есть алгоритм примерно такой:
Подача питания --› контроллер сразу уходит в Power Down
Если кнопка нажата --› выход из спящего режима и включение подсветки
Повторное нажатие --› выкл. подсветки и уход в «спячку» снова.
А давайте я вам подскажу как, а Вы сделаете сами?
Так же интересней.
Вложения:
Тип файла: zip t13_PWM+Key.zip (2.5 Кб, 28 просмотров)
omercury вне форума  
Сказали "Спасибо" omercury
prosto_andriy (11.02.2015)
Непрочитано 11.02.2015, 01:50  
prosto_andriy
Временная регистрация
 
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
prosto_andriy на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от omercury Посмотреть сообщение
А давайте я вам подскажу как, а Вы сделаете сами?
Так же интересней.
Да, Вы правы!

Попробовал новый код! Теперь контроллер действительно «засыпает» сразу же при включении! «Просыпается» от прикосновения к кнопке и потребляет в таком режиме около 3мА!!! Затем, если кнопку не трогать, через заданное время опять «засыпает»!

Но я решил сэкономить и этих насколько миллиампер ...
...и добавил в функцию «led_on_off(void)» созданную Вами подпрограмму «I_Want_Sleep();». Получилось так:
PHP код:
void    led_on_off(void)
{
    if  (PWM_on)                //Если флаг установлен (включен)
    {    
        tmpPWM = OCR0A;  
        OCR0A=0xFF;              //Гасим свет
        PWM_on = 0;             //Сбросили флаг
        I_Want_Sleep();       // переводим микроконтроллер в Power Down Mode
    }
    else                        //А если выключен - включить
    {     
        OCR0A=tmpPWM;//PWM_start;         //Включаем
        PWM_on = 1;             //Установили флаг   
    }                                               
} 
Однако компилятор почему-то не понимает, чего я хочу, и выдает что-то вроде «undefined symbol “ I_Want_Sleep ”»
Подскажите пожалуйста, что ему не нравится???
prosto_andriy вне форума  
Непрочитано 11.02.2015, 02:51  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от prosto_andriy Посмотреть сообщение
Но я решил сэкономить и этих насколько миллиампер ...
...и добавил в функцию «led_on_off(void)»
Экспериментатор...
Мк-то будет уходить в powerdown, но заодно с собой и подсветку утянет, так как в этом режиме сна почти ничего не работает, даже основной генератор (у watchdog-а свой низкочастотный), собственно поэтому и внешнее прерывание по перепаду не детектируется. ШИМа уже не будет...
А сейчас МК спит всё свободное время в режиме Idle.

Сообщение от prosto_andriy Посмотреть сообщение
Подскажите пожалуйста, что ему не нравится???
Подпрограмма находится ниже по тексту, чем её вызов. Компилятор ещё не знает о её существовании.
Переместите её выше по тексту.
(ничего хорошего от этого не будет, но зато поэкспериментируете.
Миниатюры:
Нажмите на изображение для увеличения
Название: Image1.jpg
Просмотров: 32
Размер:	37.8 Кб
ID:	75668  
omercury вне форума  
Непрочитано 11.02.2015, 16:39  
prosto_andriy
Временная регистрация
 
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
prosto_andriy на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от omercury Посмотреть сообщение
Подпрограмма находится ниже по тексту, чем её вызов. Компилятор ещё не знает о её существовании.
Переместите её выше по тексту.
Если поставить повыше то возникает проблема "яйца и курицы"! То компилятор жалуется, что он не знает о функции "I_Want_Sleep();", то о функции "led_on_off();"

Чтобы было нагляднее, почему так происходит:

PHP код:
void I_Want_Sleep(void)
{
        systemClock = 0;   
        PWM_on = 1;
        led_on_off();       
    TCCR0B=0;   //Disable timer
    MCUCR=0x30; //PowerDown Mode interrupt by level 
    GIMSK=0x40; //Enable External Interrupt-0
    #asm("sleep")           //Усыпляем МК  
}
//Включение/выключение фонаря
void    led_on_off(void)
{
    if  (PWM_on)                //Если флаг установлен (включен)
    {    
        tmpPWM = OCR0A;  
        OCR0A=0xFF;              //Гасим свет
        PWM_on = 0;             //Сбросили флаг
        I_Want_Sleep();       // переводим микроконтроллер в Power Down Mode
    }
    else                        //А если выключен - включить
    {     
        OCR0A=tmpPWM;//PWM_start;         //Включаем
        PWM_on = 1;             //Установили флаг   
    }                                               
} 
И как объяснить компилятору, что делать???
prosto_andriy вне форума  
Непрочитано 11.02.2015, 16:48  
STM32F0
Заблокирован
 
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
STM32F0 на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

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

Сообщение от STM32F0 Посмотреть сообщение
Объявите прототипы функций.
Это оно конечно, НО:
Код:
void I_Want_Sleep(void)
{
        led_on_off();       
}

void    led_on_off(void)
{
        I_Want_Sleep();       // переводим микроконтроллер в Power Down Mode                                             
}
Интересно, через сколько микросекунд стек затрёт регистры?
omercury вне форума  
Непрочитано 11.02.2015, 22:31  
prosto_andriy
Временная регистрация
 
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
prosto_andriy на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Если написать так:
PHP код:
void    led_on_off(void);

void I_Want_Sleep(void)
{
        systemClock = 0;   
        PWM_on = 1;
        led_on_off();       
    TCCR0B=0;   //Disable timer
    MCUCR=0x30; //PowerDown Mode interrupt by level 
    GIMSK=0x40; //Enable External Interrupt-0
    #asm("sleep")           //Усыпляем МК  
}
//Включение/выключение фонаря
void    led_on_off(void)
{
    if  (PWM_on)                //Если флаг установлен (включен)
    {    
        tmpPWM = OCR0A;  
        OCR0A=0xFF;              //Гасим свет
        PWM_on = 0;             //Сбросили флаг
        I_Want_Sleep();       // переводим микроконтроллер в Power Down Mode
    }
    else                        //А если выключен - включить
    {     
        OCR0A=tmpPWM;//PWM_start;         //Включаем
        PWM_on = 1;             //Установили флаг   
    }                                               
} 
...то вылазит сообщение "Linker warning .... function "I_Want_sleep" not used in data stack usage calculation due to possitive recursive calls
prosto_andriy вне форума  
Непрочитано 11.02.2015, 22:35  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

prosto_andriy, Посмотри пост omercury .
И поищи в гугль что значит рекурсия ...

А на досуге здесь почитай http://lurkmore.to/%D0%A0%D0%B5%D0%B...81%D0%B8%D1%8F
__________________
Осторожно , злой кот
dosikus вне форума  
Непрочитано 11.02.2015, 23:46  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?

Сообщение от prosto_andriy Посмотреть сообщение
Если написать
А если прочитать, что Вам написали?
Недалеко, на этой странице.

Вы читать-то умеете?
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, время: 14:49.


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