Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Изучение работы с портами ввода/вывода МК AVR
Цель работы: знакомство со структурой и принципами функционирования портовввода/вывода МК AVR.
Задание 1.
Необходимо для рассмотренной в практической работе задачи написать программу на ассемблере, провести проверку, выставить флаги
Методические рекомендации по выполнению примера.
Создать проект в AVR Studio 4, написать и отладить программу, продемонстрировать преподавателю функционирование МК для данной задачи.
Пример выполнения задания на рис. 34.
Рис. 34. Рабочее окно AVR Studio 4 с результатами проверки задачи
Проверим правильность выставления флагов по выполнению команды сложения (результат на рис. 35) – все арифметические флаги =0, что подтверждает правильность теоретических расчетов в задании 1.
Рис. 35. Рабочее окно AVR Studio 4 с результатами проверки арифметических флагов
Задание 3. Получить у преподавателя задачу для реализации, выполнить задания № 1, 2 в соответствии с указанной методикой.
Ответить на контрольные вопросы.
Контрольные вопросы
1. Методика выставления арифметических флагов МК.
2. Методика работы в AVR Studio 4.
Литература
1. Микроконтроллеры AVR семейств Tiny и Mega фирмы ATMEL. Евстифеев А.В., 2-е изд., стер. – М.: Издательский дом «Додека – XXI», 2005. – 560с.
ПРИЛОЖЕНИЕ 1
Таблица 25. Система команд МК ATmega8515
Мнемоника | Операнды | Описание | Операция | Флаги | Кол-во тактов |
АРИФМЕТИЧЕСКИЕ И ЛОГИЧЕСКИЕ КОМАНДЫ | |||||
ADD | Rd, Rr | Сложение двух регистров общего назначения без учета переноса | Rd Rd + Rr | Z,C,N,V,H | |
ADC | Rd, Rr | Сложение двух регистров с учетом переноса | Rd Rd+Rr+C | Z,C,N,V,H | |
ADIW | Rdl, K | Сложение регистровой пары с константой | Rdh:Rdl Rdh:Rdl+K | Z,C,N,V,S | |
SUB | Rd, Rr | Разность двух регистров без учета переноса | Rd Rd - Rr | Z,C,N,V,H | |
SUBI | Rd*, K | Разность регистра и константы | Rd Rd - K | Z,C,N,V,H | |
SBC | Rd, Rr | Разность двух регистров с учетом переноса | RdRd-Rr - C | Z,C,N,V,H | |
SBCI | Rd*, K | Разность регистра и константы с учетом переноса | RdRd- K - C | Z,C,N,V,H | |
SBIW | Rdl, K | Вычитание константы из регистровой пары | Rdh:Rdl Rdh:Rdl - K | Z,C,N,V,S | |
MUL | Rd, Rr | Умножение беззнаковых чисел | R1:R0 Rd´Rr | Z,C | |
MULS | Rd, Rr | Умножение чисел со знаком | R1:R0 Rd´Rr | Z,C | |
AND | Rd, Rr | Логическое И двух регистров | Rd Rd Rr | Z,N,V | |
ANDI | Rd*, K | Логическое И регистра и константы | RdRd K | Z,N,V | |
OR | Rd, Rr | Логическое ИЛИ двух регистров | Rd Rd v Rr | Z,N,V | |
ORI | Rd*, K | Логическое ИЛИ регистра и константы | Rd Rd v K | Z,N,V | |
EOR | Rd, Rr | Исключающее ИЛИ двух регистров | Rd Rd vRr | Z,N,V | |
COM | Rd | Инверсия регистра | Rd $FF Rd | Z,C,N,V | |
NEG | Rd | Отрицание регистра | Rd $00 Rd | Z,C,N,V,H | |
INC | Rd | Инкремент | Rd Rd + 1 | Z,N,V | |
DEC | Rd | Декремент | Rd Rd 1 | Z,N,V | |
TST | Rd | Тестирование на ноль и минус | Rd Rd Rd | Z,N,V | |
CLR | Rd | Очистка регистра | Rd Rd Rd | Z,N,V | |
SER | Rd | Установка регистра в FF | Rd $FF | None | |
CP | Rd, Rr | Сравнение двух регистров | Rd -Rr | Z, N,V,C,H | |
CPC | Rd, Rr | Сравнение двух регистров с учетом переноса | Rd -Rr -C | Z, N,V,C,H | |
CPI | Rd*, K | Сравнение с константой | Rd -K | Z, N,V,C,H | |
КОМАНДЫ ПЕРЕДАЧИ УПРАВЛЕНИЯ | |||||
RJMP | k | Безусловный переход на метку k+1 | PC PC + k + 1 | None | |
IJMP | Переход на указатель (Z) | PC Z | None | ||
JMP | k | Переход на метку k | PC k | None | |
RCALL | k | Относительный вызов подпрограммы | PCPC + k + 1 | None | |
CALL | k | Абсолютный вызов подпрограммы | PC k | None | |
ICALL | Косвенный вызов подпрограммы | PC Z | None | ||
RET | Возврат из подпрограммы | PC STACK | None | ||
RETI | Возврат из подпрограммы обработки прерывания | PC STACK | I | ||
CPSE | Rd,Rr | Пропуск команды при равенстве двух РОН | if (Rd = Rr)PC PC + 2 or 3 | None | 1 / 2 / 3 |
SBRC | Rr, b | Пропустить команду, если разряд РОН сброшен | if (Rr(b)=0)PC PC + 2 or 3 | None | 1 / 2 |
SBRS | Rr, b | Пропустить команду, если разряд РОН установлен | if (Rr(b)=1)PC PC + 2 or 3 | None | 1 / 2 |
SBIC | P*, b | Пропустить команду, если разряд РВВ сброшен | if (P(b)=0)PC PC + 2 or 3 | None | 1 / 2 |
SBIS | P*, b | Пропустить команду, если разряд РВВ установлен | if (P(b)=1)PC PC + 2 or 3 | None | 1 / 2 |
BRBS | s, k | Переход, если разряд регистра SREG установлен | if (SREG(s)=1) then РCPC+k+1 | None | 1 / 2 |
BRBC | s, k | Переход, если разряд регистра SREG сброшен | if(SREG(s) = 0) then PCPC+k + 1 | None | 1 / 2 |
BREQ | k | Переход по «равно» | if (Z = 1) then PC PC + k + 1 | None | 1 / 2 |
BRCS | k | Переход по переносу | if (C = 1) then PC PC + k + 1 | None | 1 / 2 |
BRNE | k | Переход по «не равно» | if (Z = 0) then PC PC + k + 1 | None | 1 / 2 |
BRCC | k | Переход, если не было переноса | if (C = 0) then PC PC + k + 1 | None | 1 / 2 |
BRSH | k | Переход по «выше или равно» (для беззнаковых данных) | if (C = 0) then PC PC + k + 1 | None | 1 / 2 |
BRLO | k | Переход по «меньше» (для беззнаковых данных) | if (C = 1) then PC PC + k + 1 | None | 1 / 2 |
BRMI | k | Переход по «отрицательное значение» | if (N = 1) then PC PC + k + 1 | None | 1 / 2 |
BRPL | k | Переход по «положительное значение» | if (N = 0) then PC PC + k + 1 | None | 1 / 2 |
BRGE | k | Переход по «больше или равно» | if (N ÅV= 0) then PCPC+k + 1 | None | 1 / 2 |
BRLT | k | Переход по «меньше» | if (N ÅV= 1) then PCPC+k + 1 | None | 1 / 2 |
BRHS | k | Переход по половинному переносу | if (H = 1) then PC PC + k + 1 | None | 1 / 2 |
BRHC | k | Переход, если не было половинного переноса | if (H = 0) then PC PC + k + 1 | None | |
BRTS | k | Переход, если флаг Т установлен | if (T = 1) then PC PC + k + 1 | None | 1 / 2 |
BRTC | k | Переход, если флаг Т сброшен | if (T = 0) then PC PC + k + 1 | None | 1 / 2 |
BRVS | k | Переход по переполнению дополнительного кода | if (V = 1) then PC PC + k + 1 | None | 1 / 2 |
BRVC | k | Переход, если нет переполнения дополнительного кода | if (V = 0) then PC PC + k + 1 | None | 1 / 2 |
BRIE | k | Переход, если прерывания разрешены | if (I = 1) then PC PC + k + 1 | None | 1 / 2 |
BRID | k | Переход, если прерывания запрещены | if (I = 0) then PC PC + k + 1 | None | 1 / 2 |
КОМАНДЫ ПЕРЕСЫЛКИ ДАННЫХ | |||||
MOV | Rd, Rr | Пересылка между регистрами | Rd Rr | None | |
LDI | Rd*, K | Загрузка константы | Rd K | None | |
LD | Rd, X | Косвенное чтение памяти данных | Rd (X) | None | |
LD | Rd, X+ | Косвенное чтение памяти данных с постинкрементом | Rd (X), X X + 1 | None | |
LD | Rd, - X | Косвенное чтение памяти данных с преддекрементом | X X – 1, Rd (X) | None | |
LD | Rd, Y | Косвенное чтение памяти данных | Rd (Y) | None | |
LD | Rd, Y+ | Косвенное чтение памяти данных с постинкрементом | Rd (Y), Y Y + 1 | None | |
LD | Rd, - Y | Косвенное чтение памяти данных с преддекрементом | Y Y – 1, Rd (Y) | None | |
LDD | Rd,Y+q | Косвенное относительное чтение памяти данных | Rd (Y + q) | None | |
LD | Rd, Z | Косвенное чтение памяти данных | Rd (Z) | None | |
LD | Rd, Z+ | Косвенное чтение памяти данных с постинкрементом | Rd (Z), Z Z+1 | None | |
LD | Rd, -Z | Косвенное чтение памяти данных с преддекрементом | Z Z – 1, Rd (Z) | None | |
LDD | Rd, Z+q | Косвенное относительное чтение памяти данных | Rd (Z + q) | None | |
LDS | Rd, k | Непосредственная загрузка из памяти данных | Rd (k) | None | |
ST | X, Rr | Косвенная запись в память данных | (X) Rr | None | |
ST | X+, Rr | Косвенная запись в память данных с постинкрементом | ST (X) Rr, X X + 1 | None | |
ST | - X, Rr | Косвенная запись в память данных с преддекрементом | XX – 1, (X) Rr | None | |
ST | Y, Rr | Косвенная запись в память данных | (Y) Rr | None | |
ST | Y+, Rr | Косвенная запись в память данных с постинкрементом | (Y) Rr, YY + 1 | None | |
ST | - Y, Rr | Косвенная запись в память данных с преддекрементом | Y Y – 1, (Y) Rr | None | |
STD | Y+q,Rr | Косвенная относительная запись в память данных | (Y + q) Rr | None | |
ST | Z, Rr | Косвенная запись в память данных | (Z) Rr | None | |
ST | Z+, Rr | Косвенная запись в память данных с постинкрементом | (Z) Rr, ZZ + 1 | None | |
ST | -Z, Rr | Косвенная запись в память данных с преддекрементом | Z Z – 1, (Z) Rr | None | |
STD | Z+q,Rr | Косвенная относительная запись в память данных | (Z + q) Rr | None | |
STS | k, Rr | Непосредственная запись в память данных | (k) Rr | None | |
LPM | Загрузка данных из памяти программ | R0 (Z) | None | ||
ELPM | Расширенная загрузка данных из памяти программ | R0 (RAMPZ: Z) | None | ||
IN | Rd, P | Ввод из порта | Rd P | None | |
OUT | P, Rr | Вывод в порт | P Rr | None | |
PUSH | Rr | Сохранение байта в стеке | STACK Rr; SPSP-1 | None | |
POP | Rd | Извлечение байта из стека | SPSP+1, Rd STACK | None | |
КОМАНДЫ РАБОТЫ С БИТАМИ | |||||
SBR | Rd*, K | Установка бита(тов) в регистре | Rd Rd v K | Z,N,V | |
CBR | Rd*, K | Очистка бита(тов) в регистре | Rd Rd ($FF - K) | Z,N,V | |
SBI | P*,b | Установка бита в регистре I/O | I/O(P,b) 1 | None | |
CBI | P*,b | Очистка бита в регистре I/O | I/O(P,b) 0 | None | |
LSL | Rd | Логический сдвиг влево | Rd(n+1) Rd(n), Rd(0) 0 | Z,C,N,V | |
LSR | Rd | Логический сдвиг вправо | Rd(n) Rd(n+1), Rd(7) 0 | Z,C,N,V | |
ROL | Rd | Циклический сдвиг влево через перенос | Rd(0) C, Rd(n+1) Rd(n), CRd(7) | Z,C,N,V | |
ROR | Rd | Циклический сдвиг вправо через перенос | Rd(7) C, Rd(n) Rd(n+1), C Rd(0) | Z,C,N,V | |
ASR | Rd | Арифметический сдвиг вправо | Rd(n) Rd(n+1), n=0..6 | Z,C,N,V | |
SWAP | Rd | Обмен тетрадами | Rd(3..0)Rd(7..4), Rd(7..4)Rd(3..0) | None | |
BSET | s | Установка разряда регистра SREG | SREG(s) 1 SREG(s) | ||
BCLR | s | Сброс разряда регистра SREG | SREG(s) 0 SREG(s) | ||
BLD | Rd, b | Пересылка флага Т в РОН | Rd(b) T | None | |
BST | Rr, b | Запись разряда РОН в флаг Т | T Rr(b) | T | |
SEC | Установка флага С | C 1 | C | ||
CLC | Очистка флага C | C 0 | C | ||
SEN | Установка флага N | N 1 | N | ||
CLN | Очистка флага N | N 0 | N | ||
SEZ | Установка флага Z | Z 1 | Z | ||
CLZ | Очистка флага Z | Z 0 | Z | ||
SEI | Разрешение глобальных прерываний | I 1 | I | ||
CLI | Запрет глобальных прерываний. | I 0 | I | ||
SES | Установка флага S | S 1 | S | ||
CLS | Очистка флага S | S 0 | S | ||
SEV | Установка флага V | V 1 | V | ||
CLV | Очистка флага V | V 0 | V | ||
SET | Установка флага T | T 1 | T | ||
CLT | Очистка флага T | T 0 | T | ||
SEH | Установка флага H | H 1 | H | ||
CLH | Очистка флага H | H 0 | H | ||
КОМАНДЫ УПРАВЛЕНИЯ СИСТЕМОЙ | |||||
NOP | Нет операции | None | |||
SLEEP | Спящий режим | None | |||
WDR | Сброс по сторожевому таймеру | None |
Обозначения, используемые в системе команд:
Rd - регистр-приемник результата, 0 £ d £ 31,
Rd* - регистр-приемник результата, 16 £ d £ 31,
Rdl: R24, R26, R28, R30. Для ADIW и SBIW команд,
Rr - регистр-источник,
P- адрес регистра ввода/вывода,
P*- адрес побитно адресуемого регистра ввода/вывода (адреса $00-$1F),
K - символьная или численная константа (8 бит),
k - адресная константа,
b - номер бита в регистре (3 бита),
s - номер бита в регистре статуса (3 бита),
X,Y,Z - регистры косвенной адресации (X=R27:R26, Y=R29:R28; Z=R31:R30).
Дата публикования: 2014-11-03; Прочитано: 383 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!