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

5/3.

Подготовка к адресации к нескольким датчикам: конструирование устройства


потокового считывания из ПЗУ DS1820 (DS18S20), в EEPROM память
PIC16F84A, байтов типа устройства, серийного номера и контрольной суммы.

На первой же стадии “копания” в вопросе адресации к нескольким датчикам,


подключенным к линии DQ, “лоб упирается” в “стену” вопроса: “Прежде чем
адресоваться к конкретному датчику, нужно знать его адрес. Как его узнать, ведь на
лбу у датчика он не написан”?
И в самом деле, 8 байтов, в которые заложен идентификационный признак конкретного
датчика, записаны в его ПЗУ на заводе-изготовителе и “за здорово живешь” их из ПЗУ
не извлечь.
Тут нужно “подсуетиться”, причем, “подсуетиться” не “оптом”, а “в розницу”, что в
переводе на русский означает: нужно извлечь эти 8 байтов из ПЗУ датчика, работая
только с одним датчиком.
То есть, считали содержимое ПЗУ из одного датчика, “отцепили” его от линии DQ,
“прицепили” к ней другой датчик, считали содержимое ПЗУ этого датчика, “отцепили”
его от линии DQ и т.д.
Такая “свистопляска” обусловлена тем, что, разрешающая считывание байтов (из ПЗУ)
команда Read ROM (33h), обращается ко всем датчикам, подключенным к линии, и
если их несколько, то считается “черт знает что” (монтажное “ИЛИ” со всеми
вытекающими последствиями).
Тогда возникает вопрос: “Раз это так, то зачем нужна такая “геморройная” команда”?
Ответ: главная функция команды Read ROM (33h) состоит в “добыче” содержимого
ПЗУ на стадии подготовки к адресации, с банальной и вполне понятной целью
выяснения конкретного идентификационного признака (адреса) конкретного датчика.
После того, как он будет выяснен и записан на бумаге, про команду Read ROM (33h)
можно, образно выражаясь, забыть и больше не использовать ее.
И в самом деле, адрес конкретного датчика, раз и навсегда, выяснен и меняться не
будет (даже если очень захотеть) и практического смысла, в его дальнейшем,
многократном выяснении, просто нет (даже при работе с одним датчиком).
Немного забегая вперед скажу, что “прибамбас” под названием “контрольная сумма”
есть не только в области ПЗУ, но и в области оперативной памяти DS1820, и для
обнаружения ошибок замеров температуры (и их блокировки), гораздо сподручнее
пользоваться последним, так как, в этом случае, имеет место быть адресация к
конкретному датчику и конфликта, типа “монтажное ИЛИ”, нет.
Что, в конечном итоге, получается?
А получается то, что, прежде чем конструировать какое-то “основное” устройство,
имеющее в своем составе несколько датчиков, нужно сконструировать
“вспомогательное” устройство, при помощи которого можно было бы выяснить
идентификационные (адресные) признаки каждого используемого датчика, для того,
чтобы, в дальнейшем, использовать их при составлении программы под “основное”
устройство.
При работе с несколькими датчиками, такое “вспомогательное” устройство всегда нужно
иметь под рукой.
Вот этим я и озаботился.
В результате бурного и достаточно скоротечного мыслительного процесса, “родилось”
устройство, название которого прописано в заголовке этого подраздела.
В принципе, оно простое, так как его главная и единственная функция - копирование
всего-лишь 8-ми байтов из ПЗУ DS1820 в EEPROM память PIC16F84A.
Для того чтобы обеспечить Вам максимальные удобства, эту программу я составил под
принципиальную схему электронного термометра, описание работы которого имеется в
предыдущем подразделе (см. рис. 1 подраздела 5/2).
Это означает то, что нужно вынуть ПИК из панельки, зашить в него прошивку
программы, текст которой опубликован ниже, вставить ПИК обратно в панельку и
включить питание.
Примечание: после включения питания, ЖКИ работать не будет по той простой
причине, что он не задействуется.

1
Подождав буквально секунду (все дела делаются быстро, да и программа
одноцикловая), нужно выключить питание, вынуть ПИК из панельки устройства, после
чего произвести, например, в PonyProg или IcProg105 стандартное считывание.
После его окончания, нужно прокрутить “портянку”, с результатами считывания, до
конца вниз, и в районе области EEPROM памяти “завизуализировать” результат.
Этот результат будет представлять собой 8 байтов, считанных из ПЗУ DS1820,
расположенных в первых 8-ми ячейках EEPROM памяти ПИКа в следующем порядке:
В ячейке с адресом 07h будет “лежать” строго фиксированное число 10h.
Это код устройства. Он одинаков для всех DS1820 (DS18S20).
При определении порядка старшинства, на это числовое значение можно
ориентироваться.
В ячейках с адресами 06h … 01h Вы увидите числовые значения 6-ти байтов серийного
номера.
В ячейке с адресом 00h Вы увидите числовое значение контрольной суммы (байт со
стандартным названием CRC).
Все это “добро” нужно переписать на бумагу, а соответствующий датчик как-то
пометить.
Приведу пример результата считывания содержимого ПЗУ одного из моих датчиков:

