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

5/5.

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


проверочное устройство п/раздела 5/3 дополнительной функциии
предварительной записи, в EEPROM память DS1820 (DS18S20), пороговых
значений температуры, с возможностью изменения и контроля их значений
(или “откуда берутся дети”?).

Возможности датчика DS1820 (DS18S20) таковы, что, с его помощью, можно


регулировать значение температуры в заданном температурном диапазоне.
То есть, речь идет о системе с обратными связями, которая “заталкивает” текущую
температуру в заранее определенный конструктором температурный диапазон.
При выходе значения температуры за пределы этого диапазона, “мастер” вырабатывает
сигнал управления внешним устройством (например, нагревательным элементом),
который, в конечном итоге (с поправкой на инерционность), и обеспечивает это
“заталкивание”.
По этому принципу строятся системы автоматического регулирования температуры.
Для того чтобы иметь критерий наличия или отсутствия сигнала управления внешним
устройством, необходимо “привязаться” к неким пороговым значениям температуры.
В части касающейся датчика DS1820, эти пороговые значения, изначально (например,
где-нибудь в начале полного цикла программы) можно определить программно, а
затем, после формирования результата текущего замера, сверять с ним эти пороговые
значения (естественно, с соответствующими “оргвыводами”).
Так сделать можно, правда, с поправкой на специфику, это будет прилично “весить”
(по количеству команд), плюс, соответствующий “тормоз”, и особенно в случае наличия
большого количества датчиков.
Разработчики прикинули последствия этого “безобразия”, ужаснулись (конкуренция и
т.д.) и сделали так: “сваяли” область EEPROM памяти, состоящую из 2-х ячеек и
“привязали” ее к 3-й и 4-й ячейкам области оперативной памяти.
Если один раз, то есть, сразу же после включения питания, автоматически переписать
содержимое двух ячеек области EEPROM памяти DS1820 в соответствующие две
ячейки области оперативной памяти DS1820 (мозги конструктора отдыхают), а затем
использовать только эти две ячейки области оперативной памяти, то будет ляпота.
Так они и сделали.
Таким образом, после включения питания и до начала работы программы “мастера”, в
3-й и 4-й ячейках области оперативной памяти DS1820 уже “лежат” байты, числовые
значения которых определяют нижний и верхний пороги температуры.
По умолчанию, на заводе – изготовителе, в область EEPROM памяти DS1820,
записываются числа, величины которых находятся за пределами “паспортного” значения
диапазона температур, в котором работает DS1820.
Естественно, в этом случае, работать с такими порогами просто бессмысленно, так как
за них не “выйдешь”.
Таким образом, люди, страстно возжелавшие поработать с температурными порогами,
“упираются лбом” в вопрос: “Как записать в ячейки области EEPROM памяти DS1820
выбранные ими значения температурных порогов”?
Есть команда записи байтов в область EEPROM памяти DS1820?
Есть. Она называется Copy Scrathpad (48h), но это не команда прямого действия, так
как, с ее помощью, осуществляется копирование (запись), в ячейки EEPROM памяти
DS1820, содержимого 3-й и 4-й ячеек области оперативной памяти DS1820.
Значит, сначала нужно записать числа температурных порогов в 3-ю и 4-ю ячейки
области оперативной памяти, а только после этого производить их запись в
соответствующие ячейки области EEPROM памяти.
Можно ли это сделать в “боевой” программе?
Можно, но элементарный здравый смысл сразу же поднимает “бунт”: “Зачем в “боевой”
программе нужен этот одноразовый “геморрой”? “Боевая” программа должна работать с
уже записанными ранее, в ячейки области EEPROM памяти, числовыми значениями
температурных порогов! Он (“геморрой”) лишний на этом празднике жизни”. Им, во всех
отношениях, выгоднее заняться “на периферии””.
И в самом деле, если байты, с заданными числовыми значениями температурных
порогов, заранее записаны в ячейки области EEPROM памяти DS1820, то, сразу же

