Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы по МП от Нефёдова.doc
Скачиваний:
184
Добавлен:
19.03.2015
Размер:
4.26 Mб
Скачать

Выполнение основного задания

  1. Изучить функционирование подсистемы прерываний микроконтроллера ATmega128.

  1. Запустить на персональном компьютере интегрированную систему программирования AVRStudio. Командой ProjectNew Project создать новый проект Lesson3. С использованием редактора текста создать демонстрационную программу:

.device ATmega128

.include "m128def.inc"

;*****таблица векторов прерываний*****************************************

.CSEG

.org $0000 ;начальный адpес пpогpаммы

rjmp Start ;пеpеход к pабочей части пpогpаммы (вектоp Reset)

.org $0002

rjmp int_INT0 ;Внешнее пpеpывание Int0

.org $0004

reti ;Внешнее пpеpывание Int1

.org $0006

reti ;Внешнее пpеpывание Int2

.org $0008

reti ;Внешнее пpеpывание Int3

.org $000A

reti ;Внешнее пpеpывание Int4

.org $000C

reti ;Внешнее пpеpывание Int5

.org $000E

reti ;Внешнее пpеpывание Int6

.org $0010

reti ;Внешнее пpеpывание Int7

.org $0012

reti ;Совпадение таймера/счетчика T2

.org $0014

reti ;Переполнение таймера/счетчика T2

.org $0016

reti ;Захват таймера/счетчика T1

.org $0018

reti ;Совпадение "А" таймера/счетчика T1

.org $001A

reti ;Совпадение "В" таймера/счетчика T1

.org $001C

reti ;Переполнение таймера/счетчика T1

.org $001E

reti ;Совпадение таймера/счетчика T0

.org $0020

rjmp OvfT0 ;Переполнение таймера/счетчика T0

.org $0022

reti ;Передача по SPI завершена

.org $0024

reti ;USART0, прием завершен

.org $0026

reti ;Регистр данных USART0 пуст

.org $0028

reti ;USART0, передача завершена

.org $002A

reti ;Преобразование АЦП завершено

.org $002C

reti ;Запись в EEPROM завершена

.org $002E

reti ;Аналоговый компаратор

.org $0030

reti ;Совпадение "C" таймера/счетчика T1

.org $0032

reti ;Захват таймера/счетчика T3

.org $0034

reti ;Совпадение "А" таймера/счетчика T3

.org $0036

reti ;Совпадение "В" таймера/счетчика T3

.org $0038

reti ;Совпадение "C" таймера/счетчика T3

.org $003A

reti ;Переполнение таймера/счетчика T3

.org $003C

reti ;USART1, прием завершен

.org $003E

reti ;Регистр данных USART1 пуст

.org $0040

reti ;USART1, передача завершена

.org $0042

reti ;Прерывание от модуля TWI

.org $0044

reti ;Готовность SPM

;***** Основная программа**********************************************

Start:

ldi R16,High(RAMEND) ;инициализация стека

out SPH,R16 ;

ldi R16,Low(RAMEND) ;

out SPL,R16 ;

;*****настройка линии INT0 для программного симулятора******************

in R16,DDRD ;

sbr R16,(1<<PD0) ;установка линии порта INT0 на выход

out DDRD, R16 ;разрешение работы линии порта INT0 на выход

sbi PORTD,PD0 ;установка высокого уровня на выходе INT0

;*********************************************************************

in R16,TCCR0 ; установка бита CS00,тактирование таймера

sbr R16,(1<<CS00) ; частотой процессора

out TCCR0, R16 ;разрешение работы Таймера 0

in R16,TIMSK ;

sbr R16,(1<<TOIE0) ;установка бита TOIE0

out TIMSK, R16 ;разрешение прерывания по переполнению Таймера 0

in R16,EIMSK ;

sbr R16,(1<<INT0) ;установка бита INT0

out EIMSK, R16 ;разрешение прерывания INT0 от низкого уровня

;на входе INT0

sei ;разрешение всех прерываний

loop:

rjmp loop ;зацикливание программы до прихода прерывания

;***** Обработка прерывания Int0: ******************************************

int_INT0:

nop

reti

;***** Обработка прерывания Таймера0 ******************************************

OvfT0:

nop

reti

Программа lesson3 показывает работу процессора по прерываниям. Разрешены прерывания от внешнего выводаINT0 и переполнения Таймера 0. Процедуры обслуживания разрешенных источников не содержат исполняемых команд и подробнее будут рассмотрены в следующих работах.

  1. Выполнить компиляцию программы командой Project/Build.

  2. При успешной компиляции с помощью команды Debug/StartDebuggingзапустить симулятор.

  3. Выполнить программу по шагам, выполняя команду Debug/StepIntro(F11) до зацикливанияloop.В окнеWorkspaceизменяем, значение регистраTCNT0 наFFтем самым вызываем прерывание по переполнению Таймера 0.

  1. Выполнить программу по шагам, используя команду Debug/StepIntro(F11) до возврата в циклloop.В окнеWorkspaceобнуляем, бит 0 регистраPINDтем самым вызываем прерываниеINT0.