Система прерываний
Служит для прерывания выполнения основной программы при появлении определенного события, связанного с работой периферийных устройств.
События (источники прерываний):
- таймера (переполнение или антипереполнение, момент равенства содержимого таймера/счетчика и регистра сравнения, момент захвата внешнего импульса);
- последовательных портов (окончание приема или записи байта, неправильный формат кадра, переполнение буфера приемника или передатчика);
- АЦП (готовности данных);
- ЕЕРRОМ (момент окончания операции);
- параллельных портов (по фронту, по спаду, по уровню импульса на выводе);
- компаратора (момент равенства напряжений, переход от отрицательной разности к положительной и наоборот);
- при сбросе микроконтроллера, при обнаружении падения напряжения питания.
Для каждого прерывания может быть собственная подпрограмма - обработчик прерывания. Каждому источнику прерывания соответствует адрес в памяти программ - вектор прерывания. Вектора расположены в определенном порядке и образуют таблицу прерываний.
|
|
Порядок следования векторов прерываний задает порядок их выполнения (приоритет) при одновременном появлении нескольких событий. Этот порядок соответствует приоритетам источников прерываний по умолчанию.
Существуют двухуровневая (высший и низший) и многоуровневая системы приоритетов. Приоритет по умолчанию может быть изменен установкой соответствующих битов в SFR – регистре приоритетов.
Прерывания программы от источников прерываний могут быть разрешены или запрещены установкой или сбросом соответствующих битов в SFR - регистре разрешения прерываний. Запрещение прерываний называется маскированием.
1. Событие от источника прерывания сопровождается установкой определенного бита в SFR - регистре флагов прерываний. Этот факт называется запросом прерывания.
2. Если запрашиваемое прерывание запрошено (замаскировало), то никаких изменений в работе программы не происходит.
3. Если разрешено, то выполнение основной программы приостанавливается адрес следующей команды (содержимое счетчика команд+1) сохраняется в стеке, в счетчик команд загружается требуемый вектор прерывания (происходит переход на адрес = вектору прерывания). По адресу = вектору прерывания может быть расположена начальный адрес обработчика прерывании (1-2 команды) или команда перехода на него (много команд).
4. Выполняется подпрограмма обработчика прерываний.
5. Последняя команда обработчика прерывания: возврат из прерывания.
6. По команде «возврат их прерывания» происходит загрузка из стека адреса сохраненной перед прерыванием основной программы команды. Продолжается выполнение основной программы.
7. Если в процессе выполнения обработчика прерываний появляется запрос от источника прерывания с более высоким приоритетом текущий обработчик прерывается описанным выше способом на выполнение высокоприоритетного обработчика прерываний. Запрос от низкоприоритетного источника откладывается до завершения обработчика текущего (высокоприоритетного) прерывания.