1
после включения питания, эти байты, стараниями разработчиков, автоматически
перепишутся в 3-ю и 4-ю ячейки области оперативной памяти DS1820 (сервис), а
после этого, можно сразу “брать быка за рога”.
В части касающейся работы с температурными порогами, последнее (“бык с рогами”)
означает то, что имеется команда Alarm Search (ECh), на которую будут откликаться
только те датчики, у которых результат последнего измерения температуры выходит за
“границы” температурных порогов.
Прикиньте, на сколько упрощается “боевая” программа.
Вывод: нужно сконструировать некое вспомогательное устройство, позволяющее
осуществить запись, в область EEPROM памяти DS1820, байтов с числовыми
значениями температурных порогов, заданными конструктором.
Это мы уже проходили в подразделе 5/3, в котором шла речь об устройстве потокового
считывания из ПЗУ DS1820 (DS18S20), в EEPROM память PIC16F84A, байтов типа устройства,
серийного номера и контрольной суммы.
Теперь нужно расширить его функциональность с тем расчетом, чтобы, кроме
реализации указанной выше функции, это устройство еще и записывало бы, в область
EEPROM памяти DS1820, байты температурных порогов.
Кроме того, с целью проверки правильности записи числовых значений этих порогов,
после нее, должно быть произведено контрольное считывание содержимого области
EEPROM памяти DS1820, с записью результата этого считывания в EEPROM память
ПИКа.
После этого, в PonyProg или IcProg105, можно все это “добро” как следует
рассмотреть.
Таким образом, речь идет о конструировании двухфункционального, вспомогательного
устройства, результаты “деятельности” которого будут отображены в области EEPROM
памяти ПИКа.
Получается очень нужная “штучка”, которую, в идеале, можно оформить в виде
отдельного устройства.
При этом, я “привяжусь” к принципиальной схеме подраздела 5/3, а это означает то,
что нужно будет только сменить прошивку.
Напоминаю, что эта схема работает только с одним датчиком. Параллелить датчики
нельзя.
Если Вы хотите “ввести в эксплуатацию” “новый” датчик, то отключите от линии DQ
“старый” датчик (питание можно не отключать, а отключить только DQ) и подключите к
ней “новый” датчик.
Кроме того, можно использовать принципиальную схему подраздела 5/2 (с контрольным
светодиодом или без него - на Ваш выбор). Короче, “возни” - минимум.
Что такое температурные пороги?
При работе с температурными порогами, весь температурный диапазон DS1820 делится
на две области: область температурного диапазона с допустимыми значениями
температур и область температурного диапазона с недопустимыми значениями
температур.
Соответственно, имеет место быть нижний порог температуры (условное название TL)
и верхний порог температуры (условное название TH).
В большинстве случаев, область температурного диапазона, с допустимыми значениями
температур, располагается между этими порогами.
Все остальное - область температурного диапазона с недопустимыми значениями
температур.
О том, как все это “добро” приспособить к практическим потребностям, будет
рассказано в следующем подразделе, а сейчас, для начала, нужно понять “механику”
создания этих “прибамбасов”.
Пары байтов TH и TL имеются и в области оперативной памяти (3-я и 4-я ячейки
соответственно), и в области EEPROM памяти (занимают обе ячейки, то есть, всю
область EEPROM памяти DS1820).
Между этими областями, используя соответствующие команды, можно организовать
обмен байтами как в одном направлении, так и в другом направлении.
Сразу обращаю Ваше внимание на то, что, в части касающейся задания
температурных порогов и их контрольной проверки, в разрабатываемом устройстве,

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

Вы видите последовательность действий, реализованную во вспомогательном


