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

2-2/5. Вывод на индикацию параметров защиты (текущих порогов).

Организация
режима установки порогов пользователем, с автоматическим сохранением
измененных порогов в EEPROM-памяти данных ПИКа (черновик №3).

По умолчанию, начальные пороги защиты, по U и по I, выставлены в EEPROM-памяти


данных ПИКа (зафиксированы).
А если их "номиналы" не устраивают пользователя, и он "вожделеет" их сменить без
"заморочек" с вычислениями и прочими неудобствами?
Если не будет практического воплощения этого "вожделения" в жизнь, то ждать от
пользователя "любви/взаимности" не стОит.
Пустая трата времени и нервов (конфуз).
Как первое, так и второе, нужно "прислонить совсем к другой стенке".
И не абы к какой, а к капитальной.
И зафиксировать как следует. Чтобы "не упало и не разлилось".
А именно, необходимо "нарастить" функциональность путем "ваяния и введения в
эксплуатацию" дополнительного режима установки порогов.
То есть, в идеале, пользователь, из любого основного режима, должен комфортно
перейти в режим установки порогов, увидеть на дисплее числовые значения текущих
порогов, а если ему "взбрело в голову" их изменить и сохранить измененное в
энергонезависимой памяти "железяки", то это должно происходить так, чтобы его мозги
как можно менее напрягались и "телодвижений" было минимальное количество.
И возврат из режима установки порогов должен происходить по такому же принципу.
Это "счастье" достигается за счет "напряга содержимого черепной коробки"
конструктора. И это нормально.
А как-же иначе? Закон сохранения энергии "не переплюнешь".
В случае же успеха, речь идет о максимальной "отдаче" и спокойной совести.
В соответствии с этой "концепцией", я усложнил (для себя! А для пользователя -
наоборот) задачу (легкие пути - сыр в мышеловке. Глубоко в этом убежден).
Значения текущих порогов (в дальнейшем, я их буду называть параметрами защиты)
будут выводиться на индикацию не только в режиме установки порогов защиты, но и в
случае превышения любого из них (в аварийном подрежиме).
То есть, в случае наличии "бяки", речь идет о последовательном чередовании (через
несколько секунд) картинок числовых показаний превышения порогов защиты и
параметров защиты.
Ошибиться будет нельзя, так как сие будет снабжено соответствующими,
пояснительными надписями.
Таким образом, сразу же после срабатывания защиты, не переходя в режим установки
порогов, пользователь сможет узнать ("в автомате". Сервис) всю "подноготную текущей
бяки".
В мыслях, это смотрится симпатично, а на яву, это смотрится вообще прекрасно.
То, что сразу же после смены текущего значения любого из порогов, автоматически
должна быть произведена его запись в EEPROM-память ПИКа - само собой
разумеющееся.
Зачем вообще пользователю знать детали (любопытные не в счет!)?
Ему (по крайней мере, абсолютному их большинству) это не нужно, так как напрягает.
Ему нужно только популярно объяснить, на какую "пимпочку" и когда именно, нажать,
и что, после этого, он увидит.
А о любопытных - отдельный разговор.
Надеюсь, что все Вы таковыми и являетесь.
О клавиатуре.
"Текуще пораскинув мозгами и устремив орлиный взор в дальнейшую перспективу"
(напоминаю про нос, дальше которого нужно видеть, и про упреждение), я пришел к
выводу, что под клавиатуру нужно задействовать 4 кнопки.
Но не более того.
В случае совмещения функций (расширения функциональности), с помощью такой
клавиатуры, можно реализовать много различных "раскладок".
И пользователю удобно будет.
Далее à "вперед и с песней" (и челюсть тоже вперед).

1
Получилось вот что:

Как видите, под клавиатуру задействованы все свободные выводы порта В.


Это и есть все текущие изменения принципиальной схемы. Пока.

А вот так выглядит конкретный результат текущей работы:

Например, в случае установки первичных


порогов (то, что имеет место быть после
"прошивки") и превышения порога U на
1,2 в., будет наблюдаться то, что Вы видите на
рис. 2 и рис. 3.

