Организация
режима установки порогов пользователем, с автоматическим сохранением
измененных порогов в EEPROM-памяти данных ПИКа (черновик №3).
1
Получилось вот что:
2
Эти две картинки будут последовательно чередоваться "до посинения" (если "бяка" не
устранена).
Чтобы "прекратить это безобразие" и автоматически вернуться в рабочий подрежим
режима включенной защиты, нужно либо понизить выходное напряжение блока питания,
либо повысить порог защиты по напряжению.
С первым случаем все ясно, а во втором случае, нужно переключиться в режим
установки порогов.
Для этого нужно нажать и отпустить кнопку "Установка порогов".
После этого, будет наблюдаться то, что Вы видите на рис. 5.
Под надписью "Задание порогов", выводятся текущие параметры защиты.
Обратите внимание на маркер в виде стрелки, упирающейся в вертикальную линию
(вместо него можно применить любой из символов таблицы знакогенератора ЖК-
модуля, который Вам больше по душе).
Этот символ выводится взамен символа "=", и он помечает активный порог.
То есть, тот порог, который, в дальнейшем, будет изменяться пользователем.
Сразу же после перехода в режим установки порогов, по умолчанию, маркер
автоматически (программно) выставляется на пороге напряжения (см. рис. 5), но его
можно и "перебазировать", нажав и отпустив все ту же кнопку "Установка порогов"
(см. рис. 4).
Если ее последовательно нажимать несколько раз, то маркер будет "скакать" между
порогами U и I.
На какой порог поставите маркер, тот порог и будет, в дальнейшем, изменяться.
Для того чтобы изменить значение того или иного порога, нужно нажать/отпустить
кнопку либо "+1", либо "-1" (см. рис. 6, 7, 8).
Каждая такая "манипуляция" либо увеличивает на 4 квантовки (шаг установки)
значение текущего порога (кнопка "+1"), либо уменьшает на 4 квантовки значение того
текущего порога (кнопка "-1"), на котором выставлен маркер.
Сразу же после каждого отжатия любой из этих кнопок, происходит автоматическая
запись соответствующего, "нового" порога, в EEPROM-память данных ПИКа.
Примечание: на время нажатия любой кнопки клавиатуры, "жизнь замирает". Все
рабочие действия производятся сразу же после отжатия.
После того, как нужный порог (пороги) выставлен, нужно "выйти" из режима установки
порогов.
Для этого, необходимо нажать/отжать кнопку "Переключение режимов".
Возврат происходит не абы как, а именно в тот режим, из которого был осуществлен
"уход" в режим установки порогов.
4
Опрос кнопки "Переключение режимов" перенесен из конца сценария в ее начало
(до, а не после проверки на превышение порогов), и к нему "пришпилен" опрос кнопки
"Установка порогов" (чтобы "все было в куче", так порядка больше).
"Противодребезгов" и ожиданий отжатия кнопок нет, так как это есть в ПП INKEY и
ПП UST_POROG.
..................................
;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
; Сценарий "ЗАЩИТА ВКЛЮЧЕНА".
;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
; Чтение, из EEPROM, текущих порогов U/I.
;================================================================================
; Чтение порога U.
;-----------------------------------
Z_VKL bsf Status,RP1 ; Переход
bcf Status,RP0 ; во 2-й банк.
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).
;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).
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.
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.
Далее, следует то, что "ваялось с нуля" (новый режим работы) - ПП задания порогов
с названием 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
Сие можно считать "предварительным наведением порядка" (элементарную "санитарию"
нужно поддерживать всегда, а иначе будем как чукчи).
Это что-то типа "подметания пола".
До "идеального порядка" ("влажной уборки"), конечно же, пока, далековато, но это
сейчас не является наиглавнейшей потребностью.
Наведу и "идеальный порядок". Но после "разборок с важняками" (расстановка
приоритетов).
Кстати, в процессе этих "разборок", имеет место быть "повышенный уровень мусора"
("лес рубят, щепки летят"), который выгоднее убирать веником, а не тряпкой.
Но и до нее дело дойдет.
Если бы я "не махал этим веником", то количество команд текста программы было бы
гораздо бОльшим, нежели то, которое предлагается Вашему вниманию.
18