устройстве. Можно даже сказать, что это максимально сжатая блок-схема программы.
Первые 4 пункта мы уже проходили ранее (см. подраздел 5/3), и останавливаться на
них я не буду.
А вот стратегию всего остального нужно прояснить.
Прежде чем записать константы температурных порогов в область EEPROM памяти
DS1820, нужно их сначала записать в 3-ю и 4-ю ячейки области оперативной памяти
DS1820 с названиями TH и TL соответственно.
Почему?
А по аналогии с регистром W. В ПИКе, подобного рода дела делаются через него
(напрямую переписать байт, из одного регистра в другой, нельзя).
И здесь то же самое.
Просто, в данном случае, речь идет не об одной паре регистров, а о двух.
Итак, передаем команду Write Scrathpad (4Eh).
Эта команда только разрешает запись байтов в область оперативной памяти DS1820,
но не производит этой записи.
Следовательно, после этой команды, нужно произвести процедуру записи.
При этом, имеется одна важная особенность: запись производится потоково, но
начиная не с 1-й ячейки, а с 3-й ячейки.
3
Это разработчики подсуетились, и правильно сделали. Зачем ломать голову над тем,
что “воткнуть” в ячейки младшего и старшего байта температуры?
Да и в данном случае, это вовсе не нужно.
А раз это так, то пороговые константы записываются в 3-ю и 4-ю ячейки, и на этом
запись “принудительно” прекращается.
И в самом деле, зачем ерундой заниматься, если практического смысла, в записи
следующих байтов, нет?
Еще раз оговариваюсь - в данном случае.
Итак, пороговые константы в область оперативной памяти DS1820 записаны, и теперь
(по аналогии с регистром W) их нужно скопировать (записать) в область EEPROM
памяти DS1820.
Для этого служит команда Copy Scrathpad (48h).
А вот эта команда (строка №9) не только разрешает, но и дает “отмашку” на
копирование байтов из области оперативной памяти в область EEPROM памяти
DS1820, то есть, после этой команды начинается запись.
Она является потоковой (для 2-х байтов, это громко сказано, но тем не менее), так
как DS1820 сам “озаботится” тем, чтобы записался не один байт, а два байта.
Нужно только немного подождать, чтобы эта процедура закончилась.
Вот Вам и задержка (строка №10).
Я с ней поэкспериментировал, и по большому счету, она может быть мизерной, но я,
на всякий случай, сделал ее равной 2,5мс. Так оно как-то спокойнее, да и программа
вспомогательная, поэтому “спешить и падать” совсем не нужно.
“За скобками” остались строки №№7 и 8.
Зачем нужна “связка” инициализация – команда Skip ROM?
А нужна она для ликвидации “недоразумения”, которое связано с предшествующей
командой Write Scrathpad.
Цикл-то записи искусственно прерван (записали только 2 байта), и следующая команда
не будет исполнена до тех пор, пока этот цикл полностью не завершится.
Проще всего, для ликвидации этого “геморроя”, не ломать голову над завершением
цикла записи, а применить указанную выше связку.
После ее применения все “шито – крыто” и DS1820 находится в “девственном”
состоянии.
Теперь смотрите что получается: и в области EEPROM памяти, и в соответствующих
ячейках области оперативной памяти, “лежат” две одинаковые пары констант.
А ведь контрольная запись, считанных из области EEPROM памяти DS1820, пороговых
уровней, в EEPROM память ПИКа, будет происходить все через ту же область
оперативной памяти DS1820 (опять вспомните про регистр W).
А если перезапись пороговых констант из области EEPROM памяти DS1820 в область
оперативной памяти DS1820 (команда Recall E2) прошла “криво” или она, по каким-то
причинам, вообще не произошла?
В последнем случае, получится то, что, не смотря на эту явную, “глобальную” ошибку,
из области оперативной памяти DS1820, в EEPROM память ПИКа, запишутся
безошибочные значения пороговых констант!!!
Короче, “мошенничество в чистом виде”.
Чтобы “в корне пресечь это безобразие”, нужно, после окончания процедуры
копирования температурных порогов из области оперативной памяти DS1820 в область
EEPROM памяти DS1820 (команда Copy Scrathpad), но перед осуществлением
процедуры записи температурных порогов из области оперативной памяти DS1820 в
EEPROM память ПИКа, “принудительно” записать в 3-ю и 4-ю ячейки области
оперативной памяти DS1820 какое нибудь “бросающееся в глаза” число, однозначно не
соответствующее любым значениям температурных порогов.
После этого, указанное выше “мошенничество” становится невозможным, так как, после
контрольного считывания, оно сразу же “разоблачается”.
Для осуществления этого благого наменения, я выбрал число FFh.
А раз это так, то, после команды Copy Scrathpad (строка 9), нужно записать, в 3-ю и
4-ю ячейки области оперативной памяти DS1820, числа FFh, что и имеет место быть
(команда Write Scrathpad, строка 11).
Эта команда не имеет отношения к ПЗУ, и поэтому, перед ее применением,
инициализации DS1820 производить не нужно.
4
А вот после этого, со спокойной совестью, можно записывать температурные пороги из
области EEPROM памяти DS1820 в 3-ю и 4-ю ячейки области оперативной памяти
DS1820.
Это делается при помощи команды Recall E2 (B8h) (строка 13).
Эта команда не только дает разрешение на копирование байтов из области EEPROM
памяти DS1820 в область оперативной памяти DS1820, но и производит само это
копирование (в автомате).
Следовательно, нужно подождать, пока этот процесс не завершится.
Вот Вам и задержка (строка 14).
Примечание: копируется только содержимое области EEPROM памяти DS1820, то есть,
2 байта температурных порогов (а больше и копировать нечего).
Реально, величина требуемой задержки, обозначенной в строке 14, мала, но я, исходя
из соображения обеспечения гарантированной надежности копирования (“кашу маслом
не испортишь”), сделал ее равной 2,5мс., что во много раз перекрывает эту
“требуемую” величину.
Теперь смотрите что получается: если, по каким-то причинам, произошла “кривая”
запись байтов температурных порогов в ячейки области EEPROM памяти DS1820 или
копирование байтов температурных порогов из области EEPROM памяти DS1820 в
область оперативной памяти DS1820 осуществлено не было, то в дальнейшем, в
EEPROM память ПИКа перепишутся числа либо не соответствующие числовым
значениям заданных температурных порогов (а они заранее определены и известны),
либо числа FFh соответственно, что есть “сигнал SOS” (с последующими контрмерами).
Вот Вам и искусственно созданная объективность.
В этом случае, “вражеской агентуре” однозначно светит только полный “Гитлер капут”,
с дальнейшим “восседанием на нарах”, а наши “разведчики” будут иметь медальки,
плюс, впридачу, чувство качественно выполненного долга (а это поважнее медалек
будет).
Что далее?
А далее нужно разрешить чтение из области оперативной памяти DS1820 (команда
Read Scrathpad), с целью дальнейшего копирования его результатов в специально,
заранее созданные под это дело регистры общего назначения с названием TH и TL.
Но этому должна предшествовать “связка” “инициализация – команда Skip ROM”.
Почему?
А потому, что чтение из области оперативной памяти DS1820 есть адресно -
ориентированная процедура (ведь могут иметь место быть несколько датчиков, и в
этом случае нужно определиться, к какому из них обращаться), и логика работы
DS1820 не позволяет напрямую игнорировать этот “важняк”, что означает: перед
исполнением процедуры чтения из области оперативной памяти DS1820, обязательно
нужно обратиться к ПЗУ.
Но в случае наличия одного датчика, выборочный, адресный запрос нужен так же, как
корове пятая нога.
Как быть?
А очень просто: нужно разрешить исполнение того или иного действия всеми
датчиками (то есть, в данном случае, одним), применив команду Skip ROM (“оптовая”
адресация ко всем датчикам).
Соответственно, перед применением этой команды, нужно выполнить процедуру
инициализации DS1820 (так как происходит обращение к ПЗУ, они идут в “связке”).
Вот Вам и объяснение наличия 15-й и 16-й строк.
После выполнения этих “формальностей” - никаких проблем: выполняется команда
Read Scratchpad (17-я строка), после чего производится чтение из области
оперативной памяти DS1820 первых 4-х байтов.
Почему 4-х, ведь требуется 2?
А потому, что команда чтения, из области оперативной памяти DS1820, ориентирована
разработчиками на потоковое чтение всех 9-ти байтов содержимого области
оперативной памяти DS1820.
Поэтому, хочешь - не хочешь, но для того, чтобы “добраться” до 3-го и 4-го байтов,
придется считать и первые 2 байта.
Куда переписывать эти 2 байта?
А никуда.
5
Нужно только формально отработать процедуры их считывания для того, чтобы
технически обеспечить считывание 3-го и 4-го байтов.
После считывания 3-го и 4-го байтов (TH и TL), процедуру дальнейшего считывания
можно просто-напросто прервать (что и имеет место быть), так как практического
смысла в считывании следующих байтов, в данном случае, нет.
В результате этой достаточно незамысловатой комбинации, константы температурных
порогов копируются в регистры общего назначения TH и TL, из которых, в
дальнейшем, они стандартно копируются в заранее назначенные конструктором ячейки
EEPROM памяти ПИКа.
После завершения всей этой “свистопляски”, в PonyProg или IcProg105 (и т.п.)
производится стандартная операция чтения, после окончания которой можно своими
глазами убедиться не только в безошибочности (или ошибочности) установки, в
DS1820, значений температурных порогов, но и увидеть (и записать на бумажку)
уникальный адрес датчика, подвергнутого этому “допросу с пристрастием”.
Получилось вот что:

