Лекция 2. Прерывания
.pdf
Прерывания
●Прерывание (Interrupt) – это сигнал процессору, сообщающий о наступлении какого-либа события, приостанавливающий текущее выполнение инструкций и передающий управление в обработчик прерывания
Таблица векторов прерываний в AVR
●Последовательность слов, располагающаяся с нулевого адреса Flash, каждое слово (2 байта) содержит команду перехода на соответствующий обработчик прерывания (rjmp или jmp) если прерывание включено, и reti – если выключено
●В AVR чем меньше адрес вектора прерываний, тем выше его приоритет
Таблица прерываний для m328p
rjmp RESET  | 
	; Reset Handler  | 
rjmp EXT_INT0  | 
	; IRQ0 Handler  | 
rjmp EXT_INT1  | 
	; IRQ1 Handler  | 
rjmp PCINT0  | 
	; PCINT0 Handler  | 
rjmp PCINT1  | 
	; PCINT1 Handler  | 
rjmp PCINT2  | 
	; PCINT2 Handler  | 
rjmp WDT  | 
	; Watchdog Timer Handler  | 
rjmp TIM2_COMPA  | 
	; Timer2 Compare A Handler  | 
rjmp TIM2_COMPB  | 
	; Timer2 Compare B Handler  | 
rjmp TIM2_OVF  | 
	; Timer2 Overflow Handler  | 
rjmp TIM1_CAPT  | 
	; Timer1 Capture Handler  | 
rjmp TIM1_COMPA  | 
	; Timer1 Compare A Handler  | 
rjmp TIM1_COMPB  | 
	; Timer1 Compare B Handler  | 
rjmp TIM1_OVF  | 
	; Timer1 Overflow Handler  | 
rjmp TIM0_COMPA  | 
	; Timer0 Compare A Handler  | 
rjmp TIM0_COMPB  | 
	; Timer0 Compare B Handler  | 
rjmp TIM0_OVF  | 
	; Timer0 Overflow Handler  | 
rjmp SPI_STC  | 
	; SPI Transfer Complete Handler  | 
rjmp USART_RXC  | 
	; USART, RX Complete Handler  | 
rjmp USART_UDRE  | 
	; USART, UDR Empty Handler  | 
rjmp USART_TXC  | 
	; USART, TX Complete Handler  | 
rjmp ADC  | 
	; ADC Conversion Complete Handler  | 
rjmp EE_RDY  | 
	; EEPROM Ready Handler  | 
rjmp ANA_COMP  | 
	; Analog Comparator Handler  | 
rjmp TWI  | 
	; 2-wire Serial Interface Handler  | 
Маски прерываний
●В AVR – это биты, включающие или выключающие отдельные прерывания. Обычно "1" – разрешить прерывание, "0" – запретить
●Маски сгруппированы в ресистры I/O – например TIMSKn для таймеров, EIMSK и PCIMSKn – прерывания от линий и т.д. (остальные пока не понадобятся)
Глобальный запрет/разрешение прерываний
●Бит I (7-й) регистра SREG отвечает за глобальное разрешение ("1") или запрет ("0") всех прерываний
●После входа в обработчик прерывания бит I очищается аппаратно, т.е. запрещает вложенные прерывания, а при выходе – восстанавливается обратно в "1"
●Это поведение можно менять инструкциями sei – SREG[7] = 1, разрешить, cli – SREG[7] = 0, запретить. На языке С – соответственно функциями sei() и cli()
●Для работы с прерываниями на языке C необходимо подключить <avr/interrupt.h>
Флаги прерываний
●Это биты, которые устанавливаются (в "1"), когда приходит прерывание, и очищается при попадании в обработчик прерывания
●Если очень захочется, то их можно сбрасывать и программно, записью "1" (внезапно...) в регистр флагов
Таймеры
●Таймер – это периферия, умеющая инкрементить значение в счётном регистре каждый такт, а также генерировать прерывания:
по переполнению счётного регистра
по равенству текущего значения счётного регистра некоторому другому заданному значению
●Источником тактовых импульсов для таймера могу быть:
Внутренний генератор (с предделителем или без)
Внешний тактовый импульс (по фронту или спаду)
●Некотороые другие возможности таймеров: генерировать ШИМ, работать в режиме захвата, генерировать импульсы переменной частоты
Регистры I/O
●Для 8-битного таймера TIM0 имеем:
–TIMSK0 – регистр масок прерываний
–TIFR0 – регистр флагов прерываний
–TCNT0 – счётный регистр
–TCCR0A, TCCR0B – регистры управления режимами таймера
–OCR0A, OCR0B – регистры сравнения (актуально когда включен один из режимов сравнения)
Регистры I/O
