Общая характеристика микроконтроллеров AVR, ПРОГРАММНАЯ МОДЕЛЬ И СИСТЕМА КОМАНД
В настоящее время в серийном производстве находятся два семейства AVR – Tiny и Mega. Микроконтроллеры семейства Tiny имеют небольшой объем памяти программ и весьма ограниченную периферию. Они выпускаются в 8-выводных корпусах и являются самыми дешевыми. Наиболее развитую периферию, наибольшие объемы памяти данных и программ имеют микроконтроллеры семейства Mega.
AVR, пожалуй, одно из самых интересных направлений, развиваемых корпорацией Atmel. Они представляют собой мощный инструмент для создания современных высокопроизводительных и экономичных многоцелевых контроллеров. На настоящий момент соотношение «цена – производительность –энергопотребление» для AVR является одним из лучших на мировом рынке 8-разрядных микроконтроллеров. Объемы продаж AVR в мире удваиваются ежегодно. В геометрической прогрессии растет число сторонних фирм, разрабатывающих и выпускающих разнообразные программные и аппаратные средства поддержки разработок для них. Можно считать, что AVR становится еще одним индустриальным стандартом среди 8-разрядных микроконтроллеров общего назначения.
Сама идея создания нового RISC-ядра родилась в 1994 году в Норвегии. В 1995 году два его изобретателя Альф Боген (Alf-Egil Bogen) и Вегард Воллен (Vegard Wollen) предложили корпорации Atmel выпускать новый 8-разрядный RISC-микроконтроллер как стандартное изделие и снабдить его Flash-памятью программ на кристалле. Руководство Atmel Corp. приняло решение инвестировать данный проект. В 1996 году был основан исследовательский центр в городе Тронхейм (Норвегия). Оба изобретателя стали директорами нового центра, а микроконтроллерное ядро было запатентовано и получило название AVR (Alf-Egil Bogen + Vegard Wollen + RISC). Первый опытный кристалл 90S1200 был выпущен на стыке 1996–1997 годов, а с 3 квартала 1997 года корпорация Atmel приступила к серийному производству нового семейства микроконтроллеров и к их рекламной и технической поддержке.
AVR функционируют в широком диапазоне питающих напряжений от 1,8 до 6,0 вольт. Энергопотребление в активном режиме зависит от величины напряжения питания, от частоты, на которой работает AVR и от конкретного типа микроконтроллера. Подробные спецификации обычно приводятся в оригинальной технической документации Atmel Corp. Температурные диапазоны работы микроконтроллеров AVR – коммерческий (0С...70С) и индустриальный (-40С...+85С).
Все микроконтроллеры AVR имеют Flash-память программ, которая может быть загружена как с помощью обычного программатора, так и с помощью SPI-интерфейса, в том числе непосредственно на целевой плате (рис. 1.1). Число циклов перезаписи – не менее 1000.
Все AVR имеют также блок энергонезависимой электрически стираемой памяти данных EEPROM. Этот тип памяти, доступный программе микроконтроллера непосредственно в ходе ее выполнения, удобен для хранения промежуточных данных, различных констант, таблиц перекодировок, калибровочных коэффициентов и т.п. EEPROM также может быть загружена извне как через SPI-интерфейс, так и с помощью обычного программатора. Число циклов перезаписи – не менее 100000. Два программируемых бита секретности позволяют защитить память программ и энергонезависимую память данных EEPROM от несанкционированного считывания.
Следующая отличительная черта архитектуры микроконтроллеров AVR – регистровый файл быстрого доступа (рис. 1.2). Каждый из 32-х регистров общего назначения длиной 1 байт непосредственно связан с арифметико-логическим устройством (ALU) процессора. Другими словами, в AVR существует 32 регистра-аккумулятора (сравните, например, с MCS-51). Это обстоятельство позволяет в сочетании с конвейерной обработкой выполнять одну операцию в ALU за один машинный цикл. Так, два операнда извлекаются из регистрового файла, выполняется команда и результат записывается обратно в регистровый файл в течение только одного машинного цикла, причем этот цикл равен периоду тактового генератора. Старшие регистры объединены парами и образуют три 16-разрядных регистра X, Y и Z, предназначенных для косвенной адресации ячеек памяти (AVR без RAM имеют только один 16-битный регистр Z).
Внутренний тактовый генератор AVR может запускаться от нескольких источников опорной частоты (внешний генератор, внешний кварцевый резонатор, внутренняя или внешняя RC-цепочка). Поскольку AVR-микроконтроллеры полностью статические, минимальная допустимая частота ничем не ограничена (вплоть до пошагового режима). Максимальная рабочая частота определяется конкретным типом микроконтроллера. Верхние границы частотного диапазона гарантируют устойчивую работу микроконтроллеров при работе во всем температурном диапазоне.
Программная модель AVR-микроконтроллеров приведена на рис.1.3. Для хранения оперативных данных программист, кроме регистрового файла, может использовать внутреннюю и внешнюю (если они имеются) блоки RAM. Поскольку внутренняя и внешняя RAM входят в единое адресное пространство (вместе с оперативными регистрами и регистрами ввода/вывода), то для доступа к ячейкам внутренней и внешней памяти используются одни и те же команды. Внутренняя оперативная память RAM отсутствует у кристаллов семейства Tiny, но имеется у всех AVR семейства Mega. Для некоторых микроконтроллеров возможна организация подключения внешней памяти данных объемом до 64Кб.
Рис. 1.3 – Программная модель AVR-микроконтроллеров
Регистровый файл, блок регистров ввода/вывода и память данных образуют единое адресное пространство, что дает возможность при программировании обращаться к 32 оперативным регистрам и к регистрам ввода/вывода как к ячейкам памяти, используя команды доступа к RAM (в том числе и с косвенной адресацией). Младшие 32 адреса ($0 — $1F) соответствуют оперативным регистрам. Следующие 64 адреса ($20 — $5F) зарезервированы для регистров ввода/вывода. Внутренняя RAM начинается с адреса $60 (знак $ указывает на шестнадцатеричную систему счисления).
Таким образом, регистры ввода/вывода имеют двойную нумерацию. Если используются команды IN, OUT, SBI, CBI, SBIC, SBIS, то следует использовать нумерацию регистров ввода/вывода, начинающуюся с нуля (назовем ее основной). Если же к регистрам ввода/вывода доступ осуществляется как к ячейкам памяти, то необходимо использовать нумерацию единого адресного пространства оперативной памяти данных AVR. Очевидно, что адрес в едином адресном пространстве памяти данных получается путем прибавления числа $20 к основному адресу регистра ввода/вывода. Кроме оперативной памяти программно доступными ресурсами микроконтроллера являются энергонезависимые, электрически программируемые FLASH и EEPROM блоки памяти, которые имеют отдельные адресные пространства.
Так как все команды AVR представляют собой 16-раз-рядные слова, FLASH-память организована как последовательность 16-разрядных ячеек и имеет емкость от 512 слов до 128K слов в зависимости от типа кристалла.
Во FLASH-память, кроме программы, могут быть записаны постоянные данные, которые не изменяются во время функционирования микропроцессорной системы. Это различные константы, таблицы знакогенераторов, таблицы линеаризации датчиков и т.п. Данные из FLASH памяти могут быть программным образом считаны в регистровый файл при помощи команды LPM (см. группу команд передачи данных).
EEPROM-блок электрически стираемой памяти данных AVR предназначен для хранения энергонезависимых данных, которые могут изменяться непосредственно на объекте. Это калибровочные коэффициенты, различные уставки, конфигурационные параметры системы и т.п. EEPROM-память данных может быть программным путем как прочитана, так и записана. Однако специальных команд обращения к EEPROM-памяти нет. Чтение и запись ячеек EEPROM выполняются через регистры ввода/вывода EEAR (регистр адреса), EEDR (регистр данных) и EECR (регистр управления).
Сторожевой (WATCHDOG) таймер предназначен для защиты микроконтроллера от сбоев в процессе работы. Он имеет свой собственный RC-генератор, работающий на частоте 1 МГц. Эта частота является приближенной и зависит прежде всего от величины напряжения питания микроконтроллера и от температуры. WATCHDOG-таймер снабжен своим собственным предделителем входной частоты с программируемым коэффициентом деления, что позволяет подстраивать временной интервал переполнения таймера и сброса микроконтроллера. WATCHDOG-таймер может быть отключен программным образом во время работы микроконтроллера как в активном режиме, так и в любом из режимов пониженного энергопотребления. В последнем случае это приводит к значительному снижению потребляемого тока.
Микроконтроллеры AVR имеют в своем составе от 1 до 4 таймеров/счетчиков общего назначения с разрядностью 8 или 16 бит, которые могут работать и как таймеры от внутреннего источника опорной частоты, и как счетчики внешних событий с внешним тактированием. Общие черты всех таймеров/счетчиков следующие:
· наличие программируемого предделителя входной частоты с различными градациями деления. Отличительной чертой является возможность работы таймеров/счетчиков на основной тактовой частоте микроконтроллера без предварительного ее понижения, что существенно повышает точность генерации временных интервалов системы;
· независимое функционирование от режима работы процессорного ядра микроконтроллера (т.е. они могут быть как считаны, так и загружены новым значением в любое время);
· возможность работы или от внутреннего источника опорной частоты, или в качестве счетчика событий. Верхний частотный порог определен в этом случае как половина основной тактовой частоты микроконтроллера. Выбор перепада внешнего источника (фронт или срез) программируется пользователем;
· наличие различных векторов прерываний для нескольких различных событий (переполнение, захват, сравнение).
Система реального времени (RTC) реализована во всех микроконтроллерах семейства Mega. Таймер/счетчик RTC имеет свой собственный предделитель, который может быть программным способом подключен или к основному внутреннему источнику тактовой частоты микроконтроллера, или к дополнительному асинхронному источнику опорной частоты (кварцевый резонатор или внешний синхросигнал). Для этой цели зарезервированы два внешних вывода микроконтроллера. Внутренний осциллятор, нагруженный на счетный вход таймера/счетчика RTC, оптимизирован для работы с внешним «часовым» кварцевым резонатором 32,768 кГц.
Порты ввода/вывода AVR имеют число независимых линий «Вход/Выход» от 3 до 53. Каждый разряд порта может быть запрограммирован на ввод или на вывод информации. Мощные выходные драйверы обеспечивают токовую нагрузочную способность 20 мА на линию порта (втекающий ток) при максимальном значении 40 мА, что позволяет, например, непосредственно подключать к микроконтроллеру светодиоды и биполярные транзисторы. Общая токовая нагрузка на все линии одного порта не должна превышать 80 мА (все значения приведены для напряжения питания 5 В).
Аналоговый компаратор входит в состав большинства микроконтроллеров AVR. Типовое напряжение смещения равно 10 мВ, время задержки распространения составляет 500 нс и зависит от напряжения питания микроконтроллера. Так, например, при напряжении питания 2,7 вольт оно равно 750 нс. Аналоговый компаратор имеет свой собственный вектор прерывания в общей системе прерываний микроконтроллера. При этом тип перепада, вызывающий запрос на прерывание при срабатывании компаратора, может быть запрограммирован пользователем как фронт, срез или переключение. Логический выход компаратора может быть программным образом подключен ко входу одного из 16-разрядных таймеров/счетчиков, работающего в режиме захвата. Это дает возможность измерять длительность аналоговых сигналов, а также максимально просто реализовывать АЦП двухтактного интегрирования.
Аналого-цифровой преобразователь (АЦП) построен по классической схеме последовательных приближений с устройством выборки/хранения (УВХ). Каждый из аналоговых входов может быть соединен со входом УВХ через аналоговый мультиплексор. Устройство выборки/хранения имеет свой собственный усилитель, гарантирующий, что измеряемый аналоговый сигнал будет стабильным в течение всего времени преобразования. Разрядность АЦП составляет 10 бит при нормируемой погрешности +/– 2 разряда. АЦП может работать в двух режимах – однократное преобразование по любому выбранному каналу и последовательный циклический опрос всех каналов. Время преобразования выбирается программно с помощью установки коэффициента деления частоты специального предделителя, входящего в состав блока АЦП. Важной особенностью аналого-цифрового преобразователя является функция подавления шума при преобразовании. Пользователь имеет возможность, выполнив короткий ряд программных операций, запустить АЦП в то время, когда центральный процессор находится в одном из режимов пониженного энергопотребления. При этом на точность преобразования не будут оказывать влияние помехи, возникающие при работе процессорного ядра.
Выполнять арифметико-логические операции и операции сдвига непосредственно над содержимым ячеек памяти нельзя. Нельзя также записать константу или очистить содержимое ячейки памяти. Система команд AVR позволяет лишь выполнять операции обмена данными между ячейками RAM и оперативными регистрами. Достоинством системы команд можно считать разнообразные режимы адресации ячеек памяти. Кроме прямой адресации (см. группу команд передачи данных) имеются следующие режимы: косвенная, косвенная с пост-инкрементом, косвенная с предекрементом и косвенная со смещением.
Регистры ввода/вывода располагаются в так называемом адресном пространстве ввода/вывода размером 64 байт. Их можно разделить на две группы: служебные регистры микроконтроллера и регистры, относящиеся к периферийным устройствам (в том числе порты ввода/вывода). Изучение данных регистров удобно выполнять одновременно с изучением конкретного периферийного узла.
Среди регистров ввода/вывода есть регистр, используемый наиболее часто в процессе выполнения программы. Это регистр статуса SREG. Он располагается по адресу $3F и содержит набор флагов (табл. 1.1), показывающих текущее состояние микроконтроллера. Большинство флагов автоматически устанавливаются в соответствии с результатом выполнения команд. Все разряды SREG доступны как для записи, так и для чтения. После сброса микроконтроллера регистр обнулен.
Все регистры ввода/вывода могут считываться и записываться через оперативные регистры при помощи команд IN, OUT (см. группу команд передачи данных). Регистры ввода/вывода, имеющие адреса в диапазоне $00 — $1F, обладают возможностью побитовой адресации. Непосредственная установка и сброс отдельных разрядов этих регистров выполняется командами SBI и CBI (см. группу команд работы с битами). Для признаков результата операции, которые являются битами регистра ввода/вывода SREG, имеется целый набор команд установки и сброса. Команды условных переходов в качестве своих операндов могут иметь как биты-признаки результата операции, так и отдельные разряды побитно адресуемых регистров ввода/вывода.
Следует также иметь в виду, что у разных типов AVR одни и те же регистры ввода/вывода могут иметь различные адреса. Для того, чтобы обеспечить переносимость программного обеспечения с одного типа кристалла на другой, следует использовать в программе стандартные, принятые в оригинальной фирменной документации, символические имена регистров ввода/вывода, а соответствие этих имен реальным адресам задавать, подключая в начале своей программы (при помощи директивы ассемблера .INCLUDE) файл определения адресов регистров ввода/вывода. Файлы определения адресов регистров ввода/вывода имеют расширение .inc. Они уже созданы разработчиками фирмы ATMEL и свободно распространяются вместе с документацией на AVR-микроконтроллеры. В этих файлах задается соответствие символических имен основным адресам регистров ввода/вывода.
Таблица 1.1 – Разряды регистра состояния SREG
Разряд | Название | Описание |
I | Общее разрешение прерываний. Для разрешения прерываний этот флаг должен быть установлен в 1. Флаг сбрасывается аппаратно после входа в подпрограмму обслуживания прерываний и восстанавливается командой RETI для разрешения обработки следующих прерываний | |
T | Хранение копируемого бита.Заданный разряд любого РОН может быть скопирован в этот разряд командой BST или установлен в соответствии с содержимым данного разряда командой BLD | |
H | Флаг потетрадного переноса. Этот флаг устанавливается в 1, если произошел перенос из младшей тетрады байта (из 3-го разряда в 4-й) или заем из старшей тетрады при выполнении некоторых арифметических операций | |
S | Флаг знака. Этот флаг равен результату операции «Исключающее ИЛИ» между флагами N и V. Он устанавливается в 1, если результат выполнения арифметической операции меньше нуля | |
V | Флаг переполнения дополнительного кода. Этот флаг устанавливается в 1 при переполнении разрядной сетки знакового результата | |
N | Флаг отрицательного значения. Этот флаг устанавливается в 1, если старший разряд результата операции (7 разряд) равен 1 | |
Z | Флаг нуля. Этот флаг устанавливается в 1 при нулевом результате выполнения операции | |
C | Флаг переноса. Этот флаг устанавливается в 1, если в результате выполнения операции произошел выход за границы байта |
Младшие адреса памяти программ имеют специальное назначение. Адрес $000 является адресом, с которого начинает выполняться программа после сброса процессора. Начиная со следующего адреса ячейки памяти программ образуют область векторов прерывания. В этой области для каждого возможного источника прерывания отведен свой адрес, по которому (в случае использования данного прерывания) размещают команду относительного перехода RJMP на подпрограмму обработки прерывания. Следует помнить, что адреса векторов прерывания одних и тех же аппаратных узлов для разных типов AVR могут иметь разное значение. Поэтому для обеспечения переносимости программного обеспечения удобно, так же как и в случае с регистрами ввода/вывода, использовать символические имена адресов векторов прерывания, которые определены в соответствующем inc-файле.
В ячейках оперативной памяти организуется системный стек, который используется автоматически для хранения адресов возврата при выполнении подпрограмм, а также может использоваться программистом для временного хранения содержимого оперативных регистров (команды PUSH и POP). Стек растет от старших адресов к младшим, поэтому, учитывая, что начальное значение указателя стека после сброса равно нулю, программист AVR обязательно должен в инициализирующей части программы позаботиться об установке указателя стека, если он предполагает использовать хотя бы одну подпрограмму. Микроконтроллеры, не имеющие RAM (семейства Tiny), содержат трехуровневый аппаратный стек.
Система команд AVR представлена в табл. 1.2.
Операнды могут быть таких видов:
Rd: Результирующий (и исходный) регистр в регистровом файле;
Rr: Исходный регистр в регистровом файле;
b: Константа (3 бита), может быть константное выражение;
s: Константа (3 бита), может быть константное выражение;
P: Константа (5-6 бит), может быть константное выражение;
K6; Константа (6 бит), может быть константное выражение;
K8: Константа (8 бит), может быть константное выражение;
k: Константа (размер зависит от инструкции), может быть константное выражение;
q: Константа (6 бит), может быть константное выражение;
Rdl: R24, R26, R28, R30. Для инструкций ADIW и SBIW;
X,Y,Z: Регистры косвенной адресации (X=R27:R26, Y=R29:R28, Z=R31:R30).
Ассемблер не различает регистр символов.
Таблица 1.2 — Инструкции процессоров AVR
Арифметические и логические команды
Мнемоника | Операнды | Описание | Операция | Флаги | Циклы | ||
ADD | Rd,Rr | Суммирование без переноса | Rd = Rd + Rr | Z,C,N,V,H,S | |||
ADC | Rd,Rr | Суммирование с переносом | Rd = Rd + Rr + C | Z,C,N,V,H,S | |||
SUB | Rd,Rr | Вычитание без переноса | Rd = Rd - Rr | Z,C,N,V,H,S | |||
SUBI | Rd,K8 | Вычитание константы | Rd = Rd - K8 | Z,C,N,V,H,S | |||
SBC | Rd,Rr | Вычитание с переносом | Rd = Rd - Rr - C | Z,C,N,V,H,S | |||
SBCI | Rd,K8 | Вычитание константы с переносом | Rd = Rd - K8 - C | Z,C,N,V,H,S | |||
AND | Rd,Rr | Логическое И | Rd = Rd · Rr | Z,N,V,S | |||
ANDI | Rd,K8 | Логическое И с константой | Rd = Rd · K8 | Z,N,V,S | |||
OR | Rd,Rr | Логическое ИЛИ | Rd = Rd V Rr | Z,N,V,S | |||
ORI | Rd,K8 | Логическое ИЛИ с константой | Rd = Rd V K8 | Z,N,V,S | |||
EOR | Rd,Rr | Логическое исключающее ИЛИ | Rd = Rd EOR Rr | Z,N,V,S | |||
COM | Rd | Побитная Инверсия | Rd = $FF - Rd | Z,C,N,V,S | |||
NEG | Rd | Изменение знака (Доп. код) | Rd = $00 - Rd | Z,C,N,V,H,S | |||
SBR | Rd,K8 | Установить бит (биты) в регистре | Rd = Rd V K8 | Z,C,N,V,S | |||
CBR | Rd,K8 | Сбросить бит (биты) в регистре | Rd = Rd · ($FF - K8) | Z,C,N,V,S | |||
INC | Rd | Инкрементировать значение регистра | Rd = Rd + 1 | Z,N,V,S | |||
DEC | Rd | Декрементировать значение регистра | Rd = Rd -1 | Z,N,V,S | |||
TST | Rd | Проверка на ноль либо отрицательность | Rd = Rd · Rd | Z,C,N,V,S | |||
CLR | Rd | Очистить регистр | Rd = 0 | Z,C,N,V,S | |||
SER | Rd | Установить регистр | Rd = $FF | None | |||
ADIW | Rdl,K6 | Сложить константу и слово | Rdh:Rdl = Rdh:Rdl + K6 | Z,C,N,V,S | |||
| Rdl,K6 | Вычесть константу из слова | Rdh:Rdl = Rdh:Rdl - K 6 | Z,C,N,V,S | |||
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 |
Команды ветвления
Мнемоника | Операнды | Описание | Операция | Флаги | Циклы | ||
RJMP | k | Относительный переход | PC = PC + k +1 | None | |||
IJMP | Нет | Косвенный переход на (Z) | PC = Z | None | |||
EIJMP | Нет | Расширенный косвенный переход на (Z) | STACK = PC+1, PC(15:0) = Z, PC(21:16) = EIND | None | |||
JMP | k | Переход | PC = k | None | |||
RCALL | k | Относительный вызов подпрограммы | STACK = PC+1, PC = PC + k + 1 | None | 3/4* | ||
ICALL | Нет | Косвенный вызов (Z) | STACK = PC+1, PC = Z | None | 3/4* | ||
EICALL | Нет | Расширенный косвенный вызов (Z) | STACK = PC+1, PC(15:0) = Z, PC(21:16) =EIND | None | 4* | ||
CALL | k | Вызов подпрограммы | STACK = PC+2, PC = k | None | 4/5* | ||
RET | Нет | Возврат из подпрограммы | PC = STACK | None | 4/5* | ||
RETI | Нет | Возврат из прерывания | PC = STACK | I | 4/5* | ||
| Rd,Rr | Сравнить, пропустить если равны | if (Rd ==Rr) PC = PC 2 or 3 | None | 1/2/3 | ||
CP | Rd,Rr | Сравнить | Rd -Rr | Z,C,N,V,H,S | |||
CPC | Rd,Rr | Сравнить с переносом | Rd - Rr - C | Z,C,N,V,H,S | |||
CPI | Rd,K8 | Сравнить с константой | Rd - K | Z,C,N,V,H,S | |||
SBRC | Rr,b | Пропустить если бит в регистре очищен | if(Rr(b)==0) PC = PC + 2 or 3 | None | 1/2/3 | ||
SBRS | Rr,b | Пропустить если бит в регистре установлен | if(Rr(b)==1) PC = PC + 2 or 3 | None | 1/2/3 | ||
SBIC | P,b | Пропустить если бит в порту очищен | if(I/O(P,b)==0) PC = PC + 2 or 3 | None | 1/2/3 | ||
SBIS | P,b | Пропустить если бит в порту установлен | if(I/O(P,b)==1) PC = PC + 2 or 3 | None | 1/2/3 | ||
BRBC | s,k | Перейти если флаг в SREG очищен | if(SREG(s)==0) PC = PC + k + 1 | None | 1/2 | ||
BRBS | s,k | Перейти если флаг в SREG установлен | if(SREG(s)==1) PC = PC + k + 1 | None | 1/2 | ||
BREQ | k | Перейти если равно | if(Z==1) PC = PC + k + 1 | None | 1/2 | ||
BRNE | k | Перейти если не равно | if(Z==0) PC = PC + k + 1 | None | 1/2 | ||
BRCS | k | Перейти если перенос установлен | if(C==1) PC = PC + k + 1 | None | 1/2 | ||
BRCC | k | Перейти если перенос очищен | if(C==0) PC = PC + k + 1 | None | 1/2 | ||
BRSH | k | Перейти если равно или больше | if(C==0) PC = PC + k + 1 | None | 1/2 | ||
BRLO | k | Перейти если меньше | if(C==1) PC = PC + k + 1 | None | 1/2 | ||
BRMI | k | Перейти если минус | if(N==1) PC = PC + k + 1 | None | 1/2 | ||
BRPL | k | Перейти если плюс | if(N==0) PC = PC + k + 1 | None | 1/2 | ||
BRGE | k | Перейти если больше или равно (со знаком) | if(S==0) PC = PC + k + 1 | None | 1/2 | ||
BRLT | k | Перейти если меньше (со знаком) | if(S==1) PC = PC + k + 1 | None | 1/2 | ||
| k | Перейти если флаг внутреннего переноса установлен | if(H==1) PC = PC + k + 1 | None | 1/2 | ||
BRHC | k | Перейти если флаг внутреннего переноса очищен | if(H==0) PC = PC + k + 1 | None | 1/2 | ||
BRTS | k | Перейти если флаг T установлен | if(T==1) PC = PC + k + 1 | None | 1/2 | ||
BRTC | k | Перейти если флаг T очищен | if(T==0) PC = PC + k + 1 | None | 1/2 | ||
BRVS | k | Перейти если флаг переполнения установлен | if(V==1) PC = PC + k + 1 | None | 1/2 | ||
BRVC | k | Перейти если флаг переполнения очищен | if(V==0) PC = PC + k + 1 | None | 1/2 | ||
BRIE | k | Перейти если прерывания разрешены | if(I==1) PC = PC + k + 1 | None | 1/2 | ||
BRID | k | Перейти если прерывания запрещены | if(I==0) PC = PC + k + 1 | None | 1/2 |
* Для операций доступа к данным количество циклов указано при условии доступа к внутренней памяти данных, и не корректно при работе с внешним ОЗУ. Для инструкций CALL, ICALL, EICALL, RCALL, RET и RETI необходимо добавить три цикла плюс по два цикла для каждого ожидания в контроллерах с PC, меньшим 16 бит (128KB памяти программ). Для устройств с памятью программ свыше 128KB добавьте пять циклов плюс по три цикла на каждое ожидание.
Команды передачи данных
Мнемоника | Операнды | Описание | Операция | Флаги | Циклы | ||
MOV | Rd,Rr | Скопировать регистр | Rd = Rr | None | |||
MOVW | Rd,Rr | Скопировать пару регистров | Rd+1:Rd = Rr+1:Rr | None | |||
LDI | Rd,K8 | Загрузить константу | Rd = K | None | |||
LDS | Rd,k | Прямая загрузка | Rd = (k) | None | 2* | ||
LD | Rd,X | Косвенная загрузка | Rd = (X) | None | 2* | ||
LD | Rd,X+ | Косвенная загрузка с пост-инкрементом | Rd = (X), X=X+1 | None | 2* | ||
| Rd,-X | Косвенная загрузка с пре-декрементом | X=X-1, Rd = (X) | None | 2* | ||
LD | Rd,Y | Косвенная загрузка | Rd = (Y) | None | 2* | ||
LD | Rd,Y+ | Косвенная загрузка с пост-инкрементом | Rd = (Y), Y=Y+1 | None | 2* | ||
LD | Rd,-Y | Косвенная загрузка с пре-декрементом | Y=Y-1, Rd = (Y) | None | 2* | ||
LDD | Rd,Y+q | Косвенная загрузка с замещением | Rd = (Y+q) | None | 2* | ||
LD | Rd,Z | Косвенная загрузка | Rd = (Z) | None | 2* | ||
LD | Rd,Z+ | Косвенная загрузка с пост-инкрементом | Rd = (Z), Z=Z+1 | None | 2* | ||
LD | Rd,-Z | Косвенная загрузка с пре-декрементом | Z=Z-1, Rd = (Z) | None | 2* | ||
LDD | Rd,Z+q | Косвенная загрузка с замещением | Rd = (Z+q) | None | 2* | ||
STS | k,Rr | Прямое сохранение | (k) = Rr | None | 2* | ||
ST | X,Rr | Косвенное сохранение | (X) = Rr | None | 2* | ||
ST | X+,Rr | Косвенное сохранение с пост-инкрементом | (X) = Rr, X=X+1 | None | 2* | ||
ST | -X,Rr | Косвенное сохранение с пре-декрементом | X=X-1, (X)=Rr | None | 2* | ||
ST | Y,Rr | Косвенное сохранение | (Y) = Rr | None | 2* | ||
ST | Y+,Rr | Косвенное сохранение с пост-инкрементом | (Y) = Rr, Y=Y+1 | None | |||
ST | -Y,Rr | Косвенное сохранение с пре-декрементом | Y=Y-1, (Y) = Rr | None | |||
ST | Y+q,Rr | Косвенное сохранение с замещением | (Y+q) = Rr | None | |||
ST | Z,Rr | Косвенное сохранение | (Z) = Rr | None | |||
ST | Z+,Rr | Косвенное сохранение с пост-инкрементом | (Z) = Rr, Z=Z+1 | None | |||
ST | -Z,Rr | Косвенное сохранение с пре-декрементом | Z=Z-1, (Z) = Rr | None | |||
ST | Z+q,Rr | Косвенное сохранение с замещением | (Z+q) = Rr | None | |||
LPM | Нет | Загрузка из программной памяти | R0 = (Z) | None | |||
LPM | Rd,Z | Загрузка из программной памяти | Rd = (Z) | None | |||
LPM | Rd,Z+ | Загрузка из программной памяти с пост-инкрементом | Rd = (Z), Z=Z+1 | None | |||
ELPM | Нет | Расширенная загрузка из программной памяти | R0 = (RAMPZ:Z) | None | |||
ELPM | Rd,Z | Расширенная загрузка из программной памяти | Rd = (RAMPZ:Z) | None | |||
| Rd,Z+ | Расширенная загрузка из программной памяти с пост-инкрементом | Rd = (RAMPZ:Z), Z = Z+1 | None | |||
SPM | Нет | Сохранение в программной памяти | (Z) = R1:R0 | None | - | ||
ESPM | Нет | Расширенное сохранение в программной памяти | (RAMPZ:Z) = R1:R0 | None | - | ||
IN | Rd,P | Чтение порта | Rd = P | None | |||
OUT | P,Rr | Запись в порт | P = Rr | None | |||
PUSH | Rr | Занесение регистра в стек | STACK = Rr | None | |||
POP | Rd | Извлечение регистра из стека | Rd = STACK | None |
* Для операций доступа к данным количество циклов указано при условии доступа к внутренней памяти данных, и не корректно при работе с внешним ОЗУ. Для инструкций LD, ST, LDD, STD, LDS, STS, PUSH и POP необходимо добавить один цикл плюс по одному циклу для каждого ожидания.
Команды работы с битами
Мнемоника | Операнды | Описание | Операция | Флаги | Циклы | ||
LSL | Rd | Логический сдвиг влево | Rd(n+1)=Rd(n), Rd(0)=0, C=Rd(7) | Z,C,N,V,H,S | |||
LSR | Rd | Логический сдвиг вправо | Rd(n)=Rd(n+1), Rd(7)=0, C=Rd(0) | Z,C,N,V,S | |||
ROL | Rd | Циклический сдвиг влево через C | Rd(0)=C, Rd(n+1)=Rd(n), C=Rd(7) | Z,C,N,V,H,S | |||
ROR | Rd | Циклический сдвиг вправо через C | Rd(7)=C, Rd(n)=Rd(n+1), C=Rd(0) | Z,C,N,V,S | |||
ASR | Rd | Арифметический сдвиг вправо | Rd(n)=Rd(n+1), n=0,...,6 | Z,C,N,V,S | |||
SWAP | Rd | Перестановка тетрад | Rd(3..0) = Rd(7..4), Rd(7..4) = Rd(3..0) | None | |||
BSET | s | Установка флага | SREG(s) = 1 | SREG(s) | |||
BCLR | s | Очистка флага | SREG(s) = 0 | SREG(s) | |||
SBI | P,b | Установить бит в порту | I/O(P,b) = 1 | None | |||
| P,b | Очистить бит в порту | I/O(P,b) = 0 | None | |||
BST | Rr,b | Сохранить бит из регистра в T | T = Rr(b) | T | |||
BLD | Rd,b | Загрузить бит из T в регистр | Rd(b) = T | None | |||
SEC | Нет | Установить флаг переноса | C =1 | C | |||
CLC | Нет | Очистить флаг переноса | C = 0 | C | |||
SEN | Нет | Установить флаг отрицательного числа | N = 1 | N | |||
CLN | Нет | Очистить флаг отрицательного числа | N = 0 | N | |||
SEZ | Нет | Установить флаг нуля | Z = 1 | Z | |||
CLZ | Нет | Очистить флаг нуля | Z = 0 | Z | |||
SEI | Нет | Установить флаг прерываний | I = 1 | I | |||
CLI | Нет | Очистить флаг прерываний | I = 0 | I | |||
SES | Нет | Установить флаг числа со знаком | S = 1 | S | |||
CLS | Нет | Очистить флаг числа со знаком | S = 0 | S | |||
SEV | Нет | Установить флаг переполнения | V = 1 | V | |||
CLV | Нет | Очистить флаг переполнения | V = 0 | V | |||
SET | Нет | Установить флаг T | T = 1 | T | |||
CLT | Нет | Очистить флаг T | T = 0 | T | |||
SEH | Нет | Установить флаг внутреннего переноса | H = 1 | H | |||
CLH | Нет | Очистить флаг внутреннего переноса | H = 0 | H | |||
NOP | Нет | Нет операции | Нет | None | |||
SLEEP | Нет | Спать (уменьшить энергопотребление) | Смотрите описание инструкции | None | |||
WDR | Нет | Сброс сторожевого таймера | Смотрите описание инструкции | None |
Дата добавления: 2016-01-09; просмотров: 1874;