Что такое система команд микроконтроллеров AVR. Как устроена архитектура AVR. Какие группы команд существуют в AVR. Чем отличается система команд AVR от других микроконтроллеров.
Система команд микроконтроллеров AVR является одной из самых развитых среди 8-битных микроконтроллеров. Она насчитывает до 133 различных инструкций, что делает AVR очень гибкими и функциональными устройствами. Рассмотрим подробнее особенности системы команд AVR и ее ключевые характеристики.
Архитектура AVR и ее влияние на систему команд
Микроконтроллеры AVR имеют гарвардскую архитектуру, которая предполагает физическое разделение памяти программ и памяти данных. Это позволяет оптимизировать доступ к обоим типам памяти и повысить производительность. Основные особенности архитектуры AVR, влияющие на систему команд:
- 32 8-разрядных регистра общего назначения, связанных напрямую с АЛУ
- Одноуровневый конвейер выполнения команд
- Большинство команд выполняются за 1 такт
- Расширенная система команд, близкая к CISC-архитектуре
Благодаря этим особенностям, система команд AVR позволяет эффективно использовать ресурсы микроконтроллера и создавать компактный и быстрый программный код.
Основные группы команд AVR
Система команд AVR включает следующие основные группы инструкций:
1. Команды пересылки данных
Эти команды обеспечивают перемещение данных между регистрами, регистрами и памятью, а также загрузку констант. Основные команды:
- MOV — пересылка между регистрами
- LD/LDI — загрузка из памяти/загрузка константы
- ST — сохранение в память
- PUSH/POP — работа со стеком
2. Арифметические и логические операции
Данная группа включает команды для выполнения математических и логических операций над данными:
- ADD/SUB — сложение/вычитание
- AND/OR/EOR — логические операции
- INC/DEC — инкремент/декремент
- MUL — умножение (в некоторых моделях)
3. Команды ветвления
Эти инструкции управляют ходом выполнения программы:
- JMP — безусловный переход
- BREQ/BRNE — условные переходы
- CALL/RET — вызов и возврат из подпрограмм
- RJMP — относительный переход
4. Битовые операции
AVR предоставляет широкие возможности для манипуляций с отдельными битами:
- SBI/CBI — установка/сброс бита в I/O регистре
- BST/BLD — работа с T-флагом
- LSL/LSR — логические сдвиги
5. Команды управления системой
Эта группа включает инструкции для управления режимами работы микроконтроллера:
- NOP — пустая операция
- SLEEP — переход в режим сна
- WDR — сброс сторожевого таймера
Особенности системы команд AVR
Система команд AVR имеет ряд отличительных особенностей:
- Большинство команд имеют фиксированную длину 16 бит
- Почти все команды выполняются за 1 машинный такт
- Широкие возможности по работе с отдельными битами
- Наличие команд для эффективной работы с 16-битными данными
- Поддержка аппаратного умножения в некоторых моделях
Эти особенности позволяют создавать эффективный и компактный код для микроконтроллеров AVR.
Сравнение системы команд AVR с другими микроконтроллерами
Система команд AVR имеет ряд преимуществ по сравнению с другими популярными семействами 8-битных микроконтроллеров:
- Более развитая система команд по сравнению с PIC (133 команды против 75)
- Более быстрое выполнение команд по сравнению с MCS-51 (1 такт против 12)
- Наличие команд для эффективной работы с 16-битными данными
- Широкие возможности по битовым операциям
Благодаря этим преимуществам, AVR позволяют создавать более эффективные программы при меньших затратах времени на разработку.
Влияние системы команд на энергопотребление
Система команд AVR оптимизирована не только для высокой производительности, но и для снижения энергопотребления. Это достигается за счет следующих факторов:
- Быстрое выполнение команд сокращает время активной работы
- Наличие специальных команд для перехода в режимы сна
- Возможность отключения неиспользуемых узлов микроконтроллера
- Эффективная работа с битовыми данными без лишних операций
Эти особенности делают AVR хорошим выбором для создания энергоэффективных устройств с батарейным питанием.
Программирование на ассемблере AVR
Знание системы команд AVR особенно важно при программировании на языке ассемблера. Основные преимущества использования ассемблера для AVR:
- Максимальный контроль над ресурсами микроконтроллера
- Создание очень компактного и быстрого кода
- Возможность использования всех возможностей архитектуры AVR
- Эффективная оптимизация критичных участков кода
При этом программирование на ассемблере требует глубокого понимания архитектуры и системы команд AVR.
Заключение
Система команд микроконтроллеров AVR является одной из самых развитых и эффективных среди 8-битных микроконтроллеров. Она обеспечивает высокую производительность, энергоэффективность и гибкость при разработке программного обеспечения. Глубокое понимание системы команд AVR позволяет создавать оптимальные программы и максимально использовать возможности этих микроконтроллеров.
Справочник по командам ассемблера AVR
Справочник по системе команд микроконтроллеров AVR основан на переводе документации от Atmel. Помимо этого сюда добавлено больше примеров из практики, в частности, примеры для ассемблера AVR GCC.
Чтобы быстро перейти к нужной команде достаточно ввести её имя. Также можно выбрать команду из списка внизу.
Справочник будет дополняться по мере появления вопросов.
Логические операции
Арифметические операции
Битовые операции
Операции сравнения
Операции сдвига
Операции пересылки данных
Безусловные переходы
Условные переходы
Управление устройством
Команда:
Введите имя команды в поле выше
Логические операции
Мнемоника | Описание | Операция | Флаги |
---|---|---|---|
AND Rd, Rr | Логическое «И» двух регистров | Rd ← Rd and Rr | Z, N, V |
ANDI Rd, K | Логическое «И регистра и константы | Rd ← Rd and K | Z, N, V |
EOR Rd, Rr | Исключающее «ИЛИ» двух регистров | Rd ← Rd xor Rr | Z, N, V |
OR Rd, Rr | Логическое «ИЛИ» двух регистров | Rd ← Rd or Rr | Z, N, V |
ORI Rd, K | Логическое «ИЛИ» регистра и константы | Rd ← Rd or K | Z, N, V |
COM Rd | Перевод в обратный код | Rd ← 0xFF — Rd | Z, C, N, V |
NEG Rd | Перевод в дополнительный код | Rd ← 0 — Rd | Z, C, N, V, H |
CLR Rd | Очистка регистра | Rd ← Rd xor Rd | Z, N, V |
SER Rd | Установка всех разрядов регистра | Rd ← 0xFF | — |
TST Rd | Проверка регистра на отрицательное (нулевое) значение | Rd ← Rd and Rd | Z, N, V |
Арифметические операции
Мнемоника | Описание | Операция | Флаги |
---|---|---|---|
ADD Rd, Rr | Сложение двух регистров | Rd ← Rd + Rr | Z, C, N, V, H |
ADC Rd, Rr | Сложение двух регистров с переносом | Rd ← Rd + Rr + С | Z, C, N, V, H |
SUB Rd, Rr | Вычитание двух регистров | Rd ← Rd — Rr | Z, C, N, V, H |
SBC Rd, Rr | Вычитание двух регистров с заёмом | Rd ← Rd — Rr — С | Z, C, N, V, H |
ADIW Rd, K | Сложение регистровой пары с константой | R(d+1):Rd ← R(d+1):Rd + K | Z, C, N, V, S |
SBIW Rd, K | Вычитание константы из регистровой пары | R(d+1):Rdl ← R(d+1):Rd — K | Z, C, N, V, S |
SUBI Rd, K | Вычитание константы из регистра | Rd ← Rd — K | Z, C, N, V, H |
SBCI Rd, K | Вычитание константы из регистра с заёмом | Rd ← Rd — K — С | Z, C, N, V, H |
INC Rd | Инкремент регистра | Rd ← Rd + 1 | Z, N, V |
DEC Rd | Декремент регистра | Rd ← Rd – 1 | Z, N, V |
MUL Rd, Rr | Умножение чисел без знака | R1:R0 ← Rd * Rr | Z, C |
MULS Rd, Rr | Умножение чисел со знаком | R1:R0 ← Rd * Rr | Z, C |
MULSU Rd, Rr | Умножение числа со знаком с числом без знака | R1:R0 ← Rd * Rr | Z, C |
FMUL Rd, Rr | Умножение дробных чисел без знака | R1:R0 ← (Rd * Rr) << 1 | Z, C |
FMULS Rd, Rr | Умножение дробных чисел со знаком | R1:R0 ← (Rd * Rr) << 1 | Z, C |
FMULSU Rd, Rr | Умножение дробного числа со знаком с числом без знака | R1:R0 ← (Rd * Rr) << 1 | Z, C |
Битовые операции
Мнемоника | Описание | Операция | Флаги |
---|---|---|---|
CBR Rd, K | Очистка разрядов регистра | Rd ← Rd and (0FFH – K) | Z, N, V |
SBR Rd, K | Установка разрядов регистра | Rd ← Rd or K | Z, N, V |
CBI P, b | Сброс разряда I/O-регистра | P. b ← 0 | — |
SBI P, b | Установка разряда I/O-регистра | P.b ← 1 | — |
BCLR s | Сброс флага SREG | SREG.s ← 0 | SREG.s |
BSET s | Установка флага SREG | SREG.s ← 1 | SREG.s |
BLD Rd, b | Rd.b ← T | — | |
BST Rr, b | Запись разряда регистра во флаг T | T ← Rd.b | T |
CLC | Сброс флага переноса | C ← 0 | C |
SEC | Установка флага переноса | C ← 1 | C |
CLN | Сброс флага отрицательного числа | N ← 0 | N |
SEN | Установка флага отрицательного числа | N ← 1 | N |
CLZ | Сброс флага нуля | Z ← 0 | Z |
SEZ | Установка флага нуля | Z ← 1 | Z |
CLI | Общий запрет прерываний | I ← 0 | I |
SEI | Общее разрешение прерываний | I ← 1 | I |
CLS | Сброс флага знака | S ← 0 | S |
SES | Установка флага знака | S ← 1 | S |
CLV | Сброс флага переполнения дополнительного кода | V ← 0 | V |
SEV | Установка флага переполнения дополнительного кода | V ← 1 | V |
CLT | Сброс пользовательского флага T | T ← 0 | T |
SET | Установка пользовательского флага T | T ← 1 | T |
CLH | Сброс флага половинного переноса | H ← 0 | H |
SEH | Установка флага половинного переноса | H ← 1 | H |
Операции сравнения
Мнемоника | Описание | Операция | Флаги |
---|---|---|---|
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 |
CPSE Rd, Rr | Сравнение регистров и пропуск следующей команды если они равны | Если (Rd = Rr) PC ← PC + 2 (или 3) | — |
Операции сдвига
Мнемоника | Описание | Операция | Флаги |
---|---|---|---|
ASR Rd | Арифметический сдвиг вправо | Rd(i) ← Rd(i+1) (n=0. .6), C ← Rd(0) | Z, C, N, V |
LSL Rd | Логический сдвиг влево | Rd(i+1) ← Rd(i), Rd(0) ← 0, C ← Rd(7) | Z, C, N, V |
LSR Rd | Логический сдвиг вправо | Rd(i) ← Rd(i+1), Rd(7) ← 0, C ← Rd(0) | Z, C, N, V |
ROL Rd | Сдвиг влево через перенос | Rd(i+1) ← Rd(i), Rd(0) ← C, C ← Rd(7) | Z, C, N, V |
ROR Rd | Сдвиг вправо через перенос | Rd(i) ← Rd(i+1), Rd(7) ← C, C ← Rd(0) | Z, C, N, V |
SWAP Rd | Обмен местами тетрад | Rd(3..0) ↔ Rd(7..4) | — |
Операции пересылки данных
Мнемоника | Описание | Операция | Флаги |
---|---|---|---|
MOV Rd, Rr | Пересылка между регистрами | Rd ← Rr | — |
MOVW Rd, Rr | Пересылка между парами регистров | R(d +1):Rd ← R(r+1):Rr | — |
LDI Rd, K | Загрузка константы в регистр | Rd ← K | — |
LD Rd, X | Косвенное чтение | Rd ← [X] | — |
LD Rd, X+ | Косвенное чтение с пост-инкрементом | Rd ← [X], X ← X + 1 | — |
LD Rd, -X | Косвенное чтение с пред-декрементом | X ← X — 1, Rd ← [X] | — |
LD Rd, Y | Косвенное чтение | Rd ← [Y] | — |
LD Rd, Y+ | Косвенное чтение с пост-инкрементом | Rd ← [Y], Y ← Y + 1 | — |
LD Rd, -Y | Косвенное чтение с пред-декрементом | Y ← Y — 1, Rd ← [Y] | — |
LDD Rd, Y+q | Косвенное чтение со смещением | Rd ← [Y+q] | — |
LD Rd, Z | Косвенное чтение | Rd ← [Z] | — |
LD Rd, Z+ | Косвенное чтение с пост-инкрементом | Rd ← [Z], Z ← Z + 1 | — |
LD Rd, -Z | Косвенное чтение с пред-декрементом | Z ← Z — 1, Rd ← [Z] | — |
LDD Rd, Z+q | Косвенное чтение со смещением | Rd ← [Z+q] | — |
LDS Rd, A | Непосредственное чтение из ОЗУ | Rd ← [A] | — |
ST X, Rr | Косвенная запись | [X] ← Rr | — |
ST X+, Rr | Косвенная запись с пост-инкрементом | [X] ← Rr, X ← X + 1 | — |
ST -X, Rr | Косвенная запись с пред-декрементом | X ← X — 1, [X] ← Rr | — |
ST Y, Rr | Косвенная запись | [Y] ← Rr | — |
ST Y+, Rr | Косвенная запись с пост-инкрементом | [Y] ← Rr, Y ← Y + 1 | — |
ST -Y, Rr | Косвенная запись с пред-декрементом | Y ← Y — 1, [Y] ← Rr | — |
STD Y+q, Rr | Косвенная запись со смещением | [Y+q] ← Rr | — |
ST Z, Rr | Косвенная запись | [Z] ← Rr | — |
ST Z+, Rr | Косвенная запись с пост-инкрементом | [Z] ← Rr, Z ← Z + 1 | — |
ST -Z, Rr | Косвенная запись с пред-декрементом | Z ← Z — 1, [Z] ← Rr | — |
STD Z+q, Rr | Косвенная запись со смещением | [Z+q] ← Rr | — |
STS A, Rr | Непосредственная запись в ОЗУ | [A] ← Rr | — |
LPM | Загрузка данных из памяти программы | R0 ← {Z} | — |
LPM Rd, Z | Загрузка данных из памяти программы в регистр | Rd ← {Z} | — |
LPM Rd, Z+ | Загрузка данных из памяти программы с пост-инкрементом Z | Rd ← {Z}, Z ← Z + 1 | — |
ELPM | Расширенная загрузка данных из памяти программы | R0 ← {RAMPZ:Z} | — |
ELPM Rd, Z | Расширенная загрузка данных из памяти программы в регистр | Rd ← {RAMPZ:Z} | — |
ELPM Rd, Z+ | Расширенная загрузка данных из памяти программы с пост-инкрементом Z | Rd ← {RAMPZ:Z}, Z ← Z + 1 | — |
SPM | Запись в программную память | {Z} ← R1:R0 | — |
IN Rd, P | Пересылка из I/O-регистра в регистр | Rd ← P | — |
OUT P, Rr | Пересылка из регистра в I/O-регистр | P ← Rr | — |
PUSH Rr | Сохранение регистра в стеке | STACK ← Rr | — |
POP Rd | Извлечение регистра из стека | Rd ← STACK | — |
Безусловные переходы
Мнемоника | Описание | Операция | Флаги |
---|---|---|---|
RJMP A | Относительный безусловный переход | PC ← PC + A + 1 | — |
JMP A | Длинный безусловный переход | PC ← A | — |
IJMP | Непрямой безусловный переход | PC ← Z | — |
EIJMP | Расширенный непрямой безусловный переход | PC ← Z:EIND | — |
RCALL A | Относительный вызов подпрограммы | PC ← PC + A + 1 | — |
CALL A | Длинный вызов подпрограммы | PC ← A | — |
ICALL | Непрямой вызов подпрограммы | PC ← Z | — |
EICALL | Расширенный непрямой вызов подпрограммы | PC ← Z:EIND | — |
RET | Возврат из подпрограммы | PC ← STACK | — |
RETI | Возврат из подпрограммы обработки прерываний | PC ← STACK | I |
Условные переходы
Все команды этой группы выполняют переход (PC ← PC + A + 1) при разных условиях.
Мнемоника | Описание | Условие | Флаги |
---|---|---|---|
BRBC s, A | Переход если флаг S сброшен | Если SREG(S) = 0 | — |
BRBS s, A | Переход если флаг S установлен | Если SREG(S) = 1 | — |
BRCS A | Переход по переносу | Если C = 1 | — |
BRCC A | Переход если нет переноса | Если C = 0 | — |
BREQ A | Переход если равно | Если Z = 1 | — |
BRNE A | Переход если не равно | Если Z = 0 | — |
BRSH A | Переход если больше или равно | Если C = 0 | — |
BRLO A | Переход если меньше | Если C = 1 | — |
BRMI A | Переход если отрицательное значение | Если N = 1 | — |
BRPL A | Переход если положительное значение | Если N = 0 | — |
BRGE A | Переход если больше или равно (со знаком) | Если (N и V) = 0 | — |
BRLT A | Переход если меньше (со знаком) | Если (N или V) = 1 | — |
BRHS A | Переход по половинному переносу | Если H = 1 | — |
BRHC A | Переход если нет половинного переноса | Если H = 0 | — |
BRTS A | Переход если флаг T установлен | Если T = 1 | — |
BRTC A | Переход если флаг T сброшен | Если T = 0 | — |
BRVS A | Переход по переполнению дополнительного кода | Если V = 1 | — |
BRVC A | Переход если нет переполнения дополнительного кода | Если V = 0 | — |
BRID A | Переход если прерывания запрещены | Если I = 0 | — |
BRIE A | Переход если прерывания разрешены | Если I = 1 | — |
SBRC Rd, K | Пропустить следующую команду если бит в регистре очищен | Если Rd[K] = 0 | — |
SBRS Rd, K | Пропустить следующую команду если бит в регистре установлен | Если Rd[K] = 1 | — |
SBIC A, b | Пропустить следующую команду если бит в регистре ввода/вывода очищен | Если I/O(A, b) = 0 | — |
SBIS A, b | Пропустить следующую команду если бит в регистре ввода/вывода установлен | Если I/O(A, b) = 1 | — |
Управление устройством
Мнемоника | Описание | Операция | Флаги |
---|---|---|---|
NOP | Нет операции | — | — |
SLEEP | Переход в «спящий» режим | — | — |
WDR | Сброс сторожевого таймера | — | — |
BREAK | Приостановка программы (используется отладчиком) | — | — |
МК
ПЛАН ЛЕКЦИИ 1. Режимы пониженного энергопотребления 2. Система команд AVR 3. Архитектура микроконтроллеров AVR
1. Режимы пониженного энергопотребления AVR микроконтроллеры могут быть переведены программным путем в один из шести режимов пониженного энергопотребления.
Микроконтроллеры AVR mega64, mega103 и mega128 имеют еще одну примечательную архитектурную особенность, позволяющую значительно снизить энергопотребление всего кристалла в целом, когда в процессе работы возникают вынужденные паузы ожидания. В этом случае целесообразно уменьшить ток потребления центрального процессора и периферийных устройств как в активном режиме, так и в режиме холостого хода, понизив основную тактовую частоту микроконтроллера. Для этой цели на кристалле размещен специальный предделитель, позволяющий делить основную тактовую частоту на целое число в диапазоне от 2 до 129. Включение/выключение данной функции осуществляется одной короткой командой в программе. AVR функционируют в широком диапазоне питающих напряжений от 1,8 до 6,0 Вольт. Температурные диапазоны работы микроконтроллеров AVR — коммерческий (0С…70С) и индустриальный (-40С…+85С). К сожалению, корпорация Atmel не выпускает и не планирует выпускать AVR для работы в автомобильном (-40С…+125С) и военном (-55С…+125С) температурных диапазонах.
С точки зрения программиста AVR представляет собой 8-разрядный RISC микроконтроллер, имеющий быстрый Гарвардский процессор, память программ, память данных, порты ввода/вывода и различные интерфейсные схемы. Структурная схема микроконтроллера приведена на рис. 2. Гарвардская архитектура AVR реализует полное логическое и физическое разделение не только адресных пространств, но и информационных шин для обращения к памяти программ и к памяти данных, причем способы адресации и доступа к этим массивам памяти также различны. Подобное построение уже ближе к структуре цифровых сигнальных процессоров и обеспечивает существенное повышение производительности. Центральный процессор работает одновременно как с памятью программ, так и с памятью данных; разрядность шины памяти программ расширена до 16 бит. Следующим шагом на пути увеличения быстродействия AVR является использование технологии конвейеризации, вследствие чего цикл «выборка — исполнение» команды заметно сокращен. Например, у микроконтроллеров семейства MCS51 короткая команда выполняется за 12 тактов генератора (1 машинный цикл), в течение которого процессор последовательно считывает код операции и исполняет ее. В PIC-контроллерах фирмы Microchip, где уже реализован конвейер, короткая команда выполняется в течение 8 периодов тактовой частоты (2 машинных цикла). За это время последовательно дешифрируется и считывается код операции, исполняется команда, фиксируется результат и одновременно считывается код следующей операции (одноуровневый конвейер). Поэтому в общем потоке команд одна короткая команда реализуется за 4 периода тактовой частоты или за один машинный цикл. В микроконтроллерах AVR тоже используется одноуровневый конвейер при обращении к памяти программ и короткая команда в общем потоке выполняется, как и в PIC-контроллерах, за один машинный цикл. Главное же отличие состоит в том, что этот цикл у AVR составляет всего один период тактовой частоты. Для сравнения, на рис. 3 приведены временные диаграммы при выполнении типовой команды для различных микроконтроллерных платформ.
2. Система команд AVR Система команд AVR весьма развита и насчитывает до 133 различных инструкций. Почти все команды имеют фиксированную длину в одно слово (16 бит), что позволяет в большинстве случаев объединять в одной команде и код операции, и операнд(ы). Лишь немногие команды имеют размер в 2 слова (32 бит) и относятся к группе команд вызова процедуры CALL, длинных переходов в пределах всего адресного пространства JMP, возврата из подпрограмм RET и команд работы с памятью программ LPM. Различают пять групп команд AVR: условного ветвления, безусловного ветвления, арифметические и логические операции, команды пересылки данных, команды работы с битами. В последних версиях кристаллов AVR семейства «mega» реализована функция аппаратного умножения, что придает новым микроконтроллерам еще больше привлекательности с точки зрения разработчика.
3. Архитектура микроконтроллеров AVR Файл регистров быстрого доступа, содержит 32 8-разрядных рабочих регистра общего назначения связанных непосредственно с ALU. За один тактовый цикл из файла регистров выбираются два операнда, выполняется операция и результат вновь возвращается в файл регистров. Шесть из 32 регистров могут быть использованы как три 16-разрядных регистра указателя косвенной адресации адресного пространства данных, обеспечивающие эффективное вычисление адресов. Один из этих указателей адреса используется, также, как указатель адреса для функции непрерывного просмотра таблиц. Эти 16-разрядные дополнительные регистры обозначаются X-регистр, Y-регистр и Z-регистр. ALU поддерживает арифметические и логические операции между регистрами или между константой и регистром. Выполняются в ALU и операции с отдельными регистрами. На рисунке показана AVR расширенная RISC архитектура микроконтроллеров ATmega603/103.
Рис. 5. Расширенная RISC архитектура микроконтроллеров ATmega603/103
В дополнение к операциям с регистрами, регистровый файл может использоваться и для обычной адресации памяти. Это объясняется тем, что файл регистров располагается по 32 самыми младшими адресами пространства данных, и к ним можно обращаться как к обычным ячейкам памяти. Пространство памяти I/O содержит 64 адреса периферийных функций CPU таких как: регистры управления, таймеры/счетчики, аналого-цифровые преобразователи и другие I/O функции. К памяти I/O можно обращаться непосредственно или как к ячейкам пространства памяти соответствующим адресам регистра файлов $20 — $5F. В микроконтроллерах AVR использованы принципы Гарвардской архитектуры — отдельные память и шины для программ и данных. При работе с памятью программ используется одноуровневый конвейер — в то время, как одна команда выполняется, следующая команда выбирается из памяти программ, Такой прием позволяет выполнять команду в каждом тактовом цикле. Памятью программ является внутрисистемно программируемая Flash память. За малым исключением AVR команды имеют формат одного 16-разрядного слова, в связи с чем каждый адрес памяти программ содержит одну 16-разрядную команду. В процессе обработки прерываний и вызовов подпрограмм адрес возврата счетчика команд (PC) сохраняется в стеке. Стек размещается в SRAM данных и, следовательно размер стека ограничен только общим размером SRAM и уровнем ее использования. Все пользовательские программы в подпрограммах возврата (прежде, чем подпрограммы или прерывания будут выполняться) должны инициализировать указатель стека (SP). 16-разрядный указатель стека, с возможностью чтения/записи располагается в пространстве I/O. AVR архитектура поддерживает пять различных режимов адресации 4000 байт SRAM данных. Гибкий модуль обработки прерываний имеет в пространстве I/O свой управляющий регистр с дополнительным битом разрешения глобального прерывания в регистре статуса. Все прерывания имеют свои векторы прерывания в таблице векторов прерывания, располагаемой в начале памяти программ. Приоритеты прерываний соответствуют положению векторов прерываний — прерывание с наименьшим адресом вектора имеет наивысший приоритет. По разнообразию и количеству реализованных инструкций AVR больше похожи на CISC, чем на RISC процессоры. Например, у PIC-контроллеров система команд насчитывает до 75 различных инструкций, а у MCS51 она составляет 111. В целом, прогрессивная RISC архитектура AVR в сочетании с наличием регистрового файла и расширенной системы команд позволяет в короткие сроки создавать работоспособные программы с эффективным кодом как по компактности реализации, так и по скорости выполнения.
3.1. Регистровый файл быстрого доступа Следующая отличительная черта архитектуры микроконтроллеров AVR — регистровый файл быстрого доступа, структурная схема которого показана на рис. 4. Каждый из 32-х регистров общего назначения длиной 1 байт непосредственно связан с арифметико-логическим устройством (ALU) процессора. Другими словами, в AVR существует 32 регистра — аккумулятора (сравните, например, с MCS51). Это обстоятельство позволяет в сочетании с конвейерной обработкой выполнять одну операцию в ALU за один машинный цикл. Так, два операнда извлекаются из регистрового файла, выполняется команда и результат записывается обратно в регистровый файл в течение только одного машинного цикла. Рис. 3. Сравнительная характеристика некоторых микропроцессорных платформ
Шесть из 32-х регистров файла могут использоваться как три 16-разрядных указателя адреса при косвенной адресации данных. Один из этих указателей (Z Pointer) применяется также для доступа к данным, записанным в памяти программ микроконтроллера. Использование трех 16-битных указателей (X, Y и Z Pointers) существенно повышает скорость пересылки данных при работе прикладной программы.
Регистровый файл занимает младшие 32 байта в общем адресном пространстве SRAM AVR. Такое архитектурное решение позволяет получать доступ к быстрой «регистровой» оперативной памяти микроконтроллера двумя путями - непосредственной адресацией в коде команды к любой ячейке и другими способами адресации ячеек SRAM. В технической документации фирмы Atmel это полезное свойство носит название «быстрое контекстное переключение» и является еще одной отличительной особенностью архитектуры AVR, повышающей эффективность работы микроконтроллера и его производительность. Особенно заметно данное преимущество при реализации процедур целочисленной 16-битной арифметики, когда исключаются многократные пересылки между различными ячейками памяти данных при обработке арифметических операндов в ALU.
|
||
Авторы: Джимблом, Бибойхо
Избранное Любимый 10
Если вам нужен больший контроль над вашим карманным программатором AVR и AVR, к которому он подключен, следуйте приведенным ниже инструкциям. Мы продемонстрируем, как использовать AVRDUDE, чудо-утилиту командной строки с открытым исходным кодом для чтения, записи и управления AVR.
Если у вас есть Arduino, то у вас уже установлен AVRDUDE — это внутренний инструмент, который Arduino использует для загрузки скетчей. Если вам нужно установить AVRDUDE отдельно, ознакомьтесь с документацией в разделе загрузок AVRDUDE. 9Файлы 0009 avrdude-doc-X.XX.pdf (например, avrdude-doc-6.3.pdf ) особенно полезны при установке AVRDUDE для вашей операционной системы, если у вас есть проблемы с использованием команд AVRDUDE в любом каталоге через командную строку.
AVRDUDE: Downloads
Sanity Check — AVRDUDE Paths
AVRDUDE — это инструмент командной строки , поэтому для его использования вам потребуется открыть «Командную строку» (Windows) или « Терминал» (Mac/Linux). Чтобы убедиться, что AVRDUDE работает, рекомендуется сначала провести небольшую проверку работоспособности. Откройте командную строку и введите следующую команду.
язык: bash авродуде
Вы должны увидеть вывод, подобный изображенному ниже.
Проверка работоспособности — Проверка подписи устройства
Примечание: В следующем примере предполагается, что к другому концу вашего программатора подключен ATmega328P . Если у вас другой тип микроконтроллера, вам нужно сформулировать немного другую команду, см. раздел «Указание программатора и устройства AVR» ниже.
Чтобы убедиться, что AVRDUDE работает, а ваш программатор AVR Pocket Programmer подключен правильно, рекомендуется выполнить еще одну небольшую проверку работоспособности. Введите это в командную строку:
язык: bash avrdude -c usbtiny -p atmega328p
Если все подключено правильно, вы должны получить такой ответ:
Эта базовая команда определяет тип используемого программатора и AVR, с которым он взаимодействует. AVRDUDE попытается прочитать сигнатуру устройства из вашего AVR, которая отличается для каждого типа AVR. Каждый ATmega328P должен иметь подпись устройства 0x1E950F
.
Программирование флэш-памяти
Внимание! В этом примере предполагается, что фьюз-биты (т. е. младший, высокий и расширенный) уже установлены до прошивки файла .hex. Поскольку мы используем RedBoard, запрограммированную с помощью Arduino, мы можем записать на плату файл .hex.
Теперь, когда вы убедились, что все в рабочем состоянии, вы можете выполнять любые операции чтения и записи памяти с помощью AVRDUDE. Основная часть памяти, которую вы, вероятно, захотите записать, — это флэш-память — энергонезависимая память, в которой хранятся программы.
Внимание! Записав следующий файл blink.hex на микроконтроллер AVR, он перезапишет то, что находится в памяти. В файле нет загрузчика Arduino, поэтому вы не сможете загружать через последовательный порт с помощью Arduino IDE, пока не переустановите загрузчик с соответствующим микроконтроллером. Если вы используете RedBoard, запрограммированную с помощью Arduino, вы все равно можете переустановить загрузчик, чтобы снова загрузить его через последовательный порт. На плате используется optiboot_atmega328.hex . Вы можете найти это в папке программы Arduino по пути …\arduino-1.8.5\hardware\arduino\avr\bootloaders\optiboot или в разделе « Переустановка загрузчика RedBoard Arduino Bootloader » далее в этом руководстве.
В этом примере в качестве примера будет использоваться файл blink.hex . Загрузите следующие файлы ниже. Если вы используете файл blink.hex , убедитесь, что вы разархивировали папку и поместили ее в рабочий каталог.
Download Blink Here (ZIP)
Эта команда выполняет базовую запись во флэш-память с использованием HEX-файла.
язык: Баш avrdude -c usbtiny -p atmega328p -U flash:w:blink.hex
Запись во флэш-память займет немного больше времени, чем чтение битов подписи. Вы увидите текстовую строку состояния, прокручивающуюся по мере того, как устройство считывается, записывается и проверяется.
Команда опции -U
обрабатывает все операции чтения и записи памяти. Говорим ему, что хотим работать с flash
, выполните запись с помощью w
, а затем укажите расположение шестнадцатеричного файла, который мы хотим записать.
Чтение флэш-памяти
Команда -U
также может использоваться для чтения содержимого памяти AVR. Команда, подобная приведенной ниже, например, прочитает содержимое вашего AVR и сохранит его в файле с именем « secret.hex ».
язык: Баш avrdude -c usbtiny -p atmega328p -U flash:r:mystery.hex:r
Это невероятно полезно, если вы хотите скопировать содержимое одного Arduino на другой. Или, может быть, вы мазохист и хотите попробовать реконструировать загадочный код в AVR.
Переустановка загрузчика Arduino RedBoard
Теперь, когда вы научились прошивать шестнадцатеричные файлы на RedBoard, попробуйте переустановить загрузчик с помощью следующего файла. Загрузите файл.
RedBoard запрограммирован с помощью загрузчика Arduino (HEX)
Перейдите по пути загрузки загрузчика и введите следующую команду.
язык: Баш avrdude -c usbtiny -p atmega328p -U flash:w:optiboot_atmega328_2012_with_1s_watchdog.hex
Если все пойдет хорошо, вы должны получить сообщение о том, что файл написан, проверен и загрузка завершена. Вы должны получить результат, аналогичный показанному ниже. В этом случае файл конфигурации (т.е. avrdude.conf ) и загрузчик ( *.hex ) не находились в одном рабочем каталоге. Требовались две дополнительные команды, чтобы указать, где искать файлы. Кроме того, формат *.hex необходимо было автоматически определять при прошивке файла путем добавления :а
.
Вернитесь в Arduino IDE, отсоедините USB-кабель от программатора и подключитесь к USB-порту RedBoard, чтобы посмотреть, сможете ли вы загрузить простой скетч blink.ino обратно на плату через последовательный порт. Перед загрузкой обязательно выберите соответствующее определение платы и COM-порт. Вы должны увидеть знакомое сообщение, указывающее, что Arduino IDE «Выполняется загрузка» после завершения, а встроенный светодиод начинает мигать на контакте 13.
Полезные параметры
Вот несколько последних советов и приемов AVRDUDE, прежде чем мы отправим вас в мир AVR.
Укажите программатор и устройство AVR
Для использования AVRDUDE требуются два варианта: программатор типа и устройство AVR. Спецификация :
-c usbtiny
. Если вам нужно использовать другой программатор, ознакомьтесь с этой страницей и CTRL + F до « -c идентификатор программиста ».Тип устройства AVR определяется параметром
-p
. Мы показали несколько примеров с ATmega328P, но что, если вы используете ATtiny85? В этом случае вам нужно будет вместо этого поставить-p t85
. Проверьте вверху этой страницы исчерпывающий список совместимых типов устройств AVR.
Подробный вывод
Добавление одного или нескольких -v
к вашей команде AVRDUDE активирует различные уровни детализации действия. Это удобно, если вам нужна сводка параметров конфигурации или подробное представление о том, какие данные отправляются на ваш AVR.
Есть много других источников. Полный список команд можно найти в онлайн-документации AVRDUDE в разделе «Описания параметров».
Онлайн-документация AVRDUDE: описания опций
Набор инструментов AVR — документация UTAT Space Systems 1.0
Набор инструментов AVR — это набор инструментов с открытым исходным кодом, которые можно использовать вместе для компиляции и загрузки программ в микроконтроллеры на базе AVR, таких как микроконтроллер ATMega32M1, используемый в подсистеме Heron Mk II микроконтроллеры.
Установка и понимание того, как использовать набор инструментов AVR, является первым шаг к участию в кодовой базе Heron Mk II.
Глоссарий
Прежде чем углубиться, сделаем паузу, чтобы ввести следующую терминологию. Это будет широко используется в этих документах.
- SSM: сокращение от подсистемы микроконтроллера; это относится к микроконтроллер, который управляет конкретной платой подсистемы.
- 32M1: сокращение от ATMega32M1.
- MCU: сокращение от микроконтроллера.
- Библиотека: автономная единица кода, предназначенная для повторного использования.
- Заголовок: файл, описывающий интерфейс к определенной единице кода. Заголовок
файлы заканчиваются на
.h
. - SPI: последовательный периферийный интерфейс; механизм связи 32М1 с периферийными устройствами, такими как внешние датчики.
- CAN: локальная сеть контроллера; надежная шина, по которой взаимодействуют все SSM друг с другом.
Компилятор AVR-GCC
Компилятор AVR-GCC — это инструмент, используемый для компиляции и связывания кода C для создания исполняемый файл, который может работать на 32M1. Как правило, компиляция относится к процесс преобразования структурированных данных из одной формы в другую. Компилятор AVR-GCC преобразует код C в машинные инструкции, которые 32M1 может выполнить. Он также связывает этот код вместе в исполняемый файл; программа который можно запустить на 32M1.
На самом деле, AVR-GCC делает гораздо больше, в том числе предупреждает вас о определенные виды ошибок в вашем коде (ошибки типов) и выполнение оптимизаций для уменьшения размера кода.
При установке AVR-GCC также устанавливается множество других полезных программ, таких как avr-objcopy
, avr-ar
и avr-objdump
. Вы узнаете об этих инструментах позже.
AVR-GCC основан на хорошо известном компиляторе GCC. Чтобы узнать больше о AVR-GCC и GCC, посмотрите здесь.
AVR-GCC можно вызвать, запустив avr-gcc
в командной строке. Вы не будете
обычно приходится вызывать компилятор AVR-GCC самостоятельно; как вы увидите процесс
компиляции вашего кода можно автоматизировать до такой степени, что он становится единым
команда.
AVR libc
AVR libc — это библиотека, которая предоставляет все стандартные заголовочные файлы C и их реализации, а также специальный код, используемый для доступа к уникальным функциям к микроконтроллерам на основе AVR, таким как доступ к контактам, обработка аппаратных прерываний и взаимодействие с периферийными устройствами.
Всякий раз, когда вы используете стандартные библиотеки C, например, через #include
или #include
, вы неявно используете AVR libc.
Чтобы узнать больше о AVR libc, прочтите онлайн-документацию. здесь.
avrdude
Avrdude — это приложение командной строки, которое при использовании в сочетании с программатор, может загружать содержимое определенного файла во флэш-память 32M1 Память. Мы используем avrdude для загрузки исполняемых файлов на 32M1.
Avrdude записывает во флэш-память 32M1, используя протокол, называемый In-Circuit серийное программирование; Провайдер для краткости.