Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЦМПУ / Новая папка / Лаб3ЦМПУ.docx
Скачиваний:
17
Добавлен:
16.04.2015
Размер:
325.85 Кб
Скачать

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

Соседние файлы в папке Новая папка