Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МПС (Влада).docx
Скачиваний:
112
Добавлен:
05.05.2021
Размер:
4.89 Mб
Скачать

9. Основы языка Assembler для микроконтроллеров семейства avr. Синтаксис, классификация команд.

Язык Ассемблера – система обозначений, используемая для представления в удобно читаемой форме программ, записанных в машинном коде. Команды языка ассемблера один к одному соответствуют командам процессора. Фактически они и представляют собой более удобную для человека символьную форму записи команд и их аргументов.

Кроме того, язык ассемблера позволяет использовать символические метки вместо адресов ячеек памяти, которые при ассемблировании заменяются на вычисляемые ассемблером абсолютные или относительные адрес, а также так называемые дерективы (команды ассемблера, не переводимые в машинные команды процессора, а выполняемые самим ассемблером).

Метка – это символьное имя, обозначающее ячейку памяти, которая содержит некоторую команду. Абсолютный адрес – неизменяющийся при копировании и перемещении формулы, содержащий исходное данное (операнд). Относительный – изменяющийся. Директивы ассемблера позволяют, в частности, включать блоки данных, задать ассемблирование фрагмента программы по условию, задать значения меток, использовать макрокоманды с параметрами.

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

Синтаксис ассемблера AVR Studio

Комментарии.

  • Общее правило: чем подробнее описаны выполняемые команды, тем лучше, но комментировать каждую строку – избыточно.

  • Обозначаются двумя способами: с помощью символа ; или //

  • Для объемных комментариев в несколько строчек, целесообразнее использовать /* текст комментария*/ (взято из языка С).

Операторы

.def

  • Позволяет присвоить любому регистру МК некоторое осмысленное символьное имя.

  • Одному и тому же регистру можно присвоить несколько имен, обратное недопустимо

  • Пример: .def Temp=R16

.equ

  • Позволяет присвоить выражению или константе некоторую символьную метку.

  • Помогает избежать «магических чисел», т.е. встречающиеся в программе числа, происхождение которых неочевидно.

Если какое-то число встречается в программе часто и нам понадобится его изменить, мы один раз меняем присвоенную ему метку вместо изменения всех этих чисел в тексте программы.

  • Позволяет присвоить выражение, которое в процессе компиляции будет посчитано препроцессором и предано в код в виде готового числа. Деление здесь исключительно целочисленное, с отбрасыванием дробной части, без округления: 1/2=0 и 5/2=2.

.include

  • Позволяет подключать в тело программы часть кода из другого текстового файла. Это позволяет разбить большую программу на отдельные функциональные части и повысить тем самым читаемость кода.

  • Если необходимо подключить не весь файл, а только его часть, то нужно воспользоваться директивой .exit, дойдя до которой компилятор попросту выйдет из файла, забрав с собой только необходимый участок.

.macro

  • Оператор макроподстановки. Макрос – символьное имя, заменяемое при обработке препроцессором на последовательность программных инструкций.

  • Для каждого интерпретатора существует специальный синтаксис объявления и вызова макросов.

  • Перед тем как использовать макрос, его необходимо объявить. Часто стандартные макросы уже находятся в готовом виде в стандартных подключаемых файлах. Для их использования в программе необходимо просто подключить нужный файл.

  • Макрос представляет собой последовательность команд, которые подставляются в нашу программу при вызове этого самого макроса. Это позволяет сократить кол-во строчек кода в нашей проге, улучшает читаемость и структурированность.

Пример: простейший макрос, записывающий восьмибитную константу (т.е. значение от 0 до 255) в РВВ:

.macro OUTI

//имя макроса, по которому мы будем к нему обращаться

LDI R16, @1

//записываем нашу константу в регистр R16

.if @0<0x40

//если адрес регистра меньше 0х40

OUT @0,R16

//выводим константу в искомый регистр первым методом

.else

//если адрес больше 0х40

STS @0, R16

//выводим константу в искомый регистр вторым методом

.endif

//оператор окончания условного цикла

endm

//знак окончания макроса

Вследствие ограничений, накладываемых компилятором, не можем напрямую записывать константу в регистр, только с использованием промежуточного РОН, поэтому подобный макрос позволяет нам упростить написание программы.

@0, @1 – параметры макроса, нумеруемые строго по порядку, а при вызове подставляемые в код.

К регистрам периферии можно обратиться 2 способами:

1) через команды IN/OUT по короткому адресу в пространстве адресов ВВ-ВЫВ

2) через группу команд LOAD/STORE по полному адресу в пространстве адресов RAM.

