Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка AVR 1. Аппаратные и программные средс...doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
6.23 Mб
Скачать

4. Рабочее задание

1. Выполнить эмуляцию проекта IndCode_Main. В процессе эмуляции необходимо: выбрать место и установить точки остановки, позволяющие контролировать исполнение функций программы, скопировать и сохранить окна, отражающие изменение состояния РОН, регистров ввода/вывода, памяти программ и памяти данных на различных этапах работы.

2. Собрать схему электрических соединений на модуле «Микроконтроллер», необходимых для организации ввода и вывода информации в данной лабораторной работе. Пригласить преподавателя для проверки правильности собранной схемы. Только после получения от преподавателя разрешения, включить питание стенда и модуля.

3. Загрузить в микроконтроллер модуля «Микроконтроллер» файл IndCode_Main.hex. Проверить функционирование программы, зафиксировать показание индикаторов при нажатии кнопки, подключенной к выводу 4 порта D.

4. Выполнить эмуляцию проекта с подпрограммой «WorkStudent», разработанной по своему варианту задания, выбрав точки останова, позволяющие контролировать правильность исполнения функций подпрограммы «WorkStudent», сделать копии окон памяти данных, подтверждающих соответствие варианту задания.

5. Загрузить в микроконтроллер модуля лабораторного стенда исполняемый файл проекта с подпрограммой «WorkStudent». Просмотреть на восьмисегментных индикаторах модуля «Микроконтроллер» значения байт памяти данных, подтверждающие правильность работы программы.

5. Отчет по лабораторной работе

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

Отчет по лабораторной работе оформляется на отдельных листах, должен иметь титульный лист и содержать:

– схемы алгоритмов программ с кратким описанием;

– показания индикаторов при нажатии клавиши, подключенной к входу 4 порта А.

Файл, прилагаемый к отчету, должен содержать копии экранов с информацией, отражающей процесс эмуляции и отладки программ.

6. Рекомендации по подготовке и выполнению лабораторной работы

1. При выполнении п. 1 рабочего задания лабораторной работы необходимо:

– запустить среду разработки «AVR Studio 4»;

– загрузить проект «IndCode_Main» и настроить размещение окон программы «AVR Studio 4»;

– выполнить ассемблирование проекта (F7) и скопировать командой (Alt+PrtSc) в файл отчета окна «Build» (рис.7) и «Message» (рис. 8) с сообщениями о результатах компиляции и окно «Project» (рис. 9) с данными о составе проекта;

– запустить отладчик (Ctrl+F7 или Ctrl+Shift+Alt+F5);

– выполнить в пошаговом режиме (F11) команды до вызова первой подпрограммы, контролируя состояние регистров в окне «Processor» (рис. 10) и портов ввода/вывода в окне «I/O View» (рис. 11);

– выполнить в пошаговом режиме подпрограмму «CopyCoda» копирование кода до метки Loop, фиксируя изменение состояния регистровых пар X, Z, регистров r0, temp (счетчика числа циклов), temp1 и ячеек памяти данных и программ, скопировав в файл отчета итоговое состояние окна «Memory» (рис. 12) с отображением памяти данных «Data» и программ «Program»;

– выполнить в пошаговом режиме подпрограмму «WriteTablSimv» записи таблицы индицируемых символов, фиксируя изменение состояния регистровой пары X, регистров temp, temp1 и портов C и D, скопировав в файл отчета итоговое состояние окна «Memory» (рис. 12) с отображением памяти данных «Data» и портов ввода/вывода в окне «I/O View» (рис. 11);

– установить точку останова (F9) перед командой вызова подпрограммы «WriteTablSimv» записи таблицы индицируемых символов и выполнить несколько циклов программы с помощью команды Run (F5), при этом каждый раз изменяя состояние разряда 4 порта D в окне «I/O View» и контролируя изменение памяти данных в окне «Memory».

2.  При выполнении п. 3 рабочего задания необходимо записать значения байтов памяти программ, отображаемых на восьмисегментных индикаторах модуля «Микроконтроллер», при каждом нажатии кнопки, подключенной к разряду 4 порта D.

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

4. При выполнении п. 4 рабочего задания необходимо записать значения результата работы подпрограммы «WorkStudent», составленной в соответствие со своим вариантом.

Л И Т Е Р А Т У Р А

1. Евстифеев А.В. Микроконтроллеры AVR семейства Mega. Руководство пользователя. – М.: Издательский дом «Додека-ХХI», 2007. – 592 с.: (Серия «Программируемые системы»).

2. Хартов В.Я. Микроконтроллеры AVR. Практикум для начинающих. – М.: Изд-во МГТУ им. Н.Э. Баумана, 2007. – 240 с.: ил.

3. Ревич Ю.В. Практическое программирование микроконтроллеров Atmel AVR на языке ассемблера. – СПб.: БХВ-Петербург, 2008. – 384 с.: ил. – (Аппаратные средства).

П1. ПРИЛОЖЕНИЕ 1. СИСТЕМА КОМАНД МИКРОКОНТ- РОЛЛЕРОВ СЕМЕЙСТВА AVR

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

Мнемоника

Операнды

Описание

Операция

Флаги*

ADD

Rd,Rr

0≤d≤31, 0≤r≤31

Сложить без переноса

Add without Carry

Rd Rd + Rr

Z, C, N, V, H

ADC

Rd.Rr

0≤d≤31, 0≤r≤31

Сложить с переносом

(Add with Carry)

Rd    Rd + Rr + С

Z, C, N, V, H

ADIW

Rd,K

dE{24,26,28,30}

0≤K≤63

Сложить непосредственное значение со словом (Add Immediate to Word)

Rdh:Rdl

dh:Rdl + К

Z, C, N, V

Мнемо­ника

Операнды

