Занимательная электроника — страница 97 из 128

ий с битами. Тем не менее, это не приводит к заметным трудностям при изучении AVR-ассемблера — наоборот, программы получаются короче и больше напоминают программу на языке высокого уровня (отметим, что AVR проектировались специально в расчете на максимальное приближение к структуре языка С).

Другое огромное преимущество AVR-архитектуры — наличие 32 оперативных регистров, не во всем равноправных, но позволяющих в простейших случаях обходиться без обращения к оперативной памяти и, что еще важнее, без использования стека — главного источника ошибок у начинающих программистов (мало того, в младших моделях AVR стек даже недоступен для программиста). Для AVR не существует понятия «аккумулятора», ключевого для ряда других семейств. Это еще больше приближает структуру ассемблерных программ для AVR к программам на языке высокого уровня, где операторы работают не с ячейками памяти и регистрами, а с абстрактными переменными и константами.

Но это, конечно, не значит, что AVR — однозначно лучшее в мире семейство МК. У него есть и ряд недостатков (например, несовершенная система защиты энергонезависимой памяти данных — EEPROM, некоторые вопросы с помехоустойчивостью, излишние сложности в системе команд и структуре программ и т. п.). А учитывая, что любые универсальные современные МК позволяют делать все то же самое, вопрос выбора платформы — вопрос в значительной степени предпочтений и личного опыта разработчика.

Несомненно, истинным подарком для фирмы Atmel стала позиция итальянских инженеров, выбравших в 2004 году AVR для любительской платформы Arduino, отчего популярность этого семейства быстро выросла, и за его будущее можно не беспокоиться. Об Arduino мы будем подробно говорить в последних главах этой книги.


Classic, Mega и Tiny

Линейка универсальных контроллеров AVR общего назначения делится на семейства: Classic, Mega и Tiny (есть и новейшее семейство Xmega, содержащее весьма «навороченные» кристаллы). МК семейства Classic (они именовались, как АТ908<марка контроллера>) ныне уже не производятся, однако все еще распространены в литературе, т. к. для них наработано значительное количество программ. Чтобы пользователям не пришлось переписывать все ПО, фирма Atmel позаботилась о преемственности — большинство МК семейства Classic имеет функциональные аналоги в семействе Mega, например, AT90S8515 — ATmega8515, AT90S8535 — ATmega8535 и т. п. (только AT90S2313 имеет аналог в семействе Tiny — ATtiny2313).

Полная совместимость обеспечивается специальным установочным битом (из набора так называемых Fuse-битoв), при программировании которого Mega-контроллер начинает функционировать, как Classic (подробнее об этом рассказано в главе 19). Для вновь разрабатываемых устройств обычно нет никакого смысла в использовании их в режиме совместимости, однако такой прием в ряде случаев может оказаться полезным для начинающих, поскольку программы для МК Classic устроены проще и часто встречаются в литературе.

Семейство Tiny (что в буквальном переводе означает «крохотный») предназначено для наиболее простых устройств. Часть МК этого семейства не имеет возможности программирования по последовательному интерфейсу, и потому мы их, за исключением ATtiny2313, не будем рассматривать в этой книге (это не значит, что остальных Tiny следует избегать — среди них есть очень удобные и функциональные микросхемы, нередко вообще не имеющие аналогов). У составляющего исключение МК ATtiny2313 отсутствует бит совместимости с «классическим» аналогом AT90S2313, одним из самых простых и удобных контроллеров Atmel, но при внимательном рассмотрении оказывается, что они и без такого бита совместимы «снизу вверх», — программы для «классического» 2313 практически полностью подходят и для Tiny2313 (см. главу 19).


Структура МК AVR

Общая структура внутреннего устройства МК AVR приведена на рис. 18.9. Здесь показаны все основные компоненты AVR (за исключением некоторых специализированных) — в отдельных моделях некоторые компоненты могут отсутствовать или различаться по характеристикам, неизменным остается только общее 8-разрядное процессорное ядро (GPU, General Processing Unit). Кратко рассмотрим наиболее важные компоненты, с большинством из которых мы познакомимся в дальнейшем подробнее.



Рис. 18.9.Общая структурная схема микроконтроллеров AVR


Начнем с памяти. В структуре AVR имеются три разновидности памяти: flash-память программ, ОЗУ (SRAM) для временного хранения данных и энергонезависимая память (EEPROM) для долговременного хранения констант и данных. Рассмотрим их по отдельности.


Память программ

Встроенная flash-память программ в AVR-контроллерах имеет объем от 1 Кбайт у ATtiny11 до 256 Кбайт у ATmega2560. Первое число в наименовании модели содержит величину этой памяти в килобайтах из ряда: 1, 2, 4, 8, 16, 32, 64, 128 и 256 Кбайт. Так, ATtiny2313 имеет 2 Кбайт памяти, a ATmega8535 — 8 Кбайт.

