Всё по DS18(B/S)20.

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
sirga
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Чт фев 14, 2013 21:32:55

Re: Всё по DS18(B/S)20.

Сообщение sirga »

добрый день, может кто нибудь объяснить вот этот код?

Код: Выделить всё

//========
// Вычисление температуры DS18B20
//========
void get_temp (void)
{
char integer;
int frac;

ds18b20_read_spd(0); // Читаем scratcpad

        if (__ds18b20_scratch_pad.temp_msb & 0xF8) // Проверка знака температуры, если "-" то выполнить
    {
    integer=((((~__ds18b20_scratch_pad.temp_msb) & 0x07)<<4)|((~__ds18b20_scratch_pad.temp_lsb)>>4));
    frac=(10000-((__ds18b20_scratch_pad.temp_lsb & 0x0F)*625));
        if (frac==10000)
        {
                integer++;
            frac=0;
        };
        if (integer>=50)
        {
                integer=50;
                frac=0;
        };
        temp=0-(((int)integer)*10+frac/1000);
    }
    else
    {
    integer=(((__ds18b20_scratch_pad.temp_msb & 0x07)<<4)|(__ds18b20_scratch_pad.temp_lsb>>4));
        frac=((__ds18b20_scratch_pad.temp_lsb & 0x0F)*625);
        if (integer>=99)
        {
                integer=99;
                frac=0;
        };
        temp=(((int)integer)*10+frac/1000);
    };
}
Реклама
Аватара пользователя
Сериг
Это не хвост, это антенна
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

Re: Всё по DS18(B/S)20.

Сообщение Сериг »

Конечно!Этот код заставляет микроконтроллер опрашивать датчик температуры :)))
Реклама
sirga
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Чт фев 14, 2013 21:32:55

Re: Всё по DS18(B/S)20.

Сообщение sirga »

Сериг писал(а):Конечно!Этот код заставляет микроконтроллер опрашивать датчик температуры :)))

ну эт понятно, но вот что делается тут:

integer=((((~__ds18b20_scratch_pad.temp_msb) & 0x07)<<4)|((~__ds18b20_scratch_pad.temp_lsb)>>4));
frac=(10000-((__ds18b20_scratch_pad.temp_lsb & 0x0F)*625));
if (frac==10000)
{
integer++;
frac=0;
};
if (integer>=50)
{
integer=50;
frac=0;
};
temp=0-(((int)integer)*10+frac/1000);

может можете хоть коротко но подробней объяснить? и почему такая формула?
Аватара пользователя
Сериг
Это не хвост, это антенна
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

Re: Всё по DS18(B/S)20.

Сообщение Сериг »

Вот тут мы выделяем целое число integer=((((~__ds18b20_scratch_pad.temp_msb) & 0x07)<<4)|((~__ds18b20_scratch_pad.temp_lsb)>>4));
frac=(10000-((__ds18b20_scratch_pad.temp_lsb & 0x0F)*625));
С помощью сдвига,записываем получившеся в переменную integer,если же температура отрицательная,то делаем логическую операцию "и" с числом 0x0F и получившееся умножаем на 625 и записываем в переменную "frac". Ну как-то так.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Re: Всё по DS18(B/S)20.

Сообщение СКАЗОЧНИК »

По Си уже отошел от него и он мне стал не интересен. =) Подключал этот датчик, писал весь протокол к нему на ассемблере (по книжке Белова по моему, там очень подробно все рассписано), и мерял у меня он только положительную температуру. А здесь похоже, что для отрицательной температуры (по условию) происходит перевод измерений ИЗ ДОПОЛНИТЕЛЬНОГО КОДА... Просто лень разбираться. =)
Станислав
Реклама
Аватара пользователя
Сериг
Это не хвост, это антенна
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

Re: Всё по DS18(B/S)20.

Сообщение Сериг »

Для измерений отрицательных температур надо просто инвертировать содержимое Temp_H и Temp_L и добавить знак минус.
Реклама
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Re: Всё по DS18(B/S)20.

Сообщение a_skr »

Неправильно. Не надо ничего инвертировать. Как правильно было сказано, там обычный дополнительный код. Используем простую знаковую переменную, например, short temp, не забываем про масштаб (ЦМР). Если надо получить абсолютное значение (для вывода вручную знака и самого значения), то просто меняем знак переменной: if(temp<0) temp = -temp;
Аватара пользователя
Сериг
Это не хвост, это антенна
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

Re: Всё по DS18(B/S)20.

Сообщение Сериг »

И что?
А теперь отепляйте даташит. И посмотрите,что при отрицательной температуре,полученный результат из регистров надо инвертировать.
А то,что вы написали-это из стандартной библиотеки cvavr.
А что она делает?
Как она узнает что температура меньше нуля?
Она смотрит на первые полбайта и если там единички,то говорим что отрицательная.
Дальше все так же считываем температуру и инвертируем ее!
Советую почитать даташит,а не на угад бомбить.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: Всё по DS18(B/S)20.

Сообщение ibiza11 »

Сериг, Вы уж лучше сами почитайте сначала что такое дополнительный код. :))
Ставим плюсы: )
Аватара пользователя
Сериг
Это не хвост, это антенна
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

Re: Всё по DS18(B/S)20.

Сообщение Сериг »

Дополнительный код нужен для того,что бы определить знак. Следовательно если знак будет равен 1,то темп-а отрицательная. А для вывода температуры после знака"-" надо инвертировать значение регистров Temp_H и Temp_L.
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Re: Всё по DS18(B/S)20.