Описание

Операция

Флаги

SUB

Rd,Rr

0≤d≤31, 0≤r≤31

Вычесть без заема (Subtract without Carry)

Rd  Rd – Rr

Z, C, N, V, H

SUBI

Rd, К

16≤d≤31 0≤K≤255

Вычесть непосредственное значение (Subtract Immediate)

Rd  Rd – К

Z, C, N, V, H

SBC

Rd, Rr

0≤d≤31, 0≤r≤31

Вычесть с заемом (Subtract with Carry)

RdRd-Rr-C

Z, C, N, V, H

SBCI

Rd, К

16≤d≤32, 0≤K≤255

Вычесть непосредственное значение с заемом (Subtract Immediate with Carry)

RdRd-K-C

Z, C, N, V, H

SBIW

Rd, К dE{24,26,28,30} О≤К≤6З

Вычесть непосредственное значение из слова (Subtract Immediate from Word)

Rdh:Rdl

Rdh:Rdl-K

Z, C, N, V

AND

Rd, Rr

0≤d≤31, 0≤r≤31

Выполнить логическое AND (Logical AND)

Rd  Rd • Rr

Z, N, V

Мнемо­ника

Операнды

Описание

Операция

Флаги

ANDI

Rd, К

16<d<31, 0<k≤255

Выполнить логическое AND (Logical AND with Immediate)

Rd  Rd • К

Z, N, V

OR

Rd, Rr

0≤d≥31, 0≤r≤31

Выполнить логическое OR (Logical OR)

Rd Rd v Rr

Z, N, V

ORI

Rd, К

16≤d≤31, 0≤K≤255

Выполнить логическое OR с непосредственным значением (Logical OR with Immediate)

Rd Rd v К

Z, N, V

EOR

Rd, Rr

0≤d≤31, 0≤г≤31

Выполнить исключающее OR (Exclusive OR)

Rd Rd Rr

Z, N, V

СОМ

Rd

0≤d≤31

Выполнить дополнение до единицы (One's Complement)

RdSFF-Rd

Z, C, N, V

NEG

Rd

0≤d≤31

Выполнить дополнение до двух (Two's Complement)

Rd  S00 - Rd

Z, C, N, V, H

SBR

Rd, К 16≤d≤31, 0≤K≤255

Установить биты в регистре (Set Bits in Register)

Rd  Rd v К

Z, N,V

CBR

Rd, К

16≤d≤31 O≤K≤255

Очистить биты в регистре (Clear Bits in Register)

Rd 

Rd • (SFF-К)

Z, N, V

INC

Rd

0≤d≤31

Инкрементировать (Increment)

Rd Rd + 1

Z, N,V

DEC

Rd

0≤d≤31

Декрементировать (Decrement)

Rd  Rd - 1

Z, N,V

TST

Rd

0≤r≤31

Проверить на ноль или минус (Test for Zero or Minus)

RdRdRd

Z, N, V

CLR

Rd

0≤d≤31

Очистить регистр (Clear Register)

Rd  Rd  Rd

Z, N, V

Мнемо­ника

Операнды

Описание

Операция

Флаги

SER

Rd

16≤d≤31

Установить все биты регистра (Set all bits in Register)

Rd SFF

нет

MUL

Rd,Rr

0≤d≤31, 0≤r≤31

Беззнаковое умножение целых чисел (Multiply Unsigned)

R1:R0  Rd*Rr

Z,C

MULS

Rd,Rr

16≤d≤31, 16≤r≤31

Умножение целых чисел с учётом знака (Multiply Signed)

R1:R0  Rd*Rr

Z,C

MULSU

Rd,Rr

16≤d≤23, 16≤r≤23

Целочисленное умножение числа со знаком на число без знака (Multiply Signed with Unsigned)

R1:R0  Rd*Rr

Z,C

FMUL

Rd,Rr

16≤d≤23, 16≤r≤23

Беззнаковое умножение дробных чисел (Fractional Multiply Unsigned)

R1:R0 

(Rd*Rr)<<1

Z,C

FMULS

Rd,Rr

16≤d≤23, 16≤r≤23

Умножение дробных чисел с учётом знака (Fractional Multiply Signed)

R1:R0 

(Rd*Rr)<<1

Z,C

FMULSU

Rd,Rr

16≤d≤23, 16≤r≤23

Умножение дробного числа со знаком на дробное число без знака (Fractional Multiply Signed with Unsigned)

R1:R0 

(Rd*Rr)<<1

Z,C

CP

Rd, Rr

0≤d≤31, 0≤r≤31

Сравнить (Compare)

Rd-Rr

Z, C, N, V, H

CPC

Rd, Rr

0≤d≤31, 0≤r≤31

Сравнить с учетом переноса (Compare with Carry)

Rd-Rr-C

Z, C, N, V, H

CPI

Rd, К

16≤d≤31, 0≤K≤255

Сравнить с константой (Compare with Immediate)

Rd-K

Z, C, N, V, H

* Обозначение флагов регистра состояния SREG: Z – флаг нуля, C – флаг переноса, N – флаг отрицательного значения, V – флаг переполнения дополнительного кода, H – флаг вспомогательного переноса

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

Мнемо­ника

Операнды

Описание

Операция

Флаги

LSL

Rd

0≤d≤31

Логически сдвинуть влево (Logical Shift Left)

Rd(n+1)Rd(n),

Rd(0)0, CRd(7)

Z,C,N,V,H

LSR

Rd

0≤d≤31

Логически сдвинуть вправо (Logical Shift Right)

Rd(n)Rd(n+1),

Rd(7) 0, CRd(0)

Z,C,N,V

ROL

Rd

0≤d≤31

Сдвинуть влево через перенос (Rotate Left through Carry)

Rd(0) C,

Rd(n+1)Rd(n),

CRd(7)

Z,C,N,V,H

ROR

Rd

0≤d≤31

Сдвинуть вправо через перенос (Rotate Right through Carry)

Rd(7) C,

Rd(n)Rd(n+1),

C  Rd(0)

Z,C,N,V

ASR

Rd

0≤d≤31

Арифметически сдвинуть вправо (Arithmetic Shift Right)

Rd(n)Rd(n+1), n=0...6, C Rd(0), Rd(7)  Rd(7)

Z,C,N,V

BSET

s, 0≤s≤7

Установить флаг (Bit Set in SREG)

SREG(s) 1

SREG(s)

SWAP

Rd 0≤d≤31

Поменять тетрады местами (Swap Nibbles)

Rd(3...0) <–>Rd(7...4)

Нет

BCLR

s, 0≤s≤7

Очистить флаг (Bit Clear in SREG)

SREG(s) 0

SREG(s)

SBI

P,b

O≤P≤31, 0≤b≤7

Установить бит в регистр I/O (Set Bit in I/O Register)

l/0(P,b) 1

Нет

Мнемо­ника

Операнды

Описание

Операция

Флаги

CBI

P,b

0≤P≤31, 0≤b≤7

Очистить бит в регистре I/O (Clear Bit in I/O Register)

l/0(P,b) 0

Нет

BST

Rd,b, 0≤d≤31, 0≤b≤7

Переписать бит из регистра во флаг Т (Bit Store from Bit in Register to T Flag in SREG)

Т Rd(b)

Т

BLD

Rd,b

0≤d≤31, 0≤b≤7

Загрузить Т флаг в бит регистра (Bit Load from the T Flag in SREG to a Bit in Register)

Rd(b)  Т

Нет

SEC

Установить флаг переноса (Set Carry Flag)

С 1

С

CLC

Очистить флаг переноса (Clear Carry Flag)

С0

С

SEN

Установить флаг отрицательного значения (Set Negative Flag)

N1

N

CLN

Очистить флаг отрица-тельного значения (Clear Negative Flag)

N0

N

SEZ

Установить флаг нулевого значения (Set Zero Flag)

Z1

Z

CLZ

Очистить флаг нулевого значения (Clear Zero Flag)

Z0

Z

SEI

Установить флаг глобального прерывания (Set Global Interrupt Flag)

I 1

I

Мнемо­ника

Операнды

Описание

Операция

Флаги

CLI

Очистить флаг глобаль-ного прерывания (Clear Global Interrupt Flag)

I0

I

SES

Установить флаг знака (Set Signed Flag)

S 1

S

CLS

Очистить флаг знака (Clear Signed Flag)

S0

S

SEV

Установить флаг переполнения (Set Overflow Flag)

V 1

V

CLV

Очистить флаг переполнения (Clear Overflow Flag)

V0

V

SET

Установить флаг Т (Set T Flag)

T1

T

CLT

Очистить флаг Т (Clear T Flag)

Т0

T

SEH

Установить флаг полу- переноса (Set Half Carry Flag)

Н 1

Н

CLH

Очистить флаг полу- переноса (Clear Half Carry Flag)

Очистить флаг полу переноса

Н0

NOP

Выполнить холостую команду (No Operation)

Выполнить холостую команду

SLEEP

Установить режим SLEEP (SLEEP)

Установить режим SLEEP

WDR

Сбросить сторожевой таймер (Watchdog Reset)

Сбросить сторожевой таймер

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

Мнемо­ника

Операнды

Описание

Операция

Флаги

ELPM

Расширенная загрузка из памяти программ в регистр R0 (Extended Load Program Memory)

R0(Z+

RAMPZ)

Нет

MOV

Rd,Rr

0≤d≤31, 0≤r≤31

Копировать регистр (Copy Register)

RdRr

Нет

LDI

Rd,k

16≤d≤31, 0≤k≤255

Загрузить непосредственное значение (Load Immediate)

RdK

Нет

LDS

Rd,k

0≤d≤31, 0≤k≤65535

Загрузить из ОЗУ (Load Direct from data space)

Rd(k)

Нет

LD

Rd,X

0≤d≤31

Загрузить косвенно (Load Indirect from data space to Register using Index X: Unchanged)

Rd  (X)

Нет

LD

Rd,X+

0≤d≤31

Загрузить косвенно с постинкрементном (Load Indirect from data space to Register using Index X: Post incremented)

Rd  (X),

XX+1

Нет

LD

Rd,-X

0≤d≤31

Загрузить косвенно с преддекрементом (Load Indirect from data space to Register using Index X: Pre decremented)

XX-1,

Rd  (X)

Нет

LD

Rd,Y

0≤d≤31

Загрузить косвенно (Load Indirect from data space to Register using Index Y: Unchanged)

Rd(Y),

Нет

Мнемо­ника

Операнды

Описание

Операция

Флаги

LD

Rd,Y+

0≤d≤31

Загрузить косвенно с постинкрементом (Load Indirect from data space to Register using Index Y: Pre incremented)

Rd(Y),

YY+1

Нет

LD

Rd,-Y

0≤d≤31

Загрузить косвенно с преддекрементом (Load Indirect from data space to Register using Index Y: Pre decremented)

YY-1,

Rd  (Y)

Нет

LDD

Rd,Y+q

0≤d≤31, 0≤q≤63

Загрузить косвенно со смещением (Load Indirect from data space to Register using Index Y: Unchanged, q: Displacement)

Rd(Y+q)

Нет

LD

Rd,Z

0≤d≤31

Загрузить косвенно (Load Indirect from data space to Register using Index Z: Unchanged)

Rd  (Z)

Нет

LD

Rd,Z+

0≤d≤31

Загрузить косвенно с постинкрементом (Load Indirect from data space to Register using Index Z: Post incremented)

Rd  (Z), ZZ+1

Нет

LD

Rd,-Z

0≤d≤31

Загрузить косвенно с преддекрементом (Load Indirect from data space to Register using Index Z: Pre decremented)

ZZ-1, Rd(Z)

Нет

LDD

Rd,Z+q

0≤d≤31, 0≤q≤31

Загрузить косвенно со смещением, (Load Indirect from data space to Register using Index Z: Unchanged, q: Displacement)

Rd  (Z+q)

Нет

Мнемо­ника

Операнды

Описание

Операция

Флаги

STS

k,Rr

0≤d≤31, 0≤k≤65535

Загрузить непосредственно в ОЗУ (Store Direct to data space)

(k) Rr

Нет

ST

X,Rr

0≤r≤31

Записать косвенно (Store Indirect From Register to data space using Index X: Unchanged)

(X)  Rr

Нет

ST

X+,Rr

0≤r≤31

Записать косвенно с пост-инкрементом (Store Indirect From Register to data space using Index X: Pre incremented)

(X) Rr, XX+ 1

Нет

ST

-X,Rr

0≤r≤31

Записать косвенно с пред-декрементом (Store Indirect From Register to data space using Index X: Post decremented)

XX-1,

(X) Rr

Нет

ST

Y,Rr

0≤r≤31

Записать косвенно (Store Indirect From Register to data space using Index Y: Unchanged)

(Y) Rr

Нет

ST

Y+,Rr

0≤r≤31

Записать косвенно с пост-инкрементом (Store Indirect From Register to data space using Index Y: Post incremented)

(Y)  Rr, YY+ 1

Нет

ST

-Y,Rr

0≤r≤31

Записать косвенно с пред-декрементом (Store Indirect From Register to data space using Index Y: Pre decremented)

YY-1,

(Y) Rr

Нет

STD

Y+q,Rr

0≤r≤31, 0≤q≤63

Записать косвенно со смещением (Store Indirect From Register to data space using Index Y: Unchanged, q: Displacement)

(Y+q)Rr

Нет

Мнемо­ника

Операнды

Описание

Операция

Флаги

ST

Z,Rr

0≤r≤31

Записать косвенно (Store Indirect From Register to data space using Index Z: Unchanged)

(Z) Rr

Нет

ST

Z+,Rr

0≤r≤31

Записать косвенно с постинкрементом (Store Indirect From Register to data space using Index Z: Post incremented)

(Z)  Rr, ZZ+ 1

Нет

ST

-Z,Rr

0≤r≤31

Записать косвенно с преддекрементом записать косвенно с преддекрементом (Store Indirect From Register to data space using Index Z: Pre decremented)

ZZ-1,

(Z)  Rr

Нет

STD

Z+q,Rr

0≤r≤31, 0≤q≤63

Записать косвенно со смещением (Store Indirect From Register to data space using Index Z: Unchanged, q: Displacement)

(Z+q)Rr

Нет

LPM

Загрузить байт из памяти программ (Load Program Memory)

R0  (Z)

Нет

IN

Rd,P

0≤d≤31, 0≤P≤63

Загрузить данные из порта I/O в регистр (Load an I/O Location to Register)

RdP

Нет

OUT

P,Rr

0≤r≤31, 0≤P≤63

Записать данные из регистра в порт I/O (Store Register to I/O Location)

PRr

Нет

PUSH

Rr

0≤r≤31

Сохранить регистр в стеке (Push Register on Stack)

STACK Rr

Нет

Мнемо­ника

Операнды

Описание

Операция

Флаги

POP

Rr

0≤r≤31

Загрузить в регистр из стека (Pop Register from Stack)

Rr  STACK

Нет

Таблица П1.4. Команды передачи управления

Мнемо­ника

Операнды

Описание

Операция

Флаги

RJMP

k

-2K<k<2K

Перейти относительно (Relative Jump)

PC PC+k+1

Нет

IJMP

Перейти косвенно (Indirect Jump)

PCZ

Нет

JMP

k 0<k<4M

Перейти (Jump)

PCk

Нет

RCALL

k

-2K≤k≤2K

Вызвать подпрограмму относительно (Relative Call to Subroutine)

PC PC+k+1,

STACK PC+1, SP  SP -2

Нет

ICALL

Вызвать подпрограмму косвенно (Indirect Call to Subroutine)

PCZ, STACKPC+1, SP SP- 2

Нет

CALL

k

0≤k≤64K

Выполнить длинный вызов подпрограммы (Long Call to a Subroutine)

PCk , STACKPC+1, SP SP- 3

Нет

RET

Вернуться из подпрограммы (Return from Subroutine)

PC  STACK

Нет

RETI

Вернуться из прерывания (Return from Interrupt)

PC  STACK

I

CPSE

Rd,Rr

0≤d≤31, 0≤r≤31

Сравнить и пропустить, если равно (Compare Skip if Equal)

If Rd=Rr then

PC  PC + 2 (or 3)

Нет

Мнемо­ника

Операнды

Описание

Операция

Флаги

SBRC

Rr,b

0≤r≤31, 0≤b≤7

Пропустить, если бит в регистре очищен (Skip if Bit in Register is Cleared)

if Rr(b)=0 then

PC  PC + 2 (or 3)

Нет

SBRS

Rr,b

0≤r≤31, 0≤b≤7

Пропустить, если бит в регистре установлен (Skip if Bit in Register is Set)

If Rr(b)=1 then

PC PC + 2 (or 3)

Нет

SBIC

P,b

0≤P≤31, 0≤b≤7

Пропустить, если бит в регистре I/O очищен (Skip if Bit in I/O Register is Cleared)

if l/O P(b)=0 then

PC  PC + 2 (or 3)

Нет

SBIS

P,b

0≤r≤31, 0≤b≤7

Пропустить, если бит в регистре I/O установлен (Skip if Bit in I/O Register is Set)

If l/O P(b)=1 then

PC PC + 2 (or 3)

Нет

BRBS

s,k

0≤s≤7, -64≤k≤+63

Перейти, если бит в регистре статуса установлен (Branch if Bit in SREG is Set)

if SREG(s)=1 then

PC  PC + k + 1

Нет

BRBC

s,k

0≤s≤7, -64≤k≤+63

Перейти, если бит в регистре статуса очищен (Branch if Bit in SREG is Cleared)

if SREG(s)=0 then

PC  PC + k + 1

Нет

BREQ

k

-64≤k≤+63

Перейти, если равно (Branch if Equal)

if Rd=Rr (Z=1) then

PC  PC + k + 1

Нет

BRNE

k

-64≤k≤+63

Перейти, если не равно (Branch if Not Equal)

if RdRr(Z=0) then PC<PC+ k+ 1

Нет

BRCS

k

-64k+63

Перейти, если флаг переноса установлен (Branch if Carry Set)

if C=1 then

PC  PC + k + 1

Нет

Мнемо­ника

Операнды

Описание

Операция

Флаги

BRCC

k

-64≤k≤+63

Перейти, если флаг переноса очищен (Branch if Carry Cleared)

if C=0 then

PC  PC + k + 1

Нет

BRSH

K

-64≤k≤+63

Перейти, если равно или больше (без знака) (Branch if Same or Higher (Unsigned))

if Rd<Rr(C=0) then PCPC+ k+ 1

Нет

BRLO

k

-64≤k≤+63

Перейти, если меньше (без знака) (Branch if Lower (Unsigned))

if Rd<Rr (C=1) then PC PC + k + 1

Нет

BRMI

k

-64≤k≤+63

Перейти, если минус (Branch if Minus)

if N=1 then

PC  PC + k + 1

Нет

BRPL

k

-64≤k≤+63

Перейти, если плюс (Branch if Plus)

if N=0 then

PC  PC + k + 1

Нет

BRGE

k

-64≤k≤+63

Перейти, если больше или равно (с учетом знака) (Branch if Greater or Equal (Signed))

if Rd>Rr (NV=0) then PC  PC + k + 1

Нет

BRLT

k

-64≤k≤+63

Перейти, если меньше чем (со знаком) (Branch if Less Than (Signed))

if Rd<Rr (NV=1)then PC PC + k+ 1

Нет

BRHS

K

-64≤k≤+63

Перейти, если флаг полупереноса установлен (Branch if Half Carry Flag is Set)

if H=1 then

PC  PC + k + 1

Нет

BRHC

k

-64≤k≤+63

Перейти, если флаг полупереноса очищен (Branch if Half Carry Flag is Cleared)

if H=0 then

PC  PC + k + 1

Нет

Мнемо­ника

Операнды

Описание

Операция

Флаги

BRTS

k

-64≤k≤+63

Перейти, если флаг Т установлен (Branch if the T Flag is Set)

if T=1 then

PC  PC + k + 1

Нет

BRTC

k

-64≤k≤+63

Перейти, если флаг Т очищен (Branch if the T Flag is Cleared)

if T=0 then

PC  pc + k + 1

Нет

BRVS

k

-64≤k≤+63

Перейти, если флаг переполнения установлен (Branch if Overflow Set)

if V=1 then

PC  PC + k + 1

Нет

BRVC

k

-64≤k≤+63

Перейти, если флаг переполнения очищен (Branch if Overflow Cleared)

if V=0 then

PC  PC + k + 1

Нет

BRIE

k

-64≤k≤+63

Перейти, если глобальное прерывание разрешено (Branch if Global Interrupt is Enabled)

if I=1 then

PC  PC + k + 1

Нет

BRID

k

-64kk+63

Перейти, если глобальное прерывание запрещено (Branch if Global Interrupt is Disabled)

if I=0 then

PC  PC + k + 1

Нет

П2. Приложение 2. Главное меню программы AVR Studio

Раздел

Команды

Описание команд

File

New File

Создать пустой текстовый файл

Open File

Открыть файл в текстовом редакторе или объектный файл для отладки

Close

Закрыть активный текстовый файл

Save

Сохранить текущий файл

Save As...

Сохранить текущий текстовый файл под другим именем

Save All

Сохранить все файлы и параметры проекта

Print

Печатать активный текстовый файл

Print Preview

Предварительный просмотр активного текстового файла

Print Setup

Настройка печати

Exit

Выход из программы AVR Studio

Project

Project Wizard

Мастер проектов (открытие проекта, создание нового, выбор из списка последних проектов)

New Project

Открыть диалоговое окно нового проекта

Open Project

Открыть проект

Save Project

Сохранить текущий проект

Close Project

Закрыть текущий проект

Recent Projects

Показать список последних проектов

Configuration Options

Параметры конфигурации проекта

Build

Build

Сборать текущийо проект

Build and run

Собрать и начать сеанс отладки проекта

Edit

Undo

Отменить последнее действие

Redo

Повторить отмененное действие

Cut

Вырезать и копировать выделенный текст

Copy

Копировать

Paste

Вставить

Toggle Bookmark

Установит/снять закладку на выбранной строке

Remove

Bookmarks

Удалить все закладки

Find

Открыть диалоговое окно для поиска

Find in Files

Поиск в файлах

Next Error

Найти и перейти к следующей ошибке

Show whitespace

Показать пробельные символы

Font and color

Шрифт и цвет

View

Toolbars ►

Панели инструментов

Standard toolbar

Стандартная панель инструментов

Edit

Панель инструментов редактирования

Debug

Панель инструментов отладки

Debug Windows

Панель инструментов выбора окон отладки

MDI Tabs

Панель MDI вкладки

AVRGCC- PLUGIN

Панель AVR GCC панели

STK500

Панель STK500 панели

TraceBar

Панель трассировки

I/O

Панель ввода / вывода

Processor

Панель процессора

Build Output

Панель сборки

Message Output

Панель сообщений

Find Output

Панель поиска

Breakpoints and Tracepoints

Панель точек остановки и трассировки

AVR GCC

Проект AVR GCC

Status Bar

Панель строки состояния

Disassembler

Панель дизассемблера

Watch

Панель просмотра

Memory

Панель памяти программ

Memory 2

Панель области памяти ввода/вывода

Memory 3

Панель области памяти РОН

Register

РОН

Tools

Customize...

Панель настройки

Options...

Панель параметров

Show Key Assignments

Панель помощи работе с клавиатурой

Plug-in Manager

Управление подключением модулей

Debug

Start Debugging

Начать отладку

Stop Debugging

Остановить отладку

Run

Выполнить код

Break

Прервать

Reset

Сброс

Step Into (F11)

Выполнить один шаг

Step Over (F10)

Один шаг или шаг с остановкой за текущей командой вызова функции

Step Out (Shift+F11)

Шаг с выходом из текущей функции

Run to Cursor

Выполнить до курсора

Auto Step

Авто шаг

Toggle Breakpoint

Установить точку останова в текущей позиции курсора

Remove all Breakpoints

Удалить все точки останова

Trace

Команды трассировки

Show Next Statement

Показать следующий выбранный параметр

Quickwatch

Быстрая проверка

Select Platform and Device

Выбор платформы и устройства

Up/Download Memory

Открыть диалог для загрузки блоков памяти

AVR Simulator Options

Настройка эмулятора

Window

Workspace

Настройка рабочей среды

Split

Преобразовать текущее окно в два

Cascade

Каскад текущих окон

Tile Horizontally

Горизонтальный каскад текущих окон

Tile Vertically

Вертикальный каскад текущих окон

Arrange Icons

Упорядочить значки

Windows

Управление открытыми окнами

Help

AVR Tools User Guide

Руководство пользователя AVR

AVR Studio User Guide

Руководство пользователя AVR Studio

Release Notes and Known Issues

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

AVR GCC Plug-in Help

Показать AVR GCC IDE инструкцию

avr-libc Reference Manual

Справочное руководство AVR

About AVR Studio...

Информация о версии AVR Studio

П3. Приложение 3. Программа Индикации исполняемого кода программы

П3.1. Назначение и характеристика

Программа предназначена для индикации заданной области кода программы на четырех восьмисегментных индикаторах модуля «Микроконтроллер». Программа написана на языке AVR Assembler для микроконтроллера ATmega 8535. Имя проекта и имя папки размещения его файлов – IndCode_Main.

Код ассемблерного текста программы содержится в шести файлах:

IndCode_Main.asm – главная программа;

CopyCodaï.inc – подпрограмма копирования заданной области кода;

WriteTablSimv.inc – подпрограмма записи таблицы индицируемых символов текста программы;

DIN_IND.inc – подпрограмма динамической индикации;

Delay.inc –задержки для динамической индикации;

WorkStudent.inc – подпрограмма работы студента, исполняемой части подпрограммы заполняется студентом при подготовке к работе.

П3.2. Используемая информация

Входная информация приведена в таблице П3.1.

Таблица П3.1. Входная информация

Наименование

Обозначение

Характе-ристика

Источник

Бит клавиши PD4

BitPD4

1 байт

PORTD

Нормативно-справочная информация представлена в таблице П3.2

Таблица П3.2. Нормативно-справочная информация

Наименование

Обозначение

Характе-ристика

Источник

Адрес начала области кода

BeginByte

2 байта

Текст программы

Число байт области кода

QntyByte

1 байт

-"-

Таблица кодов символов

TablCodovSimvolov

16 байта

-"-

Число байт области кода

QntyByte

1 байт

-"-

Промежуточная информация представлена в таблице П3.3

Таблица П3.3. Промежуточная информация

Наименование

Обозначение

Характеристика

Таблица индицируемых символов

TablSimvolov

4 байта

Номер индикатора

N_Indicatora

1 байт

Номер индицируемого байта

N_Byte

1 байт

Предыдущее состояние бита PD4

AltPD4

1 байт

Таблица индицируемых байт кода

Tabl_IndByte

QntyByte байт

П3.3. Результаты решения

Выходная информация представлена в таблице П3.4

Таблица П3.4. Выходная информация

Наименование

Обозначение

Характеристика

Приемник

Код символа

CodSimvola

1 байта

PORTC

Код выбора индикатора

CodIndicatora

1 байт

PORTD

П3.4. Техническая сущность задачи

Программа реализует следующие функции:

1) предустановку стека;

2) предустановку портов ввод/вывода;

3) копирование заданной области кода программы;

4) запись таблицы индицируемых символов;

5) динамическую индикацию символов кода;

6) временную задержку для динамической индикации.

Для этого код копируется в память данных. Область копируемых кодов задается начальным адресом и количеством байт кода. Индикация скопированных кодов осуществляется на четырех восьмисегментных индикаторах микропроцессорного модуля. На первые два индикатора выводится номер байта в скопированной области, а на третий и четвертый индикатор – сам код. Переход к индикации следующего байта кода осуществляется циклически по нажатию кнопки модуля, подключенной к выводу четвертого бита порта D микропроцессорного модуля.

П3. Текст программы

;--------------------------------------------------------------------------------------

;Файл IndCode_Main.asm проекта IndCode_Main ;индикации кода

;--------------------------------------------------------------------------------------

.nolist ;Не включать в листинг

.include "m8535def.inc" ;Подключение файла

.list ;Включать в листинг

.def temp = r16

.def temp1 = r17

.def temp2 = r18

;Задание области кода с адреса 32 размером 4 байта

;.equ BeginByte = 32 ;Начало кода

;.equ EndByte = 4 ;Число байт кода

;Задание области кода всей программы

.equ BeginByte = 2*RESET ;Начало индицируемого кода

.equ EndByte = 2*END;Число байт индицируемого кода

;Задание области кода подпрограммы CopyCodov

;.equ BeginByte = 2*CopyCodov;Начало кода

;.equ EndByte = 2*( EndCopyCoda- CopyCodov);Число байт кода

.dseg

;Начальный адрес размещения данных

.org $060

N_Indicatora:.byte 1 ;Номер индикатора

N_Byte: .byte 1 ;Номер индицируемого байта

TablSimvolov:.byte 4 ;Таблица индицируемых символов

;(два символа - номер байта, и два символа - сам байт)

AltPD4: .byte 1 ;Предыдущее состояние клавиши

;Начальный адрес таблицы кодов

.org $0100

;Табица индицируемых кодов размером End_Byte

Tabl_IndByte: .byte low(Qnty_Byte)

;Начальный адрес сегмента кода

.cseg

.org 0

;-----------------------------------------------

RESET: ;Адрес начала программы

;---Предустановка стека----

ldi temp,low(RAMEND)

out SPL,temp

ldi temp,high(RAMEND)

out SPH,temp

;---Предустановка портов ввода/вывода----------

ldi temp,0xFF;Порт С на вывод

out DDRC,temp

ldi temp,0xEF;Порт D(4) ввод, D(7-5, 3-0) вывод,

out DDRD,temp

;---Подключение подтягивающих резисторов порта D

