12 Лабораторная работа №3 «Изучение простейших операций микроконтроллера»
Цель работы: Изучить выполнение микроконтроллером простейших операций пересылки и передачи управления.
Пример программы
Описание алгоритма программы (рис)
Далее предложен пример программы организации работы команд пересылки и передачи управления. Программа состоит из основной программы и подпрограммы, которая вызывается из основной. В начале основной программы регистрам присваиваются символьные имена, инициализируется стек, регистры загружаются числовыми значениями и пересылаются в оперативную память МК. Далее последовательно расположены три цикла. Выход из каждого цикла последует после равенства двух переменных, одна из которых убывает до значения второй. В подпрограмме применяются команды сохранения регистра общего назначения r16 (temp0) и состояния SREG. До выхода из подпрограммы эти регистры снова загружаются первоначальными значениями. После подпрограммы цикл выполнения программы повторяется.
На рисунке алгоритм программы организации работы команд пересылки и передачи управления.
Листинг программы
.include "C:\VMLAB\include\m128def.inc""; определение библиотеки МК ;ATmega128, при условии расположения программы VMLAB на ;локальном диске С
;Основная программа
;Запись символьных имен
.DEF temp0=r16
.DEF temp1=r17
.DEF temp2=r18
reset: ; начальная метка
rjmp start; Переход на начало основной программы
reti ; Addr $01
reti ; Addr $02
reti ; Addr $03 Вектора прерываний МК ATmega128.
reti ; Addr $04 Приведены вектора с адреса $01 по адрес $10.
reti ; Addr $05 Полностью вектора прерываний представлены
reti ; Addr $06 в приложении с назначением прерываний
reti ; Addr $07 (внешних и внутренних).
reti ; Addr $08
reti ; Addr $09
reti ; Addr $0A
reti ; Addr $0B
reti ; Addr $0C
reti ; Addr $0D
reti ; Addr $0E
reti ; Addr $0F
reti ; Addr $10
start: ldi r16,$DF ;Инициализация стека (старший байт)
out SPH,temp0
ldi temp0,$11 ;Загрузить переменные значениями
ldi temp1,$18
ldi temp2,$0A
sts $60,temp1 ;Записать переменные в память по адресу $60
sts $61,temp2
M1: dec temp1 ;Декремент temp1
cp temp0,temp1 ;Если temp0 не равно temp1, то
brne M1 ;перейти на метку М1
lds temp1,$60 ;Загрузить данные из памяти с адресом $60
M2: dec temp1 ;Декремент temp1
cp temp0,temp1 ;Если temp0 не равно temp1, то
brbc $1,M2 ;перейти на метку М2
lds temp1,$60 ;Загрузить данные из памяти с адресом $60
M3: dec temp1 ;Декремент temp1
cpi temp1,$11 ;Если temp1 не равно $11, то
brne M3 ;перейти на метку М3
rcall Load ;Вызвать подпрограмму Load
rjmp M1 ;Перейти на метку M1
;Подпрограмма
Load: push temp0 ;Поместить temp0 в стек
In temp0,sreg ;Загрузить sreg в temp0
lds temp1,$60 ;Загрузить данные из памяти с адресом $60
lds temp2,$61
sub temp2,temp1 ;Вычесть temp1 из temp2
out SREG,temp0 ;Выгрузить temp0 в SREG
pop temp0 ;Загрузить temp0 из стека
reti ;Выход из подпрограммы
Листинг проектного файла
.MICRO "ATmega128" ; Указание типа микроконтроллера ;(ATmega128)
.PROGRAM " Project3.asm" ; Ассемблируемый файл
.TARGET " Project3.hex" ; Файл машинного кода
.TRACE ; Включение трассировки
.POWER VDD=5 VSS=0 ; Задание напряжения питания 5 В
.CLOCK 4meg ; Задание тактовой частоты работы ;микроконтроллера
.STORE 250m ; Время регенерации сигнала осциллографа
Команды:
LDI Rd,K (загрузка константы в РОН) – загружает 8-разрядное число в регистр общего назначения Rd. Данная команда применима только к старшей половине РОН (адреса 16…31).
OUT A,Rd – Пересылка из РОН в РВВ.
STS k,Rr (запись в память данных) - сохраняет содержимое регистра общего назначения Rr в памяти данных. Адрес ячейки памяти, к которой производится обращение, задается константой k.
DEC A – уменьшение на единицу, переменная А.
CP Rd,Rr (сравнение РОН) – сравнивает содержимое двух регистров общего назначение путем вычитания содержимого Rr из содержимого Rd. Данная команда влияет только на флаги регистра состояния SREG, которые устанавливаются в соответствии с результатом вычитания. Содержимое регистров не изменятся. Как правило, данная команда используется совместно с одной из команд условного перехода.
BRNE - переход если неравно на метку М1.
LDS Rd,k (загрузка из памяти данных) - загружает один байт из адресного пространства памяти данных в регистр общего назначения Rd. Адрес ячейки памяти, к которой производится обращение, задается константой k.
BRBC s,k (переход, если разряд регистра SREG сброшен) – условный относительный переход. Проверяет заданный разряд регистра SREG и выполняет переход, если этот разряд сброшен. Величина смещения k представляется числом в дополнительном коде.
CPI Rd,K (сравнение содержимого РОН с константой) - сравнивает содержимое регистра общего назначение Rd с константой К путем вычитания константы из содержимого Rd. Данная команда влияет только на флаги регистра состояния SREG, которые устанавливаются в соответствии с результатом вычитания. Содержимое регистра Rd не изменятся. Как правило, данная команда используется совместно с одной из команд условного перехода.
RCALL k (относительный вызов подпрограммы) – выполняет переход к подпрограмме, адрес которой получается сложением счетчика команд с константой k. Адрес следующей за RCALL команды (2 байта) сохраняется в стеке. На практике вместо числовых значений смещения используется метка.
RJMP k (относительный безусловный переход) – команда относительного безусловного перехода. Выполняет переход по адресу, равному сумме содержимого счетчика команд и константе k. На практике вместо числовых значений смещения используется метка.
PUSH - записать в стек
POP - прочитать из стека.
IN Rd,A – Пересылка из РВВ в РОН.
SUB temp2,temp1 - вычесть temp1 из temp2.
RETI (возврат из подпрограммы обработки прерывания) - выполняет возврат в то место, в котором выполнение программы a было прервано в результате возникновения прерывания.
Рис. - алгоритм программы
Выполнение программы:
Варианты индивидуальных заданий
№ вар. |
Задание |
1 |
Просканировать число $13 от старшего к младшему биту в поисках первого бита, установленного в 1. Если таковой обнаружится, то занести номер бита в регистр r18. |
Описание алгоритма программы.
Далее предложена программа организации работы сканирования восьмибитного числа побитно от старшего к младшему. Сканирование происходит постепенно не в цикле. Сканирование каждого бита происходит отдельно при помощи команды SBRC. В начале программы регистрам присваиваются символьные имена, регистры загружаются числовыми значениями. Потом через команду SBRC, которая проверяет состояние разряда. Если в разряде 0, следующая команда пропустится. Если в разряде 1,
посчитается положение 1.
Начало
Подключение файла m128def.inc
.include "C:\VMLAB\include\m128def.inc"
Присвоение символьных имён регистрам
.def temp0 = r16
.def temp2 = r18
Загрузить temp0, temp2 значениями
ldi temp0,$13
ldi temp2,$01
Проверяет состояние разряда. Если в разряде 0, след команда пропустится. Если в разряде 1,посчитается место
SBRC temp0, 7
inc temp2
…..
SBRC temp0, 0
inc temp2
.
Конец
temp1=temp1-1