i
МИКРОКОНТРОЛЛЕРЫ
[
movl
%a2,8
; Выводим 8 байт.
; Основная программа.
push
#A
; Обработчик прерываний от сторожевого таймера.
push
#4
push
#5
ldr
#A,48h
; Сегмент А - адрес рабочих ячеек обработчика.
shr
%al
; <3>Сдвинуть бегущую единицу во флаг С
jnz
$1
; Результат ненулевой - все нормально.
movl
%al,10000000b
; Нулевой результат. Бегущая единица была испорчена, и ее
; необходимо восстановить.
rlc
%Ь2
; Забрать выдвинутую единицу (или ноль) в порт В.
bid
%Ы,00000001Ь
; <4>Сбросить сигнал С регистра сдвига.
bisl
%Ы, 00000001b
; Установить сигнал С регистра сдвига.
mtpr
#4,%a0
; <5> Загрузить 1И0 адресом выводимого символа.
ldr
#5,AUTODECREMENT
mov
%Ь2,%d6
; <6>3анести в порт В очередной символ из образа.
mfpr
%a0,#4
; Сохранить адрес следующего символа.
subl
%a2,1
; <7>Вычесть счетчик цикла.
jnz
$2
; Цикл одного отображения еще не закончен
movl
%a0,47h
; Цикл закончен - начать новый цикл с последнего адреса
movl
%a2,8
; Переустановить счетчик цикла.
movl
%d5,OAAh
; <8> Загрузить в сторожевой таймер характерный код.
movl
%d5,01010111b
; Перезапустить таймер.
pop
#5
; Восстановить регистры.
pop
#4
pop
rti
#A
Необходимые пояснения:
1. Для работы системы динамической индикации запускаем в работу сторожевой таймер.
2. Подготавливаем рабочие ячейки для обработчика прерываний от сторожевого таймера.
3. Теперь мы уже в обработчике прерываний от сторожевого таймера. Следующие четыре команды предназ-
начены для того, чтобы на линии В[0] появился очередной бит из байта, в котором мы храним бегущую единицу.
В некоторых микропроцессорах существует команда циклического сдвига не через флаг переноса С, а непос-
редственно из младшего бита в старший. В системе команд микроконтроллера КР1878ВЕ1 такой команды нет,
поэтому приходится делать дополнительные усилия, чтобы “завернуть” младший бит байта бегущей единицы в
старший. Выдвинутый же бит забирается в порт В микроконтроллера командой lie.
4. Этими командами мы обеспечиваем занесение очередного бита из байта бегущей единицы в регистр сдвига.
5. Поскольку динамическая индикация заключается в поочередном выводе символов, нам необходимо доб-
раться до очередного символа. Адрес его мы храним в ячейке %а0, и именно его мы и загружаем в регистр IR0.
6
. А вот теперь - заносим в порт В выводимый в это знакоместо символ (таким образом и происходит вре-
менное мультиплексирование линий порта В).
7. Этими командами мы обеспечиваем повторяемость цикла динамической индикации - после того, как
пройдет один круг отображения всех ячеек, он начнется вновь с исходной позиции.
8
. И, наконец, для обеспечения непрерывной работы динамической индикации - перезапуск сторожевого таймера.
Как видите, реализация динамической индикации
по такой схеме требует минимальных усилий со сто-
роны программы - весь процесс отображения образа
на матрицу светодиодов реализован исключительно
в обработчике прерываний. Основной программе же
нужно просто заносить в область ячеек 40Ь.
.47Ь не-
обходимые символы, нимало не заботясь о том, ка-
ким образом они попадут на матрицу светодиодов.
Для реализации динамической индикации по рис.
6
нам
потребуется еще две дополнительных ячейки 4ВЬ.
.4СЬ -
под счетчик цикла и рабочую ячейку. Предполагаем
также, что для сигнала й обоих регистров использу-
ется линия А[0], для сигнала С регистра строк исполь-
зуется линия А[1], а для сигнала С регистра столбцов
используется линия А[2]. Итак, вот какие изменения
необходимо внести в предыдущий фрагмент програм-
мы, чтобы обеспечить работу динамической индика-
ции по рис.
6
(см.
на следующей странице):
|
39
Радиолюбитель - 0 4 /2 0 0 6 |
предыдущая страница 39 Радиолюбитель 2006-04 читать онлайн следующая страница 41 Радиолюбитель 2006-04 читать онлайн Домой Выключить/включить текст