С точки зрения программиста память программ можно считать построенной из отдельных ячеек — слов по два байта каждое. Устройство памяти программ (и только этой памяти!) по двухбайтовым словам — очень важный момент, который ассемблерному программисту нужно твердо усвоить. Такая организация обусловлена тем, что любая команда в AVR имеет длину ровно 2 байта. Исключение составляют команды jmp, call и некоторые другие (например, lds), которые оперируют с адресами 16-разрядной и более длины. Длина этих команд составляет 4 байта, и они используются лишь в моделях с памятью программ более 8 Кбайт, поэтому в этом разделе книги вы их не встретите. Arduino основано на AVR-контроллерах с большим объемом памяти, но там нам об этих тонкостях знать необязательно. Во всех остальных случаях счетчик команд сдвигается при выполнении очередной команды на 2 байта (одно слово), поэтому необходимую емкость памяти легко подсчитать, зная просто число используемых команд.

По умолчанию все контроллеры AVR всегда начинают выполнение программы с адреса $0000[29]. Если в программе не используются прерывания, то с этого адреса может начинаться прикладная программа, как мы увидим далее. В противном случае по этому адресу располагается так называемая таблица векторов прерываний, подробнее о которой мы будем говорить в главе 19.


Память данных (ОЗУ, SRAM)

В отличие от памяти программ, адресное пространство памяти данных адресуется побайтно (а не пословно). Адресация полностью линейная, без какого-либо деления на страницы, сегменты или банки, как это принято в некоторых других системах.

Исключая некоторые младшие модели Tiny, объем встроенной SRAM колеблется от 128 байтов (например, у ATtiny2313) до 4–8 Кбайт у старших моделей Mega. Адресное пространство статической памяти данных (SRAM) условно делится на несколько областей, показанных на рис. 18.10. К собственно встроенной SRAM относится лишь затемненная часть, до нее по порядку адресов расположено адресное пространство регистров, где первые 32 байта занимает массив регистров общего назначения (РОН), еще 64 — регистров ввода/вывода (РВВ).



Рис. 18.10.Адресное пространство статической памяти данных (SRAM) микроконтроллеров AVR


Для некоторых моделей Mega (ATmega8515, ATmega162, ATmega128, ATmega2560 и др.) предусмотрена возможность подключения внешней памяти объемом до 64 Кбайт. Отметим, что адресные пространства РОН и РВВ не отнимают пространство у ОЗУ данных — так, если в конкретной модели МК имеется 512 байтов SRAM, а пространство регистров занимает первые 96 байтов (до адреса $5f), to адреса SRAM займут адресное пространство от $0060 до $025F (т. е. от 96 до 607 ячейки включительно). Конец встроенной памяти данных обозначается константой RAMEND. Следует учесть, что последние адреса SRAM, как минимум, на четыре-шесть ячеек от конца (в зависимости от количества вложенных вызовов процедур — для надежности лучше принять это число равным десяти или даже более) занимать данными не следует, т. к. они при использовании подпрограмм и прерываний заняты под стек.

Операции чтения/записи в память одинаково работают с любыми адресами из доступного пространства, и потому при работе с SRAM нужно быть внимательным, — вместо записи в память вы легко можете «попасть» в какой-нибудь регистр. Для обращения к РОН, как к ячейкам памяти, можно в качестве адреса подставлять номер регистра, а вот при обращении к РВВ таким же способом к номеру последнего нужно прибавлять $20. Следует также помнить, что по умолчанию при включении питания все РВВ устанавливаются в нулевое состояние во всех битах (единичные исключения все же имеются, поэтому в критичных случаях надо смотреть документацию), а вот РОН и ячейки SRAM могут принимать произвольные значения.


Энергонезависимая память данных (EEPROM)

Все модели МК AVR (кроме снятого с производства ATtiny11) имеют встроенную EEPROM для хранения констант и данных при отключении питания. В разных моделях объем ее варьируется от 64 байтов (ATtinylx) до 4 Кбайт (старшие модели Mega). Число циклов перепрограммирования EEPROM может достигать 100 тыс.

Напомним, что EEPROM отличается от flash-памяти возможностью выборочного программирования побайтно (вообще-то, даже побитно, но эта возможность скрыта от пользователя). Чтение из EEPROM осуществляется с такой же скоростью, как и чтение из РОН, — в течение одного машинного цикла (правда, на практике оно растягивается на 4 цикла, но программисту следить за этим специально не требуется). А вот запись в EEPROM протекает значительно медленнее и к тому же с неопределенной скоростью — цикл записи одного байта может занимать от 2 до 4 и более миллисекунд. Процесс записи регул