Ошибка

МИКРОКОНТРОЛЛЕРЫ СЕМЕЙСТВА 8051

Категория: Электроприводы
Опубликовано 30.06.2011 10:37
Автор: Super User
Просмотров: 11692

Часть

2

МИКРОКОНТРОЛЛЕРЫ СЕМЕЙСТВА 8051

ГЛАВА

7

МИКРОКОНТРОЛЛЕР 8051

Краткое содержание

Фирмы-производители 8051

Обычно название Intel ассоциируется с компанией, деятельность которой

полностью посвещена персональным компьютерам и системам. Однако од-

новременно с созданием в 70-х годах первых микропроцессоров эта компа-

ния вела также разработку микроконтроллеров. Усилия по разработке микро-

контроллеров воплотились в архитектуру 8051, которая впервые была

представлена в 1980 году и стала одной из наиболее популярных микроконт-


роллерных архитектур (рис. 7.1).[image][image]

Рис. 7.1. Микроконтроллеры Dallas Semiconductor 8051 HSM.

Микроконтроллер второго поколения 8051 представляет собой законченное устройство с большим объемом встроенной памяти программ (ROM и EPROM) и данных RAM, улучшенными портами ввода-вывода и возможностью подключения внешней памяти. Первые микроконтроллеры 8051 были достаточно быстрыми, имея максимальную тактовую частоту 20MHz.


В то время как популярность большинства других типов микроконтроллеров определяется объемом их продаж, 8051 снискали другую славу. Микроконтроллеры с архитектурой 8051 производятся наибольшим числом компаний. В этом заключается их несомненное преимущество, так как каждый производитель производил усовершенствования 8051 с целью расширения функциональных возможностей или повышения скорости. Благодаря этому архитектура 8051 стала весьма привлекательной для реализации широкого диапазона приложений.

В этой главе речь пойдет о классической реализации микроконтроллеров 8051 и ее версии 87С51, где «7» указывает на использование EPROM в качестве памяти программ, а «С» означает, что микросхема изготовлена по CMOS-технологии. Микроконтроллеры 8051 имеют следующие типовые характеристики:


Многие производители провели усовершенствования и расширили возможности выпускаемых ими микроконтроллеров данной архитектуры. При дальнейшем описании будут, в основном, использоваться микроконтроллеры со стандартными характеристиками 87С51, которые обозначаются традиционным символом 8051.

Фирмы-производители 8051

Сейчас существует более 10 производителей, выпускающих свои версии 8051. Эти версии, совместимые по выводам, программному коду, временным характеристикам, имеют существенные отличия от оригинала в части ускорения выполнения программ и расширения функциональных возможностей. Каждый производитель реализует некоторое улучшение характеристик по сравнению со стандартным 8051. Первоначальный вариант 8051 может показаться довольно непривлекательным при сравнении с рядом моделей микроконтроллеров семейств PIC и 68НС05. Но если рассмотреть весь спектр возможностей, предлагаемых различными производителями 8051, то можно придти к выводу, что эти микроконтроллеры не уступают любому другому семейству.

Являясь создателем архитектуры 8051, компания Intel не внесла существенных изменений в первоначально разработанные микроконтроллеры. Наиболее значительное развитие архитектуры 8051 сделано компанией при разработке микроконтроллеров семейств MCS-151 и MCS-251. Эти микроконтроллеры, которые по выводам и объектному коду совместимы с 8051 и 87С51, обеспечивают существенное повышение производительности.


Компания Atmel, которая является «новичком» в области микроконтроллеров, предлагает «урезанный» вариант 8051 (наряду с семейством микроконтроллеров AVR), который размещен в 20-выводном корпусе. Эта версия 8051 ориентирована на использование в относительно простых и дешевых приложениях. В некоторых версиях микроконтроллеров 8051 компании Atmel (AT89S1051 и AT89S2051) содержится память EEPROM для хранения программ и энергонезависимая память данных, что делает их удобными для использования в процессе изучения и для выполнения радиолюбителями экспериментальных разработок.

Компания Dallas Semiconductor разработала быстродействующий вариант микроконтроллера 8051 HSM («high-speed microcontroller»). Выпустив этот микроконтроллер, компания Dallas Semiconductor стала лидером по быстродействию среди всех поставщиков 8051. В микроконтроллерах 8051 HSM команды выполняются в два — три раза быстрее по сравнению с базовым семейством 8051.

Одним из наиболее интересных вариантов является микроконтроллер Dallas Semiconductor с возможностями криптографии. Это устройство позволяет загрузить прикладную программу и хранить ее во внешней памяти SRAM в зашифрованном виде. Эта микросхема очень полезна для приложений, связанных с дистанционным контролем, где необходимо обеспечить секретность данных.


Компания Philips Semiconductor имеет наиболее широкую по своим возможностям номенклатуру микроконтроллеров, основанных на архитектуре 8051. При разработке приложений, где требуются различные периферийные устройства, рекомендуется просмотреть каталог Philips.Там может найтись микроконтроллер, который реализует необходимые функции без подключения внешних устройств. Наряду с широким выбором стандартных вариантов 8051, компания Philips выпускает микроконтроллеры с архитектурой ХА, которая расширяет архитектуру 8051, обеспечивая возможность обработки 16-разрядных данных.

Одной интересных разработок 80-х годов было создание «совмещенных» микроконтроллеров и микропроцессоров, в которых стандартная память EPROM или ROM подключалась непосредственно к задней стороне процессора. Преимуществом такого включения было то, что процессор не надо было удалять из устройства для обновления программного обеспечения. Такая комбинация более дешевая, так как не применяется гибридная технология (при изготовлении процессора и памяти EPROM/ROM используются разные технологические процессы). Экономится также место на плате. Эти преимущества реализованы в некоторых контроллерах 8051 компании Oki, где используются микросхемы EPROM/ROM, включаемые в верхнюю часть микроконтроллера.


ГЛАВА

8

АРХИТЕКТУРА ПРОЦЕССОРА

8051

Краткое содержание

Центральный процессор (CPU)

Способы адресации 8051

Адресация внешней памяти

Прерывания

Выполнение команд 8051

INTEL MCS 151/251

Быстродействующие микроконтроллеры DALLAS SEMICONDUCTOR

Микроконтроллер 8051 является представителем Гарвардской архитектуры с возможностями обращения к внешней памяти. Архитектура 8051 — это типичная архитектура микроконтроллеров: если вы сравните ее с архитектурой AVR и PIC, то не обнаружите принципиальных отличий. Однако вы ошибаетесь, если думаете, что микроконтроллеры 8051 функционируют аналогично микропроцессорам Intel 8080 или 8086.


Центральный процессор (CPU)

На верхнем уровне базовая архитектура 8051 ничем не отличается от других Гарвардских архитектур, представленных в данной книге. На рис. 8.1 показана архитектура 8051, которая выглядит аналогично ранее описанной Гарвардской архитектуре. В большинстве случаев программировать микроконтроллер 8051 несложно. Существуют некоторые особенности, но если вы однажды в

них разобрались, то в последующем программирование не вызовет особых затруднений. Две особенности, на которые стоит обратить внимание — организация памяти (включая «память программ» и «регистры» на рис. 8.1) и специфическая реализация регистров.

Рис. 8.1. Базовая архитектура микроконтроллера 8051.

Рассмотрим подробнее работу регистров (рис. 8.2). Первые 256 ячеек памяти данных можно рассматривать как регистры, которые выбираются с помощью прямой адресации (адрес регистра содержится в команде) или косвенной адресации (адрес регистра содержится в индексном регистре). Отметим, что на рис. 8.2 выделены адреса с 020h no 02FH при прямой адресации. Эти 16 байт могут адресоваться побитно или побайтно. Некоторые биты в служебных регистрах, имеющих адреса выше 80h, могут быть доступны непосредственно. Если требуется изменить отдельные биты в других служебных регистрах, то можно загрузить их содержимое в область, адресуемую побитно (адреса с 020h no 02FH), модифицировать, а затем записать обратно в служебный регистр. Эти 128 бит могут также адресоваться как обычные 16 байт памяти.


Прямая адресация памяти данных в диапазоне адресов с 80h no FFh вызовет обращение к служебным регистрам. Эта область регистров зарезервирована для процессора и периферийных устройств (рис. 8.3). Затененные области на рисунке могут содержать или не содержать регистры для управления периферией. В незатененных областях представлен стандартный набор служебных регистров, которые имеются во всех моделях микроконтроллеров 8051. В этот набор входят: указатель стека, индексный указатель DPL и DPH, регистры портов ввода-вывода, регистр состояния PSW и аккумуляторы. Далее будет дана более подробная информация об этих регистрах.

Рис. 8.2. Распределение адресов памяти данных с OOOh no OFFh Основные регистры 8051

Рис. 8.3. Стандартные адреса служебных регистров.

При всех операциях с прямой адресацией реализуется доступ только к первым 256 ячейкам памяти данных, которые помечены как «регистры» на рис 8.1. Для доступа к ячейкам памяти, расположенных за пределами :>того 256-адресного пространства, необходимо использовать 16-разрядный индексный регистр DPTR, который состоит из 8-разрядных регистров DPL (младший байт) и DPH (старший байт).

Для косвенной (или индексной) адресации используется содержимое указателя стека или индексного регистра. Служебные регистры, расположенные в


диапазоне адресов с 80h no OFFh, не могут быть выбраны с помощью косвенной адресации. Многие производители помещают на это место память данных RAM, которая может быть адресована только при помощи указателя стека или индексного регистра. При таком размещении памяти получается, что при обращении к 256 первым адресам можно иметь доступ к 384 различным ячейкам памяти и регистрам. Это 256 байт памяти данных, которая полностью доступна только при использовании команд с косвенной адресацией, и 128 байт служебных регистров, которые доступны только командам с прямой адресацией. Используя данную информацию о размещении регистров, рассмотрим функционирование базовой архитектуры с помощью схемы, показанной на рис 8.4. При перечислении служебных регистров не рассматривался вопрос об их назначении. Ниже описывается назначение регистров процессора, а регистры периферийных устройств будут рассмотрены позже.[image]


Рис.8.4. Структура 8051, реализующая прямую адресацию данных.

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

Слово состояния программы (PSW) содержится в регистре состояния микроконтроллера 8051. Формат этого слова показан на рис 8.5, где биты CY и АС являются флагами переноса и полупереноса (перенос между полубайтами при обработке двоично-десятичных чисел). Флаг переноса CY устанавливается, когда при сложении или вычитании возникает перенос в старший байт или заем из него. Это упрощает обработку чисел с разрядностью 16 или

Глава 8. Архитектура процесса 8051 181

более бит. Флаг полупереноса АС устанавливается, когда при сложении или вычитании результат операции над младшим полубайтом влияет на результат операции над старшим полубайтом. Эти флаги есть во всех микроконтроллерах, представленных в данной книге.


Рис. 8.5. Слово состояния программы (PSW).

Рассматривая содержимое слова PSW, можно заметить отсутствие флага нуля, который устанавливается в 1, когда результат арифметической, логической, битовой или сдвиговой операции равен нулю. Проверка на нуль в 8051 происходит по другому. Команда «jz» проверяет содержимое аккумулятора (А) и выполняет переход, если его содержимое равно нулю.

Биты «RSO» и «RS1» выбирают текущий 8-байтовый банк регистров, которые используются для реализации однобайтных операций. Команды, адресующие регистры этих банков, содержат меньше байтов и выполняются быстрее. Два младших регистра каждого банка (RO и R1) могут использоваться для индексной адресации первых 256 байт в памяти данных.

Указатель стека SP может адресовать только на первые 256 байт памяти. После включения микроконтроллера его содержимое принимает значение 007h, но можно изменить это значение, например, на 028h, перемещая стек в верхнюю часть памяти данных. Может показаться странным, что команда загрузки в стек «push» производит инкремент (увеличение на 1) содержимого регистра SP, тогда как в большинстве других типов микроконтроллеров выполняется его декремент (уменьшение на 1). Это означает, что стек в 8051 растет вверх — в направлении увеличения адресов, а не вниз — в сторону уменьшения, как в большинстве микроконтроллеров. Если вы хотите иметь большой объем стека, то следует установить в указателе стека более низкое начальное значение адреса, а не более высокое, как в других микроконтроллерах.


Работая с микроконтроллером 8051 HSM, удобно установить начальное значение регистра SP равным 80h, так как эта область памяти данных доступна только через индексный регистр, каким является и указатель стека. Таким образом, область стека будет располагаться в верхней области первых 256 байт памяти, и можно не беспокоиться о том, чтобы стек не наложился на какой-либо массив прямо-адресуемых данных.

Регистр DPTR имеет разрядность 16 бит и может адресовать до 64 Кбайт памяти, начиная с области адресов младших 256 ячеек (регистров). Этот регистр предназначен, в основном, для адресации внешней памяти, и его использование будет более детально рассмотрено в следующих разделах.

На рис 8.6 приведена структура микроконтроллера, в которой показаны служебные регистры. Можно видеть, как производится доступ к указателю стека SP, регистрам DPTR, А и PSW, размещенным в области прямо-адресуемых регистров, и как они взаимодействуют с шинами адреса и данных. Данная структура является почти полной. Осталось добавить только мультиплексор,

выбирающий непосредственный операнд, заданный в команде, или операнд из области регистров. В результате получаем полностью законченную структуру (рис. 8.7), иллюстрирующую функционирование микроконтроллера 8051.


Рис. 8.6. Структура 8051, реализующая косвенную адресацию данных

Рис. 5.7. Структура 8051, реализующая непосредственную адресацию данных.

Сравним ее со структурой микроконтроллера Dallas Semiconductor 80C320, приведенной в руководстве по его использованию (рис. 8.8).

Рис. 8.8. Структура микроконтроллера Dallas Semiconductor DS80C320

Можно заметить, что эти структуры не имеют почти ничего общего. Если вы сравните структуры, приведенные в этой книге для других типов микроконтроллеров, со структурами, которые представляют их производители, то также обнаружите большое различие или полное несоответствие. Это несоответствие происходит из-за того, что автор данной книги хочет наглядно показать, как работает микроконтроллер. Основное внимание уделяется описанию процесса выполнения команд, чтобы читателю было понятно, что происходит внутри процессора для получения необходимого результата выполняемой операции. В приведенных упрощенных структурах не показан интерфейс процессора с периферийными устройствами, который будет описан в последующих главах.

Является ли такой метод изучения различных микроконтроллеров и их процессоров наиболее правильным? Трудно дать однозначный ответ на данный вопрос. Однако можно утверждать, что это очень эффективный способ, чтобы понять, как работают микроконтроллеры, и визуально представить, как происходит пересылка данных внутри них.


Способы адресации

Способы адресации в микроконтроллере 8051 реализованы с учетом приоритета доступа к определенным массивам данных. В большинстве приложений часто обращаться приходится к очень небольшому количеству переменных, к некоторым переменным обращение происходит время от времени, а большая часть переменных выбирается достаточно редко. При проектировании 8051 компания Intel определила для доступа к данным однобайтный цикл выполнения команд, который содержит 12 тактов. Доступ к регистрам текущего банка выполняется с помощью однобайтных команд за 12 тактов. Имеются также двухбайтные команды, выполняющие обращение к первым 256 адресам памяти за 24 такта (2 цикла), и трехбайтные команды для доступа к ячейкам памяти за пределами первых 256 байт, для выполнения которых требуется несколько циклов. Графически это показано на рис. 8.9, который полезно помнить при разработке сложных прикладных программ на языке ассемблера. При разработке программ следует стремиться оптимизировать размещение переменных в памяти данных, чтобы обращение к ним производилось за меньшее число циклов и требовало меньшего числа байт, занимаемых в памяти программ.


Первый из рассматриваемых способов — непосредственная адресация не требует обращения к регистрам или памяти данных. При непосредственной адресации на обработку поступает операнд, который является частью команды. При программировании на языке ассемблера значение непосредственного операнда помечается символом #, например:

add A, #77 ; Добавить 77 к содержимому аккумулятора

Эта команда добавляет десятичное число 77 к содержимому аккумулятора, результат поступает обратно в аккумулятор.[image]


Рис. 8.9. Сравнение способов адресации 8051.

Адресация к регистровым банкам обеспечивает доступ к одному из 8 байтов, размещенных в текущем банке. Это наиболее эффективный способ доступа к данным с точки зрения уменьшения объема памяти программ и сокращения числа требуемых командных циклов. Большинство команд, работающих с регистровыми банками, выполняются за один цикл и занимают только один байт. Регистры банка имеют имена, начиная с RO и по R7.

Прямая адресация отличается от регистровой тем, что можно получить доступ к любому байту в первых 256 ячейках памяти, указав 8-разрядный адрес. Ячейки с адресами от 080h no OFFh не могут быть выбраны при помощи прямой адресации. Если написать команду:

mov A, 088h

то в аккумулятор загрузится содержимое служебного регистра TCON (регистр управления таймером), а не содержимое ячейки памяти. Не следует путать прямую адресацию с непосредственной. Если в команде с непосредственной адресацией забыть поставить символ # перед операндом, то будет выполняться команда с прямой адресацией. Это является одной из распространенных синтаксических ошибок при программировании микроконтроллеров 8051. Следует быть особенно внимательным при разработке и отладке прикладных программ, чтобы быть уверенным, что реализуется требуемый способ адресации.


Косвенно-регистровая адресация осуществляется с помощью регистров RO или R1 текущего банка. В этом случае содержимое регистра RO или R1 используется как 8-разрядный адрес для обращения к первым 256 байтам памяти данных.

orl A,@RO

На выполнение косвенно-регистровой адресации указывает символ @ перед именем регистра RO или R1. Использование других регистров банка приведет к ошибке.

Регистр DPTR используется в качестве 16-разрядного индексного регистра. При этом можно указать смещение, которое добавляется к содержимому

DPTR для формирования адреса операнда. Такой способ адресации, который называется косвенно-регистровая со смещением, удобно использовать для доступа к отдельным элементам в структурах данных.

