Устройства ввода/вывода ATmega8535
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Введение

Любые устройства, в том числе и устройства связи, радиоавтоматики или аудиовизуальной аппаратуры требуют присутствия в своем составе устройства управления (контроллера). Контроллеры требуются практически во всех предметах и устройствах, которые окружают нас

Одним распространёнными в настоящее время являются микроконтроллеры фирмы Atmel семейства AVR. Несмотря на то, что они появились на рынке в 1996 году, их популярность до сих пор очень высока. С каждым годом они захватывают все новые и новые ниши на рынке. Не последнюю роль в этом играет соотношение показателей цена/быстродействие/энергопотребление, до сих пор являющееся едва ли не лучшим на рынке 8-битных микроконтроллеров.

 

  1. Описание и характерные особенности микроконтроллеров ATmega 8535

Как и все микроконтроллеры AVR фирмы «Atmel», микроконтроллеры семейства Mega, а в частности ATmega 8535 являются 8-разрядными микроконтроллерами, предназначенными для встраиваемых приложений. Они изготавливаются по малопотребляющей КМОП-технологии, которая в сочетании с усовершенствованной RISC - архитектурой[1] позволяет достичь наилучшего соотношения быстродействие/энергопотребление. Контроллеры описываемого семейства являются наиболее развитыми представителями микроконтроллеров AVR.

К некоторым особенностям микроконтроллера ATmega8535 относятся:

- FLASH-память программ объемом 8 Кбайт с возможностью внутрисистемного перепрограммирования и загрузки через последовательный канал SPI (число циклов стирания/записи не менее 1000);

- оперативная память (статическое ОЗУ) объемом 512 байт;

- энергонезависимая память данных (EEPROM) объем 512 байт с возможностью внутрисистемного перепрограммирования и загрузки через последовательный канал SPI (число циклов стирания/записи не мене 100000);

- возможность защиты от чтения и модификации памяти программ и данных;

- возможность программирования непосредственно в системе через последовательные интерфейсы SPI и JTAG;

- возможность программного снижения частоты тактового генератора;

- 130 команд, большинство из которых выполняются за один машинный цикл;

- 17 внутренних+3 внешних источников прерываний;

- наличие программного стека;

- наличие аппаратного умножителя;

- 32 8-битных регистра общего назначения (далее РОН);

- 32 программируемые линии ввода/вывода;

- диапазон напряжений питания от 4,5 В до 5,5 В;

- производительность до 8 MIPS при частоте 8 МГц и т.д.   

 

Система команд микроконтроллера

Система команд микроконтроллера A Tmega 8535 весьма развита и насчитывает 130 различных инструкций. Большинство команд занимает только 1 ячейку памяти (16 бит) и выполняется за 1 такт [4].

Всё множество команд микроконтроллера можно разбить на несколько групп:

- команды логических операций;

- команды арифметических операций и команды сдвига;

- команды операций с битами;

- команды пересылки данных;

- команды передачи управления;

- команды управления системой.

Управление периферийными устройствами осуществляется через адресное пространство данных. Для удобства существуют «сокращённые команды» IN/OUT.

В системе команд микроконтроллера A Tmega 8535 используется обозначения, приведенные в таблице 1

Таблица 1. Обозначения

Обозначение Описание

Регистры и операнды

Rd Регистр назначения (и источник) в регистровом файле Rr Регистр источник в регистровом файле R Результат выполнения команды K Литерал или байт данных (8 бит) k Данные адреса константы для счетчика программ b Бит в регистровом файле или I/O регистр (3 бита) s Бит в регистре статуса (3 бита) X, Y, Z Регистр косвенной адресации (X=R27:R26, Y=R29:R28, Z=R31:R30) P Адрес I/O порта q Смещение при прямой адресации (6 бит)

Стек

STACK : Стек для адреса возврата и опущенных в стек регистров SP : Указатель стека

Регистр статуса (SREG)

SREG : Регистр статуса C : Флаг переноса Z : Флаг нулевого значения N : Флаг отрицательного значения V : Флаг-указатель переполнения дополнения до двух S : Флаг знака H : Флаг полупереноса T : Флаг пересылки, используемый командами BLD и BST I : Флаг разрешения/запрещения глобального прерывания

I/O регистры

RAMPX, RAMPY, RAMPZ : Регистры связанные с X, Y и Z регистрами, обеспечивающие косвенную адресацию всей области СОЗУ микроконтроллера с объемом СОЗУ более 64 Кбайт

 

Полный список и описание всех арифметических, логических команд, команд пересылки данных и команды переходов приведены в приложении 1. Подробно рассмотрим некоторые команды.

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

Команда MOV

Синтаксис: MOV Rd,Rr

0 < d < 31, 0 < r < 31.

 

Команда копирует содержимое регистра Rr в регистр Rd. Исходный регистр Rr остается неизменным, в регистр назначения Rd загружается копия содержимого регистра Rr.

 

Пример

MOV r1,r2 ; скопировать содержимое r2 в r1

 

Команда LDI

Синтаксис: LDI Rd, K

16 < d < 31, 0 < K < 255

 

Команда LDI загружает 8-разрядную константу в регистр Rd.

 

Пример:

 

LDI r30,$12 ; загрузить константу $12 в r30

 

Команда LD

Синтаксис: LD Rd,X

         LD Rd ,X+

            LDD Rd,-X

0 < d < 31

 

Загружает косвенно один байт из СОЗУ в регистр. Положение байта в СОЗУ указывается 16-разрядным регистром-указателем X в регистровом файле. Обращение к памяти ограничено текущей страницей объемом 64 Кбайта. Регистр-указатель X может остаться неизменным после выполнения команды, но может быть инкрементирован или декрементирован. Использование регистра-указателя X обеспечивает удобную возможность обращения к матрицам, таблицам, указателю стека.

 

Пример:

 

CLR r27      ;Очистить старший байт X

LDI r26, $20 ;Установить $20 в младший байт X

LD r0, X+ ;Загрузить в r0 содержимое SRAM по адресу ;$20 (X постинкрементируется)

LD r1, X ;Загрузить в r1 содержимое SRAM по адресу ;$21

LDI r26, $23 ;Установить $23 в младший байт X

LD r2, X   ;Загрузить в r2 содержимое SRAM по адресу ;$23

LD r3, -X   ;Загрузить в r3 содержимое SRAM по адресу ;$22 (X преддекрементируется)

 

Команда LDS

Синтаксис:LDS Rd,k

0 < d < 31,0 < k < 65535

Выполняется загрузка одного байта из СОЗУ в регистр. Можно использовать 16-разрядный адрес. Обращение к памяти ограничено текущей страницей СОЗУ объемом 64 Кбайта. Команда LDS использует для обращения к памяти выше 64 Кбайт регистр RAMPZ.

           

Пример:

 

LDS r2, $FF00   ; Загрузить r2 содержимым 

;SRAM по адресу $FF00

 

Команда STS

Синтаксис:STS k,Rr

0 < r < 31, 0 < k < 65535

 

Команда осуществляет запись одного байта из регистра в СОЗУ. Можно использовать 16- разрядный адрес. Обращение к памяти ограничено текущей страницей СОЗУ объемом 64 Кбайта. Команда STS использует для обращения к памяти выше 64 Кбайт регистр RAMPZ.

Пример:

LDS r2, $1203                   ; Загрузить в r2 содержимое

; SRAM по адресу $1203

ADD r2, r1          ; Сложить r1 с r2

STS $1203, r2                   ; Записать обратно

Команда ST

Синтаксис :  ST X,Rr

ST X+,Rr

ST -X,Rr

0 < d < 31

Команда осуществляет косвенную запись одного байт из регистра в СОЗУ. Положение байта в СОЗУ указывается 16-разрядным регистром-указателем X в регистровом файле. Обращение к памяти ограничено текущей страницей объемом 64 Кбайта. Для обращения к другой странице СОЗУ необходимо изменить регистр RAMPX в I/O области. Регистр-указатель X может остаться неизменным после выполнения команды, но может быть инкрементирован или декрементирован. Эта особенность удобна при использовании регистра-указателя X в качестве указателя стека.

Пример:

CLR r27          ; Очистить старший байт X

LDI r26, $34                    ; Установить $34 в младший байт X

ST X+,r0          ; Сохранить в r0 содержимое SRAM

;по адресу $34 (X ;постинкрементируется)

ST X, r1            ; Сохранить в r1 содержимое

;SRAM по адресу $35

LDI r26, $34         ; Установить $34 в младший байт X

ST r2, X             ; Сохранить в r2 содержимое SRAM

;по адресу $34

SR r3, -X           ; Сохранить в r3 содержимое SRAM

;по адресу $33 (X ;преддекрементируется)

 

Команда PUSH

Синтаксис: PUSH Rr

0 < r <31

 

Команда заносит содержимое регистра Rd в стек.

 

Команда POP

Синтаксис: P OP Rr

0 < r <31

 

Команда загружает из стека байт в регистр Rd.

 

 

Пример:

push r16 ; Сохранить r16 в стеке

push r17 ; Сохранить r17 в стеке

pop  r17 ; Восстановить r17

pop r16 ; Восстановить r16

Арифметические команды

Сложение без переноса ADD ( ADD - Add without Carry )

Синтаксис:  ADD Rd , Rr

 0 < d < 31, 0 < r < 31.

 

Данная команда реализует сложение двух регистров без добавления содержимого флага переноса (С) и размещает результат в регистре назначения Rd. Устанавливает флаги Z , C , N , V .

 

Пример

ADD r1,r2 ; Сложить r2 с r1 (r1=r1+r2)

ADD r28,r28 ; Сложить r28 с самим собой           

 

Сложение с переносом ( ADC )

Синтаксис: ADC Rd , Rr

 0 < d < 31, 0 < r < 31

 

Данная команда осуществляет сложение двух регистров и содержимого флага переноса (С), размещает результат в регистре назначения Rd: Rd <- Rd + Rr + C. Устанавливает флаги Z , C , N , V , H.

Пример:

          ; Сложить R1 : R0 с R3 : R2

ADC r2, r0    ; Сложить младший байт

ADC r3, r1  ; Сложить старший байт с переносом

 

Команда ADIW (Add Immediate to Word)

Синтаксис: ADIW Rdl,K

 dl = {24,26,28,30}, 0 < K<64

Данная команда осуществляет сложение непосредственного значения (0-63) с парой регистров и размещение результата в паре регистров:

Rdh:Rdl <- Rdh:Rdl +К.

Команда работает только с четырьмя верхними парами регистров, удобна для работы с регистрами указателями. Устанавливает флаги Z , C , N , V.

Пример:

adiw r24, $1 ; Сложить $1 с r25:r24

adiw r30, $63 ; Сложить $63 с Z указателем (r31 : r30)

 

Команда SUB

Синтаксис: SUB Rd,Rr

16 < d < 31, 0 < r < 31

 

Команда осуществляет вычитание содержимого регистра-источника Rr из содержимого регистра-приемника Rd, результат помещает в регистре назначения: Rd = Rd Rr. Устанавливает флаги H,V,N,Z,C.

 

Пример:

sub r13, r12 ; Вычесть r12 из r13

 

Команда SUBI

Синтаксис: SUB Rd, K

 16 < d < 31, 0 < K < 255

 

Команда SUB производит вычитание константы из содержимого регистра, размещает результата в регистре назначения. Устанавливает флаги H,V,N,Z,C.

 

Пример:

 

     subi r22, $11 ; Вычесть $11 из r22

 

Команда SBC

Синтаксис: SBC Rd ,Rr

0 < d < 31, 0 < r < 31

 

Команда SBC осуществляет вычитание содержимого регистра-источника и содержимого флага переноса (С) из регистра Rd, результат помещает в регистре назначения Rd. Устанавливает флаги H,V,N,Z,C.

Пример:

                ; Вычесть r1 : r0 из r3 : r2

sub r2, r0 ; Вычесть младший байт

sbc r3, r1 ; Вычесть старший байт с переносом

 

Команда SBCI

Синтаксис: SBCI Rd,K

0 < d < 31, 0 < K < 255

 

Команда осуществляет вычитание константы и содержимого флага переноса (С) из содержимого регистра, размещение результата в регистре назначения Rd. Устанавливает флаги H,V,N,Z,C регистра флагов.

Пример

                   ; Вычесть $2567 из r14 : r15

subi r14, $67   ; Вычесть младший байт

sbci r15, $25 ; Вычесть старший байт с переносом

 

Команда SBIW

Синтаксис: SBIW Rdl,K

dl={24,26,28,30}, 0 < K<63

Команда осуществляет вычитание непосредственного значения (0-63) из пары регистров и размещает результата в паре регистров. Команда работает с четырьмя верхними парами регистров, удобна для работы с регистрами указателями. Устанавливает флаги H,V,N,Z,C регистра флагов.

 

Пример:

 

sbiw r24, $3      ; Вычесть $3 из r25:r24

sbiw r28, $A2  ; Вычесть $A2 из Y указателя (r29 : r28)

 

Команда DEC

Синтаксис: DEC Rd

0 < d < 31

Команда осуществляет вычитание единицы - 1 - из содержимого регистра Rd и размещает результат в регистре назначения Rd. Флаг переноса регистра статуса данной командой не активируется, что позволяет использовать команду DEC использовать при реализации счетчика циклов для вычислений с повышенной точностью. Устанавливает флаги V,N,Z регистра флагов.

 

Пример:

          ldi r16, $09  ; Загрузить константу в r16metka1:   add r3, r4 ; Сложить r4 с r3     dec r16         ; Уменьшить на 1 r16          brne metka1 ; Перейти если r16 <> 0     nop               ; Продолжать (пустая операция)

Команда INC

Синтаксис: INC Rd

 0 < d < 31

Команда увеличения на единицу содержимого регистра Rd и размещения результата в регистре назначения Rd. Устанавливает флаги V,N,Z регистра флагов.

Пример:

     clr r23 ; Очистить r23

metka2: inc r23 ; Увеличить на 1 r23

                   . . .

    cpi r23, $45 ; Сравнить r23 с $45

     brne metka2; Перейти если не равно

     nop     ; Продолжать (пустая операция)

 

Команды умножения

Команда MUL

 

Синтаксис: MUL Rd,Rr

 0 < d < 31,0 < r < 31

 

Команда перемножает две 8-разрядные величины без знаков с получением 16- разрядного результата без знака. Множимое и множитель - два регистра - Rr и Rd, соответственно. Произведение размещается в регистрах R1 (старший байт ) и R0 (младший байт). Следует учесть, что если в качестве множимого и множителя выбрать R0 или R1, то результат заместит прежние значения сразу после выполнения операции. Если в результате команды MUL установлен в единицу бит 15 результата, то флаг C регистра флагов устанавливается в 1.

 

Пример:

 

mul r3, r4     ; Перемножить r3 и r4

mov r3, r1    ; Вернуть результат обратно в r3:r4

mov r4, r0    ; Вернуть результат обратно в r3:r4

 

Команда FMUL

Синтаксис FMUL Rd,Rr

16 ≤d ≤23, 16 ≤ r ≤23

 

Эта команда выполняет знаковое умножение 2х 8ми битных величин и сдвиг результата на 1 бит влево. 16ти разрядный результат помещается в пару регистров: R01 и R00. Причем старший бит результата находится в регистре R01, а младший – в регистре R00.

       Если в результате команды FMUL бит 15 результата до сдвига установлен, то флаг С установлен в 1, иначе флаг С =0. Флаг Z установлен в том случает. если результат равен $0000, иначе флаг Z очищен.

 

