памяти),
а второй задает
адрес команды,
которая должна быть выполнена, если в
результате уменьшения значение не ста-
ло^ равно нулю. Если же в результате
уменьшения первого операнда получит-
ся нулевое значение, то переход по адре-
су второго операнда не произойдет, а про-
сто будет выполняться очередная (следу-
ющая по порядку) команда. Разумеется,
вместо указания конкретных адресов мы
будем использовать метки. DJNZ - дос-
таточно оригинальная, надо признать, ко-
манда, ее аналогов нет в большинстве
микроконтроллеров других семейств.
Посмотрев на нашу программу* мы
видим, что в строках 7 и 8 команда DJNZ
вроде имеет вполне понятный смысл: в
строке 7 уменьшается содержимое реги-
стра R1, а в строю 8 - регистра R2, и в
обоих случая* переход при ненулевом ре-
зультате осуществляется к метке loop. А
вот что же такое за знак доллара в стро-
ке 6? А это специальная метка, которая
всегда обозначает адрес команды, где эта
метка используется. То есть эта метка
указывает на
текущую команду.
Что же
такое получается - если после уменьше-
ния R0 не получится ноль, мы снова дол-
жны перейти к этой же самой команде?!
Именно так! Получается, что команда в
строке 6 будет выполняться и выполнять-
ся до тех пор, пока, наконец, в регистре
АО не получится 0, и только после этого
произойдет выполнение команды из сле-
дующей строки. Получается,
команда
DJNZ
R0,
$ выполняется в цикле столько
раз, сколько будет записано в регистре
R0 к моменту первого ее выполнения.
Логично предположить, что команда
в строке 7 обеспечит циклическое выпол-
.
нение всех команд начиная с метки loop
и до самой себя включительно, а количе-
ство таких повторов снова будет опреде-
ляться числом, находящемся в регистре
R1 к моменту первого выполнения коман-
ды. Ну, а команда строки 8 сделает то же
самое, однако повторятся при этом две
предыдущие команды и она сама Давай-
те попробуем разобраться, сколько же раз
все эти команды будут выполняться, ведь
мы не видим нигде, чтобы в регистры R1
и R2 заносилось какое-нибудь значение.
Признаюсь, тут я применил “запре-
‘ щенный” прием. С целью, уменьшения
объема программы я исключил явное за-
несение значений в регистры, однако про-
грамма три этом остается вполне рабо-
тоспособной! Как же это получается? А
i
дело в том, что независимо от того, ка-
?
:
1
кие именно значения были в упомянутых
-------------
:
-----------------
О
? 7 Радиолюбитель - 0 3 /2 0 0 7 У
регистрах сразу после сброса микрокон-
троллера (вообще говоря, там могло быть
совершенно непредсказуемое число от 0
до 255), после того, как каждая из команд
DJNZ отработает (т.е. знамение соответ-
ствующего регистра станет нулевым),
значения этих регистров станут
опреде-
ленными,
а именно нулевыми (а чего же
еще ожедать-то?). Таким образом, может
быть наши команды DJNZ сперва не-
сколько раз отработают
заранее неизве-
стное число циклею,
но рано или поздно
количество циклов “стабилизируется" и
станет вполне конкретным - каждый цикл
по
258 раз.
Однако, я не зря назвал этот
прием “запрещенным” - никогда так не
делайте! Категорически рекомендую все-
гда
явно задавать значения всех перемен-
ных
своей программы! Дело в том, что
если программа, как в нашем примере,,
состоит из десятка или около того строк,
то разобраться с принципом ее’ работы
еще можно, но когда вы станете писать
программы в сотни и тысячи строк, раз-
гадывание ребусов
неявных
значений
станет поистине титаническим трудом!
Запутаться и наделать ошибок при этом
-легче легкого! Не вырабатывайте в себе
привычки делать все кое-как “лишь бы
заработало”, потом побороть привычку
будет очень трудно! Кстати, заодно кате-
горически рекомендую снабжать каждую
строку подробным комментарием, это
так же поможет вам разобраться в своей-
программе.
Небольшое отступление. В качестве
оправдания себе за этот “запрещенный
приенГ напомню: изначально коды этой
программы я предложил вам ввести вруч-
ную. Только ради уменьшения количества
вводимых вручную цифр, не несущих
никакой осмысленной (на том этапе) ин-
формации, я сократил программу до ми-
нимума, использовав неявное задание
значений.
Наконец, мы подошли к предпослед-
ней строю-программы - строке номер 9.
В этой строке мы видим команду безус-
ловного перехода SJMP (Short JuMP -
короткйй прыжок). Операнд у нее один -
адрес
(или метка, что тоже самое), с ко-
торого будет выполнена следующая ко-
манда. Эта команда изменяет нормаль-
ную последовательность выполнения ко-
манд не при наступлении какого-то усло-
вия, как ранее рассмотренная команда
DJNZ, а
всегда,
т.е* в любом случае. В
нашей программе после команды строки
9 будет выполнена команда в строке.
..
правильно, 3.
РЛ" - НАЧИНАЮ Щ ИМ
Так что же, получается, команда в
строке 10 никогда не выполнится? Да,
только в этой строю не команда, а оче-
редная
директива
- END, т.е. конец про-
граммы. Встретив эту директиву, компи-
лятор останавливает свою работу и фор-
мирует выходной файл с кодами команд
микроконтроллера, который мы уже и заг-
ружаем в микроконтроллер. Кстати, мно-
гие компиляторы ассемблера позволяют
после директивы END писать хоть стихи
- компилятор эти строки уже не станет
обрабатывать. То есть строка с директи-
вой END - последняя обрабатываемая
строка текста программы.
Внимательный читатель, сопоставив
алгоритм работы программы мигания
светодиода, рассмотренный нами во вто-
рой главе,.и фактический текст програм-
мы, обнаружит ряд несовпадений. Во-пер-
вых, он не найдет в нашей программе на-
стройки портов на режим вывода. Во-вто-
рых, между командой изменения уровня
сигнала на линии порта и командой пе-
рехода на начало программы в нашем
случае аж делых три строки с команда-
ми, а в первоначальном варианте - одна
команда задержки в 0,5 секунды.
.. Од-
нако, на самом деле разницы между эти-
ми “программами" нет. А вот почему это
так, мы узнаем в следующей главе.
Глава 7 . Знаком ство
с си стем о й ком анд
Итак, мы остановились на сравнении
нашей “программной первоосновы” и ее
практической реализации, причем оста-
новились в некотором недоумении: то ли
есть между ними разница, то ли нет. В
этой главе мы узнаем новые подробнос-
ти о скорости работы микроконтролле-
ра, разберемся б этой разницей и нач-
нем более углубленно изучать систему
команд, одновременно знакомясь с осо-
бенностями внутреннего устройства
микроконтроллера. Закончить постара-
емся очередным практическим приме-
ром-задачей.
Небольшое отступление. Уже нео-
днократно мы заводили речь о “дискрег-
носги” работы микроконтроллера, скоро-
сти, быстродействия-вещам взаимосвя-
занным, но пока что весьма туманным.
Теперь мы стоим перед необходимостью
раз и навсегда решить для себя все нео-
пределенности, ибо без этого дальней-
шее изучение станет невозможным.
Вы помните, что все внутренние про-
цессы микроконтроллера AT89S8252
синхронизируются с частотой в 12 раз
11- - - - - - - - - - - - - ■
- - - - - - - - - - - - - - - - - - - - -
предыдущая страница 51 Радиолюбитель 2007-03 читать онлайн следующая страница 53 Радиолюбитель 2007-03 читать онлайн Домой Выключить/включить текст