Сообщение a_skr »

Сериг писал(а):И что?
А теперь отепляйте даташит. И посмотрите,что при отрицательной температуре,полученный результат из регистров надо инвертировать.
ага, и получить ошибку в 1 ЦМР (1/16 градуса). чтобы получить абсолютное значение через инверсию, то надо еще единицу прибавить.
зачем писать:
unsigned short temp = (temp_h<<8) | temp_l;
if(temp & 0x8000) temp = ~temp + 1;
вместо обычного:
short temp = (temp_h<<8) | temp_l;
if(temp < 0) temp = -temp;
Сериг писал(а):А то,что вы написали-это из стандартной библиотеки cvavr.
А что она делает?
причем тут CVAVR? я вообще стараюсь им не пользоваться, только если кто-то работу за деньги предлагает и "только CVAVR" ;)
Сериг писал(а):Как она узнает что температура меньше нуля?
дополнительный код - это естественный для процессора формат хранения знаковых величин.
Она смотрит на первые полбайта и если там единички,то говорим что отрицательная.
Дальше все так же считываем температуру и инвертируем ее!
я не знаю, кто там, куда смотрит, а в программе, если мне нужно, то я просто ставлю естественное для человека условие: if(temp < 0) {...}
Сериг писал(а):Советую почитать даташит,а не на угад бомбить.
ДШ мной изучен вдоль и поперек уже давно.
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Всё по DS18(B/S)20.

Сообщение shads »

Хочу слепить термометр с передачей данных по радиоканалу и с работой от батареи...

Хито в курсе... если контроллер будет ногой подавать питание на DS18B20, сколько времени надо ждать после пробуждения контроллера, чтобы DS18B20 пришел в себя, и нормально отрабатывал замер температуры?
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Всё по DS18(B/S)20.

Сообщение Gudd-Head »

А может это... для батарейного питания взять другой датчик? :)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
borys
Держит паяльник хвостом
Сообщения: 927
Зарегистрирован: Вт сен 07, 2010 19:27:48
Откуда: Ташкент

Re: Всё по DS18(B/S)20.

Сообщение borys »

Для shads.
Был здесь один проект, если не ошибаюсь термометр "Гном". Датчик запитан именно от ноги процессора. С этим не
должно быть проблем, датчик потребляет не более 1,5 мА и то кратковременно.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Всё по DS18(B/S)20.

Сообщение akl »

shads писал(а):... если контроллер будет ногой подавать питание на DS18B20, сколько времени надо ждать после пробуждения контроллера, чтобы DS18B20 пришел в себя, и нормально отрабатывал замер температуры?
В DS18B20 есть возможность работать с "паразитным" питанием, правда, диапазон измерения ограничен сверху. Пример реализации.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Всё по DS18(B/S)20.

Сообщение Gudd-Head »

borys писал(а):датчик потребляет не более 1,5 мА
akl писал(а):В DS18B20 есть возможность работать с "паразитным" питанием

Ох*еть не встать. Вопрос: сколько ждать по времени после Power-up? Ответы: "Возьми другой датчик", "Датчик жрёт 1,5 мА", "Датчик может работать в паразитном режиме" :))) :facepalm:
shads, видимо придётся подбирать время опытным путём. Заодно поделитесь с общественностью результатами своих экспериментов :)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Всё по DS18(B/S)20.

Сообщение akl »

Gudd-Head писал(а):видимо придётся подбирать время опытным путём.
:cry: Вам тоже не мешает глянуть в DS на DS18B20, чтобы не дожидаться, когда shads
Gudd-Head писал(а):поделится с общественностью результатами своих экспериментов
:)
shads DS есть на русском
Удачи.
Последний раз редактировалось akl Чт июн 27, 2013 05:53:30, всего редактировалось 1 раз.
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Re: Всё по DS18(B/S)20.

Сообщение СКАЗОЧНИК »

Если мне не изменяет память, то для инициализации датчика подают сверхдлинный импульс (подсаживают линию) в течение 700 мс, можно больше. Плюс все остальные команды протокола в микросекундах. Короче, примерно через 1 секунду будет уже результат измерений. Если МК усыплять до следующего измерения, то батареек хватит надолго. Питание от той же линии без проблем организуется. Мне, вот понравился вариант в книге у Белова.
Станислав
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: Всё по DS18(B/S)20.

Сообщение Kavka »

СКАЗОЧНИК, и как то что вы написали соотноситься с вопросом, который был задан?
shads писал(а):сколько времени надо ждать после пробуждения контроллера, чтобы DS18B20 пришел в себя, и нормально отрабатывал замер температуры?


shads, т.е. интересно, сколько времени надо ждать после первой подачи питания на датчик, до того как он нормально будет обрабатывать команды?
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Всё по DS18(B/S)20.

Сообщение shads »

akl писал(а):shads DS есть на русском
Удачи.
Перечитал вдоль и поперек..... ответа так и не нашел.....

Kavka писал(а):shads, т.е. интересно, сколько времени надо ждать после первой подачи питания на датчик, до того как он нормально будет обрабатывать команды?
Именно!

Gudd-Head писал(а):shads, видимо придётся подбирать время опытным путём.
Наверное..... ну вроде в этом не должно возникнуть сложностей, как за железо возьмусь, так и выясню.

Gudd-Head писал(а):Заодно поделитесь с общественностью результатами своих экспериментов :)
Обязательно!
Ответить

Вернуться в «Периферия»