Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Методы адресации операндов в командах Ассемблера AVR-контроллера

Адресация пространства памяти AVR-контроллера

Основные типы адресации операндов в ассемблерных командах AVR-контроллера.

 

Методы адресации операндов в командах Ассемблера AVR-контроллера

В AVR-микроконтроллере существует три области памяти, каждая со своей системой адресации, начинающаяся с нулевого адреса до конечного:

1. ПЗУ – постоянное запоминающее устройство, предназначенное для хранения машинных кодов управляющих программ. Сюда загружаются объектные hex-файлы, создаваемые пакетом AVR Studio. Ассемблерные команды не могут обращаться к ячейкам памяти ПЗУ.

2. EEPROM – энергонезависимое ОЗУ. Ассемблерные команды позволяют обращаться к ячейкам памяти EEPROM.

3. ОЗУ. Ячейки памяти ОЗУ используются во всех ассемблерных командах. Эта область состоит из 3-х подобластей, которые имеют последовательную сквозную адресацию.

3.1. Первая подобласть состоит из 32 регистров, которые имеют двоякую адресацию: по имени регистра (R0-R31) или по ее числовому адресу ( или от до ). Они используются для оперативного хранения результатов промежуточных вычислений.

3.2. Следующей подобластью ОЗУ являются регистры ввода/вывода, предназначенные для обмена информацией с периферийными устройствами (таймеры, компараторы, АЦП, порты дискретного ввода/вывода информации). Регистры ввода/вывода также как и регистры имеют двойную адресацию: по имени регистра ввода/вывода и по его числовому адресу. Числовой адрес регистра ввода/вывода также имеет двойное представление. Если регистр ввода/вывода используется в командах in или out, то адреса регистров ввода/вывода находятся в диапазоне с по или с по . Эти команды принадлежат к группе команд передачи данных. Если к регистрам ввода/вывода обращаются другие команды языка ассемблера, то используется адресация в диапазоне от до или от до .

Содержимое регистров и регистров ввода/вывода, определенное их именами, мы можем наблюдать в окне «Workspace». В этом окне приведена также двойная числовая адресация регистров ввода/вывода. Содержимое регистров и регистров ввода/вывода, определенное их числовыми адресами, мы можем наблюдать в окнах Memory, Register, I/O.

3.3. Область «Data». В этой области расположены ячейки памяти ОЗУ, которые используются для оперативного хранения результатов промежуточных операций. Эти ячейки имеют лишь числовую адресацию. Адрес младшей ячейки этой области или , размер этой области определяется типом контроллера.

При работе в пакете AVR Studio при установке курсора на любую ячейку памяти ОЗУ появляется всплывающая «подсказка», в которой расположено 4 элемента, разделенных знаком двоеточие. Слева от двоеточия стоит адрес ячейки памяти в 16-ой системе исчисления, а справа – содержимое ячейки памяти в 16-ой, 10-ой, 2-ой системах исчисления.

Первый тип адресации, который используется в командах AVR ассемблера называется «регистровый тип адресации» и подразумевает, что мы определяем расположение операнда в регистровом файле по имени регистра.

Пример №1:

ldi R16, 100 – операнд получатель или первый операнд адресуется именем регистра.

mov R1, R16 – оба операнда (и регистр получатель и регистр источник – второй операнд) определены именем регистра.

Второй тип адресации – непосредственный тип адресации – используется лишь для операнда источника (LDI R16, 100) и задает содержимое операнда в самой команде. Под непосредственным типом адресации операнда в любой команде Ассемблера мы понимаем ее определение не через адрес распространения этого операнда (в ОЗУ), а через ее значение в самой команде (в ПЗУ).

Пример №2:

ldi R16, 100; здесь число сто загружается в регистр R16.

Третий тип адресации – прямой тип адресации. При этом числовая константа в команде обозначает адрес ячейки памяти, содержимое которой является операндом команды.

Пример №3:

lds R16, 100,

где 100 – адрес ячейки памяти, содержимое которой загружается в регистр R16.

Определить тип адресации в командах ldi и lds можно двумя способами:

Первый способ - Мы должны запомнить, что непосредственный тип адресации в команде передачи данных используется лишь в команде ldi.

Второй способ - Пользуясь Хелпом пакета AVR Studio в строке функции команды мы видим, что функции команды ldi символьно записываются в виде:

R16← K, а в команде lds – R16← (K),

где (K) обозначают содержимое ячейки памяти, адрес которой равен числовой константе К.

Четвертый тип адресации - Косвенный тип адресации, когда в команде указываются наименование парного регистра (или X или Y или Z), содержимое которых определяет адрес ячейки памяти, содержимое которой участвует в качестве операнда. Символьно эта операция записывается в виде: R16← ((Х)).

Пример №4:

ld R16, X

R16← ((X))

Косвенный тип адресации с пост инкрементом или с пред декрементом.

Этот тип адресации используется для адресации циклических вычислений и включает в себя выполнение одновременно двух действий: пост инкремент или пред декремент содержимого парного регистра и передача одного байта информации из одного места в другое.

Пример №5:

ld R16, X+

Первое действие: R16← ((X)). Второе действие: парный регистр Х наращивается на 1: Х=Х+1.

st – X, R16

Первое действие: Х=Х-1. Второе действие: ((X))← R16.

--------------

Запись и чтение данных в EEPROM осуществляется через специальные регистры ввода-вывода: регистр данных EEDR, регистр адреса EEAR (если объем EEPROM более 256 байт, то делится на два — EEARH и EEARL) и регистр управления EECR. Основная особенность этого процесса — большая продолжительность процедуры записи, которая для разных моделей AVR может длиться от 2 до 9 мс, в тысячи раз дольше, чем выполнение обычных команд. Обратим внимание, что в отличие от записи чтение осуществляется всего за один машинный цикл, даже быстрее, чем из обычной SRAM — это типичная особенность всех EEPROM, имеющих структуру NOR (в отличие от flash- памяти, которая сейчас сплошь делается на NAND-структурах).

-------------------

WriteEEP:; в ZH: ZL - адрес EEPROM куда писать

; в temp — записываемый байт

sbic EECR, EEWE; ждем очистки бита

rjmp WriteEEP; разрешения записи EEWE

out EEARH, ZH; старший адреса

out EEARL, ZL; младший адреса

out EEDR, temp; данные

sbi EECR, EEMWE; установить флаг разрешения записи

sbi EECR, EEWE; установить бит разрешения

ret; (конец WriteEEP)

--------------------

 

Вот так выглядит запись в память:

  … LDI R16, 0; Загружаем адрес нулевой ячейки LDI R17, 0; EEPROM LDI R21, 45; и хотим записать в нее число 45 RCALL EEWrite; вызываем процедуру записи.

А так чтение:

  LDI R16, 0; Загружаем адрес нулевой ячейки LDI R17, 0; EEPROM из которой хотим прочитать байт RCALL EERead; вызываем процедуру чтения. После которой ; в R21 будет считанный байт.

Ну и, разумеется, сами процедуры чтения и записи

  EEWrite: SBIC EECR, EEWE; Ждем готовности памяти к записи. Крутимся в цикле RJMP EEWrite; до тех пор пока не очистится флаг EEWE   CLI; Затем запрещаем прерывания. OUT EEARL, R16; Загружаем адрес нужной ячейки OUT EEARH, R17; старший и младший байт адреса OUT EEDR, R21; и сами данные, которые нам нужно загрузить   SBI EECR, EEMWE; взводим предохранитель SBI EECR, EEWE; записываем байт   SEI; разрешаем прерывания RET; возврат из процедуры     EERead: SBIC EECR, EEWE; Ждем пока будет завершена прошлая запись. RJMP EERead; также крутимся в цикле. OUT EEARL, R16; загружаем адрес нужной ячейки OUT EEARH, R17; его старшие и младшие байты SBI EECR, EERE; Выставляем бит чтения IN R21, EEDR; Забираем из регистра данных результат RET

 

 

-----------------------

01.#include < avr/io.h>

02.#include < avr/eeprom.h>

16.unsigned char s;

17.unsigned char eeprom_var EEMEM; // определяем переменную в EEPROM

19.int main (void)

20.{

26.s = eeprom_read_byte(& eeprom_var); // считываем байт из EEPROM и помещаем его в " s"

50.eeprom_write_byte(& eeprom_var, s); // записываем " s" в EEPROM

}

<== предыдущая лекция | следующая лекция ==>
Основные биты регистра признаков. | Команды языка ассемблер




© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.