Когда необходимо получить доступ к данным, хранящимся в памяти программ, можно воспользоваться командой «move А, @А+РС». Эта команда адресует в памяти программ байт, который расположен со смещением относительно адреса текущей команды. Значение смещения, которое размещается в аккумуляторе А, должно быть заранее вычислено перед выполнением команды.


Оставшиеся способы адресации используются для изменения текущего содержимого программного счетчика. Подобные способы адресации есть и в других микроконтроллерах. Подробнее о них будет рассказано в главе «Система команд 8051».

Адресация внешней памяти

Микроконтроллер 8051 может адресовать до 64Кбайт внешней памяти программ и до 64К внешней статической памяти данных SRAM. Микроконтроллер содержит встроенный интерфейс внешней памяти, который использует для обращения к ней линии портов РО и Р2 (рис. 8.10.)

Рис. 8.10. Обращение микроконтроллера 8051 к внешней памяти.

Каждый раз, когда при обращении к памяти программ или данных сформированный адрес выходит за границы внутренней памяти, активизируются внешние выводы, и микроконтроллер 8051 пытается выбрать внешнюю память. Если вы знакомы с другими типами микроконтроллеров, то у вас возникнет вопрос, как это можно выполнить с помощью «типовых» портов вво-

да-вывода. Вы можете обратиться к главе «Аппаратные особенности 8051», чтобы посмотреть, как это реализуется, и какие сигналы при этом поступают на внешние выводы. При обращении к внешней памяти сначала выдаются младшие 8 бит адреса, затем по этом же линиям производится запись или чтение данных.


Временные диаграммы сигналов при чтении внешней памяти программ показаны на рис 8.11. Фактически доступ к внешней памяти производится так же, как обращаются к внешней 8-разрядной памяти микропроцессоры Intel 8085 и 8088. Для доступа к памяти данных RAM вместо сигнала разрешения выборки памяти программ _PSEN используются сигналы «чтения» _RD и «записи» _WR. В микроконтроллере Dallas Semiconductor HSM 8051 длительность цикла обращения к памяти может быть увеличена путем «расширения» цикла дополнительными тактами. Такое увеличение длительности цикла может потребоваться при переходе от классических микроконтроллеров 8051 на HSM, которые реализуют более быстрые командные циклы, чтобы при обращении к «медленным» устройствам выполнялись требуемые временные соотношения.

Figure 8.11. Цикл чтения внешней памяти программ ROM.

Если при подключении внешней памяти не требуется использовать все 64 Кбайт адресуемого пространства, то часть линий ввода-вывода может быть использована не для адресации памяти, а по своему прямому назначению. Для этого необходимо разместить внешнюю память в верхней части адресного пространства, чтобы на соответствующих адресных выводах всегда поддерживался высокий уровень. Тогда эти выводы можно использовать для приема или выдачи внешних сигналов.


Рассмотрим пример проектирования устройства, к которому требуется подключить 2 Кбайт внешней памяти данных SRAM с помощью соответствующих выводов портов РО, Р2, но два из этих выводов необходимо оставить для реализации ввода-вывода данных. В этом случае память SRAM может быть подключена к микроконтроллеру 8051 так, как показано на рис. 8.12. На этой \ схеме линии Р2.5 и Р2.6 порта Р2 могут использоваться для ввода-вывода

соответствующих битов данных, так как при обращении к памяти SRAM их состояние не меняется. Если бит адреса установлен в 1 (высокий уровень), то соответствующая линия ввода-вывода не будет изменять своего состояния. Это означает, что линии ввода-вывода, использующиеся для адресации памяти, должны всегда быть установлены в высокое состояние, чтобы не возникло проблем с доступом к ячейкам памяти с определенными адресами.

Рис. 8.12. Подключение внешней памяти SRAM емкостью 2 Кбайт.

Как отмечено ранее, устройства ввода-вывода можно достаточно просто подключать к микроконтроллеру 8051, если использовать один из выводов порта Р2 для выдачи сигнала разрешения выборки _CS или тактового сигнала для внешнего устройства. Один из примеров применения 8051 демонстрирует, как дешифрация адреса используется для обращения к устройствам ввода-вывода, размещенным в адресном пространстве внешней памяти. На рис. 8.13 устройство Device 1 имеет адрес OFEOOh, устройство Device 2 -адрес OFDOOh, а память ROM (Device 0) размещается, начиная с адреса OFCOOh. Эта схема позволяет осуществлять доступ к отдельным устройствам, не оказывая влияния на другие, и без использования сложной дополнительной логики. Младшие 8 разрядов адреса используются для адресации внутри периферийных устройств.


Одной из интересных возможностей является использование общей внешней памяти для хранения программ и данных. Это достигается путем объединения сигналов PSEN и RD при помощи логической операции И (рис. 8.14). С помощью такого включения можно реализовать схему, в которой микроконтроллер 8051 производит запись в свою память. Такая схема может использоваться в качестве экспериментального средства отладки для загрузки

программы в память SRAM. Возникает интересный теоретический вопрос -относится ли данная схема относится к архитектуре Фон Неймана и к Гарвардской архитектуре?

Рис. 8.13. Ввод-вывод с отображением на память.

.

Рис. 8.14. Реализация общей памяти программ и данных.

Прерывания

Карта нижней области памяти программ микроконтроллера 8051 показана на рис. 8.15. По адресу 0 располагается вектор сброса в начальное состояние (к этому же вектору происходит обращение при переполнении сторожевого таймера). При сбросе микроконтроллер переходит к выполнению команды, адрес которой задается этим вектором. После подтверждения прерывания управление передается по соответствующему адресу, то-есть прерывание О вызывает переход по адресу 03h, прерывание 1 - по адресу OBh и так далее. На первый взгляд в этом нет ничего особенного — все микроконтроллеры, представленные в данной книге, работают подобным образом. Но особенность заключается в том, что другие микроконтроллеры не предоставляют область памяти для непосредственного размещения программ обработки каждого вида прерываний. Восемь байт памяти программ, выделяемые для каждого обработчика прерываний могут быть использованы, чтобы разместить обработчик целиком или обеспечить переход к более сложной программе обработки. Выделение восьми байт для размещения команд позволяет достаточно легко осуществлять обращение к простым процедурам обработки прерываний, например, таким, как выполнение сброса прерывания от таймера или увеличение содержимого счетчика реального времени.


Рис. 8.15. Адресация прерываний в 8051

Конечно, восьми байт недостаточно, чтобы сохранить содержимое регистров контекста прежде, чем перейти к обработке прерывания. Однако в 8051 нет флага нуля, поэтому содержимое слова состояния PSW сохраняется, если при обработке прерывания не используются команды сложения и вычитания, которые изменяют флаги переноса в регистре PSW. Простая установка битов или инкремент и декремент содержимого регистров выполняются без изменения содержимого PSW.

Выполнение команд 8051

Процессорное ядро 8051 отличается от процессоров большинства других микроконтроллеров. Микроконтроллер 8051 содержит процессор с микропрограммным управлением, тогда как другие микроконтроллеры используют про-цесоры с аппаратным управлением (рис 8.16).

Что такое микропрограммируемый процессор? Это процессор внутри процессора или конечный автомат, который выполняет каждую команду обращаясь к адресу микропрограммы, реализующей ее выполнение. Когда очередная команда поступает в регистр команд, определенные биты команды используются для указания точки входа в микропрограмму, которая содержит последовательность микрокоманд. Эти микрокоманды поступают в дешифратор микрокоманд и исполнительное устройство, которые выполняет необходимые операции, пока не поступит микрокоманда «конец выполнения команды».


Рис 8.16. Процессор с микропрограммным управлением в микроконтроллере 8051

Следует отметить, что разрядность регистра команд больше, чем разрядность памяти программ. Память команд микроконтроллера 8051 имеет разрядность 8 бит, а многие команды содержат более 8 бит. Это значит, что перед выполнением вся команда должна быть загружена в регистр команд, что может потребовать дополнительного времени.

Процессор с аппаратным управлением использует отдельные группы битов в поступившей команды для включения специальных логических блоков, которые могут быть уникальными для каждой команды. Эти блоки работают как комбинаторные схемы, обеспечивая выполнение команды (рис. 8.17).

Каждый из этих методов имеет свои преимущества. Процедура микропрограммирования обычно проще, чем разработка аппаратной реализации. Поэтому проектирование процессоров с микропрограммным управлением может быть проведено в более короткие сроки и при этом меньше вероятность появления проблем в определенных ситуациях. Показательным является следующий при-

мер. Несколько лет назад компания IBM решила создать микропроцессор, который мог бы выполнять ассемблерный набор команд компьютеров серии IBM/ 370. Прежде чем начать разработку нового процессора, компания провела анализ существующих процессоров и обнаружила, что микропроцессор Motorola 68000 имеет такую же аппаратную организацию, как процессор IBM/370, хотя набор выполняемых им команд был совершенно другим. Компания IBM заказала компании Motorola переписать микропрограмму, составленную для микропроцессора 68000, и в результате получила новый микропроцессор, выполняющий команды IBM/370, за малую часть стоимости разработки нового прибора.


Рис. 8.17. Процессор с аппаратным управлением.

Процессор с аппаратным управлением обычно имеет намного более сложное устройство, так как подобные операции много раз реализуются аппаратными средствами. Например, операции записи или чтения содержимого регистра повторяются многократно для каждого типа команд. Это означает, что проект такого процессора будет менее гибким и более сложным в отладке, чем при микропрограммной реализации. Однако процессор с аппаратным управлением может работать значительно быстрее.

Классический микроконтроллер 8051 использовал процессор с микропрограммным управлением, который требует от 12 до 24 тактов для выполнения каждой команды. Все другие микроконтроллеры, представленные в этой книге, работают существенно быстрее.

Ниже будут представлены три типа микроконтроллеров, совместимых с 8051, которые были разработаны для повышения скорости выполнения набора команд 8051.

INTEL MCS 151/251

Микроконтроллеры MCS-151 и MCS-251 представляют собой усовершенствованные версии классического 8051, в которых реализованы некоторые изме-


нения и улучшения. Улучшения касаются расширения набора команд для пересылки 16/32-разрядных данных, возможность адресации памяти данных объемом до 16 Мбайт, при этом объем стека может быть увеличен до 64 Кбайт вместо первоначальных 256 байт памяти. Что наиболее важно — время выполнения команд сокращено до 2-4 тактов.

Существуют версии MCS-151 и MCS-251, которые совместимы с 8051 по выводам и программному обеспечению (на уровне кодов). Эти микроконтроллеры могут работать на меньшей частоте, обеспечивая такую же производительность, как 8051, которые они замещают. При этом они потребляют меньшую мощность и производят меньше помех. Такое применение микроконтроллеров предстаачяет значительный интерес, хотя многие пользователи обычно ассоциируют усовершенствование микроконтроллеров только с повышением скорости их работы, не обращая внимание на возможности применения новых приборов при сохранении прежней рабочей скорости. По-видимому, развитие технологии персональных компьютеров и рабочих станций приучило нас думать, что любое усовершенствование имеет целью только повышение быстродействия.

MCS-151 - это замена 8051 с тем же набором команд и основных характеристик. MCS-251 — это усовершенствование 8051/MCS-151 в направлении дальнейшего повышения производительности. Микроконтроллер MCS-251 работает в 15 раз, a MCS-151 в 5 раз быстрее классического 8051. Оба микроконтроллера — MCS-151 и MCS-251, содержат процессоры с аппаратным управлением, которые обеспечивают конвейерное выполнение команд с опережающей выборкой следующей команды. Эта их особенность является основной причиной более быстрого выполнения программ.


Высокоскоростные микроконтроллеры DALLAS SEMICONDUCTOR

Для реализации описанных в данной книге устройств на базе 8051, использовались высокоскоростные микроконтроллеры Dallas Semiconductor HSM. Компания Dallas Semiconductor впервые предложила заменить микропрограммное процессорное ядро на ядро с аппаратным управлением. В результате время выполнения команд составило 4, 8, 12 или 16 тактов, что обеспечило при такой же тактовой частоте повышение производительности от 1,5 до 3 раз по сравнению с обычным 8051.

Из-за различия времени выполнения команд нельзя просто включить в проектируемое устройство вместо 8051 микроконтроллер Dallas Semiconductor HSM с пониженной тактовой частотой, как это можно делать с MCS-151 Нелинейное увеличение производительности (по данным компании Dallas Semiconductor применение HSM дает повышение производительности, в среднем, в 2,5 раза по сравнению с 8051) может вызвать некоторые проблемы при замене 8051 на HSM в некоторых приложениях. Однако если для обеспечения задержек в приложении используются только таймеры, то не возникает проблем при переносе прикладных программ с 8051 на HSM.

На диаграммах, иллюстрирующих реализацию команд, приведено количество тактов, требуемых для их выполнения, для классического 8051 и для HSM.


ГЛАВА

9

АППАРАТНЫЕ СРЕДСТВА МИКРОКОНТРОЛЛЕРОВ 8051

Краткое содержание

Типы корпусов

Параллельный ввод-вывод

Таймеры

Сторожевой таймер

Последовательный ввод-вывод

Микроконтроллеры Dallas Semiconductor с шифрованием информации

Программирование

Маркировка микроконтроллеров

Основной проблемой при написании этой главы стало выделение аппаратных средств, общих для всех моделей 8051. Микроконтроллеры с архитектурой 8051, выпускаемые различными производителями, обладают множеством специфических особенностей. Поэтому при описании различных аппаратных средств микроконтроллера будут даваться ссылки на производителя и необходимые комментарии.


Типы корпусов

Основным вариантом корпуса для микроконтроллеров 8051 является DIP шириной 1,52 см. На рис. 9.1 показан стандартный корпус и 20-выводная версия 8051, выпускаемая компанией Atmel.[image]


Рис 9.1. Микроконтроллеры Atmel AT89C2051 и Intel 8051 в корпусах DIP

Микроконтроллер 8051 выпускается также в разнообразных SMT-корпу-сах для поверхностного монтажа.. Расположение выводов в SMT-корпусах не совпадает полностью с разводкой РТЫ корпусов, что необходимо учитывать при разработке различных изделий.

Большинство производителей придерживается стандартной разводки Intel в своих версиях 8051, выпускаемых в 40-выводных DIP-корпусах. Показанная на рис. 9.1 версия Atmel интересна тем, что реализует большинство возможностей, присущих классическому 8051, используя значительно меньшее количество выводов.

Параллельный ввод-вывод

Хотя все микроконтроллеры, описанные в данной книге, имеют порты параллельного ввода-вывода, порты 8051 радикально отличаются от них по своим возможностям и особенностям работы. На рис. 9.2 показано типовое включение вывода параллельного порта 8051. Не все порты микроконтроллера подключаются к высокому уровню Vcc через соответствующий транзистор. В стандартном 8051 порт 0 не имеет такого подключения, а порты 1,2 и 3 подключены к Vcc. Описать работу такой схемы включения проще всего, если рассматривать ее как выход с «общим коллектором» (реально с «общим стоком»), который может подключаться к высокому уровню потенциала.


Схема на рис. 9.2 работает как двунаправленный ввод-вывод. В схеме используется двухфазный выходной каскад на двух транзисторах. Когда в триггер регистра данных записана логическая 1, нижний транзистор закрыт, верхний транзистор открыт, и внешний вывод через резистор подключается к высокому потенциалу Vcc. При записи логического 0 верхний транзистор закрывается, открывает нижний транзистор, который подключает вывод к «земле». Это означает, что линия всегда активна. Как же происходит чтение данных?

Рис. 9.2. Подключение вывода параллельного порта 8051.

Когда в триггер регистра записана 1, данная схема имеет относительно большое выходное сопротивление («слабый» выход). При подключении к внешнему выводу другого источника сигнала с низким выходным сопротивлением («сильный» выход) состояние вывода будет определяться этим источником. Поэтому в режиме чтения на внутреннюю шину данных 8051 будет поступать значение, поступающее от внешнего источника. Такая организация ввода-вывода в некоторых случаях облегчает подключение внешних устройств, а в некоторых усложняет. Сложности возникают, если выход микроконтроллера должен быть источником достаточно большого вытекающего тока. Если микроконтроллер 8051 должен выдавать в нагрузку ток более нескольких десятков микроампер, то к выход следует сделать более мощным. Из-за высокого выходного сопротивления входная линия может относительно долго (порядка микросекунд) переключаться из низкого состояния в высокое. В микроконтроллерах Dallas Semiconductor на линиях ввода-вывода включены мощные драйверы, которые переводят линию в высокое состояние за 2 такта. В ряде периферийных устройств, например, в последовательных портах, также часто используются схемы, обеспечивающие более быстрое переключение выхода в высокое состояние.


Таймеры

Внутренние таймеры, используемые в 8051, являются наиболее гибкими для применения, по сравнению с таймерами других микроконтроллеров, представленных в этой книге. Возможны четыре режима работы таймеров, которые дают возможность управлять различными устройствами с наименьшими программными затратами. Таймеры 0 и 1, которые имеют 8/16 разрядов, входят в состав большинства моделей 8051. Четыре различных режима работы реконфигурируют структуру таймера для выполнения разнообразных задач (рис. 9.3). В этой структуре TLn и ТНп представляют 8 младших и 8 старших

разрядов каждого таймера, где п -его номер (например, TLO - младший 8-разрядный регистр таймера 0).

Рис 9.3. Структура таймера 8051.

Источником синхросигналов, переключающих таймер, могут быть тактовые импульсы, частота которых уменьшается при помощи делителя, или внешний сигнал. Выбор источника определяется битом С/_Т в регистре TMOD таймера. Биты выбора режима в регистре TMOD определяют режим работы таймера.

В режиме 0 таймер конфигурируется как 13-разрядный счетчик, переполнение которого фиксируется по возникновению переноса из разряда 4 регистра TLn. В режиме 1 таймер работает как 16-разрядный счетчик.


Режим 2 обычно используется для задания скорости обмена встроенного последовательного порта. Для счета используется только счетчик TLn. Когда содержимое этого счетчика превышает OFFh, то в него загружается значение, которое содержится в регистре ТНп, и счет возобновляется. Последовательный порт может использовать сигнал переполнения, чтобы задать скорость обмена.

