# Прерывания В этом разделе описываются особенности обработки прерываний в микроконтроллерах 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) + соответствующий адрес вектора
из таблицы векторов прерываний** |