Управление прерываниями
УПРАВЛЕНИЕ ПРЕРЫВАНИЯМИ
Серия РIС16ХХХ
Регистры SFR, связанные с прерываниями: INTCON, PIE1, PIR1, PIE2, PIR2.
Регистр управления прерываниями INTCON:
R/W - 0 | R/W - 0 | R/W - 0 | R/W - 0 | R/W - 0 | Рекомендуемые материалыFREE Управление учетными записями пользователей FREE Управление общежитием, учет прибывших, убывших студентов, контроль над своевременной уплатой сумм за проживание в общежитие FREE Управление сложными системами FREE КП - управление цветом экрана FREE КП - управление принтером, 1 вариант FREE Добыча знаний и управление ими R/W - 0 | R/W - 0 | R/W - x |
GIE | PEIE | T0IE | INTE(2) | RBIE(1.2) | T0IF | INTF(2) | RBIF(1.2) |
Бит 7 | Бит 0 |
GIE = 1/0 - глобальное разрешение/запрещение прерываний.
PEIE = 10 - разрешение/запрещение прерываний от периферии.
T0IE = 1/0 - разрешение/запрещение прерываний по переполнению от TMR0.
INTE = 1/0 - разрешение/запрещение внешнего прерывания.
RBIE = 1/0 - разрешение/запрещение прерываний по изменению уровня на выводах RВ7:RВ4 порта РОRТВ.
T0IF - флаг прерывания по переполнению от TMR0.
INTF - флаг внешнего прерывания.
RBIF - флаг прерывания по изменению уровня на выводах RВ7:RВ4 порта РОRТВ.
Примечания:
1) В некоторых МК вместо битов RBIE и RBIF могут быть GPIЕ и GРIF соответственно.
2) Отсутствует у некоторых МК.
3) В МК с одним периферийным модулем этот бит может быть ЕЕIЕ или АDIЕ.
Регистр РIЕ1:
PSPIE | ADIE | RCIE | TXIE | SSPIE | CCP1IE | TMR2IE | TMR1IE |
Бит 7 | Бит 0 |
PSPIE: для микроконтроллера РIС16F873 всегда должен быть сброшен
ADIE: 1/0 -разрешение/запрет прерывания от модуля АЦП
RCIE: 10 - разрешение/запрет прерывания от асинхронного последовательного порта при приеме данных
TXIE: 1/0 - разрешение/запрет прерывания от асинхронного последовательного порта при передаче данных
SSPIE: 1/0 - разрешение/запрет прерывания от синхронного последовательного порта
CCP1IE: 1/0 - разрешение/запрет прерывания от модуля ССР
TMR2IE: 1/0 - разрешение/запрет прерывания при совпадении значения Т/С2 со значением регистра РR2
TMR1IE: 1/0 - разрешение запрет прерывания при переполнении Т/С1
Регистр РIЕ2:
- | 0 | - | EEIE | BCLIE | - | - | CCP2IE |
Бит 7 | Бит 0 |
EEIE: 1/0 - разрешение/запрет прерывания при записи ЕЕРRОМ
BCLIE: 1/0 - разрешение/запрет прерывания при коллизии шины синхронного последовательного порта
CCP2IE: 1/0 - разрешение/запрет прерывания от модуля ССР2
Регистр РIR1:
PSPIF | ADIF | RCIF | TXIF | SSPIF | CCP1IF | TMR2IF | TMR1IF |
Бит 7 | Бит 0 |
PSPIF: для микроконтроллера РIС16F873 всегда должен быть сброшен
ADIF: флаг прерывания от модуля АЦП (10 - преобразование выполнено/ не выполнено)
RCIF: флаг прерывания от асинхронного последовательного порта, 1/0 - буфер приема заполнен/пуст
TXIF: флаг прерывания от асинхронного последовательного порта, 1/0 - буфер передачи пуст/заполнен
SSPIF: флаг прерывания от синхронного последовательного порта
CCP1IF: флаг прерывания от модуля ССР1. Режим захвата: значение регистра Т/С1 запомнено. Режим сравнения: совпадение со значением регистра Т/С1 обнаружено. В режиме ШИМ: не используется.
TMR2IF: флаг прерывания при совпадении значения Т/С2 и регистра РR2
TMR1IF: флаг прерывания при переполнении Т/С1
Регистр РIR2:
- | 0 | - | EEIF | BCLIF | - | - | CCP2IF |
Бит 7 | Бит 0 |
EEIF: флаг прерывания при успешном окончании операции записи в ЕЕРRОМ
BCLIF: флаг прерывания при коллизии шины SSР когда он работает в режиме ведущий I2С
CCP2IF: флаг прерывания от модуля ССР2. Режим захвата: значение регистра Т/С1 запомнено. Режим сравнения: совпадение со значением регистра Т/С1 обнаружено. В режиме ШИМ не используется.
Регистр РСОN содержит флаги для определения источника сброса:
• По включению питания (РОR).
• По сигналу на входе - МСLR
• По переполнению WDТ
• По обнаружению снижения напряжения питания (BOR).
- | - | - | - | - | - | POR | BOR |
Бит 7 | Бит 0 |
POR: статус сброса при включении, 1/0 сброс при включении произведен/не произведен
BOR: 1/0 - сброс при падении напряжения питания произведен не произведен
Примечание:
Бит -ВОR может быть любым при включении питания и при отключенном детекторе снижения питания (ВОDЕN=0 в регистре конфигурации), поэтому не должен учитываться. Бит -ВОR нужен для обнаружения последующих сбросов МК при снижении питания.
Аппаратно в стеке сохраняется только адрес возврата из обработчика прерывания. Сохранение и восстановление контекста (содержимого регистров W и STATUS) должен осуществлять сам программист.
За прерываниями закреплено 2 вектора прерываний: 0000h (сброса) и 0004h (один для всех прерывания).
При запросе прерывания (устанавливается флаг соответствующего периферийного модуля) в счетчик команд загружается адрес вектора прерывания 0004h. По этому адресу должна быть расположена команда перехода на начальный адрес подпрограммы обработчика прерываний. При этом бит GIЕ = 0.
Обработчик прерывания: должен сохранить контекст вызывающей программы или подпрограммы, определить требуемый источник прерывания и сбросить его установленный флаг, выполнить необходимые действия по обслуживанию прерывания, восстановить контекст и выполнить команду возврата из прерывания. При этом бит GIЕ = 1.
Время перехода на обработку прерывания - 3-4 машинных цикла.
Система прерывании РIС18FХХ2
Микроконтроллеры имеют несколько источников прерываний и функцию приоритетной системы прерываний, которая позволяет для каждого источника прерываний назначить высокий или низкий приоритет. При возникновении прерывания с высоким приоритетом происходит переход по вектору 000008h, а при возникновении прерывания с низким приоритетом – 000018h. Прерывание с высоким приоритетом приостанавливают обработку прерываний с низким приоритетом.
Для управления прерываниями РIС18FХХ2 предусмотрено 10 регистров SFR: RCON, INTCON, INTCON2, INTCON3, PIR1, PIR2, PIE1, PIE2, IPR1, IPR2.
Каждому источнику прерываний соответствует три управляющих бита:
• Флаг прерываний, указывает на то, что выполнено условие возникновения прерывания
• Бит разрешения прерывания, разрешает переход по вектору прерывания при установке соответствующего флага
• Бит приоритета, выбор низкого или высокого приоритета прерывания
Приоритетная система прерываний включена, если бит IPEN(RCON<7>) =1.
Для приоритетной системы прерываний предусмотрено два бита глобального разрешения прерываний.
• Установка в ‘1’ бита GIEH(INTCON<7>) разрешает все прерывания с высоким приоритетом.
• Установка в ‘1’ бита GIEL(INTCON<6>) разрешает все прерывания с низким приоритетом.
Когда флаг разрешенного прерывания установлен в ‘1’ и разрешены прерывания соответствующего приоритета, происходит переход по вектору 000008h или 000018h в зависимости от приоритетности прерывания. Отдельные прерывания могут быть запрещены сбросом соответствующего бита разрешения.
Когда бит IPEN=0 (состояние по умолчанию) то приоритетная система прерываний выключена (система прерываний совместима с микроконтроллерами PICmicro среднего семейства). В этом режиме биты приоритета прерываний не имеют никакого значения. INTCON<6> - РЕIЕ, разрешает/запрещает все периферийные прерывания. INTCON<7> - GIE - бит глобального разрешения прерываний. При возникновении прерывания всегда происходит переход по вектору 000008h.
Регистр INTCON:
R/W - 0 | R/W - 0 | R/W - 0 | R/W - 0 | R/W - 0 | R/W - 0 | R/W - 0 | R/W - 0 |
GIE/GIEH | PEIE/GIEL | TMROIE | INTOIE | RBIE | TMROIF | INTOIF | RBIF |
Бит 7 | Бит 0 |
GIE/GIEH: Бит глобального разрешения прерываний
IPEN=0 1/0 - разрешены/запрошены все немаскированные прерывания
IPEN =1 1/0 - разрешены/запрошены прерывания с высоким приоритетом
PEIE/GIEL: Разрешение периферийных прерываний
IPEN=0 1/0 - разрешены, запрошены все периферийные немаскированные прерывания
IPEN =1 1/0 - разрешены, запрошены прерывания с низким приоритетом
TMROIE: 1/0 - Разрешено/запрошено прерывания по переполнению ТМR0
INTOIE: 1/0 - Разрешено/запрошено внешнее прерывание INT0
RBIE: 1/0 - Разрешено запрещено прерывание по изменению уровня сигнала на входах РОRТВ
TMROIF: Флаг прерывания переполнения таймера TMR0. Сбрасывается программно.
INTOIF: Флаг внешнего прерывания INT0. Сбрасывается программно.
RBIF: Флаг прерывания по изменению уровня сигнала на входах РОRТВ (RВ7:RВ4). Сбрасывается программно.
Примечание. Несоответствие входного сигнала и сохраненного значения будет устанавливать флаг RBIF в ‘1’. Чтение регистра РОRТВ снимет условие несоответствия и позволит сбросить флаг RBIF.
Регистр INTCON2:
R/W - 1 | R/W - 1 | R/W - 1 | R/W - 1 | U-0 | R/W - 1 | U-0 | R/W - 1 |
-RBPU | INTEDG0 | INTEDG1 | INTEDG2 | - | TMROIP | - | RBIP |
Бит 7 | Бит 0 |
-RBPU: Включение подтягивающих резисторов на входах РОRТВ 1/0 - все подтягивающие резисторы выключены/включены на выводах РОRТВ. настроенных как вход
INTEDG0: Выбор активного фронта внешнего прерывания INT0: 1/0 - прерывание по переднему/заднему фронту сигнала
INTEDG1: Выбор активного фронта внешнего прерывания INT1: 1/0 - прерывание по переднему/заднему фронту сигнала
INTEDG2: Выбор активного фронта внешнего прерывания INT2: 1/0 - прерывание по переднему/заднему фронту сигнала
TMROIP: 1/0 - высокий/низкий приоритет прерывания по переполнению таймера ТМR0
RBIP: 1/0 - высокий/низкий приоритет по изменению уровня сигнала на входах РОRТВ
Примечание. Флаги прерываний устанавливаются при возникновении условий прерываний вне зависимости от соответствующих битов разрешения и бита общего разрешения прерываний. Это позволяет выполнять программный контроль возникновения условия прерываний. Необходимо заботиться о том, чтобы флаг прерывания был сброшен перед разрешением прерывания.
Регистр INTCON3:
R/W - 1 | R/W - 1 | U-0 | R/W - 0 | R/W - 0 | U-0 | R/W - 0 | R/W - 0 |
INT2IP | INT1IP | - | INT2IE | INT1IE | - | INT2IF | INT1IF |
Бит 7 | Бит 0 |
INT2IP: 1/0 - высокий/низкий приоритет внешнего прерывания INT2
INT1IP: 1/0 - высокий/низкий приоритет внешнего прерывания INT1
INT2IE: 1/0 - разрешение/запрет внешнего прерывания INT2
INT1IE: 1/0 - разрешение/запрет внешнего прерывания INT1
INT2IF: Флаг внешнего прерывания INT2 (сбрасывается программно)
INT1IF: Флаг внешнего прерывания INT1 (сбрасывается программно
Регистр флагов периферийных прерываний РIR1:
R/W - 0 | R/W - 0 | R-0 | R-0 | R/W - 0 | R-0 | R/W - 0 | R/W - 0 |
PSPIF(1) | ADIF | RCIF | TXIF | SSPIF | CCP1IF | TMR2IF | TMR1IF |
Бит 7 | Бит 0 |
PSPIF <1>: Флаг прерывания ведомого параллельного порта РSР. Произошла операция чтения или записи нет. Сбрасывается программно.
ADIF: Флаг прерывания от модуля АЦП. Преобразование АЦП завершено или нет. Сбрасывается программно.
RCIF: Флаг прерывания от приемника USART.
1 - буфер приемника USART полон (сбрасывается чтением регистра RCREG)
0 - буфер приемника USART пуст
TXIF: Флаг прерывания от передатчика USART
1 - буфер передатчика USART пуст (сбрасывается записью в регистр ТХREG)
0 - буфер передатчика USART полон
SSPIF: Флаг прерывании от модуля МSSР. Сбрасывается программно.
CCP1IF: Флаг прерывания от модуля ССР1
Режим захвата
1 - выполнен захват значения ТМR1 (сбрасывается программно)
0 - захвата значения ТМR1 не происходило
Режим сравнения
1 - значение ТМR1 достигло указанного в регистрах сравнения (сбрасывается программно)
0 - значение ТМR1 не достигло указанного в регистрах сравнения
ШИМ режим. Не используется.
TMR2IF: Флаг прерывания переполнения таймера ТМR2
1 - произошло переполнение таймера ТМR2 (сбрасывается программно)
0 - переполнение таймера ТМR2 не происходило
TMR1IF: Флаг прерывания переполнения таймера ТМR1
1 - произошло переполнение таймера ТМR0 (сбрасывается программно)
0 - переполнение таймера ТМR1 не происходило
Примечание 1. Бит РSРIF в микроконтроллерах РIС18F2Х2 не реализован, при записи должен равняться '0'.
Регистр флагов периферийных прерываний РIR2:
U-0 | U-0 | U-0 | R/W - 0 | R/W - 0 | R/W - 0 | R/W - 0 | R/W - 0 |
- | - | - | EEIF | BCLIF | LVDIF | TMR3IF | CCP2IF |
Бит 7 | Бит 0 |
EEIF: Флаг прерывания по окончании записи в ЕЕРRОМ данных/flash памяти программ
1 - запись данных завершена (сбрасывается программно)
0 - запись данных не завершена или не была начата
BCLIF: Флаг прерываний возникновения коллизий на шине
1 - на шине обнаружены коллизии (сбрасывается программно)
0 - коллизий не обнаружено
LVDIF: Флаг прерывания от детектора пониженного напряжения
1 - обнаружено снижение напряжения питания (сбрасывается программно)
0 - напряжение питания выше установленного значения
TMR3IF: Флаг прерывания переполнения таймера ТМRЗ
1 - произошло переполнение таймера ТМRЗ (сбрасывается программно)
0 - переполнение таймера ТМRЗ не происходило
CCP2IF: Флаг прерывания от модуля ССР2
Режим захвата
1 - выполнен захват значения ТМR1 (сбрасывается программно)
0 - захвата значения ТМR1 не происходило
Режим сравнения
1 - значение ТМR1 достигло указанного в регистрах сравнения (сбрасывается программно)
0 - значение ТМR1 не достигло указанного в регистрах сравнения
ШИМ режим. Не используется
Регистры разрешения периферийных прерываний:
Регистр РIЕ1:
R/W - 0 | R/W - 0 | R/W - 0 | R/W - 0 | R/W - 0 | R/W - 0 | R/W - 0 | R/W - 0 |
PSPIE(1) | ADIE | RCIE | TXIE | SSPIE | CCP1IE | TMR2IE | TMR1IE |
Бит 7 | Бит 0 |
PSPIE1: 1/0 -Разрешение/запрет прерывания от ведомого параллельного порта РSР
ADIE: 1/0 - Разрешение/запрет прерывания от модуля АЦП
RCIE: 1/0 - Разрешение/запрет прерывания от приемника USART
TXIE: 1/0 - Разрешение/запрет прерывания от передатчика USART
SSPIE: 1/0 - Разрешение/запрет прерывания от модуля МSSР
CCP1IE: 1/0 - Разрешение/запрет прерывания от модуля ССР1
TMR2IE: 1/0 - Разрешение/запрет прерывания по переполнению таймера ТМR2
TMR1IE: 1/0 - Разрешение/запрет прерывания по переполнению таймера ТМR1
Примечание 1. Бит РSРIЕ в микроконтроллерах РIС18F2Х2 не реализован, при записи должен равняться ‘0’.
Регистр РIЕ2:
U-0 | U-0 | U-0 | R/W - 0 | R/W - 0 | R/W - 0 | R/W - 0 | R/W - 0 |
- | - | - | EEIE | BCLIE | LVDIE | TMR3IE | CCP2IE |
Бит 7 | Бит 0 |
EEIE: 1/0 - прерывание разрешено/запрещено по окончании записи в ЕЕРRОМ данных/Flash памяти программ
BCLIE: 1/0 - прерывание разрешено/запрещено при возникновении коллизий на шине
LVDIE: 1/0 - прерывание разрешено/запрещено от детектора пониженного напряжения
TMR3IE: 1/0 - прерывание разрешено/запрещено по переполнению таймера ТМRЗ
CCP2IE: 1/0 - прерывание разрешено.запрещено от модуля ССР2
Регистры приоритета периферийных прерываний:
Регистр IRP1:
R/W - 1 | R/W - 1 | R/W - 1 | R/W - 1 | R/W - 1 | R/W - 1 | R/W - 1 | R/W - 1 |
PSPIP(1) | ADIP | RCIP | TXIP | SSPIP | CCP1IP | TMR2IP | TMR1IP |
Бит 7 | Бит 0 |
PSPIP1: 1/0 - высокий/низкий приоритет прерывания от ведомого параллельного порта РSР
ADIP: 1/0 - высокий/низкий приоритет прерывания от модуля АЦП
RCIP: 1/0 - высокий/низкий приоритет прерывания от приемника USART
TXIP: 1/0 - высокий/низкий приоритет прерывания от передатчика USART
SSPIP: 1/0 - высокий/низкий приоритет прерывания от модуля МSSР
CCP1IP: 1/0 - высокий/низкий приоритет прерывания от модуля ССР1
TMR2IP: 1/0 - высокий/низкий приоритет прерывания по переполнению таймера ТМR2
TMR1IP: 1/0 - высокий/низкий приоритет прерывания по переполнению таймера ТМR1
Регистр IRР2:
U-0 | U-0 | U-0 | R/W - 0 | R/W - 0 | R/W - 0 | R/W - 0 | R/W - 0 |
- | - | - | EEIP | BCLIP | LVDIP | TMR3IP | CCP2IP |
Бит 7 | Бит 0 |
EEIP: 1/0 - высокий/низкий приоритет прерывания по окончании записи в ЕЕРRОМ данных/ flash памяти программ
BCLIP: 1/0 - высокий/низкий приоритет прерывания прерываний при возникновении коллизий на шине
LVDIP: 1/0 - высокий/низкий приоритет прерывания от детектора пониженного напряжения
TMR3IP: 1/0 - высокий/низкий приоритет прерывания по переполнению таймера ТМRЗ
CCP2IP: 1/0 - высокий/низкий приоритет прерывания от модуля ССР2
Обработка прерываний
• При переходе на обработку прерываний бит глобального разрешения прерываний сбрасывается, чтобы запретить прерывания соответствующего приоритета. Если бит IPEN=0, то это бит GIЕ. Если приоритетная система прерываний включена, то это один из битов GIЕН или GIЕL.
• Прерывания с высоким приоритетом могут приостанавливать обработку прерывании с низким приоритетом.
• Адрес возврата помещается в вершину стека, а в счетчик команд РС помешается вектор прерываний (000008h или 000018h).
Рекомендация для Вас - 6. Интерфейсы.
• В обработчике прерываний конкретный источник прерываний может быть определен проверкой соответствующих флагов.
• Флаги прерываний должны быть сброшены в обработчике прерываний для предотвращения повторного перехода на обработку прерывания.
• Выход из обработки прерываний необходимо выполнять командой RЕТFIЕ, по которой будет установлен соответствующих бит глобального разрешения прерываний (GIE, GIEH или GIEL).
• Время перехода на обработку прерываний от внешних источников (прерывания INТ, изменение уровня сигнала на входах РОRТВ и др.) составляет 3-4 цикла команд.
• Время перехода не зависит от типа выполняемой команды (однословная или двухсловная).
• Флаги прерываний устанавливаются вне зависимости от состояния битов глобального и индивидуального разрешения прерываний.