2
Эти две картинки будут последовательно чередоваться "до посинения" (если "бяка" не
устранена).
Чтобы "прекратить это безобразие" и автоматически вернуться в рабочий подрежим
режима включенной защиты, нужно либо понизить выходное напряжение блока питания,
либо повысить порог защиты по напряжению.
С первым случаем все ясно, а во втором случае, нужно переключиться в режим
установки порогов.
Для этого нужно нажать и отпустить кнопку "Установка порогов".
После этого, будет наблюдаться то, что Вы видите на рис. 5.
Под надписью "Задание порогов", выводятся текущие параметры защиты.
Обратите внимание на маркер в виде стрелки, упирающейся в вертикальную линию
(вместо него можно применить любой из символов таблицы знакогенератора ЖК-
модуля, который Вам больше по душе).
Этот символ выводится взамен символа "=", и он помечает активный порог.
То есть, тот порог, который, в дальнейшем, будет изменяться пользователем.
Сразу же после перехода в режим установки порогов, по умолчанию, маркер
автоматически (программно) выставляется на пороге напряжения (см. рис. 5), но его
можно и "перебазировать", нажав и отпустив все ту же кнопку "Установка порогов"
(см. рис. 4).
Если ее последовательно нажимать несколько раз, то маркер будет "скакать" между
порогами U и I.
На какой порог поставите маркер, тот порог и будет, в дальнейшем, изменяться.
Для того чтобы изменить значение того или иного порога, нужно нажать/отпустить
кнопку либо "+1", либо "-1" (см. рис. 6, 7, 8).
Каждая такая "манипуляция" либо увеличивает на 4 квантовки (шаг установки)
значение текущего порога (кнопка "+1"), либо уменьшает на 4 квантовки значение того
текущего порога (кнопка "-1"), на котором выставлен маркер.
Сразу же после каждого отжатия любой из этих кнопок, происходит автоматическая
запись соответствующего, "нового" порога, в EEPROM-память данных ПИКа.
Примечание: на время нажатия любой кнопки клавиатуры, "жизнь замирает". Все
рабочие действия производятся сразу же после отжатия.
После того, как нужный порог (пороги) выставлен, нужно "выйти" из режима установки
порогов.
Для этого, необходимо нажать/отжать кнопку "Переключение режимов".
Возврат происходит не абы как, а именно в тот режим, из которого был осуществлен
"уход" в режим установки порогов.

1. Если до перехода в режим установки порогов, работа происходила в режиме


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

2. Если до перехода в режим установки порогов, работа происходила в режиме


выключенной защиты, то произойдет автоматический переход в режим выключенной
защиты.

Таким образом, нажав/отжав кнопку "Установка порогов", можно перейти в режим


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

А теперь, о соответствующих изменениях/дополнениях.


3
Доработка (простейшая) этого сценария заключается только в добавлении процедуры
опроса кнопки "Установка порогов". Она нужна для того, чтобы можно было "уйти"
из этого сценария в сценарий установки порогов.

4
Опрос кнопки "Переключение режимов" перенесен из конца сценария в ее начало
(до, а не после проверки на превышение порогов), и к нему "пришпилен" опрос кнопки
"Установка порогов" (чтобы "все было в куче", так порядка больше).
"Противодребезгов" и ожиданий отжатия кнопок нет, так как это есть в ПП INKEY и
ПП UST_POROG.
..................................
;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
; Сценарий "ЗАЩИТА ВКЛЮЧЕНА".
;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
; Чтение, из EEPROM, текущих порогов U/I.
;================================================================================
; Чтение порога U.
;-----------------------------------
Z_VKL bsf Status,RP1 ; Переход
bcf Status,RP0 ; во 2-й банк.

movlw 1 ; Выбор ячейки EEPROM


movwf EEAdr ; с адресом 01h.
bsf Status,RP0 ; Переход в 3-й банк.
bcf EECon1,7 ; Работа с EEPROM.
bsf EECon1,0 ; Инициализация чтения.
bcf Status,RP0 ; Переход во 2-й банк.
movf EEData,W ; Считывание байта из выбранной
movwf Porog_U ; ячейки EEPROM в регистр Porog_U.
;-----------------------------------
; Чтение порога I.
;-----------------------------------
movlw 2 ;
movwf EEAdr ;
bsf Status,RP0 ;
bcf EECon1,7 ; Аналогично, только для
bsf EECon1,0 ; адреса 02h и регистра Porog_I.
5
bcf Status,RP0 ;
movf EEData,W ;
movwf Porog_I ;

bcf Status,RP1 ; Переход в 0-й банк.


