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

2-2/19.

"Ваяние" автоматической "предупреждалки", которая наглядно (через


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

Так как дальнейшего развития никто не отменял, то нужно как-то подсуетиться.


А иначе, какой же я русский колобок из прокуратуры?
"Жертву" долго искать не пришлось.
В свое время, на форуме, "вентиллировалась мысль" о желательности создания нечто
такого, что "пищаще" предупреждало бы пользователя о том, что "термоГитлеркапут
совсем не за горами".
Ладушки. "Вонзаю шило в зад этой субстанции".
Для начала, выписываю ей повестку с приглашением явиться на допрос.
Явилась (а куда она денется?).
Сидит, глазами глупо хлопает, прикидывается дурочкой и пытается утаить свои
потенциальные возможности (наивная).
Типа, "ну попищу я. Нет проблем. Для такого хорошего человека как следователь,
почему бы и не попищать? И все. На бОльшее я не способна. По причине тяжелой
наследственности и черепномозговой убогости. Если нужно, то справку принесу".
А глаза хитрющие … Явный подвох, причем, с издевательским уклоном, унижающим
всё, что только можно унизить.
Ну ничего, дорогуша, через недельку, ты будешь не только пищать, но одновременно
и плясать вприсядку, и вычислять, и рисовать фломастером результаты этого
вычисления на своем толоконном лбу, и т.д. (зависит от уровня строптивости).
Конвой!!!
Выдать матрас и в камеру ее. К уголовникам.
Примечание: настройка биофункций (!!!) произведена. Можно спокойно работать.

Мелочиться не буду. Потому, что злой.


Предварительное задание на разработку.
1. "Предупреждалка" должна автоматически срабатывать, если разница между
значениями верхнего Т-порога и текущей температуры становится менее 3-х градусов
(3, 2, 1 градус).
2. Количество "писков" должно быть равно этой разнице (3, 2, 1 "писк").
3. В целях обеспечения комфортного, визуального контроля за тем, что происходит
после срабатывания "предупреждалки", и значение текущей температуры, и числовое
значение разницы должны быть выведены на индикацию, в сопровождении
соответствующих, пояснительных надписей.
4. Кроме этого, в целях обеспечения визуального контроля текущих значений U и I,
они тоже должны выводиться на индикацию.
5. "Предупреждалка" должна автоматически выключаться в случае, если текущее
значение разницы увеличилось более чем на 3 градуса.

Начинаю "раскрутку цепочки".


Примечание: в данном случае, отслеживание текущей температуры может
производиться только в режиме выключенной защиты, если термодатчик электрически
подключен и программно включен (разблокирован) в настройках.
Предположим, что имеется готовая процедура "предупреждалки".
Вопрос: "Куда ее врЕзать".
Ответ: ее нужно "врЕзать", в ПП TERMO, сразу же после группы команд сравнения с
верхним Т-порогом ("грубая прикидка").
И в самом деле, зачем второй раз вычислять разницу между верхним Т-порогом и
текущей температурой, если такое вычисление имеет место быть в
"текущенавороченном"?
Кроме того, сия "предупреждалка" однозначно относится к температурной "епархии".
После этого возникает могучий вопрос: "Если осуществлена массивная врезка в ПП
TERMO, которая "лежит" на 2-й странице памяти программ, то как быть с
прерываниями"?

1
И в самом деле, в данном случае, уходить в прерывания со 2-й страницы памяти
программ нельзя ("Гитлер капут". Идентифицировано ранее), а если не уходить, то
наихудшая инерционность срабатывания защиты от КЗ будет совсем плохой (вообще
отвратительной).
Значит, в соответствии со сказанным ранее, "предупреждалку" нужно поместить на 1-й
странице памяти программ (с соответствующей организацией "зоны" разрешения
прерываний), а ее вызов должен происходить из 2-й страницы (из ПП TERMO).
Кто после этого скажет, что работа, проделанная в предыдущем подразделе,
проделана зря?
Худо-бедно, а "плацдарм-то" подготовлен!
В том смысле, что сейчас, "ефрейторский суперзазорище совсем не хил".
А если будет мало, то можно использовать "заначку на черный день" (см. предыдущий
подраздел).
Это называется упреждением (для этого и нужны тренировки "орлиных взоров").
Вопрос: "Как быть дальше"?
Вопрос на вопрос: что нужно сделать перед тем, как "штурмовать ДЗОТ"?
Настоящий батяня-комбат может ругаться матом, водку пить (и т.д.), но он никогда не
будет подставлять своих людей.
Он сначала организует хорошую артподготовочку (чтобы "вражине" мало не
показалось).
А вот потом, когда ДЗОТ будет в руинах, можно и штурмовать.
Значит, текущую задачу нужно разделить на 2 этапа:
- сначала, в ПП TERMO, "ваяется предупреждалка" (как таковая), с ее последующим,
комфортным и деловым, предварительным "доведением до работоспособной кондиции"
(артподготовочка),
- а после этого, осуществляется перенос "предупреждалки" (с организацией "зоны"
разрешения прерываний и соответствующих переходов) в нижнюю "обслугу" 1-й
страницы памяти программ (штурм), и ее последующее "доведение до ума" (зачистка).
Итак, план текущей битвы выработан. Все "расписано по нотам".
Реализую.
1-й этап работы
"Артподготовочка" выглядит так:
....................................
....................................
;22222222222222222222222222222222222222222222222222222222222222222222222222222222
; 2-я СТРАНИЦА ПАМЯТИ ПРОГРАММ.
;################################################################################
; ВЕРХНЯЯ "ОБСЛУГА" 2-й СТРАНИЦЫ. ###############################################
;################################################################################
....................................
....................................
;================================================================================
; Группа подпрограмм табличных, вычисляемых переходов, формирующих фиксированные
; картинки (расположена во 2-м блоке 2-й страницы памяти программ / PCLATH=.9).
;================================================================================
....................................
....................................
;-----------------------------------
; Надпись "До хх градуса!" (хх - колокольчики)
;-----------------------------------
TEXT_46 addwf PC,F ; -----"-----
dt 0xE0,0x6F,0x20,0xED,0xED,0x20,0x20,0x20
dt 0xB4,0x70,0x61,0xE3,0x79,0x63,0x61,0x21
;################################################################################
; КОНЕЦ ВЕРХНЕЙ "ОБСЛУГИ" 2-й СТРАНИЦЫ. #########################################
;################################################################################

;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
; ПП РАБОТЫ С ТЕРМОДАТЧИКОМ. DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
;DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
; "Администраторская" группа команд.
;================================================================================
2
TERMO
....................................
....................................
;--------------------------------------------------------------------------------
; Сравнение с верхним Т-порогом.
;--------------------------------------------------------------------------------
movf TermoP_H,W ; TermoP_H -> W.
subwf Temp_LSB,W ; Temp_LSB - TermoP_H =... (результат -> W)
btfsc Status,C ; Результат "+/=0" или "-"
; (порог превышен или нет) ?
goto PEREGREV ; Если верхний Т-порог превышен, то переход в
; ПП PEREGREV.
; Если не превышен, то программа исполняется
; далее.
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
; РАБОТА С ТЕМПЕРАТУРНЫМ ОСТАТКОМ.
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
; Обработка числового значения остатка (подготовка).
;----------------------------------------------
movwf Ostatok ; Результат вычитания копируется в регистр
; температурного остатка.
comf Ostatok,F ; Так как результат "-", то инверсия всех
; битов.
incf Ostatok,F ; Ostatok + .1 = ...
;================================================================================
; Группа команд анализа значения остатка.
;1111111111111111111111111111111111111111111111==================================
; Если до верхнего T-порога остался 1 градус.
;1111111111111111111111111111111111111111111111
movlw 1 ; W =.1
subwf Ostatok,W ; Ostatok -.1 =... (результат -> W)
btfss Status,Z ; Это .1 или другое число ?
goto Q_2 ; Если это не .1, то переход в проверку
; на соответствие числу .2
; Если это .1, то программа исполняется далее.
;----------------------------------------------
; Формирование звукового сигнала (1 "писк").
;----------------------------------------------
clrf PCLATH ; Выбор 1-й страницы.
call MULTI ; Переход в ПП аварийной "пищалки".
;----> Возврат по стеку из ПП MULTI.
bsf PCLATH,3 ; Выбор 2-й страницы.
goto T_OSTATOK ; Переход в ПП T_OSTATOK.

;2222222222222222222222222222222222222222222222
; Если до верхнего T-порога осталось 2 градуса.
;2222222222222222222222222222222222222222222222
Q_2 movlw 2 ; -----"-----
subwf Ostatok,W ; Аналогично, но для числа .2
btfss Status,Z ; -----"-----
goto Q_3 ; Если это не .2, то переход в проверку
; на соответствие числу .3
; Если это .2, то программа исполняется далее.
;----------------------------------------------
; Формирование звукового сигнала (2 "писка").
;----------------------------------------------
movlw 2 ; Задание количества
movwf Temp ; "писков".
call PAUSE_UI_1 ; Задержка.
;----> Возврат по стеку из ПП PAUSE_UI_1.
clrf PCLATH ; Выбор 1-й страницы.
call MULTI ; Переход в ПП аварийной "пищалки".
;----> Возврат по стеку из ПП MULTI.
bsf PCLATH,3 ; Выбор 2-й страницы.
decfsz Temp,F ; "Постановка на счетчик"
goto $-5 ; количества "писков".
3
goto T_OSTATOK ; Переход в ПП T_OSTATOK.

;3333333333333333333333333333333333333333333333
; Если до верхнего T-порога осталось 3 градуса.
;3333333333333333333333333333333333333333333333
Q_3 movlw 3 ; -----"-----
subwf Ostatok,W ; Аналогично, но для числа .3
btfss Status,Z ; -----"-----
goto PROPELLER ; Выход из этой группы проверок, без
; исполнения ПП T_OSTATOK (если соответствия
; числам .1, .2, .3 не обнаружено).
; Если это .3, то программа исполняется далее.
;----------------------------------------------
; Формирование звукового сигнала (3 "писка").
;----------------------------------------------
movlw 3 ; -----"-----
movwf Temp ; -----"-----
call PAUSE_UI_1 ; -----"-----
clrf PCLATH ; -----"-----
call MULTI ; Аналогично, но для 3-х "писков".
bsf PCLATH,3 ; -----"-----
decfsz Temp,F ; -----"-----
goto $-5 ; -----"-----
;================================================================================
; ПП вывода на индикацию числового значения остатка.
;================================================================================
; Вывод на индикацию, в 1-ю строку, фиксированной надписи "До хх градуса!"
; (хх-колокольчики).
;--------------------------------------------------------------------------------
T_OSTATOK movlw high TEXT_46; Выбор PCH 1-й команды ПП TEXT_46.
movwf PCLATH ;

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


call ENTER_BF_1 ; левое знакоместо 1-й строки.
movlw .16 ;
movwf Count ;
movf Count,W ;
sublw .16 ;
call TEXT_46 ; Аналогично, только
bsf PortC,RS ; для TEXT_46.
call ENTER_BF_1 ;
decfsz Count,F ;
goto $-6 ;
movlw high TEXT_22; Выбор 1-го блока
movwf PCLATH ; 2-й страницы.
;-----------------------------------
; Перекодировка.
;-----------------------------------
movlw 30h ; -----"-----
addwf Ostatok,F ; Ostatok + 30h = ...
;--------------------------------------------------------------------------------
; Вывод на индикацию, в 1-ю строку, числового значения остатка.
;--------------------------------------------------------------------------------
movlw b'10000110' ;
movwf PortB ; 1-я строка, 7-е знакоместо.
call ENTER_BF_1 ;
movf Ostatok,W ; Вывод на индикацию
movwf PortB ; содержимого Ostatok.
bsf PortC,RS ;
call ENTER_BF_1 ;
;----------------------------------------------------------
; Проверка на наличие превышения на 1 градус.
;----------------------------------------------------------
movlw 31h ;
subwf Ostatok,W ; Ostatok - 31h = ...
btfss Status,Z ; Это 1 градус или нет ?
4
goto PROPELLER ; Если нет, то обход вывода на индикацию
; символа "!".
; Если 1 градус, то он выводится на индикацию
; ("по верху" символа "a").
;----------------------------------------------------------
; Вывод на индикацию символа "!" ("убийство" символа "a").
;----------------------------------------------------------
movlw b'10001110' ;
movwf PortB ; 1-я строка, 15-е знакоместо.
call ENTER_BF_1 ;
movlw 21h ; Вывод на индикацию
movwf PortB ; символа "!".
bsf PortC,RS ;
call ENTER_BF_1 ;
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO

;================================================================================
; Перевод числового значения младшего байта температуры в ширину импульсов.
;================================================================================
; Определение момента начала "загрузки" в CCPR1L/CCP1CON,5,4.
;------------------------------------------------------------
PROPELLER
....................................
....................................
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
; Исполняется в случае превышения верхнего Т-порога.
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
PEREGREV
....................................
....................................

Под "термоостаточые дела", организован/"прописан" регистр общего назначения с


названием Ostatok (см. "шапку" программы).
Примечание: вместо него, можно было бы использовать и какой-нибудь из регистров,
имеющихся в наличии, но с целью обеспечения комфортной ориентации, я не стал
этого делать.
В него, из регистра W, копируется разница между верхним Т-порогом и текущим
значением температуры.
Если верхний Т-порог не превышен, то результат вычитания будет отрицательным.
Значит, его нужно привести к положительному результату (comf Ostatok,F).
Далее, нужно произвести числовую коррекцию (incf Ostatok,F).
Вопрос: "Почему так"?
Ответ: потому, что, к примеру, разнице в 1 градус, будет соответствовать число .255,
которое, после инверсии всех битов, "превратится" в число .0, что в упор не есть
число .1.
То же самое относится и к другим результатам вычитания: все они будут меньше
своего "положительного эквивалента" на единицу.
"Ноги у этого факта растут из того", что нулевой результат операции вычитания
считается положительным.
Ну и ладушки. Подготовка к анализу произведена.
То есть, в регистре Ostatok, лежит истинное значение остатка.
Теперь можно проанализировать это значение, на предмет соответствия одному из
трех чисел: 3, 2 или 1.
Все это мы "проходили" раньше: речь идет о последовательной "цепочке" проверок.
Так как имеет место быть 3 анализа, то возможны 4 сценария.
3 из них связаны с фактами обнаружения указанных выше чисел, а 4-й, это сценарий
типа "скорректированный результат вычитания не равен числам 3, 2 или 1" ("проскок
всех проверок транзитом").
Если результатом вычитания является число 0, то "предупреждалка" обходится за счет
перехода в ПП PEREGREV.

5
Особенностью всех трех проверок является то, что в случаях обнаружения тех чисел,
на которые они "ориентированы" (3, 2 или 1), перед выходом из них, формируется
количество "писков" равное значению этих чисел (3, 2 или 1 "писк").
О том, как это делается, говорилось в предыдущих подразделах (вызывается ПП
MULTI). Повторяться не буду.
Предположим, что обнаружено одно из этих чисел.
После формирования соответствующего количества "писков", происходит переход в ПП
вывода на индикацию числового значения остатка (ПП T_OSTATOK).
Возникает текущий вопрос: "Куда все это добро выводить на индикацию и в каком
виде"?
Текущие значения U и I нужно сохранить. Они должны постоянно контролироваться.
Значит, 2-я строка дисплея исключается.
Остается 1-я строка дисплея.
В нее выводятся текущие значения температуры.
Если вывести в нее текущее значение разницы между верхним Т-порогом и текущей
температурой, то текущее значение температуры будет уничтожено записью "по верху".
А ведь нужно контролировать и то, и другое.
Вопрос: "Как быть"?
Ответ: а никак. Беспокоиться об уничтожении текущего значения температуры не
нужно, так как, на следующем цикле замера температуры, оно будет выведено на
индикацию.
И текущее значение разницы между верхним Т-порогом и текущей температурой (если
разница от 3-х градусов и менее) тоже будет выведено на индикацию.
Что получается в 1-й строке?
Получается чередование двух надписей.
В одной из них, будет "фигурировать" текущее значение температуры, а в другой -
разница между верхним Т-порогом и текущей температурой.
С первым, все понятно (детально отработано ранее).
Со вторым, нужно разобраться.
Во-первых, нужно "сконструировать" надпись.
Так как в 16-ти знакоместах "особо-то и не разгуляешься", я придумал надпись
До хх градуса!
Под это дело "состряпана" ПП TEXT_46.
Оптимизировать в ней нечего, так как надпись занимает всю строку.
хх это два символа "колокольчик", которые применялись ранее, для обозначения факта
срабатывания термозащиты.
Короче, прямой намек на термозащиту.
Подтекст такой: до срабатывания термозащиты осталось столько-то градусов.
Вывод этой надписи на индикацию - совершенно обычнейший (с учетом PCLATH-дел).
После этого, нужно осуществить стандартную перекодировку и вывести одно-
разъединственное число в 7-е знакоместо 1-й строки дисплея.
Так как значение этого числа не превышает 9-ти, то проблем никаких нет (2/10
преобразование не нужно).
Далее, возникают орфографические проблемы.
3 градуса! - нормально. 2 градуса! - нормально.
А вот 1 градуса! - не нормально.
В связи с этим, нужно подсуетиться. Что и сделано.
Организован дополнительный анализ на предмет наличия/отсутствия числа 1.
Только с поправкой на скорректированный ранее результат (31h).
Если это не 1, то символ "а" не "убивается" (обход).
Если это 1, то "по верху" символа "а" записывается символ "!".
В этом случае, получается не один, а 2 восклицательных знака, что символизирует
грамотность, а заодно и крайнюю степень обеспокоенности (1 градус!! "Вопль души").
Если после этого, температура будет повышаться, то просто-напросто сработает
термозащита, и будет уже "совсем другая история" ("кардинальное пресечение
термобезобразия": Караул! Убивают! и т.д.).
Все это работает в программе BP_16.asm (прилагается), но только в ней, дела с
инерционностью зрабатывания защиты от КЗ совсем плохи.
Можно даже сказать, что отвратительны.
6
Об этом совсем не трудно догадаться.
Если бы "в дали не маячили голубые дали, то ушел бы, с горя, в монастырь".
К тому же, чередование надписей (в 1-й строке дисплея) происходит неравномерно.
Ну и пусть, ведь процедура-то работает, а это, на данном этапе работы, самое
главное.
"Подрихтовать-то" можно, но зачем тратить силы на то, что далее нужно будет
"перерихтовывать"?
На 2-м этапе и "подрихтую". Без бестолковки.
2-й этап работы
Итак, "от чего плясать", понятно.
Теперь нужно озаботиться инерционностью срабатывания защиты от КЗ.
И причем так, чтобы "не навредить предупреждалке".
Для того чтобы она не ухудшилась, нужно, для начала, перенести то, что
"текущенаворочено", со 2-й страницы памяти программ, в нижнюю "обслугу" 1-й
страницы памяти программ (ПП вычисляемых переходов нет).
Сравниваю "массу текущенавороченного" с "массой ефрейторского суперзазорища".
Первое соизмеримо со вторым.
С учетом "прищура на будущее", нужно "доставать заначку".
Мелочиться не буду.
Перенесу, с 1-й страницы памяти программ, на 2-ю (в нижнюю "обслугу"), все три ПП
записи в EEPROM (WR_TRIG, WRITE_TH, WRITE_TL).
Соответственно, на 1-й странице памяти программ, перед вызовом этих ПП, нужно
выбрать 2-ю страницу памяти программ (bsf PCLATH,3), а после возврата из них,
нужно выбрать 1-ю страницу памяти программ (bcf PCLATH,3).
По-моему, ничего особо сложного в этом нет.
Переход в ПП TERMOOSTATOK (выделено красным цветом) организуется так:
....................................
....................................
;--------------------------------------------------------------------------------
; Сравнение с верхним Т-порогом.
;--------------------------------------------------------------------------------
movf TermoP_H,W ; TermoP_H -> W.
subwf Temp_LSB,W ; Temp_LSB - TermoP_H =... (результат -> W)
btfsc Status,C ; Результат "+/=0" или "-"
; (порог превышен или нет) ?
goto PEREGREV ; Если верхний Т-порог превышен, то переход
; в ПП PEREGREV.
; Если не превышен, то программа
; исполняется далее.
;--------------------------------------------------------------------------------
; Переход в ПП работы с температурным остатком.
;--------------------------------------------------------------------------------
bcf PCLATH,3 ; Выбор 1-й страницы.
call TERMOOSTATOK; Переход в ПП TERMOOSTATOK.
;----> Возврат по стеку из ПП TERMOOSTATOK.
movlw high TEXT_22; Выбор 1-го блока
movwf PCLATH ; 2-й страницы.
;================================================================================
; Перевод числового значения младшего байта температуры в ширину импульсов.
;================================================================================
; Определение момента начала "загрузки" в CCPR1L/CCP1CON,5,4.
;------------------------------------------------------------
;;;PROPELLER à Название ПП аннулировано
....................................
....................................
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
; Исполняется в случае превышения верхнего Т-порога.
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
PEREGREV
....................................
....................................

7
Вместо TEXT_22, можно указать название любой таблицы, "лежащей" в 1-м блоке 2-й
страницы.
Название ПП PROPELLER аннулируется по причине невостребованности (происходит
возврат по стеку и команд переходов на нее нет).
ПП TEXT_46 переносится в 3-й блок 1-й страницы (там "места" еще много).
ПП TERMOOSTATOK переносится в нижнюю "обслугу" 1-й страницы.
А раз это так, то
- ENTER_BF_1 заменяется на ENTER_BF ("клон", работающий на 1-й странице),
- PAUSE_UI_1 заменяется на PAUSE_UI ("клон", работающий на 1-й странице),
- "PCLATH-конвой" ПП MULTI нужно убрать, так как она "лежит" на 1-й странице и
"конвоировать" ее просто "смертельно",
- организуется "зона" разрешения прерываний (на "влете" - разрешение, а перед
командами return - запрет),
- пока хватит (продолжение следует).
С учетом сказанного, получилось это:

;################################################################################
; ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ. ###############################################
;################################################################################
....................................
....................................
;================================================================================
; Задержка, определяющая скорость смены показаний и "добывание" результатов
; измерения (307925м.ц.х0,2мкс.=61585мкс., без учета call и return).
;================================================================================
PAUSE_UI movlw .228 ;
movwf Reg_1 ;
movlw .144 ;
movwf Reg_2 ;
movlw .2 ;
movwf Reg_3 ;

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


goto $-1 ; 3-байтный,
decfsz Reg_2,F ; вычитающий
goto $-3 ; счетчик.
decfsz Reg_3,F ;
goto $-5 ;
return ; Возврат по стеку.
;================================================================================
....................................
....................................
;================================================================================
; ПП "плавающей" задержки на основе анализа состояния флага занятости BF
; (вариант для 4-разрядного интерфейса).
;================================================================================
ENTER_BF
....................................
....................................
return ; Возврат по стеку.
;================================================================================
; Аварийная "пищалка" (мультивибратор, формирующий "пачку" импульсов).
;================================================================================
MULTI movlw .250 ; "Пищать" будем
movwf Reg_2 ; 250 периодов.

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


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

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


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

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


8
goto $-6 ; то дальнейшая его смена на уровень 0.
decf Reg_2,F ; Если на выходе защелки RC4 уровень 0,
; то Reg_2 - 1 = ... и программа
; исполняется далее.
btfsc Status,Z ; Каков результат декремента ?
return ; Если =0, то "пачка" импульсов сформирована
; и выход из "пищалки".
bsf PortC,4 ; Если не=0, то установка на выходе
; защелки RC4 уровня 1.
goto $-.10 ; Переход на формирование следующего периода.
;
================================================================================.
...................................
....................................
;-----------------------------------
; Надпись "До хх градуса!" (хх - колокольчики)
;-----------------------------------
TEXT_46 addwf PC,F ; -----"-----
dt 0xE0,0x6F,0x20,0xED,0xED,0x20,0x20,0x20
dt 0xB4,0x70,0x61,0xE3,0x79,0x63,0x61,0x21
;================================================================================
....................................
;################################################################################
; КОНЕЦ ВЕРХНЕЙ "ОБСЛУГИ" 1-й СТРАНИЦЫ. #########################################
;################################################################################

;********************************************************************************
; НАЧАЛО ИСПОЛНЕНИЯ ПРОГРАММЫ.
;********************************************************************************
....................................
....................................
....................................
....................................
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
; ПП работы с температурным остатком.
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
; Обработка числового значения остатка (подготовка).
;----------------------------------------------
TERMOOSTATOK
bsf IntCon,7 ; РАЗРЕШЕНИЕ ПРЕРЫВАНИЙ.
movwf Ostatok ; Результат вычитания копируется в регистр
; температурного остатка.
comf Ostatok,F ; Так как результат "-", то инверсия
; всех битов.
incf Ostatok,F ; Ostatok + .1 = ...
;================================================================================
; Группа команд анализа значения остатка.
;1111111111111111111111111111111111111111111111==================================
; Если до верхнего T-порога остался 1 градус.
;1111111111111111111111111111111111111111111111
movlw 1 ; W =.1
subwf Ostatok,W ; Ostatok -.1 =... (результат -> W)
btfss Status,Z ; Это .1 или другое число ?
goto Q_2 ; Если это не .1, то переход в проверку
; на соответствие числу .2
; Если это .1, то программа исполняется далее.
;----------------------------------------------
; Формирование звукового сигнала (1 "писк").
;----------------------------------------------
call MULTI ; Переход в ПП аварийной "пищалки".
;----> Возврат по стеку из ПП MULTI.
goto T_OSTATOK ; Переход в ПП T_OSTATOK.

;2222222222222222222222222222222222222222222222
; Если до верхнего T-порога осталось 2 градуса.

9
;2222222222222222222222222222222222222222222222
Q_2 movlw 2 ; -----"-----
subwf Ostatok,W ; Аналогично, но для числа .2
btfss Status,Z ; -----"-----
goto Q_3 ; Если это не .2, то переход в проверку
; на соответствие числу .3
; Если это .2, то программа исполняется далее.
;----------------------------------------------
; Формирование звукового сигнала (2 "писка").
;----------------------------------------------
movlw 2 ; Задание количества
movwf Temp ; "писков".

movlw 1 ; Задание
movwf Reg_3 ; паузы
movlw .100 ; между
movwf Reg_2 ; "писками".
call PAUSE_UI_A ; Формирование паузы между "писками".
;----> Возврат по стеку из ПП PAUSE_UI_A.
movlw .100 ; Задание длительности
movwf Reg_2 ; "писка".
call MULTI_1 ; Переход в ПП аварийной "пищалки".
;----> Возврат по стеку из ПП MULTI_1.
decfsz Temp,F ; "Постановка на счетчик"
goto $-9 ; количества "писков".
goto T_OSTATOK ; Переход в ПП T_OSTATOK.

;3333333333333333333333333333333333333333333333
; Если до верхнего T-порога осталось 3 градуса.
;3333333333333333333333333333333333333333333333
Q_3 movlw 3 ; -----"-----
subwf Ostatok,W ; Аналогично, но для числа .3
btfsc Status,Z ; -----"-----
goto $+3 ; Если это .3, то обход следующих двух команд.
bcf IntCon,7 ; Если это не .1, .2, .3,
; то ЗАПРЕТ ПРЕРЫВАНИЙ.
return ; Возврат по стеку.
;----------------------------------------------
; Формирование звукового сигнала (3 "писка").
;----------------------------------------------
movlw 3 ; Задание количества
movwf Temp ; "писков".

movlw 1 ; -----"-----
movwf Reg_3 ; -----"-----
movlw .50 ; Аналогично.
movwf Reg_2 ; -----"-----
call PAUSE_UI_A ; -----"-----
movlw .50 ; Задание длительности
movwf Reg_2 ; "писка".
call MULTI_1 ; -----"-----
decfsz Temp,F ; Аналогично.
goto $-9 ; -----"-----
;================================================================================
; ПП вывода на индикацию числового значения остатка.
;================================================================================
; Вывод на индикацию, в 1-ю строку, фиксированной надписи "До хх градуса!"
; (хх-колокольчики).
;--------------------------------------------------------------------------------
T_OSTATOK movlw high TEXT_46; Выбор PCH 1-й команды ПП TEXT_46.
movwf PCLATH ;

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


call ENTER_BF ; левое знакоместо 1-й строки.
movlw .16 ;
movwf Count ;
10
movf Count,W ;
sublw .16 ;
call TEXT_46 ; Аналогично, только
bsf PortC,RS ; для TEXT_46.
call ENTER_BF ;
decfsz Count,F ;
goto $-6 ;
;-----------------------------------
; Перекодировка.
;-----------------------------------
movlw 30h ; -----"-----
addwf Ostatok,F ; Ostatok + 30h = ...
;--------------------------------------------------------------------------------
; Вывод на индикацию, в 1-ю строку, числового значения остатка.
;--------------------------------------------------------------------------------
movlw b'10000110' ;
movwf PortB ; 1-я строка, 7-е знакоместо.
call ENTER_BF ;
movf Ostatok,W ; Вывод на индикацию
movwf PortB ; содержимого Ostatok.
bsf PortC,RS ;
call ENTER_BF ;
;----------------------------------------------------------
; Проверка на наличие превышения на 1 градус.
;----------------------------------------------------------
movlw 31h ;
subwf Ostatok,W ; Ostatok - 31h = ...
btfsc Status,Z ; Это 1 градус или нет ?
goto $+3 ; Если 1 градус, то обход следующих 2-х команд
bcf IntCon,7 ; Если это не 1 градус, то ЗАПРЕТ ПРЕРЫВАНИЙ.
return ; Возврат по стеку.
;----------------------------------------------------------
; Вывод на индикацию символа "!" ("убийство" символа "a").
;----------------------------------------------------------
movlw b'10001110' ;
movwf PortB ; 1-я строка, 15-е знакоместо.
call ENTER_BF ;
movlw 21h ; Вывод на индикацию
movwf PortB ; символа "!".
bsf PortC,RS ;
call ENTER_BF ;

bcf IntCon,7 ; ЗАПРЕТ ПРЕРЫВАНИЙ.


return ; Возврат по стеку.
;################################################################################
; КОНЕЦ НИЖНЕЙ "ОБСЛУГИ" 1-й СТРАНИЦЫ. ##########################################
;################################################################################
....................................
....................................

Для того чтобы как следует "въехать" в остальные особенности, нужно кое-что
объяснить.
Если применить "штатную пищалку" (ПП MULTI) и "штатную паузозадавалку" (ПП
PAUSE_UI), то в случаях формирования нескольких "писков", возникает "перебор".
В том смысле, что "железяка долговато пищит" (ожидая конца, "обкуришься". Условно).
Но ведь раньше-то "пищала резво".
Вопрос: "В чем собака порылась".
Ответ: она порылась в том, что и ПП MULTI, и ПП PAUSE_UI отрабатываются в
"зоне" разрешения прерываний.
То есть, "кусочно – рвано", что и приводит к существенному затягиванию времени их
отработки.
При этом, "пачка" как бы "рвется" на большое количество "кусков", и между этими
"кусками" будут паузы.

11
В данном случае, один такой "кусок" будет отрабатываться за 14 мкс., а одна такая
пауза будет отрабатываться за 86 мкс.
Таким образом, получается некий "коктейль", в котором будет доминировать более
низкочастотная (по отношению к "основному" тону) составляющая.
По этой же причине, спектр такого сигнала существенно "обогатится".
То есть, тон будет не высоким и "чистым", а более низким и с "хрипотцой".
Кстати, слушается все это "безобразие" вполне прилично.
Ну и ладушки (подфартило).
Разнообразие только приветствуется.
Особенно если это на пользу.
Ведь на слух (например, если глаза закрыты, пчела укусила, в форточку влетел
воробей и т.д.) можно будет определить, что "железяка пищит не абы по какому
поводу, а по поводу конкретного приближения к термоГитлеркапуту".
Да еще и "градус укажет".
По-моему, пользователю это вполне может понравиться.
Ну ладно, с тоном все понятно (красота! Ничего делать не нужно).
А как уменьшить время отработки ПП MULTI и PAUSE_UI ?
У ПП MULTI вообще нет никакой альтернативы, так как она одна.
Вызов ПП PAUSE_UI можно заменить вызовом другой ПП задержки, но это не
подходит: или "недолет", или "перелет", или "дороговато обходится" (по количеству
команд).
Первое, что приходит на ум, так это создание дополнительных подпрограмм.
Можно сделать и так, но это, опять же, не подходит, так как "ефрейторский
суперзазорище" не резиновый. Рачительные хозяева так не поступают.
Значит, нужно "извернуться" с тем, что есть.
Принцип прост: в ПП MULTI и ПП PAUSE_UI, выставляются метки MULTI_1 и
PAUSE_UI_A соответственно.
Если вызов "сориентировать" на них, то те команды, в которых задаются
времязадающие константы, будут банально обойдены.
Нужно только, перед каждым таким вызовом, задать те числовые значения этих
констант, которые требуются, и все дела.
Их можно подобрать экспериментально (это проще всего).
Я подобрал их так, что во всех трех случаях (разница 3, 2, 1 градус), цикл ПП
TERMOOSTATOK отрабатывается, примерно, за одинаковое время.
То есть, в "серии" из 3-х "писков", интервалы времени отработки "кусочно-рваных
пачек" и пауз между ними, условно говоря, малы.
В "серии" из 2-х "писков", эти интервалы времени побольше.
В "серии" из 1-го "писка", интервал времени отработки одной-разъединственной
"кусочно-рваной пачки" еще больше.
В последнем случае, я использовал ПП MULTI (экономия команд).
Это есть мой субъективный выбор.
Изменяя значения констант, Вы можете изменить величины этих интервалов времени
так, как сочтете нужным.
При формировании двух и трех "писков", я "закрыл глаза" на регистр младшего
разряда (Reg_1) по той простой причине, что "погоды он не делает" (в данном случае,
небольшой "шаляй-валяй" допустим).

Итог работы: "и овцы целы, и волки сыты".


В том смысле, что и "предупреждалка" сделана, и инерционность срабатывания
защиты от КЗ, как минимум, не ухудшилась.
Мало того, улучшилось соотношение времени нахождения рабочей точки программы в
"зонах" разрешения прерываний к времени ее нахождения вне этих "зон", что
увеличивает вероятность наиболее "скоростного" срабатывания защиты от КЗ.
Так как "предупреждалка" отрабатывается в "зоне" разрешения прерываний, то в
довольно-таки "массивном" интервале времени ее отработки, наихудшую инерционность
срабатывания защиты от КЗ можно считать равной наихудшей инерционности
срабатывания защиты от превышения порогов U/I.

12
Проще говоря, если короткое замыкание произойдет в интервале времени отработки
"предупреждалки", то инерционность срабатывания защиты от КЗ не будет хуже ста
микросекунд.

Программа, в которой это реализовано, называется BP_17.asm (прилагается).


В ней, и текущее дело сделано, и осталось еще 32 ячейки "ефрейторского
суперзазорища" (в хозяйстве пригодится).
Работает все это "безобразие" так.
Если термодатчик электрически и программно подключен, а также и "службу свою
справно тащит", работа происходит обычным образом.
То есть, в верхней строке дисплея "высвечивается" ЗАЩИТА ВЫКЛ. t = xx, где хх -
текущие значения температуры.
Для того чтобы увидеть, как это работает, в меню порогов, выставите минимальные
значения термопорогов: Тн = 30 градусов и Тв = 35 градусов (долговременно нажмите
кнопку "-/Нет", дождитесь окончания "писков" и отожмите ее).
Это чтобы не греть датчик паяльником или чем-то аналогичным.
Тепла рук (по крайней мере, моих) будет маловато.
А вот тепла губ - в самый раз.
Возьмите датчик в губы (можно его даже и поцеловать. Достоин) и посмотрите, какие
"чудеса будут твориться".
До 32-х градусов, ничего выдающегося происходить
не будет (ЗАЩИТА ВЫКЛ. t = xx / U=xx,xв I=x,xxa).
Но как только "стукнет" 32 градуса, Вы увидите то,
что изображено на картинке слева.
Примечание: естественно, что показания U/I могут
быть другими.
Это предупреждение о том, что до верхнего Т-порога
(до срабатывания термозащиты) осталось 3 градуса.
Потом эта надпись сменится на ту, которую Вы
видите на нижней картинке.
Это "штатная" надпись, к которой, я надеюсь, Вы уже
привыкли.
Прибавив 3 градуса к 32-м градусам, Вы получите
значение верхнего Т-порога.
А можете и не прибавлять, так как этот "калькулятор" работает четко (зря что-ли
старался?).
Далее, эти картинки чередуются, что позволяет "усечь" следующую информацию (вся à
в динамике):
- о текущих значениях U/I,
- о текущем значении температуры,
- о текущем значении "термоостатка".
Все это "безобразие", в данном случае, сопровождается "сериями", состоящими из трех
"писков".
То есть, если Вы будете находиться, к примеру, в туалете, и услышите этот "сигнал
бедствия", то подсчитав количество "писков" в одной серии, Вы будете точно знать об
угрозе потенциального "термоГитлеркапута", и даже сможете прикинуть (по уменьшению
количества "писков" в одной "серии"), сколько до него осталось.
Примечание: если в течение интервала времени работы этой "предупреждалки"
сработает защита от КЗ, то нагрузка будет отключена и на индикацию будет выведена
соответствующая надпись (работа "в связке").
Если, в дальнейшем, температура будет повышаться,
то вместо одной из "вышележащих" картинок, Вы
увидите то, что изображено на картинке слева.
При этом, количество "писков" в "серии" уменьшится,
с трех коротких, до двух более длинных "писков".
Чередование картинок будет продолжаться.
Если, в дальнейшем, температура еще повысится, то
Вы увидите то, что изображено на нижней картинке.
13
2 восклицательных знака символизируют крайнюю степень озабоченности "железяки"
происходящим.
При этом, количество "писков" в "серии" уменьшится, с двух коротких, до одного.
Этот "писк" - самый "длинный" (во времени).
Чередование картинок будет продолжаться.
Если же и после этого температура будет расти, то наступит "штатный
термоГитлеркапут" типа Караул! Убивают! (ну и так далее).
С этим Вы уже знакомы.
Если же, по ходу отработки всего этого "безобразия", температура вдруг, по каким-то
радостным причинам, начнет понижаться, то произойдет автоматический выход из
"предупреждалки", и в дальнейшем, она будет банально обходиться (до следующего
SOS).
Теперь, Караул! Убивают! (ну и так далее) утратило свою внезапность и больше не
будет так сильно пугать людей, как ранее.
Теперь, человек будет доводиться до испуга постепенно.
С помощью "информоёмкой предупреждалки".
Или "напоминалки", "вопилки", "кричалки" и т.п.
Это кому как нравится. На смысл не влияет.
Кто скажет, что это не гуманно?
Большая часть пользователей гуманизм ценят.
Что дальше?
Трудно сказать. От музы зависит. Прилетит или не прилетит?
Капризная она. Избалованная. И альтернативы ей нет.
Чуть что не по ней, так сразу обижается и улетает в неведомые дали.
Если прилетит, то что-нибудь еще "состряпаю" (вдохновение под каждым кустом не
валяется).

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

15

Оценить