В течение нескольких
последних лет в журнале «Радио» постоянно печаталась серия статей А. Долгого
(г. Москва), в которых достаточно подробно описывался процесс программирования
микроконтроллеров. Большая часть информации в этих статьях относилась к
программированию микроконтроллеров PIC16XXXX фирмы
MICRICHIP.
Чтобы не повторяться с
информационными материалами названного выше уважаемого автора, в этой книге
основное внимание будет уделено мною описанию принципов работы с микроконтроллерами
AVR фирмы
«ATMEL».
Основанная в
Начиная с середины 90-х
годов, фирма “Atmel” начала
активно развивать новое направление в своей деятельности – производство
высокопроизводительных 8-разрядных RISC-микроконтроллеров
для встраиваемых приложений, объединенных общим названием AVR
Микроконтроллеры AVR приобрели
большую популярность, привлекая разработчиков достаточно выгодным соотношением
таких показателей, как цена, быстродействие и энергопотребление. Кроме того важными параметрами являются удобные режимы
программирования, доступностью программно-аппаратных средств поддержки и
широкая номенклатура выпускаемых кристаллов. Микроконтроллеры этой серии
используются в автомобильной электронике, бытовой технике, сетевых картах и
материнских платах компьютеров, в мобильных телефонах нового поколения и т.д.
В рамках единой базовой
архитектуры AVR-микроконтроллеры
подразделяются на три семейства:
q
Tiny AVR –
дешевые и довольно простые по конструкции микроконтроллеры в 8-выводном
исполнении;
q
Classic AVR –
базовая линия микроконтроллеров;
q
Mega AVR –
микроконтроллеры для сложных приложений, требующих большого объема памяти
программ и данных.
В этой главе очень коротко
будут рассмотрены некоторые основные моменты конструкции микроконтроллеров
семейства Classic AVR, как
наиболее подходящие для радиолюбительского применения.
При этом все
микроконтроллеры семейства поддерживают несколько режимов пониженного
энергопотребления, имеют блок прерываний, сторожевой таймер и допускают
программирование непосредственно в готовом устройстве через последовательный
интерфейс SPI.
q
производительность,
приближающаяся к 1 MIPS/МГц;
q
усовершенствованная
AVR RISC архитектура;
q
раздельные шины
памяти команд и данных, 32 регистра общего назначения
q
Flash ПЗУ программ, с возможностью внутрисистемного
перепрограммирования и загрузки через SPI последовательный канал, 1000 циклов
стирание/запись;
q
EEPROM память данных,
с возможностью внутрисистемной загрузки через SPI последовательный канал,
100000 циклов стирание/запись;
q
блокировка режима
программирования;
q
встроенные
аналоговый компаратор, сторожевой таймер, порты SPI и UART, таймеры/счетчики;
q
полностью
статические приборы - работают при тактовой частоте от 0 Гц до 20 МГц;
q
диапазон
напряжений питания от 1,8 В до 6,0 В;
q
режимы
энергосбережения: пассивный (idle) и стоповый (power down).
AVR Classic – самая обширная производственная линии среди других Flash-микроконтроллеров
корпорации Atmel. Atmel
представила первый 8-разрядный Flash-микроконтроллер в 1993 году и с тех пор
непрерывно совершенствует технологию. Фирма постоянно работает над
совершенствованием своей продукции в следующих направлениях:
q
в снижении удельного энергопотребления
(мА/МГц);
q
расширения
диапазона питающих напряжений (до 1.8 В), что существенно для продления ресурса
батарейных систем;
q
увеличения быстродействия до 16 млн. операций
в секунду;
q
встройки в
изделия реально-временных эмуляторов и отладчиков;
q
реализации
функции самопрограммирования;
q
совершенствования
и расширения количества периферийных модулей;
q
встройки специализированных устройств
(радиочастотный передатчик, USB-контроллер, драйвер ЖКИ, программируемая
логика, контроллер DVD, устройства защиты данных) и др.
Успех AVR-микроконтроллеров
объясняется возможностью простого выполнения проекта с достижением необходимого
результата в кратчайшие сроки, чему способствует доступность большого числа
инструментальных средств проектирования, поставляемых,
как непосредственно корпорацией Atmel, так и
сторонними производителями. Ведущие сторонние производители выпускают полный
спектр компиляторов, программаторов, ассемблеров, отладчиков, разъемов и
адаптеров. Отличительной чертой инструментальных средств от Atmel
является их невысокая стоимость.
Таким образом, AVR-микроконтроллеры
представляют более широкие возможности по оптимизации
производительности/энергопотребления, что особенно важно при разработке
приложений с батарейным питанием. Микроконтроллеры обеспечивает
производительность до 16 млн. оп. в
секунду и поддерживают Flash-память программ различной емкости: 1… 256 кбайт.
В таблицах 3.1, 3.2 и 3.3
приведены некоторые данные по основным семействам AVR микроконтроллеров.
Таблица 3.1. Микроконтроллеры с архитектурой TinyAVR
Напр. питания В |
Тактовая частота, МГц |
I/O |
FLASH |
EEP- ROM |
SRAM (ОЗУ) |
АЦП |
Корпус |
|
ATtiny11 |
2,7-5,5 |
6 |
6 |
1К |
-- |
-- |
-- |
PDIP8 SOIC8 |
ATtiny12 |
1,8-5,5 |
6 |
6 |
1К |
64 |
-- |
-- |
PDIP8 SOIC8 |
ATtiny13 |
1,8-5,5 |
20 |
6 |
1К |
64 |
64 |
4x10bit |
PDIP8 SOIC8 |
ATtiny15 |
2,7-5,5 |
6 |
6 |
1К |
64 |
-- |
4x10bit |
PDIP8 SOIC8 |
ATtiny2313 |
1,8-5,5 |
20 |
15 |
2К |
128 |
128 |
-- |
PDIP20 SOIC20 MLF32 |
ATtiny26 |
2,7-5,5 |
16 |
16 |
1К |
128 |
128 |
11x10bit |
PDIP20 SOIC20 MLF32 |
ATtiny28 |
1,8-5,5 |
4 |
20 |
2К |
-- |
-- |
-- |
PDIP20 SOIC20 MLF32 |
Таблица 3.2. Микроконтроллеры с архитектурой Classic AVR
Напр. питания В |
Тактовая частота, МГц |
I/O |
FLASH |
EEP- ROM |
SRAM (ОЗУ) |
АЦП |
Корпус |
|
AT90S1200 |
2,7-6,0 4,0-6,0 |
4 12 |
15 |
1К |
64 |
-- |
-- |
DIP20 SO20 SSOP20 |
AT90S2313 |
2,7-6,0 4,0-6,0 |
4 10 |
15 |
2К |
128 |
128 |
-- |
DIP20 SO20 |
AT90LS2323 |
2,7-6,0 |
4 |
3 |
2К |
128 |
128 |
-- |
DIP8 SO8 |
AT90S2323 |
4,0-6,0 |
10 |
3 |
2К |
128 |
128 |
-- |
DIP8 SO8 |
AT90LS2343 |
2,7-6,0 |
4 |
5 |
2К |
128 |
128 |
-- |
DIP8 SO8 |
AT90S2343 |
4,0-6,0 |
10 |
5 |
2К |
128 |
128 |
-- |
DIP8 SO8 |
AT90LS4433 |
2,7-6,0 |
4 |
20 |
4К |
256 |
128 |
6x10bit |
DIP28 TQFP3 |
AT90S4433 |
4,0-6,0 |
8 |
20 |
4К |
256 |
128 |
6x10bit |
DIP28 TQFP3 |
AT90LS8515 |
2,7-6,0 |
4 |
32 |
8К |
512 |
512 |
-- |
DIP40 TQFP4 PLCC44 |
AT90S8515 |
4,0-6,0 |
8 |
32 |
8К |
512 |
512 |
-- |
DIP40 TQFP4 PLCC44 |
AT90LS8535 |
2,7-6,0 |
4 |
32 |
8К |
512 |
512 |
8x10bit |
DIP40 TQFP4 PLCC44 |
AT90S8535 |
4,0-6,0 |
8 |
32 |
8К |
512 |
512 |
8x10bit |
DIP40 TQFP4 \PLCC44 |
Таблица 3.3. Микроконтроллеры с архитектурой MegaAVR
Тип |
Напр. питния В |
Тактовая частота, МГц |
I/O |
FLASH |
EEP- ROM |
SRAM (ОЗУ) |
АЦП |
Корпус |
ATmega48 |
1,8-5,5 |
20 |
23 |
4K |
256 |
512 |
6x10bit 2x8bit |
DIP28 TQFP3 MLF32 |
ATmega88 |
1,8-5,5 |
20 |
23 |
8K |
512 |
1K |
6x10bit 2x8bit |
DIP28 TQFP3 MLF32 |
ATmega168 |
1,8-5,5 |
20 |
23 |
16K |
512 |
1K |
6x10bit 2x8bit |
DIP28 TQFP3 MLF32 |
ATmega8 |
2,7-5,5 |
16 |
23 |
8K |
512 |
1K |
8x10bit |
DIP28 TQFP3 MLF32 |
ATmega16 |
2,7-5,5 |
16 |
32 |
16K |
512 |
1K |
8x10bit |
DIP40 TQFP4 MLF44 |
ATmega32 |
2,7-5,5 |
16 |
32 |
32K |
1K |
2K |
8x10bit |
DIP40 TQFP4 MLF44 |
ATmega64 |
2,7-5,5 |
16 |
53 |
64K |
2K |
4K |
8x10bit |
TQFP64 MLF64 |
ATmega128 |
2,7-5,5 |
16 |
53 |
128K |
4K |
4K |
8x10bit |
TQFP64 MLF64 |
AT90CAN128 |
2,7-5,5 |
16 |
53 |
128K |
4K |
4K |
8x10bit |
TQFP64 MLF64 |
ATmega103 |
4,0-5,5 |
8 |
48 |
128K |
4K |
4K |
8x10bit |
TQFP64 |
ATmega161 |
2,7-5,5 |
8 |
35 |
16K |
512 |
1K |
-- |
DIP40 TQFP44 MLF44 |
ATmega162 |
1,8-5,5 |
16 |
35 |
16K |
512 |
1K |
-- |
DIP40 TQFP44 MLF44 |
ATmega163L |
2,7-5,5 |
8 |
32 |
16K |
512 |
1K |
8x10bit |
DIP40 TQFP44 MLF44 |
ATmega169 |
1,8-5,5 |
4 |
53 4x25 LCD |
16K |
512 |
1K |
8x10bit |
TQFP64 |
ATmega8515 |
2,7-5,5 |
16 |
35 |
8K |
512 |
512 |
-- |
PDIP40 PLCC4 TQFP44 |
ATmega8535 |
2,7-5,5 |
16 |
32 |
8K |
512 |
512 |
8x10bit |
PDIP40 PLCC4 TQFP44 |
ATmega325 |
1,8-5,5 |
16 |
53 |
32K |
1K |
2K |
8x10bit |
TQFP MLF |
ATmega3250 |
1,8-5,5 |
16 |
68 |
32K |
1K |
2K |
8x10bit |
TQFP MLF |
ATmega645 |
1,8-5,5 |
16 |
53 |
64K |
2K |
4K |
8x10bit |
TQFP MLF |
ATmega6450 |
1,8-5,5 |
16 |
68 |
64K |
2K |
4K |
8x10bit |
TQFP MLF |
Все приборы одного
семейства AVR совместимы по исходным кодам и тактированию. Семейство
обеспечено комплектом программ и системами отладки, включающими: макро-ассемблеры, отладчики/симуляторы программ,
внутрисхемные эмуляторы, и отладочные устройства.
Микроконтроллеры семейства
AVR поставляются в очищенном состоянии – содержимое и Flash-памяти программ и ЭСППЗУ
данных находится в состоянии FF и готово к программированию.
Основными
характеристиками центрального процессора микроконтроллеров рассматриваемого
семейства Classic являются:
q
полностью
статическая архитектура; минимальная тактовая частота равна нулю;
q
АЛУ подключено
непосредственно к регистрам общего назначения;
q
большинство
команд выполняется за один машинный цикл;
q
многоуровневая
система прерываний; поддержка очереди прерываний;
q
от 3 до 16
источников прерываний (из них до 2 внешних);
q
наличие
программного стека.
Основными
характеристиками подсистемы ввода/вывода являются:
q
программное
конфигурирование и выбор портов ввода/вывода;
q
каждый вывод
может быть запрограммирован как входной или как выходной независимо от других;
q
входные буферы с
триггером Шмитта на всех выводах;
q
возможность
подключения ко всем входам внутренних подтягивающих резисторов (сопротивление
резисторов составляет 35…120 кОм);
q
нагрузочная
способность всех выводов составляет до 20 мА, что позволяет непосредственно
управлять светодиодными индикаторами.
Микроконтроллеры
семейства Classic обладают достаточно развитой периферией. Набор периферийных устройства, имеющихся в составе того или иного
микроконтроллера, зависит от конкретной модели. Перечислим все периферийные
устройства, так или иначе встречающиеся в микроконтроллерах семейства:
q
8-разрядный таймер/счетчик
с предделителем (таймер Т0);
q
16-разрядный
таймер/счетчик с предделителем (таймер Т1);
q
8-разрядный
таймер/счетчик с возможностью работы в асинхронном режиме (таймер Т2);
q
сторожевой таймер
(WDT);
q
одно- или
двухканальный 8… 10-разрядный генератор сигнала с широтно-импульсной модуляцией
(ШИМ);
q
одноканальный
8-разрядный генератор сигнала с ШИМ;
q
аналоговый
компаратор;
q
10-разрядный АЦП
(6 или 8 каналов);
q
полнодуплексный
универсальный асинхронный приемопередатчик (UART);
q
последовательный
синхронный интерфейс SPI.
Ядро
является «сердцем» микроконтроллеров AVR. Оно выполнено
по усовершенствованной RISC (enhanced RISC)
архитектуре, в которой используется ряд решений, направленных на повышение
быстродействия микроконтроллеров. Схематическое упрощенное изображение ядра
показано на рис. 3.5.
Рис. 3.5. Архитектура ядра микроконтроллера
Арифметико-логическое
устройства (АЛУ) выполняет все вычисления и непосредственно подключено к 32
рабочим регистрам, объединенным в регистровый файл. Благодаря этому АЛУ
выполняет одну операцию (чтение содержимого регистров, выполнение операции и
запись результата обратно в регистровый файл) за один машинный цикл.
В
микроконтроллерах AVR практически все команды (за
исключением команд, у которых одним из операндов является 16-разрядный адрес)
занимают одни ячейку памяти программ.
Наиболее распространенное
среди радиолюбителей семейство микроконтроллеров AVR Classic состоит
в общей сложности из 17 моделей микроконтроллеров. Все они выпускаются в
корпусах различных типов, что позволяет выбрать модель, наилучшим образом
отвечающую требованиям по компоновке.
В табл. 3.2 приводятся
основные параметры микроконтроллеров, такие как объем памяти (программ и
данных), количество контактов ввода/вывода, тип корпуса, диапазон рабочих
частот и напряжение питания.
Полную информацию по каждой
модели следует искать в специальной литературе. Дополнительно следует отметить,
что все микроконтроллеры семейства Classic выпускаются или в коммерческом (диапазон рабочих
температур 0… +70°С), или в промышленном (диапазон рабочих температур
-40…+85°С) исполнениях.
С целью ограничения
размеров данной главы, далее ограничимся рассмотрением только микроконтроллера
модели AT90S1200, который
является типичным представителем семейства Classic AVR.
Кроме того, в Приложении 4 приведено достаточно
подробное описание еще одного очень популярного микроконтроллера – AT90S2313.
Данные по остальным моделям
AVR МК можно найти в специальной литературе.
На рис. 3.6 показано
расположение выводов МК модели AT90S1200.
Рис. 3.6. Расположение выводов AT90S1200
В табл. 3.4 для микроконтроллера AT90S1200 приведены названия выводов и указаны их
функции (как основные, так и дополнительные). Кроме того, для каждого вывода в
таблице указан его тип (вход, выход, вход/выход, вывод питания).
В таблице 3.4
использованы следующие обозначения выводов:
I – вход;
O – выход;
I/O – вход/выход;
P – выводы
питания.
Таблица
3.4. Описание выводов модели AT90S1200
Обозначение |
Номер вывода |
Тип вывода |
Описание |
XTAL1 |
5 |
I |
Вход инвертора генератора и вход
внешнего тактового сигнала |
XTAL2 |
4 |
O |
Выход инвертора генератора |
RESET |
1 |
I |
Вход сброса. При удержании на входе
НИЗКОГО уровня в течение 50 нс выполняется сброс
устройства. |
Порт В. 8-разрядный двунаправленный порт
ввода/вывода с внутренними подтягивающими резисторами |
|||
PB0 (AIN0) |
12 |
I/O |
B0 (Положительный вход компаратора) |
PBI (AIN1) |
13 |
I/O |
B1 (Отрицательный вход компаратора) |
PB2 |
14 |
I/O |
B2 |
PB3 |
15 |
I/O |
B3 |
PB4 |
16 |
I/O |
B4 |
PB5 (MPS1) |
17 |
I/O |
B5 (Вход данных при последовательном
программировании (SPI)) |
PB6 (MISO) |
18 |
I/O |
B6 (Выход данных при
последовательном программировании (SPI)) |
PB7 (SCK) |
19 |
I/O |
B7 (Вход тактового сигнала при
последовательном программировании SPI)) |
Порт D. 7-разрядный двунаправленный порт
ввода/вывода с внутренними подтягивающими резисторами |
|||
PD0 |
2 |
I/O |
D0 |
PD1 |
3 |
I/O |
D1 |
PD2 (INT0) |
6 |
I/O |
D2 (Вход внешнего прерывания) |
PD3 |
7 |
I/O |
D3 |
PD4 (T0) |
8 |
I/O |
D4 (Вход внешнего тактового сигнала
таймера/ счетчика Т0) |
PD5 |
9 |
I/O |
D5 |
PD6 |
11 |
I/O |
D6 |
GND |
10 |
P |
Общий вывод |
Vcc |
20 |
P |
Вывод источника питания |
Структурная
схема микроконтроллера AT90S1200 приведена на рис. 3.7. Его отличительные
особенности:
q
2 порта
ввода/вывода: B (8-разрядный) и D (7-разрядный);
q
3-уровневый
аппаратный стек;
q
встроенный
тактовый RC-генератор;
q
аналоговый
компаратор;
q
возможность
подключения внешнего кварцевого резонатора.
Рис. 3.7. Структурная схема микроконтроллера AT90S1200
Организация
памяти микроконтроллеров AVR семейства Classic,
в том числе и МК AT90S1200, выполнена по гарвардской архитектуре, в которой
разделены не только адресные пространства памяти программ и памяти данных, но
также и шины доступа к ним. Причем память данных состоит из трех областей:
регистровая память, статическое ОЗУ и память на основе EEPROM. В связи с тем, что регистровая память находится в
адресном пространстве ОЗУ, об этих двух областях памяти обычно говорят как об
одной. Каждая из областей (ОЗУ и EEPROM)
расположена в своем адресном пространстве.
Заметим,
что модель AT90S1200 не имеет внутреннего ОЗУ (хотя регистровая
память, естественно, присутствует).
Обобщенная карта памяти
микроконтроллеров AVR семейства Classic приведена на
рис. 3.8.
Рис. 3.8. Схема карты памяти микроконтроллеров
семейства Classic
Следует заметить, что:
1)
поскольку
микроконтроллеры AVR имеют 16-разрядную систему команд, объем памяти
программ на рисунке указан не в байтах, а в 16-разрядных словах;
2)
символ «$» перед
числом означает, что это число записано в шестнадцатеричной системе счисления.
Память программ
предназначена для хранения команд, управляющих функционированием
микроконтроллера. В памяти программ хранятся также различные константы, не
меняющиеся во время работы программы. Память программ в микроконтроллерах
семейства Classic представляет собой
электрически стираемое ППЗУ (FLASH-ПЗУ).
Поскольку все команды занимают в памяти 16 бит (некоторые – 32 бита), память
программ имеет 16-разрядную организацию. Соответственно, объем памяти
составляет от 512 16-разрядных слов для модели AT90S1200 до 40%
слов для старших моделей.
Для адресации памяти
программ используется счетчик команд (PC – Program Counter).
Размер счетчика команд составляет от 9 до 12 разрядов в зависимости от объема
адресуемой памяти.
По адресу $000 памяти
программ находится вектор сброса. После инициализации (сброса) микроконтроллера
выполнение программы начинается с этого адреса (фирма Atmel рекомендует размещать по этому адресу команду
относительного перехода к инициализационной части программы).
Начиная с
адреса $001 располагается таблица
векторов прерывания. Ее размер зависит от модели микроконтроллера и составляет
от 2 (адреса $001, $002) до 16 (адреса $001...$010) векторов. При возникновении
прерывания после сохранения в стеке текущего значения счетчика команд
происходит выполнение команды, расположенной по адресу соответствующего
вектора. Поэтому по этим адресам располагаются команды относительного перехода
к подпрограммам обработки прерываний. Ниже приведен типичный листинг начала
программы для модели AT90S1200.
Листинг
3.1. Текст начала программы для AT90S1200
;-----------------------------------------------------------------------------
Address Labels Code Comments
$000 rjmp
RESRT ; Обработчик
сброса
$001 rjmp EXT INT0
; Обработчик внешнего прерывания
$002 rkmp TIM OVF0
; Обработчик прерывания
;
от таймера 0
$003 MAIN: ldi r16, ; начало основной программы
low (RAMEND)
out
SPL, r16
<инструкция> ххх
;-----------------------------------------------------------------------------
Если в программе прерывания
не используются (запрещены), то основная программа может начинаться
непосредственно с адреса $001.
В заключение следует
отметить, что FLASH-ПЗУ, используемое в
микроконтроллерах AVR, рассчитано как минимум на
1000 циклов стирания/записи.
Память данных микроконтроллеров семейства Classic разделена
на три части: регистровая память, оперативная память (статическое ОЗУ) и
энергонезависимое ЭСППЗУ (EEPROM).
Регистровая
память включает в себя 32 регистра общего назначения (РОН), объединенных в
регистровый файл и служебные регистры ввода/вывода (РВВ). Размер регистровой
памяти фиксирован и для всех моделей составляет 96 байт, соответственно под РОН
отводится 32 байта, а под РВВ – 64 байта.
В области регистров ввода/вывода
расположены различные служебные регистры (регистр указателя стека, регистр
состояния и т.п.), а также регистры управления периферийными устройствами,
входящими в состав микроконтроллера. Общее количество РВВ зависит от конкретной
модели микроконтроллера.
Для
хранения переменных программ вместе с регистрами также может использоваться
статическое ОЗУ объемом от 128 до 512 байт. Кроме того, микроконтроллеры AT90S4414 и AT90S8515 имеют
возможность подключения внешнего статического ОЗУ объемом до 64 Кбайт.
Для
хранения данных, которые могут изменяться в процессе настройки и
функционирования готовой системы (калибровочные константы, серийные номера,
ключи и т.п.), может быть использована EEPROM-память. Ее объем составляет для различных моделей от
64 до 512 байт. Эта память расположена в отдельном адресном пространстве, а
доступ к ней осуществляется с помощью определенных
РВВ.
В
микроконтроллерах AVR семейства Classic используется
линейная организация памяти. Объем статического ОЗУ для различных моделей
семейства составляет от 128 до 512 байт (см. табл. 3.2).
В адресном пространстве ОЗУ
также расположены все регистры микроконтроллеров, под них отведены младшие 96
адресов (см. рис. 3.9). Основные адреса отведены под 128/256/512…64 К ячеек статического ОЗУ.
На рис. 3.9 схематически
показана организация статического ОЗУ.
Рис. 3.9. Схема организации статического ОЗУ
Прежде чем перейти к
описанию имеющихся в МК регистров, хочу обратить ваше внимание на то, что в Приложении 4 все регистры МК AT90S2312 рассмотрены
очень подробно. Поскольку большинство регистров AT90S1200 идентичны описанным в Приложении 4,
считаю возможным далее в этой главе ограничиться только описанием некоторых
общих особенностей. Для большего количества информации смотрите Приложение 4 либо специальную
литературу, например,[8].
Все регистры общего
назначения (РОН) объединены в файл, структура которого показана на
рис. 3.10.
Рис. 3.10. Структура регистров общего
назначения
Как уже было сказано, в
микроконтроллерах AVR все 32 РОН непосредственно доступны АЛУ в отличие от
микроконтроллеров других фирм, в которых имеется только один такой регистр –
рабочий регистр W (аккумулятор). Благодаря этому любой РОН может
использоваться во всех командах и как операнд-источник и как операнд-приемник.
Исключение составляют лишь пять арифметических и логических команд, выполняющих
действия между константой и регистром (SBCI, SUBI,
CPI,
ANDI,
ORI),а
также команда загрузки константы в регистр (LDI). Эти команды могут
обращаться только ко второй половине регистров (R16...R31).
Ряд регистров общего назначения используется в
качестве указателей при косвенной адресации памяти данных. В модели AT90S1200 таким регистром
является регистр R30 (регистр
Z).
Поскольку объем адресуемой памяти данных этой модели составляет всего 96 байт,
для хранения адреса достаточно одного 8-разрядного регистра. Во всех других
моделях для косвенной адресации используются три 16-разрядных регистра
(регистры X, Y и Z), каждый из которых
получается объединением двух РОН (рис. 3.11).
Рис. 3.11.
Регистры-указатели X, Y и Z
Как показано на рис. 3.10, каждый регистр
файла имеет свой собственный адрес в пространстве памяти данных (кроме AT90S1200). Поэтому к ним
можно обращаться как к памяти, несмотря на то, что физически эти регистры не
являются ячейками ОЗК.
Регистры ввода/вывода (РВВ) располагаются в так
называемом пространстве ввода/вывода размером 64 байта. Все РВВ можно разделить
на две группы:
q служебные
регистры микроконтроллера;
q регистры,
относящиеся к периферийным устройствам (в т.ч. порты ввода/вывода).
Размер каждого регистра – 8 разрядов.
Распределение адресов пространства ввода/вывода
зависит от конкретной модели микроконтроллера, т.к. разные модели имеют
различный состав периферийных устройств и, соответственно, разное количество
регистров.
К любому регистру ввода/вывода можно обратиться
с помощью команд IN
и OUT, выполняющих
пересылку данных между одним из 32 РОН и пространством ввода/вывода. Кроме
того, имеются 4 команды поразрядного допуска, использующие в качестве операндов
регистры ввода/вывода команды установки/сброса отдельного
разряда (SBI
и CBI) и
команды проверки состояния отдельного разряда (SBIS и SBIC).
Таблица
3.5. Регистры ввода/вывода модели AT90S1200 и AT90S2313
Название |
Функция |
AT90S1200 |
AT90S2313 |
ACSR |
Регистр управления и состояния
аналогового компаратора |
$08 |
$08 ($28) |
DDRB |
Регистр направления данных порта В |
$17 |
$17 ($37) |
DDRD |
Регистр направления данных порта D |
$11 |
$11 ($31) |
EEAR |
Регистр адреса EEPROM |
$IE |
$IE ($3E) |
EECR |
Регистр данных EEPROM |
$IC |
$IC ($3C) |
EEDR |
Общий регистр флагов
прерываний |
$ID |
$ID ($3D) |
GIFR |
Общий регистр маски прерываний |
-- |
$3A ($5A) |
GIMSK |
Регистр захвата таймера/счетчика 1
(старший байт) |
$3B |
$3B ($5B) |
ICRIH |
Регистр захвата таймера/счетчика 1
(младший байт) |
-- |
$25 ($$45) |
ICRIL |
Общий регистр управления
микроконтроллером |
-- |
$24 ($44) |
MCUCR |
Регистр состояния микроконтроллера |
$35 |
$35 ($55) |
MCUSR |
Регистр состояния микроконтроллера |
-- |
-- |
OCRIAH |
Регистр совпадения выхода 1
(старший байт) |
-- |
$2B ($4B) |
OCRIAL |
Регистр совпадения выхода 1
(младший байт) |
-- |
$2A ($4A) |
PINB |
Выводы порта В |
$16 |
$16 ($36) |
PIND |
Выводы порта D |
$10 |
$10 ($30) |
PORTB |
Регистр данных порта В |
$18 |
$18 ($38) |
PORTD |
Регистр данных порта D |
$12 |
$12 ($32) |
SPL |
Указатель стека |
-- |
$3D ($5D) |
SREG |
Регистр состояния |
$3F |
$3F ($5F) |
TCCR0 |
Регистр управления таймером/счетчиком 0 |
$33 |
$33 ($53) |
TCCRIA |
Регистр управления А таймером/счетчиком 1 |
-- |
$2F ($4F) |
TCCRIB |
Регистр управления В таймером/счетчиком 1 |
-- |
$2E ($4E) |
TCNT0 |
Счетный регистр таймера/счетчика 0
(8-разрядный) |
$32 |
$32 ($52) |
TCNTIH |
Счетный регистр таймера/счетчика 1 |
-- |
$2D ($4D) |
TCNTIL |
Счетный регистр таймера/счетчика 1
(младший байт) |
-- |
$2C ($4C) |
TIFR |
Регистр флагов
прерываний от таймера/счетчика |
$38 |
$38 ($58) |
TIMSK |
Регистр маски прерываний от
таймера/счетчика |
$39 |
$39 ($59) |
UBRR |
Регистр скорости
передачи UART |
-- |
$09 ($29) |
UCR |
Регистр управления UART |
-- |
$0A ($2A) |
UDR |
регистр данных UART |
-- |
$0C ($2C) |
USR |
Регистр состояния UART |
-- |
$0B ($2B) |
WDTCR |
Регистр управления сторожевым
таймером |
$21 |
$21 ($41) |
Далее рассмотрим служебные регистры
микроконтроллера. Обратите внимание, что адреса служебных регистров не меняются
от моделей к модели (т.е. регистр SREG всегда расположен по
адресу $3F ($5F), регистр GIMSK –
по адресу $3B ($5B)и т.д.).
Все используемые разряды регистров
доступны как для чтения, так и для записи в любой момент времени. После сброса
микроконтроллера содержимое регистров равно 0, поэтому в самом начале программы
указатель стека необходимо проинициализировать каким-либо значением (как
правило, это наибольший для конкретного микроконтроллера адрес памяти данных).
Все
микроконтроллеры AVR семейства Classic, за
исключением модели AT90S1200, поддерживают 8 способов адресации для доступа к
различным областям памяти данных (РОН, РВВ, ОЗУ). Модель AT90S1200 в связи с
отсутствием у нее встроенного ОЗУ и из-за наличия единственного индексного
регистра поддерживает только 4 способа адресации из восьми.
В
действительности способов адресации всего два:
q
прямая адресация;
q
косвенная
адресация.
Однако каждый способ адресации имеет
несколько разновидностей в зависимости от того, к какой области памяти
производится обращение (для прямой адресации) или какие дополнительные действия
выполняются над индексным регистром (для косвенной адресации).
При
прямой адресации адреса операндов содержатся непосредственно в слове команды. В
соответствии со структурой памяти данных существуют следующие разновидности
прямой адресации: прямая адресация одного РОН, прямая адресация двух РОН,
прямая адресация РВВ, прямая адресация ОЗУ.
Этот способ адресации
используется в командах, оперирующих с одним из регистров общего назначения.
При этом адрес регистра- операнда (его номер) содержится в разрядах 8…4 (5 бит)
слова команды.
Примером
команд, использующих этот способ адресации, являются команды работы со стеком (PUSH, POP), команды
инкремента (INC), декремента (DEC), а также некоторые команды арифметических операций.
Этот способ адресации используется
в командах, оперирующих одновременно с двумя регистрами общего назначения. При
этом адрес регистра-источника содержится в разрядах 9, 3…0 (5 бит), а адрес
регистра-приемника в разрядах 8…4 (5 бит) слова команды.
К командам, использующим
этот способ адресации, относятся команда пересылки данных из регистра в регистр
(MOV), а также большинство команд арифметических операций.
Данный
способ адресации используется командами пересылки данных между регистром
ввода/вывода и регистровым файлом – IN и OUT. В этом случае адрес регистра ввода/вывода содержится
в разрядах 10, 9, 3…0 (6 бит), а адрес РОН – в разрядах 8…4 (5 бит).
Как
следует из названия, данный способ используется при обращении ко всему адресному
пространству памяти данных. Естественно, этот способ адресации не
поддерживается микроконтроллером AT90S1200.
В
системе команд микроконтроллеров семейства имеется только две команды,
использующие этот способ адресации. Это команды пересылки байта между одним из
РОН и ячейкой ОЗУ – LDS и STS. Каждая из
этих команд занимает в памяти программ два слова (32 бита). В первом слове
содержится код операции и адрес регистра общего назначения (в разрядах с 8-го
по 4-й). Во втором слове находится адрес ячейки памяти, к которой происходит
обращение.
Еще раз обращаем ваше внимание, что
по адресам $00...$IF расположен файл регистров общего назначения, а по
адресам $20...$5F расположены регистры ввода/вывода.
При
косвенной адресации адрес ячейки памяти (для AT90S1200 –
регистра) находится в одном из индексных регистров X, Y и Z. В зависимости
от дополнительных манипуляций, которые производятся над содержимым индексного
регистра, различают следующие разновидности косвенной адресации: простая косвенная
адресация, относительная косвенная адресация, косвенная адресация с преддекрементом и косвенная адресация с постинкрементом.
Сразу
отметим, что AT90S1200 поддерживает только этот вид косвенной адресации.
При использовании команд простой косвенной адресации обращение производится по
адресу (регистра – для AT90S1200, ячейки памяти – для остальных моделей), который
находится в индексном регистре. Никаких действий с содержимым индексного
регистра при этом не производится.
Микроконтроллеры
поддерживают 6 команд (по 2 для каждого индексного регистра) простой косвенной
адресации:
При
использовании команд относительной косвенной адресации адрес ячейки памяти, к
которой производится обращение, получается суммированием содержимого индексного
регистра (Y или Z) и константы,
задаваемой в команде. Другими словами, производится обращение по адресу,
указанному в команде, относительно адреса, находящегося в индексном регистре.
Соответственно
микроконтроллера поддерживают 4 команды относительной косвенной адресации (две
для регистра Y и две для регистра Z):
При использовании команд косвенной адресации с преддекрементом содержимое индексного регистра сначала
увеличивается на 1, а затем производится обращение по полученному адресу.
Микроконтроллеры семейства поддерживают 6 команд
(по 2 для каждого индексного регистра) косвенной адресации с преддекрементом:
При использовании команд косвенной адресации с постинкрементом после обращения по адресу, который
находится в индексном регистре, содержимое индексного регистра уменьшается на
1.
Микроконтроллеры семейства поддерживают 6 команд
(по 2 для каждого индексного регистра) косвенной адресации с постинкрементом: LD Rd, X+/Y+/Z+ пересылка байта из ОЗУ в РОН) и ST X+/Y+/Z+, Rd (пересылка
байта из РОН в ОЗУ). Адрес регистра общего назначения содержится в разрядах 8…4
слова команды.
Как уже было сказано, микроконтроллеры AVR семейства
Classic
имеют в своем составе энергонезависимую память (EEPROM). Объем этой памяти
колеблется от 64 байт в модели AT90S1200 до 512 байт в старших моделях. EEPROM-память
расположена в своем адресном пространстве и так же, как и ОЗУ, организована
линейно.
Для
обращения к EEPROM-памяти используются три
регистра: регистр адреса, регистр данных и регистр управления. Все эти
регистры, а также их использование подробно рассматриваются в этом пункте.
В
регистр адреса загружается адрес ячейки, к которой будет производиться
обращение. В моделях микроконтроллеров с объемом EEPROM-памяти до 256 байт регистр адреса реализован на одном
РВВ (регистр ввода/вывода) – EEAR (EEPROM
Addres Register), расположенном по адресу $IE ($3E). В моделях
микроконтроллеров с объемом EEPROM-памяти,
равным 512 байт, для адресации всего адресного пространства требуется уже
девять разрядов, поэтому регистр адреса в них реализован на двух
РВВ – EEARH (старший байт адреса) и EEARL (младший байт
адреса). Эти регистры расположены по адресам $IF ($3F) и $IE ($3E) соответственно.
Все
перечисленные регистры доступны как для записи, так и для чтения. При этом
содержимое разрядов 7…1 регистра EEARH, разумеется,
игнорируется.
Регистр
ввода/вывода, являющийся регистром данных EEPROM-памяти, называется EEDR (EEPROM
Data Register),
а расположен он по адресу $ID ($3D). При записи в этот регистр загружаются данные,
которые должны быть помещены в EEPROM
по адресу, находящемуся в регистре EEAR.
Как следует из названия,
данный регистр используется для управления доступом к EEPROM-памяти. Этот регистр, который называется EECR (EEPROM
Control Register),
расположен по адресу $IC ($3C),. Разные модели предоставляют неодинаковые
возможности по управлению процессами записи/чтения в EEPROM, поэтому состав управляющих разрядов в регистре EECR зависит
от конкретной модели микроконтроллера.
Таким образом, процедура записи одного байта в EEPROM-память состоит из
следующих этапов:
1.
Дождаться готовности EEPROM к
приему новых данных (ждать, пока не сбросится флаг EEWE регистра
EECR).
2.
Загрузить байт данных в
регистр EEDR, а
требуемый адрес – в регистр EEAR (EEARH:EEARL).
3.
Установить в «1» флаг EEMWE регистра
EECR. Причем
для выполнения этой операции необходимо в том же машинном цикле записать «0» в
разряд EEWE.
4.
В течение 4 машинных
циклов после установки флага EEMWE записать
в разряд EEWE
регистра EECR
лог: «1».
Для микроконтроллера AT90S1200, в регистре EECR которого
отсутствует флаг EEMWE, пункты
3 и 4 сводятся к простой установке разряда EEWE. Обратите внимание, что после установки этого
разряда в «1» процессор пропускает 2 машинных цикла перед началом выполнения
следующей инструкции.
Длительность цикла записи составляет 2…4 мс, в
зависимости от напряжения питания микроконтроллера (2 мс при Vcc
= 2,7 В). По окончании цикла записи разряд EEWE аппаратно
сбрасывается, после чего программа может начать запись следующего байта.
С учетом сказанного фрагмент программы,
осуществляющей запись в EEPROM, выглядит
следующим образом (на примере модели AT90S1200):
;-----------------------------------------------------------
EEWrite:
sbic EECR,EEWE ;
ждать, пока флаг EEWE
не будет
rjmp EEWrite ;
сброшен
sli ; запретить прерывания
out EEAR, AddrReq ;
загрузить адрес (AddrReq – РОН)
out EEAR, DataReq ;
загрузить данные (DataReq – РОН)
sbi EECR, EEWE ;
выдать строб записи в EEPROM
sli ;
разрешить
прерывание
(если необходимо)
;------------------------------------------------------------------
Процедура чтения данных из EEPROM гораздо
проще, чем процедура записи. После загрузки требуемого адреса в регистр EEAR (EEARH;EEARL) программа должна
установить в «1» разряд EERE
регистра EECR. Когда
запрошенные данные будут находиться в регистре данных EEDR, произойдет аппаратный
сброс этого разряда.
С учетом сказанного фрагмент программы,
осуществляющей чтение из EEPROM, выглядит
следующим образом (на примере модели AT90S1200):
;
-------------------------------------------------------------
sbic EECR, EEWE ; ждать окончания текущей записи
rjmp EERead ; (пока флаг EEWE не станет равным
; «0»)
out EEDR, AddrReq ; загрузить адрес (AddrReq
-- РОН
sbi EECR, EERE ; выдать
строб чтения из EEPROM
in DataReq,
EEDR ;прочитанный байт – в РОН DataReq
; ---------------------------------------------------
К
сожалению, у EEPROM-памяти есть один
недостаток: во время работы при пониженном напряжении питания
хранящиеся в ней данные могут быть повреждены. Это может произойти по двум
причинам:
1.
Обычная процедура записи в EEPROM
требует некоторого минимального
напряжения питания; если напряжение питания ниже этой величины, запись не может
быть выполнена.
2. Микроконтроллер сам может выполнять команды
некорректно, если напряжение питания будет ниже некоторой величины.
Чтобы избежать повреждения данных,
хранящихся в EEPROM, достаточно воспользоваться
одним из трех следующих решений: