Смекни!
smekni.com

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

Пример 1.1. Организация счетчиков циклов. Схема алгоритма счета показана на рис. 1.6, а фрагмент программы приведен в табл. 1.3.

Рисунок 1.6 – Схема алгоритма счета циклов

Счетчиком служит один из РОН – регистр В. По команде MVI B, N в него заносится число N, определяющее количество повторяемых циклов. В данной программе N=16. Для определенности принято, что участок программы, который необходимо повторить 16 раз, начинается командой логической операции «ИСКЛЮЧАЮЩЕЕ ИЛИ» XRA A, расположенной по адресу 1002, и заканчивается командой пересылки из аккумулятора в регистр D: MOV D, A, расположенный по адресу 10А1. После каждого выполнения этого участка программы содержимое счетчика (регистра В) уменьшается на единицу посредством команды DCR B (адрес 10А2). До тех пор, пока содержимое регистра В отлично от нуля, признак Z имеет нулевое значение и программа переходит к выполнению команды, адрес 1002 который содержится во втором и третьем байтах команды JNZ (переход по отсутствию нуля). Указанный адрес отмечен в программе меткой М1, т.е. метка М1 является мнемоническим обозначением адреса 1002.

Таблица 1.3 – Программа счета циклов

Метка Мнемокод Операнд Адрес Н - код Комментарий Vt
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
MVI B, 16 1000 06 Установка счётчика 7
1001 10 N=16 в (B)
M1: XRA A 1002 AF Обнуление признака переноса 4
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
MOV D, A 10A1 57 Пересылка содержимого А в регистр D (D:=A) 5
DCR B 10A2 05 Уменьшение содержимого счётчика на 1 5
JNZ M1 10A3 C2 Переход по условию (N) ¹ 0 к ячейке памяти с адресом 1002 10
10A4 02
10A5 10
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Если в результате очередного вычитания единицы содержимое регистра В окажется равным нулю (Z=1), то программа перейдет к выполнению команды, расположенной за JNZ. Происходит выход из циклического участка программы. Поскольку регистр В имеет восемь двоичных разрядов, рассмотренная структура программы позволяет организовать счетчик от 1 до 255 циклов. При необходимости получения большого числа циклов для организации счетчика следует использовать регистровые пары (например, В и С). Загрузка такой пары осуществляется с помощью команды LXI B, а вместо команды DCR В необходимо использовать команду DCX B (декремент регистровой пары).

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

На рис. 1.7 изображена схема алгоритма определения модуля числа, находящегося в регистре Е. Программа работает следующим образом. Число из регистра Е пересылается в аккумулятор. В результате выполнения операции логического сложения аккумулятора с самим собой в триггер знака записывается старший бит числа. С помощью команды условного перехода осуществляется ветвление программы. Если S=0 (положительное число) не выполняется, то производится изменение знака числа и модуль числа из аккумулятора пересылается в регистр Е. Знак числа изменяется применением операции дополнения, заключающейся в инвертировании всех разрядов числа (команда CMA) c последующим прибавлением единицы к младшему разряду (команда INR A). Если условие S=0 выполняется (число положительное), то по условному переходу JM M2 три последние команды обходятся, содержимое регистра Е не меняется, а выполнение программы продолжается с адреса 01F8, соответствующего метке М2. Программа в машинных кодах с комментариями приведена в табл. 1.1.

Рисунок 1.7 – Схема алгоритма определения модуля числа

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

В системе команд МП имеется команда сравнения СМР, которая не изменяет содержимого аккумулятора, однако устанавливает триггер признака CY (перенос) в единичное состояние, если содержимое аккумулятора меньше содержимого регистра.

Рисунок 1.8 – Схема алгоритма нахождения большего из двух положительных чисел

Таблица 1.4 – Программа определения модуля числа

Метка Мнемокод Операнд Адрес Н-код Комментарий
MOV A, E 01F0 7B Пересылка в аккумулятор 5
ORA A 01F1 B7 Определение знака числа 4
JP M2 01F2 F2 Условный переход по положительному значению 10
01F3 F8
01F4 10
CMA A 01F5 2F Изменение знака числа 4
INR A 01F6 3C 5
MOV E, A 01F7 5F Пересылка в регистр Е 5
M2: 10F8

Для определенности будем считать, что одно из чисел находится в аккумуляторе, а другое – в регистре В. Требуется большее число поместить в регистр В, а меньшее – в аккумулятор. Схема алгоритма показана на рис. 1.8, а программа в машинных кодах приведена в табл. 1.5.

Рисунок 1.9 – Схема алгоритма формирования временной задержки

Таблица 1.5 – Программа нахождения большего из двух положительных чисел

Метка Мнемокод Операнд Адрес Н-код Комментарий Vt
CMP B 00A1 B8 Сравнение чисел 7
JC M1 00А2 DA Переход на М1, если (А) <(В) 10
00А3 А8
00А4 00
MOV C, A 00A5 4F Обмен содержимого между аккумулятором и регистром B через регистр С 5
MOV A, B 00A6 7B 5
MOV B, C 00A7 41 5
M1: 00A8

Пример 1.1. Организация временной задержки длительностью 100мкс.

Программу, обеспечивающую такую задержку, оформим в виде подпрограммы, которую назовем DEL. Это символическое имя будем использовать в виде метки, указывающей начальный адрес подпрограммы. Схема алгоритма формирования временной задержки изображена на рис. 1.9, а программа помещена в табл. 1.6. Начальный адрес подпрограммы записан во втором и третьем байтах команды, с помощью которой происходит обращение к подпрограмме DEL. При выполнении подпрограммы в регистр В должно быть записано число циклов Х, которое вначале неизвестно. Содержимое регистра В уменьшается на единицу до тех пор, пока не станет равным нулю. При этом признак Z устанавливается в единичное состояние (Z=1) и происходит выход из цикла.

Подпрограмма неработоспособна до тех пор, пока не будет задано значение X.

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

Команды MVI B, X, CALL DEL и RET используется один раз. Если частота задающего генератора МП составляет 2МГц, каждый такт длится 0.5мкс. В этом случае время выполнения перечисленных команд составит 17мкс.

Для получения задержки времени, равной 100мкс, циклический участок программы должен выполняться столько раз, чтобы этот процесс завершился за 100-17=83мкс. Время выполнения команд DCR B и JNZ M1 составляет 2. 5+5=7. 5 мкс. Задержку 83мкс нельзя получить многократным повторением команд цикла, поскольку 83 не делится на 7.5 без остатка.

Если повторить циклический участок программы X = 10 раз, то получим временную задержку 75 мкс. Оставшиеся 835=8 мкс можно скомпенсировать введением подряд четырех команд NOP (К=4). Значение X=0A, соответствующее требуемому числу циклов, заносится во второй байт команды MVI B, X.

Таблица 1.6 – Программа формирования временной задержки длительностью 100мкс

Метка Мнемокод, операнд Адрес Н-код Комментарий
CALL DEL 01C0 CD Вызов подпрограммы формирования временной задержки 17
01С1 09
01С2 0A
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
DEL: MVI B, X 0A09 06 Запись в регистр В числа X=0A 7
0A0A 0A
M1: DCR B 0A0B 05 Уменьшение содержимого регистра В на 1 5
JNZ M1 0A0C С2 Повторить цикл, если результат не равен нулю 105
0A0D 0B
0A0E 0A
NOP 0A0F 00 Пустые операции 4
NOP 0A10 00 4
NOP 0A11 00 4
NOP 0A12 00 4
RET 0A13 C9 Возврат к основной программе 10

7 Программирование на языке ассемблера