і
МИКРОКОНТРОЛЛЕРЫ
I
Idr
#5,01000000b
; Режим автоинкремента.
Idr
#A,60h
; Сегмент A - адрес ячеек ОЗУ под счетчик
movl
%a0,32
;'-Заносим в счетчик цикла число передаваемых байт.
mov
%d6,%d7
; Передаем байт ив образа в описатель автомата.
subi
%a0,1
; Вычесть счетчик цикла
jnz
$1
; Цикл еще не Закончен - продолжить работу
Idr
#B,OOh
; <2> Подготавливаем сегменты для портов
Idr
#D,18h
movl
%a0,7
; Заносим в счетчик цикла число передаваемых троек
movl
%al, 4
; Здесь будем формировать адрес регистра таймера
mov
%dl,%d7
; Настраиваем порт А
mov
%d2,%d7
; Настраиваем порт В
mtpr
#4,%al
; Загружаем IR0 адресом регистра таймера. Режим его
; работы — по-прежнему автоинкремент, но для этого куска
; программы это совершенно неважно.
mov
%d6,%d7
; Настраиваем интервальный таймер
btgl
%al,00000001b
; Изменяем адрес регистра таймера для следующей
; итерации цикла
subi
%a0,1
; Вычеоть счетчик цикла
jnz
$2
; Цмкл еще не закончен - продолжить.
mov
%b2,%d7
; <3> Устанавливаем начальные значения светодиодов
mov
%a0,%bl
; <4> Сохраняем текущее состояние кнопок
Сразу же - относительно дирек-
тив #с!еПпе. Их использование в про-
граммах не является обязательным,
но значительно облегчает жизнь про-
граммисту. Встретив такую директи-
ву, компилятор 1е5ва будет понимать,
что имя ТЕИ1\/иЭО\Л/М, например,
обозначает число 02И. Посмотрите,
как будет выглядеть теперь описание
автоматной таблицы (см. далее опи-
сание аиимаЫе): для программиста
оно намного понятнее, чем просто
;
упоминание тех или иных ничего не
говорящих чисел. Обратите внима-
йте также на то, что на этот раз уча-
сток настройки портов и интерваль-
:
ного таймера существенно отли чает-
ся от таких же участков в предыду-
щих программах. Давайте разберем
:
его более подробно:
1.
Вначале нам необходимо под-
'
готовить к работе ячейки памяти с
адресами 401г>.
.5Р|г>. Проще всего
было бы зто сделать, заслав в них
нужные начальные значения с по-
[ мощью команд т о у |. Таких команд
| нам потребовалось бы 32 (плюс еще
ь 4 команды №г - ведь эти ячейки рас-
I полагаются в четырех различных
* сегментах) - итого 36 команд, или
( 72 байта памяти программ. Мы же
! вместо такого бестолкового реше-
?
ния организуем в программе
цикл
\
Родиолюбитель - 12/2005 |
заполнения. Первыми двумя коман-
дами
Idal
и
Idah
мы подготавливаем
к работе регистр косвенной адреса-
ции IR1 - он будет указывать на
об-
раз
нашей будущей памяти, распо-
ложенной в программе под меткой
init_seq (ее описание см. ниже), кото-
рый мы заранее подготовили вруч-
ную (с помощью инструкций
.byte)
на
этапе написания программы. Следу-
ющими двумя командами
Idr
мы под-
готавливаем к работе регистр кос-
венной адресации IR0 - он начинает
свою работу с адреса 40h и работает
в режиме автоинкремента, т.е. пос-
ле выполнения команды с его учас-
тием, автоматически увеличивает со-
держимое на единицу. Далее для ра-
боты цикла нам понадобится ячейка
под счетчик цикла. Мы будем хранить
его в сегменте 60h (команда
Idr)
и
сразу заносим в него значение 32 (ко-
мандой
movl)
- пересылать нам при-
дется 4 (число автоматов) * 8 (раз-
мер описателя одного автомата) = 32
байта образа памяти. Сам цикл выг-
лядит предельно просто - мы просто
пересылаем байт
образа
из памяти
программ в область ОЗУ (команда
mov %d6,%d7),
уменьшаем счетчик
цикла (команда
subi %а0,1)
и пере-
даем управление снова на команду
mov,
пока цикл не закончится. Всего
для организации цикла нам потребо-
валось 9 команд (18 байтов) + еще
32 байта образа в памяти программ
= 50 байтов. Экономия по сравнению
с прямолинейным способом решения
задачи составила 22 байта или 11 ко-
манд! Что же касается удлинения
времени работы программы, то на
участке
инициализации
(так обыч-
но называется в программистской
литературе тот участок, который под-
готавливает к работе память и вне-
шние устройства) на зто никто никог-
да не обращает внимания - этот уча-
сток программы выполняется
всего
один раз!
Подобную технику -
ини-
циализацию
ячеек ОЗУ или регист-
ров портов
из образа,
- следует при-
менять по возможности чаще.
2.
Теперь нам необходимо подго-
товить к работе оба порта и интер-
вальный таймер. Прямолинейным
способом нам также потребовалось
бы на зто две команды загрузки сег-
ментных регистров плюс 7 + 7 + 7
команд
тоу|
= 23 команды или 46
байт! Поэтому здесь мы поступим
аналогичным образом - выполним
инициализацию портов и таймера
в
одном цикле
из
образа,
благо в каж-
дый из портов и таймеров нужно вы-
дать данных поровну. Вначале подго-
тавливаем к работе два сегментных
---------------------------------------------------------------1 39
предыдущая страница 36 Радиолюбитель 2005-12 читать онлайн следующая страница 38 Радиолюбитель 2005-12 читать онлайн Домой Выключить/включить текст