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
реализуется достаточно сложный алгоритм, который, тем не менее, при ближайшем
рассмотрении, оказывается не таким уж и сложным (все “железно” объясняется).
Кроме того, он исполняется только во вспомогательном устройстве, избавляя тем
самым “боевую” программу от совершенно не нужного “балласта”.
В конце концов, для достижения практического результата, можно только собрать это
устройство и разобраться с “ключевыми точками” программы, не вникая в детали, но
это не рационально, так как со многим, о чем пойдет речь, все-равно придется
разбираться.
Так уж лучше разобраться с этим “на подлете” к “боевой” программе, чем в ходе ее
составления. Толка будет больше.
Глубокий вдох. Выдох. Поехали.
;********************************************************************************
; 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 ; считываемых байтов.
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 ; текущим адресом.
;************************************************************************
; УСТАНОВКА ТЕМПЕРАТУРНЫХ ПОРОГОВ.
;************************************************************************
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Например, необходимо установить
; значение верхнего порога 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.
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.
;================================================================================
; Подпрограмма задержки.
;================================================================================
; Задание количества проходов по 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вн.
15
"Практикум по конструированию устройств на PIC контроллерах" http://ikarab.narod.ru E-mail: karabea@lipetsk.ru
16