Разбираюсь с датчиком температуры DS18B20, читаю материалы в сети.
Поясните:
1. Как я понимаю, вся работа с датчиком производится путём перевода шины в "0" на определенный временной интервал.
2. Как происходит чтение температуры в 9-ти битовом формате?
3. В каком формате датчик предоставляет температуру МК.
Необходимо собрать термостат на DS18B20 и Atmega16, а с 1wire шиной никогда дела не имел.
Спасибо!
Если бы это было так, это бы еще ничего. Если бы ничего, то так бы оно и было. Но так как это не так, так оно и не эдак. Такова логика вещей. (с)
1. Грубо говоря именно так.
2. Через команду чтения scratchpad. Причём читается всегда в 12-битном формате. Если преобразование происходит при меньшем разрешении, то младшие разряды просто не следует принимать во внимание. Разрешение программируется через конфигурационный регистр.
3. В дополнительном коде(до 2).
Не важно на какую точность измерения настроен датчик Вы должны получить от него дамп памяти, и не обязательно весь если не проверяете целостность данных.
Спойлер
Данные о температуре хранятся в этих регистрах дампа, обыкновенный двоичный формат с фиксированной запятой.
Спойлер
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Привет! Сам только сегодня раскурил и получил данные от датчика.
В даташите есть диаграммы. Вот согласно им и дергаешь пином. Есть такое понятие как time slot. Все времена приведены на диаграмме и в таблице.
Что бы прочитать температуру, сначала нужно сказать датчику "эй ты, измерь температуру!", а потом "эй, ты, покажи, что измерил!"
Примерно так!
test = u8Presence ();
vOWWriteBiyte (SKIP_ROM); // отправили 0хСС
vOWWriteBiyte (CONVERT_T); // отправили 0х44 (сказали измерять)
test = u8Presence ();
vOWWriteBit (SKIP_ROM); // отправили 0хСС
vOWWriteBit (READ_SCRATCHPAD); // отправили 0хBE (сказали что сча будем читать решистры
// чтение данных
temp = u8OWReadBytes (); // ну а тут таймслот чтения регистров.
Если интересует только температура (2 байта), то вычитываешь их и в конце отправляешь Presence. Первым лезет младший бит.
Как можешь заметить, любое обращение к датчику начинается с Presence ();
Это вот эта фиговина.
Проваливаешь шину от 480 мкс до 960 мкс, переводишь работу пина на "вход" (про паузу между таймслотами не забудь) и читаешь. Если пришел нуль, то на шине кто-то висит и можешь работать дальше, иначе будет единица. Тоды пиши ошибку, мол датчик не исправен или не подключен.