;********************************************************************************
; DS1820_a.asm УСТРОЙСТВО СЧИТЫВАНИЯ ИЗ ПЗУ DS1820 (DS18S20), В EEPROM ПАМЯТЬ
; PIC16F84A, БАЙТОВ ТИПА УСТРОЙСТВА, СЕРИЙНОГО НОМЕРА И
; КОНТРОЛЬНОЙ СУММЫ И ЗАПИСИ В EEPROM ПАМЯТЬ DS1820 ЗАДАННЫХ
; ЗНАЧЕНИЙ ТЕМПЕРАТУРНЫХ ПОРОГОВ.
;********************************************************************************
; "Практикум по конструированию устройств на PIC контроллерах".
; Эта программа входит в состав 5-го раздела.
;********************************************************************************
; Используется м/контроллер PIC16F84A. Частота кварца 4 Мгц.
; Сигнальный вывод (DQ) датчика DS1820 подключается к выводу RA4.
; Между выводом RA4 и шиной питания подключается подтягивающий резистор
; номиналом 4,7-5,1 кОм.
; DS1820 включается по схеме с активным питанием, т.е.: вывод 1 - общий,
; вывод 2 - сигнальный,
; вывод 3 - питание (+5в).
; К выводу RA3 подключен контрольный светодиод (можно не подключать).
;--------------------------------------------------------------------------------
; Объем программы: 182 команды.
;================================================================================
LIST p=16F84a ; Используется м/контроллер PIC16F84A.
__CONFIG 03FF1H ; Бит защиты выключен, WDT выключен,
; XT-генератор.
;================================================================================
; Определение положения регистров специального назначения.
;================================================================================
IndF equ 00h ; Доступ к памяти через FSR.
PC equ 02h ; Счетчик команд.
Status equ 03h ; Регистр Status.
FSR equ 04h ; Регистр косвенной адресации.
PortA equ 05h ; Регистр Port A.
TrisA equ 05h ; Регистр Tris A-банк1.
EECon1 equ 08h ; Регистр EECon1-банк1.
EECon2 equ 09h ; Регистр EECon2-банк1.
IntCon equ 0Bh ; Регистр IntCon.
EEData equ 08h ; Регистр данных (EEPROM).
EEAdr equ 09h ; Регистр адреса (EEPROM).
;================================================================================
; Определение названия и положения регистров общего назачения.
;================================================================================
N equ 0Ch ; Счетчик битов.
N1 equ 0Dh ; Счетчик байтов.
Temp equ 0Eh ; Многофункциональный регистр
; временного хранения.
Count equ 0Fh ; Счетчик количества проходов задержки 10 мкс.
Buff1 equ 10h ; Байт типа устройства.
Buff2 equ 11h ; 1-й байт серийного номера.
Buff3 equ 12h ; 2-й байт серийного номера.
6
Buff4 equ 13h ; 3-й байт серийного номера.
Buff5 equ 14h ; 4-й байт серийного номера.
Buff6 equ 15h ; 5-й байт серийного номера.
Buff7 equ 16h ; 6-й байт серийного номера.
Buff8 equ 17h ; Байт контрольной суммы (CRC).
TH equ 18h ; Байт верхнего температурного порога.
TL equ 19h ; Байт нижнего температурного порога.
;================================================================================
; Определение места размещения результатов операций.
;================================================================================
W equ 0 ; Результат направить в аккумулятор.
F equ 1 ; Результат направить в регистр.
;================================================================================
; Присваивание битам названий.
;================================================================================
C equ 0 ; Флаг переноса-заема.
RP0 equ 5 ; Бит выбора банка.
DQ equ 4 ; Бит порта A для управления DS1820.
;================================================================================
org 0 ; Начать выполнение программы с PC=0.
;********************************************************************************

;********************************************************************************
; ------------------------ "РАБОЧАЯ" ЧАСТЬ ПРОГРАММЫ ----------------------
;********************************************************************************
; НАЧАЛО ПРОГРАММЫ
;********************************************************************************
clrf PortA ; Сброс всех защелок порта А.
clrf IntCon ; Запрет всех прерываний.
bsf Status,RP0 ; Переход в 1-й банк.
clrf TrisA ; Все выводы порта А работают на выход.
bcf Status,RP0 ; Переход в 0-й банк.
; Остальные настройки - по умолчанию.
;################################################################################
; Начало работы с датчиком DS1820.
;################################################################################
; Инициализация DS1820.
;================================================================================
call DQ_INIT ; Инициализация DS1820.
;----> Возврат по стеку из ПП DQ_INIT.
;================================================================================
; Передача команды Read ROM для чтения ПЗУ DS1820.
; После этого из ПЗУ считываются 8 байтов: байт типа устройства (10h),
; 6 байтов серийного номера и байт контрольной суммы (CRC).
;================================================================================
movlw 033h ; Запись команды чтения ПЗУ (Read ROM).
movwf Temp ; в регистр Temp.
call OUT_BYTE ; Переход в ПП передачи байта.
;----> Возврат по стеку из ПП OUT_BYTE.
;--------------------------------------------------------------------------------
; Процедура чтения 8 байтов из ПЗУ DS1820 (применена косвенная адресация).
;--------------------------------------------------------------------------------
movlw Buff1 ; В FSR записывается адрес
movwf FSR ; регистра Buff1.
movlw .8 ; Определение количества
movwf N1 ; считываемых байтов.

