RJMP RESET ; переход к основной программе
Org INT0addr
RJMP EXT_INT0 ; внешнее прерывание INT0
Org OVF0addr
RJMP TMR0_INT ; прерывание по таймеру Т/С0
; подпрограмма обработки внешнего прерывания INT0
EXT_INT0:
; ...
RETI ; возврат
; подпрограмма обработки прерывания по таймеру T/C0
TMR0_INT:
; ...
RETI ; возврат
RESET: ; основная программа
; инициализация стека
; ...
; инициализация внешнего прерывания INT0
LDI R16, (1<<ISC01)|(1<<ISC00)
OUT MCUCR, R16 ; по положительному фронту
LDI R16, (1<<INTF1)|(1<<INTF0)
OUT GIFR, R16 ; очистка флагов внешних прерываний
LDI R16, 1<<INT0
OUT GICR, R16 ; разрешение внешнего прерывания INT0
; инициализация прерывания по таймеру T/C0
LDI R16, 1<<CS00
OUT TCCR0, R16 ; деления частоты нет
LDI R16, 1<<TOIE0
OUT TIMSK, R16 ; разрешение прерывания по таймеру Т/С0
SEI ; общее разрешение прерываний
forever:
NOP ; пустая команда (no operation)
RJMP forever ; бесконечный цикл
; ...
Рис. 26. Пример программы с использованием прерываний
Программы с использованием прерываний начинаются с определения области векторов прерываний. Адреса векторов прерываний указываются символическими именами и помощью директив .org. По адресам векторов прерываний размещают команды относительного перехода к подпрограммам обработки прерываний, которые обычно располагают непосредственно после области векторов прерываний. Подпрограммы обработки прерываний завершаются командами RETI возврата в основную программу. Команда RETI выполняет те же действия, что и команда RET, а также восстанавливает бит I общего (глобального) разрешения прерываний в регистре состояния SREG.
В основной программе производится инициализация стека и прерываний. Инициализация прерываний осуществляется путём установки определённых разрядов в соответствующих регистрах ввода-вывода; при этом в командах используются символические обозначения как самих регистров, так и отдельных их разрядов. После инициализации прерываний производится общее разрешение прерываний путём установки бита I в регистре состояния SREG. Для этого предусмотрена специальная команда SEI (Set Global Interrupt Flag).
Процедура обслуживания прерываний в AVR-микроконтроллерах выполняется согласно приведённому выше алгоритму. Для организации вложенных прерываний необходимо в подпрограмме обработки прерывания восстанавливать бит I общего разрешения прерываний в регистре состояния SREG.
ЗАДАНИЕ
1. Дополнить программу, приведённую на рис. 26, необходимыми директивами и командами. В подпрограмму обработки прерывания по таймеру-счётчику Т/С0 поместить команду загрузки числа в РОН. Выполнить программу в пошаговом режиме. Проследить изменение содержимого стека при обработке прерывания, а также установку и сброс бита I общего разрешения прерываний и флага TOV0 прерывания по таймеру-счётчику T/C0. Для контроля содержимого регистров таймера-счётчика T/C0 раскрыть пункт TIMER_COUNTER_0 объекта I/O ATMEGA8535 закладки I/O окна Workspace.
2. Исследовать процедуру обработки вложенных прерываний, внеся соответствующие изменения в программу. В подпрограмму обработки прерывания по внешнему прерыванию INT0 поместить команду очистки РОН, использующегося в подпрограмме обработки прерывания по таймеру-счётчику Т/С0. В симуляторе после перехода в подпрограмму обработки прерывания по таймеру-счётчику Т/С0 смоделировать поступление сигнала внешнего прерывания INT0. Для этого в симуляторе установить флаг INTF0 в регистре GIFR группы EXTERNAL_INTERRUPT объекта I/O ATMEGA8535 закладки I/O окна Workspace. Проследить изменение содержимого стека при обработке вложенных прерываний.
СОДЕРЖАНИЕ ОТЧЁТА
Отчёт должен содержать: титульный лист с указанием номера и названия лабораторной работы, номера группы и фамилий выполнивших работу; цель работы; листинги трансляции программ в соответствии с заданием.
КОНТРОЛЬНЫЕ ВОПРОСЫ
1. Назначение прерываний.
2. Типы прерываний.
3. Средства управления прерываниями.
4. Операция маскирования прерываний.
5. Этапы процедуры прерывания.
6. Реализация прерываний в AVR-микроконтроллерах.
Приложение 1
Основные характеристики микроконтроллеров
групп Tiny AVR, Mega AVR и LCD AVR
Характеристика | Tiny AVR | Mega AVR | ||||||||
ATtiny13 | ATtiny15L | ATtiny26 | ATtiny28 | ATtiny2313 | ATmega48 | ATmega8 | ATmega88 | ATmega8515 | ATmega8535 | |
Объём памяти программ (FLASH), Кбайт | ||||||||||
Объём внутренней оперативной памяти данных (SRAM), байт | – | – | ||||||||
Объём энергонезависимой памяти данных (EEPROM), байт | – | 1K | 1K | |||||||
Количество команд | ||||||||||
Количество линий ввода-вывода | ||||||||||
Количество векторов прерываний | ||||||||||
Разрядность программного счётчика (PC) | ||||||||||
Стек1 | П | А | П | А | П | П | П | П | П | П |
8-разрядный таймер-счётчик | ||||||||||
16-разрядный таймер-счётчик | – | – | – | – | ||||||
Сторожевой таймер | + | + | + | + | + | + | + | + | + | + |
Аналоговый компаратор | + | + | + | + | + | + | + | + | + | + |
АЦП (10 разрядов), каналов | – | – | – | |||||||
Аппаратный умножитель | – | – | – | – | – | + | + | + | + | + |
Универсальный асинхронный приёмопередатчик (УАПП) | – | – | – | – | ||||||
Интерфейс SPI для обмена данными | – | – | – | – | – | |||||
Двухпроводный последовательный интерфейс (TWI) | – | – | – | – | – | + | + | + | + | + |
Интерфейс JTAG | – | – | – | – | – | – | – | – | – | – |
Программирование в системе (In-System Programming) | + | + | + | – | + | + | + | + | + | + |
Самопрограммирование (Self-Programming) | – | – | – | – | – | + | + | + | + | + |
Схема сброса при понижении напряжения питания | + | + | + | + | + | + | + | + | + | + |
Синхронизация от внутренней RC-цепочки | + | + | + | + | + | + | + | + | + | + |
Синхронизация от внешнего кварцевого генератора | + | + | + | + | + | + | + | + | + | + |
Максимальная тактовая частота, МГц | 1,6 | |||||||||
Число выводов | 20/32 | 28/32 | 20/32 | 28/32 | 28/32 | 28/32 | 40/44 | 40/44 |
Характеристика | Mega AVR | LCD AVR | |||||||
ATmega16 | ATmega162 | ATmega168 | ATmega32 | ATmega64 | ATmega128 | ATmega256 | ATmega169 | ATmega329 | |
Объём памяти программ (FLASH), Кбайт | |||||||||
Объём внутренней оперативной памяти данных (SRAM), байт | 1K | 1K | 1K | 2K | 4K | 4K | 8K | 1K | 2K |
Объём энергонезависимой памяти данных (EEPROM), байт | 1K | 2K | 4K | 4K | 1K | ||||
Количество команд | |||||||||
Количество линий ввода-вывода | |||||||||
Количество векторов прерываний | |||||||||
Разрядность программного счётчика (PC) | |||||||||
Стек1 | П | П | П | П | П | П | П | П | П |
8-разрядный таймер-счётчик | |||||||||
16-разрядный таймер-счётчик | |||||||||
Сторожевой таймер | + | + | + | + | + | + | + | + | + |
Аналоговый компаратор | + | + | + | + | + | + | + | + | + |
АЦП (10 разрядов), каналов | – | ||||||||
Аппаратный умножитель | + | + | + | + | + | + | + | + | + |
Универсальный асинхронный приёмопередатчик (УАПП) | |||||||||
Интерфейс SPI для обмена данными | |||||||||
Двухпроводный последовательный интерфейс (TWI) | + | + | + | + | + | + | + | + | + |
Интерфейс JTAG | – | + | + | + | + | + | + | + | + |
Программирование в системе (In-System Programming) | + | + | + | + | + | + | + | + | + |
Самопрограммирование (Self-Programming) | + | + | + | + | + | + | + | + | + |
Схема сброса при понижении напряжения питания | + | + | + | + | + | + | + | + | + |
Синхронизация от внутренней RC-цепочки | + | + | + | + | + | + | + | + | + |
Синхронизация от внешнего кварцевого генератора | + | + | + | + | + | + | + | + | + |
Максимальная тактовая частота, МГц | |||||||||
Число выводов | 40/44 | 40/44 | 28/32 | 40/44 |
1 А – аппаратный, П – программный (организуемый в ОЗУ).
Приложение 2