Text
                    УДК IVI i
1.1 .К J.’ H-M. I
Г 79
Гребнев В. В.
Г79 Микроконтроллеры семейства AVR фирмы Atmel. — М.: ИП РадиоСофт, 2002— 176 с.: ил.
ISBN 5-93037-091-5
Книга предназначена для разработчиков аппаратуры различного назначения, содержащей встроенные однокристальные микро-ЭВМ-микроконтроллеры.
Микроконтроллеры семейства AVR отличаются высоким быстродействием и низким энергопотреблением. В книге рассматриваются структура, система команд, периферийные устройства и работа микроконтроллеров, выпускаемых фирмой Atmel и поступающих в продажу по состоянию на конец 2001 г.
Изложенный материал позволяет выбрать микроконтроллер определенного типа, разработать функциональную схему устройства, содержащего микроконтроллер, и разработать программу работы микроконтроллера на языке AVR Ассемблера фирмы Atmel.
УДК 621.3
ББК 32.844.1
ISBN 5-93037-091-5
© Гребнев В. В., 2002
© Оформление. ИП РадиоСофт, 2002
Содержание
Предисловие..................................................5
Введение.....................................................7
I lana 1. Структура микроконтроллера........................9
1.1.	Обобщенная структурная схема.........................9
1.2.	Генератор тактового сигнала.........................12
1.3.	Процессор...........................................14
I А. Запоминающее устройство FlashROM....................15
1.5.	Запоминающее устройство SRAM........................16
1.6.	Запоминающее устройство EEPROM......................18
1.7.	Внешнее запоминающее устройство ERAM................18
1.8.	Периферийные устройства.............................19
I лава 2. Система команд...................................24
2.1.	Общие сведения о системе команд.....................24
2.2.	Команды регистровых операций........................29
2.3.	Команды с обращением по адресу SRAM.................31
2.4.	Команды с обращением к регистрам ввода-вывода.......32
2.5.	Команда с обращением к FlashROM.....................33
2.6.	Команды операций с битами...........................33
2.7.	Команды управления ходом программы..................34
2.8.	Дополнительные команды в системе команд микроконтроллеров тина ml63 и ml03.......................36
Глава 3. Работа периферийных устройств.......................40
3.1.	Параллельные порты ввода-вывода.......................40
3.2.	Последовательный порт ввода-вывода SPI..............43
3.3.	Последовательный порт ввода-вывода UART.............47
3.4.	Последовательный порт ввода-вывода TWSI (I2C).......51
3.5.	Таймеры-счетчики общего назначения..................57
3.5.1.	Таймер-счетчик типа А...........................58
3.5.2.	Таймер-счетчик типа В...........................59
3.5.3.	Таймер-счетчик типа С...........................63
3.5.4.	Таймер-счетчик типа D...........................65
3.5.5.	Таймер-счетчик типа Е...........................69
3.6.	Сторожевой таймер...................................70
3.7.	Аналого-цифровой преобразователь....................72
3.8.	Аналоговый компаратор...............................75
3.9.	Программируемый аппаратный модулятор................77
3.10.	Блок прерываний....................................80
Глава 4. Работа микроконтроллера...........................85
4.1.	Программирование микроконтроллера...................85
4.2.	Пуск и перезапуск микроконтроллера..................90
4.3.	Энергосберегающие режимы работы.....................94
4
Содержание
Прил	ожения................................................96
Ш. Маркировка микроконтроллеров..........................96
П2. Выводы микроконтроллеров.............................98
ПЗ. Альтернативные функции выводов портов................98
П4. Регистры ввода-вывода...............................100
П5. Разряды регистров ввода-вывода......................102
П6. Установочные биты (Fuse Bits).......................106
П7. Двоичный вычитатель...............................  106
П8. Разработка программы на языке AVR Ассемблера фирмы Atmel.............................................108
П9. Аппаратно-программные средства поддержки разработок на основе микроконтроллеров AVR фирмы Atmel..........115
Программные средства поддержки разработок............116
Создание и трансляция проекта........................117
Режимы работы отладчика..............................120
Отладка проекта при помощи программного симулятора...120
Аппаратные средства поддержки разработок.............127
Стартовые наборы разработчика........................128
Внутрисхемные эмуляторы..............................134
Внутрисхемные программаторы..........................139
Специализированные наборы разработчика...............143
П10. Примеры программ для микроконтроллеров семейства AVR...........................................144
Программа LED.ASM....................................145
Программа KBD.ASM....................................146
Программа UART.ASM...................................148
Программа FIFO.ASM...................................152
Программа LCD.ASM....................................158
Программа BCD.ASM....................................163
Программа ADC.ASM....................................166
Литература.................................................172
Предисловие
Корпорация Atmel (США) хорошо известна как на мировом, так и на российском рынках электронных компонентов и является одним из признанных мировых лидеров в разработке и производстве сложных изделий современной микроэлектроники — устройств энергонезависимой памяти высокого быстродействия и минимального удельного энергопотребления, микроконтроллеров общего назначения и микросхем программируемой логики.
Настоящая книга, которую Вы держите в руках, познакомит Вас с одним из интересных и активно развиваемых Atmel Corp, направлений современной микроэлектроники — линией 8-разрядных высокопроизводительных RISC {Reduced Instruction Set Computers} микроконтроллеров общего назначения, объединенных общей маркой AVR. Серийное производство AVR началось в 1996 году.
AVR — микроконтроллеры, пожалуй, одно из самых интересных направлений, развиваемых корпорацией Atmel. Они представляют собой мощный инструмент для создания современных высокопроизводительных и экономичных контроллеров многоцелевого назначения, в том числе и встраиваемых. На настоящий момент соотношение "цена — производительность — энергопотребление" для AVR является одним из лучших на мировом рынке 8-ми разрядных микроконтроллеров. Объемы продаж AVR в мире удваиваются ежегодно. В геометрической прогрессии растет число сторонних фирм, разрабатывающих и выпускающих разнообразные программные и аппаратные средства поддержки разработок для этих микроконтроллеров. Можно считать, что AVR постепенно становится еще одним индустриальным стандартом среди 8-разрядных микроконтроллеров общего назначения. В настоящее время в производстве у Atmel Corp, находятся три семейства AVR — "tiny", "classic" и "mega".
6
Предисловие
Области применения AVR многогранны. Для "tiny" AVR это интеллектуальные автомобильные датчики различного назначения, игрушки, игровые приставки, материнские платы персональных компьютеров, контроллеры защиты доступа в мобильных телефонах, зарядные устройства, детекторы дыма и пламени, бытовая техника, разнообразные инфракрасные пульты дистанционного управления. Для "classic" AVR это модемы различных типов, современные зарядные устройства, изделия класса Smart Cards и устройства чтения для них, спутниковые навигационные системы для определения местоположения автомобилей па трассе, сложная бытовая техника, пульты дистанционного управления, сетевые карты, материнские платы компьютеров, сотовые телефоны нового поколения, а также разнообразные промышленные системы контроля и управления. Для "mega" AVR это аналоговые (NMT, ETACS, AMPS) и цифровые (GSM, CDMA) мобильные телефоны, принтеры и ключевые контроллеры для них, контроллеры аппаратов факсимильной связи и ксероксов, контроллеры современных дисковых накопителей и CD-ROM и т. д.
Российские специалисты уже ио достоинству оценили высокую скорость работы и мощную систему команд AVR, наличие двух типов энергонезависимой памяти на одном кристалле и активно развивающуюся периферию. Немаловажную роль в этом играет политика Atmel Corp, в вопросе развития и распространения разнообразных, доступных средств поддержки разработок. Это позволяет разработчикам и производителям электронной техники надеяться на сохранение полноценной поддержки для перспективного семейства микроконтроллеров, закладывая AVR в свои новые изделия.
AVR — это относительно молодой продукт корпорации Atmel, активно развиваемая линия встраиваемых многоцелевых микроконтроллеров общего назначения. В этой линии постоянно появляются новые семейства и кристаллы, обновляются версии уже существующих микросхем, совершенствуется и расширяется программное обеспечение поддержки. Поэтому будьте внимательны, разрабатывая Ваши конечные системы и программное обеспечение с использованием этой книги, потому что многое может изменяться. Так, первое официальное издание — каталог Atmel, посвященный AVR, датирован маем 1997 года. В него были включены всего четыре первых AVR — микроконтроллера семейства АТ90 "classic". Второе, существенно расширенное издание каталога вышло в августе 1999 года, и в него уже были включены три семейства AVR — "tiny", "classic" и "mega".
И до сих пор более "свежей" версии каталога в печатном виде нс существует, постоянно обновляются лишь технические данные в электронном виде (Data Sheet), которые Atmel Corp, размещает на информационной странице в Интернет http://www.atmel.com. Скорее всего, к моменту выхода книги в свет представленная информация будет нуждаться в дополнениях и коррективах. Пожалуйста, регулярно следите за обновлениями технической документации, выпускаемой Atmel Corp.
И. В. Кривченко
Введение
Микроконтроллер семейства AVR фирмы Atmel представляет собой восьмиразрядную однокристальную микро-ЭВМ с упрощенной (сокращенной) системой команд — RISC (Restricted (Reduced) Instruction Set Computer}.
Большинство команд, входящих в систему команд, выбираются из памяти за один такт и выполняются за одни такт работы микроконтроллера. При выполнении последовательности таких команд выборка из памяти очередной команды совмещается во времени с исполнением ранее выбранной команды. При этом число команд, выполняемых за 1 с, совпадает с тактовой частотой работы микроконтроллера.
Микроконтроллеры изготавливаются по высококачественной КМОП (CMOS) технологии, содержат энергонезависимые запоминающие устройства для хранения программы и данных, выполненные по Flash и EEPROM технологиям, и отличаются низким энергопотреблением при высокой тактовой частоте. Запись программы п исходных данных в память может выполняться после установки микроконтроллера в аппаратуре, где ему предстоит работать.
В состав семейства AVR входят микроконтроллеры трех серий — АТ90, ATtiny и ATmega. В каждую серию входят микроконтроллеры нескольких типов. Микроконтроллеры серии АТ90 по своим структурным характеристикам (объем памяти, состав периферийных устройств) близки к микроконтроллерам семейств АТ89 фирмы Atmel и MCS-51 фирмы Intel. По своим вычислительным возможностям они занимают среднее положение между микроконтроллерами серий ATtiny и ATmega. Микроконтроллеры серии ATtiny имеют наименьшие, а микроконтроллеры серии ATmega — наибольшие вычислительные возможности в семействе AVR.
8
Введение
В табл. В1 указаны полные и сокращенные обозначения типа микроконтроллера (МК), число выводов корпуса микроконтроллера NB, число команд в системе команд NK, максимальное значение тактовой частоты Finax и ток потребления I у микроконтроллеров разных типов семейства AVR. Сокращенное обозначение типа микроконтроллера используется далее в тексте книги.
Ток потребления зависит от напряжения питания, тактовой частоты и температуры окружающей среды. В таблице указано значение тока потребления при напряжении питания 3 В, тактовой частоте 4 МГц и температуре окружающей среды +25 °C.
Таблица В 1
Тип МК		NB	NK	^(МГц)	/(мА)
полное	сокращенное				
ATtiny 11	t11	8	90	6	2,2
ATtiny 12	t12	8	90	8	2,2
ATtinyl 5	t15	8	90	1,6	3,0*
AT90S2323	2323	8	118	10	2,4
AT90S2343	2343	8	118	10	2,4
AT90S1200	1200	20	89	12	2,0
AT90S2313	2313	20	118	10	2,8
ATtiny28	t28	28	90	4	3,0
AT90S4433	4433	28	118	8	3,4
AT90S8515	8515	40	118	8	3,0
AT90S8535	8535	40	118	8	6,4
ATmega 163	m163	40	130	8	5,0
ATmega 103	m103	64	121	6	5,5
‘ — при F™
Микроконтроллеры одного типа выпускаются в нескольких вариантах, различающихся диапазоном допустимых значений напряжения питания, максимальным допустимым значением тактовой частоты, типом корпуса и диапазоном допустимых значений температуры окружающей среды. Варианты типов микроконтроллеров и их маркировка описаны в приложении П1.
Фирма Atmel выпускает программные и аппаратные средства поддержки разработок на базе микроконтроллеров семейства AVR. Средства поддержки разработок рассмотрены в приложении П9, которое написано Р. Н. Золотухо.
В приложении П10, написанном Т. И. Кривченко, приведены примеры разработки программ для микроконтроллеров семейства AVR.
Структура микроконтроллера
1.1.	Обобщенная структурная схема
Микроконтроллеры семейства AVR имеют единую базовую структуру. Обобщенная структурная схема микроконтроллера (МК) изображена на рис. 1.1.
Рис. 1.1
10
Глава 1
В состав микроконтроллера входят:
	генератор тактового сигнала (GCK);
	процессор (CPU);
	постоянное запоминающее устройство для хранения программы, выполненное по технологии Flash, (FlashROM):
	оперативное запоминающее устройство статического типа для хранения данных (SRAM);
	постоянное запоминающее устройство для хранения данных, выполненное по технологии EEPROM, (EEPROM):
	набор периферийных устройств для ввода и вывода данных и управляющих сигналов и выполнения других функций.
В микроконтроллерах типа til, tl2. 115, 1200 и t28 запоминающее устройство SRAM отсутствует. В микроконтроллерах типа til и t28 отсутствует также запоминающее устройство EEPROM.
К микроконтроллерам типа 8515 и ш103 может быть подключено внешнее запоминающее устройство для хранения данных (ERAM). Команды программы хранятся только во внутреннем запоминающем устройстве FlashROM.
Выводы VCC и GND предназначены для подключения источника напряжения питания микроконтроллера. Уровень напряжения всех сигналов в микроконтроллере отсчитывается относительно уровня на шине GND, принимаемого за 0В. Допустимые значения напряжения питания у микроконтроллеров разных типов и вариантов указаны в приложении П1 в табл. П1.3. Другие выводы микроконтроллеров разных типов указаны в приложении П2. Функции этих выводов описываются при рассмотрении устройств, в работе которых они используются.
В состав процессора (CPU) входят:
	счетчик команд (PC);
	арифметико-логическое устройство (ALU);
	блок регистров общего назначения (GPR, General Purpose Registers') и другие элементы, не показанные на схеме рис. 1.1.
Кроме регистров общего назначения в микроконтроллере имеются регистры специальных функций, которые в семействе AVR называются регистрами ввода-вывода (I/O Registers, IOR). С участием этих регистров осуществляются:
	управление работой микроконтроллера и отдельных его устройств;
	определение состояния микроконтроллера и отдельных его устройств;
	ввод данных в микроконтроллер и отдельные его устройства и вывод данных
и выполняются другие функции.
Таб ли ца 1.1
Тип МК	Flash (байт)	ISP	SRAM (байт)	EEPROM (байт)	ERAM	IOR	P	I/O	ALT
t11	1K					14	1	6	6
112	1K	+		64		18	1	6	6
115	1K	+		64		27	1	6	6
2323	2K	+	128	128		17	1	3	2
2343	2K	+	128	128		17	1	5	3
1200	1K	+		64		18	2	15	4
2313	2K	+	128	128		32	2	15	10
t28	2K					17	3	20	6
4433	4K	+	128	256		44	3	20	20
8515	8K	+	512	512	+	45	4	32	31
8535	8K	+	512	512		54	4	32	26
m163	16K	+	1024	512		63	4	32	28
m103	128K	+	4000	4K	+	60	6	48	47
SPI	UART	TWSI	т/со	Т/С1	Т/С2	ADC	АС	РИМ	IU	Тип МК
			А				+		5	111
			А				+		6	И 2
			А	в		4	+		9	115
			А						3	2323
			А						3	2343
			А				+		4	1200
	+		А	D			+		11	2313
			А				+	+	6	128
+	+		А	D		6	+		14	4433
+	+		А	Е			+		13	8515
+	+		А	Е	С	8	+		17	8535
+	+	+	А	Е	с	8	+		18	m163
+	+		С	Е	в	8	+		24	m103
Структура микроконтроллера
12
Глава 1
Для нумерации регистров ввода-вывода используются номера от О до 63 (от $00 до $3F, где $ — указатель шестнадцатеричного кода). Каждому регистру присвоено имя, связанное с выполняемой этим регистром функцией. Микроконтроллеры разных типов имеют разный состав регистров ввода-вывода, при этом регистры с одинаковыми номерами могут иметь разные имена. Число регистров ввода-вывода у микроконтроллеров разных типов указано в табл. 1.1, в колонке IOR. Имена и номера регистров ввода-вывода у микроконтроллеров разных типов приведены в приложении П4. Функции, выцолняемые регистрами ввода-вывода, описываются при рассмотрении устройств, в работе которых они участвуют.
Работа некоторых устройств микроконтроллера зависит от состояния дополнительных однобитовых запоминающих элементов — установочных битов {Fuse Bits}. Исходные значения установочных битов записываются на заводе-изготовителе. Значение установочного бита может быть изменено только при программировании микроконтроллера. В приложении П6 перечислены установочные биты в микроконтроллерах разных типов и указаны их исходные значения. Функции установочных битов рассматриваются при описании устройств, работа которых зависит от их значения.
1.2.	Генератор тактового сигнала
Микроконтроллеры семейства AVR являются устройствами синхронного типа. Действия, выполняемые в микроконтроллере, привязаны к импульсам тактового сигнала. Микроконтроллеры имеют полностью статическую структуру и могут работать при тактовой частоте от 0 Гц. Максимальные значения тактовой частоты у микроконтроллеров разных типов и вариантов указана в приложении П1, в таблице П1.3.
В качестве генератора тактового сигнала (GCK) используются:
	внутренний генератор с внешним кварцевым или керамическим резонатором (XTAL);
	внутренний RC-генератор (IRC);
	внутренний генератор с внешней RC-цепочкой (ERC);
	внешний генератор (EXT).
Генераторы тактового сигнала, используемые в микроконтроллерах разных типов, указаны в табл. 1.2.
У микроконтроллеров, имеющих внутренний генератор с внешним резонатором (XTAL), резонатор подключается к выводам XTAL1 и XTAL2, которые через конденсаторы малой емкости (20—30 пФ) соединяются с шиной GND. Тактовая частота определяется рабочей частотой резонатора. У микроконтроллера типа t28 при нулевом значении установочного бита INTCAP подключение выводов XTAL1 и XTAL2 к шине GND выполняется через внутренние конденсаторы емкостью 50 пФ.
Структура микроконтроллера
13
Таб ли ца 1.2
Тип GCK	Тип МК												
	t11	t12	t15	2323	2343	1200	2313	t28	4333	8515	8535	m163	m103
XTAL	+	+		+		+	+	+	+	+	+	+	+*
IRC	+	+*	+*		+	+		+*				+*	
ERC	+	+						+				+	
EXT	+	+		+	+	+	+	+	+	+	+	+	+
’ — возможно изменение частоты программными средствами
У микроконтроллеров типа til и t!2 в качестве выводов XTAL1 и XTAL2 используются выводы РВЗ и РВ4.
Внешний генератор (EXT) подключается к выводу XTAL1, при этом вывод XTAL2 остается неподключенным. У микроконтроллера типа 2343, не имеющего выводов XTAL, внешний генератор подключается к выводу РВЗ.
В генераторах с RC-цепочкой тактовая частота определяется параметрами цепочки, но изменяется в значительных пределах при изменении напряжения питания микроконтроллера.
В микроконтроллерах типа 2343 и 1200 внутренний RC-генератор (IRC) используется при нулевом значении установочного бита RCEN.
В микроконтроллерах типа til, tl2, t28 и ш163 выбор генератора для работы определяется комбинацией значений установочных битов CKSEL. У микроконтроллеров типа til таких битов три (CKSEL2 — 0), у микроконтроллеров остальных типов — четыре (CKSEL3 — 0).
В табл. 1.3 приведены числа, двоичные коды которых являются комбинацией значений установочных битов CKSEL при выборе типа генератора. Биту CKSEL0 соответствует младший разряд двоичного кода.
Таб лица 1.3
Тип GCK	CKSEL2 — 0	CKSEL3 — 0
XTAL	6,7	8—15
IRC	4	2—4
ERC	5	5—7
EXT	0	0,1
В микроконтроллерах, имеющих внутренний генератор с внешней RC-цепочкой (ERC), резистор (3—100 кОм) подключается между выводом XTAL1 и шиной VCC, а конденсатор (не менее 20 пФ) — между выводом XTAL1 и шиной GND.
14
Глава I
В микроконтроллерах типа tl2, tl5, t28 и ml63 при использовании внутреннего RC-генератора тактовая частота может изменяться программными средствами путем изменения кода, записываемого в регистр OSCCAL. При записи кода $00 тактовая частота имеет наименьшее значение, при записи кода $FF — наибольшее значение. В микроконтроллере типа ml03 программными средствами может изменяться тактовая частота генератора с кварцевым резонатором. Значение тактовой частоты FCK определяется по формуле
р . =________5г______
129-(XDIV.6-0)'
где Fq — рабочая частота кварцевого резонатора; (XD1V.6 — 0) — число, двоичный код которого записан в младших семи разрядах регистра XDIV (№ $ЗС). Изменение тактовой частоты возможно при XDIV.7 = 1.
1.3.	Процессор
Процессор (CPU) формирует адрес очередной команды, выбирает команду из памяти и организует ее выполнение. Код команды имеет формат "слово" (16 бит) или "два слова". Система команд микроконтроллеров семейства AVR рассматривается в главе 2.
В состав процессора кроме счетчика команд (PC), арифметико-логического устройства (ALU) и блока регистров общего назначения (GPR),изображенных на структурной схеме рис. 1.1, входят:
	регистр состояния микроконтроллера SREG;
	регистр-указатель стека SP или SPL и SPH и другие элементы, далее не рассматриваемые.
В счетчике команд адрес очередной команды формируется путем добавления 1 к числу, код которого хранится в счетчике команд. При пуске и перезапуске микроконтроллера в счетчик команд заносится код числа 0 и первая команда выбирается из FlashROM по адресу 0.
В арифметико-логическом устройстве (ALU) выполняются арифметические и логические операции. Операнды поступают из регистров общего назначения (GPR). При выполнении одноместных операций результат записывается в регистр, из которого поступил операнд. При выполнении двухместных операций результат записывается в регистр, из которого поступил первый операнд.
Блок регистров общего назначения (GPR) содержит 32 восьмиразрядных регистра, которым присвоены имена R0, R1, ..., R31. В некоторых операциях в ALU могут участвовать лишь регистры со старшими номерами (от R16 до R31). Регистры с именами от R24 до R31 могут образовывать пары, используемые для хранения слов, при этом регистр
Структура микроконтроллера	15
г четным номером хранит младший байт, а регистр с нечетным номером — старший байт.
Паре регистров R26, R27 присвоено имя X, паре регистров R28, R29 — имя Y, паре регистров R30, R31 — имя Z. Эти пары регистров используются для хранения адресов при обращениях к памяти с косвенной адресацией.
Регистр состояния микроконтроллера SREG (№ $3F) содержит восемь разрядов (SREG.7, SREG.6, ..., SREG.0).
Разряд SREG, 7 (I) используется для разрсшения/запрещения прерываний. При 1 = 0 все прерывания запрещены. При 1=1 любое прерывание может быть разрешено.
Разряд SREG.6 (Т) используется для хранения бита при выполнении операций с битами. Остальные разряды регистра SREG используются для хранения признаков результатов арифметических и логических операций, выполняемых в ALU. Назначение этих разрядов рассматривается при описании системы команд микроконтроллера.
Регистр-указатель стека SP(№ $3D) хранит и формирует адрес при обращении к стеку типа LIFO. В микроконтроллерах типа til, tl2, tl5, 1200 и t28 в качестве стека используется специальное запоминающее устройство (аппаратный стек). Этот стек используется только для хранения адресов возврата при прерываниях и обращениях к подпрограммам. В системе команд отсутствуют команды обращения к стеку.
В микроконтроллерах других типов в качестве стека используется выделяемая пользователем область в SRAM. В системе команд есть команды для обращению к стеку. Запись байтов в стек выполняется в порядке уменьшения адресов в SRAM. При пуске и перезапуске микроконтроллера в регистр-указатель стека заносится код числа 0. Для нормальной работы стека в регистр-указатель необходимо занести другой начальный адрес. В микроконтроллерах с большой емкостью SRAM регистр-указатель состоит из двух регистров — SPL и SPH (№№ $3D и $ЗЕ).
1.4.	Запоминающее устройство FlashROM
Постоянное запоминающее устройство FlashROM предназначено для хранения кодов команд программы и констант. Ячейка памяти содержит 16 разрядов. В ней могут храниться код команды формата "слово", половина кода команды формата "два слова" или коды двух констант. Емкость FlashROM (в числе бантов!) у микроконтроллеров разных типов указана в табл. 1.1. в колонке Flash.
При чтении кодов команд адрес в FlashROM поступает из счетчика команд. При чтении констант адрес поступает из пары Z регистров общего назначения.
16
Глава 1
Запись кодов в FlashROM выполняется в процессе программирования побайтно. В микроконтроллерах с большим числом выводов (20 и более) байт может вводиться параллельно или последовательно. В микроконтроллерах с малым числом выводов (8) байт вводится последовательно.
Программирование может выполняться с использованием дополнительного источника напряжения + 12 В или без использования дополнительного источника. Последовательное программирование без использования дополнительного источника напряжения производится с использованием трех выводов микроконтроллера и может выполняться после установки микроконтроллера в аппаратуре, где ему предстоит работать, (Downloading). Типы микроконтроллеров, в которых этот способ программирования реализуется, отмечены знаком "+" в табл. 1.1 в колонке ISP (In-System Programming).
В микроконтроллере типа ml63 имеется возможность вводить и записывать в FlashROM коды в процессе работы микроконтроллера. Эта процедура (Self-programming) выполняется под управлением специальной программы (Boot Loader), которая составляется программистом и записывается в специальную секцию FlashROM. При выполнении этой программы используется регистр SPMCR (№ $37). Команда, с использованием которой выполняется запись кодов в FlashROM в процессе работы микроконтроллера, рассмотрена в п. 2.8.
1.5.	Запоминающее устройство SRAM
Оперативное запоминающее устройство статического типа SRAM предназначено для хранения данных, получаемых в процессе работы микроконтроллера. При выключении напряжения питания микроконтроллера данные в SRAM теряются.
Ячейка памяти содержит 8 разрядов. Емкость SRAM (в числе байтов) у микроконтроллеров разных типов указана в табл. 1.1 в колонке SRAM.
Адрес байта при обращении к SRAM может быть указан в коде команды с обращением к SRAM (прямая адресация) или предварительно записан в пару регистров X, Y или Z (косвенная адресация). Обращение к SRAM может выполняться с использованием адреса, хранящегося в регистре-указателе стека.
Байт для записи в SRAM поступает из регистра общего назначения. Байт, считанный из SRAM, поступает в регистр общего назначения.
В адресное пространство SRAM кроме адресов, по которым выполняется обращение к ячейкам памяти SRAM, включены 32 адреса для обращения к регистрам общего назначения (адреса от $00 до $1F) и 64 адреса для обращения к регистрам ввода-вывода (адреса от $20 до $5F).
Структура микроконтроллера
17
Первой ячейке в SRAM соответствует адрес $60. Адрес для обращения к регистру общего назначения по команде обращения к SRAM совпадает с номером регистра (0—31 = $00—$1F). Адрес для обращения к регистру ввода-вывода по команде обращения к SRAM равен его номеру, увеличенному на число 32 ($20).
В микроконтроллерах, допускающих подключение внешнего запоминающего устройства ERAM, адреса для обращения к ячейкам ERAM включены в адресное пространство SRAM и расположены после старшего адреса SRAM. Типы микроконтроллеров, в которых возможно подключение ERAM, отмечены знаком "+" в табл. 1.1 в колонке ERAM.
На рис. 1.2, в качестве примера, показано распределение адресов в адресном пространстве SRAM между регистрами общего назначения (GPR), регистрами ввода-вывода (IOR), ячейками памяти в SRAM и ячейками памяти в ERAM у микроконтроллера типа 8515.
Запись в стек выполняется в порядке убывания адресов. В качестве исходного адреса для обращений к стеку, который заносится в регистр-указатель стека в начале программы, целесообразно использовать старший адрес SRAM. В рассмотренном на рис. 1.2 примере таким адресом является адрес $025Е
18
Глава 1
1.6.	Запоминающее устройство EEPROM
Постоянное запоминающее устройство EEPROM предназначено для хранения данных, записанных при программировании микроконтроллера и получаемых в процессе выполнения программы. При выключении напряжения питания данные сохраняются. Ячейка памяти содержит 8 разрядов. Емкость EEPROM (в числе байтов) у микроконтроллеров разных типов указана в табл. 1.1 в колонке EEPROM.
EEPROM имеет обособленное адресное пространство. При обращении к EEPROM адрес записывается в регистр адреса EEAR (№ $1Е). В микроконтроллерах типа 8515, 8535, ml63 и ml03 регистр адреса содержит два восьмизарядных регистра — EEARL и EEARH (№№ $1Е и $1F). Байт, предназначенный для записи, заносится в регистр данных EEDR (№ $1D). Байт, получаемый при чтении, поступает в этот же регистр. Для управления процедурами записи и чтения используется регистр управления EECR (№ $1С).
Для записи байта в EEPROM необходимо:
1)	записать адрес в регистр адреса;
2)	записать байт в регистр данных;
3)	установить в единичное состояние разряд EEMWE регистра EECR,
4)	при EEMWE = 1 установить в единичное состояние разряд EEWE регистра EECR.
Процедура записи выполняется в зависимости от величины напряжения питания за 2,5—4 мс. При завершении записи разряд EEWE регистра EECR аппаратно сбрасывается в нулевое состояние.
Разряд EEMWE сохраняет единичное состояние в течение 4-х тактов после установки и аппаратно сбрасывается в нулевое состояние.
В микроконтроллерах типа tl2, 115, 4433, 8535, ml63 и ml03 при нулевом состоянии разряда EEWE формируется запрос прерывания ЕЕ RDY. Прерывание по данному запросу разрешено при единичном состоянии разряда EERIE регистра EECR.
Для чтения байта из EEPROM необходимо:
1) записать адрес в регистр адреса;
2) установить в единичное состояние разряд EERE регистра EECR. Считанный байт поступает в регистр данных. Разряд EERE регистра EECR аппаратно сбрасывается в нулевое состояние.
1.7.	Внешнее запоминающее устройство ERAM
Внешнее запоминающее устройство предназначено для хранения байтов данных. Оно может быть подключено к микроконтроллерам типа 8515 и ш103. Схема подключения ERAM к микроконтроллеру изображена на рис. 1.3.
Структура микроконтроллера
19
Рис. 1.3.
Для подключения используются:
	8 выводов порта А (РА), через которое выдается младший байт кода адреса и байт данных для записи и принимается байт данных при чтении;
	8 выводов порта С (PC), через которые выдается старший байт кода адреса;
	вывод ALE, через который выдается импульс для записи младшего байта кода адреса во внешний регистр RG;
	вывод WR, через который в ERAM выдается импульс управления записью;
	вывод RD, через который в ERAM выдается импульс управления чтением.
В микроконтроллере типа 8515 для выдачи сигнала ALE используется отдельный вывод, а сигналы WR и RD выдаются через выводы PD6 и PD7 соответственно. В микроконтроллере типа ml03 сигналы управления выдаются через отдельные выводы.
Обращение к внешней памяти по командам обращения к SRAM возможно после установки в единичное состояние разряда SRE регистра MCUCR (№ $35). Обращение выполняется за 3 такта.
Если требуется, в цикл обращения может быть введен дополнительный такт (такт ожидания). Дополнительный такт вводится при единичном состоянии разряда SRW в регистре MCUCR.
1.8.	Периферийные устройства
В группу периферийных устройств входят:
	параллельные порты ввода-вывода;
	последовательный порт SPI;
	последовательный порт UART;
	последовательный порт TWSI (I2C);
	таймеры-счетчики общего назначения;
	сторожевой таймер;
20
Глава 1
	аналого-цифровой преобразователь;
	аналоговый компаратор;
	программируемый аппаратный модулятор;
	блок прерываний.
Параллельный порт ввода-вывода (Port, Р) предназначен для ввода и вывода данных. Микроконтроллеры семейства AVR имеют от одного до шести портов. Порт может иметь от трех до восьми выводов. Число параллельных портов ввода-вывода и суммарное число выводов портов у микроконтроллеров разных типов, указано в табл. 1.1 в колонках Р и I/O соответственно.
Вывод порта может работать в режиме входа или в режиме выхода. Направление передачи бита устанавливается для каждого вывода в отдельности.
Некоторые выводы портов кроме ввода и вывода битов данных могут использоваться для выполнения альтернативных функций при работе других устройств. Суммарное число выводов параллельных портов, которые могут выполнять альтернативные функции у микроконтроллеров разных типов, указано в табл. 1.1 в колонке ALT. В это число не включены выводы, выполняющие альтернативные функции только при программировании микроконтроллера. Альтернативные функции выводов портов у микроконтроллеров разных типов указаны в приложении ПЗ.
Последовательный порт ввода-вывода SPI (Serial Peripheral Interface) предназначен для ввода и вывода байтов при обмене данными с другими устройствами, имеющими порт SPI. Обмен выполняется под управлением тактового сигнала порта. Устройство, инициализирующее обмен и вырабатывающее тактовый сигнал, является ведущим (master). Устройство, выполняющее обмен при поступлении тактового сигнала, является ведомым (slave). В процессе обмена оба устройства последовательно бит за битом одновременно выдают и принимают байт. Обмен выполняется с использованием трех шин.
Максимальная скорость приема/передачи (в битах в секунду) равна 1/4 частоты тактового сигнала микроконтроллера (у МК типа ш163 — 1/2 тактовой частоты).
К одному ведущему устройству могут быть подключены несколько ведомых. Функции ведущего и ведомого могут меняться в процессе работы системы.
Порт SPI, который может работать в режиме ведущего и ведомого и использоваться для обмена данными в процессе работы, имеется у микроконтроллеров типа 4433, 8515, 8535, ml63 и ml03 (табл. 1.1, колонка SPI). Микроконтроллеры других типов, кроме til и t28, имеют порт SPI, который может работать только в режиме ведомого и используется при последовательном программировании микроконтроллера без дополнительного источника напряжения (Downloading).
Структура микроконтроллера
21
Последовательный порт ввода-вывода UART (Universal Asynchronous Receiver-Transmitter) предназначен для передачи и приема байтов данных по двухпроводным линиям связи (например, по интерфейсу RS-232C или "токовая петля"). Прием и передача могут вестись одновременно. При передаче байта формируется последовательность из десяти или одиннадцати битов (кадр), содержащая стартовый бит, имеющий нулевое значение, восемь битов байта (DO, D1, ..., D7) и столовый бит, имеющий единичное значение. Между старшим битом байта (D7) и стоповым битом может помещаться дополнительный бит.
Порт UART входит в состав периферийных устройств микроконтроллеров типа 2313, 4433, 8515, 8535, ш163 и шЮЗ (табл. 1.1, колонка UART).
Последовательный порт ввода-вывода TWSI {Two-Wire Serial Interface) предназначен для обмена байтами данных с другими устройствами по двухпроводной шине IC {Integrated Circuit). К шине могут подключаться до 127 устройств.
Устройство, подключенное к шине IC, может работать в качестве ведущего {master) или ведомого {slave). Ведущее устройство при освобождении шины от обмена между другими устройствами посылает в шину сигнал начала обмена и занимает шину, затем посылает адресный байт для выбора одного из ведущих устройств и задания направления обмена, передает или принимает байты данных и посылает сигнал окончания обмена.
Ведомое устройство, опознав свой адрес, в зависимости от указанного направления обмена принимает или передает данные.
Устройство, принимающее байты данных, после приема каждого байта посылает в шину сигнал подтверждения приема. Адресный байт может содержать общий адрес для передачи данных одновременно во все ведомые устройства.
Скорость обмена задается ведущим устройством, обмен может вестись со скоростью до 400000 бит/с.
Последовательный порт TWSI имеется у микроконтроллера типа ш163.
Таймер-счетчик общего назначения {General Purpose Timer/Counter) предназначен для формирования запроса прерывания при истечении заданного интервала времени (режим таймера) или свершении заданного числа событий (режим счетчика). Микроконтроллеры семейства AVR могут иметь от одного до трех таймеров-счетчиков общего назначения Т/СХ (X — номер таймера-счетчика, X = 0, 1, 2).
Основным элементом таймера-счетчика является базовый счетчик, который ведет счет на сложение. При его переполнении формируется запрос прерывания Т/СХ OVF.
Таймер-счетчик общего назначения может выполнять дополнительные функции:
22
Глава 1
	функцию захвата;
	функцию сравнения;
	функцию широтно-импульсного модулятора;
	функцию счета реального времени.
Функция захвата (capture) заключается в запоминании кода, сформированного в базовом счетчике, в специальном регистре захвата при изменении значения определенного внешнего или внутреннего сигнала. При этом формируется запрос прерывания Т/СХ С APT.
Функция сравнения (compare) заключается в изменении значения сигнала на определенном выходе микроконтроллера при совпадении кода, формируемого в базовом счетчике, с кодом в специальном регистре сравнения. При этом формируется запрос прерывания Т/СХ СОМР.
Функция широтно-импульсного модулятора (PWM) заключается в формировании на определенном выходе микроконтроллера импульсной последовательности с заданными периодом повторения и длительностью импульсов.
Функции сравнения и PWM реализуются с использованием одного и того же оборудования. Выбор нужной функции выполняется программными средствами.
Функция счета реального времени (Real Time Clock) реализуется в таймере-счетчике при использовании дополнительного внутреннего генератора с внешним кварцевым резонатором с частотой 32768 Гц ("часовой" кварц). При этом параметры процессов в таймере-счетчике с высокой точностью привязаны к единице измерения реального времени — секунде.
В зависимости от разрядности счетчика и выполняемых дополнительных функций могут быть выделены пять типов таймеров-счетчиков общего назначения, входящих в группу периферийных устройств микроконтроллеров семейства AVR.
Тип А. Восьмиразрядный таймер-счетчик без дополнительных функций.
Тип В. Восьмиразрядный таймер-счетчик с функцией сравнения/PWM.
Тип С. Восьмиразрядный таймер-счетчик с функцией сравнения/PWM и функцией счета реального времени.
Тип D. Шестнадцатиразрядный таймер-счетчик с функциями захвата и сравнения/PWM.
Тип Е. Шестнадцатиразрядный таймер-счетчик с функцией захвата и двумя каналами для выполнения функций сравнения/PWM.
В табл. 1.1, в колонках Т/СО, Т/Cl и Т/С2 указаны типы таймеров-счетчиков, входящих в группу периферийных устройств под этими именами у микроконтроллеров разных типов. Таймер-счетчик одного типа в микроконтроллерах разных типов может иметь разные имена.
Сторожевой таймер (Watchdog Timer, WDT) предназначен для ликвидации последствий сбоя в ходе программы путем перезапуска микроконтроллера при обнаружении сбоя. Сторожевой таймер имеется у микроконтроллеров всех типов.
Структура микроконтроллера
23
Аналого-цифровой преобразователь (Analog-to-Digital Converter') формирует десятиразрядный двоичный код числа, пропорционального величине напряжения аналогового сигнала на входе микроконтроллера. В микроконтроллерах AVR к преобразователю могут подключаться от четырех до восьми входов микроконтроллера.
Аналого-цифровой преобразователь входит в состав периферийных устройств микроконтроллеров типа 115, 4433, 8535, ml63 и тЮЗ. Число подключаемых входов у микроконтроллеров названных типов указано в табл. 1.1, в колонке ADC.
Аналого-цифровой компаратор (Analog Comparator, АС) сравнивает по величине аналоговые сигналы, поступающие на два входа микроконтроллера, и формирует запрос прерывания ANA COMP, когда разность их значений меняет знак. При этом также может быть выдан сигнал для выполнения функции захвата в таймере-счетчике общего назначения.
Аналоговый компаратор входит в состав периферийных устройств микроконтроллеров всех типов, кроме 2323 и 2343 (табл. 1.1, колонка АС).
Программируемый аппаратный модулятор (Programmable Hardware Modulator, РНМ) предназначен для формирования импульсного сигнала на выводе РА2 для питания светодиодных индикаторов. Длительность импульса и скважность сигнала задаются программными средствами. Ток нагрузки может иметь величину до 25 мА при напряжении питания 1,8 В. Программируемый аппаратный модулятор имеется у микроконтроллеров типа 128.
Блок прерываний (Interrupt Unit, IU) организует переход к выполнению прерывающей программы при поступлении запроса прерывания, если прерывание по данному запросу разрешено и он имеет более высокий приоритет, чем другие запросы, поступившие одновременно с ним.
Прерывание разрешено, если разряд I регистра SREG находится в единичном состоянии и в единичном состоянии находится разряд, разрешающий/запрещающий прерывание по данному запросу, расположенный в одном из регистров ввода-вывода. Приоритетность запросов задана аппаратно.
При переходе к выполнению прерывающей программы разряд I регистра SREG сбрасывается в нулевое состояние и сохраняется в этом состоянии до завершения прерывающей программы. Разряд I может быть переведен в единичное состояние по команде в прерывающей программе.
Запросы в блок прерываний поступают из внешних источников и источников, расположенных во внутренних устройствах микроконтроллера. Общее число запросов прерывания у микроконтроллеров разных типов указано в табл. 1.1, в колонке IU.
ва 2
Система команд
2.1.	Общие сведения о системе команд
В семействе AVR система команд у микроконтроллеров разных типов содержат от 89 до 130 команд (табл. В1, колонка NK). У микроконтроллеров типа 2323, 2343, 2313, 4433, 8515 и 8535 в систему команд входят 118 команд. Эту систему команд будем называть базовой.
В табл. 2.1—2.13 описаны операции, выполняемые по командам базовой системы, и приведены мнемокоды команд, используемые при разработке программы на языке AVR Ассемблера. В таблицах дана сквозная нумерация команд, используемая далее в тексте.
Базовая система команд содержит:
	33 команды регистровых операций, при выполнении которых используются только регистры общего назначения (команды №№ 1—33);
	26 команд с обращением по адресу в адресном пространстве SRAM (команды №№ 34—59);
	2 команды с обращением к регистрам ввода-вывода (команды №№ 60 и 61);
	1 команда с обращением к FlashROM (команда № 62);
	22 команды операций с битами в разрядах регистров общего назначения и регистров ввода-вывода (команды №№ 63—84);
	34 команды управления ходом программы (команды №№ 85—118).
Система команд
25
В систему команд микроконтроллеров типа til, tl2, tl5, 1200 и t28, у которых нет SRAM, не входят команды с обращением по адресу в адресном пространстве SRAM за исключением команд с мнемокодами LD Rd, Z (№ 40) и ST Z, Rr (№ 41), по которым производится обращение к регистрам общего назначения и регистрам ввода-вывода с использованием косвенной адресации. В систему команд у этих микроконтроллеров не входят также 2 команды регистровых операций iX«№ 32 и 33) и две команды управления ходом программы (№№ 86 и 88). У микроконтроллеров типа 1200 в систему команд не входит также команда с обращением к FlashROM (№ 62).
В систему команд микроконтроллеров типа ml63 и ml03 входят дополнительные команды. Появление некоторых из них связано с увеличенным объемом FlashROM, а у микроконтроллера типа ml63, кроме того, с наличием аппаратного умножителя. Дополнительные команды рассматриваются в п. 2.8.
При разработке программы работы микроконтроллера кроме мнемокодов команд используются директивы ассемблера и другие средства ассемблера. Особенности разработки программы на языке AVR Ассемблера фирмы Atmel рассмотрены в приложении П8.
Таб ли ца 2.1
№	Операция	Мнемокод команды	Признаки результата					
			H	S	V	N	z	c
1	SOO—Rj	1%)	CLR Rd		0	0	0	1	
2	(Rd)-Rd ((Rd)A(Rd)-Rd)	TST Rd		+	0	+	+	
3	(Rd)->Rd ($FF-(Rd)->Rd)	COM Rd		+	0	+	+	1
4		NEG Rd	+	+	+	+	+	+
5	(Rd)+1->Rd	INC Rd		+	+	+	+	
6	(Rd)-i-*Rd	DEC Rd		+	+	+	+	
7	0-(RdHC	LSR Rd		+	+	0	+	+
	*—							
8	C-(Rd)-0	LSL Rd	+	+	+	+	+	+
	—»							
9	C-(RdHC	ROR Rd		+	+	+	+	+
	<—							
10	C-(Rd)-C	ROL Rd	+	+	+	+	+	+
11	R,7-(R,6-Rd.0HC	ASR Rd		+		+	+	+
12	Rd.4-7~Rd.0-3	SWAP Rd						
13	(RrHRd	MOV Rd, Rr						
14	(RdHRrHRd	ADD Rd, Rr	+	+	+	+	+	+
26
Глава 2
Окончание табл. 2. 1
№	Операция	Мнемокод команды	Признаки результата					
			H	S	V	N	z	c
15	(Rd)+(Rr)+C-*Rd	ADC Rd, Rr	+	+	+	+	+	+
16	(Rd)-(Rr)-*Rd	SUB Rd, Rr	+	+	+	+	+	+
17	(Rd)-(Rr)-c->Rd	SBC Rd, Rr	+	+	+	+	+	+
18	(Rd)-(Rr)	CP Rd, Rr	+	+	+	+	+	+
19	(Rd)-(Rr)-c	CPC Rd, Rr	+	+	+	+	+	+
20	(RJMRrHRd	AND Rd, Rr		+	0	+	+	+
21	(RdMRrHRd	OR Rd, Rr		+	0	+	+	
22	(Rd)©(Rr)-*Rd	EOR Rd, Rr		+	0	+	+	
d = 0—31; г = 0—31
Таб ли ца 2.2
Ns	Операция	Мнемокод команды	Признаки результата					
			H	S	V	N	z	c
23	$FF-*Rd	SER Rd						
24	K-*Rd	LDI Rd, К						
25	(Rd) - K-Rd	SUBI Rd, К	+	+	+	+	+	+
26	(Rd) - К - C-»Rd	SBCI Rd, К	+	+	+	+	+	+
27	(Rd) - к	CPI Rd, К	+	+	+	+	+	+
28	(Rd)AK-Rd	ANDI Rd, К		+	0	+	+	
29	(Rd)AK-Rd	CBR Rd, К		+	0	+	+	
30	(Rd)vK-Rd	ORI Rd, К		+	0	+	+	
31	(Rd)vK-*Rd	SBR Rd, К		+	0	+	+	
d = 16—31 (!); К = 0—255
Таб лица 2.3
Ns	Операция	Мнемокод команды	Признаки результата					
			H	S	V	N	Z	c
32	(Rd+1, Rd)+ K~»Rd+1, Rd	ADIW Rd, К		+	+	+	+	+ 
33	(Rd+i> Rd) _ K-*Rd+1, Rd	SBIW Rd, К		+	+	+	+	+
d - 24, 26, 28, 30; К = 0—63
Система команд
27
Таб ли ца 2.4
Ns	Операция	Мнемокод команды	№	Операция	Мнемокод команды
34	(A4kHRd	LDS Rd, к	35	(Рг)-»Ячк	STS k, Rr
d, г = 0—31; к — адрес из адресного пространства SRAM
Таб ли ца 2.5
Ns	Операция	Мнемокод команды	Ns	Операция	Мнемокод команды
36	(R4(X)HRd	LD Rd, X	37	(Rr)-*R4(X)	ST X, Rr
38	(A4(Y))-*Rd	LD Rd, Y	39	(RrHR4(Y)	ST Y, Rr
40	(R4(Z))->Rd	LD Rd, Z	41	(RrHR4(Z)	ST Z, Rr
42	1. (R4(X))->Rd 2. (X)+1-X	LD Rd, X+	43	1. (Rr)-»R4(X) 2. (X)+1-*X	ST X+, Rr
44	1. (R4(Y))-»Rd 2. (Y)+1-»Y	LD Rd, Y+	45	1.(Rr)-R4(Y) 2. (Y)+1-*Y	ST Y+, Rr
46	1,(R4(Z))-Rd 2. (Z)+1-*Z	LD Rd, Z+	47	1. (Rr)-*R4(Z) 2. (Z)+1-Z	ST Z+, Rr
48	1. (X)-1-*X 2. (R4(X)HRd	LD Rd, -X	49	1. (X)-1-X 2. (Rr)-*R4(X)	ST -X, Rr
50	1. (Y)-1-Y 2.(R4(Y))-»Rd	LD Rd, -Y	51	1. (Y)-1-Y 2. (Rr)-R4(Y)	ST -Y, Rr
52	1,(Z)-1->Z 2. (A4(Z))-Rd	LD Rd, -Z	53	1.(Z)-1->Z 2. (Rr)-R4(Z)	ST -Z, Rr
54	(R4(Y)+qHRd	LDD Rd, Y+q	55	(Rr)->R4(Y)+q	STD Y+q, Rr
56	(R4(Z)+q)->Rd	LDD Rd, Z+q	57	(RrKR4(Z)+q	STD Z+q, Rr
58	1. (SP)+1-*SP 2. (CTEK)->Rd	POP Rd	59	1. (RJ-CTEK 2. (SP)-1-*SP	PUSH Rr
d, г = 0—31; q = 0—63
Таб ли ца 2.6
Ns	Операция	Мнемокод команды	Ns	Операция	Мнемокод команды
60	(PrP)-Rd	IN Rd, P	61	(Pr)->PrP	OUT P, Rr
d, г = 0—31; Р = 0—63 = $00—$3F
28
Глава 2
Таб ли ца 2.7
Ns	Операция	Мнемокод команды	(Z.15-1) — адрес в FlashROM Z.0 = 0 - мл. байт; Z.0 - 1 — ст. байт
62	(Rm(Z))-R0	LPM	
Таб ли ца 2.8
Ns	Операция	Мнемокод команды	Ns	Операция	Мнемокод команды
63	T-Rd.b	BLD Rd, b	64	Rr.b—Т	BST Rr, b
65	О-РгР.Ь	CBI Р, b	66	1-РгР.Ь	SBI Р, b
67	0-SREG.b	BCLR b	68	1-SREG.b	BSETb
d, г = 0—31; Р = 0—31 (!); Ь = 0—7
Таб ли ца 2.9
Ns	Операция	Мнемокод команды	Ns	Операция	Мнемокод команды
69	0—I	CLI	70	1-1	SEI
71	0-Т	CLT	72	1-Т	SET
73	о-н	CLH	74	1-Н	SEH
75	0-S	CLS	76	1-S	SES
77	0-V	CLV	78	1-V	SEV
79	0-N	CLN	80	1-N	SEN
81	0-Z	CLZ	82	1-Z	SEZ
83	о-с	CLC	84	1-С	SEC
Таб ли ца 2.10
Ns	Операция	Мнемокод команды	Ns	Операция	Мнемокод команды
85	(PC)+1+k-PC	RJMPk	86	(Z)-PC	IJMP
87	1. (PC)+1-CTEK 2. (SP)-2—SP 3. (PC)+1+k-PC	RCALL k	88	1.	(PC)+1—СТЕК 2.	(SP)-2—SP 3.	(Z)-PC	ICALL
89	1. (SP)+2—SP 2. (СТЕК)—PC	RET	90	1.	(SP)+2—SP 2.	(CTEK)-PC 3.	1—1	RETI
к = -2048 — +2047
Система команд
29
Таб ли ца 2. 1 1
Ns	Условие	Мнемокод команды	Ns	Условие	Мнемокод команды
91	1 = 0	BRIDk	92	1=1	BRIE k
93	Т = 0	BRTC k	94	T= 1	BRTSk
95	Н = 0	BRHCk	96	H= 1	BRHSk
97	s = o	BRGEk	98	S = 1	BRLTk
99	v = o	BRVCk	100	V- 1	BRVSk
101	N = 0	BRPLk	102	N = 1	BRMIk
103	z = o	BRNEk	104	Z= 1	BREQk
105	c = o	BRCCk	106	C= 1	BRCS k
107	c = o	BRSH k	108	C = 1	BRLO k
109	SREG.b = 0	BRBC b, k	110	SREG.b =1	BRBS b, k
к « -64 — +63; b - 0-7
Таб ли ца 2.12
Ns	Условие	Мнемокод команды	Ns	Условие	Мнемокод команды
111	Rr.b = 0	SBRC Rr, b	112	Rr.b = 1	SBRS Rr, b
113	PrP.b = 0	SBIC P, b	114	PrP.b = 1	SBIS P, b
115	(Rd) - (Rr)	CPSE Rd, Rr			
d, г« 0-31; Р -0—31 (!);Ь = 0—7
Таб ли ца 2.13
Ns	Операция	Мнемокод команды
116	МК -> режим энергосбережения	SLEEP
117	Перезапуск WDT	WDR
118	Нет	NOP
2.2.	Команды регистровых операций
В группу регистровых операций входят пересылочные, арифметические и логические операции. Команды регистровых операций описаны в табл. 2.1, 2.2 и 2.3. Машинные коды всех команд регистровых операций имеют формат "слово", команды №№ 1—31 выполняются за один такт, а команды №№ 32 и 33 — за два такта.
При описании операций в табл. 2.1—2.3 используются следующие обозначения:
30
Глава 2
	Rd, Rr — регистры общего назначения с номерами биг соответственно;
	(Rd), (Rr) — байты в регистрах Rd и Rr соответственно;
	Rd.b — разряд b (Ь = 0—7) регистра Rd, бит в разряде Rd.b;
	$ — указатель шестнадцатеричного кода;
	л, v, © - знаки логических операций И, ИЛИ, исключающее ИЛИ соответственно;
	( )> ( )> ( ) — знаки операций ИЕ, сдвиг кода вправо, сдвиг кода влево соответственно.
Арифметические операции — сложение и вычитание — могут выполняться с числами без знака в двоичном коде и с числами со знаком в дополнительном двоичном коде. В отличие от микроконтроллеров многих других семейств, в которых вычитание сводится к сложению с числом с измененным знаком (X-Y = X + (-Y )), в микроконтроллерах семейства AVR вычитание выполняется с помощью аппаратного двоичного вычитателя. Работа двопчпого вычитателя рассмотрена в приложении П7.
При выполнении арифметических и логических операций кроме кода результата формируются значения признаков результата. При выполнении операций сравнения (команды №№ 18, 19 и 27) формируются только значения признаков результата.
Значения признаков результата представлены состоянием разрядов регистра состояния SREG (№ $3F). Используются шесть признаков результата, которым присвоены имена С (SREG.O), Z (SREG.l) N (SREG.2), V (SREG.3), S (SREG.4) и Н (SREG.5). В табл. 2.1-2.3 признаки, значения которых формируются при выполнении команд, отмечены знаком "+" или указано их значение.
При выполнении разных операций значение признаков формируются по разным правилам.
Признак С принимает единичное значение:
	при появлении единицы переноса из старшего разряда при выполнении операции сложения (команды №№ 14, 15 и 32);
	при появлении единицы займа в старший разряд при выполнении операции вычитания (команды №№ 4, 16, 17, 18, 19, 25, 26, 27 и 33);
	при выходе единицы за пределы разрядной сетки при выполнении операции сдвига (команды №№ 7, 8, 9, 10 и И).
Единичное значение признака С при выполнении операций сложения и вычитания с числами без знака свидетельствует о получении неправильного результата операции вследствие переполнения разрядной сетки.
Признак Z принимает единичное значение при получении нулевого результата операции. При выполнении операции вычитания с учетом займа (команды №№ 17, 19 и 26) Z « 1, если нулевой результат получен при выполнении данной и предшествующей операций.
Система команд
31
Признак N имеет значение, равное значению старшего разряда кода результата. При выполнении арифметических операций с числами со знаком и отсутствии переполнения разрядной сетки он представляет знак результата.
Признак V принимает единичное значение, если при выполнении арифметической операции с числами со знаком возникло переполнение разрядной сетки.
Признак S = N © V представляет знак результата при выполнении арифметических операций с числами со знаком вне зависимости от переполнения разрядной сетки. При переполнении разрядной сетки (V = 1) знак результата противоположен значению в старшем разряде кода результата.
Признак Н принимает единичное значение при наличии единицы переноса из разряда D3 в разряд D4 при выполнении операции сложения, при наличии единицы займа в разряд D3 из разряда D4 при выполнении операции вычитания и при передаче единицы из разряда D3 в разряд D4 при выполнении операции сдвига кода влево.
2.3.	Команды с обращением по адресу SRAM
По командам с обращением по адресу в адресном пространстве SRAM выполняются операции пересылки (копирования) байта между регистром общего назначения и элементом, которому соответствует адрес в адресном пространстве SRAM. Таким элементом может быть регистр общего назначения (адреса от $00 до $1F), регистр ввода-вывода (адреса от $20 до $5F), ячейка памяти в SRAM (адреса от $60 до максимального адреса в SRAM), ячейка памяти в ERAM (адреса от максимального адреса в SRAM +1 до максимального адреса в ERAM) (см. п. 1.5).
Команды с обращением по адресу в адресном пространстве SRAM описаны в табл. 2.4 и 2.5.
Машинные коды команд №№ 34 и 35 имеют формат "2 слова", машинные коды остальных команд — формат "слово". Команды выполняются за 2 такта, а при обращении к ячейкам в ERAM — за 3 такта. В случае необходимости в цикл выполнения команды при обращении к ERAM может быть введен дополнительный такт ожидания.
В табл. 2.4 и 2.5 используются следующие новые обозначения:
	ЯчА — регистр общего назначения, регистр ввода-вывода, ячейка памяти в SRAM, ячейка памяти в ERAM, к которым производится обращение с использованием адреса А из адресного пространства SRAM;
	(ЯчА) — байт в ЯчА;
32
Глава 2
	X, Y, Z — пара регистров общего назначения X (R26, R27), Y (R28, R29), Z (R30, R31) соответственно;
	(X), (Y), (Z) — слово в паре регистров X, Y, Z соответственно;
	СТЕК — ЯчА, к которой производится обращение с использованием адреса, хранящегося в регистре-указателе стека SP;
	(СТЕК) - байт в СТЕК, е;
	(SP) — код числа в регистре SP.
В командах №№ 34 и 35 реализуется прямая адресация. Адрес байта (А = к) указывается в коде команды.
В командах №№ 36—57 реализуется косвенная адресация. Адрес байта находится в паре регистров X, Y или Z. При выполнении команд №№ 42—47 после выполнения пересылки адрес в паре регистров аппаратно увеличивается на единицу. При выполнении команд №№ 48—53 до выполнения пересылки адрес в паре регистров аппаратно уменьшается на единицу. При выполнении команд №№ 54—57 адрес, по которому производится обращение, равен адресу в паре регистров Y или Z, увеличенному на число q, которое указано в коде команды. Адрес в паре регистров остается без изменения.
В командах №№ 58 и 59 в качестве кода адреса используется код, находящийся в регистре-указателе стека. При запуске микроконтроллера в регистр-указатель стека заносится код числа 0. Для нормальной работы стека в регистр-указатель стека в начале программы необходимо занести код другого числа. Обычно в качестве такого числа используют старший адрес в SRAM. Например, для микроконтроллера типа 8515 таким адресом является число $025F (см. рис. 1.2).
2.4,	Команды с обращением к регистрам ввода-вы вода
По командам с обращением к регистрам ввода-вывода выполняются операции пересылки (копирования) байта между регистром общего назначения и регистром ввода-вывода с использованием для выбора регистра ввода-вывода его номера ($00 - $3F). Команды с обращением к регистрам ввода-вывода описаны в табл. 2.6. Машинные коды команд имеют формат "слово". Команды выполняются за один такт.
В табл. 2.6 используются следующие новые обозначения;
	РгР — регистр ввода-вывода с номером Р;
	(РгР) — байт в регистре РгР.
При записи мнемокода команды вместо конкретного номера регистра может использоваться его символическое имя. Все регистры ввода-вывода имеют штатные имена. Имена регистров ввода-вывода и их
система команд
33
номера приведены в приложении П4. У микроконтроллеров разных ’ инов регистры ввода-вывода, имеющие одинаковые имена, могут иметь эазные номера. При записи в мнемокодах имен регистров вместо их номера необходимо использовать версию AVR-Ассемблера для микроконтроллера данного типа.
2.5.	Команда с обращением к FlashROM
По команде с обращением к FlashROM выполняется пересылка < копирование) байта из половины ячейки памяти в FlashROM в регистр эбщего назначения R0. Команда описана в табл. 2.7. Машинный код команды имеет формат "слово". Команда выполняется за три такта.
До выполнения команды необходимо адрес, соответствующий ячейке памяти в FlashROM, в которой хранится константа, умножить на 2 и записать в пару регистров Z (№№ $30, $31).
При умножении на 2 (сдвиг кода влево на один разряд) в младшем оазряде регистра ZL ($30) оказывается цифра 0. При нулевом значении младшего разряда выбирается байт из младшей половины ячейки FlashROM. Для выбора байта из старшей половины ячейки необходимо число, код которого находится в паре регистров Z, увеличить на 1 с использованием команды № 33 с мнемокодом ADIW R30, 1 или ADIW ZL, 1.
Запись констант в FlashROM выполняется при программировании микроконтроллера.
2.6.	Команды операций с битами
Команды операций с битами описаны в табл. 2.8 и 2.9. Машинные коды всех команд имеют формат "слово". Команды №№ 65 и 66 выполняются за 2 такта, остальные команды — за 1 такт.
В табл. 2.8 используется следующее новое обозначение:
 РгР.Ь — разряд b (Ь = 0—7) регистра ввода-вывода с номером Р (Р = $00 - $1F (!)), бит в разряде РгР.Ь.
По командам №№ 63 и 64 выполняется пересылка (копирование) бита между указанным разрядом регистра общего назначения и разрядом Т регистра SREG.
По командам №№ 65 и 66 устанавливается в требуемое состояние (0 или 1 соответственно) указанный разряд регистра ввода-вывода, а по командам №№ 67 и 68 — указанный разряд регистра SREG.
При записи мнемокодов команд №№ 65 и 66 вместо номера регистра (Р) может быть указано его символическое имя (см. приложение П4), а вместо номера разряды (Ь) — символическое имя разряда. В микроконтроллерах семейства AVR разряды многих регистров ввода-вывода
34
Глава 2
имеют штатные имена. Эти имена приводятся в тексте при рассмотрении устройств, в которых эти разряды используются. Штатные имена разрядов регистров ввода-вывода, управляющих работой различных устройств микроконтроллера и отражающих состояние этих устройств приведены в приложении П5.
В микроконтроллерах некоторых типов разряды одноименных регистров с одинаковыми именами имеют разные номера. При использовании штатных имен регистров ввода-вы вода и штатных имен разрядов в них необходимо использовать версию AVR Ассемблера для микроконтроллера соответствующего типа.
При назначении штатного имени разряда подразумевалось, что этот разряд принадлежит определенному регистру ввода-вывода, однако в мнемокоде команд №№ 65 и 66 необходимо указывать и имя/номер регистра и имя разряда.
Требуемое значение бита (0 или 1) в разрядах регистров ввода-вывода с номерами от $20 до S3F устанавливается с использованием команд регистровых операций с мнемокодами CBR (№ 29) и SBR (№ 31) соответственно.
В табл. 2.9 приведены мнемокоды команд, по которым устанавливается в определенное состояние (0 или 1) разряды регистра SREG без указания в мнемокоде команды номера разряда.
2.7.	Команды управления ходом программы
В группу команд управления ходом программы входят команды безусловного и условного переходов, перехода в энергосберегающий режим, перезапуска сторожевого таймера и "холостая" команда.
В табл. 2.10 описаны команды безусловного перехода (№№ 85 и 86), безусловного перехода с возвратом (№№ 87 и 88), возврата из подпрограммы (№ 89) и возврата из прерывающей программы (№ 90). В таблице используются следующие новые обозначения:
	PC — счетчик команд;
	(PC) — код числа в счетчике команд;
	к — приращение числа в счетчике команд.
При записи программы на языке ассемблера в мнемокодах команд №№ 85 и 87 вместо приращения к указывается метка (символический адрес), записанная перед мнемокодом команды, к выполнению которой нужно перейти. Приращение вычисляется и помещается в машинный код команды в процессе ассемблирования.
Машинные коды команд, описанные в табл. 2.10, имеют формат "слово". Команды безусловного перехода (№№ 85 и 86) выполняются за 2 такта, команды безусловного перехода с возвратом (№№ 87 и 88) — за 3 такта, команды возврата (№№ 89 и 90) — за 4 такта.
Система команд
35
Группа команд условного перехода делится на две подгруппы. В командах первой подгруппы в качестве условия используется равенство нулю или равенство единице одного из битов в регистре SREG. Условия и мнемокоды команд первой подгруппы приведены в табл. 2.11. Если условие выполняется, совершается переход по адресу, который формируется с использованием приращения к, указанного в коде команды ((PC) + 1 + k-PC; -64sk<63).
Если условие не выполняется, происходит переход к следующей команде в программе ((PC) + 1-»РС).
Фрагмент структурной схемы программы с командой условного перехода из первой подгруппы изображен на рис. 2.1.
Рис. 2.1.	Рис. 2.2.
При записи программы на языке ассемблера в мнемокоде команд, описанных в табл. 2.11, вместо приращения к указывается метка (символический адрес), записанная перед мнемокодом команды, к выполнению которой нужно перейти, если условие выполняется.
Машинные коды команд первой подгруппы (табл. 2.11) имеют формат "слово". При выполнении условия команда выполняется за 2 такта, при невыполнении условия — за 1 такт.
Команды условного перехода второй подгруппы и используемые в них условия описаны в табл. 2.12. Если условие не выполняется, совершается переход к очередной команде в программе ((PC) + 1-*РС). Если условие выполняется, происходит переход к выполнению команды, следующей за очередной ((PC) + 1 + 1/2-»РС). Приращение числа в счетчике команд (1 или 2) определяется форматом машинного кода очередной команды (1 слово или 2 слова соответственно). Фрагмент структурной схемы программы с командой условного перехода из второй подгруппы изображен на рис. 2.2.
Машинные коды команд условного перехода второй подгруппы (табл. 2.12) имеют формат "слово". Команды выполняются за один такт, если условие не выполняется, за 2 такта, если условие выполняется и очередная команда (К1) имеет формат "слово", или за 3 такта, если условие не выполняется и очередная команда (К1) имеет формат "2 слова".
36
Глава 2
В табл. 2.13 приведены мнемокоды команд, при выполнении которых совершается переход микроконтроллера в один из энергосберегающих режимов (№ 116), выполняется перезапуск сторожевого таймера (№ 117) или в ходе программы появляется "холостой" такт, в котором не выполняются какие-либо операции (№ 118). Энергосберегающие режимы работы микроконтроллера рассмотрены в п. 4.3. Работа сторожевого таймера описана в п. 3.6.
2.8.	Дополнительные команды в системе команд микроконтроллеров типа т163 и тЮЗ
Операции, выполняемые по командам, и мнемокоды дополнительных команд описаны в табл. 2.14. Знаком "+" отмечено вхождение команды в систему команд микроконтроллера указанного типа.
Таб ли ца 2.14
№	Операция	Мнемокод команды	Тип MK	
			m163	m103
119	(Rr+i> RrHRd+1, Rd d, г = 0,2	30	MOVW Rd, Rr	+	
120	(Rd)x(Rr)-»R1, RO d, r - 0—31	MUL Rd, Rr	+	
121	(Rd)x(Rr)-*R1, R0 d,r = 16 — 31	MULS Rd, Rr	+	
122	(Rd)x(Rr)->Rl, R0 d, r= 16—23	MULSU Rd, Rr	+	
123	1. (Rd)x(Rr)-*R1, R0	FMUL Rd, Rr	+	
124	<	 2. C*-(R1, R0)*-0	FMULS Rd, Rr	+	
125	d, r = 16—23	FMULSU Rd, Rr	+	
126	k-»PC	JMPk	+	+
	1. (PC) + I^CTEK	CALL k	+	+
127	2. (SP)—2^SP 3. k-*PC			
128	(R4(Z))-Rd d = 0—31	LPM Rd, Z	+	
	1. (R4(Z))-»Rd	LPM Rd, Z+	+	
129	2. (Z)+1-Z d = 0—31			
130	(A4(Z'))-R0 (Z‘) = RAMPZO, (Z)	ELPM		+
131	см. табл. 2.15	SPM	+	
Система команд
37
По команде регистровой операции с мнемокодом 'MVF/4'v ^kd, 5kr (№ 119) выполняется пересылка (копирование) слова из одной пары регистров общего назначения в другую пару регистров. Машинный код команды имеет формат "слово", команда выполняется за один такт.
По трем командам регистровых операций с мнемокодами MUL Rd, Rp MULS Rd, Rr и MULSU Rd, Rr (№№ 120, 121 и 122) выполняется операция умножения, в которой участвует целые числа без знака (MUL), целые числа со знаком (MULS) и целое число со знаком и целое число без знака (MULSU). При выполнении операции формируются значения признаков результата С и Z (С = R1.7, Z = 1, если после выполнения операции (R1) • 0 и (R2) = 0).
По трем командам регистровых операций с мнемокодами операции FMUL, FMULS и FMULSU (№№ 123, 124, 125) выполняется операция умножения с увеличением результата в два раза, в которой участвуют дробные числа без знака (FMUL), дробные числа со знаком (FMULS) и дробное число со знаками и дробное число без знака (FMULSU). Операнды имеют формат 1.7, а результат — формат 1.15, где справа от точки указано число дробных разрядов. При выполнении операции формируются значения признаков результата С и Z (С — результат сдвига влево кода произведения, Z = 1, если после выполнения операции (R1) = 0 и (R0) = 0.)
Машинные коды команд №№ 120—125 имеют формат "слово". Команды выполняются за два такта с использованием аппаратного умножителя.
По командам с мнемокодами JMP к (№ 126) и CALL к (№ 127) совершаются безусловный переход и безусловный переход с возвратом в пределах всего адресного пространства FlashROM. Машинные коды этих команд имеют формат "2 слова". Команды выполняются за 3 (JMP) и 4 (CALL) такта.
По командам пересылочных операций с обращением к FlashROM с мнемокодами LPM Rd, Z и LPM Rd, Z+ (№№ 128, 129) выполняется операция пересылки (копирования) константы из половины ячейки FlashROM в любой регистр общего назначения. До выполнения команды необходимо адрес, соответствующий ячейке памяти, в которой хранится константа, умножить на 2 и записать в пару регистров Z. Если требуется прочитать байт из старшей половины ячейки, к числу, код которого записан в паре регистров Z, необходимо добавить 1.
При выполнении команды с мнемокодом LPM Rd, Z+ после пересылки байта число, код которого хранится в паре регистров Z, увеличивается на 1 аппаратно.
Машинные коды команд №№ 128 и 129 имеют формат "слово". Команды выполняются за 3 такта.
По команде с мнемокодом ELPM (№ 130) выполняется пересылка константы из половины ячейки FlashROM в регистр R0 (см. команду
38
Глава 2
№ 62). В микроконтроллере типа ml03 FlashROM содержит 64 К ячеек памяти. Для размещения старшего разряда кода после умножения на 2 используется разряд RAMPZ0 регистра RAMPZ (№ $ЗВ). Машинный код команды имеет формат "слово". Команда выполняется за 3 такта.
Команда с мнемокодом SPM (№ 131) предназначена для записи байтов в FlashROM в процессе выполнения программы. При выполнении команды используется регистр управления SPMCR (№ $37) и пара регистров Z.
С использованием команды с мнемокодом SPM выполняются следующие операции:
1)	пословное заполнение буферного запоминающего устройства (BUF) емкостью 64X16 бит;
2)	стирание в FlashROM страницы — группы из 64-х ячеек;
3)	перепись 64-х слов из буферного ЗУ в "очищенную" страницу FlashROM.
Для задания номера ячейки в буферном ЗУ используются разряды Z6—Z1 в паре регистров Z. Для задания номера страницы (начального адреса в странице) используются разряды Z13—Z7 в паре регистров Z.
Выбор операции, выполняемой по команде с мнемокодом SPM, определяется кодом, который до выполнения команды SPM, но не ранее, чем за 4 такта до ее выполнения, записывается в регистр SPMCR. Коды, записываемые в регистр SPMCR, и операции, выполняемые при этом по команде SPM, указаны в табл. 2.15.
Таб ли ца 2.15
(SPMCR)	Операция
$01	(R1, R0HBUF (Z.6—Z.1)
$03	$FF-*Rh (Z.13—Z.7, 0...0Х) $FF-Rm (Z.13—Z.7, 1...1X)
$05	(BUF)-Rm (Z.13—Z.7, 0...0X) -*Яч (Z.13—Z.7, 1...1X)
$09	(R0.5—2)-*BLB12, BLB11, BLB02, BLBO1
При (SPMCR) = $01 по команде SPM слово, рапее записанное в пару регистров Rl, R0, пересылается (копируется) в ячейку буферного ЗУ, номер которой указан в разрядах с шестого по первый в паре Z регистров общего назначения. Буферное ЗУ может заполняться в произвольном порядке.
Система команд	39
При (SPMCR) = $03 происходит стирание группы ячеек в FlashROM с номерами в двоичном коде от Z.13,	Z.7, 0, 0, 0, 0, 0, 0, X до Z.13,
.... Z.7, 1, 1, 1, 1, 1, 1, X.
При (SPMCR) = $05 происходит перепись 64-х слов из буферного ЗУ в ранее стертую страницу FlashROM.
При (SPMCR) = $09 производится установка битов защиты (Lock Bits) BLB12, BLB11, BLB02 и BLB01, которые разрешают/запрещают выполнять запись в FlashROM с использованием команды SPM и чтение из FlashROM с использованием команды LPM.
—______ J*
лава w
Работа периферийных устройств
В работе периферийных устройств участвуют регистры ввода-вывода. Работа периферийных устройств определяется состоянием разрядов регистров управления, а состояние периферийных устройств отражается состоянием разрядов регистров состояния. Имена и номера регистров ввода-вывода у микроконтроллеров разных типов указаны в приложении П4. Имена и номера разрядов регистров управления и разрядов регистров состояния приведена в приложении П5.
3.1.	Параллельные порты ввода-вывода
Число параллельных портов ввода-вывода, суммарное число выводов портов и суммарное число выводов, выполняющих альтернативные функции, у микроконтроллеров разных типов указано в табл. 1.1 в колонках Р, I/O и ALT соответственно.
В табл. 3.1 приведены имена портов и указано число выводов (в числителе) и число выводов, выполняющих альтернативные функции (в знаменателе) для каждого порта в отдельности.
В состав порта РХ (X = А, В, С, D, Е) входят три регистра ввода-вывода с именами DDRX, PORTX и PINX. Регистр PINX не имеет
Работа периферийных устройств
41
аппаратной реализации. Это имя используется в командах, по которым выполняется чтение байтов на выводах порта.
Число разрядов в регистрах равно числу выводов порта.
Таб ли ца 3.1
Тип МК	Имя порта					
	PA	PB	PC	PD	PE	PF
t11		6/6				
t12		6/6				
t15		6/6				
2323		3/2				
2343		5/3				
1200		8/2		7/2		
2313		8/3		7/7		
t28	4/1	8/5*		8/0		
4433		6/6	6/6	8/8		
8515	8/8	8/8	8/8	8/7		
8535	8/8	8/8	8/2	8/8		
m163	8/8	8/8	8/4	8/8		
m103	8/8	8/8	8/8*	8/7	8/8	8/8*
* — PC — только выходы; РВ, PF — только входы.
На рис. 3.1. изображена структурная схема разряда Y (Y = 0, 1, ..., 7) порта РХ.
Рис. 3.1
Состояние разряда DDRX.Y определяет направление передачи бита через вывод порта PX.Y. При DDRX.Y = 0 вывод PX.Y работает в режиме входа, при DDRX.Y = 1 — в режиме выхода.
В режиме входа состояние разряда PORTX.Y определяет состояние вывода PX.Y При PORTX.Y = 0 вывод находится в высокоимпедансном состоянии (Z-состояние), при PORTX.Y = 1 вывод порта через внут
42
Глава 3
ренний резистор с сопротивлением 30—120 кОм подключается к шине VCC. В режиме входа вывод PX.Y соединен с шиной данных ШД.У.
Значение входного сигнала на отдельном выводе порта может быть определено с использованием команд условного перехода с мнемокодом SBIC PINX, Y (№ ИЗ) или SBIS'PINX, Y (№ 114). При одном значении сигнала выбирается одно продолжение программы, при другом значении сигнала — другое продолжение.
В режиме выхода разряд PORTX.Y определяет значение выходного сигнала на выводе PX.Y. При PORTX.Y = 0 выходной сигнал имеет низкий уровень напряжения (U0L), при PORTX.Y = 1 — высокий уровень напряжения (U0H).
В табл. 3.2 указано состояние вывода порта PX.Y при различных комбинациях состояний разрядов DDRX.Y и PORTX.Y.
Таб ли ца 3.2
DORX.Y	PORTX.Y	PX.Y
0	0	Вход, (Z)
0	1	Вход, (R)
1	0	Выход, (U0L)
1	1	Выход, (U0H)
В статическом состоянии при низком уровне выходного сигнала ток нагрузки /OL должен быть не более, чем 20 мА, при высоком уровне сигнала ток нагрузки /он должен быть не более, чем 3 мА. При этом суммарный ток нагрузки для всех выводов микроконтроллера должен быть не более, чем некоторое пороговое значение (200—400 мА для микроконтроллеров разных типов) и суммарный ток нагрузки для выводов микроконтроллера, расположенных на одной стороне корпуса микросхемы, также должен быть не более, чем некоторое пороговое значение (100—200 мА для микроконтроллеров разных типов).
Задание значения выходного сигнала на отдельных выводах порта выполняется с использованием команд с мнемокодами CBI PORTX, Y (№ 65) (для низкого уровня) и SBI PORTX, Y (№ 66) для высокого уровня.
При совместном использовании всех разрядов порта для приема и выдачи байтов используются команды с мнемокодами IN Rd, PINX (№ 60) и OUT PORTX, Rr (№ 61) соответственно.
Обращение к параллельному порту для приема и выдачи байтов может быть выполнено с использованием команд с обращением по адресам в адресном пространстве SRAM (№№ 34—57). При этом в качестве адресов используются номера регистров ввода-вывода, увеличенные на $20.
Работа периферийных устройств
43
При пуске и перезапуске микроконтроллера все разряды регистров DDRX и PORTX всех портов сбрасываются в нулевое состояние и выводы портов работают в режиме входов и находятся в Z состоянии.
Исключением является разряд PORTA.2 регистра PORTA в микроконтроллере типа t28, который устанавливается в единичное состояние.
В микроконтроллере типа ml63 при установке в единичное состояние разряда PUD регистра SFIOR (№ $30) во всех разрядах всех портов разрывается цепь, связывающая вывод порта с шиной VCC через резистор. В микроконтроллере типа tl5 разряд PUD входит в регистр MCUCR (№ $35).
В микроконтроллере типа t28 выводы порта РВ подключаются через резисторы к шине VCC при единичном состоянии разряда PLUPB регистра MCUCS.
3.2.	Последовательный порт ввода-вывода SPI
Порт SPI входит в состав периферийных устройств микроконтроллеров типа 4433, 8515, 8535, ш163 и ш103.
Основным элементом порта SPI является восьмиразрядный реверсивный сдвигающий регистр, который используется для параллельного ввода из шины данных микроконтроллера байта, предназначенного для выдачи: последовательной выдачи байта на выход микроконтроллера с одновременным последовательным вводом байта со входа микроконтроллера и параллельной выдачи введенного байта в буферный регистр для последующей передачи в шину данных микроконтроллера. Сдвигающий регистр и буферный регистр имеют одно имя — SPDR (№ $0F). Запись байта в сдвигающий регистр выполняется по команде OUT SPDR, Rr, чтение байта из буферного регистра — по команде IN Rd, SPDR.
В состав порта SPI входят также регистр управления SPCR (№ $0D), регистр состояния SPSR (№ $0Е) и элементы, управляющие работой порта. Структурная схема порта SPI изображена на рис. 3.2.
Порт SPI переводится в рабочее состояние при установке в единичное состояние разряда SPE регистра SPCR. При этом выводы порта MOSI, MISO, SCK и SS подключаются к внешним выводам микроконтроллера в соответствии с табл. 3.3.
Таб ли ца 3.3
Выводы порта SPI	ТипМК				
	4433	8515	8535	m163	m103
MOSI	РВЗ	РВ5	РВ5	РВ5	РВ2
MISO	РВ4	РВ6	РВ6	РВ6	РВЗ
SCK	РВ5	РВ7	РВ7	РВ7	РВ1
SS	РВ2	РВ4	РВ4	РВ4	РВО
44
Глава 3
Рис. 3.2
Порт SPI может работать в режиме ведущего (master) или ведомого (slave). Выбор режима определяется состоянием разряда MSTR регистра SPCR. При MSTR=1 порт работает в режиме ведущего. При этом вывод MOSI является выходом, вывод MISO — входом, вывод SCK — выходом. Функция вывода SS зависит от состояния разряда DDRB.X (X = 2, 4, 0) регистра DDRB. Если DDRB.X = 1 (вывод РВ.Х является выходом), вывод SS порта SPI не подключен к выводу РВ.Х порта РВ. Если DDRB.X = 0 (вывод РВ.Х является входом), значение сигнала на этом входе влияет на работу порта SPI. При единичном значении сигнала на этом входе порт работает в режиме ведущего, а при появлении нулевого значения сигнала он переводится в режим ведомого и для возвращения в режим ведущего после появления единичного значения сигнала на входе SS требуется вновь установить разряд MSTR регистра SPCR в единичное состояние.
В режиме ведущего обмен байтами начинается при записи байта в сдвигающий регистр SPDR (W). В схеме управления СУ1 вырабатывается серия из восьми импульсов, которая управляет сдвигом в регистре SPDR (W) и выдается на выход SCK для управления сдвигом в регистре ведомого порта.
Работа периферийных устройств
45
Полярность импульсов определяется состоянием разряда CPOL регистра SPCR. При CPOL = 0 сигнал на выходе SCK в исходном состоянии имеет нулевое значение, импульс формируется при переходе сигнала к единичному значению. При CPOL = 1 сигнал в исходном состоянии имеет единичное значение и импульс формируется при переходе сигнала к нулевому значению.
Направление сдвига в регистре и порядок следования битов на выходе MOSI определяется состоянием разряда DORD регистра SPCR. При DORD = 0 выдача байта начинается со старшего бита (D7), при DORD = 1 выдача начинается с младшего бита (DO). При выдаче каждого бита на выход MOSI соответствующий бит из ведомого порта поступает на вход MISO и вводится в сдвигающий регистр.
Серия из восьми импульсов в ведущем порте формируется из тактового сигнала СК путем деления частоты в пересчетной схеме ПС. Коэффициент деления К определяется комбинацией состояний разрядов SPR0 и SPR1 регистра SPCR в соответствии с табл. 3.4. В микроконтроллере типа ш163 в регистре состояния SPSR есть дополнительный разряд SPI2X, при единичном состоянии которого скорость передачи увеличивается в два раза.
Таб ли ца 3.4
SPR1	SPR0	к	К1*
0	0	4	2
0	1	16	8
1	0	64	32
1	1	128	64
* — в МК типа т163 при SPI2X = 1
При завершении выдачи/приема байта устанавливается в единичное состояние разряд SPIF регистра состояния SPSR и при единичном состоянии разряда SPIE регистра SPCR в блок прерываний поступает запрос прерывания SPI STC (SPI Serial Transfer Complete).
Разряд SPIF сбрасывается в нулевое состояние аппаратно при переходе к выполнению соответствующей прерывающей программы или при чтении регистра SPSR перед записью нового байта в регистр SPDR (W).
При записи нового байта в регистр SPDR (W) в процессе сдвига ранее записанного байта устанавливается в единичное состояние разряд WCOL регистра SPSR (ошибка при вводе). Разряд WCOL сбрасывается в нулевое состояние при чтении регистра SPSR.
При MSTR = 0 порт работает в режиме ведомого. В этом случае вывод MOSI работает как вход, вывод MISO — как выход, выводы SCK и SS — как входы. Выводы порта подключаются к соответствующим
46
Глава 3
выводам порта РВ при установке в единичное состояние разряда SPE регистра SPCR. Порт переходит в рабочее состояние при нулевом значении сигнала на входе SS.
При поступлении серии импульсов на вход SCK из регистра SPDR (W) на вывод MISO последовательно выводится байт, ранее записанный в этот регистр. Одновременно в регистр вводится байт, поступающий на вход MOSI. При завершении обмена байтами устанавливается в единичное состояние разряд SPIF регистра SPSR и при единичном состоянии разряда SPIE в регистре SPCR в блок прерываний поступает запрос прерывания SPI STC.
Состояние разрядов CPOL и DORD в регистре SPCR у ведомого порта должно совпадать с состоянием одноименных разрядов у ведущего порта. Состояние разрядов SPR0 и SPR1 не влияет на работу порта.
Состояние разряда С РИА определяет значение сигнала на выходе MISO при переходе порта в рабочее состояние (SS = 0) до и после обмена байтами. При СРНА = 0 при переходе порта в рабочее состояние на выходе MISO появляется значение бита, который будет выдаваться первым, а значение сигнала после выдачи восьмого бита является неопределенным. При СРНА = 1 значение сигнала на выходе MISO при переходе порта в активное состояние является неопределенным, а после передачи восьмого бита на выходе MISO сохраняется значение переданного бита.
Временные диаграммы сигналов на выходах SCK и MOSI ведущего микроконтроллера и выходе MISO ведомого микроконтроллера при разных состояниях разрядов CPOL, DORD и СРНА изображены па рис. 3.3.
5W ff0£-« CPOL = 1 ППОП-П —-	—	I I I I +-J	I J 1— 1 1 Г”	"T" 1 	 1		 1 1 1 1	—			—	—	—
UUi\U-U MOSI ПОРП-1 		07						DO	
		1						।
	DO	j					D7	
rs “L_		1 1 1 1 1 1 1						
			1 1 1 1 I						
CPHA.-O	D7/0 MISO		'									?
CPHA-I	?								D7/0
Рис. 3.3
Работа периферийных устройств
47
При подключении к ведущему порту нескольких ведомых портов шины MOSI, MISO и SCK являются общими для всех портов, а выводы SS ведомых микроконтроллеров должны быть соединены со специальными выходами ведущего микроконтроллера с помощью отдельных шин. В качестве специальных выходов ведущего микроконтроллера могут использоваться любые выводы любых портов, не используемые в иных целях.
3.3.	Последовательный порт ввода-вывода UART
Порт UART входит в состав периферийных устройств микроконтроллеров типа 2313, 4433,8515, 8535, т163 и шЮЗ.
Порт UART содержит передатчик, приемник, тактовый генератор и аппаратуру управления передачей и приемом. Передатчик получает байт из шины данных микроконтроллера и формирует и выдает последовательность битов (кадр), которая кроме битов, составляющих байт (DO, D1, .., D7), содержит стартовый бит (start), имеющий пулевое значение, и столовый бит (stop), имеющий единичное значение. Между старшим битом байта (D7) и стоповым битом может помещаться дополнительный бит (СВ). Структура кадра, содержащего 10 и И битов, показана на рис. 3.4,а и б соответственно.
а)	'__
\ /DO\D1\D2\D3^D4\D5\D6\D~^7 '
Start	st°P
®	/00^02^0ф5^07\св/ \
Start	Stop
Рис. 3.4
Приемник выделяет стартовый бит, принимает кадр, формат которого (число битов) задан, расформировывает принятый кадр и подготавливает байт для выдачи в шину данных микроконтроллера.
Тактовый генератор формирует сигнал, определяющий скорость передачи и приема битов и позволяющий выделять биты при приеме кадра.
В состав порта входят регистр данных передатчика UDR (Т), регистр данных приемника UDR (R), регистр управления UCR или UCSRB (№ $0А), регистр состояния USR или UCSRA (№ $0В), регистр задания скорости передачи/приема UBRR (№ $09) и другие элементы. Регистры данных передатчика и приемника имеют один номер — $0С. При обращении для записи выбирается регистр UDR (Т), при обращении для чтения — регистр UDR (R). Структурная схема порта UART изображена на рис. 3.5.
48
Глава 3
Рис. 3.5
Передатчик готов к работе при установке в единичное состояние разряда TXEN регистра управления UCR. При этом выход передатчика TXD подключается к выводу определенного порта микроконтроллера. Передача кадра начинается при загрузке байта в регистр UDR (Т). Загрузку можно выполнять при единичном состоянии разряда UDRE регистра состояния USR. При сбросе микроконтроллера в исходное состояние устанавливается UDRE = 1.
Загруженный байт передается в сдвигающий регистр передатчика TSR и происходит выдача кадра на выход микроконтроллера TXD.
При нулевом состоянии разряда CHR9 регистра UCR формируется кадр из десяти битов. При CHR9 = 1 кадр содержит одиннадцать битов. Значение дополнительного бита в этом случае должно быть указано в разряде ТХВ8 регистра UCR.
Первый байт при загрузке немедленно передается в регистр TSR и разряд UDRE регистра USR сохраняет единичное состояние, что позволяет сразу после загрузки первого байта загружать в регистр UDR (Т)
Работа периферийных устройств 49
второй байт. Второй и последующие байты сохраняются в регистре UDR (Т) до завершения выдачи из регистра TSR предыдущего кадра. При этом разряд UDRE регистра USR находится в нулевом состоянии и загрузка очередного байта в регистр UDR (Т) запрещена.
При завершении выдачи кадра из регистра TSR и отсутствии очередного байта в регистре UDR (Т) устанавливается в единичное состояние разряд ТХС регистра USR и при единичном состоянии разряда TXCIE регистра UCR в блок прерываний поступает запрос прерывания UART ТХС.
Разряд ТХС регистра USR сбрасывается в нулевое состояние аппаратно при переходе микроконтроллера к выполнению соответствующей прерывающей программы или программно при выполнении команды установка бита в единичное состояние (!).
При единичном состоянии разряда UDRE регистра USR и единичном состоянии разряда UDRIE регистра UCR в блок прерываний поступает запрос прерывания UART DRE. Разряд UDRE сбрасывается в нулевое состояние при записи байта в регистр UDR (Т). Прерывающая программа, выполняемая по запросу прерывания UART DRE, должна содержать команду записи в регистр UDR (Т) для прекращения действия этого запроса прерывания.
Приемник готов к работе при установке в единичное состояние разряда RXEN регистра UCR. При этом вход приемника RXD подключается к выводу определенного порта микроконтроллера. При обнаружении на входе RXD отрицательного фронта сигнала, приемник определяет уровень сигнала в момент времени, отстоящий от фронта на половину интервала, отводимого на передачу бита при заданной скорости передачи. При обнаружении нулевого уровня принимается решение о приеме стартового бита и далее определяются уровни сигнала в моменты времени, отстоящие друг от друга на интервал, отводимый на передачу бита. Получаемая последовательность значений вводится в сдвигающий регистр приемника RSR. Если принимается кадр из одиннадцати битов (CHR9 = 1), дополнительный бит принимается в разряд RXB8 регистра UCR. Если на месте ожидаемого стопового бита сигнал имеет нулевое значение, устанавливается в единичное состояние разряд FE регистра USR (ошибка формата). Разряд FE сбрасывается в нулевое состояние при появлении единичного значения стопового бита.
Принятый байт из регистра RSR переписывается в регистр UDR (R). При этом устанавливается в единичное состояние разряд RXC регистра USR и при единичном состоянии разряда RXCIE регистра UCR в блок прерываний поступает запрос прерывания UART RXC.
Разряд RXC регистра USR сбрасывается в нулевое состояние при чтении регистра UDR (R). Прерывающая программа, выполняемая по запросу прерывания UART RXC, должна содержать команду чтения из регистра UDR для прекращения действия этого запроса.
50
Гпава 3
Если при завершении приема кадра принятый ранее байт не считан из регистра UDR (R), устанавливается в единичное состояние разряд OR регистра USR (состояние переполнения). Разряд OR сбрасывается в нулевое состояние при передаче байта из регистра RSR в регистр UDR (R).
Тактовый генератор BRG формирует сигнал, определяющий скорость передачи и приема битов и дополнительный сигнал, обеспечивающий выделение битов при приеме кадра. Скорость передачи и приема BR, бит/с, зависит от частоты тактового сигнала микроконтроллера FCK и числа (UBRR), двоичный код которого записан в регистре UBRR, и определяется по формуле:
16((UBRR) + 1) ‘
Для работы со стандартными скоростями приема-передачи (4800, 9600,14400, 19200, 28800, 38400, 57600, 76800 и 115200 бит/с) используются кварцевые резонаторы со специальными значениями резонансной частоты (3, 6864; 7,3728; 11,059 Мгц).
В порте UART микроконтроллеров типа 4433 и ml63 регистр управления вместо имени UCR имеет имя UCSRB, а регистр состояния вместо имени USR — имя UCSRA. Регистр UCSRA имеет дополнительный разряд МРСМ. При единичном состоянии разряда приемник принимает кадры, у которых дополнительный бит (СВ) имеет единичное значение и игнорирует кадры при СВ = 0. При нулевом состоянии разряда МРСМ принимаются кадры с любым значением дополнительного бита. Наличие разряда МРСМ позволяет организовать простейшую локальную сеть (мультипроцессорную систему), в которой имеется один ведущий контроллер и несколько ведомых. Каждому ведомому контроллеру присваивается определенный номер.
В исходном состоянии у всех ведомых контроллеров МРСМ = 1.
Ведущий контроллер передает кадр, в котором СВ = 1, а байт является номером ведомого котроллера, который должен принять данные из ведущего.
Все ведомые контроллеры принимают кадр. Контроллер, опознавший свой номер, сбрасывает разряд МРСМ в нулевое состояние. Далее ведущий контроллер передает кадры, в которых СВ = 0, а байты представляют собой данные для выбранного ведомого контроллера. Эти кадры принимаются только ведомым контроллером, у которого МРСМ = 0. Прп обнаружении кадра с СВ - 1 выбранный контроллер переводит разряд МРСМ в единичное состояние и переходит в исходное состояние.
В микроконтроллере типа ш163, кроме того, регистр UCSRA имеет дополнительный разряд U2X, а для задания скорости передачи используются два регистра — регистр UBRR (№$09) для задания младших
Работа периферийных устройств
51
восьми разрядов кода числа и регистр UBRRHI (№$20) для задания старших четырех разрядов кода числа. Скорость передачи определяется по формуле
K((UBRRHI, UBRR) + 1) ’
где К = 16 при U2X = 0, К = 8 при U2X = 1.
В табл. 3.5. указаны выводы портов микроконтроллеров, используемые в качестве входа приемника (RXD) и выхода передатчика (TXD) у микроконтроллеров разных типов.
Таблица 3.5
Вывод порта UART	Тип МК					
	2313	4433	8515	8535	m163	тЮЗ
RXD	PD0	PD0	PDO	PDO	PDO	PEO
TXD	PD1	PD1	PD1	PD1	PD1	PE1
3.4.	Последовательный порт ввода-вывода TWSI (I2C)
Порт TWSI входит в состав периферийных устройств микроконтроллера типа ml63.
Через порт TWSI микроконтроллер подключается к двухпроводной шине IC. Схема подключения нескольких устройств (У 1, ..., УЫ) к шине IC изображена на рис. 3.6.
Рис. 3.6
Устройство может работать в качестве ведущего или ведомого. Статус микроконтроллера, подключенного к шине IC, устанавливается программными средствами.
Линия SCL предназначена для передачи синхросигнала из веду него устройства в ведомое. Линия SDA совместно с линией SCL используется для передачи сигналов начала и конца обмена, адресных байтов и байтов данных и сигналов подтверждения приема байта. Линии SCL и SDA соединены с одноименными выводами подключенных устройств.
52
Глава 3
Кроме того, они через резисторы R1 и R2 подключены к шине VCC. При отсутствии обмена в линиях SCL и SDA устанавливается высокий уровень сигнала.
Ведущее устройство после перевода его в активное состояние дожидается освобождения шины от обмена между другими устройствами и формирует в шине посылку начала обмена {Start, ST), которая представлена переходом сигнала в линии SDA от высокого уровня к низкому уровню при высоком уровне сигнала в линии SCL.
После выдачи посылки ST в линии SCL устанавливается низкий уровень сигнала и далее формируется последовательность из девяти положительных импульсов. Установка требуемого значения бита в линии SDA производится при низком уровне сигнала в линии SCL. Передача байта начинается со старшего разряда.
Первым байтом, выдаваемом в шину ведущим устройством после выдачи посылки ST, является адресный байт. Старшие семь битов адресного байта представляют номер (адрес) ведомого устройства, с которым будет выполняться обмен, (А6, ..., АО), а младший бит W/R определяет направление обмена. При W/R = 0 байты данных будут передаваться из ведущего устройства в ведомое, при W/R = 1 — в противоположном направлении. Ведомое устройство после получения восьмого бита устанавливает в линии SDA низкий уровень сигнала, что является подтверждением приема байта для ведущего устройства, {Acknowledge, АСК).
После адресного байта ведущее устройство передает (при W/R = 0) или принимает (при W/R = 1) байты данных.
При передаче байта данных принимающее устройство после приема восьмого бита устанавливает в линии SDA низкий уровень сигнала (АСК), а передающее устройство при появлении девятого импульса опрашивает состояние линии SDA. Низкий уровень сигнала является подтверждением приема байта данных. При обнаружении высокого уровня подтверждения нет {No Acknowledge, NAC), что свидетельствует об отсутствии обмена или ошибке при передаче байта.
После успешной передачи байта данных возможны три варианта продолжения работы ведущего устройства:
1)	передача следующего байта в том же направлении с участием того же ведомого устройства;
2)	выбор другого ведомого устройства или смена направления обмена или то и другое;
3)	окончание обмена с освобождением линии.
В первом случае ведущее устройство формирует последовательность из девяти импульсов и выполняется пересылка очередного байта данных. Во втором случае ведущее устройство формирует посылку ST и выдает новый адресный байт. В третьем случае ведущее устройство формирует посылку конца обмена {Stop, SP), которая представляется переходом
Работа периферийных устройств
53
гигнала в линии SDA от низкого уровня к высокому при высоком уровне сигнала в линии SCL.
На рис. 3.7 изображены временные диаграммы сигналов в линиях SDA и SCL при начале обмена (а), при завершении передачи адресного байта (б), при начале передачи байта данных (в) и при завершении обмена (г).
_М4 С_
\ АО \ W/R \ АСК
Рис. 3.7
Все ведомые устройства при обнаружении в шине посылки ST принимают адресный байт и сравнивают полученный адрес с собственным адресом, который хранится в одном из регистров порта. При совпадении адресов формируется посылка АСК и устройство переводится в режим ожидания очередной серии из девяти импульсов для приема или передачи байта данных в зависимости от значения бита W/R в принятом адресном байте.
Все перечисленные операции в ведомом устройстве выполняются аппаратно.
Порт TWSI у микроконтроллера типа ml63 содержит 5 регистров ввода-вывода:
	регистр данных TWDR (№ $03);
	регистр адреса TWAR (№ $02);
	регистр состояния TWSR (№ $01);
	регистр задания скорости передачи TWBR (№ $00);
	регистр управления TWCR (№ $36).
Структурная схема порта TWSI изображена на рис. 3.8.
Порт переводится в активное состояние при установке в единичное состояние разряда TWEN регистра TWCR. При этом выводы порта SCL и SDA подключаются к внешним выводам микроконтроллера PC0 и РС1 соответственно.
54
Глава 3
Рис. 3.8
Порт начинает работать в качестве ведущего после установки в единичное состояние разряда TWSTA регистра TWCR.
При работе в качестве ведущего генератор G формирует импульсный сигнал, который через буферную схему I/OCL выдается в линию SCL. Скорость передачи битов определяется числом, код которого записан в регистре TWBR. Положение фронтов импульсов в импульсном сигнале связано с выполнением определенных операций в порте и может изменяться в некоторых пределах. Осредненное значение скорости передачи BR, бит/с, определяется по формуле
ск
RR -
16 + 2(TWBR) + £АЛзк
где FCK — тактовая частота микроконтроллера; (TWBR) — число, код которого записан в регистр TWBR ((TWBR)>7); tA — показатель, учитывающий растяжение некоторых интервалов между фронтами импульсов (tA = 200—600 нс).
Работа периферийных устройств
55
При работе порта в качестве ведомого порядок его работы определяется импульсной последовательностью, которая через вывод SCL и буферную схему I/OCL поступает в схему управления СУ.
Регистр TWDR имеет цепи для сдвига кода влево. В него параллельно записываются байты, предназначенные для последовательного вывода в линию SDA через буферную схему I/ODA, и последовательно вводятся байты, поступающие из линии SDA через буферную схему I/ODA. Импульсы сдвига поступают из схемы управления.
Регистр TWAR используется только при работе порта в качестве ведомого. Код, записанный в старших семи его разрядах, представляет собственный адрес микроконтроллера (А6,..., АО). Этот код сравнивается с помощью схемы сравнения СС с кодом в старших семи битах адресного байта, принятого в регистр TWDR.
Младший разряд TWGCE регистра TWAR разрешает прием байтов данных (при TWGCE = 1) после получения адресного байта с адресом общего вызова для всех ведомых микроконтроллеров ($00).
Регистр TWCR содержит разряды, определяющие работу схемы управления, (TWEA, TWSTA, TWSTO и TWEN), отражающие состояние порта (TWINT и TWWC) и разряд TWIE, разрешающий поступление запроса прерывания из порта в блок прерываний. Запрос прерывания TWSI поступает в блок прерываний при TWINT = 1 и TWIE = 1.
Код, формируемый в регистре TWSR, отражает состояние порта TWSI на различных этапах его работы.
Порт может работать в следующих режимах:
1)	ведущий с передачей байтов данных;
2)	ведущий с приемом байтов данных;
3)	ведомый с приемом байтов данных;
4)	ведомый с передачей байтов данных.
В табл. 3.6. описан порядок управления портом TWSI при работе его в качестве ведущего с передачей байтов (табл. 3.6,а) и с приемом байтов (табл. 3.6,6) при отсутствии ошибок в процессе обмена.
В таблице используются следующие обозначения:
	SLA, W/R — адресный байт, где SLA — адрес ведомого устройства;
	DATA — байт данных;
	(TWSR) — байт в регистре TWSR;
	(TWDR) — байт в регистре TWDR;
	:= — знак операции установки разряда регистра TWCR в указанное состояние.
В исходном состоянии разряд TWEN в регистре TWCR находится в единичном состоянии, остальные разряды — в нулевом состоянии.
В табл. 3.7. описан порядок управления портом TWSI при работе его в качестве ведомого с приемом байтов (в табл. 3.7,я) и с передачей байтов (в табл. 3.7,6) при отсутствии ошибок в процессе обмена.
56
Глава 3
В исходном состоянии разряды TWEN и TWEA регистра TWCK находятся в единичном состоянии, другие разряды — в нулевом состоянии; в регистре TWAR записан байт SLA, 0/1.
Таб ли ца 3.6
№ шага	Операция по команде в программе	Условие перехода к следующему шагу
а) ведущий с передачей байтов данных		
1	TWSTA.-1	TWINT-1, (TWSR)-$08
2	SLA, 0-TWDR	
3	TWINT:=0	TWINT-1, (TWSR)-$18
4	DATA-*TWDR	
5	TWINT.-O	TWINT-1, (TWSR)=$28
	Выполнение шагов 4, 5	
N	TWSTO:=1 - конец передачи, освобождение шины IC	
N	TWSTO:=1,TWSTA:=1	TWINT-1, (TWSR)-$10
N+1	Выполнение шага 2 в табл, а) или б) и далее	
б) ведущий с приемом байтов данных		
1	TWSTA:=1	TWINT-1, (TWSR)=$08
2	SLA, 1-TWDR	
3	TWINT:=0	TWINT-1, (TWSR)-$40
4	(TWDR)-Rd	
5	TWINT:=0	TWINT-1, (TWSR)-$50
...	Выполнение шагов 4, 5	
м	TWSTO:=1 — конец приема, освобождение шины IC	
м	TWSTO:=1,TWSTA:=1	TWINT-1, (TWSR)-$10
М+1	Выполнение шага 2 в табл, а) или б) и далее	
Таб ли ца 3.7
№ шага	Условие выполнения шага	Операция по команде в программе
а) ведомый с приемом байтов данных
1	TWINT-1, (TWSR)=$60/$70	(TWDR)—Rd
2		TWINT:=0
3	TWINT-1, (TWSR)=$80/$90	(TWDR)-Rd
4		TWINT:=0
...	Далее шаги 3, 4	
Работа периферийных устройств
57
Окончание табл. 3.7
№ шага	Условие выполнения шага	Операция по команде в программе
б) ведомый с выдачей байтов данных		
1	TWINT-1, (TWSR)=$A8	DATA-*TWDR
2		TWINT:=0
3	TWINT-1, (TWSR)=$B8	DATA-»TWDR
4		TWINT:=0
Далее шаги 3, 4
Единичное состояние разряда TWINT в процессе обмена может определяться программными средствами с использованием команды условного перехода или аппаратными средствами по запросу прерывания TWSI. Во втором случае при инициализации порта необходимо установить в единичное состояние также разряд TWIE регистра TWCR.
При появлении ошибок в процессе обмена в регистре состояния TWSR появляются коды иные, чем указаны в табл. 3.6 и 3.7.
Разряд TWWC регистра TWCR устанавливается в единичное состояние при попытке записать код в регистр TWDR во время сдвига кода в регистре.
3.5.	Таймеры-счетчики общего назначения
Таймер-счетчик Т/СХ (X = 0, 1, 2 — цифра в имени таймера-счетчика) любого типа содержит базовый счетчик TCNTX, имеющий восемь или шестнадцать разрядов, и восьмиразрядный регистр управления TCCRX. Кроме того, в состав таймера-счетчика входят один или несколько разрядов регистра запросов, прерывания TIFR (№ $38, у МК типа t28 — № $05) и столько же разрядов регистра маскирования прерываний TIMSK (№ $39, у МК типа t28 - № $06). Регистры TIFR и TIMSK являются общими для всех таймеров-счетчиков микроконтроллера.
Разряд регистра TIFR устанавливается в единичное состояние при формировании в таймере-счетчике определенного запроса прерывания. Запрос прерывания проходит в блок прерываний при единичном состоянии соответствующего разряда регистра TIMSK. Разряд регистра TIFR сбрасывается в нулевое состояние аппаратно при переходе микроконтроллера к выполнению соответствующей прерывающей программы или программно при выполнении команды установки бита в единичное состояние (!).
В состав таймера-счетчика, выполняющего функцию сравнения/PWM, входит регистр сравнения OCRX, а в состав таймера-счетчика, выполняющего функцию захвата, — регистр захвата ICRX. Разрядность регистров OCRX и ICRX равна разрядности базового счетчика TCNTX.
58
Глава 3
Для записи кода в шестнадцатиразрядный счетчик или регистр сначала выполняется команда записи (OUT) байта в старшую половину разрядов (Н), при этом поступавший из регистра общего назначения старший байт запоминается в регистре временного хранения. Затем выполняется команда записи (OUT) младшего байта в младшую половину разрядов (L), при этом оба байта одновременно записываются в счетчик или регистр.
Для чтения кода из шестнадцатиразрядного счетчика или регистра сначала выполняется команда чтения (IN) байта из младшей половины разрядов (L), при этом считанный младший байт поступает в регистр общего назначения, а старший байт запоминается в регистре временного хранения. Затем выполняется команда чтения байта из старшей половины разрядов (Н), при этом старший байт из регистра временного хранения поступает в указанный в команде регистр общего назначения.
3.5.1.	Таймер-счетчик типа А
Таймер-счетчик типа А есть у микроконтроллеров всех типов кроме микроконтроллера типа шЮЗ. Он имеет имя Т/СО (X = 0). Таймер-счетчик типа А формирует запрос прерывания Т/СО OVF при переполнении восьмиразрядного базового счетчика TCNT0 (№ $32, у МК типа t28 — № $03). Структурная схема таймера-счетчика типа А изображена на рис. 3.9.
Рис. 3.9
Тактовый сигнал микроконтроллера СК поступает в пересчетную схему (prescaler) ПС, представляющую собой десятиразрядный счетчик, где выполняется деление частоты тактового сигнала на 8, 64, 256 и 1024 Сигналы с четырех выходов пересчетной схемы поступают в схему управления СУ (мультиплексор). При наличии в микроконтроллере таймера-счетчика Т/Cl эти же сигналы поступают в Т/С1.
Работа периферийных устройств
59
В схему управления поступают также тактовый сигнал СК и сигнал из внешнего источника, принимаемый на вход ТО. В качестве входа ТО у микроконтроллеров типа 1200, 2313 и 4433 используется вывод порта PD4, у микроконтроллеров типа 2323, 2343 и серии ATtiny — вывод порта РВ2, а у микроконтроллеров типа 8515, 8535 и ml63 — вывод порта РВО.
Схема управления в зависимости от комбинации состояний разрядов CS00, CS01 и CS02 регистра управления TCCR0 (№$33, у МК тип 128 — № $04) передает один из поступающих сигналов на счетный вход базового счетчика TCNT0, ведущего счет на сложение. Сигналы, используемые для счета в счетчике TCNT0 при разных комбинациях значений в разрядах регистра TCCR0, указаны в табл. 3.8.
Таблица 3.8
CS02	CS01	CS00	сигнал
0	0	0	нет
0	0	1	СК
0	1	0	СК/8
0	1	1	СК/64
1	0	0	СК/256
1	0	1	СК/1024
1	1	0	Отрицательный фронт на ТО
1	1	1	Положительный фронт на ТО
При переполнении счетчика TCNT0 устанавливается в единичное состояние разряд TOVO регистра T1FR и при единичном состоянии разряда TOIEO регистра TIMSK в блок прерываний поступает запрос прерывания Т/СО OVF.
В микроконтроллере типа tl5 в работе таймера-счетчика типа А участвуют разряд PSR0 регистра SFIOR (№ $2С). При установке этого разряда в единичное состояние сбрасывается в исходное (нулевое) состояние пересчетная схема ПС. Разряд PSR0 возвращается в нулевое состояние аппаратно. В микроконтроллере типа ml63 аналогичная операция выполняется при установке в единичное состояние разряда PSR10 регистра SFIOR (№ $30).
3.5.2.	Таймер-счетчик типа В
Таймер-счетчик типа В входит в состав периферийных устройств микроконтроллеров типа tl5 (Т/Cl) и ml03 (Т/С2). Он формирует запрос прерывания Т/СХ OVF при переполнении восьмиразрядного базового счетчика TCNTX и выполняет функцию сравпепия/PWM с фор
60
Глава 3
мированием запроса прерывания Т/СХ СОМР. Структурная схема таймера-счетчика типа В микроконтроллера типа ml03 (X = 2) изображена на рис. 3.10.
Тактовый сигнал микроконтроллера СК поступает в пересчетную схему ПС, где частота сигнала делится на 8, 64, 256 и 1024. Сигналы с четырех выходов пересчетной схемы поступают в схему управления СУ1 и в таймер-счетчик Т/Cl типа Е. В схему управления СУ1 поступают также тактовый сигнал СК и сигнал из внешнего источника, принимаемый на вход Т2 (вывод порта PD7). При выполнении функции сравнения/PWM вывод порта РВ7 используется в качестве выхода OC2/PWM2 для выдачи сигнала, формируемого при совпадении сравниваемых кодов или сигнала PWM2.
Схема управления СУ1 в зависимости от комбинации состояний разрядов CS20, CS21 и CS22 регистра управления TCCR2 передает на счетный вход базового счетчика TCNT2 один из поступающих сигналов в соответствии с табл. 3.8 (при X = 2).
При переполнении базового счетчика устанавливается в единичное состояние разряд TOV2 регистра TIFR и при единичном состоянии разряда TOIE2 регистра TIMSK в блок прерываний поступает запрос прерывания Т/С2 OVF.
Режим работы таймера-счетчика определяется комбинацией состояний разрядов PWM2, СОМ21 и СОМ20 регистра TCCR2. При нулевом состоянии трех названных разрядов формируется только запрос прерывания Т/С2 OVF. При PWM2 = 0 и других комбинациях состояний
Работа периферийных устройств(з f разрядов С0М21 и СОМ20 выполняется функция сравнения. Код, формируемый в базовом счетчике TCNT2, с помощью компаратора К сравнивается с кодом, записанным в регистре OCR2. При совпадении кодов устанавливается определенное значение сигнала на выходе ОС2 (вывод порта РВ7), переводится в единичное состояние разряд OCF2 регистра TIFR и при единичном состоянии разряда OCIE2 регистра TIMSK в блок прерываний поступает запрос прерывания Т/С2 СОМР. Значение сигнала, устанавливаемого на выходе ОС2 при совпадении кодов, определяется комбинацией состояний разрядов СОМ20 и СОМ21 регистра TCCR2 в соответствии с табл. 3.9.
Таб ли ца 3.9
СОМ21	СОМ20	Значение сигнала
0	1	изменяется
1	0	0
1	1	1
Работа базового счетчика при выполнении функции сравнения зависит от состояния разряда СТС2 регистра TCCR2. При СТС2 = 0 базовый счетчик после совпадения кодов продолжает счет до переполнения и далее выполняет счет, начиная с 0. При СТС2 = 1 базовый счетчик при совпадении кодов сбрасывается в нулевое состояние и продолжает счет, начиная с 0. При PWM2 = 1 и СОМ21 = 1 выполняется функция PWM. Базовый счетчик ведет счет на сложение до получения кода максимального числа (255), переводится в режим счета на вычитание и в этом режиме ведет счет до получения кода минимального числа (0) и далее вновь переходит в режим счета на сложении. Акт переполнения (переход от кода числа 255 к коду числа 0) в данном случае отсутствует.
Запрос прерывания Т/С2 OVF формируется при переходе от числа 0 к числу 1.
Состояние разряда СОМ20 определяет вид изменения выходного сигнала при совпадении кодов в счетчике и регистре сравнения. На рис. 3.11 изображены графики изменения числа в счетчике TCNT2 и временные диаграммы сигнала PWM на выходе ОС2 при заданном коде числа в регистре сравнения (OCR2) при разных состояниях разряда СОМ20.
Период сигнала PWM (Т) в 510 раз больше периода сигнала, поступающего на счетный вход базового счетчика.
При записи байта в регистр OCR2 (по команде с мнемокодом операции OUT) байт принимается в регистр временного хранения, из регистра которого переписывается в регистр OCR2 при появлении в базовом счетчике кода числа 255. При этом исключается появление в сигнале PWM импульса со случайной длительностью.
62
Гпава 3
a) СОМ20=0
б) С ОМ 20= /
Рис. 3.11
Таймер-счетчик типа В в микроконтроллере типа 115 имеет имя Т/С1 (X = 1). Исходный сигнал для работы таймера-счетчика (РСК) имеет частоту 25,6 МГц при частоте тактового сигнала микроконтроллера 1,6 МГц (1/16 РСК). В регистре управления имеется дополнительный разряд CS13. Выбор сигнала для передачи на счетный вход базового счетчика определяется комбинацией состояний разрядов CS13, CS12, CS11 и CS10 в соответствии с табл. 3.10. Вход для приема сигнала из внешнего источника отсутствует.
Таб ли ца 3.10
CS13	CS12	CS11	CS10	Сигнал
0	0	0	0	нет
0	0	0	1	РСК (16 СК)
0	0	1	0	РСК/2 (8 СК)
0	0	1	1	РСК/4 (4 СК)
0	1	0	0	РСК/8 (2 СК)
0	1	0	1	РСК/16(СК)
0	1	1	0	СК/2
0	1	1	1	СК/4
1	0	0	0	СК/8
1	0	0	1	СК/16
1	0	1	0	СК/32
1	0	1	1	СК/64
1	1	0	0	СК/128
1	1	0	1	СК/256
1	1	1	0	СК/512
1	1	1	1	СК/1024
Работа периферийных устройств
63
В состав таймера-счетчика входят два регистра сравнения — OCR10 н OCR11. Регистр OCR10 используются при выполнении функции сравнения. Регистр OCR11 используется совместно с регистром OCR10 при выполнении функции PWM. Базовый счетчик работает в режиме счета на сложение и ведет счет от 0 до числа, код которого записан в регистре OCR11. Графики изменения числа в базовом счетчике и временные диаграммы сигнала PWM изображены на рис. 3.12. Сигнал 0C1/PWM выдается на вывод порта РВ1.
РВ1
РВ1
з) сомю=о
б) СОМ1О=1
Рис. 3.12
В микроконтроллере типа tl5 в работе таймера-счетчика Т/Cl участвуют разряды FOC1A и PSR1 регистра SFIOR (№ $2С).
В режиме сравнения при установке в единичное состояние разряда FOCI А на выходе ОС1 устанавливается требуемое значение сигнала немедленно, не дожидаясь совпадения кодов в базовом счетчике и регистре сравнения. При этом запрос прерывания Т/Cl СОМР не формируется п базовый счетчик не сбрасывается в нулевое состояние при СТС1 = 1. Разряд FOCI А сбрасывается в нулевое состояние аппаратно. В режиме PWM он не используется.
При установке в единичное состояние разряда PSR1 сбрасывается в исходное (нулевое) состояние пересчетная схема ПС. Разряд сбрасывается в нулевое состояние аппаратно.
3.5.3.	Таймер-счетчик типа С
Таймер-счетчик типа С входит в состав периферийных устройств микроконтроллеров типа 8535 и ml63 (Т/С2) и типа ш103 (Т/СО). Он формирует запрос прерывания Т/СХ OVF при переполнении восьмиразрядного базового счетчика TCNTX, может выполнять функцию сравнения/PWM и работать в режиме счета реального времени. В структуру таймера-счетчика типа С входят все элементы таймера-счетчика типа В (рис. 3.10) и, кроме того, регистр ASSR (№ $30), мультиплексор
64
Глава 3
М и внутренний генератор G. Дополнительные элементы изображены на схеме рис. 3.13 (для микроконтроллера типа ml03, X = 0).
TOSC2
Рис. 3.13
В качестве исходного сигнала для работы базового счетчика TCNT0 может использоваться тактовый сигнал микроконтроллера СК или сигнал TOSC1 из дополнительного внутреннего генератора G, к которому через выводы TOSC1 и TOSC2 подключен кварцевый резонатор КР2.
При частоте резонатора 32768 Гц ("часовой" кварц) параметры процессов в таймере-счетчике с высокой точностью привязаны к единице измерения реального времени — секунде.
При нулевом состоянии разряда AS0 регистра ASSR используется тактовый сигнал СК, при единичном состоянии — сигнал генератора G (режим реального времени). Выбранный сигнал РСКО с выхода мультиплексора М поступает в пересчетную схему ПС, в которой выполняется деление частоты на 8, 32, 64, 128, 256 и 1024.
Сигналы с шести выходов пересчетной схемы и сигнал с выхода мультиплексора поступают в схему управления СУ1. Выбор сигнала для передачи на счетный вход базового счетчика определяется комбинацией состояний разрядов CS00, CS01 и CS02 регистра управления TCCR0 в соответствии с табл. 3.11.
Таб ли ца 3.1 1
CS02	CS01	CS00	Сигнал
0	0	0	нет
0	0	1	РСКО
0	1	0	РСКО/8
0	1	1	РСКО/32
1	0	0	РСКО/64
1	0	1	РСКО/128
1	1	0	РСКО/256
1	1	1	РСК0/1024
Работа периферийных устройств 65
При работе в режиме реального времени (AS0 =1) процесс счета в базовом счетчике привязан к сигналу TOSC1, а запись в регистры TCCR0 и OCRO и в счетчик TCNT0 — к сигналу СК. Для исключения конфликтных ситуаций в счетчике TCNT0 в режиме реального времени используются регистры временного хранения. При записи кода (по команде OUT) байт принимается в соответствующий регистр временного хранения, при этом устанавливается в единичное состояние соответствующий разряд регистра ASSR — TCN0UB при записи в счетчик TCNTO, OCROUB при записи в регистр OCRO, TCR0UB при записи в регистр TCCR0. Перепись байта из регистра временного хранения в основной регистр или счетчик привязана к сигналу TOSC1, при этом соответствующий разряд регистра ASSR сбрасывается в нулевое состояние. Очередная запись в регистр или счетчик по команде OUT может производиться при нулевом состоянии соответствующего разряда регистра ASSR.
У микроконтроллеров типа 8535 и ml63 для подключения кварцевого резонатора КР2 используются выводы порта РС6 и РС7, а у микроконтроллеров типа ml03 — специальные выводы корпуса.
В таймере-счетчике типа С в микроконтроллере типа ml63 (X = 2) в регистре TCCR2 имеется дополнительный разряд FOC2 и в регистре SFIOR — дополнительный разряд PSD2.
В режиме сравнения при установке в единичное состояние разряда FOC2 сигнал на выходе ОС2 принимает требуемое значение немедленно, не дожидаясь совпадения сравниваемых кодов. При этом запрос прерывания Т/С2 СОМР не формируется и базовый счетчик не сбрасывается. Сброс разряда FOC2 в нулевое состояние выполняется аппаратно. В режиме PWM разряд FOC2 не используется.
При установке в единичное состояние разряда PSR2 сбрасывается в исходное (нулевое) состояние пересчетная схема ПС.
Сброс разряда PSR2 в нулевое состояние выполняется аппаратно.
3.5.4.	Таймер-счетчик типа D
Таймер-счетчик типа D входит в состав периферийных устройств микроконтроллеров типа 2313 и 4433, и имеет имя Т/Cl. Он содержит шестнадцатиразрядный базовый счетчик п выполняет функции захвата и сравпепия/PWM. Структурная схема таймера-счетчика изображена на рис. 3.14.
На счетный вход шестнадцатиразрядного базового счетчика TCNT1H, L с выхода схемы управления СУ1 может поступать тактовый сигнал микроконтроллера СК, или один из четырех сигналов из пересчетной схемы, которая является общей для таймеров-счетчиков Т/СО и Т/С1 (см. рис. 3.9.), или сигнал из внешнего источника, принимаемый на вход Т1. В качестве входа Т1 используется вывод порта PD5. Выбор
66
Глава 3
сигнала определяется комбинацией состояний разрядов CS10, CS11 г CS12 регистра управления TCCR1B в соответствии с табл. 3.8 (X = 1 Т0 = Т1). При переполнении базового счетчика устанавливается в единичное состояние разряд TOV1 регистра TIFR и при единичном состоянии разряд TOIE1 регистра TIMSK в блок прерываний поступает запрос прерывания Т/Cl OVF.
Рис. 3.14
Схема управления СУ2 управляет выполнением функции захвата, которая заключается в передаче кода, сформированного в базовом счетчике, через ключевую схему КС в шестнадцатиразрядный регистр захвата ICR1H, L. При этом устанавливается в единичное состояние разряд ICF1 регистра TIFR и при единичном состоянии разряда TICIE1 регистра TIMSK в блок прерываний поступает запрос прерывания Т/Cl С APT.
Захват выполняется при изменении значения внешнего сигнала, поступающего на вход ICP, или внутреннего сигнала АСО, поступающего из аналогового компаратора. Выбор сигнала определяется состоянием разряда ACIC регистра ACSR, который входит в состав аналогового компаратора. При ACIC = 0 используется внешний сигнал, при ACIC = 1 — внутренний. Вид изменения сигнала, при котором выполняется захват, определяется состоянием разряда ICES1 регистра TCCR1B. При ICES1 = О
Работа периферийных устройств 67
захват выполняется при появлении отрицательного фронта сигнала, а при ICES 1 » 1 — положительного фронта.
В качестве входа ICP у микроконтроллера типа 2313 используется вывод порта PD6, а у микроконтроллера типа 4433 — вывод порта РВО.
Разряд ICNC1 регистра TCCR1B управляет работой схемы подавления помех. При ICNC1 = 0 захват выполняется при каждом появлении фронта заданной полярности.
При ICNC1 = 1 захват происходит, если перед появлением фронта в течение четырех тактов сигнал сохраняет постоянное значение.
Схема управления СУЗ управляет выполнением функции сравне-иия/PWM. Функция сравнения заключается в выдаче определенного значения сигнала на выходе ОС1 при совпадении кодов в базовом счетчике и шестнадцатиразрядном регистре сравнения OCR1H, L, которое выявляется с помощью компаратора К. При этом также устанавливается в единичное состояние разряд OCF1A регистра TIFR и при единичном состоянии разряда OCIE1A регистра TIMS К в блок прерываний поступает запрос прерывания Т/Cl СОМР.
Функция PWM заключается в выдаче на выход ОС1 импульсного сигнала с заданным периодом повторения и заданной длительностью импульса. При этом также периодически формируется запрос прерывания Т/Cl СОМР.
Работа схемы СУЗ определяется комбинацией состояний разрядов PWM10, PWM11, СОМ1АО и СОМ1А1 регистра управления TCCR1A. При нулевом состоянии всех четырех разрядов функция сравнения/PWM не выполняется и выход ОС1 отключен от вывода порта.
При PWM10 = 0, PWM11=O и других комбинациях состояний разрядов СОМ1АО и СОМ1А1 выполняется функция сравнения. Значение сигнала, устанавливаемое на выходе ОС1 при совпадении кодов, указано в табл. 3.12.
Таб ли ца 3.12
СОМ1А1	СОМ1АО	Значение сигнала
0	1	изменяется
1	0	0
1	1		1	
При выполнении функции сравнения режим работы базового счетчика зависит от состояния разряда СТС1 регистра управления TCCR1B. При СТС1 = 1 базовый счетчик при совпадении кодов сбрасывается в нулевое состояние и продолжает счет, начиная с 0. При СТС1 = 0 он продолжает счет до переполнения и далее ведет счет, начиная с 0.
При единичном состоянии хотя бы одного из разрядов PWM10 и PWM11 и единичном состоянии разряда СОМ1А1 выполняется функция PWM. В этом случае базовый счетчик ведет счет на сложение до
68
Глава 3
получения числа 255 или 511 или 1023, переходит в режим счета на вычитание, ведет счет на вычитание до получения числа 0 и вновь возвращается в режим счета на сложение. Выбор максимального числа, (Miiax)- Д° которого ведется счет на сложение, определяется комбинацией состояний разрядов PWM11 и PWM10 регистра управления TCCR1A в соответствии с табл. 3.13.
Таб ли ца 3.13
PWM11	PWM10	Wmax
0	1	255
1	0	511
1	1	1023
Сигнал PWM формируется путем изменения значения сигнала на выходе ОС1 при совпадении кодов в базовом счетчике и регистре OCR1 в процессе счета на сложение и на вычитание. Вид изменения сигнала зависит от состояния разряда СОМ 1 АО. На рис. 3.15 изображены графики изменения числа в базовом счетчике (TCNT1) и временные диаграммы сигнала PWM при разных состояниях разряда СОМ 1 АО.
а) СОМ1А0=0	б) СОМ1АО=1
Рис. 3.15
Период сигнала PWM (Т) зависит от максимального числа, до которого выполняется счет на сложение. При МП1ах = 255 период в 510 раз больше периода следования импульсов на счетном входе базового счетчпка. При МП1ах = 511 и 1023 это отношение равно 1022 и 2046 соответственно.
Разряд СТС1 регистра TCCR1B в режиме PWM не используется. Запрос прерывания Т/Cl OVF формируется при переходе базового счетчика от числа 0 к числу 1. При записи кода в регистр OCR1 код запоминается в регистре временного хранения. Перепись кода в регистр OCR1 выполняется при появлении в базовом счетчике максимального числа, что предотвращает появление в сигнале PWM импульса со случайной длительностью.
В качестве выхода ОС1 у микроконтроллера типа 2313 используется вывод порта РВЗ, а у микроконтроллера типа 4433 — вывод порта РВ1.
Работа периферийных устройств
69
3.5.5.	Таймер-счетчик типа Е
Таймер-счетчик типа Е входит в состав периферийных устройств микроконтроллеров типа 8515, 8535, ml63 и ml03 и имеет имя Т/С1. Он содержит шестнадцатиразрядный базовый счетчик и выполняет функцию сравнения/PWM в двух каналах (А и В) и функцию захвата.
В структуру таймера-счетчика типа Е входят все элементы структуры таймера-счетчика типа D (рис. 3.14). Элементы на схеме рис. 3.14, используемые при выполнении функции сравнения/PWM, образуют канал А. Дополнительные элементы, образующие канал В, изображены на схеме рис. 3.16.
Рис. 3.16
Дополнительными элементами являются компаратор канала В (КВ), регистр сравнения OCR1BH, L, два дополнительных разряда СОМ 1 ВО и СОМ1В1 в регистре TCCR1A, дополнительный разряд OCF1B в регистре T1FR и дополнительный разряд OCIE1В в регистре TIMSK. В канале В формируется запрос прерывания Т/Cl СОМРВ.
Сигнал, изменяемый при выполнении функции сравнения, и сигнал PWM поступают на выход ОС1В.
Выводы микроконтроллера, используемые в качестве входов Т1 и ICP и выходов ОС1А и ОС1В у микроконтроллеров разных типов, указаны в табл. 3.14.
Таб ли ца 3.14
Выводы Т/С1	Тип МК			
	8515	8535	т163	m103
Т1	РВ1	РВ1	РВ1	PD6
ICP	о.в.	PD6	PD6	PD4
ОС1А	PD5	PD5	PD5	РВ5
ОС1В	О.В.	PD4	PD4	РВ6
О.В. - отдельный вывод корпуса.
70
Глава 3
В микроконтроллере типа ml63 в регистре TCCR1A имеются два дополнительных разряда — FOCI А и FOCI В. При установке разряда в единичное состояние при выполнении функции сравнения сигнал на выходе ОС1А/В принимает требуемое значение немедленно, не дожидаясь совпадения сравниваемых кодов. Запрос прерывания при этом не формируется и базовый счетчик в нулевое состояние не сбрасывается. Разряд сбрасывается в нулевое состояние аппаратно. В режиме PWM эти разряды не используются.
В регистре SFIOR имеется дополнительный разряд PSR10. При установке этого разряда в единичное состояние пересчетная схема сбрасывается в исходное (нулевое) состояние. Разряд PSR10 сбрасывается в нулевое состояние аппаратно.
3.6.	Сторожевой таймер
В состав сторожевого таймера входят автономный генератор, пересчетная схема, регистр управления WDTCR (№ $21, у МК типа t28 — №$01) и схема управления. Структурная схема сторожевого таймера изображена на рис. 3.17.
WDR
Рис. 3.17
Генератор GWDT формирует импульсную последовательность. Частота следования импульсов зависит от напряжения питания микроконтроллера (1 МГц при Vcc = 5 В, 350 кГц при Vcc = 3 В). В пересчетной схеме ПС, содержащей многоразрядный счетчик, выполняется деление частоты сигнала генератора. На восьми выходах пересчетной схемы фор
Работа периферийных устройств
71
мируются сигналы, частота которых в N раз меньше частоты входного сигнала. Выбор выхода пересчетной схемы с требуемым коэффициентом деления У определяется комбинацией состояний разрядов WDPO, WDP1 и WDP2 регистра WDTCR в соответствии с табл. 3.15.
Таб ли ца 3.15
WDP2	WDP1	WDP0	N	TOUT, Vcc-5 В	TOUT, Vcc-ЗВ
0	0	0	16К	15 мс	47 мс
0	0	1	32 К	30 мс	94 мс
0	1	0	64 К	60 мс	190 мс
0	1	1	128 К	120 мс	380 мс
1	0	0	256 К	240 мс	750 мс
1	0	1	512 К	490 мс	1,5с
1	1	0	1024 К	970 мс	3,0 с
1	1	1	2048 К	1,9с	6,0 с
При единичном состоянии разряда WDE регистра WDTCR на выходе схемы управления СУ с частотой выбранного сигнала формируется запрос прерывания WDT Reset, при появлении которого происходит перезапуск микроконтроллера WDT Reset (п.4.2).
По команде с мнемокодом WDR (№ 117) выполняется сброс пересчетной схемы в исходное (нулевое) состояние.
Для запуска сторожевого таймера необходимо в ходе программы выполнить команду WDR и затем установить в единичное состояние разряд WDE регистра WDTCR.
Для остановки сторожевого таймера необходимо установить в единичное состояние разряд WDTOE регистра WDTCR и одновременно повторно установить в единичное состояние разряд WDE, затем не позднее, чем через четыре такта после этого сбросить в нулевое состояние разряд WDE. Разряд WDTOE сбрасывает в нулевое состояние аппаратно через четыре такта после установки его в единичное состояние. У микроконтроллера типа 1200 разряд WDTOE отсутствует.
Перезапуск сторожевого таймера происходит при выполнении команды WDR в ходе программы при единичном состоянии разряда WDE.
Программа, в которой предусмотрено использование сторожевого таймера, должна периодически с интервалом меньшим, чем период формирования запроса прерывания WDT Reset, с использованием команды WDR перезапускать сторожевой таймер. Если при появлении сбоя команда WDR своевременно не выполняется, происходит перезапуск микроконтроллера. Интервал времени TOUT, через который следует выполнять команду WDR в ходе программы, при разных значениях коэффициента деления N и напряжения питания указан в табл. 3.15.
72
Глава 3
3.7.	Аналого-цифровой преобразователь
Аналого-цифровой преобразователь входит в состав периферийных устройств микроконтроллеров типа tl5, 4433, 8535, гл 163 и ml03. Аналого-цифровой преобразователь содержит базовый преобразователь, выполняющий преобразование аналогового сигнала в десятиразрядный двоичный код методом последовательных приближений, аналоговый мультиплексор для подключения одного из входов микроконтроллера к входу базового преобразователя, регистр управления ADMUX (№ $07), регистр управления-состояния ADCSR (№ $06) и шестнадцатиразрядный регистр результата ADCH, L (№№ $05, $04).
На рис. 3.18 изображена структурная схема аналого-цифрового преобразователя микроконтроллера типа 8535.
ADMUX	AVCC AGND AREF
Рис. 3.18
Для подачи напряжения питания и опорного напряжения используются отдельные выводы микроконтроллера AVCC, AGND и AREF.
Вывод AGND соединяется с выводом GND микроконтроллера. Напряжение на выводе AVCC не должно отличаться от напряжения на выводе VCC микроконтроллера более, чем на ± 0,3 В. Напряжение на выводе AREF должно находиться в пределах от уровня на выводе AGND до уровня на выводе AVCC.
Аналоговые сигналы принимаются на выводы микроконтроллера ADC0, ADC1...ADC7. Величина напряжения аналогового сигнала может
Работа периферийных устройств
73
находиться в пределах от уровня на шине AGND до уровня на шине AVCC. Аналоговый мультиплексор AM подключает один из входов микроконтроллера к входу базового преобразователя CONV. Двоичный код номера подключаемого входа задается комбинацией состояний разрядов MUX2, MUX1, MUX0 регистра ADMUX.
Преобразование аналогового сигнала в цифровой код в преобразователе CONV выполняется под управлением тактового сигнала, частота которого должна находиться в пределах от 50 кГц до 200 кГц.
Тактовый сигнал формируется в пересчетной схеме ПС путем деления частоты тактового сигнала микроконтроллера СК. Пересчетная схема работает при единичном состоянии разряда ADEN регистра ADCSR. Коэффициент деления частоты (К) определяется комбинацией состояний разрядов ADPS2, ADPS1, ADPS0 регистра ADCSR в соответствии с табл. 3.16.
Таб ли ца 3.16
ADPS2	ADPS1	ADPS0	к
0	0	0	2
0	0	1	2
0	1	0	4
0	1	1	8
1	0	0	16
1	0	1	32
1	1	0	64
1	1	1	128
Преобразование начинается при установке в единичное состояние разряда ADSC регистра ADCSR. Разряд ADSC сохраняет единичное состояние до завершения преобразования и затем аппаратно переводится в нулевое состояние. Сформированный десятиразрядный код переписывается в регистр результата ADCH, L, при этом устанавливается в единичное состояние разряд ADIF регистра ADCSR и при единичном состоянии разряда ADIE регистра ADCSR в блок прерываний поступает запрос прерывания ADC СС (ADC Conversion Complete).
Разряд ADIF регистра ADCSR сбрасывается в нулевое состояние аппаратно при переходе микроконтроллера к выполнению прерывающей программы или при выполнении команды установки бита в единичное состояние.
Чтение результата из шестнадцатиразрядного регистра ADCH, L должно начинаться с чтения младшего байта. При этом блокируется занесение нового результата из базового преобразователя в регистр результата и считанный затем старший байт принадлежит тому же результату, что и считанный ранее младший байт.
74
Гпава 3
Преобразователь может работать в одиночном режиме и в циклическом режиме. Выбор режима определяется состоянием разряда ADFR регистра ADCSR. При ADFR « 0 преобразователь работает в одиночном режиме.
Преобразование начинается при установке в единичное состояние разряда ADSC и выполняется за 14 тактов. Для выполнения следующего преобразования необходимо вновь установить в единичное состояние разряд ADSC.
При ADFR = 1 преобразователь работает в циклическом режиме. Работа начинается при установке в единичное состояние разряда ADSC. Преобразование выполняется за 13 тактов, после чего сразу начинается следующее преобразование. Работа в циклическом режиме прекращается после сброса в нулевое состояние результата ADFR.
В обоих режимах на выполнение первого преобразования после пуска пересчетной схемы затрачивается на 12 тактов больше, чем на выполнение последующих преобразований. Эти такты обеспечивают инициализацию преобразователя.
Для уменьшения помех, вызываемых работой процессора, предусмотрена возможность выполнения преобразования с переводом контроллера в режим холостого хода. Преобразователь должен находиться в одиночном режиме (ADFR = 0), пересчетная схема работает (ADEN = 1), прерывания разрешено (ADIE =1), запуск преобразования отсутствует (ADSC = 0). Контроллер переводится в режим холостого хода (п.4.3), при этом аппаратно запускается преобразователь. При завершении преобразования поступает запрос прерывания ADC СС, контроллер выходит из режима холостого хода, выполняет прерывающую программу и возвращается к выполнению программы с точки перехода в режим холостого хода.
Аналого-цифровые преобразователи микроконтроллеров других типов имеют некоторые отличия от рассмотренного преобразователя.
В микроконтроллере типа 4433 имеется возможность подключения к входу базового преобразователя внутреннего источника эталонного напряжения 1,22 ±0,05 В. Подключение выполняется при установке в единичное состояние дополнительного разряда ADCBG в регистре ADMUX.
В микроконтроллере типа 115 в качестве опорного напряжения кроме напряжения от внешнего источника, подаваемого на вывод AREF, может использоваться напряжение на выводе VCC или напряжение от внутреннего источника. Выбор источника осуществляется путем установки определенной комбинации состояний дополнительных разрядов REFS1, REFS0 регистра ADMUX. В качестве входного сигнала может использоваться разность напряжений на входах ADC2 и ADC3. В этом случае напряжение на этих входах должно изменяться в пределах от 0 до 2,56 В, а разностный сигнал перед преобразованием может усиливаться в 20 раз. Разностный сигнал без усиления используется при комбинации
Работа периферийных устройств
75
состояний ПО в разрядах MUX2, MUX1, MUX0, а разностный сипнал . усилением — при комбинации 111.
В регистре ADMUX, кроме того, имеется дополнительный разряд ADLAR. При ADLAR  0 код результата размещается в младших десяти ?азрядах пары регистров ADC Н, L, а при ADLAR = 1 — в старших десяти разрядах этой пары регистров.
В микроконтроллере типа ml03 аналого-цифровой преобразователь -:е работает в циклическом режиме и в регистре ADCSR отсутствует зазряд ADFR. Комбинация ООО разрядов ADPS2, ADPS1, ADPS0 регистра ADCSR не используется.
В микроконтроллере типа ml63 в качестве опорного напряжения южет использоваться напряжение 2,56 В от внутреннего источника или напряжения на выводе VCC. Выбор опорного напряжения определяется - омбинацией состояний дополнительных разрядов REFS1 и REFS0 регистра ADMUX. Кроме того, в регистре ADMUX имеется дополнительный разряд ADLAR. При ADLAR = 1 десятиразрядиый код эезультата помещается в старшие десять разрядов регистра ADCH, L. При чтении старшего байта получают восьмиразрядный код результата.
Микроконтроллеры типа П5 и ml63 могут переводиться в энергосберегающий режим работы с подавлением помех в работе аналогового преобразователя (п.4.3).
В табл. 3.17 указаны выводы микроконтроллера, используемые в качестве входов аналого-цифрового преобразователя у микроконтроллеров разных типов. У микроконтроллера типа 115 для подачи опорного напряжения используется вывод РВО.
Таб ли ца 3.17
Тип МК	Входы ADC							
	ADCO	ADC1	ADC2	ADC3	ADC4	ADC5	ADC6	ADC7
t15	PB5	PB2	РВЗ	PB4				
4433	PCO	PC1	PC2	РСЗ	РС4	РС5		
8535	РАО	PA1	PA2	РАЗ	РА4	РА5	РА6	РА7
m163	РАО	PA1	PA2	РАЗ	РА4	РА5	РА6	РА7
m103	PFO	PF1	PF2	PF3	PF4	PF5	PF6	PF7
3.8.	Аналоговый компаратор
Аналоговый компаратор входит в состав периферийных устройств микроконтроллеров всех типов, кроме 2323 и 2343. Аналоговый компаратор имеет два входа — AIN0 и AIN1, на которые поступают аналоговые сигналы, сравниваемые по величине напряжения. В состав аналогового компаратора кроме базового компаратора входит регистр
76
Глава 3
управления-состояния ACSR (№ $08) и элементы, управляющие работой схемы. Результатом работы компаратора является запрос прерывания ANA COMP, который формируется, когда разность значений напряжения на входах компаратора меняет знак. Структурная схема аналогового компаратора изображена на рис. 3.19.
vcc	ACSR
Рис. 3.19
Базовый компаратор К имеет два входа — положительный (+) и отрицательный (-). Выходной сигнал базового компаратора АСО имеет единичное значение, если напряжение на входе больше напряжения на входе
Схема управления СУ при определенном изменении сигнала АСО устанавливает в единичное состояние разряд ACI регистра ACSR и при единичном состоянии разряда ACIE регистра ACSR в блок прерываний поступает запрос прерывания ANA COMP. Разряд ACI сбрасывается в нулевое состояние аппаратно при переходе к выполнению прерывающей программы или программно путем записи единицы в разряд ACI.
Выбор вида изменения сигнала АСО на входе схемы управления СУ, при котором формируется запрос прерывания, определяется комбинацией состояний разрядов ACIS0 и ACIS1 регистра ACSR в соответствии с табл. 3.18.
Таблица 3.18
ACIS1	ACIS0	Изменение сигнала АСО
0	0	любое
0	1	—
1	0	1-»0
1	1	0^1
Работа периферийных устройств
77
В микроконтроллерах, имеющих таймер-счетчик, который выполняет функцию захвата, (Т/С типа D или Е) сигнал АСО с выхода базового компаратора при единичном состоянии разряда ACIC принимается в таймер-счетчик в качестве сигнала, управляющего захватом.
При установке в единичное состояние разряда ACD регистра ACSR отключается питание базового компаратора и уменьшается ток потребления микроконтроллера.
В микроконтроллерах типа 112,115, 4433 и in 163 имеется возможность подключать к входу базового компаратора вместо входа AINO выход внутреннего источника эталонного напряжения VR (1,22 ±0,05 В). Подключение источника VR выполняется при единичном состоянии разряда AINBG регистра ACSR. В микроконтроллерах других типов элементы схемы VR и М и разряд AINBG в регистре ACSR отсутствуют.
В микроконтроллере типа ml63, кроме того, имеется возможность подключать к входу базового компаратора входы аналого-цифрового преобразователя ADC0...ADC7. Подключение выполняется при нулевом состоянии разряда ADEN регистра ADCSR (№ $06) и единичном состоянии разряда АСМЕ регистра SFIOR (№ $30). Выбор подключаемого входа определяется комбинацией состояний разрядов MUX2, MUX1 и MUX0 регистра ADMUX (№ $07).
В табл. 3.19 указаны выводы микроконтроллера, используемые в качестве входов AIN0 и AIN1, у микроконтроллеров разных типов.
Таб ли ца 3.19
Вход	t11 tl 2	t15 t28	1200 2313	4433	8515 8535	m163	m103*
AINO	РВО	РВО	РВО	PD6	РВ2	РВ2	РЕ2
AIN1	РВ1	PB1	РВ1	PD7	РВЗ	РВЗ	РЕЗ
* — АС+, АС-
S. 9. Программируемый аппаратный модулятор
Программируемый аппаратный модулятор входит в состав периферийных устройств микроконтроллера типа t28.
Программируемый аппаратный модулятор включен между выходом разряда PORTA.2 регистра PORTA (№ $1В) и внешним выводом РА2 порта РА. Вывод РА2 работает только в режиме выхода. Состояние разряда РА2НС регистра управления PACR (№ $1А) определяет в данном случае не направление передачи бита, а нагрузочную способность выхода. При РА2НС = 0 ток /0L может иметь величину до 15 мА (при Есс=1,8 В), при РА2НС = 1 он может быть увеличен до 25 мА (при Vcc = 1,8 В).
78
Глава 3
В состав модулятора входит регистр управления MODCR (№ $02), с помощью которого задаются длительность импульса и скважность импульсного сигнала на выходе РА2. Работа модулятора связана с работой таймера-счетчика Т/СО типа А, который у микроконтроллера типа t28 имеет некоторые особенности.
На рис. 3.20 изображены структурные схемы таймера-счетчика Т/СО и модулятора и показаны элементы порта РА, участвующие в работе модулятора.
Управляющая импульсная последовательность с заданными параметрами формируется в пересчетной схеме модулятора (ПСМ), на один из входов которой поступает тактовый сигнал микроконтроллера (СК).
Длительность интервала, в течение которого сигнал на выходе РА2 имеет низкий уровень, определяется по формуле:
т _ (ONTIM)+1 ON	г*	>
^СК
где (ONTIM) — число, код которого записан в разрядах ONTIM4 — ONTIMO регистра MODCR; FCK — тактовая частота микроконтроллера.
Работа периферийных устройств
79
Скважность сигнала DC, определяемая по формуле
DC = ^ - 100 %,
где Т — период следования импульсов, задается кодом, записанным в разрядах MCONF2—MCONFO регистра MODCR в соответствии с табл. 3.20. В таблице указаны также состояние разряда PORTA2 регистра PORTA, период следования импульсов Т и состояние выхода РА2 (L — низкий уровень, Н — высокий уровень, ИМП — импульсная последовательность.)
Таб ли ца 3.20
MCONF2 — 0	PORTA2	DC	т	PA2
ООО	0	100%	——	L
001	0	50%	2Fon	ИМП.
010	0	33 %	3Fon	ИМП.
011	0	25 %	4Ton	ИМП.
100	0	67%	37oN	ИМП.
101	0	75%	4Fon	ИМП.
110	0	—	——	?
111	0	50 %*		ИМП.
XXX	1	0%	——	H
* — W СК
Выходной сигнал с заданной с использованием разряда РА2НС регистра PACR допустимой величиной тока нагрузки формируется на выходе управляющей схемы модулятора (УСМ).
В таймере-счетчике Т/СО пересчетная схема ПС делит частоту тактового сигнала на 64, 256 и 1024. Сигнал с трех выходов пересчетной системы поступает в схему управления СУ1, в которую также поступают сигнал с вывода ТО, тактовый сигнал микроконтроллера и сигнал с дополнительного выхода пересчетной схемы модулятора.
Схема управления СУ1 в зависимости от комбинации состояний разрядов CS00—CS02 регистра TCCR0 (№ $ 04) передает один из сигналов на счетный вход базового счетчика TCNT0 (№ $03) в соответствии с табл. 3.21.
При переполнении базового счетчика устанавливается в единичное состояние разряд TOVO регистра IFR (№ $05) и при единичном состоянии разряда TOIE0 регистра ICR (№ $06) в блок прерываний поступает запрос прерывания Т/СО OVF.
80
Глава 3
Кроме того, сигнал переполнения поступает в схему управления СУ2, которая в зависимости от комбинации состояний разрядов ООМОО и ООМ01 регистра TCCR0 изменяет состояние разряда PORT2 регистра PORTA в соответствии с табл. 3.22.
Таб лица 3.2 1
CS02	CS01	CS00	Сигнал
0	0	0	нет
0	0	1	СК
0	1	0	ПСМ
0	1	1	СК/64
1	0	0	СК/256
1	0	1	СК/1024
1	1	0	отрицательный фронт на ТО
1	1	1	положительный фронт на ТО
Таб ли ца 3.22
OOMQ1	ООМОО	(P0RTA2)
0	0	не изменяется
0	1	изменяется
1	0	0
1	1	1
При установке в единичное состояние разряда FOVO регистра TCCR0 сбрасывается в пулевое состояние базовый счетчик TCNT0 и поступает сигнал переполнения в схему СУ2. Запрос прерывания Т/СО OVF при этом не формируется. Разряд FOVO сбрасывается в нулевое состояние аппаратно.
3.10. Блок прерываний
Блок прерываний принимает запросы прерывания и организует переход к выполнению определенной прерывающей программы. Запросы прерывания поступают из внешних источников и из источников, расположенных в различных устройствах микроконтроллера.
В качестве входов для приема запросов из внешних источников используются выводы параллельных портов ввода-вывода, для которых эта функция является альтернативной. При выполнении альтернативной функции вывод порта имеет альтернативное имя INTx (х = 0, 1, ..., 7).
Работа периферийных устройств
81
Запрос прерывания из внешнего источника может быть представлен низким уровнем сигнала (L), переходом от высокого уровня к низкому (HL), переходом от низкого уровня к высокому (LH) или переходом любого направления (LH/HL). Выбор способа представления определяется комбинацией состояний разрядов ISCxO и ISCxl в регистре MCUCR (№ $D5), в микроконтроллере типа тЮЗ — в регистре EICR (№ $ЗА).
В табл. 3.23 указаны способы представления запроса прерывания при разных комбинациях состояний названных разрядов.
Таб ли ца 3.2 3
ISCX1	ISCX0	Способ
0	0	L
0	1	LH/HL
1	0	HL
1	1	LH
В микроконтроллерах серии ATtiny в качестве запроса прерывания могут использоваться любые изменения значения сигнала (для микроконтроллеров тина til, t!2, t!5) или низкий уровень сигнала (для микроконтроллера типа t28) на любом выводе порта РВ. Запрос прерывания, формируемый при этом, имеет имя I/O PINS, а в микроконтроллере типа t28 — LLI PINS.
В табл. 3.24 указаны выводы параллельных портов, выполняющие альтернативную функцию приема запроса прерывания из внешнего источника, и отмечены особенности представления запроса прерывания у микроконтроллеров разных типов.
Любой запрос прерывания поступает в блок прерываний, если прерывания в микроконтроллере разрешены (I ~ SREG.7 = 1) и разрешено прерывание по данному запросу. Прерывание по отдельному запросу разрешено, если в единичном состоянии находится маскирующий разряд (MASK) для данного запроса прерывания, расположенный в одном из регистров ввода-вывода.
При появлении запроса прерывания устанавливается в единичное состояние флажковый разряд (FLAG) для данного запроса прерывания, расположенный в одном из регистров ввода-вывода. Состояние флажкового разряда опрашивается аппаратно и, кроме того, может быть опрошено программными средствами.
В табл. 3.25 указаны устройства, в которых расположены источники запросов прерывания, приведены в виде дроби имена маскирующих и флажковых разрядов (в числителе) и регистров ввода-вывода, в которых они расположены, (в знаменателе) у микроконтроллеров разных типов.
82
Глава 3
Таблица 3.24
Тип МК	INTO	INT1	I/O PINS
t15 2323, 2343 1200 2313 t28 4433 8515 8535 m163	PB1 PB2 PB1 (1) PD2(1) PD2 (1) PB3 PD2 PD2 (1) PD2(1) PD2	PD3(1) PB4 PD3 PD3 (1) PD3 (1) PD3	PBO—PB5 (2) PBO—PB5 (2) PBO—PB7 (3)
m103	INTO—INT3		INT4—INT7
	PDO—PD3 (3)		PE4 - PE7 (1)
(1) — кроме LH/HL; (2) - только LH/HL; (3) - только L
Таблица 3.25
Устройство	Запрос прерывания	MASK	FLAG
CPU, WDT	RESET		
Внешние	INTO INT1	INTO/GIMSK INT1/GIMSK	INTFO/GIFR INTF1/GIFR
	INTO—INT3 INT4—INT7	INTO—INT3/EIMSK INT4—INT7/EIMSK	INTF4 - INTF7/ EIFR
	I/O PINS LLI PINS	PCIE/GIMSK LLIE/ICR	PCIF/GIFR
T/C2	T/C2 COMP T/C2 OVF	OCIE2/TIMSK TOIE2/TIMSK	OCF2/TIFR TOV2/TIFR
T/C1	T/C1 CAPT T/C1 COMPA T/C1 COMPB T/C1 OVF	TICIE1/TIMSK OCIE1A/TIMSK * OCIE1B/TIMSK TOIE1/TIMSK	ICF1/TIFR OCF1A/TIFR* OCF1B/TIFR TOV1/TIFR
T/CO	T/CO COMP T/CO OVF	OCIEO/TIMSK TOIEO/TIMSK	OCFO/TIFR TOVO/TIFR
SPI	SPI STC	SPIE/SPCR	SPIF/SPSR
UART	UART RXC UART UDRE UART TXC	RXCIE/UCR “ UDRIE/UCR TXCIE/UCR	RXC/USR “ UDRE/USR TXC/USR
ADC	ADC CC	ADIE/ADCSR	ADIF/ADCSR
EEPROM	EERDY	EERIE/EECR	
AC	ANA COMP	ACIE/ACSR	ACI/ACSR
TWSI	TWSI	TWIE/TWCR	TWINT/TWCR
* — у МК типа 44	133 OCIE1 и OCF1		
** — у МК типа 163 UCR = UCSRB, USR = UCSRA
Работа периферийных устройств 83
При поступлении запроса блок прерываний организует аппаратный безусловный переход к выполнению команды, адрес которой (вектор прерывания) однозначно связан с именем запроса прерывания. По этому адресу в микроконтроллерах серий ATtiny и АТ90 должна быть записана команда безусловного перехода с мнемокодом RJMP к (№ 85), машинный код который имеет формат "слово", а в микроконтроллерах серии ATmega может быть записана команда безусловного перехода с мнемокодом JMP к, машинный код которой имеет формат "два слова". По этой команде выполняется программный безусловный переход к первой команде соответствующей прерывающей программы, которая может быть расположена в любом месте в FlashROM.
При одновременном поступлении в блок прерываний нескольких запросов в блоке выделяется запрос с наиболее высоким приоритетом среди всех поступивших и выполняется переход по адресу, соответствующему этому запросу.
В табл. 3.26 и 3.27 указаны в шестнадцатеричном коде адреса (векторы прерывания), по которым совершается аппаратный переход у микроконтроллеров разных типов. Высший приоритет имеет запрос прерывания RESET. Приоритет других запросов убывает в порядке увеличения адреса, по которому совершается переход. У микроконтроллеров разных типов запросам прерывания с одинаковым именем соответствуют разные векторы перехода.
Таб ли ца 3.2 6
Запрос прерывания	Тип MK					
	t11	t12	t15	2323	2343	1200
RESET	000	000	000	000	000	000
INTO	001	001	001	001	001	001
I/O PINS	002	002	002			
T/C1 COMP			003			
T/C1 OVF			004			
T/CO OVF	003	003	005	002	002	002
EE RDY		004	006			
ANA COMP	004	005	007			003
ADC CC			008			
При переходе к выполнению прерывающей программы разряд I в регистре SREG аппаратно сбрасывается в нулевое состояние и прерывания по всем запросам оказываются запрещенными. Разряд I устанавливается в единичное состояние при выполнении команды возврата из прерывающей программы с мнемокодом RETI (№ 90). Разряд I
84
Глава 3
может быть установлен в единичное состояние программно ио команде SEI в прерывающей программе. Программа, которая выполняется при пуске микроконтроллера и по запросу RESET, не содержит команды RETI и для выполнения прерываний должна содержать команду SEL
Прерывание по запросу RESET выполняется вне зависимости от состояния разряда I в регистре SREG. Опрос состояния входов блока прерываний выполняется в каждом такте. При обнаружении запроса код из счетчика команд заносится в стек, на что затрачивается 2 такта, и выполняется безусловный переход по команде с мнемокодом RJMP к (2 такта) или JMP к (3 такта). Если при обнаружении запроса прерывания процессор не закончил выполнение текущей многотактовой команды, до перехода к прерывающей программе завершается выполнение этой команды.
Таб ли ца 3.27
Запрос прерывания	Тип MK						
	2313	t28	4433	8515	8535	m163	m103
RESET	000	000	000	000	000	000	000
INTO	001	001	001	001	001	002	002
INT1	002	002	002	002	002	004	004
INT2							006
INT7							010
LLI PINS		003					
T/C2 COMP					003	006	012
T/C2 OVF					004	008	014
T/C1 CAPT	003		003	003	005	00A	016
T/C1 COMPA	004		004	004	006	OOC	018
T/C1 COMPB				005	007	00E	01A
T/C1 OVF	005		005	006	008	010	01C
T/CO COMP							01E
T/CO OVF	006	004	006	007	009	012	020
SPI STC			007	008	00A	014	022
UART RXC	007		008	009	00B	016	024
UART UDRE	008		009	00A	OOC	018	026
UART TXC	009		00A	00B	00D	01A	028
ADC CC			00B		00E	01C	02A
EE RDY			OOC		OOF	01E	02C
ANA COMP	00A	005	00D	OOC	010	020	02E
TWSI						022	
Глава 4
Работа микроконтроллера
4.1.	Программирование микроконтроллера
Программирование микроконтроллера заключается в записи:
	кодов команд программы и констант в FlashROM;
	кодов исходных данных в EEPROM;
	требуемых значений установочных битов {Fuse Bits)-,
	требуемых значений битов защиты {Lock Bits).
В микроконтроллерах, поступающих в продажу, во всех ячейках FlashROM записан код SFFFF, во всех ячейках EEPROM — код $FF, биты защиты имеют единичное значение, а установочные биты могут иметь разные значения. Исходные значения установочных битов у микроконтроллеров разных типов указаны в приложении П6. Кроме того, в трех специальных ячейках памяти записаны сигнатурные байты, определяющие тип микроконтроллера.
Коды, записанные в FlashROM и EEPROM, сигнатурные байты и значения установочных битов и битов защиты могут быть прочитаны для контроля правильности записи и определения типа и состояния микроконтроллера.
В микроконтроллерах семействах AVR имеются два бита защиты — LB1 и LB2. При единичном значении обоих битов возможны и запись, и чтение кодов. После программирования бита LB1 (LB1 = 0) дальней
86
Глава 4
шая запись кодов в FlashROM и EEPROM и изменение значения установочных битов невозможны. После программирования бита LB2 (LB1=O, LB2 = 0) невозможно также чтение кодов, записанных в FlashROM и EEPROM, и значений установочных битов.
При перепрограммировании микроконтроллера (программировании микроконтроллера, ранее прошедшего программирование) необходимо предварительно "стереть" прежнюю запись.
При стирании во всех ячейках FlashROM и EEPROM восстанавливаются коды $FFFF и $FF соответственно, биты защиты принимают единичное значение, а установочные биты и сигнатурные байты остаются без изменения. Допускается выполнить до 1000 циклов "стирание-запись” для ячеек FlashROM и до 100000 циклов для ячеек EEPROM.
Запись и чтение кодов при программировании выполняются побайтно. Ввод и вывод битов в байте могут выполняться параллельно или последовательно.
В микроконтроллерах семейства AVR реализуются следующие способы программирования:
1.	Параллельное программирование с использованием дополнительного источника напряжения +12 В {High-Voltage Parallel Programming, HVPP);
2.	Последовательное программирование с использованием дополнительного источника напряжения +12 В {High-Voltage Serial Programming, HVSP);
3.	Последовательное программирование без использования дополнительного источника напряжения {Low-Voltage Serial Programming, LVSP).
4.	Самопрограммирование {Self-Programming, SLFP).
Возможность использования названных способов программирования в микроконтроллерах разных типов отмечена знаком "+" в табл. 4.1.
Программирование с использованием дополнительного источника напряжения (HVPP и HVSP) выполняется с помощью программатора до установки микроконтроллера в аппаратуре, где ему предстоит работать. Последовательное программирование без использования дополнительного источника напряжения (LVSP) может выполняться после установки микроконтроллера в аппаратуре {In-System Programming). Программирование по способу LVSP возможно при нулевом значении установочного бита SPIEN.
При программировании по способу LVSP микроконтроллер находится в рабочем состоянии, значения напряжения питания и тактовой частоты лежат в пределах, установленных для микроконтроллера данного типа (приложение П1). Вывод RESET соединен с шиной GND. Ввод и вывод байтов при программировании выполняются с использованием трех выводов — MOSI, MISO и SCK. Схема подключения микроконтроллера для программирования изображена на рис. 4.1.
Работа микроконтроллера
87
Таблица 4. 1
Тип МК	Способ программирования				Выводы порта SPI		
	HVPP	HVSP	LVSP*	SLFP	MOSI	MISO	SCK
t11		+					
t12		+	+		PBO	PB1	PB2
t15		+	+		PBO	PB1	PB2
2323		+	+		PBO	PB1	PB2
2343		+	+		PBO	PB1	PB2
1200	+		+		PB5	PB6	PB7
2313	+		+		PB5	PB6	PB7
t28	+						
4433	+		+		PB3	PB4	PB5
8515	+		+		PB5	PB6	PB7
8535	+		+		PB5	PB6	PB7
m163	+		+	+	PB5	PB6	PB7
m103	+		+		PB2**	PB3**	PB1
* — выполняется при SPIEN = 0;
‘ — при программировании RXD и TXD.
В микроконтроллерах, имеющих последовательный порт ввода-вывода SPI (табл. 1.1), используются выводы этого порта. В микроконтроллерах без порта SPI находится вспомогательный порт SPI, работающий только при программировании в режиме ведомого устройства. Функции выводов MOSI, MISO и SCK выполняют выводы параллельных портов ввода-вывода.
Выводы микроконтроллера, используемые в качестве входов MOSI и SCK и выхода MISO у микроконтроллеров разных типов указаны в табл. 4.1. В микроконтроллере типа ml03 вместо выводов MOSI п MISO используются выводы RXD и TXD соответственно.
88
Глава 4
У микроконтроллеров типа т163 и тЮЗ запись байтов в FlashROM выполняется за два этапа. На первом этапе байты записываются в буферное запоминающее устройство. На втором этапе выполняется перепись всех кодов из буферного запоминающего устройства в страницу FlashROM. Страница у микроконтроллеров типа ml63 и ml03 имеет емкость 128 и 256 байтов соответственно.
При программировании по способу LVSP в микроконтроллере могут выполняться следующие операции:
1)	разрешение LVSP {Programming Enable);
2)	стирание записи {Chip Erase);
3)	запись байта в FlashROM {Write Program Memory);
4)	запись байта в буферные ЗУ {Load Flash Page);
5)	перепись из буферного ЗУ в FlashROM {Write Flash Page);
6)	чтение байта из FlashROM {Read Program Memory);
1) запись байта в EEPROM {Write EEPROM);
8)	чтение байта из EEPROM {Read EEPROM);
9)	запись битов защиты {Write Lock Bits);
10)	чтение битов защиты {Read Lock Bits);
11)	запись установочных битов {Write Fuse Bits);
12)	чтение установочных битов {Read Fuse Bits);
13)	чтение сигнатурного байта {Read Signature Byte);
14)	чтение калибровочного байта {Read Calibration Byte).
Операции №№ 10 и 12 у микроконтроллеров некоторых типов объединены в одну операцию. При выполнении операции "Запись байта в EEPROM" автоматически перед записью выполняется стирание соответствующей ячейки EEPROM.
Операции №№ 1, 2, 6, 7, 8, 9, 13 выполняются в микроконтроллерах всех типов. Возможность выполнения других операций у микроконтроллеров разных типов отмечена знаком "+" в табл. 4.2.
Таб лица 4.2
ТипМК
	t12	t15	2323	2343	1200	2313	4433	8515	8535	m163	m103
Write Program Memory	+	+	+	+	+	+	+	+	+		
Load Flash Page										+	+
Write Flash Page										+	+
Read Lock Bits	+	+	+	+			+		+	+	+
Write Fuse Bits	+	+	+*	+*			+*		+*	+*	+*
Read Fuse Bits	+	+	+	+			+		+	+	+
Read Calibration Byte	+	+								+	
* — кроме SPIEN
Работа микроконтроллера
89
Если операция "запись установочных битов" в микроконтроллере не выполняется, а значения этих битов перед программированием (перепрограммированием) отличаются от требуемых, необходимо до установки микроконтроллера в аппаратуре выполнить запись требуемых значений установочных битов с помощью программатора.
Для выполнения любой операции в микроконтроллер через вход MOSI вводится последовательность из четырех байтов, в которую входят один или два байта, определяющие тип операции, и байты, используемые при выполнении операции (адресный байт, записываемый байт, байт, содержащий значения установочных битов и битов защиты, холостой байт).
При выполнении операции чтения одновременно с вводом одного из байтов выводится считанный байт через выход MISO. Байты вводятся и выводятся, начиная со старшего бита. Частота следования импульсов на входе SCK должна быть не более 1/4 частоты тактового сигнала микроконтроллера. Сигнал на входе SCK при отсутствии импульсов должен иметь низкий уровень.
После завершения программирования по способу LVSP при размыкании ключа К (см. схему на рис. 4.1) микроконтроллер переходит к выполнению записанной программы, начиная с команды, записанной по адресу $0000.
В микроконтроллере типа ml03 программирования по способу LVSP может выполняться при высоком уровне напряжения на входе RESET, если при подаче напряжения питания вывод PEN был соединен с шиной GND, и это соединение сохранялось до конца программирования.
Самопрограммирование микроконтроллера осуществляется в процессе его работы. Самопрограммирование может выполняться в микроконтроллере типа ш!63. В этом микроконтроллере FlashROM разделена на две секции. Одна секция {Application Section, APS) предназначена для рабочей программы. В другой секции {Boot Loader Section, BLS) размещается программирующая программа {Flash-Resident Boot Loader), введенная ранее в FlashROM.
Деление FlashROM на две секции определяется комбинацией значений установочных битов BOOTSZ1 и BOOTSZO в соответствии с табл. 4.3.
Таб ли ца 4.3
BOOTSZ1	BOOTSZO	Объем BLS (слов)	Начальный адрес BLS
0	0	1024	$ 1С00
0	1	512	$ 1Е00
1	0	256	$ 1F00
1	1	128	$ 1F80
90
Глава 4
Если установочный бит BOOTRST имеет нулевое значение, при пуске микроконтроллера первая команда программы выбирается не по адресу $0000, а по адресу, указанному в табл. 4.3.
Программирование осуществляется с использованием команды SPM (№ 131), выполнение которой зависит от кода, записанного в регистр SPMCR (№ $37) не ранее, чем за четыре такта до выборки кода команды SPM из FlashROM (табл. 2.15).
Программирующая программа может записывать коды в обе секции FlashROM и модифицировать саму себя.
Для защиты секций FlashROM кроме битов защиты LB1 и LB2 в микроконтроллере типа ml63 используются дополнительные биты защиты — BLB01 и BLB02 для защиты секции APS и BLB11 и BLB12 для защиты секции BLS.
4.2.	Пуск и перезапуск микроконтроллера
Пуск микроконтроллера происходит при подаче напряжения питания на его выводы VCC и RESET (Power-On Reset, POR). Перезапуск в процессе работы выполняется при появлении на выводе RESET нулевого уровня сигнала с последующим возвращением к высокому уровню (External Reset, EXR) и при переполнении сторожевого таймера (Watchdog Reset, WDTR). В микроконтроллерах типа tl2, tl5, 4433 и ml63 перезапуск происходит также при понижении напряжения питания на выводе VCC ниже определенного уровня с последующим возвращением к рабочему уровню (Brown-Out Reset, BOR).
При пуске и перезапуске принимает активное значение внутренний сигнал Internal Reset, который сохраняет это значение в течение определенного интервала времени (Start-Up Time). При активном значении сигнала все регистры ввода-вывода переводятся в исходное состояние и в счетчик команд (PC) записывается код числа 0.
По истечении интервала Start-Up Time микроконтроллер приступает к выполнению программы, начиная с команды, записанной в FlashROM по нулевому адресу.
В исходном состоянии регистров ввода-вывода все разряды регистров находятся в нулевом состоянии.
Исключением являются:
	регистр состояния USR или UCSRA (№ $0В) в порте UART, в который заносится код $20 (UDRE = 1);
	регистр управления UCR или UCSRB (№ $0А) в порте UART, в который заносится код $02 (RXB8 =1);
	регистр OCR1B (№ $2D) в таймере-счетчике Т/Cl микроконтроллера типа tl5, в который заносится код $FF;
Работа микроконтроллера
91
	регистр SPDR в порте SPI, исходное состояние которого является неопределенным;
	регистры EEAR, EEARL и EEARH (№№ $1Е и $1F) в блоке управления EEPROM микроконтроллеров типа 112,115, 2323, 4423, 4433, 8535 и ml63, исходное состояние которых является неопределенным;
	регистр PORTA (№$1В) микроконтроллера типа t28, в который заносится код $04.
На рис. 4.2. изображена обобщенная структурная схема цепей, формирующих сигнал Internal Reset. Элементы и связи, изображенные пунктирными линиями, имеются не у всех микроконтроллеров.
Рис. 4.2
В табл. 4.4 отмечено наличие таких элементов у микроконтроллеров разных типов и указаны их характеристики.
На рис. 4.3 изображены временные диаграммы напряжения на выводах микроконтроллера при пуске (POR), перезапуске с использованием вывода RESET (EXR) и перезапуске при понижении напряжения питания (BOR).
При пуске микроконтроллера (рис. 4.3,а) при достижении напряжением питания уровня Троти с помощью схемы PORC устанавливается в единичное состояние триггер Т и сигнал Internal Reset принимает активное значение. При достижении уровня запускается схема
92
Глава 4
временной задержки, выполненная на базе счетчика {Counter). По истечении времени задержки ZT0LIT сигнал на выходе триггера принимает пассивное значение.
Таб ли ца 4.4
Элемент схемы	ТипМК												
	tl 1	112	115	2323	2343	1200	2313	t28	4433	8515	8535	m163	m103
MCUSR	2	4	4	2	2			3*	4		2	4	2
BORC		+	+						+			+	
СК		+	+						. +			+	
CKSEL	2—0	3—0	1—0					3—0	2—0			о I co	
FSTRT	+			+			+			+	+		
SUT													1—0
* — MCUCS (№$07)													
Рис. 4.3
При перезапуске с использованием вывода RESET (рис. 4.3,6) активное значение сигнала Internal Reser устанавливается с использованием схемы EXRC при переходе напряжения на выводе RESET через пороговое значение V[<ST в сторону понижения напряжения, а схема задержки запускается при переходе этого напряжения через значение в сторону повышения.
При переполнении сторожевого таймера WDT формируется короткий импульс, по переднему фронту которого устанавливается активное значение сигнала, а по заднему фронту запускается схема задержки.
При наличии схемы BORC (табл. 4.4) и нулевом значении установочного бита BODEN активное значение сигнала Internal Reset устанавливается при переходе напряжения на входе VCC через пороговое значение ЕВОт в сторону понижения, а запуск схемы задержки происходит при переходе напряжения через пороговое значение Евот в сторону повышения. Уровень Твот может иметь одно из двух значений в зависимости от значения установочного бита BODLEVEL.
Работа микроконтроллера 93
В микроконтроллерах, не имеющих схемы BORC (табл. 4.4), после выключения напряжения питания повторный пуск микроконтроллера путем подачи напряжения питания (POR) возможен, если напряжение питания на выводе VCC упало ниже уровня Рротг Если этот уровень не пройден, микроконтроллер начнет выполнять случайную произвольную программу (рис. 4,в).
Ориентировочные значения пороговых уровней указаны в табл. 4.5.
Таб ли ца 4.5
^РОТН (В)	^POTF (В)	^RST (В)	Vbot(B)	
			BODLEVEL	
			1	0
1,2—1,4	0,4—0,6	(0,6- 0,8)1/сс	2,7	4,0
Величина временной задержки Агоит может быть постоянной или задаваться разработчиками путем изменения значений установочных битов CKSEL, которых у микроконтроллеров разных типов может быть от двух до четырех, и установочного бита FSTRT, а у микроконтроллера типа ml03 — установочных битов SUT1 и SUT0 (табл. 4.4).
В качестве сигнала, подаваемого на счетный вход счетчика Count, могут использоваться сигнал генератора сторожевого таймера GWDT или тактовый сигнал микроконтроллера СК. Выбор источника сигнала выполняется с помощью схемы управления СУ1 путем изменения значений установочных битов CKSEL. Величина задержки /'тост может изменяться от нескольких десятков мкс до нескольких сотен мс.
В микроконтроллерах, имеющих регистр MCUSR (№ $34), имеется возможность программными средствами определять способ запуска/пе-резапуска микроконтроллера, по которому началось выполнение текущей программы. В регистре MCUSR в этих целях используются 2, 3 или 4 разряда (табл. 4.4). При наличии четырех или трех разрядов способам запуска POR, EXR, WDTR и BOR соответствует единичное состояние разрядов PORF, EXTRF, WDRF и BORF регистра MCUSR соответственно.
При наличии двух разрядов (PORF и EXTRF) способ записи (POR, EXR или WDTR) определяется путем опроса состояния разрядов в начале запущенной/перезапущенной программы со сбросом обоих разрядов в нулевое состояние.
Если при опросе PORF = 1, был пуск POR, если EXTRF = 1, был перезапуск EXR, если оба разряда имеют нулевое состояние, был перезапуск WDTR.
При медленном нарастании напряжения питания на входе VCC после включения источника напряжения питания в процессоре (CPU) и EEPROM выполняются случайные операции, в результате которых
94
Глава 4
может произойти произвольная запись случайного байта в EEPROM. Для предотвращения этого явления следует удерживать нулевой уровень сигнала на выводе RESET до появления рабочего значения напряжения на выводе VCC. Эту операцию можно выполнить с помощью внешней схемы формирования сигнала RESET (Brown-Out Detector, BOD).
4.3.	Энергосберегающие режимы работы
Микроконтроллеры семейства AVR могут быть переведены в энергосберегающие режимы работы. У микроконтроллеров всех типов возможны два энергосберегающих режима — режим холостого хода (Idle Mode, IM) и режим пониженного энергопотребления (Power-Down Mode, PDM). Микроконтроллеры, имеющие таймеры-счетчики с режимом счета реального времени (8535, ml63, ml03), кроме того, могут быть переведены в режим энергосохранения (Power Save Mode, PSM). Микроконтроллеры типа tl5 и ш163, имеющие аналого-цифровой преобразователь, кроме того, могут переводиться в режим подавления помех работе АЦП (ADC Noise Reduction Mode, ANRM).
Переход в энергосберегающий режим происходит в ходе программы при выполнении команды с мнемокодом SLEEP, если разряд SE регистра MCUCR (№$35) установлен в единичное состояние.
Выбор режима в микроконтроллерах, которые могут находиться в двух энергосберегающих режимах, определяется состоянием разряда SM регистра MCUCR. При SM = 0 устанавливается режим холостого хода, при SM = 1 — режим пониженного энергопотребления. В микроконтроллерах, которые могут находиться в трех и четырех энергосберегающих режимах, выбор режима определяется комбинацией состояний разрядов SM1 и SM0 регистра MCUCR в соответствии с табл. 4.6.
Таб ли ца 4.6
SM1	SMO	Тип МК			
		t15	8535	m163	m103
0	0	IM	IM	IM	IM
0	1	ANRM	—	ANRM	—
1	0	PDM	PDM	PDM	PDM
1	1	—	PSM	PSM	PSM
Выход из энергосберегающего режима происходит при поступлении разрешенного запроса прерывания или перезапуске микроконтроллера. При выходе по запросу прерывания выполняется прерывающая программа и далее совершается переход к команде, расположенной после команды SLEEP, по которой произошел переход в данный режим.
Работа микроконтроллера
95
В режиме холостого хода (IM) процессор остановлен, периферийные устройства продолжают работать, коды в регистрах общего назначения, ячейках SRAM и регистрах ввода-вывода, расположенных в пассивных периферийных устройствах, сохраняются неизменными. Ток потребления 1СС у микроконтроллеров разных типов уменьшается в 2—4 раза. Если аналоговый компаратор не используется для выхода из режима, разряд ACD в регистре ACSR (№ S28) для уменьшения тока потребления должен быть установлен в единичное состояние.
В режиме пониженного энергопотребления (PDM) остановлен процессор и генератор тактового сигнала. Периферийные устройства, кроме сторожевого таймера и блока прерываний, не работают. Коды в регистрах общего назначения, ячейках SRAM и регистрах ввода-вывода сохраняются неизменными. Ток потребления /сс у микроконтроллеров разных типов имеет величину от нескольких единиц до нескольких десятков мкА. Напряжение питания Vcc может быть снижено до величины 2 В.
Выход из режима возможен при перезапуске микроконтроллера и по разрешенному запросу прерывания из внешнего источника при представлении запроса уровнем сигнала. Сигнал должен сохранять низкий уровень в течение некоторого времени, пока генератор тактового сигнала входит в установившийся режим. В микроконтроллере типа ml63, имеющем порт TWSI, выход из режима возможен также по запросу прерывания при опознании портом собственного адреса в поступившем адресном байте.
Режим энергосохранения (PSM) в микроконтроллерах, имеющих таймер-счетчик с режимом счета реального времени, отличается от режима пониженного энергопотребления возможностью сохранения работы данного таймера после перехода в режим и возможностью выхода из режима по запросу прерывания от этого таймера при его работе в режиме счета реального времени.
В режиме подавления помех работе АЦП (ANRM) процессор остановлен. Работают только аналого-цифровой преобразователь, блок прерываний и сторожевой таймер. Выход из режима происходит по запросу прерывания из внешнего источника при представлении запроса уровнем сигнала, по запросу прерывания от АЦП и при перезапуске микроконтроллера. В микроконтроллере типа ml63 выход из режима возможен также по запросу прерывания при опознании портом TWSI собственного адреса.
Приложения
П1. Маркировка микроконтроллеров
На корпусе микроконтроллера обозначен его тин. В обозначении типа могут присутствовать дополнительные буквы, не указанные в полном обозначении типа в табл. В.1.
После обозначения типа через дефис следует суффикс, состоящий из трех полей. В первом поле находятся одна или две цифры, обозначающие максимальное значение тактовой частоты, МГц, для данного варианта микроконтроллера. Во втором поле находится буква, обозначающая тип корпуса (табл. П1.1), в третьем поле записана буква, обозначающая диапазон допустимых значений температуры окружающей среды t, °C (табл. П1.2).
Таб ли ца П1. 1
Буква	Тип корпуса	Шаг выводов (мм)
А	TQFP	0,8
J	PLCC	1,27
М	MLE	0,5
Р	PDIP	2,54
S	SOIC	1,27
Y	SSOP	0,65
В таблице П1.3 приведена маркировка микроконтроллеров, содержащая обозначение типа и первое поле суффикса, указаны диапазон
Маркировка микроконтроллеров 97
допустимых значений напряжения питания (Vcc), максимальное значение тактовой частоты (F^), число выводов и тип корпуса для микроконтроллера данного типа и варианта.
Таб ли ца П1.2
Буква	t, °C
С	0...+70 -40...+85
Таб ли ца П1.3
Маркировка	Vcc(B)	Рпвх(МГц)	Корпус
ATtinyl 1L-2	2,7—5,5	2	8P, 8S
ATtinyl 1-6	4,0—5,5	6	
ATtinyl 2V-1	1,8—5,5	1	
ATtinyl 2L-4	2,7—5,5	4	8P, 8S
ATtinyl 2-8	4,0—5,5	8	
ATtinyl 5L-1	2,7—5,5	1,6	8A, 8S
AT90LS2323-4	2,7—6,0	4	8P, 8S
AT90S2323-10	4,0—6,0	10	
AT90LS2343-4	2,7—6,0	4	8P,8S
AT90S2343-10	4,0—6,0	10	
AT90S1200-4	2,7—6,0	4	20P, 20S, 20Y
AT90S1200-12	4,0—6,0	12	
AT90S2313-4	2,7—6,0	4	20P, 20S
AT90S2313-10	4,0—6,0	10	
ATtiny28L-4	2,7—5,5	4	32A, 28P, 32M
ATtiny28V-1	1,8—5,5	1,2	
AT90LS4433-4	2,7—6,0	4	32A, 28P
AT90S4433-8	4,0—6,0	8	
AT90S8515-4	2,7—6,0	4	44A, 44J, 40P
AT90S8515-8	4,0—6,0	8	
AT90LS8535-4	2,7—6,0	4	44A, 44J, 40P
AT90S8535-8	4,0—6,0	8	
ATmega163L-4	2,7—5,5	4	44A, 40P
ATmega 163-8	4,0—5,5	8	
ATmega103L-4	2,7—3,6	4	64A
ATmega103-6	4,0—5,5	6	
98 Приложения
П2. Выводы микроконтроллеров
В табл. П2.1 приведены имена выводов у микроконтроллеров разных шш. Альгержтивиыё функции вывдеш рясскгят’рй'яяют’ся' при описяншт устройств, при работе которых они выполняются, и указаны в приложении ПЗ.
Таб ли ца П2. 1
Тип МК
til t12 t15	2323	2343	1200 2313	t28	4433	8515	8535	m163	m103
	RESET	RESET	RESET	RESET	RESET	RESET	RESET	RESET	RESET
	XTAL1.2		XTAL1.2	XTAL1,2	XTAL1,2	XTAL1,2	XTAL1.2	XTAL1.2	XTAL1.2
				PAO-3		PAO-7	PAO-7	PAO-7	PAO-7
РВО-5	РВО-2	РВО-4	РВО-7	PBO-7	PBO-5	PBO-7	PBO-7	PBO-7	PBO-7
					PCO-5	PCO-7	PCO-7	PCO-7	PCO-7
			PDO-6	PDO-7	PDO-7	PDO-7	PDO-7	PDO-7	PDO-7
									PEO-7
									PFO-7
					AVCC		AVCC	AVCC	AVCC
					AGND		AGND	AGND	AGND
					AREF		AREF	AREF	AREF
						ALE			ALE
						ICP			RD
						OC1B			WR
									TOSC1
									TOSC2
				I					PEN
ПЗ. Альтернативные функции выводов портов
В табл. П3.1 и П3.2 указаны альтернативные функции выводов параллельных портов.
Таб ли ца П3. 1
PXY	Тип MK							
	til	t12	t15	2323	2343	1200	2313	t28
PA2								IR
PBO	AINO	AINO MOSI	AINO AREF MOSI	MOSI	MOSI	AINO	AINO	AINO
Альтернативные функции выводов портов
99
Окончание табл. ПЗ. 1
PXY	Тип МК							
	til	t12	t15	2323	2343	1200	2313	t28
РВ1	AIN1 INTO	AIN1 INTO MISO	AIN1 OC1A MISO	INTO MISO	INTO MISO	AIN1	AIN1	AIN1
РВ2	ТО	SCK TO	ADC1 INTO SCK TO	SCK TO	SCK TO			TO
РВЗ	XTAL1	XTAL1	ADC2		CLOCK		OC1	INTO
РВ4	XTAL2	XTAL2	ADC3					INT1
РВ5	RESET	RESET	ADCO RESET			MOSI	MOSI	
РВ6 РВ7						MISO SCK	MISO SCK	
PD0 PD1 PD2 PD3 PD4 PD5 PD6						INTO TO	RXD TXD INTO INT1 TO T1 ICP	
Таб ли ца П3.2
PXY	4433	8515	8535	m163	m103		
РАО		ADO	ADCO	ADCO	ADO	PEO	RXD
PA1		AD1	ADC1	ADC1	AD1	PE1	TXD
PA2		AD2	ADC2	ADC2	AD2	PE2	AC+
РАЗ		AD3	ADC3	ADC3	AD3	PE3	AC-
PA4		AD4	ADC4	ADC4	AD4	PE4	INT4
PA5		ADS	ADC5	ADC5	AD5	PE5	INT5
PA6		AD6	ADC6	ADC6	AD6	PE6	INT6
PA7		AD7	ADC7	ADC7	AD7	PE7	INT7
РВО	ICP	TO	TO	TO	SS	PFO	ADCO
PB1	ОС1	T1	T1	T1	SCK	PF1	ADC1
PB2	ss	AINO	AINO	AINO	MOSI	PF2	ADC2
РВЗ	MOSI	AIN1	AIN1	AIN1	MISO	PF3	ADC3
РВ4	MISO	SS	SS	SS	OCO	PF4	ADC4
РВ5	SCK	MOSI	MOSI	MOSI	OC1A	PF5	ADC5
РВ6		MISO	MISO	MISO	0C1B	PF6	ADC6
РВ7		SCK	SCK	SCK	OC2	PF7	ADC7
РСО	ADCO	A8		SCL	A8		
РС1	ADC1	A9		SDA	A9		
РС2	ADC2	A10			A10		
100
Приложения
Окончание табл. П3.2
PXY	4433	8515	8535	m163	m103
РСЗ	ADC3	А11			A11
РС4	ADC4	А12			A12
РС5	ADC5	А13			A13
РС6		А14	TOSC1	TOSC1	A14
РС7		А15	TOSC2	TOSC2	A15
PD0	RXD	RXD	RXD	RXD	INTO
PD1	TXD	TXD	TXD	TXD	INT1
PD2	INTO	INTO	INTO	INTO	INT2
РОЗ	INT1	INT1	INT1	INT1	INT3
PD4	ТО		OC1B	OC1B	IC1
PD5	Т1	OC1A	OC1A	OC1A	
PD6	AINO	WR	ICP	ICP	T1
PD7	AIN1	RD	OC2	OC2	T2
П4. Регистры ввода-вывода
В табл. П4 перечислены имена регистров ввода-вывода (I0R) и указаны их номера (в шестнадцатеричном коде) у микроконтроллеров разных типов.
Таб ли ца П4
Имя IOR	Тип MK														
	til	t12	tl 5	2323	2343	1200	2313	t28	4433	8515	8535	m163	m103
ACSR	08	08	08			08	08	08	08	08	08	08	08
ADCH			05						05		05	05	05
ADCL			04						04		04	04	04
ADCSR			06						06		06	06	06
ADMUX			07						07		07	07	07
ASSR											22	22	30
DDRA										1A	1A	1A	1A
DDRB	17	17	17	17	17	17	17		17	17	17	17	17
DDRC									14	14	14	14	
DDRD						11	11	11	11	11	11	11	11
DDRE													02
EEAR EEARH		1E	1E	1E	1E	1E	1E		1E	1F	1F	1F	1F
EEARL										1E	1E	1E	1E
EECR		1C	1C	1C	1C	1C	1C		1C	1C	1C	1C	1C
EEDR		1D	1D	1D	1D	1D	1D		1D	1D	1D	1D	1D
EICR													ЗА
EIFR													38
EIMSK GIFR	ЗА	ЗА	ЗА	ЗА	ЗА		ЗА		ЗА	ЗА	ЗА	ЗА	39
Регистры ввода-вывода
101
Продолжение табл. П4
Тип МК
Имя IOR	til	t12	t15	2323	2343	1200	2313	t28	4433	8515	8535	m163	m103
GIMSK	3B	3B	3B	3B	3B	3B	3B		3B	3B	3B	3B	
ICR								06					
ICR1H							25		27	25	27	27	27
ICR1L							24		26	24	26	26	26
IFR								05					
MCUCR	35	35	35	35	35	35	35		35	35	35	35	35
MCUCS								07					
MCUSR	34	34	34	34	34				34		34	34	34
MODCR								02					
OCRO													31
OCR1A			2E										
OCR1AH							2B			2B	2B	2B	2B
0CR1AL							2A			2A	2A	2A	2A
OCR1B			2D										
OCR1BH										29	29	29	29
0CR1BL										28	28	28	28
OCR1H									2B				
0CR1L									2A				
OCR2											23	23	23
OSCCAL		31	31					00				31	
PACR								1A					
PINA								19		19	19	19	19
PINB	16	16	16	16	16	16	16	16	16	16	16	16	16
PINC									13	13	13	13	
PIND						10	10	10	10	10	10	10	10
PINE													01
PINF													00
PORTA								1B		1B	1B	1B	1B
PORTB	18	18	18	18	18	18	18		18	18	18	18	18
PORTC									15	15	15	15	15
PORTD						12	12	12	12	12	12	12	12
PORTE													03
RAMPZ													3B
SFIOR			2C									30	
SP									3D				
SPCR									0D	OD	OD	OD	OD
SPDR									OF	OF	OF	OF	OF
SPH										3E	3E	3E	3E
SPL				3D	3D		3D			3D	3D	3D	3D
SPMCR												37	
SPSR									OE	OE	OE	OE	OE
SREG	3F	3F	3F	3F	3F	3F	3F	3F	3F	3F	3F	3F	3F
102
Приложения
Окончание табл. П4
Имя IOR	Тип МК												
	til	t12	t15	2323	2343	1200	2313	t28	4433	8515	8535	m163	m103
TCCR0	33	33	33	33	33	33	33	04	33	33	33	33	33
TCCR1			30										
TCCR1A							2F		2F	2F	2F	2F	2F
TCCR1B							2E		2E	2E	2E	2E	2E
TCCR2											25	25	25
TCNT0	32	32	32	32	32	32	32	03	32	32	32	32	32
TCNT1			2F										
TCNT1H							2D		2D	2D	2D	2D	2D
TCNT1L							2C		2C	2C	2C	2C	2C
TCNT2											24	24	24
TIFR	38	38	38	38	38	38	38		38	38	38	38	36
TIMSK	39	39	39	39	39	39	39		39	39	39	39	37
TWAR												02	
TWBR												00	
TWCR												36	
TWDR												03	
TWSR												01	
UBRR							09		09	09	09	09	09
UBRRHI									03			20	
UCR							0A			0A	0A		OA
UCSRA									0B			OB	
UCSRB									0A			OA	
UDR							ОС		ОС	ОС	ОС	ОС	ОС
USR							0B			0B	0B		OB
WDTCR	21	21	21	21	21	21	21	01	21	21	21	21	21
XDIV													3C
Всего:	14	18	27	17	17	18	32	17	44	45	54	63	60
П5. Разряды регистров ввода-вывода
В табл. П5.2 приведены штатные имена разрядов регистров управления и регистров состояния. Для указания типа микроконтроллера, в котором находится регистр и разряд регистра, используются номера, указанные в табл. П5.1.
Знак перед номером означает, что разряд с данным именем в данном регистре в контроллере с указанным номером типа отсутствует.
Таблица П5. 1
Тип MK	t11	t12	t15	2323 2343	1200	2313	t28	4433	8515	8535	m163	m103
№	1	2	3	4	5	6	7	8	9	10	11	12
Таб ли ца П5.2
Регистр	Ns разряда							
	7	6	5	4	3	2	1	0
ACSR	ACD	AINBG 2, 8	AGO	ACI	ACIE	ACIC	ACIS1	ACISO
1—3, 5—12		ACBG				6, 8, 9,		
		3, 11				10, 11		
ADCSR	ADEN	ADSC	ADFR	ADIF	ADIE	ADPS2	ADPS1	ADPSO
3, 8, 10—12			—12					
ADMUX	REFS1	REFSO	ADLAR	MUX4	MUX3	MUX2	MUX1	MUXO
3, 8, 10—12	3, 11	3, 11 ADCBG 8	3, 11	11	11			
ASSR					AS2	TCN2UB	OCR2UB	TCR2UB
10—12					ASO	TCNOUB	OCROUB	TCROUB
					12	12	12	12
EECR					EERIE	EEMWE	EEWE	EERE
2—6, 8—12					—4, —6, 9	—5		
EICR (12)	ISC71	ISC70	ISC61	ISC60	ISC51	ISC50	ISC41	ISC40
EIFR (12)	INTF7	INTF6	INTF5	INTF4				
EIMSK (12)	INT7	INT6	INT5	INT4	INT3	INT2	INT1	INTO
GIFR	INTF1	INTFO	PCIF					
1—4, 6, 8—11	6, 8—11		1—3					
GIMSK	INT1	INTO	PCIE					
1—6, 8—11	6, 8—11		1—3					
ICR (7)	INT1	INTO	LLIE	TOIEO	ISC11	ISC10	ISC01	ISCOO
IFR (7)	INTF1	INTFO		TOVO				
Разряды регистров ввода-вывода
о GJ
Продолжение табл. П5.2
Регистр	Ns разряда							
	7	6	5	4	3	2	1	0
MCUCR 1—6, 8—12	SRE 9, 12	SRW 9, 12 SE 10, 11 PUD 2,3	SE SM1 10, 11	SM SMO 10, 11 SM1 3, 12	ISC11 6, 8—11 SMO 3, 12	ISC10 6, 8—11 —12	ISC01 —7, 12	ISCOO —7, 12
MCUCS(7)	PLUPB		SE	SM	WDRF		EXTRF	PORF
MCUSR 1—4, 8, 10—12					WDRF 2, 3, 8, 11	BORF 2, 3, 8, 11	EXTRF	PORF
MODCR(7) PACR(7)	ONTIM4	ONT1M3	ONTIM2	ONTIM1	ONTIMO DDA3	MCONF2 PA2HC	MCONF1 DDA1	MCONFO DDAO
SFIOR 3, 11					ACME 11	FOC1A PUD 11	PSR1 PSR2 11	PSRO PSR10 11
SPCR(8—12)	SPIE	SPE	DORD	MSTR	CPOL	CPHA	SPR1	SPRO
SPMCR(11)				ASRE	BLBSET	PGWRT	PGERS	SPMEN
SPSR(8—12)	SPIF	WCOL						SPI2X 11
TCCRO 1—12	FOVO 7	PWMO 12	COM01 12	OOM01 7 COMOO 12	OOMOO 7 CTCO 12	CS02	CS01	CSOO
TCCR1(3)	CTC1	PWM1	COM1A1	COM 1 AO	CS13	CS12	CS11	CS10
TCCR1A 6, 8—12	COM1A1 COM11 8	COM 1 AO COM 10 8	COM1B1 —6,8	COM1BO —6, 8	F0C1A 11	FOC1B 11	PWM 11	PWM10
104	Приложения
Окончание табл. 5.2
Регистр	Ns разряда							
	7	6	5	4	3	2	1	0
TCCR1B 6, 8—12	ICNC1	ICES1			CTC1	CS12	CS11	CS10
TCCR2 10—12	FOC2 11	PWM2	C0M21	COM20	CTC2	CS22	CS21	CS20
TIFR 1—6, 8—12	T0V1 6, 8, 9 OCF2 10—12	TOV2 10—12 OCF1A 3, 6, 9 OCF1(8)	ICF1 10—12 OCF1B 9	OCF1A 10—12	OCF1B 10—12 ICF1 6, 8, 9	TOV1 3, 10—12	TOVO 1—6, 8, 9 OCFO 12	TOVO 10—12
TIMSK 1—6, 8—12	TOIE1 6, 8, 9 OCIE2 10—12	TOIE2 10—12 OCIE1A 3, 6, 9 0CIE1(8)	TICIE1 10—12 OCIE1B 9	OCIE1A 10—12	OC1E1B 10—12 TICIE1 6, 8, 9	TOIE1 3, 10—12	TOIEO 1—6, 8, 9 OCIEO 12	TOIEO 10—12
TWCR(11) TWSR(11)	TWINT TWS7	TWEA TWS6	TWSTA TWS5	TWSTO TWS4	TWWC TWS3	TWEN		TWIE
UCR(6, 9, 10, 12)	RXCIE	TXCIE	UDRIE	RXEN	TXEN	CHR9	RXB8	TXB8
UCSRA(8, 11)	RXC	TXC	UDRE	FE	OR		U2X 11 RXB8	MPCM
UCSRB(8, 11)	RXCIE	TXCIE	UDRIE	RXEN	TXEN	CHR9		TXB8
USR(6, 9, 10, 12)	RXC	TXC	UDRE	FE	OR			
WDTCR(1—12)				WDTOE —5	WDE	WDP2	WDP1	WDP0
о Oi
106 Приложения
П6. Установочные биты (Fuse Bits)
В табл. П6 перечислены имена установочных битов у микроконтроллеров семейства AVR и указаны исходные значения установочных битов, имеющихся у микроконтроллеров разных типов.
Таблица П6
Fuse Bits	Тип МК												
	т— ф*	см ф*	ю т-Ф4	2323	2343	1200	2313	со С4 ы	4433	8515	8535	т163	m103
BODEN		1	1						1			1	
BODLEVEL		0	0						1			1	
BOOTRST												1	
BOOTSZO												1	
BOOTSZ1												1	
CKSELO	0	0	0					0	0			0	
CKSEL1	0	1	0					1	1			1	
CKSEL2	1	0						0	0			0	
CKSEL3		0						0				0	
EESAVE													1
FSTRT	1			0			1*			1*	1		
INTCAP								1					
RCEN					0	1‘							
RSTDISBL	1	1	1										
SPIEN		0	0	0	0	0	0		0	0	0	0	0
SUTO													1
SUT1													1
* — можно изменить при заказе МК													
П7. Двоичный вычитатель
Многоразрядный двоичный вычитатель состоит из одноразрядных двоичных вычитателей, соединенных цепями передачи сигнала займа. Одноразрядный двоичный вычитатель имеет три входа — а, Ь, и с и два выхода — R и С. На вход а подается сигнал, представляющий цифру уменьшаемого, на вход b — сигнал, представляющий цифру вычитаемого, на вход с — сигнал, представляющий цифру займа из данного разряда в соседний младший разряд. На выходе R формируется сигнал, представляющий цифру разности, на выходе С — сигнал, представляющий цифру займа в данный разряд из соседнего старшего разряда.
Двоичный вычитатель
107
На рис. П7.1 изображена
схема соединения одноразрядного вычита-
теля в разряде с весом 2' с
соседними разрядами.
а б с
Рис. П7.1
В одноразрядном вычитателе выполняется операция a-b-с. Значения переменных R и С при разных значениях переменных а, b и с приведены в табл. П7.1.
Табли ца П7. 1
а	ь	с	R	с
0 0 0 0 1 1 1 1	0 0 1 1 0 0 1 1	0 1 0 1 0 1 0 1	0 1 1 0 1 0 0 1	0 1 1 1 0 0 0 1
Формула для определения значения переменной С в зависимости от значений переменных а, b и R имеет вид:
С «f(a, b, R) - ab R v abR v abR v abR = aRv abv bR.
При выполнении операции вычитания с числами без знака единичное значение переменной С в старшем разряде свидетельствует о получении неверного результата, поскольку в разрядной сетке отсутствует разряд, из которого требуется занять единицу.
Числа со знаком представляются в дополнительном двоичном коде. При этом старший разряд (п) имеет вес (-2"), а соседний младший разряд — вес +2”'1. Единица займа из старшего разряда должна иметь вес +2П = 2 • 2”’1.
Операция вычитания в старшем разряде выполняется по общему для всех разрядов правилу (табл. П7.1). Результат, который должен быть получен в старшем разряде при выполнении операции a-b-с с учетом весов разрядов дополнительного кода при разных комбинациях значений переменных а, b и с, указан в табл. П7.2.
108
Приложения
Таб ли ца П7.2
abc	R	a-b-c	И
ООО	0	0(-2л)-0(-2п)-0(+2п) = 0(-2л)	0
001	1	0(-2л)-0(-2л)-1 (+2П) = 1(-2л)	0
010	1	0(-2л)-1(-2л)-0(+2л) = 1(+2п)	1
011	0	0(-2л)-1 (-2л)-1 (+2П) = 0(-2л)	0
100	1	1 (-2л)-0(-2п)-0(+2п) = 1(-2л)	0
101	0	1(-2л)-0(-2л)-1(+2л) = 2(-2л)	1
110	0	1(-2л)-1(-2л)-0(+2л) = 0(-2л)	0
111	1	1(-2л)-1(-2л)-1(+2л) = 1(-2л)	0
Результат, получаемый в третьей и шестой строках табл. П7.2, не может быть представлен в данной разрядной сетке. В этом случае признак переполнения разрядной сетки при выполнении операций с числами со знаком (v) должен иметь единичное значение. Формула для определения значения переменной V в зависимости от значений переменных а, b и R имеет вид:
V=f(a, b, R) = abR v abR.
П8. Разработка программы на языке AVR Ассемблера фирмы Atmel
П8.1. Программа на языке ассемблера представляется в виде одного или нескольких текстовых файлов. Файл состоит из одного или нескольких сегментов. Программа может иметь в своем составе сегменты трех типов — CSEG, ESEG и DSEG. Сегмент типа CSEG является обязательным.
Запись программы выполняется построчно. Строка может содержать до 120 символов (буквы, цифры, знаки, пробелы). Строка может быть пустой.
В строке выделяются три поля. Слева находится поле для записи метки. Метка представляет собой последовательность из букв, цифр и некоторых знаков и начинается с буквы. Запись метки заканчивается знаком ":Поле метки может быть пустым.
Справа от поля метки находится поле для записи мнемокодов команд и директив ассемблера. Поле может быть пустым.
Далее находится поле для записи комментария. Запись комментария начинается со знака ";Поле комментария может быть пустым.
Разработка программы на языке AVR Ассемблера фирмы Atmel
109
В процессе ассемблирования мнемокоды команд преобразуются в машинные коды команд, директивы ассемблера и метки используются при формировании программы в машинных кодах. Комментарии игнорируются. Они используются программистами в качестве пояснений к программе.
Мнемокоды команд рассмотрены при описании системы команд (см. главу 2) и приведены в табл. 2.1—2.14.
Директивы ассемблера выполняют следующие функции:
	определяют тип сегмента (директивы .CSEG, .ESEG, .DSEG);
	распределяют память микроконтроллера (директивы .ORG, .DB, .DW, .BYTE);
	присваивают имена и значения (директивы .DEF, .EQU, .SET);
	управляют процессом ассемблирования (директивы .DEVICE, .INCLUDE, .EXIT, .MACRO, .ENDMACRO);
	управляют формированием листинга (директивы .NOLIST, .LIST, .LISTMAC).
П8.2. Сегмент тип CSEG начинается с директивы .CSEG. Если запись программы начинается с сегмента этого типа, директива может отсутствовать. В сегменте типа CSEG записываются мнемокоды команд и могут записываться все директивы ассемблера, кроме директивы .BYTE.
Метка является символическим адресом в адресном пространстве FlashROM. Реальный адрес вычисляется в процессе ассемблирования. Исходное значение задается с помощью директивы .ORG, записанной в начале сегмента после директивы CSEG. В программе могут находиться несколько сегментов типа CSEG. При отсутствии директивы .ORG в первом из них в качестве исходного принимается нулевой адрес в FlashROM.
В сегменте типа CSEG директива .DB определяет байт или группу байтов, которые должны быть записаны в FlashROM в качестве констант, начиная с адреса, обозначенного меткой перед директивой.
Пример 1.
.CSEG
.ORG $140
NUM: .DB $12, $34, $56, $78
Байт $12 записывается в FlashROM по адресу NUM = $140 в младшую половину ячейки, байт $34 — по этому же адресу в старшую половину ячейки, байт $56 — по адресу NUM+1 = $141 в младшую половину ячейки, байт $78 — по адресу NUM+1 в старшую половину ячейки. Запись выполняется при программировании микроконтроллера.
Директива .DW определяет слово или группу слов, которые должны быть записаны в FlashROM в качестве констант, начиная с адреса, обозначенного меткой перед директивой.
110 Приложения
Пример 2.
NUMS: . DW $1234, $5678, $9АВС
Слово $1234 записывается в FlashROM по адресу NUMS, слово $5678 — по адресу NUMS+1, слово $9АВС — по адресу NUMS+2. Реальные адреса вычисляются в процессе ассемблирования. Запись в FlashROM выполняется при программировании микроконтроллера.
Кроме символических адресов, указанных в сегменте CSEG в поле метки и используемых в мнемокодах команд безусловного и условного перехода, при записи программы на языке ассемблера могут вводиться символические имена для регистров общего назначения и отдельных разрядов в них, для регистров ввода-вывода и отдельных разрядов в них, для переменной К в мнемокодах команд в табл. 2.2 и 2.3 и для переменной q в мнемокодах команд в табл. 2.5.
Директива .DEF присваивает символическое имя регистру общего назначения. Это имя может указываться в мнемокодах команд вместо стандартного обозначения (7?d, RT).
Пример 3.
.DEF TEMP = R16
LDI TEMP, $F0
В регистр общего назначения R16 заносится байт $F0.
Директивы .EQU и .SET присваивают значение имени, введенному программистом.
Пример 4.
.EQU DDRCINIT = $ЗВ
LDI TEMP, DDRCINIT
OUT $14, TEMP
Коду, который должен быть занесен в регистр DDRC (№$14), программист присвоил имя DDRCINIT. При выполнении программы в регистр DDRC будет занесен двоичный код 00111011, который определяет направление передачи через выводы порта С.
Пример 5.
.DEF MASTEST = R20
. EQU KTEST = 6
SBRC MASTEST. KTEST
Выполнение команды, условного перехода (команда №111) зависит от состояния шестого разряда в регистре общего назначения R20.
Разработка программы на языке AVR Ассемблера фирмы Atmel 111
Пример 6.
. EOU STACKINIT = $025F
Коду, предназначенному для занесения в регистр-указатель стека, программист присвоил имя и задал значение.
Значение, присвоенное директивой .EQU, остается неизменным для всей программы. Значение, присвоенное директивой .SET, может быть изменено в другом месте программы.
Регистры ввода-вывода и отдельные разряды в некоторых из них имеют штатные символические имена. Штатные имена регистров ввода-вывода у микроконтроллеров разных типов приведены в приложении П4. Штатные имена разрядов регистров ввода-вывода приведены в тексте книги при описании работы устройств, в которых эти регистры используются, и указаны в приложении П5.
С использованием штатного имени мнемокод второй команды в примере 4 принимает вид:
OUT DDRC, TEMP
Директива .DEVICE определяет тип микроконтроллера, для которого составляется программа. По этой директиве в ассемблере выбирается служебный файл, в котором присвоены имена регистрам ввода-вывода и их разрядам, указана емкость запоминающих устройств и отмечены другие особенности микроконтроллера используемого типа.
Пример записи директивы:
.DEVICE AT90S8515
Директива .INCLUDE указывает имя дополнительного файла, который должен быть использован в процессе ассемблирования.
Пример записи директивы:
.INCLUDE "UART.ASM",
где UART.ASM — имя дополнительного файла.
Директива .EXIT указывает конец используемой при ассемблировании части файла, если не требуется использовать весь файл.
Директивы .MACRO и .ENDMACRO обрамляют участок программы (макроопределение), который должен ассемблироваться каждый раз, когда в поле для мнемокодов команд и директив ассемблера появляется имя, заданное директивой .MACRO.
Пример 7.
.MACRO EEWR
SBI EECR, 2
SBI EECR, 1
.ENDMACRO
112 Приложения
При появлении в программе на языке ассемблера в среднем поле имени EEWR (макровызов) ассемблируются мнемокоды SBI EECR, 2 и SBI EECR, 1 и в программу на машинном языке вставляются машинные коды этих команд.
В макроопределении вместо конкретных имен и значений могут вводиться обобщенные обозначения параметров @0, @1,	@9.
В макровызове после имени указываются значения параметров для данного макровызова в порядке их номеров.
Пример 7А.
.MACRO ADD16
ADD @0, @1
ADDC @2, @3
.ENDMACRO
.CSEG
ADD16 R4, R10. R5, R11
При ассемблировании данного макровызова будут ассемблироваться команды с мнемокодом
ADD R4, R10
ADDC R5, R11
В процессе ассемблирования формируется файл для выдачи листинга. С использованием директив .NOLIST и .LIST выделяется участок программы, который не требуется выводить на листинг.
Директива LIST МАС, записанная перед именем, которое было указано в директиве .MACRO, включает в листинг команды, обрамленные директивами MACRO и ENDMACRO, и помечает их знаком
П8.3. Сегмент типа ESEG начинается с директивы .ESEG. В сегменте записываются директивы .DB, .DW и .ORG. Метка является символическим адресом в адресном пространстве EEPROM. Реальный адрес вычисляется в процессе ассемблирования. Исходное значение задается с помощью директивы .ORG, заданной в начале сегмента после директивы .ESEG. В программе могут быть несколько сегментов этого типа. При отсутствии директивы .ORG в первом из них в качестве исходного принимается нулевой адрес в EEPROM.
Директива .DB определяет байт или группу байтов, которые должны быть записаны в ячейки EEPROM, начиная с адреса, обозначенного меткой перед директивой .DB.
Пример 8.
.ESEG
.ORG $20
.EMAS:.DB $02, $13, $24
Разработка программы на языке AVR Ассемблера фирмы Atmel
113
Байт $02 будет записан в EEPROM по адресу EMAS = $20, байт $13 — по адресу EMAS+1 = $21, байт $24 — по адресу EMAS+2. Запись в EEPROM выполняется в процессе программирования микроконтроллера.
Директива .DW определяет слово или группу слов, которые должны быть записаны в пары ячеек EEPROM, начиная с адреса, обозначенного меткой перед директивой .DW.
Пример 9.
. ESEG
EMASW:.DW $1357, $2468
Слово $1357 будет записано в EEPROM побайтно по адресам EMASW и EMASW+1, слово $2468 — по адресам EMASW+2 и EMASW+3.
П8.4. Сегмент типа DSEG начинается с директивы .DSEG. В сегменте записываются директивы .BYTE и .ORG. Метка является символическим адресом в адресном пространстве SRAM. Реальный адрес вычисляется в процессе ассемблирования. Исходное значение задается с помощью директивы .ORG, записанной в начале сегмента после директивы .DSEG. В программе могут быть несколько сегментов типа .DSEG. При отсутствии директивы ORG в первом из них в качестве исходного принимается адрес $60.
Директива.ВУТЕ определяет количество ячеек в SRAM, к которым будет производиться обращение для записи и чтения байтов, начиная с адреса, обозначенного меткой перед директивой .BYTE.
Пример 10.
.DSEG
.ORG $60
DMAS:.BYTE 3
. CSEG
MST: STS DMAS+1, R5
В SRAM зарезервированы три ячейки, к которым обращаются по адресам DMAS = $60, DMAS+1 = $61 и DMAS+2 = $62.
По команде, записанной в FlashROM по адресу MST, выполняется пересылка байта из регистра общего назначения R5 в ячейку SRAM по адресу $61.
П8.5. Вместо конкретных значений переменных в мнемокодах команд и директивах ассемблера могут записываться выражения (формулы), по которым в процессе ассемблирования эти значения вычисляются. В качестве операндов в выражение могут входить числа, символические имена и адреса, текущее значение в счетчике команд (PC). Числа могут быть представлены в десятичном, шестнадцатеричном или двоичном коде. Для обозначения шестнадцатеричного кода используются указатели $ или ОХ, для обозначения двоичного кода — указатель ОЬ.
114
Приложения
Пример записи числа:
75 = $4В = 0Х4В = ObO 1001011.
При составлении выражений могут использоваться арифметические операции (АО), логические операции (ЛО) и операции отношения (ОО). Результатом арифметической операции является число, результатом логической операции — код, значения битов в котором являются результатом выполнения данной логической операции с битами в разрядах кодов-операндов, результатом операции отношения является 1 ($01), если отношение выполняется, или 0 ($00), если отношение не выполняется. В табл. П8 указаны тип операции, знак операции, правило получения результата и очередность выполнения операций при вычислении выражения. Очередность выполнения может быть изменена путем заключения в круглые скобки части выражения, которая должна выполняться раньше других.
Таб ли ца П8
Тип операции	Знак операции	Результат операции	Очередность
ОО	!N	1,если N = 0 0, если N # 0	1
ЛО	~N	$FF—$N	1
АО	—N	$00—$N	1
АО	N*M	NxM	2
АО	N/M	N : M	2
АО	N + M	N + M	3
АО	N-M	N-M	3
ЛО	M«N	M раз (ObN) <- 0	4
ЛО	N»M	M раз 0 -> (ObN)	4
ОО	N<M	1, если N < M 0, если N a M	5
ОО	N <= M	1,если N s M 0, если N > M	5
ОО	N>M	1,если N > M 0, если N s M	5
ОО	N >= M	1, если N г M 0, если N < M	5
ОО	N==M	1, если N = M 0, если N # M	6
Аппаратно-программные средства поддержки разработок 115
Окончание табл. П8
Тип операции	Знак операции	Результат операции	Очередность
00	N!=M	1, если N # М 0, если N = М	6
ло	N&M	N л М	7
ло	N л М	N®M	8
ло	NIM	N v М	9
00	N&&M	1, если N * Q и М * О 0 в противном случае	
00	NIIM	0, если N « 0 и М - 0 1 в противном случае	11
Кроме арифметических, логических операций и операции отношения в выражение могут входить операции-функции:
	выделение младшего байта слова
LOW ($ABCD) = $CD;
	выделение старшего байта слова
HIGH ($ABCD) = $АВ;
	возведение в степень числа 2
EXP2(N) = 2х;
	выделение целой части двоичного логарифма числа
LOG2(A) = log2A^ (целая часть).
Пример 11.
По директиве .DB в сегменте CSEG записаны четыре константы, начиная с адреса NUM (пример 1). Фрагмент программы для чтения четвертой константы имеет вид:
LDI ZH, HIGH (2*(NUM+1))
LDI ZL, LOW (2*(NUM+1))
ADIW ZL, 1
LPM
Четвертая константа ($78) считана из FlashROM и находится в регистре общего назначения R0.
/79. Аппаратно-программные средства поддержки разработок на основе микроконтроллеров AVR фирмы Atmel (Р. Н. Золотухо)
Профессиональную разработку современных микроконтролерных устройств невозможно представить без использования средств поддержки.
1 16 Приложения
Фирма Atmel уделяет большое внимание вопросам технической поддержки, предлагая разработчикам как программные, так и различные аппаратные средства.
Данный раздел представляет собой обзор программных и аппаратных средств проддержки разработок для микроконтроллеров AVR, предлагаемых Atmel Corp, (аппаратно-программные средства поддержки микроконтроллеров AVR описаны также в [7]).
Программные средства поддержки разработок
Популярность микроконтроллеров AVR способствовала тому, что многие фирмы-производители программных средств поддержки микроконтроллеров (ассемблеров, компиляторов, отладчиков) создали программные пакеты поддержки AVR. Данный раздел содержит обзор программных средств, предлагаемых самой фирмой Atmel, и начинается со знакомства с основным программным пакетом — AVR Studio.
AVR Studio — это интегрированная отладочная среда разработки приложений (IDE) для микроконтроллеров семейства AVR (AT90S, ATmega, ATtiny) фирмы Atmel.
IDE AVR Studio содержит:
	транслятор языка ассемблера (Atmel AVR macroassembler)-,
	отладчик(£)е/>м££ег);
	программное обеспечение верхнего уровня для поддержки внутрисхемного программирования (In-System Programming, ISP).
Отладчик AVR Studio поддерживает все типы микроконтроллеров AVR и имеет два режима работы: режим программной симуляции и режим управления различными типами внутрисхемных эмуляторов (In-Circuit Emulators) производства фирмы Atmel. Важно отметить, что интерфейс пользователя не изменяется в зависимости от выбранного режима отладки.
Отладочная среда поддерживает выполнение программ как в виде ассемблерного текста, так и в виде исходного текста языка С.
Отладчик AVR Studio по формату обьектного файла совместим с ассемблерами фирм Atmel (AVR Assembler) и IAR Systems (EWA90-Assembler — ftp://www.atmel.com/pub/atmel/ewa90-a.zip).
По формату объектного файла ubrof AVR Studio совместим с компилятором С фирмы IAR Systems (ICCA90 С Compiler — wwrwiar.com). по формату coff — с компиляторами С фирм Imagecraft (ICCAVR и ICCtiny — http://www.imagecraft.com/software/index.html) и HP Infotech (CodeVisionAVR — http://infotech.ir.ro).
AVR Studio распространяется свободно, его последняя версия всегда доступна на сайте фирмы Atmel (http://wwwatmel.com/atmel/products/ prod203.htm).
Аппаратно-программные средства поддержки разработок
117
Создание и трансляция проекта
После запуска AVR Studio для создания нового проекта необходимо в меню Project выбрать команду New. В результате на экране появляется диалоговое окно (рис. П9.1), в котором необходимо ввести название проекта (Project name) и его расположение (Location). Новый проект удобнее создавать в отдельной папке.
Рис. П9.1. Окно создания нового проекта
Далее выбирается тип проекта:
	AVR Assembler. Использует встроенный макроассемблер A VR Studio.
	Generic 3D party С compiler. Использует внешний компилятор С, имеющий интерфейс командной строки.
При выборе пункта AVR Assembler после нажатия кнопки ОК на экране появляется окно организации проекта (рис. П9.2), показывающее все связанные с проектом файлы.
Рис. П9.2. Окно организации проекта
Далее к проекту должен быть добавлен файл программы на языке ассемблера. Это можно сделать разными способами: или в проект добавляется уже существующий файл с расширением .asm, или создается новый.
Для создания нового файла необходимо в этом окне выбрать группу Assembler Files и в меню Project выбрать пункт Add File. В открывшемся окне следует ввести название файла с расширением .asm. Если
118 Приложение
файл был создан ранее, то его необходимо найти на диске и двойныу щелчком мыши занести в строку "Имя файла".
Созданный (или найденный) таким образом файл будет помещен в группу Assembler Files в окне организации проекта. Подобным же образом можно подключить к проекту и другие ассемблерные файлы но группа Assembler Files может содержать только один файл, с которогс в дальнейшем будет начинатся трансляция проекта. Назовем этот фай/: входным ассемблерным файлом проекта. Значок этого файла в окне организатора проекта отмечен красной стрелкой, направленной вправо все другие файлы проекта будут отмечены синими стрелками, направленными вниз (рис. П9.3). Все файлы проекта должны быть включены во входной файл проекта с помощью ассемблерной директивы .include Для смены входного файла проекта на другой надо установить курсор мыши на нужный файл в окне организации проекта и щелкнуть правой кнопкой мыши. В открывшемся всплывающем окне надо указать этот файл как Assembler entry file.
Для того, чтобы в тексте ассемблерных файлов вместо адресов внутренних регистров микроконтроллера использовать их символические имена, нужно подключить к проекту файл, содержащий назначения символических имен всех регистров выбранного микроконтроллера (обычно его называют включаемым файлом), например m103def.inc. Включаемые файлы входят в прикладное программное обеспечение A VR Studio и при инсталляции помещаются в папку Appnotes в директории, где установлен AVR Studio.
Рис. П9.3. Окно организации проекта с подключенными файлами проекта
Для редактирования исходного текста программы необходимо в папке Assembler Files в окне организации проекта открыть нужный файл с расширением .asm. В открывшееся окно для редактирования файла можно с клавиатуры или через буфер компьютера ввести текст программы на языке ассемблера (рис. П9.4).
Перед трансляцией нужно задать установки проекта. В пункте меню Project выбирается Project Settings, и в открывшемся окне установок проекта указывается необходимый формат выходного файла. A VR Studio поддерживает следующие выходные форматы:
Аппаратно-программные средства поддержки разработок
119
 Object;
 Generic;
 Intel Intellec 8/MDS (Intel Hex);
 Motorola S-Record.
Рис. П9.4. Окно редактирования программы на языке ассемблера
Для отладки в AVR Studio необходим файл в формате Object (объектный файл). Однако большинство программаторов в качестве входных используют файлы в формате Intel Hex.
Далее осуществляется трансляция программы и проверка правильности ее написания. Выбирается пункт Assemble в меню Project. Открывшееся окно Project Output содержит сообщения ассемблера. В это окно выводится информация о количестве слов кода и данных, о наличии ошибок, и другая информация (рис. П9.5).
Рис. П9.5. Окно сообщений ассемблера
Для локализации ошибок трансляции в случае их наличия можно в окне сообщений ассемблера установить курсор мыши на сообщение об ошибке и два раза щелкнуть левой кнопкой мыши. При этом в окне
120
Приложения
редактирования исходного текста программы курсор будет установлен на строку, вызвавшую сообщение об ошибке, и эта строка будет выделена цветом.
В результате трансляции создается выходной файл в указанном формате. Если исходный ассемблерный текст содержал сегмент энергонезависимых данных (объявленный директивой .eseg), то при трансляции будет создан также файл с расширением .еер. Этот файл содержит данные для внутренней EEPROM микроконтроллера и имеет тот же формат, что и выходной файл.
Если в результате трансляции не выдается сообщений об ошибках, можно приступать к отладке проекта.
Режимы работы отладчика
Как уже говорилось, AVR Studio позволяет производить отладку приложений с использованием встроенного программного симулятора или внешнего внутрисхемного эмулятора. Когда пользователь запускает AVR Studio, программа проверяет наличие эмулятора на одном из последовательных портов компьютера. Если эмулятор найден, то он выбирается как базовая система отладки. Если эмулятор не найден, то отладка будет выполняться на встроенном программном симуляторе AVR.
Внутрисхемный эмулятор позволяет производить отладку приложения на реальной целевой плате. Следует помнить, что в режиме реального времени эмулятор работает существенно быстрее, чем программный симулятор.
Отметим еще раз, что независимо от режима работы отладчика, интерфейс A VR Studio не меняется. При переключении между различными режимами отладки все параметры среды сохраняются. Информация о текущем режиме отладчика выводится в строке состояния AVR Studio.
Отладка проекта при помощи программного симулятора
Для запуска отладчика необходимо выполнить процедуру Build and run, которая вызывается при нажатии на соответствующую кнопку на панели управления. Процедура Build and run выполняется в два этапа. Сперва происходит трансляция входного ассемблерного файла, при которой независимо от установок проекта, кроме выходного файла заданного формата генерируется и объектный файл. Затем этот объектный файл загружается в отладчик.
Для совместимости с прежними версиями в AVR Studio предусмотрен еще один вариант запуска отладчика — загрузка полученного в результате трансляции объектного файла (File -> Open). Но при этом пользователь не имеет возможности редактировать исходный текст программы непосредственно в отладчике. Кроме того, следует помнить, что для
Аппаратно-программные средства поддержки разработок
121
того, чтобы транслятор сгенерировал необходимый для запуска отладчика объектный файл, нужно в окне установок проекта указать в качестве формата выходного файла транслятора Object.
При первом для проекта запуске отладчика вызывается окно выбора целевого микроконтроллера (рис. П9.6).
Рис. П9.6. Окно выбора целевого микроконтроллера
В этом окне из списка выбирается нужный микроконтроллер (Device), например ATmegalO3, и тактовая частота процессорного ядра (Frequency). Опции Memory и Architecture при выборе стандартного устройства в окне не используются. Это же окно может быть вызвано в процессе работы отладчика (Options -> Simulator Options).
Экран AVR Studio в режиме отладки представлен на рис. П9.7.
г*! £« Эдо £abuc	Jjptana Sfw 1мг
'el О	3 Л 1 J W

Mil
'll' 1Г. ПС on IM> fi» no on no no ю no on nc no ОС ово «jess's» едмздмо&оазд'здсо J090 Об	X»Oa'OOOdOOt»0&OOG«»<J
ОСАО бС СЮ...OSлОДЖЖгШ
ЛС ОС ОС ОС QC ЭС 00 00 00 Г||) ЛО 00 Об ОС 00
FVSDeto
» EEFRDM Pmi A
-imxi
P-.rtC Port D Port F ‘ PortF
к»
fM&wre ' раме
Cyde-Cauntw ЙЕВбОВБЗ Z&gtas рМЙ ’ — 
RS—
A<Mr»VH !UC) k2b
шг
*•
- EK9G
R1S • 0x00 £tzd * 0x0$
и
R9 -та * ат Ш « &Ф8 R42 *8x66 RX3 » ОквЬ' ЙЛ4 - ОжОО
RZ? -OXOO
К2<
MC * ОхЗД Ml - MO








$Ыи» * ~	‘ Яммв ‘ &вШГ > ’ мл'
Рис. П9.7. Экран A VR Studio в режиме отладки
122
Приложение
При выполнении процедуры Build and run (или при загрузке объектного файла) автоматически открывается окно исходного текста исполняемой микроконтроллером программы. В окне отображается код, который выполняется в отладочном окружении (эмуляторе или программном симуляторе).
После выбора опций симулятора в левом поле окна ассемблерной программы появляется желтая стрелка, указывающая позицию программного счетчика микроконтроллера (рис. П9.8). Этот указатель всегдг находится на строке, которая будет выполнена в следующем цикле.
Рис. П9.8. Окно исходного текста программы в режиме отладки
Пользователь может выполнять программу полностью в пошаговом режиме, трассируя блоки функций или выполняя программу до того места, где стоит курсор. В дополнение можно определять неограниченное число точек останова, каждая из которых может быть включена или выключена. Точки останова сохраняются между сессиями работы.
В AVR Studio для отладки программы предусмотрены две команды пошагового режима: Step Over и Trace into. Разница между ними в том. что команда Step Over не работает в подпрограммах. С помощью команд пошагового режима можно проследить изменения значений в регистрах устройств ввода/вывода, памяти и регистрового файла. К командам шагового режима относятся также Auto Step и Multi Step. Выбрав в меню Debug пункт Debug Options, можно установить в открывшемся окне параметры режимов Auto Step и Multi Step, а также некоторые другие опции симулятора, речь о которых пойдет ниже.
Помимо пошагового режима, возможна отладка программы с использованием точек останова (Breakpoints). Командой Go запускается ис
Аппаратно-программные средства поддержки разработок
123
полнение программы. Программа будет выполняться до остановки пользователем или до обнаружения точки останова.
Для установки точки останова в AVR Studio служит пункт меню Breakpoints -> Toggle Breakpoint. Точка останова ставится в строке, отмеченной курсором (рис. П9.9).
Рис. П9.9. Точка останова в окне исходного текста программы в режиме отладки
Красная отметка в левом поле окна исходного текста программы показывает установленную точку останова.
В процессе отладки также можно выбрать пункт меню Debug -> Run То Cursor. При выборе этого пункта исполняемый код будет выполняется до достижения команды, обозначенной курсором. При этом, если отладчик обнаруживает точку останова, установленную ранее положения курсора, то останов будет выполнен только в случае его разрешения в окне Debug Option, в противном случае выполнение не приостанавливается. Если команда, обозначенная курсором, не достигается, отладчик продолжает исполнять код программы до тех пор, пока исполнение не будет прервано пользователем. Поскольку режим Run То Cursor зависит от позиции курсора, он доступен только при активном окне исходного текста.
Для остановки исполнения программы пользователем служит команда Break. В состоянии останова эта команда недоступна.
При отладке с использованием точек останова или если адрес останова указан курсором в окне исходного текста, модификация информации во всех окнах происходит только при достижении останова (или при прекращении исполнения программы пользователем).
124
Приложения
Пункт меняю Debug -> Reset выполняет сброс микроконтроллера Если программа при этом выполняется, то ее исполнение будет остановлено. После сброса информация во всех окнах модифицируется.
Для наблюдения за работой программы можно открыть несколькс окон, отображающих состояние различных узлов микроконтроллера Окна открываются нажатием соответствующих кнопок на панели инструментов или при выборе соответствующего пункта меню View.
Регистровый файл микроконтроллера AVR отображается в окне Registers (рис. П9.10). Если в процессе выполнения программы в очередном цикле значение какого-либо регистра изменится, то этот регистр будет выделен красным цветом. При этом, если в следующем цикле значение регистра останется прежним, то цветовое выделение будет снято. Такое же цветовое выделение реализовано в окнах устройств ввода/вывода, памяти и переменных.
НО
Ж
М
R6 R7 R8
R9
R10 R11 R12 R13
R14
R15
- 0x01 - охот « 0x01 » 0x00
= 0х4А . 0x00 » 0x40 = 0x00
» 0x02 » 0x00 ’ 0x00 - 0x01 < 0x 0 0 о 0x00 « 0x00 « 0x00 - 0x00
R30 = 0x01 R31 = 0x00
Рис. П9.10. Окно состояния регистрового файла.
Состояние встроенных периферийных устройств микроконтроллера отображено в окне I/O Window (рис. П9.11).
яю- £:•••

Наше	ГValue
yg CPU
• External Intenu. .
f.-0 Timer/CounterfJ
t “0 Г ивег/Counter 1

| Looabor>
WtRWRRiy » EEPROM S Port А £ Port В =£ Port С
t ^PortE A £ Port F +SM Interface
UART Interface
7 О АпЫодСояфш...
Рис. П9.11. Окно состояния устройств ввода вывода
Аппаратно-программные средства поддержки разработок
125
В этом окне отражаются все функциональные блоки микроконтроллера. Любой блок может быть раскрыт нажатием на его значок. При раскрытии блока в окне отражаются адреса и состояния всех его регистров и отдельных, доступных для модификации битов (рис. П9.12). Каждый доступный для модификации бит может быть установлен или сброшен как программой по ходу ее исполнения, так и пользователем вручную (указав курсором мыши нужный бит и щелкнув левой кнопкой мыши, пользователь может изменить значение бита на обратное) — в режиме программной симуляции это является способом имитации входного воздействия на микроконтроллер.
Рис. П9.12. Развернутый порт PORTB в окне устройств ввода/вывода
Другим способом задания входного воздействия на микроконтроллер в режиме симулятора является использование внешних файлов входных воздействий. Формат файла входного воздействия очень прост:
000000000:00
000000039:01
000000040:00
9999999999:FF
Здесь значение, указанное после разделителя ":— это шестнадцатеричное представление сигналов, воздействующих на порт микроконтроллера. Значение, указанное до разделителя, — это десятичный номер цикла (с момента сброса микроконтроллера), в котором указанное воздействие поступает на выводы порта микроконтроллера. Файл входного воздействия должен заканчиваться строкой с заведомо большим номером цикла, в противном случае будет выдано сообщение об ошибке. Для подключения файла входного воздействия служит пункт меню Options -> Simulator Port Stimuli. В открывшемся окне нужно указать порт микроконтроллера, на который нужно подавать воздействие, и файл этого воздействия. Пользователь может создавать файлы воздействий, записывать изменения значений на выходах портов микроконтроллера в файл (формат этого файла тот же, что и у файла входных воздействий). Для записи служит пункт меню Options -> Simulator Port Logging. В открывшемся окне нужно указать порт микроконтрол
126
Приложения
лера и имя файла для записи. Записываемый файл будет удаляться и создаваться вновь при каждом выполнении сброса микроконтроллера (Debug -> Reset). Подключать файл входного воздействия или задавать имя файла для записи пользователь должен сам при каждом запуске симулятора.
Для наблюдения за изменениями переменных предназначено окно Watch. Переменные, определенные в программе, могут быть отображены в этом окне. Если в процессе выполнения программы значения этих переменных будут изменяться, то все изменения можно будет наблюдать в этом окне (рис. П9.13).
Рис. П9.13. Окно просмотра переменных
Для индикации состояния программного счетчика, указателя стека, содержимого регистра статуса SREG и индексных регистров X, Y и Z в процессе отладки программы предназначено окно Processor (рис. П9.14).
Рис. П9.14. Окно состояния процессорного ядра
В этом же окне отображается текущее время выполнения программы и тактовая частота ядра микроконтроллера.
Просмотр ячеек памяти программ, памяти данных, EEPROM и регистров портов ввода/вывода в ходе исполнения программы возможно также с помощью диалогового окна Memory. Падающее меню диалогового окна позволяет выбрать один из четырех массивов ячеек памяти: Data, Ю, Eeprom, Program Memory. Для одновременного просмотра нескольких областей окно Memory может быть открыто несколько раз. Информация в диалоговом окне может быть представлена в виде байтов или в виде слов в шестнадцатеричной системе счисления, а также в виде ASCII-символов (рис. П9.15).
В процессе отладки пользователь может инициализировать внутреннее ОЗУ или EEPROM микроконтроллера (например, данными, содержащимися в полученном при трансляции файле .еер), или сохранить содержимое ОЗУ и EEPROM в виде файлов в формате Intel Hex. Для этого служит пункт меню File -> Up/Download Memory.
Аппаратно-программные средство поддержки разработок
12/

ОСС. Св 00 «А 4А 4А 4А 00 00 00 Q0 00 00 00 ОС 13	--3333 . Д
ОС"1 JU ОС 00 СО 03 00 00 00 00 СО ОТ 00 00 00 00 СО	..... 3
ОСД - JG 3? СО СТ СО 00 00 00 00 00 00 00 ОС ОС СО......
ОС”! СО 30 СС 00 00 00 00 00 00 00 00 ОТ 00 ОС 00 00	..
□ОАО 00 00 00 00 00 ОТ ОТ О? ОТ вО ОТ 00 ОТ ЙО 00 00	 -.
ООВО 00 00 00 00 00 ОТ ОТ 00 00 ОТ 00 ОТ 00 00 00 00	..
ООСО 00 00 00 00 00 ОТ ОТ 00 00 ОТ 00 ОТ 00 00 00 00	..
□ ODO 00 00 00 ОТ 00 00 От ОТ ОТ ОТ ОТ ОТ ОТ 00 00 00 .  -
□ОЕО 00 00 00 00 00 00 ОТ ОТ 00 ОТ ОТ ОТ 00 00 00 00 ..... У1
Рис. П9.15. Окно просмотра содержимого памяти
Для внесения изменений в программу в процессе отладки необходимо редактировать ее исходный текст. При попытке запуска симулятора на исполнение программы после редактирования на экране появляется окно, сообщающее об изменении программы и необходимости ее компиляции.
Для сохранения проекта необходимо воспользоваться пунктом меню Project -> Close. При закрытии проекта сохраняются все его настройки. Во время следующей загрузки настройки будут автоматически восстановлены.
Работая с программным симулятором пакета AVR Studio, следует помнить, что он пока не поддерживает некоторые режимы работы микроконтроллеров AVR и их периферийные узлы:
	аналого-цифровой преобразователь;
	аналоговый компаратор;
	режим часов реального времени;
	режим пониженного энергопотребления (инструкция "sleep" интерпретируется программным симулятором как "пор");
Возможно, в последующих версиях A VR Studio поддержка этих узлов и режимов будет реализована.
Как уже говорилось, кроме программного симулятора IDE AVR Studio включает в себя программное обеспечение верхнего уровня для управления аппаратными средствами поддержки разработок. Меню Tools содержит команды запуска управляющих программ. Особенности интерфейса и работы этих программ будут рассмотрены ниже.
Аппаратные средства поддержки разработок
Для аппаратной поддержки разработок на основе микроконтроллеров AVR фирма Atmel предлагает широкий спектр средств, которые можно классифицировать как по назначению, так и по стоимости внутри каждого класса. Можно выделить следующие классы аппаратных средств по их назначению:
	стартовые наборы разработчика {Starter Kits)',
	внутрисхемные эмуляторы {In-Circuit Emulators)',
	внутрисхемные программаторы {In-System Programmers)',
	специализированные наборы разработчика.
128
Приложения
Некоторые аппаратные средства являются универсальными и одновременно могут быть отнесены к нескольким классам, например к стартовым наборам разработчика и внутрисхемным программаторам.
Остановимся подробнее на назначении каждого из перечисленных классов и подробнее рассмотрим их состав.
Стартовые наборы разработчика
Применение стартовых наборов позволяет разработчику быстро, минуя этап макетирования, приступить к практической разработке приложений. На платах, входящих в состав стартовых наборов, установлены необходимые для работы микроконтроллера элементы "обвязки" (стабилизатор напряжения питания, тактовый генератор или кварцевый резонатор, цепь сброса, средства для организации внутрисхемного программирования микроконтроллера), а также часто применяемые на практике узлы микроконтроллерных устройств (средства ввода и индикации, формирователи линии RS-232, интерфейс с внешним ОЗУ и пр.). Все порты микроконтроллеров выведены на разъемы и могут быть соединены с внешними устройствами.
В некоторых случаях стартовые наборы разработчика могут использоваться как готовые блоки в составе проектируемой аппаратуры.
MCU00100
Этот стартовый набор разработчика был первым аппаратным средством, выпущенным фирмой Atmel для поддержки тогда еще нового семейства микроконтроллеров — AVR. MCU00100 позволял программировать и отлаживать приложения для микроконтроллеров AT90S1200, AT90S2313, AT90S2323, AT90S4414 и AT90S8515 (кроме перечисленных микроконтроллеров AVR MCU00100 поддерживал кристаллы семейства AT89S с возможностью внутрисхемного программирования — AT89S8252 и AT89S53). Сейчас MCU00100 снят с производства.
STK200
Следующей модификацией стартовых наборов разработчика для микроконтроллеров AVR явился STK200. Этот набор разработчика пользовался заслуженной популярностью и был широко распространен среди разработчиков. В настояцее время STK200 снят с производства и заменен более совершенными средствами.
В отличие от MCU00100, у которого функция программатора реализована на самой плате, STK200 состоит из двух частей — отладочной платы п загрузочного кабеля. Причем загрузочный кабель может использоваться отдельно от STK200 в качестве внутрисхемного программатора. Загрузочный кабель подключается к LPT-порту персонального компьютера. Для подключения загрузочного кабеля па плате
Аппаратно-программные средства поддержки разработок 129
STK200 предусмотрен 10-контактный разъем. Питание загрузочного кабеля осуществляется от целевой платы (в нашем случае от STK200).
Встроенный стабилизированный источник питания позволяет специальным переключателем устанавливать напряжение питания целевого микроконтроллера 5 В или 3,3 В.
Внутрисхемное программирование на STK200 осуществляется под управлением программы AVR ISP версий 2.4—2.65 (последующие версии AVR ISP не поддерживают STK200 и предназначены для работы со стартовым набором STK100). Под управлением AVR ISP v2.65 STK200 поддерживает следующие типы микроконтроллеров AVR (а также их модификации с напряжением питания 3,3 Вольта): AT90S1200, AT90S2313, AT90S2323, AT90S2333, AT90S2343, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, ATtiny22. STK200 комплектуется микроконтроллерами AT90S2323-10PC и AT90S8515-8PC.
На плате STK200 предусмотрены панели для установки микроконтроллеров в корпусах DIP с числом выводов 8, 20, 28, 40. Для тактирования микроконтроллеров на плате установлен кварцевый резонатор на 4МГц. Кроме того, установленный на плате специальный переключатель позволяет разорвать цепь внешней синхронизации для случаев, когда микроконтроллер (например AT90S1200) тактируется от внутреннего RC-генератора. Некоторые микроконтроллеры AVR (например AT90S4414, AT90S8515) имеют внешнюю мультиплексированную шину адреса/данных для подключения внешнего ОЗУ. Для этого на плате STK200 предусмотрены панели для установки внешнего ОЗУ в корпусе DIP28 и регистра-защелки младшего байта адреса в корпусе DIP20.
На адресное пространство внешнего ОЗУ могут быть отображены и другие устройства, например модуль жидкокристаллического индикатора с контроллером HD44780. Для подключения ЖКИ на плате STK200 предусмотрены соответствующий разъем и переменный резистор для регулировки контраста.
Смонтированная на плате STK200 схема контроля понижения напряжения питания (BrownOut Protection Circuit) вырабатывает сигнал сброса (Reset) микроконтроллера при снижении напряжения питания до установленного порога. При медленном снижении напряжения питания (например при выключении питания) микроконтроллеры AVR могут самопроизвольно войти в режим записи EEPROM. При этом могут быть потеряны данные, сохраненные ранее в ячейке EEPROM с нулевым адресом. Чтобы этого не произошло, надо обеспечить переход микроконтроллера в состояние сброса при выключении питания. Поэтому применение BroicnOut Protection для микроконтроллеров AVR де-факто является обязательным. В зависимости от значения напряжения питания порог срабатывания BrownOut Protection может быть задан специальным переключателем.
130
Приложения
Кроме рассмотренных выше, па плате STK200 установлены следующие типовые узлы микроконтроллерной системы:
	формирователь уровней сигналов интерфейса RS232;
	регулируемый источник опорного напряжения для встроенного АЦП;
	восемь кнопок и восемь светодиодов для организации ввода и отображения выходной информации.
Порты и сигналы управления микроконтроллеров выведены на разъемы и могут быть подключены к внешним устройствам
STK300
Этот набор по своему составу и возможностям идентичен рассмотренному выше STK200, но предназначен для макетирования и отладки устройств только на базе микроконтроллера ATmegalO3. STK300 комплектуется микроконтроллером AtmegalO3L-4AC, распаянным на специальном переходнике для удобства его замены.
Для создания приложений на основе платы STK300 фирма Atmel предлагает утилиту Application Builder (http://www.atmel.com/atmel/ products/prod203.htm). Пользуясь Application Builder, разработчик может с помощью графического интерфейса сконфигурировать все узлы микроконтроллера ATmegalO3 и сохранить свои действия в виде процедур инициализации на языках Ассемблера или С.
Загрузочный кабель STK300 может также использоваться отдельно в качестве внутрисхемного программатора.
STK100
Набор предназначен для макетирования и отладки устройств на базе микроконтроллеров семейства ATtiny и АТ90. Поддерживаются следующие микроконтроллеры: ATtinylO, ATtinyl 1, ATtiny 12, ATtinyl5, ATtiny22, ATtiny28, AT90S2323, AT90S2333, AT90S2343, AT90S4433. В состав набора входят кристаллы ATtinyl 1-6РС и AT90S2343-10PC.
STK100 работает под управлением программы AVR ISP v3.31, которая обеспечивает связь с персональным компьютером как через LPT-, так и через COM-порт. STK100 также может быть использован в качестве внешнего внутрисхемного программатора для разрабатываемых устройств. В настоящее время STK100 снят с производства.
STK500/STK501
Из всех стартовых наборов разработчика, предлагаемых фирмой Atmel, наиболее универсальным устройством является STK500. Универсальность STK500 позволяет использовать его как отладочную плату, как параллельный программатор (для всех типов микроконтроллеров AVR) и как последовательный внутрисхемный программатор (для микроконтроллеров AVR, имеющих режим последовательного внутрисхемного программирования).
130
Приложения
Кроме рассмотренных выше, па плате STK200 установлены следующие типовые узлы микроконтроллерной системы:
	формирователь уровней сигналов интерфейса RS232;
	регулируемый источник опорного напряжения для встроенного АЦП:
	восемь кнопок и восемь светодиодов для организации ввода и отображения выходной информации.
Порты и сигналы управления микроконтроллеров выведены на разъемы и могут быть подключены к внешним устройствам
STK300
Этот набор по своему составу и возможностям идентичен рассмотренному выше STK200, но предназначен для макетирования и отладки устройств только на базе микроконтроллера ATmegalO3. STK300 комплектуется микроконтроллером AtmegalO3L-4AC, распаянным на специальном переходнике для удобства его замены.
Для создания приложений на основе платы STK300 фирма Atmel предлагает утилиту Application Builder (http://www.atmel.com/atmel/ products/prod203.htm). Пользуясь Application Builder, разработчик может с помощью графического интерфейса сконфигурировать все узлы микроконтроллера ATmegalO3 и сохранить свои действия в виде процедур инициализации на языках Ассемблера или С.
Загрузочный кабель STK300 может также использоваться отдельно в качестве внутрисхемного программатора.
STK100
Набор предназначен для макетирования и отладки устройств на базе микроконтроллеров семейства ATtiny и АТ90. Поддерживаются следующие микроконтроллеры: ATtinvlO, ATtinvll, ATtinyl2, ATtinyl5, ATtiny22, ATtiny28, AT90S2323, AT90S2333, AT90S2343/AT90S4433. В состав набора входят кристаллы ATtinyll-6PC и AT90S2343-10PC.
STK100 работает под управлением программы AVR ISP v3.31, которая обеспечивает связь с персональным компьютером как через LPT-, так и через COM-порт. STK100 также может быть использован в качестве внешнего внутрисхемного программатора для разрабатываемых устройств. В настоящее время STK100 снят с производства.
STK500/STK501
Из всех стартовых наборов разработчика, предлагаемых фирмой Atmel, наиболее универсальным устройством является STK500. Универсальность STK500 позволяет использовать его как отладочную плату, как параллельный программатор (для всех типов микроконтроллеров AVR) и как последовательный внутрисхемный программатор (для микроконтроллеров AVR, имеющих режим последовательного внутрисхемного программирования).
Аппаратно-программные средства поддержки разработок
131
Это устройство поддерживает все выпускающиеся на сегодняшний день микроконтроллеры AVR (для поддержки микроконтроллеров, выпускаемых только в корпусах TQFP64, например ATmegalO3 или ATmega 128, нужна плата расширения STK501).
Функции внутрисхемного программирования и управления STK500 реализованы на двух микроконтроллерах: AT90S1200-12SC и AT90S8535-8AC. Кроме них, на плате STK500 смонтированы следующие устройства:
	панели для установки микроконтроллеров в корпусах DIP8, DIP20, DIP28 и DIP40;
	стабилизированный источник питания с управляемым программно выходным напряжением;
	преобразователи уровней сигналов (для случая, когда напряжение питания целевого микроконтроллера отличается от напряжения питания управляющих микроконтроллеров);
	управляемый программно источник опорного напряжения для внутреннего АЦП микроконтроллера;
	микросхема DataFlash AT45D021;
	двухканальный формирователь уровней сигналов интерфейса RS232 (один канал используется для связи STK500 с управляющим персональным компьютером, другой может быть использован в разрабатываемом приложении);
	восемь кнопок и восемь светодиодов для организации ввода и отображения выходной информации;
	разъемы расширения для подключения внешних устройств.
Для тактирования отлаживаемых микроконтроллеров на плате STK500 предусмотрены два источника тактовых сигналов.
Один из них представляет собой генератор, построенный на инвертирующих вентилях с кварцевой стабилизацией частоты. Пользователь имеет возможность задавать частоту этого генератора, устанавливая кварцевый резонатор на необходимую частоту в специальную панель.
Второй источник тактовых сигналов представляет собой выход установленного на плате STK500 управляющего микроконтроллера AT90S8535-8AC. Частота этого тактового сигнала может быть задана программно.
Переключатель OSCSEL служит для выбора одного из источников тактового сигнала для микроконтроллера. Если же в качестве тактового необходимо использовать внутренний RC-генератор микроконтроллера, то внешний тактовый сигнал должен быть отключен джампером XTAL1.
В отличие от STK200 и STK300, на плате STK500 не предусмотрено подключение к целевому микроконтроллеру внешнего ОЗУ.
Управление STK500 происходит через COM-порт персонального компьютера. Управляющая программа является составной частью AVR Studio и запускается из меню Tools -> STK500/AVRISP/JTAGICE. Кро-
Аппаратно-программные средства поддержки разработок
133
Кроме того, в AVR Studio предусмотрена возможность обновления прошивки (firmware} памяти программ управляющих микроконтроллеров (Revision Upgrade). Обновленные версии firmware включаются в состав AVR Studio как прикладное программное обеспечение. При запуске управляющая программа проверяет связь COM-порта персонального компьютера с STK500 и в случае его присутствия запрашивает версию firmware. Если в AVR Studio содержится более новая версия прошивки, управляющая программа предлагает обновить firmware путем перепрограммирования управляющих микроконтроллеров. Для входа в режим перепрограммирования надо, чтобы в момент включения питания на плате STK500 была нажата кнопка Program.
Для поддержки микроконтроллеров типа ATmegalO3 и ATmegal28 фирма Atmel предлагает устройство STK501, которое устанавливается в разъемы расширения STK500 как мезонинная плата. На плате STK501 размещены:
	панель с нулевым усилием (ZIF socket) для подключения микроконтроллеров ATmegalO3 и ATmegal28 в корпусах типа TQFP64;
	дополнительный порт RS232 с поддержкой линий RTS/CTS;
	кварцевый резонатор на 32 кГц для реализации часов реального времени {Real-Time Clock, RTC);
	посадочное место под корпус типа TQFP64 для припайки адаптера внутрисхемного эмулятора megalCE пли ICE30;
	разъем JTAG-интерфейса для подключения внутрисхемного эмулятора JTAGICE (только для микроконтроллера ATmegal28).
Кристаллы ATmegalO3 и ATmegal28 имеют больше портов ввода-вывода, чем все остальные микроконтроллеры AVR, и, соответственно, больше, чем поддерживает STK500. Поэтому порты Е, F, G, а также некоторые управляющие сигналы, которые есть только у ATmegalO3 и ATmegal28, выведены на разъемы на плате STK501.
Комбинация STK500 и STK501 поддерживает для ATmegalO3 и ATmegal28 как режим внутрисхемного последовательного программирования, так и режим параллельного программирования с использованием повышенного программирующего напряжения.
Как уже говорилось, стартовый набор разработчика STK500 не поддерживает работу микроконтроллера с внешним ОЗУ. Разработчики STK501 исправили этот недостаток, предусмотрев на плате STK501 посадочное место под микросхему ОЗУ объемом 128 кх8 в корпусах TSOP32 пли SOJ32 и регистр-защелку младшего байта адреса. При этом STK501 без установленного микроконтроллера может служить платой расширения для STK500, позволяющей создавать и отлаживать проекты для микроконтроллеров AT90S8515 пли ATmegal61 с использованием внешней памяти данных.
134
Приложения
Внутрисхемные эмуляторы
Принцип внутрисхемной эмуляции состоит в замене целевого микроконтроллера неким устройством, поведение которого с точки зрения отлаживаемой системы соответствует поведению целевого микроконтроллера. Это устройство, называемое внутрисхемным эмулятором, должно не только адекватно отражать поведение целевого микроконтроллера, но и предоставлять разработчику возможность управления процессом отладки и контроля за состоянием реальной отлаживаемой микропроцессорной системы. Для управления процессом отладки при использовании современных внутрисхемных эмуляторов, как правило, используется персональный компьютер с соответствующим программным обеспечением.
Фирма Atmel предлагает разработчикам довольно широкий выбор средств внутрисхемной эмуляции, различных как по возможностям, так и по стоимости. Все предлагаемые внутрисхемные эмуляторы работают под управлением пакета AVR Studio. При этом интерфейс пользователя остается неизменным вне зависимости от того, какой тип внутрисхемного эмулятора используется.
Использование внутрисхемных эмуляторов позволяет отлаживать приложения, в которых задействованы периферийные узлы и режимы микроконтроллеров, поддержка которых отсутствует в программном симуляторе.
ICEPRO/ICE10
ICEPRO представляет собой классический внутрисхемный эмулятор. Он поддерживает следующие типы микроконтроллеров: ATtinylO, АТ-tinyll, ATtinyl2, ATtiny22, ATtiny28, AT90S1200, AT90S2313, AT90S2323, AT90S2343, AT90S4414, AT90S8515, AT90S4434, AT90S8535, AT90S2333, AT90S4433.
Управление ICEPRO осуществляется через COM-порт персонального компьютера. ICEPRO содержит внутренний стабилизатор питающего напряжения, поэтому питание внутрисхемного эмулятора может осуществляться от источника нестабилпзированного напряжения 9—15 вольт.
Подключение ICEPRO к отлаживаемому устройству осуществляется при помощи выносной платы ATADCPOD, которая, в свою очередь, соединяется с отлаживаемыми устройствами при помощи плоских кабелей (все поддерживаемые микроконтроллеры разделены на группы, и каждой группе соответствует свой разъем на выносной плате и свой плоский кабель). На выносной плате установлены несколько переключателей и перемычек, с помощью которых производится конфигурирование ICEPRO.
Аппаратно-программные средства поддержки разработок
135
Состояние этих переключателей и перемычек определяет:
	наличие или отсутствие у целевого микроконтроллера аналого-цифрового преобразователя;
	наличие или отсутствие в отлаживаемой системе внешнего ОЗУ даных;
	источник питания для отлаживаемого устройства;
	источник тактового сигнала для отлаживаемой системы.
В качестве тактового может быть выбран либо генератор, расположенный на плате отлаживаемого устройства, либо сам внутрисхемный эмулятор. В последнем случае предусмотрена возможность программного управления частотой тактового сигнала из AVR Studio.
Если отлаживаемое устройство нс имеет своего собственного источника питания, то в процессе отладки питание его может осуществляться от внутрисхемного эмулятора (однако при этом следует помнить об ограничении по потребляемому отлаживаемым устройством току).
ICEPRO поддерживает неограниченное число программных точек останова (то есть точек останова, заданных в AVR Studio). Помимо этого ICEPRO имеет пять входов аппаратного останова (Trigger Inputs). Эти входы могут использоваться для прерывания исполнения программы по какому-либо внешнему событию. Для поддержки отладки сложных систем в ICEPRO предусмотрены пять спнхровыходов (Trigger Outputs). Подобно программной точке останова, пользователь может в AVR Studio задать точку генерации синхрособытия. При выполнении внутрисхемным эмулятором команды, соответствующей этой точке, на выбранном синхровыходе будет сформирован импульс. Этот импульс может быть использован для синхронизации каких-либо внешних устройств.
Еще одной из удобных функций, реализованных в ICEPRO, является возможность записи трассы, то есть сохранение последовательности исполнения инструкций микроконтроллером. Анализ записанной трассы позволяет выявить участки кода, исполнение которых по тем или иным причинам не происходит (Code Coverage Analysis). Такой анализ очень полезен при отладке программ, содержащих несколько процедур обработки прерываний, особенно если вложенность прерываний не разрешена.
При необходимости использования комплексной отладки в ICEPRO предусмотрен разъем для подключения логического анализатора.
С ростом номенклатуры микроконтроллеров AVR внутрисхемный эмулятор ICEPRO был заменен на более новую модель ICE 10.
Возможности ICE 10 расширены за счет поддержки еще одного микроконтроллера — ATtiny 15. Для этого микроконтроллера разработана специальная выносная плата — ATtiny 15POD. Эта выносная плата содержит четырехканальный десятиразрядный аналого-цифровой преобразователь (один из каналов которого может быть сконфигурирован как дифференциальный) и отключаемый предусилитель. Конфигурация
136
Приложения
ATtinyl5POD осуществляется только под управлением пакета AVR Studio, переключатели для ручной конфигурации на этой выносной плате отсутствуют.
megaICE/ICE30/ICE50
Внутрисхемный эмулятор megalCE и внешне и функционально очень похож на рассмотренный выше ICEPRO. Отличие заключается только в том, что megalCE был предназначен только для внутрисхемной эмуляции одного типа микроконтроллера — ATmegalO3 и, соответственно, имел другую выносную плату (ATmegaPOD). С ростом номенклатуры семейства ATmega внутрисхемный эмулятор megalCE был заменен на более новую модель ICE30.
Внутрисхемный эмулятор ICE30 поддерживает следующие микроконтроллеры семейства ATmega: ATmegalO3, ATmegal61, ATmegal63, ATmega83 и ATmega32. Расширилось и количество используемых с ICE30 выносных плат. Для поддержки мпкрокоптролеров ATmegalO3 используется выносная плата ATmegaPOD (то есть та же, что и в эмуляторе megalCE). Поддержка микроконтролеров ATmegal61 осуществляется с использованием уже знакомой выносной платы ATADCPOD. А для оставшихся микроконтроллеров — ATmega 163, ATmega83 и ATmega32 — разработана новая выносная плата ATmegal63POD.
В настоящее время планируется замена ICE30 на усовершенствованный внутрисхемный эмулятор ICE50.
ICE200
Другим вариантом построения внутрисхемных эмуляторов является использование так называемых отладочных кристаллов. Отладочный кристалл представляет собой микросхему, содержащую то же процессорное ядро и набор периферийных устройств, и выполненную по той же технологии, что и целевой микроконтроллер. Но, в отличие от последнего, отладочный кристалл содержит узлы, позволяющие осуществлять доступ к его внутренним ресурсам извне, и, таким образом, управлять процессом отладки.
ICE200 представляет собой внутрисхемный эмулятор, построенный на основе отладочного кристалла. Преимущества построения внутрисхемного эмулятора на основе отладочного кристалла заключается в более точном соответствии поведения эмулятора и целевого микроконтроллера, а также в удешевлении такого внутрисхемного эмулятора по сравнению с классическим (поскольку отладочные кристаллы могут считаться стандартой продукцией микроэлектроники). Память программ отладочного кристалла ICE200 реализована на внешнем статическом ОЗУ. Исполняемый код загружается в ОЗУ памяти программ при запуске отладчика AVR Studio в режиме поддержки внутрисхемного эмулятора ICE200.
Аппаратно-программные средства поддержки разработок
13/
ICE200 поддержитвает следующие микроконтроллеры AVR: АТ-tinylO, ATtinyl 1, ATtinvl2, AT90S1200, AT90S2313, AT90S4414, AT90S8515, AT90S4434, AT90S8535, AT90S2333, AT90S4433. Причем поддерживаются как микроконтроллеры с напряжением питания 5 В, так и микроконтроллеры с напряжением питания 2,7 В — 3,6 В.
При разработке ICE200 специалисты фирмы Atmel стремились создать внутрисхемный эмулятор, доступный самому широкому кругу разработчиков. Для оптимального соотношения цена — функциональность решено отказаться от некоторых функций, реализованных в ранних моделях внутрисхемных эмуляторов Atmel (например ICEPRO). В ICE200 отсутствуют входы аппаратного останова и выходы синхронизации, а также не поддерживается режим записи трассы при выполнении отлаживаемой программы.
На сегодняшний день ICE200 является самым популярным внутрисхемным эмулятором, предлагаемым Atmel Corp.
Внутрисхемный эмулятор ICE200 представляет собой модульную конструкцию и состоит из:
	выносной платы с установленным на ней отладочным кристаллом; в тестовой панели;
	платы управления;
	набора адаптеров.
Отладочный кристалл является универсальным, то есть поддерживает эмуляцию всех перечисленных микроконтроллеров. Для каждого конкретного типа микроконтроллеров существует свой адаптер, служащий для подключения выносной платы (с установленным на ней отладочным кристаллом) к целевому устройству. По типу подключенного адаптера ICE200 автоматически определяет, какой микроконтроллер будет эмулироваться.
Связь выносной платы с платой управления осуществляется двумя плоскими кабелями. На плате управления смонтрованы следующие узлы:
	блок управления процессом отладки, реализованный на микроконтроллере AT90S8515-8AC и программируемой логической интегральной схеме (ПЛИС) ATF1504- 10JC44;
	статическое ОЗУ (внешняя память программ отладочного кристалла);
	стабилизированный источник напряжения питания;
	формирователь уровней сигналов интерфейса RS232 для связи с персональным компьютером.
Плата управления ICE200 связывается с персональным компьютером через СОМ-порт.
В ICE200 реализован режим диагностики узлов внутрисхемного эмулятора. Для осуществления диагностики надо установить тестовую панель на плату отладочного кристалла и в AVR Studio выбрать пункт
138
Приложения
меню Tools -> ICE200 Diagnostic. В результате этого откроется окно, в котором отображены все этапы диагностики (рис. П9.17).
Diagnostic
OiagnMbc Twt RoufoM
ЯгШййг	''  • '   г??	;
I* АТ9068515	------yj
Р ATX6BS35	Г Log»*
Р АТ9СМ433
Р AT90S2313 Р ATtayli Р ДОС Р РгодатСал* Р 1/0
. Р EuteinflftMtf F Disconnect
Рис. П9.17. Окно диагностики узлов и режимов внутрисхемного эмулятора ICE200
После запуска процесса диагностирования (кнопка Run) последовательно проверяются все узлы и режимы внутрисхемного эмулятора. Если при этом определяется, что микроконтроллер и ПЛИС на плате управления содержат устаревшие варианты прошивки, то программа диагностики предложит автоматически обновить конфигурацию ПЛИС и памяти программ микроконтроллера.
Для отладки с помощью ICE200 устройств, содержащих микроконтроллеры AVR, выполненные в корпусах для поверхностного монтажа, фирма Atmel предлагает дополнительный набор адаптеров ATAVRSMD. Этот набор содержит адаптеры двух типов: целевые и специализированные. Целевой адаптер припаивается на плату отлаживаемого устройства вместо микроконтроллера, а специализированный адаптер служит переходником между целевым адаптером и платой, на которой установлен отладочный кристалл. ATAVRSMD содержит по два целевых адаптера для корпусов типа SOIC8, PLCC44 и TQFP44.
JTAGICE
Альтернативой внутрисхемной эмуляции является режим фоновой отладки. В англоязычной литературе этот режим обозначается термином "On-Chip Debugging', или OCD.
Разница между внутрисхемной эмуляцией и фоновой отладкой заключается в следующем. Внутрисхемный эмулятор с той или иной степенью достоверности имитирует поведение целевого микроконтроллера в отлаживаемой системе, в то время как в режиме фоновой отладки программный код исполняется самим целевым микроконтроллером и, таким образом, достигается полное совпадение временных и электрических параметров системы в отладочном и штатном режимах.
Для поддержки режима "On-Chip Debugging' блок управления отладкой должен быть частью самого отлаживаемого микроконтроллера. В новые микроконтроллеры семейства ATmega (например ATmegal28,
Аппаратно-программные средства поддержки разработок
I jy
ATmega323, ATmega 16) встроен блок OCD. Исполнение программного кода и доступ ко всем регистрами микроконтроллера в режиме фоновой отладки осуществляется под управлением этого блока.
Управление фоновой отладкой в микроконтроллерах AVR осуществляется по JTAG-иптерфейсу, совместимому со стандартом IEEE1149.1. Устройством, реализующим протокол управления, является JTAGICE.
Так же, как и рассмотренные выше внутрисхемные эмуляторы, JTAGICE подключается к COM-порту персонального компьютера. Управляющая программа является составной частью AYR Studio, и запускается соответствующей командой из меню Tools.
Кроме обеспечения режима фоновой отладки, JTAGICE может быть использован в качестве внутрисхемного программатора для микроконтроллеров AVR, имеющих JTAG-интерфейс.
Более подробное описание JTAGICE доступно на сайте Atmel по ссылке http://vvww.atmel.com/atmel/acrobat/doc2475.pdf.
Внутрисхемные программаторы
Как уже говорилось, микроконтроллеры AVR имеют несколько режимов программирования: параллельный режим с использованием повышенного программирующего напряжения, последовательный режим с использованием повышенного программирующего напряжения и режим внутрисхемного последовательного программирования.
Возможность внутрисхемного программирования микроконтроллеров AVR по последовательному синхронному интерфейсу SPI позволяет создавать простые и недорогие программаторы. Такие программаторы называют внутрисхемными {In-System Programmer, ISP).
AT90ISP
AT90ISP — простой внутрисхемный программатор, реализованный на микроконтроллере AT90S1200-12SC.
AT90ISP был первым внутрисхемным программатором, предложенным Atmel Corp. Первая версия прошивки (firmware) для микроконтроллера AT90S1200 позволяла осуществлять внутрисхемное программирование всего нескольких типов микроконтроллеров AVR (AT90S1200, AT90S2313, AT90S4414, AT90S8515) и одного микроконтроллера семейства AT89S — AT89S8252. С появлением новых типов микроконтроллеров AVR появилась необходимость усовершенствования firmware, и последняя версия прошивки (v2.2) поддерживает гораздо более широкую номенклатуру микроконтроллеров AVR (ATtiny 12, АТ-tinyl5, AT90S1200, AT90S2313, AT90S2323, AT90S2333, AT90S2343, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, ATmega83, ATmegalO3, ATmegal61, ATmegal63). Поддержка микроконтроллеров семейства АТ89 из последней версии firmware исключена.
140
Приложен»;
AT90ISP подключается к COM-порту персонального компьютер^.
Питание AT90ISP осуществляется от целевого устройства. Схем. AT90ISP представлена на рис. П9.18.
TRANSMIT
RECEIVE
1.0uF
20V
BC857C
Q100
20
2
RxO 3 TXD
D100
R105
BAS 16
ClOO
BC647C ОКИ
CKM и 100N
AT90S120G
/4 vcc RESET PDO PD1 PD2ANT0 PD3 РОД PDS PD6 XTAL1
10
12
13
GND AINO/PBO A1N1/PB1
PB2
PB3
PB4
PBS
PB6
РЙ7
XTAL2 Ни
6
U100
R106
4 MHZ
XCtOO
15 16 1?
18
19 4
CONNECTOR AS SEEN FROM BELOW
J101
vcc
02
MOSI
-04
GNO
06
MISO
sck
RESET
GND
Рис. П9.18. Схема AT90ISP
Описание AT90ISP можно найти на сайте Atmel по ссылке http:/ www.atmel.com/atmel/acrobat/doc0943.pdf. По адресу ftp://www.atmel.com pub/atmel/avr910.asm можно найти исходный ассемблерный текст одной из первых версий прошивки микроконтроллера AT90S1200.
Как и стартовый набор MCU00100, AT90ISP работает под управлением прграммы AVRProg (последняя версия — vl.33). Как уже говорилось, AVRProg является составной частью пакета AVR Studio. Для запуска этой программы нужно выполнить команду AVR Prog из меню Tools. Однако AVRProg может быть установлен и как автономная программа. Дистрибутив AVRProg доступен на сайте Atmek. ftp://www.at-mel.com/pub/atmel/aprogwin.exe.
Рабочее окно программы AVRProg представлено на рис. П9.19.
Рис. П9.19. Рабочее окно программы AVRProg
Аппаратно-программные средства поддержки разработок 141
Установив тип целевого микроконтроллера, пользователь может производить стирание, чтение и запись как памяти программ (Flash), так и энергонезависимой памяти данных (EEPROM). Установив курсор на кнопку Advanced и щелкнув левой кнопкой мыши, пользователь может войти (рис. П9.20) в режим установки битов защиты от несанкционированного считывания содержимого памяти программ микроконтроллера (Lock bits) и управляющих битов (Fuse bits).
Рис. П9.20. Программа AVRProg — режим установки управляющих битов и битов защиты
В настоящее время AT90ISP снят с производства и заменен на более современное средство — ATAVRISP.
ATAVRISP
ATAVRISP является самым новым внутрисхемным программатором, предлагаемым фирмой Atmel. ATAVRISP поддерживает все выпускаемые на сегодняшний день микроконтроллеры AVR, имеющие функцию внутрисхемного программирования. Управление этим внутрисхемным программатором осуществляется через COM-порт персонального компьютера. Питание на ATAVRISP подается от целевого устройства.
Подобно стартовому набору разработчика STK500, внутрисхемный программатор ATAVRISP реализован на двух микроконтроллерах — AT90S1200-12SC и AT90S8535-8AC, и работает под управлением той же, входящей в состав AVR Studio, программы.
Выбрав одну из закладок в окне управляющей программы, пользователь получает доступ к различным функциям программирования:
142
Приложения
	Program. Окно управляющей программы в этом режиме представлено на рис. П9.21. Здесь пользователь указывает тип целевого микроконтроллера (Device), режим программирования (в нашем случае ISP), а также файлы, содержащие данные для программирования Flash-ПЗУ и EEPROM микроконтроллера. Здесь же пользователь может указать управляющей программе автоматически производить стирание памяти программ микроконтроллера перед очередным программированием и верификацию — после.
	Fuses. Позоляет считать состояние управляющих битов микроконтроллера, и, при необходимости, запрограммировать их.
	LockBits. Предоставляет доступ к битам защиты памяти программ микроконтроллера от несанкционированного считывания или модификации.
	Advanced. Позволяет считать сигнатуру целевого микроконтроллера. Здесь же может быть задано значение калибровочного байта для внутреннего RC-генератора микроконтроллера.
	Board. Эта закладка предназначена, в основном, для управления STK500. В последующих версиях AVR Studio будет предусмотрена возможность обновления прошивки (firmware} памяти программ микроконтроллеров, на которых построен ATAVRISP.
	Auto. Позволяет выбрать несколько функций программирования и верификации и запускать их в пакетном режиме.
Рис. П9.21. Окно управляющей программы внутрисхемного программатора ATAVRISP
При каждом переключении с одной закладки на другую управляющая программа проверяет связь компьютера с внутрисхемным программа
Аппаратно-программные средства поддержки разработок
143
тором. Если внутрисхемный программатор не отвечает на запрос компьютера, в поле сообщений окна управляющей программы выдается соответствующее предупреждение.
Отличительной чертой ATAVRISP является то, что этот внутрисхемный программатор совместим с обоими стандартными разъемами для подключения к целевому устройству — с шестпконтактным (как у AT90ISP) и с десятиконтактным (как у загрузочного кабеля из набора STK200 или STK300).
Прочие средства внутрисхемного
программирования микроконтроллеров AVR
Используемый для внутрисхемного программирования микроконтроллеров AVR последовательный интерфейс SPI может быть довольно просто эмулирован несколькими разрядами стандартного LPT-порта персонального компьютера.
Выше уже говорилось, что в качестве внутрисхемного программатора для микроконтроллеров AVR может быть использован загрузочный кабель из стартового набора разработчика STK200/STK300, подключаемый к LPT-порту персонального компьютера и работающий под управлением программы AVR 1SP версии 2.65 (по ссылке http://www.avr-forum.com/ avr2 65.zip эта программа доступна в Интернете). К числу наиболее популярных программ, реализующих протокол внутрисхемного программирования через LPT-порт персонального компьютера, можно также отнести АVReal (автор Александр Редчук, http://ln.com.ua/~real/avreal). или PonyProg (автор Клаудио Ланконелли, http://w\vwlancos.com/ ppwin95.html).
Нельзя не упомянуть и о существующих разработках внутрисхемных программаторов, управляемых, подобно AT90ISP или ATAVRISP, через COM-порт персонального компьютера — например, о внутрисхемном программаторе "Жгучий кабель" (автор Станислав Лещинский, http:// www.atmel.ru/Hardware/Harciware5.htm).
Специализированные наборы разработчика
Кроме рассмотренных выше аппаратных средств фирма Atmel предлагает также специализированные наборы разработчика, предназначенные для реализации конкретных целевых приложений. Без упоминания об этих специализированных наборах обзор аппаратно-программных средств подержки разработок, предлагаемых фирмой Atmel, не был бы полным.
В настоящее время Atmel предлагает два таких специализированных набора:
	AT90EIT1 — этот набор предназначен для разработки и макетирования встраиваемых web-серверов на основе микроконтроллера ATmega 103. Физический уровень Ethernet реализован на микро
144
Приложения
схеме CS8900 фирмы CimisLogic. Прикладное программное обеспечение полностью поддерживает протокол TCP/IP. Подробное описание, а также статьи о применении AT90EIT1 можно найти на сайте Atmel Corp, по ссылке: http:/Avww.atmel.com/atmel/acrobat/ doc2396.pdf;
	AT90BCKIT — предназначен для разработки зарядных устройств для различных типов аккумуляторных батарей. Зарядное устройства может быть реализовано на основе одного из трех микроконтроллеров AVR: AT90S2333, AT90S4433 или ATtinyl5. Входящее в состав специализированного набора прикладное программное обеспечение реализует алгоритмы зарядки различных типов аккумуляторов — никель-кадмиевых (NiCd), никель-металл-гидрпдных (NiMH) и литий-ионных (Li-Ion).
Детальное описание специализированных наборов разработчика невозможно без глубокого понимания всех аспектов тех целевых приложений, для реализации которых предназначен тот или иной набор. Поэтому в рамках настоящего раздела даные средства подробно не рассматриваются.
П10. Примеры программ для микроконтроллеров семейства AVR (Т. И. Кривченко)
Предлагаемые ниже тексты учебных программ являются примерами выполнения типовых операций на AVR и позволяют быстро познакомиться с аппаратными ресурсами отладочного комплекта STK500. Программы построены таким образом, что каждый новый проект является развитием предыдущего. Подпрограммы, повторяющиеся от примера к примеру, приводятся только в первый раз.
П10.1. Led.asm — простейшая программа, знакомит с общей структурой построения проекта на ассемблере, обращает внимание на обязательность инициализации указателя стека в начале программы, демонстрирует способы организации циклов и вызова подпрограмм.
Присоедините блок из 8 светодиодов на STK500 плоским кабелем к разъему порта В. Логический "О" па выводах AVR будет соответствовать включенному состоянию светодиодов.
Программа LED.ASM генерирует на выводах порта В двоичную счетную последовательность. Для того, чтобы при помощи светодиодов наблюдать эту последовательность визуально, в программе вводится задержка.
СОВЕТ. При отладке программы в симуляторе AVRSTUDIO закомментируйте вызов подпрограммы задержки.
Примеры программ для микроконтроллеров семейства AVR
145
ПРОГРАММА LED.ASM
.include "8515def.inc" Подключить файл описаний имен ;регистров ввода/вывода
:Инициализация
Idi г31,LOW(RAMEND) out spl, г31 Idi г31,HIGH(RAMEND) out sph, r31	Инициализация указателя стека для AVR, имеющих программный стек,обязательно выполняется ;в начале программы
Idi r31,$ff out ddrb, r31	Программирование порта В на вывод
бесконечный цикл
Loop:
inc г16
out portb,г16 rcall wait rjmp Loop
;Регистр г16 используется как двоичный ;счетчик.
;Вывести содержимое г16 в порт В
;Вызов подпрограммы задержки
;Возврат на метку Loop
Подпрограмма задержки			
wait: m:	Idi г17,100 Idi г18,255	;Внешний цикл m выполняется 100	раз
ml:	dec r18	;Внутренний цикл ml выполняется	255 раз,
	brne ml dec r17 brne m	;пока не обнулится г18 ;Возврат, если еще не выполнили	100x255 вычитаний
	ret	;Возврат из подпрограммы	
П10.2. Kbd.asm позволяет освоить работу с портами, с таймером, познакомиться с системой прерываний, научиться работать с простейшей клавиатурой.
Присоедините блок из 8 кнопок на STK500 плоским кабелем к разъему порта А. Нажатая кнопка будет соответствовать логическому "О" на входе AVR.
Программа KBD.ASM периодически по прерыванию от таймера О приблизительно 1 раз в 70 мс (при Рс1к=3,68МГц) опрашивает клавиатуру. При однократном нажатии кнопки в каком-либо разряде порта А программа инвертирует состояние соответствующего разряда порта В (зажигает или гасит светодиод). Однократным нажатием считается нажатие и последующее отпускание кнопки.
146
Приложения
СОВЕТ. Дребезг контактов клавиатуры при нажатии и отпускании кнопки длится не более 20 мкс. Поэтому, если опрашивать клавиатуру не чаще, чем через 100 мкс (с запасом), то можно не предпринимать никаких дополнительных программных действий для подавления дребезга.
ПРОГРАММА KBD.ASM
. include ”8515def.inc"
.def temp=r16
.def last_state=r18
.def present_state=r19
;Подключить файл описаний имен регистров ввода/вывода
:Задание символических имен регистрам Состояние клавиатуры при прошлом опросе Состояние клавиатуры при текущем опросе
Остановка вектора прерывания таймера 0
.огд 0	;В эту точку процессор попадает после сброса
rjmp start
.org OVFOaddr	;Адрес вектора прерывания по переполнению
rjmp timO	:таймера 0 (имя "OVFOaddr" определено в
:файле ”8515def.inc")
;Инициализация
start:Idi temp,LOW(RAMEND) ;Инициализация указателя стека для AVR. имеющих out spl.temp	программный стек, обязательно выполняется
Idi temp.HIGH(RAMEND):в начале программы out sph.temp
rcall port_init rcall timO_init
:Инициализация портов
Инициализация таймера 0
sei	Остановка глобального бита разрешения :прерывания должна быть самой последней командой инициализирующей части программы.
бесконечный цикл: Loop:	:Основная программа в этом примере
rjmp Loop	:ничего не делает.
Подпрограмма обработки прерывания от таймера 0.
timO: push temp	Сохранение регистров в стеке (станет необходимым,
in temp,sreg	: когда основная программа будет выполнять
push temp	:какие-либо действия)
com last_state :Если прошлый раз кнопка была нажата ("0") in present_state,pina
and last_state.present_state:И в этот раз отпущена("1"). то in temp,portb
Примеры программ для микроконтроллеров семейства AVR
147
еог temp.last_state инвертировать состояние бита порта В out portb.temp
mov last_state,present_state Сохранить текущее состояние клавиатуры ; для следующего входа в подпрограмму.
pop temp	:Восстановление регистров из стека
out sreg.temp pop temp reti
;Подпрограмма инициализации		портов	
роrt_init			
Idi	temp,$ff	;Программирование порта	В на вывод
out	ddrb,temp		
idi	temp,$00	:Зажечь все светодиоды	
out	portb.temp		
out	ddra,temp	;Программирование порта	А на вввод
Idi	last_state,$ff	;Считаем, что сначала ни	одна кнопка
ret		;не была нажата	
;Подпрограмма инициализации таймера О timO_init:
Idi temp,$5 out tccrO,temp	коэффициент деления предделителя - 1024
Idi temp, (1«toie0)	;Разрешение прерывания от таймера 0:
out timsk,temp	: (1«toie0) -число 1, сдвинутое влево на toieO
	;позиций. Это выражение вычислит ассемблер.
ret	; Используя такие выражения, можно не запоминать
	:реальный номер разряда управляющего бита
П10.3. Uart.asm знакомит co способом организации работы последовательного асинхронного адаптера UART при помощи опроса флагов готовности. Эта простая программа позволяет тестировать в обоих направлениях целостность аппаратных узлов последовательного интерфейса, связывающего AVR, например, с компьютером. На стороне компьютера необходимо использовать какую-либо терминальную программу, например стандартную программу HyperTerminal, которая выводит на экран компьютера символы, ASCII-коды которых поступают на вход последовательного канала компьютера, и посылает в последовательный канал ASCII-коды, соответствующие нажатым на клавиатуре компьютера клавишам.
Соедините выводы TXD и RXD при помощи гибких кабелей с узлом RS-232 на STK500 (см. описание STK500). Соедините (при выключенном питании) при помощи стандартного кабеля RS232 плату STK500 с компьютером.
148 Приложения
Программа UART.ASM дополнительно к отображению состояния клавиатуры (PORTA) на блоке светодиодов (PORTB) выводит состояние каждого разряда порта В в последовательный канал в ASCII-кодах и наоборот коды принятых из последовательного канала байтов выводит в порт В для отображения на блоке светодиодов.
Параметры асинхронной передачи данных:
	скорость — 9600 бит/с;
	количество бит данных — 8;
	контроль четности — отсутствует;
	количество стоп бит — 1.
СОВЕТ. Создавая новый проект, всегда удобно сначала настроить работу устройств вывода, таких как последовательный канал и индикатор.
ПРОГРАММА UART.ASM
. include "8515def.inc"	;Подключить файл описаний имен регистров ввода/вывода
.def temp=r16 .def last_state=r18 .def present_state=r19 .def count=r20 .def serial=r21	:Задание символических имен регистрам Состояние клавиатуры при прошлом опросе Состояние клавиатуры при текущем опросе ;Счетчик цикла :Данные для передачи в последовательный канал
Остановка векторов прерывания
. огд 0 rjmp start .огд OVFOaddr rjmp timO	;B эту точку процессор попадает после сброса :Адрес вектора прерывания по переполнению ;таймера 0 (имя "OVFOaddr" определено в :файле "85l5def.inc")
;Инициализация
start:Idi temp.LOW(RAMEND) Инициализация указателя стека для AVR, имеющих
out spl,temp	программный стек, обязательно выполняется
idi temp,HIGH(RAMEND);в начале программы out sph,temp
rcall port_init rcall timO_init rcall uart_init	;Инициализация портов ;Инициализация таймера 0 :Инициализация UART
sei	Остановка глобального бита разрешения прерывания должна быть самой последней командой инициализирующей части программы.
Примеры программ для микроконтроллеров семейства AVR
149
бесконечный цикл:
Loop:	;Основная программа в этом примере
rjmp Loop	;ничего не делает.
;Подпрограмма обработки прерывания от таймера О ;вызывается ~ 1 раз в 70 мс.
timO: push temp	;Сохранение регистров в стеке (станет необходимым,
in temp,sreg	:когда основная программа будет выполнять
push temp	;какие-либо действия)
com last_state ;Если прошлый раз кнопка была нажата ("0") in present_state,pina
and last_state,present_state ;И в этот раз отпущена("1"), то in temp,portb
еог temp,last_state инвертировать состояние бита порта В
out portb,temp
mov last_state,present_state ;Сохранить текущее состояние клавиатуры ;для следующего входа в подпрограмму.
;Для каждого разряда порта В посылаем в последовательный канал ASCII-код "О"($30) ; или ”1"($31) в зависимости от состояния разряда.
Idi count, 8	Инициализировать счетчик разрядов
next_bit:	
rol temp	;Сдвинуть в бит С старший бит регистра temp
clr serial	;Очистить регистр
rol serial	;Поместить в него бит С
subi serial,-$30	;Получить ASCII-код
rcall Trans	Передать его в буфер последовательного канал
dec count	;Уменьшить на 1 счетчик числа бит
brne next_bit	;Если биты еще не кончились, вернуться назад
Idi serial,$0a	;Послать в последовательный канал управляющий
rcall trans	;ASCII-код "перевод строки"
;	Idi serial,$0d	;Послать в последовательный канал управляющий
;	rcall trans	;ASCII-код "возврат каретки"
rcall receive	
pop temp	;Восстановление регистров из стека
out sreg.temp pop temp reti	
; Подпрограмма передачи байта в последовательный канал
trans:sbis USR, UDRE	;Если передатчик еще не передал предыдущий байт,
rjmp trans	;то вернуться к trans и ждать.
150
Приложения
out UDR.serial ;B противном случае вывести содержимое serial в
ret	; UART :Выйти из подпрограммы
;Подпрограмма опроса приемника последовательного канала receive:
sbic USR.RXC	:Если флаг RXC в USR сброшен, т.е. в приемнике :нет новых байт, то пропустить следующую команду. :В противном случае перейти к считыванию байта :из приемника :Выйти из подпрограммы.
	
rjmp input	
	
ret	
input:in temp,UDR	:Считать байт из приемника
out portb,temp ret	:и вывести его в порт В
Подпрограмма инициализации UART uart init:
Idi temp.0600011000 out UCR,temp	[Инициализация UART: :TXEN=1.RXEN=1
Idi temp,23 out UBRR.temp ret	:9600 бит/с при 1с1к=3,68МГц
Подпрограмма "роrt_iпit" приведена в примере П10.2
Подпрограмма "timO_init" приведена в примере П10.2
П10.4. FIFO.asm показывает, как при передаче данных в последовательный канал освободить процессор от необходимости опроса флага готовности, используя прерывание по готовности передатчика и промежуточный кольцевой буфер FIFO (First In — First Out).
Драйвер последовательного канала на передачу теперь содержит две подпрограммы: "MovsBuf" и "Translnt" (рис. П10.1.).
Рис. Ш0.1. Организация программ для передачи данных в последовательный капал с использованием кольцевого буфера
Кольцевой буфер UART_OUT организуется во внутренней оперативной памяти AVR (рис. П10.2.). В памяти также отводится место
Примеры программ для микроконтроллеров семейства AVR
13 I
для двух переменных — указателен на голову очереди (Head) и ее хвост (Tail). Если буфер пуст, оба указателя равны.
Подпрограмма "MovsBuf" вызывается из головной программы. Она, не дожидаясь готовности передатчика, записывает в буфер UARTOut (ставит в очередь на передачу) требуемое количество байт. Подпрограмма "Translnt" вызывается по прерыванию при установке флага UDRE, что происходит, когда передатчик UART готов принять в UDR новый байт. Подпрограмма Translnt переписывает один байт из очереди UART_Out в регистр данных передатчика UART (UDR). Обе описанные подпрограммы требуют от процессора минимальных затрат времени.
Подпрограмма "MovsBuf' записывает очередной байт в буфер по адресу, на который указывает указатель хвоста очереди, и увеличивает значение этого указателя. Чем больше байт в буфере, тем больше разрыв между указателями. Программа чтения из буфера "ТгапзЬЕ’считывает байт из ячейки, на которую указывает указатель головы очереди, и увеличивает значение этого указателя. Таким образом, указатели, двигаясь по кольцу, все время стремятся догнать друг друга. Когда буфер пустеет, указатель головы догоняет указатель хвоста и, наоборот, когда буфхеу, канодняетея,, указатель хвоста догоняет указатель головы.
Конец буфера
Хбост очереди
Начало буфера
Рис. П10.2. Организация буфера FIFO в памяти
Г олоба очереди
Подпрограмма "Transint" после передачи из очереди в UART очередного байта проверяет, не опустел ли буфер. Если все данные уже переданы, то она сбрасывает бит UDRIE, запрещая дальнейшие запросы
152
Приложения
на прерывание. Восстановление передачи данных (установку бита UD-RIE) осуществит затем программа "MovsBuf" после того, как она выполнит новую запись в буфер.
Наоборот, за переполнением буфера следит подпрограмма "MovsBuf. Она игнорирует очередной байт, который головная программа пытается поставить в очередь, если буфер полон.
СОВЕТ. Сравните длительность исполнения программы timO в этом примере и в предыдущем.
ПРОГРАММА FIFO.ASM
.include "8515def.inc"	;Подключить файл описаний имен [регистров ввода/вывода
[Задание символических .def temp=r16 .def last_state=r18 .def present_state=r19 .def count=r20 .def serial=r21	имен регистрам [Состояние клавиатуры при прошлом опросе [Состояние клавиатуры при текущем опросе [Счетчик цикла [Данные для передачи в последовательный канал
[Определение символических имен для констант
.equ UART_OUT=$cO .equ UART_OUT_T=$be .equ UART_OUT_H=$bf	;Адрес буфера UART_OUT в RAM [Адрес указателя на хвост очереди UART_OUT [Адрес указателя на голову очереди UART_OUT
[Установка векторов прерывания
. org 0 rjmp .org OVFOaddr rjmp timO	;B эту точку процессор попадает после сброса start [Адрес вектора прерывания по переполнению [таймера 0 (имя "OVFOaddr" определено в ;файле "8515def.inc")
.org UDREaddr rjmp Translnt	[Адрес вектора прерывания по флагу UDRE ;готовности передатчика UART
; Инициализация
start:idi temp.LOW(RAMEND) [Инициализация указателя стека для AVR, имеющих
out spl.temp	[программный стек, обязательно выполняется
Idi temp,HIGH(RAMEND); в начале программы out sph,temp
rcall port_init rcall timO_init rcall uart_init	;Инициализация портов [Инициализация таймера 0 ;Инициализация UART
sei
[Установка глобального бита разрешения
;прерывания должна быть самой последней командой
Примеры программ для микроконтроллеров семейства AVR
153
инициализирующей части программы.
бесконечный цикл:
Loop:	:Основная программа в этом примере
rjmp Loop	;ничего не делает.
Подпрограмма обработки прерывания от таймера О вызывается ~ 1 раз в 70 мс.
timO: push temp	;Сохранение регистров в стеке (станет необходимым,
in temp,sreg	:когда основная программа будет выполнять
push temp	;какие-либо действия)
com last_state ;Если прошлый раз кнопка была нажата ("О")
in present-State,pina
and last_state,present_state ;И в этот раз отпущена('Т'). то in temp,portb
еог temp.last_state инвертировать состояние бита порта В out portb.temp
mov last_state,present_state ;Сохранить текущее состояние клавиатуры
;для следующего входа в подпрограмму.
;Для каждого разряда порта В посылаем в последовательный канал ASCII-код "0"($30)		
; или "1" ($31) в зависимости от состояния разряда. Idi count, 8	Инициализировать счетчика разрядов next_bit: rol temp	;Сдвинуть в бит С старший бит регистра		temp
clr serial rol serial subi serial,-$30 rcall MovsBuf	;Очистить регистр Поместить в него бит С ;Получить ASCII-код Передать его в буфер последовательного	канала
dec count brne next_bit	Уменьшить на 1 счетчик числа бит ;Если биты еще не кончились, вернуться	назад
Idi serial,$0a rcall MovsBuf Idi serial,$0d rcall trans	Послать в последовательный канал управляющий ASCII-код "перевод строки" Послать в последовательный канал управляющий ASCII-код "возврат каретки	
rcall receive pop temp out sreg,temp pop temp	:Восстановление регистров из стека	
ret i
Подпрограмма передачи байта в буфер UART_0UT из регистра serial MovsBuf:
push zl
;Сохранение содержимого регистров в стеке
154
Приложения
push zh push temp
Ids zl,UART_0UT_T Ids temp,UART_0UT. cp zl,temp brne ml sbic ucr,udrie rjmp endm	;Считать указатель хвоста очереди _Н ;Считать указатель головы очереди ;Сравнить адреса головы и хвоста очереди : Если указатель на голову и хвост равны :и UDRIE="1”, ;то буфер переполнен, следовательно ;выходим из подпрограммы
ml:	clr zh subi zl.-UART.OUT st z,serial	:Добавить к указателю хвоста очереди ;адрес начала буфера, т.е вычислить фактический адрес :и записать в него данные из регистра serial
	Ids zl.UART_0UT_T	:Считать указатель хвоста очереди
	inc zl	:Увеличить его на 1
	andi zl.$3f	;Если величина указателя больше 15, то : вернуться к началу буфера (в нашем ; буфере 16 байт)
	sts UART_OUT_T,zl	Сохранить новое значение указателя
	sbi ucr,udrie	:Разрешить прерывание UDRE
endm:	pop temp	:Восстановить из стека значения регистров
pop zh
pop zl ret
;Подпрограмма обработки прерывания от UDRE Т ranslnt:
push zl push zh push temp in temp,sreg push temp	Сохранить содержимое регистров в стеке
Ids zl,UART_OUT_H	;Считать указатель головы очереди
clr zh	вычислить абсолютный адрес первого
subi zl,-UART_OUT	; в очереди байта
Id temp.z	:Считать из буфера этот байт
out UDR,temp	;Вывести его в UART
Ids zl,UART_OUT_H inc zl andi zl,$3f Ids zh.UART OUT T	:Проверка: не стал ли буфер теперь пустым7
Примеры программ для микроконтроллеров семейства AVR
155
ср zl,zh brne t1	;Если еще нет. перейти на t1
cbi UCR,UDRIE	;Если буфер пуст, запретить дальнейшие : прерывания по флагу UDRE (передатчик пуст)
t1: sts UART_OUT_H,zl	Сохранить в памяти новое значение
•.указателя головы очереди.
pop temp
out sreg.temp
pop temp	восстановить из стека значения регистров
pop zh
pop zl
reti
Подпрограмма	''receive'' приведена в	примере П10.3.
Подпрограмма	"port_init"	приведена	в	П10.2
Подпрограмма	"timO_init"	приведена	в	П10.2
Подпрограмма	"uart_init"	приведена	в	П10.3
П10.5. Led.asm позволяет выводить данные на стандартный символьный жидкокристаллический индикатор (ЖКИ), построенный на базе контроллера HD44780. Такой ЖКИ не входит в комплект STK500, но может быть подключен к нему при помощи имеющихся на отладочной плате разъемов, на которые выведены порты ввода/вывода AVR.
Присоедините символьный ЖКИ к отладочной плате согласно таблице П10.1. В данном примере используется способ подключения индикатора при помощи 4-разрядной шины данных и предполагается, что данные будут передаваться только в одном направлении — от микроконтроллера к ЖКИ. При этом каждый байт данных передается по линиям DB4—DB7 последовательно двумя тетрадами, начиная со старшей.
AVR-микроконтроллер посылает в ЖКИ команды (табл. П10.2), управляющие режимами его работы, и ASCII-коды выводимых символов. Контроллер ЖКИ после приема байта команды или байта данных требует некоторого времени (табл. П10.2) для обработки полученной информации, в течение которого AVR-микроконтроллер не должен выполнять новых передач.
Если во время цикла записи микроконтроллер передает в контроллер индикатора код команды, то этот код записывается в регистр команд контроллера ЖКИ, и команда сразу же начинает выполняться. Если контроллер ЖКИ передаются данные, которые представляют собой ASCII-коды отображаемых символов, то они записываются в буфер данных (DDRAM), который обычно содержит 80 ячеек (рис. П10.3).
156
Приложения
При записи или считывании буфера данных обращение осуществляется к ячейке, на которую в данный момент указывает курсор.
Таб ли ца П 1 0. 1
Цепь	N контакта на разъеме ЖКИ	Название контакта на плате STK500	Описание сигнала
Vss	1	GND	(-) Питание. 0 V.
Vdd	2	Vcc	(+) Питание.+5V.
Vo	3	GND	Напряжение смещения, управляющее контрастностью
RS	4	PD2	Вход. Высокий уровень — Данные; Низкий — Команды
R/W	5	GND	Вход, Высокий — Чтение, Низкий — Запись
E	6	PD3	Вход. Строб, сопровождающий сигналы на шине
			"команды/данные"
DB0	7		
DB,	8		
db2	9		
DB3	10		
db4	11	PD4	
db5	12	PD5	
DB6	13	PD6	
db7	14	PD7	Шина "команды/данные"
Буфер данных имеет больше ячеек, чем число знакомест дисплея. Смещая окно индикатора относительно буфера данных (см. систему команд), можно отображать на дисплее различные области буфера. У двустрочных индикаторов первые 40 ячеек буфера данных обычно отображаются на верхней строке дисплея, а вторые 40 ячеек — на нижней строке. Сдвиг окна дисплея относительно буфера данных для верхней и нижней строк происходит синхронно. Курсор будет виден на индикаторе только в том случае, если он попал в зону видимости дисплея (и если предварительно была подана команда отображать курсор).
б)
а)
Рис. П10.3 Отображение на дисплее символов, ASCII-коды которых записаны в DDRAM: а — однострочный ЖКИ, б — двухстрочный ЖКИ
Таб ли ца П 1 0.2
Система команд контроллера HD44780
Код										Описание команды	Время исполнения команды
RS	R/W	DB7	DB6	DB5	DB4	DB3	DB2	DB1	DB0		
0	0	0	0	0	0	0	0	0	1	Очистить дисплей и установить курсор в нулевую позицию (адрес 0)	От 82мкс до 1.64мс
0	0	0	0	0	0	0	0	1	*	Установить курсор в нулевую позицию(адрес 0). Установить дисплей относительно буфера DDRAM в начальную позицию. Содержимое DDRAM при этом не меняется.	От 40мкс до 1,6мс
0	0	0	0	0	0	0	1	I/D	S	Установить направление сдвига курсора вправо(1/0 = 1) или влево (I/D = 0) при записи/чтении очередного кода в DDRAM. Разрешить (S = 1) сдвиг дисплея вместе со сдвигом курсора.	40мкс
0	0	0	0	0	0	1	D	С	в	Включить(О = 1)/выключить (D = 0) дисплей. Зажечь (С = 1) или погасить(С = 0) курсор. Изображение курсора сделать мигающим (В = 1).	40мкс
0	0	0	0	0	1	S/C	R/L	*	4г	Переместить курсор (S/C = 0) или сдвинуть дисплей (S/C = 1) вправо (R/L = 1) или влево(В/1_ = 0).	40мкс
0	0	0	0	1	DL	N	F	*	*	Установить разрядность шины данных 4 бита (DL = 0) или 8 бит (DL = 1), количество строк дисплея — одна (N = 0) или две (N = 1), шрифт — 5x7 точек (F = 0) или 5x10 точек (F = 1)	40мкс
0	0	0	1	Acg						Установка адреса CGRAM. После этой команды данные будут записываться/считываться в/из CGRAM	40м кс
0	0	1	Add							Установка адреса DDRAM. После этой команды данные будут записываться/считываться в/из DDRAM	40мкс
0	1	BF	АС							Чтение состояния busy-флага (BF) и счетчика адреса	1мкс
1	0	Данные								Запись данных в DDRAM или CGRAM	40мкс
1	1	Данные								Чтение данных из DDRAM или CGRAM	40мкс
Примечание: DDRAM — Display data RAM — ОЗУ ASCII-кодов, отображаемых символов; CGRAM — Character generator RAM — ОЗУ знакогенератора.
Примеры программ для микроконтроллеров семейства AVR
158 Приложения
Программа "LCD.ASM" дополняет предыдущий пример выводом двоичного кода, соответствующего состоянию порта В (т.е. состоянию блока светодиодов STK500), на ЖКИ.
При этом используется 1-строчный режим работы, окно дисплея все время находится в крайнем левом положении относительно буфера DDRAM, курсор погашен.
Для передачи на ЖКИ команд п данных используются базовы подпрограммы "Icdcom" и "Icddat".
Для задержки вывода данных на индикатор используются две простые подпрограммы задержки, представляющие собой многократное исполнение процессором холостых циклов и отличающиеся величиной задержки. В это время процессор нс выполняет никакой полезно!: работы. В системах с более плотной загрузкой процессора необходимо использовать для отсчета задержек таймер, а подпрограмму вывода данных на ЖКИ выполнять по запросу прерывания от этого таймера.
Подпрограмма инициализации контроллера ЖКИ "initlcd", посылая в индикатор последовательность команд при помощи подпрограммы "Icdcom", задаст режим его работы. Эта подпрограмма также выполняет вывод постоянного (не изменяемого за все время работы программы) текста на дисплей.
ПРОГРАММА LCD.ASM
.include ”8515def.inc”	:Подключить файл описаний имен
регистров ввода/вывода
;Задание символических имен регистрам
.def temp=r16
.def	temp1=r17	;
.def	last_state=r18	Состояние	клавиатуры	при	прошлом	опросе
.def	present_state=r19 Состояние	клавиатуры	при	текущем	опросе
.def	count=r20	-.Счетчик цикла
.def serial=r21	;Данные для передачи в последовательный канал
.def lcd=r22
Определение символических имен для констант
equ	UART.OUT =$60	:Адрес	буфера UART_OUT в RAM
equ	UART_0UT_T =$70	;Адрес	указателя на хвост очереди UART_OUT
equ	UART_OUT_H =$71	;Адрес	указателя на голову очереди UART_OUT
equ	RS	=2	:Номер	разряда порта D, к которому подключен сигнал RS
equ	E	=3	;Номер	разряда порта D, к которому подключен сигнал Е
Остановка векторов прерывания
org	0	;B эту точку процессор попадает после сброса
	rjmp start	
org	OVFOaddr	:Адрес вектора прерывания по переполнению
	rjmp timO	;таймера 0
Примеры программ для микроконтроллеров семейства AVR 159
.org UDREaddr	;Адрес вектора прерывания по флагу UDRE
rjmp Translnt	готовности передатчика UART.
:Инициализация
start:Idi temp.L0W(RAMEND)	Инициализация указателя стека для AVR, ;имеющих программный стек, обязательно выполняется в начале программы :Инициализация портов Инициализация таймера 0 ;Инициализация UART Инициализация led
out spl.temp	
Idi temp,HIGH(RAMEND)	
out sph,temp	
rcall port_init	
rcall timO_init	
rcall uart_init	
rcall lcd_init	
sei	Остановка глобального бита разрешения
	;прерывания должна быть самой последней ;командой инициализирующей части программы
1 бесконечный цикл:	
Loop:	;Основная программа в этом примере
rjmp Loop	:ничего не делает.
Подпрограмма обработки прерывание	। от таймера 0 вызывается ~ 1 раз в 70 мс.
timO: push temp	;Сохранение регистров в стеке (станет
in temp,sreg	;необходимым.когда основная программа будет
push temp	выполнять какие-либо действия)
com last_state	;Если прошлый раз кнопка была нажата ("0")
in present_state,pina
and last_state,present_state:И в этот раз отпущена("Г), то in temp.portb
еог temp.last_state	;инвертировать состояние бита порта В
out portb,temp
mov last_state,present_state:Сохранить текущее состояние клавиатуры :для следующего входа в подпрограмму.
:Для каждого разряда порта В посылаем в последовательный канал :и на led ASCII-код "0"($30)или "1" ($31) в зависимости от ;состояния разряда.
Idi count. 8 next_bit: rol temp clr serial rol serial subi serial,-$30	Инициализировать счетчик разрядов :Сдвинуть в бит С старший бит регистра temp :Очистить регистр .Поместить бит С в регистр serial :Вычислить ASCII-код ($30 или $31)
160
Приложения
rcall MovsBuf mov led,serial rcall leddat rcall del dec count brne next_bit Idi serial,$0a rcall MovsBuf Idi serial,$0d rcall MovsBuf Idi count,8 shift:Idi led, $10 rcall ledcom rcall del dec count brne shift t rcall receive pop temp out sreg,temp pop temp reti Подпрограмма вывода на ledcom: push temp mov temp ,led andi temp,~(1<<RS) ori temp, (1«E) out portd,temp cbi portd,E mov temp.led swap temp andi temp,~(1«RS) ori temp, (1«E) out portd,temp cbi portd,E	:Послать его в буфер последовательного ;канала :а также на led ;Уменьшить на 1 счетчик числа бит ;Если биты еще не кончились, вернуться назад :Послать в последовательный канал .управляющий ASCII-код "перевод строки" ;Послать в последовательный канал .управляющий ASCII-код "возврат каретки” ;Сдвинуть курсор на ЖКИ влево 8 раз ;Если на вход приемника последовательного :канала поступил какой-нибудь байт, то :считать его и вывести его в порт В. :Восстановление регистров из стека индикатор байта-команды из регистра led ;Сохранить регистр в стеке :В (см. П10,1)регистре temp собираем ;данные и значения управляющих сигналов :для вывода в порт 0 (на индикатор) ;RS=O - сообщаем ЖКИ, что передаем команду ;Е=1 ;Вывод на шину данных индикатора старшей тетрады ;Е=0 - записывающий фронт :Теперь посылаем на индикатор младшую тетраду ;из регистра led ;RS=O - сообщаем ЖКИ, что передаем команду : Е=1 :Вывод на шину данных индикатора ;Е=0 - записывающий фронт
pop temp
восстановить регистр из стека
Примеры программ для микроконтроллеров семейства AVK
10 1
ret
!
Подпрограмма вывода на индикатор байта данных из регистра led leddat: push temp	:Сохранить регистр в стеке
mov temp,led	; В (см. П10.1)регистре temp собираем •.данные и значения управляющих сигналов
ori temp, (1«RS)+( out portd.temp cbi portd,E	'1<<Е) ;E=1,RS=1 - сообщаем ЖКИ, что передаем данные ;Вывод на шину данных индикатора старшей тетрады :Е=0 - записывающий фронт
mov temp,led swap temp ori temp,(1<<RS)+( out portd,temp cbi portd,E	;Теперь посылаем на индикатор младшую тетраду ;из регистра led ’1«Е) ; Е=1, RS=1 - сообщаем ЖКИ, что передаем данные Вывод на шину данных индикатора ’;Е=0 - записывающий фронт
pop temp ret	;Восстановить регистр из стека
Подпрограмма инициализации ЖКИ lcd_init:
rcall delay			
Idi led,$20	:4-битный	интерфейс, 1-строка,	шрифт-5х7 точек
rcall Icdcom			
rcall del			
Idi lcd,$OC	;включить	дисплей, выключить курсор	
rcall Icdcom			
rcall del			
Idi led,$20	;4'битный	интерфейс, 1-строка,	шрифт-5х7 точек
rcall Icdcom			
rcall del			
Idi lcd,$1	; очистить	дисплей и установить	курсор в
rcall Icdcom	;начальнук	) позицию	
rcall delay			
;Вывод постоянного текста на дисплей:
Idi zl, low(text*2)	Нагрузить адрес буфера, содержащего
Idi zh,high(text*2)	;текст, в регистр косвенной адресации
Idi count,7	инициализировать счетчик числа :выводимых символов
lcd_text:	
1pm	;считать байт данных из внутренней FLASH-памяти
;в регистр rO	
mov led,rO	1
rcall leddat	;вывести его на индикатор
rcall del	
162
Приложения
adiw zl, 1	.’инкрементировать указатель адреса
dec count	;
brne lcd_text продолжать до конца текста ret
Подпрограмма задержки del: push temp
Idi temp,45	;задержка -40 мкс при кварце 3,68 МГц
m4: dec temp	;
brne т4
pop temp ret
Подпрограмма задержки delay:push temp push tempi
Idi temp,9	; задержка - 1,8 ms при кварце 3,68 МГц
m:	Idi tempi,255
ml:	dec tempi
brne ml dec temp brne m pop tempi pop temp ret
Постоянный текст для вывода на led записываем во FLASH-память: text: ,db ’Р’.'o','г','f,'В',':',' ';PORT В
Подпрограмма "MovsBuf" приведена в примере П10.4
Подпрограмма "Translnt" приведена в примере П10.4
Подпрограмма "receive" приведена в примере П10.3
Подпрограмма "port_init" приведена в примере П10.2
Подпрограмма "timO_init" приведена в примере П10.2
Подпрограмма "uart_init" приведена в примере П10.3
П10.6. В cd. asm демонстрирует способ преобразования целых двоичных чисел в двоично-десятичные, содержит пример использования макроопределения.
Программа BCD.ASM модифицирует учебный проект так, чтобы теперь данные выводились в последовательный канал и на ЖКИ в десятичном формате. Двоично-десятичное преобразование 8-разрядного целого двоичного числа в 3-разрядное десятичное неупакованное число (в последовательность ASCII-кодов десятичных цифр) выполняет подпрограмма "Bin8ascii3:"
Примеры программ для микроконтроллеров семейства AVR
163
Способ преобразования заключается в том, чтобы вычитать из исходного двоичного числа сначала число 100 и, подсчитывая количество вычитаний, определить десятичную цифру сотен. Затем вычисляется цифра десятков последовательным вычитанием числа 10. После этого в регистре исходного числа остается десятичная цифра единиц. Вычитание каждый раз производится до получения отрицательной разности. При переходе к определению каждого следующего десятичного разряда в регистре исходного числа восстанавливается последняя положительная разность.
СОВЕТ. На сайтах www.atmel.com и www.atmel.ru имеются примеры программ двоично-десятичного преобразования для чисел с большей разрядностью, для дробных чисел, а также для чисел с плавающей точкой.
ПРОГРАММА BCD.ASM
.include ”8515def.inc"	Подключить файл описаний имен
;регистров ввода/вывода
;Задание символических имен регистрам .def temp=r16
.def tempi=г17	;
.def last_state=r18	;Состояние	клавиатуры	при	прошлом	опросе
.def present_state=r19	;Состояние	клавиатуры	при	текущем	опросе
.def count=r20	;Счетчик цикла
.def serial=r21	;Данные для передачи в последовательный канал
.def lcd=r22
.def tascii0=r23	;Регистры для хранения ASCII-кодов десятичного
.def tascii1=r24	;числа
.def tascii2=r25
;Определение символических имен для констант как в примере П10.5
Остановка векторов прерывания как в примере П10.5
;Инициализация как в примере П10.5
бесконечный цикл как в примере П10.5
Подпрограмма обработки прерывания от таймера 0 вызывается ~ 1 раз в 70 мс. timO: push temp	;Сохранение регистров в стеке (станет необходимым,
in temp,sreg	;когда основная программа будет выполнять
push temp	;какие-либо действия)
com last_state	;Если прошлый раз кнопка была нажата ("О”)
in present_state,pina
and last_state,present_state ;И в этот раз отпущена("1"), то in temp,portb eor temp,iast_state	;инвертировать состояние бита порта В
out portb,temp
164
Приложение
mov last_state,present_state ;Сохранить текущее состояние клавиатуры ;для следующего входа в подпрограмму.
Преобразование двоичного числа, отображающего состояние блока светодиодов, ;в двоично-десятичное.
rcall bin8ascii3
;Вывод в последовательный канал и на ЖКИ ASCII-кодов двоично-десятичного числа.
mov serial,tascii2 ;Цифру сотен послать в последовательный канал rcall MovsBuf
mov led,tascii2 ; и на ЖКИ rcall leddat rcall del
mov serial,tasciil ;Цифру десятков послать в последовательный канал rcall Movsbuf mov led,tasciil rcall leddat	;и на ЖКИ
rcall del
mov serial,tasciiO ; Цифру единиц послать в последовательный канал rcall Movsbuf
mov led,tasciiO
rcall leddat	;и на ЖКИ
rcall del
Idi serial,$0a rcall MovsBuf Idi serial,$0d rcall MovsBuf
Idi count,3
shift:ldi led,$10 rcall ledcom rcall del dec count brne shift
Послать в последовательный канал управляющий ASCII-код "перевод строки"
Послать в последовательный канал управляющий ASCII-код "возврат каретки"
;Сдвинуть курсор на ЖКИ влево 3 раза
rcall receive ;Если на вход приемника последовательного ;канала поступил какой-нибудь байт, то ;считать его и вывести его в порт В.
;Восстановление регистров из стека
pop temp out sreg,temp pop temp
Примеры программ для микроконтроллеров семейства AVR
165
reti
;Макроопределение для	вычисления одного десятичного разряда
.MACRO DIGIT	;Макропределение в тексте программы должно всегда располагаться до его вызова.
Idi @1,-1	;в регистр десятичной цифры исходно записываем -1
dgt_l:inc @1	;подсчет числа вычитаний
subi temp,@0	;вычитание из двоичного числа веса десятичного ;разряда.
brsh dgt_l	;если остаток еще положительный, то продолжаем :вычитать.
subi temp,-@0	восстановление последнего положительного остатка.
subi @1,-($30)	•.Вычисление ASCII-кода десятичной цифры
.ENDMACRO
Подпрограмма двоично-десятичного преобразования
Bin8ascii3:
DIGIT	100,tascii2	вычисление	десятичной	цифры	сотен
DIGIT	10,tasciil	вычисление	десятичной	цифры	десятков
DIGIT	1,tasciiO	вычисление	десятичной	цифры	единиц
ret
Подпрограмма "Icdcom" приведена в примере П10.5
Подпрограмма "Icddat" приведена в примере П10.5
Подпрограмма ’’lcd_init" приведена в примере П10.5
Подпрограмма "del” приведена в примере П10.5
Подпрограмма "delay” приведена в примере П10.5
Подпрограмма "MovsBuf" приведена в примере П10.4
Подпрограмма "Translnt" приведена в примере П10.4
Подпрограмма "receive" приведена в примере П10.3
Подпрограмма "port_init" приведена в примере П10.2
Подпрограмма "timO_init" приведена в примере П10.2
Подпрограмма "uart_init" приведена в примере П10.3
Постоянный текст для вывода на led как в примере П10.5
Ш0.7. Adc.asm позволяет познакомиться с работой встроенного аналого-цифрового преобразователя AVR-микроконтроллеров, содержит подпрограмму двоично-десятичного преобразования 16-разрядных двоичных чисел.
Установите процессор AT90S8535 в панельку SCKT3100?3 на STK500. При установленной на STK500 перемычке "AREF" ош рное напряжение для АЦП можно регулировать из AVRSTUDIO. Э~о напряжение также выведено на разъем порта Е.
Удалите гибкий кабель, который ранее соединял порт А микроконтроллера с блоком клавиатуры. Теперь этот порт будем использовать
166
Приложения
для ввода аналоговых сигналов. Подайте на вход РАО напряжение (например, при помощи потенциометра), которое лежит в диапазоне от AGND до AREF.
Программа ADC.ASM инициализирует АЦП на работу с временем преобразования 130 мкс.
При завершении преобразования вызывается подпрограмма "adc" обработки прерывания, которая считывает результат из регистров АЦП, помещает его в буфер АЦП в памяти SRAM и инициирует преобразование по следующему каналу. После того, как цикл преобразований по всем восьми каналам завершится, дальнейшая работа АЦП запрещается до тех пор, пока буфер АЦП не будет считан из памяти.
Подпрограмма обработки прерывания от таймера 0 вызывается с интервалом 70 мс, считывает двоичные данные из буфера АЦП, выполняет двоично-десятичное преобразование, посылает в последовательный канал результаты преобразования АЦП по восьми аналоговым каналам, выводит на ЖКИ результат преобразования по нулевому каналу. Если подать на вход АЦП стабильное напряжение, можно визуально оценить разброс показаний АЦП.
ПРОГРАММА ADC.ASM
.include "8535def.inc"	Подключить файл описаний имен
;регистров ввода/вывода Падание символических имен регистрам
.def temp=r16 .def tempi = r17		
. def	channel=r18	:Номер канала АЦП
. def	count=r20	;Счетчик цикла
. def	serial=r21	;Данные для передачи в последовательный канал
. def	lcd=r22	;Данные для вывода на ЖКИ
. def	tascii0=r19	;ASCII-коды десятичных цифр результата
. def . def . def . def . def	tascii1=r23 tascii2=r24 tascii3=r25 tascii4=r26 bcdcnt=r23	;bcdcnt=tascii1
. def	binl=г 19	;Двоичное число преобразуемое в десятичное
. def	binh=r27	;binl=tasciiO
Определение символических		имен для констант
. equ	UART_OUT =$c0	;Адрес буфера UART_OUT в RAM
. equ	UART_OUT_T =$be	;Адрес указателя на хвост очереди UART_OUT
. equ	UART_OUT_H =$bf	;Адрес указателя на голову очереди UART_OUT
. equ	RS	=2	;Сигнал выбора команда/данные для ЖКИ
. equ	E	=3	;Строб записи данных в ЖКИ
. equ	ADC_BUF =$72	;Адрес буфера АЦП
Примеры программ для микроконтроллеров семейства AVR
167
Остановка векторов прерывания
org	0 rjmp	;B эту точку процессор попадает после сброса start
org	OVFOaddr	:Адрес вектора прерывания по переполнению
	rjmp timO	;таймера 0
org	UDREaddr	;Адрес вектора прерывания по флагу UDRE
	rjmp Translnt	;готовности передатчика UART.
org	ADCCaddr	;Адрес вектора прерывания по завершению
	rjmp Adc	;аналого-цифрового преобразования.
;Вывод одного десятичного разряда в последовательный канал и на ЖКИ .MACRO DIGIT_out	;Макро определения всегда должны располагаться
subi @0,-0x30 ;в тексте программы раньше, чем их вызовы, mov serial,@0 rcall MovsBuf cpi count,8	;На ЖКИ выводится результат преобразования только
brne skip	;по нулевому (count=8) каналу,
mov lcd,@0 rcall leddat rcall del skip: .ENDMACRO
;Инициализация
start:Idi temp,LOW(RAMEND) Инициализация указателя стека для AVR, имеющих out spl,temp	программный стек, обязательно выполняется
Idi temp,HIGH(RAMENO);в начале программы out sph,temp
rcall	port_init	;Инициализация	портов
rcall	timO_init	Инициализация	таймера 0
rcall	uart_init	.Инициализация	UART
rcall	lcd_init	;Инициализация	ЖКИ
rcall adc_init Инициализация АЦП
sei	Остановка глобального бита разрешения
Прерывания должна быть самрй последней командой ;инициализирующей части программы.
;Бесконечный цикл:
Loop:
rjmp Loop
;Основная программа в этом примере ;ничего не делает.
Подпрограмма обработки прерывания от таймера 0 вызывается ~ 1 раз в 70 мс, ;считывает двоичные данные из буфера АЦП, выполняет двоично-десятичное преобразование,
168
Приложения
;посылает в последовательный канал результаты преобразования АЦП по восьми [аналоговым каналам,начиная со старшего,
;выводит на ЖКИ результат преобразования по седьмому каналу.
timO: push temp in temp,sreg push temp	[Сохранение регистров в стеке (станет необходимым, ;когда основная программа будет выполнять [какие-либо действия)
Idi zh,high(adc_buf) ;Поместить в регистр косвенной адресации
Idi zl,low(adc_buf) Idi count,8 tr_l: Id binl,z+ Id binh,z+ rcall bin16ascii5 DIGIT_out tascii4 DIGIT_out tascii3 DIGIT_out tascii2	;адрес буфера АЦП [Инициализировать счетчик числа каналов [Считать из буфера АЦП двоичный код ;результата преобразования [Выполнить двоично-десятичное преобразование :Вывести 5 десятичных цифр в буфер [последовательного канала и на ЖКИ
DIGIT_out tasciil
DIGIT_out tasciiO
Idi serial, ' ' rcall MovsBuf	[Вывести в последовательный канал ASCII-код [символа "пробел".
J dec count brne tr_l	:Если еще не по всем каналам данные переданы, [то вернуться назад
Idi serial,$0a rcall MovsBuf Idi serial,$0d rcall MovsBuf	[Послать в последовательныйй канал [управляющий ASCII-код "перевод строки" [Послать в последовательный канал [управляющий ASCII-код "возврат каретки"
Idi count,5	[Сдвинуть курсор на ЖКИ влево 5 раз
shift:Idi led,$10 rcall ledcom rcall del dec count brne shift
sbi adcsr,adie sbi adcsr,adsc	[Запуск нового цикла преобразования
pop temp out sreg,temp pop temp	[Восстановление регистров из стека
reti
Примеры программ для микроконтроллеров семейства AVR 169
Подпрограмма инициализации АЦП
adc_init:		
Idi	temp,$8D	;ADEN=1- Enable ADC;ADIE=1-Enable Interrupt
out	adcsr, temp	;Fadc=Fclk/32(115 кГц при кварце 3,68МГц)
Idi	channel,7	;Выбор седьмого канала АЦП
out	admux,channel	
sbi	adcsr,adsc	;Запуск преобразования
ret		
Подпрограмма обработки прерывания по завершению преобразования АЦП adc:
push zl	;Сохранить содержимое регистров в стеке
push zh	;
push temp
in temp,sreg
push temp
Idi zh,high(adc_buf) Поместить в регистр косвенной адресации Idi zl,low(adc_buf) ;адрес буфера АЦП
Isl channel add zl,channel Isr channel in temp, add st z+,temp in temp,adch st z,temp dec channel brpl adc_start Idi channel,? out admux.channel cbi adcsr,adie rjmp adc_end adc_start: out admux,channel sbi adcsr.adsc adc_end: pop zl pop zh pop temp out sreg,temp pop temp	;Увеличить вдвое номер текущего канала ;Вычислить адрес хранения результата по текущему ;каналу ;Восстановить номер текущего канала ;считать результат преобразования ;из регистров АЦП и поместить его в буфер АЦП ;Уменьшить на 1 номер канала ; Если еще не все каналы в этом цикле :кончились. инициировать новое преобразование :Если цикл завершился, то подготовиться к новому циклу, ;но пока результаты не будут считаны из буфера, запретить прерывания от АЦП ;и выйти из подпрограммы. ;запуск преобразования АЦП :по следующему каналу. ;Восстановление регистров из стека.
170
Приложения
;Подпрограмма bin16asci15:	двоично-десятичного преобразования
Idi	temp, low(10000)
Idi	tempi, high(IOOOO)
rcall	digit
mov	tASCII4. bedent
Idi	temp, low(1000)
Idi	tempi, high(1000)
rcall	digit
mov	tASCII3, bedent
Idi	temp, low(IOO)
Idi	tempi, high(100)
rcall	digit
mov	tASCII2, bedent
Idi	temp, low(10)
Idi	tempi, high(10)
digit:	[подпрограмма вычисления одной десятичной цифры
Idi	bedent, -1 [инициализировать счетчик числа вычитаний
digit_l:	
inc	bedent	[инкрементировать счетчик числа вычитаний
sub	binl, temp [Вычесть из двоичного числа вес десятичного
sbe	binh, tempi;разряда
brsh	digit_l [Если остаток еще положительный, вернуться
add	binl, temp [Восстановить последний положительный остаток
adc	binh. tempi
ret	
[Подпрограмма инициализации ЖКИ lcd_init:
rcall delay
Idi led, $20	;4-битный интерфейс, 1-строка, шрифт-5х7 точек
rcall Icdcom rcall del
Idi led,$0C	[Включить дисплей, выключить курсор
rcall Icdcom rcall del
Idi led,$20	;4-битный интерфейс, 1-строка, шрифт-5х7 точек
rcall Icdcom rcall del
Idi led,$1	[очистить дисплей и установить курсор в
rcall Icdcom	; начальную позицию
rcall delay
[Вывод постоянного текста на дисплей:
Idi zl,low(text*2) [Загрузить адрес буфера, содержащего
Idi zh,high(text*2) [текст в регистр косвенной адресации
Примеры программ для микроконтроллеров семейства AVR 171
Idi count.11	инициализировать счетчик числа
:выводимых символов lcd_text:
1pm	;Считать байт данных из FLASH-памяти в гО.
mov led. гО	;
rcall leddat	;вывести его на индикатор,
rcall del	;
adiw zl.1	;инкрементировать	указатель адреса,
dec count	:
brne lcd_text продолжать до конца текста.
ret
Подпрограмма инициализации портов port_init:
Idi temp,$Off Программирование порта D на вывод out ddrd,temp ret
Постоянный текст для вывода на ЖКИ записываем во FLASH-память: .org 400
text: .db С’. Н, A1, ’N', N. А . L' ' '. 'О'.':',' CHANNEL 0
Подпрограмма "ledcom" приведена в т/меое П10.5
Подпрограмма "leddat" приведена в пр/меое П10.5
;Подпрограмма "del" приведена в примере П10.5
Подпрограмма "Ье1ау"приведена в примере П10.5
Подпрограмма "MovsBuf" приведена в примеое П10.4
Подпрограмма "Translnt" приведена в примере П10.4
; Подпрсгоамма "tim0_init” приведена в примере П10.2
; Подпрстамма "uart_init" приведена в примере П10.3
172
Литература
Литература
1.	Atmel Corporation 8-bit RISC Microcontrollers Data Book.
May 1997.
2.	Atmel Corporation 8-bit RISC Microcontrollers Data Book.
August 1999.
3.	AVR Assembler User Guide.
4.	ATtiny 15L. Preliminary. Data Sheet.
5.	ATtiny 28L, ATtiny 28V. Data Sheet.
6.	ATmega 163, ATmega 163L. Advance Information. Data Sheet.
7.	Водовозов A. M. Микроконтроллеры для систем автоматики: Учебное пособие. — Вологда: ВоГТУ, 2002. — 123 с.