- •Кузнецов в.Н., Лисютченков с.Н. Цифровые и микропроцессорные устройства
- •Часть 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 Контрольные вопросы
- •Приложение
- •Список литературы
3.2.3 Команды пересылки данных
Команды этой группы предназначены для пересылки содержимого ячеек, находящихся в адресном пространстве памяти данных. Разделение адресного пространства на три части (РОН, РВВ, ОЗУ) предопределило разнообразие команд этой группы. Пересылка данных, выполняемая командами группы, может производиться в следующих направлениях:
РОН РОН;
РОН РВВ;
РОН память данных (3 вида адресации).
Также к данной группе можно отнести стековые команды PUSH и POP, позволяющие сохранить в стеке и восстанавливать из стека содержимое РОН.
На выполнение команд данной группы требуется от одного до трех машинных циклов в зависимости от команды.
Mov Rd,Rr(пересылка между рон) – копирует содержимое регистра Rrв регистр Rd. Регистр-источник Rrне изменяется.
MOVW Rd,Rr - пересылка двухбайтных значений.
LDI Rd,K (загрузка константы в РОН) – загружает 8-разрядное число в регистр общего назначения Rd. Данная команда применима только к старшей половине РОН (адреса 16…31).
LD Rd,X (косвенное чтение памяти данных) – загружает один байт из адресного пространства памяти данных в регистр общего назначения Rd. Адрес ячейки памяти, к которой производится обращение, содержится в индексном регистре Х.
LDD Rd,Y+q(косвенное относительное чтение памяти данных) - загружает один байт из адресного пространства памяти данных в регистр общего назначения Rd. Адрес ячейки памяти, к которой производится обращение, получается суммированием содержимого индексного регистраYи константыq. Содержимое индексного регистра не изменятся.
LDS Rd,k (загрузка из памяти данных) - загружает один байт из адресного пространства памяти данных в регистр общего назначения Rd. Адрес ячейки памяти, к которой производится обращение, задается константой k.
ST X,Rr (косвенная запись в память данных) – сохраняет содержимое регистра общего назначения Rr в памяти данных. Адрес ячейки памяти, к которой производится обращение, содержится в индексном регистре Х.
STD Y+q,Rr (косвенная относительная запись в память данных) - сохраняет содержимое регистра общего назначения Rr в памяти данных. Адрес ячейки памяти, к которой производится обращение, получается суммированием содержимого индексного регистраYи константыq. Содержимое индексного регистра не изменятся.
STS k,Rr (запись в память данных) - сохраняет содержимое регистра общего назначения Rr в памяти данных. Адрес ячейки памяти, к которой производится обращение, задается константой k.
SPM – запись в память программ.
LPM (загрузка данных из памяти программ) - загружает один байт из адресного пространства памяти данных в регистр общего назначения R0. Адрес ячейки памяти, к которой производится обращение, содержится в индексном регистре Z.
IN Rd,A – Пересылка из РВВ в РОН.
OUT A,Rd – Пересылка из РОН в РВВ.
PUSH Rr – Сохранение байта в стеке.
POP Rd – Извлечение байта из стека.
Rd – Регистр приемник.
Rr – Регистр источник.
3.2.4 Команды передачи управления
В эту группу входят команды перехода, вызова подпрограмм и возврата из них и команды типа “проверка/пропуск”, пропускающие следующую за ними команду при выполнении некоторого условия. Также к этой группе относятся команды сравнения, формирующие флаги регистра SREG и предназначенные, как правило, для работы совместно с командами условного перехода.
Команды проверки и перехода
CP Rd,Rr (сравнение РОН) – сравнивает содержимое двух регистров общего назначение путем вычитания содержимого Rr из содержимого Rd. Данная команда влияет только на флаги регистра состояния SREG, которые устанавливаются в соответствии с результатом вычитания. Содержимое регистров не изменятся. Как правило, данная команда используется совместно с одной из команд условного перехода.
CPC Rd,Rr (сравнение РОН с учетом переноса) - сравнивает содержимое двух регистров общего назначение путем вычитания содержимого Rr и флага переноса (С) из содержимого Rd. Данная команда влияет только на флаги регистра состояния SREG, которые устанавливаются в соответствии с результатом вычитания. Содержимое регистров не изменятся. Как правило, данная команда используется совместно с одной из команд условного перехода.
CPI Rd,K (сравнение содержимого РОН с константой) - сравнивает содержимое регистра общего назначение Rd с константой К путем вычитания константы из содержимого Rd. Данная команда влияет только на флаги регистра состояния SREG, которые устанавливаются в соответствии с результатом вычитания. Содержимое регистра Rd не изменятся. Как правило, данная команда используется совместно с одной из команд условного перехода.
CPSE Rd,Rr (пропуск команды при равенстве двух РОН) - сравнивает содержимое двух регистров общего назначения Rr и Rd и пропускает следующую команду, если в регистрах записаны одинаковые значения.
SBRC Rr,b (пропустить команду, если разряд РОН сброшен) – проверяет состояние разряда b регистра общего назначения Rr. Если разряд сброшен, команда, следующая за SBRC Rr,b, пропускается.
SBRS Rr,b (пропустить команду, если разряд РОН установлен) - проверяет состояние разряда b регистра общего назначения Rr. Если разряд установлен, команда, следующая за SBRC Rr,b, пропускается.
BRBC s,k (переход, если разряд регистра SREG сброшен) – условный относительный переход. Проверяет заданный разряд регистра SREG и выполняет переход, если этот разряд сброшен. Величина смещения k представляется числом в дополнительном коде.
BRBS s,k (переход, если разряд регистра SREG установлен) - условный относительный переход. Проверяет заданный разряд регистра SREG и выполняет переход, если этот разряд установлен. Величина смещения k представляется числом в дополнительном коде.
BRCS k (переход по переносу) - условный относительный переход. Проверяет флаг переноса (С) и выполняет переход, если этот разряд установлен. Величина смещения k представляется числом в дополнительном коде. Эквивалентна команде BRBS 0,k.
BRCC k (переход, если не было переноса) - условный относительный переход. Проверяет флаг переноса (С) и выполняет переход, если этот разряд сброшен. Величина смещения k представляется числом в дополнительном коде. Эквивалентна команде BRBС 0,k.
Здесь были приведены некоторые команды условных переходов. Действие остальных команд аналогично приведенным, только ставятся другие условия (содержимое флагов регистра статутса SREG, содержимое разряда регистра ввода/вывода и т.д.).
Организация условных переходов в микроконтроллере осуществляется с помощью регистра статуса SREG. Регистр статуса SREG имеет восемь разрядов, каждый из которых устанавливается по определенному правилу в соответствии с выполнением микроконтроллером последней команды. Этими разрядами являются:
1. Флаг I: Флаг общего разрешение прерываний. Для разрешения прерываний этот бит должен быть установлен в единицу. Управление отдельными прерываниями производится регистрами маски прерываний - EIMSK и TIMSK. Если флаг сброшен (0), независимо от состояния EIMSK/TIMSK прерывания запрещены. Флаг I очищается аппаратно после входа в прерывание и восстанавливается командой RETI, для разрешения обработки последующих прерываний.
2. Флаг T: Пользовательский флаг. Команды копирования битов BLD (Bit LoaD) и BST (Bit STore) используют этот флаг как источник и приемник обрабатываемого бита. Бит из регистра регистрового файла может быть скопирован в T командой BST, значение флага T может быть скопировано в бит регистрового файла командой BLD.
3. Флаг H: Флаг половинного переноса. Этот флаг индицирует перенос из младшей половины байта при некоторых арифметических операциях.
4. Флаг S: Флаг знака, S = N XOR V. Флаг S всегда равен исключающему ИЛИ между флагами N (отрицательный результат) и V (переполнение дополнения до двух).
5. Флаг V: Флаг переполнения дополнения до двух. Этот флаг поддерживает арифметику с дополнением до двух.
6. Флаг N: Флаг отрицательного результата. Этот флаг индицирует отрицательный результат различных арифметических и логических операций.
7. Флаг Z: Флаг нулевого результата. Этот флаг индицирует нулевой результат различных арифметических и логических операций.
8. Флаг C: Флаг переноса. Этот флаг индицирует перенос в арифметических и логических операциях.
JMP k (абсолютный безусловный переход ) – инструкция абсолютного перехода JMP на метку процедуры обработки сброса. Если в программе не используются источники прерывания, то векторы прерываний не используются, а зарезервированные под них ячейки памяти могут использоваться для равномерного расположения кода программы. Имеется также случай, когда вектор сброса расположен в секции прикладной программы, а векторы прерываний находятся в загрузочном секторе или наоборот
RJMP k (относительный безусловный переход) – команда относительного безусловного перехода. Выполняет переход по адресу, равному сумме содержимого счетчика команд и константе k. На практике вместо числовых значений смещения используется метка.
IJMP (косвенный переход) – косвенный безусловный переход. Выполняет переход по адресу, находящемуся в регистре Z.
Команды связи с подпрограммой
Учитывая ограниченные возможности памяти микроконтроллера при разработке программ, нужно стараться сделать их как можно короче. С этой целью часть программы, которая неоднократно повторяется, или программа, которая часто используется, могут быть оформлены в виде подпрограмм – последовательностей команд, выполнение которых может быть вызвано из любого места программы любое количество раз. Процесс передачи управления к подпрограмме называется вызовом.
Команды вызова подпрограммы (RCALL,CALL,ICALL) работают практически так же, как и команды безусловного перехода. Отличие заключается в том, что перед тем как выполнить переход, значение счетчика команд сохраняется в стеке. Кроме того, подпрограмма должна заканчиваться командой RET, как показано в следующем примере:
…
rcall SP_TEST ;вызов подпрограммы “SP_TEST”
… ;текст основной программы
…
SP_TEST push r2 ;метка подпрограммы, сохранить r2 в стеке
… ;выполнение подпрограммы
…
pop r2 ;восстановить r2 из стека
ret ;возврат из подпрограммы
RCALL k (относительный вызов подпрограммы) – выполняет переход к подпрограмме, адрес которой получается сложением счетчика команд с константой k. Адрес следующей за RCALL команды (2 байта) сохраняется в стеке. На практике вместо числовых значений смещения используется метка.
ICALL (косвенный вызов подпрограммы) - выполняет переход к подпрограмме, адрес которой находится в регистре Z. Адрес следующей за ICALL команды (2 байта) сохраняется в стеке.
CALL – (длинный вызов подпрограммы)-Выполняет вызов подпрограммы из памяти программ. Адрес возврата (к команде после CALL) сохраняется в стеке. (См. также RCALL). Пример: mov r16, r0 ; Копировать r0 в r16 call check ; Вызвать подпрограмму nop ; Продолжать (пустая операция) . . . check: cpi r16, $42 ; Проверить содержит ли r16 заданное значение breq error ; Перейти если содержит ret ; Вернуться из подпрограммы . . . error: rjmp error ; Бесконечная петля
RET (возврат из подпрограммы) – выполняет возврат в то место, откуда подпрограмма была вызвана.
RETI (возврат из подпрограммы обработки прерывания) - выполняет возврат в то место, в котором выполнение программы a было прервано в результате возникновения прерывания.
Обратите внимание, что контекст программы (регистр состояния SREG) не сохраняется при вызове подпрограммы обработки прерывания и, соответственно, не восстанавливается при выходе из нее. В связи с этим сохранение и восстановление этого регистра необходимо выполнять самостоятельно.
Пример программы
Описание алгоритма программы (рис. 3.9)
Далее предложен пример программы организации работы команд пересылки и передачи управления. Программа состоит из основной программы и подпрограммы, которая вызывается из основной. В начале основной программы регистрам присваиваются символьные имена, инициализируется стек, регистры загружаются числовыми значениями и пересылаются в оперативную память МК. Далее последовательно расположены три цикла. Выход из каждого цикла последует после равенства двух переменных, одна из которых убывает до значения второй. В подпрограмме применяются команды сохранения регистра общего назначения r16 (temp0) и состояния SREG. До выхода из подпрограммы эти регистры снова загружаются первоначальными значениями. После подпрограммы цикл выполнения программы повторяется.
На рисунке 3.9 алгоритм программы организации работы команд пересылки и передачи управления