Пример: перемножить 2 величины 15d и 33d:

 

       ldi r16,15

       ldi r17,33

       fmul r16,r17

 

Результат:  R00=DE h

               R01=03 h

 

Команды сравнения

Команда TST

Синтаксис: TSR Rd

где 0 < d < 31

 

Команда осуществляет проверку на ноль или минус. При её выполнении производится логическое умножение («И») регистра источника самого на себя и выставляются соответствующие флаги, но сам результат логического умножения никуда не записывается. Устанавливает флаги V,N,Z регистра флагов.

 

 

Пример:

tst r2  ; Выставить флаги нулевого или отрицательного значения по содержимому регистра r2

Команда CP

Синтаксис CP Rd,Rr

0 < d < 31,0 < r < 31.

 

Данная команда выполняет сравнение содержимого двух регистров Rd и Rr путем вычитания Rd-Rr. Содержимое регистров не изменяется. После выполнения данной команды устанавливаются флаги:H,Z,C,V,N,S. Команда CP применяется вместе с командами перехода.

 

Пример:

     cp r4, r19 ; Сравнить r4 с r19               brne noteq ; Перейти если r4 <> r19

 

 Команда CPC

 

Синтаксис CPC Rd,Rr

0 < d < 31, 0 < r < 31

 

Команда выполняет сравнение содержимого двух регистров Rd и Rr и учитывает также перенос предшествующей команды. Сравнение выполняется путем вычитания: Rd-Rr-C. Содержимое регистров не изменяется, а после выполнения устанавливаются флаги: H,Z,C,V,N,S. После этой команды можно выполнять любые условные переходы.

Пример:                ; Сравнить r3 : r2 с r1 : r0

    cp r2, r0 ; Сравнить старший байт

    cpc r3, r1 ; Сравнить младший байт

    brne noteq ; Перейти, если не равно

Команда CPI

Синтаксис CPI Rd, K

16 ≤ d ≤31, 0 < K <255

Команда выполняет сравнение содержимого регистра Rd с константой путем вычитания содержимого Rd-K. Содержимое регистра не изменяется, устанавливаются флаги: H,Z,C,V,N,S. После этой команды можно выполнять любые условные переходы.

Пример:

          cpi r12, 15 ; Сравнить r12 с 15       brne error ; Перейти если r12 <> 15

Логические команда

Команда AND

Синтаксис: AND Rd, Rr

где 0 < d < 31, 0 < r < 31

 

Команда межрегистрового логического «И». Иначе: команда межрегистрового логического умножения, где логическое «да» наступает только в случае единогласного «да», а логическое «нет», соответственно, во всех остальных случаях (см. таблицу 1).

Таблица 1.

Пример:

and r2, r0  ; Логически перемножить содержимое ;регистров r2 и r0

and r20, r30  ; Логически перемножить содержимое ;регистров r20 и r30

Команда ANDI

Синтаксис: ANDI Rd, K

где 0 < d < 31, 0 < K < 255

 

Команда осуществляет операцию логического «И» (см. таблицу 1) для содержимого регистра и непосредственного значения (константы).

 

Пример:

 

andi r30, $50  ; Логически умножить содержимое ;регистра r30 на 80

andi r23, $B5  ; Логически умножить содержимое ;регистра r23 на 181

 

Команда OR

Синтаксис: OR Rd, Rr

где 0 < d < 31, 0 < r < 31

 

Команда межрегистрового логического «ИЛИ». Иначе: команда логического сложения, где логическое «нет» наступает только в случае единогласного «нет», в остальных случаях – логическое «да» (см. таблицу 2).

 

Таблица 2

 

Пример:

or r4, r8  ; Логически сложить содержимое регистра   ;r4 с содержимым регистра r8

or r3, r5  ; Логически сложить содержимое регистра ; ;r3 с содержимым регистра r5

 

Команда ORI

Синтаксис: ORI Rd, K

где 0 < d < 31, 0 < K < 255

 

Команда логического «ИЛИ» (см. таблицу 2) для содержимого регистра и непосредственного значения (константы).

 

Пример:

 

ori r28, $A0  ; Логически сложить содержимое ;регистра r28 с константой, равной 160

ori r4, $04  ; Логически сложить содержимое ;регистра r4 с константой, равной 4

 

Команда EOR

Синтаксис: EOR Rd, Rr

где 0 < d < 31, 0 < r < 31

 

Команда осуществляет операцию исключающего «ИЛИ» над содержимым двух регистров (см. таблицу 3).

 

Таблица 3

Пример:

 

eor r6, r9    ; Выполнить логическую операцию ;исключающего ИЛИ над содержимым

                           ; регистра r6 и содержимым регистра r9

 eor r17, r21  ; Выполнить логическую операцию ;ислючающего ИЛИ над содержимым

                           ;регистра r17 и содержимым регистра  ;r21

Команды условного перехода

 

Команда CPSE

Синтаксис: CPSE Rd, Rr

где 0 < d < 31, 0 < r < 31

 

Команда межрегистрового сравнения и перехода через последующую команду, в случае равенства содержимого регистра источнике и регистра приёмнике.

 

Пример:

 

cpse r28, r30 ; Перешагнуть следующую команду, ;если содержимое r28 = r30

 

Команда SBRC

Синтаксис: SBRC Rd, n

где 0 < d < 31, 0 < n < 7

 

Команда перехода через последующую команду, в случае, когда указанный бит в регистре приёмнике сброшен (равен нулю).

 

Пример:

 

sbrc r0, 2 ;Перешагнуть следующую команду в ;случае, когда содержимое r0 вида xxxxx0xx

 

Команда SBRS

Синтаксис: SBRS Rd, n

где 0 < d < 31, 0 < n < 7

 

Команда перехода через последующую команду, в случае, когда указанный бит в регистре приёмнике установлен (равен единице).

Пример:

 

sbrs r30, 5 ;Перешагнуть следующую команду в случае,

            ;когда в регистре r30 установлен 5й бит.

 

Команда SBIC

Синтаксис: SBIC Rd, n

где 0 < d < 31, 0 < n < 7

 

Команда перехода через последующую команду, в случае, когда указанный бит в регистре I/O сброшен (равен нулю).

 

Пример:

 

sbic pina, 5  ; Перешагнуть следующую команду в случае, когда порт А содержит последовательность вида xx0xxxxx

 

Команда SBIS

Синтаксис: SBIS Rd, n

где 0 < d < 31, 0 < n < 7

 

Команда перехода через последующую команду, в случае, когда указанный бит в регистре I/O установлен (равен единице).

 

Пример:

 

sbis pinb, 3 ; Перешагнуть следующую команду в случае, когда порт B содержит последовательность вида xxxx1xxx

Команда BRBS

 

Синтаксис: BRBS s, k

где 0 < s < 7, -64 < k < 63

 

Команда относительного перехода через k+1 команду, в случае, если указанный флаг статусного регистра установлен (равен единице). Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.

 

Пример:

brbs 3, Exit ; Переход на метку Exit, находящуюся в пределах 64 команд в случае, когда установлен флаг переполнения

 

Команда BRBC

Синтаксис: BRBC s , k

где 0 < s < 7, -64 < k < 63

 

Команда относительного перехода через k+1 команду, в случае, если указанный флаг статусного регистра сброшен (равен нулю). Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.

 

Пример:

 

brbc 1, Exit ; Переход на метку Exit, находящуюся в пределах 64 команд в случае, когда сброшен флаг нулевого значения

 

Команда BREQ

Синтаксис: BREQ n

где -64 < n < 63

 

Команда относительного перехода через n+1 команду, если в результате выполнения предыдущей команды флаг нулевого значения установлен в единицу. Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.

 

 

Команда BRNE

Синтаксис: BRNE n

