|
|
  |
atmega88pa, отключение BOD программно |
|
|
|
Aug 30 2012, 10:22
|
Местный
  
Группа: Участник
Сообщений: 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 программно?
|
|
|
|
|
Aug 30 2012, 13:57
|
Участник
  
Группа: Свой
Сообщений: 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)
|
|
|
|
|
Aug 30 2012, 16:24
|
Местный
  
Группа: Участник
Сообщений: 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. - какие инструкции по усыпанию должны быть выполнены?
|
|
|
|
|
Aug 30 2012, 17:10
|
Участник
  
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Aug 30 2012, 17:33
|
Местный
  
Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474

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

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|