2.3 Сброс и обработка прерываний.

В AT90S2313 предусмотрены 10 источников прерываний. Эти прерывания и сброс имеют различные векторы в области памяти программ. Каждому из прерываний присвоен отдельный бит разрешающий данное прерывание при установке бита в 1, если бит I регистра состояния разрешает общее обслуживание прерываний.

Самые младшие адреса памяти программ определены как векторы сброса и прерываний. Полный список векторов прерываний приведен в таблице 2.1. Этот список определяет и приоритет различных прерываний. Меньшие адреса соответствуют более высокому уровню приоритета. Самый высокий уровень у сброса, следующий приоритет у INT0 - внешнего запроса прерывания 0 и т.д.

Ниже приведена типичная программа обработки сброса и векторов прерываний:

Address Labels Code Comments
$000 rjmp RESET Обработка сброса
$001 rjmp EXT_INT0 Обработка IRQ0
$002 rjmp EXT_INT1 Обработка IRQ1
$003 rjmp TIM_CAPT1 Обработка захвата таймера 1
$004 rjmp TIM_COMP1 Обработка совпадения таймера 1
$005 rjmp TIM_OVF1 Обработка переполнения таймера1
$006 rjmp TIM_OVF0 Обработка переполнения таймера0
$007 rjmp UART_RXC Обработка приема байта
$008 rjmp UART_DRE Обработка освобождения UDR
$009 rjmp UART_TXC Обработка передачи байта
$00a rjmp ANA_COMP Обработка аналогового компаратора
$00b MAIN<instr> xxx Начало основной программы
Таблица 2.1. Сброс и векторы прерываний.
Номер вектора Адрес Источник Описание прерывания
1 0x000 RESET Ножка сброса и сброс от сторожевого таймера
2 0x001 INT0 Внешнее прерывание 0
3 0x002 INT1 Внешнее прерывание 1
4 0x003 TIMER1 CAPT1 Захват таймера/счетчика 1
5 0x004 TIMER1 COMP1 Совпаден. таймера/счетчика 1
6 0x005 TIMER1 OVF1 Переполнение таймера/счетчика 1
7 0x006 TIMER0 OVF0 Переполнение таймера/счетчика 0
8 0x007 UART RX Последоват. порт прием закончен
9 0x008 UART UDRE Посл. порт регистр данных пуст
10 0x009 UART TX Посл.порт передача закончена
11 0x00A ANA_COMP Аналоговый компаратор

Источники сброса

AT90S2313 имеет три источника сброса.

Во время сброса все регистры ввода/вывода устанавливаются в начальные значения, программа начинает выполняться с адреса $000, по этому адресу должна быть записана команда RJMP - относительный переход на программу обработки сброса. Если в программе не разрешаются прерывания и векторы прерываний не используются, в первых адресах памяти может быть записана программа.

Сброс по включению питания

Цепь сброса по включению питания обеспечивает запрет включения процессора до тех пор, пока напряжение питания не достигнет безопасного уровня. После того, как напряжение питания достигнет уровня включения, процессор не включается до тех пор, пока встроенный таймер не обработает несколько рабочих периодов сторожевого таймера.

Если к процессору подключен керамический резонатор или другой, обеспечивающий быстрое включение, для уменьшения времени сброса можно запрограммировать бит-перемычку FSTRT.

Поскольку к выводу RESET подключен подтягивающий резистор, этот вывод может оставаться неподключенным, если не требуется внешний сброс. Подключение вывода RESET к напряжению питания дает тот же эффект. Время включения после подачи питания может быть увеличено удержанием вывода сброса на низком уровне.

Внешний сброс

Внешний сброс обрабатывается по низкому уровню на выводе RESET. Вывод должен удерживаться в низком состоянии по крайней мере два периода тактовой частоты. После достижения напряжения Vrst запускается таймер задержки, через промежуток времени Tout процессор запускается.

Сброс по сторожевому таймеру

После отработки цикла сторожевого таймера, он вырабатывает короткий импульс сброса. По спадающему фронту этого импульса запускается внутренний счетчик, отсчитывающий время Tout.

Обработка прерываний

AT90S2313 имеет два регистра маски прерываний GIMSK - общий регистр маски прерываний и TIMSK - регистр маски прерываний от таймера/счетчика.

