I
\
МИКРОКОНТРОЛЛЕРЫ
}
И вновь - некоторые пояснения.
1. Теперь нам для работы понадобится доступ к рабочим
регистрам портов. В принципе можно было бы для этого занес-
ти новый адрес сегмента в регистр #й, но мы используем вто-
рой сегментный регистр -
#В,
благо свободных сегментных ре-
гистров пока более чем достаточно Поскольку адрес рабочего
регистра порта В равен
02Ь,
в регистр сегмента
необходимо
загрузить адрес 00И - вспомните правило образования адреса
начала сегмента.
2. Обратите внимание - хотя в команде
то\г1
мы и выводим
лог.О на
все
линии порта В, сигнал появится
только
на линии
В[0] - остальные линии были ранее настроены только на ввод
(см. подрегистр 3 регистра конфигурации порта В) и никакого
влияния на их работу команда
то у|
не окажет! Поэтому никог-
да не забывайте настраивать режимы линий портов
в самом
начале
работы программы.
А вот теперь - интересный момент. Для организации вре-
менной задержки в программе можно было бы воспользовать-
ся таймером, но мы в нашей первой программе применим са-
мый “варварский” способ - займем процессор микроконтрол-
лера абсолютно ненужной работой на достаточно продолжи-
тельное время (именно таким образом и поступают многие ра-
диолюбители и программисты). В нашей программе для орга-
низации заметной для глаза задержки времени (0,5.
..1 сек) не-
обходимо, чтобы процессор микроконтроллера между переклю-
чением светодиода выполнил по крайней мере 20000.
.30000
“ненужных” команд. Записать столько команд в память программ
мы не сможем при всем желании - там всего-то 1024 слова, но
выход из положения, тем не менее, есть. Для этого мы органи-
зуем в программе т.н.
цикл.
Цикл-одно из фундаментальней-
ших понятий программирования: с его помощью можно много-
кратно выполнять .однотипные действия. В нашей программе
таких циклов будет не один, а целых три - один внутри другого!
Такие циклы в программировании носят название
вложенных,
причем в соответствии с тем, кто куда вложен, различаются
внутренние
и
внешние
циклы (внутренний вложен во внешний).
Разновидностей циклов в программировании много: мы в дан-
ной программе применим две из
них-бесконечный
цикл (“ми-
галка” работает все время, пока ее не выключат), и
цикл со
счетчиком
(его еще называют циклом с переменной цикла).
Для хранения счетчиков цикла нам понадобятся ячейки ОЗУ. В
нашей первой программе мы воспользуемся двумя ячейками
ОЗУ - по адресу 40Ь и 41 И. Для того, чтобы добраться до этих
адресов, используем еще один сегментный регистр - на этот
раз
(команда
1с1г #А,40И).
3.
Итак, в ячейку ОЗУ по адресу 40h
(%а0)
заносим началь-
ное значение счетчика внешнего цикла (в данном случае 20h),
а в ячейку ОЗУ по адресу 41 h
(%а1)
заносим начальное значе-
ние счетчика внутренного цикла. Как ни парадоксально - этим
значением будет ноль! Нулевое начальное значение счетчика
цикла - очень интересный
программистский трюк:
из таких
трюков обычно и состоит хорошо написанная программа (на-
деюсь, читатель не воспримет эти строки, как похвалу автору).
А теперь-собственно внутренний цикл. Мы договорились,
что для организации временной задержки мы займем проце-
сор микроконтроллера выполнением абсолютно бесполезной
работы. Такой абсолютно бесполезной работой может оказать-
ся, например, выполнение команды
пор.
Ее можно было бы
вставить в цикл между строками, помеченными метками $2 и
$1, В программировании для команд, выполняющихся внутри
цикла, принят специальный термин -
тело цикла,
и в данном
случае тело состояло бы всего из одной команды
пор,
но мы
поступим еще проще - сделаем тело цикла
пустым
(такое
тоже вполне допустимо). Далее в программе под меткой $1
следует команда
subi %а1,1
- вычитание единицы из счетчи-
ка цикла, после чего следует команда условного перехода
jnz
- вновь на эту же команду
subi.
Как же работает этот участок
программы?
Начать необходимо стого, что в аппаратуре микроконтрол-
лера имеется т.н.
регистр состояния
процессора. При выпол-
нении многих команд в этом регистре устанавливаются или
сбрасываются т.н. биты состояния. Вот какие биты состояния в
нем присутствуют (биты состояния иногда называют еще
фла-
гами
состояния)
(таблица 1).
Не все выполняемые команды оказывают влияние на ре-
гистр состояния (в файле sh_soft.pdf указано, какая команда
и на какие флаги регистра состояний воздействует). Уже по
назначению флагов видно, что регистр состояния характери-
зует результат выполнения предыдущей команды. Например,
наша команда
subi %а1,1
установит после себя в регистре
состояния флаг С, флаг S и сбросит флаг
Z,
потому что при
вычитании единицы из нуля получится отрицательное число -
1, (следовательно S=1), потому что число перешло нулевую
границу (следовательно С=1 - вспомните по аналогии сигнал
переноса в счетчиках К555ИЕ7), и потому что в результате
получилось число, отличное от нуля (следовательно
Z=0).
Сле-
дующая за ней команда - команда
условного перехода.
В от-
личие от команд безусловного перехода, они передают управ-
ление не всегда, а только в том случае, если соответствующий
для данной команды флаг регистра состояния установлен в
Таблица 1
Номер бита
состояния
Назначение
7
Не используется
6
Не используется
5 (флаг ОС)
Устанавливается в лог.1, если при выполнении предыдущей операции произошел перенос лог.1 из 3-го бита в 4-й
4 (флаг ОР)
Устанавливается в лог. 1, если при выполнении предыдущей операции произошло переполнение
(переопустошение)
3 (флаг 1Е)
При установке в лог.1 разрешает работу механизма прерываний микроконтроллера
2 (флаг Э)
Устанавливается в лог.1, если при выполнении предыдущей операции получилось отрицательное число.
1 (ф лагг)
Устанавливается в лог.1, если при выполнении предыдущей операции получился ноль.
0 (флаг С)
Устанавливается в лог. 1, если при выполнении операции произошел перенос
44 |
| Радиолюбитель - 0 7 /2 0 0 5
предыдущая страница 47 Радиолюбитель 2005-07 читать онлайн следующая страница 49 Радиолюбитель 2005-07 читать онлайн Домой Выключить/включить текст