- •Кузнецов в.Н., Лисютченков с.Н. Цифровые и микропроцессорные устройства
- •Часть 3
- •220301– Автоматизация технологических процессов и производств
- •Содержание
- •Предисловие
- •Лабораторная работа №1 «Освоение среды разработки vmlab 3.12»
- •1.2 Теоретическое введение
- •1.2.1 Общие сведения
- •1.2.2 Среда разработки vmlab
- •1.2.3 Описание пользовательского интерфейса
- •1.2.4 Команды меню
- •Save All − сохранить все файлы Save As − сохранить файл текущего окна под новым именем
- •1.2.5 Доступные окна
- •1.2.6 Аппаратные компоненты
- •1.2.7 Формат программы на ассемблере
- •1.3 Порядок выполнения лабораторной работы
- •1.3.1 Создание нового проекта
- •1.3.2 Редактирование файла ассемблера
- •1.3.3 Ассемблирование и выполнение программы
- •1.4 Задание на лабораторную работу
- •1.5 Контрольные вопросы
- •1.6 Содержание отчета по лабораторной работе
- •Лабораторная работа №2 «Изучение микроконтроллера aTmega128 и основы программирования»
- •2.2.1 Общие сведения о микроконтроллере aTmega128
- •Регистры ввода/вывода (рвв)
- •Организация памяти
- •Внешние прерывания
- •2.2.9 Директивы транслятора ассемблера
- •2.2.10 Выражения
- •2.2.11 Операнды
- •2.2.12 Функции
- •2.2.13 Операции
- •2.3 Порядок выполнения лабораторной работы
- •2.4 Задание на лабораторную работу
- •Задание для индивидуальной работы
- •2.5 Контрольные вопросы
- •2.6 Содержание отчета по лабораторной работе
- •3.2.2 Адресация в микроконтроллере
- •3.2.3 Команды пересылки данных
- •Mov Rd,Rr(пересылка между рон) – копирует содержимое регистра Rrв регистр Rd. Регистр-источник Rrне изменяется.
- •3.2.4 Команды передачи управления
- •3.3 Порядок выполнения лабораторной работы
- •3.4 Задание на лабораторную работу
- •3.5 Контрольные вопросы
- •3.6 Содержание отчета по лабораторной работе
- •Лабораторная работа №4 «Выполнение арифметических операций»
- •4.2 Теоретическое введение
- •4.3 Порядок выполнения лабораторной работы
- •4.4 Задание на лабораторную работу
- •4.5 Контрольные вопросы
- •4.6 Содержание отчета по лабораторной работе
- •Лабораторная работа №5 «Изучение логических операций»
- •5.2 Теоретическое введение
- •Управление энергопотреблением и режимы сна.
- •5.3 Порядок выполнения лабораторной работы
- •5.4 Задания на лабораторную работу
- •5.5 Контрольные вопросы
- •5.6 Содержание отчета по лабораторной работе
- •Лабораторная работа №6 «Изучение портов ввода/вывода и их программирование»
- •6.2 Теоретическое введение
- •6.2.1 Общие сведения
- •6.2.2 Порты в качестве универсального цифрового ввода-вывода
- •6.2.3 Настройка выводов
- •6.2.4 Неподключенные выводы
- •6.2.5 Альтернативные функции порта
- •6.2.5.1 Альтернативные функции порта a
- •6.2.5.2 Альтернативные функции порта в
- •6.2.5.3 Альтернативные функции порта c
- •6.2.5.4 Альтернативные функции порта d.
- •6.2.5.5 Альтернативные функции порта e
- •6.2.5.6 Альтернативные функции порта f
- •6.2.5.1 Альтернативные функции порта g
- •6.2.6 Описание регистров портов ввода-вывода
- •6.2.7 Обращение к портам ввода/вывода
- •6.3 Порядок выполнения лабораторной работы на симуляторе
- •6.4 Задание на лабораторную работу
- •Задания для индивидуальной работы
- •Контрольные вопросы
- •6.6 Содержание отчета по лабораторной работе
- •Лабораторная работа №7.
- •7.2.1 Общие сведения о Память
- •7.2.2 Статическое озу памяти данных
- •7.2.3 Организация памяти
- •7.2.4 Запоминающее устройство sram
- •7.2.5 Временная диаграмма доступа к памяти
- •7.3 Память данных на эсппзу
- •7.3.1 Чтение и запись эсппзу
- •7.3.2 Адресные регистры эсппзу
- •Порядок выполнения
- •7.4 Память ввода-вывода
- •Порядок выполнения
- •Порядок выполнения
- •7.5 Задание на лабораторную работу
- •Задание для индивидуальной работы
- •7.6 Контрольные вопросы
- •7.7 Содержание отчета по лабораторной работе
- •Генерация тактовых импульсов
- •Инициализация усапп
- •8.2.2 Передача данных - Передатчик усапп
- •8.2.3 Прием данных - Приемник усапп
- •Асинхронный прием данных
- •8.2.4 Многопроцессорный режим связи
- •8.2.5 Описание регистров усапп
- •8.2.6 Последовательный периферийный интерфейс - spi
- •8.2.7 Функционирование вывода ss
- •8.2.8 Связь двух мк
- •8.3 Задание на лабораторную работу
- •Задание для индивидуальной работы
- •8.6 Контрольные вопросы
- •Лабораторная работа №9 «Изучение принципа работы таймеров/счетчиков микроконтроллера»
- •9.2 Теоретическое введение
- •9.2.1 Общие сведения о таймерах/счетчиках
- •9.2.2 Назначение выводов таймеров/счетчиков
- •9.2.5 Выбор источника тактового сигнала
- •9.2.6 Режим таймера
- •9.2.7 Функция захвата (Capture)
- •9.2.8 Функция сравнения (Compare)
- •9.2.9 Режим шим
- •9.2.10 Сторожевой таймер
- •9.2.11 Общие сведения о работе клавиатуры
- •9.2.12 Ввод кода нажатой клавиши
- •9.2.13 Сканирование и идентификация
- •Листинг проектного файла №9
- •На эмуляторе
- •9.4 Задание на лабораторную работу
- •Задания для индивидуальной работы
- •9.5 Контрольные вопросы
- •10.2.2 Функционирование модуля ацп
- •10.2.3 Принцип действия
- •10.2.4 Каналы дифференциального усиления
- •10.2.5 Изменение канала или выбор опорного источника
- •10.2.6 Входные каналы ацп
- •10.2.7 Источник опорного напряжения ацп
- •10.2.8 Повышение точности преобразования
- •10.2.9 Методы компенсации смещения
- •10.2.10 Описание получения результата преобразования
- •10.2.5 Параметры ацп
- •10.2 Порядок выполнения работы на симуляторе
- •На эмуляторе
- •10.3 Задание на лабораторную работу
- •Задания для индивидуальной работы
- •10.4 Контрольные вопросы
- •Приложение
- •Список литературы
2.2.9 Директивы транслятора ассемблера
Транслятор ассемблера поддерживает достаточно много директив. Директивы не транслируются в программу для микроконтроллера. Они используются для указания транслятору ассемблера данных о расположении программы в памяти микроконтроллера, определения макросов и т.д.
Ниже приведен перечень директив транслятора ассемблера:
.BYTE - резервирует 1 байт для использования в качестве переменной;
.CSEG - сегмент программ;
.DB - определяет байт-константу;
.DEF - определяет символическое имя для регистра;
.DEVICE - задает тип целевого микроконтроллера;
.DSEG - сегмент данных;
.DW - определяет слово-константу;
.ENDMACRO - конец определения макроса;
.EQU - сопоставляет символьному имени арифметическое выражение;
.ESEG - сегмент EEPROM;
.EXIT - выйти из файла (конец текста программы);
.INCLUDE - загрузить исходный текст из другого файла;
.LIST - включить генерацию листинга;
.LISTMAC - включить печать содержимого макросов в листинге;
.MACRO - начать определение макроса;
.NOLIST - выключить генерацию листинга;
.ORG - установить расположение;
.SET - сопоставить символу выражение.
Обратите внимание, что все директивы должны начинаться с точки.
.BYTE — резервирует место (или несколько мест) размером 1 байт для переменной.
Директива BYTE резервирует один байт в памяти SRAM для реализации переменной. Для того чтобы иметь возможность обращаться к этой переменной, перед директивой BYTE должна стоять метка. Директива имеет один параметр - количество байтов для резервирования. Директива может использоваться только для резервирования места в памяти данных (смотри директивы CSEG, DSEG и ESEG).
Синтаксис:
Метка: .BYTE числовое выражение
Пример:
.DSEG
.ORG $60
DMAS:.BYTE 3
.CSEG
MST: STS DMAS+1, R5
В SRAM зарезервированы три ячейки, к которым обращаются по адресам DMAS = $60, DMAS+1 = $61 и DMAS+2 = $62.
По команде, записанной в FlashROM по адресу MST, выполняется пересылка байта из регистра общего назначения R5 в ячейку SRAM по адресу $61.
.CSEG — сегмент кода.
Директива CSEG определяет начало сегмента кода (программ). В исходном тексте программы может быть несколько сегментов кода. Транслятор ассемблера в процессе компиляции программы объединяет все сегменты кода в один. Директива BYTE не может быть использована в сегменте кода. Если в программе нет явного указания названия сегмента, по умолчанию считается, что это сегмент кода. Директива CSEG не имеет никаких параметров. Сегмент кода имеет свой счетчик слов. Директива .ОRG может быть использована для размещения кода или констант в определенном программистом месте памяти программ.
Синтаксис:
.CSEG
Пример:
.CSEG .ORG $140 NUM: .DB $12, $34, $56, $78
Байт $12 записывается в FlashROM по адресу NUM = $140 в младшую половину ячейки, байт $34 — по этому же адресу в старшую половину ячейки, байт $56 — по адресу NUM+1 = $141 в младшую половину ячейки, байт $78 — по адресу NUM+1 в старшую половину ячейки. Запись выполняется при программировании микроконтроллера.
.DB — определить байты-константы в памяти программ или EEPROM.
Директива DB резервирует место в памяти программ или EEPROM. Для того чтобы иметь возможность обращаться к зарезервированному пространству, перед этой директивой следует ставить метку. Директива DB может быть расположена только в сегменте кода или EEPROM. Параметрами директивы DB является список выражений.
Список выражений представляет собой одно или несколько выражений, разделенных запятыми. Каждое выражение может быть равно числу от -128 до 255. Если выражение представляет собой отрицательное число, оно будет помещено в память программ или EEPROM в дополнительном коде.
Если директива DB расположена в сегменте кода и имеет больше чем одно выражение в списке параметров, выражения упаковываются таким образом, что два байта располагаются в одном слове памяти программ. Если число выражений нечетное, последнее выражена будет помещено в отдельное слово памяти программ, даже если после директивы DB следом расположена еще одна директива DB.
Синтаксис:
Метка: .DB список выражений
Пример:
.ESEG
.ORG $20
.EMAS:.DB $02, $13, $24
Байт $02 будет записан в EEPROM по адресу EMAS = $20, байт $13 — по адресу EMAS+1 - $21, байт $24 — по адресу EMAS+2. Запись в EEPROM выполняется в процессе программирования микроконтроллера.
.DEF — назначить регистру символьное имя.
Директива DEF позволяет назначить регистру символьное имя, что позволяет сделать программу гораздо понятнее и нагляднее. Можно назначить одному регистру несколько символьных имен. Символьное имя регистра может быть переопределено в последующем тексте программы.
Синтаксис:
.DEF символьное имя = регистр
Пример:
.DEF TEMP = r16 ; присвоить РОН r16 символьное имя TEMP
- - - - - - - - - - - - - -
LDI TEMP, $F0 ; в регистр общего назначения R16 заносится байт $F0.
.DEVICE — определяет тип целевого микроконтроллера.
Директива DEVICE позволяет программисту указать, на каком микроконтроллере будет выполняться программа. Если в тексте программы указана эта директива, транслятор ассемблера будет проверять текст программы на наличие недопустимых операций (например, не поддерживаемых выбранным микроконтроллером). В случае попытки использования большего размера SRAM или EEPROM памяти, чем имеется у выбранного микроконтроллера, также будет выдано предупреждение. Если директива DEVICE отсутствует в тексте программы, разрешены все команды семейства микроконтроллеров AVR, а размеры памяти не проверяются.
Синтаксис:
.DEVICE AT90S1200 | AT90S2313 | AT90S2323 | AT90S2343 | AT90S4414 | AT90S8515 | ATMEGA103
Примечание. Появляются новые модели микроконтроллеров, поэтому при необходимости использовать более новый микроконтроллер следует самостоятельно отслеживать разрешенные инструкции в тексте программы (соответственно не применяя директиву DEVICE) либо воспользоваться обновленной версией транслятора ассемблера.
Пример:
.DEVICE AT90S1200 ; Используется микроконтроллер AT90S1200
.CSEG
push r30 ; Эта запись вызовет сообщение о том, что
; выбранное устройство не поддерживает эту инструкцию
.DSEG — сегмент данных.
Директива DSEG определяет начало сегмента данных. В исходном тексте программы на ассемблере может быть несколько сегментов данных. В процессе трансляции все они будут объединены в один. Обычно сегмент данных содержит только директивы BYTE с метками. Сегмент данных имеет свой счетчик байтов. Директива .ORG может быть использована для расположения переменных в конкретных местах SRAM. Директива DSEG не имеет параметров. Метка является символическим адресом в адресном пространстве SRAM. В программе могут быть несколько сегментов типа .DSEG. При отсутствии директивы ORG в первом из них в качестве исходного принимается адрес $60.
Синтаксис:
.DSEG
Пример:
.DSEG ; Начало сегмента данных
var1: .BYTE 1 ;Резервируем 1 байт для переменной var1
table: .BYTE tab_size ;Резервируем tab_size байт
.CSEG
ldi r30,low(var1) ;Загружаем младший байт Z-регистра
ldi r31,high(var1) ;Загружаем старший байт Z-регистра
ld r1,Z ;Загрузить содержимое переменной var1 в г1
.DW — определение слов-констант в памяти программ или EEPROM.
Директива DW резервирует место в памяти программ или EEPROM. Для того чтобы иметь возможность обращаться к зарезервированному пространству, перед этой директивой следует ставить метку. Директива DW должна быть расположена в сегменте кода или EEPROM. Параметрами директивы DW является список выражений.
Список выражений представляет собой одно или несколько выражений, разделенных запятыми. Каждое выражение может быть равно числу от -32768 до 65535. Если выражение представляет собой отрицательное число, оно будет помещено в память программ или EEPROM в дополнительном коде.
Синтаксис:
Метка: .DW список выражений
Пример:
NUMS: .DW $1234, $5678, $9ABC
Слово $1234 записывается в FlashROM по адресу NUMS, слово $5678 — по адресу NUMS+1, слово $9АВС — по адресу NUMS+2. Реальные адреса вычисляются в процессе ассемблирования. Запись в FlashROM выполняется при программировании микроконтроллера.
.MACRO — начало определения макрокоманды и .ENDMACRO — конец описания макрокоманды.
Директива MACRO указывает транслятору ассемблера на начало определения макрокоманды. Параметром директивы MACRO является имя определяемой макрокоманды. В дальнейшем при обнаружении в тексте программы имени макрокоманды транслятор ассемблера будет фактически заменять это имя на содержание макрокоманды. Макрокоманда может иметь до 10 параметров. Эти параметры имеют фиксированные имена: @0...@9. При вызове макрокоманды параметры должны быть представлены в виде списка, разделенного запятыми. Определение макрокоманды завершается директивой ENDMACRO.
При определении новой макрокоманды нельзя использовать другие макрокоманды (т.е. нельзя использовать вложенные макрокоманды).
Макрокоманда должна быть определена в тексте программы до того, как ее используют.
По умолчанию в листинге генерируется только вызов макрокоманды. Чтобы получить в листинге содержимое макрокоманд, следует использовать директиву LISTMAC. Текст макрокоманды в листинге помечен символом «+».
Синтаксис:
.MACRO
Пример:
.MACRO EEWR
SBI EECR, 2
SBI EECR, 1
.ENDMACRO
При появлении в программе на языке ассемблера в среднем поле имени EEWR (макровызов) ассемблируются мнемокоды SBI EECR, 2 и SBI EECR, 1 и в программу на машинном языке вставляются машинные коды этих команд.
В макроопределении вместо конкретных имен и значений могут вводиться обобщенные обозначения параметров @0, @1, ..., @9.
В макровызове после имени указываются значения параметров для данного макровызова в порядке их номеров.
.EQU — присвоить символьному обозначению выражение.
Директива EQU присваивает символьному обозначению значение выражения. В дальнейшем это символьное обозначение может быть использовано в выражениях. Присвоенное значение - константа. В дальнейшем тексте программы это символьное выражение не может быть переопределено или изменено.
Синтаксис:
.EQU Символьное обозначение = <выражение>
Пример:
.EQU STACKINIT = $025F
Коду, предназначенному для занесения в регистр-указатель стека, программист присвоил имя и задал значение.
.ESEG — EEPROM сегмент.
Директива ESEG определяет начало EEPROM сегмента. Сегмент типа ESEG начинается с директивы .ESEG. В сегменте записываются директивы .DB, .DW и .ORG. Метка является символическим адресом в адресном пространстве EEPROM. Реальный адрес вычисляется в процессе ассемблирования. Исходное значение задается с помощью директивы .ORG, заданной в начале сегмента после директивы .ESEG. В программе могут быть несколько сегментов этого типа. При отсутствии директивы .ORG в первом из них в качестве исходного принимается нулевой адрес в EEPROM.
Директива .DB определяет байт или группу байтов, которые должны быть записаны в ячейки EEPROM, начиная с адреса, обозначенного меткой перед директивой .DB.
Синтаксис:
.ESEG
Пример:
.ESEG
.ORG $20
.EMAS:.DB $02, $13, $24
Байт $02 будет записан в EEPROM по адресу EMAS = $20, байт $13 — по адресу EMAS+1 - $21, байт $24 — по адресу EMAS+2. Запись в EEPROM выполняется в процессе программирования микроконтроллера.
.EXIT — конец текста программы.
Директива EXIT указывает транслятору ассемблера, что следует завершить трансляцию программы. При отсутствии этой директивы транслятор ассемблера работает до тех пор, пока исходный файл не закончится (EOF). Если директив EXIT встречается в файле, включаемом в текст директивой INCLUDE, транслятор ассемблера продолжит работу со строки, следующей после соответствующей директивы INCLUDE.
Синтаксис:
.EXIT
Пример:
.EXIT ; Завершить обработку этого файла
.INCLUDE — вставить файл.
Директива INCLUDE указывает транслятору ассемблера на необходимость вставить в исходный текст программы другой файл. Реально при обработке этой директивы транслируется файл, указанный в директиве INCLUDE, после завершения его обработки (при достижении конца файла или директивы .EXIT) продолжается обработка основного файла. Вложенные файлы, в свою очередь, могут иметь директиву INCLUDE. Для облегчения понимания можно представить себе, что в текст программы вместо директивы INCLUDE вставляется соответствующий файл.
Синтаксис:
.INCLUDE "имя файла"
Пример:
.INCLUDE "UART.ASM",
где UART.ASM — имя дополнительного файла.
.LIST — включить генерацию листинга.
Директива LIST включает генерацию листинга. Ассемблер генерирует листинг, содержащий исходный текст на ассемблере, адреса и коды операций. По умолчанию генерация листинга включена. В комбинации с директивой NOLIST можно организовать печать только нужных фрагментов программы.
Синтаксис:
.LIST
Пример:
.NOLIST ;Отключить генерацию листинга
.INCLUDE "macro.inc" ; Включаемые файлы не будут
.INCLUDE "const.def" ;показаны в листинге
.LIST ; Включить генераций листинга
.LISTMAC — включить раскрытие макрокоманд.
Директива LISTMAC указывает транслятору ассемблера на необходимость показа в листинге содержимого макрокоманд. По умолчанию в листинге показывается только название макрокоманды.
Синтаксис:
.LISTMAC
Пример:
.MACRO MACX ; Определить макрокоманду
add r0,@0
еоr r1,@1
.ENDMACRO ; Конец определения макрокоманды
.LISTMAC
MACX r2,r1 ; Вызов макрокоманды. В листинге будет показан ее текст
.NOLIST — включить генерацию листинга.
Директива NOLIST выключает генерацию листинга. Ассемблер генерирует листинг, содержащий исходный текст на ассемблере, адреса и коды операций. По умолчанию генерация листинга включена. В комбинации с директивой LIST можно организовать печать только нужных фрагментов программы.
Синтаксис:
.NOLIST
Пример:
.NOLIST ; Отключить генерацию листинга
.INCLUDE "macro.inc" ; Включаемые файлы не будут
.INCLUDE "const.der" ; показаны в листинге
.LIST ; Включить генераций листинга
.ORG — установка значения счетчика расположения.
Директива ORG присваивает абсолютное значение счетчику. Параметром директивы является значение, которое должно быть присвоено счетчику. При использовании директивы ORG в сегменте данных будет определено значение, указывающее расположение в оперативной памяти SRAM. При использовании директивы ORG в сегменте кода будет определено значение, указывающее расположение в памяти программ. При использовании директивы ORG в сегменте EEPROM будет определено значение, указывающее расположение в памяти EEPROM.
Если перед директивой расположена метка (на этой же строке), метка получит значение параметра директивы. Значение по умолчанию для сегмента кода и EEPROM равно 0, а для SRAM - 32 (так как регистры занимают пространство с 0 до 31). Обратите внимание, что для EEPROM и SRAM отсчитываются байты, в то время как в памяти программ - слова.
Синтаксис:
.ORG выражение
Пример:
.DSEG ;Начало сегмента данных (SRAM)
.ORG 0х37 ;Установить адрес SRAM 37H
variable:.BYTE 1 ;Зарезервировать 1 байт по адресу 37H SRAM
.ESEG ;Начало сегмента EEPROM
.ORG 0х20 ;Установить значение счетчика расположения
eevar:.DW 0xf77a ; Инициализировать слово в памяти EEPROM
.CSEG
.ORG 0х10 ;Установить счетчик на значение 0х10
mov r0,r1 ; Эта команда будет расположена в памяти программ по адресу 0х10
.SET — присвоить символьному обозначению выражение.
Директива SET присваивает символьному обозначению значение выражения. В дальнейшем это символьное обозначение может быть использовано в выражениях. В дальнейшем тексте программы это символьное выражение может быть изменено.
Синтаксис:
.SET символьное обозначение = выражение
Пример:
.SET io_offset = 0х23
.SET porta = io_offset +2
.CSEG ;Начало сегмента кода
clr r2 ;Очистить регистр г2
out porta,r2 ;Записать в порт А
