Программирование на ассемблере 8051

Необходимо обратить внимание на следующие особенности системы команд:

1. Единство адресного пространства РПД позволяет обращаться к одним и тем же элементам с использованием различных способов адресации. Это обеспечивает гибкость программирования, сокращение длины программ. Например, запись константы в R5 нулевого банка может быть выполнена командами MOV R5,#const; MOV 5,const; MOV R0,#5 и MOV @R0,#const.

2. В командах пересылки регистров отсутствуют команды MOV Rn, Rk, но можно использовать MOV Rn, ad, где ad – прямой адрес Rk, который определяется номером банка и регистра. Например, для R5 2-ого банка прямой адрес определяется как 15+5=20;

3. При распределении регистров не следует использовать R0, R1 каждого банка как регистры временного хранения. Обычно их резервируют для косвенной адресации при работе с массивами в РПД и ВПД;

4. Стек следует располагать в верхней части свободной зоны, а его глубина определяется особенностью подпрограмм и степенью их вложенности. Если возникает необходимость сохранения регистров в стеке, адреса регистров следует заменять прямыми адресами РПД;

5. При использовании DPTR следует помнить, что он состоит из 2-х программно-доступных регистров DPH, DPL. DPH, можно использовать как регистр страниц. Модификация DPTR возможна только командой инкремента. При декрементировании эту операцию необходимо выполнять раздельно над регистрами DPH, DPL;

6. В системе команд присутствует только команда коррекции двоично-десятичных данных после сложения. Если необходимо вычитание, то следует вычитаемое преобразовать в дополнительный код (99-(вычитаемое)+1) и выполнить сложение с последующей коррекцией;

7. При выполнении вычитания операндов необходимо помнить, что в состав команд входит только команда вычитания с заёмом SUBB. Поэтому при первом вычитании необходимо обнулять бит C;

8. Особенностью логических команд является возможность выбора приемника результата A или прямо адресуемой ячейки РПД

9. Обращение к ВПД возможно только с использованием косвенной адресации. Имеется возможность задавать адреса с помощью DPTR и порта Р2 совместно с регистром @Ri [ (P2) + @Ri]->(Ri)+(P2), где P2 – содержимое порта P2. Команду MOVХ A, @Ri целесообразно использовать, если размер массива < 255;

10. Для работы с таблицами и константами, хранящимися в ПЗУК, используются команды MOVC A, @A+DPTR.

MOVС A, @A+PC используется для верификации команд, записанных в ПЗУК.

Текущее значение PC может быть прочитано следующей процедурой:

LCALL Addr

Addr: POP ad; старший байт PC

POP ad+1; младший байт PC

PUSH ad+1

PUSH ad

RET

11. Битовые команды обеспечивают доступ к битовой зоне и регистрам специальных функций. Исключение составляют регистры: SP, DPTR, TMOD, TH0, TL0, TH1, TL1, SBUF, PCON, которые не допускают побитового обращения. Для реализации битовых переходов достаточно поместить операнд в битовую зону. Например, переход по знаку числа, находящегося в свободной зоне по адресу 50h можно выполнить командами:

MOV AC,50H или MOV 20h,50h

JB AC.7,M1 JB 20.7,M1

12. В битовых командах «С» выполняет функции аккумулятора. В логических командах обработки бит возможно использование инверсного значения. В этом случае перед операндом необходим знак «/» . При этом значение bit не изменяется;

13. При использовании команд переходов предпочтение следует отдавать командам с относительной адресацией, т.к. они обеспечивают перемещаемость программ;

14. JMP @A+DPTR – множественное ветвление по адресу, вычисляемому в процессе выполнения программы.

15. Значение бита Z в PSW не фиксируется. Переход JZ (JNZ) может быть реализован после любой команды, в которой аккумулятор является приемником результата. Например, MOV A, (add, Rn, @Ri).

16. Для организации циклов следует использовать команды DJNZ Rn(add), M.

17. При необходимости сравнения операндов следует использовать команду CJNE, в результате выполнения которой формируются признаки равно, больше, меньше.

Если необходимо сравнение A и Rn, то в формате команды следует указывать прямой адрес регистра Rn.

18. Команда JBC используется в тех случаях, когда необходимо проверить значение бита на единицу, а после выполнения перехода его сбросить

ПРИМЕР 1. По срезу сигнала готовности, представляющему собой положительный импульс длительностью 20 мкс, ввести данные через параллельный порт. Разрядность данных 8 бит. Данные записываются в контроллер по условию: xi<=Адоп. Число достоверной информации должно быть 8. Вычислить среднее арифметическое и вывести сигнал окончания работы - отрицательный импульс >=40 мкс. При суммировании данных предусмотреть получение результата > 8 бит. Обобщенная ГСА приведена на рисунке 25.


Рисунок 25.- Граф-схема алгоритма примера 1

Адоп (0:7)- допустимое значение

i(0:7)- номер. вводимых данных

Xi(0:7)- текущее значение вводимых данных

Y(0:7) - входной регистр данных

К(0:7) - счетчик программируемой задержки

n(0:2) – количество данных, соответствующих условию проверки.

S (0:15) – результат суммирования

Г(0) – сигнал готовности

N(0:7) - результат обработки

В(0) – выходной импульс

ГСА не отражает специфики ОМК 8051 как и положено граф-схеме алгоритма. Однако при программировании на ассемблере 8051 необходимо учесть следующее: контроллер восьмиразрядный, следовательно, при формировании суммы необходимо контролировать бит переноса из старшего разряда С, ввод/вывод данных выполняется через параллельные порты которые следует настроить соответствующим образом, необходимо учесть специфику РПД при распределении ресурсов (см. раздел 2).

Так как рассматриваемая задача относительно простая, то распределение необходимых ресурсов не вызывает трудностей: R2 - счетчик достоверных данных, R3- счетчик программируемой задержки, R4- младший байт суммы, R5 - старший байт суммы, R6 - счетчик сдвигов. В качестве порта ввода данных выбираем Р2, а порта управления - Р1, в котором P1.0 используется для ввода сигнала готовности, а P1.1 – для вывод сигнала управления. В данном примере не используются регистры косвенной адресации R0, R1. По сбросу устанавливается банк.0, а параллельные порты настраиваются на ввод данных. Однако при реализации в контроллере нескольких задач рекомендуется для каждой задачи проводить повторную настройку портов, так как в регистре – защелке порта могут сохраниться данные других задач.

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

n:.EQUAL 8;Присвоение операндам символического имени

k:.EQUAL 20;

.ORG 100h; Начальный адрес программы

mov R2, #n; Подготовка регистров

mov R3, #k

mov R6, #3

clr A

mov R4, A

mov R5, A

mov P2, #0ffh; Настройка портов

mov P1, #xxxxxx01bh

setb P1.1

wait1: jnb P1.0, wait1; Анализ готовности

wait0: jb P1.0, wait0

mov A, P2; Чтение вводимых данных

cjne A, #Aдоп,M1; Сравнение с Адоп

M2: clr C;

add A, R4; Формирование младшего байта суммы

jc M3; Проверка переноса из старшего разряда

M4: mov R4, A; Сохранение младшего байта суммы

djnz R2, wait1; Проверка окончания цикла

sjmp M5

M1: jnc wait1; Проверка Xi < Адоп

sjmp M2

M3: inr R5; Подсчет числа переполнений

sjmp M4

M5: clr C; Вычисление средне-арифметического

mov A, R5

rrc A

mov R5, A

mov R4, A

djnz R6, M5

clr P1.1;Формирование выходного импульса

М6: djnz R3, М6; Время выполнения DJNZ 2мкс, поэтому (R3)=20

setb P1.1

.end; Конец программы

ПРИМЕР 2:Измерить временной интервал (0,01-1)с с погрешностью +/- 1 мкс. Результат записать в свободную зону РПД. Измеряемый импульс –положительный. Частота кварца ОМК –12МГц.

Преобразование выполняется в программном режиме.

В качестве счетчика выбираем СТ0, работающий в режиме 1. Измеряемый интервал подается на вход INT0 (P3.2). В соответствии с требованиями по точности результат измерения должен быть 1000000, а максимальное число, которое может быть записано в СТ0 - 65535. Поэтому на базе регистра R2 организуется счетчик переполнений. Результат преобразования должен быть размещен в свободной зоне РПД. В качестве регистра косвенной адресации используется R0. Регистры принадлежат нулевому банку. Предполагается неоднократное использование процедуры преобразования, поэтому выполняем её в виде подпрограммы. Входным параметром является значение регистра R0. Результат преобразования хранится по адресу, указанном в R0.

Режимное слово TMOD=09h (режим1 с аппаратным запуском).

