Академический Документы
Профессиональный Документы
Культура Документы
TEXT_17 С Л У Ш А Ю С Ь и
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (3-й блок памяти программ / PCLATH=.2).
TEXT_35 Н а г р у з к а
;-----------------------------------
; Надпись " СЛУШАЮСЬ и "
;-----------------------------------
TEXT_17 addwf PC,F ; -----"-----
dt 0x20,0x20,0x20,0x43,0xA7,0xA9,0xAC,0x41
dt 0xB0,0x43,0x62,0x20,0xB8,0x20,0x20,0x20
;-----------------------------------
; Надпись " Нагрузка "
;-----------------------------------
TEXT_35 addwf PC,F ; -----"-----
;;; dt 0x20,0x20,0x20,
dt 0x20,0x48,0x61,0xB4,0x70
dt 0x79,0xB7,0xBA,0x61,0x20
;;; dt ,0x20,0x20,0x20
3
"Обходные" команды retlw 20h (символы "пусто") таблицы В просто блокируются
точками с запятыми (выделено серым цветом) по той простой причине, что эти же
символы присутствуют в таблице А, которая была выведена на индикацию ранее.
Я произвел смещение содержимого таблицы таким образом, чтобы обеспечить
удобную, адресную "ориентацию".
Естественно, что на стадии дальнейшего "наведения порядка", заблокированное можно
убрать, а оставшееся скомпановать так, как Вам удобно.
Итак, 6 команд retlw … "отправились к праотцам" (это и есть "локальный", командный
выигрыш. "Меньше народа, больше кислорода").
Теперь, под это дело, нужно скорректировать ту часть ПП вычисляемого перехода,
которая "лежит в матке".
Дележка опытом: лично я, чтобы "не рыскать по всему тексту программы в поисках
рулевого", просто блокирую таблицу (в данном случае, ставится точка с запятой перед
TEXT_35) и после этого произвожу ассемблирование.
Затем, щелчок по сообщению (или сообщениям, если таблица вызывается несколько
раз) об ошибке, и комфортный "выход в сектор обстрела".
После этого, "делаются нужные дела", после чего блокировка снимается.
Особенно это актуально тогда, когда текст программы представляет собой "длиннющую
портянку" (экономится масса времени).
В данном случае, "подрихтованный рулевой" выглядит так:
;================================================================================
; Вывод на индикацию, в 1-ю строку, фиксированной надписи " Нагрузка ".
;================================================================================
movlw b'10000011' ; (было 0000) Установка курсора в 4-е
call ENTER_BF ; знакоместо 1-й строки.
movlw .10 ; (было .16)
movwf Count ;
movf Count,W ;
sublw .10 ; (было .16)
call TEXT_35 ; Аналогично, только
bsf PortC,RS ; для TEXT_35.
call ENTER_BF ;
decfsz Count,F ;
goto $-6 ;
return ; Возврат по стеку.
;================================================================================
4
Окидываю, сами знаете каким взором, поле битвы.
Да уж … 45 штук ПП вычисляемых переходов это совсем не шутки.
С дуру, по недомыслию или в результате "кавалерийского наскока", запутаться можно
элементарно (проще пареной репы).
Тем не менее, если Вы думаете, что для решения подобного рода задачи нужна
какая-то выдающаяся извилина, то жесточайше ошибаетесь.
Всего-навсего нужна тренированная склонность к упорядочению "черепномозговой
деятельности".
Ну и знание программы/"железяки" тоже. Это само собой.
Сейчас докажу.
Что нужно делать, если "масса" предстоящей работы ужасает/опечаливает?
Правильно. "Разделять и властвовать".
Настоящие "интеллектуальные удавы" именно так и поступают (и правильно делают).
Изначально, имеется такой "расклад":
5
TEXT_45 в н а с т р о й к а х
6
Примечание: в графических модулях, результатом инициализации являются "черное
поле" (все наоборот).
Вывод: надписи Термодатчик и ПОДКЛЮЧЕН / ОТКЛЮЧЕН (они выводятся на
индикацию сразу же после инициализации ЖК-модуля) вполне можно "заоптимизировать
на предмет обхода символов "пусто".
В части касающейся этих надписей, получился такой фрагмент карты обходов:
7
Вот Вам и еще выигрыш в 5 команд, но не на 1-й странице памяти программ, а на 2-й.
8
А то ведь, если чувство меры отказало, можно так сместить содержимое блоков
верхней "обслуги", что "стадА из загонов разбегутся" (в этом случае, "пастуха" нужно
направлять на "курсы повышения квалификации").
Можно выбрать не одну, а несколько "жертв", но при условии, что их суммарная
"упитанность" не будет ниже 15-ти команд.
Если речь идет о достаточно "мощненькой" программе, то обычно, с таким выбором
проблем нет (есть из чего выбрать).
Если не находится подходящего варианта в нижней "обслуге" 1-й страницы памяти
программ, то в крайнем случае, нужно поискать "жертву" в нижней "обслуге" 2-й
страницы.
После того, как "жертва" будет найдена и участь ее предрешена, соответствующая
группа NOPов "убивается", и она ("жертва") перемещается на ее место ("прислоняется
к другой стенке").
В данном случае, если перенос происходит из нижней "обслуги" 1-й страницы, то
никаких дополнительных "телодвижений" делать не нужно: ПП просто "вырезается" из
нижней "обслуги" и "врезается" в соответствующее место верхней "обслуги".
Если перенос происходит из нижней "обслуги" 2-й страницы, то нужно озаботиться
PCLATH-делами.
После "отработки стыка" между 1-м и 2-м блоками 1-й страницы памяти программ,
орлиный взор устремляется на группу NOPов, расположенную на "стыке" 2-го и 3-го
блоков 1-й страницы памяти программ.
Повторяется то же самое.
В данном случае, этого достаточно.
В итоге, все "технологические" NOPы "отправляются к праотцам", а объем программы
уменьшается на то количество команд, которое "убито" в процессе командной
оптимизации.
Примечание: в нижних "обслугах" обеих страниц памяти программ нет ни одной
таблицы (сделано не просто так, а специально). Любую ПП, входящую в состав этих
"обслуг", в пределах страницы, на которой они "лежат", без "заморочек с PCLATH-
делами", можно "засунуть" в различные "места" (естественно, не абы как, а по-умному).
Ниже, я не буду, после каждого "чиха", акцентировать Ваше внимание на только что
сказанном, но общий принцип, сформулированный выше (и связанная с ним
"технология"), по причине своей исключительной важности, никогда не должен
"выпадать из поля Вашего зрения".
В противном случае, будет "Гитлер капут, отягощенный шизофренией".
Сурово, но факт. Мы тут не в бирюльки играем. Дружески предупреждаю.
Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (2-й блок памяти программ / PCLATH=.1).
TEXT_9 В ы х о р о ш о
TEXT_10 п о д у м а л и ?
TEXT_11 О Т К Л . | з а щ и т ы
TEXT_12 к н о п к а " - / Н е т " .
TEXT_14 В К Л . | з а щ и т ы
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (1-й блок памяти программ / PCLATH=.0).
TEXT_8 к н о п к а " + / Д а " .
9
Из тех надписей, которые выводились в 1-ю строку дисплея "до того", нужно
ориентироваться на самую "массивную".
То есть, "матерью" для надписи Вы хорошо, будет надпись но ЗАБЛОКИРОВАН
Вот Вам и причина наличия всего одного обхода в надписи Вы хорошо.
Далее, надпись Вы хорошо становится "матерью" для надписи ОТКЛ. | защиты , и
далее, надпись ОТКЛ. | защиты становится "матерью" для надписи ВКЛ. | защиты .
Это и объясняет то, что в данном случае, обходы именно такие, а не какие-то другие.
Всего 5 "убитых" команд.
Маловато будет. "Душа вожделеет бОльшего счастья".
"Проворачиваю комбинацию из двух пальцев": ОТКЛ меняю на ВЫКЛ и смещаю
надпись | защиты (в ПП TEXT_14) на одно знакоместо вправо:
Как видите, в 1-й строке, изменился только порядок вывода надписей на индикацию, а
количество "обойдённых" знакомест осталось прежним (15 штук), но в дальнейшем, при
работе во 2-й строке, такая перестановка даст положительный, "обходной" эффект.
Соответственно, в программе, переставлены местами процедуры вывода на индикацию
надписей ВЫКЛ. | защиты / кнопка "-/Нет". и ВКЛ. | защиты / кнопка "+/Да".
(ничего сложного).
Перехожу "на обстрел" 2-й строки:
В начале сценария-подсказки, в нее выводится надпись подумали?
До нее, во 2-ю строку может быть выведена надпись в настройках (если термодатчик
заблокирован) или надпись ПОВИНУЮСЬ! (при переходе из режима включенной
защиты, в режим выключенной защиты).
Значит, нужно ориентироваться на худший вариант, то есть, на надпись в настройках.
В ней, еще со времён инициализации ЖК-модуля, справа и слева "торчит" по 2
символа "пусто":
2-я строка дисплея (1100 хххх)
Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
ВЕРХНЯЯ "ОБСЛУГА" 2-й СТРАНИЦЫ (2-й блок памяти программ / PCLATH=.9).
TEXT_45 в н а с т р о й к а х
10
Далее следует учесть то, что тот сценарий-подсказка, о котором идет речь, работает
по кольцу.
То есть, с учетом произведенной выше перестановки, надпись подумали? будет
выводиться на индикацию после надписи кнопка "-/Нет".
Получается такой фрагмент карты обходов (надписи следуют в "новом" порядке их
вывода на индикацию):
2-я строка дисплея (1100 хххх)
Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (2-й блок памяти программ / PCLATH=.1).
TEXT_10 п о д у м а л и ?
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (1-й блок памяти программ / PCLATH=.0).
TEXT_8 к н о п к а " + / Д а " .
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (2-й блок памяти программ / PCLATH=.1).
TEXT_12 к н о п к а " - / Н е т " .
11
Жалко … Но что поделаешь? Такова жизнь-злодейка (в данном случае. Не всё коту
масленница).
"Не солоно хлебавши", перехожу во 2-ю строку.
Последнее знакоместо надписи Uвольт и Iампер обходить нельзя, так как перед ней,
возможно наличие надписи U= , в I= , а, которая занимает всю строку.
В соответствии с обозначенным выше "стандартом", оба символа "точка" заменены на
символы "пусто" (выигрыш в 2 обхода), и ОТКЛ заменено на ВЫКЛ (для обеспечения
единообразия с "вышележащим").
Надпись из режима ориентирована на наихудший "расклад" (отрабатывается 4-й пункт
меню. То есть, на надпись ВКЛ ВЫКЛ).
Худо-бедно, а еще 9 обходов "по сусекам нашкрябал".
Итак, надписи пунктов меню установки порогов отработаны.
Убираю.
В этом случае, в надписи Тн= гр Тв= гр, можно обойти последнее знакоместо.
"С паршивой овцы, хоть шерсти клок".
Надпись СЛУШАЮСЬ и нужно вывести на индикацию в полном объеме, так как эта
надпись может быть "вызвана" в любой момент.
В том числе и во время отработки надписи, занимающей всю строку.
Ну а с надписью нагрузка должно быть все понятно, так как она "высвечивается"
только после надписи СЛУШАЮСЬ и .
Вот Вам и еще 6 "обойденных" знакомест.
Перехожу во 2-ю строку.
Надпись ПОВИНУЮСЬ! нужно вывести на индикацию в полном объеме, так как эта
надпись может быть "вызвана" в любой момент.
В том числе и во время отработки надписи, занимающей всю строку.
Короче, такая же "петрушка", что и с надписью СЛУШАЮСЬ и .
13
Так оно, на мой взгляд, более симпатично смотрится (первые буквы надписей
Нагрузка и ВЫКЛЮЧЕНА / ВКЛЮЧЕНА находятся "на одной вертикальной линии").
Вот Вам и еще 12 "обойденных" знакомест.
Следующая "мелочь".
Надпись ЗАЩИТА ВЫКЛ. t = всегда выводится после надписи СЛУШАЮСЬ и
(последнее выводится в полном объеме).
Получается так:
1-я строка дисплея (1000 хххх)
Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (2-й блок памяти программ / PCLATH=.1).
TEXT_17 С Л У Ш А Ю С Ь и
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (3-й блок памяти программ / PCLATH=.2).
TEXT_1_1 З А Щ И Т А В Ы К Л . t =
Следующая "мелочь".
Надпись СЛЕЖЕНИЯ всегда выводится после надписи ПОВИНУЮСЬ! (последнее
выводится в полном объеме).
Получается так:
2-я строка дисплея (1100 хххх)
14
Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 111
1
TEXT_18 П О В И Н У Ю С Ь !
TEXT_16 С Л Е Ж Е Н И Я
Теперь все это "добро собирается до одной кучи" и составляется карта обходов:
Карта обходов
1-я страница памяти программ
Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (1-й блок памяти программ / PCLATH=.0).
TEXT_1 З А Щ И Т А В Ы К Л Ю Ч Е Н А
TEXT_2 U = в I = а
TEXT_3 П р е в ы ш е н и е U п / I п
TEXT_4 Р Е Ж И М С Л Е Ж Е Н И Я
TEXT_5 П А Р А М Е Т Р Ы З А Щ И Т Ы
TEXT_6 З а д а н и е п о р о г о в
TEXT_7 В к л | н а г р у з к и
TEXT_8 к н о п к а " + / Д а "
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (2-й блок памяти программ / PCLATH=.1).
TEXT_9 В ы х о р о ш о
TEXT_10 п о д у м а л и ?
TEXT_11 В Ы К Л . | з а щ и т ы
TEXT_12 к н о п к а " - / Н е т "
TEXT_14 В К Л . | з а щ и т ы
TEXT_15 П е р е х о ж у в р е ж и м
TEXT_16 С Л Е Ж Е Н И Я
TEXT_17 С Л У Ш А Ю С Ь и
TEXT_18 П О В И Н У Ю С Ь !
TEXT_19 Т е р м о д а т ч и к
TEXT_20 П О Д К Л Ю Ч Е Н
TEXT_21 О Т К Л Ю Ч Е Н
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (3-й блок памяти программ / PCLATH=.2).
TEXT_30 U в о л ь т и I а м п е р
TEXT_31 т е р м о з а щ и т ы
TEXT_32 Т н = г р Т в = г р
TEXT_1_1 З А Щ И Т А В Ы К Л . t =
TEXT_35 Н а г р у з к а
TEXT_36 В Ы К Л Ю Ч Е Н А
TEXT_37 В К Л Ю Ч Е Н А
TEXT_42 П р е в ы ш е н К З п о р о г
15
Далее, в соответствии с "вышележащей", немудреной методикой, эти самые обходы и
осуществляются.
Программа, в которой это реализовано, называется BP_15.asm (прилагается).
По сравнению с предыдущей программой BP_14.asm, в программе BP_15.asm, меньшее
количество команд, а "масса ефрейторского суперзазорища" возросла, с 12 ячеек PC,
до 83-х, что внушает огромный оптимизм (в части касающейся "детородных функций
матки").
Визуально, в работе "железяки" практически ничего не изменилось.
Естественно, что скорость отработки "заоптимизированных" циклов увеличилась, но это
не сильно ощущается, так основная "масса" этих циклов определяется теми
задержками, которые "не тронуты".
Если в этом есть необходимость, то время отработки этих циклов можно
подкорректировать.
Может быть и подкорректитую. Позднее. Если захочется.
Короче, как в песне поется, "а помирать нам рановато, есть еще у нас дома дела".
org 801h заменил на org 800h. Зачем добру пропадать?
То, что Вы только что прочитали, а также и итог всей текущей работы, есть типичный
пример "симбиоза чистого ассемблера и биокомпьютера".
Попробуйте сделать то же самое с упованием на какой-нибудь язык высокого уровня и
всяческие "бесплатные Виндосыры", и Вы проклянете все на свете.
Особенно тогда, когда речь идет об оптимизации.
Может быть даже и получится, но трудозатраты будут такими высокими, что в
конечном итоге, это "вождение носом по батарее" неумолимо приведет к осознанию
необходимости такого "симбиоза".
Естественно, что это утверждение справедливо только тогда, когда речь идет не о
халтуре.
А если речь идет о ней, то и Запорожец сойдет.
Тарахтит, дымит, воняет, вибрирует, бензин/масло безмерно кушает, но ведь едет!
В "стародавние времена", у меня был Запорожец.
"Ушастый" (высший, экстремальный пилотаж!).
Польстился (умишко-то был совсем плохой). Купил за "рубль" (вот где "корень зла"!).
И он, с учетом моих сверхтитанических усилий, даже ездил (иногда).
Сколько он из меня "крови попил"…
"То понос, то золотуха", то вообще черт знает что (идентификации не поддается).
Я из-под него не вылезал.
И даже руки не отмывались. И сны снились какие-то чуднЫе.
А сколько бензина/масла "сожрал"…
Когда я от него избавился и купил потрепанный "Жигуль" (тоже не подарок, но гораздо
лучше), это был истинный праздник души.
А вообще-то, по большому счету, я ему благодарен, так как он реально помог понять,
как именно "закаляется сталь".
"Сказка - ложь, но в ней намек. Добрым мОлодцам урок".
Примечание: в данном случае, никакой сказки и никакой лжи нет.
Выводы делайте сами.
16
"Практикум по конструированию устройств на PIC контроллерах" http://ikarab.narod.ru E-mail: karabea@lipetsk.ru
17