Вы находитесь на странице: 1из 20

2-1/19.

Переход от шкального индикатора к отображению результатов


замера/подсчета, в форме картинки импульса (эпюры), с фиксированным
периодом в 100 градаций (градуировка - с шагом в 10 градаций). Два варианта
оптимизации.

То, о чем пойдет речь в этом подразделе, дает прямой выход на "ваяние" цифрового,
в том числе и многоканального осциллографа (или что-то типа этого), что, как сами
понимаете, весьма не слабо (цена этих "штуковин" удивляет очень сильно).
В том числе и с памятью.
Я не просто так упорно занимался шкальными индикаторами, а по очень могучему
поводу.
Дело в том, что, в соответствии с принципом "от простого к сложному", картинку
шкального индикатора можно, достаточно просто, "трансформировать" в картинку
эпюры.
Сейчас докажу (в приложении к одному каналу):

В данном случае, имеет место быть период импульсной последовательности равный


100 градациям.
Градуировка - через каждые 10 градаций.
А теперь ближе к делу.
Программа называется 12864_21.asm (прилагается):

;********************************************************************************
; 12864_21.asm Переход от шкального индикатора к эпюре
; (отображение чисел в форме импульса).
;********************************************************************************
.....................................
.....................................
;----------------------------------------------
; Объем программы: 1200 слов в памяти программ.
;================================================================================
LIST p=16F873A ; Задание типа микроконтроллера.
__CONFIG 3F71H ; Включено: XT-генератор, PWRT, сброс BOR,
; Выключено: защита, WDT, LVP, DEBUG.
;================================================================================
; Регистры специального назначения.
;================================================================================
.....................................
.....................................
;================================================================================
; Регистры общего назачения.
;================================================================================
Temp equ 20h ; Регистр количества проходов.
Reg equ 21h ; Регистр выбора сценария вычисляемого
; перехода (плюс, используется в ПП BIN2_10).
Mem1 equ 22h ; Регистры задержки, а также и хранения
Mem2 equ 23h ; результата кольцевого сдвига
Mem3 equ 24h ; (кроме того, Mem1 - указатель страницы).
Reg1 equ 25h ; Регистр счетчика количества попугаев
1
; верхней шкалы.
N_Zapoln1 equ 26h ; Регистр количества байтов заполнения
; верхней шкалы (для 1-го кристалла).
N_Zapoln2 equ 27h ; Регистр количества байтов заполнения
; верхней шкалы (для 2-го кристалла).
Flag equ 28h ; Указатель кристалла.
LED0 equ 30h ; Регистры, задействованные
LED1 equ 31h ; в ПП 2/10 преобразования.
;================================================================================
; Присвоение битам названий.
;================================================================================
.....................................
.....................................
;================================================================================
org 0 ; Начать выполнение программы с 0 адреса PC.
goto START ; Переход в ПП START.
;********************************************************************************

;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; Группа подпрограмм, обеспечивающая "побайтное" формирование символов цифр
; ("знакогенератор").
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; Символ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "пробел".
;--------------------------------------------------------------------------------
Z_0....10
.....................................
;================================================================================
; Подпрограммы выбора страниц 1, 2, 3, 4, 5, 6, 7, 8.
;================================================================================
STRANICA_1...8
.....................................
;================================================================================
; Подпрограмма записи данных.
;================================================================================
WRITE_D
.....................................
;================================================================================
; Подпрограмма чтения данных.
;================================================================================
READ_D
.....................................
;================================================================================
; Подпрограмма стробирования.
;================================================================================
STROB
.....................................
;================================================================================
; Подпрограмма установки первого (самого левого) столбца страницы (адрес 00h).
;================================================================================
STOLB_1
.....................................
;================================================================================
; Подпрограмма заполнения страницы нулями.
;================================================================================
ZERO
.....................................
;================================================================================
; Подпрограмма выбора страницы, в случае совмещения 4-х таблиц,
; относящихся к одному кристаллу.
;================================================================================
VIBOR
.....................................
;================================================================================
; Подпрограмма числовой коррекции адреса "прыжка".
;================================================================================
2
N_STR
.....................................
;================================================================================
; ЗАДЕРЖКА (0,3 сек.)
;================================================================================
PAUSE
.....................................
;================================================================================
; Подпрограмма "обнуления" 4, 7 и 8 страниц.
;================================================================================
SBROS_STR call STRANICA_7 ; Выбор 7-й страницы.
call ZERO ; И заполнение ее нулями.

SBROS_STR_1 call STRANICA_4 ; Выбор 4-й страницы.


call ZERO ; И заполнение ее нулями.

call STRANICA_8 ; Выбор 8-й страницы.


call ZERO ; И заполнение ее нулями.

return ; Возврат по стеку в процедуру вывода


; на индикацию 1-го "кадра".
;================================================================================
; Подпрограмма записи, в 7-ю страницу, картинки линии нулевого уровня
; и маркера периода.
;================================================================================
LIN_MARKER call STRANICA_7 ; Выбор 7-й страницы.
call STOLB_1 ; Выбор 1-го столбца страницы.
;------------------------------------------------------------------------
; Проверка указателя активного кристалла.
;------------------------------------------------------------------------
btfss Flag,7 ; Какой кристалл включен ?
goto $+.11 ; Если включен 1-й кристалл, то
; отрабатывается группа команд №1.
; если включен 2-й кристалл, то
; отрабатывается группа команд №2.
;------------------------------------------------------------------------
; Если установлен 2-й кристалл (группа команд №2).
;------------------------------------------------------------------------
movlw .36 ; Задание количества
movwf Temp ; проходов.

call $+.10 ; Вывод на индикацию линии нулевого уровня.


à Возврат по стеку
movlw .255 ; W -> .255 (FFh/1111 1111)-> маркер периода.
movwf PortC ; .255 выводится в порт С.
call WRITE_D ; Записывается.
movlw 1 ; W -> .1 (01h/0000 0001)-> для красоты.
movwf PortC ; .1 выводится в порт С.
call WRITE_D ; Записывается.
return ; Возврат по стеку в то место,
; откуда произошел вызов подпрограммы.
;------------------------------------------------------------------------
; Если установлен 1-й кристалл (группа команд №1).
;------------------------------------------------------------------------
movlw .64 ; Задание количества
movwf Temp ; проходов.

movlw .128 ; W -> .128 (80h/1000 0000)


movwf PortC ; .128 выводится в порт С.
call WRITE_D ; Записывается.
decfsz Temp,F ; Temp - 1 = ...
goto $-4 ; Если результат не=0, то 0 выводится
; в следующий столбец.
return ; Если =0, то возврат по стеку в то место,
; откуда произошел вызов подпрограммы.
;================================================================================
3
; ПП записи в 6-ю страницу (картинка градуировки с шагом в 10 позиций).
;================================================================================
ZAPIS_STR6 call STRANICA_6 ; Выбирается 1-й столбец
call STOLB_1 ; 6-й страницы.
movlw .64 ; Задание количества
movwf Temp ; проходов.
;------------------------------------------------------------------------
; Проверка указателя активного кристалла.
;------------------------------------------------------------------------
btfss Flag,7 ; Какой кристалл включен ?
goto $+.12 ; Если включен 1-й кристалл, то
; отрабатывается группа команд №1.
; если включен 2-й кристалл, то
; отрабатывается группа команд №2.
;------------------------------------------------------------------------
; Если установлен 2-й кристалл (группа команд №2).
;------------------------------------------------------------------------
movf Temp,W ;
sublw .68 ; .68 - Temp = ...

movwf Reg ; Аналогично.


call TEXT_3 ; Переход происходит
movwf PortC ; в ПП TEXT_3.
movlw high WRITE_D;
movwf PCLATH ;
call WRITE_D ;
decfsz Temp,F ;
goto $-9 ;
return ; Возврат по стеку в то место, откуда
; произошел вызов подпрограммы.
;------------------------------------------------------------------------
; Если установлен 1-й кристалл (группа команд №1).
;------------------------------------------------------------------------
movf Temp,W ;
sublw .64 ; .64 - Temp = ...

movwf Reg ; Аналогично.


call TEXT_3 ; Переход происходит
movwf PortC ; в ПП TEXT_3.
movlw high WRITE_D;
movwf PCLATH ;
call WRITE_D ;
decfsz Temp,F ;
goto $-9 ;
return ; Возврат по стеку в то место, откуда
; произошел вызов подпрограммы.
;================================================================================

;********************************************************************************
; НАЧАЛО ПРОГРАММЫ.
;********************************************************************************
; Подготовительные операции.
;================================================================================
START
.....................................
.....................................
;================================================================================
; Инициализация графического модуля.
;================================================================================
.....................................
.....................................

;################################################################################
; Вывод на индикацию картинки 1-го "кадра".
;################################################################################
4
;*************************************
; Переход на 2-й кристалл.
;*************************************
.....................................
.....................................
;--------------------------------------------------------------------------------
; Запись картинки градуировки в 6-ю страницу 2-го кристалла.
;--------------------------------------------------------------------------------
call ZAPIS_STR6 ; Переход в ПП ZAPIS_STR6.
;--------------------------------------------------------------------------------
; Запись в 4, 7, 8 страницы 2-го кристалла (заполнение их нулями).
;--------------------------------------------------------------------------------
call SBROS_STR ; Переход в ПП "обнуления" 4, 7 и 8 страниц.
;*************************************
; Переход на 1-й кристалл.
;*************************************
.....................................
.....................................
;--------------------------------------------------------------------------------
; Запись картинки градуировки в 6-ю страницу 1-го кристалла.
;--------------------------------------------------------------------------------
call ZAPIS_STR6 ; Переход в ПП ZAPIS_STR6.
;--------------------------------------------------------------------------------
; Запись в 4, 8 страницы 1-го кристалла (заполнение их нулями).
;--------------------------------------------------------------------------------
call SBROS_STR_1 ; Переход в ПП "обнуления" 4 и 8 страниц.
;################################################################################

;********************************************************************************
; А теперь можно "замерить" текущее количество попугаев.
;********************************************************************************
; Подготовительные операции.
;================================================================================
; Переход на 2-й кристалл.
;-------------------------------------
SNOVA bcf PortB,E1 ; Выключение 1-го кристалла.
bsf PortB,E2 ; Включение 2-го кристалла.
bsf Flag,7 ; Указание на активность 2-го кристалла.
;-------------------------------------
; Работа в 7 странице 2-го кристалла.
;-------------------------------------
call LIN_MARKER ; Формирование картинки линии нулевого уровня
; и маркера периода.
;-------------------------------------
; Переход на 1-й кристалл.
;-------------------------------------
bsf PortB,E1 ; Включение 1-го кристалла.
bcf PortB,E2 ; Выключение 2-го кристалла.
bcf Flag,7 ; Указание на активность 1-го кристалла.
;-------------------------------------
; Работа в 7 странице 1-го кристалла.
;-------------------------------------
call LIN_MARKER ; Формирование картинки линии нулевого уровня
; без маркера периода.
;-------------------------------------
; Сброс указателя кристалла.
;-------------------------------------
clrf Flag ; Flag = 0.
;================================================================================
; "Закольцовка" счета и запись текущего количества попугаев
; в регистры оперативной памяти.
;================================================================================
.....................................
.....................................
;--------------------------------------------------------------------------------
; Теперь, текущее, двоичное количество попугаев нужно
5
; стандартно перевести в "набор" 2/10 чисел.
;--------------------------------------------------------------------------------
call BIN2_10 ; Переход в ПП 2/10 преобразования
; (то, что нужно преобразовать, "лежит"
; в Mem1).
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; Вывод результата "подсчета" количества попугаев
; на индикацию в графический модуль.
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; Задание "координаты", с которой начнется запись байтов данных.
;--------------------------------------------------------------------------------
call STRANICA_5 ; Выбор 5-й страницы.
movlw b'01100000' ; Выбор адреса 33-го столбца (20h).
movwf PortC ; Вывод инструкции "Set Address" в порт С.
call STROB ; Строб под инструкцию.
;--------------------------------------------------------------------------------
; Группа команд гашения незначащих нулей.
;--------------------------------------------------------------------------------
.....................................
.....................................
;--------------------------------------------------------------------------------
; "Администраторская" подпрограмма.
;--------------------------------------------------------------------------------
ADMIN
.....................................
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