SNOVA call IN_BYTE ; Переход в ПП приема байта.


;----> Возврат по стеку из ПП IN_BYTE.
movwf IndF ; Копирование содержимого регистра W
; в текущий регистр Buff...
;--------------------------------------------------------
incf FSR,F ; Запись в FSR адреса следующего
; регистра Buff...
decfsz N1,F ; Декремент счетчика байтов.

7
goto SNOVA ; Если результат не =0, то переход на прием
; следующего байта.
; Если результат =0, то программа
; исполняется далее.
;--------------------------------------------------------
; На данном этапе в регистрах Buff1 ... Buff8 находятся:
; Buff1 - байт типа устройства (для DS1820 - 10H),
; Buff2 - 1-й байт серийного номера,
; Buff3 - 2-й байт серийного номера,
; Buff4 - 3-й байт серийного номера,
; Buff5 - 4-й байт серийного номера,
; Buff6 - 5-й байт серийного номера,
; Buff7 - 6-й байт серийного номера,
; Buff8 - байт контрольной суммы (CRC).
; Например: A1 00 08 00 E5 31 62 10
;================================================================================
; Теперь их нужно записать в первые 8 ячеек EEPROM памяти ПИКа.
;================================================================================
movlw Buff1 ; В FSR записывается адрес
movwf FSR ; регистра Buff1.
movlw .8 ; Определение количества записываемых байтов
movwf N1 ; и количества ячеек, в которые произойдет
; запись.
;-----------------------------------------------
; Подпрограмма потоковой записи в EEPROM память.
;-----------------------------------------------
EEPR decf N1,W ; Декремент счетчика с сохранением результата
; в W.
movwf EEAdr ; Содержимое текущего регистра Buff...
movf IndF,W ; записывается в ячейку памяти с
movwf EEData ; текущим адресом.

bsf Status,RP0 ; ----------"----------


bsf EECon1,2 ; ----------"----------
movlw 055h ; Обязательная последовательность
movwf EECon2 ; команд при записи.
movlw 0AAh ; ----------"----------
movwf EECon2 ; ----------"----------
bsf EECon1,1 ; ----------"----------
;-----------------------------------------------
; "Плавающая" задержка под запись.
;-----------------------------------------------
WR btfss EECon1,4 ; Если запись в EEPROM не завершена,
goto WR ; то переход на метку WR.
bcf EECon1,4 ; Если запись данных завершена, то сброс
bcf Status,RP0 ; флага EEIF и программа исполняется далее.
;-----------------------------------------------
incf FSR,F ; Запись в FSR адреса следующего
; регистра Buff...
decfsz N1,F ; Декремент счетчика байтов.
goto EEPR ; Если результат не =0, то переход на запись
; в EEPROM содержимого следующего Buff...
; Если результат =0, то программа
; исполняется далее.
;################################################################################

;************************************************************************
; УСТАНОВКА ТЕМПЕРАТУРНЫХ ПОРОГОВ.
;************************************************************************
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Например, необходимо установить
; значение верхнего порога TH: +25 градусов Цельсия (00110010 или 32h),
; значение нижнего порога TL: +20 градусов Цельсия (00101000 или 28h).
;-------------------------------------------------------------------------
; Сначала эти значения нужно записать в область оперативной памяти DS1820.

