Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





ГЛАВА 14
Режимы энергосбережения и сторожевой таймер

Перечисленные в главе 4 режимы энергосбережения нужны для того, чтобы экономить питание. Применять их следует при питании от автономного источника— как правило, любой МК большую часть времени простаивает в ожидании событий. Например, процедура динамической индикации (см. главу 8), повторяющаяся с частотой сотни герц, сама по себе выполняется всего за несколько десятков микросекунд, т. е. занимает сотые доли общего времени работы МК и даже меньше. Если считать, что в активном режиме МК потребляет порядка 10-15 мА, то ввод его в режим энергосбережения в паузах между событиями позволяет снизить суммарное потребление до -100 мкА и повысить временной ресурс работы схемы в сотни раз.

Но правильно организовать работу МК в режиме энергосбережения не так-тО просто. Следует учитывать внешние соединения — один забытый в "нулевом состоянии" выход с подсоединенным подтягивающим резистором способен испортить всю картину. Переключение всех выводов на вход также может не дать нужного эффекта, если часть из них "висит в воздухе" — наводки будут переключать входную логику (если она не отключена) и тем самым повышать потребление. Отключение логики происходит автоматически при вводе в режим энергосбережения, но не для всех контактов — остаются включенными, например, выводы внешних прерываний, если они разрешены в программе, а также некоторые другие, если они используются в режиме альтернативных функций. Следует также не забывать выключать аналоговый компаратор, который включен по умолчанию.

Не имеет большого смысла заниматься энергосбережением, если у вас в схеме имеются другие элементы с большим потреблением, которые невозможно отключить. Большинство рассмотренных нами в предыдущих главах стандартных устройств, ориентированных на подключение к МК (EEPROM, часы, flash-карты, современные преобразователи уровня RS-232), автоматически (или по команде извне) устанавливаются в режим пониженного энергопотребления, когда находятся в ожидании команд. Но могут быть и компоненты, для отключения которых приходится изобретать специальные способы, и далее мы рассмотрим подобный пример. Нужно учитывать и нюансы внутренней работы МК. Скажем, когда вы посылаете байт через UART, то собственно передача после окончания операции записи в регистр данных начнет выполняться аппаратно, и может длиться порядка миллисекунды, в то время как GPU уже формально свободен для других операций. Если в этот момент ввести МК в режим энергосбережения, то вместе со всеми остальными модулями выключится и UART, и передача не будет выполнена. Поэтому в таком случае следует либо организовать задержку выключения, либо (что более грамотно) использовать прерывание "передала завершена" (ТХ complete), либо просто в цикле ожидать, пока бит тхс регистра UCSRA не окажется в состоянии логической единицы

Программирование режима энергосбережения
Само по себе программирование режима энергосбережения — без учета всех отмеченных нюансов — очень простое. Некоторую сложность здесь представляет только выбор режима из-за того, что в разных моделях МК AVR управляющие биты SMx (в младших Tiny и в семействе Classic всего один такой бит SM, выбирающий между двумя режимами Idle и Power Down, в остальных их больше) "разбросаны" по разным регистрам, и приходится смотреть в описание, чтобы не ошибиться. В большинстве младших моделей Mega, а также в Tiny и Classic, эти биты находятся в регистре MCUCR, том же, который отвечает за внешние прерывания. Но вот, например в ATmega8515 (в отличие от сделанного на его же основе ATmega8535, где также один регистр MCUCR), три бита SMO. .2 разбросаны по трем регистрам MSUCR, MCUCSR И EMCUCR. Есть и другие варианты: в ATmegal6 все эти биты также в одном регистре MCUCR, НО бит SM2 почему-то поменялся местами с битом разрешения sleep-режима SE.

По умолчанию все биты установки Sleep Mode, сколько их есть (три SMO. .2, два SMO. л или один SM), установлены в нулевое состояние, что означает режим Idle. Тогда достаточно установить бит разрешения SE (ОН-ТО всегда находится в регистре MCUCR) И вызвать команду sleep. Как мы помним из глав 4 и 6, команду sleep нельзя вызывать из прерывания (она попросту не сработает). Инструкция рекомендует устанавливать бит разрешения непосредственно перед вызовом команды sleep: фактически это предохранитель, как и в некоторых других случаях (см., например, запись в EEPROM или обращение со сторожевым таймером далее), дублирование одной и той же операции во избежание самопроизвольного "ухода" МК в спящее состояние при наличии помех. Обратите внимание, что первым делом после выхода из режима "сна" выполнится обработчик прерывания, "разбудившего" компьютер, а после него — команда, следующая после sleep.

На практике чаще всего применяют общий для всех моделей МК режим Power Down. Он определяется установкой бита SMI (либо SM, если бит установки единственный) в единичное состояние. Удобен режим Standby (в тех МК, где он доступен), когда тактовый генератор продолжает работать, и потому для выхода из состояния "сна" требуется гораздо меньше времени — всего шесть машинных циклов, в то время как выход из режима Power Down по времени аналогичен запуску МК после сброса (см. главу 2).



     
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru