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

2-2/13.

Организация подрежима установки пользователем верхнего и нижнего


температурных порогов, с сохранением их значений в EEPROM-памяти данных
ПИКа и организацией "попискивания" (далее, работа на двух страницах памяти
программ).
Так как в предыдущем подразделе были "расписаны" основные положения принципа
корректировки содержимого регистра PCLATH, а также и принцип "раскидывания" текста
программы по двум страницам памяти программ, то останавливаться на этом принципе
я не буду.
Только отмечу то, что вся текущая "PCLATH-игра" происходит строго в пределах
"PCLATH-правил" (а куда деваться? Я не камикадзе).
Если, в связи с этим, будут возникать какие-то "непонимайки", то "милости просим" в
предыдущий подраздел. Читайте. Анализируйте. Сверяйтесь. Делайте выводы.
В программе BP_9.asm, которая прилагается, результат этого "раскидывания", в общем
виде, выглядит так:

"ШАПКА"
....................................
....................................
;11111111111111111111111111111111111111111111111111111111111111111111111111111111
; 1-я СТРАНИЦА ПАМЯТИ ПРОГРАММ.
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
; ПОДПРОГРАММА ПРЕРЫВАНИЯ. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
....................................
....................................
;################################################################################
; ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ. ###############################################
;################################################################################
....................................
....................................
;################################################################################
; КОНЕЦ ВЕРХНЕЙ "ОБСЛУГИ" 1-й СТРАНИЦЫ. #########################################
;################################################################################
....................................
.................................... "ОСНОВНОЕ ТЕЛО" ПРОГРАММЫ, "ЛЕЖАЩЕЕ" НА
.................................... 1-й СТРАНИЦЕ.
....................................
;################################################################################
; НИЖНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ. ###############################################
;################################################################################
....................................
....................................
;################################################################################
; КОНЕЦ НИЖНЕЙ "ОБСЛУГИ" 1-й СТРАНИЦЫ. ##########################################
;################################################################################
org 801h ; Заполнение 2-й страницы памяти программ
; начинается с 2050-й позиции (см. окно ROM).
....................................
.................................... ЗДЕСЬ НАХОДИТСЯ "ЕФРЕЙТОРСКИЙ СУПЕРЗАЗОРИЩЕ"
.................................... УМЕНЬШАЮЩИЙСЯ ПО МЕРЕ РОСТА "МАССЫ"
ТОГО, .................................... ЧТО ДОБАВЛЯЕТСЯ НА 1-ю СТРАНИЦУ.

;22222222222222222222222222222222222222222222222222222222222222222222222222222222
; 2-я СТРАНИЦА ПАМЯТИ ПРОГРАММ.
;################################################################################
; ВЕРХНЯЯ "ОБСЛУГА" 2-й СТРАНИЦЫ. ###############################################
;################################################################################
....................................
....................................
;################################################################################
; КОНЕЦ ВЕРХНЕЙ "ОБСЛУГИ" 2-й СТРАНИЦЫ. #########################################
;################################################################################

1
....................................
.................................... "ОСНОВНОЕ ТЕЛО" ПРОГРАММЫ, "ЛЕЖАЩЕЕ" НА
.................................... 2-й СТРАНИЦЕ.
....................................
;################################################################################
; НИЖНЯЯ "ОБСЛУГА" 2-й СТРАНИЦЫ. ###############################################
;################################################################################
....................................
....................................
;################################################################################
; КОНЕЦ НИЖНЕЙ "ОБСЛУГИ" 2-й СТРАНИЦЫ. ##########################################
;################################################################################
end ; Конец программы.

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

Перехожу к "температурным наворотам".


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

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

Для того чтобы перейти в подрежим установки порогов U/I, нужно нажать
кнопку "Установка порогов", а после появления надписи Задание порогов / Uвольт и
Iампер, отжать ее (в интервале времени "высвечивания" этой надписи).
Для того чтобы перейти в подрежим установки термопорогов, нужно нажать
кнопку "Установка порогов", дождаться, когда надпись Задание порогов / Uвольт и
Iампер сменится на надпись Задание порогов / термозащиты, а затем отжать ее.
Соответственно, в зависимости от этого, после отжатия кнопки "Установка порогов",
будет произведен переход либо на начало сценария установки порогов U/I, либо на
начало сценария установки температурных порогов.

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

Все изменения значений порогов (и U/I, и Т-порогов) запоминаются в EEPROM-


памяти данных ПИКа, и при последующем включении питания, именно они и
будут установлены по умолчанию.

Сценарий установки порогов U/I принципиально не изменился (по сравнению с


программой BP_8.asm), за исключением того, что я убрал из него вывод на индикацию
надписи Задание порогов (перемещена в "верхушку" ПП VIBOR_P. Эта "верхушка"
отрабатывается при "влете" в любой из подрежимов установки порогов. Общая часть)
и организовал короткие "попискивания" (при нажатиях кнопок "+/Да" и "-/Нет").
Плюс, "подрихтовал" комментарии к группе команд, обозначенной как "Блокировка
нулями порога I (U) с числовым значением от .249 и более" (4 принципиально
одинаковые процедуры. Ранее, в их комментариях, была путаница, за которую
извиняюсь).
Так же, как и в подрежиме установки порогов U/I, в подрежиме установки
термопорогов, при кратковременном нажатии кнопки "+/Да" или кнопки "-/Нет", к
текущему значению выбранного температурного порога, либо прибавляется 1, либо из
него вычитается 1 (соответственно), а при долговременном нажатии на них, происходит
либо автоинкремент, либо автодекремент, с частотой примерно 3 – 4
автоинкремента/автодекремента в секунду (если такая частота не нравится, то ее
можно "подрихтовать" путем увеличения/уменьшения времени отработки внутреннего
цикла).
После каждого инкремента/декремента значения выбранного температурного порога, это
значение автоматически записывается в EEPROM-память данных ПИКа, что означает
сами знаете что (на 1-м "витке" организовано соответствующее EEPROM-чтение, с
последующей "раздачей слонов").
Выбор температурного порога, подлежащего изменению, производится при помощи
маркера, внешний вид и принцип установки которого
полностью аналогичен внешнему виду и принципу
установки маркера, использующегося в подрежиме
установки порогов U/I. См. картинку слева.
На этой картинке, Вы видите те температурные
пороги (Т-пороги), которые имеют место быть сразу
же после "прошивки".
Тн - нижний температурный порог.
Тв - верхний температурный порог.

