Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
10.02.2015, 18:44
|
|
Временная регистрация
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Спасибо за код! Подскажите, пожалуйста, где в нем теперь этот режим сна изменяется (какая это строка)? К сожалению, в программировании я «чайник», поэтому многие казалось бы очевидные для Вас вещи мне непонятны!
Тестировал и старый и новый код на Attiny13A и обнаружил в них одинаковый «баг» - контроллер «пропускает» первое короткое нажатие кнопки! Я несколько раз пробовал уменьшать значения в строке
PHP код:
|
#define shortkey 0x80 //80 . Константа - минимум для короткого нажатия
|
Дошел даже до значения 0x10, и все равно первое нажатие контроллер словно не замечает! На второе и т.д. реагирует (вкл./выкл.) светодиод! Непонятно почему так происходит?
И ещё мне интересно, можно ли все-таки сделать так, чтобы при включении контроллер по умолчанию был в режиме Power Down и выходил из него только после нажатия кнопки, включающей подсветку???
То есть алгоритм примерно такой:
Подача питания --› контроллер сразу уходит в Power Down
Если кнопка нажата --› выход из спящего режима и включение подсветки
Повторное нажатие --› выкл. подсветки и уход в «спячку» снова.
|
|
|
|
11.02.2015, 00:04
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от prosto_andriy
|
где в нем теперь этот режим сна изменяется (какая это строка)?
|
MCUCR=0x20; //Idle Mode interrupt by level
в обработке внешнего прерывания.
Сообщение от prosto_andriy
|
И ещё мне интересно, можно ли все-таки сделать так, чтобы при включении контроллер по умолчанию был в режиме Power Down и выходил из него только после нажатия кнопки, включающей подсветку???
|
Чтоб не переписывать инит, вынес "колыбельную" в отдельную подпрограмму.
Ловите.
Сообщение от prosto_andriy
|
То есть алгоритм примерно такой:
Подача питания --› контроллер сразу уходит в Power Down
Если кнопка нажата --› выход из спящего режима и включение подсветки
Повторное нажатие --› выкл. подсветки и уход в «спячку» снова.
|
А давайте я вам подскажу как, а Вы сделаете сами?
Так же интересней.
|
|
|
Сказали "Спасибо" omercury
|
|
|
11.02.2015, 01:50
|
|
Временная регистрация
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
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 ”»
Подскажите пожалуйста, что ему не нравится???
|
|
|
|
11.02.2015, 02:51
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от prosto_andriy
|
Но я решил сэкономить и этих насколько миллиампер ...
...и добавил в функцию «led_on_off(void)»
|
Экспериментатор...
Мк-то будет уходить в powerdown, но заодно с собой и подсветку утянет, так как в этом режиме сна почти ничего не работает, даже основной генератор (у watchdog-а свой низкочастотный), собственно поэтому и внешнее прерывание по перепаду не детектируется. ШИМа уже не будет...
А сейчас МК спит всё свободное время в режиме Idle.
Сообщение от prosto_andriy
|
Подскажите пожалуйста, что ему не нравится???
|
Подпрограмма находится ниже по тексту, чем её вызов. Компилятор ещё не знает о её существовании.
Переместите её выше по тексту.
(ничего хорошего от этого не будет, но зато поэкспериментируете.
|
|
|
|
11.02.2015, 16:39
|
|
Временная регистрация
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
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; //Установили флаг
}
}
|
И как объяснить компилятору, что делать???
|
|
|
|
11.02.2015, 16:48
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Объявите прототипы функций.
|
|
|
|
11.02.2015, 21:30
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от STM32F0
|
Объявите прототипы функций.
|
Это оно конечно, НО:
Код:
|
void I_Want_Sleep(void)
{
led_on_off();
}
void led_on_off(void)
{
I_Want_Sleep(); // переводим микроконтроллер в Power Down Mode
} |
Интересно, через сколько микросекунд стек затрёт регистры?
|
|
|
|
11.02.2015, 22:31
|
|
Временная регистрация
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
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
|
|
|
|
11.02.2015, 22:35
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
prosto_andriy, Посмотри пост omercury .
И поищи в гугль что значит рекурсия ...
А на досуге здесь почитай http://lurkmore.to/%D0%A0%D0%B5%D0%B...81%D0%B8%D1%8F
__________________
Осторожно , злой кот
|
|
|
|
11.02.2015, 23:46
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от prosto_andriy
|
Если написать
|
А если прочитать, что Вам написали?
Недалеко, на этой странице.
Вы читать-то умеете?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:22.
|
|