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

2-2/16.

Организация, в режиме выключенной защиты, автоматической защиты от


короткого замыкания, значение порога которого (КЗ-порог) задает пользователь.
Организация подрежима установки пользователем значения КЗ-порога, с
сохранением его изменений в EEPROM-памяти данных. Принцип переноса
подпрограмм и групп команд с 1-й страницы памяти программ ПИКа на 2-ю, с
целью упреждающего недопущения "Гитлер капута" (к вопросу о необходимости
"уважения ефрейторского суперзазорища").

Сначала, работа над ошибками.


1. В предыдущей принципиальной схеме, допущена "оргнеувязка": два конденсатора с
одинаковым названием (С4).
Ошибка типа "невнимательность".
Тот конденсатор, который включен между затвором транзистора и корпусом,
переименован из С4 в С5.
Теперь, принципиальная схема выглядит так:

2. Ранее предполагалось, что числовые значения порогов U/I, которые нужно вывести
на индикацию, вычислялись по формуле:
X = (Y x 4) + 4
Например, 100 = (24 x 4) + 4.
Этот пример взят из концовки "шапки" программы, и он объясняет, откуда взялись
числа 18h (.24 = 18h):
.......................
org 2100h ; Начальные установки:
DE 00h,18h,18h ; режим "ЗАЩИТА ВЫКЛЮЧЕНА", Porog_U=10,0в,
; Porog_I=1,00а,
.......................

Соответственно, под это дело, в ПП PARAM_Z, было организовано два суммирования:


.......................
movlw 4 ; Корректирующая
addwf Temp_UL,F ; поправка.
.......................
movlw 4 ; Корректирующая
addwf Temp_IL,F ; поправка.
.......................
1
Но ведь 100 = (24 x 4) + 4 = 25 х 4
Что получается?
Никакой программной ошибки нет.
Есть банальный "перемудреж" "весом" в 4 "дебильных" команды (корректирующие
поправки).
Прямо как "детская неожиданность".
Но ничего… Беда не велика.
Эта "обкаканная попка" (напоминаю, что речь идет о "новорожденном") "подтирается
легким движением руки" (проза жизни. Главное - "унюхать"):
.......................
org 2100h ; Начальные установки:
DE 00h,19h,19h ; режим "ЗАЩИТА ВЫКЛЮЧЕНА", Porog_U=10,0в,
; Porog_I=1,00а,
.......................
А 4 команды двух "дебильных" коррекций "отправляются к праотцам".
По этому поводу я особо не печалюсь, так как все "карапузы" имеют свойство "не
сдерживать отправление своих естественных нужд".
Терпение и еще раз терпение.
Когда подрастет, то "цивилизованно будет ходить на горшок". Просто нужно вразумить.

3. А это из той же "оперы", с названием "невнимательность".


Проглядел "бяку", связанную с возвратом, из режима установки порогов, в режим
включенной защиты.
Ее смысл: если происходит работа в режиме включенной защиты и нагрузка включена,
то после перехода в режим установки порогов (любых) и возврата из него, пуск
произвести затруднительно.
Так как процедура работы с кнопкой "+/Да" будет обходиться.
В этом случае, пуск произвести можно, но для этого нужно сначала "жать" кнопку
"-/Нет", а потом, кнопку "+/Да".
Это ровным счетом то, о чем упоминалось в предыдущем подразделе, но только по
отношению к другой процедуре.
Устраняется этот "конфуз" легко и просто:
.......................
;PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
; ПП УСТАНОВКИ ПОРОГОВ (порогов U/I, Т-порогов, КЗ-порога). PPPPPPPPPPPPPPPPPPPPP
;PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
VIBOR_P bcf PortA,2 ; ТРАНЗИСТОР ЗАКРЫВАЕТСЯ.
bcf IntCon,7 ; ЗАПРЕТ ПРЕРЫВАНИЙ.
clrf Temp_1 ; Указатель U/I порогов, по умолчанию,
; устанавливается на пороге U.
bsf Temp_3,0 ; Указатель Т-порогов, по умолчанию,
; устанавливается на нижнем Т-пороге.
;--------------------------------------------------------------------------------
; Обеспечение "штатных" условий отработки сценария "ЗАЩИТА ВКЛЮЧЕНА", в случае
; дальнейшего перехода из сценария "ВЫБОР ПОРОГОВ" в сценарий "ЗАЩИТА ВКЛЮЧЕНА".
;--------------------------------------------------------------------------------
bcf Flag_1,5 ; Перевод флага ручного отключения нагрузки
; в состояние "нагрузка выключена".
;================================================================================
; Продолжение опроса кнопки "Установка порогов"
; (ее опрос происходит в другой ПП).
;================================================================================
.......................

"Врезка" выделена красным цветом.


Это одна-разъединственная команда, обеспечивающая "убийство" обхода кнопки "+/Да"
в случае возврата из любого подрежима установки порогов.
"Из любого" потому, что тот "кусок" программы, в который осуществлена "врезка",
исполняется при "влете" в любой из подрежимов установки порогов (общая часть).

Далее возникает вопрос: "А дальше-то как развиваться"?


