реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> atmega88pa, отключение BOD программно
max_mart
сообщение Aug 30 2012, 10:22
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474



Всем привет.

Контроллер находится в режиме 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 программно?
Go to the top of the page
 
+Quote Post
ae_
сообщение Aug 30 2012, 13:57
Сообщение #2


Участник
***

Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695



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)
Go to the top of the page
 
+Quote Post
max_mart
сообщение Aug 30 2012, 15:04
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474



А как же ост. биты(IVSEL,IVCE,PUD)?
Ведь этот код:
MCUCR=(1<<BODS) | (1<<BODSE)
MCUCR=(1<<BODS)
может повлиять на них!?
Go to the top of the page
 
+Quote Post
ae_
сообщение Aug 30 2012, 15:25
Сообщение #4


Участник
***

Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695



a=(1<<BODS) | (1<<BODSE) | MCUCR
b=(1<<BODS) | MCUCR
MCUCR=a
MCUCR=b
Go to the top of the page
 
+Quote Post
max_mart
сообщение Aug 30 2012, 16:24
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474



Цитата(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. - какие инструкции по усыпанию должны быть выполнены?
Go to the top of the page
 
+Quote Post
ae_
сообщение Aug 30 2012, 17:10
Сообщение #6


Участник
***

Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695



Цитата(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.
Go to the top of the page
 
+Quote Post
max_mart
сообщение Aug 30 2012, 17:33
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474



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

понял спасибо. Завтра напишу о результате.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 30 2012, 20:29
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (max_mart @ Aug 30 2012, 18:04) *
А как же ост. биты(IVSEL,IVCE,PUD)?
По поводу IVSEL вы сами разобрались, а по поводу PUD - в большинстве практических случаев его желаемое значение известно программисту на момент компиляции, так что же мешает вставить его сразу в эти команды записи, чтобы не вычитывать из регистра снова и снова?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
max_mart
сообщение Aug 31 2012, 16:01
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474



Все спасибо работает. Токопотребление вместе с вотч-дог - 7 мкА biggrin.gif
Сегрей Борщ, и что это даст?Отключение всех внктренних подтяжек??? А если они нужны???Например в системе с низким потребелением, как у меня, сам атмел пишит, что все неиспользуемые ножки должны быть подтянуты к +!

Сообщение отредактировал max_mart - Aug 31 2012, 16:02
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Sep 1 2012, 00:57
Сообщение #10


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(max_mart @ Aug 31 2012, 19:01) *
Например в системе с низким потребелением, как у меня, сам атмел пишит, что все неиспользуемые ножки должны быть подтянуты к +!

Хорошо пишут, чтоб мороки узеру не было. А используемые? sm.gif Там же их включать выключать надо, если они нужны..
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 1 2012, 05:26
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 01:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01425 секунд с 7
ELECTRONIX ©2004-2016