Арифметические и логические инструкции
Пример арифметической команды: Операция сложения может быть выполнена одной из следующих команд:
ADD A,7Fh
ADD A,@R0
ADD A,R7
ADD A,#127
Все арифметические инструкции выполняются за 1 машинный цикл за исключением команды INC DPTR, - требующей 2 машинных циклов, а также операций умножения и деления, выполняемых за 4 машинных цикла. Любой байт во внутренней памяти данных может быть инкрементирован и декрементирован без использования аккумулятора.
Инструкция MUL AB производит умножение данных в аккумуляторе на данные, находящиеся в регисте B, помещая поризведение в регистры A (младшая половина) и B (старшая половина).
Инструкция DIV AB делит содержимое аккумулятора на значение в регистре B, оставляяя остаток в B, а частное в аккумуляторе.
Инструкция DA A предназначена для двоично-десятичных арифметических операций. Она не делает преобразования двоичного числа в двоично-десятичное, а лишь обеспечивает правильный результат при сложении 2-х двоично-десятичных чисел.
Пример логической команды: Опреция логического И может быть выполнена одной из следующих команд:
ANL A,7Fh
ANL A,@R1
ANL A,R6
ANL A,#53h
Все логические операции над содержимым аккумулятора выполняются за один машинный цикл, остальные - за 2. Логические операции могут производиться над любым из нижних 128 байтов внутренней памяти данных или над любым регистром SFR в режиме прямой адресации без использования аккумулятора.
Операции циклического сдвига (RL A, RLC A и т.д.) перемещают содержимое аккумулятора на 1 бит вправао или влево. В случае левого циклического сдвига младший бит перемещается в старшую позицию. В случае правого циклического сдвига происходит обратное.
Опреция SWAP A осуществляет обмен младшей и старшей тетрад в аккумуляторе.
Команды передачи данных.
Команда MOV dest,src позволяет пересылать данные между ячейками внутреннего ОЗУ или SFR без использования аккумулятора. При этом работа с верхней половиной внутреннего ОЗУ может осуществляться только в режиме косвенной адресации, а обращение к регистрам SFR - только в режиме прямой адресации.
Во всех микросхкмах MCS-51 стек размещается непосредственно в резидентной памяти данных и увеличивается вверх. Инструкция PUSH вначале увеличиват значение указателя стека SP, а затем записывает в стек байт данных. Команда PUSH и POP используются только в режиме прямой адресации, записывая или восстанавливая байт, но стек является всегда доступным при косвенной адресации чегез регистр SP. Таким образом, стек может использовать и верхние 128 байт памяти данных. Эти же соображения исключают возможность использования стековых команд для адресации регистров SFR.
Инструкции передачи данных включают в себя 16-битовую операцию пересылки MOV DPTR,#data16, которая используется для инициализации регистра указателя данных DPTR, при просмотре таблиц в программной памяти или для доступа к внешней памяти данных.
Операция XCH A,byte применяется для обмена данными между аккумулятором и адресуемым байтом. Команда XCHD A,@Ri аналогична предыдущей, но выполняется только для младших тетрад участвующих в обмене операндов.
Для доступа к внешней памяти данных используется только косвенная адресация. В случае однобайтных адресов используются регистры R0 или R1 текущего регистрового банка, а для 16-разрядных - регистр DPTR. При любом методе доступа в внешней памяти данных аккумулятор играет роль источники либо приемника информации.
Для доступа к таблицам, размещенным в программной памяти используются команды:
MOVC A,@A+DPTR
MOVC A,@A+PC
В качестве базового адреса таблицы используется содержимое соответственно DPTR или PC, а смещение берется из A. Эти команды используются исключительно для чтения данных из программной памяти, но не для записи в нее.
Булевы операции.
Микросхемы MCS-51 содержат в своем составе “булевый” процессор. Внутреннее ОЗУ имеет 128 прямоадресуемых бит. Пространство SFR может также поддерживать до 128 битовых полей. Битовые инструкции осущесвляют условные переходы, пересылки, сброс, инверсии, операции “И”, “ИЛИ”. Все указанные биты доступны в режиме прямой адресации.
Бит переноса CF в PSW используется как 1-битный аккумулятор булевого процессора.
Инстукции переходов.
Адреса операций переходов обозначаются на языке ассемблера меткой либо реальным значением в пространстве памяти программ. Адреса условных переходов ассемблируются в в относительное смещение - знаковый байт, прибавляемый к программному счетчику PC в случае выполнения условия перехода. Границы таких переходов лежат в пределах между -128 и +127, относительно первого байта, следующего за инструкцией. В PSW отсутствует флажок нуля, поэтому инструкции JZ и JNZ проверяют условие “равно нулю” тестирование данных в аккумуляторе.
Существует три вида команды безусловного перехода: SJMP, LJMP, AJMP, различающиеся форматомадреса назначения. Инструкция SJMP кодирует адрес как относительное смещение, и занимает 2 байта. Дальность перехода ограничена диапазоном от -128 до +127 байт относительно инструкции, следующей за SJMP. В инструкции LJMP используется адрес назначения в виде 16-битной константы. Длина команды составляет 3 байта. Адрес назначения может располагаться в любом месте памяти программ. Команда AJMP использует 11-битную константу адреса. Команда состоит из 2-х байт. При выполнении этой инструкции младшие 11 бит адресного счетчика замещаются 11-битным адресом из команды. 5 старших бит PC остаются неизменными. Т.о., переход может производиться внутри 2К-байтного блока, в котором располагается инструкция, следующая за командой AJMP.
Существует два вида команды вызовы подпрограммы: LCALL и ACALL. Инструкция LCALL использует 16-битный адрес вызываемой подпрограммы. В данном случае подпрограмма может быть расположена в любом месте памяти программ. Инструкция ACALL использует 11-битный адрес подпрограммы. В этом случае вызываемая подпрограмма должна быть расположена в одном 2К-байтном блоке с инструкцией, следующей за ACALL. Оба варианта команды кладут на стек адрес следующей команды и загружают в PC соответствующее новое значение.
Подпрограмма завершается инструкцией RET, позволяющей вернуться на инструкцию, следующую за командой CALL. Эта инструкция снимает со стека адрес возврата и загружает его в PC. Инструкция RETI используется для возврата из подпрограмм обработки прерываний. Единственное отличие RETI от RET состоит в том, чтоRETI информирует систему о том, что обработка прерывания завершилась. Если в момент выполнения RETI нет других прерываний, то она идентична RET.
Инструкция DJNZ предназначена для управления циклами. Для выполнения цикла N раз надо загрузить в счетчик байт со значением N и закрыть тело цикла командой DJNZ, указывающей на начало цикла.
Команда CJNE сравнивает два своих операнда как беззнаковые целые и производит переход по указанному в ней адресе, если сравниваемые операнды не равны. Если первый операнд меньше, чем второй, то бит переноса CF устанавливается в “1”.
Все команды в ассемблированном виде занимают 1, 2 или3 байта. Структура кода команды может иметь один из следующих видов:
КОП | |||
КОП | #data8 | ||
КОП | adr8 | ||
КОП | bitadr | ||
КОП | reladr | ||
КОП | |||
КОП | adr8 | #data8 | |
КОП | adr8 | reladr | |
КОП | adr8s | adr8d | |
КОП | #data8 | reladr | |
КОП | bitadr | reladr | |
КОП | adr16h | adr16l | |
КОП | #data16h | #data16l |
Лекция № 10
“Порты ввода-вывода. Параллельный интерфейс.”
Порты ввода-вывода предназначены для обмена логической информацией между процессором и периферийными устройствами. Они могут быть однонаправленными (т.е. осуществлять обмен информацией в одну сторону) или двунаправленными. Большинство микроконтроллеров семейства MCS-51 имеют четыре 8-битных квази-двунаправленных порта ввода-вывода P0-P4. Они называются квазидвунаправленными потому, что каждый бит данных портов может индивидуально быть настроен на работу как на ввод так и на вывод информации. Со стороны процессора эти порты представляются в виде соответствующих регистров специальных функций P0-P3. В эти регистры процессор может записывать выходную информацию порта либо считывать из них входные данные. Данные регистры могут адресоваться как побайтно, так и побитно, что облегчает манипуляцию информацией на отдельных выводах портов.
Помимо работы в качестве обычных портов ввода-вывода, линии портов могут выполнять ряд альтернативных функций:
Вывод порта | Альтернативная функция |
P0.0/AD0-P0.7/AD7 | Мультиплексная шина адреса-данных для доступа к внешней памяти |
P1.0/T2 | Внешний счетный вход-выход таймера T2 |
P1.1/T2EX | Управляющий ввод таймера T2 |
P1.2/ECI | Внешний счетный вход массива PCA |
P1.3/CEX0 | Вход-выход модуля PCA0 |
P1.4/CEX1 | Вход-выход модуля PCA1 |
P1.5/CEX2 | Вход-выход модуля PCA2 |
P1.6/CEX3 | Вход-выход модуля PCA3 |
P1.7/CEX4 | Вход-выход модуля PCA4 |
P2.0/A8-P2.7/A15 | Старший байт шины адреса для доступа к внешней памяти |
P3.0/RXD | Вход последовательного порта |
P3.1/TXD | Выход последовательного порта |
P3.2/ | Внешний вход запроса прерывания 0 |
P3.3/ | Внешний вход запроса прерывания 1 |
P3.4/T0 | Внешний счетный вход таймера 0 |
P3.5/T1 | Внешний счетный вход таймера 1 |
P3.6/ | Строб записи во внешнюю память данных |
P3.7/ | Строб чтения во внешнюю память данных |
Внутренняя структура портов ввода-вывода микроконтроллера имеет вид.
Выходная информация порта фиксируется в триггере-защелке при записи в него соответствующего значения по внутренней шине данных. Входная информация порта интерпретируется либо как содержимое триггера-защелки порта, либо как состояние на соответствующем выводе микросхемы в зависимости от типа используемой команды. Выходные цепи портов P0 и P2 переключаются либо выход своего тригера-защелки либо на внутреннюю шину адреса и данных в зависимости от текущего режима работы. Во время доступа к внешней памяти содержимое тригеров-защелок порта P2 не изменяется, а тригеры-защелки порта P0 устанавливаются в 1. Выводы портов P1, P2, P3 имеют внутренние резисторы-подпорки. Выводы порта P0 имеют выходы с открытым стоком. Если требуется использование выводов этого порта в качестве выходов, то необходимы внешние резисторы подпорки на соответствующие выводы. Для того чтобы отдельные выводы порта могли использоваться как входы либо выполнять альтернативные функции, в их триггеры защелки должна быть записана 1. После системного сброса триггеры всех выводов всех портов содержат 1, т.е. все выводы портов настроены на работу в качестве входов либо на выполнение альтернативных функций. Если выполняемая команда записывает новое значение в порт, т.е. изменяет содержимое внутреннего триггера-защелки, новое значение поступает на вход триггера-защелки в фазе S6P2 последнего цикла инструкции. Однако новая информация действительно появится на выходе порта лишь в фазе S1P1 следующего машинного цикла. Входные данные, считываемые с выводов портов фиксируются в моменты S5P1 каждого машинного цикла.
Различные инструкции, осуществляющие чтение порта по разному выполняют эту операцию. Некоторые инструкции считывают информацию с соответствующих выводов портов. К ним относятся команды:
MOV A,Pj (j=0-3) ;
MOV Rn,Pj ;
MOV @Ri,Pj ;
MOV C,portbitadr.
Например инструкция MOV A,P3 записывает в аккумулятор информацию, находящуюся на выводах порта P3. Однако, некоторые инструкции, такие как: ANL Pj,source ;
ORL Pj,source ;
XRL Pj,source ;
JBC portbitadr,addr ;
CPL portbitadr ;
INC Pj ;
DEC Pj ;
DJNZ Pj,addr ;
MOV portbitadr,C ;
CLR portbitadr ;
SETB portbitadr
при обращении к портам используют информацию не с выводов портов, с выходов соответствующих тригеров-защелок. Они считывают информацию с выходов тригеров-защелок порта, модифицируют ее и записывают обратно в триггеры. Поэтому такие команды называются командами типа “чтение-модификация-запись”.
Выводы портов могут быть различным образом подключены к управляющим (или управляемым) устройствам. Входные линии портов могут управляться непосредственно от ТТЛ или КМОП или других устройств, уровни выходных сигналов которых соответствуют входным уровням линий портов. В случаях, когда необходимо подключить выходы нескольких устройств к одной линии порта, они могут быть объединены в т.н. “шину с открытым коллектором”. В качестве выходных элементов таких устройств могут использоваться транзисторы, компараторы или логические элементы с открытым коллекторным выходом.
Выходные линии портов могут быть нагружены на единичную ТТЛ нагрузку. Если требуется повышенная нагрузка, то вывод порта должен быть подключен к ней через ключевой усилитель или логический элемент с повышенной нагрузочной способностью.
Если требуемый уровень выходных коммутируемых сигналов не соответствует ТТЛ уровню, то вывод порта должен быть подключен к нагрузке через согласовывающий ключ.
Возможны ситуации, когда управляемый объект запитывается от источников питания, гальванически развязанных от управляющего контроллера или находится на значительном удалении от него. В этих случаях требуется гальваническая развязка управляющих сигналов от нагрузки. Она осуществляется с помощью оптронов или импульсных трансформаторов. Примером гальванической развязки порта от нагрузки может служить следующая схема.
В случае, когда внутренних портов ввода-вывода микроконтроллера недостаточно для организации полного взаимодействия в системе, приходится использовать внешние порты ввода-вывода. Примером такого устройства может служить микросхема программируемого периферийного адаптера КР580ВВ55.
Это однокристальное программируемое устройство параллельного ввода-вывода информации. Оно способно осуществлять параллельный обмен данными с квитированием или без него как в режиме программного управления, так и по прерываниям. При этом возможна организация не только однонаправленного, но и двунаправленного ввода-вывода. Определение и переопределение типа интерфейса выполняется программными методами с помощью программных процедур инициализации.
В состав микросхемы входят три двунаправленных 8-разрядных порта, разбитых на две группы, два устройства управления группами портов и интерфейсная логика для согласования с системной магистралью. Схема управления содержит регистр управляющего слова CW, который доступен только для записи по системной магистрали.
Обмен информацией между процессором и внутренними регистрами микросхемы обеспечивается ее подключением к магистрали микропроцессора и управляется сигналами , A0, A1, , в соответствии с требованиями к шине Microbus. Адресные сигналы выбирают один из внутренних регистров, а стробы и управляют направлением передачи. Сигнал необходим для выбора кристалла.
A1 | A0 | Операция | |||
D Порт A | |||||
D Порт B | |||||
D Порт C | |||||
Недопустимо | |||||
Порт A D | |||||
Порт B D | |||||
Порт C D | |||||
Управление D | |||||
X | X | Нет операции | |||
X | X | X | X | Нет операции |
Вход RESET служит для аппаратного сброса микросхемы в исходное состояние. При этом все внутренние регистры микросхемы устанавливаются в нулевое состояние. Сброс CW соответствует переводу всех портов в режим прямого ввода без квитирования.
Дальнейшая настройка выполняется программно с помощью специального управляющего слова MS (Mode Select), которое назначает режим работы каждому каналу. Эти режимы могут быть изменены в любое время. Для хранения MS используется регистр CW.
Регистр управляющего слова 7-разрядный. Запись в него осуществляется только при передаче управляющего слова с D7=1 (признак слова MS), которое определяет режим работы каждого канала ввода-вывода в соответствии со следующим форматом:
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
Управление группой A | Управление группой B | ||||||
Режим PA7-PA0: 00 - режим 0 01 - режим 1 1x - режим 2 | PA7-PA0 1 - ввод 0 - вывод | PC7-PC4 1 - ввод 0 - вывод | Режим PB7-PB0: 0 - режим 0 1 - режим 1 | PB7-PB0 1 - ввод 0 - вывод | PC3-PC0 1 - ввод 0 - вывод |
При записи нового управляющего слова все буферные регистры портов устанавливаются в 0.
При D7=0 управляющее слово применяется для независимой установки (сброса) разрядов выходного порта C и носит название BST (Bit Set/Reset). Формат управляющего слова BST имеет вид:
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
Не используются | Номер бита | 1/0 |
Микросхема поддерживает три режима работы портов:
- режим 0 - однонаправленный ввод-вывод без квитирования (применим к любому из трех портов);
- режим 1 - однонаправленный ввод-вывод с квитированием (применим к портам A и B);
- режим 2 - двунаправленный ввод-вывод с квитированием (допустим только для порта A).
В режиме 0 осуществляется прямой однонаправленный ввод-вывод через любой из трех портов без каких-либо сигналов сопровождения . В данном режиме интерфейс можно представить как набор параллельных линий ввода-вывода , организованные в две байтовых и две 4-разрядные шины, причем каждая может быть настроена либо для ввода, либо для вывода независимо от других. Входная информация микросхемой не запоминается и читается при низком уровне сигнала . Выходная информация защелкивается в выходной буферный регистр выбранного порта по срезу сигнала и остается на выходе порта до нового цикла вывода или изменения режима.
Режим 1 обеспечивает организацию однонаправленного ввода-вывода с квитированием через порты A и B. Входные и выходные данные фиксируются во внутренних регистрах микросхемы. Управление вводом осуществляется сигналами:
- (Strobe) - Строб записи данных во входной регистр защелку. Загрузка данных осуществляется по фронту ;
- IBF (Input Buffer Full) - Подтверждение загрузки данных. Сигнал устанавливается по срезу и сбрасывается по фронту ;
- INT (Interrupt) - Запрос на прерывание. Сигнал устанавливается по фронту и сбрасывается по срезу . Используется для организации ввода по прерываниям.
Другой набор сигналов управления применяется при выводе данных:
- (Output Buffer Full) - Строб вывода данных. Низкий уровень сигнала информирует о выводе новых данных. Сигнал устанавливается по фронту и сбрасывается по срезу ;
- (Acknowledge) - Подтверждение приема выходных данных со стороны внешнего устройства. Низкий уровень сигнала сообщает микросхеме о том, что данные приняты;
- INT (Inerrupt) - Запрос на прерывание. Сигнал устанавливается по фронту и сбрасывается по срезу . Используется для организации вывода по прерываниям.
Временная диаграмма ввода данных имеет вид
Временная диаграмма вывода данных имеет вид
Для генерации вышеуказанных сигналов управления применяются отдельные линии порта C.
Ввод | Вывод | |
PA | PC3 - INT PC4 - PC5 - IBF PC6 - I/O PC7 - I/O | PC3 - INT PC4 - I/O PC5 - I/O PC6 - PC7 - |
PB | PC0 - INT PC1 - IBF PC2 - | PC0 - INT PC1 - PC2 - |
Свободная от управления часть порта C может выполнять свою стандартную функцию ввода-вывода в режиме 0.
Для управления обменом в режиме 1 со стороны процессора предусмотрен программный доступ к линиям INT, IBF, . Доступ организован через операцию чтения порта C. При этом отдельные разряды считанных данных интерпретируются следующим образом. Они составляют слово состояния адаптера SW.
Ввод | Вывод | |
PA | D3 - INT D4 - INTE D5 - IBF D6 - I/O D7 - I/O | D3 - INT D4 - I/O D5 - I/O D6 - INTE D7 - |
PB | D0 - INT D1 - IBF D2 - INTE | D0 - INT D1 - D2 - INTE |
В состав SW входят флажки разрешения прерывания INTE, управление состоянием которых может быть выполнено с помощью команды BSR с соответствующим параметром. Генерация запроса на прерывание INT и установка одноименного флажка в SW возможна только при установленном флажке INTE.
В режиме 2 (возможном только для порта A) организуется двунаправленный ввод-вывод с квитированием. В данном режиме линии порта A выполняют роль двунаправленной трехстабильной шины, управляемой сигналами , IBF, , и INT. Правила их формирования тождественны правилам режима 1. В соответствии с состоянием IBF и внешнее устройство либо генерирует очередные данные, сопровождая их стробом , либо формирует сигнал подтверждения приема , готовясь к приему данных. Низкий уровень напряжения сигнала открывает выходные буферы порта A, разрешая выдачу данных на шину. В остальных случаях шина PA находится в высокоимпедансном состоянии. Сигнал INT используется для организации ввода-вывода по прерываниям. При получении очередного запроса на прерывание процессор читает слово состояния SW и по флажкам IBF и уточняет статус порта A, выполняя ввод или вывод очередных данных.
D3 | INT |
D4 | INTE (ввод) |
D5 | IBF |
D6 | INTE (вывод) |
D7 |
В SW предусмотрены два независимых флажка разрешения прерывания для ввода и вывода, что дает возможность переводить порт либо в режим ввода, либо в режим вывода выборочно.
Порты A, B и C (обе его половины) для работы в том или ином режиме программируются независимо друг от друга.
Для унификации способов соединения периферийных устройств были разработаны стандарты параллельных интерфейсов. Один из них, стандарт BS 4421 (разработан Британским комитетом по стандартизации промышленных средств обработки информации в 1969 г.) в нашей стране известен как интерфейс радиальный параллельный (ИРПР). Базовый вариант интерфейса предусматривает одностороннюю асинхронную передачу информации по параллельной 16/8-разрядной шине от источника к приемнику на расстояние до 15 м. Передача байта данных сопровождается двумя управляющими сигналами AC (Acceptance Control) или запрос приемника (ЗП) и управление источника SC (Source Control) или строб источника (СТР). Данные на шине истинны, когда AC=1 и SC=1. Однако циклы передачи данных могут начинаться и выполняться только при условии, что сигналы готовности приемника A0 (ГП) и источника S0 (ГИ) активны. В состав интерфейса входят ряд необязательных вспомогательных линий.
Скорость передачи данных не регламентирована и зависит от быстродействия обеих сторон. Уровни активности сигналов зависят от конкретной модификации интерфейса.
Передающая и приемная часть данного интерфейса легко реализуема с помощью микросхемы КР580ВВ55, работающей в режиме 1.
Модифицированный интерфейс ИРПР (ИРПР-М), международным аналогом которого является интерфейс Centronics, широко применяется в настоящее время для подключения печатающих устройств к компьютеру. Процесс передачи данных по этому интерфейсу сопровождается двумя основными управляющими сигналами: строб источника (СТР) и подтверждение приемника (ПТВ). Основное отличие этого интерфейса от ИРПР заключается в том, что указанные сигналы являются импульсными, а не потенциальными. Перед началом передачи источник анализирует состояние сигнала занятости приемника BUSY (ЗАН). При пассивном уровне этого сигнала источник выставляет данные на свою внешнюю шину и формирует импульс сигнала (СТР), длительностью около 0.5 мкс. Обнаружив активный уровень сигнала , приемник выставляет сигнал занятости BUSY (ЗАН) и принимает данные по заднему фронту сигнала (СТР). После приема данных приемник формирует импульс подтверждения приема данных (ПТВ) длительностью 2.5-5 мкс. По заднему фронту сигнала подтверждения приемник снимает сигнал занятости BUSY (ЗАН), после чего источник может снова передавать данные.
В состав интерфейса входит ряд вспомогательных сигналов, таких как:
- Сброс (СБР);
- Выбор (ВЫБОР);
- Ошибка (ОШ);
- Конец бумаги (КБМ);
- Автоматический перевод строки (АПС);
- Готовность приемника SLCT (ГП).
Подобный интерфейс также легко реализуется с помощью микросхемы КР580ВВ55. Необходимо лишь добавить одновибраторы на выходы строба и подтверждения приема IBF.
Для реализации интерфейса применяется 25-контактный разъем следующей конфигурации:
BUSY | GND | ||||
D0 | GND | ||||
D1 | SLCT | GND | |||
D2 | GND | ||||
D3 | GND | ||||
D4 | |||||
D5 | |||||
D6 | GND | ||||
D7 | GND | ||||
GND |
Длина кабеля не более 1.8 м.