-

Осваиваем AVR!

новости  | с чего начать? | ссылки | учебник | примеры | программатор | отладчик | осциллограф | давно это было | download | сотрудничество | пишите мне

Введение  | Периферия | Система команд | Система команд(продолжение) | Система команд(Mega) | FAQ

 

RJMP K

Безусловный относительный переход, для передачи управления в пределах 2k слов вперед и назад относительно текущего счетчика команд. K - 12-ти разрядная константа, вычисляется компилятором, вам в программе достаточно написать

rjmp Label

Для кристаллов с ПЗУ программ не более 8 кБ перекрывает весь диапазон адресов

IJMP

Безусловный косвенный переход. Управление передастся на адрес, который находится в регистровой паре Z. Основное предназначение - вычисляемый переход, что-то типа паскалевского CASE.

RCALL K

Обращение к подпрограмме. Передача управления работает точно так же, как у команды RJMP, но в стеке сохраняется адрес следующей за RCALL команды (см. описание RET). Подпрограммы применяются для уменьшения размеров программы и улучшения ее "читабельности", в них выносятся часто используемые фрагменты вычислений. Так, в примере простейшей мигалки это подпрограмма задержки Delay05S

ICALL

Аналогично RCALL, но управление передается на адрес, указываемый регистровой парой Z

RET

Возврат из подпрограммы. Адрес, куда передается управление, извлекается из стека.

RETI

Возврат из обработчика прерывания. Адрес, куда передается управление, извлекается из стека, и устанавливается бит разрешения прерываний в SREG

CPSE Rd.Rs

Сравнивает Rd и Rs, и пропускает следующую команду, если они равны. При этом флаги признаков в SREG не меняются! Вообще команда какая-то странная, я ее практически не использовал никогда.

Далее следуют три команды сравнения, которые сами по себе никаких ветвлений не вызывают, но устанавливают признаки в SREG - которые потом используются для ветвлений. наверное, именно поэтому во всех описаниях команды сравнения относятся к группе команд передачи управления.  Не буду и я ничего переделывать, тем более что тогда пришлось бы разъединить CP и CPSE. Пусть уж живут вместе :-)

CP Rd,Rs

Сравнение Rd и Rs. По сути, это та же команда вычитания, только результат вычисления нигде не сохраняется. Изменяются признаки: H S V N Z C

CPC Rd,Rs

То же - но вычитается еще и бит переноса C. Используется для реализации сравнения многобайтных чисел, например, для сравнения двухбайтных чисел, размещенных в регистрах R23:R22 и R21:R20 необходимо выполнить следующее:

cp R22,R20   ;младшие байты
cpc R23,R21  ;и старшие

Изменяются признаки: H S V N Z C

CPI Rd,K

Сравнение регистра Rd и константы. Работает со "старшими" регистрами. Изменяются признаки: H S V N Z C

SBRC Rd,b

SBRS Rd,b

Проверка бита b (b=0..7) в регистре Rd и пропуск следующей команды, если он очищен  (SBRC) или установлен (SBRS). Биты признаков не изменяются.

Поскольку обычно требуется "обойти" более чем одну команду, то делается так:

sbrs R17,3 ;перепрыгиваем команду RJMP
rjmp OBHOD

; тут выполняется то, что
; должно быть выполнено
; при единичном значении R17.3!

OBHOD:

SBIC IO,b
SBIS IO,b

То же, что и SBRC - только проверяются биты не регистров, а портов ввода-вывода. Напомню, что побитовое обращение к портам ввода-вывода возможно только для портов с адресами до 0x20!

BRBS
BRBC

Две абсолютно бесполезные мнемоники. По сути, это общее обозначение всех последующих мнемоник, но я не думаю, что найдется человек, пишущий

brbs 0, Label ; перейти, если бит 0 SREG равен 1

если можно написать

brcs Label ; перейти, если C-разряд установлен (BRanch if Carry Set)

Хотя это абсолютно одно и то же! Но во втором случае гораздо читабельнее.

 Далее идут команды - ветвления, то есть передача управления по условию. Флаги условий - в регистре состояния SREG.   Передача управления возможна на 64 слова назад или 63 слова вперед относительно текущего счетчика команд. Если необходим переход на большее расстояние, используют пару команд с противоположным условием:

brne OBHOD
rjmp LABEL ; переход по "равно"

OBHOD:

BREQ
BRNE

Переход при Z=1 (нулевой результат)

Переход при Z=0 (НЕнулевой результат)

