Для изучения азов программирования микроконтроллеров 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 на ассемблере можно найти описание всех команд и множество примеров.
 
Просмотров всего: 2 302, сегодня: 1

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