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

5/13. “Наведение порядка” в области отрицательных температур.

Окончательное
формирование текстов программ (результат коллективной работы).

Подвожу итог коллективной работы с программами термометров.


В области положительных температур, термометры работают без замечаний.
О работе в области отрицательных температур этого не скажешь.
В диапазоне целых значений отрицательных температур, термометры работают без
замечаний, но имеет место быть “вранье” в показаниях после запятой (в пределах
одного градуса).
В части касающейся шага измерения в 0,5 градуса, первым на это указал Руслан
Липин, а Иван Муравлев “просканировал” это “вранье” в части касающейся шага
измерения в 0,1 градус.
Безоговорочно признаю, что это мой недогляд: во время “морозильных испытаний”,
нужно было внимательнее приглядеться к “бегающим” цифрам, которые расположены
после запятой.
Крылышек за спиной у меня нет (увы, не было и не будет), специально щупал.
Даже и не проклевываются, но без них даже интереснее, так как в безгрешном мире
жить очень скучно и нудно.
А вот когда жизнь “бъет ключем по голове”, то о какой скуке может идти речь?
“Увертывание” есть движение, а движение есть жизнь (диалектика …), и в данном
случае, она (жизнь) имеет место быть.
Так что я особо не печалюсь, а скорее наоборот, радуюсь, в том числе и “лицам со
все меньшим и меньшим количеством фингалов”.
Это внушает оптимизм в части касающейся усвоения эффективной техники
“увертываний” от “больших и волосатых кулаков” и техники эффективных “ответных
ударов” (разумное движение).
Я уже приводил достаточно много примеров разумного движения, в результате
которого человек достигает желаемого.
Приведу еще один.
Эту работу сделал Иван Муравлев (информация Ивана выделена темно – синим
цветом).
После изучения пятого раздела, решил сделать электронный термометр на одном
датчике DS1820.
В построении трудностей не возникло.
Копировал по очереди .asm файлы, программировал, и всё работало прекрасно.
Проверял только с положительной температурой.
Приобрёл ещё один датчик DS1820, скопировал файл 0_1grad6.asm с двумя
датчиками, запрограммировал, всё заработало прекрасно.
Далее решил проверить температуру в холодильнике и в морозилке.
В области отрицательных температур, началось что-то непонятное с цифрами
после запятой.
Снял все показания с ЖКИ и нарисовал на бумаге. Вот что получилось:

Примечание: картинки, которые мне прислал Иван, я немного видоизменил, но они в


точности отражают смысл того, о чем он говорит.
Пока разбирался, почему происходит такой сдвиг цифр, от Вас пришла новая
информация по обмену опытом 3/2, где Руслан предлагает удалить команду
инкремента Temp_LSB в подпрограмме MINUS, но для порога измерения в 0,5
градуса.
Этим я и поспешил воспользоваться, но для порога измерения в 0,1 градус.
Удалил команду инкремента и цифры выстроились в ряд, только в обратном
порядке.

1
Далее я воспользовался информацией раздела 5/8 стр.16. “…..Можно и не
использовать константу .16 (и соответственно, операцию вычитания), но в
этом случае, перед копированием содержимого регистра Count_REM в регистр
W, нужно произвести один декремент (так как диапазон чисел, хранящихся в
регистре Count_REM, составляет .1 … .16) и “поставить вычисляемый переход
с ног на голову” (сверху 9, снизу 0)…..”
Проигнорировав последнее предложение, сделал некоторые изменения в
подпрограмме формирование символов после запятой.
Вот что получилось:
;--------------------------------------
; Формирование символов после запятой.
;--------------------------------------
btfsc Temp_MSB,0 ; Результат измерения положительный или
; отрицательный?
goto MINUS_1 ; Если отрицательный, то переход в ПП MINUS_1.
movf Count_REM,W ; Если положительный, то копирование
; содержимого Count_REM в W.
sublw .16 ; .16-Count_REM(от.1 до.16) = от.0 до.15(W).
goto $+2 ; Обход следующей команды.
MINUS_1 decf Count_REM,W ; Декремент содержимого регистра Count_REM.
call TEXT_1 ; Переход в перекодировщик 16/10.
;----> Возврат по стеку из ПП TEXT_1.
bsf PortA,RS ; "Плавающая" задержка со стробом под вывод
call ENTER_BF ; данных на индикацию.
;----> Возврат по стеку из ПП ENTER_BF.
;-----------------------------------------

Примечание: красным цветом выделены дополнительные команды, введенные в


состав группы команд формирования символов после запятой.