Когда возникает прерывание бит глобального разрешения прерываний I сбрасывается (ноль) и все прерывания запрещаются. Программа пользователя может установить этот бит для разрешения прерываний. Флаг разрешения прерываний I устанавливается в 1 при выполнении команды выхода из прерывания - RETI.

Для прерываний включаемых статическими событиями (напр. совпадение значения счетчика/таймера 1 с регистром совпадения) флаг прерывания взводится при возникновении события. Если флаг прерывания очищен и присутствует условие возникновения прерывания, флаг не будет установлен, пока не произойдет следующее событие.

Когда программный счетчик устанавливается на текущий вектор прерывания для его обработки, соответствующий флаг, сгенерированный прерыванием, аппаратно сбрасывается. Некоторые флаги прерывания могут быть сброшены записью логической единицы в бит соответствующий флагу.

Общий регистр маски прерываний GIMSK
Бит 7 6 5 4 3 2 1 0  
$3D ($5D) INT1 INT0 - - - - - - GIMSK
Чт./зап (R/W) R/W R/W R R R R R R  
Начальн.знач. 0 0 0 0 0 0 0 0  

Бит 7 - INT1: Запрос внешнего прерывания 1 разрешен. Когда этот бит установлен, а также установлен бит I регистра состояния, разрешается прерывание от внешнего вывода. Биты управления запуском прерывания (ISC11 и ISC10) в регистре управления микроконтроллером (MCUCR) определяют по какому событию отрабатывается прерывание - по спадающему или нарастающему фронту или же по уровню. Активность на выводе приводит к возникновению прерываний даже если вывод сконфигурирован как выход. При возникновении прерывания выполняется программа, начинающаяся с адреса $002 в памяти программ. (см. также "Внешние прерывания").

Бит 6 - INT0: Запрос внешнего прерывания 0 разрешен. Когда этот бит установлен, а также установлен бит I регистра состояния, разрешается прерывание от внешнего вывода. Биты управления запуском прерывания (ISC01 и ISC00) в регистре управления микроконтроллером (MCUCR) определяют по какому событию отрабатывается прерывание - по спадающему или нарастающему фронту или же по уровню. Активность на выводе приводит к возникновению прерываний даже если вывод сконфигурирован как выход. При возникновении прерывания выполняется программа, начинающаяся с адреса $001 в памяти программ. (см. также "Внешние прерывания").

Биты 5..0 - зарезервированы. В AT90S2313 эти биты зарезервированы и всегда читаются как 0.

Общий регистр флагов прерываний GIFR
Бит 7 6 5 4 3 2 1 0  
$3D ($5В) INTF1 INTF0 - - - - - - GIFR
Чт./зап (R/W) R 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, происходит переход на вектор прерывания по адресу $002. Флаг очищается после выполнения обработчика прерывания. Кроме того, флаг можно очистить, записав в него логическую единицу.

Бит 6 - INTF0: Флаг внешнего прерывания 0: При возникновении на выводе INT0 события вызывающего прерывание, INTF0 устанавливается в "1". Если установлены бит I регистра SREG и бит INT0 в GIMSK, происходит переход на вектор прерывания по адресу $001. Флаг очищается после выполнения обработчика прерывания. Кроме того, флаг можно очистить, записав в него логическую единицу.

Биты 5..0 - зарезервированы. В AT90S2313 эти биты зарезервированы и всегда читаются как 0.

Регистр маски прерывания от таймера/счетчика TIMSK
Бит 7 6 5 4 3 2 1 0  
$39($59) TOIE1 OCIE1A - - TICIE1 - TOIE0 - TIMSK
Чт./зап R/W R/W R/W R/W R/W R/W R/W R/W  
Нач.знач. 0 0 0 0 0 0 0 0  

Бит 7 - TOIE1: Разрешение прерывания по переполнению таймера/счетчика 1: Если установлен этот бит и бит разрешения прерываний в регистре состояния, разрешены прерывания по переполнению таймера/счетчика 1.

Соответствующее прерывание (вектор $005) выполняется при переполнении таймера/счетчика 1. В регистре флагов таймеров/счетчиков (TIFR) устанавливается флаг переполнения. Если таймер/счетчик 1 работает в режиме ШИМ, флаг переполнения устанавливается при изменении направления счета, при значении $0000.