Результаты обоих способов идентичны, но 1 работаем только с первыми 3F (шестн-ричный) адресами, а со всеми остальными работает только 2 группа команд. Поэтому макрос проверяет адрес регистра, в который нужно записать константу и, исходя из результатов проверки, подставляет необходимую команду.

Операнды

Программа для любого МК представляет собой последовательность программ, записанных в памяти программ. Большинство команд при выполнении изменяют содержимое одного или нескольких РОН, РВВ или ячеек ОЗУ. Для обращения к различным областям адресного пространства памяти данных используются различные команды, реализующие в свою очередь различные способы адресации. Доступ к регистрам ВВ-ВЫВ осуществляется по их адресам, являющимися операндами команды.

Операнд – объект, над которым выполняется машинная команда. Операнды ассемблера описываются выражениями с числовыми и текстовыми константами, метками и идентификаторами переменных с использованием знаков операций и некоторых зарезервированных слов.

Особенности записи

КОМАНДА, ОПЕРАНДЫ

Некоторые команды не имеют операндов (RETI, SEI, CLI, NOP), в других – один операнд (команда инкримента/декримента INC/DEC).

Если же команда имеет 2 операнда, то сначала указывают приёмник, затем источник [прямая польская запись], причем обязательно между ними должна стоять запятая.

Пример: SUB R16, R17 – означает, что из содержимого регистра R16 нужно вычесть содержимое регистра R17, причем результат окажется в регистре R16.

  • AVR не различает буквенный регистр, причем не только при записи команд, но и в именах переменных, констант, меток и тому подобное (т.е. Reset, RESET, RESet будут для компилятора выглядеть одинаково).

  • Каждая команда должна занимать отдельную строку, разбивать команду на части разрывом строки также запрещено.

  • Кроме команды, единая строка может содержать метки и примечания. Метка (Label) – идентификатор произвольной длины, который задается программистом и заканчивается двоеточием без пробела перед ним (напр., Metka:). Метку можно располагать в отдельной строке, они могут служить указанием на адрес подпрограмм и заодно выступать в качестве их названия.

Классификация команд

Типы ассемблерных команд

Все множество команд микроконтроллеров AVR можно разбить на несколько групп:

• команды логических операций;

• команды арифметических операций и команды сдвига;

• команды операций с битами;

• команды пересылки данных;

• команды передачи управления;

• команды управления системой.

Команды логических операций.

Позволяют выполнять стандартные логические операции над байтами, такие как логическое умножение (И), логическое сложение (ИЛИ), операцию «исключающее ИЛИ», а также вычисление обратного (дополнение до единицы) и дополнительного (дополнение до двух) кодов числа.

К этой группе можно отнести также команды очистки/установки регистров.

Операции производятся между регистрами общего назначения, либо между регистром и константой; результат сохраняется в РОН. Все команды из этой группы выполняются за один такт (машинный цикл).

Команды арифметических операций и команды сдвига. Позволяют выполнять базовые операции: сложение, вычитание, сдвиг (вправо и влево), инкрементирование, декрементирование, а также умножение.

Все операции производятся только над регистрами общего назначения. Почти все команды рассматриваемой группы выполняются за один такт (машинный цикл). Команды умножения и команды, оперирующие 2-байтовыми значениями, выполняются за два такта (цикла).

Команды операций с битами.

Выполняют установку или сброс заданного бита РОН или РВВ.

Причем для изменения разрядов (битов) регистра состояния SREG имеются отдельные (дополнительные) команды, так как проверка состояния (разрядов) битов именно этого регистра производится чаще всего.

Условно, к этой группе можно отнести также две команды передачи управления типа «проверка/пропуск», которые пропускают следующую команду в зависимости от состояния разряда РОН или РВВ.

Все задействованные разряды РВВ имеют свои символические имена. Определения этих имен описаны в том же включаемом файле, что и определения символических имен адресов регистров. Таким образом, после включения в программу указанного файла в командах вместо числовых значений номеров разрядов можно будет указывать их символические имена.

Команды пересылки данных.

Предназначены для пересылки содержимого ячеек, находящихся в адресном пространстве памяти данных. Разделение адресного пространства на три части (РОН, РВВ, ОЗУ) предопределило разнообразие команд данной группы.

Пересылка данных, выполняемая командами группы, может производиться в следующих направлениях:

• РОН <=> РОН;

• РОН <=> РВВ;

• РОН <=> память данных.

