# Прерывания
В этом разделе описываются особенности обработки прерываний в
микроконтроллерах LGT8F88P/168P/328P.
## Вектора прерываний
В микроконтроллерах LGT8F88P/168P/328P имеется 30 источников прерываний и есть возможность переноса начального адреса таблицы векторов прерываний. Каждый вектор прерывания занимает одно командное слово в LGT8F88P и два командных слова в LGT8F168P/328P.
### Список векторов прерываний LGT8F88P
| № | Адрес | Источник | Описание |
|-|-|-|-|
| 1 | 0x0000 | RESET | Внешний сброс, сброс при включении питания, сброс сторожевого таймера, отладка SWD, сброс по низкому напряжению |
| 2 | 0x0001 | INT0 | Внешнее прерывание 0 |
| 3 | 0x0002 | INT1 | Внешнее прерывание 1 |
| 4 | 0x0003 | PCI0 | Прерывание по уровню на выводе 0 |
| 5 | 0x0004 | PCI1 | Прерывание по уровню на выводе 1 |
| 6 | 0x0005 | PCI2 | Прерывание по уровню на выводе 2 |
| 7 | 0x0006 | WDT | Прерывание по переполнению сторожевого таймера |
| 8 | 0x0007 | TC2 COMPA | Прерывание таймера 2 по совпадению A |
| 9 | 0x0008 | TC2 COMPB | Прерывание таймера 2 по совпадению B |
| 10 | 0x0009 | TC2 OVF | Прерывание таймера 2 по переполнению |
| 11 | 0x000A | TC1 CAPT | Прерывание таймера 1 по захвату |
| 12 | 0x000B | TC1 COMPA | Прерывание таймера 1 по совпадению A |
| 13 | 0x000C | TC1 COMPB | Прерывание таймера 1 по совпадению B |
| 14 | 0x000D | TC1 OVF | Прерывание таймера 1 по переполнению |
| 15 | 0x000E | TC0 COMPA | Прерывание таймера 0 по совпадению A |
| 16 | 0x000F | TC0 COMPB | Прерывание таймера 0 по совпадению B |
| 17 | 0x0010 | TC0 OVF | Прерывание таймера 0 по переполнению |
| 18 | 0x0011 | SPI STC | Прерывание по завершению последовательной передачи SPI |
| 19 | 0x0012 | USART RXC | Прерывание по завершению приёма USART |
| 20 | 0x0013 | USART UDRE | Прерывание по пустому регистру данных USART |
| 21 | 0x0014 | USART TXC | Прерывание по завершению передачи USART |
| 22 | 0x0015 | ADC | Прерывание по завершению преобразования АЦП |
| 23 | 0x0016 | EE_RDY | Прерывание по готовности EEPROM |
| 24 | 0x0017 | ANA_COMP | Прерывание аналогового компаратора 0 |
| 25 | 0x0018 | TWI | Прерывание двухпроводного последовательного интерфейса |
| 26 | 0x0019 | ANA_COMP1 | Прерывание аналогового компаратора 1 |
| 27 | 0x001A | — | Зарезервировано |
| 28 | 0x001B | PCI3 | Прерывание по уровню на выводе 3 |
| 29 | 0x001C | PCI4 | Прерывание по уровню на выводе 4 |
| 30 | 0x001D | TC3_INT | Прерывание таймера 3 |
### Список векторов прерываний LGT8F168P/328P
| № | Адрес | Источник | Описание |
|-|-|-|-|
| 1 | 0x0000 | RESET | Внешний сброс, сброс при включении питания, сброс сторожевого таймера, отладка SWD, сброс по низкому напряжению |
| 2 | 0x0002 | INT0 | Внешнее прерывание 0 |
| 3 | 0x0004 | INT1 | Внешнее прерывание 1 |
| 4 | 0x0006 | PCI0 | Прерывание по уровню на выводе 0 |
| 5 | 0x0008 | PCI1 | Прерывание по уровню на выводе 1 |
| 6 | 0x000A | PCI2 | Прерывание по уровню на выводе 2 |
| 7 | 0x000C | WDT | Прерывание по переполнению сторожевого таймера |
| 8 | 0x000E | TC2 COMPA | Прерывание таймера 2 по совпадению A |
| 9 | 0x0010 | TC2 COMPB | Прерывание таймера 2 по совпадению B |
| 10 | 0x0012 | TC2 OVF | Прерывание таймера 2 по переполнению |
| 11 | 0x0014 | TC1 CAPT | Прерывание таймера 1 по захвату |
| 12 | 0x0016 | TC1 COMPA | Прерывание таймера 1 по совпадению A |
| 13 | 0x0018 | TC1 COMPB | Прерывание таймера 1 по совпадению B |
| 14 | 0x001A | TC1 OVF | Прерывание таймера 1 по переполнению |
| 15 | 0x001C | TC0 COMPA | Прерывание таймера 0 по совпадению A |
| 16 | 0x001E | TC0 COMPB | Прерывание таймера 0 по совпадению B |
| 17 | 0x0020 | TC0 OVF | Прерывание таймера 0 по переполнению |
| 18 | 0x0022 | SPI STC | Прерывание по завершению последовательной передачи SPI |
| 19 | 0x0024 | USART RXC | Прерывание по завершению приёма USART |
| 20 | 0x0026 | USART UDRE | Прерывание по пустому регистру данных USART |
| 21 | 0x0028 | USART TXC | Прерывание по завершению передачи USART |
| 22 | 0x002A | ADC | Прерывание по завершению преобразования АЦП |
| 23 | 0x002C | EE_RDY | Прерывание по готовности EEPROM |
| 24 | 0x002E | ANA_COMP | Прерывание аналогового компаратора |
| 25 | 0x0030 | TWI | Прерывание двухпроводного последовательного интерфейса |
| 26 | 0x0032 | ANA_COMP1 | Прерывание аналогового компаратора 1 |
| 27 | 0x0034 | — | Зарезервировано |
| 28 | 0x0036 | PCI3 | Прерывание по уровню на выводе 3 |
| 29 | 0x0038 | PCI4 | Прерывание по уровню на выводе 4 |
| 30 | 0x003A | TC3_INT | Прерывание таймера 3 |
**Примечание для LGT8FX8P:**
Вектор сброса (RESET) начинает выполнение с адреса **0x0000**.
Все остальные адреса векторов (кроме вектора сброса) могут быть перенаправлены на начальный адрес с выравниванием **512 байт** с помощью бита **IVSEL** в регистре MCUCR и регистра **IVBASE**.
## Обработка векторов прерываний
Типичная конфигурация программы для адресов вектора сброса и прерывания в **LGT8F88P** выглядит следующим образом:
```assembly
0x000 RJMP RESET ; Вектор сброса
0x001 RJMP EXT_INT0 ; Внешнее прерывание 0
0x002 RJMP EXT_INT1 ; Внешнее прерывание 1
0x003 RJMP PCINT0 ; Прерывание по изменению уровня 0
0x004 RJMP PCINT1 ; Прерывание по изменению уровня 1
0x005 RJMP PCINT2 ; Прерывание по изменению уровня 2
0x006 RJMP WDT ; Прерывание сторожевого таймера
0x007 RJMP TIM2_COMPA ; Прерывание таймера 2 по совпадению A
0x008 RJMP TIM2_COMPB ; Прерывание таймера 2 по совпадению B
0x009 RJMP TIM2_OVF ; Прерывание таймера 2 по переполнению
0x00A RJMP TIM1_CAPT ; Прерывание таймера 1 по захвату
0x00B RJMP TIM1_COMPA ; Прерывание таймера 1 по совпадению A
0x00C RJMP TIM1_COMPB ; Прерывание таймера 1 по совпадению B
0x00D RJMP TIM1_OVF ; Прерывание таймера 1 по переполнению
0x00E RJMP TIM0_COMPA ; Прерывание таймера 0 по совпадению A
0x00F RJMP TIM0_COMPB ; Прерывание таймера 0 по совпадению B
0x010 RJMP TIM0_OVF ; Прерывание таймера 0 по переполнению
0x011 RJMP SPI_STC ; Прерывание по завершению передачи SPI
0x012 RJMP USART_RXC ; Прерывание по завершению приёма USART
0x013 RJMP USART_UDRE ; Прерывание по пустому регистру данных USART
0x014 RJMP USART_TXC ; Прерывание по завершению передачи USART
0x015 RJMP ADC ; Прерывание по завершению преобразования АЦП
0x016 RJMP EE_RDY ; Прерывание по готовности контроллера EEPROM
0x017 RJMP ANA_COMP ; Прерывание компаратора
0x018 RJMP TWI ; Прерывание контроллера TWI
0x019 NOP ; Зарезервированный адрес
0x01A NOP ; Зарезервированный адрес
0x01B RJMP PCI3 ; Прерывание по изменению уровня на выводе 3
RESET:
0x01C ldi r16, high(RAMEND) ; Main program start
0x01D out SPH, r16 ; Set Stack Pointer to top of RAM
0x01E ldi r16, low(RAMEND)
0x01F out SPL, r16
0x020 sei ; Enable interrupts
0x021 ...
```
## Описание регистров
### Регистр управления MCU — MCUCR
| MCUCR: 0x35 (0x55) | Значение по умолчанию: 0x00 |
|--------------------|-----------------------------|
| MCUCR | FWKEN | FPDEN | EXRFD | PUD | IRLD | IFAIL | IVSEL | WCE |
|-------|-------|-------|-------|-----|------|-------|-------|-----|
| R/W | R/W | R/W | R/W | R/W | W/O | R/O | R/W | R/W |
#### Описание битов
| Бит | Обозначение | Описание |
|-----|-------------|----------|
| [0] | WCE | Бит разрешения обновления MCUCR.
Перед обновлением MCUCR необходимо установить этот бит,
затем выполнить обновление регистра MCUCR в течение 6 циклов. |
| [1] | IVSEL | Бит выбора вектора прерывания.
Когда этот бит установлен в 1, адреса векторов прерываний
будут переназначены на новый адрес в соответствии
со значением регистра IVBASE. |
| [2] | IFAIL | Флаг сбоя загрузки конфигурации системы.
0 = проверка конфигурационной информации пройдена
1 = сбой загрузки конфигурационной информации |
| [3] | IRLD | Запись 1 инициирует перезагрузку конфигурации системы. |
| [4] | PUD | Глобальный бит запрета подтяжки (pull-up).
0 = глобальное управление подтяжкой включено
1 = подтягивающие резисторы на всех входах/выходах отключены |
| [5] | EXRFD | Бит запрета фильтрации внешнего сброса.
0 = цифровой фильтр внешнего сброса (190 мкс) включён
1 = цифровой фильтр внешнего сброса отключён |
| [6] | FPDEN | Управление питанием Flash (Power-down).
0 = после перехода системы в SLEEP питание Flash сохраняется
1 = после перехода системы в SLEEP питание Flash отключается |
| [7] | FWKEN | Управление режимом быстрого пробуждения.
Действителен только для режима Power/Off.
0 = задержка фильтрации 260 мкс
1 = задержка фильтрации 32 мкс |
### Регистр базового адреса векторов прерываний — IVBASE
| IVBASE: 0x75 | Значение по умолчанию: 0x00 |
|--------------|-----------------------------|
| IVBASE | IVBASE[7:0] |
|--------|-------------|
| R/W | R/W |
#### Описание битов
| Биты | Обозначение | Описание |
|------|-------------|----------|
| [7:0] | IVBASE | Если бит IVSEL установлен в 1, векторы прерываний (за исключением
вектора сброса) будут переназначены на новый базовый адрес
IVBASE страницей размером 512 байт.
Базовый адрес векторов прерываний после переназначения
вычисляется как:
**(IVBASE << 8) + соответствующий адрес вектора
из таблицы векторов прерываний** |