Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
08.02.2015, 20:57
|
|
Временная регистрация
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от Saadov
|
Посмотрите в Helpe CVAVR, нужно сначала разрешить сон - sleep_enable()
|
Да вообще-то и файл ‹sleep.h› наверно тут лишний! Только что обратил внимание - микроконтроллер ведь отправляется в спячку ассемблерной командой Думаю, дело в том, что разрешение на "спячку" просто не установлено в соответствующем регистре!
У ATtiny13A это регистр MCUCR, если я не ошибаюсь! Так вот, чтобы мелкосхема могла "крепко засыпать" (уходить в POWER DOWN MODE) нужно написать
Я просмотрел весь код и нашел такую строку:
PHP код:
|
MCUCR=2; //Rising Edge generate interrupt
|
Вот теперь сижу думаю...
|
|
|
|
08.02.2015, 23:49
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от prosto_andriy
|
нашел такую строку:
|
Ну таки да, реакция на внешнее прерывание по положительному перепаду на соответствующем пине. Другая "побудка" происходит каждый раз по переполнению таймера, далее идёт опрос кнопки, если пришло время, то включение/выключение либо изменение периода ШИМ, а после этого опять здоровый сон (но не крепкий) до следующего переполнения таймера. Когда срабатывает пятнадцатиминутная задержка, отключается таймер и МК переходит в сон.
Внешнее прерывание задействовано именно для пробуждения МК из отключенного состояния после таймаута. Программно ничего не оптимизировалось в плане энергопотребления. Попробуйте принудительно отключить все устройства внутри МК, перевести все выводы в высокоимпедансное состояние, использовать драйвер "люстры" с активным "0".
Да, из powerdown МК выводится только аппаратным сбросом, собакой и внешним прерыванием по уровню (а не по перепаду) - как раз Ваш случай.
|
|
|
|
09.02.2015, 00:05
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.11.2008
Адрес: г.Смоленск
Сообщений: 2,018
Сказал спасибо: 348
Сказали Спасибо 1,024 раз(а) в 552 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от prosto_andriy
|
Да вообще-то и файл ‹sleep.h› наверно тут лишний! Только что обратил внимание - микроконтроллер ведь отправляется в спячку ассемблерной командой
|
Вам шашечки или ехать?
‹sleep.h›
...
sleep_enable();
powerdown();
Цитата:
|
void sleep_enable(void)
this function enables entering the low power consumption modes.
|
Цитата:
|
void powerdown(void)
this function puts the AVR chip in the powerdown mode.
Prior to using this function, the sleep_enable function must be invoked to allow entering the low power consumption modes.
In this mode the external oscillator is stopped.
The AVR can wake up only from an external reset, Watchdog time-out or external level triggered interrupt.
|
Хотите #asm("sleep")?
Настройте режимы сна
Последний раз редактировалось Saadov; 09.02.2015 в 00:08.
|
|
|
|
09.02.2015, 00:12
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от omercury
|
перевести все выводы в высокоимпедансное состояние
|
Может наоборот?
|
|
|
|
09.02.2015, 00:57
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от STM32F0
|
Может наоборот?
|
Дайте поумничать-то?
А и правда, их всё-таки есть возможность в Hi-Z поставить...
|
|
|
|
09.02.2015, 02:31
|
|
Временная регистрация
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от omercury
|
... использовать драйвер "люстры" с активным "0".
|
Впервые о таком слышу! Объясните пожалуйста, что Вы имеете в виду, если не сложно!
Сообщение от omercury
|
...из powerdown ... внешним прерыванием по уровню (а не по перепаду) - как раз Ваш случай.
|
Я заменил стоку:
на
Теперь ATtiny13A наконец-то стала "засыпать" (уходить в Power Down Mode) после заданного времени на авто-отключение подсветки! Но вот "просыпаться" она никак не желает! Ни от коротких нажатий, ни от длинных!
Уровень ведь при нажатии кнопки на порту PINB.1 меняется с 1 на ноль! Почему же тогда микроконтроллер не просыпается???
Последний раз редактировалось prosto_andriy; 09.02.2015 в 02:33.
|
|
|
|
09.02.2015, 02:56
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
|
|
|
|
09.02.2015, 05:35
|
|
Временная регистрация
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Посмотрел табличку в даташите ATtiny13A
Если выставлять биты по ней то для INT0 по низкому уровню там ведь должны стоять нули? Не так ли?
Поэтому я и поставил ноль в правой части Ведь вывести ATtiny13 из "глубокой спячки" (то есть из POWER DOWN) можно только таким прерыванием (не считая ресета и сторожевого таймера)! Или я ошибаюсь?
И это прерывание работает только с выводом INT0 (это ведь B1), к которому и подключена кнопка
PHP код:
|
#define KeyPress (!PINB.1) //Вход кнопки
#define led_on (PORTB.0)
|
Так почему же оно не работает?
|
|
|
|
09.02.2015, 12:16
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Сообщение от prosto_andriy
|
Если выставлять биты по ней то для INT0 по низкому уровню там ведь должны стоять нули? Не так ли?
|
Да, действительно так.
Сообщение от prosto_andriy
|
Или я ошибаюсь?
|
Нет, не ошибаетесь.
Сообщение от prosto_andriy
|
Поэтому я и поставил ноль в правой части
|
С младшим ниблом согласен.
Посмотрите пожалуйста внимательно, что именно Вы должны были туда записать, чтоб перевести МК в Power Down Mode, но не включать этот режим немедленно.
|
|
|
|
09.02.2015, 18:48
|
|
Временная регистрация
Регистрация: 25.06.2013
Сообщений: 58
Сказал спасибо: 25
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Как отследить короткое и продолжительное нажатие кнопки в фонаре?
Насчет старшего полубайта я наконец-то понял
если написать так:
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") //Усыпляем МК } }
|
то происходит вообще непонятно что - контроллер то реагирует на кнопку, то нет : такое вчечатление, что он запутался
может кто-нибудь подскажет почему так происходит
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:17.
|
|