;================================================================================
; Циклическая подпрограмма слежения.
;================================================================================
KOL_MOZALO bsf IntCon,7 ; РАЗРЕШЕНИЕ ПРЕРЫВАНИЙ.
;--------------------------------------------------------------------------------
; Опрос кнопки "Переключение режимов".
;--------------------------------------------------------------------------------
btfss PortB,0 ; Кнопка "Переключение режимов" нажата
; или отжата ?
goto INKEY ; Если нажата, то переход на опрос клавиатуры.
; Если отжата, то программа исполняется далее.
;--------------------------------------------------------------------------------
; Опрос кнопки "Установка порогов".
;--------------------------------------------------------------------------------
btfsc PortB,1 ; Кнопка"Установка порогов" нажата или отжата?
goto $+2 ; Если отжата, то обход перехода в режим
; установки порогов.
goto UST_POROG ; Если нажата, то ПЕРЕХОД В РЕЖИМ УСТАНОВКИ
; ПОРОГОВ.
;================================================================================
; "Добыча" результатов измерения и обеспечение необходимой скорости смены
; показаний.
;================================================================================
call PAUSE_UI ; Задержка.
;----> Возврат по стеку из ПП PAUSE_UI.
;================================================================================
; Проверка превышения порогов.
;================================================================================
call PROV_U_I ; Переход в ПП проверки превышения/нет
; порогов.
;----> Возврат по стеку из ПП PROV_U_I.
;================================================================================
; 2/10 преобразование ранее "добытого" результата измерения напряжения и тока.
;================================================================================
call BIN2_10_U ; Вызов ПП 2/10 преобразования (для U).
call BIN2_10_I ; Вызов ПП 2/10 преобразования (для I).
;================================================================================
; Вывод на индикацию, во 1-ю строку, фиксированной надписи " РЕЖИМ СЛЕЖЕНИЯ ".
;================================================================================
movlw b'10000000' ; Установка курсора в крайнее
call ENTER_BF ; левое знакоместо 1-й строки.
movlw .16 ;
movwf Count ;
movf Count,W ;
sublw .16 ; Аналогично, только
call TEXT_4 ; для TEXT_4.
bsf PortC,RS ;
call ENTER_BF ;
decfsz Count,F ;
goto $-6 ;
;================================================================================
; Вывод на индикацию, во 2-ю строку, фиксированной надписи
; "U= в I= а" и результатов измерения U/I.
;================================================================================
call DISPLAY_UI ; Вывод на индикацию оного.
;----> Возврат по стеку из ПП DISPLAY_UI.
;================================================================================
; Окончание цикла программы (для сценария "ЗАЩИТА ВКЛЮЧЕНА").
;--------------------------------------------------------------------------------
bsf PortA,2 ; ОТКРЫТИЕ ИЛИ ПОДТВЕРЖДЕНИЕ ОТКРЫТИЯ
; ТРАНЗИСТОРА.
6
goto KOL_MOZALO ; Переход на начало следующего цикла слежения.
..................................
Тоже ничего особо сложного нет, а вот далее, будет посложнее.

Опросы кнопок "Переключение режимов" и "Установка порогов" - само собой


разумеющееся, так как нужно обеспечить управляемость.
"Противодребезгов" и ожиданий отжатия кнопок также нет, так как это есть в ПП
INKEY и ПП UST_POROG.
Смысл всей этой "свистопляски" заключается в том, чтобы не на словах, а на деле
обеспечить чередование результатов превышения порогов и параметров защиты.
Поэтому я и "сваял" ПП PARAMETR, и "врезал" ее в кольцо цикла ПП PROV_U_I.
А чтобы обеспечить не "реактивный, визуальный свист", а "человеческий вид
результатов жизнедеятельности этой штуковины" (в том смысле, чтобы картинки не
мелькали быстро), я "поставил оба этих безобразия на счетчики" (рекетиров вспомнил.
Просьба не путать).
В результате этого, любая из этих процедур отрабатывается за 20 циклов.
Их количество, естественно, можно изменить на свой вкус (это влияет на скорость
смены картинок). Нет проблем.
По своей сути, ПП PARAMETR это то же самое, что и ПП PROV_U_I, только в 1-й
строке дисплея надпись другая, а во 2-ю строку выводятся не результаты превышения
порогов защиты, а параметры защиты (текущие значения порогов, считанные из
EEPROM-памяти данных ПИКа).
Это выглядит так:
..................................
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; ПП ПРОВЕРКИ ПРЕВЫШЕНИЯ/НЕ ПРЕВЫШЕНИЯ ПОРОГОВ.
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
PROV_U_I movlw .20 ; Задание количества отрабатываемых
movwf Temp ; циклов ("ставятся на счетчик").

SNOVA_1 bsf IntCon,7 ; РАЗРЕШЕНИЕ ПРЕРЫВАНИЙ.


;--------------------------------------------------------------------------------
; Проверка наличия/отсутствия признаков срабатывания защиты
; (малое кольцо проверки).
;--------------------------------------------------------------------------------
btfsc Flag,5 ; Защита по U сработала или нет ?
goto $+4 ; Если сработала, то ПП проверки

7
; отрабатывается далее.
btfsc Flag,4 ; Если не сработала, то защита по I сработала
; или нет ?
goto $+2 ; Если сработала, то ПП проверки
; отрабатывается далее.
return ; Если защита по U и по I не сработала,
; то возврат по стеку.
;================================================================================
; "Добыча" результатов измерения и обеспечение
; необходимой скорости смены показаний.
;================================================================================
bcf PortA,2 ; ТРАНЗИСТОР ЗАКРЫВАЕТСЯ.
call PAUSE_UI ; Задержка.
;----> Возврат по стеку из ПП PAUSE_UI.
bcf IntCon,7 ; ЗАПРЕТ ПРЕРЫВАНИЙ.
;WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
; Работа с порогом защиты по напряжению.
;WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
; Вычисление величины превышения порога защиты по напряжению.
;--------------------------------------------------------------------------------
movf Porog_U,W ; Porog_U -> W.
subwf Mem_UL,W ; Mem_UL - Porog_U = ... (Результат -> W).

btfsc Status,C ; Результат вычитания "+"/=0 или "-" ?


goto $+3 ; Если "+"/=0 (порог превышен), то блокировки
; (нулем) результата вычисления нет.
clrf Temp_UL ; Если "-" (порог не превышен), то блокировка
goto $+2 ; (нулем) результата вычисления есть.

