
- •5.4. Организация работы с прерываниями в pic-контроллерах
- •Настройка параметров таймера tmr0 и прерывания по внешнему сигналу на выводе int
- •Работа с внешними портами ввода/вывода
- •5.5. Интегрированная среда разработки прикладного программного обеспечения mplab ide
- •Возможности мрlab ide
- •Порядок создания и отладки прикладной программы в среде mplab ide
- •Запуск mplab ide и структура среды
- •Создание нового проекта
- •Создание текста программы на языке ассемблера
- •Структура программы для pic-контроллеров
- •Компилирование
- •Отладка
Создание текста программы на языке ассемблера
Текст исходной программы на языке ассемблера необходимо ввести с клавиатуры. Для этого надо открыть файл (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.