После этих изменений, цифры встали, как им и положено, на свои законные места:

После получения удовлетворения от правильной работы двух датчиков, решил


увеличить их количество. Приобрёл ещё два датчика DS18S20.
Переход к четырём датчикам трудностей не вызвал. Работают как «звери».

Cидя у морозилки в позе мыслителя и, на этот раз, зорко вглядываясь в показания


ЖКИ модуля, я в очередной раз убедился в том, что, из-за отсутствия должной
внимательности, желаемое не всегда может совпадать с действительным.
А действительность подтверждает информацию Ивана. “Крыть нечем”.
Работающая, так как нужно, “железяка”, в нашем деле - высший суд.
Осталось только объяснить, почему раньше было “так, а не эдак”.
1. Сравните рисунки 1 и 2.
Вы видите то, что, после “убийства” команды incf Temp_LSB,F, если “привязаться” к
интервалам между целыми значениями температуры, происходит нечто похожее на
смену местами полубайтов.
Обращаю Ваше внимание на то, что это вовсе не смена местами полубайтов в
“чистом виде”, а только то, что на эту смену, формально, похоже.
Если придерживаться этой “концепции”, то Вы попадете в “ловушку” или “тупик”, из
которого выхода нет (как в патовой шахматной партии).
И в самом деле, в части касающейся рассматриваемого, команда инкремента
содержимого младшего байта температуры, по определению, не может привести к
смене полубайтов, а тем более в независящем от нее регистре Count_REM.

2
Эта команда также не может повлиять на адресацию табличного вычисляемого
перехода подпрограммы TEXT_1.
Вот вам и “тупик”: при применении команды incf Temp_LSB,F, мнимая “смена
полубайтов” происходит, а почему она происходит, “ни с какого бока” не объяснишь, а
если и объяснишь, то это будет не соответствовать действительности.
Это мне напоминает древнюю попытку объяснения “устройства мира”, исходя из
предположения, что Земля не круглая, а какая-то другая.
Собственно говоря, в последнем предложении “заложен” ответ: предположение
(критерий) не верно, так как оно не обеспечивает разумного объяснения.
Следовательно, нужно предположить что-то другое.
Для этого нужно внимательно приглядеться к рисункам 1 и 2.
На рис. 1, смена целых значений температуры “привязана” к цифре 4, а на рис. 2,
смена целых значений температуры “привязана” к цифре 9.
А теперь давайте “забудем” об этих “привязках” (предположим, что целые значения
температуры “моль съела”).
Что получается?
А получается, что никакой “смены полубайтов” (не мнимой, не явной) и в помине нет,
и ряд цифирок на одном рисунке просто смещен относительно точно такого же ряда
цифирок на другом рисунке, причем, “не от балды”, а ровно на пол-градуса (если
масштабировать).
Задействую образы.
А если оба ряда этих цифирок совместить, в таком положении зафиксировать, и
“вспомнить” о целых значениях температуры (с учетом их “привязок”)?
А если также зафиксировать ряд целых значений температуры рисунка 2?
Что получится?
В этом случае, “скакать” будут не “мнимые полубайты”, а целые значения температуры
рисунка 1, причем, после исполнения команды incf Temp_LSB,F, они “скакнут” влево
ровно на пол-градуса.
Почему влево и почему на пол-градуса?
Вот мы и “вышли” на команду инкремента содержимого регистра Temp_LSB.
“Попалась птичка (резидент) в когти ясна – сокола (контрразведчика)”.
Теперь все сходится.
Во-первых, целые значения температуры “лежат” в регистре Temp_LSB, и регистр
Count_REM (а также и табличный переход) “здесь вообще не при чем”.
Во-вторых, что такое incf Temp_LSB,F?
Это увеличение содержимого регистра Temp_LSB на 1.
Это соответствует приращению (по абсолютной величине) в 0,5 градуса.
Вот Вам и “скачек” влево (ряда целых значений температуры рисунка 1) на 0,5
градуса.
Все “железобетонно” объяснилось и никакого “тупика” в помине нет.
Просто?
Безусловно, но при одном условии: должна работать фантазия, то есть, образы.
Плюс “жесточайшая”, беспристрастная и неумолимая аналитика.
Этот “гибрид” подобен “гремучей смеси”: “рванет” так, что любую проблему “в клочья
разнесет”.
А так как я ярый сторонник таких отрадных событий, то, как настоящий зануда, не
упущу повода вновь напомнить Вам о том, что образное мышление есть большой и
мощный “зер гут”, и его нужно постоянно “тренировать”.
Вывод по команде incf Temp_LSB,F: так как указанные выше “перескоки” лучше “видеть
в гробу, в белых тапках”, то эту команду нужно “убить”.
После этого, рисунок 1 “вычеркивается из списка живых” и далее работаем с рис. 2.
2. Теперь, для того чтобы обеспечить нужный порядок смены цифр после запятой,
нужно доработать программу.
Иван это сделал так, как указано выше.
“У матросов нет вопросов”: все по делу и абсолютно разумно.
Процедура формирования символов после запятой начинается с проверки на
принадлежность результата измерения к положительной или отрицательной области
температур.

