1
МИКРОКОНТРОЛЛЕРЫ
V
Теперь посмотрим, как устроен обработчик прерываний от интервального таймера.
Это - команда для отладки (зачем — будет понятно
позднее).
<1> Сохранить регистры, которыми мы
будем пользоваться
Эти' регистры используются в интерпретаторе
автомата, т. е. их тоже надо сохранить.
..
Сегмент А — рабочие ячейки обработчика
прерываний.
Сегмент С — адрес описателя текущего автомата.
Загружаем счетчик цикла (будет 4 автомата).
<2> Вычесть единицу из виртуального таймера.
Быстрый анализ обнуления!
<3> Вычесть перенос из старшего байта таймера.
Получилась ситуация перехода через нулевую границу!
Продолжить цикл анализа автоматов.
Выесть перенос из старшего байта таймера.
Обнуление таймера пока не произошло!
<4> Таймер обнулился - вызов автомата.
Продолжить цикл анализа автоматов.
Перешедший через нулевую границу таймер надо снова
обнулить!
<5> Сохранить сегмент текущего обрабатываемого
автомата.
Перейти к сегменту следующего автомата.
Загрузить сегмент следующего автомата в регистр #С.
Вычесть счетчик цикла.
Цикл не закончен - продолжить.
<6> Сбрасываем сигнал прерывания от таймера
Восстанавливаем регистры.
int3 : bich
%Ы, 00000001b
push
#A
push
#C
push
#6
push
#7
ldr
#A,60h
ldr
#C,40h
movl
fa 4,4
$4:
subi
%c6,l
jz
$1
sbc
%c7
je
$2
jmp
$3
$1:
sbc
%c7,
jnz
$3
movl
%c3,TERM_TIMEOUT
jsr
automat
jmp
$3
$2:
movl
%c6,0
movl
%c7,0
$3:
mfpr
%a3,#C
addl
%a3,1
mtpr
#C,%a3
subi
%a4,1
jnz
$4
cmpl
%Ь4,0
pop
#7
pop
#6
pop
#C
pop
rti
#A
Необходимые пояснения:
1. Начало обработчика преры-
ваний от таймера очень похоже на
начало обработчика прерываний от
порта, поэтому сразу перейдем в
тело цикла, в котором анализиру-
ются виртуальные таймеры.
2. Из текущ его виртуального
таймера вычитается единица: вна-
чале, с помощью команды subi вы-
читается единица из младшего бай-
та таймера. Команда jz $1 исполь-
зована здесь для того, чтобы быст-
ро проанализировать ситуацию
“таймер обнулился" - если резуль-
тат вычитания единицы из младше-
го байта нулевой, и вычитание пе-
реноса из старшего байта тоже даст
нулевой результат - значит, вирту-
альный таймер закончил работу!
3. Распространяем перенос, полу-
ченный при вычитании младшего
байта, на старший байт (обычная
многобайтная арифметика) с помо-
щью команды вЬс. Команда )с $2
передает управление на участок,
который заново обнуляет виртуаль-
ный таймер, потому что перенос из
старшего байта в данной ситуации
может возникнуть при одном-един-
ственном случае - если вы попыта-
лись вычесть единицу из уже отра-
ботавшего таймера. Это момент
очень важен - он позволяет не про-
верять заранее, надо ли обрабаты-
вать именно этот виртуальный тай-
мер: необходимость этого как раз
и выяснится в процессе работы.
4.
А вот теперь виртуальный
таймер закончил работу! Можно за-
нести в ячейку %сЗ терминальный
символ ТЕРМ_Т1МЕОиТ и вызы-
вать интерпретатор автомата.
5. Все остальные команды име-
ют то же назначение, что и в обра-
ботчике прерываний от порта А.
6. А вот так - с помощью коман-
ды фиктивного сравнения стр1, -
сбрасывается сигнал прерывания
от интервального таймера. Таким
действием должен заканчиваться
любой обработчик прерываний от
интервального таймера. Осталь-
ные команды имеют то же назна-
чение, что и в обработчике преры-
ваний от порта А.
(Окончание в N22/2006)
Н 4 7
Радиолюбитель -0 1 /2 0 0 6 1
предыдущая страница 46 Радиолюбитель 2006-01 читать онлайн следующая страница 48 Радиолюбитель 2006-01 читать онлайн Домой Выключить/включить текст