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

 

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

Микроконтроллеры AVR применяют разнообразные способы адресации данных. По количеству и способам адресации они превосходят возможности микроконтроллеров MCS-51. Можно осуществить доступ к любой области памяти данных (регистрам общего назначения, регистрам ввода/вывода, памяти SRAM), а также Flash-памяти программ и энергонезависимой памяти данных EEPROM. При этом часто к одному и тому же объекту можно обратиться разными способами, используя для этого соответствующий вид адресации. Рассмотрим их подробнее.

Прямая регистровая адресация с одним регистром Rd. При этом способе адресации данные находятся в регистре d(Rd), адрес которого содержится непосредственно в команде (рис.).Примером команд, использующих этот метод адресации, являются команды для работы со стеком (PUSH, POP), обмена тетрадами в регистре (SWAP), ряд команд арифметических и логических операций.

Рис. – Прямая регистровая адресация одного регистра общего назначения

Прямая регистровая адресация с двумя регистрами Rd и Rr. Этот способ адресации применяется в командах, которые используют два регистра общего назначения: d(Rd) и r(Rr) (рис. 1.4, б). Этот вид адресации используют команды пересылки данных из регистра в регистр и большинство команд арифметических операций, ряд команд логических операций. При этих опе­рациях результат операции сохраняется в регистре d (Rd).

Рис. – Прямая регистровая адресация двух регистров общего назначения

Прямая адресация регистра ввода/вывода. Данный вид адресации используют для выполнения обмена между регистром ввода/вывода, расположенным в адресном пространстве ввода/вывода, и одним из регистров общего назначения по командам IN и OUT (рис.).

Рис. – Прямая адресация регистра ввода/вывода

 

Прямая адресация памяти данных. Данный способ адресации применяется при обращении к любой ячейке адресного пространства SRAM. Имеются всего две команды: LDS и STS, каждая длиной в два слова (32 разряда). Первое слово содержит код операции и адрес регистра общего назначения, второе - 16-разрядный адрес ячейки, к которой направлено обращение (рис.).

Рис. –Прямая адресация памяти данных

 

Косвенная адресация памяти данных. При косвенной адресации обращение направлено к ячейке памяти, адрес которой находится в 16-разрядном индексном регистре X, Y или Z (рис.). В роли этих регистров выступают пары регистров: R26, R27 (регистр X), R28, R29 (регистр Y) и R30, R31 (регистр Z).

Рис. – Косвенная адресация памяти данных

 

Косвенная адресация памяти данных со смещением. При этом способе адрес ячейки памяти определяется путем суммирования содержимого индексного регистра Y или Z с 6-разрядным смещением, задаваемым в команде (рис.). Этот способ адресации используют команды LDD (пересылка байта из ячейки памяти SRAM в регистр Rd) и STD (пересылка байта из регистра Rr в ячейку SRAM).

Рис. –Косвенная адресация памяти данных со смещением

 

Косвенная адресация памяти данных с преддекрементом. При этом способе адресации содержимое индексного регистра X, Y или Z сначала уменьшается на 1, а затем производится обращение к памяти по полученному адресу (рис.). Этот способ адресации используют команды LD (пересылка байта данных из памяти в регистр Rd) и ST (пересылка байта данных из регистра Rr в память), всего шесть команд – по две для каждого регистра.

Рис. –Косвенная адресация с преддекрементом

 

Косвенная адресация памяти данных с постинкрементом. При этом способе адресации содержимое индексного регистра X, Y или Z сначала используется в качестве адреса обращения к памяти данных, а затем увеличивается на 1 (рис.). Этот способ адресации используют команды LD (пересылка байта данных из памяти в регистр Rd) и ST (пересылка байта данных из регистра Rr в память), всего шесть команд – по две для каждого регистра.

Рис. –Косвенная адресация с постинкрементом

 

Косвенная адресация памяти программ. Микроконтроллеры AVR позволяют обратиться к ячейкам памяти программ для считывания констант, а в моделях семейства Mega – и для записи данных во Flash-память программ, используя механизм косвенной адресации через регистр Z. При этом старшие 15 разрядов регистра определяют адрес слова, а младший нулевой разряд – младший или старший байт слова. Если младший разряд адреса равен 0, выбирается младший байт, в противном случае выбирается старший байт (рис.). Данный вид адресации используют команды считывания из ячейки памяти в регистр R0 (LPM) и записи в память из регистров R1:R0 (SPM).

Рис. –Косвенная адресация констант в памяти программ

 

Кроме простой косвенной адресации при чтении константы в регистр Rd можно применить косвенную адресацию с постинкрементом (команда LPM Rd, Z+). Помимо команд, связанных с передачей данных, косвенная адресация может быть использована в командах косвенного перехода по адресу в регистре Z (IJMP) и косвенного вызова подпрограммы через регистр Z (1СALL) (рис.).

Рис. –Косвенная адресация памяти программ

 

Относительная адресация памяти программ. При этом способе адрес вычисляют путем сложения содержимого программного счетчика PC и константы k, задаваемой в команде (рис.). Относительную адресацию используют команды относительного перехода (RJMP) и относительного вызова подпрограммы (RCALL), многочисленная группа команд условных переходов.

Рис. –Относительная адресация памяти программ

Непосредственная адресация. Данный вид адресации подразумевает указание одного из операндов (константы К) непосредственно в команде. Непосредственная адресация используется командой пересылки константы в регистр LDI, а также некоторыми командами арифметических и логических операций.

 

Битовая адресация. Этот вид адресации позволяет указать один из восьми битов любого из 32 регистров общего назначения или первой половины регистров ввода/вывода с номерами 0-31, а также регистра SREG. Для этого нужно указать имя регистра общего назначения Ri (i = 0...31) либо имя регистра ввода/вывода Pi (i = 0…31), либо имя SREG и номер бита b (b = 0.. .7). Командами SBI и CBI осуществляется установка в 1 и сброс в 0 указанного бита регистра ввода/вывода, командами BLD, BST – обмен значениями бита Т из регистра SREG и адресованного бита из регистра общего назначения. Помимо этого есть группа команд битовых операций, обеспечивающая установку и сброс битов регистра состояния SREG. При записи мнемоники команд допускается использование символических (штатных) имен регистров ввода/вывода и имен битов. Существует группа команд условного перехода, где в качестве условия используется либо значение бита в регистре общего назначения (SBRC, SBRS), либо значение бита в регистре ввода/вывода (SBIC, SBIS).