mps6
.docxФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ
Федеральное Государственное образовательное бюджетное учреждение высшего профессионального образования (ФГОБУ ВПО)
Московский технический университет связи и информатики
Кафедра математической кибернетики и информационных технологий
Курсовая работа
по дисциплине:
«Микропроцессорные устройства»
Выполнил: студент группы
Проверил: преподаватель Кириллова Л. В.
Москва 2018
Цель работы:
Приобретение практических навыков проектирования цифровых устройств на основе микроконтроллеров.
Задание № 6.
Требуется разработать устройство, которое реализует следующие функции:
- вводит m однобайтных слов;
- формирует для каждого слова признак чётности;
- заносит его в n – й (n = 7) разряд того же слова.
Программа выполнена на языке ассемблер в среде разработки AVR Studio 4.
Программа выполняет заполнение блока памяти SRAM микроконтроллера числами с произвольным количеством логических единиц. Циклически, выполняет чтение каждого записанного числа, вычисляет для него признак чётности и переписывает их в другой блок памяти SRAM. Затем выполняется вывод получены данных из SRAM на внешний 8-миразрядный порт А микроконтроллера для визуализации результата.
Для визуализации работы микроконтроллера необходимо подключить к его внешнему порту А восемь светодиодов, которые будут моргать примерно один раз в секунду.
Алгоритм программы, реализующей заданные функции
Программа на языке ассемблер
;Программа для AVR RISC микроконтроллера по заданию 6
;дисциплины Микропроцессорные системы в МТУСИ
.nolist ;Отключить вывод в файл списка
.include "8515def.inc" ;Подключает файл с названиями всех регистров МК
.list ;Включить вывод в файл списка
.def buffer = r16 ;Присвоить регистру r16 имя buffer
.def temp = r18 ;Присвоить регистру r18 имя temp
.def count = r17 ;Присвоить регистру r17 имя count
.def binary = r19 ;Присвоить регистру r19 имя binary
.def parity = r21 ;Присвоить регистру r21 имя parity
.def number = r25 ;Присвоить регистру r25 имя number
.def x1 = r22 ;Присвоить регистру r22 имя x1
.def loop1 = r20 ;Младший регистр счётчика задержки
.def loop2 = r23 ;Средний регистр счётчика задержки
.def loop3 = r24 ;Старший регистр счётчика задержки
.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,$6A ;Ввести в память SRAM n однобайтных чисел
st X+,temp ;через временный регистр
ldi temp,$04 ;
st X+,temp ;
ldi temp,$12 ;
st X+,temp ;
ldi temp,$4C ;
st X+,temp ;
ldi temp,$55 ;
st X+,temp ;
ldi temp,$37 ;
st X+,temp ;
ldi temp,$77 ;
st X+,temp ;
ldi temp,$7F ;
st X+,temp ;
subi XL,8 ;Восстановить в X адрес $0000
ldi temp,$80 ;Задать константу для операции сложения по модулю (XOR)
ldi number,8 ;Занести в r25 счётчик количества байт
common:
mov parity,temp ;Задать исходное значение чётности равное единице
ldi count,8 ;Занести в r17 счётчик цикла количество бит в байте
ld binary,X+ ;
mov buffer,binary ;
cycle:
clc ;Сбросить флаг переноса
lsl binary ;Сдвинуть влево
brcc cycle2 ;
eor parity,temp ;
cycle2:
dec count ;Уменьшить счётчик цикла на 1
brne cycle ;Переход к метке cycle, если результат в r17 не равен 0
or buffer,parity ;
st Z+,buffer ;
dec number ;
brne common ;
main:
subi ZL,8 ;Восстановить в Z адрес $010A
ldi count,8 ;Заносит в 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 ;Выход из программы
Принципиальная схема микроконтроллерного устройства