Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЦМПУ / Новая папка (1) / ЦИМПУ(atmega 128).doc
Скачиваний:
123
Добавлен:
16.04.2015
Размер:
4.2 Mб
Скачать

3.2.3 Команды пересылки данных

Команды этой группы предназначены для пересылки содержимого ячеек, находящихся в адресном пространстве памяти данных. Разделение адресного пространства на три части (РОН, РВВ, ОЗУ) предопределило разнообразие команд этой группы. Пересылка данных, выполняемая командами группы, может производиться в следующих направлениях:

  • РОН  РОН;

  • РОН  РВВ;

  • РОН  память данных (3 вида адресации).

Также к данной группе можно отнести стековые команды PUSH и POP, позволяющие сохранить в стеке и восстанавливать из стека содержимое РОН.

На выполнение команд данной группы требуется от одного до трех машинных циклов в зависимости от команды.

Mov Rd,Rr(пересылка между рон) – копирует содержимое регистра Rrв регистр Rd. Регистр-источник Rrне изменяется.

MOVW Rd,Rr - пересылка двухбайтных значений.

LDI Rd,K (загрузка константы в РОН) – загружает 8-разрядное число в регистр общего назначения Rd. Данная команда применима только к старшей половине РОН (адреса 16…31).

LD Rd,X (косвенное чтение памяти данных) – загружает один байт из адресного пространства памяти данных в регистр общего назначения Rd. Адрес ячейки памяти, к которой производится обращение, содержится в индексном регистре Х.

LDD Rd,Y+q(косвенное относительное чтение памяти данных) - загружает один байт из адресного пространства памяти данных в регистр общего назначения Rd. Адрес ячейки памяти, к которой производится обращение, получается суммированием содержимого индексного регистраYи константыq. Содержимое индексного регистра не изменятся.

LDS Rd,k (загрузка из памяти данных) - загружает один байт из адресного пространства памяти данных в регистр общего назначения Rd. Адрес ячейки памяти, к которой производится обращение, задается константой k.

ST X,Rr (косвенная запись в память данных) – сохраняет содержимое регистра общего назначения Rr в памяти данных. Адрес ячейки памяти, к которой производится обращение, содержится в индексном регистре Х.

STD Y+q,Rr (косвенная относительная запись в память данных) - сохраняет содержимое регистра общего назначения Rr в памяти данных. Адрес ячейки памяти, к которой производится обращение, получается суммированием содержимого индексного регистраYи константыq. Содержимое индексного регистра не изменятся.

STS k,Rr (запись в память данных) - сохраняет содержимое регистра общего назначения Rr в памяти данных. Адрес ячейки памяти, к которой производится обращение, задается константой k.

SPM – запись в память программ.

LPM (загрузка данных из памяти программ) - загружает один байт из адресного пространства памяти данных в регистр общего назначения R0. Адрес ячейки памяти, к которой производится обращение, содержится в индексном регистре Z.

IN Rd,A – Пересылка из РВВ в РОН.

OUT A,Rd – Пересылка из РОН в РВВ.

PUSH Rr – Сохранение байта в стеке.

POP Rd – Извлечение байта из стека.

RdРегистр приемник.

RrРегистр источник.

3.2.4 Команды передачи управления

В эту группу входят команды перехода, вызова подпрограмм и возврата из них и команды типа “проверка/пропуск”, пропускающие следующую за ними команду при выполнении некоторого условия. Также к этой группе относятся команды сравнения, формирующие флаги регистра SREG и предназначенные, как правило, для работы совместно с командами условного перехода.

Команды проверки и перехода

CP Rd,Rr (сравнение РОН) – сравнивает содержимое двух регистров общего назначение путем вычитания содержимого Rr из содержимого Rd. Данная команда влияет только на флаги регистра состояния SREG, которые устанавливаются в соответствии с результатом вычитания. Содержимое регистров не изменятся. Как правило, данная команда используется совместно с одной из команд условного перехода.

CPC Rd,Rr (сравнение РОН с учетом переноса) - сравнивает содержимое двух регистров общего назначение путем вычитания содержимого Rr и флага переноса (С) из содержимого Rd. Данная команда влияет только на флаги регистра состояния SREG, которые устанавливаются в соответствии с результатом вычитания. Содержимое регистров не изменятся. Как правило, данная команда используется совместно с одной из команд условного перехода.