A1 00 08 00 E5 31 62 10 FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
……………………………… ……………………………….
Зеленым цветом показано числовое значение кода устройства.
Темно – красным цветом показано числовые значения 6-ти байтов серийного номера.
Ярко – красным цветом показано числовое значение байта контрольной суммы (CRC).
Естественно, что Вы считаете другие числовые значения байтов, но имейте ввиду, что
в 8-й ячейке (адрес 07h) обязательно должно записаться число 10h.
Такую же “манипуляцию” нужно произвести со всеми имеющимися у Вас датчиками (с
каждым по-отдельности).
После этого, Вы будете иметь исходные данные для осуществления процедуры
адресации к нескольким датчикам и можно двигаться дальше.
Для тех из Вас, кто по каким-то причинам не смог собрать устройство, описанное в
разделе 5/2, ниже опубликована максимально упрощенная, принципиальная схема
предмета разговора:

2
Это то же самое, что и на рис.1 предыдущего подраздела (5/2), но только без ЖКИ
модуля.
Кроме того, на вывод RA3, я “посадил” светодиод, который индицирует окончание
процесса считывания байтов из ПЗУ DS1820 в EEPROM память PIC16F84A (выделено
синим цветом).
Вполне можно обойтись и без него (не подключать), просто с его помощью можно
убедиться, что полный цикл программы исполняется достаточно быстро: светодиод
“загорается” практически сразу же после включения питания.
Задержка его “загорания”, визуально, практически не ощущается.
Ниже опубликована программа под это устройство:
;********************************************************************************
; CRC_PZU.asm УСТРОЙСТВО СЧИТЫВАНИЯ ИЗ ПЗУ DS1820 (DS18S20), В EEPROM ПАМЯТЬ
; PIC16F84A, БАЙТОВ ТИПА УСТРОЙСТВА, СЕРИЙНОГО НОМЕРА И
; КОНТРОЛЬНОЙ СУММЫ
;********************************************************************************
; "Практикум по конструированию устройств на PIC контроллерах".
; Эта программа входит в состав 5-го раздела.
;********************************************************************************
; Используется м/контроллер PIC16F84A. Частота кварца 4 Мгц.
; Сигнальный вывод (DQ) датчика DS1820 подключается к выводу RA4.
; Между выводом RA4 и шиной питания подключается подтягивающий резистор
; номиналом 4,7-5,1 кОм.
; DS1820 включается по схеме с активным питанием, т.е.: вывод 1 - общий,
; вывод 2 - сигнальный,
; вывод 3 - питание (+5в).
; К выводу RA3 подключен контрольный светодиод (можно не подключать).
;--------------------------------------------------------------------------------
; Объем программы: 101 команда.
;================================================================================
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-й байт серийного номера.
Buff4 equ 13h ; 3-й байт серийного номера.
Buff5 equ 14h ; 4-й байт серийного номера.
Buff6 equ 15h ; 5-й байт серийного номера.
Buff7 equ 16h ; 6-й байт серийного номера.
Buff8 equ 17h ; Байт контрольной суммы (CRC).
;================================================================================

3
; Определение места размещения результатов операций.
;================================================================================
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 PIN_HI ; Установка вывода в высокоимпедансное
; состояние: за счет подтягивающего резистора,
; на линии устанавливается 1.
;----> Возврат по стеку из ПП PIN_HI.
call PIN_LO ; Установка на линии нуля.
;----> Возврат по стеку из ПП PIN_LO.
movlw .60 ; Установка количества проходов по 10мкс.
call PAUSE_X ; Переход в ПП задержки
; (задержка=60х10=600мкс.).
;----> Возврат по стеку из ПП PAUSE_X.
call PIN_HI ; Установка вывода в высокоимпедансное
; состояние: за счет подтягивающего резистора,
; на линии устанавливается 1.
;----> Возврат по стеку из ПП PIN_HI.
movlw .60 ; Установка количества проходов по 10мкс.
call PAUSE_X ; Переход в ПП задержки
; (задержка=60х10=600мкс.).
;----> Возврат по стеку из ПП PAUSE_X.
;--------------------------------------------------------------------------------
; Передача команды 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 ; считываемых байтов.

4
SNOVA call IN_BYTE ; Переход в ПП приема байта.
;----> Возврат по стеку из ПП IN_BYTE.
movwf IndF ; Копирование содержимого регистра W
; в текущий регистр Buff...
;--------------------------------------------------------
incf FSR,F ; Запись в FSR адреса следующего
; регистра Buff...
decfsz N1,F ; Декремент счетчика байтов.
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...
bsf PortA,3 ; Если результат =0, то "загорается" светодиод
; (индикация конца записи).
goto $ ; Уход в "мертвое, вечное кольцо" (до
; выключения и последующего включения
; питания).