Также к данной группе можно отнести стековые команды PUSH и POP, позволяющие сохранять в стеке и восстанавливать из стека содержимое РОН. На выполнение команд данной группы требуется от одного до трех тактов (машинных циклов) в зависимости от команды.

Команды передачи управления.

Входят: команды перехода, вызова подпрограмм и возврата из них и команды типа «проверка/пропуск», пропускающие следующую за ними команду при выполнении некоторого условия. Также к этой группе относятся команды сравнения, формирующие флаги регистра SREG и предназначенные, как правило, для работы совместно с командами условного перехода.

В системе команд микроконтроллеров семейства имеются команды как безусловного, так и условного переходов. Команды относительного перехода (RJMP), а в микроконтроллерах семейства Mega также косвенного (IJMP) и абсолютного (JMP) безусловного перехода, являются самыми простыми в этой группе. Функция: запись нового адреса в счетчик команд. Команды условного перехода также изменяют содержимое счетчика команд, однако это изменение происходит только при выполнении некоторого условия или, точнее, при определенном состоянии различных флагов регистра SREG.

Команды вызова подпрограммы (ICALL, RCALL, CALL) работают практически так же, как и команды безусловного перехода. Отличие заключается в том, что перед выполнением перехода значение счетчика команд сохраняется в стеке.

Кроме того, подпрограмма должна заканчиваться командой возврата RET. Команда RET заменяет адрес, находящийся в счетчике команд, адресом команды, следующей за командой RCALL.

Команды передачи управления нарушают нормальное (линейное) выполнение основной программы. Каждый раз, когда выполняется команда из этой группы (кроме команд сравнения), нормальное функционирование конвейера нарушается.

Перед загрузкой в конвейер нового адреса производится остановка и очистка выполняемой последовательности команд.

Команды управления системой.

Входят всего 3 (4 по интернету) команды:

• NOP — пустая команда;

• SLEEP — перевод МК в режим пониженного энергопотребления;

• WDR — сброс сторожевого таймера;

(• BREAK — команда, используемая внутрисхемным отладчиком.)

Все команды этой группы, кроме последней, выполняются за один такт

10. Устройство портов ввода-вывода. Упрощённая схема порта ввода-вывода микроконтроллера. Управляющая логика, определяющая конфигурацию порта ввода-вывода. Режимы работы: выход, вход с подтяжкой к питанию (PullUp). Состояние высокого импеданса.

Схема устройства вывода МК

На входе стоит небольшая защита из диодов, которая призвана защитить вход микроконтроллера от превышения напряжения питания.

UВХ > UПИТ

UВХ – отрицательное

Верхний диод открывается, и это напряжение уходит на шину питания, где с ним будет бороться источник питания и его фильтры

Нейтрализация через нижний диод. Напряжение уходит на землю

Эти диоды маломощные, поэтому защитить они могут только от небольших скачков напряжения. Отклонение от стандартного напряжения питания (в нашем случае это +5 вольт) может составлять ±10 %, т.е. 5,5 В порт может выдержать, но если подать больше, то диоды не помогут, порт закоротит, и микроконтроллер выйдет из строя.

Конденсатором обозначена паразитная емкость, которая присутствует на каждом выводе контроллера.

Управляющая логика, определяющая конфигурацию порта (направление передачи данных) изображена в виде простейших переключателей. На самом деле там стоят полевые транзисторы, но для простоты объяснения используются ключи, смысл от этого не изменяется.

Управляющие регистры

Все регистры микроконтроллера и относящиеся к ним отдельные биты в технической документации обозначаются в едином стиле: Pxn,

где х представляет собой буквенное обозначение порта,

n – номер конкретного бита.

За каждый порт ввода-вывода отвечают три восьмибитных регистра.

  1. PINх  этот регистр доступен только для чтения. В регистре PINx содержится информация о текущем логическом уровне на каждом из выводов порта, независимо от его настроек.

Поэтому если мы хотим узнать, что у нас на входе – читаем соответствующий бит регистра PINx.

Существует две границы: граница гарантированного нуля и граница гарантированной единицы – пороги, за которыми мы можем однозначно определить текущий логический уровень. Для напряжения питания в 5 В это 1,4 В и 1,8 В соответственно. При снижении напряжения от максимума до минимума бит в регистре PIN переключится с 1 на 0 только при снижении напряжения ниже 1,4 В, и наоборот, переключение бита с 0 на 1 осуществится только по достижении напряжения в 1,8 В, т.е. возникает гистерезис переключения с нуля на единицу, что исключает хаотичные переключения под действием помех и наводок, а также ошибочное считывание логического уровня между порогами переключения.

  1. DDRx  этот регистр определяет направление работы порта. Порт в каждый конкретный момент времени может быть либо входом, либо выходом.

