Учебное пособие 759
.pdf113-2018
ИЗУЧЕНИЕ СТРУКТУРЫ КОМАНД МИКРОКОНТРОЛЛЕРА PIC16C84 НА ПРИМЕРЕ РАСЧЕТА ПОДПРОГРАММЫ ЗАДЕРЖКИ
МЕТОДИЧЕСКИЕ УКАЗАНИЯ
к выполнению лабораторной работы № 6 по дисциплине «Электроника и микропроцессорная техника»
для студентов направления 12.03.04 «Биотехнические системы и технологии»
(профиль «Биотехнические и медицинские аппараты и системы») очной формы обучения
Воронеж 2018
Министерство науки и высшего образования Российской Федерации
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»
Кафедра системного анализа и управления в медицинских системах
ИЗУЧЕНИЕ СТРУКТУРЫ КОМАНД МИКРОКОНТРОЛЛЕРА PIC16C84 НА ПРИМЕРЕ РАСЧЕТА ПОДПРОГРАММЫ ЗАДЕРЖКИ
МЕ Т О Д И Ч Е С К И Е У К А З А Н И Я
квыполнению лабораторной работы № 6
по дисциплине «Электроника и микропроцессорная техника» для студентов направления
12.03.04 «Биотехнические системы и технологии» (профиль «Биотехнические и медицинские аппараты и системы»)
очной формы обучения
Воронеж 2018
УДК 621.38(07) ББК 30я7
Составители: канд. техн. наук Е. И. Новикова, д-р техн. наук, проф. О. В. Родионов
Изучение структуры команд микроконтроллера PIC16C84 на примере расчета подпрограммы задержки: методические указания к выполнению лабораторной работы № 6 по дисциплине «Электроника и микропроцессорная техника» для студентов направления 12.03.04 «Биотехнические системы и технологии» (профиль «Биотехнические и медицинские аппараты и системы») очной формы обучения / ФГБОУ ВО «Воронежский государственный технический университет»; сост.: Е. И. Новикова, О. В. Родионов. – Воронеж : Изд-во ВГТУ, 2018. – 19 с.
Методические указания предназначены для подготовки, выполнения и защиты лабораторной работы № 6 по дисциплине «Электроника и микропроцессорная техника».
Предназначены для студентов 3-го курса направления 12.03.04 «Биотехнические системы и технологии».
Ил. 7. Табл. 1. Библиогр.: 1 назв.
УДК 621.38(07)
ББК 30я7
Рецензент – Е. Н. Коровин, д-р техн. наук, проф. кафедры САУМС ВГТУ
Печатается по решению учебно-методического совета Воронежского государственного технического университета
Лабораторная работа № 6 ИЗУЧЕНИЕ СТРУКТУРЫ КОМАНД МИКРОКОНТРОЛЛЕРА
PIC16C84 НА ПРИМЕРЕ РАСЧЕТА ПОДПРОГРАММЫ ЗАДЕРЖКИ
1.ЦЕЛЬ РАБОТЫ
Целью лабораторной работы является изучение структуры команд микроконтроллера PIC16C84 посредством расчета и создания подпрограммы задержки.
После выполнения лабораторной работы студент должен знать структуру и общий формат команд микроконтроллера PIC16C84, уметь реализовывать посредством предложенного алгоритма подпрограмму задержки.
2.ТЕОРЕТИЧЕСКОЕ ВВЕДЕНИЕ
2.1.Архитектура команд микроконтроллера PIC16С84
Все команды микроконтроллеров PIC16C84 – однословные (14разрядные). Это обеспечивается за счет разделения шин доступа к памяти программ и памяти данных. 14-разрядная шина доступа к памяти программ позволяет выполнить выборку 14-разрядной команды за один машинный цикл микроконтроллера.
|
TCY0 |
TCY1 |
TCY2 |
TCY3 |
TCY4 |
TCY5 |
|
1. MOVLW 55h |
|
|
|
|
|
|
|
Выборка 1 |
Выполн. 1 |
|
|
|
|
|
|
2. MOVWF PORTB |
|
|
|
|
|
|
|
|
Выборка 2 |
Выполн. 2 |
|
|
|
|
|
3. CALL SUB_1 |
|
|
|
|
|
|
|
|
|
Выборка 3 |
Выполн. 3 |
|
|
||
|
|
|
|
|
|
||
4. BSF PORTA,3 (Выполняется NOP) |
|
Выборка 4 |
Удаление |
|
|||
5. Инструкция по адресу SUB_1 |
|
|
|
|
|
|
|
|
|
|
|
Выбор. SUB_1 |
Выполн. SUB_1 |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Выбор. SUB_1+1 |
|
|
|
|
|
|
|
|
Рис. 1. Выборка и выполнение команд
Во всех микроконтроллерах PIC среднего семейства входной тактовый сигнал внутренней схемой микроконтроллера разделяется на четыре последовательных неперекрывающихся такта Q1, Q2, Q3 и Q4. Совокупность четырех тактов называется машинным циклом.
3
Обработка команды состоит из двух этапов:
1)выборка из памяти;
2)выполнение команды.
Она осуществляется за четыре такта Q1, Q2, Q3 и Q4. Выборка следующей команды и выполнение текущей совмещены по времени. Таким образом, выполнение команды происходит за один машинный цикл. Такой подход называется конвейерной обработкой команд.
Если команда изменяет счетчик команд PC (команды ветвления, например GOTO), то необходимо два машинных цикла для выполнения команды (рис. 1). В такте Q1 цикл выборки начинается с увеличения программного счетчика, а в цикле выполнения выбранная команда защелкивается в регистр команд. В течение тактов Q2, Q3 и Q4 происходит декодирование и выполнение команды. В такте Q3 – считывается память данных (чтение операнда), а запись происходит в такте Q4.
На рис. 1 показаны две стадии конвейерной обработки команд для представленной последовательности. В цикле TCY0 происходит выборка первой команды из памяти программ. В цикле TCY1 первая команда исполняется, а вторая команда выбирается из памяти программ. В течение цикла TCY2 вторая команда исполняется, а третья выбирается из памяти программ. В цикле TCY3 происходит выборка четвертой команды и выполняется команда третья команда (CALL SUB_1). Когда завершается выполнение третьей команды CPU загружает адрес четвертой команды в вершину стека и изменяет счетчик команд PC на адрес SUB_1. Это означает, что команда, загруженная в цикле TCY3, должна быть удалена из конвейера. В течение цикла TCY4 четвертая команда удаляется из конвейера (выполняется пустой цикл – NOP) и происходит выборка команды по адресу SUB_1. В цикле TCY5 выполняется команда пять и выбирается из памяти программ команда с адресом SUB_1+1.
Таким образом, цикл выполнения команды (рис. 2) состоит из четырех тактов Q1–Q4, в каждом из которых производятся различные, заранее определенные действия:
Q1 – выборка определенной команды из памяти программ и
еедекодирование или вынужденный NOP,
Q2 – выборка данных или NOP,
Q3 – выполнение команды и обработка данных,
Q4 – запись данных или NOP.
4
Рис. 2. Временная диаграмма циклов выполнения команд
2.2.Создание подпрограммы задержки
2.2.1.Тестовый пример
Вкачестве тестового примера рассмотрим простейшую программу, которая с частотой 1 Гц будет переключать выходную линию из логического нуля в логическую единицу. Алгоритм ее работы получится следующий. По включению контроллера программа выставит единицу на выходную линию, затем подождет 0,5 с, выставит нуль, опять подождет 0,5 с, а затем повторит все заново. Программа написана для микроконтроллера PIC16С84. Используемый генератор работает с частотой 32768 Гц. Изменяться будет состояние регистра ли-
нии RB0.
Программа начинается с секции заголовка, в которой при помощи директивы EQU осуществляется сопоставление символьного имени с его числовым значением. Отличие этого примера от предыдущего заключается в том, что в нем не производится описание регистров специального назначения. Так как в MPLAB уже включены файлы с описаниями этих регистров для каждой разновидности PIC контроллера. Эти файлы необходимо только подключить к основной программе директивой #include.
Кроме регистров специального назначения в программе используются и регистры общего назначения. Они описываются самостоятельно. Это можно делать как в предшествующем примере посред-
5
ством директивы EQU, присвоив каждому символьному названию свой адрес. Однако это несколько громоздко. Проще воспользоваться директивами cblock и endc. Эти директивы позволяют задать один начальный адрес, а ассемблер сам присвоит числовые значения заданным именам по возрастанию.
Так в примере используются два регистра – счетчика времени при формировании задержки на 0,5 с, имеющих название CounterLo и CounterHi.
Таким образом, программа будет иметь следующий вид:
#include p16С84a.inc |
;Подключение файла с описаниями |
|
;регистров специального назначения |
;Определение используемых в программе регистров |
|
;общего назначения: |
|
cblock 0x0C |
|
CounterLo |
;младший байт счетчика в подпрограмме |
|
;задержки |
CounterHi |
;старший байт счетчика в подпрограмме |
|
;задержки |
endc |
|
0x0C – это адрес нулевой ячейки регистров общего назначения. После ассемблирования строке CounterLo будет присвоен адрес 0x0C,
а строке CounterHi – адрес 0x0D.
Следующие строки посредством той же директивы EQU задают константы, используемые в примере.
INIT_PORTA |
EQU |
b'00000000' |
INIT_PORTB |
EQU |
b'00000000' |
INIT_OPTION |
EQU |
b'00000000' |
INIT_INTCON |
EQU |
b'00000000' |
DELAYLO EQU |
.79 |
|
DELAYHI EQU |
.21 |
|
Первые четыре константы будут использоваться при инициализации соответствующих регистров. Так как они предназначены для инициализации отдельных битов, то их удобно задавать в двоичном формате в виде b’x… x’. Следующие две – в подпрограмме задержки.
6
Они заданы в десятичном формате, который обозначается точкой. Если вместо «.21» написать «21», то ассемблер воспримет это как шестнадцатеричный формат, который установлен по умолчанию.
За секцией заголовка следует рабочая секция, в которой располагаются подпрограммы инициализации, формирования задержки, а также основное тело программы.
Подпрограмма инициализации имеет следующий вид:
Init |
|
bsf |
STATUS,RP0 |
movlw |
INIT_PORTA |
movwf |
TRISA |
movlw |
INIT_PORTB |
movwf |
TRISB |
movlw |
INIT_OPTION |
movwf |
OPTION_REG |
bcf |
STATUS,RP0 |
movlw |
INIT_INTCON |
movwf |
INTCON |
clrf |
STATUS |
Return |
|
При входе в подпрограмму производится выбор первого банка данных ОЗУ установкой бита RP0. Далее производится выбор направления линий ввода/вывода. Так как у контроллера задействована всего одна линия на выход, то во все регистры TRIS записываются нули, то есть линии будут выходами. Далее в регистры OPTION и INTCON записываются нули, так как таймер, сторожевой таймер и прерывания в программе не используются. После этого производится обнуление всех битов регистра STATUS, что вызывает переключение на нулевой банк ОЗУ.
Следующая подпрограмма реализует задержку, о которой говорилось выше.
Delay05 |
|
;Инициализация регистров счетчика: |
movlw |
DELAYLO |
;Младший байт |
movwf |
CounterLo |
; |
7
movlw |
DELAYHI |
;Старший байт |
movwf |
CounterHi |
; |
Del05 |
|
|
decfsz |
CounterLo,1 |
;Декремент младшего байта счетчика. |
|
|
;Выполняется до тех пор, |
goto |
Del05 |
;пока он не станет равным нулю, после |
|
|
;чего декрементируется |
decfsz |
CounterHi,1 |
;старший байт |
goto |
Del05 |
; |
Return |
|
;После того как оба байта станут |
|
|
;равными нулю, выход. |
Работа подпрограммы начинается с инициализации двух ранее определенных регистров общего назначения, которые будут использованы в качестве младшего и старшего байтов счетчика. Команда movlw DELAYLO записывает в регистр W константу DELAYLO. Затем из него значение передается в регистр CounterLo. Аналогичные действия производятся с константой DELAYHI и регистром CounterHi. После того как были заданы начальные значения младшего и старшего байтов счетчика, посредством декремента регистра CounterLo и CounterHi формируется задержка. Сначала производится декремент регистра CounterLo до тех пор, пока он не станет равным нулю, после чего команда goto Del05 пропускается и декрементируется старший байт счетчика CounterHi. После этого программа переходит на метку Del05 и цикл повторяется.
Примечание. После того как регистр CounterLo обнулится в результате следующего декремента, его значение станет равным 255. И подпрограмма будет выполняться в той же последовательности.
Когда оба байта станут равными нулю, произойдет возврат в основное тело программы.
Begin |
|
call |
Init |
bsf |
PORTB,0 |
call |
Delay05 |
bcf |
PORTB,0 |
cal |
Delay05 |
goto |
Begin |
End |
|
8
Ниже приведен полный листинг тестового примера:
#include p16f84a.inc ;Подключение файла с описаниями ;регистров специального назначения
;Определение используемых в программе регистров общего ;назначения:
cblock 0x0C
CounterLo ;младший байт счетчика в подпрограмме ;(ПП) задержки
CounterHi ;старший байт счетчика в ПП задержки endc
;Константы инициализации регистров специального назначения:
INIT_PORTA |
EQU |
b'00000000' |
;Все линии на выход |
INIT_PORTB |
EQU |
b'00000000' |
;Все линии на выход |
INIT_OPTION |
EQU |
b'00000000' |
;Константа для |
;инициализации регистра OPTION. |
|
||
;Т. к. таймер, сторожевой таймер не используются, то в него |
|||
;можно просто записать 0 |
|
||
INIT_INTCON |
EQU |
b'00000000' |
;Прерывания запрещены |
;Константы для ПП задержки на 0,5 с: |
|||
DELAYLO |
EQU |
.79 |
; |
DELAYHI |
EQU |
.6 |
; |
;Далее начинается исполняемый код программы: |
|||
|
goto |
Begin |
;Переход на начало |
int_point |
org |
0x04 |
;Вектор прерывания |
;ПП задержки на 0,5 с.
Delay05
;Инициализация регистров счетчика:
movlw DELAYLO ;Младший байт movwf CounterLo ;
9