![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
|
Изучение работы с портами ввода/вывода МК 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; Прочитано: 420 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!
