Rambler's Top100

Система прерываний AVR-контроллеров

1. Предисловие
2. Источники прерываний

2.1. Аппаратный сброс.

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

2.3. Таймеры-счётчики.

2.4. SPI.

2.5. Последовательный порт RS-232.

2.6. АЦП.

2.7. Готовность EEPROM.

2.8. Компаратор.
3. Таблица векторов
4. Обработчики прерываний
5. Краткое заключение.
Автор

1. Предисловие

Система прерываний AVR - это пожалуй, шедевр в мире контроллеров. Во-первых, она поддерживает вложенные прерывания. Во-вторых, система управления источниками прерываний очень гибкая, что позволяет настроить контроллер на управления внешними событиями так, как вам необходимо.
Если бы в AVR-контроллерах была бы возможность переопределять приоритеты и определять таблицу векторов прерываний, то они были бы ещё больше похожи на "взрослые" процессоры. Но даже отсутствие этого не уменьшает восхищения изяществом "решений ATMEL" (не путать с "решениями Microsoft").

Оглавление Оглавление

2. Источники прерываний.

В качестве вступления скажу, что все прерывания будут вызываться ТОЛЬКО при установленном флаге I в слове состояния.

Оглавление Оглавление

2.1. Аппаратный сброс.

Аппаратный сброс контроллера происходит при включении питания, снижении напряжения питания ниже минимально допустимого, срабатывании сторожевого таймера или при подаче логического "0" на вывод #RESET. При сбросе ВСЕГДА вызывается обработчик, находящийся по адресу $0000 и программа "начинает всё сначала", так как при сбросе происходит полная переинициализация всех I/O-регистров. Содержимое регистрового файла и RAM не определено.

Оглавление Оглавление

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

В AVR-контроллерах в зависимости от модели может быть от 1 до 8 входов внешних прерываний.
Рассмотрим систему управления внешними прерываниями. Для этого предусмотрены следующие комбинации I/O-регистров в зависимости от модели (см. соответствующий DataSheet):

  - GIMSK, MCUCR, GIFR;
  - EIMSK, EICR, EIFR;
  - GIMSK, MCUCR.
 
Первый в каждой из этих групп - это регистр масок прерываний. Контроллер вызывает соответствующий обработчик только если установлен соответствующий бит в регистре масок.
Во втором находятся биты управления реакцией на входной сигнал. Прерывание может вызываться при прямом или ообратном фронте сигнала или логическим "0" на входе.
В третьем находятся флаги прерываний. Флаги аппаратно устанавливаются при вызове прерывания и сбрасываются при возврате из обработчика по команде reti. Можно сбросить флаг и программно, но, честно говоря, необходимости в этом у меня никогда не возникало.
Вот простой пример расположения битов управления ( AT90S2313 ):

GIMSK, EIMSK, INT0, INT1 - маски соответствующих входов

INT1 INT0 - - - - - -

MCUCR, EICR

- - SE SM ISC11 ISC10 ISC01 ISC00

ISCxx - биты управления реакцией на входной сигнал.

ISCx1 ISCx0 Вход
0 0 Уровень "0"
0 1 Зарезервировано
1 0 Обратный фронт
1 1 Прямой фронт

GIFR, EIFR, INTF0, INTF1 - флаги соответствующих входов

INTF1 INTF0 - - - - - -

Пример - настройка прерывания 0 по обратному фронту:


	ldi	r16,$40
	out	gimsk,r16
	ldi	r16,2
	out	mcucr,r16
 

Оглавление Оглавление

2.3. Таймеры-счетчики.

Таймеры-счетчики могут генерировать прерывания по трём видам событий:
   - "захват" события;
   - сравнение с заданной величиной;
   - переполнение.
Маскирование прерываний от таймеров-счетчиков производится с помощью регистра TIMSK, реализация которого зависит от модели контроллера (см. DataSheets). Маскирование производится сбросом или установкой соответствующих битов в TIMSK. Как и в системе внешних прерываний, предусмотрен регистр флагов TIFR.
Управление таймерами-счетчиками более подробно рассмотрено в главе "Таймеры и ШИМ"

Оглавление Оглавление

2.4. SPI.

Прерывание "SPI Serial Transfer Complete" ( окончание последовательной передачи по SPI ) разрешается установкой бита SPIE ( SP Interrupt Enable ) в регистре SPCR. При вызове прерывания аппаратно устанавливается флаг SPIF в регистре SPSR. Более подробно об SPI см. в главе "SPI".

Оглавление Оглавление

2.5. Последовательный порт RS-232.

Прерываниями UART управляет регистр UCR ( UART Control Regiter ). Для этого предусмотрены следующие биты:
   - RXCIE - окончание приёма;
   - TXCIE - окончание передачи;
   - UDRIE - пустой регистр данных.
Текущее состояние UART при этом доступно из регистра USR ( UART Status Register ).

Оглавление Оглавление

2.6. АЦП.

Прерывание "ADC Conversion Complete" вызывается по окончании преобразования АЦП, если установлен бит ADIE в регистре ADCSR.

Оглавление Оглавление

2.7. Готовность EEPROM.

Прерывание "EEPROM Ready" вызывается по окончании записи в EEPROM, если установлен бит EERIE в регистре EECR.

Оглавление Оглавление

2.8. Компаратор.

Прерывание от аналогового компаратора управляется регистром ACSR.

ACD - ACO ACIF ACIE ACIC ACIS1 ACIS0

При установленном бите ACIE разрешено прерывание от компаратора, ACIF - флаг, устанавливаемый при его вызове.
Биты ACISx определяют событие, по которому вызывается прерывание:

ACIS1 ACIS0 Событие
0 0 Изменение состояния выхода
0 1 Зарезервировано
1 0 Обратный фронт выхода
1 1 Прямой фронт выхода

Оглавление Оглавление

3. Таблица векторов.

Таблица прерываний расположена по адресу $0000 в памяти программ. По приоритету прерывания располагаются следующим образом:

1. Аппаратный сброс: #RESET, сторожевой таймер.
2. Внешние прерывания INTx.
3. Таймеры-счётчики.
4. SPI, окончание передачи.
5. Последовательный порт RS-232.
6. АЦП.
7. Готовность EEPROM.
8. Компаратор.

В зависимости от модели контроллера некоторые из прерываний могут быть не задействованы.

Оглавление Оглавление

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

Обработчики прерываний располагаются в памяти программ начиная с адреса $0000. Собственно, это не сами обработчики, а переходы к обработчикам. Например, для ATMega(TM) переходы могут выглядеть так:

;здесь размещаются переходы к обработчикам
.org	$0000
	jmp	begin		;точка входа по аппаратному сбросу
.org	$000A
	jmp	ext_int4	;внешнее прерывание 4	
;и так далее
;***********************************************************	
	



;***********************************************************	
;здесь размещаются сами бработчики
ext_int4:			;обработчик прерывания
	.......
	reti
;и так далее
;***********************************************************	

begin:

	......			;головной модуль
  

Обратите внимание, что обработчик завершается командой reti, в отличие от просто процедуры. Для контроллеров, память программ которых меньше 2Кх16, переход производится командой rjmp, для остальных это может быть jmp.
У каждого источника прерываний в регистре его статуса (или управления) находится флаг прерывания. Он сбрасывается аппаратно при выходе из обработчика, но может быть сброшен программно, если записать в него "1".

Оглавление Оглавление

5. Краткое заключение.

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

 	sei		;устанавливаем флаг разрешения прерываний в SREG...
 
Оглавление Оглавление

© Берёзкин С.Е., 2001 г.

stlab@rambler.ru



Оглавление

Главная

Микроконтроллеры



Рейтинг@Mail.ru bigmir)net TOP 100 Rambler's Top100 AllBest.Ru Яндекс цитирования