mps
.pdfФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ
Федеральное Государственное образовательное бюджетное учреждение
высшего профессионального образования (ФГОБУ ВПО)
Московский технический университет связи и информатики Кафедра математической кибернетики и информационных технологий
Курсовая работа
по дисциплине:
«Микропроцессорные устройства»
Выполнил: студент группы 2БВМ15025, Иванюк П. Г.
Проверил: преподаватель Кириллова Л. В.
Москва 2018
Цель работы:
Приобретение практических навыков проектирования цифровых устройств на основе микроконтроллеров.
Задание № 9.
Требуется разработать устройство, которое реализует следующие функции:
-вводит n однобайтных чисел в упакованном формате;
-преобразует их в ASCII код;
-выводит полученный код в порт.
Программа выполнена на языке ассемблер в среде разработки AVR Studio 4.
Программа выполняет заполнение блока памяти SRAM
микроконтроллера числами в двоично-десятичном формате. Циклически,
выполняет чтение записанных чисел, преобразует их в ASCII код и переписывает их в другой блок памяти SRAM. Затем выполняется вывод преобразованных данных из SRAM на внешний 8-миразрядный порт А микроконтроллера.
Для визуализации работы микроконтроллера необходимо подключить к его внешнему порту А восемь светодиодов, которые будут моргать примерно один раз в секунду.
1
Алгоритм программы, реализующей заданные функции
2
Программа на языке ассемблер
;Программа для AVR RISC микроконтроллера по заданию 9 ;дисциплины Микропроцессорные системы в МТУСИ
.nolist |
;Отключить вывод в файл списка |
.include "8515def.inc" |
;Подключает файл с названиями всех регистров МК |
.list |
;Включить вывод в файл списка |
.def buffer = r2 ;Присвоить регистру r2 имя buffer
.def buff = r3 ;Присвоить регистру r3 имя buff
.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 |
|
; |
|
|
|
|
|
|
|
|
|
|
|
|
3 |
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,$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 |
|
ldi count,5 ;Заности в r17 (счѐтчик цикла) число элементов массива |
||
cycle: |
|
|
ld temp,X |
|
;Пересылать в r2 из первого блока памяти первую |
цифру
swap temp ;Перености первую цифру из старшей тетрады в младшую andi temp,$0F ;Выделить младшую тетраду
ori temp,$30 ;Преобразовать цифру в ASCII код st Z+,temp ;Занести цифру в другой блок памяти
ld temp,X+ ;Пересылать в r2 из первого блока памяти вторую цифру,
увеличив адрес
andi temp,$0F ;Выделить младшую тетраду
4
ori temp,$30 ;Преобразовать цифру в ASCII код st Z+,temp ;Занести цифру в другой блок памяти dec count ;Уменьшить счѐтчик цикла на 1
brne cycle ;Переход к метке cycle, если результат в r17 не равен
0
main:
subi ZL,10 ;Восстановить в Z адрес $010A
ldi count,10 ;Заносит в 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 |
;выход из программы |
5
Принципиальная схема микроконтроллерного устройства
6