В режиме 3 регистры TLO и ТНО работают как два независимых таймера. Этот режим обеспечивается только в таймером 0, так как для его реализации требуются как внешний так и внутренний синхросигналы, а таймер 1 не может переключаться внешним сигналом. Таймер ТНО переключается внешними сигналами, a TLO - внутренними тактовыми импульсами. Режим 3 может применяться для реализации тахометра, когда счетчик ТНО определяет количество событий (например, оборотов вала), a TLO - промежуток времени, в течение которого они произошли.

В расширенной версии микроконтроллера 8052 добавлен таймер 2, который является 16-разрядным. Этот таймер может использоваться для обнару-

жения и измерения длительности импульсов, приходящих от внешнего источника. Он также может использоваться для задания скорости работы второго последовательного порта.


Стоит заметить, что число циклов, загружаемое в TLn из ТНп в режиме 2, меньше требуемой задержки. Подсчет, который показывает, как можно получить необходимую задержку, будет приведен далее в этой главе, когда речь пойдет о последовательных портах.

Сторожевой таймер[image]


Сторожевой таймер, имеющийся в некоторых моделях 8051, используется для возврата микроконтроллера из спящего режима, сброса сбившейся программы или прерывания работы микроконтроллера. Сторожевой таймер может быть сброшен только программным путем (рис. 9.4).

Тактовый сигнал

Рис. 9.4. Сторожевой таймер 8051.

Используя управляемый делитель частоты и блок выбора интервала времени, можно запрограммировать сторожевой таймер на отсчет интервалов длительностью от 128 тысяч до 17 миллиардов тактов. Другими словами, если 8051 работает на частоте 12 MHz, то интервал составит от 10 мс до 24 мин.

Для сброса сторожевого таймера необходимо выполнить следующую последовательность команд:

mov OC7h, #OAAh mov OC7h, $055h mov WDCON, $002h

;Послать контрольный символ

;Сбросить сторожевой таймер

Эта последовательность команд используется, чтобы предотвратить нежелательный сброс сторожевого таймера, если программа потеряла управление. Такой «таймированный» доступ используется также для других операций с


периферией, чтобы предотвратить случайную установку или сброс внешних аппаратных интерфейсов.

После того как в регистр записана последовательность AAh/55h, сброс должен последовать в течение четырех командных циклов. Чтобы быть уверенным, что это произойдет, следует запретить прерывания перед записью первого символа и разрешить их после команды сброса..

Последовательный ввод-вывод

Последовательный порт 8051 — это довольно сложное устройство, которое способно посылать данные синхронно и асинхронно в различных режимах (рис. 9.5). Структура на рис. 9.5 вероятно будет отличатся от последовательных портов других микроконтроллеров. Основная причина этого состоит в том, что последовательный порт 8051 способен работать как в синхронном, так и асинхронном режимах.

Рис. 9.5. Блок схема последовательного приемника/передатчика 8051.

Для синхронного режима (режим 0) используется тактовый сигнал процессора. Данные посылаются и принимаются по линии RX, а синхросигналы по линии ТХ. В синхронном режиме 8051 может выступать только в роли ведущего устройства (рис. 9.6). Передача данных инициируется записью по адресу регистра данных последовательного порта. Данные передаются, то-есть имеют достоверные значения при поступлении переднего фронта тактового сигнала.


После приема символа может быть реализовано аппаратное прерывание, или можно следить за состоянием порта с помощью программного опроса значения бита «RI_n» в регистре управления SCON. Скорость синхронной передачи равняется одной четвертой или одной двенадцатой от тактовой частоты процессора.

Рис. 9.6. Временные диаграммы синхронной последовательной передачи 8051.

Скорость асинхронной передачи в классическом 8051 равна частоте командного цикла, деленной на 32 или 64. Это означает что скорость передачи зависит от скорости микроконтроллера. Для получения скорости асинхронной передачи 9600 бод максимальная частота 8051 должна составлять 7,372800 МГц (9600 х 12 х 64). Для асинхронной передачи предназначен режим 1 последовательного порта.

Передача данных инициируется записью байта в сдвиговый регистр передатчика. Передатчик 8051 не имеет регистра хранения, который есть в большинстве других микроконтроллеров. Это означает, что запись данных в регистр передатчика невозможно произвести во время обмена, когда происходит сдвиг байта. Для достижения максимальной скорости передачи необходимо следить за битом «TI» регистра SCON и перезагружать сдвиговый регистр сразу после окончания передачи предыдущего байта.

В других микроконтроллерах следующий байт просто загружается в регистр хранения, и его содержимое копируется в сдвиговый регистр после окончания сдвига. Программа может следить за битом, который показывает наличие данных в регистре хранения, или ожидать прерывания, которое генерируется когда регистр хранения пуст. Такой метод позволяет быстрее передавать данные, не требуя непрерывного слежения за состоянием сдвигового регистра.


После принятия байта, который может содержать 8 или 9 бит, устанавливается бит «RI» в регистре SCON.

Можно генерировать аппаратное прерывание, когда сдвиговый регистр передатчика пуст или сдвиговый регистр приемника заполнен. Биты разрешения прерывания находятся в регистре управления прерываниями IE. Обработчик прерывания должен сбрасывать эти биты, так как они не сбрасываются автоматически перед началом обработки прерывания, как это выполняется при работе с таймером.

Синхронизация асинхронного порта в классическом 8051 может вызвать трудности, если приложение должно работать с разными скоростями. Чтобы решить эту проблему последовательный порт в микроконтроллерах Dallas Semiconductor HSM модифицирован для работы в четырех режимах вместо двух режимов в «классическом» 8051. Два дополнительных режима дают возможность приложению работать со стандартной тактовой частотой, кратной 1 МГц, и реализовать стандартные скорости передачи данных.

Вместо того, чтобы использовать для синхронизации частоту командных циклов, в этих двух дополнительных режимах используется переполнение таймера! или таймера2.

Для таймера I скорость передачи определяется выражением:

DataRate = ( 1 + SMOD ) * Timed OverflowRate / 32 для таймера 2:


DataRate = Timer20verflowRate / 16,

где TimerOverflowRate — скорость переполнения таймера 1 или 2, SMOD = О или 1 — значение бита SMOD в регистре PCON, обеспечивающий удвоение скорости обмена данными через последовательный порт. Вторая возможность реализуется только для последовательного порта 0.

Преобразуем первое выражение, чтобы получить значение скорости переполнения для таймера! (в Гц):

Timer1OverflowRate = 32*DataRate / ( 1 + SMOD ) Период переполнения таймера 1 при этом составит (в секундах): Timed OverflowPeriod = ( 1 + SMOD ) / ( 32*DataRate )

Количество тактов, которое требуется для получения данного периода, равно:

Timer1Overflow/Cycles = ( 1 + SMOD )*ClockFrequency / ( 32*DataRate ),

где ClockFrequency -• тактовая частота микроконтроллера. Значение TimerlOverflowCycles необходимо загрузить в таймер I, чтобы получить требуемую скорость обмена DataRate. Таким образом, если требуется обеспечить скорость обмена 9600 бод, а микроконтроллер 80С320 работает на частоте 12 МГц, то полагая SMOD = 0, получаем:

Timer1OverflowCycles = 12 МГц / ( 32 * 9600 бод ) = 39,063.


Значение 39 следует использовать для определения интервала перезагрузки таймера 1. Чтобы получить необходимое содержимое таймера, надо полученное значение 39 вычесть из 256. Таким образом, для получения скорости обмена 9600 бод необходимо загрузить в таймер! число 217. Использование значения 39 вместо 39,063 даст ошибку в 0,16%. При передаче пакета из 10 бит (по схеме «8-N-1») общая ошибка составит 1,6%.

Микроконтроллеры Dallas Semiconductor с шифрованием информации

Если ваше устройство хранит данные, которые не должны быть произвольно считаны из соображений безопасности, или вы собираетесь поставлять изделия, но не хотите, чтобы программный код был доступен «пиратам», то

можно использовать модификации микроконтроллера 8051 компании Dallas Semiconductor серии DS5000 («криптографические 8051»). В этих микроконтроллерах обеспечивается шифрование содержимого памяти команд и данных. При попытке чтения зашифрованных данных через микроконтроллер они автоматически стираются.

Эти устройства используют внешнюю память SRAM для хранения программ и данных, имеющих адреса выше OFFh, но имеют также 32 линии ввода-вывода, доступные для подключения периферийных устройств (рис. 9.7). На представленной схеме необходимо обратить внимание на следующие особенности. Микроконтроллер управляет питанием внешней памяти SRAM. При помощи дополнительной литиевой батареи эта память превращается в NV-SRAM (nonvolatile static RAM — память с сохранением данных), содержимое которой сохраняется при отключении питания. Шифровальные ключи хранятся во внутренних регистрах микроконтроллера. Таким образом, при отключении питания ключи теряются.


Рис. 9.7. Структура микроконтроллера DS5000 с шифрованием содержимого внешней памяти.

Программа загружается в DS5000 при помощи последовательного протокола. При первом включении питания загрузчик проверяет, подключен ли программатор. Если программатор не подключен, то управление производится с помощью программы, хранящейся в SRAM.

Компания Dallas Semiconductor выпускает криптографические 8051», смонтированные вместе с часами реального времени, памятью SRAM и ли-

тиевой батарейкой в виде модуля, подобного SIMM-модулям динамической памяти. Для этих модулей гарантируется, что информация в SRAM будет сохраняться в течение 19 лет.

Одним из интересных применений DS5000 является построение недорогих эмуляторов. Пмять эмулятора используется для хранения управляющего программного обеспечения и отлаживаемой прикладной программы. При проектировании устройств на базе DS5000 можно использовать все 32 линии ввода-вывода даже при подключении к микроконтроллеру внешней памяти.

Программирование

Приступая к написанию этой главы автор собирался рассмотреть вопросы программирования классического микроконтроллера 8051, не касаясь других его модификаций, выпускаемых различными производителями. Однако при знакомстве с различными версиями выпускаемых 8051 (реально микроконтроллеры с программируемой внутренней памятью EPROM обозначаются 87С51) выяснилось, что используется множество способов программирования, для описания которых потребовалась бы отдельная книга.


Приведенная здесь информация может быть использована для программирования Intel 8751 и Dallas Semiconductor HSM, содержащих EPROM. Прежде чем приступить к программированию других микроконтроллеров, необходимо ознакомиться с прилагающейся к ним документацией. Рекомендуется также купить программатор, способный программировать микроконтроллер, который вы собираетесь использовать.

Рис. 9.8. Схема для программирования 8051.

Для программирования микроконтроллеров 8051 необходимо собрать специальную схему. В случае программирования 8751 и Dallas Semiconductor HSM эта схема имеет вид, показанный на рис. 9.8.

Перед записью каждого байта в память программ EPROM требуется установить его адрес (рис. 9.9). Запись в EPROM производится при подаче на линию ALE/Prog пяти последовательных импульсов. Для обеспечения передачи данных по шинам микроконтроллера во время цикла программирования используется кварцевый резонатор 4,0 - 6,0 МГц. Между программированием байтов вводится временной интервал ожидания, составляющий 48 тактов, что при частоте 4 МГц составляет 12 мкс.

Рис. 9.9. Временная диаграмма программирования 8051.


Чтобы ввести микроконтроллер в режим программирования, необходимо подать высокий уровень сигнала на вход RESET, низкий уровень сигнала на вход _PSEN и установить высокий уровень на входе ALE, который будет переключаться при поступлении команды на запись данных. В приведенной ниже таблице представлен ряд режимов, используемых при программировании

В первую очередь рассмотрим область байтов шифрования. Это 64 байта, записываемые в EPROM, которые изменяют при чтении содержимое памяти программ таким образом, чтобы программу было трудно понять, не зная байтов шифрования. При чтении программного кода реализуется следующий алгоритм:

Output = Control(Address) ^ !Encrypt( Address & 3Fh ),

где «Output» — считываемый байт, «Control» — адресуемый байт программного кода, «Encrypt» - байт шифрования, последовательно выбираемый из 64-байтной области, при выборке которых используются только 6 младших разрядов адреса от OOh до 3Fh), A! — обозначение логической операции эквивалентности (отрицание Исключающего ИЛИ). Если область байтов шифрования осталась незапрограммированной (при этом все биты сохраняют значение 1), то содержимое зашифрованной EPROM может быть считано в исходном виде (без шифрования). Чтобы избежать этого, необходимо записать значения байтов шифрования, отличные от OFFh. Чтобы затруднить расшифровку, байты шифрования не должны иметь одно и то же значение. Чтобы получить случайные значения этих байтов можно использовать произвольные источники кода, фрагменты из посланий по электронной почте, конечные части программ. Можно, например, повторить последнюю часть кода, записанного в память программ, или предварительно записать его в алгоритмической форме (это можно легко выполнить, используя приложение «Основные команды Ассемблера»).


Биты блокирования доступа LB1-3 — это три бита, записываемые в EPROM, которые определяют, как должна работать внешняя память и можно ли считывать содержимое памяти программ. Программирование каждого бита LB производится индивидуально при подаче определенной комбинации входных сигналов, которые приведены в таблице режимов программирования. Назначение битов блокировки LB1-3 указано в таблице, где символом Р обозначено запрограммированное состояние бита (запись 0), а символом U - непрограммированное состояние (сохранение 1).

В ячейках с адресами 30h, 31h и 60h в микроконтроллере содержатся байты сигнатуры, которые записываются производителем и могут использоваться в процессе программирования для определения типа микроконтроллера. По адресу 30h записан код производителя (89h — Intel, DAh — Dallas Semiconductor и I Eh — Atmel). По адресу 31 h указывается номер модели, адрес 60h содержит дополнительную информацию об этой модели. Более подробная информация содержится в документации на микроконтроллер.

Маркировка микроконтроллеров

Информация по маркировке микроконтроллера, которая используется при заказе соответствующего прибора, является специфической для определенного производителя. На рис. 9.10-9.12 показана маркировка различных модификаций микроконтроллеров 8051, выпускаемых некоторыми производителями.


Глава 9. Аппаратные средства микроконтроллеров 8051 207

Рис. 9.11. Маркировка микроконтроллеров Dallas Semiconductor HSM.

Рис. 9.12. Маркировка микроконтроллеров Atmel, совместимых с 8051

ГЛАВА

10

РАЗРАБОТКА ПРИЛОЖЕНИЙ НА БАЗЕ 8051

Краткое содержание

Подключение питания

Системный тактовый генератор

Запуск

Прерывания

Хранение команд

Разработка ОСРВ и монитора для 8051

Разработка приложений для микроконтроллера 8051 несколько отличается от создания приложений для других микроконтроллеров. Это не означает, что разрабатывать приложения для 8051 сложнее, просто он работает немного не так, как другие микроконтроллеры. Во многих отношениях другие микроконтроллеры являются более однородными, чем 8051. Однако изучение микроконтроллеров с различными характеристиками дает возможность пользователям освоить разнообразные методы и средства проектирования, которые позволяют создавать наиболее эффективные варианты приложений для решения конкретных задач.


Подключение питания

Благодаря широкой номенклатуре микроконтроллеров 8051, выпускаемых различными производителями, эти микроконтроллеры можно найти в аппаратуре, работающей в самых разнообразных условиях. Вы можете обнаружить 8051 в системах управления автомобильным двигателем, которые работают в широком диапазоне температур при высоком уровне помех, или в детских игрушках, которые питаются от одной щелочной батарейки типа ААА.

При типичном использовании 8051 (или любого микроконтроллера) необходимо подать напряжение питания +5 В на вывод Vcc или Vdd и О В («земля») на вывод Gnd или Vss (рис. 10.1). Как можно ближе в выводу Vcc необходимо подключить конденсатор емкостью 0,1 мкФ. Длина проводника от вывода Vcc до анода конденсатора должна быть как можно меньше. Катод конденсатора подсоединяется к выводу «земля». Такой «развязывающий» конденсатор обеспечивает фильтрацию помех, поступающих на шину питания во время переходных процессов. Такой способ подключения питания используется для большинства типов 8051 и других микроконтроллеров. Эта же схема может применяться для подключения низковольтного батарейного питания, которое требуется в некоторых приложениях.


Рис.10.1. Подключение питания к микроконтроллеру 8051

Если окажется, что выбранный вами микроконтроллер требует использования более сложных схем подключения питания, то рекомендуем найти другой микроконтроллер. Существует множество микроконтроллеров, которые не требуют каких-то особенных источников питания. Большинство микроконтроллеров будет нормально работать с источниками питания, имеющими значительный уровень помех.

Бывают специфические приложения, где один тип микроконтроллера может работать лучше, чем другие. Но при этом следует выяснить, не предъявляются ли особые требования к цепям питания. Приложение может быть очень критично к источнику питания, поэтому он должен быть достаточно простым и устойчивым, чтобы обеспечить нормальную работу всех активных приборов в разрабатываемом устройстве.

Системный тактовый генератор

Рис. 10.2. Подключение кварцевого и керамического резонатора к 8051.

Подключение внешнего кварцевого резонатора к 8051 выполняется достаточно просто. Для подключения кристалла кварца или керамического резонатора используются схемы, показанные на рис. 10.2. Схема подключения внешнего генератора импульсов приведена на рис. 10.3.


Рис. 10.3. Подключение к 8051 внешнего генератора тактовых сигналов

Первоначально микроконтроллеры 8051 выделялись тем, что они могли работать с высокой тактовой частотой: до 20 МГц для классического 8051. В настоящее время есть микроконтроллеры 8051, которые работают на частоте 33 МГц и более. Несмотря на высокую тактовую частоту производительность 8051 оказывается не столь высокой из-за большого числа тактов, требуемых для выполнения команд. Это обстоятельство обсуждалось в главе «Архитектура микроконтроллера 8051».

Микроконтроллер Dallas Semiconductor 8051 HSM обладает одной интересной особенностью. У него есть внутренний кольцевой генератор, обеспечивающий частоту тактовых импульсов в диапазоне от 2 до 4 МГц. Встроен-

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

Запуск


(установка начального состояния)