где -64 < n < 63

 

Команда относительного перехода через n+1 команду, в случае, если после выполнения предыдущей команды флаг нулевого значения сброшен, т.е. равен нулю. Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.

 

Команда BRCS

 

Синтаксис: BRCS n

где -64 < n < 63

 

Команда относительного перехода через n+1 команду, в случае, если установлен (равен единице) флаг переноса. Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.

 

Команда BRCC

Синтаксис: BRCC n

где -64 < n < 63

 

Команда относительного перехода через n+1 команду, в случае, если сброшен (равен нулю) флаг переноса. Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.

 

Команда BRSH

Синтаксис: BRSH n

где -64 < n < 63

 

Команда относительного перехода через n+1 команду, в случае, если после выполнения предыдущей команды сброшен флаг переноса (равный нулю). Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.

Команда BRLO

Синтаксис: BRLO n

где -64 < n < 63

 

Команда относительного перехода через n+1 команду, в случае, если после выполнения предыдущей команды установлен (равен единице) флаг переноса. Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.

Команда BRMI

Синтаксис: BRMI n

где -64 < n < 63

 

Команда относительного перехода через n+1 команду, в случае, если установлен (равен единице) флаг отрицательного значения. Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.

 

Команда BRPL

Синтаксис: BRPL n

где -64 < n < 63

 

Команда относительного перехода через n+1 команду, в случае, если сброшен (равен нулю) флаг переноса. Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.

 

 

Команда BRGE

Синтаксис: BRGE n

где -64 < n < 63

 

Команда относительного перехода через n+1 команду, в случае, если после выполнения предыдущей команды по предыдущей команде. Определяющую роль играет равенство нулю суммы по модулю 2 флагов отрицательного значения и переполнения. Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.

 

Команда BRLT

Синтаксис: BRLT n

где -64 < n < 63

 

Команда относительного перехода через n+1 команду, в случае, если после выполнения предыдущей команды установлен флаг знака (S) регистра статуса. Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.

 

 

Команда BRHS

Синтаксис: BRHS n

где -64 < n < 63

 

Команда относительного перехода через n+1 команду, в случае, если установлен (равен единице) флаг половинного переноса. Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.

 

Команда BRHC

Синтаксис: BRHC n

где -64 < n < 63

 

Команда относительного перехода через n+1 команду, в случае, если сброшен (равен нулю) флаг половинного переноса. Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.

 

Команда BRTS

Синтаксис: BRTS n

где -64 < n < 63

 

Команда относительного перехода через n+1 команду, в случае, если установлен (равен единице) пользовательский флаг. Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.

 

Команда BRTC

Синтаксис: BRTC n

где -64 < n < 63

 

Команда относительного перехода через n+1 команду, в случае, если сброшен (равен нулю) пользовательский флаг. Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.

 

Команда BRVS

Синтаксис: BRVS n

где -64 < n < 63

 

Команда относительного перехода через n+1 команду, в случае, если установлен (равен единице) флаг переполнения. Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.

 

Команда BRVC

Синтаксис: BRVC n

где -64 < n < 63

 

Команда относительного перехода через n+1 команду, в случае, если сброшен (равен нулю) флаг переполнения. Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.

 

Команда BRIE

Синтаксис: BRIE n

где -64 < n < 63

 

Команда относительного перехода через n+1 команду, в случае, если установлен (равен единице) флаг глобального прерывания, то есть прерывание разрешено. Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.

 

Команда BRID

Синтаксис: BRID n

где -64 < n < 63

 

Команда относительного перехода через n+1 команду, в случае, если сброшен (равен нулю) флаг глобального прерывания, то есть прерывание запрещено. Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.

 

 

Синтаксис:

.ORG адрес

 

Пример:

.DSEG                    ; Начало сегмента данных

.ORG 0x37             ; Установить адрес СОЗУ на 37h

variable: .BYTE 1   ;Зарезервировать байт СОЗУ по адресу 37h

.CSEG

.ORG 0x10             ;Установить счетчик команд на адрес 10h

mov r0,r1               ; Чего-нибудь делать

 

5. Директива DB резервирует ресурсы памяти в программной памяти или в EEPROM. Директиве должна предшествовать метка. DB задает список выражений, и должна содержать по крайней мере одно выражение. Размещать директиву следует в сегменте кодов или в EEPROM сегменте.

       Список выражений представляет собой последовательность выражений, разделенных запятыми. Каждое выражение должно быть величиной между –128 и 255.

       Если директива указывается в сегменте кодов и список выражений содержит более двух величин, то выражения будут записаны так, что 2 байта будут размещаться в каждом слове Flash-памяти.

Синтаксис:

LABEL: .DB список выражений

 

Пример:

.CSEG

consts: .DB 0, 255, 0b01010101, -128, 0xaa

.ESEG

const2: .DB 1,2,3

 

6. Директива DW резервирует ресурсы памяти в программной памяти или в EEPROM. Директиве должна предшествовать метка. DW задает список выражений, и должна содержать по крайней мере одно выражение. Размещать директиву следует в сегменте кодов или в EEPROM сегменте.

       Список выражений представляет собой последовательность выражений, разделенных запятыми. Каждое выражение должно быть величиной между –32768 и 65535.

Синтаксис:

LABEL: .DW список выражений

 

Пример:

.CSEG

varlist: .DW 0, 0xffff, 0b1001110001010101, -32768, 65535

.ESEG

eevarlst: .DW 0,0xffff,10

 

7. Директива DEF позволяет присвоить символическое имя регистру. Регистр может иметь несколько символических имен.

 

Синтаксис:

.DEF Имя=Регистр

 

Пример:

.DEF temp=R16

.DEF ior=R0

.CSEG

ldi temp,0xf0          ; Загрузить 0xf0 в регистр temp

in ior,0x3f              ; Прочитать SREG в регистр ior

eor temp,

 

8. Директива EQU присваивает значение метке. Эта метка может быть использована в других выражениях. Значение этой метки нельзя изменить или переопределить.

 

Синтаксис:

.EQU метка=выражение

 

Пример:

.EQU io_offset = 0x23

.EQU porta = io_offset + 2

.CSEG                                ; Начало сегмента кодов

clr r2                                 ; Очистить регистр r2

out porta,r2                       ; Записать в порт А

 

9. Директива INCLUDE говорит Ассемблеру начать читать из другого файла. Ассемблер будет ассемблировать этот файл до конца файла или до директивы EXIT. Включаемый файл может сам включать директивы INCLUDE.

 

Синтаксис:

.INCLUDE "имя файла"

 

Пример:

 .EQU sreg = 0x3f  ; Регистр статуса

.EQU sphigh = 0x3e ; Старший байт указателя стека.

.EQU splow = 0x3d ; Младший байт указателя стека.

.INCLUDE iodefs.asm ; Включить файл «iodefs.asm»

in r0,sreg               ; Прочитать регистр статуса

 

10. Директива EXIT позволяет ассемблеру остановить ассемблирование текущего файла. Обычно ассемблер работает до конца файла. Если он встретит директиву EXIT, то продолжит ассемблировать со строки, следующей за директивой INCLUDE.

Синтаксис:

.EXIT

 

Пример:

.EXIT                     ; выйти из этого файла

 

11. Директива DEVICE позволяет пользователю сообщить ассемблеру, для какого типа устройства пишется программа. Если ассемблер встретит команду, которая не поддерживается указанным типом микроконтроллера, то будет выдано сообщение. Также сообщение появится в случае, если размер программы превысит объем имеющейся в этом устройстве памяти.

Синтаксис:

.DEVICE AT90S1200 | AT90S2313 | AT90S2323 | AT90S2333 | AT90S2343 | AT90S4414 | AT90S4433 | AT90S4434 | AT90S8515 | AT90S8534 | AT90S8535 | ATtiny11 | ATtiny12 | ATtiny22 | ATmega603 | ATmega103 | Atmega8535

