Добавил:
piter-i.narod.ru Программист ПЛИС Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

mps

.pdf
Скачиваний:
11
Добавлен:
24.06.2018
Размер:
347.66 Кб
Скачать

ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ

Федеральное Государственное образовательное бюджетное учреждение

высшего профессионального образования (ФГОБУ ВПО)

Московский технический университет связи и информатики Кафедра математической кибернетики и информационных технологий

Курсовая работа

по дисциплине:

«Микропроцессорные устройства»

Выполнил: студент группы 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

Соседние файлы в предмете Микропроцессорные системы