ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 23.01.2025
Просмотров: 3669
Скачиваний: 8
СОДЕРЖАНИЕ
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. Из таблицы видно, что набор этих команд представляет собой сочетание восьми операций с различными методами адресации.
Таблица 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.1 и табл.1.2 видно, что команды пересылки данных и команды переходов значения флагов регистра sreg не изменяют.
ВЫПОЛНЕНИЕ ОСНОВНОГО ЗАДАНИЯ
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. Составить программу выполнения заданной преподавателем последовательности операций передачи данных, провести пошаговый прогон программы, продемонстрировать полученный результат.
Работа №2 микроконтроллер aTmega128: команды обработки данных
Цель работы:изучение команд арифметических и логических операций, сдвигов и битовых операций, практическое освоение приемов программирования на ассемблере, изучение директив.