3
В данном случае, ширина петли температурного гистерезиса задана равной 20-ти
градусам (исходная "умолчалка").
Естественно, что в дальнейшем, пользователь может изменить этот "расклад" так, как
сочтёт нужным.
Для этого, нужно перейти в подрежим установки Т-порогов (см. выше).
По умолчанию, маркер выбора Т-порога установлен на нижнем Т-пороге (но можно
выставить и на верхнем. Нет проблем).
Текущая же установка маркера, на том или ином пороге, осуществляется при помощи
нажатия/отжатия все той же кнопки "Установка порогов" (точно так же, как и в
подрежиме установки порогов U/I).
В ходе работы, "вдруг, откуда не возьмись", возник жизненный вопрос: "Каков должен
быть диапазон изменений нижнего и верхнего Т-порогов, ведь, во первых, он
не резиновый, а во-вторых, можно назначить такое, что авторазблокировки
термозащиты никогда не произойдет"?
И в самом деле, если назначить нижним T-порогом, например, 5 градусов, то при
комнатной температуре, ожидаючи авторазблокировки, можно даже матом заругаться.
А что если пользователь перепутает пороги и сделает нижний Т-порог выше верхнего?
Вот смеху-то будет… А кое для кого и слёз.
И при всем этом, однозначно, конструктор будет "крайним" (так устроена человеческая
природа).
Короче, "на горизонте, реально замаячил призрак козла отпущения".
Вывод: так дело совсем не пойдет. Это сильно "драконит" (законная обида).
Конструктор не должен быть "козлом".
Ему по штату не положено быть "козлом".
Ему по штату положены честь и уважение за его нелегкий труд и за лучшие
годы, потраченные не на распитие спиртных напитков и на прочие
приятности, а на "пахоту".
Значит, нужно агрессивно сопротивляться (зря что-ли приобретена профессия
"механизатора широкого профиля и трактор/железный конь даден"?).
То есть, "сильной, тренированной и неумолимой рукой" (про Сталина вспомнил),
необходимо присечь всю эту "температурную вакханалию" к …
Кстати, в конечном итоге, пользователь за это только спасибо скажет.
Сопротивляюсь. С учетом комнатной температуры.
Сопротивление №1.
Нижняя граница нижнего Т-порога = 30 градусов.
Верхняя граница верхнего Т-порога = 95 градусов.
Всё, что находится за этими границами, "транспортируется на Колыму, в Магадан и в
крематорий".
Точка. Сказал "люминий", значит "люминий" (интересно, чем сейчас мой бывший
старшина занимается?). "Приговор обжалованию не подлежит".
Сопротивление №2.
Назначаю верхний Т-порог начальником и выдаю ему статус, дубину, свисток и
хороший оклад.
Инструктаж начальника: статус, дубина, свисток и хороший оклад дадены не за
просто так, а по поводу насущной необходимости их прямого приложения к
конкретному предмету à верхнему Т-порогу.
Чуть что, так свисти, что есть мочи, и дубину применяй, а иначе не будет тебе
никакого оклада, а будет потеря чести и прочих материальных/нематериальных
субстанций.
Понятно? Так точно. Ну и ладушки. Исполняй.
Сопротивление №3.
Для того чтобы верхний Т-порог, грешным делом, не возомнил себя близким/равным
назначенному начальнику (как-никак, а он все-таки верхний), нужно организовать, между
ними, минимальную "дистанцию", и чтобы без фамильярностей, а то ведь только дай волю …
Я задал 5 градусов.
То есть, верхний Т-порог, при любых обстоятельствах, будет находиться выше нижнего
Т-порога, как минимум, на 5 градусов.
Больше 5-ти градусов - милости просим.
Меньше 5-ти градусов - какая тут милость?
4
"Дубиной хрясть и айн-цвай-драй" в район 5-ти градусов (принудительная коррекция
статусов).
На 4-х картинках, расположенных слева, Вы видите
варианты установки Т-порогов в тех случаях, когда
маркер выставлен на нижнем T-пороге.
Обратите внимание на то, что любое изменение
значения нижнего Т-порога приводит к
"автоизменению" значения верхнего Т-порога.
По закону Тв = Тн + 5 градусов.
То есть, при любом изменении значения нижнего
Т-порога, значение верхнего Т-порога всегда будет
больше значения нижнего Т-порога ровно на 5
градусов. На самой верхней и самой нижней
картинках, изображены "крайние случаи".
То есть, диапазон изменений значений нижнего
Т-порога составляет 30 … 90 градусов, а
диапазон изменений значений верхнего Т-порога
составляет 35 … 95 градусов.
"Шаг" изменения - 1 градус.
При всем желании, выйти за эти "границы" просто не
получится. "Железяка" не даст. Алгоритм у нее такой.
Безжалостный (напоминаю про свисток, дубину и
угрозу потери субстанций).
В противоположную сторону - милости просим, а
туда, куда не положено à ни-ни.
Хоть обнажимайся. Даже и "попискивать" ничего не
будет ("тишина и мертвые с косами стоят").
На 2-й и 3-й картинках сверху, изображены
"промежуточные случаи". Естественно, что их гораздо больше, чем два.
Если ширина петли температурного гистерезиса величиной в 5 градусов (естественно,
Цельсия) устраивает пользователя, то и изменять значение верхнего Т-порога не
нужно, так как оно изменяется автоматически.
Ширину петли температурного гистерезиса можно изменить программно.
То есть, можно выставить то его значение, которое
Вы сочтете нужным.
Просто изменяется константа.
Если, после окончания установки нижнего Т-порога,
нужно увеличить ширину петли температурного
гистерезиса, то никакой проблемы в этом нет.
Нужно установить маркер на верхний Т-порог
(нажать/отжать кнопку "Установка порогов"), после
чего, с помощью кнопок "+/Да" и "-/Нет", можно
устанановить ту "ширину", которая требуется.
Несколько вариантов такой установки Вы видите на
картинках слева.
При этом, следует учитывать границы дозволенного.
Например, для нижней картинки, диапазон изменений
значения верхнего Т-порога будет составлять от
52 + 5 = 57 градусов до 95 градусов.
В данном случае, выставить верхний Т-порог ниже
57-ми градусов или выше 95 градусов не получится,
так как "железяка этого не позволит": будет "тормоз
коммунизма" либо на 57-ми, либо на 95-ти градусах.
А от 57 до 95 градусов à милости просим. Нет проблем.
И в этом диапазоне, верхний Т-порог однозначно будет превышать нижний Т-порог.
Алгоритм ПП установки термопорогов такой, что обратное просто исключено.
Таким образом, даже у пользователя, имеющего маниакальное желание сделать из
конструктора "козла отпущения", ничего из этого не получится.

5
Гиблое дело. Шансы - нулевые. Это к вопросу о том, что конструктор совсем не
"козел" ("отпущения" или еще какой-то). Короче, справедливость восторжествовала.
На следующей странице, Вы видите блок-схему подпрограммы выбора порогов (VIBOR_P):

