- •Кузнецов в.Н., Лисютченков с.Н. Цифровые и микропроцессорные устройства
- •Часть 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 Контрольные вопросы
- •Приложение
- •Список литературы
6.2.7 Обращение к портам ввода/вывода
К командам ввода/вывода микроконтроллера ATmega128 относятся команды IN и OUT. При выполнении команды IN (загрузить данные из порта ввода/вывода в регистр) команда загружает данные из пространства ввода/вывода (порты, таймеры, регистры конфигурации и т.п.) в регистр Rd регистрового файла.
Пример:
in R25, $16 ; Считать порт В
cpi R25, 4 ; Сравнить считанное значение с константой
breq exit ; Перейти если R25 = 4
. . .
exit: nop ; пустая операция
При выполнении команды OUT ( записать данные из регистра в порт ввода/вывода) команда сохраняет данные регистра Rr в регистровом файле пространства ввода/вывода (порты, таймеры, регистры конфигурации и т. п.).
Пример:
clr R16 ; Очистить R16
ser R17 ; Установить все биты регистра R17
out $18, R16 ; Записать нули в порт В
nop ; Ожидать (пустая операция)
out $18, R17 ; Записать единицы в порт В
Программа №6 (организация работы с портами ввода/вывода)
Задание:
Организовать поступление в порт В последовательности сигналов: 25, 17, 32, 16, 11, 4, 42 с коэффициентом деления 3; в порт С подать сигналы: 120, 16.
Описание:
В начале программы описан включаемый файл m128def.inc, содержащий информацию о микроконтроллере ATmega128. Далее описаны переменные, то есть значению адресам регистров присвоены символические имена. В программе обращение к переменным производится по присвоенным именам. Основная часть программы начинается с таблицы переходов системы сброса и прерываний. По вектору внешнего прерывания INT0 указан переход к обработке этого прерывания.
В листинге проектного файла числа, подаваемые на порт B, записываются в двоичном виде снизу вверх.
Собственно программа начинается с адреса $10 обнулением используемых регистров и загрузкой в указатель стека исходного адреса $10(старший байт) и $E8(младший байт). Далее происходит конфигурирование портов ввода/вывода: порта В на вход (с помощью значения, занесенного в регистр r18), канала порта D PD0 на вход (установкой второго бита в значение “0”). Загрузка регистра EIMSK кодом $35 разрешает прерывания по сигналу на выводе внешнего прерывания INT0, а загрузка регистра управления микроконтроллером MCUCR кодом $35 определяет условие генерации внешнего прерывания INT0 по низкому уровню на выводе INT0. Загрузка в переменную cnt значения $8 определяет количество принимаемых сигналов на выводах порта В. Затем устанавливается общий флаг разрешения прерываний. Далее идет проверка переменной vhod на нулевое значение.
Процедура обработки внешнего прерывания (рис. 6.7) начинается с опроса порта В и занесение значения на его выводах в переменную temp2, которая следующим шагом складывается с переменной temp1, с сохранением результата в temp1. Затем проверяется переменная cnt на нуль. Если не нуль, то следующий опрос порта В. Если нуль, то выход из процедуры обработки внешнего прерывания.
После выполнения процедуры обработки от внешнего прерывания указатель выполнения программы переходит на метку Delenie, где происходит деление накопленного входного сигнала на коэффициент деления, заносимый в переменную delit. Результат деления показан в регистре r17, остаток в регистре r19. После деления, происходит настройка порта С на выход и выдача результата деления в порт С. Далее следует временная задержка (рис. 6.6) длительностью 5,5 мкс, определяемое переменной dey. Затем происходит выдача инкрементированного результата деления в порт С.(рис. 6.8) После чего, программа зацикливается на одной строке (конец программы).
Данная программа представляет работу портов ввода/вывода микроконтроллера ATmega128 в качестве портов ввода/вывода общего назначения, а также используется альтернативная функция канала порта PD0 (вход внешнего прерывания 0). Алгоритм основной программы представлен на рис. 6.9.
Рис. 6.6 Алгоритм процедуры временной задержки
Рис.6.7 Алгоритм обработки внешнего прерывания
Рис. 6.9 Алгоритм программы организации работы с портами ввода/вывода
Листинг программы №6
; BASIC .ASM template file for AVR
; ******************************************************
; Define here the variables
;
.include "C:\VMLAB\include\m128def.inc""; определение библиотеки МК ;ATmega128, при условии расположения программы VMLAB на ;локальном диске С
;Инициализация переменных
.def temp =r16 ; Изменяемое значение
.def delit =r16 ; Коэффициент деления
.def temp1 =r17 ; Изменяемое значение
.def vhod =r17 ; Делимое
.def temp2 =r18 ; Изменяемое значение
.def dcnt =r18 ; Счетчик
.def cnt =r19 ; Счетчик
.def ostat =r19 ; Остаток
.def per =r20 ; Переменная выхода
.def dey =r21 ; Переменная задержки
; Основная программа
.ORG $0 ; Начало таблицы переходов
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
.ORG $02 ; Вектор от внешнего прерывания INT0
rjmp Prer ; Переход на обработку внешнего прерывания
.ORG $10 ; Начальный адрес основной программы
start:
clr temp1 ; Очистка регистров
clr temp
clr temp2
clr cnt
clr per
ldi temp,$10 ; Инициализация стека
out SPH,temp
ldi temp,$E8 ; Инициализация стека
out SPL,temp
out DDRB,temp2 ; Настройка порта В на вход
cbi DDRD,0 ; Настройка канала порта D PD0 на вход
ldi temp,$39
out EIMSK,temp ; Установка флага разрешения внешнего ;прерывания
ldi temp,$35
out MCUCR,temp ; Условие генерации внешнего прерывания
; (по низкому уровню на выводе INT0)
ldi cnt,8 ; Загрузка количества значений, принимаемых в порт ;В
clr temp1 ; Очистка регистра
sei ; Разрешить все прерывания
; Ожидание внешнего прерывания
m2: tst vhod ; Проверка регистра на нулевое значение
brne Delenie ; Переход, если значение регистра не нуль
rjmp m2
Delenie: ldi delit,3 ; Загрузка значения коэффициента деления
sub ostat,ostat ; Очистить остаток и перенос
ldi dcnt,9 ; Инициализировать счетчик цикла
d8u_1: rol vhod ; Делимое/результат сдвинуть влево
dec dcnt ; Уменьшить на единицу счетчик цикла
brne d8u_2 ; Переход, если не ноль
rjmp m3 ; Выход из подпрограммы
d8u_2: rol ostat ; Остаток сдвинуть влево
sub ostat,delit ; Остаток = остаток - коэффициент деления
brcc d8u_3 ; Если результат < 0,
add ostat,delit ; восстановить остаток
clc ; Сбросить перенос для формирования результата
rjmp d8u_1 ; иначе
d8u_3: sec ; установить перенос для формирования результата
rjmp d8u_1 ; Вернуться назад
m3: ldi temp,$3f ; Настройка порта С на выход
out DDRC,temp
out PORTC,vhod ; Вывод сигнала в порт С
rcall Delay ; Вызов процедуры задержки
inc vhod ; инкремент переменной vhod
out PORTC,vhod ; Вывод сигнала в порт С
ldi per,120
rcall P_peres
ldi per,16
rcall P_peres
rjmp finish
; Процедура обработки внешнего прерывания
Prer:
m1: in temp2,PINB ; Опрос порта В
add temp1,temp2 ; Сложение регистров
dec cnt ; Уменьшение счетчика на один
brne m1 ; Переход, если не нуль
ret ; Возврат из процедуры
; Процедура последовательной пересылки в канал порта С PC0
P_peres: ldi cnt,$8 ; Загрузка счетчика пересылаемых бит
r1: rol per ; Сдвигаем per влево с переносом, чтобы
; определить "0" или "1"
brcs p1 ; Если бит равен "1", то переход на метку p1
cbi PORTC,0 ; Если бит равен "0", то вывод "0" в PC0
sbic PORTC,0 ; Пропуск, если бит равен "0"
p1:sbi PORTC,0 ; Если бит равен "1", то вывод "1" в PC0
r3:dec cnt ; Декремент счетчика
brne r1 ; Если не равно нулю, то переход на r1
ret ; Выход из процедуры
; Процедура задержки
Delay:
ldi dey,$5 ; Временная задержка на 5,5 мкс
d1: dec dey
brne d1
ret ; Выход из процедуры
finish:
.exit
Листинг проектного файла №6
.MICRO "ATmega128" ; Указание типа микроконтроллера (ATmega128)
.PROGRAM "port.asm" ; Ассемблируемый файл
.TARGET "port.hex" ; Файл машинного кода
.TRACE ; Включение трассировки
.POWER VDD=5 VSS=0 ; Power nodes
.CLOCK 4meg ; Micro clock
.STORE 250m ; Trace (micro+signals) storage time
K0 pd0 GND ; Подключение ключа между PD0 и "землей"
P0 NRZ(1.25u) pb0 KEY_0 "11111100" ; Генерация сигнала на вход PB0
P1 NRZ(1.25u) pb1 KEY_0 "10000000" ; Генерация сигнала на вход PB1
P2 NRZ(1.25u) pb2 KEY_0 "00001000" ; Генерация сигнала на вход PB2
P3 NRZ(1.25u) pb3 KEY_0 "00001000" ; Генерация сигнала на вход PB3
P4 NRZ(1.25u) pb4 KEY_0 "11000000" ; Генерация сигнала на вход PB4
P5 NRZ(1.25u) pb5 KEY_0 "00000000" ; Генерация сигнала на вход PB5
P6 NRZ(1.25u) pb6 KEY_0 "00000000" ; Генерация сигнала на вход PB5
P7 NRZ(1.25u) pb7 KEY_0 "00000000" ; Генерация сигнала на вход PB5
.PLOT v(pd2)v(pb0)v(pb1)v(pb2)v(pb3)v(pc5) v(pc4)v(pc3)v(pc2)v(pc1)v(pc0)
; Вывод на осциллограф сигналов с каналов портов PB0, PB1, PB2, PB3, ;PD2, PC5, РС4, РС3, РС2, РС1, РС0