8
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;================================================================================
; Передача команды Write Scratchpad (4Eh).
; Разрешает запись байтов в область оперативной памяти DS1820.
;================================================================================
movlw 4Eh ; Запись байта команды Write Scratchpad
movwf Temp ; в регистр Temp.
call OUT_BYTE ; Переход в ПП передачи байта.
;----> Возврат по стеку из ПП OUT_BYTE.
;------------------------------------------
; Сама запись.
;------------------------------------------
movlw 32h ; Запись значения
movwf Temp ; верхнего порога
call OUT_BYTE ; температуры (TH).
;----> Возврат по стеку из ПП OUT_BYTE.
movlw 28h ; Запись значения
movwf Temp ; нижнего порога
call OUT_BYTE ; температуры (TL).
;----> Возврат по стеку из ПП OUT_BYTE.
;--------------------------------------------------------------------------------
; Инициализация DS1820.
;--------------------------------------------------------------------------------
call DQ_INIT ; Инициализация DS1820.
;----> Возврат по стеку из ПП DQ_INIT.
;================================================================================
; Команда Skip ROM (CCh).
;================================================================================
movlw 0CCh ; Запись команды CCh
movwf Temp ; в регистр Temp.
call OUT_BYTE ; Переход в ПП передачи байта.
;----> Возврат по стеку из ПП OUT_BYTE.
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Теперь эти значения нужно переписать из области оперативной памяти DS1820
; в область EEPROM памяти DS1820.
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;================================================================================
; Передача команды Copy Scratchpad (48h).
; Эта команда копирует байты TH и TL из области оперативной
; памяти DS1820 в область EEPROM памяти DS1820.
;================================================================================
movlw 48h ; Запись байта команды Copy Scratchpad
movwf Temp ; в регистр Temp.
call OUT_BYTE ; Переход в ПП передачи байта.
;----> Возврат по стеку из ПП OUT_BYTE.
;-------------------------------------------
; Задержка для надежной записи 2,5мс.
;-------------------------------------------
movlw .250 ; Установка количества проходов по 10мкс.
call PAUSE_X ; Переход в ПП задержки.
;----> Возврат по стеку из ПП PAUSE_X.
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Теперь, для получения, в дальнейшем, однозначного подтверждения факта записи
; пороговых значений температуры в область EEPROM памяти DS1820, нужно
; "уничтожить" ранее записанное содержимое ячеек TH и TL области оперативной
; памяти DS1820.
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;================================================================================
; Передача команды Write Scratchpad (4Eh).
; Разрешает запись байтов в область оперативной памяти DS1820.
;================================================================================
movlw 4Eh ; Запись байта команды Write Scratchpad
movwf Temp ; в регистр Temp.
call OUT_BYTE ; Переход в ПП передачи байта.
;----> Возврат по стеку из ПП OUT_BYTE.
9
;--------------------------------------------------------------------------------
; Сама запись.
;--------------------------------------------------------------------------------
movlw b'11111111' ; Запись заранее не реального
movwf Temp ; значения верхнего порога
call OUT_BYTE ; температуры (TH).
;----> Возврат по стеку из ПП OUT_BYTE.
movlw b'11111111' ; Запись заранее не реального
movwf Temp ; значения нижнего порога
call OUT_BYTE ; температуры (TL).
;----> Возврат по стеку из ПП OUT_BYTE.
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Теперь нужно то, что записалось в область EEPROM памяти DS1820, скопировать в
; обратно в область оперативной памяти DS1820, так как вывести "наружу" DS1820
; можно только те байты, которые "лежат" в области оперативной памяти DS1820.
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;================================================================================
; Передача команды Recall E2 (B8h).
; Эта команда действует обратным образом по отношению к команде Copy Scratchpad,
; то есть, она позволяет считать байты TH и TL из области EEPROM памяти DS1820
; в область оперативной памяти DS1820.
;================================================================================
movlw 0B8h ; Запись байта команды Recall E2
movwf Temp ; в регистр Temp.
call OUT_BYTE ; Переход в ПП передачи байта.
;----> Возврат по стеку из ПП OUT_BYTE.
;---------------------------------------------
; Задержка для надежного считывания 2,5мс.
;---------------------------------------------
movlw .250 ; Установка количества проходов по 10мкс.
call PAUSE_X ; Переход в ПП задержки.
;----> Возврат по стеку из ПП PAUSE_X.
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Теперь нужно считать байты TH и TL из области оперативной памяти DS1820
; в регистры общего назначения с названиями TH и TL соответственно.
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;================================================================================
; Инициализация DS1820.
;================================================================================
call DQ_INIT ; Инициализация DS1820.
;----> Возврат по стеку из ПП DQ_INIT.
;================================================================================
; Команда Skip ROM (CCh).
;================================================================================
movlw 0CCh ; Запись команды CCh
movwf Temp ; в регистр Temp.
call OUT_BYTE ; Переход в ПП передачи байта OUT_BYTE.
;----> Возврат по стеку из ПП OUT_BYTE.
;================================================================================
; Команда Read Scratchpad (BEh).
; Разрешение чтения из области оперативной памяти DS1820.
;================================================================================
movlw 0BEh ; Запись команды BEh
movwf Temp ; в регистр Temp.
call OUT_BYTE ; Переход в ПП передачи байта OUT_BYTE.
;----> Возврат по стеку из ПП OUT_BYTE.
;--------------------------------------------------------------------------------
; Чтение содержимого области оперативной памяти DS1820.
;--------------------------------------------------------------------------------
; 2 "пустых" цикла считывания (в данном случае).
;-----------------------------------------------
call IN_BYTE ; Прием младшего байта температуры.
;----> Возврат по стеку из ПП IN_BYTE.
; Этот байт никуда не записывается
; ("гибнет" в W).
10
call IN_BYTE ; Прием старшего байта температуры.
;----> Возврат по стеку из ПП IN_BYTE.
; Этот байт никуда не записывается
; ("гибнет" в W).
;-----------------------------------------------
; А вот это - "важняк" (в данном случае).
;-----------------------------------------------
call IN_BYTE ; Прием байта верхнего предела температуры.
;----> Возврат по стеку из ПП IN_BYTE.
movwf TH ; Запись принятого байта в регистр TH.

call IN_BYTE ; Прием байта нижнего предела температуры.


;----> Возврат по стеку из ПП IN_BYTE.
movwf TL ; Запись принятого байта в регистр TL.
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Теперь, для обеспечения визуального контроля, нужно переписать
; содержимое регистров TH и TL в EEPROM память ПИКа.
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;--------------------------------------------------------------------------------
; Запись в EEPROM ПИКа содержимого регистра TH.
;--------------------------------------------------------------------------------
movlw 0Eh ;
movwf EEAdr ; Содержимое регистра TH
movf TH,W ; записывается в ячейку памяти
movwf EEData ; c адресом 0Eh.

bsf Status,RP0 ; ----------"----------


bsf EECon1,2 ; ----------"----------
movlw 055h ; Обязательная последовательность
movwf EECon2 ; команд при записи.
movlw 0AAh ; ----------"----------
movwf EECon2 ; ----------"----------
bsf EECon1,1 ; ----------"----------
;---------------------------------
; "Плавающая" задержка под запись.
;---------------------------------
WR_1 btfss EECon1,4 ; Если запись в EEPROM не завершена,
goto WR_1 ; то переход на метку WR_1.
bcf EECon1,4 ; Если запись данных завершена, то сброс
bcf Status,RP0 ; флага EEIF и программа исполняется далее.
;--------------------------------------------------------------------------------
; Запись в EEPROM ПИКа содержимого регистра TL.
;--------------------------------------------------------------------------------
movlw 0Fh ;
movwf EEAdr ; Содержимое регистра TL
movf TL,W ; записывается в ячейку памяти
movwf EEData ; c адресом 0Fh.