ldi temp,0xF0

out PORTD,temp

;-----------------------------------------------

;П/п копирования кодов текста программы в ОЗУ

rcall CopyCoda

;-----------------------------------------------

;П/п копирования кодов текста программы в ОЗУ

rcall WorkStudent

;-----------------------------------------------

;Основной цикл программы индикации кода

main: ;Метка начала цикла

;П/п записи таблицы индицируемых символов программы

rcall WriteTablSimv

;П/п динамической индикации 4-х символов

rcall DIN_IND

;П/п задержки для динамической индикации

rcall Delay

rjmp main

;-----------------------------------------------

;Подключение файлов с текстами подпрограмм

.include "CopyCoda.inc"

.include "WriteTablSimv.inc"

.include "DIN_IND.inc"

.include "Delay.inc"

;-----------------------------------------------

END: ;Адрес конца программы

;-----------------------------------------------

;-----------------------------------------------

;Файл CopyCoda.inc п/п CopyCoda копирования кода

;области индицируемых байт в ОЗУ

.list ;Включить в листинг

CopyCoda:

;Xh<--адрес табл. индицируемых байт (ст.байт)

ldi Xh,high(Tabl_IndByte)

;Xl<--aдрес табл. индицируемых байт (мл.б.)

ldi Xl,low(Tabl_IndByte)