;////////////////////////////////////////////////////////////////////////////////
; РАБОТА С ЭПЮРОЙ.
;////////////////////////////////////////////////////////////////////////////////
; Будем работать только в 1-м кристалле или в обеих? Анализ, "оргвыводы".
;================================================================================
.....................................
.....................................
;================================================================================
; Вывод данных на индикацию в 7-ю страницу 1-го кристалла.
;================================================================================
.....................................
.....................................
;--------------------------------------------------------------------------------
; Анализ состояния флага (бит №0 регистра Flag) указателя кристалла.
;--------------------------------------------------------------------------------
.....................................
.....................................
;--------------------------------------------------------------------------------
; "Убийство" паразитного всплеска (FFh) путем записи, по верху "паразита",
; одного байта картинки единичного уровня (01h).
;--------------------------------------------------------------------------------
btfss Flag,0 ; Работа в 7-й странице 2-го кристалла есть
; или ее нет?
goto $+7 ; Если нет, то обход "убийства паразита".
; Если есть, то "убийство паразита".
movlw b'01111111' ; Выбор адреса 64-го столбца (3Fh).
movwf PortC ; Вывод команды выбора адреса столбца
; на линии DB7...DB0.
call STROB ; Строб ("запуск в работу").
movlw b'00000001' ;
movwf PortC ; .1 выводится в порт С.
call WRITE_D ; Записывается.
;-------------------------------------
; Переход на 2-й кристалл.
;-------------------------------------
bcf PortB,E1 ; Выключение 1-го кристалла.
bsf PortB,E2 ; Включение 2-го кристалла.
;================================================================================
; Вывод данных на индикацию в 7-ю страницу 2-го кристалла.
6
;================================================================================
.....................................
.....................................
;////////////////////////////////////////////////////////////////////////////////

VIHOD call PAUSE ; Задержка 0,3 сек.


;================================================================================
; Далее - "на колу мочало" ("закольцовка").
;================================================================================
goto SNOVA ; Переход на следующий цикл программы.
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; Группа подпрограмм вывода на индикацию символов цифр.
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
.....................................
.....................................
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

;################################################################################
; ТАБЛИЦЫ ДАННЫХ 1-го "КАДРА".
;################################################################################
.....................................
.....................................
;--------------------------------------------------------------------------------
; Данные 6-й страницы 1-го кристалла (код картинки градуировки).
;--------------------------------------------------------------------------------
TEXT_3
.....................................

STR_3 Dt 0x3C,0x08,0x08,0x08,0x08,0x08,0x08,0x08
Dt 0x08,0x08,0x3C,0x08,0x08,0x08,0x08,0x08
Dt 0x08,0x08,0x08,0x08,0x3C,0x08,0x08,0x08
Dt 0x08,0x08,0x08,0x08,0x08,0x08,0x3C,0x08 ; Картинка
Dt 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08 ; градуировки
Dt 0x3C,0x08,0x08,0x08,0x08,0x08,0x08,0x08 ; (3Ch -
Dt 0x08,0x08,0x3C,0x08,0x08,0x08,0x08,0x08 ; вертикальные
Dt 0x08,0x08,0x08,0x08,0x3C,0x08,0x08,0x08 ; линии).
DT 0x08,0x08,0x08,0x08
;################################################################################

;////////////////////////////////////////////////////////////////////////////////
; ТАБЛИЦА ДАННЫХ ЭПЮРЫ.
;////////////////////////////////////////////////////////////////////////////////
TEXT_4 ; 1-й байт
..................................... ; массива (0xFF)
; формирует
STR_4 Dt 0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01 ; картинку спада
Dt 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 ; импульса.
Dt 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 ; Остальные байты
Dt 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 ; (0x01)
Dt 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 ; формируют
Dt 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 ; картинку
Dt 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 ; единичного
Dt 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 ; уровня.
;////////////////////////////////////////////////////////////////////////////////

;================================================================================
; Подпрограмма двоично-десятичного преобразования Сергея Рослика.
;================================================================================
BIN2_10
.....................................
;********************************************************************************
end ; Конец программы

7
Темно-красным цветом выделено то, что относится к "обнулению" страниц
графического модуля.
Темно-синим цветом выделено то, что относится к картинке градуировки (шаг - 10
позиций).
Красным цветом выделено то, что относится к картинке линии нулевого уровня и
маркера периода.
"Мать" - программа 12864_19.asm.

Если формировать картинку эпюры из расчета полного использования одной страницы


графического модуля, то принцип перевода шкалы в эпюру такой.
В 1-м байте таблицы данных эпюры, задается байт с числовым значением FFh.
Это спад импульса, который, по мере увеличения количества попугаев, будет двигаться
слева направо.
Кроме того, нужно обеспечить (левее FFh) вывод на индикацию линии единичного
уровня (имеется ввиду уровень единицы импульса), с числовым значением 01h.
Правее же байта с числовым значением FFh, заранее, нужно сформировать картинку
нулевого уровня (имеется ввиду уровень нуля импульса).
Проще всего сформировать картинку нулевого уровня в начале циклической ПП
SNOVA, а после этого, по ее верху, записывать байты данных спада импульса (FFh) и
единичного уровня (01h).
Как видите, в принципе формирования картинки импульса (для тех из Вас, кто
прочувствовал, что такое запись по верху), ничего особо сложного нет.
А теперь более детально.

Принцип "обнуления" страниц в 1-м "кадре".

;================================================================================
; Подпрограмма "обнуления" 4, 7 и 8 страниц.
;================================================================================
SBROS_STR call STRANICA_7 ; Выбор 7-й страницы.
call ZERO ; И заполнение ее нулями.

SBROS_STR_1 call STRANICA_4 ; Выбор 4-й страницы.


call ZERO ; И заполнение ее нулями.

call STRANICA_8 ; Выбор 8-й страницы.


call ZERO ; И заполнение ее нулями.

return ; Возврат по стеку в процедуру вывода


; на индикацию 1-го "кадра".

В части касающейся работы во 2-м кристалле, картинка 1-го "кадра" формируется так
же, как и в "матери" (goto SBROS_STR).
В части касающейся работы во 1-м кристалле, - то же самое, за исключением
"обнуления" 7-й страницы (goto SBROS_STR_1).
Какой смысл тратить на это время, если сразу же после вывода на индикацию
картинки 1-го "кадра", в 7-ю страницу 1-го кристалла, производится запись (по верху)
картинки линии нулевого уровня, причем, в полном объеме страницы.
В принципе, то же самое можно было сделать и в 7-й странице 2-го кристалла, но в
этом случае, в интервале "нерабочих" позиций (от 101 до 128), "навсегда заторчит
бесполезная и глупая" линия нулевого уровня.
Да и маркер периода выставить нужно. Иначе, если ориентироваться по градуировке,
это будет выглядеть не очень-то и комфортно.
Я сделал так.
В начале ПП SNOVA, в 7-ю страницу 1-го кристалла, выводится, по всей ее длине (64
байта), "непромаркированная" линия нулевого уровня.
В 7-ю страницу 2-го кристалла, она тоже выводится, но не по всей длине страницы, а
до 35 позиции включительно, плюс маркер периода (36 позиция).
В итоге, это соответствует выставлению маркера периода на сотой позиции
(64+36=100).

8
О том, как это конкретно делается, будет рассказано ниже, а пока нужно "усечь" то,
что в 1-м "кадре", 7-ю страницу 2-го кристалла нужно "обнулить".
Если этого не сделать, то левее маркера периода, будет "красота и ляпота", а правее
- "чернота" (FFh).
Сказанное и объясняет то, что при выводе на индикацию картинки 1-го "кадра", 7-ю
страницу 2-го кристалла нужно "обнулить", а 7-ю страницу 1-го кристалла можно и не
"обнулять".
Та "чернота", которая, в последнем случае, будет иметь место быть, "промелькнет с
таким реактивным свистом", что человеческий глаз этого просто не заметит.
Сия "концепция" и реализована (дает выигрыш по скорости отработки 1-го "кадра").

Формирование линии нулевого уровня и маркера периода.

Примечание: "линия нулевого уровня" это картинка, визуально отображающая нулевой


уровень эпюры (той или иной протяженности), а "линия единичного уровня" это то же
самое, но относящееся к единичному уровню эпюры.
При наличии импульсов, суммарная длина этих линий есть период импульсной
последовательности.

После вывода на индикацию картинки 1-го "кадра", начинается циклическая ПП SNOVA:

;********************************************************************************
; А теперь можно "замерить" текущее количество попугаев.
;********************************************************************************
; Подготовительные операции.
;================================================================================
; Переход на 2-й кристалл.
;-------------------------------------
SNOVA bcf PortB,E1 ; Выключение 1-го кристалла.
bsf PortB,E2 ; Включение 2-го кристалла.
bsf Flag,7 ; Указание на активность 2-го кристалла.
;-------------------------------------
; Работа в 7 странице 2-го кристалла.
;-------------------------------------
call LIN_MARKER ; Формирование картинки линии нулевого уровня
; и маркера периода.
;-------------------------------------
; Переход на 1-й кристалл.
;-------------------------------------
bsf PortB,E1 ; Включение 1-го кристалла.
bcf PortB,E2 ; Выключение 2-го кристалла.
bcf Flag,7 ; Указание на активность 1-го кристалла.
;-------------------------------------
; Работа в 7 странице 1-го кристалла.
;-------------------------------------
call LIN_MARKER ; Формирование картинки линии нулевого уровня
; без маркера периода.
;-------------------------------------
; Сброс указателя кристалла.
;-------------------------------------
clrf Flag ; Flag = 0.
;================================================================================
; "Закольцовка" счета и запись текущего количества попугаев
; в регистры оперативной памяти.
;================================================================================

Изменения (по отношению к "матери") выделены красным цветом.


Бит №7 регистра Flag задействуется как указатель активного кристалла.
Если включен 1-й кристалл, то Flag,7 = 0.
Если включен 2-й кристалл, то Flag,7 = 1.
Сразу же после "срабатывания" этого указателя, происходит условный переход в ПП
LIN_MARKER (вынесена в "обслугу", так как используется 2 раза):

9
;================================================================================
; Подпрограмма записи, в 7-ю страницу, картинки линии нулевого уровня
; и маркера периода.
;================================================================================
LIN_MARKER call STRANICA_7 ; Выбор 7-й страницы.
call STOLB_1 ; Выбор 1-го столбца страницы.
;------------------------------------------------------------------------
; Проверка указателя активного кристалла.
;------------------------------------------------------------------------
btfss Flag,7 ; Какой кристалл включен ?
goto $+.11 ; Если включен 1-й кристалл, то
; отрабатывается группа команд №1.
; если включен 2-й кристалл, то
; отрабатывается группа команд №2.
;------------------------------------------------------------------------
; Если установлен 2-й кристалл (группа команд №2).
;------------------------------------------------------------------------
movlw .36 ; Задание количества
movwf Temp ; проходов.

call $+.10 ; Вывод на индикацию линии нулевого уровня.


à Возврат по стеку.
movlw .255 ; W -> .255 (FFh/1111 1111)-> маркер периода.
movwf PortC ; .255 выводится в порт С.
call WRITE_D ; Записывается.
movlw 1 ; W -> .1 (01h/0000 0001)-> для красоты.
movwf PortC ; .1 выводится в порт С.
call WRITE_D ; Записывается.
return ; Возврат по стеку в то место,
; откуда произошел вызов подпрограммы.
;------------------------------------------------------------------------
; Если установлен 1-й кристалл (группа команд №1).
;------------------------------------------------------------------------
movlw .64 ; Задание количества
movwf Temp ; проходов.

movlw .128 ; W -> .128 (80h/1000 0000)


movwf PortC ; .128 выводится в порт С.
call WRITE_D ; Записывается.
decfsz Temp,F ; Temp - 1 = ...
goto $-4 ; Если результат не=0, то 0 выводится
; в следующий столбец.
return ; Если =0, то возврат по стеку в то место,
; откуда произошел вызов подпрограммы.

В названии этой ПП, достаточно внятно сформулирована ее функциональность.


В начале ПП LIN_MARKER, происходит адресация к 1-му столбцу 7-й страницы.
Это - само собой разумеющееся.
Далее, с целью ответа на вопрос: "Какой кристалл включен?", производится проверка
состояния бита №7 регистра Flag (указателя активного кристалла).
В зависимости от результата этой проверки, будет отработан один из двух сценариев:

1. Если включен 1-й кристалл, то отрабатывается группа команд №1.


Это ровным счетом то же самое, что и в случае "обнуления" страницы
(см. ПП ZERO), но вместо нулей, на индикацию выводятся байты с числовым
значением .128. Это и есть линия нулевого уровня.
2. Если включен 2-й кристалл, то отрабатывается группа команд №2.
Это немного "позаковырестее".

Сначала нужно вывести на индикацию линию нулевого уровня, но не по всей длине


страницы, а в первые ее 35 столбцов.
Я не стал "плодить клонов", а организовал условный переход call $+.10.
10
На момент возврата по стеку, линия нулевого уровня будет выведена на индикацию в
первые 35 столбцов 7-й страницы 2-го кристалла (35, а не 36 потому, что имеет
место быть команда decfsz).
После возврата по стеку, на индикацию, в 36-й столбец, выводится (напоминаю про
автоинкремент) маркер периода.
Речь идет об одном байте, с числовым значением FFh/.255.
А если к нему, справа, "пририсовать" один или несколько байтов единичного уровня
(01h), то создается иллюзия начала следующего периода.
Я "пририсовал" один байт, но можно и больше.
Так оно как-то симпатичнее смотрится.
Обратите внимание на то, что в данном случае, таблица вычисляемого перехода не
использовалась.
Так выгодно поступать в тех случаях, когда на индикацию выводится либо массив
байтов с одинаковыми числовыми значениями, либо небольшое количество байтов (в
том числе и с различными числовыми значениями), либо и то, и другое.
Именно такой "гибрид" и имеет место быть.

После вывода на индикацию линии нулевого уровня и маркера периода и вплоть до


окончания цикла ПП SNOVA, все то же самое, что и в "матери", за исключением
таблицы вычисляемого перехода ПП TEXT_4.
Теперь она выглядит так:

;////////////////////////////////////////////////////////////////////////////////
; ТАБЛИЦА ДАННЫХ ЭПЮРЫ.
;////////////////////////////////////////////////////////////////////////////////
TEXT_4 ; 1-й байт
..................................... ; массива (0xFF)
; формирует
STR_4 Dt 0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01 ; картинку спада
Dt 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 ; импульса.
Dt 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 ; Остальные байты
Dt 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 ; (0x01)
Dt 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 ; формируют
Dt 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 ; картинку
Dt 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 ; единичного
Dt 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 ; уровня.
;////////////////////////////////////////////////////////////////////////////////

"Зачернение" заменено на линию единичного уровня (0х01).


1-й байт таблицы (FFh) формирует картинку спада импульса.
В зависимости от количества попугаев, этот "гибрид" из байтов линии единичного
уровня и байта спада импульса, будет иметь ту или иную ширину.
А так как, в каждом цикле ПП SNOVA, запись этого "гибрида" производится по верху
картинки линии нулевого уровня, то последняя "даст дуба", а картинка линии
единичного уровня, в "комплекте" с картинкой спада импульса, будет "цвести и
пахнуть".
При этом, "недобитая" часть картинки линии нулевого уровня ("хвостик") будет тоже
"цвести и пахнуть" (типа "пронесло"/"жить будем").
Вот таким, достаточно нехитрым способом, и получается импульс той или иной
протяженности, "на фоне" фиксированного периода импульсной последовательности.
Не исключено, что "изобретен велосипед" (надеюсь, что с круглыми, а не с иными
колесами), но можно утешиться тем, что такой "велосипед" дефицитен.
Радоваться пока еще рано, так как, как и положено по закону жанра, имеется "бяка".

"Убийство" паразитного всплеска.

Если спад импульса формируется в 7-й странице 2-го кристалла, то в 64-й позиции
7-й страницы 1-го кристалла, гнусно фиксируется "паразит/вражина/гнус/…,
представляющий собой спад импульса (байт FFh), который, как бы, "не смог
преодолеть границы", разделяющей кристаллы.

11
Вот он там и "заторчал", нарушая всю "эстетику".
Проще всего его "убить" записью, по верху, одного байта линии единичного уровня
(01h), что и имеет место быть:

;////////////////////////////////////////////////////////////////////////////////
; РАБОТА С ЭПЮРОЙ.
;////////////////////////////////////////////////////////////////////////////////
; Будем работать только в 1-м кристалле или в обеих? Анализ, "оргвыводы".
;================================================================================
.....................................
.....................................
;================================================================================
; Вывод данных на индикацию в 7-ю страницу 1-го кристалла.
;================================================================================
.....................................
.....................................
;--------------------------------------------------------------------------------
; Анализ состояния флага (бит №0 регистра Flag) указателя кристалла.
;--------------------------------------------------------------------------------
.....................................
.....................................
;--------------------------------------------------------------------------------
; "Убийство" паразитного всплеска (FFh) путем записи, по верху "паразита",
; одного байта картинки единичного уровня (01h).
;--------------------------------------------------------------------------------
btfss Flag,0 ; Работа в 7-й странице 2-го кристалла есть
; или ее нет?
goto $+7 ; Если нет, то обход "убийства паразита".
; Если есть, то "убийство паразита".
movlw b'01111111' ; Выбор адреса 64-го столбца (3Fh).
movwf PortC ; Вывод команды выбора адреса столбца
; на линии DB7...DB0.
call STROB ; Строб ("запуск в работу").
movlw b'00000001' ;
movwf PortC ; .1 выводится в порт С.
call WRITE_D ; Записывается.
;-------------------------------------
; Переход на 2-й кристалл.
;-------------------------------------
bcf PortB,E1 ; Выключение 1-го кристалла.
bsf PortB,E2 ; Включение 2-го кристалла.
;================================================================================
; Вывод данных на индикацию в 7-ю страницу 2-го кристалла.
;================================================================================
.....................................
.....................................
;////////////////////////////////////////////////////////////////////////////////

VIHOD call PAUSE ; Задержка 0,3 сек.


;================================================================================
; Далее - "на колу мочало" ("закольцовка").
;================================================================================
goto SNOVA ; Переход на следующий цикл программы.
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

"Предмет внимания" выделен зеленым цветом.


Лучше всего, поместить этого "чистильщика" в конец процедуры вывода данных на
индикацию в 7-ю страницу 1-го кристалла.
Принцип работы такой.
Сначала дается ответ на вопрос: "Импульс дислоцируется только в 1-м кристалле или
в обеих"?
Если импульс "дислоцируется" только в 1-м кристалле, то и "убивать" нечего.
Если импульс "дислоцируется" в обеих кристаллах, значит нужно "брать в руки
топор/кувалду".
12
А именно, сначала выбирается адрес того столбца (64-го), в котором нужно
"прихлопнуть паразита", а затем он и "прихлопывается" путем записи, по верху, одного
байта линии единичного уровня.
И все дела. Нет его. "Моль съела".
Все это "проносится с таким реактивным свистом", что человеческий глаз не заметит
этой "расправы" даже в том случае, если этот "свист" будет и гораздо менее
"реактивным".
"Ваяние" картинки градуировки с шагом в 10 позиций.

В простейшем случае, можно "состряпать" две таблицы, но это "массивно".


Вопрос: "А можно ли обойтись одной"?
Ответ: можно и нужно. Это делается так.
Картинка градуировки выводится на индикацию в 1-м "кадре". В два этапа:

;################################################################################
; Вывод на индикацию картинки 1-го "кадра".
;################################################################################
;*************************************
; Переход на 2-й кристалл.
;*************************************
.....................................
.....................................
;--------------------------------------------------------------------------------
; Запись картинки градуировки в 6-ю страницу 2-го кристалла.
;--------------------------------------------------------------------------------
call ZAPIS_STR6 ; Переход в ПП ZAPIS_STR6.
.....................................
;*************************************
; Переход на 1-й кристалл.
;*************************************
.....................................
.....................................
;--------------------------------------------------------------------------------
; Запись картинки градуировки в 6-ю страницу 1-го кристалла.
;--------------------------------------------------------------------------------
call ZAPIS_STR6 ; Переход в ПП ZAPIS_STR6.
.....................................
;################################################################################