call UMN_4U ; Умножение на 4.


;----> Возврат по стеку из ПП UMN_4U.
;WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
; Работа с порогом защиты по току.
;WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
; Вычисление величины превышения порога защиты по току.
;--------------------------------------------------------------------------------
movf Porog_I,W ;
subwf Mem_IL,W ;
btfsc Status,C ;
goto $+3 ; Аналогично,
clrf Temp_IL ; только для тока.
goto $+2 ;

call UMN_4I ; Умножение на 4.


;----> Возврат по стеку из ПП UMN_4I.
;================================================================================
; 2/10 преобразование результата превышения порога защиты
; по напряжению и по току.
;================================================================================
call BIN2_10_U ; Вызов ПП 2/10 преобразования (для U).
call BIN2_10_I ; Вызов ПП 2/10 преобразования (для I).
;================================================================================
; Вывод на индикацию, во 1-ю строку, фиксированной надписи "Превышение Uп/Iп".
;================================================================================
movlw b'10000000' ; Установка курсора в крайнее
call ENTER_BF ; левое знакоместо 1-й строки.
movlw .16 ;
movwf Count ;
movf Count,W ;
sublw .16 ; Аналогично, только
call TEXT_3 ; для TEXT_3.
bsf PortC,RS ;
call ENTER_BF ;
decfsz Count,F ;
goto $-6 ;
;================================================================================
8
; Вывод на индикацию, во 2-ю строку, фиксированной надписи "U= в I= а"
; и результатов вычисления величин превышения порогов защиты по U/I.
;================================================================================
call DISPLAY_UI ; Вывод на индикацию оного.
;----> Возврат по стеку из ПП DISPLAY_UI.
;================================================================================
; Опрос кнопки "Переключение режимов".
;--------------------------------------------------------------------------------
btfss PortB,0 ; Кнопка "Переключение режимов" нажата
; или отжата ?
goto INKEY ; Если нажата, то переход на опрос клавиатуры.
; Если отжата, то программа исполняется далее.
;--------------------------------------------------------------------------------
; Опрос кнопки "Установка порогов".
;--------------------------------------------------------------------------------
btfsc PortB,1 ;Кнопка "Установка порогов" нажата или отжата?
goto $+2 ; Если отжата, то обход перехода в режим
; установки порогов.
goto UST_POROG ; Если нажата, то ПЕРЕХОД В РЕЖИМ УСТАНОВКИ
; ПОРОГОВ.
;--------------------------------------------------------------------------------
; Анализ содержимого указателя количества циклов.
;--------------------------------------------------------------------------------
decfsz Temp,F ; Если заданное количество циклов не
goto SNOVA_1 ; отработано, то отрабатывается следующий цикл
; Если все циклы отработаны, то
; программа исполняется далее.

;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
; ПП ПАРАМЕТРОВ ЗАЩИТЫ.
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
PARAMETR movlw .20 ; Задание количества отрабатываемых
movwf Temp ; циклов ("ставятся на счетчик").
;================================================================================
; Вычисление параметров защиты.
;================================================================================
SNOVA_2 call PARAM_Z ; Переход в ПП вычисления параметров защиты.
;----> Возврат по стеку из ПП PARAM_Z.
;================================================================================
; 2/10 преобразование результата превышения порога защиты
; по напряжению и по току.
;================================================================================
call BIN2_10_U ; Вызов ПП 2/10 преобразования (для U).
call BIN2_10_I ; Вызов ПП 2/10 преобразования (для I).
;================================================================================
; Вывод на индикацию, в 1-ю строку, фиксированной надписи "ПАРАМЕТРЫ ЗАЩИТЫ".
;================================================================================
movlw b'10000000' ; Установка курсора в крайнее
call ENTER_BF ; левое знакоместо 1-й строки.
movlw .16 ;
movwf Count ;
movf Count,W ;
sublw .16 ; Аналогично, только
call TEXT_5 ; для TEXT_5.
bsf PortC,RS ;
call ENTER_BF ;
decfsz Count,F ;
goto $-6 ;
;================================================================================
; Вывод на индикацию, во 2-ю строку, фиксированной надписи "U= в I= а"
; и результатов вычисления величин превышения порогов защиты по U/I.
;================================================================================
call DISPLAY_UI ; Вывод на индикацию оного.
;----> Возврат по стеку из ПП DISPLAY_UI.
;--------------------------------------------------------------------------------
; Опрос кнопки "Переключение режимов".
9
;--------------------------------------------------------------------------------
btfss PortB,0 ; Кнопка "Переключение режимов" нажата
; или отжата ?
goto INKEY ; Если нажата, то переход на опрос клавиатуры.
; Если отжата, то программа исполняется далее.
;--------------------------------------------------------------------------------
; Опрос кнопки "Установка порогов".
;--------------------------------------------------------------------------------
btfsc PortB,1 ;Кнопка "Установка порогов" нажата или отжата?
goto $+2 ; Если отжата, то обход перехода в режим
; установки порогов.
goto UST_POROG ; Если нажата, то ПЕРЕХОД В РЕЖИМ УСТАНОВКИ
; ПОРОГОВ.
;--------------------------------------------------------------------------------
; Анализ содержимого указателя количества циклов.
;--------------------------------------------------------------------------------
decfsz Temp,F ; Если заданное количество циклов не
goto SNOVA_2 ; отработано, то отрабатывается следующий цикл
; Если все циклы отработаны, то
; программа исполняется далее.
goto PROV_U_I ; Переход на новый цикл проверки превышения
; порогов U/I.
..................................
..................................