;Zh<--адрес начала индицируемого кода (ст.б.)

ldi Zh,high(BeginByte)

;Zl<-адрес начала индицируемого кода (мл.б.)

ldi Zl,low(BeginByte)

;temp<-- число байт индицируемого кода

ldi temp,QntyByte;

Loop:

lpm ;r0<--байт ПЗУ, адресуемый рег.парой Z

;Расчет адреса следующего байта кода

inc Zl ;Мл. байт

;Учет признака переноса Zh<--Zh+0+C

clr temp1

adc Zh,temp1;Ст. байт

;Запись байта в ОЗУ

mov temp1,r0 ;temp1<-r0

;Записсь в ОЗУ с постинкрементом адреса

st X+,temp1

;Расчет оставшихся байт программы

dec temp

;Переход пока не все байты считаны

brne Loop

ret

EndCopyCoda: ;Адрес конца п/п CopyCodov

;--------------------------------------------------------------------------------------

;--------------------------------------------------------------------------------------

;Файл WriteTablSimv.inc п/п WriteTablSimv записи таблицы

;индицируемых символов (№ байта и сам байт)

;Талица заполняется по нажатию клавиши, подключенной к PD4

.list ;Включить в листинг

.def BitPD4 = r16

WriteTablSimv:

in BitPD4, PIND ;Ввод из порта РIND

andi BitPD4, 0x10 ;Маскирование бита РD4

ldi Xh, high(AltPD4) ;Х<--Адрес значения PD4

ldi Xl, low(AltPD4)

ld temp1,X ;temp1<--Предыдущее значение PD4

;Сравнение текущего и предыдущего PD4

cp BitPD4, temp1

st X, BitPD4 ;Сохранеие предыдущего значения PD4

breq endPP ;Если равны, то выход из п/п

sbrs temp, 4 ;Если бит PD4=1, то пропуск

rjmp endPP ;Выход из п/п

;Х<--Адрес номера индицируемого байта

ldi Xh, high(N_Byte)

ldi Xl, low(N_Byte)

ld temp, X ;temp<--Номер индицируемого байта

inc temp ;Переход к следующему номеру байта

cpi temp, QntyByte ;Конец таблицы кодов

brne M ;Если не равно, то пропуск

clr temp ;Иначе обнуление номера

M: st X, temp ;Сохранение номера индицируемого байта

mov temp1, temp

Х<--Адрес TablSimvolov

ldi Xh, high(TablSimvolov) ;

ldi Xl, low(TablSimvolov)

andi temp1, 0xF0 ;Выделение старшей тетрады

swap temp1 ;Перестановка тетрад

st X+, temp1 ;Запись в таблицу ст. тетрады номера байта

