Прямая адресация данных.
Рис.2.15. Прямая адресация данных.
Единое адресное пространство является пространством данных, включая РОН, регистры ввода/вывода, внутренняя память и внешняя память (если есть). 16-разрядный адрес данных содержится в 16 младших разрядах 32-х разрядной команды. Rd/Rr определяет адрес регистра источника или регистра приемника. Такой тип адресации, к примеру, могут использовать команды LDS и STS:
LDS PORTB, R1 ;записать данные из регистра R1 в PORTB
STS PORTB, R1 ;записать данные из регистра R1 в PORTB
Косвенная адресация данных
Существует четыре типа косвенной адресации данных: простая, с постинкрементом, с преддекрементом, со смещением. Для первых трех типов косвенной адресации данных адрес операнда содержится в регистре X, Y или Z. Для последнего типа (со смещением) адрес операнда вычисляется сложением содержимого регистров Y или Z с шестью битами адреса, содержащимися в слове команды. Сами же регистры остаются неизмененными.
Смысл косвенной адресации с постинкрементом (с преддекрементом) заключается в следующем. После (до) выполнения операции регистр X, Y и Z инкрементируется (декрементируется).
Рассмотрим некоторые примеры:
1) ST X, Rn ;поместить данные из Rn в по адресу указанному в регистре Х;
2) ST X+, Rn ;тоже что и в 1), но впоследствии X инкрементируется;
3) ST -X, Rn ;предварительно X декрементируется;
В предыдущих трех примерах вместо Х могут быть Y или Z.
4) STD Y+c, Rn ; к значению Y прибавляется константа смещения ’c’ и по этому адресу записываются данные из Rn. Y при это остается неизменен. Вместо Y может быть только Z.
Пересылка данных из одного места в другое является для AVR очень простой операцией, так как имеется очень большое количество команд, предназначенных для выполнения этой задачи. Ни одна команда пересылки данных не оказывает влияния на биты регистра состояния.
Команда LPM – загрузка данных из таблиц, хранящихся в памяти программ. В этой команде младший бит индексного регистра Z используется для указания байта, который будет читаться, если 0 – читается младший байт, 1 – старший. Оставшиеся 14 байт используются для указания адреса слова.
Команда MOV – копирует содержимое одного РОН в другой. LDI – загружает в один из 16 старших РОН байт, содержащийся в команде. IN и OUT – доступ к регистрам ввода/вывода, начиная с нулевого адреса. Полный список всех команд пересылки данных можно найти в ПРИЛОЖЕНИИ 1, Таблица А.3.
На рис.2.16 наглядно показано схематическое выполнение команды LPM.
Рис. 2.16. Команда LPM.
Команды арифметических и логических операций.
Основными арифметическими операциями являются сложение и вычитание двух чисел. Эти команды по большей части очевидны. Сложение и вычитание содержимого двух регистров производиться при помощи команд ADD и SUB. Модификации этих команд, которые учитывают значение флага переноса, позволяют выполнить операции над 8-, 16-, 24- и даже 32-разрядными числами со знаком, хранящимися в регистрах.
Поясним функции флагов отрицательного результата N (negative), переполнения V (overflow) и знака S (sign), так как они имеют некоторые особенности и сложны для понимания при первоначальном знакомстве.
Флаг отрицательного результата N просто копирует значение бита 7 результата, который показывает, является результат положительным или отрицательным числом.
Флаг переполнения V в регистре SREG указывает на переполнение во время сложения или вычитания чисел со знаком. Рассмотрим пример:
ADD R1, R2
Флаг V будет установлен в 1, если в регистрах R1 и R2 содержаться положительные числа, а результат их сложения окажется больше 127, или оба числа отрицательны, а результат будет меньше –128. Рассмотрим пример с конкретными значениями:
LDI R1, 100 ;100 = 0b01100100
LDI R2, 100 ;Занести 0b01100100 R1 и R2
ADD R1, R2 ;R1 = R1 + R2 = 200 = 0b11001000
Десятичное число 200 в двоичной записи имеет значение бита 7 равное 1, что указывает на получение отрицательного результата. Следовательно, после выполнения операции сложения флаг N будет установлен в 1. Но в данном случае вместе с флагом N будет так же установлен в 1 флаг V, указывая, что произошло переполнение при обработке чисел со знаком.
Если содержимое R1 = R2 = - 100, то результатом сложения этих чисел будет 0b00111000 в двоичной системе счисления, что является положительным числом. При этом флаг N будет сброшен в 0,показывая, что результата положителен, однако будет установлен флаг V, означающий, что на самом деле это не так.
Использование флага S = N ^ V позволяет рассматривать результат как 9-разрядное число со знаком, где старшим (знаковым) разрядом как раз и является флаг S. Как было отмечено при описании флага V, он устанавливается в 1, когда бит 7 результата имеет неправильное значение, то есть результат не представлен правильным числом со знаком в дополнительном коде. Выполнив операцию «ИСКЛЮЧИТЕЛЬНОЕ ИЛИ» над значением флага V и бита 7 результата, который храниться в бите N, вы получите реальный знак результата. В первом примере (100 + 100) происходит установка в 1 флагов V и N, в результате флаг S будет равняться нулю (1 ^ 1 = 0). Во втором примере (- 100 - 100) флаг N сбрасывается в 0, а флаг V устанавливается в 1, поэтому флаг S будет равняться единице, указывая на то, что результат отрицательный.
Флаг S должен использоваться со старшим байтом числа. При операциях с 16-, 24- и 32-разрядными числами значение флага S надо проверять только после завершения последней операции со старшим байтом числа. При операциях с младшими байтами используется флаг переноса С, как обычно при выполнении сложения и вычитания.
Команды относительного перехода RJMP и вызова подпрограммы RCALL являются основными для изменения выполнения последовательности команд в МК. При этом содержимое программного счетчика изменяется на величину смещения, которое задается в 12 младших битах кода команды.
МК может выполнять команды ветвления по значению определенных битов в регистре состояния SREG. Поскольку номер бита и его значение должны быть указанны в коде команды, то диапазон возможных адресов перехода составляет +/- 63 относительно текущего адреса. Это означает, что применение команд условных ветвлений весьма ограничено, но эту проблему можно решить при помощи ветвления к команде, которая затем выполнит необходимый безусловный переход.
Еще один класс команд ветвления – это команды пропуска. После проверки указанного условия, данные команды либо выполняют следующую команду, либо пропускают ее.
Битовые команды и команды тестирования битов.
Команды сброса (очистки) и установки битов предназначены для модификации регистров ввода/вывода. Но некоторые из них могут работать только с частью регистров ввода/вывода. Это значит, что для некоторой части регистров ввода/вывода вы должны сначала переписать их содержимое в РОН, модифицировать, а затем снова сохранить в регистре ввода/вывода. Для выполнения этой процедуры можно написать специальную макрокоманду (макрос).
Часто необходимо переслать бит из одного регистра или переменной в другой. Это можно сделать следующим образом:
BST B,5 ;поместить бит 5 переменно В в бит Т регистра SREG
BLD A,2 ;сохранить бит Т регистра SREG в качестве бита А.2
Команда SWAP меняет местами старший и младший полубайт регистра. Это полезно когда вы храните в регистре две цифры, а не одно восьмибитовое число.
Команды сдвигов и циклических сдвигов LSL, LSR, ROL, ROR и ASR полезны как для выполнения сдвигов данных в процессе их ввода вывода, так и для проверки значения определенного бита в РОН без необходимости выполнения 8 отдельных операций тестирования битов. С помощью циклического сдвига можно произвести индивидуальную проверку любого бита в заданном месте байта.
3.1. Написание и отладка программного кода с помощью AVR Studio
Известные интегрированные среды разработки программ, повышающие производительность труда программиста, позволяет избежать рутинной работы. Интегрированные пакеты для разработки программ, выпускаемые разными производителями, схожи между собой по функциям, по различным сервисным возможностям, удобству работы и качеству генерируемого машинного кода.
Например пакет программ AVR Studio Version 3.53 (см. рис. 3.1.) является интегрированной средой разработки (ИСР) для МК серии AVR.[16] Этот программный продукт включает в себя:
- встроенный редактор текста, для набора исходного кода программы,
- транслятор с языка ассемблер,
- программный симулятор ЦПУ, памяти и устройств ввода/вывода
- поддержку внешних устройств, таких как – внутрисхемный эмулятор (ВСЭ) ICEPRO, ICE200 и программатора типа AVRISP и STK500/501.
Рис. 3.1. Главное окно AVR Studio.
Компания Atmel распространяет данный продукт совершенно бесплатно, что является огромным преимуществом в начале освоения программирования МК и изучении его архитектуры.
Как и в реальной ИСР, здесь вы можете легко писать исходный текст программы на ассемблере, подключить внешний компилятор для С, отлаживать текст написанной программы используя встроенный программный симулятор или подключить ВСЭ. И в конечном итоге вы можете запрограммировать свой МК программатором AVRISP или STK500/501.
3.1.1. Обзор AVR Studio
Для установки AVR Studio требует Microsoft Windows 9x/NT/2000