CPI Rd,K (сравнение содержимого РОН с константой) - сравнивает содержимое регистра общего назначение Rd с константой К путем вычитания константы из содержимого Rd. Данная команда влияет только на флаги регистра состояния SREG, которые устанавливаются в соответствии с результатом вычитания. Содержимое регистра Rd не изменятся. Как правило, данная команда используется совместно с одной из команд условного перехода.

CPSE Rd,Rr (пропуск команды при равенстве двух РОН) - сравнивает содержимое двух регистров общего назначения Rr и Rd и пропускает следующую команду, если в регистрах записаны одинаковые значения.

SBRC Rr,b (пропустить команду, если разряд РОН сброшен) – проверяет состояние разряда b регистра общего назначения Rr. Если разряд сброшен, команда, следующая за SBRC Rr,b, пропускается.

SBRS Rr,b (пропустить команду, если разряд РОН установлен) - проверяет состояние разряда b регистра общего назначения Rr. Если разряд установлен, команда, следующая за SBRC Rr,b, пропускается.

BRBC s,k (переход, если разряд регистра SREG сброшен) – условный относительный переход. Проверяет заданный разряд регистра SREG и выполняет переход, если этот разряд сброшен. Величина смещения k представляется числом в дополнительном коде.

BRBS s,k (переход, если разряд регистра SREG установлен) - условный относительный переход. Проверяет заданный разряд регистра SREG и выполняет переход, если этот разряд установлен. Величина смещения k представляется числом в дополнительном коде.

BRCS k (переход по переносу) - условный относительный переход. Проверяет флаг переноса (С) и выполняет переход, если этот разряд установлен. Величина смещения k представляется числом в дополнительном коде. Эквивалентна команде BRBS 0,k.

BRCC k (переход, если не было переноса) - условный относительный переход. Проверяет флаг переноса (С) и выполняет переход, если этот разряд сброшен. Величина смещения k представляется числом в дополнительном коде. Эквивалентна команде BRBС 0,k.

Здесь были приведены некоторые команды условных переходов. Действие остальных команд аналогично приведенным, только ставятся другие условия (содержимое флагов регистра статутса SREG, содержимое разряда регистра ввода/вывода и т.д.).

Организация условных переходов в микроконтроллере осуществляется с помощью регистра статуса SREG. Регистр статуса SREG имеет восемь разрядов, каждый из которых устанавливается по определенному правилу в соответствии с выполнением микроконтроллером последней команды. Этими разрядами являются:

1. Флаг I: Флаг общего разрешение прерываний. Для разрешения прерываний этот бит должен быть установлен в единицу. Управление отдельными прерываниями производится регистрами маски прерываний - EIMSK и TIMSK. Если флаг сброшен (0), независимо от состояния EIMSK/TIMSK прерывания запрещены. Флаг I очищается аппаратно после входа в прерывание и восстанавливается командой RETI, для разрешения обработки последующих прерываний.

2. Флаг T: Пользовательский флаг. Команды копирования битов BLD (Bit LoaD) и BST (Bit STore) используют этот флаг как источник и приемник обрабатываемого бита. Бит из регистра регистрового файла может быть скопирован в T командой BST, значение флага T может быть скопировано в бит регистрового файла командой BLD.

3. Флаг H: Флаг половинного переноса. Этот флаг индицирует перенос из младшей половины байта при некоторых арифметических операциях.

4. Флаг S: Флаг знака, S = N XOR V. Флаг S всегда равен исключающему ИЛИ между флагами N (отрицательный результат) и V (переполнение дополнения до двух).

5. Флаг V: Флаг переполнения дополнения до двух. Этот флаг поддерживает арифметику с дополнением до двух.

6. Флаг N: Флаг отрицательного результата. Этот флаг индицирует отрицательный результат различных арифметических и логических операций.

7. Флаг Z: Флаг нулевого результата. Этот флаг индицирует нулевой результат различных арифметических и логических операций.

8. Флаг C: Флаг переноса. Этот флаг индицирует перенос в арифметических и логических операциях.

JMP k (абсолютный безусловный переход ) – инструкция абсолютного перехода JMP на метку процедуры обработки сброса. Если в программе не используются источники прерывания, то векторы прерываний не используются, а зарезервированные под них ячейки памяти могут использоваться для равномерного расположения кода программы. Имеется также случай, когда вектор сброса расположен в секции прикладной программы, а векторы прерываний находятся в загрузочном секторе или наоборот