Пример:

.DEVICE ATmega8535      ;использовать ATmega8535

.CSEG

.ORG 0000

jmp label1              ;При ассемблировании появиться сообщение, что

;ATmega8535 не поддерживает команду jmp

 

Окно регистров ввода/вывода

Окно регистров содержит дерево всех устройств. Напротив каждого устройства стоит знак «+». Для того что бы увидеть все его регистры, необходимо раскрыть устройство, нажимая на  напротив устройства. Так, например, регистр ввода/вывода порта А содержит три регистра: регистр данных PORTA, регистр направления DDRA и выводы порта PINA (рисунок 11). Справа от обозначения порта выведено его текущее состояние в виде шестнадцатеричного числа и битовое изображение. Мышкой можно задавать значения битов "0" или "1". Этим эмулируется воздействие внешних сигналов.

Рисунок 11 Окно регистров ввода/вывода

 

Запуск эмулятора

Программа "AVR Studio" позволяет запустить программу в реальном времени и в пошаговом режиме. В меню отладки «Debug» находятся все варианты запуска программы, например:

 – Run, запуск программы в реальном времени, результат будет виден только после остановки программы;

 – Break, останов программы, после просмотра исполнение программы можно продолжить;

 – Reset, сброс программы установка счетчика команд на начало программы;

 – Step Over, пошаговое исполнение, при этом программа останавливается после каждой команды, стрелка указывает на текущую команду;

 – AutoStep, запуск программы на непрерывное исполнение с возможностью просмотра текущих шагов исполнения.

При пошаговом режиме можно наблюдать за состоянием регистров после исполнения каждой команды, проверяя при этом правильность операций. Запустив программу кнопкой  "AutoStep", получим ее непрерывное исполнение и индикацию регистров во времени. Желтая стрелка в окне дизассемблера показывает текущую исполняемую команду. Приостановив исполнение программы кнопкой  "Break", можно изменить значения регистров ввода/вывода, т.е. задать разные значения входных сигналов. И далее снова запустив программу кнопкой "AutoStep", просмотреть реакцию микроконтроллера на эти воздействия (рисунок 14).

Рисунок 14 Запуск эмулятора на исполнение

После того как программа запущена на пошаговое выполнение, для следующего шага необходимо нажать клавишу F11.

Программа, написанная на ассемблере, должна иметь определенную структуру. Для ATmega8535 структура программы имеет вид:

 

;      название программы, необходимые пояснения ;

 

.includem 8535 def . inc”                  ; файл описания ATmega 8535

.include «имя_файла1.расширение     ; включение дополнительных файлов

;      объявление глобальных констант

.equ            имя1 = xxxx ;

.equ            имя2 = nnnn

;   объявление глобальных регистровых переменных

.def             имя1= регистр

.def             имя2= регистр

;      указание сегмент данных

.dseg

.org xxxx                ; адрес первого зарезервированного байта

label 1: .BYTE 1 ; резервировать 1 байт под переменную label 1
label 2: .BYTE m ; резервировать m байт под переменную label 2

;  сегмент EEPROM (ЭСППЗУ)

.eseg

.org xxxx ; адрес первого зарезервированного байта

.db выражение1,выражение2,… ; записать список байтов в EEPROM.

.dw выражение1,выражение2,… ; записать список слов в EEPROM.

;     сегмент кодов

.cseg

.org $0000                                   ; адрес начала программы в программной памяти

; вектора прерываний (если они используются)

rjmp reset                      ;прерывание по сбросу

.org $0002

rjmp INT 0                     ;обработчик прерывания INT 0

.org $0004

rjmp INT 1                     ;обработчик прерывания INT 1

.org adrINTx        ;адрес следующего обработчика прерываний

rjm p INTx  ;обработчик прерывания x

…….                                  ;далее располагаются обработчики остальных ;прерываний

; начало основной программы

main:          <команда> xxxx

                   …   …

; подпрограмма 1

subr 1: <команда> xxxx

…… ……….     ……

                   ret

; программы обработчиков прерываний

INT 0: <команда> xxxx

…… ……….     ……

                   reti

………………………

;      конец программы не обозначается

 


Лабораторная работа №1



Цель работы

 

Изучение регистров общего назначения (РОН) и команд пересылки данных.

 

Постановка задачи

 

1. Занести число из столбца «Число 1» таблицы 7 и строки, соответствующей заданному варианту, в регистр R 24;

2. Занести число из столбца «Число 2» таблицы 7 и строки, соответствующей заданному варианту, в в регистр R 25;

3. Занести число из столбца «Число 3» таблицы 7 и строки, соответствующей заданному варианту, в регистровую пару X(R 26:27);

4. Занести число из столбца «Число 4» таблицы 7 и строки, соответствующей заданному варианту, в в регистр в регистровую пару Y(R 28:29);

5. Занести содержимое регистровой пары X в оперативную память, младшую часть регистровой памяти занести по адресу $0070, старшую – по адресу $0071.

6. Занести содержимое регистровой пары Y в оперативную память, младшую часть регистровой памяти занести по адресу $0080, старшую – по адресу $0081.

7. Обменять числа, хранящиеся в регистрах R 24 и R 25 после выполнения пунктов 1 и 2, между собой, 3-мя разными способами;

8. Обменять числа, хранящиеся в регистровых парах X и Y после выполнения пунктов 3 и 4, между собой, 3-мя разными способами;

9. Обменять между собой содержимое четырех ячеек оперативной памяти: содержимое ячейки памяти с адресом $0070 поменять с содержимым ячейки $0080, а содержимое ячейки памяти с адресом $0071 поменять с содержимым ячейки памяти с адресом $0081.

 

Таблица 7

Номер варианта Число 1 Число 2 Число 3 Число 4
1 38 45 4F5A 8765
2 56 48 6BCF 7654
3 54 42 0123 6543
4 48 54 1234 5432
5 89 52 2345 4321
6 58 59 3456 3210
7 55 12 4567 210F
8 98 25 5678 10FE
9 48 34 6789 0FED
10 54 48 789A 2468
11 75 56 89AB 468A
12 25 67 9ABC 68AC
13 26 62 ABCD 8ACE
14 53 78 BCDE ACE8
15 24 83 CDEF CE86
16 15 94 DEF0 E864
17 81 71 EF01 8642
18 11 54 F012 1357
19 15 82 FEDC 3579
20 45 8 EDCB 579B
21 52 3 DCBA 79BD
22 57 54 CBA9 9BDE
23 64 58 BA98 BDE1
24 54 64 A987 DE13
25 68 67 9876 E135

 

Содержание отчета

Отчет по лабораторной работе должен содержать номер, название, цель лабораторной работы, задание на лабораторную работу, текст программы на языке ассемблера.

Цель работы

Изучение арифметических команд и получение навыка работы с ними.

 

Постановка задачи

Занести числа в память:

a = ;

b = ;

c = N;

d = N - 1;

e = ;

Для вариантов 1 – 10:

f = ;

Для вариантов после 10:

f = .

 

N – номер варианта по списку группы или выданный преподавателем.

 

Произвести операции над числами a,b,c,d,e,f  по вариантам, заданным в таблице 8.

Таблица 8

Номер варианта Выражение Номер варианта Выражение
1 15
2 16
3 17
4 18
5 19
6 20
7 21
8 22
9 23
10 24
11 25
12 26
13   27
14 28

 

Содержание отчета

 

Отчет по лабораторной работе должен содержать номер, название, цель лабораторной работы, задание на лабораторную работу, текст программы на языке ассемблера.

 

Цель работы

Изучение логических команд и команд манипулирования битами и получение навыка работы с ними.

 

Постановка задачи

Занести числа в память:

a = N +100;

b =  ;

c = N+60;

d = N+125.

N – номер варианта по списку группы или выданный преподавателем.

