
- •Аппаратные и программные средства лабораторного стенда на основе микроконтроллера aTmega8535
- •1. Цель работы
- •2. Описание лабораторнОго стенда
- •2.1. Микроконтроллер aTmega8535 семейства avr
- •2.2. Система команд микроконтроллера
- •2.3. Способы адресации данных микроконтроллера
- •2.4. Ассемблер микроконтроллеров avr
- •2.5. Программа avr Studio 4
- •2.6. Компиляция и отладка программы
- •2.7. Модуль «Микроконтроллер» лабораторного стенда
- •2.8. Включение лабораторного стенда
- •3. Подготовка к лабораторной работе
- •4. Рабочее задание
- •5. Отчет по лабораторной работе
- •6. Рекомендации по подготовке и выполнению лабораторной работы
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) |
RdRd-Rr-C |
Z, C, N, V, H |
SBCI |
Rd, К 16≤d≤32, 0≤K≤255 |
Вычесть непосредственное значение с заемом (Subtract Immediate with Carry) |
RdRd-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) |
RdSFF-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) |
RdRdRd |
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, CRd(7) |
Z,C,N,V,H |
LSR |
Rd 0≤d≤31 |
Логически сдвинуть вправо (Logical Shift Right) |
Rd(n)Rd(n+1), Rd(7) 0, CRd(0) |
Z,C,N,V |
ROL |
Rd 0≤d≤31 |
Сдвинуть влево через перенос (Rotate Left through Carry) |
Rd(0) C, Rd(n+1)Rd(n), CRd(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) |
N1 |
N |
CLN |
|
Очистить флаг отрица-тельного значения (Clear Negative Flag) |
N0 |
N |
SEZ |
|
Установить флаг нулевого значения (Set Zero Flag) |
Z1 |
Z |
CLZ |
|
Очистить флаг нулевого значения (Clear Zero Flag) |
Z0 |
Z |
SEI |
|
Установить флаг глобального прерывания (Set Global Interrupt Flag) |
I 1 |
I |
Мнемоника |
Операнды |
Описание |
Операция |
Флаги |
CLI |
|
Очистить флаг глобаль-ного прерывания (Clear Global Interrupt Flag) |
I0 |
I |
SES |
|
Установить флаг знака (Set Signed Flag) |
S 1 |
S |
CLS |
|
Очистить флаг знака (Clear Signed Flag) |
S0 |
S |
SEV |
|
Установить флаг переполнения (Set Overflow Flag) |
V 1 |
V |
CLV |
|
Очистить флаг переполнения (Clear Overflow Flag) |
V0 |
V |
SET |
|
Установить флаг Т (Set T Flag) |
T1 |
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) |
RdRr |
Нет |
LDI |
Rd,k 16≤d≤31, 0≤k≤255 |
Загрузить непосредственное значение (Load Immediate) |
RdK |
Нет |
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), XX+1 |
Нет |
LD |
Rd,-X 0≤d≤31 |
Загрузить косвенно с преддекрементом (Load Indirect from data space to Register using Index X: Pre decremented) |
XX-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), YY+1 |
Нет |
LD |
Rd,-Y 0≤d≤31 |
Загрузить косвенно с преддекрементом (Load Indirect from data space to Register using Index Y: Pre decremented) |
YY-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), ZZ+1 |
Нет |
LD |
Rd,-Z 0≤d≤31 |
Загрузить косвенно с преддекрементом (Load Indirect from data space to Register using Index Z: Pre decremented) |
ZZ-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, XX+ 1 |
Нет |
ST |
-X,Rr 0≤r≤31 |
Записать косвенно с пред-декрементом (Store Indirect From Register to data space using Index X: Post decremented) |
XX-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, YY+ 1 |
Нет |
ST |
-Y,Rr 0≤r≤31 |
Записать косвенно с пред-декрементом (Store Indirect From Register to data space using Index Y: Pre decremented) |
YY-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, ZZ+ 1 |
Нет |
ST |
-Z,Rr 0≤r≤31 |
Записать косвенно с преддекрементом записать косвенно с преддекрементом (Store Indirect From Register to data space using Index Z: Pre decremented) |
ZZ-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) |
RdP |
Нет |
OUT |
P,Rr 0≤r≤31, 0≤P≤63 |
Записать данные из регистра в порт I/O (Store Register to I/O Location) |
PRr |
Нет |
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) |
PCZ |
Нет |
JMP |
k 0<k<4M |
Перейти (Jump) |
PCk |
Нет |
RCALL |
k -2K≤k≤2K |
Вызвать подпрограмму относительно (Relative Call to Subroutine) |
PC PC+k+1, STACK PC+1, SP SP -2 |
Нет |
ICALL |
|
Вызвать подпрограмму косвенно (Indirect Call to Subroutine) |
PCZ, STACKPC+1, SP SP- 2 |
Нет |
CALL |
k 0≤k≤64K |
Выполнить длинный вызов подпрограммы (Long Call to a Subroutine) |
PCk , STACKPC+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 RdRr(Z=0) then PC<PC+ k+ 1 |
Нет |
BRCS |
k -64k+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 PCPC+ 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 (NV=0) then PC PC + k + 1 |
Нет |
BRLT |
k -64≤k≤+63 |
Перейти, если меньше чем (со знаком) (Branch if Less Than (Signed)) |
if Rd<Rr (NV=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 -64kk+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 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 |
Остановить отладку |
||
|
Выполнить код |
||
Break |
Прервать |
||
|
Сброс |
||
Step Into (F11) |
Выполнить один шаг |
||
Step Over (F10) |
Один шаг или шаг с остановкой за текущей командой вызова функции |
||
Step Out (Shift+F11) |
Шаг с выходом из текущей функции |
||
Run to Cursor |
Выполнить до курсора |
||
Auto Step |
Авто шаг |
||
|
Установить точку останова в текущей позиции курсора |
||
|
Удалить все точки останова |
||
Trace |
Команды трассировки |
||
Show Next Statement |
Показать следующий выбранный параметр |
||
|
Быстрая проверка |
||
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
Методические указания к лабораторным работам
Подписано в печать Формат 6084/16 Тираж 100 экз.
Усл. печ. л. 3,75 Заказ Изд. № 71-10
127994, Москва, ул. Образцова, д. 9, стр.9..
Типография МИИТа.