Страница 27 из 59
Re: Всё по DS18(B/S)20.
Добавлено: Пн май 27, 2013 19:33:47
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);
};
}
[/size]
Re: Всё по DS18(B/S)20.
Добавлено: Вт май 28, 2013 12:53:57
Сериг
Конечно!Этот код заставляет микроконтроллер опрашивать датчик температуры

Re: Всё по DS18(B/S)20.
Добавлено: Вт май 28, 2013 12:58:38
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);
может можете хоть коротко но подробней объяснить? и почему такая формула?
Re: Всё по DS18(B/S)20.
Добавлено: Вт май 28, 2013 13:04:44
Сериг
Вот тут мы выделяем целое число 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". Ну как-то так.
Re: Всё по DS18(B/S)20.
Добавлено: Пн июн 17, 2013 14:25:19
СКАЗОЧНИК
По Си уже отошел от него и он мне стал не интересен. =) Подключал этот датчик, писал весь протокол к нему на ассемблере (по книжке Белова по моему, там очень подробно все рассписано), и мерял у меня он только положительную температуру. А здесь похоже, что для отрицательной температуры (по условию) происходит перевод измерений ИЗ ДОПОЛНИТЕЛЬНОГО КОДА... Просто лень разбираться. =)
Re: Всё по DS18(B/S)20.
Добавлено: Вт июн 18, 2013 12:07:19
Сериг
Для измерений отрицательных температур надо просто инвертировать содержимое Temp_H и Temp_L и добавить знак минус.
Re: Всё по DS18(B/S)20.
Добавлено: Вт июн 18, 2013 12:44:40
a_skr
Неправильно. Не надо ничего инвертировать. Как правильно было сказано, там обычный дополнительный код. Используем простую знаковую переменную, например, short temp, не забываем про масштаб (ЦМР). Если надо получить абсолютное значение (для вывода вручную знака и самого значения), то просто меняем знак переменной: if(temp<0) temp = -temp;
Re: Всё по DS18(B/S)20.
Добавлено: Чт июн 20, 2013 12:46:01
Сериг
И что?
А теперь отепляйте даташит. И посмотрите,что при отрицательной температуре,полученный результат из регистров надо инвертировать.
А то,что вы написали-это из стандартной библиотеки cvavr.
А что она делает?
Как она узнает что температура меньше нуля?
Она смотрит на первые полбайта и если там единички,то говорим что отрицательная.
Дальше все так же считываем температуру и инвертируем ее!
Советую почитать даташит,а не на угад бомбить.
Re: Всё по DS18(B/S)20.
Добавлено: Чт июн 20, 2013 12:59:02
ibiza11
Сериг, Вы уж лучше сами почитайте сначала что такое дополнительный код.

Re: Всё по DS18(B/S)20.
Добавлено: Чт июн 20, 2013 13:06:13
Сериг
Дополнительный код нужен для того,что бы определить знак. Следовательно если знак будет равен 1,то темп-а отрицательная. А для вывода температуры после знака"-" надо инвертировать значение регистров Temp_H и Temp_L.
Re: Всё по DS18(B/S)20.
Добавлено: Чт июн 20, 2013 13:08:30
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) {...}
Сериг писал(а):Советую почитать даташит,а не на угад бомбить.
ДШ мной изучен вдоль и поперек уже давно.
Re: Всё по DS18(B/S)20.
Добавлено: Вт июн 25, 2013 15:37:39
shads
Хочу слепить термометр с передачей данных по радиоканалу и с работой от батареи...
Хито в курсе... если контроллер будет ногой подавать питание на DS18B20, сколько времени надо ждать после пробуждения контроллера, чтобы DS18B20 пришел в себя, и нормально отрабатывал замер температуры?
Re: Всё по DS18(B/S)20.
Добавлено: Вт июн 25, 2013 15:39:35
Gudd-Head
А может это... для батарейного питания взять другой датчик?

Re: Всё по DS18(B/S)20.
Добавлено: Вт июн 25, 2013 18:33:44
borys
Для shads.
Был здесь один проект, если не ошибаюсь термометр "Гном". Датчик запитан именно от ноги процессора. С этим не
должно быть проблем, датчик потребляет не более 1,5 мА и то кратковременно.
Re: Всё по DS18(B/S)20.
Добавлено: Ср июн 26, 2013 08:30:49
akl
shads писал(а):... если контроллер будет ногой подавать питание на DS18B20, сколько времени надо ждать после пробуждения контроллера, чтобы DS18B20 пришел в себя, и нормально отрабатывал замер температуры?
В DS18B20 есть возможность работать с "паразитным" питанием, правда, диапазон измерения ограничен сверху.
Пример реализации.
Re: Всё по DS18(B/S)20.
Добавлено: Ср июн 26, 2013 13:41:07
Gudd-Head
borys писал(а):датчик потребляет не более 1,5 мА
akl писал(а):В DS18B20 есть возможность работать с "паразитным" питанием
Ох*еть не встать. Вопрос: сколько ждать по времени после Power-up? Ответы: "Возьми другой датчик", "Датчик жрёт 1,5 мА", "Датчик может работать в паразитном режиме"
shads, видимо придётся подбирать время опытным путём. Заодно поделитесь с общественностью результатами своих экспериментов

Re: Всё по DS18(B/S)20.
Добавлено: Чт июн 27, 2013 05:29:40
akl
Gudd-Head писал(а):видимо придётся подбирать время опытным путём.

Вам тоже не мешает глянуть в
DS на DS18B20, чтобы не дожидаться, когда
shads
Gudd-Head писал(а):поделится с общественностью результатами своих экспериментов
shads DS есть
на русском
Удачи.
Re: Всё по DS18(B/S)20.
Добавлено: Чт июн 27, 2013 05:32:29
СКАЗОЧНИК
Если мне не изменяет память, то для инициализации датчика подают сверхдлинный импульс (подсаживают линию) в течение 700 мс, можно больше. Плюс все остальные команды протокола в микросекундах. Короче, примерно через 1 секунду будет уже результат измерений. Если МК усыплять до следующего измерения, то батареек хватит надолго. Питание от той же линии без проблем организуется. Мне, вот понравился вариант в книге у Белова.
Re: Всё по DS18(B/S)20.
Добавлено: Чт июн 27, 2013 06:52:47
Kavka
СКАЗОЧНИК, и как то что вы написали соотноситься с вопросом, который был задан?
shads писал(а):сколько времени надо ждать после пробуждения контроллера, чтобы DS18B20 пришел в себя, и нормально отрабатывал замер температуры?
shads, т.е. интересно, сколько времени надо ждать после первой подачи питания на датчик, до того как он нормально будет обрабатывать команды?
Re: Всё по DS18(B/S)20.
Добавлено: Чт июн 27, 2013 09:48:51
shads
Перечитал вдоль и поперек..... ответа так и не нашел.....
Kavka писал(а):shads, т.е. интересно, сколько времени надо ждать после первой подачи питания на датчик, до того как он нормально будет обрабатывать команды?
Именно!
Gudd-Head писал(а):shads, видимо придётся подбирать время опытным путём.
Наверное..... ну вроде в этом не должно возникнуть сложностей, как за железо возьмусь, так и выясню.
Gudd-Head писал(а):Заодно поделитесь с общественностью результатами своих экспериментов

Обязательно!