Произвести операции над числами a,b,c,d следующие задания:

  1. Подсчитать количество ненулевых бит в числе,
  2. Подсчитать количество нулевых бит в числе,
  3. Подсчитать количество четных единиц в байте,
  4. Подсчитать количество нечетных единиц в байте,
  5. Подсчитать количество четных нулей в байте,
  6. Подсчитать количество нечетных нулей в байте.

  

Содержание отчета

 

Отчет по лабораторной работе должен содержать номер, название, цель лабораторной работы, задание на лабораторную работу, текст программы на языке ассемблера.


Литература

1. Балакина Е.П., Воробьёва Л.Н., Гречишников В.А. Интегрирование программных модулей ассемблера в среде DELPHI. Методические указания к лабораторным работам по дисциплине «Машино-Ориентированные Языки». – М.: МИИТ, 2009. –56 с.

2. Хусаинов Р.З., Садов В.Б. Программирование микроконтроллеров ATmega8535: методические указания к выполнению лабораторных работ.– Челябинск, 2009.– 123с.

3. http://www.gaw.ru/html.cgi/txt/doc/micros/avr/asm/start.htm


Приложение 1

 

Таблица 9. Арифметические и логические команды

 

Мнемоника Операнды Описание Операция Флаги Кол-во циклов
ADD Rd , Rr 0≤ d≤31, 0≤r≤31 Сложить без переноса Rd Rd + Rr Z, C, N, V, H 1
ADC Rd.Rr 0≤d≤31 , 0≤ r ≤31 Сложить с переносом Rd Rd + Rr+ С Z, C, N, V, H 1
ADIW Rd,K dE{24,26,28,30} 0≤ K ≤63 Сложить непосредственное значение со словом Rdh:Rdl Rdh:Rdl+ К Z, C, N, V 2
SUB Rd,Rr 0≤d≤31 , 0≤ r ≤31 Вычесть без заема Rd Rd – Rr Z, C, N, V, H 1
SUBI Rd, К 16≤d≤31 0≤K≤255 Вычесть непосредственное значение Rd Rd – К Z, C, N, V, H 1
SBC Rd, Rr 0≤d≤31 , 0≤ r ≤31 Вычесть с заемом Rd ß Rd-Rr-C Z, C, N, V, H 1
SBCI Rd, К 16≤d≤32 , 0≤ K ≤255 Вычесть непосредственное значение с заемом Rd ß Rd-K-C Z, C, N, V, H 1
SBIW Rd, К dE{24,26,28,30} О ≤ К ≤ бЗ Вычесть непосредственное значение из слова Rdh:Rdl ß Rdh:Rdl-K Z, C, N, V 2
AND Rd, Rr 0≤d≤31 , 0≤r≤31 Выполнить логическое AND Rd ß Rd • Rr Z, N, V 1
ANDI Rd, К 16<d<31 0<k≤255 Выполнить логическое AND Rd ß Rd • К Z, N, V 1
OR Rd, Rr 0≤d≥31 , 0≤ r ≤31 Выполнить логическое OR Rd ß Rd v Rr Z, N, V 1
ORI Rd , К 16≤d≤31, 0≤ K ≤255 Выполнить логическое OR с непосредственным значением Rd ß Rd v К Z, N, V 1
EOR Rd, Rr 0≤d≤31 , 0≤г≤31 Выполнить исключающее OR Rd ß Rd Rr Z, N, V 1
СОМ Rd 0≤d≤31 Выполнить дополнение до единицы Rd ß SFF-Rd Z, C, N, V 1
NEG Rd 0≤d≤31 Выполнить дополнение до двух Rd ß S00 - Rd Z, C, N, V, H 1
SBR Rd , К 16≤d≤31, 0≤K≤255 Установить биты в регистре Rd ß Rd v К Z, N,V 1
CBR Rd , К 16≤ d ≤31 O ≤ K ≤255 Очистить биты в регистре Rd ß Rd • (SFF - К ) Z, N, V 1
INC Rd 0≤d≤31 Инкрементировать Rd ß Rd + 1 Z, N,V 1
DEC Rd 0≤d≤31 Декрементировать Rd ß Rd - 1 Z, N,V 1
TST Rd 0≤r≤31 Проверить на ноль или минус Rd ß Rd.Rd Z, N, V 1
CLR Rd 0≤d≤31 Очистить регистр Rd ß Rd Å Rd Z, N, V 1
SER Rd 16≤d≤31 Установить все биты регистра Rd ß S FF нет 1
MUL Rd,Rr 0≤d≤31 , 0≤ r ≤31 Беззнаковое умножение целых чисел R1:R0 ß Rd*Rr Z,C 2
MULS Rd,Rr 16≤d≤31 , 16≤r≤31 Умножение целых чисел с учётом знака R1:R0 ß Rd*Rr Z,C 2
MULSU Rd,Rr 16≤ d ≤23, 16≤ r ≤23 Целочисленное умножение числа со знаком на число без знака R1:R0 ß Rd*Rr Z,C 2
FMUL Rd,Rr 16≤d≤23 , 16≤ r ≤23 Беззнаковое умножение дробных чисел R1:R0 ß (Rd*Rr)<<1 Z,C 2
FMULS Rd,Rr 16≤d≤23 , 16≤ r ≤23 Умножение дробных чисел с учётом знака R1:R0 ß (Rd*Rr)<<1 Z,C 2
FMULSU Rd,Rr 16≤d≤23 , 16≤ r ≤23 Умножение дробного числа со знаком на дробное число без знака R1:R0 ß (Rd*Rr)<<1 Z,C 2
CP Rd, Rr 0≤d≤31 , 0≤ r ≤31 Сравнить Rd - Rr Z, C, N, V, H 1
CPC Rd, Rr 0≤d≤31 , 0≤r≤31 Сравнить с учетом переноса Rd-Rr-C Z, C, N, V, H 1
CPI Rd, К 16≤d≤31 , 0≤K≤255 Сравнить с константой Rd-K Z, C, N, V, H 1

 

Таблица 10. Команды сдвигов и операций с битами

Мнемоника Операнды Описание Операция Флаги Кол-во циклов
LSL Rd 0≤d≤31 Логически сдвинуть влево Rd(n+1) ß Rd(n), Rd(0) ß 0, Cß Rd(7) Z,C,N,V,H 1
LSR Rd 0≤d≤31 Логически сдвинуть вправо Rd(n) ß Rd(n+1), Rd(7) ß 0, C ß Rd(0) Z,C,N,V 1
ROL Rd 0≤d≤31 Сдвинуть влево через перенос Rd(0) ß C, Rd(n+1) ß Rd(n), C ß Rd (7) Z,C,N,V,H 1
ROR Rd 0≤d≤31 Сдвинуть вправо через перенос Rd(7) ß C, Rd(n) ß Rd(n+1), C ß Rd (0) Z,C,N,V 1
ASR Rd 0≤d≤31 Арифметически сдвинуть вправо Rd(n) ß Rd(n+1), n=0...6, Rd(0) ß C Z,C,N,V 1
SWAP Rd 0≤d≤31 Поменять нибблы местами Rd (3...0) <–> Rd (7...4) Нет 1
BSET s 0≤s≤7 Установить флаг SREG ( s ) ß 1 SREG(s) 1
BCLR s 0≤ s ≤7 Очистить флаг SREG(s) ß 0 SREG(s) 1
SBI P,b O≤P≤31, 0≤b≤7 Установить бит в регистр I/O l/0(P,b) ß 1 Нет 2
CBI P , b 0≤ P ≤31, 0≤ b ≤7 Очистить бит в регистре I/O l/0(P,b) ß 0 Нет 2
BST Rd,b 0≤d≤31, 0≤b≤7 Переписать бит из регистра во флаг Т Т ß Rd(b) Т 1
BLD Rd,b 0≤ d ≤31, 0≤b≤7 Загрузить Т флаг в бит регистра Rd(b) ß Т Нет 1
SEC Установить флаг переноса С ß 1 С 1
CLC Очистить флаг переноса С ß 0 С 1
SEN Установить флаг отрицательного значения N ß 1 N 1
CLN Очистить флаг отрицательного значения N ß 0 N 1
SEZ Установить флаг нулевого значения Z ß 1 Z 1
CLZ Очистить флаг нулевого значения Z ß 0 Z 1
SEI Установить флаг глобального прерывания I ß 1 I 1
CLI Очистить флаг гло­бального прерывания I ß 0 I 1
SES Установить флаг знака S ß 1 S 1
CLS Очистить флаг знака S ß 0 S 1
SEV Установить флаг переполнения V ß 1 V 1
CLV Очистить флаг переполнения   V ß 0 V 1
SET Установить флаг Т T ß 1 T 1
CLT Очистить флаг Т Т ß 0 T 1
SEH Установить флаг полу переноса Н ß 1 Н 1
CLH Очистить флаг полу переноса Н ß 0 Н 1
NOP Выполнить холостую команду     Нет 1
SLEEP Установить режим SLEEP   Нет 1
WDR Сбросить сторожевой таймер   Нет 1

 