bsf Status,RP0 ; ----------"----------


bsf EECon1,2 ; ----------"----------
movlw 055h ; Обязательная последовательность
movwf EECon2 ; команд при записи.
movlw 0AAh ; ----------"----------
movwf EECon2 ; ----------"----------
bsf EECon1,1 ; ----------"----------
;---------------------------------
; "Плавающая" задержка под запись.
;---------------------------------
WR_2 btfss EECon1,4 ; Если запись в EEPROM не завершена,
goto WR_2 ; то переход на метку WR_2.
bcf EECon1,4 ; Если запись данных завершена, то сброс
bcf Status,RP0 ; флага EEIF и программа исполняется далее.
;================================================================================
; Окончание полного цикла программы.
;================================================================================

11
bsf PortA,3 ; "Загорается" светодиод (окончание работы).
goto $ ; Уход в "мертвое, вечное кольцо"
; (до выключения и последующего включения
; питания).
;########################################################################
; В PonyProg (IcProg105) ПРОИЗВЕДИТЕ СЧИТЫВАНИЕ ИЗ PIC16F84A.
; РЕЗУЛЬТАТ СЧИТЫВАНИЯ БАЙТОВ ИЗ ПЗУ DS1820 БУДЕТ ЗАПИСАН В ПЕРВЫХ 8-ми
; ЯЧЕЙКАХ EEPROM ПАМЯТИ ПИКа, А ТЕМПЕРАТУРНЫЕ ПОРОГИ, УСТАНОВЛЕННЫЕ В
; DS1820, МОЖНО ПРОКОНТРОЛИРОВАТЬ В ЯЧЕЙКАХ EEPROM памяти ПИКа С АДРЕСАМИ
; 0Eh(TH) и 0Fh(TL).
;########################################################################

;************************************************************************
; Базовые процедуры чтения/записи по 1-Wire протоколу.
;************************************************************************
; Подпрограмма передачи "мастером" байта: цикл передачи бита начинается импульсом
; низкого уровня длительностью 1...15 мкс, далее следует передаваемый бит.
; Цикл завершается импульсом высокого уровня длительностью не менее 1 мкс.
;================================================================================
OUT_BYTE movlw .8 ; Запись количества бит передаваемого
movwf N ; байта в регистр N.

METKA_1 rrf Temp,F ; Сдвиг вправо содержимого передаваемого


; байта.
btfss Status,C ; В бите С "лежит" 0 или 1 ?
goto OUT_0 ; Если С=0, то переход в ПП передачи нуля.
goto OUT_1 ; Если С=1, то переход в ПП передачи единицы.

METKA_2 decfsz N,F ; Уменьшение на 1 содержимого счетчика битов.


goto METKA_1 ; Если результат не =0, то переход на метку
; METKA_1.
return ; Если результат =0, то возврат по стеку.
;================================================================================
; Подпрограмма приема "мастером" байта: цикл приема бита начинается импульсом
; низкого уровня длительностью 1...15 мкс, после чего DS1820 выставляет на линии
; бит. Цикл завершается импульсом высокого уровня длительностью не менее 1 мкс.
;================================================================================
IN_BYTE movlw .8 ; Запись количества бит принимаемого
movwf N ; байта в регистр N.
clrf Temp ; Очистка регистра принимаемого байта.

IN_BYTE_1 call PIN_LO ; Формирование на линии уровня 0.


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

call PIN_HI ; Формирование на линии уровня 1.