Запуск микроконтроллера 8051 отличается от запуска других микроконтроллеров, представленных в данной книге. Для 8051 сигнал запуска RESET имеет высокий активный уровень, и процессор начинает выполнение программы после того, как на этом входе установится низкий уровень сигнала. Этим 8051 отличается от других микроконтроллеров, для которых активный уровень сигнала RESET низкий.

Многие микроконтроллеры 8051 имеют специальную внутреннюю схему с RC- цепью задержки, которая поддерживает низкий уровень сигната запуска в течение определенного времени задержки, пока не стабилизируется работа тактового генератора. Для таких микроконтроллеров не требуется подключать какую-либо схему к выводу запуска. Чтобы при этом иметь возможность выключения и запуска микроконтроллера в процессе отладки системы, можно ввести кнопку для отключения питания. При использовании «классического» Intel 8051 достаточно включить конденсатор емкостью 0,1мкФ между шиной питания Vcc и входом запуска, чтобы быть уверенным, что микроконтроллер начнет выполнение программы после того, как стабилизируется работа генератора (рис. 10.4).

Рис. 10.4. Схема запуска 8051 с внешним конденсатором.


Прерывания

Автор долго думал, что следует сказать о прерываниях в главе, посвященной разработке приложений для микроконтроллера 8051, и решил дать следующую рекомендацию: «Обработчики прерываний должны быть возможно бо-

лее короткими». Это самое лучшее, что можно посоветовать для любого приложения и любого микроконтроллера. В случае использования 8051 размещение обработчика прерывания в виде 8-байтного вектора позволяет более эффективно распределить имеющийся объем памяти программ и избежать трудностей при реализации вложенных прерываний и перемещениях программ их обработки.

Микроконтроллер 8051 имеет достаточно полный набор команд, который позволяет произвести запуск прерывания и установить необходимые флаги, затратив на это не более 8 байт памяти программ. В рассмотренном далее примере разработки часов-термометра с ЖК-дисплеем обработчики прерываний занимают всего 3 байта. При реализации многих прерываний сброс запроса происходит автоматически, избавляя от необходимости делать это в обработчике.

Архитектура 8051 делает процедуру написания обработчиков прерывания наиболее легкой по сравнению с другими типами микроконтроллеров. Если обработчики прерываний будут маленькими, то они могут разместиться в отведенных для них 8-байтных областях и будут выполняться за меньшее число тактов. При этом не возникнет сложностей с реализацией вложенных прерываний, что упрощает разработку приложений.


Хранение программ

В других микроконтроллерах с Гарвардской архитектурой, которые представлены в данной книге (это микроконтроллеры PIC и AVR), все команды имеют одинаковую длину. Это не совсем верно для AVR, но большинство его команд имеют длину 16 бит. Данное свойство не характерно для микроконтроллеров 8051, команды которых могут иметь длину 1, 2 или 3 байта. Это обстоятельство может показаться несущественным, однако оно может повлиять на объем и время выполнения прикладных программ. Могут возникнуть сложности при реализации приложения. Разрядность памяти программ 8051 равна 8 бит. Размещение операнда Reg в команде add A, Reg в текущем 8-байтном регистровом банке сокращает длину и время выполнения команды. Если операнд Reg находится вне текущего банка, то для его выборки потребуется более длинная команда и, следовательно, больше тактов для ее выполнения. Например, при доступе к индексированным данным при помощи одного из регистров текущего банка для выполнения той же операции требуется в пять раз больше времени.

Тщательное планирование использования памяти значительно увеличивает производительность. Рекомендуется при выполнении математических операций использовать данные из текущего банка, где это возможно.


Разработка ОСРВ и монитора для 8051

Некоторые предпочитают не рассматривать вопросы, связанные с операционными системами реального времени и программой-монитором в начале изучения микроконтроллера. Это неверный подход, так как понимание того,

как эти программы работают в данном процессоре, позволяет подготовиться к написанию любых прикладных программ и инструментальных средств.

Микроконтроллер 8051 имеет необычную архитектуру, и он является единственным из описанных в данной книге, для которого представлены и ОСРВ, и монитор-отладчик. Это оказалось возможным благодаря тому, что 8051 обладает достаточным числом регистров, гибким стеком и возможностью адресовать внешнюю память программ и данных. В данном разделе показано, как можно реализовать эти средства с использованием архитектуры 8051.

При реализации ОСРВ важным фактором является доступ к стеку. В некоторых микроконтроллерах, например PIC. нельзя получить доступ к данным в стеке ни для записи, ни для чтения. В микроконтролллерах 68НС05 содержимое стека можно сделать доступным, но операции непосредственной записи в стек и чтения из него не реализуются. Несмотря на это, позднее будет показано, как можно реализовать ОСРВ на 68НС05.


Причиной, по которой необходим доступ к содержимому стека, является переключение задач в ОСРВ. Информация в стеке — адрес возврата и содержимое регистров контекста, требуется, чтобы продолжить задачу с прерванного места. Стек может быть использован для хранения всей информации о задаче. Доступ к данным в стеке легко реализовать при помощи индексного регистра.

Микроконтролллер 8051 содержит четыре 8-байтовых регистровых банка, которые могут использоваться для быстрого доступа к данным. В рассматриваемом примере ОСРВ предполагается, что банк 0 используется для хранения специфичной информации для данной задачи. Слово состояния PSW, содержимое аккумулятора и регистров В, DPTR и SP являются такой информацией. Содержимое этих регистров необходимо сохранить в «информационном блоке задачи».

Следуя этой схеме, карта распределения памяти для 8051 будет иметь вид, показанный на рис Ю.5. Для информационного блока задачи используется 16 байт. В состав этого блока входят восемь регистров банка, шесть байт содержимого указанных выше контекстных регистров и два байта для хранения адреса возврата. Регистры банка будут содержать информацию о запросе ОСРВ, регистр DPTR служит указателем на блок сообщений. Данная схема-позволяет хранить информацию, необходимую для выполнения четырех задач, в диапазоне адресов с 40h no 7Fh.


В предлагаемой реализации ОСРВ имеется одна особенность: задачи не могут вызывать подпрограммы. Если задача вызывает подпрограмму и происходит аппаратное прерывание, то для стека понадобится больше места, чем это доступно. Решить эту проблему можно путем увеличения размера информационного блока задачи, чтобы дать возможность сохранять адрес и параметры для возврата из подпрограммы

Приведенная схема учитывает, что микроконтроллер 8051 имеет только 128 байт памяти, из которых нижние 64 байта используются ОСРВ для хранения специфичных данных, сообщений, информации о задачах. Когда позже вы познакомитесь в этой книге с ОСРВ для семейства 68НС05, то увидите

что ОСРВ, описанная в данном разделе, оставляет пользователю существенно больше ресурсов, чем при реализации системы «mykeRTOS» на микроконтроллере 68HC05J1А.

Первые 256 адресов памяти данных

Рис. 10.5. Пример распределения памяти при реализации ОСРВ на 8051.

Пересылка сообщений реализуется при помощи регистров DPTR и RO из банка задачи 0. Сообщение может содержаться в регистрах DPL и DPH, или регистр DPTR может указывать адрес сообщения, хранящегося в памяти. В регистре RO будет содержаться байт команды, который указывает ОСРВ и принимающей задаче, что необходимо делать с сообщением.


Если 128 байт памяти данных недостаточно для работы приложения, то можно выбрать микроконтроллер, имеющий 256 байт памяти, или подключить к 8051 внешнюю память. При использовании внешней памяти стек должен находится в пределах первых 256 байт, и данные из него должны сохраняться в информационном блоке задачи. Операция копирования данных в информационный блок задачи или из него увеличивает время, требуемое для переключения задачи.

Для вызова задачи соответствующий запрос и значения параметров загружаются в регистры, а затем производится обращение к подпрограмме с помощью команды «call». На самом деле это не является обычным вызовом подпрограммы. Данная процедура передает управление ОСРВ и сохраняется адрес возврата к исходной задаче. С точки зрения текущей задачи ОСРВ выглядит как подпрограмма. Однако при обращении к ней сохраняется необходимая информация о текущей задаче и производится переключение на другую задачу, для которой предоставляется имеющийся информационный блок.

Когда задача вызывает подпрограмму, вся контекстная информация сохраняется в стеке задачи, а затем содержимое указателя стека заносится в

стек или в определенное место информационного блока задачи. В дальнейшем значение указателя стека используется ОСРВ в качестве смещения для доступа к информации о задаче, позволяя выбирать содержимое регистров, где содержится вызов задачи и необходимые параметры.


Процесс переключения на другую задачу состоит в загрузке указателя стека, относящегося к новой задаче, и последующего извлечения из стека содержимого различных регистров прежде, чем реализуется возврат из подпрограммы.

Краткое знакомство с программой-монитором дается после описания ОСРВ. Это сделано потому, что прежде, чем пытаться разработать монитор, надо понять, как создается ОСРВ. Это утверждение может показаться странным, так как работа монитора существенно отличается от ОСРВ. Но многие концепции их построения являются общими, например, процедура перехода к выполнению одной программы из другой программы и управление этой процедурой с помощью некоторой общей части программного обеспечения.

Одной из наиболее важных особенностей мониторов является его способность модифицировать собственную память программ. Для этого хорошо подходит микроконтроллер DS5000, который использует общую память SRAM для хранения программ и данных. Классический 8051 можно использовать, если подключить к нему внешнюю память и объединить сигналы PSEN и RD при помощи логического элемента И, а полученный сигнал подать на вход разрешения выборки памяти_ОЕ.

Возможность модифицировать память программ важна по двум причинам. Первая, и наиболее очевидная, — необходимость загрузки новой версии программы без перепрограммирования устройства. Вторая причина — необходимость задания контрольных точек останова. Точка останова задается путем записи команды «call» по соответствующему адресу, значение которого сохраняется. Аналогично тому, как команда «call» используется в ОСРВ, эта команда используется для задания точки останова, записывая в стек адрес возврата.


Подробный рассказ о реализации программы-монитора выходит за рамки данной книги. Причина в том, что монитор имеет много различных вариантов функционирования и использования. Но понимание основных концепций и знание того, что необходимо для их реализации, позволяет лучше понять, как организовать общую память программ и данных и как безопасно управлять выполнением программ.

ГЛАВА

1 1

Средства разработки для 8051

Краткое содержание

Ассемблеры

Языки высокого уровня

Объектный файл в формате «S-Record»

Программатор Dallas Semiconductor DS87000

То обстоятельство, что микроконтроллеры с архитектурой 8051 выпускаются многими производителями, имеет свою отрицательную сторону, так как при этом ни один из производителей не заинтересован в создании средств разработки. Причина этого очевидна — любое инструментальное средство разработки может быть использовано для проектирования устройств на базе микроконтроллеров, выпускаемых конкурентами. Если же производитель внесет в свой микроконтроллер изменения, отличающие его от продукции конкурентов, то он будет несовместимым с классическим 8051.


Поэтому для микроконтроллеров 8051 практически нет хороших средств разработки программ, симуляторов и программаторов такого уровня как MPLABкомпании Microchip или «AYR Suite» компании Atmel, которые можно бесплатно загрузить из Интернет. Это замечание не относятся к коммерческим продуктам для 8051. Существуют действительно превосходные средства разработки, которые может приобрести пользователь. В этой главе представлен один из таких инструментов — универсальный симулятор UMPS («Universal Microprocessor Simulator»).

Эти комментарии предназначены прежде всего для радиолюбителей и инженеров-разработчиков, которые хотят протестировать и отладить свое устройство не платя за программы, которые, возможно, не будут использоваться в дальнейшем.

Ассемблеры

С точки зрения программиста микроконтроллер 8051 больше похож на 68НС05, чем на микропроцессор Intel 8080 или 8086. В типичном микропроцессоре Intel можно встретить команду типа "add А, В ", которая реализует операцию сложения операндов, хранящихся в памяти: А = А + В. Подобные команды не используются в 8051, так как для хранения адресов двух операндов требуется дополнительный объем памяти. Вместо этого данные обрабатываются с помощью аккумулятора.


В главе 12 «Система команд 8051», где рассматриваются различные способы адресации, указано, что при программировании на языке ассемблера возможные различные варианты указания адреса перехода с помощью команды «jump»: короткий («small»), внутристраничный («page») и длинный («long»). При написании ассемблерных программ для 8051 необходимо учитывать особенности архитектуры микроконтроллера и следовать определенным рекомендациям, которые сформулированы ниже.

  1. При сбросе микроконтроллер начинает выполнять команды с нулевого
    адреса, где располагается 8-байтный обработчик прерывания. Поэтому пер
    вая команда этого обработчика должна реализовать переход к основной
    программе

  2. Желательно, чтобы программа работала с одним 8-байтовым банком ре
    гистров. Это сократит объем программы и ускорит ее выполнение.

  3. Часто используемые переменные следует размещать в первых 256 байтах
    памяти, что также сократит объем и ускорит выполнение программы.

  4. Желательно, чтобы обработчик прерывания имел объем не более 8 байт,
    чтобы его можно было разместить в соответствующем окне.

  5. При выполнении программ, которые контролируют время выполнения,
    прерывания должны быть запрещены. Например, прерывание, поступаю
    щее в промежутке между записью кодов 55h/AAh может вызвать срабаты
    вание сторожевого таймера.

  6. При использовании непосредственной адресации не забывайте ставить
    перед константой символ «#». Иначе константа будет интерпретироваться
    как адрес одного из первых 256 байт памяти.


Выполнение этих рекомендаций при разработке прикладных программ позволит свести к минимуму проблемы, которые могут возникнуть в дальнейшем при отладке приложения.

Что касается дополнительной информации по написанию ассемблерных программ для 8051, то она зависит от конкретного используемого ассемблера. Формат написания программ практически одинаков для различных ассемблеров, но для нормальной работы ассемблера возможно понадобится ввести определенные директивы. Например, при разработке приложений для данной книги использовался ассемблер UMPS и ассемблер, свободно распространяемый через Интернет. При этом оказалось, что полученные объектные коды не являются полностью совместимыми. Потребовалось ввести некоторые изменения в исходном тексте, чтобы обеспечить полное соответствие программ.

Языки высокого уровня

Архитектура 8051 интересна своими крайностями. Из микроконтроллеров, рассмотренных в данной книге, архитектура 8051, вероятно, самая сложная для создания компилятора с языка высокого уровня, который обеспечивал бы получение наиболее простых, компактных и быстрых программ для выполнения арифметических операций. В то же время эта архитектура оказывается самой удобной для разработки компиляторов, выполняющих манипуляции с большими блоками данных. Эти два аспекта не всегда являются взаимоисключающими, но они будут оказывать влияние на работу компилятора.


В идеальном случае прикладная программа для 8051 должна выполнять все арифметические операции с использованием текущего 8-байтового регистрового банка и аккумулятора. Хранение всех переменных в одном банке позволяет получить самый компактный и быстрый код. Если же программа будет перемещать данные из одного банка в другой, то ее эффективность резко снижается. Например:

VarA = VarB + С ; Переменные «VarA» и «VarB» не содержатся в ; аккумуляторе или регистре В.

Если все три переменные находятся в текущем банке, то код будет выглядеть так:

mov A, VarB add А, С mov VarA, A

1 байт/12 тактов 1 байт/12 тактов 1 байт/12 тактов

Если же переменные «VarA», «VarB» и «С» размещены не в текущем банке, а находятся в первых 256 байтах памяти, то придется использовать прямую адресацию в каждой из трех команд. При этом программа потребует, по крайней мере, в два раза больше памяти и в два раза больше тактов для своего выполнения.

В случае, когда переменные «VarA», «VarB» и «С» располагаются в произвольном месте 64-Кбайтной памяти, лучший код, который можно быть написан, выглядит так:


mov DPTR, VarC 3 байта,24 такта

movxA, @DPTR

mov Temp, A

mov DPTR, VarB
movxA, @ DPTR

1 байт,24 такта - Загрузка "С" 1 байт, 12 тактов - Сохранение "С" 3 байта,24 такта 1 байт,24 такта - Загрузка "В"

add A, Temp ; 1 байт, 12 тактов - Асе = В + С

mov DPTR, VarA ; 3 байта,24 такта

movx @DPTR, A ; 1 байт,24 такта - Сохранение В + С в "VarA"

В последнем случае требуется более чем в три раза больше памяти и более чем в четыре раза больше тактов для выполнения программы по сравнению с наилучшим случаем, когда все три переменные находятся в текущем банке.

В снязи с такой разницей в производительности разработчик компилятора должен обратить особое внимание на разработку стратегии для манипуляции данными. Сокращение пересылок данных между текущим банком, первыми 256 байтами и всеми 64 Кбайтами памяти позволяет сделать конечный вариант программы более эффективным.


Одна стратегия заключается в том, чтобы сгруппировать арифметические переменные в регистровых банках и производить переключение банков, когда необходимо обеспечить прямой доступ к определенной группе данных. Другая стратегия состоит в том, чтобы сгруппировать все арифметические переменные в одном блоке памяти, на который указывает регистр DPTR или один из индексных регистров текущего банка. В последнем случае доступ к данным с помощью индексного регистра производится намного быстрее, чем в случае, когда данные сначала перемещаются во временный регистр текущего банка.

Возможность регистра DPTR обращаться ко всем 64 К памяти и наличие команд, позволяющих быстро модифицировать содержимое этого регистра, обеспечивают быстрый доступ к большим объемам данных. Хотя описание различных структур данных не является целью данной книги, однако изучение набора реализуемых команд поможет вам организовать хранение данных в блоках, адресуемых с помощью регистра DPTR, и обеспечить обращение к данным в этих блоках путем указания смещения, которое прибавляется к адресу, хранящемуся в DPTR. Такая возможность делает 8051 идеально подходящим для рехчизации регистрирующих устройств, систем сбора информации, простых терминальных коммутаторов и других приложений, где требуется быстрая манипуляция большими объемами данных.


Объектные файлы «INHX8M»

Наиболее общим форматом объектного файла является формат «INHX8M» фирмы Intel. Практически все микроконтроллеры используют этот формат, который обычно называют hex-файлом. Кроме 8051 этот формат используют также микроконтроллеры PIC и AVR, описанные в данной книге.

Если взглянуть на hex-файл, сгенерированный ассемблером или компилятором, то он будет иметь следующий вид.

:: 10000000 А601A701AB018E288C00030883128D0086

: 10001ООООВ11ABOAOD0883008COEOCOE0900A80111

: 10002ОООА201АЗ011Е081F04031908001F082106СЕ

:OA04FOOOA40B782AA50B782A080057

:02400EOOF13F80

:00000001FF

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


компилятором для отладчика или эмулятора. Каждая строка разбита на несколько полей, которые используются программатором или другим устройством. Формат файла следующий:

КОЛОНКА ИДЕНТИФИКАТОР КОММЕНТАРИЙ

1 Начало строки Всегда «:»

2-3 2 * количество байт в Два, умноженное на количество

строке загружаемых байт должны быть

загружены

4-7 Стартовый адрес Адрес начала строки

8-9 Тип данных 00 — Данные, 01 — Конец файла

10-11 2-ой байт слова Каждый байт представляется как 16-

ричное число (младший байт первым)

12-13 1-ый байт слова

14... Данные Остальные байты данных

End-2 Контрольная сумма Сумма байтов строки & 0x0FF = 0


Обычно строка содержит восемь 16-разрядных слов. Возьмем третью строку снизу в данном примере и рассмотрим, что значит каждое поле.

Столбцы 2-3 содержат ОА — это два умноженное на количество 16-разрядных слов в строке. Таких слов пять.

Столбцы 4-7 содержат 04FO — это адрес, куда должна быть записана строка. Это значение не использует порядок байтов Intel. В данном случае старший байт идет первым.

Следующие два столбца содержат 00; это означает, что строка содержит данные.

Начиная с 10 столбца, следуют 16-разрядные данные:

ОВА4

2А78

ОВА5

2А78

0008

Последние два столбца — это контрольная сумма. Каждый байт состоит из двух шестнадцатеричных цифр. Эти байты складываются, затем вычитаются из 0x0100 и результат используется в качестве контрольной суммы.


Для приведенного примера контрольная сумма вычисляется так:

ОА 04 FO 00

А4 0В 78 2А А5 0В 78 2А 08 +00

ЗА9

Над этой суммой выполняется логическая операция И со значением OxOFF, и результат вычитается из 0x0100:

100

-А9 (= 0х0ЗА9 & 0x0FF)

57

Отметим, что число 57 стоит в конце этой строки. Последняя строка примера означает конец файла. Тип данных 1 и контрольная сумма FF указывает на конец файла.

Программатор Dallas Semiconductor DS87000

Для программирования 87С520 можно использовать программатор Dallas Semiconductor DS87000 (рис. 11.1). Это устройство подключается к последовательному порту персонального компьютера, который служит для загрузки объектного кода в виде hex-файла и управления работой программатора. Он может использоваться для программирования всех «классических» микроконтроллеров 8051. Алгоритм программирования описан в одной из глав этой части.


Программатор DS87000 работает очень хорошо, хотя при его подключении возникли некоторые трудности. Первая из них состояла в том, что программное обеспечение для программатора поставляется на дискете формата 5.25". В настоящее время довольно трудно найти компьютер, где были бы дисководы обоих форматов. В старых IBM PC/AT есть дисковод 5.25'*, но нет дисковода 3.5' \ поэтому пришлось использовать нуль-модемный кабель, чтобы подключить к этому компьютеру «laptop». Вторая трудность возникла из-за 25-контактного разъема RS-232, предназначенного для подключения к компьютеру. Этот разъем подключается к телефонному кабелю, оканчивающемуся разъемом RJ-11, который связывает компьютер и программатор. Большинство персональных компьютеров имеют 9-контактный разъем для последовательного порта, поэтому для подключения программатора следует

использовать переходник из 9 в 25. Можно также использовать для подключения программатора кабель с 9-контактным разъемом, если соединить его контакты с контактами разъема RJ-11, как показано на рис. 11.2

RJ-11

Рис. 11.1. Программатор Dallas Semiconductor DS87000 HSM.


Рис. 11.2. 9-контактный разъем для программатора Dallas Semiconductor DS87000 HSM.

При таком подключении программатор прекрасно работает. На экране можно выбрать порт, к которому подключается программатор, а также различные режимы программирования, включая сценарии для повторного программирования. Программное обеспечение позволяет задать количество байт в памяти программ 87С520 EPROM, которое будет использоваться в операциях программирования, чтения или проверки. Обычно следует указывать количество байтов, которое соответствует объему загружаемого объектного кода, чтобы сократить время программирования.

ГЛАВА

12

СИСТЕМА КОМАНД МИКРОКОНТРОЛЛЕРА 8051

Краткое содержание

Команды пересылки данных Арифметические команды Команды битовых операций

Команды передачи управления

Все три микроконтроллера с Гарвардской архитектурой, представленные в данной книге, по-разному выполняют команды. Для каждого из этих микроконтроллеров — 8051, PIC и AVR, надо использовать различные способы реализации наиболее эффективной структуры программы.


Может показаться удивительным, но команды микроконтроллера 8051 очень похожи на команды 68НС05: сначала данные помещаются в аккумулятор, затем над ними выполняется заданная операция. Прежде, чем начать изучение системы команд, рекомендуется прочесть главу «Архитектура микроконтроллера 8051», чтобы понять, что такое регистровые банки и как выполняется адресация операндов.

Обратите внимание, что при рассмотрении арифметических команд, битовых операций и команд пересылки данных в данной главе дается общее описание команд, использующих разные способы адресации, которые в некоторых случаях требуют дополнительного цикла для их выполнения. Это сделано, чтобы сократить число рассматриваемых команд со 101 до 62.

При косвенно-регистровой адресации индексный регистр RO или R1 из текущего банка помечается буквой i, которая имеет значение i = 0 для регистра RO и i = 1 для регистра R1. При регистровой адресации символы «ггг» обозначают номер регистра текущего банка.

Команды пересылки данных

Прежде, чем начать обработку данных, необходимо понять, как производится пересылка данных внутри микроконтроллера и доступ к внешней памяти. Микроконтроллер 8051 имеет группу команд, предназначенных для пересылки данных внутри и вне микроконтроллера. Эти команды, а также команды арифметических операций при программировании на языке ассемблера имеют следующий формат :


ins Parm1, Parm2,

где ins - мнемокод команды, Parml - адрес размещения результата операции и первого из используемых операндов (если он требуется для выполнения команды), Parm2 — адрес второго операнда или непосредственное значение операнда. Это означает, что при выполнении команды mov A, RO содержимое регистра RO будет записано в аккумулятор: А = RO, а команда

add A, R0

даст следующий результат, записанный в аккумулятор: А = А + R0

Такой же формат команды использует микроконтроллер AVR. Команды микроконтроллера 68НС05 содержат только один операнд. Микроконтроллер PIC работает несколько по-другому, сохраняя результат либо в аккумуляторе (регистр W), либо в указанном регистре.

При описании команд 8051 символом А обозначается аккумулятор АСС, который имеет адрес ОЕОп. Указание на использование регистра А содержится непосредственно в коде операции, и он не может быть заменен другим регистром. Если в команде используется только один операнд — содержимое аккумулятора, то в соответствующей строке ассемблера надо указывать АСС, а не просто А, иначе компилятор выдаст сообщение о синтаксической ошибке.


Теперь Вы понимаете, как работает команда «mov operand, А» (команда 12.1). При использовании любого способа адресации (непосредственная, регистровая, косвенно-регистровая или прямая) эта команда копирует операнд-источник в аккумулятор. Аналогичным образом выполняется команда «mov operand, А» (команда 12.2), которая копирует содержимое аккумулятора в операнд-приемник. Эти операндом может быть регистр или ячейка памяти, адресуемая прямо или косвенно.

Команда «mov Operand 1, Operand2» (команды 12.3 и 12.4) используются для пересылки данных без промежуточного использования аккумулятора, то-есть вместо выполнения двух команд «mov A, Operand2»/«mov Operand I, A».

Команды «mov С, bit» и «mov bit, С» (команды 12.5 и 12.6) используются для чтения и записи отдельных битов в регистр PSW (в качестве флага переноса С) без изменения других флагов в этом регистре. Если посмотреть на код соответствующих команд, то в нем отведено 8 бит для указания номера пересылаемого бита. Однако при описании архитектуры 8051 было сказано, что побитовый доступ осуществляется к 128 битам, которые размещены в

байтах, имеющих адреса с 020h no 02Fh. Для указания номера одного из 128 битов требуется только 7 бит. Когда старший бит номера (бит 7) установлен в 1, то происходит доступ к служебным регистрам микроконтроллера. При этом выбираются биты, которые находятся » регистрах АСС, PSW, В, РО, PI, P2 и РЗ. Например, чтобы записать в PSW знамение младшего бита регистра данных порта Р1 используется команда «mov С, Р1.0», где цифра после точки означает номер бита.


Насколько полезны такие команды? Если сравнить программу первого приложения, написанную для 8051, с программами для других микроконтроллеров, то можно заметить, как легко перенести логическое состояние кнопки на светодиод.

Индексная адресация в пространстве памяти объемом 64 Кбайт может производиться с помощью индексного регистра RI или RO текущего банка или регистра-указателя DPTR путем использования команд «mov» и «movx» (команды 12.7, 12.8 и 12.9). В классическом 8051 адреса внешней памяти начинаются с OOSOh, и, как было сказано ранее, некоторые модели микроконтроллеров 8051 имеют 256 байт внутренней памяти, к которой можно получить доступ с помощью индексной адресации. Когда применяется регистр Ri, то для адресации доступны только первые 256 байт памяти. Когда в качестве индексного регистра выступает DPTR, то доступны все 64К памяти.

Загрузить 8-разрядные индексные регистры текущего банка можно с помощью команды «Mov Rn, #Const». Загрузка 16-разрядного регистра-указателя DPTR осуществляется командой «mov DPTR, #Const» (команда 12.10).

Существует две других формы команд с индексной адресацией. Первая — это стековые операции «push» и «pop» (команды 12.11 и 12.12). Эти команды выполняют обычные операции загрузки в стек и извлечения из него содержимого аккумулятора. Однако команды «push А» и «pop А» будут восприниматься компилятором как неверные. В этих командах только один параметр, поэтому, как отмечено выше, корректная запись команд, использующих аккумулятор, имеет вид «push АСС» и «pop АСС».


Таблицы могут быть легко реализованы при помощи команды «move A, @A+Index» (команда 12.13). Если в качестве индексного регистра служит программный счетчик, то аккумулятор загружается из памяти программ. Когда в качестве индексного регистра указывается DPTR, то данные загружаются из 64 Кбайт пространства памяти данных.

Для чтения таблицы данных из памяти программ можно использовать следующий программный код:

ReadTable: ; Получить в АСС символ из таблицы

add A, #(Table-GetTable)

move A,@A+PC
GetTable: ; Смещение

ret ; Возврат из подпрограммы

Table:

db 'H'

db 'e'

db '!'


db '!'

db 'o'

db 0

; Здесь находятся элементы таблицы

; Конец ASCIIZ строки

Последние две команды этой группы — это команды обмена «xch» и «xchd» (команды 12.14 и 12.15). Команда «xch A, Operand» обменивает содержимое аккумулятора и указанного регистра. Операция может быть промоделирована следующим образом:

Temp = АСС

АСС = Operand

Operand = Temp

Команда «xchd A, @Ri» работает подобно «xch» за исключением того, что только индексные регистры банка могут быть использованы для определения адреса операнда, и производится обмен только четырех младших битов.


Выполнение:

А <— Operand

V <— (A+Operand)»8

AC <— ((А & 0x0F) + ( Operand & 0x0F) >> 4

Пример:

mov A,#123

MCU: 8051 ; Записать 123 в Асc

Команда 12.1. Команда mov A, operand.

Выполнение:

Operand <— A

Пример:

mov A,#123 mov R2,A

MCU: 8051 ; Записать 123 в R2

Команда 12.2. Команда mov operand, A.


Выполнение:

Destination <—Operand

Пример:

mov B,#123

MCU: 8051 ; Записать 123 в "В"

Команда 12.3. Команда mov direct.[image]


Выполнение:

Register <— Operand

Пример: MCU: 8051

mov K2,#123 ; Записать 123 в R2

Команда 12.4. Команда mov Rn, operand.[image]


Выполнение:

С <— Bit

Пример:

mov C.P0.7 mov P2.6,C

MCU: 8051 ; Переместить бит Р0.7 в Р2.6

Команда 12.5. Команда mov С, bit

Выполнение:

Bit<— С

Пример:

mov С,Р0.7 mov P2.6,C

MCU: 8051 ; Переместить бит Р0.7 в Р2.6

Команда 12.6. Команда mov bit, С.[image]


Выполнение:

(Ri) <— Operand

Пример:

mov @RO,#123

MCU: 8051 ; Записать байт 123 по адресу, заданному RO

Команда 12.7. Команда mov @Ri, operand.

Выполнение:

A <— (Index)

Пример:

mov DPTR, Buffer mov A, @Dptr

MCU: 8051

; Считать из начала ; буфера

Примечание: Когда DPTR используется в качестве индексного регистра, в циклы доступа к данным могут вводится такты ожидания.


8051

HSM

24

8+

Выполнение:

( Index) <— А

выполнение:

( Index) *- A

Пример: MCU: 8051

mov DPTR, Buffer ; Записать в начало

mov @Dptr, A ; буфера

Примечание: Когда DPTR используется в качестве индексного регистра, в циклы доступа к данным могут вводится такты ожидания.


Команда 12.9. Команда movx ©index, A.

Выполнение:

Const &FFh Const>>8

DPL DPH

Пример:

mov DPTR,#ButStart

MCU: 8051

;Установить DPTR на начало буфера

Команда 12.10. Команда mov DPTR, #const
Команда: "push direct" Код:

Выполнение:

SP<— SP + 1

(SP) <—Addr

MCU: 8051

; Сохранить PSW перед ;обработкой прерывания ;обработчик прерывания

Восстановить PSW


Пример:

IntHandler:

push PSW

pop PSW

reti

Команда12.11. Команда push direct

Выполнение:

Addr <— ( SP ) SP<— SP-1

Пример:

IntHandler: push PSW

MCU: 8051

; Сохранить PSW перед ;обработкой прерывания ; Обработчик прерывания

pop PSW reti

; Восстановить PSW


Команда 12.12. Команда pop direct.

Выполнение:

А <— ( А + Index ) Пример:

mov DPTR, ^Buffer

mov A,#2

move A, ©A+DPTR

MCU: 8051

Чтение из буфера, расположенного в пределах 64К, начиная с третьего байта

Примечание: Когда в качестве индексного регистра используется DPTR, то происходит доступ к памяти данных, когда PC - к памяти программ

Команда 12.13. Команда move A, @A+index.

Выполнение:

MCU: 8051

; Обменять содержимое А и Portl


А <— Operand Operand <— А

Пример:

xch A, P1

Выполнение:

А(3:0) <—Operand(3:0)

Operand(3:0) <— А(3:0)

Пример: MCU: 8051

xchd A, TL0 ; Поменять местами младшие 4 бита

; в А и младшем байте Timer0

Код:

IND

B’1101011i’

Команда 12.14. Команда xch A, operand.


Команда 12.15. Команда xchd A, operand.

Арифметические команды

Микроконтроллер 8051 имеет более полный набор арифметических команд по сравнению с другими микроконтроллерами. Это может показаться удивительным, так как 8051 выполняет меньше арифметических команд, чем некоторые другие микроконтроллеры, но этот набор позволяет реализовать очень широкий набор функций.

При выполнении сложения (команда 12.16) операндом-приемником всегда является аккумулятор. Как указано ранее, микроконтроллер 8051 не имеет флага нуля в регистре состояния PSW. Поэтому при выполнении команд условных переходов по результату сложения «jz» и «jnz» необходимо, чтобы этот результат находился в аккумуляторе.

Команда «addc» (команда 12.17) прибавляет к результату сложения флаг переноса. Эта команда позволяет складывать числа, содержащие 16 и более разрядов. Например, программа сложения двух 16-разрядных чисел, находящихся в текущем регистровом банке, имеет следующий вид.

mov A, VarB ; VarB = VarB + С


add А, С ; Сначала сложить младшие 8 бит

mov VarB, A ; Сохранить младшие 8 бит результата

mov A, VarB+1 ; Сложить старшие 8 бит

addc A, C+1

mov VarB+1, A

Команда вычитания «subb» (команда 12.18) производит вычитание с учетом флагом переноса, который служит в качестве флага заема. Это означает, что при использовании данной команды надо учитывать значение флага переноса. Ниже приведен пример вычитания двух 16-разрядных чисел:

mov A, VarB ; VarB = VarB - С

clr С ; Очистить флаг переноса перед вычитанием

subb А, С ; Вычесть младшие 8 бит

mov VarB, A

mov A, VarB+1 ; Вычесть старшие 8 бит

subb A, C+1


mov VarB+1, A

Команды инкремента и декремента (команды 12.19 и 12.20) не изменяют состояния регистра PSW. В этих командах может использоваться регистровая, прямая и косвенная адресация.

Если посмотреть на описание других микроконтроллеров в последующих главах книги, то можно заметить, что флаг нуля в регистре состояния используется в таких операциях, как инкремент 16-разрядного операнда. В 8051 эту операцию можно проделать аналогичным способом, но необходимо помнить, что результат, который проверяется на нулевое значение, содержится в аккумуляторе. Когда при инкременте значение младших 8 бит равно нулю, то следует произвести инкремент старших 8 бит, если установлен в 1 флаг переноса из младших разрядов.

Inc Var ; Инкремент младших 8 бит

xch A.Var

cjne A,#0,incSkip ; Младшие 8 бит не равны нулю

inc Var+1 ; Увеличить старшие 8 бит
incSkip:


xch Var.A ; Сохранить результат инкремента младших 8 бит

Для декремента 16-разрядных чисел следует использовать команду «subb» вместо «dec», чтобы установить флаг переноса, когда значение младших 8 бит изменится с 0 на OFFh.

mov A, Var ; Декремент младших 8 бит

clr С

subb A, #1

mov Var, A

jnc decSkip ; Если перенос установлен, декремент старших 8 бит

dec Var+1
decSkip:

Команда «inc DPTR» (команда 12.21) представлена отдельно от команд «inc», «dec», так как она производит операцию над содержимым 16-разрядного регистра DPTR, который состоит из регистров DPL (младший байт) и DPH (старший байт). К сожалению в наборе команд отсутствует команда декремента «dec DPTR», но ее можно реализовать с помощью следующей программы.


dec DPL ;декремент младших 8 бит

xch A.DPL ;Поместить результат в Асе для проверки

cjne A,#OFFh,Skip ;После декремента получилось FFh?

dec DPH ;Да, декремент старших 8 бит
Skip:

xch A,DPL ;3аменить DPL

Команда «DAA» (команда 12.22) выполняется после сложения или вычитания двух двоично-десятичных чисел (BCD — Binary Coded Decimal). Число в BCD-коде содержит в каждой тетраде (половине байта) значения от 0 до 9. После выполнения команды «DAA» содержимое аккумулятора будет содержать правильный BCD-код результата, и флаг переноса будет установлен соответствующим образом для выполнения следующей BCD-операции, например, если складываются два 16-разрядных числа (4 десятичных разряда).

По поводу выполнения команды «DAA» необходимо сделать некоторые замечания. Эта команда работает недостаточно корректно после выполнения вычитания. Микроконтроллер 8051 не дает возможности определить отрицательное BCD-число, поэтому достаточно трудно произвести их вычитание.


Команда «DAA» не производит преобразование байта, представленного в шестнадцатиричном коде, в BCD-число.

Команда «mul AB» (команда 12.23) перемножает два 8-разрядных числа, которые находятся в аккумуляторе и регистре В. Полученный 16-разрядный результат сохраняется в аккумуляторе (младший байт) и регистре В (старший байт). Умножение происходит довольно быстро и может быть использовано для обработки с помощью 8051 сигналов звуковой частоты, то-есть для реализации функций DSP (digital signal processing). Если команда «mul AB» используется для умножения 16-разрядных чисел, то для получения правильного результата используется следующая формула:

Result = (VarB * VarC) + ((VarB+1 * VarC) * 0100h) +

((VarB * VarC+1) * 0100h ) + ((VarB+1 * VarC+1) * OlOOOOh)

где «VarB» и «VarC» две 16-разрядные переменные, которые необходимо перемножить. Эта формула гарантирует получение правильного 32-разрядного результата. Ее можно довольно просто реализовать на ассемблере. Умножение на OlOOh или OlOOOOh осуществляется путем сдвига результата на 8 или 16 бит.

Команда «div AB» (команда 12.24) выполняет деление содержимого аккумулятора на содержимое регистра «В». Частное помещается в А, остаток — в В. Эта команда весьма полезна при преобразовании данных. Например, преобразование байта в трехзначное десятичное число может быть выполнено следующим образом:


mov A, Number ; Сохранить число

mov В, #100 ; Получить сотни и остаток

div AB

mov Hundreds, A ; Сохранить сотни

mov А, В ; Повторить для десятков и единиц

mov В, #10

div AB

mov Tens, A ; Сохранить десятки

mov Ones, В ; Сохранить единицы

Этот программный код можно сравнить с аналогичным кодом для других микроконтроллеров, который используется в приложении «часы-термометр». Программа для 8051 проще, выполняется намного быстрее и занимает меньше места.

В документации фирмы Intel на микроконтроллер 8051 указывается, что команду «div AB» следует использовать для быстрого многоразрядного сдвига вправо. Эта команда не очень удобна для сдвига 16-разрядных чисел, что часто приходится выполнять, однако она весьма эффективна для сдвига отдельных байт.


Выполнение:

А <— А + Operand

С <— ( А + Operand ) » 8

V <— ( А + Operand ) » 8

АС <— (( А & OxOF ) + ( Operand & OxOF )) » 4

Пример:

mov A, #77 add A, #100

MCU: 8051

; Добавить 100 к 77

Команда 12.16. Команда add A, operand. Команда: "addc A, Operand"

Выполнение:

А ^— А + Operand + С

С <«— ( А + Operand + С ) » 8

V <«•— ( А ч- Operand + С ) » 8


АС <«— (( А & OxOF ) + ( Operand & OxOF ) + С ) » 4

Пример: MCU: 8051

mov A, #77 ; Добавить 100 к 77

add A, #100 ; (16 разрядное сложение)

mov Temp, A

clr A

adc A, #0

mov Temp+1, A ; Сохранить старшие 8 бит результата

Команда 12.17. Команда addc A, operand.

Выполнение:

А +— А - ( Operand + С )

С ч— ( А - ( Operand + С )) » 8

V «— ( А - ( Operand + С )) » 8

АС«— (( А & OxOF ) - (( Operand & OxOF ) + С )) » 4


Пример:

mov A, #100 add A, #77

MCU: 8051 ; Вычесть 77 из 100

Примечание : «Subb» производит вычитание с переносом. Перед вычитанием убедитесь, что флаг переноса находится в правильном состоянии.

Команда 12.18. Команда subb A, operand. Команда: "inc

Выполнение:

Operand <— Operand + 1

Пример: MCU: 8051

inc RO ; Инкремент содержимого RO в текущем банке[image]


Команда 12.19. Команда inc operand.

Выполнение:

Operand ^— Operand - 1

Пример:

Dec @ R0

MCU: 8051

; Декремент байта, на который указывает R0

Команда 12.20. Команда dec operand.

Выполнение:

DPTR*— DPTR + 1

Пример:

inc DPTR

MCU: 8051

; Инкремент - указателя на внешнюю память


Команда 12.21. inc DPTR. [image]


Выполнение:

if ( АС—1 )|| (( А & OxOF ) > 9 ))

А & OxOF *- ( А & OxOF ) + 6 if ( С—1 )П (( А & OxOFO ) > 0x090 )) А & OxOFO <«— ( А & OxOFO ) + 0x060[image]


Пример:

mov A, #077h add A, #42h da A

Команда 12.22. Команда DA A. Команда: "Mul AB"

Выполнение:

B:A«— A*B

Пример:

mov A, #077h mov B,#042h mul AB

MCU: 8051

; Сложить два BCD числа ; Старшие четыре бита ; будут содержать «1»

MCU: 8051

;Найти произведение ; двух чисел

Команда 12.23. Команда mul AB.

MCU: 8051

; Получить десятки

; и единицы числа


Пример:

mov A, #077h

mov B,#010h

div AB

Команда 12.24. Команда div AB.

Команды битовых операций

Обработка битов выполняется процессором любого компьютера, но для микроконтроллера такие функции являются особенно важными. Это связано с необходимостью обеспечивать во многих приложениях побитовый ввод и вывод данных. Микроконтроллер 8051 реализует достаточно полный набор битовых операций, которые существенно облегчают разработку приложений.

В число стандартных битовых операций, выполняемых 8051, входят логические операции И (команды 12.25, 12.26 и 12.27), ИЛИ (команды 12.28, 12.29 и 12.30) и Исключающее ИЛИ (команды 12.31, 12.32 и 12.33), которые производятся над 8-разрядными операндами. Эти три вида команд не изменяют содержимое регистра PSW, хотя после их выполнения можно осуществить условный переход по нулевому результату с помощью команд «jnz» и «jz».


Одна из полезных особенностей 8051 состоит в том, что наряду с целыми байтами можно обрабатывать отдельные биты. Команды «anl С, Bit» и «orl С, Bit» (команды 12.34, 12.35, 12.36 и 12.37) выполняют логические операции И и ИЛИ над флагом переноса С и другим битом с записью результата во флаг переноса. Результат этих операций может использоваться командами «jc» и «jnc» для выполнения условного перехода по значению флага С. Значение бита, используемого при операциях, может быть инвертировано. Эта возможность полезна, если требуется реализовать битовую операцию XOR (Исключающее ИЛИ). Напомним, что операция XOR выполняется следующим образом:

А ^ В = ( А & !В) I ( !А & В )

Операцию XOR можно запрограммировать в виде следующего макроса:

MACRO xorlbit Parml, Parm2

mov С, Parml

anl C, !Parm2

mov ACC.5, С

mov С, Parm2


anl C, !Parm1

orl С, АСС.5 ENDMACRO

;Panni XOR Parm2 результат во флаге "С1

;Выполнить "А & !В" ;Сохранить результат ;Выполнить "!А & В"

;Объединить результаты

Промежуточный результат (значение «Parml & ! Parm2») сохраняется в одном из временных флагов регистра PSW. Эта процедура может быть остановлена на полпути прерыванием. Если она используется как автономная команда, то можно запретить прерывания на время выполнения функции XOR.

Наряду с логическими операциями над битами и байтами можно произвести сброс в 0 целых байтов и отдельных битов (команды 12.38, 12.39 и 12.40), установку в 1 отдельных битов (команды 12.41 и 12.42), инвертирование значений битов и байтов (команды 12.43, 12.44 и 12.45). При выполнении этих операций в качестве бита может использоваться флаг переноса или заданный бит в пространстве регистров.

Команды циклических сдвигов полезны для перемещения битов на определенные позиции с целью их последующего тестирования или для последовательного ввода или вывода битов (команды 12.46, 12.47, 12.48 и 12.49). Чаще всего используются команды «rlc» и «ггс», выполняющие сдвиг с участием флага переноса.


Последняя битовая команда вообще не изменяет битов. Команда «swap» (команда 12.50) меняет местами две тетрады в байте.

Выполнение:

А <— А & Operand Пример:

mov A, #77 anl А, #100

MCU: 8051

; 77 AND 100 = 68 (десятичные числа)

Команда 12.25. Команда anl A, operand.

Выполнение:

Operand <—А & Operand

Пример:

mov A, #77 anl Register, A

MCU: 8051 ; ;Register AND 77

Команда 12.26. Команда anl direct, A.


Выполнение:

Operand <— Operand & Constant

Пример:

anl PO, #1

MCU: 8051 ; Очистить все, кроме Р0.0

Команда 12.27. Команда anl direct, #consf.

Выполнение:

А < A I Operand

Пример:

mov A, #77 orl A, #100

MCU: 8051

; 77 OR 100 = 109 (десятичные числа)

Команда 12.28. Команда orl A, operand. Команда: "anl Register, A"

Выполнение:


MCU: 8051 ; Register OR 77

Operand <— A I Operand

Пример:

mov A, #77 orl Register, A

Команда 12.29. Команда orl direct, A.

Выполнение:

Operand <— Operand I Constant

Пример: MCU: 8051

orl PO, #1 ; Установить P0.0

Команда 12.30. Команда orl direct, const.

Выполнение:

А <— А ^ Operand

Пример:

mov A, #77 xrl A, #100


MCU: 8051

;77 OR 100 = 41 (десятичные числа)

Команда 12.31. Команда xrl A, operand.

Выполнение:

Operand <— А ^ Operand

Пример:

mov A, #77 xrl Register, A

MCU: 8051 ; Register XOR 77

Команда 12.32. Команда xrl direct, A.

Выполнение:

Operand <— Operand ^ Constant

Пример:

xrl P0, #1

MCU: 8051 ; Инвертировать Р0.0


Команда 12.33. Команда xrl direct, #const.[image]

Выполнение:


С <— Bit & С

Пример:

anl C.P1.4

MCU: 8051

;С AND P1.4; С - флаг переноса

Примечание: Биты с номерами больше Ox7Fh находятся в блоке регистров специального назначения

Выполнение:

С ч— С & !( Bit )

Пример:

anl C,!(P1.4)

Команда: "anl С,! Bit"

Команда 12.34. Команда anl С, bit.

MCU: 8051

;С AND 1P1.4; С - флаг переноса


;!(P1.4) - инвертированный бит Р1.4

Примечание: Биты с номерами больше Ox7Fh находятся в блоке регистров специального назначения

Команда 12.35. Команда anl С, !bit.

Выполнение:

С <— Bit I С

Пример:

orl C.P1.4

MCU: 8051

;С OR P1.4; С - флаг переноса

Примечание: Биты с номерами больше Ox7Fh находятся в блоке регистров специального назначения

Команда 12.36. Команда orl С, bit.

Выполнение:

С <— С I !( Bit )

Пример: MCU: 8051


orl C,!( P1.4 ) ; !(Р1.4) - инвертированный бит Р1.4

Примечание: Биты с номерами больше Ox7Fh находятся в блоке регистров специального назначения

Выполнение:

А <— 0

Пример:

clr A

MCU: 8051 ; Очистить аккумулятор

Команда 12.38. Команда clr A.

Выполнение: С<– 0

Пример:

clr С

MCU: 8051 ; Очистить флаг переноса

Команда 12.39. Команда clr С.

Выполнение:


Bit <«—О

Пример:

clr P2.3

MCU: 8051

; Очистить бит ввода вывода

Примечание: Биты с номерами больше 0x7Fh находятся в блоке регистров специального назначения

Команда 12.40. Команда clr bit. Команда: "setb С"

Выполнение:

С <— 1

Пример: MCU: 8051

setb С ; Установить флаг переноса

Команда 12.41. Команда setb С.

Выполнение:

Bit <— 1


Пример:

setb PSW.RS0

MCU: 8051 ; Изменить текущий регистровый банк

Примечание: Биты с номерами больше 0x7Fh находятся в блоке регистров специального назначения

Команда 12.42. Команда setb bit. Команда: "cpl A"

Выполнение:

А <– А ^ 0FFh

Пример:

cpl A inc A

MCU: 8051

; Изменить знак содержимого аккумулятора

Команда 12.43. Команда cpl A

Выполнение:

С <– С ^ 1


Пример:

cpl С

MCU: 8051 ; Инвертировать флаг переноса[image]


Команда 12.44. Команда cpl С. Команда: "cpl bit"

Выполнение:

Bit <— Bit ^ 1

MCU: 8051 ;Инвертировать бит ввода-вывода

Пример:

cpl P1.4

Примечание: Биты с номерами больше 0x7Fh находятся в блоке регистров специального назначения

Команда 12.45. Команда cpl bit.

Выполнение:

А <— (( А & 0x0FE ) >> 1) + (( А & 0x001 ) <<7)

Пример:

rr A

MCU: 8051

; Циклический сдвиг содержимого аккумулятора
; на один бит вправо


Команда 12.46. Команда rr А. Команда: "rl А"

Выполнение:

А <— (( А & 0x07F) << 1) + (( А & 0x080 ) >> 7 )

Пример:

rl A

MCU: 8051

; Циклический сдвиг содержимого ; аккумулятора на один бит влево

Команда 12.47. Команда rl A.[image]


Выполнение:

A <— (( A & 0x0FE ) >> 1 ) +

(( С ) «7 ) С ч— А & 001 h

Пример:

rrc A

MCU: 8051

; Циклический сдвиг содержимого аккумулятора
; на один бит вправо через флаг переноса

Команда 12.48. Команда ггс А. Команда: "rlc А"

Выполнение:

А <– (( А & Ox07F ) << 1 ) +

(( С ) << 1 ) С <— ( А & 080h ) >> 7

Пример:

rlc A


MCU: 8051

; Циклический сдвиг содержимого аккумулятора ; на один бит влево через флаг переноса

Команда 12.49. Команда rlc A.

Выполнение:

A <– (( А & OxOF ) << 4 )+ (( А & OxOFO ) >> 4 )

Пример:

swap A

MCU: 8051 ; Перестановка тетрад в аккумуляторе

Команда 12.50. Команда swap A.

Команды передачи управления

Передача управления в микроконтроллерах 8051 производится обычным образом, за исключением одной особенности, связанной с работой регистра PSW. Так как в этом регистре отсутствует флаг нуля, то команды условных переходов по нулевому результату «jz» и «jnz» выполняются несколько по другому, чем в других микроконтроллерах.


Передавать управление по другому адресу можно тремя различными способами. Короткий переход «sjmp» — это относительный переход на расстояние от — 128 до +128 байт относительно начала следующей команды. Несмотря на данное ограничение это, вероятно, наиболее часто употребляемая команда перехода.

Страничный переходы «ajmp» и «acall» осуществляются в пределах текущей страницы объемом 2 Кбайт с помощью прибавления 11-разрядного смещения к содержимому программного счетчика. При этом старшие пять разрядов адреса команды остаются без изменения. Это означает, что необходимо следить за тем, чтобы адрес перехода находился в пределах текущей страницы. На рис 12.1 показано, какие проблемы могут возникнуть при использовании команды «ajmp». При втором использовании этой команды происходит переход к команде с «мнимой» меткой «PhatomB» на текущей странице, хотя на самом деле команда с меткой «LabelB» находится за пределами текущей страницы.

Длинный переход («ljmp») дает возможность передавать управление в любое место 64К пространства. Эту команду можно использовать в любом случае,

но она занимает дополнительный байт памяти программ, а при ее выполнении требуется также дополнительный командный цикл в некоторых моделях 8051, например в HSM.


Рис. 12.1. Переход внутри текущей 2К страницы

Различные виды безусловных переходов иллюстрируются при описании команд «jmp» (команда 12.51).

Подпрограммы на 8051 в основном работают, как ожидается. Команда «call» (команда 12.52) загружает адрес возврата в стек, а в конце подпрограммы команда «ret» (команда 12.53) производит извлечение из стека адреса возврата. Команда «call» может осуществлять страничный или длинный переход.

При использовании некоторых ассемблеров для достаточно написать «jmp» или «call», и ассемблер сам выберет наилучший способ перехода. Такие ассемблеры удобнее для программиста, так как они избавляют его от лишних забот и автоматически производят выбор способа перехода в зависимости от размера программы.

Если Вы знакомы с другими процессорами, то Вас вероятно удивит, что выполнении команды «push» происходит инкремент содержимого указателя стека. В большинстве других процессоров команда «push» производит декремент указателя стека. Поэтому при организации стека его указатель должен быть инициализирован на начало области стека, а не на ее конец, как в большинстве процессоров.

Команда «reti» (команда 12.53) работает подобно команде «ret» за исключением того, что она выполняется в конце обработчика прерывания. После этой команды микроконтроллер может воспринимать запрос на обслуживание следующего прерывания. Такая реализация команды «reti» исключает обработку вложенных прерываний, которая возможна в некоторых других микроконтроллерах. Это еще одна из причин, почему обработчики прерываний должны быть короче и выполняться как можно быстрее.


Табличные переходы осуществляются с помощью команды «jmp @A+DPTR» (команда 12.54). В этом случае в регистр DPTR записывается адрес начала таблицы, а в аккумулятор - смещение, задающее положение в таблице адреса команды перехода.

mov DPTR, #Table mov A, Index

; DPTR = Начало таблицы

; Получить индекс

clr С ; Умножить на 2 чтобы получить адрес

rlc A

jmp @А + DPTR
Table:

ajmp Element0 ; Переход к разным элементам

ajmp Element1

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


Основные команды условных переходов используют биты состояния в регистре PSW (команды 12.55, 12.56 и 12.57). Эти относительные переходы производятся, если флаг переноса или заданный в команде бит имеет значение 1 или 0. Команда «jbc Bit, Label» интересна тем, что после ее выполнения тестируемый бит сбрасывается в 0, если он был установлен в 1. Эта команда полезна для реализации «семафоров» при организации выполнения задач в ОСРВ. При использовании данной команды тестируемый бит является флагом («семафором»), разрешающим выполнение определенной задачи. Переход к задаче производится, если она свободна (флаг-«семафор» имеет значение 1), после чего устанавливается флаг «занято» (флаг-«семафор» принимает значение 0), запрещающий обращение к задаче до окончания ее выполнения.

Команды перехода по нулевому или ненулевому результату (команда 12.58) проверяют содержимое аккумулятора на нуль. Это означает, что содержимое аккумулятора, определяющее результат данных команд, не должно изменяться перед их выполнением.

Последняя команда условного перехода производит сравнение содержимого аккумулятора с операндом (команда 12.59) или регистра с операндом (команда 12.60) и реализует переход, если они не равны. Эта операция может выполняться при значениях содержимого тестового регистра (аккумулятора или регистра текущего банка), равных или не равных нулю. Таким образом данные команды могут использоваться вместо команд «jz», «jnz», позволяя тестировать на ноль значение любого байта, хранящегося в памяти.


Для организации циклов используется команда, которая выполняет декремент операнда и производит переход, если результат не равен нулю (команда 12.61).

mov Loop: djnz

R2, #7

R2, Loop

; Цикл 7х

; Декремент счетчика и переход, если результат не равен нулю

Приведенный выше пример повторяет цикл семь раз прежде, чем перейти к последующей части программы.

Последней является «пустая» команда «пор» (команда 12.62), которая занимает один байт и выполняется за один командный цикл. Основная цель использования команды «пор» — скорректировать время выполнения программы. Так как код этой операции равен OOh, то команда может быть введена в Ламять программ вместо ошибочных команд при отладке прикладных программ вместо того, чтобы производить стирание содержимого памяти и перепрограммирование микроконтроллера.


Команда: "sjmp Label"

Переход

Код

Короткий sjmp

080h Addr

Страничный ajmp

В'ааа00001’ Addr

Длинный Ijmp

002h AddrHi Addrlo

Выполнение:

PC <— Addres

Пример:


sjmp Label

Label:

MCU: 8051 ; Переход к метке «Label»

Команда 12.51. Команда sjmp label.

Выполнение:

Stack < PC PC <— Address Пример: Icall Label

Label:

MCU: 8051 ;Вызов подпрограммы «Label»

Выполнение:

PC <— Stack Пример:

Icall Label

Label

ret

Команда 12.52. Команда acall label. Команда: "ret"


MCU: 8051 ; Вызов подпрограммы «Label»

; Возврат из подпрограммы

Примечание: Команда «reti» выполняется аналогично команде «ret», но разрешает обслуживание следующего прерывания

Команда 12.53. Команды ret и reti.

Выполнение:

PC <— АСС + DPTR

Пример:

mov DPTR, #Table_Start mov A, #Table_Element jmp @A+DPTR

MCU: 8051

; Переход к элементу (адресу) в таблице
Команда 12.54. Команда jmp @A+DPTR.
Команда: "jnb Bit, Label" Код:

Выполнение:


JB

if Bit !=0

PC <— Address JNB

if Bit==0

PC <— Address

Пример: MCU: 8051

jnb Bit, Label ; Перейти к метке «Label»,

: ; если Bit = О

Label

Команда 12.55. Команды jb bit, label и jnb bit, label[image]


Выполнение:

JC

if Carry !=0

PC <— Address JNC

if Carry==0 PC <— Address

Пример: MCU: 8051

jc Label ; Перейти к метке «Label»,

: ; если флаг переноса установлен в 1

Label

Команда 12.56. Команды jc label и jnc label.
Команда: "jbc bit, Label" Код:

Выполнение:

if Bit !=0 Bit <— 0 PC <— Address

MCU: 8051


;Перейти к метке «Label», ;если Semaphore установлен

Пример:

jbc Semaphore, Label

Label

Команда 12.57. Команда jbc bit, label.

Выполнение:

JZ

if Асс ==0

PC <— Address JNZ

if Асс !=0 PC <—Address

Пример:

jz Label

Label

MCU: 8051


; Перейти к метке «Label», если АСС == О

Команда 12.58. Команда jz label и jnz label.
Команда: "cjne A, #37, Label" Код:[image]


Выполнение:

if АСС !=Operand PC <— Address

Пример:

cjnev A, #37, Label

Label

MCU: 8051

; Перейти к метке «Label», ; если АСС != 37

Команда 12.59. Команда cjne A, #const, label.

Выполнение:

if Reg !=Operand PC <— Address

Пример:

cjne R2, #37, Label

Label

MCU: 8051


Перейти к метке «Label», если R2 != 37

Команда 12.60. Команда cjne reg, operand, label.
Команда: "djnz Rn, Label" Код:

Выпонение :

[image]


Operand < — Operand - 1 if Reg !=Operand PC <— Address

MCU: 8051 ;Цикл 8х

Пример:

mov R0, 8 Loop:

djnz R0, Loop ; He переходить на метку, если RO = О

Команда 12.61. Команда djnz Rn, label.

Выполнение:

Пример:

nop

MCU: 8051 ; Задержка на один командный цикл

Команда 12.62. nop.

ГЛАВА

13

ПРИМЕРЫ ПРИМЕНЕНИЯ 8051


Краткое содержание

Первое приложение

Часы реального времени и термометр

«Говорящая» клавиатура

В примерах применения, данных в этой книге, используется не классический микроконтроллер Intel 8051, a Dallas Semiconductor HSM 80C520, особенности которого были рассмотрены в главе 7. Причиной выбора микроконтроллера с архитектурой HSM является его более высокая производительность. Чтобы реализовать приведенные примеры на классическом 8051, надо пересчитать задержки или увеличить тактовую частоту микроконтроллера.

Одной из особенностей микроконтроллеров 8051 является отсутствие для них ассемблеров и симуляторов, поставляемых производителями. Для всех других микроконтроллеров, описанных в книге, имеются такие средства, которые предоставляются производителями на CD-ROM. К сожалению, поиски таких средств для 8051 с помощью Интернет не дали результатов, и автор попытался найти необходимый CD-ROM. Что касается ассемблера, то удалось получить это средство от компании MetaLink, и автор очень доволен, что имел возможность его использовать. Но возникли трудности при поиске симулятора — лучшее из этих средств, которое удалось найти, было разработано и документировано в Германии.


Эта проблема разрешилась, когда автор нашел универсальный симулятор Universal Microprocessor Program Simulator (UMPS), который является наиболее эффективным средством отладки программ из всех, рассмотренных в ходе поисков. Он обладает двумя интересными особенностями. Во-первых, этот симулятор способен выполнять программный код для широкого набора микроконтроллеров — для всех, представленных в данной книге и многих других. Таким образом вам достаточно иметь одно средство программирова-

ния для работы со множеством различных микроконтроллеров. Во-вторых, он использует уникальный метод симуляции приложений. Вместо разработки специального тестового файла LJMPS позволяет создать виртуальную схему, с которой взаимодействует ваше приложение. Таким образом, тестирование прикладной программы при воздействии многих тестовых и входных сигналов может быть проведено простым «щелчком» мышью. В этой главе будет показано, как UMPS может помочь при разработке приложений. В приложении, посвященном UMPS, которое дано в конце книги, будет содержаться более полная информация об этом средстве отладки.

Первое приложение


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

Рис. 13.1. Подключение «мигающих» светодиодов к микроконтроллеру 87С520.

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

Алгоритм работы прикладной программы показан на рис. 13.2. Этот алгоритм повторяется для всех микроконтроллеров, описанных в данной книги. Приложение демонстрирует работу тактового генератора, линий ввода-вывода и обработку прерываний.


Рис 13.2. Блок-схема алгоритма функционирования приложения.

Код этой прикладной программы очень прост — возможно, он самый простой из всех рассматриваемых примеров.

;Приложение 1. Мигающие светодиоды.

;Это приложение мигает первым светодиодом и отображает ;состояние кнопки на втором светодиоде. ;Муке Predko ;97.11.19

;Замечания по аппаратной части: ;Микроконтроллер 80С520 работает на частоте 1 MHz ;PI.7 - мигающий светодиод LED2 ;PI.O - светодиод кнопки LED1 ;Р2.0 - кнопка org О

ajmp Mainline

org OBh ; Прерывание таймераО

cpl PI. 7 ; Инвертировать бит 7

reti
org 020h ; Program Mainline

Mainline:


clr

CKCON

;Использовать для переключения таймера0 внутреннюю тактовую частоту, деленную на 2

mov

TMOD,#%0000001

;Таймер0 – внутренняя синхронизация

;– Режим 1

mov

TCON,#%00010000

;Запустить таймер0

mov

IE,#%10000010

;Разрешить прерывание от таймера 0

mov

P1,#081h

;Линии светодиодов в высокое состояние

mov

P2,#1

;Все линии Р2, кроме кнопки, в 0

Loop:

mov

C,P2.0

;Получить состояние кнопки

mov

P1.0,C

;Скопировать его на светодиод

jamp

Loop


Код выполняется точно так, как показано на рис. 13.2. Когда код написан, вы можете протестировать его с помощью симулятора перед тем, как собирать схему и загружать код в микроконтроллер.

Для отладки прикладной программы использовался симулятор UMPS, демонстрационная версия которого распространяется на CD-ROM. Более детально UMPS рассматривается в Приложении «UMPS» в конце книги.

После инсталляции UMPS запускается операционной системой Windows. После загрузки UMPS необходимо выбрать тип используемого микроконтроллера. Щелкнув мышью на пункт меню «Configure», а затем «Load CPU...», выберите «DS80C320» (это младшая модель микроконтроллера 87С520, которая использовалась при реализации этого приложения). Загрузка приложения осуществляется выбором пункта «Load» в меню «File». В данном случае это файл «API.ASM» (рис. 13.3).

Переходим к редактору UMPS. Он работает как типичный Windows редактор за исключением того, что некоторые операции используют различные комбинации клавиш. По мере ввода программного кода комментарии отображаются курсивом синего цвета. Директивы ассемблера помечаются красным, а команды выделяются жирным шрифтом.


Откомпилировать код можно путем выбора команды «Compile» в меню «Program» или нажатием на кнопку с изображением желтого «сверкающего болта» на панели инструментов. Вам будет задан вопрос об имени исходного файла и предложено сохранить текст перед компиляцией. После окончания компиляции появится окно с результатами. Ассемблер UMPS прекращает компиляцию при обнаружении первой ошибки. Строка с ошибкой будет выделена цветом. Возможно, вы получите несколько другой вид экрана, так как на приведенных иллюстрациях окно исходного кода растянуто, чтобы показать полную строку.

Рис 73.3. Экран UMPS с загруженным кодом приложения.

Один совет по вводу программы при использовании UMPS — не вводите пробелы в параметрах команд, даже после запятой. UMPS не распознает такие команды и выдает ошибку, лишенную смысла (ERROR PASS 2: Rn or Pn Expected). Все параметры должны быть следовать без пробелов.

После того, как приложение успешно откомпилировано, можно приступить к симуляции. Как сказано выше, симулятор UMPS не использует специальный тестовый файл. Вместо этого к устройству подключается виртуальное оборудование. Следует добавить два светодиода и кнопку, щелкнув мышью на позиции «Resources» в меню «Configure». После этого на экране откроется большое окно. На панели инструментов можно выбрать «ADD» и поместить в окно два светодиода «LED (Red, Green, Yellow)» и кнопку «Push Button». После этого вид экрана будет похож на рис. 13.4.


Далее окно ресурсов можно уменьшить насколько это возможно и переместить в левый нижний угол экрана. Чтобы «подключить» введенные элементы, выберите один из светодиодов, например LED1, и нажмите «Connect» (рис. 13.5). Чтобы подключить этот светодиод после нажатия «Connect» выби-рите «Anode» и «Always 1». Это подключит анод светодиода к Vcc. Далее сделайте тоже самое с катодом, подключив его к Р1, бит 7. После окончания экран будет выглядеть, как показано на рис. 13.6.

Нажмите «ОК» и повторите операцию для второго светодиода, который надо подключить к Р1, бит 0.

Рис. 13.5. Выборподключаемых элементов: два светодиода и кнопка

Рис. 13.5. Подключение светодиода.

Рис. 13.6. Результат подключения светодиода.

Рис. 13.7. Подключение кнопки.

Подключить кнопку немного сложнее. После выбора кнопки, выберите меню «Configuration» или маленькое изображение монитора на панели инструментов (рис. 13.7). В окне «Switch Configuration» щелкните «Push Button», чтобы отменить выбор. Это позволяет подключать к устройству различные виды кнопок. Убедитесь, что выбран пункт «1» —when open, и нажмите «ОК.» для выхода из окна. Теперь можно подсоединить кнопку, используя меню «Connect». Подключите «Out» к Р2, бит 0, a «In» к «Always 0». Эта кнопка будет замыкать вывод Р2.0 микроконтроллера с «землей». Чтобы выйти из окна «Resources» нажмите на «Exit» в панели инструментов.


После «подключения» внешних элементов Можно вывести на экран содержимое регистров, чтобы наблюдать за выполнением программы. Для этого следует выбрать пункт «CPU Registers» из меню «Configure». Для добавления аккумулятора нажмите «ADD» и выберите «АСС». Эги действия необходимо повторить для каждого требуемого регистра.

В нашем примере выведены регистры «Асе», «PSW», «SP», «PC», «TLO», «ТНО», «Р1» и «Р2». После добавления этих регистров можно назначить каждому из них свой цвет и выбрать систему исчисления, в которой будет выводиться содержимое регистра. Затем можно изменить размеры окон, чтобы было удобно с ними работать (рис. 13.8). После этого все готово для начала симуляции.

С этого момента UMPS работает как любой другой симулятор. При нажатии кнопки «go» начинается выполнение программы. Можно наблюдать, как. работает программа: первый светодиод будет мигать, а второй зажигаться при нажатии кнопки. При этом UMPS будет останавливаться при переполнении таймера. Щелкнув на пункте «Run Mode...» в меню «Options» можно отменить этот останов, а также выбрать рабочую частоту микроконтроллера. Для этого приложения используется тактовая частота 4 МГц (рис. 13.9).


Возникает вопрос, стоит ли собирать эту схему только для того, чтобы понаблюдать, как зажигаются светодиоды. Однако для получения необходимых практических навыков необходимо пройти весь путь разработки до конца, построить схему и запрограммировать 87С520. Хотя симулятор показывает, что ваше программное обеспечение работает правильно, есть ряд проблем, которые можно научиться решать только при работе с реальной схемой.

Одной из проблем было заставить программатор взаимодействовать с PC. Об этом детально рассказано в главе 11 «Средства отладки систем на базе 8051». Автору пришлось разработать собственный вариант интерфейса RS-232 для программатора, чтобы обеспечить нормальную работу микроконтроллера 87С520. При работе с реальной схемой выявились также два обстоятельства, из-за которых не удавалось ее запустить.

Во-первых, выяснилось, что вывод ЕА микроконтроллера нельзя оставлять неподключенным. Чтобы микроконтроллер работал с внутренней памятью EPROM, этот вывод должен быть подключен к напряжению питания. Если его подключить к «земле» или оставить неподключенным, то 8051 будет пытаться обратиться к внешней памяти.


Рис. 13.8. Выбор регистров.

Рис. 13.9. Модификация работы симулятора.

Во-вторых, оказалось, что схема тактового генератора, использующая кварц с последовательным резонансом с частотой 1 МГц и два конденсатора по ЗОрГ, которая работает со всеми другими микроконтроллерами, описанными в этой книге, не запускает 87С520. Когда же был включен кварц с параллельным резонансом и частотой 4 МГц, схема начала нормально работать. При этом, однако, частота мигания светодиода оказалась слишком большой — 8 раз в секунду. Пришлось изменить коэффициент деления частоты в таймере с 4 до 12, чтобы светодиод мигал приблизительно 2 раза в секунду.

Несколько комментариев по поводу программного кода. Размер откомпилированного кода оказывается существенно меньше (в 2 и более раз), чем при использовании всех остальных микроконтроллеров. Это объясняется тем, что 8051 имеет весьма полный набор команд, включая команды битовых операций. Если вы сравните реализацию цикла основной программы с использованием различных микроконтроллеров, то увидите, что имеется в виду. В программе для 8051 основной цикл и обработчик прерываний оказываются намного проще и выполняются быстрее, чем в других приложениях, несмотря на то, что в «классическом» 8051 для выполнения команды требуется, в среднем, существенно больше тактов. Поэтому не следует оценивать производительность процессора только по количеству тактов, приходящихся на одну команду. В ряде случаев, подобных описанному, некоторые типы микроконтроллеров имеют заметное преимущество над другими. Для данного приложения микроконтроллер 8051, который содержит CISC-процессор с Гарвардской архитектурой, является наиболее эффективным и простым для программирования, а также требует меньшего объема памяти программ.


Часы реального времени и термометр

Данная схема весьма проста, а ее компоненты можно разместить на печатной плате таким образом, чтобы обеспечить наиболее удобное расположение жидкокристаллического дисплея (рис. 13.10). Если забежать вперед и посмотреть аналогичные схемы, реализованные на других микроконтроллерах, то можно заметить, что они очень похожи. Основные различия имеются в ядре этого устройства, которое содержит микроконтроллер и компоненты, которые обеспечивают его нормальное функционирование. Фактически, это та же схема, которая была описана в первом приложении.

ЖК-дисплей соединен с микроконтроллером таким образом, чтобы с ним было легко работать на макетной плате. Для этого он подключен к выводам, находящимся на одной стороне 87С520. Кроме того на плате располагаются кнопка «Установка» и датчик температуры DS1820, которые подключаются к микроконтроллеру.

После проектирования схемы перейдем к процессу создания программного обеспечения. Описанный ниже процесс разработки является достаточно эффективным для создания всех приложений. (Такой подход не применялся при разработке первого приложения, так как программа его работы была очень простой, и данный пример проектирования использовался, чтобы показать, как работает микроконтроллер в реальной схеме).


Рис. 13.10. Часы-термометр, реализованные на базе микроконтроллера 870520.

Первая программа должна проверить работоспособность микроконтроллера на плате. Это, например, может быть простая программа, которая периодически изменяет состояние неиспользуемой линии ввода-вывода. Программный код «AP2.ASM» делает несколько больше. Он выдает на ЖК-дисплей «Hello» и является началом разработки подпрограммы записи строки на дисплей.

Разработка этой программы значительно упрощается с использованием UMPS. Никакая последующая отладка не потребуется, если на виртуальном ЖК-дисплее будет получено сообщение «Hello».

Следующая программа «AP2V2.ASM» служит инструментом для реализации отображения времени. Она разрешает работу таймера и обеспечивает изменение значения времени каждую секунду. Возможно данная программа не требует особых пояснений, но ниже дается описание ее работы, чтобы показать, как производится расчет реального времени.

Микроконтроллер 87С520 работает с тактовой частотой 4 МГц, при этом частота командных циклов составляет I МГц. Таймер 0 работает в «режиме I» с делением тактовой частоты на 4 и реализует прерывания через каждые 65 536 мкс, то-есть приблизительно 16 прерываний в секунду. В 87С520 используется 24-разрядный счетчик долей секунд, старший байт которого увеличивается каждый раз при переполнении таймера 0. Основная ветвь программы следит за содержимым старшего байта этого счетчика и фиксирует секундные интервалы времени каждый раз, когда этот байт равен 16.


Вместо сброса счетчика долей секунд в нулевое состояние из его содержимого вычитается 1 000 000 (к этому моменту содержимое счетчика равно 1 048 576). Это означает что остаток переносится на следующую секунду. После двух секунд этот остаток приведет к тому, что только 15 прерываний потребуется, чтобы счетчик превысил значение 1 048 576. Таким образом, каждый интервал времени не будет точно равен секунде, но в среднем время будет фиксироваться правильно.

Программа «AP2V3.ASM» производит опрос состояния кнопки «Установка» каждый раз, когда содержимое счетчика долей секунды превышает значение 1 048 576. Если эта кнопка нажата, то выполняется установка нового значения времени. Для этой цели используется специально разработанный алгоритм, который позволяет упростить отладку приложения. Алгоритм установки времени следующий. Для изменения числа минут используется переменная «Increment», значение которой после этого сдвигается на один разряд влево с вводом 1 в младший бит до получения максимальной величины 03Fh (десятичное 63). Чем дольше держать кнопку, тем больше составит изменение времени. Когда значение минут достигает максимума, начинают увеличиваться часы со скоростью один раз в секунду. После каждого часа значение минут сбрасывается в нуль. Таким образом можно пройти полные 24 часа менее чем за 30 секунд.


Последняя часть программного обеспечения реализует обслуживание датчика температуры DS1820 (программа AP2V4.ASM). Создание такой программы для 87С520 потребовало двух дней работы, тогда как аналогичная программа для микроконтроллера PIC была разработана за полдня, а для 68НС05 — за день. Основной трудностью при разработке этой программы стало обеспечение синхронизации при последовательном приеме данных от DS1820 по од-нопроводному интерфейсу. Поэтому в дальнейшем при разработке аналогичных приложений целесообразно выбрать цифровой термометр с интерфейсом I2C или какой-либо другой термометр с синхронным последовательным интерфейсом.

«Говорящая» клавиатура для Марии

При разработке приложений для данной книги выбирались проекты, на примере которых можно показать разнообразные возможности микроконтроллеров. Ниже рассмотрен пример приложения, в котором показано, как внешние устройства могут работать с шиной микроконтроллера 8051 и как микроконтролллер может взаимодействовать с клавиатурой. Разработанное устройство производит опрос клавиатуры, и, если клавиша нажата, на 16-сегментном светодиодном индикаторе представляется соответствующий символ — буква или цифра, и произносится соответствующее слово. Идея такой разработки возникла потому, что моя дочь, которой было два с половиной года, очень любила играть со старой клавиатурой, купленной несколько лет назад. Я решил, что будет полезно подключить к клавиатуре электронное устройство, которое поможет ей выучить буквы и цифры (рис. 13.11).


Это приложение является реальным проектом, отдельными частями которого является клавиатура, светодиодный индикатор и синтезатор звука. На его примере будет показано, как эти устройства включаются в схему и как реализуется их интерфейс с микроконтроллером.

В этой схеме имеются три устройства, подключенных к общей шине РО/ Р2, которые адресуются как ячейки памяти: две микросхемы 74LS374, используемые как буферы для 16-сегментного индикатора, и синтезатор звука General Instruments SP0256. Эти устройства выбираются при помощи микро-

схемы 74LS138, которая выполняет дешифрацию адресов с А8 по А10 и выбирается сигналом _WR. Этот сигнал используется для разрешения выбора устройств, подключенных к общей шине РО/Р2.

Рис 13.11. Говорящая клавиатура для Марии.

На рис. 13.12 следует обратить внимание на отсутствие микросхемы 74LS373, которая обычно подключается к порту 0, чтобы сохранить младшие 8 бит адреса во время передачи по этим линиям байта данных. Об этих разрядах адреса не следует беспокоится, так как адреса внешних устройств выравнены по 256-байтной границе, что исключает необходимость сохранять младшие 8 бит. Исключение этой микросхемы позволяет упростить разводку соединений.


Питание схемы осуществляется от 9-вольтовой батареи для радиоприемника. Типовая цепь питания показана на рис. 13.13. Схема получает напряжение от сетевого адаптера или 9-и вольтовой батареи. Если требуется использовать 6-вольтовый источник питания (4 батареи АА), то следует включить микросхему 78С05. В качестве индикатора включения питания служит свето-Диод.

Используемый в схеме 16-сегментный светодиодный индикатор способен отображать символы алфавита. Индикатор имеет «общий анод», поэтому для его работы необходимо положительное напряжение питания. Для индикации символа определенные сегменты соединяются с «землей». Выходы буферных регистров 74LS374 всегда разрешены (вывод 1 этих микросхем подключен к «земле»). На выходах включены токоограничивающие резисторы номиналом 220 Ом, чтобы величина тока, протекающего через светодиоды и буферы не превышала допустимых значений.

Глава 13. Примеры применения 8051 279

Рис. 13.12. Схема говорящей клавиатуры на основе 87С520.

Рис. 13.13. Типовая схема источника питания 5В.

После записи байта в буферный регистр 74LS374 он будет сохраняться там до записи нового байта. Поэтому нет необходимости сканировать индикатор.


Данная схема собиралась на макетной плате, где образовалась мешанина проводов. Чтобы провода были возможно короче, пришлось нарушить естественный порядок соединения выводов буферных регистров и светодиодного индикатора. После того, как монтаж схемы был закончен, пришлось использовать программу AP3V3.ASM, которая определяет, к каким разрядам буферных регистров подключены те или иные сегменты индикатора. Эти регистры имеют адреса OOOOOh и 00400И в адресном пространстве внешней памяти данных. После запуска этой программы выяснилось, что сегменты индикатора подключены следующим образом:

[image]

Где: «#» - разряд регистра 74LS374, имеющего адрес OOOOh «-#"» - разряд регистра 74LS374, имеющего адрес 0400h


Имея эту информацию можно отображать различные алфавитно-цифровые символы — цифры от 0 до 9 и буквы от А до Z. Пробел соответствует установке всех разрядов в состояние 1. Тестовая программа «AP3V4.ASM» позволяет последовательно вывести все эти символы.

Теперь можно перейти к подключению звукосинтезатора SP0256. Это устройство впервые было выпущенное 15 лет назад компанией General Instruments, преобразует записанный в него байт в фонему, которая выводится в виде Ш ИМ-сигнал а. На рис. 13.14 приведена схема включения этого устройства, где не показаны выводы, которые остались неподключенными.

Рис. 13.14. Включение звукосинтезатора SP0256.

Сигнал _LRQ становится неактивным, когда завершается вывод фонемы, и устройство готово к приему нового байта. После вывода фонемы выполняется процедура опроса состояния вывода _LRQ, который соединен с выводом _RD микроконтроллера 87С520. Когда на этом выводе устанавливается низкий уровень сигнала, производится посылка новой фонемы.

Можно отметить, что SP0256 имеет не очень хорошие характеристики. Он реализует вывод речи в виде ШИМ-сигнала, который не обеспечивает необходимой информации для ее качественного воспроизведения. Более похожим


на звуковой сигнал его можно сделать, пропустив через фильтр низкой частоты — RC-схему, подключенную к аудио-выходу. Для усиления выходного сигнала используется LM386, который включается как стандартный аудио-усилитель, работающий на 8-Омный динамик.

Если посмотреть техническую документацию на SP0256, то там указана тактовая частота 3,12 МГц. В данной схеме использовался кварцевый резонатор с частотой 3,579545 МГц, что не вызвало каких-либо проблем в ее работе.

При поступлении соответствующего байта, который называется «адресом», SP0256 может воспроизводить следующие английские звуки (отмечены в таблице заглавными буквами)

АДРЕС

ФОНЕМА

АДРЕС

ФОНЕМА

0

Пауза 10 мс

32

abOUt

1

Пауза 30 м с

33

dOg

2

Пауза 50 мс

34

pIG

3

Пауза 100 мс

35

Vest

4

Пауза 200 мс

36

GUest

5

BOY

37

SHiver

6

mY

38

aZure

7

End

39

bRave

8

Come

40

Favour

9

Power

41

Kite

10

Gym

42

Camera

11

Never

43

Zoo

12

pin

44

boNG

13

To

45

Light

14

Ran

46

Window

15

sUccess

47

repAIR

16

Micro

48

WHen

17

Test

49

Yummy

18

THe

50

CHart

19

mE

51

URn

20

rAY

52

great ER

21

Dog

53

tow

22

dO

54

THe

23

cAUght

55

Sissy

24

Юр

56

Now

25

YEti

57

How

26

cAt

58

stoRage

27

Hat

59

chARm

28

Bat

60

JAR

29

THIn

61

Gone

30

lOOk

62

Lazy

31

fOOd

63

draB


На первый взгляд может показаться, что в списке много повторяющихся звуков. Это не совсем верно. Некоторые звуки, которые кажутся одинаковыми, на самом деле имеют небольшие отличия. Для составления слова можно перепробовать различные комбинации.

Качество речи, получаемое от этого прибора, варьируется от очень хорошей до фактически непонятной. Некоторые цифры и буквы в данном приложении звучат не очень хорошо. Возможно, надо потратить больше времени на подбор лучших комбинаций.

Чтобы определить фонемы, составляющие слово, его надо разбить на составные звуки. Например, звучание буквы «X» можно разбить на следующие звуки:

  1. Короткое «е»

  2. «К»

  3. «s»

Используя фонемы с адресами 7, 41 и 55, можно получить достаточно хорошее звучание.


После реализации процедур вывода наступила очередь разработки интерфейса с клавиатурой. Так как отсутствовала какая-либо документация на имевшуюся клавиатуру, пришлось «прозванивать» ее контакты, чтобы определить пару выводов для каждой клавиши. После этой операции была получена следующая матрица подключения клавиш.

PIN

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

1

“V”

“R”

“4”

“M”

“J”

“F”

“7”

“U”

2

“C”

“E”

“3”

“,”

“K”

“D”

“8”

“I”

3

“X”

“W”

“2”

“.”

“L”

“S”

“9”

“O”

4

Crtl

Fctn

“=”

“ ”

Shift

Ent

5

“E”

“Z”

6

“T”

“Q”

7

“5”

“N”

“H”

“G”

“6”

“Y”

8

“1”

“/”

“;”

“A”

“0”

“P”

9

Caps

10

11

12

13

14

15


Эта матрица была преобразована в таблицу для подключения к 87С520.

РЯД-КОЛОНКА

5

6

9

11

12

13

14

15

1

V

R

4

M

J

F

7

U

2

С

Е

3

,

К

D

8

I

3

X

W

2

.

L

S

9

0

4

Ctrl

Func

=

Shift

Enter

7

B

Т

5

N

Н

G

6

Y

8

Q

1

/

;

А

0

Р

10

Caps


Теперь можно приступить к подключению. В разработанной схеме все выводы порта Р2 микроконтроллера свободны, а выводы 6 и 7 порта РЗ используются для шинного интерфейса. От ряда 10 можно отказаться, так как в нем только одна клавиша. Таким образом, остается подключить 14 линий. Для чтения клавиатуры в порт Р1 записывается OFFh, и этот порт работает в режиме ввода данных. Выводы с номерами РЗ.О — Р3.5 используются для подключения рядов. Эти линии поочередно переводятся в низкое состояние, чтобы определить, нажата ли клавиша. В исходном состоянии все выводы порта РЗ находятся в высоком состоянии, кроме сканируемого ряда. Если при сканировании ряда в порте Р1 окажется не FFh, то одна из клавиш нажата. По значению битов в портах Р1 и РЗ можно определить, какая именно клавиша нажата.

Рассматривая последнюю часть прикладной программы AP3V7.ASM можно заметить, что не принимается никаких специальных мер для устранения дребезга контактов клавиатуры. В данном приложении этого не требуется. После нажатия на клавишу соответствующий символ выводится на индикатор и произносится синтезатором речи. Через секунду после этого начинается опрос клавиатуры, чтобы определить момент отпускания клавиши. После отпускания клавиши следующий опрос клавиатуры начинается через четверть секунды. Этих задержек вполне достаточно, чтобы дребезг контактов прекратился.


Является ли такое решение самым подходящим? Произношение звука может занимать большую часть секунды. Поэтому быстрое нажатие на клавиши невозможно, и данный простой способ подавления дребезга является вполне приемлемым для этого приложения. Если же разрабатывается приложение, где ввод с клавиатуры производится с высокой скоростью, то лучше использовать другой метод устранения дребезга.

Образцы SP0256, а также схемы включения можно получить, обратившись по адресу:

B.C. Micro P.O. Box 280298 Dallas, Texas 75228 1(800)276-2206 or (972)271-5546 Fax: (972)271-2462

email: bgmicro @bgmicro.com //www.bgmicro.com

ГЛАВА

14

ЗАКЛЮЧЕНИЕ ПО СЕМЕЙСТВУ 8051

Краткое содержание

Ресурсы 8051

WEB Сайты


Справочные серверы Фирмы-производители

Возможно, приведенное здесь описание 8051 является не таким полным, как описание других микроконтроллеров. Но если сравнить его с документацией фирмы Intel на микроконтроллер 8051, которая не обновлялась с 1980 года, то представленную информацию можно считать вполне законченной.

Многие другие производители значительно усовершенствовали классический 8051. Хорошим примером тому может послужить линия микроконтроллеров 8051 фирмы Philips. Посетив их Web-сайт можно увидеть, какие разнообразные периферийные устройства встроены в их микроконтроллеры.

Интерфейсные устройства 8051 радикально отличаются от интерфейса других микроконтроллеров, представленных в данной книге. Это не является недостатком, просто об этом надо знать при разработке приложений. Когда я разрабатывал примеры применения 8051, то не встретил особых трудностей с реализацией интерфейса, несмотря на его отличия от других микроконтроллеров, с которыми мне пришлось работать ранее. Если посмотреть на описание обработчика прерывания от таймера, то можно отметить, что аппаратные средства 8051 спроектированы таким образом, чтобы позволить программисту легко и быстро корректировать работу устройства.


Архитектура и набор команд 8051 достаточно эффективны с точки зрения объема и скорости выполнения программ. Если Вы поняли, чем отличаются регистровые банки от первых 256 байт памяти, а первые 256 байт от всего

пространства 64 Кбайт памяти, то у Вас не будет проблем при программировании микроконтроллера. Такую трехступенчатую организацию памяти с выделением отдельных служебных регистров можно считать наилучшей среди представленных в данной книге микроконтроллеров.

Однако имеются два негативных момента. Первый — отсутствие хороших свободно распространяемых инструментальных средств разработки для данной архитектуры. Несмотря на то, что 8051 очень популярен в настоящее время, он постепенно уступает другим микроконтроллерам, так как для них производители предлагают недорогие высококачественные инструментальные средства. Было бы неплохо, если бы 8051 имел большую поддержку со стороны производителей или сторонних разработчиков.

Другой негативный момент связан с количеством тактов, требуемых на выполнение команд 8051. Различные микроконтроллеры, например MCS-I51, HSM и ХА, имеют разную производительность, и, к сожалению, отсутствует какой-либо стандарт, определяющий количество тактов для выполнения команд, который соблюдался бы всеми производителями.


Ознакомившись со справочными данными на микроконтроллеры 8051 HSM фирмы Dallas semiconductor, можно отметить, что в этих приборах реализовано развитие архитектуры и расширение возможностей периферийных устройств при сохранении высокой степени совместимости с классическими 8051.

Ресурсы 8051

Как сказано ранее, 8051 выпускаются рядом производителей, которые направляют свои усилия на развитие аппаратных средств этих микроконтроллеров и возлагают разработку инструментальных средств проектирования на сторонних производителей. Представленные ниже информационные ресурсы это лишь часть того, что существует, но они дают хорошее представление о той информации, которая доступна по 8051.