Таблица 11. Команды пересылки данных

  Мнемоника Операнды Описание Операция Флаги Кол-во циклов
ELPM Расширенная загрузка из памяти программ в регистр RO R0 ß (Z+RAMPZ) Нет 3
MOV Rd,Rr 0≤d≤31, 0≤ r ≤31 Копировать регистр Rd ß Rr Нет 1
LDI Rd , k 16≤ d ≤31,0≤ k ≤255 Загрузить непосредственное значение Rd ß K Нет 1
LDS Rd , k 0≤d≤31 0≤k≤65535 Загрузить из ОЗУ Rd ß ( k ) Нет 3
LD Rd,X  0≤d≤31 Загрузить косвенно Rd ß (X) Нет 2
LD Rd , X +  0≤d≤31 Загрузить косвенно с постинкрементом Rd ß (X), X ß X+1 Нет 2
LD Rd , X - 0≤d≤31 Загрузить косвенно с преддекрементом X ß X-1, Rd ß (X) Нет 2
LD Rd , Y  0≤ d ≤31 Загрузить косвенно Rd ß ( Y ), Нет 2
LD Rd,Y+ 0≤ d ≤31 Загрузить косвенно с постинкрементом Rd ß (Y), Y ß Y+1 Нет 2
LD Rd , Y  0≤ d ≤31 Загрузить косвенно с преддекрементом Y ß Y-1, Rd ß (Y) Нет 2
LDD Rd,Y+q  0≤d≤31 , 0≤ q ≤63 Загрузить косвенно со смещением Rd ß (Y+q) Нет 2
LD Rd , Z 0≤d≤31 Загрузить косвенно Rd ß ( Z ) Нет 2
LD Rd,Z+ 0≤ d ≤31 Загрузить косвенно с постинкрементом Rd ß (Z), Z ß Z+1 Нет 2
LD Rd ,- Z 0≤ d ≤31 Загрузить косвенно с преддекрементом Z ß Z-1, Rd ß (Z) Нет 2
LDD Rd,Z+q 0≤ d ≤31, 0≤ q ≤31 Загрузить косвенно со смещением Rd ß (Z+q) Нет 2
STS k,Rr 0≤d≤31 , 0≤k≤65535 Загрузить непосредственно в ОЗУ ( k ) ß Rr Нет 3
ST X,Rr  0≤r≤31 Записать косвенно (X) ß Rr Нет 2
ST X+,Rr 0≤ r ≤31 Записать косвенно с постинкрементом (X) ß Rr, X ß X+ 1 Нет 2
ST -X,Rr 0≤r≤31 Записать косвенно с преддекрементом X ß X-1, (X) ß Rr Нет 2
ST Y,Rr 0≤r≤31 Записать косвенно ( Y ) ß Rr Нет 2
ST Y+,Rr  0≤r≤31 Записать косвенно с постинкрементом (Y) ß Rr, Y ß Y+ 1 Нет 2
STD Y+q,Rr 0≤r≤31 , 0≤ q ≤63 Записать косвенно со смещением (Y+q) ß Rr Нет 2
ST Z,Rr 0≤ r ≤31 Записать косвенно ( Z ) ß Rr Нет 2
ST Z+,Rr 0≤r≤31 Записать косвенно с постинкрементом (Z) ß Rr, Z ß Z+ 1 Нет 2
ST -Z,Rr 0≤ r ≤31 Записать косвенно с преддекрементом Z ß Z-1, (Z) ß Rr Нет 2
STD Z+q,Rr  0≤r≤31 , 0≤ q ≤63 Записать косвенно со смещением (Z+q) ß Rr Нет 2
LPM Загрузить байт из памяти программ R 0 ß ( Z ) Нет 3
IN Rd,P  0≤d≤31 , 0≤ P ≤63 Загрузить данные из порта I/O в регистр Rd ß P Нет 1
OUT P,Rr 0≤r≤31 , 0≤ P ≤63 Записать данные из регистра в порт I/O P ß Rr Нет 1
PUSH Rr 0≤r≤31 Сохранить регистр в стеке STACK ß Rr Нет 2
POP Rr 0≤r≤31 Загрузить в регистр из стека Rr ß STACK Нет 2

 

Таблица 12. Команды переходов

  Мнемоника Операнды Описание Операция Флаги Кол-во циклов