mov temp1, temp

andi temp1, 0x0F ;Выделение мл. тетрады номера байта

st X+, temp1 ;Запись в таблицу мл. тетрады номера

ldi Yh, high(Tabl_IndByte);Y<--Адрес таблицы

ldi Yl, low(Tabl_IndByte)

add Yl, temp

clr temp

adc Yh, temp

ld temp, Y ;temp<-- код команды

mov temp1, temp

andi temp1, 0xF0 ;Выделение старшей тетрады команды

swap temp1

st X+,temp1 ;Запись в таблицу старшей тетрады команды

andi temp, 0x0F ;Выделение младшей тетрады команды

st X+,temp ;Запись в таблицу младшей тетрады команды

;Задержка для антидребезговой защиты

ldi r16,$04

D1:

ldi r17,$00

D2:

dec r18

D3:

dec r18

brne D3

dec r17

brne D2

dec r16

brne D1

endPP:

ret

EndWriteTablSimv: ;Адрес конца п/п WriteTablSimv

;------------------------------------------------------------------

;------------------------------------------------------------------

;Файл DIN_IND.inc п/п DIN_IND динамической индикации

.list ;Включить в листинг

.def CodSimvola = r16

;--------------------------------------------------------------------------------------

TablCodovSimvolov: ;Адрес начала таблицы кодов символов

.db $3F, $06, $5B, $4F, $66, $6D, $7D, $07, $7F, $6F, $77, $7C, $39, $5E, $79, $71

;Cody 0 1 2 3 4 5 6 7 8 9 A B C D E F

;--------------------------------------------------------------------------------------

;Начало П/П динам.индикации 4-х символов текста

DIN_IND:

;----Гашение индикаторов

clr CodSimvola

out PORTC, temp

;----Определение номера текущего индикатора

ldi Xh, high(N_Indicatora)

ldi Xl, low(N_Indicatora)

ld temp1, X

inc temp1

andi temp1, $03

st X, temp1

mov temp2, temp1

;----Определение кода выбора индикатора

inc temp2 ;К номеру индикатора прибавить 1

ldi temp,$10;Установить 1 в 4-ый разряд

CodInd:

ror temp ;Сдвиг вправо через перенос

dec temp2 ;Уменьшение на 1

brne CodInd ;Повторять пока не ноль

;----Выбор индикатора

;Добавление единицs в разряд 4 для сохранения

;подключенным подтягивающего резистора

ori temp, $40

out PORTD, temp ;Выбор индикатора

;----Определение символа

;Адрес начала таблицы символов

ldi Xh, high(TablSimvolov) ;ст. байт

ldi Xl, low(TablSimvolov) ;мл. байт

add Xl, temp1 ;Плюс порядковый номер символа

clr temp

adc Xh, temp ;Учет переноса

ld temp, X ;temp<- Символ

;----Определение кода, отображающего символ

;Умножение на 2 учитывает двубайтность команд в ПЗУ

ldi Zh, high(TablCodovSimvolov*2)

ldi Zl, low(TablCodovSimvolov*2)

;Z <--Адрес кода символа

;(адр.табл.+номер кода в табл. кодов)

add Zl, temp

clr temp

adc Zh, temp ;Учет переноса в старший байт адреса

lpm ;Загрузить в r0 код символа из ПЗУ

;----Вывод кода символа

out PORTC, r0

ret

EndDIN_IND: ;Адрес конца п/п динамической индикации

;------------------------------------------------------------------------------------------

;------------------------------------------------------------------------------------------

;Файл Delay.inc п/п Delay задержки для динамической индикации

.list ;Включить в листинг

;------------------------------------------

;П/п задержки для динамической индикации

Delay:

ldi r16,$0B

Delay1:

ldi r17,$E7

Delay2:

dec r17

brne Delay2

dec r16

brne Delay1

ret

EndDelay: ; Адрес конца п/п работы студента

;------------------------------------------------------------------------------------------

;------------------------------------------------------------------------------------------

;Файл WorkStudent.inc п/п

;п/п работы студента

;------------------------------------------------------------------------------------------

WorkStudent:

;Текст подпрограммы, разработанной по варианту задания:

;………………………………………………………………………

ret

EndWorkStudent: ; Адрес конца п/п работы студента

;------------------------------------------------------------------------------------------

Содержание

1. ЦЕЛЬ РАБОТЫ……………………………………………………..

3

2. ОПИСАНИЕ ЛАБОРАТОРНОго стенда……………………...

3

3. ПОДГОТОВКА К лабораторной РАБОТЕ …………………

27

4. РАБОЧЕЕ ЗАДАНИЕ ……………………………………………...

30

5. ОТЧЕТ ПО ЛАБОРАТОРНОЙ РАБОТЕ …………………………

31

6. РЕКОМЕНДАЦИИ ПО подготовке и ВЫПОЛНЕНИЮ     ЛАБОРАТОРНОЙ РАБОТЫ ……………………………………...

32

  Литература………………………………………………………..

32

П1. ПРИЛОЖЕНИЕ 1. СИСТЕМА КОМАНД МИКРОКОНТ-     РОЛЛЕРОВ СЕМЕЙСТВА AVR………………………………......

33

П2. Приложение 2. Главное меню программы AVR     Studio……………………………………………………………...

46

П3. Текст программы………………………...............................

53

Учебно-методическое издание

Максимов Владислав Михайлович

Аппаратные и программные средства лабораторного стенда на основе микроконтроллера ATmega8535

Методические указания к лабораторным работам

Подписано в печать Формат 6084/16 Тираж 100 экз.

Усл. печ. л. 3,75 Заказ Изд. № 71-10

127994, Москва, ул. Образцова, д. 9, стр.9..

Типография МИИТа.

60