6
7
Если качество картинки Вас не устраивает, то либо увеличьте масштаб, либо
сохраните DOC-файл этого подраздела в виде HTML-файла и поинтересуйтесь
содержимым папки "Часть2-2_13.files".
"Верхушка" ПП VIBOR_P представляет собой общую часть обеих подрежимов выбора
порогов.
То есть, она исполняется в любом случае. Вплоть до ветвления на сценарии.
Если кнопка "Установка порогов" будет отжата во время отработки цикла таймера (во
время "высвечивания" надписи Задание порогов / Uвольт и Iампер), то произойдет
переход в ПП установки порогов U/I (UST_POROG_UI), а если она будет отжата после
окончания цикла отработки таймера (во время "высвечивания" надписи Задание
порогов / Uвольт и Iампер), то произойдет переход в ПП установки термопорогов
(TERMOPOROG).
ПП UST_POROG_UI, по сравнению с тем, что было ранее, изменилась мало.
Даже упростилась. За счет переноса, из нее, надписи Задание порогов / Uвольт и
Iампер, в "верхушку" ПП VIBOR_P.
Плюс, в нее добавлены 4 команды вызова ПП MULTI ("святая, пищальная простота").
Таким образом, в ПП UST_POROG_UI (и в ПП TERMOPOROG тоже), организованы
"одинарные попискивания", которые сопровождают любые изменения значений тех или
иных порогов (и порогов U/I, и термопорогов).
"Одинарное попискивание" потому, что количество "пачек" не задается.
То есть, в каждом цикле, имеет место быть одна-разъединственная "пачка".
По этим "попискиваниям", можно, на слух, оценить как сам факт происходящих
изменений, так и их интенсивность.
Если "граница дозволенного пересечена", то "писк" прекращается, что намекает на
необходимость последующего "жатия" на "инверсную" кнопку.
То есть, в этом случае, нужно либо перейти с кнопки "+/Да" на кнопку "-/Нет", либо
наоборот.
Это зависит от того, какая именно "Т-граница пересечена": верхняя или нижняя.
Например, если речь идет об изменениях значений только нижнего Т-порога, то
"попискивание" прекращается сразу же после "пересечения любой из границ" диапазона
изменений нижнего Т-порога.
Если речь идет об изменениях значений верхнего Т-порога, производимых после
установки значения нижнего Т-порога, то "диапазон попискивания" будет находиться
между Tв = Тн + 5 ("плавающая", нижняя "граница", которая была определена ранее) и
Тв = 95 (фиксированная, верхняя граница).
То есть, чем выше значение Тн, тем Уже границы дозволенного (а заодно и "диапазон
попискивания"), что вполне логично и нормально.
Программно, это выглядит так:
....................................
....................................
;################################################################################
; НАЧАЛО ВЕРХНЕЙ "ОБСЛУГИ" 1-й СТРАНИЦЫ. ########################################
;################################################################################
....................................
....................................
;================================================================================
; Аварийная "пищалка" (мультивибратор, формирующий "пачку" импульсов).
;================================================================================
MULTI movlw .250 ; "Пищать" будем
movwf Reg_2 ; 250 периодов.

bcf PortC,4 ; Установка на выходе защелки RC4 уровня 0.


movlw .50 ; Задание периода
movwf Reg_3 ; (частоты).

decfsz Reg_3,F ; Формирование


goto $-1 ; полупериода.

btfsc PortC,4 ; Если на выходе защелки RC4 уровень 1,


goto $-6 ; то дальнейшая его смена на уровень 0.
decf Reg_2,F ; Если на выходе защелки RC4 уровень 0,

8
; то Reg_2 - 1 = ... и программа
; исполняется далее.
btfsc Status,Z ; Каков результат декремента ?
return ; Если =0, то "пачка" импульсов сформирована
; и выход из "пищалки".
bsf PortC,4 ; Если не=0, то установка на выходе
; защелки RC4 уровня 1.
goto $-.10 ; Переход на формирование следующего периода.
;================================================================================
....................................
....................................
;################################################################################
; КОНЕЦ ВЕРХНЕЙ "ОБСЛУГИ" 1-й СТРАНИЦЫ. #########################################
;################################################################################
....................................
....................................
;PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
;PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
; ПП УСТАНОВКИ ПОРОГОВ (порогов U/I или Т-порогов). PPPPPPPPPPPPPPPPPPPPPPPPPPPPP
;PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
;PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
VIBOR_P bcf PortA,2 ; ТРАНЗИСТОР ЗАКРЫВАЕТСЯ.
bcf IntCon,7 ; ЗАПРЕТ ПРЕРЫВАНИЙ.
clrf Temp_1 ; Указатель U/I порогов, по умолчанию,
; устанавливается на пороге U.
bsf Temp_3,0 ; Указатель Т-порогов, по умолчанию,
; устанавливается на нижнем Т-пороге.
;================================================================================
; Продолжение опроса кнопки "Установка порогов" (ее опрос происходит в другой ПП)
;================================================================================
; Противодребезговая задержка.
;--------------------------------------------------------------------------------
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 .50 ; Задание времени (количества циклов)
movwf Temp ; "высвечивания" надписи "Uвольт и Iампер".
bcf PCLATH,0 ; Выбор
bsf PCLATH,1 ; 3-го блока 1-й страницы.
;--------------------------------------------------------------------------------
; Вывод на индикацию, во 2-ю строку, фиксированной надписи "Uвольт и Iампер".
;--------------------------------------------------------------------------------
SNOVA_3 movlw b'11000000' ; Установка курсора в крайнее
call ENTER_BF ; левое знакоместо 2-й строки.
movlw .16 ;
movwf Count ;
movf Count,W ;
sublw .16 ; Аналогично, только
9
call TEXT_30 ; для TEXT_30.
bsf PortC,RS ;
call ENTER_BF ;
decfsz Count,F ;
goto $-6 ;
;--------------------------------------------------------------------------------
; Пауза между циклами вывода на индикацию надписи "Uвольт и Iампер".
;--------------------------------------------------------------------------------
call PAUSE_UI ; Переход в ПП PAUSE_UI.
;----> Возврат по стеку из ПП PAUSE_UI.
;--------------------------------------------------------------------------------
; Счет циклов.
;--------------------------------------------------------------------------------
btfsc PortB,1 ; Кнопка "Установка порогов" нажата
; или отжата ?
goto UST_POROG_UI; Если отжата, то переход в ПП установки
; порогов U/I.
decfsz Temp,F ; Если нажата, то цикл вывода надписи "Uвольт
goto SNOVA_3 ; и Iампер" повторяется до тех пор, пока
; счетчик не обнулится.
; После этого, программа исполняется далее.
;--------------------------------------------------------------------------------
; Вывод на индикацию, во 2-ю строку, фиксированной надписи " термозащиты ".
;--------------------------------------------------------------------------------
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 ;
;--------------------------------------------------------------------------------
; Опрос кнопки "Установка порогов".
;--------------------------------------------------------------------------------
btfss PortB,1 ; Кнопка "Установка порогов" нажата
; или отжата ?
goto $-1 ; Если нажата, то ожидание отжатия.
; Если отжата, то переход на установку
; Т-порогов.
;********************************************************************************
; ПП УСТАНОВКИ ТЕМПЕРАТУРНЫХ ПОРОГОВ.
;********************************************************************************
; Обеспечение необходимого времени "высвечивания" надписи.
;================================================================================
TERMOPOROG call PAUSE_UI ; Задержка.
;----> Возврат по стеку из ПП PAUSE_UI.
;================================================================================
movlw high TEXT_32; Выбор
movwf PCLATH ; 3-го блока 1-й страницы.
;================================================================================
; Вывод на индикацию, во 2-ю строку, фиксированной надписи "Тн= гр.Тв= гр.".
;================================================================================
movlw b'11000000' ; Установка курсора в крайнее
call ENTER_BF ; левое знакоместо 2-й строки.
movlw .16 ;
movwf Count ;
movf Count,W ;
sublw .16 ; Аналогично, только
call TEXT_32 ; для TEXT_32.
bsf PortC,RS ;
call ENTER_BF ;
decfsz Count,F ;
10
goto $-6 ;
;////////////////////////////////////////////////////////////////////////////////
; РАБОТА С НИЖНИМ Т-ПОРОГОМ.
;////////////////////////////////////////////////////////////////////////////////
; Подготовка к 2/10 преобразованию.
;--------------------------------------------------------------------------------
movf TermoP_L,W ; Нижний Т-порог -> W.
movwf Reg_3 ; и запись результата в Reg_3.
;--------------------------------------------------------------------------------
; 2/10 преобразование (1х2) с перекодировкой результата.
;--------------------------------------------------------------------------------
call BIN_DEC ; 2/10 преобразование и перекодировка, с
; переходами между страницами памяти программ.
;--->Возврат по стеку из ПП BIN_DEC
;--------------------------------------------------------------------------------
; Вывод на индикацию числового значения нижнего Т-порога.
;--------------------------------------------------------------------------------
movlw b'11000011' ;
movwf PortB ; 2-я строка, 4-е знакоместо. Адрес 03h.
call ENTER_BF ;
call IND_TERMO ; Переход в ПП IND_TERMO.
;----> Возврат по стеку из ПП IND_TERMO.
;////////////////////////////////////////////////////////////////////////////////
; РАБОТА С ВЕРХНИМ Т-ПОРОГОМ.
;////////////////////////////////////////////////////////////////////////////////
; Подготовка к 2/10 преобразованию.
;--------------------------------------------------------------------------------
movf TermoP_H,W ; Верхний Т-порог -> W.
movwf Reg_3 ; и запись результата в Reg_3.
;--------------------------------------------------------------------------------
; 2/10 преобразование (1х2) с перекодировкой результата.
;--------------------------------------------------------------------------------
call BIN_DEC ; 2/10 преобразование и перекодировка, с
; переходами между страницами памяти программ.
;--->Возврат по стеку из ПП BIN_DEC
;--------------------------------------------------------------------------------
; Вывод на индикацию числового значения верхнего Т-порога.
;--------------------------------------------------------------------------------
movlw b'11001011' ;
movwf PortB ; 2-я строка, 12-е знакоместо. Адрес 0Ah.
call ENTER_BF ;
call IND_TERMO ; Переход в ПП IND_TERMO.
;----> Возврат по стеку из ПП IND_TERMO.
;////////////////////////////////////////////////////////////////////////////////

;KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
; Опрос клавиатуры.
;KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
; Опрос кнопки "Переключение режимов".
;================================================================================
btfsc PortB,0 ; Кнопка "Переключение режимов" нажата
; или отжата ?
goto $+5 ; Если отжата, то переход на опрос кнопки
; "Установка порогов".
; Если нажата, то программа исполняется далее.
;--------------------------------------------------------------------------------
; Противодребезговая задержка.
;--------------------------------------------------------------------------------
call PAUSE_UI ; Переход в ПП PAUSE_UI.
;----> Возврат по стеку из ПП PAUSE_UI.
;--------------------------------------------------------------------------------
; Ожидание отжатия кнопки.
;--------------------------------------------------------------------------------
btfss PortB,0 ; Кнопка "Переключение режимов" нажата
; или отжата ?
goto $-1 ; Если нажата, то ожидание отжатия.
11
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
; Рабочее действие после отжатия.
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
goto INKEY ; После отжатия, выход из режима.
;================================================================================
; Опрос кнопки "Установка порогов".
;================================================================================
btfsc PortB,1 ; Кнопка "Установка порогов" нажата
; или отжата ?
goto $+5 ; Если отжата, то обход инкремента Temp_1.
; Если нажата, то программа исполняется далее.
;--------------------------------------------------------------------------------
; Противодребезговая задержка.
;--------------------------------------------------------------------------------
call PAUSE_UI ; Переход в ПП PAUSE_UI.
;----> Возврат по стеку из ПП PAUSE_UI.
;--------------------------------------------------------------------------------
; Ожидание отжатия кнопки.
;--------------------------------------------------------------------------------
btfss PortB,1 ; Кнопка "Установка порогов" нажата
; или отжата ?
goto $-1 ; Если нажата, то ожидание отжатия.
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
; Рабочее действие после отжатия.
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
incf Temp_3,F ; Смена состояния указателя порогов
; (Temp_3 + 1 = ...).
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Анализ содержимого указателя порогов
; (что будем изменять: верхний или нижний Т-порог?).
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
btfss Temp_3,0 ; Что в бите №0 указателя порогов ?
goto T_POROG_H ; Если 0, то активна установка
; верхнего Т-порога.
; Если 1, то активна установка
; нижнего Т-порога.
;LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
; Установка нижнего Т-порога.
;LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
; Задание адреса знакоместа, с которого начнется вывод на индикацию.
;--------------------------------------------------------------------------------
movlw b'11000010' ;
movwf PortB ; 2-я строка, 3-е знакоместо. Адрес 02h.
call ENTER_BF ;
;--------------------------------------------------------------------------------
; Вывод на индикацию символа активности (маркера).
;--------------------------------------------------------------------------------
movlw 0DCh ;
movwf PortB ; Вывод на индикацию, взамен символу "=",
bsf PortC,RS ; символа активности ">|".
call ENTER_BF ;
;PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
; РАБОТА С КНОПКОЙ "+".
;PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
btfsc PortB,2 ; Кнопка "+" нажата или отжата ?
goto L_MINUS ; Если отжата, то переход на работу
; с кнопкой "-".
; Если нажата, то программа исполняется далее.
;--------------------------------------------------------------------------------
; Противодребезговая задержка.
;--------------------------------------------------------------------------------
call PAUSE_UI ; Переход в ПП PAUSE_UI.
;----> Возврат по стеку из ПП PAUSE_UI.
;--------------------------------------------------------------------------------
; Ожидание отжатия кнопки с "врезкой", обеспечивающей автоинкремент
; нижнего Т-порога.
12
;--------------------------------------------------------------------------------
call KOHCTAHTA ; Переход в ПП установки времязадающих
; констант.
;----> Возврат по стеку из ПП KOHCTAHTA.
btfsc PortB,2 ; Кнопка "+" нажата или отжата ?
goto L_PLUS ; Если отжата, то автоинкремент
; нижнего Т-порога.
decfsz Reg_2,F ; Если нажата, то отрабатывается задержка, на
goto $-3 ; каждом "витке" которой состояние кнопки "+"
; анализируется.
decfsz Reg_3,F ; После отжатия - выход из задержки.
goto $-5 ;
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
; Рабочее действие после отжатия.
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
L_PLUS incf TermoP_L,F ; Нижний Т-порог + 1 = ...
;================================================================================
; Задание верхней границы (90 градусов) диапазона изменений нижнего Т-порога.
;================================================================================
movlw .90 ; Верхняя граница 90 градусов.
subwf TermoP_L,W ; TermoP_L - .90 = ...
btfss Status,C ; Результат "+/=0" или "-" ?
goto $+4 ; Если "-", то блокировки превышения нет.
; Если "+/=0", то блокировка превышения есть.
;--------------------------------------------------------------------------------
; Блокировка выхода текущих значений нижнего Т-порога за верхнюю границу
; диапазона изменений нижнего Т-порога (фиксация на уровне 90 градусов).
;--------------------------------------------------------------------------------
movlw .90 ;
movwf TermoP_L ; TermoP_L = .90
goto $+2 ; Обход "пищалки".
;================================================================================
; Формирование звукового сигнала.
;================================================================================
call MULTI ; Переход в ПП аварийной "пищалки".
;----> Возврат по стеку из ПП MULTI.
;--------------------------------------------------------------------------------
; "Привязка" верхнего Т-порога к нижнему Т-порогу.
;--------------------------------------------------------------------------------
call PLUS_GRAD ; Переход в ПП "привязки"
; верхнего Т-порога к нижнему Т-порогу.
;----> Возврат по стеку из ПП PLUS_GRAD.
;================================================================================
; Запись, в EEPROM-память ПИКа, измененных значений TermoP_L и TermoP_H.
;================================================================================
call WRITE_TL ; Переход в ПП записи нижнего Т-порога.
;----> Возврат по стеку из ПП WRITE_TL.
call WRITE_TH ; Переход в ПП записи верхнего Т-порога.
;----> Возврат по стеку из ПП WRITE_TH.
goto TERMOPOROG ; Переход на следующий цикл
; установки порогов.
;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
; РАБОТА С КНОПКОЙ "-".
;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
L_MINUS btfsc PortB,3 ; Кнопка "-" нажата или отжата ?
goto TERMOPOROG ; Если отжата, то переход на следующий цикл
; установки порогов.
; Если нажата, то программа исполняется далее.
;--------------------------------------------------------------------------------
; Противодребезговая задержка.
;--------------------------------------------------------------------------------
call PAUSE_UI ; Переход в ПП PAUSE_UI.
;----> Возврат по стеку из ПП PAUSE_UI.
;--------------------------------------------------------------------------------
; Ожидание отжатия кнопки с "врезкой", обеспечивающей автодекремент
; нижнего Т-порога.
13
;--------------------------------------------------------------------------------
call KOHCTAHTA ; Переход в ПП установки времязадающих
; констант.
;----> Возврат по стеку из ПП KOHCTAHTA.
btfsc PortB,3 ; Кнопка "-" нажата или отжата ?
goto T_MINUS ; Если отжата, то автоинкремента нет.
decfsz Reg_2,F ; Если нажата, то отрабатывается задержка, на
goto $-3 ; каждом "витке" которой состояние кнопки "-"
; анализируется.
decfsz Reg_3,F ; После отжатия - выход из задержки.
goto $-5 ;
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
; Рабочее действие после отжатия.
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
T_MINUS decf TermoP_L,F ; Нижний Т-порог - 1 = ...
;================================================================================
; Задание нижней границы (30 градусов) диапазона изменений нижнего Т-порога.
;================================================================================
movlw .30 ; Нижняя граница 30 градусов.
subwf TermoP_L,W ; TermoP_L - .30 = ...
btfsc Status,C ; Результат "+/=0" или "-" ?
goto $+4 ; Если "+/=0", то блокировки "принижения" нет.
; Если "-", то блокировка "принижения" есть.
;--------------------------------------------------------------------------------
; Блокировка выхода текущих значений нижнего Т-порога за нижнюю границу
; диапазона изменений нижнего Т-порога (фиксация на уровне 30 градусов).
;--------------------------------------------------------------------------------
movlw .30 ;
movwf TermoP_L ; TermoP_L = .30
goto $+2 ; Обход "пищалки".
;================================================================================
; Формирование звукового сигнала.
;================================================================================
call MULTI ; Переход в ПП аварийной "пищалки".
;----> Возврат по стеку из ПП MULTI.
;--------------------------------------------------------------------------------
; "Привязка" верхнего Т-порога к нижнему Т-порогу.
;--------------------------------------------------------------------------------
call PLUS_GRAD ; Переход в ПП "привязки"
; верхнего Т-порога к нижнему Т-порогу.
;----> Возврат по стеку из ПП PLUS_GRAD.
;================================================================================
; Запись, в EEPROM-память ПИКа, измененных значений TermoP_L и TermoP_H.
;================================================================================
call WRITE_TL ; Переход в ПП записи нижнего Т-порога.
;----> Возврат по стеку из ПП WRITE_TL.
call WRITE_TH ; Переход в ПП записи верхнего Т-порога.
;----> Возврат по стеку из ПП WRITE_TH.
goto TERMOPOROG ; Переход на следующий цикл
; установки порогов.
;HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
; Установка верхнего Т-порога.
;HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
; Задание адреса знакоместа, с которого начнется вывод на индикацию.
;--------------------------------------------------------------------------------
T_POROG_H movlw b'11001010' ;
movwf PortB ; 2-я строка, 11-е знакоместо. Адрес 0Ah.
call ENTER_BF ;
;--------------------------------------------------------------------------------
; Вывод на индикацию символа активности (маркера).
;--------------------------------------------------------------------------------
movlw 0DCh ;
movwf PortB ; Вывод на индикацию, взамен символу "=",
bsf PortC,RS ; символа активности ">|".
call ENTER_BF ;
;PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
14
; РАБОТА С КНОПКОЙ "+".
;PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
btfsc PortB,2 ; Кнопка "+" нажата или отжата ?
goto H_MINUS ; Если отжата, то переход на работу
; с кнопкой "-".
; Если нажата, то программа исполняется далее.
;--------------------------------------------------------------------------------
; Противодребезговая задержка.
;--------------------------------------------------------------------------------
call PAUSE_UI ; Переход в ПП PAUSE_UI.
;----> Возврат по стеку из ПП PAUSE_UI.
;--------------------------------------------------------------------------------
; Ожидание отжатия кнопки с "врезкой", обеспечивающей автоинкремент
; верхнего Т-порога.
;--------------------------------------------------------------------------------
call KOHCTAHTA ; Переход в ПП установки времязадающих
; констант.
;----> Возврат по стеку из ПП KOHCTAHTA.
btfsc PortB,2 ; Кнопка "+" нажата или отжата ?
goto H_PLUS ; Если отжата, то автоинкремента нет.
decfsz Reg_2,F ; Если нажата, то отрабатывается задержка, на
goto $-3 ; каждом "витке" которой состояние кнопки "+"
; анализируется.
decfsz Reg_3,F ; После отжатия - выход из задержки.
goto $-5 ;
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
; Рабочее действие после отжатия.
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
H_PLUS incf TermoP_H,F ; Верхний Т-порог + 1 = ...
;================================================================================
; Задание верхней границы (95 градусов) диапазона изменений верхнего Т-порога.
;================================================================================
movlw .95 ; Верхняя граница 95 градусов.
subwf TermoP_H,W ; TermoP_H - .95 = ...
btfss Status,C ; Результат "+/=0" или "-" ?
goto $+4 ; Если "-", то блокировки превышения нет.
; Если "+/=0", то блокировка превышения есть.
;--------------------------------------------------------------------------------
; Блокировка выхода текущих значений верхнего Т-порога за верхнюю границу
; диапазона изменений верхнего Т-порога (фиксация на уровне 95 градусов).
;--------------------------------------------------------------------------------
movlw .95 ;
movwf TermoP_H ; TermoP_H = .95
goto $+2 ; Обход "пищалки".
;================================================================================
; Формирование звукового сигнала.
;================================================================================
call MULTI ; Переход в ПП аварийной "пищалки".
;----> Возврат по стеку из ПП MULTI.
;================================================================================
; Запись, в EEPROM-память ПИКа, измененного значения TermoP_H.
;================================================================================
call WRITE_TH ; Переход в ПП записи верхнего T-порога.
;----> Возврат по стеку из ПП WRITE_TH.
goto TERMOPOROG ; Переход на следующий цикл
; установки порогов.
;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
; РАБОТА С КНОПКОЙ "-".
;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
H_MINUS btfsc PortB,3 ; Кнопка "-" нажата или отжата ?
goto TERMOPOROG ; Если отжата, то переход на следующий цикл
; установки порогов.
; Если нажата, то программа исполняется далее.
;--------------------------------------------------------------------------------
; Противодребезговая задержка.
;--------------------------------------------------------------------------------
15
call PAUSE_UI ; Переход в ПП PAUSE_UI.
;----> Возврат по стеку из ПП PAUSE_UI.
;--------------------------------------------------------------------------------
; Ожидание отжатия кнопки с "врезкой", обеспечивающей автодекремент
; верхнего Т-порога.
;--------------------------------------------------------------------------------
call KOHCTAHTA ; Переход в ПП установки времязадающих
; констант.
;----> Возврат по стеку из ПП KOHCTAHTA.
btfsc PortB,3 ; Кнопка "-" нажата или отжата ?
goto T_MINUS1 ; Если отжата, то автоинкремента нет.
decfsz Reg_2,F ; Если нажата, то отрабатывается задержка, на
goto $-3 ; каждом "витке" которой состояние кнопки "-"
; анализируется.
decfsz Reg_3,F ; После отжатия - выход из задержки.
goto $-5 ;
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
; Рабочее действие после отжатия.
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
T_MINUS1 decf TermoP_H,F ; Верхний Т-порог – 1 = ...
;================================================================================
; Задание нижней границы диапазона изменений верхнего Т-порога,
; которая = 30(нижняя граница нижнего Т-порога) + 5 = 35 градусов.
;================================================================================
movlw .5 ;
addwf TermoP_L,W ; TermoP_H = TermoP_L + 5 градусов.
subwf TermoP_H,W ; TermoP_H - (TermoP_L + 5) = ...
btfsc Status,C ; Результат "+/=0" или "-" ?
goto $+3 ; Если "+/=0", то "привязки" (см. ниже) нет.
; Если "-", то "привязка" есть.
;--------------------------------------------------------------------------------
; "Привязка" верхнего Т-порога к нижнему Т-порогу.
; Осуществляется, если TermoP_L = 30 градусов, а TermoP_H становится
; менее 35 градусов.
;--------------------------------------------------------------------------------
call PLUS_GRAD ; Переход в ПП "привязки"
; верхнего Т-порога к нижнему Т-порогу.
;----> Возврат по стеку из ПП PLUS_GRAD.
goto $+2 ; Обход "пищалки".
;================================================================================
; Формирование звукового сигнала.
;================================================================================
call MULTI ; Переход в ПП аварийной "пищалки".
;----> Возврат по стеку из ПП MULTI.
;================================================================================
; Запись, в EEPROM-память ПИКа, измененного значения TermoP_H.
;================================================================================
call WRITE_TH ; Переход в ПП записи верхнего Т-порога.
;----> Возврат по стеку из ПП WRITE_TH.
goto TERMOPOROG ; Переход на следующий цикл
; установки порогов.

;********************************************************************************
; УСТАНОВКА ПОРОГОВ U/I.
;********************************************************************************
....................................
....................................
goto INKEY ; После отжатия кнопки "Переключение режимов",
; выход из режима.
....................................
....................................
;################################################################################
; НАЧАЛО НИЖНЕЙ "ОБСЛУГИ" 1-й СТРАНИЦЫ. #########################################
;################################################################################
....................................
....................................
16
;================================================================================
; ПП "привязки" верхнего Т-порога к нижнему Т-порогу.
;================================================================================
PLUS_GRAD movlw .5 ;
addwf TermoP_L,W ; TermoP_H = TermoP_L + 5 градусов.
movwf TermoP_H ;
return ; Возврат по стеку.
;================================================================================
....................................
....................................
;================================================================================
; ПП записи нижнего Т-порога.
;================================================================================
WRITE_TL bsf Status,RP1 ; Переход
bcf Status,RP0 ; во 2-й банк.
movlw 3 ; Выбор ячейки EEPROM
movwf EEAdr ; с адресом 03h.
movf TermoP_L,W ;
movwf EEData ; TermoP_L -> 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 ; Возврат по стеку.
;================================================================================
; ПП записи верхнего Т-порога.
;================================================================================
WRITE_TH bsf Status,RP1 ; Переход
bcf Status,RP0 ; во 2-й банк.
movlw 4 ; Выбор ячейки EEPROM
movwf EEAdr ; с адресом 04h.
movf TermoP_H,W ;
movwf EEData ; TermoP_H -> 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 ; Возврат по стеку.
;################################################################################
; КОНЕЦ НИЖНЕЙ "ОБСЛУГИ" 1-й СТРАНИЦЫ. ##########################################
;################################################################################
....................................
....................................

Напоминание: я "выкладываю куски" текстов программ "в шрифте" Courier New.


Особенность этого шрифта заключается в одинаковой ширине всех его символов.
То же самое применяется и в текстовом редакторе MPLAB.
17
То есть, этот текст, вне зависимости от "боевой раскраски", можно напрямую
копировать в текстовый редактор MPLAB.
При этом, "все будет как по линеечке".
И вообще, если Вы желаете эффективно выровнять текст программы, то применяйте
Courier New и никаких проблем с выравниванием не будет.

По своей сути, "скелет" ПП установки термопорогов такой же, как и "скелет" ПП


установки порогов U/I, но "мясцо" (рабочие действия после отжатия кнопок "+/Да" и
"-/Нет") несколько иное.
Эти рабочие действия связанны как с обеспечением установки числовых значений
Т-порогов, в заданном температуроном диапазоне, так и с "привязками" верхнего
Т-порога к нижнему Т-порогу (call PLUS_GRAD), о необходимости которых говорилось
выше.
Все эти "дела" делаются в комплексе и почти одинаково, только вариации разные.
Что касается последнего, то эти "привязки" осуществляются в 3-х случаях из 4-х.
В случае установки верхнего Т-порога и работы с кнопкой "+/Да", такая "привязка" не
нужна. Достаточно одного "верхнего ограничителя".
В случае коррекции значения нижнего Т-порога, нужно произвести запись, в EEPROM-
память данных ПИКа, обеих значений Т-порогов (так как они оба изменяются), а в
случае коррекции значения верхнего Т-порога, нужно произвести запись, в EEPROM-
память данных ПИКа, только значения верхнего Т-порога (так как изменяется только
он).

Перехожу к содержимому 2-й страницы памяти программ.


На ней располагается ПП TERMO. В полном "боекомплекте".
....................................
....................................
;################################################################################
; КОНЕЦ НИЖНЕЙ "ОБСЛУГИ" 1-й СТРАНИЦЫ. ##########################################
;################################################################################
org 801h ; Заполнение 2-й страницы памяти программ
; начинается с 2050-й позиции (см. окно ROM).

;22222222222222222222222222222222222222222222222222222222222222222222222222222222
; 2-я СТРАНИЦА ПАМЯТИ ПРОГРАММ.
;################################################################################
; ВЕРХНЯЯ "ОБСЛУГА" 2-й СТРАНИЦЫ. ###############################################
;################################################################################
; Группа подпрограмм табличных, вычисляемых переходов, формирующих фиксированные
; картинки (расположена в 1-м блоке 2-й страницы памяти программ / PCLATH=.8).
;================================================================================
; Надпись "Караул! Убивают!"
;-----------------------------------
TEXT_22 .........................
;-----------------------------------
; Надпись "хх ПЕРЕГРЕВ хх" (х-колокольчики)
;-----------------------------------
TEXT_23 .........................
;-----------------------------------
; Надпись " Ждите понижения"
;-----------------------------------
TEXT_24 .........................
;-----------------------------------
; Надпись " температуры "
;-----------------------------------
TEXT_25 .........................
;-----------------------------------
; Надпись "Тпорога= град."
;-----------------------------------
TEXT_26 .........................
;-----------------------------------
; Надпись "Ттекущ.= град."
18
;-----------------------------------
TEXT_27 .........................
;-----------------------------------
; Надпись " Автоматическая "
;-----------------------------------
TEXT_28 .........................
;-----------------------------------
; Надпись " разблокировка "
;-----------------------------------
TEXT_29 .........................
;################################################################################
; КОНЕЦ ВЕРХНЕЙ "ОБСЛУГИ" 2-й СТРАНИЦЫ. #########################################
;################################################################################

;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
; ПП РАБОТЫ С ТЕРМОДАТЧИКОМ. DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
; "Администраторская" группа команд.
;--------------------------------------------------------------------------------
TERMO call DQ_INIT ; Инициализация датчика.
;--->Возврат по стеку из ПП DQ_INIT
movlw 0CCh ; Выполнение команды
call WIRE ; "Skip_ROM".
;--->Возврат по стеку из ПП WIRE
movlw 44h ; Выполнение команды
call WIRE ; "Start_Conv".
;--->Возврат по стеку из ПП WIRE
bsf Flag,0 ; Поднятие флага исполнения/обхода "плавающей"
; задержки.
call WIRE ; Исполнение процедуры 1-Wire протокола.
;--->Возврат по стеку из ПП WIRE
bcf Flag,0 ; Сброс флага исполнения/обхода "плавающей"
; задержки.
call DQ_INIT ; Инициализация датчика.
;--->Возврат по стеку из ПП DQ_INIT
movlw 0CCh ; Выполнение команды
call WIRE ; "Skip_ROM".
;--->Возврат по стеку из ПП WIRE
movlw 0BEh ; Выполнение команды
call WIRE ; "Read_Scratchpad".
;--->Возврат по стеку из ПП WIRE
;--------------------------------------------------------------------------------
; Чтение младшего байта температуры.
;--------------------------------------------------------------------------------
movlw b'11111111' ; "Нейтральный" байт.
call WIRE ; Чтение.
;--->Возврат по стеку из ПП WIRE
movwf Temp_LSB ; Результат замера температуры (младший байт)
; записывается в регистр Temp_LSB.
;-------------------------------------
; Деление содержимого Temp_LSB на 2.
;-------------------------------------
bcf Status,C ; Деление
rrf Temp_LSB,F ; на 2.
movf TermoP_H,W ; TempP_H -> W.
;================================================================================
; 2/10 преобразование (1х2) с перекодировкой результата.
;================================================================================
call BIN2_10_T ; Переход в ПП 2/10 преобразования.
;--->Возврат по стеку из ПП BIN2_10_T
;--------------------------------------------------------------------------------
; Проверка состояния флага срабатывания термозащиты.
;--------------------------------------------------------------------------------
btfsc Flag_1,7 ; Флаг срабатывания термозащиты поднят
; или опущен ?
goto PEREGREV ; Если поднят, то сравнение с верхним
19
; Т-порогом и текущая коррекция ШИМ обходятся.
; Если опущен, то не обходятся.
;--------------------------------------------------------------------------------
; Сравнение с верхним Т-порогом.
;--------------------------------------------------------------------------------
movf TermoP_H,W ; TermoP_H -> W.
subwf Temp_LSB,W ; Temp_LSB - TermoP_H =... (результат -> W)
btfsc Status,C ; Результат "+/=0" или "-"
; (порог превышен или нет) ?
goto PEREGREV ; Если верхний Т-порог превышен, то обход
; процедуры перевода числового значения
; младшего байта температуры в ширину
; импульсов.
;================================================================================
; Перевод числового значения младшего байта температуры в ширину импульсов.
;================================================================================
; Определение момента начала "загрузки" в CCPR1L/CCP1CON,5,4.
;------------------------------------------------------------
bcf PIR1,TMR2IF ; Сброс флага прерывания по переполнению TMR2.

btfss PIR1,TMR2IF ; Проверка состояния флага


goto $-1 ; прерывания по переполнению TMR2.
;------------------------------------------------------------
; А это сама "загрузка".
;------------------------------------------------------------
bcf CCP1CON,5 ; Два младших бита 10-разрядного ШИМ
bcf CCP1CON,4 ; сбрасываются в ноль.
bcf Status,C ; Умножение на 2, после чего
rlf Temp_LSB,W ; результат копируется в
movwf CCPR1L ; регистр CCPR1L.
;------------------------------------
; Концовка.
;------------------------------------
bcf PIR1,TMR2IF ; Сброс флага прерывания по переполнению TMR2
return ; Возврат по стеку.

;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
; Исполняется в случае превышения верхнего Т-порога.
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
PEREGREV bcf PortA,2 ; Если верхний Т-порог превышен,
; то ТРАНЗИСТОР ЗАКРЫВАЕТСЯ.
movlw .255 ; Перевод вентиллятора
movwf CCPR1L ; на максимальные обороты.
;********************************************************************************
; Начало сценария-подсказки №3
;********************************************************************************
; Вывод на индикацию, в 1-ю строку, фиксированной надписи
; " СЛУШАЮСЬ и / ПОВИНУЮСЬ! ".
;================================================================================
movlw high TEXT_17; Выбор PCH 1-й команды ПП TEXT_17
movwf PCLATH ; (находится на 1-й странице).
call SL_I_POVIN ; Переход в ПП вывода на индикацию
; этой надписи.
;--> Возврат по стеку из ПП SL_I_POVIN.
bsf PCLATH,3 ; Выбор 2-й страницы.
;================================================================================
; Опрос клавиатуры.
;================================================================================
; Опрос кнопки "+/Да".
;================================================================================
btfsc PortB,2 ; Кнопка "+/Да" нажата или отжата ?
goto $+7 ; Если отжата, то "рабочего действия
; после отжатия" не происходит.
;-----------------------------------
; Противодребезговая задержка.
;-----------------------------------
20
call PAUSE_UI_1 ; Переход в ПП PAUSE_UI_1.
;----> Возврат по стеку из ПП PAUSE_UI_1.
;-----------------------------------
; Ожидание отжатия кнопки.
;-----------------------------------
btfss PortB,2 ; Кнопка "+/Да" нажата или отжата ?
goto $-1 ; Если нажата, то ожидание отжатия.
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
; Рабочее действие после отжатия.
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
clrf PCLATH ; Выбор 1-го блока 1-й страницы.
bcf Flag_1,7 ; Флаг срабатывания термозащиты опускается.
return ; Возврат по стеку.
;////////////////////////////////////////////////////////////////////////////////
; ВЫВОД НА ИНДИКАЦИЮ НАДПИСЕЙ.
;////////////////////////////////////////////////////////////////////////////////
bcf PCLATH,0 ; Выбор 1-го блока 2-й страницы.
;================================================================================
; Вывод на индикацию, в 1-ю строку, фиксированной надписи ""Караул! Убивают!"".
;================================================================================
movlw b'10000000' ; Установка курсора в крайнее
call ENTER_BF_1 ; левое знакоместо 1-й строки.
movlw .16 ;
movwf Count ;
movf Count,W ;
sublw .16 ;
call TEXT_22 ; Аналогично, только
bsf PortC,RS ; для TEXT_22.
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_23 ; для TEXT_23.
bsf PortC,RS ;
call ENTER_BF_1 ;
decfsz Count,F ;
goto $-6 ;
;================================================================================
; Формирование звукового сигнала срабатывания защиты от перегрева.
;================================================================================
movlw .10 ; Задание количества
movwf Temp ; "писков".

call PAUSE_UI_1 ; Задержка.


;----> Возврат по стеку из ПП PAUSE_UI_1.

clrf PCLATH ; Выбор 1-го блока 1-й страницы.


call MULTI ; Переход в ПП аварийной "пищалки".
;----> Возврат по стеку из ПП MULTI.
bsf PCLATH,3 ; Выбор 1-го блока 2-й страницы.

decfsz Temp,F ; "Постановка на счетчик"


goto $-5 ; количества "писков".
;================================================================================
; Вывод на индикацию, в 1-ю строку, фиксированной надписи " Ждите понижения".
;================================================================================
movlw b'10000000' ; Установка курсора в крайнее
21
call ENTER_BF_1 ; левое знакоместо 1-й строки.
movlw .16 ;
movwf Count ;
movf Count,W ;
sublw .16 ; Аналогично, только
call TEXT_24 ; для TEXT_24.
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_25 ; для TEXT_25.
bsf PortC,RS ;
call ENTER_BF_1 ;
decfsz Count,F ;
goto $-6 ;
;================================================================================
; Обеспечение необходимого времени "высвечивания" надписи.
;================================================================================
movlw high PAUSE_S; Выбор PCH 1-й команды ПП PAUSE_S
movwf PCLATH ; (находится на 1-й странице).
call PAUSE_S ; Задержка.
;----> Возврат по стеку из ПП PAUSE_S.
movlw high TEXT_26; Выбор PCH 1-й команды ПП TEXT_26
movwf PCLATH ; (находится на 2-й странице).
;================================================================================
; Вывод на индикацию, в 1-ю строку, фиксированной надписи "Тпорога= град.".
;================================================================================
movlw b'10000000' ; Установка курсора в крайнее
call ENTER_BF_1 ; левое знакоместо 1-й строки.
movlw .16 ;
movwf Count ;
movf Count,W ;
sublw .16 ; Аналогично, только
call TEXT_26 ; для TEXT_26.
bsf PortC,RS ;
call ENTER_BF_1 ;
decfsz Count,F ;
goto $-6 ;
;================================================================================
; Вывод на индикацию числового значения ранее установленного, верхнего Т-порога.
;================================================================================
movlw b'10001000' ;
movwf PortB ; 1-я строка, 9-е знакоместо. Адрес 08h.
call ENTER_BF_1 ;

movlw high IND_TERMO; Выбор PCH 1-й команды ПП IND_TERMO


movwf PCLATH ; (находится на 1-й странице).
call IND_TERMO ; Переход в ПП IND_TERMO.
;----> Возврат по стеку из ПП IND_TERMO.
movlw high TEXT_27; Выбор PCH 1-й команды ПП TEXT_27
movwf PCLATH ; (находится на 2-й странице).
;================================================================================
; Вывод на индикацию, во 2-ю строку, фиксированной надписи "Ттекущ.= град.".
;================================================================================
movlw b'11000000' ; Установка курсора в крайнее
call ENTER_BF_1 ; левое знакоместо 2-й строки.
movlw .16 ;
22
movwf Count ;
movf Count,W ;
sublw .16 ; Аналогично, только
call TEXT_27 ; для TEXT_27.
bsf PortC,RS ;
call ENTER_BF_1 ;
decfsz Count,F ;
goto $-6 ;
;-------------------------------------
movf Temp_LSB,W ; Temp_LSB -> W.
;================================================================================
; 2/10 преобразование (1х2) с перекодировкой результата.
;================================================================================
call BIN2_10_T ; Переход в ПП 2/10 преобразования.
;--->Возврат по стеку из ПП BIN2_10_T
;================================================================================
; Вывод на индикацию текущего значения температуры.
;================================================================================
movlw b'11001000' ;
movwf PortB ; 2-я строка, 9-е знакоместо. Адрес 08h.
call ENTER_BF_1 ;

movlw high IND_TERMO; Выбор PCH 1-й команды ПП IND_TERMO


movwf PCLATH ; (находится на 1-й странице).
call IND_TERMO ; Переход в ПП IND_TERMO.
;----> Возврат по стеку из ПП IND_TERMO.
;================================================================================
; Обеспечение необходимого времени "высвечивания" надписи.
;================================================================================
call PAUSE_S ; Задержка.
;----> Возврат по стеку из ПП PAUSE_S.
bsf PCLATH,3 ; Выбор 2-й страницы.
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
; Поднятие флага срабатывания термозащиты.
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
bsf Flag_1,7 ; "Отмашка" на дальнейшую работу с нижним
; Т-порогом (если Ттекущ. > нижнего Т-порога).
;================================================================================
; Сравнение текущей температуры с нижним Т-порогом.
;================================================================================
movf TermoP_L,W ;
subwf Temp_LSB,W ; Temp_LSB - TermoP_L =... (результат -> W)
btfsc Status,C ; Результат "+/=0" или "-"
; (порог превышен или нет) ?
goto TERMO ; Если порог превышен, то ПП TERMO исполняется
; снова (с поднятым флагом срабатывания
; термозащиты).
bcf Flag_1,7 ; Если не превышен, то флаг срабатывания
; термозащиты опускается.
movlw high TEXT_28; Выбор PCH 1-й команды ПП TEXT_28
movwf PCLATH ; (находится на 2-й странице).
;================================================================================
; Вывод на индикацию, в 1-ю строку, фиксированной надписи " Автоматическая ".
;================================================================================
movlw b'10000000' ; Установка курсора в крайнее
call ENTER_BF_1 ; левое знакоместо 1-й строки.
movlw .16 ;
movwf Count ;
movf Count,W ;
sublw .16 ; Аналогично, только
call TEXT_28 ; для TEXT_28.
bsf PortC,RS ;
call ENTER_BF_1 ;
decfsz Count,F ;
goto $-6 ;
;================================================================================
23
; Вывод на индикацию, в 2-ю строку, фиксированной надписи " разблокировка ".
;================================================================================
movlw b'11000000' ; Установка курсора в крайнее
call ENTER_BF_1 ; левое знакоместо 2-й строки.
movlw .16 ;
movwf Count ;
movf Count,W ;
sublw .16 ; Аналогично, только
call TEXT_29 ; для TEXT_29.
bsf PortC,RS ;
call ENTER_BF_1 ;
decfsz Count,F ;
goto $-6 ;
;================================================================================
; Обеспечение необходимого времени "высвечивания" надписи.
;================================================================================
movlw high PAUSE_S; Выбор PCH 1-й команды ПП PAUSE_S
movwf PCLATH ; (находится на 1-й странице).
call PAUSE_S ; Задержка.
;----> Возврат по стеку из ПП PAUSE_S.
;-------------------------------------------------------
; Возврат в то "место", из которого вызывалась ПП TERMO.
;-------------------------------------------------------
return ; Возврат по стеку в случае автоматической
; разблокировки.

;################################################################################
; НИЖНЯЯ "ОБСЛУГА" 2-й СТРАНИЦЫ.
;################################################################################
; Инициализация термодатчика.
;================================================================================
; Установка на линии DQ 1.
;-----------------------------------
DQ_INIT call PIN_HI ; Установка вывода в высокоимпедансное
; состояние: за счет подтягивающего резистора,
; на линии устанавливается 1.
;----> Возврат по стеку из ПП PIN_HI.
;-----------------------------------
; Установка на линии DQ 0.
;-----------------------------------
call PIN_LO ; Установка на линии DQ нуля.
;----> Возврат по стеку из ПП PIN_LO.
;-----------------------------------
; Задержка 600 мкс.
;-----------------------------------
movlw .60 ; Установка количества проходов по 10мкс.
call PAUSE_X1 ; Переход в ПП задержки
; (задержка=60х10=600мкс.).
;----> Возврат по стеку из ПП PAUSE_X1.
;-----------------------------------
; Установка на линии DQ 1.
;-----------------------------------
call PIN_HI ; Установка вывода в высокоимпедансное
; состояние: за счет подтягивающего резистора,
; на линии устанавливается 1.
;----> Возврат по стеку из ПП PIN_HI.
;-----------------------------------
; Задержка 70 мкс.
;-----------------------------------
movlw .7 ; Установка количества проходов по 10мкс.
call PAUSE_X1 ; Переход в ПП задержки
; (задержка=7х10=70мкс.).
;----> Возврат по стеку из ПП PAUSE_X1.
;--------------------------------------------------------------------------------
; Определение наличия (или нет) отклика на импульс сброса.
;--------------------------------------------------------------------------------
24
btfsc PortC,DQ ; На линии DQ 0 или 1 (отклик есть или нет)?
bsf Flag,1 ; Если отклика нет (1), то флаг наличия
; термодатчика поднимается.
; Если отклик есть (0), то флаг наличия
; термодатчика остается опущенным и программа
; исполняется далее.
;-----------------------------------
; Задержка 500 мкс.
;-----------------------------------
movlw .50 ; Установка количества проходов по 10мкс.
call PAUSE_X1 ; Переход в ПП задержки
; (задержка=50х10=500мкс.).
;----> Возврат по стеку из ПП PAUSE_X1.
return ; Возврат по стеку.
;WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
; ПРОЦЕДУРА 1-WIRE ПРОТОКОЛА.
;WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WIRE movwf Wire ; W --> Wire.
movlw 8 ; Задание количества
movwf Temp ; обрабатываемых битов.
;================================================================================
; Передача бита в линию DQ.
;================================================================================
; Установка на линии DQ уровня 0, то есть,
; формирование строба (перепад от 1 к 0).
;-----------------------------------------
METKA bcf PortC,DQ ; DQ=0.
nop ; Задержка 1 м.ц.
nop ; Задержка 1 м.ц.
;----------------------------------------
; Анализ состояния бита №0 регистра Wire.
;----------------------------------------
btfsc Wire,0 ; Wire,0 = 1 или 0 ?
bsf PortC,DQ ; Если Wire,0 = 1, то DQ=1.
rrf Wire,F ; Если Wire,0 = 0, а также после исполнения
; предыдущей команды, происходит сдвиг
; содержимого Wire вправо.
;------------------------------------------------
; Задержка на 11 м.ц. (от movlw 2 до bcf Wire,7).
;------------------------------------------------
movlw 2 ; Предустановка.
call PAUSE_X2 ;
;--->Возврат по стеку из ПП PAUSE_X2
;================================================================================
; Прием бита с линии DQ.
;================================================================================
; Подготовка 7-го бита регистра Wire к записи в него уровня DQ.
;--------------------------------------------------------------
bcf Wire,7 ; Wire,7=0.
;--------------------------------------------
; Перестройка направления работы ("на вход").
;--------------------------------------------
bsf Status,RP0 ; Выбор 1-го банка.
bsf TrisC,DQ ; RC0 работает "на вход".
bcf Status,RP0 ; Выбор 0-го банка.
;--------------------------------------------------------------
; Анализ состояния линии DQ.
; Если DQ=1, то в бит №7 регистра Wire записывается 1.
; Если DQ=0, то в бите №7 регистра Wire остается
; "лежать" ранее предустановленный 0.
;--------------------------------------------------------------
btfsc PortC,DQ ; На линии DQ 1 или 0 ?
goto $+2 ; Если DQ=1, то обход следующей команды.
goto $+2 ; Если DQ=0, то обход следующей команды.
bsf Wire,7 ; Wire,7=1.
;-------------------------------- ------------
25
; Перестройка направления работы ("на выход").
;--------------------------------------------
bsf Status,RP0 ; Выбор 1-го банка.
bcf TrisC,DQ ; RC0 работает "на выход".
bcf Status,RP0 ; Выбор 0-го банка.
;---------------------------------------------------
; Задержка на 59 м.ц. (от movlw .18 до bsf PortC,DQ).
;---------------------------------------------------
movlw .18 ; Предустановка.
call PAUSE_X2 ;
;--->Возврат по стеку из ПП PAUSE_X2
;---------------------------------------------------
; Установка на линии DQ уровня 1
; (подготовка к формированию следующего строба).
;---------------------------------------------------
bsf PortC,DQ ; DQ=1.
nop ; Задержка 1 м.ц.
nop ; Задержка 1 м.ц.
;----------------------------------------
; Счет битов.
;----------------------------------------
decfsz Temp,F ; Декремент счетчика битов.
goto METKA ; Если отработаны не все биты, то
; переход на обработку следующего бита.
; Если все, то программа исполняется далее.
;--------------------------------------------------------------------------------
; Опрос состояния флага исполнения/обхода "плавающей" задержки.
;--------------------------------------------------------------------------------
btfss Flag,0 ; Флаг исполнения/обхода "плавающей" задержки
; поднят или опущен ?
goto $+6 ; Если опущен, то обход "плавающей" задержки.
; Если поднят, то "плавающая" задержка
; отрабатывается.
;--------------------------------------------------------------------------------
; Ожидание завершения процесса преобразования температуры ("плавающая" задержка).
;--------------------------------------------------------------------------------
movlw b'11111111' ; Запись в W числа FFh.
subwf Wire,W ; Temp - FFh = ...
btfss Status,Z ; Z=0 или Z=1 (нулевой результат)?
goto WIRE ; Если Z=0, то ждем дальше.
; Если Z=1 (Temp заполнен единицами, то есть,
; на линии появился и надежно зафиксировался
; уровень 1), то программа исполняется далее.
return ; Возврат по стеку.
;----------------------------------------
; Завершающий этап.
;----------------------------------------
movf Wire,W ; Wire --> W.
return ; Возврат по стеку.
;WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW

;================================================================================
; Формирование на линии уровня "1" за счет подтягивающего резистора.
;================================================================================
PIN_HI bsf Status,RP0 ; Переход в банк 1.
bsf TrisC,DQ ; Настройка вывода RC0 на работу "на вход".
bcf Status,RP0 ; Переход в банк 0.
return ; Возврат по стеку.
;================================================================================
; Формирование на линии уровня "0" средствами микроконтроллера
;================================================================================
PIN_LO bcf PortC,DQ ; Установка 0 на выходе защелки вывода RA4.
bsf Status,RP0 ; Переход в банк 1.
bcf TrisC,DQ ; Настройка вывода RC0 на работу "на выход".
bcf Status,RP0 ; Переход в банк 0.
return ; Возврат по стеку.
26
;================================================================================
; ПП задержки, кратной 10 мкс.
;================================================================================
; Задание количества проходов по 10 мкс.
;----------------------------------------
PAUSE_X1 movwf Count ; W --> Count.
;----------------------------------------
; Задержка 10 мкс.
;----------------------------------------
PAUSE_10 nop ;
goto $+1 ; Одноразрядный,
goto $+1 ; вычитающий
goto $+1 ; счетчик
decfsz Count,F ; с "врезкой".
goto PAUSE_10 ;
return ; Возврат по стеку.
;================================================================================
; Универсальная задержка (время задержки определяется предустановленным
; содержимым W).
;================================================================================
PAUSE_X2 movwf Reg ; Стандартный, вычитающий,
decfsz Reg,F ; однобайтный
goto $-1 ; счетчик.
return ; Возврат по стеку.
;================================================================================
; 2/10 преобразование (1х2) с перекодировкой результата.
;================================================================================
BIN2_10_T movwf Temp ; W -> Temp_1.
clrf Temp_1 ; Temp_1 = 0.
movlw .10 ;
subwf Temp,W ; Temp - .10 =... (результат -> W)
btfss Status,C ; Результат "+/=0" или "-" ?
goto $+4 ; Если "-", то обход следующих 3-х команд.
movwf Temp ; Если "+/=0", то W -> Temp.
incf Temp_1,F ; Temp_1 + 1 =... (результат -> Temp_1)
goto $-6 ; Переход на команду movlw .10
movf Temp,W ;
movwf LED0 ; Temp -> LED0.
movf Temp_1,W ;
movwf LED1 ; Temp_1 -> LED1.

movlw 30h ; W -> 30h


iorwf LED1,F ; Логическое "ИЛИ" содержимого W
iorwf LED0,F ; и содержимого регистров LED1 и LED0.
return ; Возврат по стеку.
;================================================================================
; Задержка, определяющая скорость смены показаний и "добывание" результатов
; измерения.
;================================================================================
PAUSE_UI_1 movlw .250 ;
movwf Reg_2 ;
movlw .80 ;
movwf Reg_3 ;

decfsz Reg_2,F ; Стандартный,


goto $-1 ; 2-байтный,
decfsz Reg_3,F ; вычитающий
goto $-3 ; счетчик.
return ; Возврат по стеку.
;================================================================================
; ПП "плавающей" задержки на основе анализа состояния флага занятости BF
; (вариант для 4-разрядного интерфейса).
;================================================================================
ENTER_BF_1 movwf Mem ; Переправка старшего п/байта регистра W на
movwf PortB ; линии RB4...7.
;-----------------------------------
27
; Запуск в работу старшего п/байта.
;-----------------------------------
nop ; Задержка в 1 м.ц.
bsf PortC,E ; Установка на линии Е "1".
nop ; Задержка в 1 м.ц.
bcf PortC,E ; Установка на линии Е "0".

swapf Mem,W ; Смена п/байтов. Результат -> W.


movwf PortB ; Переправка младшего п/байта регистра W на
; линии RB4...7.
;-----------------------------------
; Запуск в работу младшего п/байта.
;-----------------------------------
nop ; Задержка в 1 м.ц.
bsf PortC,E ; Установка на линии Е "1".
nop ; Задержка в 1 м.ц.
bcf PortC,E ; Установка на линии Е "0".
;-----------------------------------
; Подготовка к проверке флага BF.
;-----------------------------------
bsf Status,RP0 ; Переход в 1-й банк.
movlw b'11110000' ; Запись в W "11110000"
movwf TrisB ; RB4...7 работают на вход, а RB0...3
; работают на выход.
bcf Status,RP0 ; Переход в 0-й банк.

bcf PortC,RS ; Установка на линии RS "0" (режим команд).


bsf PortC,RW ; Линия RW в "1" (режим чтения данных).
nop ; Задержка в 1 м.ц.
bsf PortC,E ; Установка на лини Е "1".
nop ; Задержка в 1 м.ц.
;-----------------------------------
; Сама проверка.
;-----------------------------------
btfsc PortB,BF ; Проверка состояния флага занятости BF.
goto $-1 ; Если BF=1, то продолжение задержки до тех
; пор, пока BF не установится в "0"
; (программа исполняется далее).
;-----------------------------------
; Завершение процедуры.
;-----------------------------------
movf PortC,W ; RW=0, RS=0, E=0,
andlw b'00011111' ; при сохранении неизменным
movwf PortC ; всего остального.
bsf Status,RP0 ; Переход в 1-й банк.
movlw b'00001111' ; RB0...RB3 работают на вход,
movwf TrisB ; RB4...RB7 работают на выход.
bcf Status,RP0 ; Переход в 0-й банк.
return ; Возврат по стеку.
;################################################################################
; КОНЕЦ НИЖНЕЙ "ОБСЛУГИ" 2-й СТРАНИЦЫ. ##########################################
;################################################################################
end ; Конец программы.

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


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

28
Поэтому, команда открытия транзистора, из ПП TERMO, удалена, и "матка" (то, из чего
вызывается ПП TERMO) приведена в прежнее состояние.
Бывает в жизни и такое, и еще похлеще. Не скрываю. На то она и жизнь.
2. В заголовке концовки ПП INKEY допущен "ляп", являющийся "рудиментом/атавизмом"
моих изначальных "терзаний" по поводу назначений названий "того-сего".
Следует читать не "Если кнопка "Сброс" отжата, а также и после смены режима", а
"Если кнопка "Переключение режимов" отжата, а также и после смены режима".

Итак, "основное тело" ПП TERMO полностью перенесено на 2-ю страницу памяти


программ.
Это "тело", если так можно выразиться, "в автомате, потянуло за собой свою обслугу",
в виде ПП вычисляемых переходов TEXT_22 … _29.
Они вызываются только из ПП TERMO.
Куда их пристроить?
Ну конечно же, в 1-й блок 2-й страницы.
Вот Вам и "зародыш верхней обслуги" 2-й страницы, который в дальнейшем, может
"расширяться/углубляться".
Если кому-то из Вас не понятно почему, в данном случае, именно так, а не иначе, то
"шагом марш" в предыдущий подраздел (используются классические ПП вычисляемых
переходов. Операторы low не применяются).
Кроме того, "тело (мать) потянуло за собой" ПП DQ_INIT, WIRE, PIN_HI, PINLO,
PAUSE_X1.

ПП DQ_INIT (и то, что к ней прилагается) выгоднее разместить там, где "лежит" ПП
TERMO, так как, из нее, ПП DQ_INIT вызывается 2 раза.
То есть, больше, чем из "матки" (из нее, она вызывается 1 раз).
Соответственно, в "матке", нужно озаботиться PCLATH/DQ_INIT-делами.
Что и имеет место быть.
ПП PAUSE_X2 ("лежит" на 2-й странице) это та же ПП PAUSE_X ("лежит" на 1-й
странице), но только под другим названием ("клон").
Вопрос: "Почему так"?
Ответ: прикиньте количество команд, необходимых для организации соответствующих
"PCLATH-дел".
Оно окажется не меньшим, чем "масса" этой "худосочной" подпрограммы.
Плюс, "PCLATH-геморрой".
Проще/выгоднее/эффективнее "родить/склонировать новую ПП", работающую только в
пределах 2-й страницы, чем заниматься, по большому счету, бестолковкой.
Кстати, в "границах" 2-й страницы, эта ПП, в дальнейшем (в ходе вполне возможного
"расширения/углубления того-сего"), вполне может быть востребована.
А она уже тут как тут … И без всяких "PCLATH-геморроев".

Ровным счетом то же самое относится и к ПП ENTER_BF.


Посчитайте/прикиньте суммарное количество команд "PCLATH-геморроя" и сравните его
с количеством команд этой подпрограммы.
После этого, Вы убедитесь в том, что "клонирование" выгодно.
После окончания такого рода мыслительной деятельности, ПП ENTER_BF просто
копируется на 2-ю страницу памяти программ, и ей присваивается "новое" название
(ENTER_BF_1).
Далее, соответствующая корректировка обращений к ней, и все дела.

Что касается ПП BIN2_10_T, то с обеих страниц, она вызывается одинаковое


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

29
ПП PAUSE_UI я "склонировал" на 2-ю страницу (под названием PAUSE_UI_1) потому,
что она достаточно часто востребуется, и на 2-й странице, сподручнее иметь
отдельную ПП такого рода, чем каждый раз "PCLATH-бегать за ней" на 1-ю страницу.
Примечание: то, что перенесено, можно в любой момент "скорректировать" (если это
нужно).

Некоторые особенности.
1. Процедура вывода на индикацию надписи СЛУШАЮСЬ и ПОВИНУЮСЬ! требуется
более одного раза.
Поэтому, она оформлена в виде отдельной подпрограммы и вынесена в "обслугу".
То же самое относится и к выводу на индикацию надписи кнопка "+/Да".

2. Содержимое младшего байта температуры я все-таки разделил на 2.


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

3. В качестве указателя Т-порогов, "прописан" регистр Temp_3.


Положение маркера определяется состоянием его бита с №0.
То есть, речь идет о банальном триггере со счетным входом.

4. Организована фиксированная задержка длительностью 1 сек.


Пока она используется только один раз (определяет интервал времени вывода на
индикацию надписей Термодатчик ПОДКЛЮЧЕН или Термодатчик ОТКЛЮЧЕН), но в
дальнейшем может пригодиться.
А может и нет.
В любой момент, "в этом вопросе, можно навести порядок".

Программа BP_9.asm прилагается.


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

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

30