СИСТЕМА КОМАНД МК СЕМЕЙСТВА MCS-51

Система команд MCS-51 включает 111 инструкций. Команды процессорного ядра MCS-51 имеют однобайтовый, двухбайтовый и трехбайтовый формат. Большинство команд (94) имеют формат один или два байта и выполняются за один или два машинных цикла. При тактовой частоте 12 МГц длительность машинного цикла составляет 1 мкс. Множе­ство команд делится на 5 традиционных групп, каждая из которых рассмотрена ниже. Распределение команд по группам приведено в табл. 4.6.

Таблица 4.6

Главная отличительная особенность системы команд ядра MCS-51 - наличие боль­шого числа двухадресных команд передачи данных. Операнды под управлением одной команды могут перемещаться не только между одним из регистров центрального про­цессора и ячейкой памяти, но и между двумя ячейками памяти, которые адресуются различными способами. Множество сочетаний возможных способов адресации опе­рандов в двухадресных командах обусловливает наличие 13 различных форматов ко­манд (рис. 4.36). Первый байт команды всегда содержит код операции (КОП). Второй и третий байты содержат либо адреса операндов, либо сам операнд.

 

 

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

Таблица 4.7

1 В зависимости от способа адресации и места расположения операнда можно выде­лить девять типов операндов, между которыми возможен обмен. Граф возможных опе­раций передачи данных показан на рис. 4.37. Аккумулятор АСС представлен на этом графе отдельной вершиной, поскольку многие команды используют неявную адресацию аккумулятора (символ А присутствует в мнемонике команды, в то время как поле адреса аккумулятора отсутствует). Команды передачи данных допускают также прямую адреса­цию аккумулятора. Для этого его абсолютный адрес 0E0h должен быть указан во втором или третьем байтах команды. Косвенная адресация по указателям @R0 и @R1 распрос­траняется только на адресное пространство 00h.. .7Fh внутреннего ОЗУ. Регистры специ­альных функций и регистры центрального процессора (диапазон адресов 8Fh - 0FFh) не могут быть адресованы косвенно.

Следует обратить внимание, что команды обращения к ячейкам внешней памяти (MOVX) и команды чтения из памяти программ (MOVC) отличаются от команд обмена с внутренним ОЗУ. Такое положение дел полностью соответствует теории: для обраще­ния к ячейкам с одинаковыми адресами, но в разных массивах памяти должны быть сгенерированы разные сигналы управления. Следовательно, должны использоваться разные команды.

 

 

Арифметические команды.Данную группу образуют 24 команды (табл. 4.8), кото­рые выполняют операции сложения (ADD и ADDC), вычитания (SUBB), инкремента и декремента (INC и DEC), умножения (MUL), деления (DIV) и десятичной коррекции (DAA). Команды сложения, вычитания, инкремента и декремента могут быть использованы с четырьмя различными способами адресации внутренней памяти. Команда инкремента выполняется также над двухбайтовым регистром DPTR. Арифметические действия с операндами из внешней памяти данных и памяти программ не производятся.

Команда умножения MUL выполняет операцию целочисленного беззнакового умно­жения. Сомножители расположены в регистрах АСС и В, двухбайтовое произведение в В:АСС. Время выполнения операции составляет 4 машинных цикла. Команда деления DIV выполняет целочисленное беззнаковое деление однобайтового делимого (АСС) на однобайтовый делитель (В). Целое частное расположено в АСС, остаток - в В. Время выполнения операции - 4 цикла.

Таблица 4.8

Логические команды и операции сдвига.Данную группу образует 25 команд. Вы­полняются операции логического И, ИЛИ, Исключающего ИЛИ, операции очистки и ин­версии аккумулятора, различные операции сдвига. Логические команды модифицируют только флаг7, команды сдвига -флаги С и Z. Типы инструкций данной группы приведе­ны в табл. 4.9 и 4.10.

 

Таблица 4.9

 

Команды битового процессора.Данную группу образуют 12 команд (табл. 4.11). Совокупность этих команд называют битовым процессором. Наличие команд битового процессора позволяет существенно сократить управляющие программы по объему кода и времени выполнения. Обратите внимание, что прямоадресуемые биты находятся только в части ячеек внутреннего ОЗУ и в регистрах специальных функций. Аккумулятор АСС, регистр В и регистор признков PSW также имеют побитный доступ (см. рис. 4.34).

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

Команды передачи управления.Группа команд передачи управления является самой многочисленной группой. Она содержит 40 инструкций, которые делятся на две подгруппы:

1)команды условных и безусловных переходов (табл. 4.12);

2)команды вызова подпрограмм и обслуживания прерываний (табл. 4.13).

Таблица 4.10

 

Центральный процессор MCS-51 может использовать три команды условного пере­хода: традиционную трехбайтовую команду (длинный переход - LongJMP) и две двухбай­товые команды - AJMP и SJMP. При написании программ на языке Ассемблера допуска­ется употребление мнемоники JMP. Транслятор с языка Ассемблера выберет вариант с меньшим временем реализации.

Группа команд ветвления позволяет выполнить переходы по значениям бита перено­са С и флага нулевого результата в аккумуляторе Z, а также по значению прямоадресуемого бита. Особое внимание следует обратить на команды CJNZ и DJNZ. Первая (CJNZ) позволяет сравнить два операнда и перейти по метке в случае неравенства.Вторая(DJNS) предназначена для организации циклов : содержимое счетчика циклов уменьшается на единицу и осуществляется переход по метке,если результат не равен нулю.

 


 

 

Подобно командам безусловного перехода, центральный процессор MCS-51 име­ет две команды вызова подпрограмм: трехбайтовую LCALL и двухбайтовую ACALL. При составлении исходного текста прикладной программы можно использовать аббревиату­ру CALL. Транслятор с языка Ассемблера подставит необходимый код в зависимости от расположения вызываемой программы в кодовом сегменте.

Особое внимание следует обратить на команду выхода из подпрограммы прерыва­ния RTI. На первый взгляд, ее действие ничем не отличается от команды RET. Однако в дополнение к последней команда RTI восстанавливает программно недоступный триг­гер разрешения прерывания, который автоматически сбрасывается при входе в подпрог­рамму прерывания.

Таблица 4.13

 

СИСТЕМА ПРЕРЫВАНИЙ

Система прерываний МК 8051 АН включает пять источников -два внешних и три внут­ренних. Внешние запросы поступают на входы INTO/P3.2 и INT1/P3.3, внутренние запро­сы формируются модулями таймеров Таймер 0 и Таймер 1, а также контроллером после­довательного интерфейса. В процессе формирования запроса на прерывание каждый источник запроса выставляет в «1» специальный флаг. Этот флаг вызовет генерацию запроса на прерывание, если прерывания от данного источника разрешены. В подпрог­рамме обслуживания прерывания флаг- источник запроса -должен быть сброшен. Если же прерывания от данного источника запрещены, то логика установки флага запроса не изменяется, но обслуживаться данный флаг должен только программно, без использова­ния аппаратных средств подсистемы прерывания.

Для формирования внешнего запроса на прерывание необходимо установить ак­тивный уровень сигнала на одном из входов: INTO/P3.2 или INT1/P3.3 (см. рис. 4.32). Распознавание микроконтроллером активного уровня сопровождается установкой триг­геров запроса внешних прерываний IEO и IE1 в регистре управления таймера TCON (см. табл. 4.19). Прерывания по входу INTO/P3.2 разрешает флаг ЕХО регистра разре­шения прерываний IE, по входу 1МТ1/РЗ.З-флагЕХ1 того же регистра (см. табл. 4.15). Каждый из входов - INTO/P3.2 или INT1/P3.3 - может быть программно настроен на один из двух режимов распознавания сигнала запроса:

1) Активным является низкий уровень сигнала. Он должен удерживаться на входе до начала обслуживания микроконтроллером данного запроса. Далее сигнал должен стать пассивным до завершения процедуры обслуживания. В противном случае триггер запро­са на прерывание будет установлен повторно. Описанная логика установки триггера внеш­него прерывания получила название статического режима распознавания запроса.

 

2) Активным является перепад сигнала с «1» на «0». Для распознавания запроса высокий и низкий уровни сигнала должны быть длительностью не менее одного машин­ного цикла каждый. По истечении одного машинного цикла после перепада сигнала внеш­него запроса с «1» на «0» устанавливается в «1» один из флагов ЕХ0 или ЕХ1. После этого уровень сигнала внешнего запроса может быть произвольным. Даже если он ос­тался низким после завершения процедуры обслуживания прерывания, то повторной установки флагов ЕХ0 или ЕХ1 не произойдет. Следующий запрос будет воспринят МК только если сигнал на входе INTO или INT1 установится в «1», а затем опять в «0». Опи­санная логика установки триггера запроса на прерывание носит название динамическо­го режима распознавания запроса.

Выбор режима распознавания внешнего запроса определяют биты IT0 и IT1 регистра TCON (см. табл. 4.19). Если выбран статический режим распознавания внешнего запро­са, то установленные триггеры ЕХО и ЕХ1 должны быть сброшены в подпрограмме об­служивания соответствующего прерывания. Для этой цели наиболее удобно использо­вать команды битового процессора: CLR ЕХ0 и CLR EX1. Если выбран динамический режим распознавания внешнего запроса, то триггеры ЕХ0 и ЕХ1 сбрасываются автома­тически при переходе на соответствующую подпрограмму прерывания.

Модули таймеров таймер 0 и таймер 1 используют для формирования запросов на прерывания триггеры переполнения TF0 иТР1 регистра TCON (см. табл. 4.19). При пере­ходе к выполнению соответствующей подпрограммы прерывания эти флаги сбрасыва­ются автоматически. Поэтому нет необходимости предусматривать специальные коман­ды для сброса флагов TF0 и TF1. Прерывания по переполнению таймера 0 разрешает флаг ЕТ0 регистра разрешения прерывания IE, по переполнению таймера 1 - флаг ЕТ1 того же регистра (см. табл. 4.15).

