---
# System prepended metadata

title: Прерывания

---

# Прерывания

[Доп. инфа о прерываниях](https://chipenable.ru/index.php/programming-avr/item/105-uchebnyy-kurs-ispolzovanie-vneshnih-preryvaniy-v-avr.html)

### Обработка
![](https://i.imgur.com/LeAWC46.png)

Вообще есть такой способ задать прерывания: тобишь вектор прерывания задает адресс команды, которая выполнится при прерывании.
![](https://i.imgur.com/AI2dxr9.png)
Но, полностью заполненная таблица прерываний никому не нужна, поэтому вроде как можно написать
```cp=
.org 0x(program adress) jmp ADC
```
или записать всю таблицу и заменить какой-нибудь reti на что-то нужное
```cp=
	rjmp RESET ; Reset Handler
	reti ;rjmp EXT_INT0 ; IRQ0 Handler
	reti ;rjmp EXT_INT1 ; IRQ1 Handler
	reti ;rjmp TIM2_COMP ; Timer2 Compare Handler
	reti ;rjmp TIM2_OVF ; Timer2 Overflow Handler
	reti ;rjmp TIM1_CAPT ; Timer1 Capture Handler
	reti ;rjmp TIM1_COMPA ; Timer1 CompareA Handler
	reti ;rjmp TIM1_COMPB ; Timer1 CompareB Handler
	reti ;rjmp TIM1_OVF ; Timer1 Overflow Handler
	reti ;rjmp TIM0_OVF ; Timer0 Overflow Handler
	reti ;rjmp SPI_STC ; SPI Transfer Complete Handler
	reti ;rjmp USART_RXC ; USART RX Complete Handler
	reti ;rjmp USART_UDRE ; UDR Empty Handler
	reti ;rjmp USART_TXC ; USART TX Complete Handler
	reti ;rjmp ADC ; ADC Conversion Complete Handler
	reti ;rjmp EE_RDY ; EEPROM Ready Handler
	reti ;jmp ANA_COMP ; Analog Comparator Handler
	reti ;rjmp TWSI ; Two-wire Serial Interface Handler
	reti ;rjmp SPM_RDY ; Store Program Memory Ready Handler
```


### Теория


Прерывание ( interrupt ) - это своеобразная функция, которая будет выполнена при поступлении сигнала на какой нибудь вход контроллера.
При работе в AVR Studio прерывания создаются при помощи макросов ISR() , SIGNAL() и INTERRUPT(). Они помечают некоторую функцию как обработчик прерывания. Их различие в том, что INTERRUPT() и ISR() определяют функцию обработчик для случая, когда разрешено общее прерывание (обработчик может быть прерван), а SIGNAL() для случая когда общее прерывание запрещено.

Прерывания бывают **синхронные** (вызыванные в саммом процессоре, в основном при исключительных ситуациях, например при арифметической ошибке), или **асинхронные**, вызванные другим устройствами

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

У процессора есть спец. контакты прерывания (int0, int1, int2), сигнал на который обозначает собственно внешнее прерывание. Определение может происходить по уровню или по фронту (это определяется регистром MCUCR, но работа int2 определяется mcucsr)
![](https://blablacode.ru/img/users/dimas/7d923bcfb4b0e704e65abe6527034e78cddb7b.png)
три внешних прерывания - INT0, INT1 и INT2. Эти прерывания жестко «привязаны» к выводам PD2, PD3 и PB2 и переназначить их на другие выводы нельзя. 
Когда используются внешние прерывания, выводы PD2, PD3 и PB2  конфигурируются на вход. Однако если они настроены на выход, внешние прерывания тоже будут генерироваться при изменении их состояния, что позволяет реализовать программные прерывания. 
Для разрешения или запрещения внешних прерываний предназначен управляющий  регистр GICR (General Interrupt Control Register).

Причин прерываний может быть несколько - и в случае возникновения нескольких из них одновременно возникает проблема приоритетов, плюс пока мы обрабатываем 1 прерывание, событие, вызвавшее 2 может самоликвидироваться

Обычно прерывания НЕ реентерабильны. То есть, в момент работы прерывания нельзя повторно вызвать это же прерывание. Именно для защиты от повторного вхождения в обработчик прерывания автоматически запрещаются в момент его обработки  (если вам захотелось разрешить прерывания в процедуре обработки прерываний, надо десять, двадцать раз подумать, прежде чем сделать такой опрометчивый шаг).

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

А ещё может оказаться так, что обработка прерывания нам вообще не нужна - например, достаточно, что схема вышла из спящего режима. Но в этом случае все равно надо писать функцию прерывания, пусть даже пустую - так называемую "заглушку".