|
Предыдущий
<< GIMSK
$3B
($5B), GIFR
$3A ($5A) >>Следующий
Эти
два регистра предназначены для
управления внешними прерываниями.
Внешнее прерывание программы
вызывается фронтом, спадом или
уровнем на выводе INTx МК в том случае,
если установлен общий флаг
разрешения прерывания I в SREG и
соответствующий флаг INTx в регистре
GIMSK.
Если
ваша программа работает с
прерываниями, то регистр GIFR вам, в
общем-то, и не нужен. В нем
устанавливается в "1" флаг INTFx в
том случае, если прерывание
запрещено, а ситуация возникновения
прерывания имеется. Программа может
опрашивать эти флаги и предпринимать
какие-либо действия.
Следует
только помнить, что флаги в регистре
GIFR автоматически сбрасываются при
обработке прерывания, если же
прерывания запрещены - то сбросить их
программно можно, записывая в
соответствующий бит "1" (нелогично?
но именно так и есть)
Если
вы знаете, что такое прерывания -
далее можете не читать. А я попробую
простым языком изложить суть
прерываний. На мой взгляд, это очень
важная тема, без понимания механизма
прерываний построить эффективную
realtime программу для МК просто
невозможно.
Допустим,
нужно создать на МК устройство,
которое должно выполнять какое-нибудь
достаточно сложное вычисление (занимающее,
например, 0,1 секунды) и в то же время
переключать один из своих pin-ов с
частотой 1 кГц. Как это сделать?
Ну,
время считать будет таймер - это
естественно. Настроили таймер так,
чтобы он через 1 мс выставлял
флажок переполнения. А дальше?
Вставлять в программу через 10 команд
проверку этого флага? Это уже не
программа будет, а сыр с дырками. Да к
тому же 10 команд можно написать таких,
что выполняться они будут и в течение
секунды. Как быть?
А
вот тут-то и надо использовать
прерывание. Таймер у нас настроен на
переполнение через 1 мс, так разрешим
прерывание переполнения. Кроме этого.
должен быть установлен флаг общего
разрешения прерываний. Что же
произойдет при переполнении таймера?
Закончив
выполнение текущей команды, МК
сохранит значение счетчика команд в
стеке, после чего выполнение
передастся на соответствующий
вектор прерывания, а проще -
конкретный адрес, закрепленный за
прерыванием. См. таблицу векторов для
МК 8535
|