Модуль последовательного порта выставляет два флага, которые могут генериро­вать запросы на прерывание. Это триггеры TI и RI регистра SCON. Первый формируется по окончании передачи байта данных, второй - по окончании приема очередного байта. Флаги генерируют один общий запрос на прерывание. В подпрограмме обслуживания прерывания следует проанализировать, какой из триггеров вызвал формирование зап­роса на прерывание, и сбросить его. Если к моменту перехода на подпрограмму преры­вания установленными оказались сразу оба флага TI и RI, то удобно производить обслу­живание последовательного порта, прерываясь дважды. В первой подпрограмме преры­вания распознается один из флагов, например TI. Выполняются действия по загрузке нового байта в регистр данных последовательного передатчика и сбрасывается флагТ Ι. Первая подпрограмма прерывания завершается командой RETI. Так как флаг RI остал­ся в «1», то генерируется новый запрос на прерывание от последовательного порта и в соответствующей подпрограмме прерывания обслуживается блок приемника данного модуля. Перед завершением подпрограммы прерывания сбрасывается флаг RI. Преры­вания по запросу последовательного порта разрешает флаг ES регистра IE.

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

Сформированные посредством установки триггеров запросы на прерывание посту­пают в центральный процессор. Эти запросы могут быть приняты к обработке, если триг­гер ЕА регистра IE установлен в «1», или обработка запросов будет задержана до тех пор, пока триггер ЕА будет находиться в «0». Триггер ЕА устанавливается и сбрасывает­ся только программно. Таким образом, команда SETB ЕА эквивалентна команде «разре­шить прерывания», а команда CLR ЕА-команде «запретить прерывания». Если преры­вания центрального процессора разрешены, то МК завершает выполнение текущей ко манды, сравнивает уровни приоритетов в случае одновременного поступления несколь­ких запросов и формирует внутренними аппаратными средствами код команды LCALL. Двухбайтовый адрес команды LCALL соответствует вектору прерывания с наивысшим приоритетом. МК с ядром MCS-51 имеют фиксированные векторы прерывания. Абсо­лютные значения векторов прерывания для каждого из источников, соответствующие им триггеры запросов и флаги битов разрешения прерывания приведены в табл. 4.14.

Таблица 4.14

Запрос на прерывание не обслуживается центральным процессором и откладывает­ся на более позднее время в следующих случаях: ___ __ _

• текущий цикл не является последним циклом команды;

• выполняется процедура обслуживания прерывания с более высоким приоритетом;

• выполняется команда RETI, команды обращения к регистрам специальных

функций подсистемы прерывания IE и IP.

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

При появлении запросов от нескольких источников очередность их обслуживания определяется механизмом приоритетов. В МК с ядром MCS-51 реализована двухступен­чатая система приоритетов. Все запросы подразделяются на две группы: с высоким или с низким уровнем приоритета. Принадлежность к той или иной группе определяется значением битов регистра приоритетов IP (табл. 4.16). Если бит регистра IP равен 1, то соответствующий источник запроса относится к группе с высоким приоритетом, если 0 — то с низким. Действие механизма приоритетных прерываний в MCS-51 заключается в выборе одного из источников при одновременном появлении нескольких запросов, а также в принятии решения о прерывании подпрограммы обслуживания другого пре­рывания при поступлении нового запроса. При одновременном появлении нескольких запросов сначала обслуживаются запросы группы с высоким приоритетом, а затем группы с низким приоритетом. Внутри каждой группы распределение приоритетов фиксировано в соответствие с табл. 4.14. Механизм приоритетных прерываний использует два программ­но-недоступных триггера уровня обслуживаемого прерывания. Переход к подпрограмме обслуживания запроса сопровождается установкой триггера того уровня приоритета, к ко­торому относится запрос. При установленном триггере низшей группы запрос высшей группы вызовет прерывание подпрограммы обслуживания прерывания. Команда RETI в конце про­цедуры обслуживания сбрасывает триггер своего уровня. В этом отличие команды возвра­та из прерывания RETI от команды возврата из подпрограммы RET.

Процесс выполнения команды LCALL сопровождается загрузкой в стек содержимого счетчика команд PC (адрес следующей команды). Сохранение в стеке других регистров МК может быть выполнено в подпрограмме прерывания с использованием команды PUSH. В конце подпрограммы прерывания эти регистры должны быть восстановлены из стека командами POP. Однако следует иметь в виду, что программное сохранение в стеке регистров значительно увеличивает время реакции на прерывание. Минимальное время перехода к подпрограмме прерывания составляет 3 машинных цикла. Последней коман­дой каждой подпрограммы прерывания должна быть команда RETI, которая восстанав­ливает из стека адрес следующей команды прерванной программы и очищает флаг бло­кировки прерываний своего уровня.

Непосредственно к подсистеме прерывания относятся два регистра специальных функций:

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

IP - регистр приоритетов прерываний.

Форматы этих регистров приведены в табл. 4.15 и 4.16. Кроме этого, в обслуживании прерываний используются биты регистров управления таймерами TCON и портом пос­ледовательного ввода/вывода SCON.

 

Таблица 4.15