Сброс и обработка прерываний
В ATmega16 предусмотрен 21 источник прерываний. Эти прерывания и сброс имеют различные векторы в области памяти программ. Каждому из прерываний присвоен отдельный бит, разрешающий данное прерывание при установке бита в 1, если бит I регистра состояния SREG разрешает общее обслуживание прерываний.
Самые младшие адреса памяти программ определены как векторы сброса и прерываний. Полный список векторов прерываний приведен в таблице 2. Этот список определяет и приоритет различных прерываний. Меньшие адреса соответствуют более высокому уровню приоритета. Самый высокий уровень у RESET (сброс), следующий приоритет у INT0 - внешнего запроса прерывания 0 и т.д.
Таблица 5. Сброс и векторы прерываний.
-
-
-
Номер вектора
|
Адрес
|
Источник
|
Описание прерывания
|
1
|
$000
|
RESET
|
Вывод сброса и сброс от сторожевого таймера
|
2
|
$002
|
INT0
|
Внешнее прерывание 0
|
3
|
$004
|
INT1
|
Внешнее прерывание 1
|
4
|
$006
|
TIMER2 COMP
|
Совпадение таймера/счетчика 2
|
5
|
$008
|
TIMER2 OVF
|
Переполнение таймера/счетчика 2
|
6
|
$00A
|
TIMER1 CAPT
|
Захват таймера/счетчика 1
|
7
|
$00С
|
TIMER1 COMPA
|
Совпадение таймера/счетчика 1
|
8
|
$00E
|
TIMER1 COMPB
|
Совпадение таймера/счетчика 1
|
9
|
$010
|
TIMER1 OVF
|
Переполнение таймера/счетчика 1
|
10
|
$012
|
TIMER0 OVF
|
Переполнения таймера/счетчика 0
|
11
|
$014
|
SPI, STC
|
Полная последовательная передача
|
12
|
$016
|
USART, RXC
|
Usart, Rx complete
|
13
|
$018
|
USART, UDRE
|
Usart регистр данных пустой
|
14
|
$01A
|
USART, TXC
|
Usart, Tx complete
|
15
|
$01C
|
ADC
|
Аналого-цифровой преобразователь
|
16
|
$01E
|
EE_RDY
|
EEPROM Ready
|
17
|
$020
|
ANA_COMP
|
Аналоговый компаратор
|
18
|
$022
|
TWI
|
Двух - проводной последовательный интерфейс
|
19
|
$024
|
INT2
|
Внешнее прерывание 2
|
20
|
$026
|
TIMER0 COMP
|
Совпадение таймера/счетчика 0
|
21
|
$028
|
SPM_RDY
|
Загрузка программной памяти готова
|
Чаще всего используется следующая установка векторов прерываний в программе:
Адрес Метка Код Комментарий
$000 jmp RESET ; Reset Handler
$002 jmp EXT_INT0 ; IRQ0 Handler
$004 jmp EXT_INT1 ; IRQ1 Handler
$006 jmp TIM2_COMP ; Timer2 Compare Handler
$008 jmp TIM2_OVF ; Timer2 Overflow Handler
$00A jmp TIM1_CAPT ; Timer1 Capture Handler
$00C jmp TIM1_COMPA ; Timer1 CompareA Handler
$00E jmp TIM1_COMPB ; Timer1 CompareB Handler
$010 jmp TIM1_OVF ; Timer1 Overflow Handler
$012 jmp TIM0_OVF ; Timer0 Overflow Handler
$014 jmp SPI_STC ; SPI Transfer Complete Handler
$016 jmp USART_RXC ; USART RX Complete Handler
$018 jmp USART_UDRE ; UDR Empty Handler
$01A jmp USART_TXC ; USART TX Complete Handler
$01C jmp ADC ; ADC Conversion Complete Handler
$01E jmp EE_RDY ; EEPROM Ready Handler
$020 jmp ANA_COMP ; Analog Comparator Handler
$022 jmp TWSI ; Two-wire Serial Interface Handler
$024 jmp EXT_INT2 ; IRQ2 Handler
$026 jmp TIM0_COMP ; Timer0 Compare Handler
$028 jmp SPM_RDY ; Store Program Memory Ready Handler
;
$02A RESET: ldi r16,high(RAMEND ) ; Main program start
$02B out SPH,r16 ; Set Stack Pointer to top of RAM
$02C ldi r16,low(RAMEND)
$02D out SPL,r16
$02E sei ; Enable interrupts
$02F xxx
... ... ...
Обработка прерываний
ATmega16 регистр управления прерыванием GIСR - Общий регистр управления прерывания, регулирует размещение вектора прерывания. Когда возникает прерывание, общий бит разрешения прерываний I очищается (ноль) и прерывания запрещаются. Программа пользователя может установить этот бит для разрешения прерываний. Флаг разрешения прерываний I устанавливается в 1 при выполнении команды выхода из прерывания - RETI.
Для прерываний включаемых статическими событиями (т.е. переключаемыми уровнем) (например совпадение значения счетчика/таймера 1 с регистром совпадения) флаг прерывания взводится, когда происходит событие. Если флаг прерывания очищен и присутствует условие возникновения прерывания, флаг не будет установлен, пока не произойдет следующее событие.
Когда программный счетчик устанавливается на текущий вектор прерывания для обработки прерывания, соответствующий флаг, сгенерированный прерыванием, аппаратно сбрасывается. Некоторые флаги прерывания могут быть сброшены записью логической единицы в бит соответствующий флагу.
Бит
Чт./зап. (R/W)
Начальн. знач.
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
|
INT1
|
INT0
|
INT2
|
-
|
-
|
-
|
IVSEL
|
IVCE
|
GICR
|
R/W
|
R/W
|
R
|
R
|
R
|
R
|
R/W
|
R/W
|
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
Бит 1 - IVSEL: Выбор вектора прерывания
Когда бит IVSEL очищен (0), Векторы Прерывания установлены в начале Flash - памяти. Когда этот бит установлен (1), векторы прерывания перемещены на начало секции Загрузчика (Boot Loader) в Flash - памяти.
Бит 0 - IVCE: Векторное изменение прерывания Допустимый бит IVCE должен быть установлен в логическую 1, чтобы применить изменение бита IVSEL. IVCE ОЧИЩЕН аппаратными четырьмя циклами после того, как будет записано или когда IVSEL записан.
ОБЩИЙ РЕГИСТР ФЛАГОВ ПРЕРЫВАНИЙ - GIFR
Бит
$3A($5A)
Чт./зап. (R/W)
Начальн. знач.
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
|
INTF1
|
INTF0
|
INTF2
|
-
|
-
|
-
|
-
|
-
|
GIFR
|
R/W
|
R/W
|
R
|
R
|
R
|
R
|
R
|
R
|
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
Бит 7 - INTF1: Флаг внешнего прерывания 1: При возникновении на выводе INT1 события, вызывающего прерывание, INTF1 устанавливается в "1". Если установлены бит I регистра SREG и бит INT1 в GIMSK, происходит переход на вектор прерывания по адресу $004. Флаг очищается после выполнения обработчика прерывания. Кроме того, флаг можно очистить, записав в него логическую единицу.
Бит 6 - INTF0: Флаг внешнего прерывания 0: При возникновении на выводе INT0 события вызывающего прерывание, INTF0 устанавливается в "1". Если установлены бит I регистра SREG и бит INT0 в GIMSK, происходит переход на вектор прерывания по адресу $002. Флаг очищается после выполнения обработчика прерывания. Кроме того, флаг можно очистить, записав в него логическую единицу.
Бит 5 - INTF2: Флаг внешнего прерывания 0: При возникновении на выводе INT0 события вызывающего прерывание, INTF0 устанавливается в "1". Если установлены бит I регистра SREG и бит INT0 в GIMSK, происходит переход на вектор прерывания по адресу $024. Флаг очищается после выполнения обработчика прерывания. Кроме того, флаг можно очистить, записав в него логическую единицу.
Биты 4..0 - зарезервированы. В AT90S2313 эти биты зарезервированы и всегда читаются как 0.
РЕГИСТР МАСКИ ПРЕРЫВАНИЯ ОТ ТАЙМЕРОВ/СЧЕТЧИКОВ - TIMSK
Бит
$39($59)
Чт./зап. (R/W)
Начальн.знач.
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
|
OCIE2
|
TOIE2
|
TICIE1
|
OCIE1A
|
OCIE1B
|
TOIE1
|
OCIE0
|
TOIE0
|
TIMSK
|
R/W
|
R/W
|
R
|
R
|
R/W
|
R
|
R/W
|
R
|
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
Бит 7 – OCIE2: Разрешение прерывания по совпадению таймера/счетчика 1: Если установлены бит OCIE2 и бит разрешения прерывания в регистре состояния, разрешены прерывания по совпадению таймера/счетчика 1. Прерывание (вектор $006) выполняется при равенстве таймера/счетчика 1 и регистра совпадения. В регистре флагов TIFR устанавливается ("1") флаг совпадения.
Бит 6 – TOIE2: Разрешение прерывания по переполнению таймера/счетчика 2: Если установлен этот бит и бит разрешения прерываний в регистре состояния, разрешены прерывания по переполнению таймера/счетчика 2. Соответствующее прерывание (вектор $008) выполняется при переполнении таймера/счетчика 2. В регистре флагов таймеров/счетчиков (TIFR) устанавливается флаг переполнения. Если таймер/счетчик 1 работает в режиме ШИМ, флаг переполнения устанавливается при изменении направления счета, при значении $0000.
Бит 5 - TICIE1: Разрешение прерывания по входу захвата: Если установлены бит TICIE1 и бит разрешения прерывания в регистре состояния, разрешены прерывания по входу захвата. Соответствующее прерывание (вектор $00A) выполняется по сигналу захвата на выводе 11 (PD6/ICP). В регистре флагов TIFR устанавливается ("1") флаг захвата.
Бит 4 - OCIE1A: Разрешение прерывания по совпадению таймера/счетчика 1: Если установлены бит OCIE1A и бит разрешения прерывания в регистре состояния, разрешены прерывания по совпадению таймера/счетчика 1. Прерывание (вектор $00C) выполняется при равенстве таймера/счетчика 1 и регистра совпадения. В регистре флагов TIFR устанавливается ("1") флаг совпадения.
Бит 3 - OCIE1B: Разрешение прерывания по совпадению таймера/счетчика 1: Если установлены бит OCIE1B и бит разрешения прерывания в регистре состояния, разрешены прерывания по совпадению таймера/счетчика 1. Прерывание (вектор $00E) выполняется при равенстве таймера/счетчика 1 и регистра совпадения. В регистре флагов TIFR устанавливается ("1") флаг совпадения.
Бит 2 - TOIE1: Разрешение прерывания по переполнению таймера/счетчика 1: Если установлен этот бит и бит разрешения прерываний в регистре состояния, разрешены прерывания по переполнению таймера/счетчика 1. Соответствующее прерывание (вектор $010) выполняется при переполнении таймера/счетчика 1. В регистре флагов таймеров/счетчиков (TIFR) устанавливается флаг переполнения. Если таймер/счетчик 1 работает в режиме ШИМ, флаг переполнения устанавливается при изменении направления счета, при значении $0000.
Бит 1 – OCIE0: Разрешение прерывания по совпадению таймера/счетчика 1: Если установлены бит OCIE0 и бит разрешения прерывания в регистре состояния, разрешены прерывания по совпадению таймера/счетчика 1. Прерывание (вектор $026) выполняется при равенстве таймера/счетчика 1 и регистра совпадения. В регистре флагов TIFR устанавливается ("1") флаг совпадения.
Бит 0 - TOIE0: Разрешение прерывания по переполнению таймера/счетчика 0. Если этот бит установлен в 1, и бит I в регистре состояния установлен в 1, разрешены прерывания по переполнению таймера/счетчика 0. При возникновении переполнения выполняется соответствующий вектор прерывания ($006). Флаг переполнения (TOV0) в регистре флагов прерываний (TIFR) таймеров/счетчиков устанавливается в 1.
РЕГИСТР ФЛАГОВ ПРЕРЫВАНИЙ ОТ ТАЙМЕРОВ/СЧЕТЧИКОВ – TIFR
Бит
$38($58)
Чт./зап. (R/W)
Начальн.знач.
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
|
OCF2
|
TOV2
|
ICF1
|
OCF1A
|
OCF1B
|
TOV1
|
OCF0
|
TOV0
|
TIFR
|
R/W
|
R/W
|
R
|
R
|
R/W
|
R
|
R/W
|
R
|
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
Бит 7 - OCF2: Флаг выхода совпадения T/C2: флаг устанавливается в "1" если происходит совпадение значения таймера/счетчика 2 и данных в регистре OCR. Флаг очищается аппаратно при выполнении соответствующего вектора прерывания. Кроме того, флаг можно сбросить записав в него логическую единицу. Если установлены бит I в SREG и бит OCIE2 в TIMSK, при установке бита OCF2 выполняется прерывание.
Бит 6 – TOV2: Флаг переполнения таймера/счетчика 2: Флаг TOV2 устанавливается ("1") при переполнении таймера/счетчика 0. Флаг сбрасывается аппаратно при выполнении соответствующего вектора прерывания. Кроме того, флаг можно очистить записав в него логическую единицу. Если установлены бит I в SREG и бит TOIE2 в TIMSK, при установке бита TOV2 выполняется прерывание по переполнению таймера/счетчика 2.
Бит 5 - ICF1: флаг входа захвата 1: бит устанавливается ("1") при возникновении события захвата по входу, он индицирует, что значение таймера/счетчика 1 скопировано в регистр захвата по входу ICR1. ICF1 очищается при выполнении соответствующего вектора обработки прерывания. Кроме того, флаг можно очистить, записав в него логическую единицу.
Бит 4 - OCF1A: Флаг выхода совпадения 1А: флаг устанавливается в "1" если происходит совпадение значения таймера/счетчика 1 и данных в регистре OCR1A. Флаг очищается аппаратно при выполнении соответствующего вектора прерывания. Кроме того, флаг можно сбросить записав в него логическую единицу. Если установлены бит I в SREG и бит OCIE1A в TIMSK, при установке бита OCF1A выполняется прерывание.
Бит 3 - OCF1B: Флаг выхода совпадения 1B: флаг устанавливается в "1" если происходит совпадение значения таймера/счетчика 1 и данных в регистре OCR1B. Флаг очищается аппаратно при выполнении соответствующего вектора прерывания. Кроме того, флаг можно сбросить записав в него логическую единицу. Если установлены бит I в SREG и бит OCIE1B в TIMSK, при установке бита OCF1B выполняется прерывание.
Бит 2 - TOV1: Флаг переполнения таймера/счетчика 1: Флаг TOV1 устанавливается ("1") при возникновении переполнения таймера/счетчика 1. Флаг TOV1 сбрасывается аппаратно при выполнении соответствующего вектора обработки прерывания. Кроме того, флаг можно сбросить, записав в него логическую единицу. Если установлены бит I в SREG и бит TOIE1 в TIMSK, при установке бита TOV1 выполняется прерывание по переполнению таймера/счетчика 1. В режиме ШИМ этот бит устанавливается, когда таймер/счетчик 1 изменяет направление счета при значении $0000.
Бит 1 - OCF0: Флаг выхода совпадения T/C0: флаг устанавливается в "1" если происходит совпадение значения таймера/счетчика 2 и данных в регистре OCR. Флаг очищается аппаратно при выполнении соответствующего вектора прерывания. Кроме того, флаг можно сбросить записав в него логическую единицу. Если установлены бит I в SREG и бит OCIE0 в TIMSK, при установке бита OCF0 выполняется прерывание.
Бит 0 - TOV0: Флаг переполнения таймера счетчика 1: Флаг TOV0 устанавливается ("1") при переполнении таймера/счетчика 0. Флаг сбрасывается аппаратно при выполнении соответствующего вектора прерывания. Кроме того, флаг можно очистить записав в него логическую единицу. Если установлены бит I в SREG и бит TOIE0 в TIMSK, при установке бита TOV0 выполняется прерывание по переполнению таймера/счетчика 0.
|