close

Вход

Забыли?

вход по аккаунту

?

отчет лаба4

код для вставкиСкачать
Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования "Вологодский государственный технический университет"
Кафедра ИСиТ
Микропроцессорные системы
Лабораторная работа №4
Система прерываний AVR-микроконтроллеров. Программирование внешних прерываний.
Выполнили:
студенты группы ИТ-41
Кушева Анна
Логинова Юлия
Проверил:
преподаватель
Кузнецов М.С.
Вологда
2012
Задание 1: Написать программу, осуществляющую вывод содержимого ячейки памяти с адресом $100 на порт C при любом изменении сигнала на выводах внешних прерываний INT0 и INT1.
;Лабораторная работа №4. ;Микропроцессорные системы.
;Мой четвертый проект в AVR Studio 4.12
.include "m16def.inc" ;Подключение файла для м.к. ATmega16
.dseg
.org $0100
Var1Task1: .byte 1
.cseg ;Переход в сегмент программного кода
.org $0000 ;Установка адреса
jmp Start ;Переход на начало основной программы
;
;В следующих лабораторных работах по адресам с $0002
;по INT_VECTORS_SIZE будут находиться вектора прерываний!
;
;Константа INT_VECTORS_SIZE = 42($2A) и определена в m16def.inc!
.org $0002
jmp ExtInt0
.org $0004
jmp ExtInt1
;
.org INT_VECTORS_SIZE
Start: ;Основноя программа
cli ;Глобальное запрещение прерываний!
;Инициализация работы микроконтроллера (WatchDog, стек):
;Отмена работы сторожевого таймера:
wdr
ldi R16, 0b00011000
out WDTCR, R16 ;Установка битов WDTOE и WDE в рег. WDTCR
ldi R16, 0b00010000 out WDTCR, R16 ;Очистка бита WDE в рег. WDTCR
;Установка указателя стека:
ldi R16, Low (RamEnd) ;Константа RamEnd определена в m16def.inc
ldi R17, High(RamEnd)
out SPL, R16 ;SPL и SPH - регистры указателя стека. out SPH, R17 ;Адреса SPL и SPH определены в m16def.inc.
;Отмена работы сторожевого таймера и установка указателя стека
;необходимы для всех последующих программ!
;Задание 1
;Настройка порта C на вывод данных
ldi R16, 0b11111111 ;вывод первоначальных данных
out PortC, R16
ldi R16, 0b11111111 ;настройка на вывод
out DDRC, R16
ldi R16, $01
sts Var1Task1, R16
;Настройка внешних прерываний:
;Настройка INT0 и INT1 по заднему (спадающему) фронту сигнала:
ldi R16, 0b00001010
out MCUCR, R16
;Сброс флагов событий внешних прерываний INTF0,INTF1:
ldi R16, 0b11000000 ;Сброс выполняется записью лог."1"
out GIFR, R16
;Разрешение внешних прерываний INT0,INT1:
ldi R16, 0b11000000
out GICR, R16
;
sei ;Глобальное разрешение прерываний!
Cycle: ;Бесконечный цикл:
nop
nop
rjmp Cycle
;
;Подпрограммы внешних прерываний INT0 и INT1:
ExtInt0:
lds R16, Var1Task1
com R16 out PortC, R16
reti
ExtInt1:
lds R16, Var1Task1
com R16 out PortC, R16
reti
Задание 2: Проверить работу программы задания №1 на симуляторе. При вызове прерываний проконтролировать изменение: флагов событий прерываний INTF0 и INTF1 регистра GIFR, флагов масок прерываний INT0 и INT1 регистра GICR, флага I регистра SREG, указателя стека в регистрах SPL и SPH, области стека в памяти данных SRAM, программного счетчика PC, а также ход выполнения программы.
Задание 3: Написать программу, подсчитывающую число нажатий клавиш, подключенных к входам внешних прерываний INT0, INT1 и INT2. Количество вызовов прерываний INT0 и INT2 выводить на порт A, количество прерываний INT1 - на порт C. Все прерывания настроить по спадающему фронту сигнала.
;Лабораторная работа №4. ;Микропроцессорные системы.
;Мой четвертый проект в AVR Studio 4.12
.include "m16def.inc" ;Подключение файла для м.к. ATmega16
.dseg
.org $0100
Var1Task2: .byte 1
.org $0110
Var2Task2: .byte 1
.org $0120
Var3Task2: .byte 1
.cseg ;Переход в сегмент программного кода
.org $0000 ;Установка адреса
jmp Start ;Переход на начало основной программы
.org $0002
jmp ExtInt0
.org $0004
jmp ExtInt1
.org $0024
jmp ExtInt2
;
.org INT_VECTORS_SIZE
Start: ;Основноя программа
cli ;Глобальное запрещение прерываний!
;Отмена работы сторожевого таймера:
wdr
ldi R16, 0b00011000
out WDTCR, R16 ;Установка битов WDTOE и WDE в рег. WDTCR
ldi R16, 0b00010000 out WDTCR, R16 ;Очистка бита WDE в рег. WDTCR
;Установка указателя стека:
ldi R16, Low (RamEnd) ;Константа RamEnd определена в m16def.inc
ldi R17, High(RamEnd)
out SPL, R16 ;SPL и SPH - регистры указателя стека. out SPH, R17 ;Адреса SPL и SPH определены в m16def.inc.
;Задание 3
;Настройка порта A на вывод данных
ldi R16, 0b11111111 ;вывод первоначальных данных
out PortA, R16
ldi R16, 0b11111111 ;настройка на вывод
out DDRA, R16
;Настройка порта C на вывод данных
ldi R16, 0b11111111 ;вывод первоначальных данных
out PortC, R16
ldi R16, 0b11111111 ;настройка на вывод
out DDRC, R16
ldi R16, $00
sts Var1Task2, R16
sts Var2Task2, R16
sts Var3Task2, R16
;Настройка внешних прерываний:
;Настройка INT0 и INT1 по заднему (спадающему) фронту сигнала:
ldi R16, 0b00001010
out MCUCR, R16
;Настройка INT2 по заднему (спадающему) фронту сигнала:
ldi R16, 0b00000000
out MCUCSR, R16
;Сброс флагов событий внешних прерываний INTF0,INTF1 и INTF2:
ldi R16, 0b11100000 ;Сброс выполняется записью лог."1"
out GIFR, R16
;Разрешение внешних прерываний INT0,INT1 и INT2:
ldi R16, 0b11100000
out GICR, R16
sei ;Глобальное разрешение прерываний!
Cycle: ;Бесконечный цикл:
nop
nop
rjmp Cycle
;
;Подпрограммы внешних прерываний INT0,INT1 и INT2:
ExtInt0:
lds R16, Var1Task2
inc R16
sts Var1Task2, R16 com R16
out PortA, R16
reti
ExtInt1:
lds R16, Var2Task2
inc R16
sts Var2Task2, R16 com R16
out PortC, R16
reti
ExtInt2:
lds R16, Var3Task2
inc R16
sts Var3Task2, R16 com R16
out PortA, R16
reti
Задание 4: Вывести на порт C число 0b00000101. При вызове прерывания INT0 сдвигать содержимое порта вправо на один бит, при вызове прерывания INT1 - влево на один бит. При вызове прерывания INT2 установить содержимое порта в соответствии с начальными условиями.
;Лабораторная работа №4. ;Микропроцессорные системы.
;Мой четвертый проект в AVR Studio 4.12
.include "m16def.inc" ;Подключение файла для м.к. ATmega16
.dseg
.org $0100
Var1Task3: .byte 1
.org $0110
Var2Task3: .byte 1
.org $0120
Var3Task3: .byte 1
.cseg ;Переход в сегмент программного кода
.org $0000 ;Установка адреса
jmp Start ;Переход на начало основной программы
.org $0002
jmp ExtInt0
.org $0004
jmp ExtInt1
.org $0024
jmp ExtInt2
;
.org INT_VECTORS_SIZE
Start: ;Основноя программа
cli ;Глобальное запрещение прерываний!
;Отмена работы сторожевого таймера:
wdr
ldi R16, 0b00011000
out WDTCR, R16 ;Установка битов WDTOE и WDE в рег. WDTCR
ldi R16, 0b00010000 out WDTCR, R16 ;Очистка бита WDE в рег. WDTCR
;Установка указателя стека:
ldi R16, Low (RamEnd) ;Константа RamEnd определена в m16def.inc
ldi R17, High(RamEnd)
out SPL, R16 ;SPL и SPH - регистры указателя стека. out SPH, R17 ;Адреса SPL и SPH определены в m16def.inc.
;Отмена работы сторожевого таймера и установка указателя стека
;необходимы для всех последующих программ!
.def Var = R20
;Задание 4
;Настройка порта C на вывод данных
ldi R16, 0b11111111 ;вывод первоначальных данных
out PortC, R16
ldi R16, 0b11111111 ;настройка на вывод
out DDRC, R16
ldi R16, 0b00000101
mov Var, R16
com R16 out PortC, R16
;Установка параметров активизации внешних прерываний INT0 и INT1:
;Настройка внешних прерываний:
;Настройка INT0 и INT1 по заднему (спадающему) фронту сигнала:
ldi R16, 0b00001010
out MCUCR, R16
;Настройка INT2 по заднему (спадающему) фронту сигнала:
ldi R16, 0b00000000
out MCUCSR, R16
;Сброс флагов событий внешних прерываний INTF0,INTF1 и INTF2:
ldi R16, 0b11100000 ;Сброс выполняется записью лог."1"
out GIFR, R16
;Разрешение внешних прерываний INT0,INT1 и INT2:
ldi R16, 0b11100000
out GICR, R16
sei ;Глобальное разрешение прерываний!
Cycle: ;Бесконечный цикл:
nop
nop
rjmp Cycle
;
;Подпрограммы внешних прерываний INT0,INT1 и INT2:
ExtInt0:
lsr Var
brcc NoSetBitFire
ori Var, 0b10000000
NoSetBitFire:
mov R16, Var
com R16
out PortC, R16
reti
ExtInt1:
lsl Var
brcc NoSetBitFire1
ori Var, 0b00000001
NoSetBitFire1:
mov R16, Var
com R16
out PortC, R16
reti
ExtInt2:
ldi R16, 0b00000101 mov Var, R16
com R16
out PortC, R16
reti
Задание 5: При вызове внешнего прерывания INT0 принимать данные с порта A. При вызове прерывания INT1 выводить накопленную сумму полученных данных на порт C. При вызове внешнего прерывания INT2 сумму полученных данных обнулить.
;Лабораторная работа №4. ;Микропроцессорные системы.
;Мой четвертый проект в AVR Studio 4.12
.include "m16def.inc" ;Подключение файла для м.к. ATmega16
.dseg
.org $0100
Var1Task4: .byte 1
.org $0110
Var2Task4: .byte 1
.org $0120
Var3Task4: .byte 1
.cseg ;Переход в сегмент программного кода
.org $0000 ;Установка адреса
jmp Start ;Переход на начало основной программы
;
;В следующих лабораторных работах по адресам с $0002
;по INT_VECTORS_SIZE будут находиться вектора прерываний!
;
;Константа INT_VECTORS_SIZE = 42($2A) и определена в m16def.inc!
.org $0002
jmp ExtInt0
.org $0004
jmp ExtInt1
.org $0024
jmp ExtInt2
;
.org INT_VECTORS_SIZE
Start: ;Основноя программа
cli ;Глобальное запрещение прерываний!
;Инициализация работы микроконтроллера (WatchDog, стек):
;Отмена работы сторожевого таймера:
wdr
ldi R16, 0b00011000
out WDTCR, R16 ;Установка битов WDTOE и WDE в рег. WDTCR
ldi R16, 0b00010000 out WDTCR, R16 ;Очистка бита WDE в рег. WDTCR
;Установка указателя стека:
ldi R16, Low (RamEnd) ;Константа RamEnd определена в m16def.inc
ldi R17, High(RamEnd)
out SPL, R16 ;SPL и SPH - регистры указателя стека. out SPH, R17 ;Адреса SPL и SPH определены в m16def.inc.
;Отмена работы сторожевого таймера и установка указателя стека
;необходимы для всех последующих программ!
;Задание 5
;Настройка порта A на прием данных
ldi R16, 0b00000000 ;настройка на прием
out DDRA, R16
ldi R16, 0b11111111 ;Подкл./откл. подтягивающих резисторов
out PortA, R16
;Настройка порта C на вывод данных
ldi R16, 0b11111111 ;вывод первоначальных данных
out PortC, R16
ldi R16, 0b11111111 ;настройка на вывод
out DDRC, R16
ldi R17, 0
;Установка параметров активизации внешних прерываний INT0 и INT1:
;Настройка внешних прерываний:
;Настройка INT0 и INT1 по заднему (спадающему) фронту сигнала:
ldi R16, 0b00001010
out MCUCR, R16
;Настройка INT2 по заднему (спадающему) фронту сигнала:
ldi R16, 0b00000000
out MCUCSR, R16
;Сброс флагов событий внешних прерываний INTF0,INTF1 и INTF2:
ldi R16, 0b11100000 ;Сброс выполняется записью лог."1"
out GIFR, R16
;Разрешение внешних прерываний INT0,INT1 и INT2:
ldi R16, 0b11100000
out GICR, R16
sei ;Глобальное разрешение прерываний!
Cycle: ;Бесконечный цикл:
nop
nop
rjmp Cycle
;
;Подпрограммы внешних прерываний INT0,INT1 и INT2:
ExtInt0:
in R16, PinA
add R17, R16
reti
ExtInt1:
out PortC, R17
reti
ExtInt2:
ldi R17, 0
reti
Задание 6: Периодически с интервалом времени 1.0 сек. инкрементировать содержимое ячейки памяти данных по адресу $080, предварительно записав туда число $40. На порт C при вызове прерывания INT0 выводить данные из ячейки $080, при вызове INT1 - выключить все светодиоды, при вызове INT2 - вывести содержимое регистра MCUCSR.
;Лабораторная работа №4. ;Микропроцессорные системы.
;Мой четвертый проект в AVR Studio 4.12
.include "m16def.inc" ;Подключение файла для м.к. ATmega16
.dseg
.org $0080
Var1Task6: .byte 1
.cseg ;Переход в сегмент программного кода
.org $0000 ;Установка адреса
jmp Start ;Переход на начало основной программы
;
;В следующих лабораторных работах по адресам с $0002
;по INT_VECTORS_SIZE будут находиться вектора прерываний!
;
;Константа INT_VECTORS_SIZE = 42($2A) и определена в m16def.inc!
.org $0002
jmp ExtInt0
.org $0004
jmp ExtInt1
.org $0024
jmp ExtInt2
;
.org INT_VECTORS_SIZE
Start: ;Основноя программа
cli ;Глобальное запрещение прерываний!
;Инициализация работы микроконтроллера (WatchDog, стек):
;Отмена работы сторожевого таймера:
wdr
ldi R16, 0b00011000
out WDTCR, R16 ;Установка битов WDTOE и WDE в рег. WDTCR
ldi R16, 0b00010000 out WDTCR, R16 ;Очистка бита WDE в рег. WDTCR
;Установка указателя стека:
ldi R16, Low (RamEnd) ;Константа RamEnd определена в m16def.inc
ldi R17, High(RamEnd)
out SPL, R16 ;SPL и SPH - регистры указателя стека. out SPH, R17 ;Адреса SPL и SPH определены в m16def.inc.
;Отмена работы сторожевого таймера и установка указателя стека
;необходимы для всех последующих программ!
;Задание 6
;Настройка порта C на вывод данных
ldi R16, 0b11111111 ;вывод первоначальных данных
out PortC, R16
ldi R16, 0b11111111 ;настройка на вывод
out DDRC, R16
ldi R16, $40
sts Var1Task6, R16
;Настройка внешних прерываний:
;Настройка INT0 и INT1 по заднему (спадающему) фронту сигнала:
ldi R16, 0b00001010
out MCUCR, R16
;Настройка INT2 по заднему (спадающему) фронту сигнала:
ldi R16, 0b00000000
out MCUCSR, R16
;INTF0,INTF1 и INTF2:
ldi R16, 0b11100000 out GIFR, R16
;Разрешение внешних прерываний INT0,INT1 и INT2:
ldi R16, 0b11100000
out GICR, R16
sei ;Глобальное разрешение прерываний!
Cycle: ;Бесконечный цикл:
call fNop10
lds R16, Var1Task6
inc R16
sts Var1Task6, R16
nop
nop
rjmp Cycle
;
;Подпрограммы внешних прерываний INT0,INT1 и INT2:
ExtInt0:
lds R16, Var1Task6 com R16
out PortC, R16
reti
ExtInt1:
ldi R16, 0b00000000
com R16
out PortC, R16
reti
ExtInt2:
in R16, MCUCSR
inc R16
out PortC, R16
reti
fNop8000000: call fNop2000000
fNop6000000: call fNop2000000 fNop4000000: call fNop2000000
fNop2000000: call fNop1000000
fNop1000000: call fNop200000 fNop800000: call fNop200000
fNop600000: call fNop200000 fNop400000: call fNop200000
fNop200000: call fNop100000
fNop100000: call fNop20000 fNop80000: call fNop20000
fNop60000: call fNop20000 fNop40000: call fNop20000
fNop20000: call fNop10000
fNop10000: call fNop2000 fNop8000: call fNop2000
fNop6000: call fNop2000 fNop4000: call fNop2000
fNop2000: call fNop1000
fNop1000: call fNop200 fNop800: call fNop200
fNop600: call fNop200 fNop400: call fNop200
fNop200: call fNop100
fNop100: call fNop20 fNop80: call fNop20
fNop60: call fNop20 fNop40: call fNop20
fNop20: call fNop10
fNop10:
nop
nop
ret
Документ
Категория
Рефераты
Просмотров
69
Размер файла
30 Кб
Теги
лаба, отчет
1/--страниц
Пожаловаться на содержимое документа