ПП ZAPIS_STR6 "лежит в обслуге":

;================================================================================
; ПП записи в 6-ю страницу (картинка градуировки с шагом в 10 позиций).
;================================================================================
ZAPIS_STR6 call STRANICA_6 ; Выбирается 1-й столбец
call STOLB_1 ; 6-й страницы.
movlw .64 ; Задание количества
movwf Temp ; проходов.
;------------------------------------------------------------------------
; Проверка указателя активного кристалла.
;------------------------------------------------------------------------
btfss Flag,7 ; Какой кристалл включен ?
goto $+.12 ; Если включен 1-й кристалл, то
; отрабатывается группа команд №1.
; если включен 2-й кристалл, то
; отрабатывается группа команд №2.
;------------------------------------------------------------------------
; Если установлен 2-й кристалл (группа команд №2).
;------------------------------------------------------------------------
movf Temp,W ;
sublw .68 ; .68 - Temp = ...

movwf Reg ; Аналогично.


call TEXT_3 ; Переход происходит
13
movwf PortC ; в ПП TEXT_3.
movlw high WRITE_D;
movwf PCLATH ;
call WRITE_D ;
decfsz Temp,F ;
goto $-9 ;
return ; Возврат по стеку в то место, откуда
; произошел вызов подпрограммы.
;------------------------------------------------------------------------
; Если установлен 1-й кристалл (группа команд №1).
;------------------------------------------------------------------------
movf Temp,W ;
sublw .64 ; .64 - Temp = ...

movwf Reg ; Аналогично.


call TEXT_3 ; Переход происходит
movwf PortC ; в ПП TEXT_3.
movlw high WRITE_D;
movwf PCLATH ;
call WRITE_D ;
decfsz Temp,F ;
goto $-9 ;
return ; Возврат по стеку в то место, откуда
; произошел вызов подпрограммы.
;================================================================================

Она адресуется к таблице вычисляемого перехода подпрограммы TEXT_3:

;--------------------------------------------------------------------------------
; Данные 6-й страницы 1-го кристалла (код картинки градуировки).
;--------------------------------------------------------------------------------
TEXT_3
.....................................

STR_3 Dt 0x3C,0x08,0x08,0x08,0x08,0x08,0x08,0x08
Dt 0x08,0x08,0x3C,0x08,0x08,0x08,0x08,0x08
Dt 0x08,0x08,0x08,0x08,0x3C,0x08,0x08,0x08
Dt 0x08,0x08,0x08,0x08,0x08,0x08,0x3C,0x08 ; Картинка
Dt 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08 ; градуировки
Dt 0x3C,0x08,0x08,0x08,0x08,0x08,0x08,0x08 ; (3Ch -
Dt 0x08,0x08,0x3C,0x08,0x08,0x08,0x08,0x08 ; вертикальные
Dt 0x08,0x08,0x08,0x08,0x3C,0x08,0x08,0x08 ; линии).
DT 0x08,0x08,0x08,0x08

Не трудно заметить то, что в этой таблице, вертикальные линии (3Ch) "разбросаны"
через каждые 10 позиций, и то, что в таблице не 64, а 68 байтов.
Это необходимо для обеспечения равномерности градуировки (в пределах дисплея).
То есть, в 6-ю страницу 1-го кристалла выводятся первые 64 байта (с 1-го по 64-й).
В 6-ю страницу 2-го кристалла тоже выводятся 64 байта, но только начиная не от
первого, а от 5-го (с 5-го по 68-й).
ПП ZAPIS_STR6 начинается с выбора 1-го столбца 6-й страницы, что вполне
естественно.
Далее, в регистре Temp, предустанавливается число проходов (.64).
Эта предустановка используется в обеих случаях.
Далее, в зависимости от того, какой именно кристалл включен (проверка бита №7
регистра Flag), имеет место быть два сценария:

1. Если активен 1-й кристалл, то картинка градуировки выводится в него, начиная


с 1-й позиции таблицы вычисляемого перехода, и до 64-й позиции включительно
(вычитание текущего значения регистра Temp из константы .64).
2. Если активен 2-й кристалл, то картинка градуировки выводится в него, начиная
с 5-й позиции таблицы вычисляемого перехода, и до 68-й позиции включительно
(вычитание текущего значения регистра Temp из константы .68).
14
Вот и вся премудрость.
Пытаться объединять два "клона" не стоит. Можно, но себе дороже выйдет.
Почему? Потому, что имеют место быть "закольцовки" с конца каждого "клона" на его
начало (см. goto $-9).

Ну и ладушки.
А вот теперь, имеет место быть "красота несусветная", а заодно и ущербное чувство
частично выполненного долга.
"Частично" потому, что имеют место быть угрызения совести, связанные с программной
оптимизацией процедур вывода данных на индикацию в 7-е страницы.
Значит, "пулемет в руки, и айн, цвай, драй …".

Уменьшение количества команд в процедуре вывода на индикацию картинки


эпюры.

Оптимизированная программа называется 12864_22.asm (прилагается).


"Мать" - программа 12864_21.asm.
В части касающейся вывода данных на индикацию в 7-е страницы, в "матери",
имеются два "клона", причем, "привязанные" к таблице вычисляемого перехода ПП
TEXT_4, которая представляет собой "сплошное недоразумение".
В том смысле, что почти вся она "забита" одними и теми же числами (01h).
А раз это так, то и церемониться с ней нечего: "убить" ПП TEXT_4, и все дела.
Выигрыш от этого - по всем направлениям.
Кстати, примерно такую же "комбинацию из двух пальцев" можно "провернуть" и со
шкалой/шкалами (можете потренироваться).
Что в замен?
А вот эта "красатулька":

;================================================================================
; Вывод данных на индикацию в 7-ю страницу 1-го кристалла.
;================================================================================
call STRANICA_7 ; Выбор 7-й страницы.
call STOLB_1 ; Выбор 1-го столбца страницы.
;--------------------------------------------------------------------------------
; Процедура вывода на индикацию массива байтов.
;--------------------------------------------------------------------------------
movf N_Zapoln1,W ; Копирование количества байтов заполнения
movwf Temp ; шкалы в регистр Temp
; (назначение числа проходов).
btfss Status,Z ; Результат операции =0 или не=0 ?
goto $+3 ; Если не=0, то формируется линия единичного
; уровня и спада.
call VIVOD_FF ; Если =0, то формируется только спад.
goto $+2 ;
call VIVOD_01_FF ;
;--------------------------------------------------------------------------------
; Анализ состояния флага (бит №0 регистра Flag) указателя кристалла.
;--------------------------------------------------------------------------------
.....................................
.....................................
;--------------------------------------------------------------------------------
; "Убийство" паразитного всплеска (FFh) путем записи, по верху "паразита",
; одного байта картинки единичного уровня (01h).
;--------------------------------------------------------------------------------
.....................................
.....................................
;-------------------------------------
; Переход на 2-й кристалл.
;-------------------------------------
.....................................
.....................................

