Команды и директивы компилятора PROTON

On Interrupt

Синтаксис:

On Interrupt {Goto} Label

Встроенный в Proton+IDE редактор отличает эти две команды следующим образом - директиву аппаратного прерывания On_Interrupt он подсвечивает красным полужирным шрифтом, а директиву программного прерывания On Interrupt черным полужирным шрифтом. Это делается для облегчения отладки.

Когда используется команда On Interrupt, компилятор просто помечает то, что прерывание произошло и немедленно возвращается к тому, чем до этого он занимался. То есть в отличие от аппаратного прерывания, программа немедленно не переходит к подпрограмме обработки прерывания. Поэтому в случае использования команд довольно большой продолжительности переход на подпрограмму обработки прерывания может привести к значительным задержкам.

Например, если основная программа только что перешла к выполнению команды DelayMS 2000 и в это время произошло прерывание, то в этом случае компилятор просто отметит, что произошло прерывание и продолжит выполнение команды DelayMS 2000. А так как эта пауза будет продолжаться целых 2 секунды, то переход к подпрограмме обработки прерывания может затянуться.

В случае если основная программа очень критична к времени исполнения команд, то она будет выполняться неправильно, например при мультиплексировании семи сегментного светодиодного индикатора.

Для того, чтобы минимизировать такие случаи, следует использовать только такие команды и их конструкции, которые не занимают много времени на свое выполнение. Например, вместо команды DelayMS 2000, можно использовать команду DelayMS 1 в циклах For…Next или Repeat…Until повторяя эти циклы 2000 раз. Такие конструкции позволят компилятору заканчивать каждую команду более быстро, а значит, при возникновении прерывания программа сможет гораздо быстрее перейти к его обработке.

Пример 1

Пример 2

Если необходимо обрабатывать прерывания довольно часто, то лучше использовать аппаратное прерывание при помощи оператора On_Interrupt.

Необходимо отметить, что работа оператора On_Interrupt довольно замысловата, в отличии от неё команда On Interrupt более проста для понимания. Поэтому если Вы решили воспользоваться программной обработкой прерываний при помощи оператора On Interrupt, то необходимо разместить перед меткой подпрограммы обработки прерывания или сразу после неё команду Disable (см. пример 3). Причем наличие команды Disable совершенно необязательно говорит о том, что прежде должна была присутствовать команда Enable. Это мое замечание идет несколько в разрез с руководством по компилятору. Но так показали эксперименты проведенные с этой командой.

Далее для того, чтобы Ваша программа после обработки прерывания вернулась в то место, откуда она ушла на обработку прерывания, разместите в конце подпрограммы обработки прерывания команду Resume. Команда Resume вернет программу в то место, откуда она ушла на обработку прерывания, и установит бит GIE регистра INTCON в 1. Это будет означать, что программа вновь готова к обработке прерываний.

Примечание 1.

Пример 3

Примечание 2

На рисунке 1 приведена действующая модель on interrupt3.DSN, демонстрирующая работу команды On Interrupt. Модель работает под управлением приведенной выше программы on interrupt3.bas.

Щелкните по рисунку чтобы активировать эту схему

Рис. 1. Действующая модель on interrupt3.DSN, демонстрирующая работу команды On Interrupt.
По этой ссылке можно скачать архив действующей схемы и необходимые для ее работы ASM и HEX файлы.

Рис. 2. Осцилограмма выходнoго сигнала на PORTD.0 действующей модели on interrupt3.DSN