BRCS
BRCC

Переход при C=1 (перенос)

Переход при C=0 (отсутствие переноса)

BRGE
BRLT

Переход при S=1 (больше или равно)

Переход при S=0 (меньше)

BRSH
BRLO

То же самое что BRCC/BRCS

BRMI
BRPL

Переход при N=1 (отрицательный результат)

Переход при N=0 (положительный результат. 0 - тоже положительный!)

BRHS
BRHC

Переход при H=1 (перенос из младшей тетрады)

Переход при H=0

BRTS
BRTC

Переход при T=1

Переход при T=0 

BRVS
BRVC

Переход при V=1 (переполнение)

Переход при V=0 

BRIE
BRID

Переход при I=1 (прерывания разрешены)

Переход при I=0 (прерывания запрещены)

Ну и осталось совсем немного - команды сдвигов, установок разрядов портов и регистра состояния и парочка специальных команд. Итак - последний рывок!

 
LSL Rd

Логический сдвиг содержимого регистра влево. Старший бит выдвигается в C разряд SREG, на его место становится 6-й бит, на место 6-го - 5-й и так далее. В самый младший - задвигается 0

До выполнения:

 C
B7 B6 B5 B4 B3 B2 B1 B0

После выполнения:

B7
B6 B5 B4 B3 B2 B1 B0 0

Изменяет признаки:Z,C,N,V,H  Ну а вообще-то это команда ADD Rd,Rd :-)

LSR Rd То же самое но в другую сторону. В общем, смотрите на рисунок лучше...
  
До выполнения:
B7 B6 B5 B4 B3 B2 B1 B0
C
После:
0 B7 B6 B5 B4 B3 B2 B1
B0

Изменяет признаки:Z,C,N,V 

ROL Rd

Циклический сдвиг содержимого регистра влево. Отличается от LSL тем, что в нулевой бит задвигается C-разряд:

До выполнения:

 C
B7 B6 B5 B4 B3 B2 B1 B0

После выполнения:

B7
B6 B5 B4 B3 B2 B1 B0 C

Изменяет признаки:Z,C,N,V,H  Ну а вообще-то это команда ADC Rd,Rd

ROR Rd

То же самое но в другую сторону. 
  

До выполнения:
B7 B6 B5 B4 B3 B2 B1 B0
C
После:
C B7 B6 B5 B4 B3 B2 B1
B0

Изменяет признаки:Z,C,N,V 

ASR Rd Арифметический сдвиг вправо - иными словами, целочисленное деление на 2. Старший бит повторяет сам себя - поскольку это знак.
  
До выполнения:
B7 B6 B5 B4 B3 B2 B1 B0
C
После:
B7 B7 B6 B5 B4 B3 B2 B1
B0

Изменяет признаки:Z,C,N,V 

SWAP Rd Обмен тетрад - смотрите на рисунок.
  
До выполнения:
B7 B6 B5 B4 B3 B2 B1 B0
После:
B3 B2 B1 B0 B7 B6 B5 B4

Признаки не изменяются


SBI IO,b Установить в "1" бит с номером b(b=0..7) в регистре ввода-вывода IO. Признаки не изменяются. 
CBI IO,b То же самое - только установить в "0"

BST Rs,b Скопирует бит b регистра Rs в бит T SREG (регистр состояния )
BLD Rd,b Бит T SREG занесет в бит b регистра Rd.  Эти две команды позволяют переставлять биты как угодно, жаль только, что нет команды инверсии T-бита
Далее следуют 16 команд установки или сброса битов признаков SREG. Я не буду всех их описывать, тут все ясно из мнемоники - SEC - Set C - установить признак C в единицу, CLC - Clear C - в ноль. Но для порядка все-таки их перечислим. И опять посожалеем, что нет команд их инверсии...
SEC CLC SEN CLN SEZ CLZ SEI CLI
SES CLS SEV CLV SET CLT SEH CLH
Вот мы и подошли к концу. Осталось описать три специфические команды...
NOP Пустая операция. Не делает ничего, кроме того, что занимает один такт процессора. Имеет код операции 0x000, что дает возможность "забить" ею любую другую команду без стирания всей программы (подробнее об этом чуть позже)
SLEEP Перевод процессора в режим пониженного энергопотребления. См. описание режимов
WDR Сброс сторожевого таймера. См. описание 


Rekl:музыкальные инструменты интернет магазин, акции в москве  

(с)nml 11-Jul-2009