Главная | |
Материал взят из книги![]() Скачать оригинал КНИГИ в хорошем качествеЕще один вид регистров, входящих в состав микроконтроллера АТ89С2051, это специальные регистры. На эти регистры вы могли обратить внимание, когда разглядывали схему адресного пространства микроконтроллера (рис. 42). Специальные регистры, как и все остальные регистры микроконтроллера, совмещены с ячейками ОЗУ и входят в адресное пространство памяти данных. Что же такое — специальные регистры, и для чего они нужны? При помощи этих регистров происходит управление режимами работы всех встроенных системных ресурсов микроконтроллера, таких, как система прерываний, встроенные счетчики-таймеры, последовательный канал связи. К специальным регистрам также можно отнести порты ввода/вывода. На рис. 43 схематически изображены все специальные регистры микросхемы АТ89С2051. Большинство из этих регистров одновременно расположены и в битовом пространстве памяти и поэтому допускают прямой доступ к каждому своему биту. В этом случае каждый бит регистра отвечает за свою собственную функцию и имеет свое название. Исключение составляют порты ввода/вывода Р1 и РЗ. Они тоже поддерживают возможность доступа к каждому биту, но разряды портов не несут никакой дополнительной нагрузки, кроме задач ввода и вывода информации. Справа от изображения каждого регистра показано его название и адрес, который этот регистр занимает в общем адресном пространстве ОЗУ. Регистры ТО и Т1 — это шестнадцатиразрядные регистры. Каждый из них служит хранилищем текущего значения соответствующего счетчика-таймера. В адресном пространстве ОЗУ каждый из этих двух регистров занимает две ячейки памяти. Каждая такая половинка шестнадцатиразрядного регистра имеет свое название. Таким образом, мы имеем дело с регистрами ТНО, ТБО, ТН1, Т1Л. На рис. 43, под каждым из этих названий, указан адрес соответствующей ячейки памяти, указаны также адреса каждого бита, входящего в- битовое пространство контроллера. Эти адреса вы можете видеть в нижней части квадратика, символизирующего соответствующий бит. Следует заметить, что все названия регистров — вещь чисто теоретическая. Они предназначены для языка Ассемблера, на котором чаще всего пишутся программы для микроконтроллера. При написании программы удобнее обращаться к регистру по его имени. Однако в системе команд контроллера отсутствуют специальные команды обращения к регистрам. Запись информации в любой из специальных регистров, так же как и чтение из него, происходит при помощи команд записи в ячейку памяти и чтения из ячейки памяти. ![]() Рассмотрим назначение специальных регистров подробнее. Р1, РЗ — порты ввода/вывода. С точки зрения процессора любой из этих двух портов — это обычная ячейка памяти. Процессор может записать в него любое число, может также считать число из порта. Записанное в порт число, немедленно появляется на соответствующих выводах микросхемы (см. рис. 36). Чтение из порта также происходит обычным образом. Необходимо только помнить следующее условие: если вы желаете прочитать значения внешних сигналов, подаваемых на линии порта, не забудьте предварительно записать в соответствующий порт число ОРРН (то есть логические единицы во все разряды). Для чего это нужно, мы уже рассматривали ранее. Кроме того, возможны программные сброс или установка каждой отдельной линии порта при помощи битовых операций. Два регистра, обслуживающие встроенный последовательный канал связи: Регистр SBUF. Это регистр данных последовательного канала. Для передачи информации из микроконтроллера на внешнее устройство, в него помещают передаваемый байт и затем запускают процесс передачи. В режиме приема в этот регистр помещается принятый байт. Регистр SCON. Предназначен для выбора режимов последовательного порта. В связи с тем, что в схеме позиционера последовательный канал не применяется, мы опустим подробности его настройки. Тех читателей, кого этот вопрос все же интересует, отсылаю к подробному описанию микроконтроллера К1816ВЕ51 (или iMCS-51), которое можно скачать, например, на сайте «Цифровые микросхемы и микропроцессоры» в разделе «Справочные материалы». В основном все сказанное относительно К1816ВЕ51 справедливо и для АТ89С2051. Там же вы найдете и другой документ, где описаны все отличия этих двух контроллеров. Адрес сайта смотрите в конце этой книги. Четыре регистра управления счетчиками-таймерами: Регистры ТО и Т1. Каждый из них предназначен для хранения текущего значения соответствующего счетчика. Собственно, эти регистры и есть те самые счетчики-таймеры. Для организации работы какого-либо из таймеров, нужно программным путем записать начальное значение в соответствующий регистр. В процессе работы счетчика происходит постепенное уменьшение значения его содержимого. Процесс счета может происходить как под воздействием импульсов от внутреннего тактового генератора (в режиме таймера), так и под воздействием внешних импульсов, подаваемых на специальные входы, которые называются ТО и Т1 — вывод 8 и 9 (см. табл. 2). Процесс счета продолжается до тех пор, пока содержимое регистра ТО (или Т1) не достигнет нулевого значения. Затем наступает переполнение счетчика. Сигнал переполнения используется в качестве сигнала запроса на прерывание. Регистр TMOD. Используется для установки режима работы обоих таймеров. Его младшие четыре бита, имеющие отдельное название TOMOD, определяют режим работы таймера ТО. Старшие четыре разряда, именуемые T1MOD, определяют режим работы таймера Т1. Каждый из счетчиков-таймеров имеет четыре основных режима работы, различающихся алгоритмами счета и количеством используемых разрядов. Эти режимы имеют названия «Режим 0», «Режим 1», «Режим 2» и «Режим 3». Режим 0, например, совместим с более ранними версиями этой линии микроконтроллеров. Он использует только 13 разрядов счетчика-таймера. Режим 1 использует все 16 разрядов. В режиме 2 соответствующий таймер делится на две части по 8 разрядов в каждом. Младшие восемь разрядов используются как таймер, а в старших — хранится коэффициент пересчета. В процессе счета, при достижении нулевого значения, происходит автоматическая загрузка коэффициента пересчета из старших битов в младшие. В результате таймер превращается в делитель с переменным коэффициентом деления (подобный тому, что мы рассматривали ранее, см. рис. 24). В режиме 3 счетчик-таймер ТО разделяется на два независимых восьмиразрядных счетчика. Таймер-счетчик Т1 в режиме 3 просто останавливается. Биты МО и Ml регистра TMOD используются для выбора одного из четырех режимов соответствующего счетчика-таймера. Их содержимое представляет собой двоичное число, соответствующее номеру выбранного режима. Бит С/Т служит для переключения вида входного сигнала. Если бит С/Т равен 0, то соответствующий счетчик-таймер выполняет функцию таймера. Если же С/Т равен 1, то реализуется функция счетчика. В режиме таймера в качестве тактовых импульсов используются внутренние тактовые импульсы (OSC) пропущенные через специальный делитель частоты с коэффициентом деления, равным 12. Как мы знаем, импульсы внутренней синхронизации OSC получаются в свою очередь путем деления частоты тактового генератора микросхемы на 6 (см. рис. 35). Внешние входы ТО и Т1, при этом, используются как стробирующие входы, для приостановки и последующего пуска таймеров. Если на вход ТО (Т1) подан высокий логический уровень, то счет разрешен. Если низкий, то приостановлен. Управляющий бит GATE регистра TMOD служит для программного включения и выключения режима стробирования. Регистр TCON служит для оперативного управления обоими таймерами-счетчиками, а также режимами работы входов INTO, 1NT1 запроса внешних прерываний (см. табл. 2). Такое управление происходит программным путем. Биты IT0 и IT1 управляют режимами работы внешних входов, соответственно, INTO, INTI. Если сбросить один из этих битов в ноль, то соответствующий внешний вход станет динамическим и будет работать по срезу входного импульса. При установке этого бита в единицу, соответствующий вход станет статическим. Биты IE0 и IE1 — это флаги прерываний по INTO, INTl. При поступлении запроса на прерывание соответствующий флаг устанавливается в единицу. В тот момент, когда контроллер приступит к обслуживанию запроса, флаг автоматически сбрасывается. Флаг прерывания автоматически устанавливается в единицу при переполнении соответствующего таймера-счетчика, и дает возможность программной проверки факта появления такого запроса. Биты TR0 и TR1 служат для программного запуска/останова таймеров-счетчиков. Каждый из этих битов управляет своим таймером. И, наконец, биты TF0 и TF1 — это флаги прерывания по переполнению таймера. В момент перехода контроллера к обработке прерывания соответствующий флаг автоматически сбрасывается. Два регистра системы прерываний микроконтроллера: Регистр IE — это так называемый регистр маски прерываний. Система обработки прерываний контроллера имеет пять источников прерываний: прерывания при переполнении одного из таймеров, прерывания от одного из двух внешних входов INTO или 1NT1, а также прерывание по последовательному каналу. Каждый из этих источников может быть замаскирован (ударение на буквуи). В данном случае «замаскирован» означает — отключен. Каждый из пяти младших битов регистра 1Е предназначен для маскирования своего источника прерываний. Сброс одного из этих битов в ноль отключает соответствующий источник. Установка бита в единичное состояние включает соответствующее прерывание. Самый старший бит маскирует всю систему прерываний сразу независимо от состояния остальных битов. Регистр IP — это регистр приоритетов. Что такое приоритеты и зачем они нужны? Дело в том, что все источники прерываний действуют абсолютно независимо друг от друга. Поэтому вполне возможна ситуация, когда в систему прерываний контроллера одновременно поступают два, три или все пять запросов от разных источников. Какой из них выполнять первым? Или другая ситуация: процессор еще не окончил процедуру обработки прерывания от одного источника, а тут поступает запрос от второго. Что делать? Временно прервать обработку первого запроса и перейти ко второму? Либо сначала закончить работу с текущим запросом? Все эти вопросы разрешаются путем присвоения уровня приоритета каждому из возможных источников прерываний. В описываемом микроконтроллере имеется всего два уровня приоритетов. Каждый из пяти младших битов регистра 1Р хранит уровень приоритета одного из источников. Если какой-либо из этих битов сбро- шен в ноль, то у соответствующего источника низкий уровень приоритета. Если наоборот, он установлен в единицу, то приоритет высокий. Прерывание с высоким уровнем приоритета не может быть прервано никаким другим. Если оба прерывания имеют одинаковый приоритет, то используется схема вторичного арбитража. В соответствии с этой схемой, каждому из источников прерываний’установлен свой фиксированный ппиппитетя Гсм тяйп ДЛ ![]() Регистр РСОМ. Это регистр управления питанием. Установка в единичное состояние его младшего бита (ШЬ) переводит процессор в режим ожидания. В этом режиме процессор прекращает выполнять основную программу, но может выполнять прерывания. В результате происходит частичное снижение уровня потребляемой энергии. Установка в единицу бита РО переводит процессор в режим пониженной мощности. В этом режиме все внутренние процессы прекращаются, внутренний тактовый генератор выключается. Потребление мощности практически снижается до нуля. Процессор как бы «засыпает». Выход из этого режима возможен только по сигналу общего сброса процессора. На этом я хочу пока закончить общее описание специальных регистров микроконтроллера АТ89С2051. Подробнее об использовании этих регистров мы поговорим на конкретных примерах, когда будем изучать управляющую программу позиционера спутниковой антенны. Система команд и язык Ассемблера В предыдущих разделах мы уже не раз, так или иначе, касались вопроса о системе команд микроконтроллера АТ89С2051. Системой команд называют полный набор всех команд, которые выполняет конкретный микропроцессор с их исчерпывающим описанием. Ясно, что, не зная какие команды способен выполнять контроллер, невозможно присту- пать к проектированию программ. Однако в этой книге я хочу подойти к вопросу изучения системы команд микроконтроллера нестандартным образом. Из собственного опыта я знаю, что изучать систему команд проше всего на примере конкретной программы. Поэтому в данном разделе я ограничусь лишь общим описанием команд. Непосредственно же команды микроконтроллера мы будем изучать при рассмотрении управляющей программы позиционера спутниковой антенны. При этом, естественно, не все команды микроконтроллера будут рассмотрены. Однако полученного объема информации вам вполне хватит для того, чтобы разобраться с остальными командами. Полный перечень команд микропроцессора с кратким их описанием приведен в приложении в конце этой книги. Изучение команд микропроцессора тесно связано с таким понятием, как язык Ассемблера. Поясню вкратце, что это такое. Дело в том, что программисты никогда напрямую не работают с кодами команд. Человеку трудно запоминать сухие цифры. Для облегчения труда программиста и придуманы различные языки программирования. Язык Ассемблера — один из них. Именно на Ассемблере чаще всего пишутся программы для микропроцессоров. Основная идея Ассемблера — заменить коды команд некими короткими емкими словами, отражающими суть выполняемой операции так, чтобы их легче было запомнить. Эти слова еще называют «мнемокодами». Например, все команды пересылки байта из одной ячейки в другую обозначаются мнемокодом «MOV». От английского слова Move — перемещать. Команда сложения обозначается «ADD», вычитания «SUBB». Для того, чтобы создать программу для микропроцессора, программист сначала пишет текст программы, придерживаясь правил выбранного языка. Для написания э+oro текста он использует обыкновенный текстовый редактор. Готовый текст записывается на диск в виде текстового файла. Затем он запускает специальную программу — транслятор с языка Ассемблера. Эта программа читает текст, написанный программистом, и автоматически переводит каждую команду в ее код. В результате получается именно тот набор кодов, который и должен быть записан в программную память микроконтроллера. Результат транслирования также записывается на диск компьютера в виде файла. Теперь остается только перенести этот набор чисел в программную память -конкретной микросхемы микроконтроллера. Такая операция называется программированием или прошивкой программной памяти. Для прошивки микроконтроллеров применяются специальные устройства, называемые программаторами. Программаторы подключаются к персональному компьютеру и управляются при помощи специальной программы. Существуют специализированные программаторы, предназначенные для прошивки программной памяти только одного вида микроконтроллеров. Кроме того, бывают программаторы универсальные. Универсальный программатор позволяет программировать несколько видов микросхем. Для этого такие программаторы имеют несколько режимов работы. Универсальные программаторы сложнее и дороже специализированных. В главе 3 приведен пример простейшего программатора для прошивки программной памяти микроконтроллера АТ89С2051. При создании программ для микроконтроллеров и микропроцессоров, кроме Ассемблера, применяют и другие языки программирования. Например, существует специальная версия языка С («Си») для микропроцессоров. Но в этой книге мы будем учиться программировать исключительно на языке Ассемблера. Язык Ассемблера, как и любой другой язык, имеет свои правила правописания. Существует свой синтаксис и орфография. Приведем основные правила языка Ассемблера: ■ Каждая команда программы пишется в отдельной строке. ■ Каждая строка разбивается на четыре поля, образующие четыре колонки. ■ У каждого поля свое назначение: • Первое поле — поле метки (что такое метка рассмотрим позже). • Второе поле — поле команды (мнемокода). • Третье поле предназначено для параметров команды. • Четвертое поле — поле комментариев. Заполнять это поле не обязательно. Оно занимает пространство до конца страницы. Сюда, если нужно, можно поместить комментарии к команде. Для того, чтобы транслятор отличал комментарий от самой программы, в начале комментария необходимо поставить символ «точка с запятой». Этот символ называют признаком комментария. Встретив признак комментария, транслятор прекращает дальнейшую обработку строки и переходит к обработке следующей. В результате все, что стоит после точки с запятой до конца текущей строки игнорируется. Большинство из перечисленных выше правил исходят из соображений наглядности и читаемости программы. Но все же я советую их обязательно соблюдать. Рассмотрим пример написания одной строки программы на языке Ассемблер. В качестве примера возьмем команду, логика работы которой может быть описана следующим образом: «переместить содержимое регистра R0 в аккумулятор». Строка программы, реализующая эту команду, выглядит следующим образом: MOV A,R0 ; Это команда перемещения из R0 в аккумулятор Как мы видим, первое поле в данном случае пустое. То есть, в приведенной строке отсутствует метка. Во втором поле записан мнемокод команды. Это самый распространенный оператор языка Ассемблера — MOV. В третьем поле записаны параметры команды. Команда MOV имеет два параметра. В Ассемблере параметры команд принято записывать через запятую. Для улучшения внешнего вида и придания тексту индивидуального стиля можно вставлять как до, так и после каждого из параметров любое количество пробелов. В рассматриваемой команде в качестве параметров выступают имена источника и получателя информации. По принятым в Ассемблере соглашениям во всех подобных командах параметры записываются в следующем порядке: сначала записывается имя приемника информации («куда переместить»), а затем имя источника («откуда взять»). В четвертом, последнем поле рассматриваемого примера помещен комментарий. Начинается комментарий, как уже говорилось, с символа «точка с запятой». При помощи комментариев программист дает пояснения к программе прямо в ее тексте. Комментарии — это абсолютно необходимый элемент любого языка программирования. Они нужны не только для того, чтобы пояснить назначение той или иной команды любому желающему, но и для самого программиста, чтобы он не запутался в собственной программе. Комментарий можно записать также в виде отдельной строки. В этом случае разбиение на поля не обязательно. Можно поставить точку с запятой в начале строки. Тогда комментарием будет служить вся строка. Теперь, наконец, пришло время узнать, что такое метка и как она используется. Посмотрите на следующий фрагмент программы: metlI MOV A,R0 ; Это команда перемещения из R0 в накопитель SUBB А,#25 ; Увеличение содержимого накопителя на 25 ЫМР Metl ; безусловный переход по метке Это довольно бессмысленный набор команд, предназначенный служить примером применения метки. Как мы видим, вначале первой строки приведенного фрагмента стоит метка metl. Метка оканчивается символом «двоеточие». Этот символ означает, что перед нами именно метка, а не какая-либо другая команда. Наличие либо отсутствие метки никак не изменяет смысл команды, записанной в той же самой строке. Метка служит только для того, чтобы другие команды могли ссылаться на помеченную команду. В нашем примере первая команда вызовет пересылку числа из регистра R0 в аккумулятор. Вторая команда увеличит содержимое аккумулятора на 25. Третья команда — это команда безусловного перехода. Она передает управление в начало нашего фрагмента. В кодах процессора такая команда представляет собой три байта. Первый — это код операции безусловного перехода. Второй и третий байты — это адрес, куда будет передано управление. Адрес в программной памяти определяется 16-разрядным двоичным числом, поэтому для его записи требуется два байта. Значение этих байтов равно адресу ячейки памяти, в которой хранится код команды MOV, соответствующей первой строке рассматриваемого фрагмента. Вместо того, чтобы ставить в программе конкретный адрес перехода в языке Ассемблера, принято использовать для этого имя метки. Транслятор сам вычислит значение метки и подставит полученные коды. Такой подход позволяет не привязываться к конкретным адресам. В результате увеличивается гибкость программы. Можно легко переместить любой фрагмент программы из одного участка программной памяти в другой, ничего не изменяя в его тексте. Теперь метка будет означать совсем другой адрес. Однако это никак не повлияет на правильность трансляции программы. Имена всех меток определяется программистом произвольным образом, но с некоторыми ограничениями. Это имя должно состоять только из букв латинского алфавита и цифр. Первым символом в имени всегда должна быть буква. Пробелы, дефисы и знаки препинания не допускаются. Единственным исключением является символ подчеркивания. Этот символ применяется наравне с буквами. Допустимая длина имени метки зависит от версии программы транслятора. Команда UMP не единственная команда безусловного перехода в системе команд АТ89С2051. Существует еще две разновидности этой команды: AJMP и SJMP. Отличаются они от своего аналога методами задания адреса. AJMP — состоит всего из двух байтов. Первый байт служит одновременно для двух целей. Пять младших его битов — это код операции, а три старших — это уже часть адреса перехода. Второй байт команды — это младшие биты адреса перехода. Такая команда может осуществлять переход только в пределах первых двух килобайт адресного пространства программной памяти. Этого вполне достаточно, так как объем памяти микросхемы 2 килобайта. Команда LJMP оставлена для совместимости с прототипом — контроллером iMCS-51. Команда SJMP — это безусловный переход с относительной адресацией. Она также состоит из двух байт. Первый байт целиком представляет собой код операции. Второй байт представляет собой относительный адрес перехода. То есть число, на которое нужно изменить текущее значение счетчика адреса. Первый бит — это знак числа. Если он равен единице, то относительный адрес вычитается из текущего. Если первый бит равен нулю, то текущий адрес увеличивается на величину смешения. Описываемая в данной книге версия Ассемблера допускает применять вместо любой из вышеописанных команд безусловного перехода мнемокод JMP. Ассемблер сам выбирает оптимальный способ адресации. Вообще специфика языка Ассемблера такова, что для каждого конкретного процессора существует свой Ассемблер. Кроме того,, часто для одного и того же процессора разными фирмами разрабатывается несколько разных программ-трансляторов. При этом появляются несколько версий языка. Практически, для каждого транслятора создается своя версия. Поэтому, прежде чем изучать ассемблер, нужно определиться, какую программу-транслятор вы собираетесь применить. Все тексты программ, приводимые в настоящей книге, написаны для программы «Cross-Assembler 8051, Version 1.2h (с) Copyright 1984, 1985, 1986, 1987, 1988, 1989, 1990 by MetaLink Corporation». Полный пакет транслятора с описанием и библиотеками можно найти на сайте http://microprocessor.by.ru в разделе «Download». На этом я хочу закончить описание микроконтроллера АТ89С2051 и перейти к следующему этапу — описанию процесса разработки конкретного микропроцессорного устройства. Используются технологии uCoz
|