15
;================================================================================
; Вывод данных на индикацию в 7-ю страницу 2-го кристалла.
;================================================================================
call STRANICA_7 ; Выбор 7-й страницы.
call STOLB_1 ; Выбор 1-го столбца страницы.
;--------------------------------------------------------------------------------
; Процедура вывода на индикацию массива байтов.
;--------------------------------------------------------------------------------
movf N_Zapoln2,W ;
movwf Temp ;
btfss Status,Z ; Аналогично (см. выше),
goto $+3 ; только для N_Zapoln2.
call VIVOD_FF ;
goto VIHOD ;
call VIVOD_01_FF ;
;////////////////////////////////////////////////////////////////////////////////
VIHOD call PAUSE ; Задержка 0,3 сек.
;================================================================================
; Далее - "на колу мочало" ("закольцовка").
;================================================================================
goto SNOVA ; Переход на следующий цикл программы.
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

То, о чем идет речь, выделено фиолетовым цветом.


А это - "обслуга":

;================================================================================
; Подпрограмма записи, в 7-ю страницу, картинок линии единичного уровня и спада.
;================================================================================
; Картинка линии единичного уровня.
;------------------------------------
VIVOD_01_FF movlw 1 ; W -> .1 (0000 0001)
movwf PortC ; .1 выводится в порт С.
call WRITE_D ; Записывается.
decfsz Temp,F ; Если результат не=0, то
goto $-4 ; выводится следующий байт (01h).
; Если =0, то программа исполняется далее.
;------------------------------------
; Картинка спада.
;------------------------------------
VIVOD_FF movlw b'11111111' ; W -> .255 (1111 1111)
movwf PortC ; .255 выводится в порт С.
call WRITE_D ; Записывается.
return ; Возврат по стеку в то место, откуда
; произошел вызов подпрограммы.
;================================================================================

Если содержимое регистра N_Zapoln1 или N_Zapoln2 отлично от нуля, то в 7-ю


страницу активного (текущего) кристалла, на индикацию, выводится линия единичного
уровня (количество ее столбцов/протяженность зависит от содержимого регистров
N_Zapoln1 или N_Zapoln2), заканчивающаяся одним-разъединственным спадом (переход
в ПП VIVOD_01_FF).
Если содержимое регистра N_Zapoln1 или N_Zapoln2 равно нулю, то в 7-ю страницу
активного (текущего) кристалла выводится на индикацию только байт спада (переход в
ПП VIVOD_FF).
Вот и все. Соответствующая таблица вычисляемого перехода "усопла". Нет ее.
Дебет-кредит: в программе 12864_21.asm, 1200 слов, а в программе 12864_22.asm,
1131 слово.
То есть, на 69 слов меньше.
При этом, визуальный результат работы - один и тот же.
Вопрос: "Можно ли еще что-нибудь обкарнать (в смысле уменьшения количества
команд)"?
Ответ: если поднапрячься, то можно. Но уже по мелочам.
16
В части же касающейся компромиссной оптимизации, оптимизировать картинку 1-го
"кадра" не целесообразно, так как она выводится на индикацию только один раз.
Можно компромиссно "заоптимизировать" картинки 5-х страниц (если есть желание), и
не более того.
В 6-х страницах оптимизировать нечего.
В 7-й - тоже, так как имеет место быть динамика.
Но в 7-й странице, можно "провернуть одно прелюбопытнейшее дельце", суть которого
наталкивает на мысли о том, что речь идет о разновидности компромиссной
оптимизации (те же обходы, связанные с ростом количества команд).
Суть: если картинка текущего импульса выводится на индикацию в оба кристалла (то
есть, импульс длинный), и "до того", было тоже самое, то зачем "дебильно"
подтверждать (бестолковая трата времени) неизменную картинку той части импульса,
которая ранее выведена на индикацию в 1-й кристалл?
Обойти ее, и все дела.
А оперативная память графического модуля "позаботится и о красоте, и о ляпоте".
В части касающейся вывода на индикацию картинки импульса, спад которого находится
в 7-й странице 2-го кристалла, это равносильно достаточно приличному выигрышу по
скорости отработки полного цикла.
Ну как тут пройти мимо этого "счастья"? Пройдешь, а потом ведь совесть "загрызет"…
Поэтому, я посчитал своим гражданским долгом, по ходу дела, "пнуть" эту проблему
(типа "разлеглась тут, как у себя дома"…).
Вот так и "родилась" программа 12864_23.asm ("мать" - 12864_22.asm). Прилагается.

;********************************************************************************
; 12864_23.asm Переход от шкального индикатора к эпюре (отображение чисел в
; форме импульса). Оптимизированный вариант №2.
;********************************************************************************
.....................................
.....................................
;----------------------------------------------
; Объем программы: 1148 слов в памяти программ.
;================================================================================
.....................................
.....................................
;================================================================================
; Регистры общего назачения.
;================================================================================
.....................................
.....................................
Bufer equ 29h ; Регистр оперативной памяти результата
; предыдущего цикла.
.....................................
.....................................
;================================================================================
org 0 ; Начать выполнение программы с 0 адреса PC.
goto START ; Переход в ПП START.
;********************************************************************************

;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
.....................................
.....................................
.....................................
.....................................
;================================================================================

;********************************************************************************
; НАЧАЛО ПРОГРАММЫ.
;********************************************************************************
; Подготовительные операции.
;================================================================================
START
.....................................
17
.....................................
clrf Bufer ; Подготовка к работе регистра оперативной
; памяти результата предыдущего цикла.
;================================================================================
.....................................
.....................................
.....................................
.....................................

;////////////////////////////////////////////////////////////////////////////////
; РАБОТА С ЭПЮРОЙ.
;////////////////////////////////////////////////////////////////////////////////
; Анализ содержимого регистра оперативной памяти результата
; предыдущего цикла (Bufer).
;--------------------------------------------------------------------------------
movf Bufer,W ;
sublw .64 ; .64 - Bufer = ...

btfsc Status,C ; Результат "+" или "-" ?