2
Ответ: есть идейка на счет организации защиты от короткого замыкания в режиме
выключенной защиты, ведь там "шаром покати" (в смысле защиты по току).
Есть только термозащита, инерционность которой оставляет желать лучшего ("утюг
нагревается не за одну микросекунду").
Значит так тому и быть.
Такого рода защиту обеспечить вполне можно, так как имеют место быть уходы в
прерывания.
В связи с этим, в первую очередь, возникает техническая проблема обеспечения
малой инерционности срабатывания защиты от короткого замыкания, обусловленная
тем, что по сравнению с общим временем отработки цикла сценария выключенной
защиты, интервал времени отработки того его "куска", который находится в "зоне"
разрешения прерываний, мал ("офигеннейшие провалы" в защите).
Значит, нужно сделать так, чтобы бОльшая часть цикла отработки сценария
выключенной защиты находилась в "зонах" разрешений прерываний (их может быть
несколько).
"Пошевелив извилиной" и вспомнив об исключительно полезном принципе "разделяй и
властвуй", я пришел к выводу, что на эту проблему целесообразно "упасть" в
следующем подразделе.
После того, как будет сформирован "КЗ-скелет".
Значит, в этом подразделе, нужно сформировать этот самый "КЗ-скелет".
Вот Вам и текущая задача.
По своей сути, КЗ-порог (так короче) есть тот же самый порог защиты по току, но
только в приложении к сценарию выключенной защиты.
Таким образом, после осуществления этого нововведения, название "режим
выключенной защиты" будет условным.
В том смысле, что не смотря на такое название, режим выключенной защиты будет
"укомплектован" защитой по превышению КЗ-порога и защитой по превышению
термопорога, работающими в комплексе.
Можно было бы как-то изменить название режима, но я, по причине того, что "коней
на переправе не меняют", этого, пока, делать не стал. А там посмотрим…
По-первости, была мысль о работе с одним, фиксированным КЗ-порогом, который
задается программно, но как-то это скучновато и не интересно.
Душа, как мустанг, рвется в прерии. Так что не обессудьте.
Охота пуще неволи (надеюсь на понимание).
Мелочиться не буду.
Первичное задание на разработку.
КЗ-порог, так же, как и остальные пороги, должен выбирать пользователь.
Задаю диапазон изменений значений КЗ-порога: от 1,0 до 9,9 ампера (с
возможностью программного "сдвигания нижней границы" как вправо, так и влево).
Задаю "шаг" изменения: 0,1 ампера.
Сотые доли, в "КЗ-делах, смотрятся как архитектурное излишество".
"За глаза хватит" и десятых долей.
Из этого следует то, что нужно "сваять" третий подрежим установки порогов
пользователем: подрежим установки КЗ-порога.
А раз это так, то с целью "комфортизации пользования железякой", нужно сохранить,
в EEPROM-памяти данных ПИКа, то значение КЗ-порога, которое выбрал
пользователь.
Что получается?
Получается уже не 2, а 3 подрежима установки порогов:
- пороги U/I,
- термопороги,
- КЗ-порог.
К глубочайшему сожалению, по состоянию на данный момент, получается также и то,
что "закольцовки" этих сценариев (с конца последнего, на начало первого) нет (и не
было).
Это очень неудобно. Безобразие. Каюсь.
Текущий, бичующий голос внутреннего цензора: "Из твоего покаяния каши не сваришь
и ни к какой стенке, по причине аморфности, его не прислонишь. Ты лучше
подсуетись. Толку больше будет".
3
Правда (любая) есть правда.
Вину искуплю "стаканом жертвенной крови" (добровольно ухожу в "штрафбат").
Речь пойдет о принципе организации многоуровневого ("многопунктного") меню, в
условиях ограниченного количества знакомест дисплея (2 строки по 16 знакомест).
Естественно, что в таких условиях, при наличии достаточно большого количества
подрежимов, которые могут быть выбраны, "за один присест, не развернешься".
Значит, нужно "развернуться за несколько присестов".
То есть, на стадии выбора того или иного подрежима, речь идет о последовательном
выводе на индикацию соответствующих пояснительных надписей (опций), который
(вывод) происходит по кольцу.
Например, №1,№2,№3,№4,№1,№2,№3,№4,№1, …
Приводя этот пример, я сразу "привязался" к конкретному предмету дальнейшего
разговора.
То есть, организовано 4 пункта меню выбора порогов, которые представляют собой,
последовательно сменяющиеся (примерно, через каждую секунду), пояснительные
надписи (пункты меню), указывающие на то, что произойдет, если отжать кнопку
"Установка порогов" в интервале времени "высвечивания" текущей надписи.
После 4-й надписи следует 1-я, и все повторяется по-новой. И т.д. ("закольцовка")
Пока не надоест жать на кнопку "Установка порогов".
Вопрос: "С тремя пунктами меню понятно: переходы в ПП установки порогов U/I,
Т-порогов и КЗ-порога, а 4-й пункт к какой стенке прислонить"?
Ответ: этот пункт не связан с переходом в ту или иную ПП установки порогов. Он
связан с выходом из сценария выбора порогов.
То есть, если отжать кнопку "Установка порогов" во время "высвечивания" этой
надписи, то произойдет возврат в тот основной режим, из которого была вызвана
процедура выбора порогов.
Это позволяет устранить лишние "телодвижения" в том случае, если кнопка "Установка
порогов" нажата по ошибке.
Примечание: ничто не мешает увеличить количество пунктов меню. В пределах
разумного.
Принцип организации такого меню достаточно прост.
В данном случае, имеются 4 аналогичные процедуры, "выстроенные по ранжиру".
Разобравшись с одной из них, и поняв ее логическую взаимосвязь с другими
процедурами, без проблем можно разобраться и со всеми остальными.
Программно, сказанное реализовано так:
....................................
....................................
;################################################################################
; ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ. ###############################################
;################################################################################
....................................
....................................
;-----------------------------------
; Надпись "Задание порогов"
;-----------------------------------
TEXT_6 addwf PC,F ; -----"-----
dt 0xA4,0x61,0xE3,0x61,0xBD,0xB8,0x65,0x20
dt 0x20,0xBE,0x6F,0x70,0x6F,0xB4,0x6F,0xB3
....................................
....................................
;-----------------------------------
; Надпись "Uвольт и Iампер "
;-----------------------------------
TEXT_30 addwf PC,F ; -----"-----
dt 0x55,0xB3,0x6F,0xBB,0xC4,0xBF,0x20,0xB8
dt 0x20,0x49,0x61,0xBC,0xBE,0x65,0x70,0x20
;-----------------------------------
; Надпись " термозащиты "
;-----------------------------------
TEXT_31 addwf PC,F ; -----"-----
dt 0x20,0x20,0xBF,0x65,0x70,0xBC,0x6F,0xB7
dt 0x61,0xE6,0xB8,0xBF,0xC3,0x20,0x20,0x20
4
....................................
....................................
;################################################################################
; КОНЕЦ ВЕРХНЕЙ "ОБСЛУГИ" 1-й СТРАНИЦЫ. #########################################
;################################################################################
....................................
....................................
....................................
....................................

;PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
; ПП УСТАНОВКИ ПОРОГОВ (порогов U/I, Т-порогов, КЗ-порога). PPPPPPPPPPPPPPPPPPPPP
;PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
VIBOR_P bcf PortA,2 ; ТРАНЗИСТОР ЗАКРЫВАЕТСЯ.
bcf IntCon,7 ; ЗАПРЕТ ПРЕРЫВАНИЙ.
clrf Temp_1 ; Указатель U/I порогов, по умолчанию,
; устанавливается на пороге U.
bsf Temp_3,0 ; Указатель Т-порогов, по умолчанию,
; устанавливается на нижнем Т-пороге.
;--------------------------------------------------------------------------------
; Обеспечение "штатных" условий отработки сценария "ЗАЩИТА ВКЛЮЧЕНА", в случае
; дальнейшего перехода из сценария "ВЫБОР ПОРОГОВ" в сценарий "ЗАЩИТА ВКЛЮЧЕНА".
;--------------------------------------------------------------------------------
bcf Flag_1,5 ; Перевод флага ручного отключения нагрузки
; в состояние "нагрузка выключена".
;================================================================================
; Продолжение опроса кнопки "Установка порогов"
; (ее опрос происходит в другой ПП).
;================================================================================
; Противодребезговая задержка.
;--------------------------------------------------------------------------------
call PAUSE_UI ; Переход в ПП PAUSE_UI.
;----> Возврат по стеку из ПП PAUSE_UI.
;================================================================================
; Ожидание отжатия кнопки.
;================================================================================
; Вывод на индикацию, в 1-ю строку, фиксированной надписи "Задание порогов".
;--------------------------------------------------------------------------------
movlw b'10000000' ; Установка курсора в крайнее
call ENTER_BF ; левое знакоместо 1-й строки.
movlw .16 ;
movwf Count ;
movf Count,W ;
sublw .16 ;
call TEXT_6 ; Аналогично, только
bsf PortC,RS ; для TEXT_6.
call ENTER_BF ;
decfsz Count,F ;
goto $-6 ;
;--------------------------------------------------------------------------------
; Подготовка к выводу надписи "Uвольт и Iампер".
;--------------------------------------------------------------------------------
movlw .40 ; Задание времени (количества циклов)
movwf Temp ; "высвечивания" надписи "Uвольт и Iампер".
movlw high TEXT_30; Выбор
movwf PCLATH ; 3-го блока 1-й страницы.
;--------------------------------------------------------------------------------
; Вывод на индикацию, во 2-ю строку, фиксированной надписи "Uвольт и Iампер".
;--------------------------------------------------------------------------------
SNOVA_3 movlw b'11000000' ; Установка курсора в крайнее
call ENTER_BF ; левое знакоместо 2-й строки.
movlw .16 ;
movwf Count ;
movf Count,W ;
sublw .16 ; Аналогично, только
call TEXT_30 ; для TEXT_30.
5
bsf PortC,RS ;
call ENTER_BF ;
decfsz Count,F ;
goto $-6 ;
;--------------------------------------------------------------------------------
; Пауза между циклами вывода на индикацию.
;--------------------------------------------------------------------------------
call PAUSE_UI ; Переход в ПП PAUSE_UI.
;----> Возврат по стеку из ПП PAUSE_UI.
;--------------------------------------------------------------------------------
; Счет циклов.
;--------------------------------------------------------------------------------
btfsc PortB,1 ; Кнопка "Установка порогов" нажата
; или отжата ?
goto UST_POROG_UI; Если отжата, то переход в ПП установки
; порогов U/I.
decfsz Temp,F ; Если нажата, то цикл вывода надписи "Uвольт
goto SNOVA_3 ; и Iампер" повторяется до тех пор, пока
; счетчик не обнулится.
; После этого, программа исполняется далее.
;--------------------------------------------------------------------------------
; Подготовка к выводу надписи " термозащиты ".
;--------------------------------------------------------------------------------
movlw .40 ; Задание времени (количества циклов)
movwf Temp ; "высвечивания" надписи " термозащиты ".
;--------------------------------------------------------------------------------
; Вывод на индикацию, во 2-ю строку, фиксированной надписи " термозащиты ".
;--------------------------------------------------------------------------------
SNOVA_4 movlw b'11000000' ; Установка курсора в крайнее
call ENTER_BF ; левое знакоместо 2-й строки.
movlw .16 ;
movwf Count ;
movf Count,W ;
sublw .16 ; Аналогично, только
call TEXT_31 ; для TEXT_31.
bsf PortC,RS ;
call ENTER_BF ;
decfsz Count,F ;
goto $-6 ;
;--------------------------------------------------------------------------------
; Пауза между циклами вывода на индикацию.
;--------------------------------------------------------------------------------
call PAUSE_UI ; Переход в ПП PAUSE_UI.
;----> Возврат по стеку из ПП PAUSE_UI.
;--------------------------------------------------------------------------------
; Счет циклов.
;--------------------------------------------------------------------------------
btfsc PortB,1 ; Кнопка "Установка порогов" нажата
; или отжата ?
goto TERMOPOROG ; Если отжата, то переход в ПП установки
; Т-порогов.
decfsz Temp,F ; Если нажата, то цикл вывода надписи
goto SNOVA_4 ; "термозащиты" повторяется до тех пор, пока
; счетчик не обнулится.
; После этого, программа исполняется далее.
;--------------------------------------------------------------------------------
; Переход в ПП установки КЗ-порога.
;--------------------------------------------------------------------------------
movlw high TEXT_38; Выбор
movwf PCLATH ; 1-го блока 2-й страницы.
goto KZ_POROG ; Переход в ПП KZ_POROG.
....................................
....................................
....................................
....................................

6
;22222222222222222222222222222222222222222222222222222222222222222222222222222222
; 2-я СТРАНИЦА ПАМЯТИ ПРОГРАММ.
;################################################################################
; ВЕРХНЯЯ "ОБСЛУГА" 2-й СТРАНИЦЫ. ###############################################
;################################################################################
....................................
....................................
;-----------------------------------
; Надпись " защиты от КЗ "
;-----------------------------------
TEXT_38 addwf PC,F ; -----"-----
dt 0x20,0x20,0xB7,0x61,0xE6,0xB8,0xBF,0xC3
dt 0x20,0x6F,0xBF,0x20,0x4B,0xA4,0x20,0x20
;-----------------------------------
; Надпись " Возврат "
;-----------------------------------
TEXT_39 addwf PC,F ; -----"-----
dt 0x20,0x20,0x20,0x20,0x42,0x6F,0xB7,0xB3
dt 0x70,0x61,0xBF,0x20,0x20,0x20,0x20,0x20
;-----------------------------------
; Надпись " из режима "
;-----------------------------------
TEXT_40 addwf PC,F ; -----"-----
dt 0x20,0x20,0x20,0xB8,0xB7,0x20,0x70,0x65
dt 0xB6,0xB8,0xBC,0x61,0x20,0x20,0x20,0x20
;################################################################################
; КОНЕЦ ВЕРХНЕЙ "ОБСЛУГИ" 2-й СТРАНИЦЫ. #########################################
;################################################################################

;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
; ПП РАБОТЫ С ТЕРМОДАТЧИКОМ. DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
TERMO
....................................
....................................
....................................
....................................
;KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
; ПП УСТАНОВКИ КЗ-ПОРОГА.
;KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
; Вывод на индикацию, во 2-ю строку, фиксированной надписи " защиты от КЗ ".
;================================================================================
KZ_POROG movlw .40 ; Задание времени (количества циклов)
movwf Temp ; "высвечивания" надписи " защиты от КЗ ".

SNOVA_5 movlw b'11000000' ; Установка курсора в крайнее


call ENTER_BF_1 ; левое знакоместо 2-й строки.
movlw .16 ;
movwf Count ;
movf Count,W ;
sublw .16 ; Аналогично, только
call TEXT_38 ; для TEXT_38.
bsf PortC,RS ;
call ENTER_BF_1 ;
decfsz Count,F ;
goto $-6 ;
;--------------------------------------------------------------------------------
; Пауза между циклами вывода на индикацию.
;--------------------------------------------------------------------------------
call PAUSE_UI_1 ; Переход в ПП PAUSE_UI_1.
;----> Возврат по стеку из ПП PAUSE_UI_1.
;--------------------------------------------------------------------------------
; Счет циклов.
;--------------------------------------------------------------------------------

7
btfsc PortB,1 ; Кнопка "Установка порогов" нажата
; или отжата ?
goto UST_KZ ; Если отжата, то переход в ПП установки
; КЗ-порога.
decfsz Temp,F ; Если нажата, то цикл вывода надписи
goto SNOVA_5 ; " защиты от КЗ " повторяется до тех пор,
; пока счетчик не обнулится.
; После этого, программа исполняется далее.
;================================================================================
; Вывод на индикацию, в 1-ю строку, фиксированной надписи " Возврат ".
;================================================================================
movlw .20 ; Задание времени (количества циклов)
movwf Temp ; "высвечивания" надписи " Возврат ".

SNOVA_6 movlw b'10000000' ; Установка курсора в крайнее


call ENTER_BF_1 ; левое знакоместо 1-й строки.
movlw .16 ;
movwf Count ;
movf Count,W ;
sublw .16 ; Аналогично, только
call TEXT_39 ; для TEXT_39.
bsf PortC,RS ;
call ENTER_BF_1 ;
decfsz Count,F ;
goto $-6 ;
;================================================================================
; Вывод на индикацию, в 2-ю строку, фиксированной надписи " из режима ".
;================================================================================
movlw b'11000000' ; Установка курсора в крайнее
call ENTER_BF_1 ; левое знакоместо 2-й строки.
movlw .16 ;
movwf Count ;
movf Count,W ;
sublw .16 ; Аналогично, только
call TEXT_40 ; для TEXT_40.
bsf PortC,RS ;
call ENTER_BF_1 ;
decfsz Count,F ;
goto $-6 ;
;--------------------------------------------------------------------------------
; Пауза между циклами вывода на индикацию.
;--------------------------------------------------------------------------------
call PAUSE_UI_1 ; Переход в ПП PAUSE_UI_1.
;----> Возврат по стеку из ПП PAUSE_UI_1.
;--------------------------------------------------------------------------------
; Счет циклов.
;--------------------------------------------------------------------------------
btfss PortB,1 ; Кнопка "Установка порогов" нажата
; или отжата ?
goto $+3 ; Если нажата, то обход возврата в тот режим,
; из которого вызывалась процедура установки
; порогов.
clrf PCLATH ; Если отжата, то возврат в тот режим, из
goto INKEY ; которого вызывалась процедура установки
; порогов.
decfsz Temp,F ; Если нажата, то цикл вывода надписи
goto SNOVA_6 ; "Возврат/из режима" повторяется до тех пор,
; пока счетчик не обнулится.
; После этого, программа исполняется далее.
clrf PCLATH ; Если он обнулился, то возврат в тот режим,
goto INKEY ; из которого вызывалась процедура установки
; порогов.
;================================================================================
; Вывод на индикацию, во 2-ю строку, фиксированной надписи " Ток КЗ = , a ".
;================================================================================
UST_KZ
8
....................................
....................................

Надпись "Задание порогов", в 1-й строке, "высвечивается" в течение всего интервала


времени отработки первых трех пунктов меню.
Во 2-ю строку, в течение этого интервала времени, на индикацию, последовательно
выводятся надписи:
"Uвольт и Iампер", " термозащиты ", " защиты от КЗ "
Например, процедура вывода на индикацию надписи "Uвольт и Iампер" (выделена
темно-синим цветом).
И в этом, и в остальных случаях, имеет место быть банальная "постановка на
счетчик" количества отрабатываемых, внутренних циклов.
Примечание: ранее было задано 50 циклов, но я уменьшил это количество до 40-ка,
так как счел нужным увеличить скорость смены надписей. То же самое относится и к
следующей надписи.
В кольцо внутреннего цикла, "врезана" проверка состояния кнопки "Установка порогов".
Если она нажата, то будет "отмотано" 40 "витков", после чего, рабочая точка
программы "покинет" это "мотало" по сценарию "программа исполняется далее", и на
индикацию начнет выводиться следующая надпись.
Время "высвечивания" надписи зависит как от заданного количества отрабатываемых,
внутренних циклов, так и от времени отработки задержки PAUSE_UI (в комплексе).
В данном случае, во внутренний цикл, я включил процедуру вывода на индикацию
надписи (никакого визуального дискомфорта вообще не ощущается), но можно и
перенести метку SNOVA_3 на команду call PAUSE_UI.
При этом, нужно либо увеличить количество отрабатываемых циклов, либо добавить
еще одну задержку PAISE_UI (может быть позже и перенесу).
Это к вопросу о многообразии возможных решений.
Если же кнопка "Установка порогов" будет отжата в интервале времени "высвечивания"
надписи "Uвольт и Iампер", то произойдет переход в ПП установки порогов U/I
(goto UST_POROG_UI).
Ровным счетом то же самое относится и к следующей "закольцовке", только в этом
случае, во 2-ю строку, выводится надпись " термозащиты " и в случае отжатия
кнопки в интервале времени "высвечивания" этой надписи, происходит переход в ПП
установки термопорогов (goto TERMOPOROG).
В принципе, то же самое относится и к "закольцовке", связанной с выводом на
индикацию надписи " защиты от КЗ ", но в этом случае, есть специфика.
А именно: я разместил соответствующую процедуру (а также и то, что следует далее)
не на 1-й странице памяти программ ПИКа, а на 2-й.
Это вынужденная мера, так как "ефрейторский суперзазорище" не может уменьшаться
бесконечно.
Если нижняя часть содержимого 1-й страницы памяти программ ПИКа "наедет" на 2-ю
страницу ("ефрейторский суперзазорище" отсутствует), то всей программе будет "Гитлер
капут".
Так что, как говорится, хочешь жить, умей вертеться.
На этой же (2-й) странице, под надпись " защиты от КЗ ", организована ПП
вычисляемого перехода с названием TEXT_38.
Естественно, что под это дело организован переход, с 1-й страницы памяти программ, на 2-ю:
;--------------------------------------------------------------------------------
; Переход в ПП установки КЗ-порога.
;--------------------------------------------------------------------------------
movlw high TEXT_38; Выбор
movwf PCLATH ; 1-го блока 2-й страницы.
goto KZ_POROG ; Переход в ПП KZ_POROG.
Ну а далее, смысл тот же (см. выше), только с поправкой на ПП ENTER_BF_1 и ПП
PAUSE_UI_1, и на то, что в случае отжатия кнопки, осуществляется переход в ПП
установки КЗ-порога (UST_KZ).
Соответствующую надпись, во время "высвечивания"
которой нужно отжать кнопку "Установка порогов"
(если нужно перейти в подрежим установки

9
КЗ-порога), Вы видите на картинке слева.
Если долговременно жать на кнопку "Установка порогов", то после того, как все 3
"вышележащие" процедуры будут отработаны, на индикацию, в обе строки, будет
выведена надпись
" Возврат / из режима "
Под надписи " Возврат " и " из режима " организованы две ПП
вычисляемых переходов с названиями TEXT_39 и TEXT_40.
Так как символы на индикацию выводятся не в одну, а в обе строки, что в данном
случае соответствует увеличению времени отработки одного внутреннего цикла, то
количество циклов уменьшено вдвое (с .40 до .20).
Если отжать кнопку "Установка порогов" во время
"высвечивания" надписи
" Возврат / из режима " (см. картинку
слева), то произойдет возврат (не по стеку, а
посредством безусловного перехода в ПП INKEY) в
тот режим, из которого ранее был осуществлен
"уход" в ПП выбора порогов.
Если же ее не отжимать, то посредством того же безусловного перехода в ПП INKEY,
произойдет "закольцовка" на начало вывода надписи "Uвольт и Iампер" и все
повторится снова.
Вопрос: "Как это так получается? Осуществляется переход в одну и ту же ПП, а
результаты разные"?
Ответ: в данном случае (надпись " Возврат / из режима "), результаты
зависят от состояния кнопки "Установка порогов".
Если она будет нажата, то после окончания отработки всего количества заданных,
внутренних циклов, произойдет "закольцовка" на начало "меню", а если она будет
отжата, то произойдет выход из режима выбора порогов.

Итак, теперь имеется возможность выбора одного из трех вариантов установки порогов.
"Разборки" с порогами U/I и Т-порогами были ранее.
А вот под КЗ-порог, нужно "родить" подпрограмму установки КЗ-порога.
Так как таковой просто нет.
А вот как только она будет "рождена" (будет иметься возможность изменений значения
КЗ-порога), так и двигаться дальше можно.
В данном случае, во избежание "ефрейторскосуперзазорищного геморроя", эту ПП
целесообразно "ваять" не на 1-й, а на 2-й странице памяти программ.
При этом, какую-то особую Америку открывать не нужно. Она уже открыта.
То есть, за основу берется одна из "половинок" (любая) процедуры установки
Т-порогов.
"Половинок" потому, что речь идет не об установке двух порогов, а об установке
одного порога.
"Т-порогов" потому, что на индикацию нужно вывести не 3 (как в случае установки
порогов U/I), а 2 десятичных разряда.
Естественно, что нужно "подрихтовать" эту "манну небесную", с учетом конкретной
КЗ-специфики.
Но "скелетик-то" (стратегия) один и тот же … А "мясцо" наращивается. Дело техники.
У меня получилось так:
....................................
....................................

;22222222222222222222222222222222222222222222222222222222222222222222222222222222
; 2-я СТРАНИЦА ПАМЯТИ ПРОГРАММ.
;################################################################################
; ВЕРХНЯЯ "ОБСЛУГА" 2-й СТРАНИЦЫ. ###############################################
;################################################################################
....................................
....................................
;-----------------------------------
; Надпись " Ток КЗ = , a "
;-----------------------------------

10
TEXT_41 addwf PC,F ; -----"-----
dt 0x20,0x20,0x54,0x6F,0xBA,0x20,0x4B,0xA4
dt 0x20,0x3D,0x20,0x2C,0x20,0x61,0x20,0x20
;################################################################################
; КОНЕЦ ВЕРХНЕЙ "ОБСЛУГИ" 2-й СТРАНИЦЫ. #########################################
;################################################################################

;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
; ПП РАБОТЫ С ТЕРМОДАТЧИКОМ. DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
TERMO
....................................
....................................

;KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
; ПП УСТАНОВКИ КЗ-ПОРОГА.
;KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
KZ_POROG
....................................
....................................
;================================================================================
; Вывод на индикацию, во 2-ю строку, фиксированной надписи " Ток КЗ = , a ".
;================================================================================
UST_KZ movlw b'11000000' ; Установка курсора в крайнее
call ENTER_BF_1 ; левое знакоместо 2-й строки.
movlw .16 ;
movwf Count ;
movf Count,W ;
sublw .16 ; Аналогично, только
call TEXT_41 ; для TEXT_41.
bsf PortC,RS ;
call ENTER_BF_1 ;
decfsz Count,F ;
goto $-6 ;
;--------------------------------------------------------------------------------
; Пауза между циклами вывода на индикацию.
;--------------------------------------------------------------------------------
UST_KZ_1 call PAUSE_UI_1 ; Переход в ПП PAUSE_UI_1.
;----> Возврат по стеку из ПП PAUSE_UI_1.
;--------------------------------------------------------------------------------
; Подготовка к 2/10 преобразованию и выводу на индикацию
; текущего значения КЗ-порога.
;--------------------------------------------------------------------------------
movf Temp_KZ,W ; Temp_KZ -> W
;================================================================================
; 2/10 преобразование (1х2) с перекодировкой результата.
;================================================================================
call BIN2_10_T ; Переход в ПП 2/10 преобразования.
;--->Возврат по стеку из ПП BIN2_10_T
;================================================================================
; Вывод на индикацию числовых значений КЗ-порога.
;================================================================================
movlw b'11001010' ;
movwf PortB ; 2-я строка, 11-е знакоместо. Адрес 0Ah.
call ENTER_BF_1 ;
movf LED1,W ; Вывод на индикацию
movwf PortB ; содержимого LED1.
bsf PortC,RS ;
call ENTER_BF_1 ;

movlw b'11001100' ;
movwf PortB ; 2-я строка, 13-е знакоместо. Адрес 0Ch.
call ENTER_BF_1 ;
movf LED0,W ; Вывод на индикацию
movwf PortB ; содержимого LED0.
bsf PortC,RS ;
11
call ENTER_BF_1 ;
;================================================================================
; Опрос клавиатуры.
;================================================================================
; Опрос кнопки "Переключение режимов".
;--------------------------------------------------------------------------------
btfsc PortB,0 ; Кнопка "Переключение режимов" нажата или
; отжата ?
goto $+9 ; Если отжата, то переход на опрос
; кнопки "+/Да".
; Если нажата, то программа исполняется далее.
;--------------------------------------------------------------------------------
; Вывод на индикацию фиксированной надписи " СЛУШАЮСЬ и / ПОВИНУЮСЬ! ".
;--------------------------------------------------------------------------------
bcf PCLATH,3 ; Выбор 1-й страницы.
call SL_I_POVIN ; Переход в ПП вывода на индикацию этой
; надписи.
;--> Возврат по стеку из ПП SL_I_POVIN.
bsf PCLATH,3 ; Выбор 2-й страницы.
;--------------------------------------------------------------------------------
; Противодребезговая задержка.
;--------------------------------------------------------------------------------
call PAUSE_UI_1 ; Переход в ПП PAUSE_UI_1.
;----> Возврат по стеку из ПП PAUSE_UI_1.
;--------------------------------------------------------------------------------
; Ожидание отжатия кнопки.
;--------------------------------------------------------------------------------
btfss PortB,0 ; Кнопка "Переключение режимов" нажата или
; отжата ?
goto $-1 ; Если нажата, то ожидание отжатия.
clrf PCLATH ; Выбор 1-го блока 1-й страницы.
goto INKEY ; Выход из режима.
;================================================================================
; РАБОТА С КНОПКОЙ "+/Да".
;================================================================================
btfsc PortB,2 ; Кнопка "+/Да" нажата или отжата ?
goto KZ_MINUS ; Если отжата, то переход на работу
; с кнопкой "-/Нет".
; Если нажата, то программа исполняется далее.
;--------------------------------------------------------------------------------
; Противодребезговая задержка.
;--------------------------------------------------------------------------------
call PAUSE_UI_1 ; Переход в ПП PAUSE_UI_1.
;----> Возврат по стеку из ПП PAUSE_UI_1.
;--------------------------------------------------------------------------------
; Ожидание отжатия кнопки с "врезкой", обеспечивающей автоинкремент значения
; КЗ-порога.
;--------------------------------------------------------------------------------
call KOHCTAHTA1 ; Переход в ПП установки времязадающих
; констант.
;----> Возврат по стеку из ПП KOHCTAHTA1.
btfsc PortB,2 ; Кнопка "+/Да" нажата или отжата ?
goto KZ_PLUS ; Если отжата, то выход из проверки.
decfsz Reg_2,F ; Если нажата, то отрабатывается задержка, на
goto $-3 ; каждом "витке" которой состояние кнопки
; "+/Да" анализируется.
decfsz Reg_3,F ; После отжатия - выход из задержки.
goto $-5 ;
;--------------------------------------------------------------------------------
; Изменение значения КЗ-порога на +1.
;--------------------------------------------------------------------------------
KZ_PLUS incf Temp_KZ,F ; После отжатия, Temp_KZ + 1 = ...
;================================================================================
; Задание верхней границы (9,9 ампера) диапазона изменений КЗ-порога.
;================================================================================
movlw .99 ; Верхняя граница .99.
12
subwf Temp_KZ,W ; Temp_KZ - .99 = ...
btfss Status,C ; Результат "+/=0" или "-" ?
goto $+4 ; Если "-", то блокировки превышения нет.
; Если "+/=0", то блокировка превышения есть.
;--------------------------------------------------------------------------------
; Блокировка выхода текущих значений КЗ-порога за верхнюю границу
; диапазона изменений КЗ-порога (фиксация на уровне 9,9 ампер).
;--------------------------------------------------------------------------------
movlw .99 ;
movwf Temp_KZ ; Temp_KZ = .99
goto $+4 ; Обход "пищалки".
;================================================================================
; Формирование звукового сигнала.
;================================================================================
clrf PCLATH ; Выбор 1-й страницы.
call MULTI ; Переход в ПП аварийной "пищалки".
;----> Возврат по стеку из ПП MULTI.
bsf PCLATH,3 ; Выбор 2-й страницы.
;--------------------------------------------------------------------------------
; Запись, в EEPROM-память ПИКа, измененного значения Temp_KZ.
;--------------------------------------------------------------------------------
call WRITE_KZ ; Переход в ПП записи КЗ-порога.
;----> Возврат по стеку из ПП WRITE_KZ.
goto UST_KZ_1 ; Переход на следующий цикл
; установки КЗ-порога.
;================================================================================
; РАБОТА С КНОПКОЙ "-/Нет".
;================================================================================
KZ_MINUS btfsc PortB,3 ; Кнопка "-/Нет" нажата или отжата ?
goto UST_KZ_1 ; Если отжата, то переход на следующий цикл
; установки КЗ-порога.
; Если нажата, то программа исполняется далее.
;--------------------------------------------------------------------------------
; Противодребезговая задержка.
;--------------------------------------------------------------------------------
call PAUSE_UI_1 ; Переход в ПП PAUSE_UI_1.
;----> Возврат по стеку из ПП PAUSE_UI_1.
;--------------------------------------------------------------------------------
; Ожидание отжатия кнопки с "врезкой", обеспечивающей автодекремент КЗ-порога.
;--------------------------------------------------------------------------------
call KOHCTAHTA1 ; Переход в ПП установки времязадающих
; констант.
;----> Возврат по стеку из ПП KOHCTAHTA1.
btfsc PortB,3 ; Кнопка "-/Нет" нажата или отжата ?
goto KZ_MINUS1 ; Если отжата, то выход из проверки.
decfsz Reg_2,F ; Если нажата, то отрабатывается задержка, на
goto $-3 ; каждом "витке" которой состояние кнопки
; "-/Нет" анализируется.
decfsz Reg_3,F ; После отжатия - выход из задержки.
goto $-5 ;
;--------------------------------------------------------------------------------
; Изменение значения КЗ-порога на -1.
;--------------------------------------------------------------------------------
KZ_MINUS1 decf Temp_KZ,F ; После отжатия, Temp_KZ - 1.
;================================================================================
; Задание нижней границы (1,0 ампер) диапазона изменений КЗ-порога.
;================================================================================
movlw .10 ; Нижняя граница .10.
subwf Temp_KZ,W ; Temp_KZ - .10 = ...
btfsc Status,C ; Результат "+/=0" или "-" ?
goto $+4 ; Если "+/=0", то блокировки "принижения" нет.
; Если "-", то блокировка "принижения" есть.
;--------------------------------------------------------------------------------
; Блокировка выхода текущих значений КЗ-порога за нижнюю границу
; диапазона изменений КЗ-порога (фиксация на уровне 1,0 ампера).
;--------------------------------------------------------------------------------
13
movlw .10 ;
movwf Temp_KZ ; Temp_KZ = .10
goto $+4 ; Обход "пищалки".
;================================================================================
; Формирование звукового сигнала.
;================================================================================
clrf PCLATH ; Выбор 1-й страницы.
call MULTI ; Переход в ПП аварийной "пищалки".
;----> Возврат по стеку из ПП MULTI.
bsf PCLATH,3 ; Выбор 2-й страницы.
;--------------------------------------------------------------------------------
; Запись, в EEPROM-память ПИКа, измененного значения Temp_KZ.
;--------------------------------------------------------------------------------
call WRITE_KZ ; Переход в ПП записи КЗ-порога.
;----> Возврат по стеку из ПП WRITE_KZ.
goto UST_KZ_1 ; Переход на следующий цикл
; установки КЗ-порога.

;################################################################################
; НИЖНЯЯ "ОБСЛУГА" 2-й СТРАНИЦЫ.
;################################################################################
....................................
....................................
;================================================================================
; Константы скорости автоинкремента/автодекремента.
;================================================================================
KOHCTAHTA1 movlw .100 ; Константы, определяющие
movwf Reg_2 ; величину интервалов времени между
movlw .25 ; автоинкрементами/автодекрементами
movwf Reg_3 ; (скорость автоинкремента/автодекремента).
return ; Возврат по стеку.
;================================================================================
; ПП записи КЗ-порога.
;================================================================================
WRITE_KZ bsf Status,RP1 ; Переход
bcf Status,RP0 ; во 2-й банк.
movlw 5 ; Выбор ячейки EEPROM
movwf EEAdr ; с адресом 05h.
movf Temp_KZ,W ;
movwf EEData ; Temp_KZ -> EEData.
bsf Status,RP0 ; Переход в 3-й банк.
bcf EECon1,7 ; Работа с EEPROM.
bsf EECon1,2 ; Разрешение записи.
movlw 0x55 ; Обязательная
movwf EECon2 ; последовательность
movlw 0xAA ; команд
movwf EECon2 ; записи.
bsf EECon1,1 ; Инициализация записи.
bcf EECon1,2 ; Запрещение записи.
btfsc EECon1,1 ; Запись завершена или нет ?
goto $-1 ; Если не завершена, то "плавающая" задержка.
bcf Status,RP0 ; Если завершена, то
bcf Status,RP1 ; переход в 0-й банк.
return ; Возврат по стеку.
;================================================================================
....................................
....................................
;################################################################################
; КОНЕЦ НИЖНЕЙ "ОБСЛУГИ" 2-й СТРАНИЦЫ. ##########################################
;################################################################################
end ; Конец программы.

Слева Вы видите визуальный результат работы всего


этого "безобразия".
На картинках изображены два "крайних" случая.
14
Естественно, что можно выставить и другое значение ("шаг" 0,1 ампера).
В том "куске" программы, который "вышележит",
серым цветом выделены названия "старых"
подпрограмм.
"Разрисовывать" я их не стал, только отмечу, что
- ПП MULTI и SL_I_POVIN "лежат" на 1-й странице
памяти программ,
- остальные, серые ПП, "лежат" на 2-й странице памяти программ,
- ПП UST_KZ "лежит" на 2-й странице памяти программ.
Соответственно, перед вызовом ПП MULTI и SL_I_POVIN, а также после возврата из
них (напоминаю, что стек работает по всему объему памяти программ, то есть, "ему
страницы по барабану"), нужно озаботиться "страничноблочными делами".
Что и имеет место быть.
А куда деваться (попробуй не озаботиться … "Гитлер капут" только этого и ждет!)?
"Новая" ПП вычисляемого перехода выделена синим цветом (1-й блок 2-й страницы).
Две "новых" ПП (KOHCTAHTA1 и WRITE_KZ) нижней "обслуги" 2-й страницы выделены
фиолетовым цветом.
Подпрограмму KOHCTAHTA1 я "склонировал" по ПП KOHCTAHTA, так как, в связи с
ее "немощью", вызывать ее из 1-й страницы просто не выгодно.
ПП WRITE_KZ нужна для осуществления записи текущего КЗ-порога в EEPROM-память
данных ПИКа.
Работа ПП UST_KZ
ПП UST_KZ исполняется только в том случае, если кнопка "Установка порогов"
отжимается в интервале времени "высвечивания меню-надписи"
" защиты от КЗ "
Перво-наперво, во 2-ю строку, нужно вывести на индикацию "технологическую" надпись,
которая растолковывает, что именно будет выводиться на индикацию и в каком
"формате".
В данном случае, это надпись " Ток КЗ = , a "
Под нее организована соответствующая ПП вычисляемого перехода (TEXT_41).
Далее, начинается циклическая ПП UST_KZ_1, которая отрабатывается от 2-го "витка"
внутреннего цикла и далее.
До тех пор, пока не будет нажата/отжата кнопка "Переключение режимов".
Для организации оперативной памяти значения текущего КЗ-порога,
организован/"прописан" регистр Temp_KZ.
Именно из него "черпаются" данные, предназначенные для 2/10 преобразования и
последующего вывода на индикацию текущих значений КЗ-порога.
Примечание: для реализации, сформулированного выше, технического задания,
достаточно одного регистра (одного байта).
Соответственно, речь идет о 2/10 преобразовании типа 1х2.
Значит, применяю ПП BIN2_10_T (она под это создана), и все дела.
В данном случае, применена "прыжковая" процедура вывода данных на индикацию.
"Прыжковая" в том смысле, что второй байт данных (тот, что "лежит" в LED0)
выводится на индикацию не за счет автоинкремента, а за счет указания конкретного
адреса.
То есть, знакоместо, в котором "высвечивается" символ "запятая", как бы
"перепрыгивается".
Можно было бы "подпрячь и автоинкремент" (сначала так и сделал), но жизнь, хотя
бы в познавательных целях, нужно как-то разнообразить.
После того, как текущее значение КЗ-порога будет выведено на индикацию, происходит
опрос клавиатуры (вернее, одной кнопки "Переключение режимов").
А как же иначе, ведь из ПП установки КЗ-порога нужно как-то выйти.
"Не всю же жизнь там торчать" рабочей точке.
Опрос организован "по полной программе", то есть, с задействованием надписи
СЛУШАЮСЬ и ПОВИНУЮСЬ
Ничего нового в этом опросе нет.
Если после перехода в подрежим установки КЗ-порога, кнопка "Переключение режимов"
не нажимается, то будет осуществлен обход процедуры выхода из подрежима

15
установки КЗ-порога, а если она будет нажата/отжата, то по факту отжатия, произойдет
выход из этого подрежима (переход в ПП INKEY).
Предположим, что кнопка "Переключение режимов" не нажата.
В этом случае, происходит "влет" рабочей точки программы в процедуры опроса
кнопок "+/Да" и "-/Нет".
Все это мы уже "проходили" в ПП TERMOPOROG ("передрано" оттуда).
Нужно только учесть специфику: необходимо заменить названия подпрограмм/меток,
изменить значения "ограничительных" констант, а также "выбросить" ненужное.
Примечание: верхняя "граница" диапазона изменения значения КЗ-порога задана по
максимуму. Нижнюю же "границу" можно программно изменить, изменив числовое
значение константы .10.
Если кнопка "Переключение режимов" не нажимается, то дальнейшая работа
происходит во внутреннем цикле (см. goto UST_KZ_1).
В этом цикле, можно от души понажимать на кнопки "+/Да" или "-/Нет" (жмите хоть
весь день) и посмотреть, что из этого выйдет.
А выйдет очень даже симпатично: в заданном диапазоне (от 1,0 до 9,9 ампер.
Работают "ограничители"), можно установить любое значение КЗ-порога с "шагом"
0,1 ампер.
При этом, любое измененное значение КЗ-порога записывается в ячейку EEPROM-
памяти данных ПИКа с адресом 05h (см. ПП WRITE_KZ).
Позднее, будет организовано чтение из этой ячейки, а также и произведены прочие
полезные действия.

Ладушки. Это "проехали".


На данный момент, можно комфортно перейти в подрежим установки КЗ-порога,
выставить КЗ-порог и запомнить его в EEPROM-памяти данных ПИКа.
Теперь нужно привести числовое значение КЗ-порога к такому числовому значению,
которое можно было бы использовать в качестве "эталона".
Вопрос: "А почему так? Почему нельзя использовать то значение КЗ-порога, которое
есть, без каких бы то ни было его трансформаций/поправок"?
Ответ: использовать нельзя потому, что имеет место быть различная десятичная
разрядность значений порога защиты по превышению I и порога КЗ-защиты.
Хотя, в обеих случаях, работа происходит с одним байтом, но первом случае, это 3
десятичных разряда с шагом в 4 градации, а во втором случае, это 2 десятичных
разряда с шагом в 1 градацию.
1/4 = 0,25.
0,25 х 10 ("вес" одного десятичного разряда) = 2,5.
Это и есть тот поправочный коэффициент (множитель), на который нужно умножить
числовое значение КЗ-порога для того, чтобы, в ПП прерывания, можно было бы
"по-человечески" (а не абы как) сравнить этот результат с текущим значением
(замером) тока.
Такое умножение вполне можно назвать перекодировкой.
Я организовал эту "свистопляску" так:
....................................
....................................
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
; Сценарий "ЗАЩИТА ВЫКЛЮЧЕНА". VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
....................................
....................................
;********************************************************************************
; Начало рабочего сценария выключенной защиты.
;********************************************************************************
; Выключение защиты по напряжению (установка максимального порога).
;--------------------------------------------------------------------------------
YES_VIKL movlw .255 ; Установка максимального порога защиты по U,
movwf Porog_U ; который никогда не будет превышен.
;--------------------------------------------------------------------------------
; Умножение текущего значения КЗ-порога на 2,5 (множитель).
;--------------------------------------------------------------------------------
movf Temp_KZ,W ; Temp_KZ (множимое) -> Porog_I
16
movwf Porog_I ; (через W).

bcf Status,C ; C=0


rlf Porog_I,F ; Умножение на 2 (результат -> Porog_I).

bcf Status,C ; C=0


rrf Temp_KZ,W ; Множимое делится на 2.

addwf Porog_I,F ; (Temp_KZx2)+(Temp_KZ:2)=2,5xTemp_KZ


; (результат -> Porog_I).
;--------------------------------------------------------------------------------
; Опрос кнопки "Установка порогов".
;--------------------------------------------------------------------------------
....................................
....................................

То, что "врезано", выделено красным цветом.


Это и есть умножение числа, "лежащего" в регистре Temp_KZ, на 2,5.
Надеюсь, что с этим не трудно разобраться.
В конечном итоге, порог защиты по U выставляется по максимуму (то, что было
раньше. Ничего не изменяется), и он никогда не будет превышен, а вместо установки,
по максимуму, порога I (то, что было раньше), используется процедура умножения
текущего значения КЗ-порога на 2,5.
Результат этого умножения "оседает" в "штатном" регистре Porog_I, с содержимым
которого, в дальнейшем (в ПП прерывания), будут "штатно" сравниваться текущие
значения замеров тока.
Ну и распрекрасно. "Бабу с воза, …".
Теперь, с целью обеспечения "полноценной" организации процедуры типа "чтение-
модификация-запись", нужно озаботиться чтением значения КЗ-порога из ячейки с
адресом 05h EEPROM-памяти данных ПИКа.
Напоминаю, что ранее, ради "свершения энергонезависимых дел", я капитально
озаботился записью, в эту ячейку, значения текущего КЗ-порога (см. ПП WRITE_KZ).
А заодно, нужно озаботиться и увеличением "ефрейторского суперзазорища", так как
он, каналья, по ходу всяческих, текущих "ваяний", все время уменьшается (нудно
напоминаю про "Гитлер капут", а заодно и про "шагреневую кожу").
В целях обеспечения наивысшей объективности, нужно сказать, что коррекция этого
"суперзазорища" не есть одноразовая "акция".
За этим "важняком" нужно следить постоянно.
Как "чихнул" на 1-й странице, так сразу же и "бегОм" в окно ROM.
С целью идентификации вполне возможного "Гитлер капута".
Но лучше упредить. Именно так и поступают лучшие гомо-сапиенсы.
То есть, по мере возникновения такой необходимости, нужно увеличивать "массу
ефрейторского суперзазорища", не дожидаясь "Гитлер капута" (надеюсь, что такое
"неакадемическое" объяснение будет доходчивым).
Вопрос: "За счет чего увеличивать-то"?
Ответ: за счет переноса тех или иных подпрограмм или групп команд (с приданием им
"статуса" подпрограмм), с 1-й страницы памяти программ на 2-ю.
Или за счет командной оптимизации ("ужатия") того, что "лежит" на 1-й странице
памяти программ (это к вопросу о пользе оптимизации).
А лучше всего, в комплексе.
В данном случае, ужимай – не ужимай, а что-то перенести придется, так как "масса
программы растет как на дрожжах".
Вопрос: "Что переносить"?
Ответ: это зависит от конкретной программы и от содержимого конкретной, черепной
коробки.
В принципе, перенести можно все что угодно.
Вопрос только в том, какой ценой?
С точки зрения здравого смысла, нужно исходить из того, что если в подпрограмме
имеется несколько переходов "наружу", то это обойдется "дороговато".

17
Выгоднее всего (ток течет по пути наименьшего сопротивления), в первую очередь,
"положить глаз" на те ПП или группы команд, в которых отсутствуют переходы
"наружу" ("внутренние" переходы могут быть. Любое количество. Это "по-барабану").
Почему?
Потому, что в случае переноса с одной страницы на другую, "геморрой" минимальный.
Вот в строгом соответствии с этой "концепцией", я и осуществил перенос, с 1-й
страницы памяти программ, на 2-ю, той группы команд чтения из EEPROM-памяти
данных ПИКа, которая "дислоцировалась" в ПП START.
Ей присвоен "статус" подпрограммы с названием READ, и она, в соответствии с
необходимостью того, о чем говорилось выше, "доукомплектована" процедурой чтения,
из ячейки EEPROM-памяти данных ПИКа, с адресом 05h (в ней хранится значение
текущего КЗ-порога).
Кроме того, в соответствии с той же "концепцией", на 2-ю страницу памяти программ
перенесены подпрограммы записи, в EEPROM, числовых значений порогов U и I.
Естественно, что после таких переносов, нужно крайне озаботиться их "материальным
обеспечением".
Что и имеет место быть.
Результат: вот и "местечко освободилось".
В том смысле, что "ефрейторский суперзазорище вынужденно (кто в доме хозяин?)
нарастил свою массу", и поэтому имеется "фора" для "свершения дальнейшего,
первостраничного подвига".
"Инициализирую орлиный взор" (с привлечением бинокля).
Какой-то этот "КЗ-подвиг дохловатый получается".
Недоделанный какой-то. "Недожаренный" (напоминаю про котлеты).
Ну сработала КЗ-защита, ну закрылся транзистор (в ПП прерывания), а дальше-то что?
Нужно как-то оповестить об этом пользователя ("в трубы протрубить, подуть в
свисток"), а то ведь он, по совокупности причин, может подумать черт знает что (и о
конструкторе в том числе).
Вплоть до порчи нервной системы и всяких нехороших слов.
Пользователя нужно всячески уважать, холить и лелеять, так как именно он наш
"клиент", и в конечном итоге, мы работаем для него.
А если мы его будем уважать, то и он будет уважать нас (наилучший "сценарий
ветвления").
Вот такая немудреная "концепция".
В строгом соответствии с ней, "ваяю" сценарий-подсказку №5:
....................................
....................................
;################################################################################
; ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ. ###############################################
;################################################################################
....................................
....................................
;-----------------------------------
; Надпись "Превышен КЗпорог"
;-----------------------------------
TEXT_42 addwf PC,F ; -----"-----
dt 0xA8,0x70,0x65,0xB3,0xC3,0xC1,0x65,0xBD
dt 0x20,0x4B,0xA4,0xBE,0x6F,0x70,0x6F,0xB4
....................................
;################################################################################
; КОНЕЦ ВЕРХНЕЙ "ОБСЛУГИ" 1-й СТРАНИЦЫ. #########################################
;################################################################################
....................................
....................................
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
; Сценарий "ЗАЩИТА ВЫКЛЮЧЕНА". VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
;VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
....................................
....................................
;--------------------------------------------------------------------------------
; Окончание цикла программы (для сценария "ЗАЩИТА ВЫКЛЮЧЕНА").
;--------------------------------------------------------------------------------
18
FINAL btfsc Flag_1,6 ; Ручное отключение нагрузки было
; или не было ?
goto INKEY ; Если было, то ОТКРЫТИЯ ТРАНЗИСТОРА
; не происходит (обход).
btfss Flag,4 ; Флаг превышения порога защиты, по току,
; поднят или опущен ?
goto OK ; Если опущен (КЗ-порог не превышен),
; то обход сценария-подсказки №5.
; Если поднят (КЗ-порог превышен),
; то этот сценарий исполняется.
;********************************************************************************
; Начало сценария-подсказки №5.
;********************************************************************************
; Вывод на индикацию, в 1-ю строку, фиксированной надписи "Превышен КЗпорог".
;================================================================================
movlw high TEXT_42; Выбор PCH 1-й команды ПП TEXT_42.
movwf PCLATH ; (находится в 3-м блоке 1-й страницы).

movlw b'10000000' ; Установка курсора в крайнее


call ENTER_BF ; левое знакоместо 1-й строки.
movlw .16 ;
movwf Count ;
movf Count,W ;
sublw .16 ; Аналогично, только
call TEXT_42 ; для TEXT_42.
bsf PortC,RS ;
call ENTER_BF ;
decfsz Count,F ;
goto $-6 ;
;================================================================================
; Аварийный сценарий.
;================================================================================
movlw high TEXT_34; Выбор PCH 1-й команды ПП TEXT_34
movwf PCLATH ; (находится в 1-м блоке 2-й страницы).
call AVARIJA_1 ; Вывод на индикацию аварийных надписей.
;----> Возврат по стеку из ПП AVARIJA_1.
clrf PCLATH ; Выбор 1-го блока 1-й страницы.
;-----------------------------------------------------------------
; Формирование звукового сигнала аварии.
;-----------------------------------------------------------------
call PAUSE_UI ; Задержка.
;----> Возврат по стеку из ПП PAUSE_UI.
call MULTI ; Переход в ПП аварийной "пищалки".
;----> Возврат по стеку из ПП MULTI.
bsf PortC,1 ; Управляющий сигнал выключения БП.
goto $-3 ; "Закольцовка" в "вечном кольце".
OK bsf PortA,2 ; ОТКРЫТИЕ ТРАНЗИСТОРА.
goto INKEY ; Переход на следующий цикл программы.
;********************************************************************************

;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
; Сценарий "ЗАЩИТА ВКЛЮЧЕНА". |||||||||||||||||||||||||||||||||||||||||||||||||||
;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
....................................
....................................
....................................
....................................

;22222222222222222222222222222222222222222222222222222222222222222222222222222222
; 2-я СТРАНИЦА ПАМЯТИ ПРОГРАММ.
;################################################################################
....................................
....................................
....................................
....................................
;################################################################################
19
; НИЖНЯЯ "ОБСЛУГА" 2-й СТРАНИЦЫ. ################################################
;################################################################################
....................................
....................................
;================================================================================
; Вывод на индикацию аварийной надписи.
;================================================================================
AVARIJA movlw high TEXT_33; Выбор PCH 1-й команды ПП TEXT_33
movwf PCLATH ; (находится в 1-м блоке 2-й страницы).
;-----------------------------------------------------------------------------
; Вывод на индикацию, в 1-ю строку, фиксированной надписи " Ттекущ.>или=Тн.".
;-----------------------------------------------------------------------------
movlw b'10000000' ; Установка курсора в крайнее
call ENTER_BF_1 ; левое знакоместо 1-й строки.
movlw .16 ;
movwf Count ;
movf Count,W ;
sublw .16 ;
call TEXT_33 ; Аналогично, только
bsf PortC,RS ; для TEXT_33.
call ENTER_BF_1 ;
decfsz Count,F ;
goto $-6 ;
;------------------------------------------------------------------------------
; Вывод на индикацию, во 2-ю строку, фиксированной надписи " ВЫКЛЮЧИТЕ БП!!!".
;------------------------------------------------------------------------------
AVARIJA_1 movlw b'11000000' ; Установка курсора в крайнее
call ENTER_BF_1 ; левое знакоместо 2-й строки.
movlw .16 ;
movwf Count ;
movf Count,W ;
sublw .16 ; Аналогично, только
call TEXT_34 ; для TEXT_34.
bsf PortC,RS ;
call ENTER_BF_1 ;
decfsz Count,F ;
goto $-6 ;
return ; Возврат по стеку.
;================================================================================
....................................
....................................
;################################################################################
; КОНЕЦ НИЖНЕЙ "ОБСЛУГИ" 2-й СТРАНИЦЫ. ##########################################
;################################################################################
end ; Конец программы.

Под этот сценарий-подсказку, организована ПП вычисляемого перехода TEXT_42


(вычисляемые переходы "плодятся как кролики", но пока PC это "выдерживает").
Это надпись 1-й строки.
Во 2-ю строку выводится надпись ВЫКЛЮЧИТЕ БП!!!.
Она использовалась ранее.
Поэтому, "новую" ПП вычисляемого перехода "рожать" не нужно.
Нужно только в том, что имеется (ПП AVARIJA), выставить метку AVARIJA_1, а затем
call AVARIJA_1 (с учетом "блочностраничных дел"), и "дело в шляпе".
Если флаг превышения порога защиты по току опущен (порог защиты по току не
превышен), то делается ровным счетом то, что делалось раньше (аварийный сценарий
обходится).
Если флаг превышения порога защиты по току поднят (порог защиты по току
превышен), то на индикацию выводится надпись
Превышен КЗпорог / ВЫКЛЮЧИТЕ БП!!!
после чего происходит "мертвяк", сопровождаемый
непрерывным "писком", прекратить который можно
только выключив БП.

20
Визуально, это выглядит так (см. картинку слева).
"Картина получается" точь в точь такая же, как и после срабатывания термозащиты (в
случае превышения верхнего Т-порога на 5 градусов или в случае, если через 5 минут
температура не станет ниже нижнего Т-порога), только надпись другая.
Транзистор, в ПП прерывания, закроется, и на выводе RC1 будет сформирован сигнал
аварийного выключения БП.
Естественно, что в случае применения устройства аварийного выключения БП,
непрерывного "писка" не будет.
После "вырубания" транзистора, будет короткий "писк", такое же короткое
"высвечивание" надписи Превышен КЗпорог / ВЫКЛЮЧИТЕ БП!!!, после чего БП, "на
зло всем бедам/врагам", автоматически выключится.

Разъяснения по КЗ-порогу.
Какой КЗ-порог будет задан, таковым его и будет "воспринимать железяка".
Зададите 1 ампер, "железяка возьмет под козырек" и будет считать это коротким
замыканием.
Зададите 5 ампер (и т.д.) - то же самое.
Ей "по фигу".
Разъяснения по оптимизации.
Я еще как следует ей не занимался (в смысле "шлифовки"). Так как PC позволяет, и
такие "мероприятия" целесообразно проводить тогда, когда текст программы полностью
"сверстан".
Но нужно отметить и то, что если бы я, по ходу работы, не занимался
предварительной оптимизацией, то на данный момент, объема памяти программ
PIC16F873A просто-напрсто не хватило бы.

Итог: текущая задача выполнена (а заодно и более-менее сформировалась "общая


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

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

22

Оценить