Сколько циклов перезаписи flash памяти гарантируется для avr микроконтроллеров
В данном разделе описываются различные виды памяти ATmega128. В соответствии с гарвардской архитектурой память AVR-микроконтроллера разделена на две области: память данных и память программ. Кроме того, ATmega128 содержит память на ЭСППЗУ для энергонезависимого хранения данных. Все три области памяти являются линейными и равномерными.
Внутрисистемно программируемая флэш-память программ ATmega128 содержит 128 кбайт внутренней внутрисистемно перепрограммируемой флэш-памяти для хранения программы. Поскольку все AVR-инструкции являются 16 или 32-разр., то флэш-память организована как 64 кбит х 16. Для программной защиты флэш-память программ разделена на два сектора: сектор программы начальной загрузки и сектор прикладной программы.
Флэш-память характеризуется износостойкостью не менее 10000 циклов запись/стирание. Программный счетчик РС у ATmega128 является 16-разр., поэтому, позволяет адресоваться к 64 кбайт памяти программ. Работа сектора программы начальной загрузки и связанных с ним бит защиты программы детально описана в разделе “Самопрограммирование из сектора начальной загрузки с поддержкой чтения во время записи”. В разделе “Программирование памяти” детально описывается параллельное программирование флэш-памяти и последовательное программирование через интерфейсы SPI, JTAG.
Таблицы констант могут располагаться в пределах всего пространства памяти программ (см. описание инструкции чтения из памяти программ LPM и расширенного чтения из памяти программ ELPM).
Временные диаграммы выборки и исполнения инструкций представлены в разделе “Временная диаграмма выполнения инструкции”.
Статическое ОЗУ памяти данных
ATmega128 поддерживает две различные конфигурации статического ОЗУ памяти данных (см. табл. 1).
Таблица 1 – Конфигурации памяти
Конфигурация | Встроенное статическое ОЗУ памяти данных | Внешнее статическое ОЗУ памяти данных |
Нормальный режим | 4096 | до 64 кбайт |
Режим совместимости с ATmega103 | 4000 | до 64 кбайт |
Рисунок 9 иллюстрирует организацию памяти на статическом ОЗУ у ATmega128.
ATmega128 – сложный микроконтроллер с большим числом периферийных устройств, которые управляются через 64 ячейки памяти, зарезервированных в кодах операций инструкций IN и OUT. Для расширенной области ввода-вывода в статическом ОЗУ по адресам $60 - $FF необходимо использовать только инструкции ST/STS/STD и LD/LDS/LDD. Область расширенного ввода-вывода не существует при переводе ATmega128 в режим совместимости с ATmega103.
В нормальном режиме первые 4352 ячейки памяти данных относятся к файлу регистров, памяти ввода-вывода, расширенной памяти ввода-вывода и встроенному статическому ОЗУ данных. В первых 32 ячейках расположен файл регистров, следующие 64 ячейки занимает стандартная память ввода-вывода, а за ними следуют 160 ячеек расширенной памяти ввода-вывода. Замыкают внутреннюю память данных 4096 ячеек внутреннего статического ОЗУ данных.
В режиме совместимости с ATmega103 первые 4096 ячеек памяти данных относятся к файлу регистров, памяти ввода-вывода и внутреннему статическому ОЗУ данных. В первых 32 ячейках расположен файл регистров, затем в 64 ячейках расположена стандартная память ввода-вывода и следующие 4000 ячейки занимает внутреннее ОЗУ данных.
Совместно с ATmega128 по выбору может использоваться статическое ОЗУ. Это статическое ОЗУ будет занимать оставшуюся часть от адресного пространства размером 64 кбайт. Данная часть начинается с адреса следующего за внутренним статическим ОЗУ. Файл регистров, память ввода-вывода, память расширенного ввода-вывода и внутреннее статическое ОЗУ занимают младшие 4352 байта в нормальном режиме и младшие 4096 байта в режиме совместимости с ATmega103. (отсутствует память расширенного ввода-вывода). Таким образом, при использовании внешней памяти размером 64 кбайт (65536 байт) из них будет доступно 61184 байта в нормальном режиме и 61440 байта в режиме совместимости с ATmega103. См. раздел “Интерфейс внешней памяти” для детального изучения методов использования внешней памяти.
Доступ к внешнему статическому ОЗУ осуществляется автоматически с помощью тех же инструкций, что и для внутреннего ОЗУ, если указанное значение адреса находится за пределами внутренней памяти данных. При адресации внутренней памяти сигналы чтения и записи внешней памяти (выводы PG0 и PG1) неактивны в процессе всего цикла доступа. Работа внешнего статического ОЗУ разрешается путем установки бита SRE в регистре MCUCR.
Доступ к внешнему статическому ОЗУ требует еще одного машинного цикла на байт по сравнению с доступом к внутреннему статическому ОЗУ. Это означает, что на выполнение команд LD, ST, LDS, STS, LDD, STD, PUSH и POP потребуется один дополнительный цикл. Если стек будет размещен во внешнем статическом ОЗУ, то, соответственно, вызов и возврат из подпрограмм и процедур обработки прерываний будет длиться на три машинных цикла дольше за счет помещения в стек и извлечения из стека двухбайтного счетчика программы и не использования во время доступа к внешней памяти преимущества конвейерного доступа к внутренней памяти. Если интерфейс внешнего статического ОЗУ используется с состояниями ожидания (со сниженным быстродействием), то однобайтный внешний доступ потребует 2, 3 или 4 дополнительных машинных цикла для 1, 2 и 3 состояний ожиданий, соответственно. Таким образом, вызов и возврат из прерываний и подпрограмм потребует еще 5, 7 и 9 машинных циклов (в отличие от значений приведенных в описании набора инструкций) для 1, 2 и 3 состояний ожидания, соответственно.
Реализовано пять различных способов адресации для охвата всей памяти: прямая, косвенная со смещением, косвенная, косвенная с предварительным декрементом и косвенная с последующим инкрементом. Регистры R26…R31 из файла регистров используются как регистры-указатели для косвенной адресации.
Прямая адресация позволяет адресоваться ко всей памяти данных.
Косвенная адресация со смещением позволяет адресовать 63 ячейки, начиная с адреса указанного в регистрах Y или Z.
При использовании инструкции косвенной адресации с предварительным декрементом и последующим инкрементом значения адресных регистров X, Y и Z, соответственно декрементируются до или инкрементируются после выполнения инструкции.
32 рабочих регистров общего назначения, 64 регистра ввода-вывода и 4096 байт внутреннего статического ОЗУ данных в ATmega128 доступны с помощью всех этих режимов адресации. Файл регистров описывается в разделе “Файл регистров общего назначения”.
Рисунок 9 – Карта памяти данных
Временная диаграмма доступа к памяти
В данном разделе описывается общая концепция доступа к внутренней памяти.
Доступ к внутреннему статическому ОЗУ выполняется за два машинных цикла в соответствии с рисунком 10.
Рисунок 10 – Временная диаграмма доступа к встроенному статическому ОЗУ данных
Память данных на ЭСППЗУ
ATmega128 содержит 4 кбайт памяти данных на ЭСППЗУ. Она организована как отдельная область памяти данных, в которой один байт может быть записан и считан. ЭСППЗУ характеризуется износостойкостью 100000 циклов чтения/записи.
В разделе “Программирование памяти” содержится детальное описание программирование ЭСППЗУ через интерфейсы SPI, JTAG или параллельное программирование.
Чтение и запись ЭСППЗУ
Доступ к ЭСППЗУ осуществляется через специальные регистры, расположенные в пространстве ввода-вывода.
Время записи в ЭСППЗУ приведено в табл. 2. Функция самосинхронизации позволяет программно определить возможность записи следующего байта. Если код программы содержит инструкции записи в ЭСППЗУ, то должны быть приняты следующие меры предосторожности. У источников питания с хорошей фильтрацией напряжение VCC медленно нарастает/спадает при подаче/снятии питания. По этой причине микроконтроллер в течение некоторого периода времени может оказаться под меньшим напряжением питания, чем требуется для заданной тактовой частоты. См. раздел “Предотвращение повреждения данных в ЭСППЗУ” для детального изучения методов разрешения данной проблемы.
В целях предотвращения неумышленной записи в ЭСППЗУ должна быть выполнена специфическая процедура записи. Детально этот вопрос рассматривается при описании Управляющего регистра ЭСППЗУ.
Когда происходит считывание ЭСППЗУ ЦПУ задерживается на 4 машинных цикла до выполнения следующей инструкции. Во время записи в ЭСППЗУ ЦПУ задерживается на два машинных цикла до выполнения следующей инструкции.
Адресные регистры ЭСППЗУ – EEARH и EEARL
Разряды 15..12 – Резерв
Данные зарезервированные разряды считываются как 0. При записи в данных разрядах необходимо указывать нули для совместимости с новыми версиями микроконтроллеров.
Разряды 11..0 – EEAR11..0: Адрес ячейки ЭСППЗУ
Регистры адреса ЭСППЗУ – EEARH и EEARL – определяют адрес ячейки ЭСППЗУ в 4 кбайтном пространстве. Байтные ячейки ЭСППЗУ адресуются линейно в диапазоне адресов 0…4096. Начальное значение EEAR неопределенное. Необходимое значение адреса должно быть записано до начала доступа к ЭСППЗУ.
Регистр данных ЭСППЗУ –EEDR
Разряды 7…0 – EEDR7.0: Данные ЭСППЗУ
Для выполнения записи в ЭСППЗУ в регистр EEDR необходимо указать записываемые данные, которые будут записаны по адресу, указанному в регистре EEAR. После выполнения чтения из ЭСППЗУ в регистре EEDR содержатся считанные данные из ячейки по адресу указанному в EEAR.
Регистр управления ЭСППЗУ – EECR
Разряды 7…4 – Резерв
Данные разряды у ATmega128 зарезервированы и считываются как 0.
Разряд 3 – EERIE: Разрешение прерывания по готовности ЭСППЗУ
Запись в EERIE 1 разрешает прерывание по готовности ЭСППЗУ, если кроме того установлен бит I в регистре SREG. Запись в EERIE нуля отключает это прерывание. Прерывание по готовности ЭСППЗУ генерируется, если бит EEWE сброшен.
Разряд 2 – EEMWE: Главное разрешение записи в ЭСППЗУ
Бит EEMWE разрешает установку бита EEWE, инициирующего запись в ЭСППЗУ. Данные будут записаны в ЭСППЗУ по указанному адресу, если в EEMWE записать 1, а затем в течение 4 машинных циклов записать 1 в EEWE. Если EEMWE=0, то запись в EEWE лог. 1 не вызовет никаких действий. После программной установки бита EEMWE он автоматически сбрасывается аппаратно по истечении четырех машинных циклов.
Разряд 1 – EEWE: Разрешение записи в ЭСППЗУ
- Ожидание пока EEWE станет равным нулю.
- Ожидание равенства нулю бита SPMEN в регистре SPMCSR.
- Запись нового адреса ЭСППЗУ в EEAR (опционально).
- Запись новых данных в регистр EEDR для записи в ЭСППЗУ (опционально).
- Запись лог. 1 в EEMWE, когда в EEWE регистра EECR записан ноль.
- Запись лог. 1 в EEWE в течение четырех машинных циклов после установки EEMWE.
ЭСППЗУ нельзя программировать во время записи флэш-памяти из ЦПУ. С учетом этого, перед началом новой записи в ЭСППЗУ необходимо проверить завершение программирования флэш-памяти. Шаг 2 необходимо выполнять, если в приложении используется программирование из загрузочного сектора. Если программирование флэш-памяти под управлением ЦПУ не предусмотрено, то шаг 2 может быть исключен. См. “Самопрограммирование из сектора начальной загрузки с поддержкой чтения во время записи” для детального изучения программирования из загрузочного сектора.
Предостережения: Прерывание между шагами 5 и 6 может нарушить цикл записи из-за превышения установленного предела времени на выполнение этих шагов. Если процедура обработки прерывания, осуществляющая доступ к ЭСППЗУ, прерывается другим доступом к ЭСППЗУ, то EEAR или EEDR будут изменены, вызывая сбой прерванного цикла доступа. Во избежание этих проблем рекомендуется сбрасывать флаг общего разрешения прерываний при выполнении последних четырех шагов.
По окончании записи бит EEWE сбрасывается аппаратно. Данный бит может опрашиваться программно для определения возможности записи следующего байта (нулевое значение). После установки EEWE ЦПУ останавливается на два машинных цикла перед выполнением следующей инструкции.
Сигнал разрешения чтения из ЭСППЗУ EERE является стробом чтения ЭСППЗУ. После записи корректного адреса в регистр адреса EEAR бит EERE должен быть установлен к лог.1 для запуска механизма чтения ЭСППЗУ. Чтение из ЭСППЗУ выполняется одновременно с инструкцией, поэтому, запрашиваемые данные готовы для считывания сразу по ее завершении. После чтения из ЭСППЗУ ЦПУ задерживается на четыре машинных цикла, а только затем выполняет следующую инструкцию.
Пользователь должен опросить флаг EEWE до начала операции чтения. Если осуществляется операция записи, то невозможно не только считать ЭСППЗУ, но и изменить регистр адреса EEAR. Во время доступа к ЭСППЗУ используется калиброванный генератор. В таблице 2 приведено типичное время программирования ЭСППЗУ через ЦПУ.
Таблица 2 – Время программирования ЭСППЗУ
Операция | Количество периодов калиброванного RC-генератора (1). | Типичное время программирования |
Запись ЭСППЗУ (через ЦПУ) | 8448 | 8.5 мс |
Прим 1. Используется частота 1 МГц независимо от установки конфигурационного бита CKSEL
Далее представлены примеры кодов функций записи в ЭСППЗУ на языках Ассемблер и Си. В данных примерах предполагается, что прерывания работают таким образом, что ни одно не возникает в процессе выполнения данных функций (например, путем общего отключения прерываний). Кроме того, считается, что из загрузочного сектора не выполняется программирование флэш-памяти. В противном случае функция записи в ЭСППЗУ должна ожидать окончания действия инструкции SPM.
В следующих примерах кодов на Си и Ассемблере представлены функции чтения из ЭСППЗУ. При разработке примеров учитывалось управление прерываниями таким образом, что ни одно из них не возникает в процессе выполнения этих функций.
Запись в ЭСППЗУ в режиме выключения (Power Down)
Если микроконтроллер переводится в режим выключения (Power Down) командой sleep в процессе выполнения операции записи в ЭСППЗУ, то операция записи будет продолжена и завершится по истечении требуемого времени доступа для записи. Однако, по завершении операции записи кварцевый генератор будет продолжать работу, и как следствие, микроконтроллер будет переведен в режим снижения мощности не полностью. С учетом этого, рекомендуется проверять окончание операции записи в ЭСППЗУ перед переводом в режим выключения (Power-down).
Меры предотвращения повреждения данных в ЭСППЗУ
В те моменты, когда напряжение VCC находится на уровне недостаточном для корректной работы ЦПУ и ЭСППЗУ, содержимое ЭСППЗУ может быть нарушено. Данные проблемы аналогичны устройствам, использующих отдельное ЭСППЗУ, поэтому, в данном случае необходимо применить те же меры.
При сниженном напряжении питания может быть две причины нарушения содержимого ЭСППЗУ. Первая причина состоит в возможности корректной регулярной записи в ЭСППЗУ только при определенном напряжении питания. Вторая состоит в возможности некорректного выполнения программы микроконтроллером при чрезмерном низком уровне питания.
Повреждение данных в ЭСППЗУ может быть легко предотвращено, если придерживаться следующих рекомендаций:
Микроконтроллер необходимо удерживать в состоянии сброса (низкий уровень на выводе RESET) при недостаточности уровня питания. Аналогично это можно выполнить, разрешив работу встроенного детектора питания (BOD). Если пороговый уровень встроенного детектора питания не соответствует необходимому порогу, то следует применить внешнюю схему сброса при снижении VCC (супервизор питания). Если сброс возникает во время действия операции записи, то запись будет завершена при условии достаточности уровня питания.
Существующее пространство ввода-вывода для ATmega128 показано в разделе “Сводная таблица регистров”.
Все порты ввода-вывода и периферийные устройства в ATmega128 размещены в пространстве ввода-вывода. Доступ ко всем ячейкам ввода-вывода может быть осуществлен с помощью инструкций LD/LDS/LDD и ST/STS/STD путем передачи данных между одним из 32-х универсальным рабочим регистром и памятью ввода-вывода. Регистры ввода-вывода с адресами $00 - $1F могут побитно адресоваться с помощью инструкций SBI и CBI. Состояние одного из разрядов в этих регистрах может тестироваться с помощью инструкций SBIS и SBIC. При использовании специфических команд ввода-вывода IN и OUT необходимо использовать адреса $00 - $3F. Если адресоваться к регистрам ввода-вывода как к памяти данных с помощью инструкций LD и ST, то к указанным выше адресам необходимо прибавить $20. ATmega128 является сложным микроконтроллером, для которого 64 адреса, зарезервированных в кодах операций IN и OUT, не достаточно для поддержки всех имеющихся периферийных устройств. Для расширенной области ввода-вывода, которая находится по адресам $60 - $FF в статическом ОЗУ необходимо использовать только инструкции ST/STS/STD и LD/LDS/LDD. Пространство расширенного ввода-вывода заменяется ячейками статического ОЗУ в режиме совместимости с ATmega103.
Если осуществляется доступ к зарезервированным разрядам, то в целях совместимости с последующими микроконтроллерами в них необходимо записывать лог. 0.
Не должна производиться запись в ячейки по зарезервированным адресам в пространстве ввода-вывода.
Некоторые флаги статуса сбрасываются путем записи в них лог. 1. Инструкции CBI и SBI работают только с регистрами по адресам $00…$1F.
Регистры управления вводом-выводом и периферийными устройствами описываются в следующих разделах.
УСТРОЙСТВО МИКРОКОНТРОЛЛЕРОВ AVR
CISC и RISC
По числу команд микропроцессоры подразделяют на CISC (Complex Instruction Set Computer) и RISC (Reduced Instruction Set Computer). Термин CISC обозначает сложную систему команд, RISC - сокращенную.
Идея RISC - это тщательный подбор команд, которые можно было бы выполнить за один такт. Т. о. упрощается аппаратная реализация процессора, сокращается число транзисторов, снижается потребляемая мощность и цена.
Очевидно, что в общем случае одной CISC-команде должны соответствовать несколько RISC-команд. Однако обычно выигрыш в быстродействии у RISC перекрывает потери. Так, самая быстрая команда у 8051 выполняется за 12 тактов. Даже если для каждой CISC-инструкции потребуется выполнить три RISC-инструкции, то в итоге RISC-архитектура будет в 4 раза производительней.
В настоящее время грань между RISC и CISC стирается. Например, AVR имеют 133 команды, что соответствует CISC, но большинство из них выполняется за один такт, что является признаком RISC. Поэтому основным признаком RISC стало принято считать выполнение команд за один такт.
Фоннеймановская и гарвардская архитектура
В 1945 г. американский математик Джон фон Нейман сформулировал основные принципы работы современных компьютеров. Им была предложена архитектура, получившая его имя (von Neumann architecture) и предполагающая хранение программ и данных в общей памяти (1946 г.). Сегодня такая архитектура наиболее характерна для микропроцессоров, ориентированных на использование в компьютерах. Примером могут служить микропроцессоры семейства х86.
Архитектура, предполагающая раздельное использование памяти программ и данных, носит название гарвардской (Harvard architecture). Гарвардская архитектура позволяет центральному процессору работать одновременно как с памятью программ, так и с памятью данных, что существенно увеличивает производительность.
В микроконтроллерах AVR реализована Гарвардская архитектура, в соответствии с которой разделены не только адресные пространства памяти программ и памяти данных, но и шины доступа к ним. Каждая из областей памяти данных (оперативная память и EEPROM) также расположена в своем адресном пространстве.
Память программ (Flash ROM или Flash ПЗУ)
Память программ предназначена для хранения последовательности команд, управляющих функционированием микроконтроллера, и имеет 16-ти битную организацию. Все AVR имеют Flash-память программ, которая может быть различного размера - от 1 до 256 КБайт. Ее главное достоинство в том, что она построена на принципе электрической перепрограммируемости, т. е. допускает многократное стирание и запись информации. Программа заносится во Flash-память AVR как с помощью обычного программатора, так и с помощью SPI-интерфейса, в том числе непосредственно на собранной плате. Возможностью внутрисхемного программирования (функция ISP) через коммуникационный интерфейс SPI обладают все микроконтроллеры AVR, кроме Tiny11 и Tiny28.
Все микроконтроллеры семейства Mega имеют возможность самопрограммирования, т. е. самостоятельного изменения содержимого своей памяти программ. Эта особенность позволяет создавать на их основе очень гибкие системы, алгоритм работы которых будет меняться самим микроконтроллером в зависимости от каких-либо внутренних условий или внешних событий.
Гарантированное число циклов перезаписи Flash-памяти у микроконтроллеров AVR второго поколения составляет не менее 10 тыс. циклов при типовом значении 100 тыс. циклов. (В официальной технической документации Atmel Corp. указывается значение 10 тыс. циклов.)
Память данных разделена на три части: регистровая память, оперативная память (ОЗУ - оперативное запоминающее устройство или RAM) и энергонезависимая память (ЭСППЗУ или EEPROM).
Регистровая память (РОН и РВВ)
Регистровая память включает 32 регистра общего назначения (РОН или GPR), объединенных в файл, и служебные регистры ввода/вывода (РВВ). И те и другие расположены в адресном пространстве ОЗУ, но не являются его частью.
В области регистров ввода/вывода расположены различные служебные регистры (регистры управления микроконтроллером, регистры состояния и т. п.), а также регистры управления периферийными устройствами, входящими в состав микроконтроллера. По сути, управление микроконтроллером заключается в управлении этими регистрами.
Энергонезависимая память данных (EEPROM)
Для долговременного хранения различной информации, которая может изменяться в процессе функционирования микроконтроллерной системы, используется EEPROM-память. Все AVR имеют блок энергонезависимой электрически перезаписываемой памяти данных EEPROM от 64 Байт до 4 КБайт. Этот тип памяти, доступный программе микроконтроллера непосредственно в ходе ее выполнения, удобен для хранения промежуточных данных, различных констант, коэффициентов, серийных номеров, ключей и т.п. EEPROM может быть загружена извне как через SPI интерфейс, так и с помощью обычного программатора. Число циклов стирание/запись - не менее 100 тыс.
Оперативная память (ОЗУ или RAM)
Внутренняя оперативная статическая память Static RAM (SRAM) имеет байтовый формат и используется для оперативного хранения данных.
Размер оперативной памяти может варьироваться у различных чипов от 64 Байт до 4 КБайт. Число циклов чтения и записи в RAM не ограничено, но при отключении питающего напряжения вся информация теряется.
Для некоторых микроконтроллеров возможна организация подключения внешнего статического ОЗУ объемом до 64К.
Порты ввода/вывода (I/O)
Система прерываний - одна из важнейших частей микроконтроллера. Все микроконтроллеры AVR имеют многоуровневую систему прерываний. Прерывание прекращает нормальный ход программы для выполнения приоритетной задачи, определяемой внутренним или внешним событием.
Для каждого такого события разрабатывается отдельная программа, которую называют подпрограммой обработки запроса на прерывание (для краткости - подпрограммой прерывания), и размещается в памяти программ.
При возникновении события, вызывающего прерывание, микроконтроллер сохраняет содержимое счетчика команд, прерывает выполнение центральным процессором текущей программы и переходит к выполнению подпрограммы обработки прерывания.
После выполнения подпрограммы прерывания осуществляется восстановление предварительно сохраненного счетчика команд и процессор возвращается к выполнению прерванной программы.
Для каждого события может быть установлен приоритет. Понятие приоритет означает, что выполняемая подпрограмма прерывания может быть прервана другим событием только при условии, что оно имеет более высокий приоритет, чем текущее. В противном случае центральный процессор перейдет к обработке нового события только после окончания обработки предыдущего.
Микроконтроллеры AVR имеют в своем составе от 1 до 4 таймеров/счетчиков с разрядностью 8 или 16 бит, которые могут работать и как таймеры от внутреннего источника тактовой частоты, и как счетчики внешних событий.
Их можно использовать для точного формирования временных интервалов, подсчета импульсов на выводах микроконтроллера, формирования последовательности импульсов, тактирования приемопередатчика последовательного канала связи. В режиме ШИМ (PWM) таймер/счетчик может представлять собой широтно-импульсный модулятор и используется для генерирования сигнала с программируемыми частотой и скважностью. Таймеры/счетчики способны вырабатывать запросы прерываний, переключая процессор на их обслуживание по событиям и освобождая его от необходимости периодического опроса состояния таймеров. Поскольку основное применение микроконтроллеры находят в системах реального времени, таймеры/счетчики являются одним из наиболее важных элементов.
Сторожевой таймер (WDT)
Сторожевой таймер (WatchDog Timer) предназначен для предотвращения катастрофических последствий от случайных сбоев программы. Он имеет свой собственный RC-генератор, работающий на частоте 1 МГц. Как и для основного внутреннего RC-генератора, значение 1 МГц является приближенным и зависит прежде всего от величины напряжения питания микроконтроллера и от температуры.
Идея использования стоpожевого таймеpа предельно проста и состоит в pегуляpном его сбpасывании под упpавлением пpогpаммы или внешнего воздействия до того, как закончится его выдеpжка вpемени и не пpоизойдет сбpос пpоцессоpа. Если пpогpамма pаботает ноpмально, то команда сбpоса стоpожевого таймеpа должна pегуляpно выполняться, пpедохpаняя поцессоp от сбpоса. Если же микpопpоцессоp случайно вышел за пpеделы пpогpаммы (напpимеp, от сильной помехи по цепи питания) либо зациклился на каком-либо участке пpогpаммы, команда сбpоса стоpожевого таймеpа скоpее всего не будет выполнена в течение достаточного вpемени и пpоизойдет полный сбpос пpоцессоpа, инициализиpующий все pегистpы и пpиводящий систему в pабочее состояние.
Аналоговый компаратор (AC)
Аналоговый компаратор (Analog Comparator) сравнивает напряжения на двух выводах (пинах) микроконтроллера. Результатом сравнения будет логическое значение, которое может быть прочитано из программы.
Выход аналогового компаратора можно включить на прерывание от аналогового компаратора. Пользователь может установить срабатывание прерывания по нарастающему или спадающему фронту или по переключению.
Присутствует у всех современных AVR, кроме Mega8515
Аналого-цифровой преобразователь (A/D CONVERTER)
Аналого-цифровой преобразователь (АЦП) служит для получения числового значения напряжения, поданного на его вход. Этот результат сохраняется в регистре данных АЦП. Какой из выводов (пинов) микроконтроллера будет являться входом АЦП, определяется числом, занесенным в соответствующий регистр.
Универсальный последовательный приемопередатчик (UART или USART)
Универсальный асинхронный или универсальный синхронно/асинхронный приемопередатчик (Universal Synchronous/Asynchronous Receiver and Transmitter - UART или USART) - удобный и простой последовательный интерфейс для организации информационного канала обмена микроконтроллера с внешним миром. Способен работать в дуплексном режиме (одновременная передача и прием данных). Он поддерживает протокол стандарта RS-232, что обеспечивает возможность организации связи с персональным компьютером. (Для стыковки МК и компьютера обязательно понадобится схема сопряжения уровней сигналов. Для этого существуют специальные микросхемы, например MAX232.)
Последовательный периферийный интерфейс SPI
Последовательный периферийный трехпроводный интерфейс SPI (Serial Peripheral Interface) предназначен для организации обмена данными между двумя устройствами. С его помощью может осуществляться обмен данными между микроконтроллером и различными устройствами, такими, как цифровые потенциометры, ЦАП/АЦП, FLASH-ПЗУ и др. С помощью этого интерфейса удобно производить обмен данными между несколькими микроконтроллерами AVR.
Кроме того, через интерфейс SPI может осуществляться программирование микроконтроллера.
Двухпроводной последовательный интерфейс TWI
Двухпроводной последовательный интерфейс TWI (Two-wire Serial Interface) является полным аналогом базовой версии интерфейса I2C (двухпроводная двунаправленная шина) фирмы Philips. Этот интерфейс позволяет объединить вместе до 128 различных устройств с помощью двунаправленной шины, состоящей из линии тактового сигнала (SCL) и линии данных (SDA).
Тактовый генератор вырабатывает импульсы для синхронизации работы всех узлов микроконтроллера. Внутренний тактовый генератор AVR может запускаться от нескольких источников опорной частоты (внешний генератор, внешний кварцевый резонатор, внутренняя или внешняя RC-цепочка). Минимальная допустимая частота ничем не ограничена (вплоть до пошагового режима). Максимальная рабочая частота определяется конкретным типом микроконтроллера и указывается Atmel в его характеристиках, хотя практически любой AVR-микроконтроллер с заявленной рабочей частотой, например, в 10 МГц при комнатной температуре легко может быть "разогнан" до 12 МГц и выше.
Система реального времени (RTC)
RTC реализована во всех микроконтроллерах Mega и в двух кристаллах "classic" - AT90(L)S8535. Таймер/счетчик RTC имеет отдельный предделитель, который может быть программным способом подключен или к источнику основной тактовой частоты, или к дополнительному асинхронному источнику опорной частоты (кварцевый резонатор или внешний синхросигнал). Для этой цели зарезервированы два вывода микросхемы. Внутренний осциллятор оптимизирован для работы с внешним "часовым" кварцевым резонатором 32,768 кГц.
AVR функционируют при напряжениях питания от 1,8 до 6,0 Вольт. Ток потребления в активном режиме зависит от величины напряжения питания и частоты, на которой работает микроконтроллер, и составляет менее 1 мА для 500 кГц,5 . 6 мА для 5 МГц и 8 . 9 мА для частоты 12 МГц.
AVR могут быть переведены программным путем в один из трех режимов пониженного энергопотребления.
Режим холостого хода (IDLE). Прекращает работу только процессор и фиксируется содержимое памяти данных, а внутренний генератор синхросигналов, таймеры, система прерываний и сторожевой таймер продолжают функционировать. Ток потребления не превышает 2,5 мА на частоте 12 МГц.
Стоповый режим (POWER DOWN). Сохраняется содержимое регистрового файла, но останавливается внутренний генератор синхросигналов, и, следовательно, останавливаются все функции, пока не поступит сигнал внешнего прерывания или аппаратного сброса. При включенном сторожевом таймере ток потребления в этом режиме составляет около 80 мкА, а при выключенном - менее 1 мкА. (Все приведенные значения справедливы для напряжения питания 5 В).
Экономичный режим (POWER SAVE). Продолжает работать только генератор таймера, что обеспечивает сохранность временной базы. Все остальные функции отключены.
Встроенная EEPROM стремительно заканчивается, а данные куда-то записывать надо. Знакомая ситуация, не правда-ли?
Что мы обычно делаем в таких случаях? Ставим внешнюю EEPROM, флеш или SD карточку на 32 гига. Это оправдано, если устройство достаточно сложное. А если оно состоит из одной тиньки и двух с половиной светодиодов? Тогда подключение внешней памяти грозит кардинальными изменениями в алгоритме, а может и пинов банально не хватит.
Но ведь у нас есть своя флеш память, которая в подавляющем большинстве случаев заполнена чуть менее, чем на половину. Отлично! Её и используем для записи данных.
Механизм записи во флеш память на первый взгляд немного запутанный. Но если присмотреться — все просто. Он состоит из трех основных частей:
— Очистка страницы памяти.
— Подготовка (закидываем данные во временный буфер)
— Запись.
Причем первые два пункта можно невозбранно менять местами.
Флеш память разделена на страницы. Размер страницы зависит от общего объема флеш памяти — смотри в даташите.
Например, для тини13 есть такая табличка:
Размер страницы 32 байта (16 слов), а всего таких страниц 32 штуки.
Так-же там написано, что в регистре адреса первые 4 бита (PC[3:0]) занимает адрес слова, а адрес страницы начинается с 5го бита. Значит, если нам надо записать адрес 3й страницы, то в регистр уйдет 3
При операциях со страницами (запись и очистка) от нас будут требовать номер страницы. А при работе со временным буфером — адрес слова в странице. К счастью, МК сам выделяет нужные части из адреса, который мы кидаем в регистр Z — поэтому можно не задумываться и пихать просто адрес слова в памяти.
При прошивке МК надо включить фьюз SELFPRGEN. Без этого ничего работать не будет.
1) Расчистка места.
Для очистки страницы памяти надо выполнить такую последовательность действий:
— Пихаем в регистр Z адрес. Из него МК выделит адрес страницы, а на первые 4 бита забьет.
— Поднимаем в регистре SPMCSR биты PGERS (Page Erase) и SELFPRGEN (Self Programming Enable).
— Быстро (в течении 4х тактов после записи в SPMCSR) выполняем команду SPM.
На время очистки страницы (а это около 4 мс) процессор подвисает.
2) Готовим данные к записи.
— Записываем в регистр Z адрес слова. Теперь все наоборот. МК будет ориентироваться по первым 4 битам адреса.
— В пару регистров R1:R0 пишем данные, которые хотим запихать в буфер.
— Поднимаем бит SELFPRGEN в регистре SPMCSR.
— Выполняем команду SPM.
… повторить, пока не будет заполнен весь буфер.
У этого буфера есть одна нехорошая особенность:
Записать два раза в одну ячейку нельзя. Т.е. если мы хотим переписать уже записанные в буфер данные, то его придется сначала очистить. Для очистки надо просто поднять бит CTPB в SPMCSR.
Алсо, буфер очищается сам после записи во флеш или перезагрузки.
Забавно так-же то, что данные в буфере будут потеряны, если записать что-то в EEPROM. Как-то хитро память устроена, не находите? :)
Последнее особенно актуально, если мы собираемся наполнять буфер постепенно, прерываясь на другие задачи (типа записи в EEPROM).
3) Пишем!
— Запихиваем адрес страницы в Z
— Устанавливаем биты SELFPRGEN и PGWRT.
— Выполняем SPM.
При записи страницы МК зависает на те-же 4 мс.
Пример устройства.
Для примера я хотел замутить термологгер на базе тини25. С записью температуры в флеш, работой со встроенным термометром и выдачей лога в UART. Но выяснилось, что UART у тини25 нету, а «родной» термометр уж больно кривой. Поэтому будем делать что по-проще. Например, записывать во флеш память напряжение, измеренное АЦП.
Алгоритм дешевого и сердитого логгера такой:
0) Инициализация периферии. Устанавливаем адрес записи на первую пустую страницу.
1) Ждем 1 сек — простым циклом, безо всяких таймеров и прерываний. Дешево и сердито.
2) Запускаем АЦП и ждем, пока он закончит преобразование.
3) Если мы начали писать новую страницу, то
3.1) Очишаем её.
4) Записываем во временнный буфер (по текущему адресу) значение АЦП.
5) Если мы уже заполнили весь буфер, то
5.1) Записываем его во флеш память.
6) Инкрементируем адрес записи.
7) Если дошли до конца памяти — затупляем в вечном цикле. Иначе идем на шаг 1.
Код на ассемблере:
Проверять код в протеусе бесполезно — не работает :)
Но в железе все прекрасно крутится.
Небольшое дополнение: RWW и NRWW
В МК с поддержкой бутлоадера на команду SPM накладываются ограничения. Её можно выполнить только из BLS (Bootloader section) — области памяти в самом конце флеша, где живут бутлоадеры. Размер этой области устанавливается фьюзами BOOTSZ.
Вообще, в контроллерах с поддержкой бутлоадера, весь флеш поделен на 2 части: RWW (Read-While-Write) и NRWW (No Read-While-Write). NRWW распологается в конце памяти и занимает место отведенное под бутлоадер. Т.е. размер этой области памяти равен максимальному размеру BLS. Остальное место (с начала флеша и до NRWW) занимает RWW область.
Разница между RWW и NRWW заключается вот в чем: Если бутлоадер (который находится в NRWW) пишет или стирает страницу в RWW области, то МК не останавливается на время выполения этой операции. Бутлоадер будет продолжать работать, пока страница памяти в RWW записывается или стирается. По этому поводу даже придумали прерывание SPM_RDY, которое возникает по завершении операции.
А если бутлоадер попытается записать данные в секцию NRWW (это не обязательно должна быть секция самого бутлоадера), то МК замрет на 4мс, пока производится запись.
Архитектура и система команд AVR (до 133 различных инструкций) разрабатывались совместно с фирмой IAR Systems - производителем компиляторов языков программирования С/С++. Так, например, разрядность шины команд AVR составляет 16 бит, из которых 5 обеспечивают доступ к внутреннему регистровому файлу. Данное решение позволило отказаться от страничной организации памяти и традиционной банковой организации регистров общего назначения. Для микроконтроллеров AVR удается получать высокую плотность кода при использовании языков высокого уровня, практически не теряя в производительности по сравнению с программами, написанными на языке Ассемблера. Разработчиками AVR был проведен тест по сравнению объема и времени выполнения кода, полученного в результате компиляции функции для определения максимального значения из массива 16 целых двухбайтных чисел. Функция написана на языке С и компилировалась для выполнения на современных микроконтроллерах различных производителей (см. таблицу).
Таблица. Размер и время выполнения кода для некоторых популярных микроконтроллеров
Производитель | Устройство | Максимальная скорость, МГц | Размер кода, кбайт | Количество циклов | Время выполнения, мкс |
Atmel, AVR | Atmega16 | 16 | 32 | 227 | 14.2 |
Texas Instruments | MSP430 | 8 | 34 | 246 | 30.8 |
Atmel, C51 | T89C51RD2 | 20 | 57 | 4200 | 210.0 |
Microchip | PIC18F452 | 40 | 92 | 716 | 17.9 |
Видно, что коды микроконтроллеров AVR и MSP430 близки по размеру, но скорость выполнения у MSP430 в два раза меньше, чем у AVR. По времени выполнения данной программы микроконтроллер PIC18F452 практически догоняет AVR, но размер кода у него в три раза больше. А микроконтроллерам с ядром С51 нужно тактироваться с частотой 296МГц, чтобы соответствовать AVR с тактированием на 16МГц.
Память программ и данных
Программа заносится во Flash-память AVR при помощи параллельного программирования, последовательного низковольтного или высоковольтного программирования, а также самопрограммирования. Возможностью внутрисхемного программирования (функция ISP) через коммуникационный интерфейс SPI обладают все микроконтроллеры AVR, кроме tiny28. Причем для семейства "mega" - это аппаратный интерфейс, а в семействе "tiny" используется альтернативная функция линий ввода-вывода.
Все текущие версии кристаллов "mega" 2004 года имеют возможность самопрограммирования (функция SPM), которая реализуется с помощью блока загрузчика (Boot Loader Section). Эта функция позволяет обновлять программный код под управлением самого микроконтроллера, используя расположенную непосредственно во Flash-памяти программу загрузчика. Причем программа в блоке загрузчика может программировать весь массив Flash-памяти микроконтроллера, включая и саму область памяти загрузчика. При этом может использоваться любой доступный интерфейс для чтения и записи кода во Flash-память (USART, SPI, CAN и т. д.).
В микроконтроллерах семейства "mega" разрешается выполнять инструкции кода загрузчика при стирании или записи в область памяти программ для приложения ("чтение во время записи"). В результате микроконтроллер может продолжать реагировать на запросы прерывания даже во время перепрограммирования. Для упрощения использования этой функции микроконтроллеры AVR поддерживают возможность переноса векторов прерывания из области памяти приложения в блок загрузчика.
Механизм функции "чтение во время записи" следующий. Flash-память разделена на две фиксированных области: блок с функцией чтения во время записи (Read-While-Write, RWW) и блок без функции чтения во время записи (No Read-While-Write, NRWW). Основное различие между ними заключается в том, что при программировании блока RWW в блоке NRWW можно читать код, а при программировании блока NRWW процессор останавливается на все время выполнения операции (рис. 1). Загрузчик всегда располагается в блоке NRWW. Код, находящийся в NRWW, может быть прочтен, если загрузчик обновляет страницу в блоке RWW. Но если загрузчик стирает или программирует страницу в блоке RWW, то выбирать одновременно код из блока RWW нельзя, иначе может произойти сбой программы. Поэтому для таких случаев нужно или запретить прерывания, или переместить вектора прерываний в блок загрузчика. Вектора прерываний могут быть перемещены в начало блока загрузчика установкой бита IVSEL регистра управления MCUCR. Вектор сброса микроконтроллера также может быть перемещен в блок загрузчика установкой fuse-бита BOOTRST. Таким образом, с помощью управления состоянием бита BOOTRST можно определять начало выполнения программы (из блока загрузчика или из блока памяти программ для приложения), а также размещать во Flash-памяти микроконтроллера две различные программы и запускать их на выполнение без необходимости перепрограммирования всего массива памяти программ.
Рис. 1. Деление Flash-памяти программ AVR на блоки чтения во время записи (RWW) и запрещения чтения во время записи (NRWW)
Размер блока загрузчика микроконтроллеров AVR конфигурируется fuse-битами BOOTSZx (см. рис. 2). Свободная память в области загрузчика может быть также использована в качестве дополнительного пространства для рабочего кода или для хранения редко обновляемых данных, полученных во время выполнения кода. Размеры блока загрузчика могут изменяться в пределах от 256 байт (используется только функция самопрограммирования) до 4 кбайт, когда необходимо реализовывать различные алгоритмы шифрации-дешифрации. Например, алгоритм по стандарту DES (Data Encription Standard) занимает 2 кбайт памяти. Отметим, что в новых кристаллах tiny13 и tiny2313 весь массив Flash-памяти программ представляет собой блок загрузчика.
Рис. 2. Деление Flash-памяти программ AVR на блоки загрузчика и приложения
Гарантированное число циклов перезаписи Flash-памяти у микроконтроллеров AVR второго поколения составляет не менее 10 тыс. циклов при типовом значении 100 тыс. циклов. В официальной технической документации Atmel Corp. указывается значение 10 тыс. циклов. Следует отметить, что у AVR первого поколения гарантированное число циклов перезаписи Flash-памяти программ составляло всего одну тысячу циклов.
Все микроконтроллеры AVR (кроме tiny11 и tiny28) имеют также блок энергонезависимой памяти данных EEPROM, который обычно используется для хранения промежуточных данных, констант, таблиц перекодировок, калибровочных коэффициентов и т. п. Эта память может быть загружена извне как через интерфейс SPI (внутрисхемным программатором), так и с помощью параллельного программатора. Число циклов гарантированной перезаписи блока EEPROM составляет не менее 100 тыс. при типовом значении 1 млн. Срок хранения данных на EEPROM составляет 20 лет.
Особый интерес вызывает время гарантированного сохранения данных в энергонезависимой памяти на кристалле микроконтроллера (Data Retention) и устойчивость памяти к воздействию различных внешних факторов. Для микроконтроллеров AVR значение Data Retention составляет 20 лет как для Flash-памяти программ, так и для памяти данных EEPROM на кристалле. Но информация эта в корпорации Atmel является внутренней, и в официальных Data Sheet на микроконтроллеры она отсутствует. Тем не менее, Atmel Corp. по запросу клиента может выпустить специальный документ, в котором будет указано значение Data Retention для конкретного типа микроконтроллера с соответствующим номером партии и лота кремниевой пластины. Atmel Corp., естественно, признает, что подобные данные обязаны присутствовать в официальной документации на выпускаемую ею продукцию и обещает включить параметр Data Retention в будущие версии Data Sheet на микроконтроллеры AVR. К сожалению, точная дата этого события пока не называется.
Какие же внешние факторы главным образом влияют на сохранность данных во Flashи EEPROM-ячейках памяти AVR? Основной параметр - температура кристалла. Известно, что с повышением температуры возрастают токи утечки в ячейках запоминающих устройств; зависимость эта экспоненциальная. Чем больше токи утечки, тем меньше период гарантированного сохранения информации в памяти микросхемы. По оценкам специалистов Atmel, если кристалл, например, работает при температуре 25 °С, то время сохранности данных будет практически бесконечным, десятки лет. Если этот же кристалл будет работать при температуре 105 °С, то оно уже составит максимум единицы лет. Но самый главный "убийца" - это термоциклирование, работа кристалла при значительных перепадах температур в несколько десятков градусов. В таких условиях время сохранности информации в ячейках энергонезависимой памяти сокращается еще больше. Поэтому следует всячески избегать термоциклирования, даже при хранении микросхем, но особенно - при работе микроконтроллера в активном режиме.
Несанкционированный доступ к массивам Flash-памяти программ и энергонезависимой памяти данных EEPROM может быть заблокирован установкой битов защиты микроконтроллера. Снятие установленных битов защиты возможно только путем стирания всего массива Flash-памяти, причем сама память стирается в первую очередь, а биты защиты - в последнюю. Благодаря этому энергонезависимая память в микроконтроллерах AVR надежно защищена от несанкционированного доступа. Внутренняя оперативная память SRAM имеется у всех микроконтроллеров семейства "mega", а также у трех представителей семейства "tiny" - tiny26, tiny13 и tiny2313. Для некоторых микроконтроллеров семейства "mega" возможна организация подключения внешней памяти данных SRAM объемом до 64 кбайт.
Стандартные периферийные блоки
Большинство периферийных блоков не претерпело каких-либо изменений и мы не будем подробно на них останавливаться. Микроконтроллеры AVR имеют от 1 до 4 таймеров-счетчиков общего назначения с разрядностью 8 или 16 бит, а также сторожевой таймер WDT. Примечательно, что микроконтроллеры AVR второго поколения имеют дополнительный вектор прерывания от сторожевого таймера. Для временных характеристик переполнения WDT в Data Sheet на AVR пока указываются только усредненные, типовые значения. Их следует использовать только в качестве оценки, так как частота собственного генератора WDT зависит нелинейно как от температуры, так и от напряжения питания микроконтроллера. В последующих "поколениях" технической документации Atmel Corp. будут указываться как минимальные, так и максимальные значения для времени переполнения сторожевого таймера.
Система реального времени RTC реализована во всех микроконтроллерах семейства "mega", кроме mega8515. Таймер-счетчик RTC имеет отдельный предделитель, который может быть программным способом подключен или к источнику основной тактовой частоты, или к дополнительному асинхронному источнику опорной частоты (кварцевый резонатор или внешний синхросигнал). Для этой цели зарезервированы два внешних вывода микросхемы. Внутренний осциллятор, нагруженный на счетный вход таймера-счетчика RTC, оптимизирован для работы с внешним "часовым" кварцевым резонатором 32,768 кГц.
Аналого-цифровой преобразователь построен по схеме АЦП последовательных приближений с устройством выборки и хранения. Число независимых каналов преобразования определяется типом микроконтроллера, разрядность АЦП составляет 10 бит. Время преобразования выбирается программно с помощью установки коэффициента делителя частоты, входящего в состав блока АЦП. Важной особенностью аналого-цифрового преобразователя AVR является режим подавления шума, при котором на точность преобразования не оказывают влияние помехи, возникающие при работе процессорного ядра.
Порты ввода-вывода AVR имеют от 3 до 54 независимых линий ввода-вывода. Выходные драйверы обеспечивают токовую нагрузочную способность 20мА на линию порта (втекающий ток), что позволяет непосредственно подключать к микроконтроллеру светодиоды и биполярные транзисторы.
Микроконтроллеры AVR могут быть переведены программным путем в один из шести режимов пониженного энергопотребления. Для разных семейств AVR и различных микроконтроллеров в пределах каждого семейства изменяется количество и сочетание доступных режимов пониженного энергопотребления. В режиме холостого хода (IDLE) работу прекращает только процессор, а внутренний генератор синхросигналов, таймеры, система прерываний и сторожевой таймер продолжают функционировать. В режиме Power Down сохраняется содержимое регистрового файла, но останавливается внутренний генератор синхросигналов. Режим Power Save, который имеется только у AVR c RTC, похож на режим Power Down, но здесь допускается независимая работа дополнительного таймера-счетчика RTC. В режиме подавления шума при работе аналого-цифрового преобразователя (ADC Noise Reduction) останавливается процессорное ядро, но разрешена работа АЦП, двухпроводного интерфейса I2C и сторожевого таймера. Основной режим ожидания (Standby) также идентичен режиму Power Down, но работа тактового генератора не прекращается. Дополнительный режим ожидания (Extended Standby) идентичен режиму Power Save, но здесь работа тактового генератора тоже не прекращается.
Перевод микроконтроллера в один из энергосберегающих режимов дает значительное снижение суммарного энергопотребления кристалла. Если приложение выполняется на максимальной скорости за короткие промежутки времени, а потом микроконтроллер переводится в энергосберегающий режим, то среднее значение энергопотребления оказывается меньше по сравнению с тем, если выполнять ту же задачу на меньшей скорости, но соответственно за большие промежутки времени (рис. 3). В этом и заключается одно из преимуществ AVR - высокая плотность программного кода и одновременно большая скорость выполнения приложения по сравнению с другими микроконтроллерами (см., например, табл. 1) дают в среднем выигрыш энергопотребления кристалла, даже если в режиме Power Down параметры микроконтроллера AVR оказываются хуже, чем у конкурентов.
Рис. 3. Среднее энергопотребление кристалла при смешанном режиме работы
В разработке у Atmel в настоящее время находятся два новых аппаратных узла AVR, о которых говорилось в первой части. Это усовершенствованный контроллер прерываний и новая система тактирования всего микроконтроллера - как самого ядра, так и его встроенных периферийных устройств.
Система тактирования для AVR второго поколения уже была существенно доработана по сравнению с реализацией тактирования у первых микроконтроллеров AVR. В качестве образца может быть рассмотрена система тактирования серийно выпускаемых кристаллов mega128 или mega169. Она стала достаточно гибкой, может использовать пять различных источников формирования тактового сигнала. Внутренний тактовый генератор может запускаться от внешнего генератора, внешнего кварцевого резонатора, а также от внешней RC-цепочки. Максимальная тактовая частота для новых кристаллов (например, tiny13) составляет 24МГц при напряжении питания 5,5В. Все AVR полностью статические, их минимальная рабочая частота ничем не ограничена вплоть до пошагового режима.
Для уменьшения длительности периодов работы микроконтроллера в активном режиме и, следовательно, для снижения энергопотребления кристалла, следует оптимально выбирать способ тактирования AVR (рис. 4). Время запуска осциллятора должно быть как можно меньше. Для этих целей удобно использовать внутренний RC-генератор, который выводит микроконтроллер на рабочий режим всего за 6 периодов тактовой частоты. Такое же время запуска можно получить, используя внешнюю RC-цепочку или внешний синхросигнал.
Рис. 4. Влияние системы тактирования на снижение энергопотребления кристалла
Выбор способа тактирования кристалла осуществляется путем установки или сброса fuse-битов CKSEL0:3, и пока еще этот выбор может быть сделан только на этапе программирования микроконтроллера. Чрезвычайно заманчиво было бы иметь возможность выбирать источник тактового сигнала "на лету", в процессе работы кристалла. Именно эта задача и стоит перед разработчиками AVR при создании новой системы тактирования кристалла.
Особый интерес представляет возможность тактирования AVR от встроенного RC-генератора, который калибруется на фабрике на разные частоты - от 1,0 до 9,6МГц. Всего у AVR имеется восемь разновидностей встроенного RC-генератора в пяти официальных версиях. Большинство популярных микроконтроллеров AVR общего назначения имеют RC-генератор версии 3.0/3.1, который с помощью установочных битов CKSELх может быть сконфигурирован на 4 возможные рабочие частоты: 1, 2, 4 и 8МГц. Это не всегда бывает удобно. Например, для стандартной поддержки U(S)ART тактовая частота должна быть 3,56МГц. В подобных случаях генератор можно откалибровать на работу с нужным значением тактовой частоты.
В последних версиях Data Sheet на микроконтроллеры AVR точность поддержания системной тактовой частоты внутренним RCгенератором приводится как +3%, хотя раньше она указывалась как +1%. Это сделано сознательно. В процессе изготовления на фабрике встроенный RC-генератор калибруется, как и прежде, с точностью +1% и настройки фиксируются в регистре OSCCAL. Но калибровка эта проводится при температуре 25°С, а микроконтроллер впоследствии может работать в диапазоне температур от -40 до +85 °С. В дополнение к этому значение частоты также может отличаться для разных версий выпускаемых кремниевых пластин с микроконтроллерами при одном и том же значении регистра OSCCAL. Поэтому в документации и указывается трехпроцентная точность поддержания системной тактовой частоты от установленного значения в случае работы кристалла от внутреннего RC-генератора в широком диапазоне рабочих температур и напряжений питания.
Как уже отмечалось, генератор калибруется на фабрике с точностью +1%. И он действительно работает с точностью +1%, но при определенных значениях температуры и напряжения питания микроконтроллера. Разработчик путем дополнительной калибровки и записи данных в регистр OSCCAL может довести точность поддержания системной тактовой частоты даже до +0,5%, что составляет минимальное значение погрешности. Дело в том, что величина шага калибровки не может быть определена точнее, так как зависимость частоты RC-генератора от значения OSCCAL также является нелинейной.
Рекомендации для разработчика здесь могут быть даны следующие: сначала нужно определить наиболее вероятный режим работы микроконтроллера по температуре и напряжению питания, а затем откалибровать генератор при этих условиях для работы с точностью
Читайте также: