Глава 6 Принципы работы микроконтроллеров

We use cookies. Read the Privacy and Cookie Policy

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

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

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

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

Семейство микроконтроллеров MCS-51

В настоящее время среди всех 8-разрядных микроконтроллеров семейство MCS-51 является несомненным чемпионом по числу разновидностей и количеству компаний, выпускающих его модификации. Первый представитель этого семейства — микроконтроллер 8051, выпущенный в 1980 г. на базе технологии n-МОП.

Удачный набор периферийных устройств, возможность гибкого выбора внешней или внутренней программной памяти и приемлемая цена обеспечили этому микроконтроллеру успех на рынке. С точки зрения технологии микроконтроллер 8051 являлся для своего времени очень сложным изделием: в кристалле было использовано 128 тыс. транзисторов, что в 4 раза превышало количество транзисторов в 16-разрядном микропроцессоре 8086. Важную роль в достижении такой высокой популярности семейства 8051 сыграла открытая политика фирмы Intel, родоначальницы архитектуры, направленная на широкое распространение лицензий на ядро 8051 среди большого количества ведущих полупроводниковых компаний мира. В результате на сегодняшний день существует более 200 модификаций микроконтроллеров семейства 8051, выпускаемых почти двадцатью компаниями. Эти модификации включают в себя кристаллы с широчайшим спектром периферии: от простых 20-выводных устройств с одним таймером и 1К программной памяти до сложнейших 100-выводных кристаллов с 10-разрядными АЦП, массивами таймеров-счетчиков, аппаратными 16-разрядными умножителями и 64К программной памяти на кристалле. Каждый год появляются все новые варианты представителей этого семейства. Основными направлениями развития микроконтроллеров являются:

— увеличение быстродействия (повышение тактовой частоты и переработка архитектуры);

— снижение напряжения питания и потребления;

— увеличение объема ОЗУ и флэш-памяти на кристалле с возможностью внутрисхемного программирования;

— введение в состав периферии микроконтроллера сложных устройств типа системы управления приводами, CAN- и USB-интерфейсов и т. п.

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

Микросхемы семейства MCS51 производятся рядом фирм различных стран мира, таких как Philips, Siemens, Intel, Atmel, Dallas, Temic, Oki, AMD, MHS, Gold Star, Winbond, Silicon Systems, и ряд других. Микроконтроллеры семейства MCS-51 выпускают и заводы бывшего СССР.

Производство микроконтроллера 8051 осуществляется в Киеве, Воронеже (1816ВЕ31/51, 1830ВЕ31/51), Минске (1834ВЕ31) и Новосибирске (1850ВЕ31).

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

Примечание

1. Вместо символа X в названии микроконтроллера должны стоять символы:

∙ 0 — в микросхемах n-МОП без ПЗУ;

∙ 3 — в микросхемах n-МОП с ПЗУ;

∙ 7 — в микросхемах n-МОП с РПЗУ;

∙ 0с — в микросхемах КМОП без ПЗУ;

∙ 3с — в микросхемах КМОП с ПЗУ;

∙ 7с — в микросхемах КМОП с РПЗУ;

∙ 9с — в микросхемах КМОП с FLASH-памятью.

2. комп. — аналоговый компаратор.

3. 10 р — количество разрядов во встроенном АЦП.

Примечание

Серия микросхем 1816 выполнена по n-МОП технологии.

Серия микросхем 1830 выполнена по КМОП технологии.

Архитектура микроконтроллеров MCS-51

Архитектура семейства MCS-51 в значительной мере предопределяет ее назначение — это построение компактных и дешевых цифровых устройств. Все функции микроконтроллера реализуются с помощью единственной микросхемы. В состав семейства MCS-51 входит ряд микросхем от самых простых микроконтроллеров до достаточно сложных. Микроконтроллеры семейства MCS-51 позволяют выполнять как задачи управления различными устройствами, так и реализовывать простейшие алгоритмы цифровой обработки сигналов. Все микросхемы этого семейства работают с одной и той же системой команд. Большинство микросхем выполняется в одинаковых корпусах с совпадающей цоколевкой (схемой расположения выводов). Это позволяет использовать для разработанного устройства микросхемы разных фирм-производителей (таких как Intel, Dallas, Atmel, Philips и т. д.) без переделки принципиальной схемы устройства и программы.

Структурная схема микроконтроллера представлена на рис. 6.1 и состоит из следующих основных функциональных узлов:

— блока управления;

— арифметико-логического блока;

— блока таймеров/счетчиков;

— блока последовательного интерфейса и прерываний;

— программного счетчика, памяти данных и памяти программ.

Двусторонний обмен данными между элементами внутренней структуры микроконтроллера осуществляется с помощью внутренней 8-разрядной шины данных.

По такой схеме построены практически все представители семейства MCS-51. Различные микросхемы этого семейства различаются только регистрами специального назначения (в том числе и количеством портов). Система команд всех контроллеров семейства MCS-51 содержит 111 базовых команд длиной 1, 2 или 3 байта и не изменяется при переходе от одной микросхемы к другой. Это обеспечивает прекрасную переносимость программ с одной микросхемы на другую. Рассмотрим подробнее назначение каждого блока.

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

— устройство формирования временных интервалов;

— логика ввода-вывода;

— регистр команд;

— регистр управления потреблением электроэнергии;

— дешифратор команд, логика управления микроконтроллером.

Рис. 6.1. Структурная схема микроконтроллера К1830ВЕ751

Устройство формирования временных интервалов предназначено для формирования и выдачи внутренних синхросигналов фаз, тактов и циклов. Количество машинных циклов определяет продолжительность выполнения команд. Практически все команды микроконтроллера выполняются за один или два машинных цикла, кроме команд умножения и деления, продолжительность выполнения которых составляет четыре машинных цикла. Обозначим частоту задающего генератора через Fг. Тогда длительность машинного цикла равна I2/Fг или составляет I2 периодов сигнала задающего генератора. Логика ввода-вывода предназначена для приема и выдачи сигналов, обеспечивающих обмен информацией с внешними устройствами через порты ввода-вывода Р0-Р3.

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

Регистр управления потреблением (PCON) позволяет останавливать микроконтроллер для уменьшения потребления электроэнергии и уменьшения уровня помех. Еще большего уменьшения потребления электроэнергии и уменьшения помех можно добиться, остановив задающий генератор микроконтроллера при помощи переключения битов регистра управления потреблением PCON. В вариантах микросхемы, изготовленных по технологии-n-МОП (серия 1816 или иностранных микросхем, в названии которых в середине отсутствует буква «с»), регистр управления потреблением PCON содержит только один бит, управляющий скоростью передачи последовательного порта SMOD, а биты управления потреблением электроэнергии отсутствуют.

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

— регистров временного хранения ТМР1 и ТМР2;

— ПЗУ констант;

— арифметико-логического устройства;

— дополнительного регистра (регистра В);

— аккумулятора (АСС);

— регистра состояния программ (PSW).

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

ПЗУ констант обеспечивает выработку корректирующего кода при двоично-десятичном представлении данных или кода маски при битовых операциях и констант.

Арифметико-логическое устройство представляет собой схему комбинационного типа с последовательным переносом, предназначенную для выполнения арифметических операций сложения, вычитания и логических операций «И», «ИЛИ», суммирования по модулю 2 и инвертирования.

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

Аккумулятор — 8-разрядный регистр, предназначенный для приема и хранения результата, полученного при выполнении арифметико-логических операций или операций сдвига.

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

— логика управления;

— регистр управления;

— буфер передатчика;

— буфер приемника;

— приемопередатчик последовательного порта;

— регистр приоритетов прерываний;

— регистр разрешения прерываний;

— логика обработки флагов прерываний.

Счетчик команд предназначен для формирования текущего 16-разрядного адреса внутренней или внешней памяти программ. В состав счетчика команд входят 16-разрядный буфер счетчика команд, регистр счетчика команд и схема инкремента (увеличения содержимого на 1).

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

Порты Р0, P1, P2, РЗ являются квазидвунаправленными портами ввода-вывода и предназначены для обеспечения обмена информацией между микроконтроллером и внешними устройствами, образуя 32 линии ввода-вывода.

Регистр состояния программы (PSW) предназначен для хранения информации о состоянии АЛУ при выполнении программы.

Память программ предназначена для хранения программного кода и представляет собой постоянное запоминающее устройство (ПЗУ). В разных микросхемах применяются масочные, стираемые ультрафиолетовым излучением или FLASH ПЗУ.

Регистр указателя данных (DPTR) предназначен для формирования 16-разрядного адреса внешней памяти данных или памяти программ при считывании таблиц констант.

Указатель стека (SP) представляет собой 8-разрядный регистр, предназначенный для организации особой области памяти данных (стека), в которой хранятся адреса возврата из подпрограмм, переменные и содержимое внутренних регистров микроконтроллера (в том числе регистры PSW и аккумулятор).

Система команд микроконтроллеров MCS-51

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

В этой системе команд реализована побитная, потетрадная (4 бита), побайтовая (8 бит) и 16-разрядная обработка данных. Микросхемы семейства MCS-51 — это 8-разрядные микропроцессоры, а это означает, что ПЗУ, ОЗУ, регистры специального назначения, АЛУ и внешние шины имеют байтовую организацию. Двухбайтовые данные используются только регистром-указателем (DTPR) и счетчиком команд (PC).

В машинном коде команда занимает один, два или три байта в зависимости от типа адресации.

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

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

Е535 MOV A, 35h

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

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

Если операция требует для выполнения двух источников и одного приемника результата операции (например, команда сложения ADD или вычитания SUBB), то первый операнд является одновременно и источником и приемником результата операции. Например, в команде

2535 ADD A, 35h

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

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

Команды микроконтроллера условно можно разбить на пять групп:

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

— логические команды с байтовыми переменными;

— команды передачи данных;

— команды битового процессора;

— команды ветвления программ и передачи управления ОЭВМ.

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

В наборе команд микроконтроллера имеются следующие арифметические операции:

— сложение — ADD;

— сложение с учетом флага переноса — ADDCC;

— вычитание с заемом из флага переноса — SUBB;

— инкрементирование (увеличение на 1) — INC;

— декрементирование (уменьшение на 1) — DEC;

— десятичная коррекция — DA;

— умножение — MUL;

— деление — DIV.

Действия производятся над целыми беззнаковыми 8-разрядными числами. Арифметические операции в рассматриваемой системе команд могут быть выполнены только над содержимым регистра-аккумулятора.

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

В случае выполнения операции деления целое от деления помещается в аккумулятор А, остаток — в регистр В.

Логические команды с байтовыми переменными

Система команд рассматриваемого микроконтроллера позволяет реализовать следующие логические операции:

— логическое «И» — ANL;

— логическое «ИЛИ» — ORL;

— исключающее «ИЛИ» — XRL.

Логические операции могут выполняться только над аккумулятором или над портами ввода-вывода.

Существуют логические операции, которые выполняются только на аккумуляторе:

— сброс всех восьми разрядов АCLR A;

— инвертирование всех восьми разрядов А CPL A;

— циклический сдвиг влево и вправо без учета флага переноса — RL A и RR A;

— циклический сдвиг влево и вправо с учетом флага переноса — RLC A и RRC A;

— обмен местами старшей и младшей тетрад внутри аккумулятора — SWAP A.

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

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

Так как в микроконтроллере присутствуют три независимых области памяти, то для обращения к ним введены различные команды:

— копирование данных во внутреннем ОЗУ — MOV;

— обмен данными аккумулятора с внутренним ОЗУ — XCH, XCHO;

— копирование из внешней памяти данных — MOVX;

— копирование данных из памяти программ — MOVC.

Рассмотрим несколько примеров использования команд пересылки данных.

Любая из 256 ячеек внутреннего ОЗУ данных может быть выбрана с использованием косвенно-регистровой адресации через регистры-указатели R0 и R1 (выбранного банка рабочих регистров):

MOV A, @R0   ;Скопировать число из ячейки памяти с адресом, хранящимся в R0, в аккумулятор

MOV @R1, А   ;Скопировать число из аккумулятора, в ячейку памяти с адресом, хранящимся в R1

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

MOV 15, 25     ;Скопировать содержимое 25-ой ячейки в 15-ю ячейку

Таблицы символов (кодов), записанные в ПЗУ программы, могут быть скопированы в аккумулятор с помощью команд передачи данных с косвенной адресацией, например:

MOVC A, @A+DPT  ;Скопировать символ в аккумулятор

Ячейка адресного пространства 64-килобайтного внешнего ОЗУ также может быть выбрана с использованием косвенно-регистровой адресации через регистр-указатель данных DPTR, например:

MOVX A, @DPTR    ;Скопировать число из внешней ячейки памяти с адресом, хранящимся в DPTR, в аккумулятор

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

ХСН A, R0.

Битовые команды

Каждый бит из битового пространства внутренней памяти может быть установлен в 1, сброшен в 0 или инвертирован.

Эти операции можно выполнить при помощи следующих команд:

— установить бит (записать логическую единицу) — SETB;

— сбросить бит (записать логический ноль) — CLR;

— проинвертировать значение бита (изменить на противоположное) — CPL;

— записать бит во флаг переноса или считать из флага переноса — MOV.

По значениям бита могут быть реализованы переходы:

— если бит установлен (содержит логическую 1) — JB;

— если бит не установлен (содержит логический 0) — JNB;

— переход, если бит установлен со сбросом этого бита после выполнения команды (запись в этот бит 0) — JBC.

Между любым битом из битового пространства внутренней памяти и флагом переноса могут быть произведены логические операции «И» или «ИЛИ».

— «И» — ANL

— «ИЛИ» — ORL

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

Команды ветвления позволяют реализовывать условные операторы и операторы циклов. В микроконтроллерах семейства MCS-51 доступны следующие команды:

— безусловный переход: LJMP, AJMP, SJMP;

— вызов и возврат из подпрограммы: LCALL, ACALL, RET, RETI;

— переход в зависимости от результата проверки содержимого аккумулятора: JZ, JNZ, CJNE, JMP;

— переход в зависимости от значения флага переноса С: JC, JNC;

— переход в зависимости от значения любого бита в битовом пространстве: JB, JNB, JBC.

Команды 16-разрядных безусловных переходов и вызовов подпрограмм позволяют осуществить переход в любую точку адресного пространства памяти программ объемом до 64 Кбайт. Примеры команд:

LJMP Metka                  ;Переход к команде, расположенной по адресу обозначенному меткой 'Metka'

LCALL Podprogramma   ;Вызов подпрограммы по адресу, обозначенному меткой 'Podprogramma'

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

AJMP Metka                  ;Переход к команде, расположенной по адресу обозначенному меткой 'Metka'

ACALL Podprogramma   ;Вызов подпрограммы по адресу, обозначенному меткой 'Podprogramma'

В системе команд микроконтроллеров семейства MCS-51 имеются команды условных и безусловных переходов относительно начального адреса следующей команды в пределах от (PC)-127 до (PC)+127. Примеры команд:

SJMP Metka                  ;Переход к команде, расположенной по адресу, обозначенному меткой 'Metka'

JB P3.5, TstNxtUsl         ;Если на выводе 6 порта РЗ нулевой потенциал,

ACALL Podprogramma   ;то вызвать подпрограмму, обозначенную меткой 'Podprogramma'

CJNE A, #5, TstNxtUsl    ;Если в аккумуляторе содержится число 5,

ACALL Podprogramma   ;то вызвать подпрограмму, обозначенную меткой 'Podprogramma'

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

MOV А, 34                    ;Если в переменной, хранящейся в ячейке внутренней

JNB ACC_7, TstEQ5       ; памяти с адресом 34, число меньше нуля,

CALL Podprogramma    ;то вызвать подпрограмму, обозначенную меткой 'Podprogramma'

Косвенный переход JMP @A+DPTR в системе команд микроконтроллеров семейства MCS-51 обеспечивает ветвление программы по содержимому аккумулятора А. Это позволяет реализовывать операцию перехода по заданному коду, эквивалентную оператору case в языке программирования Pascal, но намного быстрее (за два машинных цикла). Использование в этой команде указателя данных DPTR позволяет размещать таблицу переходов в любом месте памяти программ. Пример реализации команды выбора варианта:

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

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

Неявная адресация. При неявной адресации регистр-источник или регистр-приемник подразумевается в самом коде операции. Например:

03 RR А            ;Сдвинуть содержимое аккумулятора вправо

D4 DA А           ;Произвести десятичную коррекцию результата суммирования

Е8 MOV A, R0   ;В первом операнде использована неявная адресация, а во втором — регистровая

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

F8 MOV R0,А    ;в первом операнде использована регистровая адресация, а во втором — неявная

Прямая байтовая адресация используется для обращения к ячейкам внутренней памяти (ОЗУ) данных (адреса 0:127) и к регистрам специального назначения (адреса 128…256). Адрес ячейки памяти помещается во второй байт команды. Например:

Е520 MOV A,20h     ;во втором операнде использована прямая байтовая адресация, а в первом — неявная

8D15 MOV 15h,R6   ;в первом операнде использована прямая байтовая адресация, а во втором — регистровая

Прямая битовая адресация используется для обращения к отдельно адресуемым 128 битам, расположенным в ячейках с адресами 20Н—2FH, и к отдельно адресуемым битам регистров специального назначения. Например:

D220 SETB 20h     ;использована прямая битовая адресация

С215 CLR 15H       ;использована прямая битовая адресация

Косвенно-регистровая адресация используется для обращения к ячейкам внутреннего ОЗУ данных. В качестве регистров-указателей используются регистры R0, R1 выбранного банка регистров. Например:

Е6 MOV A,@R0     ;B первом операнде использована неявная адресация, а во втором — косвенно-регистровая

F7 MOV @R1,A     ;B первом операнде использована косвенно-регистровая адресация, а во втором — неявная

Косвенно-регистровая адресация используется также для обращения к внешней памяти данных. В этом случае с помощью регистров-указателей R0 и R1 (рабочего банка рабочих регистров) выбирается ячейка из блока 256 байт внешней памяти данных. Номер блока предварительно задается содержимым порта Р2.

Е2 MOVX A,@R0    ;B первом операнде использована неявная адресация, а во втором — косвенно-регистровая

F3 MOVX @R1,A    ;B первом операнде использована косвенно-регистровая адресация, а во втором — неявная

Если в качестве регистра-указателя используется 16-разрядный указатель данных (DPTR), то можно выбрать любую ячейку внешней памяти данных объемом до 64 Кбайт. (В некоторых моделях микроконтроллеров семейства MSC-51 таким образом можно обращаться к внутренней памяти данных объемом более 256 байт).

Е0 MOVX A,DPTR   ;B первом операнде использована неявная адресация, а во втором — косвенно-регистровая

F0 MOVX DPTR,A   ;B первом операнде использована косвенно-регистровая адресация, а во втором — неявная

Косвенно-регистровая адресация по сумме базового и индексного регистров (содержимое аккумулятора А) упрощает просмотр таблиц, записанных в памяти программ. Любой байт из таблицы может быть выбран по адресу, определяемому суммой содержимого DPTR или PC и содержимого A, например:

83 MOVC A,@A+PC       ;В первом операнде использована неявная адресация, а во втором — косвенно-регистровая

93 MOVC A,@A+DPTR   ;B первом операнде использована неявная адресация, а во втором — косвенно-регистровая

Непосредственная адресация позволяет выбрать из адресного пространства памяти программ константы, явно указанные в команде, например:

7414 MOV A, #14h               ;B первом операнде использована неявная адресация, а во втором — непосредственная

902048 MOV DPTR, #2048h   ;B первом операнде использована неявная адресация, а во втором — непосредственная

Полный список команд микроконтроллеров семейства MCS-51, упорядоченный по коду команды, приведен в приложении, табл. ПЗ.

Устройство параллельных портов микроконтроллеров MCS-51

Порты ввода-вывода Р0, P1, P2, РЗ являются квазидвунаправленными и обеспечивают обмен информацией между микроконтроллером и внешними устройствами, образуя 32 линии ввода-вывода. Каждый из портов содержит 8-разрядный регистр, имеющий байтовую и битовую адресацию для установки (запись логической 1) или сброса (запись логического 0) разрядов этого регистра с помощью программного обеспечения микроконтроллера. Выходы этих регистров соединены с внешними выводами микросхемы. Все разряды параллельных портов устроены одинаково.

Упрощенная схема одного разряда параллельного порта микроконтроллера показана на рис. 6.2. Отличаются только выводы порта Р0, у которых отсутствуют внутренние генераторы тока в верхней части схемы.

Рис. 6.2. Упрощенная схема одного бита параллельного порта

Один разряд регистра-защелки порта представляет собой D-триггер, запись входных данных в который происходит по высокому уровню синхросигнала. На рис. 6.2 этот сигнал назван «запись в защелку». Сигнал с инвертирующего выхода триггера умощняется при помощи МОП-транзистора и поступает на внешний вывод микросхемы.

Рис. 6.3. Схема подключения светодиодных индикаторов к параллельному порту

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

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

Значение сигнала непосредственно с внешнего вывода порта считывается по сигналу «чтение вывода». Однако при выполнении операций с отдельными битами требуется считывать содержимое внутреннего регистра-защелки порта. Если база биполярного транзистора непосредственно подключена к выводу порта, то считывание значения логической 1 с вывода порта становится невозможным. Дело в том, что напряжение на р-n-переходе база-эмиттер транзистора не может превысить ~0,7 В (для кремниевого транзистора). Такое напряжение однозначно будет воспринято цифровой схемой как логический ноль, поэтому при выполнении операций над отдельными битами параллельного порта считывание производится непосредственно с выхода регистра-защелки порта. При этом выход Q D-триггера подключается к внутренней шине (считывается) по сигналу «чтение защелки».

Чтение внешних выводов порта РЗ осуществляется командами:

MOV А, РЗ          ;Скопировать состояние выводов порта РЗ в аккумулятор

JB P3.4, Metka    ;Если на выводе 4 порта РЗ логическая 1, то перейти на метку Metka

Чтение регистра-защелки осуществляется командами чтение-чтение-модификация-запись. Например:

CPL Р3. 1            ;Проинвертировать сигнал на выводе 1 порта РЗ

ORL Р2, #56h       ;Установить единичный сигнал на выводах 1, 2, 4 и 6 порта Р2

ANL Р3, #03h       ;Установить нулевой сигнал на выводах 0 и 1 порта РЗ

SETB Р3. 1          ;Установить высокий потенциал на выводе 1 порта РЗ

Порты микросхемы служат для управления внешними устройствами, подключенными к микроконтроллеру. Схема подключения простейших внешних устройств приведена на рис. 6.3. Он иллюстрирует особенности подключения светодиодных индикаторов к параллельным портам микроконтроллера MCS-51.

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

Рис. 6.4. Эквивалентная схема подключения светодиодного индикатора к параллельному порту

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

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

Микроконтроллеры предназначены для управления внешними устройствами. Однако изменять напряжения на выводах параллельного порта микроконтроллера можно только при помощи программы, записанной в память программ. Какие напряжения необходимо подавать на выходы микросхемы, зависит от схемы подключения индикатора. В приведенной на рис. 6.3 схеме для зажигания светодиода VD1 в разряд 6 порта Р0 необходимо записать логический 0. Для зажигания светодиода VD2 необходимо в разряд 7 порта Р2 записать логическую единицу, а для его гашения — логический ноль.

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

1. MOV (пересылка), например:

MOV Р1, #01110011Ь   ;Выдать на все восемь выводов Р1 число 01110011

MOV РЗ, А                 ;Выдать на все восемь выводов РЗ содержимое АСС

2. ANL (логическое «И»), например:

ANL Р1, #11110011b   ;выдать низкий потенциал на выводах Р1.2 и Р1.3

3. XRL (исключающее «ИЛИ»), например:

XRL РЗ, #01000100Ь   ;инвертировать состояние выводов РЗ.2 и Р3.6

4. ORL (логическое «ИЛИ»), например:

ORL Р1, #00001100b   ;выдать высокий потенциал на выводах Р1.2 и Р1.3

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

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

1. MOV (пересылка), например:

MOV P1.2, С   ;выдать содержимое бита переноса через вывод 2 порта Р2

2. CPL (инверсия), например:

CPL Р1.2        ; проинвертировать 2-й бит порта Р2

3. SETB (установить бит), например:

SETB Р2.3      ; выдать высокий потенциал на вывод 3 порта Р2

4. CLR (сбросить бит), например:

CLR Р2. 3       ; выдать низкий потенциал на вывод 3 порта Р2

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

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

Кроме работы в качестве обычных портов ввода-вывода внешние выводы портов Р0-Р3 могут выполнять ряд дополнительных (альтернативных) функций.

Порт Р0 может быть использован для организации части шины адреса и шины данных при работе микроконтроллера с внешней памятью данных или программ. При этом через него из микроконтроллера выводится младший байт адреса А0-А7, а также принимается в микроконтроллер или выдается из него байт данных. Во время чтения содержимого внешней памяти во все триггеры-защелки порта Р0 аппаратно записываются 1 (т. е. содержимое порта теряется). Кроме того, через порт Р0 передаются данные при программировании внутреннего ППЗУ, и читается содержимое внутренней памяти программ при работе с программатором.

При сбросе микросхемы во все разряды порта Р0 записываются 1. У схемы Р0, в отличие от схем всех других портов, отсутствует внутренний генератор тока. Поэтому при работе с этим портом приходится подключать внешние резисторы к плюсу источника питания.

Формат и адрес порта Р0 приведены на рис. 6.5. На этом же рисунке приведены адреса отдельных битов порта Р0 в битовом пространстве. На рис. 6.6 приведена схема использования выводов портов Р0 и Р2 для подключения внешней памяти программ и внешней памяти данных.

Рис. 6.5. Формат параллельного порта Р0

Рис. 6.6. Использование выводов портов Р0 и Р2 для подключения внешней памяти программ и внешней памяти данных

Порт Р1 может быть использован для чтения внутренней памяти программ или для передачи младшего байта адреса при программировании внутреннего РПЗУ. В младших моделях микроконтроллера семейства других альтернативных функций у порта Р1 нет. При сбросе микросхемы во все разряды порта записываются 1.

Формат и адрес порта Р1 приведены на рис. 6.7. На этом же рисунке приведены адреса отдельных битов порта Р1 в битовом пространстве.

Рис. 6.7. Формат параллельного порта Р1

Заметим, что этот порт в самых младших моделях микроконтроллеров альтернативных функций не имеет, а приведенные альтернативные функции относятся к микроконтроллерам с ядром MCS-52. Линии порта Р1 могут выполнять альтернативные функции только в том случае, если в соответствующие этим линиям разряды регистра записаны логические 1, иначе на линиях порта будет присутствовать логический 0 независимо от характера принимаемой или передаваемой информации.

Порт Р2 может быть использован для передачи старшего байта адреса при программировании внутреннего ППЗУ и при чтении внутренней памяти программ. Через порт Р2 выводится старший байт адреса А8-А15 при работе с внешней памятью программ и внешней памятью данных (с 16-разрядным адресом). Во время доступа к внешней памяти содержимое регистра-защелки порта Р2 не изменяется. При сбросе микросхемы во все разряды порта записываются 1. Формат и адрес порта Р2 приведены на рис. 6.8. На рис. 6.6 приведена схема использования порта Р2 при подключении внешней памяти программ и внешней памяти данных.

Рис. 6.8. Формат параллельного порта Р2

Порт РЗ. Каждая линия порта РЗ имеет индивидуальную альтернативную функцию, которая может быть задействована простым обращением к устройству, соединенному с выводом порта. Например, для того чтобы был выработан строб WR, достаточно обратиться с внешней памяти командой MOVX @DPTR, A или MOVX @R0, A. Линии порта РЗ могут выполнять альтернативные функции только в том случае, если в соответствующие этим линиям разряды регистра записаны логические 1, иначе на линиях порта будет присутствовать логический 0 независимо от характера принимаемой или передаваемой информации. При сбросе микросхемы во все разряды порта записываются 1. Формат и адрес порта РЗ приведены на рис. 6.9.

Рис. 6.9. Формат параллельного порта РЗ

Особенности построения памяти микроконтроллеров семейства MCS-51

Микроконтроллеры семейства MCS-51 построены по гарвардской архитектуре. Это означает, что память данных и память программ в этих микросхемах разделены и имеют отдельные адресные пространства. В этих микроконтроллерах имеется три адресных пространства: памяти программ, внешней памяти данных и внутренней памяти. Такое построение памяти позволяет удвоить доступное адресное пространство внешней памяти. Кроме того, построение памяти по гарвардской структуре позволяет в ряде случаев увеличить быстродействие микросхем. Для микроконтроллеров особенно важным является то обстоятельство, что не существует команд, способных осуществить запись данных в память программ и тем самым испортить управляющую программу.

Схема подключения внешних микросхем памяти к микроконтроллерам семейства MCS-51 приведена на рис. 6.6. Регистр адреса D3 на этой схеме предназначен для запоминания младших восьми битов адреса, передаваемых через шину данных/адреса, совмещенную с портом Р0. Старшие 8 битов адреса передаются через шину адреса, совмещенную с портом Р2.

Во время передачи адреса через порт Р0О микроконтроллер вырабатывает синхроимпульс на выводе ALE. Именно этот импульс позволяет запомнить младший байт адреса в регистре D3 и тем самым организовать 16-разрядную шину адреса внешней памяти.

При обращении к памяти данных и к памяти программ используются одни и те же шина адреса и шина данных, но разные управляющие сигналы. Для чтения памяти программ вырабатывается сигнал PSEN, а для чтения памяти данных — сигнал RD. Для записи информации в память данных вырабатывается сигнал WR. Именно эти управляющие сигналы и разделяют память микроконтроллера на память программ и память данных. То есть память программ доступна только для чтения, а память данных доступна и для чтения, и для записи любой информации, записанной в двоичном коде.

Память программ микроконтроллеров MCS-51

Память программ предназначена для хранения программ и имеет отдельное от памяти данных адресное пространство объемом 64 Кбайт, причем у некоторых микросхем (например, КР1816ВЕ51, КМ1819ВЕ751, КР1830ВЕ51) для хранения управляющих программ на кристалле микроконтроллера расположено ПЗУ. Это ПЗУ отображается в область младших адресов памяти программ. Поскольку выполнение программы после сброса микроконтроллера всегда начинается с нулевого адреса памяти программ, при включении питания начнет выполняться программа, записанная во внутреннем ПЗУ микроконтроллера.

Микроконтроллеры, не имеющие внутреннего ПЗУ (например, КР1816ВЕ31 и КР1830ВЕ31), могут работать только с внешней микросхемой ПЗУ емкостью до 64 Кбайт (при использовании портов P1 и РЗ в качестве расширителя адреса объем подключаемой ПЗУ может быть увеличен до 1 Гбайт).

Микроконтроллеры семейства MCS-51 имеют внешний вывод ЕА, с помощью которого можно запретить работу внутренней памяти, для чего необходимо подать на вывод ЕА логический 0 (соединить этот вывод с общим проводом). При этом внутренняя память программ отключается и, начиная с нулевого адреса, все обращения происходят к внешней памяти программ.

Доступ к внешней памяти программ осуществляется в двух случаях:

1. При действии сигнала ЕА = 0 независимо от адреса обращения.

2. В любом случае, если программный счетчик (PC) содержит число большее, чем максимальный адрес внутренней памяти программ.

Распределение памяти программ микроконтроллера КР1830ВЕ51 представлено на рис. 6.10. На этом рисунке объем внутренней памяти приведен для микроконтроллеров 1816ВЕ751. У других микросхем этого семейства он может оказаться другим, и соответственно будет иначе проходить граница между внутренней и внешней памятью программ. Количество доступных векторов прерываний тоже зависит от конкретного типа микроконтроллера.

Рис. 6.10. Распределение памяти программ микроконтроллеров КР1830ВЕ751

Адреса векторов прерываний и соответствующие им аппаратные источники прерываний для микроконтроллеров АТ89с52 приведены в табл. 6.3. Векторы прерываний и принципы работы с этими особыми ячейками памяти программ будут рассмотрены позднее.

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

Для чтения памяти программ используются команды с мнемоническим обозначением MOVC. Например:

MOVC A, A+@DPTR   ;Считать байт из памяти программ по адресу, вычисляемому как сумма содержимого регистров аккумулятора и DPTR

MOVC А, А+@РС      ;Считать байт из области памяти программ, начинающейся за данной командой

Внешняя память данных микроконтроллеров MCS-51

Внешняя память данных предназначена для временного хранения информации, используемой в процессе выполнения программы. Эта память физически должна быть подключена к микроконтроллеру при помощи схемы, изображенной на рис. 6.6. Максимальный объем этой памяти определяется регистром DPTR и составляет 64 Кбайт. Адресное пространство памяти данных показано на рис. 6.11. Точно так же, как и в случае внешней памяти программ, объем доступной внешней памяти данных может быть увеличен за счет использования портов P1 и РЗ до 1 Гбайт.

Рис. 6.11. Адресное пространство внешней памяти данных

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

Однако в некоторых микроконтроллерах (таких как 87с550 фирмы Dallas или ADuC834 фирмы Analog Devices) команды обращения к внешней памяти используются для работы с дополнительной внутренней памятью большого объема.

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

MOVX A, @DPTR   ;команда чтения

MOVX @DPTR, А   ;команда записи

Иногда для того, чтобы сохранить Р2 в качестве параллельного порта, для обращения к внешней памяти данных применяют команды, использующие 8-разрядные регистры адреса R0 или R1:

MOVX A, @R0    ;команды

MOVX A, @R1    ;чтения

MOVX @R0, A    ;команды

MOVX @R1, A    ;записи

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

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

Внутренняя память данных микроконтроллеров MCS-51

Несмотря на то, что внутренняя память данных имеет самое маленькое адресное пространство из рассматриваемых, оно устроено наиболее сложным образом. Распределение памяти данных микроконтроллеров серии MCS-51 приведено на рис. 6.12.

Рис. 6.12. Адресное пространство внутренней памяти данных

Внутреннее ОЗУ данных предназначено для временного хранения информации, используемой в процессе выполнения программы, и занимает 128 младших байтов, с адресами от 000h до 07Fh для микроконтроллеров 8051, 8031, КР1816ВЕ31, КР1816ВЕ51, КР1816ВЕ751 КР1830ВЕ31, КР1830ВЕ51, КР1830ВЕ751 или 256 8-разрядных ячеек с адресами от 000h до 0FFh для всех остальных микроконтроллеров семейства.

Регистры специальных функций занимают адреса внутренней памяти данных с 080h no 0FFh. Так как адреса регистров специальных функций совпадают со старшими адресами внутреннего ОЗУ данных, то имеются особенности их использования.

Система команд микроконтроллера позволяет обращаться к ячейкам внутренней памяти данных при помощи прямой и косвенно-регистровой адресации. Обращение к ячейкам памяти с адресами 0-127 (0-7Fh) происходит с использованием любого из этих видов адресации и будет производить выборку одной и той же ячейки памяти. При обращении к ячейкам ОЗУ с адресами 128 (080h)-256 (0FFh) следует воспользоваться косвенно-регистровой адресацией. Учитывая, что работа со стеком ведется при помощи косвенной адресации, а сам стек растет вверх, имеет смысл размещать в этой области памяти стек. Само понятие стека и особенности его использования будут рассмотрены позднее. Если же требуется обратиться к регистрам специальных функций, то нужно использовать прямую адресацию. Например:

MOV A, 80h      ;Скопировать сигналы с внешних выводов порта Р0 в аккумулятор

MOV R0, #80h   ;Скопировать в аккумулятор содержимое

MOV A, @R0     ;ячейки внутреннего ОЗУ с адресом 80h

Регистры общего назначения позволяют писать самые эффективные программы. У микроконтроллеров семейства MCS-51 для программирования доступны восемь регистров. Более того, в этом семействе микроконтроллеров есть четыре набора (банка) регистров с именами RB0-RB3. Для сравнения такие мощные процессоры, как «электроника-79» и SPARC, обладают всего двумя наборами регистров. Банк регистров состоит из восьми 8-разрядных регистров с именами R0, R1…, R7.

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

Переключение банков регистров производится при помощи двух особых битов, входящих в состав регистра слова состояния программы PSW (биты RS0 и RS1). Если организация нескольких параллельных потоков обработки данных не нужна, то можно пользоваться только нулевым банком регистров, включающимся автоматически после подачи питания и сброса микроконтроллера, остальные ячейки памяти использовать как обычное ОЗУ.

Все четыре банка регистров объединены с 32 младшими байтами внутреннего ОЗУ данных (см. рис. 6.12). Так как физически регистры и ячейки внутреннего ОЗУ объединены, то команды программы могут обращаться к регистрам, используя или их имена R0-R7 (регистровая адресация):

MOV A, R0    ;Скопировать содержимое регистра R0 в аккумулятор

MOV R7, А    ;Скопировать содержимое регистра R7 в аккумулятор

или их адрес во внутренней памяти данных (прямая байтовая адресация):

MOV А, 0     ;Скопировать содержимое нулевой ячейки ОЗУ в аккумулятор

MOV 7, А     ;Скопировать содержимое аккумулятора в седьмую ячейку ОЗУ

Следующие после банков регистров 16 ячеек внутреннего ОЗУ данных (адреса 20H-2FH) образуют область памяти, к которой возможна как байтовая, так и битовая адресация. В этих ячейках располагаются 128 программных флагов (битовых ячеек памяти). Обращение к отдельным битам этих ячеек возможно по их битовым адресам. Например, команды:

SETB 15          ;Запомнить во флаге 15 логическую единицу

JB 15, Metka   ;Если во флаге 15 записана логическая единица, то перейти по адресу Metka

обращаются к флагу 15, расположенному в старшем бите байтовой ячейки памяти 21h. Использование однобитовых ячеек памяти позволяет сократить необходимый для работы программы объем памяти данных, т. к. для хранения битовых переменных выделяется один бит в памяти данных, а не машинное слово, как это делается в универсальных микропроцессорах (компьютерах).

В битовой области сосредоточено только 128 флагов. Битовая адресация возможна также в области регистров специальных функций (см. табл. 6.4). Наиболее яркий пример использования битовой адресации в данной области — это обращение к отдельным выводам параллельных портов:

CPL 92    ;Проинвертировать второй бит порта Р1

Выше адреса 128 (080h) располагаются регистры специальных функций, которые будут рассмотрены позже. Некоторые из регистров специальных функций допускают битовую адресацию к каждому из восьми своих битов. Оставшаяся область внутренней памяти данных используется как обычное ОЗУ, без особенностей.

Следует отметить, что в современных микроконтроллерах данного семейства эту память следует рассматривать как встроенные 256 регистров сверхоперативного ОЗУ. Основной памятью постепенно становится внутренняя память микроконтроллера, доступная при помощи команд MOVX @DPTR, А.

Регистры специальных функций

Адреса внутренней памяти данных с 080h no 0FFh используются регистрами специальных функций. Они принадлежат дополнительным устройствам, расположенным на кристалле микроконтроллера, регистры которых отображаются в адресное пространство внутренней памяти данных.

В различных микросхемах семейства MCS-51 состав дополнительных устройств различается. Микроконтроллеры рассматриваемого семейства различаются между собой количеством параллельных портов, последовательных портов, таймеров. Некоторые из регистров специальных функций с указанием их адресов в адресном пространстве SFR внутреннего ОЗУ приведены в табл. 6.4.

Примечание

1. Регистры, выделенные жирным подчеркнутым текстом, присутствуют во всех микросхемах семейства.

2. Регистры, выделенные жирным текстом, присутствуют в микросхемах с ядром 8052.

3. X — неопределенное состояние.

Внутренние таймеры микроконтроллера, особенности их применения

В базовых моделях семейства (ядро MCS-51) имеются два программируемых 16-битных таймера/счетчика (Т/С0 и Т/С1), которые могут быть использованы и как таймеры, и как счетчики внешних событий. Каждый из них состоит из двух 8-битных регистров ТН0 (старший байт) и ТН0 (младший байт) для таймера 0 или ТН1 (старший байт) и ТН1 (младший байт) для таймера 1. При переполнении таймеров производится запись логической единицы в дополнительный триггер (флаг) TF0 для таймера 0 или TF1 для таймера 1.

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

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

Таймер 0 и Таймер 1 могут работать в четырех режимах:

— режим 0: 13-битный таймер;

— режим 1: 16-битный таймер;

— режим 2: 8-битный таймер с автоматической перезагрузкой;

— режим 3: Таймер 0 как 2 раздельных 8-битных таймера.

— режиме счетчика содержимое соответствующего таймера/счетчика инкрементируется (увеличивается на единицу) под воздействием перехода из 1 в 0 внешнего входного сигнала, подаваемого на вывод микроконтроллера Т0 или Т1. Так как на распознавание периода требуются два машинных цикла, то максимальная частота подсчета входных сигналов равна 1/24 частоты резонатора. На максимальную длительность периода входных сигналов ограничений нет. Для гарантированного обнаружения перехода уровень входного сигнала не должен изменяться как минимум в течение одного машинного цикла микроЭВМ. Кроме того, таймер 1 можно использовать для задания скорости обмена последовательного порта, работающего в режиме с настраиваемой скоростью работы.

Для управления режимами работы таймеров используется регистр TMOD (Timer — таймер, MODe — режим). Его формат приведен на рис. 6.13. Каждая тетрада регистра TMOD управляет своим таймером.

Рис. 6.13. Формат регистра выбора режимов таймеров (TMOD)

Рассмотрим режимы работы внутренних таймеров более подробно.

Режим 0

В режиме 0 таймер работает как 13-битный счетчик, состоящий из 8 битов регистра ТНх и младших 5 битов регистра TLx. Заметим, что «х» в обозначении регистра заменяется на 0 или 1 в зависимости от номера таймера, которым мы управляем в данный момент. Состояния старших 3 битов регистров TLx в режиме 0 не определены и они игнорируются.

Установка запускающего таймер флага TR0 или TR1 не очищает эти регистры. Работе таймера 0 или таймера 1 в режиме 0 соответствует схема, приведенная для Т0 на рис. 6.14. Флаг прерывания таймера TFx устанавливается (принимает значение логической 1) при изменении содержимого счетчика из состояния все 1 в состояние все 0, т. е. при переполнении.

Рис. 6.14. Схема таймера Т0, работающего в режиме 0

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

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

Рассмотрим пример подготовки таймера Т0 для формирования временного интервала 5мс:

;Настроить таймер на генерацию 5-миллисекундного интервала времени

MOV TH0, #HIGH(-5000)   ;Загрузить старший байт таймера

MOV TL0, #LOW(-5000)    ;Загрузить младший байт таймера

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

В исходном тексте программы, особенно при написании его под Windows, невозможно использовать символы псевдографики, поэтому для указания, к какому же из битов константы относится комментарий, используются символы «-» и «|». Для перехода от горизонтальной черты к вертикальной используется символ «+». В случае, когда для управления блоком таймера требуется несколько битов константы, в одной строке может быть использовано несколько символов «+».

При настройке таймера требуется загрузить 16-битную константу в счетчик таймера. Однако в системе команд микроконтроллера существуют только команды загрузки 8-битной константы. Для расщепления 16-битной константы на два отдельных байта в приведенном участке программы были использованы операторы выделения старшего и младшего байта HIGH и LOW соответственно. Эти функции присутствуют в большинстве языков программирования ассемблера, предназначенных для микроконтроллеров MCS-51. Если же язык программирования не содержит в своем составе подобные функции, то можно для выделения байтов воспользоваться операцией деления на 256:

MOV TH0, #-5000/256             ;Загрузить старший байт константы в старший байт таймера

MOV TL0, #-(5000–5000/256)   ;Загрузить младший байт константы в младший байт таймера

Режим 1

В режиме 1 таймер работает как 16-разрядный счетчик. Этот режим похож на режим 0, за исключением того, что в регистрах таймера использует все 16 битов. В этом режиме регистры ТНх и TLx также включены последовательно друг за другом. Работе таймера Т0 или таймера T1 в режиме I соответствует схема, приведенная на рис. 6.15. На этой схеме изображен таймер Т0.

Рис. 6.15. Схема таймера Т0, работающего в режиме 1

В этом режиме можно обеспечить формирование интервала времени длительностью до 65536 мкс при частоте задающего генератора 12 МГц.

Рассмотрим пример использования таймера Т0 для формирования временного интервала 15 мс.

;Настроить таймер на генерацию 15-миллисекундного интервала времени

MOV TH0, #HIGH(-15000)    ;Загрузить старший байт константы в старший байт таймера

MOV TL0, #LOW(-15000)     ;Загрузить младший байт константы в младший байт таймера

OjidanTimer:

JNB TF0, OjidanTimer       ;Подождать пока не переполнится таймер

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

Режимы 0 и 1 таймеров Т0 и T1 предназначены для формирования одиночного интервала времени. Если требуется формировать периодическую последовательность интервалов времени, то надо обеспечить программную загрузку регистров ТН0 и TL0 для задания нужного интервала времени, что для коротких интервалов времени может привести к значительным затратам процессорного времени.

Для формирования последовательности одинаковых интервалов времени используется режим работы таймера с перезагрузкой — режим 2.

Режим 2

В режиме 2 регистр таймера TL0 работает как 8-битный суммирующий счетчик с автоматической перезагрузкой начального значения из регистра ТН0. Переполнение счетчика TL0 не только устанавливает флаг TF0, но и снова загружает регистр TL0 содержимым ТН0. Перезагрузка таймера не изменяет содержимое регистра ТН0.

Для задания периода временных интервалов в регистр ТН0 записывается отрицательное число. Работе таймера 0 или таймера 1 в режиме 2 соответствует схема, приведенная на рис. 6.16. При этом первый период колебания будет произвольным, но в большинстве случаев это не важно. Если же первый период колебания важен, то кроме регистра ТН0 необходимо программно устанавливать значение регистра ТН1.

Рис. 6.16. Схема таймера Т0, работающего в режиме 2

Ниже приведен пример инициализации таймера в режиме 2 для генерации прямоугольного колебания с частотой 10 кГц (период 100 мкс) и скважностью 2.

;Настроить таймер на генерацию 50-микросекундного интервала времени-

MOV ТН0, #-50    ;Загрузить константу в старший байт таймера

MOV TL0, #-50     ;Загрузить константу в младший байт таймера

OjidanTimer:

JNB TF0, OjidanTimer   ;Подождать пока не переполнится таймер

CPL P2.6                      ;Проинвертировать сигнал на выводе 6 порта Р2

SJMP OjidanTimer         ;Снова перейти к ожиданию окончания временного интервала

Режим 3

Таймер 1 при работе в режиме 3 просто хранит свое значение. Эффект такой же, как при сбросе бита TR1. Таймер 0 в режиме 3 представляет собой два раздельных 8-битных счетчика (регистры TL0 и ТН0). Регистр TL0 использует биты управления таймера 0: С/Т0, GATE0, TR0 и TF0.

Регистр ТН0 работает тоже в режиме отдельного таймера и использует биты TR1 и TF1 таймера 1. Логика работы таймера 0 в режиме 3 показана на схеме, приведенной на рис. 6.17.

Рис. 6.17. Логика работы таймера 0 в режиме 3

Работа таймера TL0 разрешена, если бит TR0 = 1, а таймера ТН0 — если бит TR1 = 1. Таймер 1 при работе таймера 0 в режиме 3 постоянно включен, т. к. он обычно при этом используется для синхронизации последовательного порта и работает в первом или втором режимах работы. Этот режим работы позволяет реализовать два независимых таймера, если таймер 1 используется для работы последовательного порта. Но надо сказать, что на практике, особенно после появления таймера 2 в ядре MCS-52, режим 3 мало интересен.

Управление таймерами/счетчиками

Схема управления таймерами 0 и 1 идентична и для таймера Т0 приведена на рис. 6.18. Для схемы управления таймером Т1 изменятся только номера управляющих битов (в их наименованиях 0 будет заменен на 1). В приведенной схеме заштрихованным прямоугольником обозначены внешние выводы микросхемы микроконтроллера.

Рис. 6.18. Схема управления таймерами

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

Есть возможность управлять работой таймера извне при помощи внешнего вывода Т0 — для таймера Т0 или T1 — для таймера T1. Чтобы разрешить передачу сигнала Тх, необходимо записать в бит GATEx логическую единицу (не забыв при этом разрешить работу таймера при помощи бита TRx).

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

Биты включения таймеров TR0 и TR1 размещены в регистре управления таймерами TCON, а биты GATE и С/Т — в регистре режима таймеров TMOD. Название регистра TCON образовалось при соединении двух слов: Timer — таймер и CONtrol — управлять. Формат регистра TCON рассматривался ранее, а формат регистра TCON и описание его отдельных битов приведен на рис. 6.19.

Символ ∙ Функция

TF1 Флаг переполнения таймера 1. Устанавливается аппаратно при переполнении Таймер/Счетчика 1. Сбрасывается аппаратно, когда процессор вызывает программу обслуживания прерывания

TR1 Бит управления таймером 1. Устанавливается/сбрасывается программно для запуска/останова счетчика/таймера 1

TF0 Флаг переполнения таймера 0. Устанавливается аппаратно при переполнении Таймер/Счетчика 0. Сбрасывается аппаратно, когда процессор вызывает программу обслуживания прерывания

TR1 Бит управления таймером 0. Устанавливается/сбрасывается программно для запуска/останова счетчика/таймера 0

IE1 Флаг прерывания 1. Устанавливается аппаратно, когда детектируется сигнал внешнего прерывания (перепад или активный уровень). Сбрасывается аппаратно в процессе прерывания только в том случае, если оно произошло по фронту

IT1 Бит управления типом прерывания 1. Устанавливается/сбрасывается программно для определения типа прерывания 1 (по срезу/низким уровнем)

IE0 Флаг прерывания 0. Устанавливается аппаратно, когда детектируется сигнал внешнего прерывания (перепад или активный уровень). Сбрасывается аппаратно в процессе прерывания только в том случае, если оно произошло по фронту

IT0 Бит управления типом прерывания 0. Устанавливается/сбрасывается программно для определения типа прерывания 0 (по срезу/низким уровнем)

Рис. 6.19. Формат регистра TCON

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

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

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

Рис. 6.20. Временная диаграмма измерения длительности импульсов

Для измерения длительности импульса измеряемый сигнал подается на вывод микроконтроллера INTx, и в бит управления GATE записывается разрешающий сигнал логической единицы. Таймер/счетчик настраивается в режим таймера записью в бит С/Тх логического нуля. Содержимое таймера перед измерением длительности импульса обнуляется. Ассемблерный текст процедуры измерения длительности импульса приведен в листинге 6.1.

Если теперь на вход микроконтроллера INTO подать импульс с неизвестной длительностью, то в регистрах ТН0 и TL0 будет записана его длительность в микросекундах.

Использование таймера в качестве частотомера

Известно, что измерение частоты можно произвести, подсчитав количество периодов неизвестной частоты за единицу времени. Принцип измерения частоты иллюстрируется рис. 6.21. Например, если за 1 мс на вход счетчика таймера поступят 15 импульсов, то измеренная частота равна 15 кГц.

Рис. 6.21. Временная диаграмма измерения частоты

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

Пример исходного текста программы измерения частоты сигнала на выводе микроконтроллера ТО приведен в листинге 6.2. Если теперь на вход микроконтроллера Т0 подать сигнал с неизвестной частотой, то в регистрах ТНО и TL0 будет записана его частота в килогерцах.

Последовательный порт микроконтроллеров семейства MCS-51

Через универсальный последовательный порт микроконтроллера осуществляются прием и передача информации, представленной в последовательном коде (младшими битами вперед). Наличие буферного регистра приемника позволяет совмещать операцию чтения ранее принятого байта с приемом очередного. Но если к моменту окончания приема байта предыдущий не был считан из SBUF, то он будет потерян. Работой последовательного порта управляют три регистра:

— регистр управления/статуса приемопередатчика SCON;

— регистр управления мощностью PCON, бит SMOD;

— буферный регистр приемопередатчика SBUF.

Последовательный порт может работать в четырех различных режимах:

— режим 0, синхронный;

— режим 1 асинхронный 8-битовый обмен;

— режим 2, асинхронный 9-битовый обмен с фиксированной скоростью передачи;

— режим 3, асинхронный 9-битовый режим.

Управление режимами работы приемопередатчика осуществляется через специальный регистр с символическим именем SCON. Он содержит не только управляющие биты, определяющие режим работы последовательного порта, но и девятый бит принимаемых или передаваемых данных (RB8 и ТВ8) и биты прерывания приемника/передатчика (R1 и T1). Формат регистра управления последовательным портом приведен на рис. 6.22.

Рис. 6.22. Формат регистра управления последовательным портом

Прикладная программа путем загрузки в старшие биты регистра SCON двухбитного кода задает режим работы приемопередатчика. Во всех четырех режимах передача инициализируется любой командой, в которой буферный регистр SBUF указан как получатель байта. Как уже отмечалось, прием в режиме 0 осуществляется при условии, что R1 = 0 и REN = 1, в остальных режимах — при условии, что REN = 1.

В бите ТВ8 программно устанавливается значение девятого бита данных, который будет передан в режиме 2 или 3 в составе 9-битового поля данных кадра передачи. В бите RB8 в этих режимах запоминается девятый принимаемый бит данных. В режиме 1 в бит RB8 заносится значение стоп-бита. В режиме 0 бит RB8 не используется.

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

Флаг прерывания приемника R1 устанавливается аппаратно после приема восьмого бита данных в режиме 0 и в середине периода приема стоп-бита в режимах 1, 2 и 3. Подпрограмма обслуживания прерывания должна сбрасывать бит RI.

Скорость приема/передачи информации через последовательный порт

Скорость приема/передачи в различных режимах, задается различными способами.

В режиме 0 частота передачи зависит только от резонансной частоты кварцевого резонатора fрез:

f = fрез/12.

При этом за машинный цикл последовательный порт передает/передает/принимает один бит информации.

В режимах 1, 2 и 3 скорость приема/передачи зависит от значения управляющего бита SMOD в регистре специальных функций PCON. Формат регистра управления питанием, в котором расположен бит управления скорости передачи, приведен на рис. 6.23.

Рис. 6.23. Формат регистра управления питанием

В режиме 2 частота приема/передачи определяется выражением

f = (2SMOD x fрез)/64.

Иными словами, при SMOD = 0 частота передачи равна 1/64 частоты кварцевого резонатора/рез, а при SMOD = 1 частота передачи равна 1/32 частоты кварцевого резонатора/рез.

В режимах 1 и 3 в формировании частоты приема/передачи, кроме управляющего бита SMOD, принимает участие таймер 1. При этом частота приема/передачи f зависит от частоты переполнения таймера fovlT1 и определяется следующим образом:

f = (2SMOD x fovlT1)/32.

При использовании таймера 1 для тактирования последовательного порта прерывания от этого таймера должны быть запрещены. Таймер может быть использован как в режиме 16-разрядного таймера, так и в режиме таймера с автозагрузкой. Обычно используется режим таймера с автозагрузкой (старшая тетрада регистра TMOD = 0010В). При этом скорость передачи последовательного порта определяется выражением:

f = (2SMOD x fрез)/(32 x 12 x (256 — TH1)).

Предельно низких скоростей приема и передачи по последовательному порту можно достичь при использовании таймера в режиме 1 (старший полубайт TMOD = 0001В). Перезагрузка 16-битного таймера должна осуществляться программным путем. При этом для того, чтобы можно было, кроме приема/передачи, выполнять дополнительные задачи, необходимо использовать механизм обработки прерываний и для этого разрешить прерывания от таймера 1.

Отметим, что для старших моделей семейства MCS-51 при использовании для синхронизации последовательного порта таймеров 1 и 2 скорости приема и передачи информации по последовательному порту могут различаться.

Режим 0. Синхронный режим работы последовательного порта

В режиме 0 последовательный порт работает как обыкновенный сдвиговый регистр. Это позволяет использовать его для увеличения количества входов/выходов устройства. Использование сдвиговых регистров для этой цели показано на рис. 6.24 и 6.26. Передача через последовательный порт начинается с записи байта в регистр данных SBUF.

Рис. 6.24. Схема подключения сдвиговых регистров к последовательному порту микроконтроллера для увеличения количества линий вывода устройства

После завершения передачи аппаратно устанавливается флаг прерывания передатчика T1. Временная диаграмма сигнала, вырабатываемого последовательным портом микроконтроллера, при передаче восьми бит данных приведена на рис. 6.25. Прием байта через последовательный порт начинается после обнуления флага готовности приемника R1. Временная диаграмма приема входной информации последовательным портом в режиме 0 приведена на рис. 6.27. Синхронный режим 0 задается записью комбинации 00 в биты SMO, SM1 регистра SCON. В этом режиме информация передается/принимается через вывод входа приемника RxD, т. е. в этом режиме работы последовательный порт работает в симплексном режиме. Через вывод TxD выдаются импульсы синхронизации, которые сопровождают каждый информационный бит. Скорость передачи в этом режиме фиксирована и составляет Fген/12. Это означает, что при частоте задающего генератора 24 МГц обмен данными осуществляется на скорости 2 Мбита/с.

Рис. 6.25. Временная диаграмма работы последовательного порта в режиме 0 после записи передаваемого байта в регистр данных SBUF

Рис. 6.26. Использование режима 0 работы последовательного порта для увеличения количества линий ввода устройства

Рис. 6.27. Временная диаграмма приема входной информации последовательным портом в нулевом режиме после обнуления флага готовности приемника R1

Для осуществления передачи байта данных достаточно занести его в буфер данных SBUF, как это показано в листинге 6.3.

Для осуществления приема байта данных достаточно настроить порт на прием в синхронном режиме (режим 0) и обнулить флаг приема R1, как это показано в примере программы, приведенной в листинге 6.4. Затем можно считывать принятый байт из регистра буфера данных SBUF.

В настоящее время разработано огромное количество микросхем, управление которыми осуществляется по синхронному последовательному порту. Это, например, синтезаторы частоты, микросхемы приемников, блоков цветности телевизоров, памяти. При этом микросхемы обычно реализуют синхронные протоколы обмена SPI или I2C. Последовательный порт микроконтроллеров семейства MCS-51, работающий в режиме 0, позволяет осуществлять обмен с такими микросхемами при минимальных программно-аппаратных затратах. Справедливости ради необходимо отметить, что в современных микросхемах этого семейства присутствуют отдельные последовательные порты, работающие по протоколу SPI или I2C. В качестве примера такой микросхемы можно назвать микроконтроллер ADuC834 фирмы Analog Devices. В таких микросхемах последовательный порт используется исключительно для связи с универсальным компьютером через стандартный последовательный интерфейс RS232 или с любым другим микроконтроллером, обладающим асинхронным последовательным портом.

Режим 1. Асинхронный 8-битовый режим

В режиме 1 последовательный порт работает в асинхронном режиме, принципы работы которого рассматривались ранее. Временная диаграмма передаваемых через последовательный порт сигналов в асинхронном последовательном режиме работы совпадает с временной диаграммой, приведенной на рис. 5.24 Режим 1 задается записью комбинации 01 в биты SM0 и SM1 регистра SCON. В асинхронном режиме информация передается через вывод выхода передатчика последовательного порта микроконтроллера TxD, а принимается через вывод входа приемника RxD, т. е. в этом режиме работы последовательный порт работает в дуплексном режиме. Это означает, что передача и прием информации могут вестись одновременно и независимо друг от друга. Скорость передачи в этом режиме задается при помощи таймера Т1.

При работе в асинхронном режиме два микроконтроллера могут обмениваться информацией между собой, используя минимум соединительных проводов между блоками или даже отдельными устройствами. Единственное условие: скорости работы передающего и принимающего последовательных портов должны быть одинаковыми. Обычно используются стандартные скорости передачи, такие как 1200 бит/с, 2400 бит/с и т. д. Для получения таких скоростей передачи обычно используется кварцевый резонатор с частотой 11,0592 МГц. Значения констант, загружаемых в таймер 1 для получения стандартных скоростей приема/передачи при использовании такого кварцевого резонатора, приведены в табл. 6.5.

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

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

В режиме 1 для передачи байта через последовательный порт достаточно скопировать его в буфер данных SBUF. Единственное отличие заключается в том, что, кроме настройки регистра SCON, необходимо настроить таймер для задания скорости передачи информации по последовательному порту. Прием начинается только после обнаружения стартового бита. Пример программы, позволяющей осуществить прием информации по последовательному порту, приведен на листинге 6.5.

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

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

Типовая схема подключения компьютера к последовательному порту микроконтроллеров семейства MCS-51 с применением интерфейсной микросхемы ADM3202 приведена на рис. 6.29.

Рис. 6.29. Подключение последовательного порта микроконтроллеров семейства MCS-51 к СОМ-порту компьютера

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

Режим 2. Асинхронный 9-битовый режим с фиксированной скоростью передачи

В этом режиме последовательный порт работает на фиксированной скорости передачи, так же как в режиме 0. Скорость обмена определяется значением бита SMOD и при частоте кварцевого резонатора 12 МГц составляет 375 кбит/с. У современных микроконтроллеров, способных работать с более высокой тактовой частотой, скорость обмена может превышать 1 Мбит/с.

Основной особенностью работы последовательного порта в этом режиме является передача девятого информационного бита, который может быть использован для контроля достоверности передаваемой информации. Для вычисления четности передаваемого байта можно воспользоваться аппаратным вычислителем, подключенным к аккумулятору микроконтроллера А. Результат вычисления четности байта сохраняется в бите четности Р регистра PSW, откуда его можно скопировать в девятый информационный бит последовательного порта ТВ8, расположенный в регистре управления последовательным портом SCON.

Еще большие возможности предоставляет 9-разрядный режим работы последовательного порта при реализации многопроцессорных систем. Параллельные порты микроконтроллеров семейства MCS-51 построены по схеме с открытым стоком. Это позволяет объединять несколько выходов передатчиков в одну шину. Такое выполнение выходных каскадов микросхем облегчает построение многопроцессорных систем.

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

Выходы же передатчиков подчиненных процессоров объединяются и подключаются к входу приемника главного процессора. Схема примера многопроцессорной системы приведена на рис. 6.30.

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

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

Рис. 6.31. Временная диаграмма работы многопроцессорной последовательной шины

Настройка и работа с портом в режиме 2 никаких особенностей не имеет, поэтому можно воспользоваться примерами программ (см. листинги 6.3 и 6.4), приведенными для режима 0. Все особенности работы сосредоточены на протокольном уровне, а это не входит в задачу рассмотрения последовательного порта.

Режим 3. Асинхронный 9-битовый режим

Работа последовательного порта в этом режиме не отличается от работы в режиме 2 за исключением скорости передачи. Скорость передачи по последовательному порту задается таймером 1, так же как и в режиме 1.

Для построения программы можно воспользоваться примером, приведенным для режима 1 (см. листинг 6.5), с учетом того, что в регистре SCON необходимо задать вместо режима 1 режим 3.

Итак, подведем итоги

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

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

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

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