mpss
.docxФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ
Федеральное Государственное образовательное бюджетное учреждение высшего профессионального образования (ФГОБУ ВПО)
Московский технический университет связи и информатики
Кафедра математической кибернетики и информационных технологий
Курсовая работа
по дисциплине:
«Микропроцессорные устройства»
Выполнил: студент группы
Проверил: преподаватель Кириллова Л. В.
Москва 2018
Цель работы:
Приобретение практических навыков проектирования цифровых устройств на основе микроконтроллеров.
Задание
Требуется разработать устройство, которое реализует следующие функции:
- хранит массив m однобайтных двоичных чисел;
- числа меньше 99(десятичной системы) преобразует в ASCII код и выводит в порт
Программа выполнена на языке ассемблер в среде разработки AVR Studio 4.
Программа выполняет заполнение блока памяти SRAM микроконтроллера произвольными числами. Циклически, выполняет чтение записанного числа, проверяет, что оно меньше 99 преобразовывает его в ASCII код и записывает его в другой блок памяти SRAM. Затем выполняется вывод получены данных из SRAM на внешний 8-миразрядный порт А микроконтроллера для визуализации результата.
Для визуализации работы микроконтроллера необходимо подключить к его внешнему порту А восемь светодиодов, которые будут моргать примерно один раз в секунду.
Алгоритм программы, реализующей заданные функции
Программа на языке ассемблер
;Программа для AVR RISC микроконтроллера по заданию
;дисциплины Микропроцессорные системы в МТУСИ
.nolist ;Отключить вывод в файл списка
.include "8515def.inc" ;Подключает файл с названиями всех регистров МК
.list ;Включить вывод в файл списка
.def buffer = r21 ;Присвоить регистру r21 имя buffer
.def count = r17 ;Присвоить регистру r22 имя count
.def temp = r19 ;Присвоить регистру r22 имя temp
.def x1 = r22 ;Присвоить регистру r22 имя x1
.def loop1 = r16 ;Младший регистр счётчика задержки
.def loop2 = r18 ;Средний регистр счётчика задержки
.def loop3 = r20 ;Старший регистр счётчика задержки
.cseg ;Начало сегмента кода
.org $000 ;Установить счётчик адреса в сегменте кода на адрес $000
rjmp RESET ;Обработчик вектора сброса
reti ;rjmp EXT_INT0 ;Обработчик IRQ0
reti ;rjmp EXT_INT1 ;Обработчик IRQ1
reti ;rjmp TIM1_CAPT ;Обработчик таймер1 захват
reti ;rjmp TIM1_COMPA ;Обработчик таймер1 сравнение в канале А
reti ;rjmp TIM1_COMPB ;Обработчик таймер1 сравнение в канале В
reti ;rjmp TIM1_OVF ;Обработчик по переполнению в таймер1
reti ;rjmp TIM0_OVF ;Обработчик по переполнению в таймер0
reti ;rjmp SPI_STC ;Обработчик по завершению передачи по SPI
reti ;rjmp UART_RXC ;Обработчик по завершению приёма UART
reti ;rjmp UART_DRE ;Обработчик если пустой UDR
reti ;rjmp UART_TXC ;Обработчик по завершению передачи UART
reti ;rjmp ANA_COMP ;Обработчик аналогового компаратора
RESET:
ldi YH,high(RAMEND) ;Установить вершину стека на конец SRAM
out SPH,YH ;
ldi YL,low(RAMEND) ;
out SPL,YL ;
ldi x1,$FF ;
out DDRA,x1 ;Настроить все разряды порта A на выход
out DDRB,x1 ;Настроить все разряды порта B на выход
out DDRC,x1 ;Настроить все разряды порта C на выход
out DDRD,x1 ;Настроить все разряды порта D на выход
ldi x1,$00 ;
out PORTA,x1 ;Все разряды порта A выключены
out PORTB,x1 ;Все разряды порта B выключены
out PORTC,x1 ;Все разряды порта C выключены
out PORTD,x1 ;Все разряды порта D выключены
ldi XH,high($0100) ;Занести в r27 старший байт указателя X
ldi XL,low($0100) ;Занести в r26 младший байт адреса указателя X
ldi ZL,low($010A) ;Занести в r30 младший байт указателя Z
ldi ZH,high($010A) ;Занести в r31 старший байт указателя Z
ldi temp,100 ;Ввести в память SRAM n произвольных чисел
st X+,temp ;в упакованном формате через временный регистр
ldi temp,5 ;
st X+,temp ;
ldi temp, 200 ;
st X+,temp ;
ldi temp,9 ;
st X+,temp ;
ldi temp,8 ;
st X+,temp ;
subi XL,5 ;Восстановить в X адрес $0000
ldi count,5 ;Заности в r17 (счётчик цикла) число элементов массива
cycle:
ld buffer,X+ ;Пересылать в r21 из первого блока памяти вторую цифру, увеличив адрес
mov temp,buffer ;Скопировать прочитанное число
subi temp,99 ;Проверить число
brcc next ;Если больше 99 то считать следующее число
ori buffer,$30 ;Преобразовать цифру в ASCII код
st Z+,buffer ;Занести цифру в другой блок памяти
next:
dec count ;Уменьшить счётчик цикла на 1
brne cycle ;Переход к метке cycle, если результат в r17 не равен 0
main:
subi ZL,3 ;Восстановить в Z адрес $010A
ldi count,3 ;Заносит в r17 (счётчик цикла) число элементов нового массива
output:
ld temp,Z+ ;Прочитать цифру из SRAM во временный регистр
out PORTA,temp ;Вывести полученную цифру в порт A
nop ;Дополнительный такт чтобы данные появились на выходе
rcall delay ;Выполнить задержку в одну секунду
dec count ;Уменьшить счётчик цикла на 1
brne output ;Переход к метке output, если результат в r17 не равен 0
rjmp main ;Повтор вывода в порт А пока включено электропитание
delay:
ldi loop1,6 ;Цикл задержки = 1,000637 секунды при f = 1 мГц
z1:
ldi loop2,218 ;
z2:
ldi loop3,254 ;
z3:
dec loop3 ;
brne z3 ;
dec loop2 ;
brne z2 ;
dec loop1 ;
brne z1 ;
ret ;выход из программы
Принципиальная схема микроконтроллерного устройства