Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: atmega88pa
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
max_mart
Всем привет.

Контроллер находится в режиме power-down. Просыпается по вотч-догу, настроенному только на прерывание, каждые 0.5 с. и по срабатыванию одной из 3 кнопок PCINT. При выключенном BOD и включенном вотч-доге потребление питания составляет 6 мкА, как в даташите.
Но не хотелось бы выключать супервизор(если он все время включен, то питание 25 мкА). В даташите написано, что его можно выключать программно на время пребывания в спящем режиме и затем он сам автоматически включится(когда контроллер проснется), если во фьюзах он включен(при этом он будит кушать около 3,3 мкА ).
Для этого есть специальные команды. И их надо использовать в конце каждого прерывания, чтобы выключить BOD.
Я использовал 3 варианта, но ни один не заработал!(
Команды:
1)
MCUCR |= (1<MCUCR |= (1<SMCR = 0b00000101; // enable sleep mode (power-down mode)
2)
MCUCR |= (1<MCUCR &=(~(1<SMCR = 0b00000101; // enable sleep mode (power-down mode)
3)
MCUCR |= 0b01100000;
MCUCR &= 0b11011111;
SMCR = 0b00000101; // enable sleep mode (power-down mode)
Подскажите, пожалуйста, в чем может быть причина не отключения BOD программно?
ae_
Writing to the BODS bit is controlled by a timed sequence and an enable bit, BODSE in MCUCR. To disable BOD in relevant sleep modes, both BODS and BODSE must first be set to one. Then, to set the BODS bit, BODS must be set to one and BODSE must be set to zero within four clock cycles.
Код
MCUCR=(1<<BODS) | (1<<BODSE)
MCUCR=(1<<BODS)
max_mart
А как же ост. биты(IVSEL,IVCE,PUD)?
Ведь этот код:
MCUCR=(1<<BODS) | (1<<BODSE)
MCUCR=(1<<BODS)
может повлиять на них!?
ae_
a=(1<<BODS) | (1<<BODSE) | MCUCR
b=(1<<BODS) | MCUCR
MCUCR=a
MCUCR=b
max_mart
Цитата(ae_ @ Aug 30 2012, 19:25) *
a=(1<<BODS) | (1<<BODSE) | MCUCR
b=(1<<BODS) | MCUCR
MCUCR=a
MCUCR=b

Прошу прощения!! Прочитал внимательнее даташит - не повляяет! Чтобы сместить вектора прерываний в конец там надо сделать такую же последовательность комманд как с BOD, но только регистры IVSEL, IVCE. А PUD - должен быть установлен в 1, чтобы откл. все внутр подтяжки портов.
Так что можно смело так попробовать:
MCUCR = 0b01100000;
MCUCR = 0b01000000;
Но только вопрос. Как это понимать?
The BODS bit is active three clock cycles after it is set. A sleep instruction must be executed
while BODS is active in order to turn off the BOD for the actual sleep mode. The BODS bit is
automatically cleared after three clock cycles. - какие инструкции по усыпанию должны быть выполнены?
ae_
Цитата(max_mart @ Aug 31 2012, 01:24) *
...A _sleep_ instruction must be executed... какие инструкции по усыпанию должны быть выполнены?

MCUCR=(1<<BODS) | (1<<BODSE)
MCUCR=(1<<BODS)
SLEEP // т.е. надо, чтобы МК выполнил инструкцию ассемблера SLEEP в течение 3 тактов после установки BODS.
max_mart
Цитата(ae_ @ Aug 30 2012, 21:10) *
MCUCR=(1<<BODS) | (1<<BODSE)
MCUCR=(1<<BODS)
SLEEP // т.е. надо, чтобы МК выполнил инструкцию ассемблера SLEEP в течение 3 тактов после установки BODS.

понял спасибо. Завтра напишу о результате.
Сергей Борщ
QUOTE (max_mart @ Aug 30 2012, 18:04) *
А как же ост. биты(IVSEL,IVCE,PUD)?
По поводу IVSEL вы сами разобрались, а по поводу PUD - в большинстве практических случаев его желаемое значение известно программисту на момент компиляции, так что же мешает вставить его сразу в эти команды записи, чтобы не вычитывать из регистра снова и снова?
max_mart
Все спасибо работает. Токопотребление вместе с вотч-дог - 7 мкА biggrin.gif
Сегрей Борщ, и что это даст?Отключение всех внктренних подтяжек??? А если они нужны???Например в системе с низким потребелением, как у меня, сам атмел пишит, что все неиспользуемые ножки должны быть подтянуты к +!
_Pasha
Цитата(max_mart @ Aug 31 2012, 19:01) *
Например в системе с низким потребелением, как у меня, сам атмел пишит, что все неиспользуемые ножки должны быть подтянуты к +!

Хорошо пишут, чтоб мороки узеру не было. А используемые? sm.gif Там же их включать выключать надо, если они нужны..
Сергей Борщ
QUOTE (max_mart @ Aug 31 2012, 19:01) *
Сегрей Борщ, и что это даст? Отключение всех внктренних подтяжек??? А если они нужны???
Я же написал: "его желаемое значение". Ноль это значение или единица - вы решайте сами исходя из своей задачи. Вас ведь волновало, что приведенный код изменит состояние бита. Основная мысль моего сообщения была не в конкретном бите PUD, а в том, что не нужно каждый раз вычитывать из регистра (любого) биты, значения которых и так заранее известны - на этом можно сэкономить несколько тактов и байтов кода. Вместо "&=" и "|=", немного подумав, часто можно успешно использовать "=".
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.