Для изучения азов программирования микроконтроллеров AVR на ассемблере AVR Studio необходимо понимать значения ассемблерных мнемоник. В новейших микроконтроллерах AVR семейства MEGA доступно около двух сотен операций, и почти каждая из команд выполняется микроконтроллером за один такт, за исключение команд ветвления и аппаратного умножения.

Наиболее часто употребимые ассемблерные команды, которые необходимо знать для понимания чужого кода и тем более для написания своего.
 
Регистры ввода/вывода:
CBI – сброс бита порта
SBI – установка лог. “1” бита порта
IN -загрузка значения из порта в регистр
OUT – загрузка значения в регистр
SBIC – пропуск следующей команды, если бит порта сброшен
SBIS –  пропуск следующей команды, если бит порта установлен
 
Ветвление:
CALL -абсолютный вызов
RCALL – относительный вызов
RET – возврат из подпрограммы
RETI – возврат из прерывания, флаг разрешения прерываний I “жестко” устанавливается
JMP – абсолютный переход
RJMP – относительный переход
BRBC – переход, если бит регистра SREG сброшен
BRBS – переход, если бит регистра SREG установлен
SBRC – пропустить следующую команду, если бит регистра сброшен
SBRS – пропустить следующую команду, если бит регистра установлен
 
Работа со стеком:
PUSH – сохранить регистр в стеке
POP – извлечение регистра из стека
 
Важные команды:
NOP – команда, которая ничего не делает
CLI – запретить прерывания
SEI – разрешить прерывания
CP – сравнить значения двух регистров общего назначения
CPI – сравнить значение регистра с константой
LDI – загрузить константу в регистр общего назначения
CLR – очистить регистр общего назначения
 
Примеры применения данных команд:
{codecitation class=”brush: vb; gutter: true;” width=”700px” }
ldi      R16, 0b00001001 ;   загрузка константы в регистр общего назначения (R16 – R32)
out    PORTD, R16         ;   запись значения регистра в порт D
{/codecitation}
{codecitation class=”brush: vb; gutter: true;” width=”700px” }
in       R25, PORTB          ; считать значения Port B в регистр R25
cpi     R25, 4                  ; сравнить считанное значение с константой =4
breq   exit                      ; переход на метку если было равно
exit:                              ; метка
nop                               ; пустой такт
{/codecitation}
{codecitation class=”brush: vb; gutter: true;” width=”700px” }
sbi        PORTD, PD4       ; записать в 4-й бит порта D лог. “1”
rcall      my_delay            ; вызов подпрограммы задержки
cbi        PORTD, PD4       ; сброс 4-го бита порта D
my_delay:                      ; подпрограмма задержки (4 такта)
nop                            ; холостой такт
nop
nop
nop
nop
ret                               ; возвращение из подпрограммы (3 такта)
; вызов и выполнение подпрограммы my_delay займёт 4+ 5+3 = 12 тактов
{/codecitation}
 
В великолепной книге Джона Мортона по программированию микроконтроллеров AVR на ассемблере можно найти описание всех команд и множество примеров.
 

Напишите комментарий