II
"РЛ" - НАЧИНАЮ Щ ИМ
(I
автоматически выполнится до точки останова, а в окне тай-
минга мы увидим, когда это произойдет. Но интересует нас
не момент первого входа в обработчик, а промежутки между
входами, поэтому обнулим счетчик в тайминге и снова на-
жмем F9 - теперь мы увидим реальный интервал времени
между первым и вторым входом в обработчик прерывания -
он составит.
.. 50008 микросекунд. А мы-то ожидали 50000
ровно, почему же есть разница? Дело в том, что мы не учли
время работы самого обработчика прерывания. Смотрите
сами: для вызова обработчика формируется LCALL - это 2
машинных цикла, JMP по вектору прерывания - еще 2, в об-
работчике 2 команды MOV - это 2 цикла, RETI - еще 2, итого
8 тактов, что и соответствует 8 лишним микросекундам! Что-
бы обеспечить “абсолютную точность” надо скорректировать
константу Const в нашей программе. Попробуйте сделать это
самостоятельно, пусть это будет домашним заданием №1.
Итак, мы сумели заставить таймер генерировать пре-
рывания каждые 50 мс, но какая нам от этого польза?
Да огромная: во-первых, аналогичным методом можно
генерировать интервалы времени любой длительности от
65,535 мс максимум и до.
.. (скольки микросекунд минимум?
- пусть это будет домашним заданием №2 ©), во-вторых,
подсчитывая полученный “круглый” интервал, элементарно
получить интервалы сколь угодно большой длительности. В
результате мы имеем возможность практически неограни-
ченного манипулирования временными задержками. Давай-
те, например, реализуем нашу “светодиодную мигалку” с ис-
пользованием таймера.
Небольшое примечание. В
приводимом ниже примере
я умышленно не предпринимаю никаких мер по обеспече-
нию абсолютной точности временных интервалов - не могу
же я давать ответ на домашние задания!
©
Так что повторяя
и тестируя приводимые далее в тексте программы, вы полу-
чите немного не такие промежутки времени - их корректи-
ровка за вами!
Светодиод наш должен мигать раз в секунду, причем
со скважностью 2, т.е. длительность свечения 0,5 секунды
(это просто напоминание). Уже сделанная нами программа
формирует прерывания ровно в 10 раз чаще, чем нам надо
(0,05 секунды). Модифицируем ее следующим образом:
Const
equ
15535
t
начальное значение счетчика
InitTH equ
high(Const)
/
начальное значение ТН0
InitTL equ
low(Const)
/
начальное значение
ТТЛ
LED
equ
P1.0
t
порт светодиода
IntNums equ
10
f
каждые 10 прерываний будем менять состояние светодиода
; опишем переменные в сегменте данных
dseg
at lOh
/
как всегда, первых 16 ячеек резервируем
Counter:
ds
1
f
1 байт выделяем под счетчик
Stack:
cseg
t
отсюда начнется стек
org
0
jmp
st
t
переход на начало программы
org
OOOBh
t
вектор обработчика прерывания
от ТітегО
jmp
timerO
t
переход на обработчик
st:
mov
SP, #Stack
t
установим указатель стека
mov
Counter, #IntNums
t
занесем в ячейку-счетчик кол-во прерываний
mov
TMOD, #1
; режим работы ТітегО задаем = 1
setb
EA
; разрешаем все прерывания вообще
setb
ЕТ0
/ разрешаем прерывания от ТітегО
setb
tfo
/ искусственно вызываем прерывание
;
первый раз
setb
tro
/ запускаем ТітегО
jmp
$
; ничего не делаем больше, зацикливаемся
timerO:
mov
ТН0, #InitTH
заносим начальное значение ТН0
mov
TL0, #InitTL
; заносим начальное значение та<0
djnz
Counter, int exit
; уменьшим счетчик и выйдем, если не ноль
; было 10 прерываний (если не было., сюда не попадаем)
mov
Counter, tlntNums
r
будем считать прерывания заново
cpl
LED
; переключим светодиод
int_exit:
; выход
reti
; обработчик завершен
Что нового появилось в этой программе, по сравнению
с предыдущей? Мы описали новую константу ЫМитв, оп-
ределяющую количество прерываний между изменениями
состояния светодиода (горит или не горит), ввели отдель-
ную переменную
Counter,
которая хранит количество остав-
шихся прерываний до изменения состояния светодиода,
Радиолюбитель - 0 9 /2 0 0 7
У
43
предыдущая страница 43 Радиолюбитель 2007-09 читать онлайн следующая страница 45 Радиолюбитель 2007-09 читать онлайн Домой Выключить/включить текст