goto ANALIZ ; Если "+", то процедура вывода данных в 7-ю
; страницу 1-го кристалла не обходится.
; Если "-", то переход к следующему анализу.
;--------------------------------------------------------------------------------
; Анализ содержимого текущего результата замера/подсчета (N_Zapoln1).
;--------------------------------------------------------------------------------
movf N_Zapoln1,W ;
sublw .64 ; .64 - N_Zapoln1 = ...

btfsc Status,C ; Результат "+" или "-" ?


goto ANALIZ ; Если "+", то процедура вывода данных в 7-ю
; страницу 1-го кристалла не обходится.
; Если "-", то программа исполняется далее.
;--------------------------------------------------------------------------------
; Подготовка данных для работы в 7-й странице 2-го кристалла.
; Исполняется, если содержимое и Bufer, и N_Zapoln1 больше .64.
;--------------------------------------------------------------------------------
movlw .64 ; Если "-", то
subwf N_Zapoln1,W ; 1. N_Zapoln1 - .64 = ... (результат -> W).
movwf N_Zapoln2 ; 2. Разница записывается
; в регистр N_Zapoln2.
goto KRISTALL_2 ; 3. Процедура вывода данных, в 7-ю страницу
; 1-го кристалла, обходится. Переход на вывод
; данных в 7-ю страницу 2-го кристалла.
;================================================================================
; Будем работать только в 1-м кристалле или в обеих? Анализ, "оргвыводы".
;================================================================================
ANALIZ movf N_Zapoln1,W ; N_Zapoln1 -> Bufer.
movwf Bufer ;

movlw .64 ;
subwf N_Zapoln1,W ; N_Zapoln1 - .64 = ... (результат -> W).
btfss Status,C ; Результат "+" или "-" ?
goto $+5 ; Если "-" (C=0 -> число - до .63
; включительно), то работаем только
; в 1-м кристалле.
movwf N_Zapoln2 ; Если "+" или =0 (C=1 -> число от .64 и
; более), то
; 1. W (разница) -> N_Zapoln2 (подготовка
; данных для той части шкалы, которая "лежит"
; во 2-м кристалле.
bsf Flag,0 ; 2. Установка флага указателя кристалла
; (разрешение работы во 2-м кристалле).
movlw .63 ; 3. Подготовка к "сплошному" заполнению
movwf N_Zapoln1 ; шкалы в части касающейся 1-го кристалла.
;================================================================================
; Вывод данных на индикацию в 7-ю страницу 1-го кристалла.
18
;================================================================================
.....................................
.....................................
.....................................
.....................................
;-------------------------------------
; Переход на 2-й кристалл.
;-------------------------------------
KRISTALL_2 bcf PortB,E1 ; Выключение 1-го кристалла.
bsf PortB,E2 ; Включение 2-го кристалла.
;================================================================================
; Вывод данных на индикацию в 7-ю страницу 2-го кристалла.
;================================================================================
movf N_Zapoln1,W ; N_Zapoln -> Bufer.
movwf Bufer
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
;********************************************************************************
end ; Конец программы.

Красным цветом выделены "нововведения".

Итак, на первом "влете" в группу команд работы с эпюрой, нужно обеспечить


"материнский" алгоритм отработки программы.
А как же иначе? Ведь на 1-м "витке", для начала, нужно запомнить то, от чего
"плясать" дальше.
Под это дело, "прописан" регистр Bufer, в который и записывается числовой результат
"замера", имевший место быть на предыдущем "витке" полного цикла программы.
С целью обеспечения этого:

- в ПП START, содержимое регистра Bufer проще всего сбросить в 0


(но можно выставить и любое число до .64-х).
- необходимо организовать копирование содержимого регистра N_Zapoln1 в регистр
Bufer, причем, 2 раза, так как речь идет об обходах/"необходах".

Короче, в любом случае, это копирование нужно обеспечить. Поэтому и 2 раза.


Обход процедуры вывода на индикацию данных, в 7-ю страницу 1-го кристалла,
должен происходить только при соблюдении двуединого условия:

- содержимое регистра Bufer более .64-х,


- содержимое регистра N_Zapoln1 более .64-х.

То есть, в том случае, если результат текущего "замера" количества попугаев, и


результат предыдущего "замера" количества попугаев, есть число в диапазоне от .65
до .99.
Если это имеет место быть, то за счет обхода "всего того, что шевелится" в 1-м
кристалле, в нем "заторчит" (за счет оперативной памяти графического модуля)
картинка предыдущего цикла, а в текущем цикле, данные будут выводиться на
индикацию только в 7-ю страницу 2-го кристалла, что и требуется.
Сие означает выигрыш по скорости (в части касающейся вывода на индикацию
"длинных" импульсов), при сохранении неизменной функциональности.
Для обеспечения этого "счастья" нужны 17 дополнительных команд (выделены
красным цветом).
В итоге, получилась программа, с "зачатками интеллектуальности", которая, в части
касающейся сказанного, "зорко следит" за избыточностью ("бестолковкой"), и в случае
ее наличия, автоматически ее устраняет (простая, саморегулирующаяся система).

19
Примечание: в программе 12864_21.asm, "упор делался" на "командную" оптимизацию,
а в программе 12864_22.asm, "упор делался" на "скоростную" оптимизацию.
В конечном итоге, программа 12864_22.asm представляет собой некий "гибрид" первого
со вторым.
По-моему, получилось вполне сносно (по сравнению с тем, с чего начато).
А можно и лучше.
Прогресс, это такая "штуковина", которая вообще не имеет "границ".
Надеюсь на то, что Вы внесете в это благое дело свою лепту.

А теперь по поводу сказанного.


Если речь идет о выводе на индикацию эпюры, значит, так или иначе, речь идет о
цифровом осциллографе (или о чем-то подобном).
В том числе и многоканальном. В том числе и с памятью. И вообще, дух захватывает
от открывающихся перспектив.
И это совсем не слабо. И очень идейно (в смысле "рождения" всяческих идей).
В этом разделе, я попытался показать Вам часть этого уважаемого процесса, причем,
"в масштабе реального времени".
Не знаю, как получилось. Судить Вам.
И хотя, по большому счету, "затронута только верхушка айсберга", но это уже совсем
не "ноль", а нечто такое, от чего вполне можно "плясать"/"оттолкнуться".
Заверяю Вас, что подобного рода информация "под каждым кустом не валяется".
Точнее, она "не валяется вообще".
Класс информации не тот, чтобы "валяться".
Спасибо всем, кто принял участие в этой совсем не легкой работе.
В случае возникновения необходимости, эта "мощнейшая" тема будет продолжена.

"Практикум по конструированию устройств на PIC контроллерах"      http://ikarab.narod.ru       E-mail: karabea@lipetsk.ru

20

Оценить