5
;================================================================================

;################################################################################
; В PonyProg (IcProg105) ПРОИЗВЕДИТЕ СЧИТЫВАНИЕ ИЗ PIC16F84A. РЕЗУЛЬТАТ
; СЧИТЫВАНИЯ БАЙТОВ ИЗ ПЗУ DS1820 БУДЕТ ЗАПИСАН В ПЕРВЫХ 8-ми ЯЧЕЙКАХ
; EEPROM ПАМЯТИ ПИКа.
;################################################################################

;********************************************************************************
; Базовые процедуры чтения/записи по 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мкс.
call PAUSE_X ; Переход в ПП задержки
; (задержка=4х10=40мкс.).
;----> Возврат по стеку из ПП PAUSE_X.
decfsz N,F ; Уменьшение на 1 содержимого счетчика битов.
goto IN_BYTE_1 ; Если результат не=0, то переход
; на прием следующего бита.
movf Temp,W ; Если =0, то копирование принятого байта
; в регистр W.

6
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 ; Возврат по стеку.
;********************************************************************************

;================================================================================
; Подпрограмма задержки.
;================================================================================
; Задание количества проходов по 10 мкс.
;----------------------------------------
PAUSE_X movwf Count ; Копирование количества проходов из W
; в Count.
;----------------------------------------
; Пауза в 10 мкс.
;----------------------------------------
PAUSE_10 nop ;
goto $+1 ; Одноразрядный,
goto $+1 ; вычитающий
goto $+1 ; счетчик
decfsz Count,F ; с "врезкой".
goto PAUSE_10 ;

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


;********************************************************************************
7
end ; Конец программы.

После исполнения подготовительных операций, производится инициализация датчика и


передается команда Read ROM, которая разрешает считывание байтов из ПЗУ.
Первым считывается байт типа устройства (10h). Еще его называют байтом кода
семейства.
Далее - по порядку, в соответствии с рис. 4 подраздела 5/1.
После передачи команды Read ROM (33h) и возврата из ПП OUT_BYTE, начинается
процедура чтения байтов из ПЗУ DS1820.
При этом, можно напрямую адресоваться к регистрам Buff …, но выгоднее применить
косвенную адресацию, так как, в этом случае, команд меньше (что и имеет место
быть).
Изначально, в регистр FSR записывается адрес регистра Buff1, а затем, после
считывания в него, из ПЗУ, байта, происходит инкремент содержимого регистра FSR,
что соответствует “включению в работу” регистра Buff … со следующим порядковым
номером.
Таким образом, в конечном итоге, происходит последовательное копирование
содержимого области оперативной памяти DS1820 (8-ми байтов) в регистры Buff1…8.
Так как регистры Buff … являются регистрами оперативной памяти, а индикаторного
устройства нет, то, для обеспечения возможности перенесения числовых значений,
“лежащих” в них байтов, на бумагу, нужно переписать их содержимое в ячейки
EEPROM памяти ПИКа.
Проще всего задействовать под это дело первые 8 ячеек EEPROM памяти, что и
имеет место быть.
При записи байтов в ячейки EEPROM памяти, также применена процедура косвенной
адресации.
При этом, константа .8 определяет как количество записываемых байтов, так и адреса
тех ячеек EEPROM памяти PIC16F84A, в которые эти байты записываются.
Обратите внимание на декремент, который происходит в начале ПП EEPR (decf N1,W).
Его наличие связано с тем, что запись в EEPROM память должна начаться не с
ячейки с адресом 08h, а с ячейки с адресом 07h.
В противном случае, в ячейку с адресом 00h ничего не запишется (FFh).
Соответственно, байты, в EEPROM память, будут записаны со смещением вправо на
одну позицию.
Это, конечно же, не принципиально, но “строй портит”.
То что Вы видите, есть компактная ПП потоковой записи в EEPROM память, с
использованием косвенной адресации.
Эта ПП универсальна и может применяться в других программах в тех случаях, когда
нужно последовательно переписать байты, из группы регистров общего назначения, в
EEPROM память ПИКа.
Советую Вам “положить на нее глаз”. Очень полезная “деталька”.
Ну вот, собственно говоря, и все.
После окончания записи байтов в EEPROM память, “поджигается” светодиод и рабочая
точка программы уходит в “мертвое, вечное кольцо” (программа одноцикловая).
Примечание: так как данная программа проще программы предыдущего подраздела, то
“разборки” с базовыми процедурами чтения/записи по 1-Wire протоколу, с “упором” на
программу CRC_PZU.asm, могут оказаться более выгодными (простыми), чем
аналогичные “разборки” с текстом предыдущей программы.
Я “погонял” эту программу в “железе”. Устройство работает надежно и без ошибок.
Итак: “реквизиты” датчиков выяснены. Можно адресоваться.
В следующем подразделе этим и займусь.

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