|
В начало
Лабораторная работа.
Реализация и обслуживание подсистемы прерываний
Цель работы – изучение организации прерываний в микроконтроллере ATmega128 и обслуживания подсистемы прерываний. 1. Основные
сведения
Микроконтроллеры ATmega128 используют 34 источника прерывания. Эти
прерывания и механизм сброса располагают отдельными векторами в пространстве
памяти программ. Каждому прерыванию присвоен свой бит разрешения, который
должен быть установлен совместно с битом I регистра статуса SREG. Младшие адреса пространства памяти программ
автоматически определяются как векторы сброса и прерываний. Полный перечень векторов представлен в табл. 6. Перечень отражает также уровень приоритета для каждого
прерывания. Прерывания с младшими адресами имеют больший уровень приоритета:
RESET имеет наивысший уровень приоритета, следующим является запрос внешнего прерывания
INT0 и т.д. Таблица. Векторы сброса и прерываний
Окончание табл.6
Микроконтроллеры ATmega128 содержат два специальных
8-разрядных регистра масок прерываний: регистр масок внешних прерываний EIMSK (External
Interrupt Mask) и
регистр масок прерываний таймеров/счетчиков TIMSK (Timer/Counter
Interrupt Mask).
Кроме того, в регистрах управления блоками ввода-вывода могут существовать
другие биты разрешения и биты масок. При возникновении прерывания бит I разрешения всех
прерываний (в регистре SREG) очищается и все прерывания запрещаются. Процедура прерывания
может установить бит I, чтобы
разрешить вложенные прерывания. Выход из процедуры обработки прерывания происходит
по команде RETI, которая устанавливает бит I (=1). Когда в счетчик команд загружен вектор процедуры
обработки прерывания, соответствующий флаг, вызвавший прерывание, аппаратно
очищается. Некоторые флаги прерываний можно очистить программно. Если условия прерывания возникли, когда
соответствующий бит разрешения очищен, флаг этого прерывания будет установлен и
сохранен в таком состоянии, пока прерывание не будет разрешено или флаг не будет
очищен программно. Если условия прерываний возникли, когда очищен бит разрешения всех прерываний, флаги прерываний
будут установлены и сохранены в таком состоянии, пока все прерывания не будут
разрешены и обработаны в порядке приоритетов. Прерывания по уровню сигнала флага не имеют, а условия
прерывания имеют место, пока активен внешний сигнал. Регистр масок
внешних прерываний EIMSK:
Биты 7...0 – Разрешение внешних прерываний INT7...INT0.
При установленных битах INT7 – INT0 и
установленном бите I регистра статуса (SREG) разрешаются прерывания по соответствующим
выводам сигналов внешних прерываний. Активность сигнала по любому из этих выводов
вызовет запрос прерывания, даже если вывод назначен как выход. Это обеспечивает
возможность организации программного прерывания. Регистр флагов внешних прерываний EIFR:
Биты 7...0 – Флаги внешних прерываний INTF7…INTF0. В случае поступления запроса на прерывание на
какой-либо из выводов INT7 – INT0 устанавливается ( =1)
соответствующий флаг прерывания INTF7 – INTF0. Если бит I регистра SREG и
соответствующий бит разрешения (INT7 – INT0) регистра EIMSK установлены, то
выполняется переход по вектору прерывания. При возврате из процедуры прерывания
флаг очищается. Кроме того, флаг можно очистить, записав в него логическую 1.Обратите внимание, что программно установить флаг
внешнего прерывания, записав в него 1, невозможно! Регистры
управления внешними прерываниями EICRA и EICRB:
Биты 7...0 – ISCX1, ISCX0: Биты управления
опознаванием внешних прерываний INT7 – INT0. Запросы внешних прерываний на выводах INT7 – INT0
являются активными, если установлен флаг I регистра SREG и установлена
соответствующая маска в регистре EIMSK. Запрос прерывания по логическому уровню
или фронтам определяется в соответствии с табл. 7. Таблица 7 Управление
опознаванием прерывания
Примечание. Х может быть равен 7, 6, 5,
4, 3, 2, 1 или 0. При изменении битов ISCx1/ISCx0 прерывание
должно быть запрещено очисткой бита разрешения в регистре GIMSK. В ином случае
может произойти прерывание в момент изменения бита. Входы прерываний INTx периодически опрашиваются на предмет наличия запроса.
Если внешний запрос прерывания фиксируется по фронту, то для гарантированного
срабатывания длительность импульса должна быть больше, чем один период тактовой
частоты процессора. Заметим, что частота процессора может быть меньше частоты XTAL из-за возможного наличия делителя. Запрос прерывания
по логическому уровню должен продолжаться, пока выполняется текущая инструкция и он будет зафиксирован. Запрос прерывания по
логическому уровню, если он разрешен,
будет генерировать запрос прерывания до тех пор, пока на входе удерживается
низкий уровень. Регистр масок
прерывания по таймерам/счетчикам TIMSK:
Бит 7 – OCIE2: Разрешение
прерывания по совпадению таймера 2.
При установленном бите OCIE2 и установленном бите I регистра статуса
разрешается прерывание по совпадению содержимого регистра сравнения и состояния
таймера 2. Соответствующее прерывание (с вектором $0012) имеет место, если
произойдет совпадение при сравнении содержимого регистра сравнения и состояния
таймера/счетчика 2. В регистре флагов прерывания TIFR устанавливается флаг OCF2. Бит 6 – TOIE2:
Разрешение прерывания по переполнению таймера 2. При установленном бите TOIE2 и установленном бите I
регистра статуса разрешается прерывание по переполнению таймера 2. Соответствующее
прерывание (с вектором $0014) выполняется, если произойдет переполнение таймера
2. В регистре флагов TIFR устанавливается
флаг TOV2 переполнения таймера 2. Бит 5 – TICIE1: Разрешение
прерывания по захвату таймера 1. При
установленном бите TICIE1 и установленном бите I регистра статуса разрешается
прерывание по захвату таймера 1. Соответствующее прерывание (с вектором $0016)
выполняется, если произошел захват по выводу 29, PD4(IC1). В регистре флагов
TIFR устанавливается флаг ICF1 захвата таймера
1. Бит 4 – OCIE1A: Разрешение прерывания по совпадению регистра А с таймером 1.
При установленном бите OCIE1A и установленном бите I регистра статуса
разрешается прерывание по совпадению регистра A с состоянием таймера 1.
Соответствующее прерывание (с вектором $0018) выполняется, если имеется совпадение
содержимого регистра A с состоянием таймера 1. В регистре флагов TIFR
устанавливается флаг OCF1A
совпадения регистра А
с таймером 1. Бит 3 – OCIE1B: Разрешение прерывания по совпадению регистра B с таймером 1. При установленном бите OCIE1B и установленном бите I
регистра статуса разрешается прерывание по совпадению регистра B с состоянием
таймера 1. Соответствующее прерывание (с вектором $001A) выполняется, если
имеется совпадение содержимого регистра B с состоянием таймера 1. В регистре
флагов TIFR устанавливается флаг OCF1B совпадения регистра B с таймером 1. Бит 2 – TOIE1:
Разрешение прерывания по переполнению таймера 1. При установленном бите TOIE1 и установленном бите I регистра статуса разрешается
прерывание по переполнению таймера 1. Соответствующее прерывание (с вектором
$001С) выполняется, если произойдет переполнение таймера 1. В регистре флагов
TIFR устанавливается флаг TOV1
переполнения таймера 1. Бит 1 – OCIE0: Разрешение
прерывания по совпадению таймера 0. При
установленном бите OCIE0 и установленном бите I регистра статуса разрешается прерывание
по совпадению содержимого регистра сравнения и состояния таймера 0.
Соответствующее прерывание (с вектором $001E) выполняется, если произойдет
совпадение при сравнении содержимого регистра сравнения и состояния таймера 0.
В регистре флагов прерывания TIFR устанавливается флаг OCF0 совпадения таймера 0. Бит 0 – TOIE0:
Разрешение прерывания по переполнению таймера 0. При установленном бите TOIE0 и установленном бите I
регистра статуса разрешается прерывание по переполнению таймера 0. Соответствующее
прерывание (с вектором $0020) выполняется, если произойдет переполнение таймера
0. В регистре флагов TIFR устанавливается
флаг TOV0 переполнения таймера 0. Регистр масок
прерывания по таймерам/счетчикам ETIMSK:
Бит 7, бит 6 – Зарезервировано. Бит 5 – TICIE3: Разрешение
прерывания по захвату таймера 3. При
установленном бите TICIE3 и установленном бите I регистра статуса разрешается
прерывание по захвату таймера 3. Соответствующее прерывание (с вектором $0032)
выполняется, если произошел захват по выводу 9, PE7(ICP3). В регистре
флагов ETIFR устанавливается флаг ICF3C захвата
таймера 3. Бит 4 – OCIE3A:-
Разрешение прерывания по совпадению регистра А с таймером
3. При установленном бите OCIE3A и
установленном бите I регистра статуса разрешается прерывание по совпадению
регистра A с состоянием таймера 3. Соответствующее прерывание (с вектором
$0034) выполняется, если имеется совпадение содержимого регистра A с состоянием
таймера 3. В регистре флагов ETIFR
устанавливается флаг OCF3A
совпадения регистра А
с таймером 3. Бит 3 – OCIE3B: Разрешение прерывания по совпадению регистра B с таймером 3. При установленном бите OCIE3B и установленном бите I
регистра статуса разрешается прерывание по совпадению регистра B с состоянием
таймера 3. Соответствующее прерывание (с вектором $0036) выполняется, если
имеется совпадение содержимого регистра B с состоянием таймера 3. В регистре
флагов ETIFR устанавливается
флаг OCF3B совпадения регистра B с таймером 3. Бит 2 – TOIE3:- Разрешение прерывания по переполнению
таймера 3. При установленном бите TOIE3 и установленном бите I регистра статуса разрешается
прерывание по переполнению таймера 3. Соответствующее прерывание (с вектором $003A) выполняется, если произойдет переполнение таймера 3.
В регистре флагов ETIFR устанавливается флаг TOV3 переполнения таймера 3. Бит 1 – OCIE3C: Разрешение прерывания по совпадению регистра C с таймером 3. При
установленном бите OCIE3С и установленном бите I регистра статуса разрешается
прерывание по совпадению содержимого регистра сравнения C с состоянием таймера 3. Соответствующее прерывание (с
вектором $0038) выполняется, если произойдет совпадение при сравнении содержимого
регистра сравнения C и состояния таймера 3. В
регистре флагов прерывания ETIFR
устанавливается флаг OCF3C совпадения таймера 3. Бит 0 – OCIE1C: Разрешение прерывания по совпадению регистра C с таймером 1. При
установленном бите OCIE1С и установленном бите I регистра статуса разрешается
прерывание по совпадению содержимого регистра сравнения C с состоянием таймера 1. Соответствующее прерывание (с
вектором $0030) выполняется, если произойдет совпадение при сравнении содержимого
регистра сравнения C и состояния таймера 1. В
регистре флагов прерывания ETIFR
устанавливается флаг OCF1C совпадения таймера 1. Регистр флагов прерываний по таймерам/счетчикам TIFR:
Бит 7 – OCF2: Флаг 2
совпадения таймера 2 и данных OCR2. Бит OCF2 устанавливается при совпадении состояния
таймера 2 и содержимого регистра OCR2. Бит OCF2 аппаратно очищается при
обработке соответствующего вектора прерывания. Возможна очистка бита записью во
флаг логической 1. При установленных битах I в регистрах SREG, OCIE2 и OCF2
выполняется прерывание по совпадению таймера 2. Бит 6 –
TOV2: Флаг переполнения таймера
2. Бит TOV2 устанавливается при
переполнении таймера 2. Он аппаратно очищается при обработке соответствующего
вектора прерывания. Возможна очистка бита записью во флаг логической 1. При
установленном бите I в регистре SREG,
установленных битах OCIE2 и TOV2 выполняется прерывание по переполнению таймера
2. В режиме PWM этот бит устанавливается, при переходе через $00. Бит 5 – ICF1: Флаг захвата
входа. Бит ICF1 устанавливается в случае захвата входа и показывает,
что значение таймера 1 переслано во входной регистр захвата ICR1. Бит очищается
аппаратно при обработке соответствующего вектора прерывания. Возможна очистка
бита записью во флаг логической 1. Бит 4 – OCF1A: Флаг 1A совпадения выхода. Бит OCF1A устанавливается при совпадении состояния таймера 1 и
содержимого регистра OCR1A. Бит OCF1A аппаратно очищается при обработке
соответствующего вектора прерывания. Возможна очистка бита записью во флаг логической
1. При установленном бите I в регистре
SREG, установленных битах OCIE1A и OCF1A выполняется прерывание по совпадению
выхода таймера-счетчика 1. Бит 3 – OCF1B:
Флаг 1B совпадения выхода. Бит
OCF1B устанавливается при совпадении состояния таймера 1 и содержимого регистра
OCR1B. Бит OCF1B аппаратно очищается при обработке соответствующего вектора
прерывания. Возможна очистка бита записью во флаг логической 1. При установленном
бите I в регистре SREG, установленных битах OCIE1B и OCF1B выполняется прерывание по совпадению выхода таймера 1. Бит 2 – TOV1:
Флаг переполнения таймера 1.
Бит TOV1 устанавливается при переполнении таймера 1. Он аппаратно очищается при
обработке соответствующего вектора прерывания. Возможна очистка бита записью во
флаг логической 1. При установленном бите I в
регистре SREG, установленных битах TOIE1 и TOV1 выполняется прерывание по переполнению таймера 1. Бит 1 – OCF0: Флаг 0
совпадения выхода. Бит OCF0
устанавливается при совпадении состояния таймера 0 и содержимого регистра OCR0
. Бит OCF0 аппаратно очищается при обработке соответствующего вектора
прерывания. Возможна очистка бита записью во флаг логической 1. При
установленном бите I в регистре SREG, установленных битах OCIE0 и OCF0 выполняется
прерывание по совпадению выхода таймера 1. Бит 0 – TOV0:
Флаг переполнения таймера 0.
Бит TOV0 устанавливается при переполнении таймера 0. Он аппаратно очищается при
обработке соответствующего вектора прерывания. Возможна очистка бита записью во
флаг логической 1. При установленном бите I в регистре SREG, установленных
битах TOIE0 и TOV0 выполняется
прерывание по переполнению таймера 0. Регистр флагов прерываний по таймерам/счетчикам ETIFR:
Бит 7, бит 6 – Зарезервировано. Бит 5 – ICF3C: Флаг захвата входа. Бит ICF3C устанавливается в случае захвата входа и показывает,
что значение таймера 3 переслано во входной регистр захвата ICR3. Бит очищается
аппаратно при обработке соответствующего вектора прерывания. Возможна очистка
бита записью во флаг логической 1. Бит 4 – OCF3A: Флаг 3A совпадения выхода. Бит OCF3A устанавливается при совпадении состояния таймера 3 и содержимого
регистра OCR3A. Бит OCF3A аппаратно очищается при обработке соответствующего
вектора прерывания. Возможна очистка бита записью во флаг логической 1. При
установленном бите I в регистре SREG,
установленных битах OCIE3A и OCF3A выполняется прерывание по совпадению выхода
таймера 3. Бит 3 – OCF3B:
Флаг 3B совпадения выхода. Бит
OCF3B устанавливается при совпадении состояния таймера 3 и содержимого регистра
OCR3B. Бит OCF3B аппаратно очищается при обработке соответствующего вектора
прерывания. Возможна очистка бита записью во флаг логической 1. При установленном
бите I в регистре SREG, установленных битах OCIE3B и OCF3B выполняется прерывание по совпадению выхода таймера 3. Бит 2 – TOV3:
Флаг переполнения таймера 3.
Бит TOV3 устанавливается при переполнении таймера 3. Он аппаратно очищается при
обработке соответствующего вектора прерывания. Возможна очистка бита записью во
флаг логической 1. При установленном бите I в
регистре SREG, установленных битах TOIE3 и TOV3 выполняется прерывание по переполнению таймера 3. Бит 1 – OCF3C: Флаг Бит 0 – OCF1C: Флаг Обратите внимание, что
программно установить флаг таймера-счетчика, записав в него 1, невозможно! 2. Выполнение работы 1. Изучить функционирование подсистемы прерываний
микроконтроллера ATmega128. 2. Запустить на персональном компьютере интегрированную
систему программирования 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. Процедуры обслуживания
разрешенных источников не содержат исполняемых команд и подробнее будут
рассмотрены в следующих работах. 3. Выполнить компиляцию программы командой Project/Build. 4. При успешной компиляции с помощью команды Debug/Start
Debugging запустить симулятор. 5. Выполнить программу по шагам, выполняя команду Debug/Step Intro (F11) до зацикливания
loop. В окне Workspace
изменяем значение регистра TCNT0 на FF (рис. 28),
тем самым вызываем прерывание по переполнению таймера 0. Рис. 28. Окно Workspace Рис. 29. Обнуление бита 0 регистра PIND 6. Выполнить программу по шагам, используя команду Debug/Step Intro(F11) до возврата
в цикл loop . В окне Workspace
обнуляем бит 0 регистра PIND (рис. 29), тем самым вызываем прерывание INT0. 3.
Задания для самостоятельной работы
Составить различные процедуры обслуживания
прерываний, выполняемых при переполнении и сравнении таймеров 1,2,3. Запустить составленные программы на
выполнение. Реализовать вызов и выполнение соответствующих процедур
обслуживания прерываний, изменяя значения в регистрах таймеров 1,2,3 и показать
преподавателю своё умение контролировать работу программы с помощью
интегрированной системы программирования. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||