1-Wire. Работа с DS18B20. Часть 2

23/01/2011 - 21:11
  Итак, у вас есть общее представление о том, как происходит обмен данными по 1-Wire шине и можно перейти к следующей части -  как обратиться к DS18B20, как запустить процесс температурного преобразования датчика,  как считать с него температуру, как установить температурное разрешение и т.д. 
 
   Последовательность операций для доступа к DS18B20 следующая:
 
1. Инициализация
2. Подача ROM команды
3. Подача функциональной команды  DS18B20

ROM команды

   С инициализацией все понятно. Микроконтроллер проваливает шину, отпускает и ждет ответа подчиненного устройства. Если к шине подключен хоть один исправный датчик DS18B20, он ответит импульсом присутствия. 
      Получив импульс присутствия, микроконтроллер должен послать по 1-Wire шине ROM команду. Есть пять таких команд.
 
search rom (код команды 0xF0)
      
   Чтобы узнать адреса 1-Wire устройств, подключенных к шине, используется команда search rom.   
   Любое 1-Wire устройство имеет 64 разрядный код. Этот код хранится в ПЗУ и используется для адресации устройства на шине. Младший байт кода определяет семейство, к которому принадлежит 1-Wire устройство (например, код датчиков DS18B20 — 0x28). Следующие 6 байт — это серийный номер устройства. И старший байт— CRC (циклический избыточный код) , вычисленный из первых 7 байтов.

64 разрядный код DS18B20

   Процедура получения адресов, пожалуй, единственная сложная вещь при работе с 1-Wire. На словах эта процедура выглядит следующим образом.
   Выполнив инициализацию, микроконтроллер посылает команду search rom и начинается цикл чтения 64 разрядного кода. Микроконтроллер формирует на 1-Wire шине два тайм слота чтения. В первый тайм слот все 1-Wire устройства, подключенные к шине, выдают первый бит своего 64 разрядного кода. Во второй тайм слот – инвертированное значение первого бита. 
    Если у всех 1-Wire устройств первый бит адреса единица, то микроконтроллер примет сначала единицу, а затем ноль. Если хотя бы у одного 1-Wire устройства первый бит адреса нулевой, то микроконтроллер в обоих случаях примет ноль. Если активных устройств на шине нет, микроконтроллер в обоих случаях примет единицу. 
   В ситуации, когда микроконтроллер принимает два нуля, возникает неоднозначность – как узнать, у каких устройств, преданный бит адреса ноль, а у каких единица? Протокол решает эту проблему просто – после двух тайм слотов чтения, микроконтроллер должен ответить 1-Wire устройствам, с какими из них он продолжит работу. Для этого он выставляет на шине соответствующий бит — ноль или единицу. Устройства, у которых переданный бит соответствует выставленному микроконтроллером, продолжат работу, остальные замолчат (станут не активными) до следующего сигнала сброса. 
   Далее процедура повторяется еще 63 раза: формирование первого тайм слота чтения, чтение состояние шины, формирование второго тайм слота чтения, чтение состояния шины, ответ подчиненным устройствам. 
   После завершения цикла чтения 64 разрядного кода, микроконтроллер будет знать адрес одного 1-Wire устройства. Для получения следующего адреса, нужно снова запустить цикл чтения, но на этот раз в случае неоднозначности выставить другой бит. 
  Сколько 1-Wire устройств подключено к шине, столько раз и нужно провести описанную процедуру. 
     
   read rom (0x33)  
 
   Эта команда позволяет микроконтроллеру считывать 64-разрядный код подчиненного устройства. Команда может использоваться, если к шине подключено только одно 1-Wire устройство. 
 
Последовательность работы:
  Инициализация
  Микроконтроллер выдает  команду read rom
  Микроконтроллер принимает 8 байтов кода подчиненного устройства 
 
   skip rom (0xCC)
 
   Для обращения ко всем 1-Wire устройствам, подключенным к шине, используется команда skip rom. Например, эту команду можно применять, чтобы запустить температурное преобразование сразу всех датчиков DS18B20.
 
Последовательность работы:
  Инициализация
  Микроконтроллер выдает команду skip rom
  Микроконтроллер выдает команду convert t 
 
  Также эту команду удобно использовать, если к 1-Wire шине подключено только одно подчиненное устройство – не нужно морочиться с адресацией. 
 
   match rom (0x55)
 
   Команда  match rom применяется, когда нужно обратиться к конкретному 1-Wire устройству. Микроконтроллер выдает на шину команду match rom, а затем 64 разрядный код устройства, к которому он обращается. Отвечать на функциональную команду будет только устройство, «распознавшее» свой адрес. Остальные устройства будут молчать, пока на шине не будет сформирован импульса сброса. 
 
