- •Медицинские микропроцессорные системы
- •Анисимов а.А.
- •Isbn © сПбГэту «лэти», 2019 введение
- •1. Общая структура микроконтроллеров avr
- •2. Программирование микроконтроллеров на языке ассемблер
- •3. Работа с отладочной платой attiny104-xnano
- •4. Устройство портов ввода-вывода
- •5. Таймеры-счётчики
- •6. Широтно-импульсная модуляция
- •7. Использование аналого-цифрового преобразователя
- •8. Передача данных по uart
- •9. Последовательный интерфейс spi
- •Приложение 1. Основные команды языка assembler для микроконтроллера attiny104
- •Список литературы
- •Оглавление
- •Медицинские микропроцессорные системы
- •197376, С.-Петербург, ул. Проф. Попова, 5
Приложение 1. Основные команды языка assembler для микроконтроллера attiny104
1. Арифметические операции
Команда |
Синтаксис |
Цель |
Операция |
ADD |
ADD Rd, Rr |
Rd |
Rd = Rd + Rr |
Описание |
Пример |
||
Складывает значения двух регистров БЕЗ учёта флага переноса, результат записывается в регистр Rd |
add r17,r19 ; (r17=r17+r19) add r21,r21 ; (r21=r21+r21) |
||
|
|||
ADC |
ADC Rd, Rr |
Rd |
Rd = Rd + Rr + C |
Складывает значения двух регистров и флага переноса, результат записывается в регистр Rd |
; сложение 2-байтных чисел R17:R16 и R19:R18 add r18,r16 ; младший разряд adc r19,r17 ; старший – с переносом |
||
|
|||
SUB |
SUB Rd, Rr |
Rd |
Rd = Rd - Rr |
Вычитает значение регистра Rr из значения регистра Rd БЕЗ учёта флага переноса, результат записывается в Rd. |
sub r20,r23 ; (r20 = r20 - r23) |
||
|
|||
SUBI |
SUBI Rd, K |
Rd |
Rd = Rd - K |
Вычитает число K из значения регистра Rd, результат записывается в регистр Rd.
|
subi r21, $80 ; (r21 = r21 - 128) |
||
|
|||
SBC |
SBC Rd, Rr |
Rd |
Rd = Rd - Rr - C |
Вычитает значение регистра Rr и флага переноса из значения регистра Rd, результат записывается в Rd. |
; вычитание R17:R16 из R19:R18 sub r18,r16 ; младший разряд sbc r19,r17 ; старший – с переносом |
||
|
|||
SBCI |
SBCI Rd, K |
Rd |
Rd = Rd - K - C |
Вычитает число K и значение флага переноса из значения регистра Rd, результат записывается в регистр Rd.
|
; вычитание $12FD из R19:R18 subi r18, $FD ; младший разряд sbci r19,$12 ; старший – с переносом |
||
|
|||
INC |
INC Rd |
Rd |
Rd = Rd + 1 |
Увеличивает значение в регистре Rd на 1. |
inc r22 ; |
||
|
|||
DEC |
DEC Rd |
Rd |
Rd = Rd - 1 |
Уменьшает значение в регистре Rd на 1. |
dec r22 ; |
||
2. Логические операции
Команда |
Синтаксис |
Цель |
Операция |
AND |
AND Rd, Rr |
Rd |
Rd = Rd ˄ Rr |
Описание |
Пример |
||
Логическое И между значениями двух регистров, результат записывается в регистр Rd. |
and r23,r28 ; |
||
|
|||
ANDI |
ANDI Rd, K |
Rd |
Rd = Rd ˄ K |
Логическое И между значением регистра Rd и числом K, результат записывается в регистр Rd. |
and r23,$F0 ; очистка младших разрядов |
||
|
|||
OR |
OR Rd, K |
Rd |
Rd = Rd ˅ Rr |
Логическое ИЛИ между значением регистра Rd и числом K, результат записывается в регистр Rd. |
or r23,r28 ; |
||
|
|||
ORI |
ORI Rd, K |
Rd |
Rd = Rd ˅ K |
Логическое ИЛИ между значением регистра Rd и числом K, результат записывается в регистр Rd. |
ori r23,$F0 ; заполнение старших разрядов |
||
|
|||
EOR |
EOR Rd, K |
Rd |
Rd = Rd ⊕ Rr |
Логическое ИСКЛЮЧАЮЩЕЕ ИЛИ между значением регистра Rd и числом K, результат записывается в регистр Rd. |
eor r23,r23 ; очистка r23 eor r23,r28 ; |
||
|
|||
COM |
COM Rd |
Rd |
Rd = $FF - Rd |
Обратный код значения регистра Rd записывается в регистр Rd. |
; предположим r23 = 0b10100011 com r23 ; r23 станет равным 0b01011100 |
||
|
|||
NEG |
NEG Rd |
Rd |
Rd = $00 - Rd |
Дополнительный код значения регистра Rd записывается в регистр Rd. |
neg r23 ; |
||
|
|||
TST |
TST Rd |
Rd |
Rd = Rd ˄ Rd |
Регистр проверяется на нулевое или отрицательное состояние. Выполняется логическое AND содержимого регистра с самим собой. Применяется с инструкциями ветвления.
|
tst r23 ; проверка r23 breq zero ; если r23 = $00, метка …. zero: nop ; метка |
||
3. Установка битов в регистры
Команда |
Синтаксис |
Цель |
Операция |
SBR |
SBR Rd, K |
Rd |
Rd = Rd ˅ Rr |
Описание |
Пример |
||
Устанавливает в 1 указанные биты регистра Rd. Полным аналогом является инструкция ORI Rd, K |
sbr r23,$03 ; установка двух младших битов регистра r23 |
||
CBR |
CBR Rd, K |
Rd |
Rd = Rd ˄ ($FF - K) |
Устанавливает в 0 указанные биты регистра Rd. |
cbr r23,$F0 ; очистка старших разрядов |
||
SER |
SER Rd |
Rd |
Rd = $FF |
Устанавливает в 1 все биты регистра Rd. |
ser r31 ; |
||
CLR |
ORI Rd |
Rd |
Rd = Rd ⊕ Rr |
Устанавливает в 0 все биты регистра Rd. |
clr r23 ; |
||
MOV |
MOV Rd, Rr |
Rd |
Rd = Rr |
Копирует значение регистра Rr в регистр Rd. |
mov r23,r19 ; копирование r19 в r23 |
||
LDI |
LDI Rd, K |
Rd |
Rd = K |
Устанавливает значением регистра Rd 8-битную константу K. |
ldi r20, $F0 ; установка $F0 в r20 |
||
IN |
IN Rd, A |
Rd |
Rd = I/O(A) |
Загружает информацию из регистров ввода/вывода (порты, таймеры, регистры конфигурации) в регистр Rd. 0 ≤ A ≤ 63 |
in r25, PORTA ; чтение порта A |
||
OUT |
OUT A, Rr |
I/O(A) |
I/O(A) =Rr |
Копирует значение регистра Rr в регистры ввода/вывода (порты, таймеры, регистры конфигурации). 0 ≤ A ≤ 63 |
out PORTA, r25 ; запись значения регистра r25 в порт A. |
||
Команда |
Синтаксис |
Цель |
Операция |
RJMP |
RJMP k |
PC |
PC = PC + k + 1 |
Описание |
Пример |
||
Переход к адресу на k позиций отстающий от текущего. Чаще всего используется с метками. |
rjmp ok ; переход на метку … ok: nop ; метка для rjmp |
||
|
|||
RCALL |
RCALL k |
PC |
PC = PC + k + 1 |
Переход к подпрограмме и предполагающий возврат к текущему положению после выполнения группы инструкций. Чаще всего используется с метками. |
rcall routine ; переход к подпрограмме ... routine: nop ; (группа инструкций) ret ; возвращение в код, вызвавший переход |
||
|
|||
RET |
RET |
PC |
PC = STACK |
Возврат из подпрограммы |
rcall routine ; переход к подпрограмме ... routine: nop ; (группа инструкций) ret ; возвращение в код, вызвавший переход |
||
|
|||
RETI |
RETI |
PC |
PC = STACK |
Возврат из обработчика прерывания. Устанавливает флаг глобальных прерываний. |
… ; инструкции обработки прерывания reti ; возвращение к основной программе |
||
|
|||
CP |
CP Rd, Rr |
SREG |
Rd - Rr |
Выполняет сравнение значений регистров Rd и Rr. Результаты записываются в SREG. После данной инструкции возможно использование всех инструкций ветвления (п. 4.1). |
cp r29, r22 ; сравнение регистров r29 и r22 breq ok ; если равны, переход к метке … ok: nop ; метка |
||
|
|||
CPI |
CPI Rd, K |
SREG |
Rd - K |
Выполняет сравнение значения регистра Rd и константы. Результаты записываются в SREG. После данной инструкции возможно использование всех инструкций ветвления (п. 4.1). |
cpi r29, $F5 ; сравнение регистра r29 и $F5 breq ok ; если равны, переход к метке … ok: nop ; метка |
||
4.1. Инструкции ветвления.
Группа инструкций для проверки результата инструкций CP, CPI, SUB, SUBI:
Команда |
Синтаксис |
Цель |
Операция |
BREQ |
BREQ k |
PC |
PC = PC + k + 1 |
Описание |
Пример |
||
Если величины, сравниваемые предыдущей инструкцией, равны, переход к адресу на k позиций отстающий от текущего. Чаще всего используется с метками. |
cpi r29, $EE ; сравнение регистра r29 и $EE breq ok ; переход на метку, если r29 == $EE … ok: nop ; метка для breq |
||
Подобные инструкции:
BRNE - величины НЕ равны
BRSH - первая величина больше или равна второй (без учета знака)
BRLO - первая величина меньше второй (без учета знака)
BRMI - результат вычитания второй величины из первой отрицателен
BRPL - результат вычитания второй величины из первой положителен
BRGE - первая величина больше или равна второй (с учётом знака)
BRLT - первая величина меньше второй (с учётом знака)
Команда |
Синтаксис |
Цель |
Операция |
LSL |
LSL Rd |
Rd |
Rd = Rd << 1 |
Описание |
Пример |
||
Сдвигает биты в регистре Rd на 1 влево. Младший бит устанавливается в 0. Результат записывается в регистр Rd. |
ldi r20, 0b01001101 ; запись в r20 lsl r20 ; в результате r20 == 0b10011010 |
||
|
|||
LSR |
LSR Rd |
Rd |
Rd = Rd >> 1 |
Сдвигает биты в регистре Rd на 1 вправо. Старший бит устанавливается в 0. Результат записывается в регистр Rd. |
ldi r20, 0b01001101 ; запись в r20 lsr r20 ; в результате r20 == 0b00100110 |
||
|
|||
ROL |
ROL Rd |
Rd |
Rd = (Rd << 1) + C |
Сдвигает биты в регистре Rd на 1 влево. Младший бит устанавливается в соответствии с флагом переноса C. Старший бит определяет новое C. |
;умножение на 2 2-байтного числа R19:R18 lsl r18 ; умножение на 2 младшей части rol r19 ; умножение на 2 старшей части с переносом младшего бита. |
||
|
|||
ROR |
ROR Rd |
Rd |
Rd = (Rd >> 1) + (C << 7) |
Сдвигает биты в регистре Rd на 1 вправо. Старший бит устанавливается в соответствии с флагом переноса C. Младший бит определяет новое C. |
;деление на 2 2-байтного числа R19:R18 lsl r19 ; деление на 2 старшей части rol r18 ; деление на 2 младшей части с переносом младшего бита. |
||
5. Побитовые операции
Команда |
Синтаксис |
Цель |
Операция |
ASR |
ASR Rd |
Rd |
Rd = Rd >> 1 + (Rd(7) << 7) |
Описание |
Пример |
||
Сдвигает биты 0:6 в регистре Rd на 1 вправо. Старший бит не изменяется. Результат записывается в регистр Rd. |
ldi r20, 0b11001101 ; запись в r20 asr r20 ; в результате r20 == 0b101001101 |
||
|
|||
SWAP |
SWAP Rd |
Rd |
Rd(0:3) <--> Rd(4:7) |
Меняет местами младшие 0:3 и старшие 4:7 биты в регистре Rd. |
ldi r20, 0b01001101 ; запись в r20 swap r20 ; в результате r20 == 0b11010100 |
||
|
|||
SBI |
SBI A, b |
I/O(A) |
I/O(A, b) = 1 |
Устанавливает в 1 значение бита b в регистре ввода/вывода A. |
sbi PORTA,4 ; четвёртый бит регистра порта A в 1. |
||
|
|||
CBI |
CBI A, b |
I/O(A) |
I/O(A, b) = 0 |
Устанавливает в 0 значение бита b в регистре ввода/вывода A. |
cbi PORTA,4 ; четвёртый бит регистра порта A в 0. |
||
6. Управление ядром
Команда |
Синтаксис |
Описание |
BREAK |
BREAK |
Переводит ядро контроллера в режим STOPPED и предоставляет доступ к ресурсам ядра отладчику. В коде обычно не применяется. |
|
||
NOP |
NOP |
Один пустой аппаратный цикл. Может применяться для создания задержек. |
|
||
SLEEP |
SLEEP |
Переводит микроконтроллер в режим SLEEP с параметрами, предварительно указанными в регистре MCUCR. |
|
||
WDR |
WDR |
Сбрасывает таймер «сторожевой собаки» (watchdog). |
