- •1. Теоретическая часть
- •1.1. Понятие архитектуры микропроцессоров
- •1.1.1. Принстонская (фоннеймановская) и гарвардская архитектура
- •1.1.2. Cisc и risc архитектура
- •1.1.3. Классификация мп по функциональному признаку
- •1.2. Основные элементы архитектуры микроконтроллера avr
- •1.3 Программирование микроконтроллеров
- •Примерная структура программы
- •Интегрированная отладочная среда avr Studio фирмы Atmel
- •2. Задание по лабораторной работе "изучение архитектуры и основ программирования микроконтроллеров avr"
- •Инструкции процессоров avr Приложение 1 Арифметические и логические инструкции
- •Инструкции ветвления
- •Инструкции передачи данных
- •Инструкции работы с битами
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 , по которой к основной программе во время трансляции подключается дополнительный файл. Например, директива .include “m16def.inc” подключает расположенный в той же директории, что и программа, файл, в котором как константы определены имена регистров ввода/вывода и их отдельных бит, а также имена адресов векторов прерывания микроконтроллера ATMega16. Эти имена фактически стандартны для рассматриваемых микроконтроллеров и используются как в технических описаниях, так и в примерах программ.
Чтобы назначить свои имена (вместо стандартных) используют следующие директивы.
.def, .equ, .set Директивы .def , присваивает имена регистрам и .equ, .set присваивает имена и значение константам. При трансляции команд вместо имён подставляются адреса или значения.
Ниже даётся описание ещё нескольких директив.
.cseg отмечают в исходном тексте начало сегмента с программным кодом,
.dseg начало сегмента данных для оперативной памяти (SRAM) и
.eseg данными для электрически перепрограммируемой памяти (EEPROM).
.org присваивает значение, заданное параметром, программному счетчику PC или счетчику положения в SRAM.
.byte резервирует указанное параметром директивы число байт во встроенной оперативной памяти данных (SRAM).
.db, .dw определяют одну или последовательность одно- или двухбайтовых констант в памяти программ, данных или EEPROM в зависимости от места-сегмента нахождения директивы.
.macro, .endmacro – директивы, определяющие начало и конец макроопределений (макросов), повторяющихся частей программы.