mps
.docxФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ
Федеральное Государственное образовательное бюджетное учреждение высшего профессионального образования (ФГОБУ ВПО)
Московский технический университет связи и информатики
Кафедра математической кибернетики и информационных технологий
Контрольная работа
по дисциплине:
«Микропроцессорные устройства»
Выполнил: студент группы 2БВМ15025, Иванюк П. Г.
Проверил: преподаватель Кириллова Л. В.
Москва 2018
Цель работы: приобретение практических навыков проектирования цифровых устройств на основе микроконтроллеров.
Исходная программа на ассемблере по заданию для демонстрации работы микроконтроллера на AVR симуляторе в среде разработки
AVR Studio 4.
;Программа для AVR RISC микроконтроллера по заданию дисциплины МПС в МТУСИ
.device AT90S8515 ;сообщает ассемблеру о типе микроконтроллера
.def X1 = r22 ;присвоить регистру r22 имя X1
.cseg ;начало сегмента кода
.org $00 ;устанавливает счётчик адреса в сегменте кода на адрес $00
clr r26 ;устанавливает в r26 0 (младший байт адреса указателя X)
ldi r27,$01 ;заносит в r27 старший байт указателя X
ldi r30,$0A ;заносит в r30 младший байт указателя Z
ldi r31,$01 ;заносит в r31 старший байт указателя Z
ldi r17,$0A ;заносит в r17 (счётчик цикла) число элементов массива
ldi r19,$3A ;загружает в r19 1-й элемент массива
St X+,r19 ;пересылает содержимое r19 в память.
ldi r19,$1D ;
St X+,r19 ;
ldi r19, $23 ;
St X+,r19 ;
ldi r19,$52 ;
St X+,r19 ;
ldi r19,$05 ;
St X+,r19 ;
ldi r19,$37 ;
St X+,r19 ;
ldi r19,$4E ;
St X+,r19 ;
ldi r19,$2C ;
St X+,r19 ;
ldi r19,$3A ;
St X+,r19 ;
ldi r19,$4D ;
St X+,r19 ;
Subi r26,$09 ;восстанавливает в X адрес А0
Cycl:
ld r2,X+ ;пересылает в r2 из памяти i-й элемент массива Ai
Mov r3,r2 ;пересылает Ai в r3 на хранение
Lsl r2 ;удвоение Ai
Add r2,r3 ;вычисление 3Ai
St Z+,r2 ;сохранение Yi в памяти
Dec r17 ;уменьшение счётчика цикла на 1
Brne cycl ;переход к метке cycl, если результат в r17 не равен 0;
ret ;выход из программы
Данная программа выполняет заполнение памяти SRAM МК произвольными, константными числами. Затем, циклически, выполняет чтение записанных чисел и переписывает их в ячейки SRAM МК по другим адресам.
При прошивке этой программы на реальный МК невозможно визуально наблюдать его работу.
В следующую программу внесены изменения для вывода данных, которые считываются из SRAM в цикле, на внешний, 8-миразрядный порт. Для визуализации работы МК необходимо подключить к его выходному порту восемь светодиодов, которые будут моргать примерно один раз в секунду.
Изменённая программа на ассемблере для демонстрации работы микроконтроллера на реальной схеме.
;Программа для AVR RISC микроконтроллера по заданию дисциплины МПС в МТУСИ
.nolist ;отключить вывод в файл списка
.include "8515def.inc" ;подключает файл с названиями всех регистров МК
.list ;включить вывод в файл списка
.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 ;Настроить все разряды порта A на выход
out DDRA,x1 ;
ldi x1,$00 ;
out PORTA,x1 ;Все разряды порта A выключены
ldi x1,$FF ;Настроить все разряды порта B на выход
out DDRB,x1 ;
ldi x1,$00 ;
out PORTB,x1 ;Все разряды порта B выключены
ldi x1,$FF ;Настроить все разряды порта C на выход
out DDRC,x1 ;
ldi x1,$00 ;
out PORTC,x1 ;Все разряды порта C выключены
ldi x1,$FF ;Настроить все разряды порта D на выход
out DDRD,x1 ;
ldi x1,$00 ;
out PORTD,x1 ;Все разряды порта D выключены
clr r26 ;устанавливает в r26 0 (младший байт адреса указателя X)
ldi r27,$01 ;заносит в r27 старший байт указателя X
ldi r30,$0A ;заносит в r30 младший байт указателя Z
ldi r31,$01 ;заносит в r31 старший байт указателя Z
ldi r19,$3A ;загружает в r19 1-й элемент массива
St X+,r19 ;пересылает содержимое r19 в память.
ldi r19,$1D ;
St X+,r19 ;
ldi r19, $23 ;
St X+,r19 ;
ldi r19,$52 ;
St X+,r19 ;
ldi r19,$05 ;
St X+,r19 ;
ldi r19,$37 ;
St X+,r19 ;
ldi r19,$4E ;
St X+,r19 ;
ldi r19,$2C ;
St X+,r19 ;
ldi r19,$3A ;
St X+,r19 ;
ldi r19,$4D ;
St X+,r19 ;
Subi r26,$09 ;восстанавливает в X адрес А0
main:
ldi r17,$0A ;заносит в r17 (счётчик цикла) число элементов массива
Cycl:
ld r2,X+ ;пересылает в r2 из памяти i-й элемент массива Ai
Mov r3,r2 ;пересылает Ai в r3 на хранение
Lsl r2 ;удвоение Ai
Add r2,r3 ;вычисление 3Ai
St Z+,r2 ;сохранение Yi в памяти
out PORTA,r2 ;Вывести записанный в SRAM байт в порт A
rcall delay ;Выполнить задержку в одну секунду
Dec r17 ;уменьшение счётчика цикла на 1
Brne cycl ;переход к метке cycl, если результат в 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 ;выход из программы