Бит 6 - OCIE1A: Разрешение прерывания по совпадению таймера/счетчика 1: Если установлены бит OCIE1A и бит разрешения прерывания в регистре состояния, разрешены прерывания по совпадению таймера/счетчика 1.Прерывание (вектор $004) выполняется при равенстве таймера/счетчика 1 и регистра совпадения. Во флаговом регистре TIFR устанавливается ("1") флаг совпадения.

Биты 5,4 - зарезервированы; в AT90S2313 эти биты зарезервированы и всегда читаются как 0.

Бит 3 - TICIE1: Разрешение прерывания по входу захвата: Если установлены бит TICIE1 и бит разрешения прерывания в регистре состояния, разрешены прерывания по входу захвата. Соответствующее прерывание (вектор $003) выполняется по сигналу захвата на выводе 11 (PD6/ICP). Во флаговом регистре TIFR устанавливается ("1") флаг захвата.

Бит 2 - зарезервирован; в AT90S2313 этот бит зарезервирован и всегда читается как 0.

Бит 1 - TOIE0: Разрешение прерывания по переполнению таймера/счетчика 0. Если этот бит установлен в 1, и бит I в регистре состояния установлен в 1, разрешены прерывания по переполнению таймера/счетчика 0.

При возникновении переполнения выполняется соответствующий вектор прерывания ($006). Флаг переполнения (TOV0) во флаговом регистре прерываний (TIFR) таймеров/счетчиков устанавливается в 1.

Бит 0 - зарезервирован; в AT90S2313 этот бит зарезервирован и всегда читается как 0.

Регистр флагов прерываний от таймеров/счетчиков TIFR
Бит 7 6 5 4 3 2 1 0  
$38($58) TOV1 OCF1A - - ICF1 - TOV0 - TIFR
Чт./зап R/W R/W R/W R/W R/W R/W R/W R/W  
Нач.знач. 0 0 0 0 0 0 0 0  

Бит 7 - TOV1: Флаг переполнения таймера/счетчика 1: Флаг TOV1 устанавливается ("1") при возникновении переполнения таймера/счетчика 1.

Флаг TOV1 сбрасывается аппаратно при выполнении соответствующего вектора обработки прерывания. Кроме того, флаг можно сбросить, записав в него логическую единицу. Если установлены бит I в SREG и бит TOIE1 в TIMSK, при установке бита TOV1 выполняется прерывание по переполнению таймера/счетчика 1. В режиме ШИМ этот бит устанавливается, когда таймер/счетчик 1 изменяет направление счета при значении $0000.

Бит 6 - OCF1A: Флаг выхода совпадения 1А: флаг устанавливается в "1" если происходит совпадение значения таймера/счетчика 1 и данных в регистре OCR1A. Флаг очищается аппаратно при выполнении соответствующего вектора прерывания. Кроме того, флаг можно сбросить, записав в него логическую единицу. Если установлены бит I в SREG и бит OCIE1A в TIMSK, при установке бита OCF1A выполняется прерывание.

Биты 5,4 - зарезервированы; в AT90S2313 эти биты зарезервированы и всегда читаются как 0.

Бит 3 - ICF1: флаг входа захвата 1: бит устанавливается ("1") при возникновении события захвата по входу, он индицирует, что значение таймера/счетчика 1 скопировано в регистр захвата по входу ICR1. ICF1 очищается при выполнении соответствующего вектора обработки прерывания. Кроме того, флаг можно очистить, записав в него логическую единицу.

Бит 2 - зарезервирован; в AT90S2313 этот бит зарезервирован и всегда читается как 0.

Бит 1 - TOV0: Флаг переполнения таймера счетчика 1: Флаг TOV0 устанавливается ("1") при переполнении таймера/счетчика 0. Флаг сбрасывается аппаратно при выполнении соответствующего вектора прерывания. Кроме того, флаг можно очистить записав в него логическую единицу. Если установлены бит I в SREG и бит TOIE0 в TIMSK, при установке бита TOV0 выполняется прерывание по переполнению таймера/счетчика 0.

Бит 0 - зарезервирован; в AT90S2313 этот бит зарезервирован и всегда читается как 0.

Внешние прерывания

