Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб_AVR1_ред.doc
Скачиваний:
22
Добавлен:
21.11.2019
Размер:
1.08 Mб
Скачать

1.3 Программирование микроконтроллеров

Микроконтроллеры типа AVR серий ATmega 16 и их модели имеют сокращённые (по сравнению с процессорами универсальных ЭВМ) наборы команд – инструкций. Это вместе с особенностями архитектуры позволяет значительно сократить число машинных тактов, затрачиваемых на исполнение команды, и повысить скорость выполнения типичных для МК программ.

Для программирования используется как язык ассемблера, так и языки высокого уровня (в частности, язык Си). Наиболее доступной интегрированной средой программирования на языке ассемблера является программный пакет AVR Studio. Он включает в себя текстовый редактор, транслятор-ассемблер, отладчик-симулятор и программу загрузки Flash-памяти и EEPROM через специальное устройство-программатор. Язык ассемблера состоит из набора команд-инструкций, в которых можно использовать простые операторные выражения, и директив, используемых на этапе трансляции-ассемблирования.

Базовый набор команд подразделяется на арифметико-логические, передачи данных, переходов и битовые. Команда состоит из кода операции и одного или двух операндов. Ряд команд не содержит операндов. Операндом может являться: либо значение, непосредственно заносящееся в команду; либо адрес ячейки, содержащей значение, - прямая адресация; либо адрес ячейки, содержащей адрес, - косвенная адресация. Список и подробное описание команд содержится в [1-6], в справочном разделе среды программирования AVR Studio. В таблице 3 рассматриваются примеры команд в таком виде, как они записываются в программе.

Таблица 3

Мнемоника

Операнды

Описание

Операция

ADD

Rd,Rr

Суммирование без переноса

Rd = Rd + Rr

ADC

Rd,Rr

Суммирование с переносом

Rd = Rd + Rr + C

SUB

Rd,Rr

Вычитание без переноса

Rd = Rd - Rr

SUBI

Rd,K8

Вычитание константы

Rd = Rd - K8

SBC

Rd,Rr

Вычитание с переносом

Rd = Rd - Rr - C

SBCI

Rd,K8

Вычитание константы с переносом

Rd = Rd - K8 - C

AND

Rd,Rr

Логическое И

Rd = Rd · Rr

OR

Rd,Rr

Логическое ИЛИ

Rd = Rd V Rr

EOR

Rd,Rr

Логическое исключающее ИЛИ

Rd = Rd EOR Rr

COM

Rd

Побитная Инверсия

Rd = $FF - Rd

NEG

Rd

Изменение знака (Доп. код)

Rd = $00 - Rd

SBR

Rd,K8

Установить бит (биты) в регистре

Rd = Rd V K8

CBR

Rd,K8

Сбросить бит (биты) в регистре

Rd = Rd · ($FF - K8)

INC

Rd

Инкрементировать значение регистра

Rd = Rd + 1

DEC

Rd

Декрементировать значение регистра

Rd = Rd -1

CLR

Rd

Очистить регистр

Rd = 0

SER

Rd

Установить регистр

Rd = $FF

MUL

Rd,Rr

Умножение чисел без знака

R1:R0 = Rd * Rr

MULS

Rd,Rr

Умножение чисел со знаком

R1:R0 = Rd * Rr

MULSU

Rd,Rr

Умножение числа со знаком с числом без знака

R1:R0 = Rd * Rr

MOV

Rd,Rr

Скопировать регистр

Rd = Rr

LDI

Rd,K8

Загрузить константу

Rd = K

LDS

Rd,k

Прямая загрузка

Rd = (k)

LD

Rd,X

Косвенная загрузка

Rd = (X)

IN

Rd,P

Чтение порта

Rd = P

OUT

P,Rr

Запись в порт

P = Rr

PUSH

Rr

Занесение регистра в стек

STACK = Rr

POP

Rd

Извлечение регистра из стека

Rd = STACK

JMP

label

Относительный переход на метку

CALL

label

Вызов подпрограммы

RET

Возврат из подпрограммы

SBIS

PORTx,b

Перейти на следующую команду, если бит №b в PORTx сброшен или через одну команду, если установлен.

SBI

PORTx,b

Установить бит №b в PORTx в 1

CBI

PORTx,b

Очистить бит №b в PORTx в 0

Весь перечень инструкций – команд процессоров AVR приведен в приложении.

При программировании нам удобнее использовать символические имена регистров, а машине же нужно знать адрес памяти этих регистров, поэтому в программе на Ассемблере вместе с командами содержатся директивы, которые используются на этапе трансляции программы в машинный код, но сами не транслируются.

.device - указание на конкретный тип МК, транслятор контролирует наличие используемых средств (объем памяти и др.). При отсутствии директивы контроль отсутствует.

.include - Практически любая программа содержит одну или несколько директив .include , по которой к основной программе во время трансляции подключается дополнительный файл. Например, директива .includem16def.incподключает расположенный в той же директории, что и программа, файл, в котором как константы определены имена регистров ввода/вывода и их отдельных бит, а также имена адресов векторов прерывания микроконтроллера ATMega16. Эти имена фактически стандартны для рассматриваемых микроконтроллеров и используются как в технических описаниях, так и в примерах программ.

Чтобы назначить свои имена (вместо стандартных) используют следующие директивы.

.def, .equ, .set Директивы .def , присваивает имена регистрам и .equ, .set присваивает имена и значение константам. При трансляции команд вместо имён подставляются адреса или значения.

Ниже даётся описание ещё нескольких директив.

.cseg отмечают в исходном тексте начало сегмента с программным кодом,

.dseg начало сегмента данных для оперативной памяти (SRAM) и

.eseg данными для электрически перепрограммируемой памяти (EEPROM).

.org присваивает значение, заданное параметром, программному счетчику PC или счетчику положения в SRAM.

.byte резервирует указанное параметром директивы число байт во встроенной оперативной памяти данных (SRAM).

.db, .dw определяют одну или последовательность одно- или двухбайтовых констант в памяти программ, данных или EEPROM в зависимости от места-сегмента нахождения директивы.

.macro, .endmacro – директивы, определяющие начало и конец макроопределений (макросов), повторяющихся частей программы.