Последовательность работы:
  Инициализация
  Микроконтроллер выдает команду match rom
  Микроконтроллер выдает 8 байт кода подчиненного устройства
  Микроконтроллер выдает функциональную команду.
 
   alarm search (0xEC)
 
  Действие этой команды идентично действию команды search rom, только отвечать на нее будут подчиненные устройства с установленным флагом аварии. Флаг аварии устанавливается в DS18B20 в случае превышения температурных порогов, заданных регистрами Tl и Th.
 

Функциональные команды

   Функциональные команды позволяют микроконтроллеру читать и записывать ОЗУ DS18B20, запускать температурное преобразование датчика, определять его режим питания.  Для начала разберемся с памятью. 

    Внутренняя память

   Термометр DS18B20 имеет в своем составе 8 байт оперативной памяти (scratchpad, а далее ОЗУ) и 3 байта EEPROM. 
 
ОЗУ И EEPROM DS18B20
 
   Байты 0 и 1– измеренная температура. Начальное значение температуры (при подаче питания) +85 градусов. Формат регистров такой:
регистры, в которых сохраняется значение температуры
где S – знак температуры (0 – положительная температура, 1 – отрицательная), BIT10–BIT4 -  целая часть значения температуры, BIT3-BIT0 – дробная часть.
 
Отрицательная температура представлена в дополнительном коде. Перевод содержимого этих регистров в более понятную форму будет описан в следующей части. 
 
   Байты 2 и 3 – верхний и нижний температурные пороги. Значения этих байтов задаются пользователем. Начальное значение этих байтов зависит от содержимого EEPROM памяти. Формат обоих регистров такой:
формат регистров, в которых хранятся температурные пороги
где S – знак температуры (0 – положительная температура, 1 – отрицательная), BIT6–BIT0 -  целая часть значения температурного порога.
 
   Байт 4 – конфигурационный регистр. В нем задается температурное разрешение DS18B20. Начальное значение регистра зависит от содержимого EEPROM памяти. В новом датчике DS18B20 температурное разрешение по умолчанию 12 бит. Формат конфигурационного регистра такой:

конфигурационный регистр DS18B20

где R1, R0 – биты, задающие температурное разрешение термометра. 

Зависимость времени преобразования от разрешения DS18B20

Как видно из таблицы, от заданного температурного разрешения зависит время преобразования.
 
   Байты с 5 по 7 зарезервированы и не используются
 
   Байт 8 – это CRC (циклический избыточный код). Значение CRC используется для проверки принятых данных. 

Теперь по поводу функциональных команд.

   Команды

   convert t (0x44)
 
  Эта команда запускает процесс температурного преобразования датчика DS18B20. Значение температуры сохраняется в 0 и 1 байтах ОЗУ датчика. Время выполнения преобразования зависит от установленного в конфигурационном регистре разрешения. 
  Если DS18B20 работает в режиме паразитного питания, то после выдачи команды convert t микроконтроллер должен подключить 1-Wire шину к источнику питания на время преобразования (смотри схему). 
   Если DS18B20 работает от внешнего источника питания, то после запуска температурного преобразования можно отслеживать, когда оно будет выполнено. Для этого микроконтроллеру нужно формировать на шине тайм слоты чтения и ждать, когда датчик ответит ему единицей.
 
Последовательность работы в случае одного датчика:
  Инициализация
  Микроконтроллер выдает команду skip rom
  Микроконтроллер выдает команду convert t
  Микроконтроллер формирует тайм слоты чтения и ожидает единицу
 
   write scratchpad (0x4E)
 
  Эта команда позволяет микроконтроллеру записывать в ОЗУ датчика DS18B20 три байта – Th, Tl и конфигурационный регистр (2, 3, 4 байты ОЗУ соответственно).
 
Последовательность работы в случае одного датчика:
  Инициализация
  Микроконтроллер выдает команду skip rom
  Микроконтроллер выдает команду write scratchpad
  Микроконтроллер передает по очереди 3 байта - Th, Tl и конфигурационный регистр
 
   read scratchpad (0xBE)
 
  Эта команда позволяет микроконтроллеру считывать содержимое ОЗУ датчика DS18B20. Данные передаются младшим битом вперед с нулевого по восьмой байт. Микроконтроллер может в любой момент выдать на 1-Wire шину сигнал сброса и прекратить прием данных. Например, если требуются только первые два байта ОЗУ.
 
Последовательность работы в случае одного датчика:
  Инициализация
  Микроконтроллер выдает команду skip rom
  Микроконтроллер выдает команду read scratchpad
  Микроконтроллер принимает 9 байт ОЗУ датчика
 
   copy scratchpad (0x48)
 
  Эта команда копирует 2, 3 и 4 байты ОЗУ (Tl, Th и конфигурационный регистр соответственно) в EEPROM датчика. Если DS18B20 работает в режиме паразитного питания, то после выдачи команды copy scratchpad микроконтроллер должен подключить 1-Wire шину к источнику питания (смотри схему) на время >10 мс.
 