RJMP k (относительный безусловный переход) – команда относительного безусловного перехода. Выполняет переход по адресу, равному сумме содержимого счетчика команд и константе k. На практике вместо числовых значений смещения используется метка.

IJMP (косвенный переход) – косвенный безусловный переход. Выполняет переход по адресу, находящемуся в регистре Z.

Команды связи с подпрограммой

Учитывая ограниченные возможности памяти микроконтроллера при разработке программ, нужно стараться сделать их как можно короче. С этой целью часть программы, которая неоднократно повторяется, или программа, которая часто используется, могут быть оформлены в виде подпрограмм – последовательностей команд, выполнение которых может быть вызвано из любого места программы любое количество раз. Процесс передачи управления к подпрограмме называется вызовом.

Команды вызова подпрограммы (RCALL,CALL,ICALL) работают практически так же, как и команды безусловного перехода. Отличие заключается в том, что перед тем как выполнить переход, значение счетчика команд сохраняется в стеке. Кроме того, подпрограмма должна заканчиваться командой RET, как показано в следующем примере:

rcall SP_TEST ;вызов подпрограммы “SP_TEST”

… ;текст основной программы

SP_TEST push r2 ;метка подпрограммы, сохранить r2 в стеке

… ;выполнение подпрограммы

pop r2 ;восстановить r2 из стека

ret ;возврат из подпрограммы

RCALL k (относительный вызов подпрограммы) – выполняет переход к подпрограмме, адрес которой получается сложением счетчика команд с константой k. Адрес следующей за RCALL команды (2 байта) сохраняется в стеке. На практике вместо числовых значений смещения используется метка.

ICALL (косвенный вызов подпрограммы) - выполняет переход к подпрограмме, адрес которой находится в регистре Z. Адрес следующей за ICALL команды (2 байта) сохраняется в стеке.

CALL – (длинный вызов подпрограммы)-Выполняет вызов подпрограммы из памяти программ. Адрес возврата (к команде после CALL) сохраняется в стеке. (См. также RCALL). Пример: mov r16, r0 ; Копировать r0 в r16 call check ; Вызвать подпрограмму nop ; Продолжать (пустая операция) . . . check: cpi r16, $42 ; Проверить содержит ли r16 заданное значение breq error ; Перейти если содержит ret ; Вернуться из подпрограммы . . . error: rjmp error ; Бесконечная петля

RET (возврат из подпрограммы) – выполняет возврат в то место, откуда подпрограмма была вызвана.

RETI (возврат из подпрограммы обработки прерывания) - выполняет возврат в то место, в котором выполнение программы a было прервано в результате возникновения прерывания.

Обратите внимание, что контекст программы (регистр состояния SREG) не сохраняется при вызове подпрограммы обработки прерывания и, соответственно, не восстанавливается при выходе из нее. В связи с этим сохранение и восстановление этого регистра необходимо выполнять самостоятельно.

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

Описание алгоритма программы (рис. 3.9)

Далее предложен пример программы организации работы команд пересылки и передачи управления. Программа состоит из основной программы и подпрограммы, которая вызывается из основной. В начале основной программы регистрам присваиваются символьные имена, инициализируется стек, регистры загружаются числовыми значениями и пересылаются в оперативную память МК. Далее последовательно расположены три цикла. Выход из каждого цикла последует после равенства двух переменных, одна из которых убывает до значения второй. В подпрограмме применяются команды сохранения регистра общего назначения r16 (temp0) и состояния SREG. До выхода из подпрограммы эти регистры снова загружаются первоначальными значениями. После подпрограммы цикл выполнения программы повторяется.

На рисунке 3.9 алгоритм программы организации работы команд пересылки и передачи управления

Рис. 3.9 - алгоритм программы

Листинг программы №3

; BASIC .ASM template file for AVR

; ******************************************************

; Define here the variables

;

.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 ;Выход из подпрограммы

Команды:

BRNE - переход если неравно

PUSH - записать в стек

POP - прочитать из стека.

Листинг проектного файла №3

.MICRO "ATmega128" ; Указание типа микроконтроллера ;(ATmega128)

.PROGRAM " Project3.asm" ; Ассемблируемый файл

.TARGET " Project3.hex" ; Файл машинного кода

.TRACE ; Включение трассировки

.POWER VDD=5 VSS=0 ; Задание напряжения питания 5 В

.CLOCK 4meg ; Задание тактовой частоты работы ;микроконтроллера

.STORE 250m ; Время регенерации сигнала осциллографа

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