RJMP k -2K<k<2K Перейти относительно PC ß PC + k + 1 Нет 2
LJMP Перейти косвенно PC ß Z Нет 2
JMP k 0<k<4M Перейти PC ß k Нет 3
RCALL k -2K≤k≤2K Вызвать подпрограмму относительно PC ß PC + k + 1 Нет 3
ICALL Вызвать подпрограмму косвенно PC ß Z Нет 3
CALL k 0≤k≤64K Выполнить длинный вызов подпрограммы PC ß k Нет 4
RET Вернуться из подпрограммы PC ß STACK Нет 4
RETI Вернуться из прерывания PC ß STACK I 4
CPSE Rd,Rr  0≤d≤31, 0≤ r ≤31 Сравнить и пропустить, если равно If Rd=Rr then PC ß PC + 2 (or 3) Нет ½/3
SBRC Rr,b  0≤r≤31 , 0≤ b ≤7 Пропустить, если бит в регистре очищен if Rr(b)=0 then PC ß PC + 2 (or 3) Нет ½/3
SBRS Rr,b 0≤r≤31 , 0≤ b ≤7 Пропустить, если бит в регистре установлен If Rr(b)=1 then PC ß PC + 2 (or 3) Нет ½/3
SBIC P,b  0≤P≤31 , 0≤ b ≤7 Пропустить, если бит в регистре I/O очищен if l/O P(b)=0 then PC ß PC + 2 (or 3) Нет ½/3
SBIS P,b 0≤r≤31 , 0≤ b ≤7 Пропустить, если бит в регистре I/O установлен If l/O P(b)=1 then PC ß PC + 2 (or 3) Нет ½/3
BRBS s,k 0≤ s ≤7, -64≤k≤+63 Перейти, если бит в регистре статуса установлен if SREG(s)=1 then PC ß PC + k + 1 Нет ½
BRBC s,k 0≤ s ≤7, -64≤ k ≤+63 Перейти, если бит в регистре статуса очищен if SREG(s)=0 then PC ß PC + k + 1 Нет ½
BREQ k -64≤k≤+63 Перейти, если равно if Rd=Rr (Z=1) then PC ß PC + k + 1 Нет ½
BRNE k -64≤k≤+63 Перейти, если не равно if Rd ¹ Rr(Z=0) then PC< ß PC+ k+ 1 Нет ½
BRCS k -64 £ k £ +63 Перейти, если флаг переноса установлен if C=1 then PC ß PC + k + 1 Нет 1/2
BRCC k -64≤k≤+63 Перейти, если флаг переноса очищен if C=0 then PC ß PC + k + 1 Нет 1/2
BRSH K -64≤k≤+63 Перейти, если равно или больше (без знака) if Rd<Rr(C=0) then PC ß PC+ k+ 1 Нет 1/2
BRLO k -64≤k≤+63 Перейти, если меньше (без знака) if Rd<Rr (C=1) then PC ß PC + k + 1 Нет 1/2
BRMI    k -64≤k≤+63 Перейти, если минус if N=1 then PC ß PC + k + 1 Нет 1/2
BRPL k -64≤k≤+63 Перейти, если плюс if N=0 then PC ß PC + k + 1  Нет 1/2
BRGE k -64≤k≤+63 Перейти, если больше или равно (с учетом знака) if Rd>Rr (N Å V=0) then PC ß PC + k + 1 Нет 1/2
BRLT k -64≤k≤+63 Перейти, если меньше чем (со знаком) if Rd<Rr (N Å V=1)then PC ß PC + k+ 1 Нет 1/2
BRHS K -64≤k≤+63 Перейти, если флаг полупереноса установлен if H=1 then PC ß PC + k + 1 Нет 1/2
BRHC k -64≤k≤+63 Перейти, если флаг полупереноса очищен if H=0 then PC ß PC + k + 1 Нет 1/2
BRTS k -64≤k≤+63 Перейти, если флаг Т установлен if T=1 then PC ß PC + k + 1 Нет 1/2
BRTC k -64≤k≤+63 Перейти, если флаг Т очищен if T=0 then PC ß pc + k + 1 Нет 1/2
BRVS k -64≤k≤+63 Перейти, если флаг переполнения установлен if V=1 then PC ß PC + k + 1 Нет 1/2
BRVC k -64≤k≤+63 Перейти, если флаг переполнения очищен if V=0 then PC ß PC + k + 1 Нет 1/2
BRIE k -64≤k≤+63 Перейти, если глобальное прерывание разрешено if I=1 then PC ß PC + k + 1 Нет 1/2
BRID k -64k £ k £ +63 Перейти, если глобальное прерывание запрещено if I=0 then PC ß PC + k + 1 Нет 1/2

https://otvet.mail.ru/question/184778171


[1] См приложение




Введение

Любые устройства, в том числе и устройства связи, радиоавтоматики или аудиовизуальной аппаратуры требуют присутствия в своем составе устройства управления (контроллера). Контроллеры требуются практически во всех предметах и устройствах, которые окружают нас

Одним распространёнными в настоящее время являются микроконтроллеры фирмы Atmel семейства AVR. Несмотря на то, что они появились на рынке в 1996 году, их популярность до сих пор очень высока. С каждым годом они захватывают все новые и новые ниши на рынке. Не последнюю роль в этом играет соотношение показателей цена/быстродействие/энергопотребление, до сих пор являющееся едва ли не лучшим на рынке 8-битных микроконтроллеров.

 

  1. Описание и характерные особенности микроконтроллеров ATmega 8535

Как и все микроконтроллеры AVR фирмы «Atmel», микроконтроллеры семейства Mega, а в частности ATmega 8535 являются 8-разрядными микроконтроллерами, предназначенными для встраиваемых приложений. Они изготавливаются по малопотребляющей КМОП-технологии, которая в сочетании с усовершенствованной RISC - архитектурой[1] позволяет достичь наилучшего соотношения быстродействие/энергопотребление. Контроллеры описываемого семейства являются наиболее развитыми представителями микроконтроллеров AVR.

К некоторым особенностям микроконтроллера ATmega8535 относятся:

- FLASH-память программ объемом 8 Кбайт с возможностью внутрисистемного перепрограммирования и загрузки через последовательный канал SPI (число циклов стирания/записи не менее 1000);

- оперативная память (статическое ОЗУ) объемом 512 байт;

- энергонезависимая память данных (EEPROM) объем 512 байт с возможностью внутрисистемного перепрограммирования и загрузки через последовательный канал SPI (число циклов стирания/записи не мене 100000);

- возможность защиты от чтения и модификации памяти программ и данных;

- возможность программирования непосредственно в системе через последовательные интерфейсы SPI и JTAG;

- возможность программного снижения частоты тактового генератора;

- 130 команд, большинство из которых выполняются за один машинный цикл;

- 17 внутренних+3 внешних источников прерываний;

- наличие программного стека;

- наличие аппаратного умножителя;

- 32 8-битных регистра общего назначения (далее РОН);

- 32 программируемые линии ввода/вывода;

- диапазон напряжений питания от 4,5 В до 5,5 В;

- производительность до 8 MIPS при частоте 8 МГц и т.д.   

 

Устройства ввода/вывода ATmega8535

 

Микроконтроллеры семейства Mega имеют наиболее богатый набор периферийных устройств (ПУ). При этом в большинстве моделей имеются все ПУ, которые вообще встречаются в составе микроконтроллеров AVR. У микроконтроллера ATmega 8535 имеются в наличии [3]:

1) многофункциональные, двунаправленные GPIO порты ввода-вывода с встроенными нагрузочными резисторами. Конфигурация портов ввода/вывода задаётся программно;

2) два 8-разрядных таймера/счетчика (таймеры ТО и Т2);

3) 16-разрядный таймер/счетчик (таймер Т1);

4) 4 канала ШИМ-модулятора разрядностью 8 бит (один из режимов работы 8-разрядных таймеров/счетчиков ТО и Т2);

5) аналоговый компаратор;

6) восьмиканальный 10-разрядный АЦП с дифференциальными входами:

- программируемый коэффициент усиления перед АЦП 1, 10 и 200;

- опорное напряжение 2,56 В.

7) полнодуплексный универсальный асинхронный приемопередатчик UART;

8) последовательный синхронный интерфейс SPI;

9) последовательный двухпроводный интерфейс TWI (аналог интерфейса I 2 С).

 

1.2 Архитектура микроконтроллера ATmega 8535

 

Микроконтроллер ATmega8535 имеет гарвардскую архитектуру (программа и данные находятся в разных адресных пространствах) и систему команд, близкую к идеологии RISC. Процессор имеет 32 8-битных регистра общего назначения, объединённых в регистровый файл. В отличие от «идеального» RISC, регистры не абсолютно ортогональны:

- три «сдвоенных» 16-битных регистра-указателя X (r26:r27), Y (r28:r29) и Z (r30:r31);

- некоторые команды работают только с регистрами r16…r31;

- результат умножения (в тех моделях, в которых есть модуль умножения) всегда помещается в r0:r1.

Структура процессора также представляется как «высокопроизводительная RISC-архитектура с пониженным энергопотреблением» Гарвардского типа. Одним из основных достоинств этого контроллера является быстрое выполнение команд - он выполняет команду за один такт. AVR имеет, вероятно, наиболее разносторонний по своим возможностям процессор из всех микроконтроллеров. Это означает, что при разработке приложений надо потратить немного больше времени на планирование размещения данных в памяти и регистрах, чем для других микроконтроллеров. Но благодаря своей разносторонности AVR очень прост в программировании как для разработчиков прикладных программ на языке ассемблера так и для тех, кто пишет компиляторы языков высокого уровня.

Как и в любом процессоре, особенности являются следствием общих принципов, использованных при разработке этих процессоров. Организация набора регистров микропроцессоров AVR, которого представлена в графическом виде на рисунок 1. Такая организация обеспечивает высокую эффективность процессора при обработке данных.

 

 

Рисунок 1 – Приоритеты регистров в архитектуре процессоров AVR

 

Дата: 2018-12-28, просмотров: 311.