Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
РIС.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
278.02 Кб
Скачать

Создание текста программы на языке ассемблера

Текст исходной программы на языке ассемблера необходимо ввести с клавиатуры. Для этого надо открыть файл (File – New). Появится окно Untitled Workspaсe.

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

В последней строке программы должна быть директива END.

Присвоить имя и сохранить текст исходной программы. В открывшемся окне ввести имя файла с расширением .asm.

Присоединить ассемблерный файл к проекту с помощью кнопки "Add".

Структура программы для pic-контроллеров

В первой строке записывается директива TITLE, задающая название программы, например, TITLE “lab1”.

Во второй строке записывается директива LIST, определяющая тип микроконтроллера (LIST p=16f84).

В третьей строке директивой INCLUDE <Р тип микроконтроллера. INC > в текст исходной программы вставляется описание регистров специальных функций выбранного микроконтроллера. Директива INCLUDE <p16F84.INC> определяет 15 регистров специальных функций выбранного микроконтроллера.

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

В программу следует ввести следующее слово конфигурации:

__CONFIG _CP_OFF&_WDT_OFF&_PWRTE_ON&_XT_OSC

Оно указывает, что защиту памяти программ (СР) и сторожевой таймер (WDT) необходимо отключить, включить задержку на время установления тактового генератора (PWRTE) и использовать внешний высокочастотный резонатор (XT_OSC).

Далее с помощью директивы EQU определяются переменные и константы, использованные в тексте программы. Например:

POH1 EQU 0X10

POH2 EQU 0X11

POH3 EQU 0X12

С помощью директивы ORG <АДРЕС> устанавливается стартовый адрес программного кода. При отсутствии директивы ORG программный код размещается с нулевого адреса. Перед директивой ORG может быть установлена метка, на которую можно ссылаться в командах goto и call как на соответствующий адрес перехода.

Пример программы

Задание

Дана передаточная функция апериодического звена 1-го порядка. Подготовить, отладить и выполнить программу вычислений на симуляторе значения U вещественной частотной характеристики звена при заданных преподавателем значениях передаточного коэффициента k, постоянной времени Т и частоты ω. Расчетная формула имеет следующий вид:

Текст программы:

TITLE "<lab2>";

LIST P=16F84

INCLUDE <P16F84.INC>

__CONFIG _CP_OFF&_XT_OSC&_PWRTE_ON&_WDT_OFF

;резервирование места для регистров

status equ 0x03 ;специальный регистр status содержит флаг Z, который

;поднимается, если аккумулятор равен нулю. Этот факт

;используется в подпрограмме деления

k equ 0x10

T equ 0x11

w1 equ 0x12 ;частота ω

o1 equ 0x13 ;инициализация операнда для подпрограмм умножения и деления

o2 equ 0x14 ;инициализация операнда для подпрограмм умножения

rez equ 0x15 ;результат выполнения подпрограмм умножения и деления

rez1 equ 0x16 ;

rez2 equ 0x17 ;

U equ 0x18

; очистка регистров

clrf o1

clrf o2

clrf rez

clrf rez2

clrf rez1

clrf status

clrf k

clrf T

clrf w1

clrf k

clrf U

; запись в регистры их значений: k=10; w1=3; T=1

movlw .10 ; в регистр-аккумулятор w записываем число 10

movwf k ; пересылаем содержимое w в регистр к

movlw .3

movwf w1

movlw .1

movwf T

; инициализация операндов для умножения w1*w1

movfw w1 ;в регистр-аккумулятор w записываем содержимое регистра w1

movwf o1 ;в регистр o1 записываем w1

movwf o2 ;в регистр o2 записываем w1

call proizv ;вызов подпрограммы умножения

movfw rez ; запись результата в регистр w

movwf rez1 ;запись результата в регистр rez1

; инициализация операндов для умножения

movfw T

movwf o1

movwf o2

call proizv ;вызов подпрограммы умножения

movfw rez;

movwf rez2 ;запись результата в регистр rez2

;инициализация операндов для умножения *

movfw rez1

movwf o1

movfw rez2

movwf o2

call proizv ;вызов подпрограммы умножения

incf rez ;увеличение знаменателя на единицу( * +1)

;инициализация операндов для деления: o1=k и o2=1+ *

movfw k

movwf o1

movfw rez

movwf o2

call delenie ; вызов подпрограммы деления

movf rez,w ; запись результата деления в регистр w

movwf U ; запись результата в регистр U

goto fin

proizv; подпрограмма, осуществляющая умножение о1 на о2 (входные операнды о1 и о2, возвращает - rez)

clrw; очистка аккумулятора

movfw o1; o1 в w

clrf rez; очистка регистра rez

proizv:

nop; задержка

addwf rez,rez; сложение содержимых регистров w и rez (результат сохраняется в регистре регистре rez), rez= rez+о1

decfsz o2; уменьшение о2 на единицу. Если о2 равен нулю то пропуск

следующей команды

goto proizv

return

delenie ;подпрограмма, осуществляющая деление о2 на о1 (входные операнды о1 и о2, возвращает - rez)

movf o1,w; запись o1 в аккумулятор w

clrf rez; очистка регистра результата

delenie:

nop; задержка

subwf o2,w; w=о2-w

incf rez

btfss status,Z; если аккумулятор равен нулю, поднимается флаг Z регистра

status и пропускается следующая команда

goto delenie; переход в начало цикла если аккумулятор не равен нулю

return

fin

end.