.ORG 100h

mov SP, #addr1; Запись в указатель стека

mov TMOD, #9h; Запись слова режима

clr IE.7; Запрет прерывания

call addr2; Подпрограмма измерения

.

.

.

addr2:

push a; Сохранение регистров AC, R2

push 2

clr A; Обнуление R2, TH0, TL0

mov R2, A

mov TH0, A

mov TL0, A

setb TCON.4; Pазрешение работы счетчика

M1: jnb P3.2, M1;Анализ входного импульса

M4: jb P3.2, M2;

Sjmp M5

M2: jbc TCON.5, M3; Проверка TF0 и его сброс

sjmp M4

M3: inc R2; Подсчет переполнений CT0

sjmp M4

M5: clr TCON.4; Запрещение счета СТ0

mov @R0, R2; Запись результата

inc R0

mov @R0, TH0

inc R0

mov @R0,TL0

pop 2; Восстановление регистров

pop a

ret; Возврат из подпрограммы

Анализ бита переполнения требует определенных временных затрат, что может привести к увеличению погрешности измерения. Более рационально подсчитывать число переполнение по прерыванию от СТ0.

ПРИМЕР 3. Передать массив, хранящийся в свободной зоне РПД, через последовательный порт, работающий в режиме 1. Скорость обмена - 110 бит/с. Массив расположен с адреса аddr и имеет длину n. Вывод - программный.

Управляющее слово для последовательного порта (SCON):=01x...xb.

Для скорости обмена 110 бит/сек при частоте кварца 12 МГц с учетом условий задачи (SMOD=1) частота переполнения CT1 равна 110*16=1760. На вход таймера поступает частота OSC/12 (1 МГц); коэффициент деления – 1000000/1760=568. Так как счетчик суммирующий, то константа, которая должна быть записана в регистр счетчика (65535-568+1)=64968 (0fdc8h). Таким образом, TH1=FDh, TL1=C8h. Требуемый коэффициент деления обеспечивает режим 1.

Режимное слово таймера 1 (TMOD):=1xh (режим 1, программный запуск). В соответствии с условием (PCON):=80h.

.ORG 50h

CLR IE.7; Запрет прерываний, возможно CLR IE.4;CLR ES

MOV SCON, #01x...xb; Режимное слово передатчика

MOV TMOD, #1xh; Режимное слово таймера (режим 1,таймер, прогр.запуск)

MOV PCON, #80h;Установка бита SMOD

MOV R0, #addr; Параметры массива

MOV R2, #n;

M2: MOV TH1, # FDh; Коэффициент деления СТ1

MOV TL1, #C8h;

SETB TCON.6; Пуск таймера

MOV SBUF, @R0; Передача элемента массива

M1: JNB SCON.1, M1; Анализ флага готовности передатчика

CLR SCON.1; Сброс флага готовности передатчика

DEC R0; Переход к следующему элементу массива

DJNZ R2,M2;

.END

Возможен вариант решения этой задачи, при котором перезапуск C/T1

выполняется по прерыванию от флага переполнения TF1. Тогда прерывание от CT1 должно быть разрешено. Подпрограмма имеет следующий вид:

.ORG 1Bh

MOV TH1,#FDh

MOV TL1,#C8h

RETI

Если коэффициент деления меньше 255, то наиболее рационально использование режима 2 счетчика-таймера, так как в этом режиме перезагрузка коэффициента выполняется аппаратно.

ПРИМЕР 4. По срезу импульса запроса INT0 ввести 16-разрядные данные через порты Р0 и Р1. Данные, принимаемые через порт Р0 разместить в аккумуляторе, а через Р1 в регистре R0 первого банка.

.

.ORG 03h

LJMP adr16; начальный адрес подпрограммы обработки прерываний

.ORG 100h

MOV SP,#adr; запись указателя стека

SETB PSW.3 (RS0); выбор первого банка

SETB TCON.0; настройка на динамический вход

MOV IE,#81h; разрешение прерывания

Выполнение текущей программы

.

.

.

adr 16: процедура обработки прерываний

CLR IE.7; запрет прерывания

PUSH A; сохранение регистров

PUSH 02

SETB IE.7; разрешение прерываний

MOV A,P0

MOV R2,P1

CLR IE7;

POP 02; восстановление информации о прерванной программе

POP A

SETB IR.7

RETI; возврат из прерывания

Приложение 1


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: