fl
"РЛ" - НАЧИНАЮ Щ ИМ
fl
описали порт управления светодиодом и адрес вершины
стека, а также добавили в обработчик прерываний ко-
манды, с помощью которых мы ведем подсчет числа пре-
рываний. Да, разумеется, в начало программы мы доба-
вили команду начальной инициализации счетчика. Как
видите, изменения не очень серьезные, но зато теперь
наш светодиод мигает, как надо! Более того, если мы
пожелаем, чтобы он стал мигать в 2 раза чаще, потре-
буется изменить только значение константы IntNums на
5, а если надо в 2 раза реже, то на 20. Чувствуете, как
TimerO:
mov
mov
push
inc
mov
cjne
cpl
mov
int_exit:
pop
reti
просто? Попробовали бы вы сделать то же самое путем
программного формирования задержки, как ранее!
На что еще я хотел обратить ваше внимание, так это на
способ счета прерываний и проверки их количества. Как
правило, первое, что приходит на ум при решении зада-
чи подсчета чего-либо до заданного значения, так это
прибавление каждый раз единицы к нашему счетчику.
Но давайте посмотрим, что получилось бы, если бы мы
поступили так (приведу только процедуру обработки пре-
рывания):
ТНО, #InitTH
TLO, #InitTL
ACC
Counter
ACC, Counter
A, #IntNum, int_exit
LED
Counter, #0
заносим начальное значение ТНО
заносим начальное значение ТЬО
надо сохранить аккумулятор
увеличиваем счетчик на 1
бер$м значение счетчика
выйдем, если еще не 10
переключим светодиод
обнулим счетчик
АСС
; восстанавливаем аккумулятор
Смотрите, как усложнилась (и, заметьте, замедли-
лась!) процедура обработчика! А ведь в реальной про-
грамме придется сохранять в стеке не только значение
аккумулятора, но и регистра PSW (
помните
,
обработчик
прерывания не должен ничего менять из того, что задей-
ствовано в основной программе!).
Получается, измене-
ние с
прямого
счета на
обратный
очень сильно влияет на
качество результата! И хотя вполне можно применять оба
варианта, всегда следует постараться поискать наиболее
оптимальный. Критериев оптимальности может быть не-
сколько, причем порой взаимоисключающих, но выбрать
наиболее важные именно для решаемой задачи можно.
Обычно для обработчиков прерываний важными крите-
риями являются
быстродействие
и
использование ресур-
сов
(т.е. ячеек стека и обычной памяти). Если имеется
возможность добиться минимума этих двух параметров
- это следует сделать!
Анализируя полученный пример, можно сделать вы-
вод, что максимальная длительность свечения светоди-
ода, которую мы можем достигнуть с применением одно-
байтного счетчика, будет 256*0,05 = 12,8 секунды. Если
потребуется большая длительность - надо будет исполь-
зовать уже двухбайтный счетчик, что, разумеется, услож-
нит решение задачи. Однако, решим и ее:
Const
equ
15535
; начальное значение счетчика
InitTH equ
high(Const)
; начальное значение ТНО
InitTL equ
low(Const)
; начальное значение ^0
LED
equ
P1.0
; порт светодиода
IntNums equ
10
; каждые 10 прерываний будем менять состояние светодиода
; опишемі переменные в сехэданте данных
dseg
at
10h
; как всегда, первых 16 ячеек резервируем
; 2 байта выделяем под счетчик
CounterL:
ds
1
; младший байт счетчика
CounterH:
ds
1
; старший байт счетчика
Stack:
; отсюда начнется стек
cseg
org
0
jmp
St
; переход на начало программы
org
OOOBh
; вектор обработчика прерывания от Т1тег0
jmp
timerO
; переход на обработчик
st:
mov
SP, #Stack
; установим указатель стека
; занесем в счетчик начальное значение
mov
CounterL, #Low(IntNums) ; сначала младший байт
mov
CounterH, #High(IntNums) ; а затем - старший
44
У
Радиолюбитель - 0 9 /2 0 0 7
предыдущая страница 44 Радиолюбитель 2007-09 читать онлайн следующая страница 46 Радиолюбитель 2007-09 читать онлайн Домой Выключить/включить текст