Серия рiс16хXX

УПРАВЛЕНИЕ ПРЕРЫВАНИЯМИ

Пример: Запись в ЕЕРRОМ память данных

BSF STATUS,RP1;

BCF STATU,RPO; Выбрать банк 3

BTFSC EECON1,WR; Проверить завершения

GOTO $-1; операции записи

BCF STATUS, RPO; Выбрать банк 2

MOVF ADDR,W; Указать адрес ячейки

MOVWF EEADR;

MOVWF EEDATA;

BSF STATUS,RFO; Выбрать банк 3

BCF EECON1,EEPGD; Выбрать EEPROM память данных

BSF EECON1,WREN; Разрешить запись в EEPROM память данных

BСF INTCON,GIE; Запретить прерывания

MOVLW 0x55; Записать 55h в регистр ЕЕСОN2

MOVWF EECON2;

MOVLW OxAA; Записать ААh в регистр ЕЕСОN2

MOVWF EECON2;

BSF EECON1.WR; Инициализировать запись

BSF INTCON, GIE; Разрешить прерывания

BCF EECON1.WREN; Выбрать банк 2


Регистры SFR, связанные с прерываниями: INTCON, PIE1, PIR1, PIE2, PIR2.

Регистр управления прерываниями INTCON:

R/W - 0 R/W - 0 R/W - 0 R/W - 0 R/W - 0 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:

-   - 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:

-   - 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 машинных цикла.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: