Лекция 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