СОДЕРЖАНИЕ
1. Структура и функционирование микроконтроллера aTmega128
Регистр управления делением частоты кварцевого генератора – xdiv
2. Интегрированная система программирования avr Studio v4.12
3.Описание лабораторного стенда лс-2.
Работа №1 микроконтроллер aTmega128: методы адресации, команды передачи данных и управления
Работа №2 микроконтроллер aTmega128: команды обработки данных
Работа №3 цифровые системы на базе микроконтроллерa aTmega128:
Регистр управления внешними прерываниями – eicra и eicrb
16-Разрядные таймеры/счетчики t/c1 и t/c3
Регистры сравнения а таймеров/счетчиков - ocRxA
Работа №6 цифровые системы на базе микроконтроллера aTmega128:
Передача данных - Передатчик usart.
Прием данных - Приемник usart.
Работа №7 цифровые системы на базе микроконтроллера aTmega128:
Таблица 1.1. Команды пересылки данных
|
Мнемо-ника |
Операн-ды |
Описание |
Операция |
Флаги |
Кол-во циклов |
|
ELPM |
|
Расширенная загрузка из памяти программ в регистр R0 |
R0 (Z+RAMPZ) |
Нет |
3 |
|
MOV |
Rd,Rr 0d31 0r31 |
Копировать регистр |
Rd Rr |
Нет |
1 |
|
LDI |
Rd,K 16d31 0k255 |
Загрузить непосредственное значение |
Rd K |
Нет |
1 |
|
LDS |
Rd,k 0d31 0k65535 |
Загрузить из ОЗУ |
Rd (k) |
Нет |
3 |
|
LD |
Rd,X 0d31 |
Загрузить косвенно |
Rd (X) |
Нет |
2 |
|
LD |
Rd,X+ 0d31 |
Загрузить косвенно с постинкрементом |
Rd (X), X X+1 |
Нет |
2 |
|
LD |
Rd,-X 0d31 |
Загрузить косвенно с преддекрементом |
X X - 1, Rd (X) |
Нет |
2 |
|
LD |
Rd,Y 0d31 |
Загрузить косвенно |
Rd (Y), |
Нет |
2 |
|
LD |
Rd,Y+ 0d31 |
Загрузить косвенно с постинкрементом |
Rd (Y), Y Y+1 |
Нет |
2 |
|
LD |
Rd,-Y 0d31 |
Загрузить косвенно с преддекрементом |
Y Y - 1, Rd (Y) |
Нет |
2 |
|
LDD |
Rd,Y+q 0d31 0q63 |
Загрузить косвенно со смещением |
Rd (Y+q) |
Нет |
2 |
|
LD |
Rd,Z 0d31 |
Загрузить косвенно |
Rd (Z) |
Нет |
2 |
|
LD |
Rd,Z+ 0d31 |
Загрузить косвенно с постинкрементом |
Rd (Z), Z Z+1 |
Нет |
2 |
|
LD |
Rd,-Z 0d31 |
Загрузить косвенно с преддекрементом |
Z Z - 1, Rd (Z) |
Нет |
2 |
|
LDD |
Rd,Z+q 0d31 0q31 |
Загрузить косвенно со смещением |
Rd (Z+q) |
Нет |
2 |
|
STS |
k,Rr 0r31 0k65535 |
Загрузить непосредственно в ОЗУ |
(k) Rr |
Нет |
3 |
|
ST |
X,Rr 0r31 |
Записать косвенно |
(X) Rr |
Нет |
2 |
|
ST |
X+,Rr 0r31 |
Записать косвенно с постинкрементом |
(X) Rr, X X + 1 |
Нет |
2 |
|
ST |
-X,Rr 0r31 |
Записать косвенно с преддекрементом |
X X - 1, (X) Rr |
Нет |
2 |
|
ST |
Y,Rr 0r31 |
Записать косвенно |
(Y) Rr |
Нет |
2 |
|
ST |
Y+,Rr 0r31 |
Записать косвенно с постинкрементом |
(Y) Rr, Y Y + 1 |
Нет |
2 |
|
ST |
-Y,Rr 0r31 |
Записать косвенно с преддекрементом |
Y Y - 1, (Y) Rr |
Нет |
2 |
|
STD |
Y+q,Rr 0r31 0q63 |
Записать косвенно со смещением |
(Y+q) Rr |
Нет |
2 |
|
ST |
Z,Rr 0r31 |
Записать косвенно |
(Z) Rr |
Нет |
2 |
|
ST |
Z+,Rr 0r31 |
Записать косвенно с постинкрементом |
(Z) Rr, Z Z + 1 |
Нет |
2 |
|
ST |
-Z,Rr 0r31 |
Записать косвенно с преддекрементом |
Z Z - 1, (Z) Rr |
Нет |
2 |
|
STD |
Z+q,Rr 0r31 0q63 |
Записать косвенно со смещением |
(Z+q) Rr |
Нет |
2 |
|
LPM |
|
Загрузить байт из памяти программ |
R0 (Z) |
Нет |
3 |
|
IN |
Rd,P 0d31 0P63 |
Загрузить данные из порта I/O в регистр |
Rd P |
Нет |
1 |
|
OUT |
P,Rr 0r31 0P63 |
Записать данные из регистра в порт I/O |
P Rr |
Нет |
1 |
|
PUSH |
Rr 0r31 |
Сохранить регистр в стеке |
STACK Rr |
Нет |
2 |
|
POP |
Rd 0d31 |
Выгрузить регистр из стека |
Rd STACK |
Нет |
2 |
Команды ELPM и LPM выполняют загрузку памяти программ. Команда MOV копирует содержимое одного регистра общего назначения в другой. Команда LDI загружает регистр общего назначения непосредственно константой (только R16 – R32), а команды LD выполняют загрузку регистра из ячейки ОЗУ при косвенной адресации, используя в качестве источника адреса регистры X, Y, Z, а также варианты с постинкрементом и преддекрементом источника. Команда LDD выполняет эту же операцию при помощи косвенной адресации со смещением. Команда LDS загружает в регистр общего назначения содержимое прямо адресуемой ячейки памяти данных.
Команда ST выполняют обратную операцию относительно LD – заносит в косвенно адресуемую ячейку памяти данных содержимое регистра общего назначения, используя также варианты с постинкрементом и преддекрементом адреса. Команда STD выполняет эту же операцию при помощи косвенной адресации со смещением, а команда STS прямо адресует ячейку ОЗУ.
Команда IN заносит содержимое регистра ввода-вывода в регистр общего назначения, а команда OUT выполняет обратную операцию.
Команда PUSH сохраняет содержимое регистра в стеке, а команда POP выполняет обратную операцию. При выполнении этих команд кроме программного счетчика изменяется и значение указателя стека SP.
Обратите внимание, что метод адресации не указывается
Команды передачи управления (переходов) приведены в Табл.1.2.
Таблица 1.2. Команды переходов
|
Мнемо-ника |
Операн-ды |
Описание |
Операция |
Флаги |
Кол-во циклов |
|
RJMP |
k -2Kk2K |
Перейти относительно |
PC PC + k + 1 |
Нет |
2 |
|
LJMP |
|
Перейти косвенно |
PC Z |
Нет |
2 |
|
JMP |
k 0k4M |
Перейти |
PC k |
Нет |
3 |
|
RCALL |
K -2Kk2K |
Вызвать подпрограмму относительно |
PC PC + k + 1 |
Нет |
3 |
|
ICALL |
|
Вызвать подпрограмму косвенно |
PC Z |
Нет |
3 |
|
CALL |
K 0k64K |
Выполнить длинный вызов подпрограммы |
PC k |
Нет |
4 |
|
RET |
|
Вернуться из подпрограммы |
PC STACK |
Нет |
4 |
|
RETI |
|
Вернуться из прерывания |
PC STACK |
1 |
4 |
|
CPSE |
Rd,Rr 0d31, 0r31 |
Сравнить и пропустить, если равно |
if Rd=Rr then PC PC + 2 (or 3) |
Нет |
1/2/3 |
|
SBRC |
Rr,b 0r31 0b7 |
Пропустить, если бит в регистре очищен |
if Rr(b)=0 then PC PC + 2 (or 3) |
Нет |
1/2/3 |
|
SBRS |
Rr,b 0r31 0b7 |
Пропустить, если бит в регистре установлен |
if Rr(b)=1 then PC PC + 2 (or 3) |
Нет |
1/2/3 |
|
SBIC |
P,b 0P31 0b7 |
Пропустить, если бит в регистре I/O очищен
|
if I/OP(b)=0 then PC PC + 2 (or 3) |
Нет |
1/2/3 |
|
SBIS |
P,b 0r31 0b7 |
Пропустить, если бит в регистре I/O установлен |
if I/OP(b)=1 then PC PC + 2 (or 3) |
Нет |
1/2/3 |
|
BRBS |
s,k 0s7 -64k+63 |
Перейти, если бит в регистре статуса установлен |
if SREG(s)=1 then PC PC + k + 1 |
Нет |
1/2 |
|
BRBC |
s,k 0s7 -64k+63 |
Перейти, если бит в регистре статуса очищен |
if SREG(s)=0 then PC PC + k + 1 |
Нет |
1/2 |
|
BREQ |
k -64k+63 |
Перейти, если равно |
if Rd=Rr(Z=1) then PC PC + k + 1 |
Нет |
1/2 |
|
BRNE |
k -64k+63 |
Перейти, если не равно |
if RdRr(Z=0) then PC PC + k + 1 |
Нет |
1/2 |
|
BRCS |
k -64k+63 |
Перейти, если флаг переноса установлен |
if С=1 then PC PC + k + 1 |
Нет |
1/2 |
|
BRCC |
k -64k+63 |
Перейти, если флаг переноса очищен |
if С=0 then PC PC + k + 1 |
Нет |
1/2 |
|
BRSH |
k -64k+63 |
Перейти, если равно или больше (без знака) |
if RdRr (C=0) then PC PC + k + 1 |
Нет |
1/2 |
|
BRLO |
k -64k+63 |
Перейти, если меньше (без знака) |
if Rd<Rr (C=1) then PC PC + k + 1 |
Нет |
1/2 |
|
BRMI |
k -64k+63 |
Перейти, если минус |
if N=1 then PC PC + k + 1 |
Нет |
1/2 |
|
BRPL |
k -64k+63 |
Перейти, если плюс |
if N=0 then PC PC + k + 1 |
Нет |
1/2 |
|
BRGE |
k -64k+63 |
Перейти, если больше или равно (с учетом знака) |
if RdRr (NV=0) then PC PC + k + 1 |
Нет |
1/2 |
|
BRLT |
k -64k+63 |
Перейти, если меньше чем (со знаком) |
if Rd<Rr (NV=1) then PC PC + k + 1 |
Нет |
1/2 |
|
BRHS |
k -64k+63 |
Перейти, если флаг полупереноса установлен |
if H=1 then PC PC + k + 1 |
Нет |
1/2 |
|
BRHC |
k -64k+63 |
Перейти, если флаг полупереноса очищен |
if H=0 then PC PC + k + 1 |
Нет |
1/2 |
|
BRTS |
k -64k+63 |
Перейти, если флаг T установлен |
if T=1 then PC PC + k + 1 |
Нет |
1/2 |
|
BRTC |
k -64k+63 |
Перейти, если флаг T очищен |
if T=0 then PC PC + k + 1 |
Нет |
1/2 |
|
BRVS |
k -64k+63 |
Перейти, если флаг переполнения установлен |
if V=1 then PC PC + k + 1 |
Нет |
1/2 |
|
BRVC |
k -64k+63 |
Перейти, если флаг переполнения очищен |
if V=0 then PC PC + k + 1 |
Нет |
1/2 |
|
BRIE |
k -64k+63 |
Перейти, если глобальное прерывание разрешено |
if I=1 then PC PC + k + 1 |
Нет |
1/2 |
|
BRID |
k -64k+63 |
Перейти, если глобальное прерывание запрещено |
if I=0 then PC PC + k + 1 |
Нет |
1/2 |
ВЫПОЛНЕНИЕ ОСНОВНОГО ЗАДАНИЯ
1. Изучить описание структуры микроконтроллера ATmega128 и интегрированной системы его программирования на языке Ассемблер AVRStudio.
2. Изучить реализуемые микроконтроллером способы адресации и команды пересылки данных.
3. Запустить на персональном компьютере интегрированную систему программирования AVRStudio. Командой ProjectNew Project создать новый проект Lesson1. С использованием редактора текста создать демонстрационную программу:
.device ATmega128
.include "m128def.inc"
;***** Инициализация указателя стека ********************************
ldi R20, $FF ; загрузка промежуточного регистра R20 младшим
; байтом адреса начала стека
out SPL, R20 ; загрузка младшего байта указателя стека
ldi R20, $10 ; загрузка промежуточного регистра R20 старшим
; байтом адреса начала стека
out SPH, R20 ; загрузка старшего байта указатель стека
;***** Выполнение команд пересылок ********************************
ldi R20, $57 ; загрузка регистра R20 константой
ldi R30, $00 ; загрузка регистровой пары Z (R30,R31) адресом $0100
ldi R31, $01 ; по которому расположена первая ячейка внутреннего ОЗУ
st Z, R20 ; загрузка косвенно адресуемой ячейки ОЗУ с адресом $0100
; значением из регистра R20 ($57)
lds R19, $0100 ; загрузка регистра R19 из ячейки ОЗУ с адресом $0100
sts $0101, R19 ; загрузка ячейки с адресом $0101 из регистра R19
call Rout ; вызов подпрограммы Rout
loop:
rjmp loop ; зацикливание программы
;***** Подпрограмма копирования значения из памяти программ ***************
Rout:
push R30 ; сохранение указателя Z в стеке
push R31 ;
ldi R20, $00 ; загрузка регистра R20 новой константой
ldi R30, $80 ; загрузка регистровой пары Z удвоенным адресом ячейки
ldi R31, $00 ; памяти программ
lpm ; загрузка регистра R0 значением ячейки памяти программ
; с адресом $0040
cpse R0, R20 ; пропустить следующую команду если значения регистров
; R0 и R20 равно
sts $0102, R0 ; загрузка ячейки ОЗУ с адресом $0102 из регистра R0
pop R31 ; извлечение указателя Z из стека
pop R30 ;
ret ; возврат из подпрограммы
;**************************************************************************
4. Выполнить команду Project/Buildдля компиляции проекта.
5. С помощью команды Debug/StartDebugging запустить симулятор. Командой View/Memory открыть окно с ячейками памяти программ. Прямым редактированием занести любой код в ячейку $40 памяти программ.
6. Выполнить программу по шагам, выполняя команду Debug/StepIntro(F11). После выполнения текущей команды курсор в окне редактора текста указывает на следующую команду.
7. Проверить правильность пересылки данных.
8. Составить программу выполнения заданной преподавателем последовательности операций передачи данных, провести пошаговый прогон программы, продемонстрировать полученный результат.
Цель работы:изучение команд арифметических и логических операций, сдвигов и битовых операций, практическое освоение приемов программирования на ассемблере, изучение директив.