Внешние прерывания управляются выводами INT0 и INT1. Заметим, что прерывания обрабатываются даже когда выводы сконфигурированы как выходы. Это позволяет генерировать программные прерывания. Внешние прерывания могут возникать по спадающему или нарастающему фронту, а также по низкому уровню. Это устанавливается в регистре управления процессором MCUCR. Если внешние прерывания разрешены и сконфигурированы на отработку по уровню, прерывание будет вырабатываться до тех пор, пока вывод удерживается в низком состоянии.

Управление работой внешних прерываний рассмотрено при описании регистра управления процессором MCUCR.

Время реакции на прерывание

Минимальное время реакции на любое из предусмотренных в процессоре прерываний - 4 периода тактовой частоты. После четырех циклов вызывается программный вектор обрабатывающий данное прерывание. За эти 4 цикла программный счетчик записывается в стек, указатель стека уменьшается на 2. Программный вектор представляет собой относительный переход на подпрограмму обслуживания прерывания и этот переход занимает 2 периода тактовой частоты. Если прерывание происходит во время выполнения команды длящейся несколько циклов, перед вызовом прерывания завершается выполнение этой команды.

Выход из программы обслуживания прерывания занимает 4 периода тактовой частоты. За эти 4 периода из стека восстанавливается программный счетчик. После выхода из прерывания процессор всегда выполняет еще одну команду прежде чем обслужить любое отложенное прерывание.

Заметим, что регистр состояния SREG аппаратно не обрабатывается процессором, как при вызове подпрограмм, так и при обслуживании прерываний. Если программа требует сохранения SREG, оно должно производиться программой пользователя.

Регистр управления микроконтроллером MCUCR

Этот регистр содержит биты общего управления микроконтроллером.

Бит 7 6 5 4 3 2 1 0  
$35($55) - - SE SM ISC11 ISC10 ISC01 ISC00 MCUCR
Чт./зап (R/W) R R R/W R/W R R R/W R/W  
Начальн.знач. 0 0 0 0 0 0 0 0  

Биты 7,6 - зарезервированы. В AT90S2313 эти биты зарезервированы и всегда читаются как 0.

Бит 5 - SE: Разрешение режима Sleep: Этот бит должен быть установлен в 1, чтобы при выполнении команды SLEEP процессор переходил в режим пониженного энергопотребления. Этот бит должен быть установлен в 1 до исполнения команды SLEEP.

Бит 4 - SM: Режим Sleep: Этот бит выбирает один из двух режимов пониженного энергопотребления. Если бит сброшен (0), в качестве режима Sleep выбирается холостой режим (Idle mode). Если бит установлен, выбирается экономичный режим (Power down). Особенности каждого из режимов будут рассмотрены ниже.

Биты 3,2 - ISC11, ISC10: биты управления срабатыванием прерывания 1:

Внешнее прерывание активируется выводом INT1 если установлен флаг I регистра состояния SREG и установлена соответствующая маска в регистре GIMSK. Срабатывание по уровню и фронтам задается следующим образом:

Таблица 2.2. Управление срабатыванием прерывания 1.
ISC11 ISC10 Описание
0 0 Запрос на прерывание генерируется по низкому уровню на входе INT1
0 1 Зарезервировано
1 0 Запрос на прерывание по спадающему фронту на входе INT1
1 1 Запрос на прерывание по нарастающ. фронту на входе INT1

ПРИМЕЧАНИЕ: При изменении битов ISC11/ISC10 прерывание INT1 должно быть запрещено очисткой соответствующего бита в регистре GIMSK. Иначе прерывание может возникнуть во время изменения битов.

Таблица 2.3. Управление срабатыванием прерывания 0
ISC01 ISC00 Описание
0 0 Запрос на прерывание генерируется по низкому уровню на входе INT0
0 1 Зарезервировано
1 0 Запрос на прерывание по спадающему фронту на входе INT0
1 1 Запрос на прерывание по нарастающ. фронту на входе INT0

Примечание: При изменении битов ISC01 и ISC00, прерывания по входу INT0 должны быть запрещены сбросом бита разрешения прерывания в регистре GIMSK. Иначе прерывание может произойти при изменении значения битов.

Биты 1,0 - ISC01, ISC00: биты управления срабатыванием прерывания 0:

Внешнее прерывание активируется выводом INT0 если установлен флаг I регистра состояния SREG и установлена соответствующая маска в регистре GIMSK.


Hosted by uCoz