3
Если температура положительная, то работа происходит точно так же, как и при
отсутствии доработок.
Если температура отрицательная, то происходит переход в ПП MINUS_1, в начале
которой исполняется “указивка”:
“…..Можно и не использовать константу .16 (и соответственно, операцию
вычитания), но в этом случае, перед копированием содержимого регистра
Count_REM в регистр W, нужно произвести один декремент (так как диапазон
чисел, хранящихся в регистре Count_REM, составляет .1 … .16)
Формально, это две команды (decf Count_REM,F и movf Count_REM,W), но их можно
(и нужно) заменить одной командой decf Count_REM,W.
…..и “поставить вычисляемый переход с ног на голову” (сверху 9, снизу 0)…..”
Надобность в этом отпадает, так как после “убийства” команды инкремента, цифры,
после запятой, выводятся в обратном порядке (см. рис. 2).
Задача решена и выглядит это решение так:
---------------------------------
---------------------------------
;----------------------------------------------------------
; Перевод двоичного числа младшего байта температуры
; из отрицательной области температур в положительную.
;----------------------------------------------------------
comf Temp_LSB,F ; После вывода на индикацию символа "-", все
; биты младшего байта температуры инвертируются
; Команда инкремента “убита”
;================================================================================
; Подпрограмма обработки содержимого младшего байта температуры.
;================================================================================
---------------------------------
---------------------------------
---------------------------------
;-------------------------------------
; Формирование символов после запятой.
;-------------------------------------
btfsc Temp_MSB,0 ; Результат измерения положительный или
; отрицательный?
goto MINUS_1 ; Если отрицательный, то переход в ПП MINUS_1.
movf Count_REM,W ; Если положительный, то копирование
; содержимого Count_REM в W.
sublw .16 ; .16 - Count_REM (от .1 до .16) = от .0 до
; .15 (W).
goto $+2 ; Обход следующей команды.
MINUS_1 decf Count_REM,W ; Калибровочный декримент содержимого
; регистра Count_REM.
call TEXT_1 ; Переход в перекодировщик 16/10.
;----> Возврат по стеку из ПП TEXT_1.
bsf PortA,RS ; "Плавающая" задержка со стробом под вывод
call ENTER_BF ; данных на индикацию.
;----> Возврат по стеку из ПП ENTER_BF.
;================================================================================
; Гашение правого незначащего ("паразитного") нуля.
;================================================================================
---------------------------------
---------------------------------
Доработка минимальна по количеству команд (“зер гут”), но, тем не менее,
функционально насыщена.
Чтобы сделать такую доработку, нужно хорошенько разобраться с работой программы,
а это дорогого стоит.
Руслан и Иван, спасибо за действенную помощь в работе.
Приятно иметь дело с внимательными и эффективно думающими людьми.
Ну и я тоже внесу свою “лепту”.
3. В своих бдениях около урчащей морозилки, я заметил, что при переходе через
ноль, надпись “НОРМА” сменяется на надпись “АВАРИЯ”.
Это может быть практически полезным, а может и не быть.
4
Если такой вариант работы термометра устраивает, то ничего делать не нужно, а если
не устраивает, то нужно “пошевелить извилиной”.
“Шевелю”.
Почему, после перехода в область отрицательных температур, на индикацию выводится
надпись “АВАРИЯ”?
Потому, что определение превышения (или нет) температурного порога (результат
записывается в бит №5 регистра Flag) происходит до инверсии содержимого младшего
байта температуры (инверсия имеет место быть только в случае работы в области
отрицательных температур).
Какие числовые значения имеет неинвертированный младший байт температуры при
работе в непосредственной близости (слева) от нулевой температуры?
В этом случае, числовые значения младшего байта температуры будут значительными,
и эти числовые значения, на довольно-таки протяженном участке области
отрицательных температур, будут превышать числовое значение температурного порога.
Вот в бите №5 регистра Flag и устанавливается 1 (признак превышения
температурного порога), и соответственно, на индикацию выведется надпись “АВАРИЯ”.
“Откуда ноги растут” понятно.
Теперь, при работе в области отрицательных температур, нужно просто заблокировать
вывод на индикацию надписи “АВАРИЯ”.
Я сделал это так:
---------------------------------
---------------------------------
;********************************************************************************
; ПОДПРОГРАММА ВЫВОДА НА ИНДИКАЦИЮ.
;********************************************************************************
; Работа в 1-й строке.
;********************************************************************************
; Выбор знакоместа в 1-й строке, с которого будет
; выводиться на индикацию надпись "НОРМА:" или "АВАРИЯ".
;-------------------------------------------------------
DISPLAY movlw b'10000101' ; Выбор ячейки DD RAM с адресом 05h, что
; соответствует установке курсора в 6-е слева
; знакоместо 1-й строки.
call ENTER_BF ; "Плавающая" задержка со стробом
; под команду 10000101.
;----> Возврат по стеку из ПП ENTER_BF.
clrwdt ; Сброс WDT.

btfsc Temp_MSB,0 ; Температура положительная или отрицательная?


bcf Flag,5 ; Если отрицательная, то блокировка
; надписи "АВАРИЯ".
; Если положительная, то блокировки
; надписи "АВАРИЯ" нет.
;-----------------------------------------------
; Анализ состояния аварийного флага.
;-----------------------------------------------
btfss Flag,5 ; Бит №5 регистра Flag =0 или =1 ?
goto OBHOD ; Если =0, то выводится надпись "НОРМА:".
; Если =1, то выводится надпись "АВАРИЯ".
---------------------------------
---------------------------------

4. Теперь, после этих доработок, нужно разобраться с тем, что из себя представляет
“граница” между областями положительных и отрицательных температур.
Я провел один “хитрый эксперимент” и опытным путем, абсолютно точно, выяснил то,
что Вы видите на рис. 5.

5
“Граница пролегает” между двумя нулями (имеется ввиду нули после запятой), причем,
правый ноль относится к области положительных температур, а левый ноль
относится к области отрицательных температур.
5. Вот теперь можно со спокойной совестью “сдать в эксплуатацию” отработанные
тексты программ, которые работают с шагом измерения в 0,1 градус.

Программа 0_1grad1.asm “трансформировалась” в программу 01grad1.asm.


Программа 0_1grad2.asm “трансформировалась” в программу 01grad2.asm.
Программа 0_1grad3.asm “трансформировалась” в программу 01grad3.asm.
Программа 0_1grad4.asm “трансформировалась” в программу 01grad4.asm.
Программа 0_1grad5.asm “трансформировалась” в программу 01grad5.asm.
Программа 0_1grad6.asm “трансформировалась” в программу 01grad6.asm.

Тексты программ 01grad1.asm … 01grad6.asm прилагаются.


Что касается программ с шагом измерения в 0,5 градуса, то желательно
самостоятельно “трансформировать” их в программы, не содержащие команд
incf Temp_LSB,F.

Вопрос от Ивана: “Разброс в показаниях между двумя датчиками одного типа


составили: для DS1820, приблизительно 0,4…0,7 градусов, а для DS18S20, в
районе 0,1 градуса.
Для электронных датчиков DS1820 такое большое расхождение в показаниях, это
большая «роскошь».
Можно ли на этих датчиках производить калибровку”?
Можно, если показания одного из датчиков принять за “эталон” и под этот “эталон”
подогнать показания остальных датчиков путем введения программных поправок как в
целую, так и в дробную часть результата замера, только программа от этого,
естественно, усложнится. Это на любителя.
По-моему, проще использовать датчики от DS18S20 и выше. Они имеют достаточно
высокие точностные показатели и малый разброс показаний.

“Бяки”, опытным путем, “вычислили” Руслан и Иван, а я их объяснил.


Кто после этого скажет что-то плохое про коллективную работу?
Вот Вам и жизненный пример реализации одного из пунктов “японской модели
развития”.
Именно таким образом и создаются не только отдельные, конкурентоспособные
устройства, но и целые направления в электронике.
И еще: когда программа “блестит и сияет”, людям, которые ей пользуются, совершенно
“по барабану”, через какие “трагедии” и “катаклизмы” разработчики к этому пришли.
Их интересует исключительно конечный результат.
Наш же удел - “трагедии” и “катаклизмы”, то есть, бурная, насыщенная поражениями и
победами, жизнь. И от этого никуда не денешься (диагноз).

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