Программирование прерываний

В таблице 9.2 приведены программируемые регистры, которые воздействуют на работу и функции контроллера прерываний и PTS.

Таблица 9.2
Регистры состояния и управления прерываниями и PTS

МнемоникаНазвание регистраОписание регистра
INT_MASK, INT_MASK1Маска прерыванияЭти регистры разрешают/ запрещают любое маскируемое прерывание.
INT_PEND, INT_PEND1Захват прерыванияБиты в этих регистрах устанавливаются аппаратными средствами и показывают, какое поступило прерывание.
IOC1Управление вводом/выводомЭтот регистр выбирает источник INT00, INT02 и INT07 прерываний.
IOS1Состояние ввода/выводаЭтот регистр содержит флаги, которые указывают, какое событие вызвало прерывание.
PSWСлово состояния процессораЭтот регистр содержит два бита, один из которых глобально разрешает/запреща-ет обслуживание всех маскируемых прерываний, и второй, который разрешает или запрещает обслуживание прерываний PTS.
PTSRVОбслуживание PTSБиты этого регистра устанавливаются аппаратными средствами при требовании конца прерывания, обслуживаемого PTS.
PTSSELВыбор PTSЭтот регистр выбирает или цикл PTS - "1", или стандартную подпрограмму обслуживания прерывания для каждого из пятнадцати маскируемых запросов прерывания - "0".

Биты в 16-разрядных регистрах PTSSEL и PTSSRV соответствуют разрядам регистров INT_MASK и INT_MASK1 (см. Приложение).

Обслуживание прерываний сервером переферийных транзакций

После того, как Вы выберете обслуживание прерывания сервером периферийных транзакций - прерывания PTS, Вы должны разрешить и обработку прерывания PTS, и индивидуальное прерывание. Бит разрешения PTS в слове состояния процессора (PSW.2) глобально разрешает или запрещает PTS. Команда EPTS устанавливает бит PSW.2, допуская обработку прерывания сервером периферийных транзакций. Команда DPTS очищает этот бит, запрещая PTS. Биты в INT_MASK и INT_MASK1 разрешают или запрещают индивидуальные прерывания.

Ослуживание стандартных прерываний

Когда Вы выбираете обслуживание прерывания стандартной сервисной подпрограммой обработки прерывания, Вы должны разрешить и обслуживание прерывания PIC, и индивидуальное прерывание. Бит глобального разрешения прерывания (I) в слове состояния процессора (PSW.1) разрешает или запрещает обслуживание всех маскируемых прерываний контроллером прерываний. Команда EI устанавливает бит PSW.1, разрешая обслуживание прерываний PIC. Команда DI очищает этот бит, отключая обслуживание прерываний PIC.

Биты в INT_MASK и INT_MASK1 индивидуально разрешают или запрещают прерывания. Прерывание, которое происходит во время обслуживания прерывания, глобально запрещается (PSW.1 сбрасывается) и задерживается в регистрах захвата прерывания.

Выбор источников прерывания

Каждый из пяти источников прерывания (HSI FIFO Full, EXTINT1, Receive, Transmit, Timer 2 Overflow) может генерировать два различных прерывания:
- 8096BH-совместимое прерывание;
- отдельное прерывание для МК 8XC196KC/KD.

В любом случае надо разрешать только одно прерывание для каждого источника, то есть соответствующий бит в регистрах INT_MASK и INT_MASK1 должен быть установлен только для одного из двух возможных прерываний.

Регистры маскирования прерываний

Регистры маскирования прерываний INT_MASK и INT_MASK1 (см. Приложение) разрешают или запрещают (маскируют) индивидуальные прерывания. За исключением бита немаскируемого прерывания (NMI - INT_MASK1.7), установка бита разрешает оставить прерывание, очистка - запрещает. Когда устройство сбрасывается, регистры маски прерывания очищаются, запрещая прерывания. Регистры читаемы и записываемы во всех окнах. Команда PUSHA сохраняет содержимое этих регистров в стеке, а POPA - восстанавливает.

Регистры захвата прерываний

Когда детектор перехода обнаруживает прерывание, он устанавливает соответствующий бит в INT_PEND или INT_PEND1 регистрах (см. Приложение), даже если индивидуальное прерывание отключено (замаскировано). Бит захвата очищается, когда программа переходит к подпрограмме обработки прерывания (стандартного или прерывания PTS). Регистры INT_PEND и INT_PEND1 читают, чтобы определить, какие поступили прерывания.

С помощью программного обеспечения биты в этих регистрах можно устанавливать или сбрасывать, генерируя прерывания. Однако надо быть осторожным при записи кода в эти регистры. Например, последовательность команд, которые очищают бит захвата, может привести к подтверждению прерывания после того, как эта последовательность начнется, но прежде, чем бит фактически очистится. В этом случае происходит частичный цикл прерывания в 5 тактов. То есть процесс генерирования прерывания начинается, но никогда не переходит к подпрограмме обработки прерывания.

Такую задержку можно предотвратить, делая код неделимым, то есть прерывания не будут подтверждаться, пока выполняется этот код. Самый простой способ реализовать вышесказанное состoит в том, чтобы использовать логические команды в двух- или трехоперандном формате, например:

ANDB INT_PEND, #01111111B ; Очищает прерывание EXTINT

ORB INT_PEND, #10000000B ; Устанавливает прерывание EXTINT

8XC196KC/KD не подтверждает прерывания в течение выполнения команд "чтение-модификация-запись".

<<< Содержание >>>