;================================================================================
; ПП вычисления параметров защиты.
;================================================================================
PARAM_Z call PAUSE_UI ; Задержка.
;----> Возврат по стеку из ПП PAUSE_UI.
;--------------------------------------------------------------------------------
; Чтение порогов из EEPROM.
;--------------------------------------------------------------------------------
bsf Status,RP1 ;
bcf Status,RP0 ;
movlw 1 ;
movwf EEAdr ;
bsf Status,RP0 ; Чтение числового
bcf EECon1,7 ; значения порога U
bsf EECon1,0 ; (из ячейки с адресом 01h)
bcf Status,RP0 ; и копирование его
movf EEData,W ; в регистр Porog_U.
movwf Porog_U ;

movlw 2 ;
movwf EEAdr ;
bsf Status,RP0 ; Чтение числового
bcf EECon1,7 ; значения порога I
bsf EECon1,0 ; (из ячейки с адресом 02h)
bcf Status,RP0 ; и копирование его
movf EEData,W ; в регистр Porog_I.
movwf Porog_I ;
bcf Status,RP1 ;
;--------------------------------------------------------------------------------
; Определение истинной величины установленного порога защиты по напряжению,
; с расчетом на дальнейшую обработку результата в ПП BIN2_10_U.
;--------------------------------------------------------------------------------
movf Porog_U,W ; Porog_U -> W.
call UMN_4U ; Умножение на 4.
;----> Возврат по стеку из ПП UMN_4U.
movlw 4 ; Корректирующая
addwf Temp_UL,F ; поправка (в данном случае, 12х4+4=52).
;--------------------------------------------------------------------------------
; Определение истинной величины установленного порога защиты по току,
; с расчетом на дальнейшую обработку результата в ПП BIN2_10_I.
;--------------------------------------------------------------------------------
10
movf Porog_I,W ; Porog_I -> W.
call UMN_4I ; Умножение на 4.
;----> Возврат по стеку из ПП UMN_4I.
movlw 4 ; Корректирующая
addwf Temp_IL,F ; поправка (в данном случае, 12х4+4=52).

return ; Возврат по стеку.


;================================================================================
; Умножение числового значения Temp_UH/Temp_UL на 4.
;================================================================================
UMN_4U movwf Temp_UL ; Копирование разницы в Temp_UL.
clrf Temp_UH ; Temp_UH = 0.

bcf Status,C ; C = 0.
rlf Temp_UL,F ; 1-й сдвиг влево содержимого
rlf Temp_UH,F ; Temp_UH/Temp_UL.
bcf Status,C ; C = 0.
rlf Temp_UL,F ; 2-й сдвиг влево содержимого
rlf Temp_UH,F ; Temp_UH/Temp_UL.

return ; Возврат по стеку.


;================================================================================
; Умножение числового значения Temp_I1H/Temp_I1L на 4.
;================================================================================
UMN_4I movwf Temp_IL ; Копирование разницы в Temp_IL.
clrf Temp_IH ; Temp_IH = 0.

bcf Status,C ; C = 0.
rlf Temp_IL,F ; 1-й сдвиг влево содержимого
rlf Temp_IH,F ; Temp_IH/Temp_IL.
bcf Status,C ; C = 0.
rlf Temp_IL,F ; 2-й сдвиг влево содержимого
rlf Temp_IH,F ; Temp_IH/Temp_IL.

return ; Возврат по стеку.


..................................

Необходимость введения корректирующей поправки обусловлена погрешностью в 4


квантовки.
Сравните приведенный выше текст с рис. 11, и я думаю, что проблем с "въездом" в
оное не будет.

Далее, следует то, что "ваялось с нуля" (новый режим работы) - ПП задания порогов
с названием UST_POROG (см. рис. 12).

11
Естественно, что сразу же на входе в эту ПП, транзистор нужно закрыть (упреждающе
отключить нагрузку от блока питания), а то ведь, в ходе "экспериментов" с порогами,
"и до беды не далеко".
Уходить в прерывания тоже не нужно, так как обрабатывается не результат измерения,
а то, что считывается из EEPROM-памяти данных ПИКа (значения текущих порогов).
Для порядка, по умолчанию, имеет место быть подготовка установки маркера на
пороге U.
Но можно и на пороге I. Это кому как нравится.
Далее, обязательно нужно отработать "противодребезг" и ожидание отжатия кнопки, так
как переход в ПП UST_POROG производится без них.
После этого, можно, как говорится, со спокойной душой и чистой совестью, вычислить
параметры защиты, обработать их, и вывести на индикацию результаты.
Далее, с целью обеспечения возможности выхода из процедуры, нужно опросить
кнопку "Переключение режимов".
Примечание: это единственный способ выхода из процедуры задания порогов.
Если кнопка "Переключение режимов" нажата, то прежде чем выйти из процедуры
задания порогов (в ПП INKEY), нужно отработать "противодребезг" и ожидание отжатия
кнопки, так как в ПП INKEY нужно войти с отжатой кнопкой.
Вопрос: "Почему"?
Ответ: для того, чтобы не допустить смены режима работы на противоположный.
Из какого режима произошел "уход" в ПП задания порогов (защита выключена или
защита включена), в такой режим, после задания порогов, и должен произойти возврат.

12
После опроса кнопки "Переключение режимов", следует опрос кнопки "Установка
порогов".
После вхождения рабочей точки программы в ПП задания порогов, функциональность
кнопки "Установка порогов" меняется.
А именно, теперь, с ее помощью, можно переместить маркер с порога U на порог I и
наоборот.
То есть, выбрать тот порог, который подлежит изменению.
Так как состояний маркера всего два, то организуется банальный триггер со счетным
входом.
Но перед этим, нужно отработать "противодребезг" и ожидание отжатия кнопки
"Установка порогов".
В зависимости от того, каково именно будет состояние триггера (вернее, бита с №0),
будет отработана одна из двух процедур:
- либо процедура установки порога U,
- либо процедура установки порога I.
На рис. 12, я не стал "расписывать" обе эти процедуры, так как они аналогичны.
"Расписал" только процедуру установки порога I.
Сначала, взамен символа "=", относящегося к порогу I, на индикацию выводится
маркер (символ активности).
Как только это произойдет, так сразу же после этого, кнопки "+" и "-" будут
"обслуживать" порог I.
Далее, производится последовательный опрос кнопок "+" и "-".
Процедуры этих опросов одинаковы и ничего особо сложного в них нет.
Разница только в инкременте (для кнопки "+") и декременте (для кнопки "-"), а также
и в адресации к соответствующим ячейкам EEPROM-памяти данных ПИКа.
То есть, после отжатия кнопки, в любом из этих случаев, измененный порог
записывается в соответствующую ячейку EEPROM- памяти данных ПИКа.
В конечном итоге, "все сходится в одну точку", после чего à "закольцовка" на
следующий цикл установки порогов.
Эти "витки будут мотаться" до тех пор, пока не будет нажата кнопка "Переключение
режимов".
После ее отжатия, произойдет выход, из ПП задания порогов, в тот режим работы, из
которого произошел "уход" в ПП задания порогов.
Программно, это выглядит так:
..................................
;PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
; ПП УСТАНОВКИ ПОРОГОВ.
;PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
UST_POROG bcf PortA,2 ; ТРАНЗИСТОР ЗАКРЫВАЕТСЯ.
bcf IntCon,7 ; ЗАПРЕТ ПРЕРЫВАНИЙ.
clrf Temp_1 ; Указатель порогов, по умолчанию,
; устанавливается на пороге U.
;--------------------------------------------------------------------------------
; Противодребезговая задержка.
;--------------------------------------------------------------------------------
call PAUSE_UI ; Переход в ПП PAUSE_UI.
;----> Возврат по стеку из ПП PAUSE_UI.
;--------------------------------------------------------------------------------
; Ожидание отжатия кнопки.
;--------------------------------------------------------------------------------
btfss PortB,1 ;Кнопка "Установка порогов" нажата или отжата?
goto $-1 ; Если нажата, то ожидание отжатия.
;================================================================================
; Вычисление параметров защиты.
;================================================================================
USTANOVKA call PARAM_Z ; После отжатия, переход в ПП вычисления
; параметров защиты.
;----> Возврат по стеку из ПП PARAM_Z.
;================================================================================
; 2/10 преобразование результата превышения порога защиты
; по напряжению и по току.
;================================================================================
13
call BIN2_10_U ; Вызов ПП 2/10 преобразования (для U).
call BIN2_10_I ; Вызов ПП 2/10 преобразования (для I).
;================================================================================
; Вывод на индикацию, в 1-ю строку, фиксированной надписи "Задание порогов".
;================================================================================
movlw b'10000000' ; Установка курсора в крайнее
call ENTER_BF ; левое знакоместо 1-й строки.
movlw .16 ;
movwf Count ;
movf Count,W ;
sublw .16 ; Аналогично, только
call TEXT_6 ; для TEXT_6.
bsf PortC,RS ;
call ENTER_BF ;
decfsz Count,F ;
goto $-6 ;
;================================================================================
; Вывод на индикацию, во 2-ю строку, фиксированной надписи "U= в I= а"
; и результатов вычисления величин превышения порогов защиты по U/I.
;================================================================================
call DISPLAY_UI ; Вывод на индикацию оного.
;----> Возврат по стеку из ПП DISPLAY_UI.
;================================================================================
; Опрос кнопки "Переключение режимов".
;--------------------------------------------------------------------------------
btfsc PortB,0 ; Кнопка "Переключение режимов" нажата
; или отжата ?
goto $+5 ; Если отжата, то переход на опрос кнопки
; "Установка порогов".
; Если нажата, то программа исполняется далее.
;--------------------------------------------------------------------------------
; Противодребезговая задержка.
;--------------------------------------------------------------------------------
call PAUSE_UI ; Переход в ПП PAUSE_UI.
;----> Возврат по стеку из ПП PAUSE_UI.
;--------------------------------------------------------------------------------
; Ожидание отжатия кнопки.
;--------------------------------------------------------------------------------
btfss PortB,0 ; Кнопка "Переключение режимов" нажата
; или отжата ?
goto $-1 ; Если нажата, то ожидание отжатия.
goto INKEY ; После отжатия, выход из режима.
;--------------------------------------------------------------------------------
; Опрос кнопки "Установка порогов".
;--------------------------------------------------------------------------------
btfsc PortB,1 ;Кнопка "Установка порогов" нажата или отжата?
goto $+5 ;Если отжата, то обход и инкремента Temp_1 нет
;--------------------------------------------------------------------------------
; Противодребезговая задержка.
;--------------------------------------------------------------------------------
call PAUSE_UI ; Переход в ПП PAUSE_UI.
;----> Возврат по стеку из ПП PAUSE_UI.
;--------------------------------------------------------------------------------
; Ожидание отжатия кнопки.
;--------------------------------------------------------------------------------
btfss PortB,1 ;Кнопка "Установка порогов" нажата или отжата?
goto $-1 ; Если нажата, то ожидание отжатия.
incf Temp_1,F ; После отжатия, смена состояния указателя
; порогов (Temp_1 + 1 = ...).
;--------------------------------------------------------------------------------
; Анализ содержимого указателя порогов
; (что будем изменять: Porog_U или Porog_I ?).
;--------------------------------------------------------------------------------
btfss Temp_1,0 ; Что в бите №0 указателя порогов ?
goto UST_POROG_U ; Если 0, то активна установка порога U.
; Если 1, то активна установка порога I.
14
;IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
; Установка порога защиты по I (изменение Porog_I).
;IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
; Задание адреса знакоместа, с которого начнется вывод на индикацию.
;--------------------------------------------------------------------------------
movlw b'11001010' ;
movwf PortB ; 11-е знакоместо. Адрес 0Ah.
call ENTER_BF ;
;--------------------------------------------------------------------------------
; Вывод на индикацию символа активности.
;--------------------------------------------------------------------------------
movlw 0DCh ;
movwf PortB ; Вывод на индикацию, взамен символу "=",
bsf PortC,RS ; символа активности ">|".
call ENTER_BF ;
;================================================================================
; РАБОТА С КНОПКОЙ "+".
;================================================================================
btfsc PortB,2 ; Кнопка "+" нажата или отжата ?
goto KN_MINUS ; Если отжата, то переход на работу
; с кнопкой "-".
; Если нажата, то программа исполняется далее.
;--------------------------------------------------------------------------------
; Противодребезговая задержка.
;--------------------------------------------------------------------------------
call PAUSE_UI ; Переход в ПП PAUSE_UI.
;----> Возврат по стеку из ПП PAUSE_UI.
;--------------------------------------------------------------------------------
; Ожидание отжатия кнопки.
;--------------------------------------------------------------------------------
btfss PortB,2 ; Кнопка "+" нажата или отжата ?
goto $-1 ; Если нажата, то ожидание отжатия.
;--------------------------------------------------------------------------------
; Изменение значения Porog_I на +1.
;--------------------------------------------------------------------------------
incf Porog_I,F ; После отжатия, Porog_I + 1 = ...
;--------------------------------------------------------------------------------
; Запись, в EEPROM-память ПИКа, измененного значения Porog_I.
;--------------------------------------------------------------------------------
call WRITE_I ; Переход в ПП записи порога тока.
;----> Возврат по стеку из ПП WRITE_I.
goto USTANOVKA ; Переход на следующий цикл
; установки порогов.
;================================================================================
; РАБОТА С КНОПКОЙ "-".
;================================================================================
KN_MINUS btfsc PortB,3 ; Кнопка "-" нажата или отжата ?
goto USTANOVKA ; Если отжата, то переход на следующий цикл
; установки порогов.
; Если нажата, то программа исполняется далее.
;--------------------------------------------------------------------------------
; Противодребезговая задержка.
;--------------------------------------------------------------------------------
call PAUSE_UI ; Переход в ПП PAUSE_UI.
;----> Возврат по стеку из ПП PAUSE_UI.
;--------------------------------------------------------------------------------
; Ожидание отжатия кнопки.
;--------------------------------------------------------------------------------
btfss PortB,3 ; Кнопка "-" нажата или отжата ?
goto $-1 ; Если нажата, то ожидание отжатия.
;--------------------------------------------------------------------------------
; Изменение значения Porog_I на -1.
;--------------------------------------------------------------------------------
decf Porog_I,F ; После отжатия, Porog_I - 1.
;--------------------------------------------------------------------------------
; Запись, в EEPROM-память ПИКа, измененного значения Porog_I.
15
;--------------------------------------------------------------------------------
call WRITE_I ; Переход в ПП записи порога тока.
;----> Возврат по стеку из ПП WRITE_I.
goto USTANOVKA ; Переход на следующий цикл
; установки порогов.
;UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
; Установка порога защиты по U (изменение Porog_U).
;UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
; Задание адреса знакоместа, с которого начнется вывод на индикацию.
;--------------------------------------------------------------------------------
UST_POROG_U movlw b'11000001' ;
movwf PortB ; 2-е знакоместо. Адрес 01h.
call ENTER_BF ;
;--------------------------------------------------------------------------------
; Вывод на индикацию символа активности.
;--------------------------------------------------------------------------------
movlw 0DCh ;
movwf PortB ; Вывод на индикацию, взамен символу "=",
bsf PortC,RS ; символа активности ">|".
call ENTER_BF ;
;================================================================================
; РАБОТА С КНОПКОЙ "+".
;================================================================================
btfsc PortB,2 ; Кнопка "+" нажата или отжата ?
goto KN_MINUS_1 ; Если отжата, то переход на работу
; с кнопкой "-".
; Если нажата, то программа исполняется далее.
;--------------------------------------------------------------------------------
; Противодребезговая задержка.
;--------------------------------------------------------------------------------
call PAUSE_UI ; Переход в ПП PAUSE_UI.
;----> Возврат по стеку из ПП PAUSE_UI.
;-------------------------------------------------------
; Ожидание отжатия кнопки.
;-------------------------------------------------------
btfss PortB,2 ; Кнопка "+" нажата или отжата ?
goto $-1 ; Если нажата, то ожидание отжатия.
;--------------------------------------------------------------------------------
; Изменение значения Porog_U на +1.
;--------------------------------------------------------------------------------
incf Porog_U,F ; Если нажата, то Porog_U + 1 = ...
;--------------------------------------------------------------------------------
; Запись, в EEPROM-память ПИКа, измененного значения Porog_U.
;--------------------------------------------------------------------------------
call WRITE_U ; Переход в ПП записи порога напряжения.
;----> Возврат по стеку из ПП WRITE_U.
goto USTANOVKA ; Переход на следующий цикл
; установки порогов.
;================================================================================
; РАБОТА С КНОПКОЙ "-".
;================================================================================
KN_MINUS_1 btfsc PortB,3 ; Кнопка "-" нажата или отжата ?
goto USTANOVKA ; Если отжата, то переход на следующий цикл
; установки порогов.
; Если нажата, то программа исполняется далее.
;--------------------------------------------------------------------------------
; Противодребезговая задержка.
;--------------------------------------------------------------------------------
call PAUSE_UI ; Переход в ПП PAUSE_UI.
;----> Возврат по стеку из ПП PAUSE_UI.
;--------------------------------------------------------------------------------
; Ожидание отжатия кнопки.
;--------------------------------------------------------------------------------
btfss PortB,3 ; Кнопка "-" нажата или отжата ?
goto $-1 ; Если нажата, то ожидание отжатия.
;--------------------------------------------------------------------------------
16
; Изменение значения Porog_U на -1.
;--------------------------------------------------------------------------------
decf Porog_U,F ; Если нажата, то Porog_U - 1.
;--------------------------------------------------------------------------------
; Запись, в EEPROM-память ПИКа, измененного значения Porog_U.
;--------------------------------------------------------------------------------
call WRITE_U ; Переход в ПП записи порога напряжения.
;----> Возврат по стеку из ПП WRITE_U.
goto USTANOVKA ; Переход на следующий цикл
; установки порогов.
;UIUIUIUIUIUIUIUIUIUIUIUIUIUIUIUIUIUIUIUIUIUIUIUIUIUIUIUIUIUIUIUIUIUIUIUIUIUIUIUI
..................................
..................................
;================================================================================
; ПП записи значения порога U.
;================================================================================
WRITE_U bsf Status,RP1 ; Переход
bcf Status,RP0 ; во 2-й банк.
movlw 1 ; Выбор ячейки EEPROM
movwf EEAdr ; с адресом 01h.
movf Porog_U,W ;
movwf EEData ; Porog_U -> 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 ; Возврат по стеку.
;================================================================================
; ПП записи значения порога I.
;================================================================================
WRITE_I bsf Status,RP1 ; Переход
bcf Status,RP0 ; во 2-й банк.
movlw 2 ; Выбор ячейки EEPROM
movwf EEAdr ; с адресом 02h.
movf Porog_I,W ;
movwf EEData ; Porog_I -> 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 ; Возврат по стеку.
;================================================================================
..................................

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

Сказанное выше, реализовано в программе BP_3.asm (прилагается).


Желаю Вам приятного знакомства с ней и эффективного ее "оплодотворения".
А там, глядишь, "детишки пойдут. Мальчики, девочки …"
Это есть основа сохранения вида.
Ну а я "поковылял генерировать" дальше.

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

18