mps7
.docxФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ
Федеральное Государственное образовательное бюджетное учреждение высшего профессионального образования (ФГОБУ ВПО)
Московский технический университет связи и информатики
Кафедра математической кибернетики и информационных технологий
Курсовая работа
по дисциплине:
«Микропроцессорные устройства»
Выполнил: студент группы
Проверил: преподаватель Кириллова Л. В.
Москва 2018
Цель работы:
Приобретение практических навыков проектирования цифровых устройств на основе микроконтроллеров.
Задание № 7.
Требуется разработать устройство, которое реализует следующие функции:
- преобразует, хранящиеся в памяти, числа в упакованном формате, в ASCII код;
- выводит в порт.
Программа выполнена на языке ассемблер в среде разработки AVR Studio 4.
Программа выполняет заполнение блока памяти SRAM микроконтроллера числами в упакованном BCD - формате. В цикле выполняет чтение записанных чисел, преобразует в ASCII код сначала старшую часть числа и выводит его на внешний 8-миразрядный порт А микроконтроллера и удерживает его на внешнем порту примерно на одну секунду. Затем преобразует в ASCII код младшую часть числа и также выводит его на внешний 8-миразрядный порт А микроконтроллера также с задержкой отображения.
Для визуализации работы микроконтроллера необходимо подключить к его внешнему порту А восемь светодиодов, которые будут моргать примерно один раз в секунду.
Алгоритм программы, реализующей заданные функции
Программа на языке ассемблер
;Программа для AVR RISC микроконтроллера по заданию 7
;дисциплины Микропроцессорные системы в МТУСИ
.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 temp,$01 ;Ввести в память SRAM n произвольных чисел
st X+,temp ;в упакованном формате через временный регистр
ldi temp,$23 ;
st X+,temp ;
ldi temp, $45 ;
st X+,temp ;
ldi temp,$67 ;
st X+,temp ;
ldi temp,$89 ;
st X+,temp ;
subi XL,5 ;Восстановить в X адрес $0000
main:
ldi count,5 ;Заности в r17 (счётчик цикла) число элементов массива
cycle:
ld temp,X+ ;Пересылать в r2 из первого блока памяти первую цифру
mov buffer,temp ;Сохранить считанное число в дополнительном регистре
swap temp ;Перености первую цифру из старшей тетрады в младшую
andi temp,$0F ;Выделить младшую тетраду
ori temp,$30 ;Преобразовать цифру в ASCII код
out PORTA,temp ;Вывести полученную цифру в порт A
nop ;Дополнительный такт чтобы данные появились на выходе
rcall delay ;Выполнить задержку в одну секунду
andi buffer,$0F ;Выделить младшую тетраду
ori buffer,$30 ;Преобразовать цифру в ASCII код
out PORTA,buffer ;Вывести полученную цифру в порт A
nop ;Дополнительный такт чтобы данные появились на выходе
rcall delay ;Выполнить задержку в одну секунду
dec count ;Уменьшить счётчик цикла на 1
brne cycle ;Переход к метке cycle, если результат в r17 не равен 0
subi XL,5 ;Восстановить в X адрес $0100
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 ;выход из программы
Принципиальная схема микроконтроллерного устройства