Рис. 3.9 - алгоритм программы
Листинг программы №3
; BASIC .ASM template file for AVR
; ******************************************************
; Define here the variables
;
.include "C:\VMLAB\include\m128def.inc""; определение библиотеки МК ;ATmega128, при условии расположения программы VMLAB на ;локальном диске С
;Основная программа
;Запись символьных имен
.DEF temp0=r16
.DEF temp1=r17
.DEF temp2=r18
reset: ; начальная метка
rjmp start; Переход на начало основной программы
reti ; Addr $01
reti ; Addr $02
reti ; Addr $03 Вектора прерываний МК ATmega128.
reti ; Addr $04 Приведены вектора с адреса $01 по адрес $10.
reti ; Addr $05 Полностью вектора прерываний представлены
reti ; Addr $06 в приложении с назначением прерываний
reti ; Addr $07 (внешних и внутренних).
reti ; Addr $08
reti ; Addr $09
reti ; Addr $0A
reti ; Addr $0B
reti ; Addr $0C
reti ; Addr $0D
reti ; Addr $0E
reti ; Addr $0F
reti ; Addr $10
start: ldi r16,$DF ;Инициализация стека (старший байт)
out SPH,temp0
ldi temp0,$11 ;Загрузить переменные значениями
ldi temp1,$18
ldi temp2,$0A
sts $60,temp1 ;Записать переменные в память по адресу $60
sts $61,temp2
M1: dec temp1 ;Декремент temp1
cp temp0,temp1 ;Если temp0 не равно temp1, то
brne M1 ;перейти на метку М1
lds temp1,$60 ;Загрузить данные из памяти с адресом $60
M2: dec temp1 ;Декремент temp1
cp temp0,temp1 ;Если temp0 не равно temp1, то
brbc $1,M2 ;перейти на метку М2
lds temp1,$60 ;Загрузить данные из памяти с адресом $60
M3: dec temp1 ;Декремент temp1
cpi temp1,$11 ;Если temp1 не равно $11, то
brne M3 ;перейти на метку М3
rcall Load ;Вызвать подпрограмму Load
rjmp M1 ;Перейти на метку M1
;Подпрограмма
Load: push temp0 ;Поместить temp0 в стек
in temp0,SREG ;Загрузить SREG в temp0
lds temp1,$60 ;Загрузить данные из памяти с адресом $60
lds temp2,$61
sub temp2,temp1 ;Вычесть temp1 из temp2
out SREG,temp0 ;Выгрузить temp0 в SREG
pop temp0 ;Загрузить temp0 из стека
reti ;Выход из подпрограммы
Команды:
BRNE - переход если неравно
PUSH - записать в стек
POP - прочитать из стека.
Листинг проектного файла №3
.MICRO "ATmega128" ; Указание типа микроконтроллера ;(ATmega128)
.PROGRAM " Project3.asm" ; Ассемблируемый файл
.TARGET " Project3.hex" ; Файл машинного кода
.TRACE ; Включение трассировки
.POWER VDD=5 VSS=0 ; Задание напряжения питания 5 В
.CLOCK 4meg ; Задание тактовой частоты работы ;микроконтроллера
.STORE 250m ; Время регенерации сигнала осциллографа
