Материал: Функциональная организация микро-ЭВМ К1816ВЕ48

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

INS не уничтожает содержимое буферного

регистра порта.) В МК-

системах, имеющих внешнюю память

программ,

порт BUS

используется для выдачи адреса внешней

памяти и

для приема

команды из внешней памяти программ. Следовательно, в таких системах использование команд OUTL лишено смысла.

В МК объекты внешних устройств (ВУ) подключаются к портаи ввода/вывода. Например, информация о достижении режущим инструментом границы допустимой зоны перемещения, получаемая при замыкании контактных пластин (так называемый "концевой выключатель"), представляет из себя один бит, который подключается к соответствующей линии порта Так же этот бит может быть включен в группу данных о состоянии устройства, например: кнопка "Стоп" инженерного пульта; двухразрядный регистр, значение в котором содержит код направления перемещения инструмента в плоскости и т.д., представляя собой слово состояния устройства, которое может занимать весь порт ввода/вывода.

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

будет иметь вид

 

 

 

WAITC: IN

A,

P1

;ввод сигнала от датчика

JB3

WAITC

;если контакт датчика разомкнут, то

повторять ввод,

 

 

; иначе выход из процедуры

 

 

 

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

; Зажечь светодиод, подключенный к линии бита 5 порта 2 ORL P2, #20

; Погасить светодиод, подключенный к линии бита 0-го порта

1

ANL P1, #FE

Линия запроса прерывания от внешнего источника ЗПР проверяется каждый машинный цикл во время действия сигнала САВП, но передача управления ячейке 3, где расроложена команда JMP, выполняется только по завершению цикла команды. При обработке прерывания, как и при вызове подпрограммы, содержимое счетчика команд и старшей тетрады СПП сохраняется в стеке. Ко входу ЗПР микроконтроллера через монтажное ИЛИ от схем с открытым коллектором могут быть подключены несколько источников прерывания. После распознавания прерывания все последующие запросы прерывания игнорируются до тех пор, пока по команде возврата RETR вновь будет разрешена работа логики

прерываний. Режим прерываний может быть запрещен или разрешен программой по командам DIS I и EN I. Сигнал ЗПР должен быть снят внешним устройством перед окончанием подпрограммы обслуживания, т.е. до исполнения команды RETR. В том случае, если внешнее устройство не сбрасывает свой флаг запроса прерываний при обращении МК к его буферному регистру, одна из выходных линий МК используется подпрограммой обслуживания прерывания для сброса этого флага во внешнем устройстве. Так как вход ЗПР может быть проверен по команде условного перехода JNI, то при запрещенном режиме прерывания вход ЗПР может быть использован в качестве дополнительного тестирующего входа подобно входам Т0 и Т1.

При необходимости в МК можно создать двухуровневую систему прерываний. Для этого надо разрешить прерывания от таймера, загрузить в него число FFH и перевести в режим подсчета внешних событий, фиксируемых на входе Т1. Переход сигнала на входе Т1 из состояния 1 в состояние 0 приведет к прерыванию по вектору в ячейке 7. В случае одновременного запроса прерываний от внешнего источника и запроса от флага переполнения таймера приоритет остается за источником, воздействующим на вход ЗПР.

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

2.6. Правила записи программ и директивы ассемблера

Исходный текст программы на языке ассемблера имеет определенный формат. Каждая команда или директива представляет собой строку из четырех полей:

МЕТКА: ОПЕРАЦИЯ ОПЕРАНД(Ы) ;КОММЕНТАРИЙ

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

В поле метки размещается символическое имя ячейки памяти, в которой хранится отмеченная команда или операнд. Метка представляет собой буквенно-цифровую комбинацию, начинающуюся с буквы. Используются только буквы латинского алфавита. Длина метки не должна превышать шесть символов. Метка всегда завершается двоеточием (:). Директивы ассемблера не преобразуются в двоичные коды, а потому не могут иметь меток. Исключение составляют псевдокоманды резервирования памяти и

определения данных (DS,DB,DW). У псевдокоманд, осуществляющих определение символических имен, в поле метки записывается определяемое символическое имя, после которого

двоеточие не ставится. В качестве символических

имен и меток

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

псевдокоманд

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

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

иограниченный набор мнемонических кодов. Любой другой набор

символов, размещенный в поле операции,

воспринимается

ассемблером как ошибочный.

 

В поле операндов определяются операнды

(или операнд),

учавствующие в операции. Команды ассемблера могут быть без-, одноили двухоперандными. Операнды разделяются запятой (,).

Операнд может быть задан непосредственно или в виде

его адреса

(прямого

или

косвенного).

Непосредственный

операнд

представляется числом (MOV A,#15)

или

символическим именем

(ADDC A,#OPER2)

с обязательным

указанием

префикса

непосредственного операнда (#). Прямой адрес операнда может быть задан мнемоническим обозначением (IN A,P1), числом (MOV A, 40), символическим именем (MOV A,MEMORY). Указанием на косвенную адресацию служит префикс @. В командах передачи управления операндом может являться число (CALL 0135H), метка (JMP LABEL), косвенный адрес (JMPP @A) или выражение (JMP ! -2, где ! -текущее содержимое счетчика команд). Используемые в качестве операндов символические имена и метки должны быть определены, а числа представлены с указанием системы счисления, для чего используется суффикс (буква, стоящая после числа): В-для двоичной, Q-для восьмеричной, D-для десятичной и H-для шестнадцатиричной. Число без суффикса по умолчанию считается десятичным.

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

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

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

Основные директивы:

ORG nn задает ассемблеру адрес ячейки памяти nn, в которой должна быть расположена следующая за ней команда прикладной

программы;

 

 

 

 

EQU

ставит в соответствие

любому

символическому имени,

используемому в

программе

определенный

операнд.

Например, запись PET EQU 13 приводит к тому, что в

процессе

ассемблирования всюду, где встретится

символическое имя

PET , оно будет заменено числом 13;

 

 

SET

переопределяет

символические

имена

операндов,

переопределяемых в процессе исполнения программы;

 

DB

обеспечивает занесение в

ПП константы, представляющей

собой байт;

 

 

 

 

END указание об окончании трансляции.

 

 

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

Ниже приводится простейшая программа, которая выполняет действия:

-ввод в двоичном виде двух числовых векторов длиной по 8 элементов в массивы VECT1 и VECT2 портов Р1 и Р2; разрядность чисел - один байт;

-ввод чисел производится в течении часа в моменты времени, заданные в массиве TIME в формате двухбайтовых слов, причем первый байт - минуты, второй байт - секунды. По истечении часа прцедура ввода повторяется;

-формирование по месту VECT1 суммы векторов VECT1[i] += VECT[i];

-вывод полученного массива в двоичном виде в порт BUS.

$ALLPUBLIC

 

 

;Таблица переменных

 

 

MAXSIZE

EQU

8

;размерность вектора

;Определение регистров 1 банка

POINTER

REQ

R0

;указатель на вектор

COUNT

REQ

R2

;счетчик циклов

;Определение регистров 2 банка

TABTIME

REQ

R1 ;указатель на таблицу времен

MIN1REQ

R3 ;счетчик текущих минут

SEC1

REQ

R4

;счетчик текущих секунд

TIK

REQ

R5

;счетчик тиков

MIN

REQ

R6

;минуты табличные

SEC

REQ

R7

;секунды табличные

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

DEFSEG VECTSEG,START=20H,CLASS=DATA SEG VECTSEG

VECT1: DS MAXSIZE

VECT2: DS MAXSIZE

;Определение таблицы времен

DEFSEG TIMESEG,START=30H, CLASS=DATA SEG TIMESEG

TIME: DB 01,00,03,00,05,00,70,00

;Определение модуля основной программы

DEFSEG PROG,START=100H SEG PROG

MAIN:

CLR

F1

;сброс признака конца часа

DIS

I

;запрет внешних прерываний

SEL

RB1

 

 

 

MOV

TABTIME,#TIME;заполнение

MOV

A,@TABTIME

;заданных

MOV

MIN,A

 

;значений

INC

TABTIME

 

;минут и

MOV A,@TABTIME

;секунд