Шинные формирователи всех TWI-совместимых устройств выполняются по схеме с открытым коллектором (стоком), что позволяет реализовать функцию «монтажное И». Соответственно, НИЗКИЙ уровень на линии устанавливается тогда, когда одно или более устройств выставляют на линию сигнала лог. 0, а ВЫСОКИЙ уровень на линии устанавливается тогда, когда все устройства, подключенные к ней, устанавливают свои выходы в третье состояние.
Общие сведения о системе команд
Введение в систему команд
Система команд микроконтроллеров весьма развита и насчитывает до 130 различных инструкций. Несмотря на то что микроконтроллеры AVR являются микроконтроллерами с RISC-архитектурой (процессор с сокращенным набором команд), по количеству реализованных инструкций и их разнообразию они больше похожи на микроконтроллеры с CISC-архитектурой (процессор с полным набором команд). Практически каждая из команд (за исключением команд, у которых одним из операндов является 16-разрядный адрес) занимает только одну ячейку памяти программ. Причем это достигнуто не за счет сокращения количества команд процессора, а за счет увеличения разрядности памяти программ.
Операнды
Программа для любого микроконтроллера представляет собой последовательность команд, записанных в памяти программ. Большинство команд при выполнении изменяют содержимое одного или нескольких регистров общего назначения, регистров ввода/вывода или ячеек ОЗУ.
Для обращения к различным областям адресного пространства памяти данных используются различные команды, реализующие, в свою очередь, различные способы адресации
Доступ к регистрам ввода/вывода осуществляется по их адресам, являющимися операндами команды. Вместе с тем при написании ассемблерных программ гораздо удобнее обращаться к регистрам, используя вместо числовых значений адресов их стандартные, принятые символические имена.
Чтобы задать соответствие этих имен реальным адресам необходимо подключить в начале программы (при помощи директивы ассемблера .INCLUDE) файл определения адресов регистров ввода/вывода. Помимо всего прочего, такое решение облегчит перенос программного обеспечения с одного типа кристалла на другой.
Эти файлы (для каждой модели микроконтроллеров семейства) свободно распространяются фирмой «Atmel» вместе с документацией на микроконтроллеры (в частности, они, находятся на web-сайте фирмы). Для РОН, входящих в состав индексных регистров, в этих файлах определяются также дополнительные символические имена
Дополнительные символические имена индексных регистров
Регистр | Символическое имя |
R26 | XL |
R27 | ХН |
R28 | YL |
R29 | YH |
R30 | ZL |
R31 | ZH |
Названия этих файлов унифицированы и определяются следующим образом:
<номер модели>def. inc
Например, программа для микроконтроллера ATtinyl5L должна содержать следующую директиву ассемблера:
.include "tnl5def.inc"
а для микроконтроллера ATmega8535:
.include "m8535def.inc"
Необходимо только помнить, что если для обращения к регистру ввода/вывода используются команды обмена с ОЗУ, то к символическому имени требуется прибавить число $20.
Как уже было упомянуто, в микроконтроллерах память программ является 16-разрядной. Соответственно большинство команд описываются 16-разрядным словом, которое называется также кодом операции (КОП). Код операции — это число, расположенное в памяти программ и определяющее действие, которое необходимо произвести между источником и приемником. Некоторые команды, у которых один из операндов является 16-разрядным адресом, занимают две ячейки памяти программ. Соответственно, код операции таких команд является 4-байтным числом.
В ряде случаев значение операнда-источника может содержаться непосредственно в коде операции, а не в регистре. Это происходит в том случае, когда операндом-источником является константа.
Типы команд
Все множество команд микроконтроллеров можно разбить на несколько групп:
• команды логических операций;
• команды арифметических операций и команды сдвига;
• команды операций с битами;
• команды пересылки данных;
• команды передачи управления;
• команды управления системой.
Далее подробно описана каждая группа команд.
Команды логических операций
Команды логических операций позволяют выполнять стандартные логические операции над байтами, такие, как логическое умножение (И), логическое сложение (ИЛИ), операцию «исключающее ИЛИ», а также вычисление обратного (дополнение до единицы) и дополнительного (дополнение до двух) кодов числа. К этой группе можно отнести также команды очистки/установки регистров и команду перестановки тетрад. Операции производятся между регистрами общего назначения либо между регистром и константой; результат сохраняется в РОН. Все команды из этой группы выполняются за один машинный цикл.
Команды арифметических операций и команды сдвига
К данной группе относятся команды, позволяющие выполнять такие базовые операции, как сложение, вычитание, сдвиг (вправо и влево), инкремент и декремент. В микроконтроллерах семейства Mega также имеются команды, позволяющие осуществлять умножение 8-разрядных значений. Все операции производятся только над регистрами общего назначения. При этом микроконтроллеры AVR позволяют легко оперировать как знаковыми, так и без знаковыми числами, а также работать с числами, представленными в дополнительном коде.
Почти все команды рассматриваемой группы выполняются за один машинный цикл. Команды умножения и команды, оперирующие двухбайтовыми значениями, выполняются за два цикла.
Команды операций с битами
К данной группе относятся команды, выполняющие установку или сброс заданного разряда РОН или РВВ. Причем для изменения разрядов регистра состояния SREG имеются также дополнительные команды (точнее говоря, эквивалентные мнемонические обозначения общих команд), т. к. проверка состояния разрядов именно этого регистра производится чаще всего. Условно к этой группе можно отнести также две команды передачи управления типа «проверка/пропуск», которые пропускают следующую команду в зависимости от состояния разряда РОН или РВВ.
Все задействованные разряды РВВ имеют свои символические имена. Определения этих имен описаны в том же включаемом файле, что и определения символических имен адресов регистров. Таким образом, после включения в программу указанного файла в командах вместо числовых значений номеров разрядов можно будет указывать их символические имена.
Всем командам данной группы требуется один машинный цикл для выполнения, за исключением случаев, когда в результате проверки происходит пропуск команды. В этом случае команда выполняется за 2 или 3 машинных цикла в зависимости от пропускаемой команды.
Команды пересылки данных
Команды этой группы предназначены для пересылки содержимого ячеек, находящихся в адресном пространстве памяти данных. Разделение адресного пространства на три части (РОН, РВВ, ОЗУ) предопределило разнообразие команд данной группы. Пересылка данных, выполняемая командами группы, может производиться в следующих направлениях:
• РОН <=> РОН;
• РОН <=> РВВ;
• РОН <=> память данных.
Также к данной группе можно отнести стековые команды PUSH и POP, позволяющие сохранять в стеке и восстанавливать из стека содержимое РОН.
На выполнение команд данной группы, требуется в зависимости от команды от одного до трех машинных циклов.
Команды передачи управления
В эту группу входят команды перехода, вызова подпрограмм и возврата из них и команды типа «проверка/пропуск», пропускающие следующую за ними команду при выполнении некоторого условия. Также к этой группе относятся команды сравнения, формирующие флаги регистра SREGи предназначенные, как правило, для работы совместно с командами условного перехода.
В системе команд микроконтроллеров семейства имеются команды как безусловного, так и условного переходов. Команды относительного перехода (RJMP), а в микроконтроллерах семейства Mega также косвенного (IJMP) и абсолютного (JMP) безусловного перехода являются самыми простыми в этой группе. Их функция заключается только в записи нового адреса в счетчик команд. Команды условного перехода также изменяют содержимое счетчика команд, однако это изменение происходит только при выполнении некоторого условия или, точнее, при определенном состоянии различных флагов регистра SREG.
Все команды условного перехода можно разбить на две подгруппы. Первая подгруппа — команды условного перехода общего назначения. В эту подгруппу входят две команды BRBSs,kHBRBCs,k, в которых явно задается номер тестируемого флага регистра SREG. Соответственно, переход осуществляется при SREG.s = 0 (brbc) или SREG.S = I(brbs). Другую подгруппу составляют 18 специализированных команд, каждая из которых выполняет переход по какому-либо конкретному условию («равно», «больше или равно», «был перенос» и т. п.). Причем одни команды используются после сравнения без знаковых чисел, другие — после сравнения чисел со знаком. Возможные проверяемые условия, а также соответствующие им команды условного перехода приведены в таблице.
Сводная таблица команд условного перехода
Проверка | Логическое условие | Команда | Обратная проверка | Логическое условие | Команда | Тип данных |
Rd>Rr | Z»(N©V) = 0 | BRLT* | Rd<Rr | Z + (N®V)=1 | BRGE* | Co знаком |
Rd>Rr | (NeV) = 0 | BRGE | Rd<Rr | (N©V) = 1 | BRLT | Co знаком |
Rd = Rr | Z=l | BREQ | Rd^Rr | Z = 0 | BRNE | Co знаком |
Rd<Rr | Z + (N®V) = 1 | BRGE* | Rd>Rr | Z»(N©V) = 0 | BRLT* | Co знаком |
Rd<Rr | (N®V)=1 | BRLT | Rd>Rr | (N®V) = 0 | BRGE | Co знаком |
Rd>Rr | C + Z = 0 | BRLO* | Rd<Rr | C + Z=l | BRSH* | Без знака |
Rd>Rr | C = 0 | BRHS/ BRCC | Rd<Rr | C=l | BRLO/ BRCS | Без знака |
Rd = Rr | z-\ | BREQ | Rd*Rr | z = o | BRNE | Без знака |
Rd<Rr | C = Z=1 | BRSH * | Rd>Rr | c = z = o | BRLO* | Без знака |
Rd<Rr | C=l | BRLO/ BRCS | Rd>Rr | c=o | BRSH/ BRCC | Без знака |
«Перенос» | C = l | BRCS | «Нет переноса» | c = o | BRCC | |
«Меньше нуля» | N = 1 | BRMI | «Больше нуля» | N = 0 | BRPL | |
«Переполнение» | V=l | BRVS | «Нет переполнения» | V=0 | BRVC | |
«Ноль» | Z=l | BREQ | «Не ноль» | z=o | BRNE | |
* Для перехода по этому условию операнды предшествующей команды сравнения должны быть записаны в обратном порядке, т. е. вместо СР Rd.Rr—>CPRr.Rd. |
Вообще говоря, команды, указанные в таблице, являются всего лишь эквивалентными мнемоническими обозначениями команд BRBSs, к и BRBCs , к с определенными значениями операнда «s». Команда BREQ имеет, например, такой же код операции, что и команда BRBS 1,к, а команда BRGEk - BRBC 4,к.