Для изучения азов программирования микроконтроллеров 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 - очистить регистр общего назначения
 
Примеры применения данных команд:
ldi      R16, 0b00001001 ;   загрузка константы в регистр общего назначения (R16 - R32)
out    PORTD, R16         ;   запись значения регистра в порт D
in       R25, PORTB          ; считать значения Port B в регистр R25
cpi     R25, 4                  ; сравнить считанное значение с константой =4
breq   exit                      ; переход на метку если было равно
...
exit:                              ; метка
nop                               ; пустой такт
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 тактов
 
В великолепной книге Джона Мортона по программированию микроконтроллеров AVR на ассемблере можно найти описание всех команд и множество примеров.
 

 

Добавить комментарий


Защитный код
Обновить