Последовательность работы в случае одного датчика:
  Инициализация
  Микроконтроллер выдает команду skip rom
  Микроконтроллер выдает команду copy scratchpad
 
   recall E2 (0xB8)
 
 По этой команде DS18B20 перезаписывает 2, 3 и 4 байты ОЗУ (Tl, Th и конфигурационный регистр соответственно) значениями, сохраненными в EEPROM. 
   Микроконтроллер может отслеживать процесс выполнения этой операции, формируя на 1-Wire шине тайм слоты чтения. Пока операция выполняется, на шине будет логический ноль, когда операция завершится – логическая единица.
   Операция recall E2 выполняется автоматически при включении питания датчика.
 
Последовательность работы в случае одного датчика:
  Инициализация
  Микроконтроллер выдает команду skip rom
  Микроконтроллер выдает команду rcall E2
  Микроконтроллер формирует тайм слот чтения и считывает состояние 1-Wire шины
 
   read power supply (0xB4)
 
   Послав эту команду и сформировав после нее тайм слот чтения, микроконтроллер может определять, как запитаны датчики DS18B20. Если они запитаны от сигнальной линии (режим паразитного питания), то во время тайм слота чтения 1-Wire шина будет удерживаться в нуле, если используется внешний источник питания, шина будет подтянута к единице. 
 
Последовательность работы в случае одного датчика:
  Инициализация
  Микроконтроллер выдает команду skip rom
  Микроконтроллер выдает команду read power supply
  Микроконтроллер формирует тайм слот чтения и считывает состояние 1-Wire шины
 
На этом мое краткое изложение скучной теории заканчивается. В следующей части мы перейдем к Си библиотеке для 1-Wire и разбору кода проектов. 

Comments   

# foxit 2011-01-24 14:13
Толковое описание теории.
Спасибо.
Ждем следующую часть.
# skiff 2011-01-28 05:48
Павел, мне нравится как ты статьи оформляешь...ес ть на что равняться :-)
Отличные статьи про датчик ds18b20.
# Pashgan 2011-01-28 19:31
Спасибо. Твои статьи ничуть не хуже и по содержанию, и по подаче, и по оформлению.
# skiff 2011-01-29 13:21
Спасибо. :-)
# Ринат 2011-01-31 00:29
Отлично, все понятно с первого раза.
У меня готовый код по работе с 1-Wire (поиск ROM), пишу на асме
# Crafter76 2011-01-31 10:14
Когда будет 3-я часть??? Жду не дождусь!!!
# Pashgan 2011-01-31 18:07
Еще даже не садился. Пользователи (Начинающий и Petrov) прислали мне свои статьи и я занимался их редактированием .
# foxit 2011-01-31 18:33
Тоже жду продолжения!
# Crafter76 2011-02-03 09:25
Я в файлах по winavr нашел работу с двумя датчиками температуры, и тоже самое сделал в файлах для протеуса... Только вот собираю hex из winavr, прошиваю им микруху в протеусе, а он у меня постоянно ругается на то, что криво подключен дисплей... В чем проблема, как мне перестроить либо один проект, либо другой, чтобы вместе все работало?
# Pashgan 2011-02-03 09:58
А зачем что-то исправлять? Есть же проект для WinAvr "работа с двумя датчиками DS18B20" и такой же и проект для Proteus`a.
# Crafter76 2011-02-03 10:24
Если бы все так было просто... Попытайтесь собрать проект для винавр и подгрузить main.hex либо main.elf к проекту протеуса... Лично у меня "(HD44780) Controller received data whilst busy", и приходится мне курить дальше.
А как сделать так, чтобы он мне вывел какую-нибудь информацию?
# Crafter76 2011-02-03 11:37
Вроде нашел косяк, частоты у проектов разные... Вот не знаю, какую частоту конкретно поставить...
# Pashgan 2011-02-03 12:06
Если мне память не изменяет, на макете у меня было 16 МГц
# Crafter76 2011-02-03 12:57
На макете стоит кварц на 16, а в настройках FUSES стоит "int.RC 8MHz"...
Тут видать все печально... Лучше выложите вместе с 1-wire-2-datchi ka-ds18b20-prot eus.rar тот код те исходники, из которых собран onewire2.hex
# Pashgan 2011-02-03 20:07
С проектами для WinAVR разобрался и перезалил. Там была старая версия lcd библиотеки.
# a.y4nus 2011-10-05 18:28
Можете подсказать, как можно считать серийный номер датчика, вывести его на экран, чтобы просто прописать его в коде, и не вызывать каждый раз функцию поиска? Если можно код программы)))
# fryn3 2015-12-30 11:53
Если у тебя один датчик, то используй skip rom и не парься с адресом!

У вас недостаточно прав для комментирования.