![]() |
|
Программирование прерыванийВ таблице 9.2 приведены программируемые регистры, которые воздействуют на работу и функции контроллера прерываний и PTS. Таблица 9.2
Биты в 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) может генерировать два различных прерывания:
В любом случае надо разрешать только одно прерывание для каждого источника, то есть соответствующий бит в регистрах 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 не подтверждает прерывания в течение выполнения команд "чтение-модификация-запись". |