;----> Возврат по стеку из ПП PIN_HI.
nop ; Калибровочный NOP.
;-------------------------------------------------------------------
; Запись, в бит С, уровня текущего бита, выдаваемого DS1820 в линию.
;-------------------------------------------------------------------
btfss PortA,DQ ; На линии 0 или 1 ?
bcf Status,C ; Если на линии 0, то в бите С выставляется 0.
btfsc PortA,DQ ; Если на линии 1 (а также после исполнения
; предыдущей команды), то еще одна проверка
; состояния линии.
bsf Status,C ; Если на линии 1, то в бите С выставляется 1.
; Если на линии 0 (а также после исполнения
; предыдущей команды), то программа
; исполняется далее.
;-------------------------------------------------------------------
; Последовательное заполнение битами регистра Temp.
;-------------------------------------------------------------------
rrf Temp,F ; Сдвиг содержимого регистра Temp вправо
; (через C).
movlw .4 ; Установка количества проходов по 10мкс.
12
call PAUSE_X ; Переход в ПП задержки
; (задержка=4х10=40мкс.).
;----> Возврат по стеку из ПП PAUSE_X.
decfsz N,F ; Уменьшение на 1 содержимого счетчика битов.
goto IN_BYTE_1 ; Если результат не=0, то переход
; на прием следующего бита.
movf Temp,W ; Если =0, то копирование принятого байта
; в регистр W.
return ; Возврат по стеку.
;================================================================================
; Подпрограмма передачи бита с уровнем "0".
;================================================================================
OUT_0 call PIN_LO ; Переход в ПП установки уровня 0.
; Начало передачи.
;----> Возврат по стеку из ПП PIN_LO.
movlw .6 ; Установка количества проходов по 10мкс.
call PAUSE_X ; Переход в ПП задержки
; (задержка=6х10=60мкс.).
;----> Возврат по стеку из ПП PAUSE_X.
call PIN_HI ; Переход в ПП установки уровня 1.
; Конец передачи.
;----> Возврат по стеку из ПП PIN_HI.
goto METKA_2 ; Переход на исполнение процедуры декремента
; и анализа содержимого счетчика битов.
;================================================================================
; Подпрограмма передачи бита с уровнем "1".
;================================================================================
OUT_1 call PIN_LO ; Переход в ПП установки уровня 0.
; Начало передачи.
;----> Возврат по стеку из ПП PIN_LO.
call PIN_HI ; Переход в ПП установки уровня 1.
; (передача 1).
;----> Возврат по стеку из ПП PIN_HI.
movlw .6 ; Установка количества проходов по 10мкс.
call PAUSE_X ; Переход в ПП задержки
; (задержка=6х10=60мкс.).
;----> Возврат по стеку из ПП PAUSE_X.
goto METKA_2 ; Переход на новый цикл передачи бита.
;--------------------------------------------------------------------------------
; Формирование на линии уровня "1" за счет подтягивающего резистора
;--------------------------------------------------------------------------------
PIN_HI bsf Status,RP0 ; Переход в банк 1.
bsf TrisA,DQ ; Настройка вывода RA4 на работу "на вход".
bcf Status,RP0 ; Переход в банк 0.
return ; Возврат по стеку.
;--------------------------------------------------------------------------------
; Формирование на линии уровня "0" средствами микроконтроллера
;--------------------------------------------------------------------------------
PIN_LO bcf PortA,DQ ; Установка 0 на выходе защелки вывода RA4.
bsf Status,RP0 ; Переход в банк 1.
bcf TrisA,DQ ; Настройка вывода RA4 на работу "на выход".
bcf Status,RP0 ; Переход в банк 0.
return ; Возврат по стеку.
;********************************************************************************
;================================================================================
; ПП инициализации.
;================================================================================
DQ_INIT call PIN_HI ; Установка вывода в высокоимпедансное
; состояние: за счет подтягивающего резистора,
; на линии устанавливается 1.
;----> Возврат по стеку из ПП PIN_HI.
call PIN_LO ; Установка на линии нуля.
;----> Возврат по стеку из ПП PIN_LO.
movlw .60 ; Установка количества проходов по 10мкс.
call PAUSE_X ; Переход в ПП задержки
; (задержка=60х10=600мкс.).
13
;----> Возврат по стеку из ПП PAUSE_X.
call PIN_HI ; Установка вывода в высокоимпедансное
; состояние: за счет подтягивающего резистора,
; на линии устанавливается 1.
;----> Возврат по стеку из ПП PIN_HI.
movlw .7 ; Установка количества проходов по 10мкс.
call PAUSE_X ; Переход в ПП задержки
; (задержка=7х10=70мкс.).
;----> Возврат по стеку из ПП PAUSE_X.
;----------------------------------------------------------
; Определение наличия (или нет) отклика на импульс сброса.
;----------------------------------------------------------
btfsc PortA,DQ ; На линии DQ 0 или 1 (отклик есть или нет)?
goto DQ_INIT ; Если отклика нет (1), то снова начинается
; исполнение процедуры инициализации.
movlw .50 ; Если отклик есть, то установка
; количества проходов по 10мкс.
call PAUSE_X ; Переход в ПП задержки
; (задержка=50х10=500мкс.).
;----> Возврат по стеку из ПП PAUSE_X.

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


;--------------------------------------------------------------------------------

;================================================================================
; Подпрограмма задержки.
;================================================================================
; Задание количества проходов по 10 мкс.
;----------------------------------------
PAUSE_X movwf Count ; Копирование количества проходов из W
; в Count.
;----------------------------------------
; Пауза в 10 мкс.
;----------------------------------------
PAUSE_10 nop ;
goto $+1 ; Одноразрядный,
goto $+1 ; вычитающий
goto $+1 ; счетчик
decfsz Count,F ; с "врезкой".
goto PAUSE_10 ;
return ; Возврат по стеку.
;********************************************************************************
end ; Конец программы.
В “рабочей” части программы:
- темно-синим цветом выделено то, что было объяснено в предыдущих подразделах,
- цветом хаки выделены пояснения,
- а то, что относится к теме этого подраздела, выделено черным цветом.
Собственно говоря, в части касающейся текста программы, выделенного черным
цветом, добавить особо-то и нечего, так как необходимые пояснения даны выше.
Кроме того, в тексте программы имеются достаточно подробные (я надеюсь)
комментарии.
Программа составлена в строгом соответствии с рис.1.
Вот уж по какому вопросу нужно дать пояснения, так это по вопросу работы с
откликом на импульс сброса.
Если датчик один, то “у матросов нет вопросов”.
А если несколько?
Процедура инициализации не предполагает выборочной адресации, то есть, она
воздействует на все датчики, подключенные к линии DQ, и все они на нее
“откликнутся”.
В этом случае, во второй половине процедуры инициализации, произойдет “накладка”
друг на друга нулевых уровней откликов датчиков.
Произойдет ли при этом электрический конфликт?

14
Формально, да, но его негативные последствия (по токовой перегрузке) будут
минимизированы, так как происходит работа на одну нагрузку.
Это видно на рис. 2В. Ток, протекающий через внешний, подтягивающий резистор, при
любом количестве датчиков, не превысит значения Uпит./Rвн.

А вот на рис. 2А Вы видите “вредоносный” электрический конфликт, который “очень


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

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

16