DDRxn=0 – вывод работает как ВХОД,

DDRxn=1 – вывод работает как ВЫХОД.

  1. PORTx – данный регистр управляет состоянием вывода.

Вывод настроен КАК

От PORTx зависит

ВХОД

Тип входа (Hi-Z или PullUp).

ВЫХОД

Состояние вывода

PORTxn=1 -> на выходе логическая единица

PORTxn=0 -> на выходе логический ноль.

Режимы работы

DDRxn

PORTxn

Ввод/Вывод

Pull-up

Комментарий

0

0

Вход

Нет

Вывод находится в третьем состоянии (Hi-Z)

0

1

Вход

Есть

Если вывод на земле, Pxn станет источником тока

1

0

Выход

Нет

На выходе – низкий уровень (логический 0)

1

1

Выход

Нет

На выходе – высокий уровень (логическая 1)

Режим выхода.

Если нам необходимо выдать в порт логическую единицу, мы переводим порт в режим работы на выход (DDRxn=1) и записываем в регистр PORTxn единицу – при этом замыкается верхний переключатель, и на нужном выводе появляется напряжение питания, соответствующее логической единице. Если нам на выходе нужен логический ноль, записываем в PORTxn ноль и получаем на соответствующем выводе напряжение земли, что соответствует уровню логического нуля.

Режим входа.

После подачи питания все выводы микроконтроллера находятся по умолчанию в дефолтном состоянии – во всех регистрах записаны нули, соответственно порты ввода-вывода работают на вход и без подтяжки к питанию (так называемое третье состояние, Hi-Z).

Hi-Z – это такое состояние контакта логической схемы, при котором сопротивление между этим контактом и остальной схемой очень велико (принимается близким к бесконечности, т. е. эквивалентно обрыву цепи, в реальности сотни МОм).

Вывод, переведённый в состояние Hi-Z, ведёт себя как оторванный от схемы. Внешние устройства, подключенные к этому выводу, могут изменять напряжение на нём по своему усмотрению.

PullUp – вход с подтяжкой по питанию.

При DDRxn=0 и PORTxn=1 замыкается переключатель подтягивающего резистора, и к линии питания подключается резистор с сопротивлением примерно 40 кОм, что моментально переводит линию в состояние логической единицы. Цель подтяжки к питанию – гарант независимости состояния вывода от различных помех и наводок извне.

11. Таймеры-счётчики. Источники тактовой частоты. Регистры, определяющие работу таймера. Предделитель таймера. Основные режимы работы таймера: стандартный счётный режим (Normal), режим сброса при совпадении. Источники прерываний таймера.

Таймеры-счётчики – отсчитывают время независимо от работы МК ядра и позволяет в любое время пользоваться результатами счета. Входит в состав стандартной периферии любого 8-битного МК семейства AVR.

Во всех более старших моделях как минимум 2 таймера-счетчика:

Таймер Т0 (8ми битный)

Таймер Т1 (16-ти битный)

  • минимальный набор функций

  • в одних моделях может использоваться только для отсчета и измерения временных интервалов или как счетчик внешних событий

  • в других: к этим функциям добавляется возможность генерации сигналов с ШИМ фиксированной разрядности, а также возможность работать в асинхронном режиме в качестве часов реального времени

  • может использоваться как для отсчета временных интервалов, так и в качестве счетчика внешних событий

  • ещё может выполнять запоминание своего состояния по внешнему сигналу

  • может работать в качестве ШИМ, НО уже переменной разрядности и многоканального

В составе всех МК семейства имеется сторожевой таймер (Watch Dog Timer). Он позволяет избежать несанкционированного зацикливания программы, возникающего по тем или иным причинам.

Источники тактовой частоты.

Для работы любого микроконтроллера его необходимо обеспечить стабильным источником тактовых импульсов. Для МК Atmel возможно несколько вариантов:

  1. Внутренний генератор на RC-цепочке.

  • самый простой (+)

  • не требует дополнительных внешних компонентов (+)

  • особой точности от такого генератора ждать не стоит (-), его частота может меняться в зависимости от внешних условий в пределах 3 – 5 процентов. Для приложений, не требующих точного измерения временных интервалов, этого вполне достаточно.

Соседние файлы в предмете Микропроцессорные системы