реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> DS18B20 + Mega помогите !, траблы с отрицательной температурой
belenkoff
сообщение Nov 7 2006, 10:44
Сообщение #1





Группа: Новичок
Сообщений: 4
Регистрация: 7-11-06
Пользователь №: 22 039



Доброго времени суток!

Столокнулся с проблемой, при положительной температуре - все нормально, как только ниже нуля - выдает непонятное значение..

void ShowTemp(void)
{
char i;
float temp;
isfloat=1;
temperature=ds18b20_temperature(&rom_code[0][0]);
if (temperature!=-9999)
{
if (temperature>=0) {
temp = temperature;
if (temperature>=1000) {isfloat =0; temp = temperature/10;} //
i=0;
while (temp>=10)
{
temp=temp-10;
i++;
};
if (i>9) i=0; //****

buff1[1]=i;
buff3[1]=i;
i=0;
while (temp>=1)
{
temp=temp-1;
i++;
};
buff1[2]=i;
buff3[2]=i;
i=0;
while (temp>=0.1)
{
temp=temp-0.1;
i++;
};
buff1[3]=i;
buff3[3]=i;
i=0;
while (temp>=0.01)
{
temp=temp-0.01;
i++;
};
buff1[4]=i;
buff3[4]=i;
}
else
{
isfloat=0;
temp = -temperature/10; // /10;
i=0;

while (temp>=10)
{
temp=temp-10;
i++;
};
buff1[1]=i;
buff3[1]=i;
i=0;
while (temp>=1)
{
temp=temp-1;
i++;
};
buff1[2]=i;
buff3[2]=i;
i=0;
while (temp>=0.1)
{
temp=temp-0.1;
i++;
};
buff1[3]=i;
buff3[3]=i;
i=0;
while (temp>=0.01)
{
temp=temp-0.01;
i++;
};
buff1[4]=i;
buff3[4]=i;
}
}
}
Go to the top of the page
 
+Quote Post
Igor26
сообщение Nov 7 2006, 11:06
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544



Посмотрите здесь, может что-то прояснится...
http://electronix.ru/forum/index.php?showt...&hl=ds18b20
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 7 2006, 11:09
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(belenkoff @ Nov 7 2006, 12:44) *
....

Обалдеть. Это уже словами описать нельзя.
Уже похоже в школах совсем ничему не учат, о программировании вообще уже и речь не идет :-(
Код
#define DS18X20_FRACCONV        625
// meas - то, что с датчика считали (два байта приведенные к signed int)
// dcel   - температура в десятых долях градуса c округлением, естественно
if( meas < 0 )            // Subzero
   dcel = ((meas*DS18X20_FRACCONV)-500)/1000;
else
   dcel = ((meas*DS18X20_FRACCONV)+500)/1000;
printf( "Temp:%+i.%i", dcel / 10, mod(dcel % 10) );


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Nov 7 2006, 11:18
Сообщение #4


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Скачайте этот исходник (под IAR) и проанализируйте его внимательно.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 7 2006, 11:32
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(haker_fox @ Nov 7 2006, 13:18) *
проанализируйте его внимательно.

Наверное имелось ввиду, что нужно читать между строк, поскльку в исходнике начисто отсутствует
преобразование полученного числа в температуру, в чем собственно и была 'проблема'.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Nov 7 2006, 11:41
Сообщение #6


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Цитата(zltigo @ Nov 7 2006, 19:32) *
Цитата(haker_fox @ Nov 7 2006, 13:18) *

проанализируйте его внимательно.

Наверное имелось ввиду, что нужно читать между строк, поскльку в исходнике начисто отсутствует
преобразование полученного числа в температуру, в чем собственно и была 'проблема'.

Действительно sad.gif прошу прощения, но я не нарочно. Дело было давно и я почему-то был уверен, что в этом коде есть необходимая информация....


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
belenkoff
сообщение Nov 7 2006, 11:42
Сообщение #7





Группа: Новичок
Сообщений: 4
Регистрация: 7-11-06
Пользователь №: 22 039



Цитата(zltigo @ Nov 7 2006, 14:32) *
Цитата(haker_fox @ Nov 7 2006, 13:18) *

проанализируйте его внимательно.

Наверное имелось ввиду, что нужно читать между строк, поскльку в исходнике начисто отсутствует
преобразование полученного числа в температуру, в чем собственно и была 'проблема'.


Я ползовался стандартной библиотечной функцией

float ds18b20_temperature(unsigned char *addr)
{
unsigned char resolution;
if (ds18b20_read_spd(addr)==0) return -9999;
resolution=(__ds18b20_scratch_pad.conf_register>>5) & 3;
if (ds18b20_select(addr)==0) return -9999;
w1_write(0x44);
delay_ms(conv_delay[resolution]);
if (ds18b20_read_spd(addr)==0) return -9999;
w1_init();
return (*((int *) &__ds18b20_scratch_pad.temp_lsb) & bit_mask[resolution])*0.0625;
}
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 7 2006, 12:15
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(belenkoff @ Nov 7 2006, 13:42) *
Я ползовался стандартной библиотечной функцией

1. Стандарнтых (определенных а стандартых С библиотеках) не существуе
2. Можете переадресовать часть комплиментов писателям того, что Вы называете "стандартной",
но ведь и голову на плечах тоже надо иметь, прежде, чем что-то кем-то написанное и 'нахаляву'
выложенное.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
belenkoff
сообщение Nov 7 2006, 13:12
Сообщение #9





Группа: Новичок
Сообщений: 4
Регистрация: 7-11-06
Пользователь №: 22 039



Дык и пытаюсь думать, но за первую неделю в Сях как то думается с трудом ... особенно PRINTF() и др.

В данной ситуации как поступить? Перейти на опрос другим способом или както выйти из положения с помощью хитромудрых математических манипуляций ??
Go to the top of the page
 
+Quote Post
freux
сообщение Nov 7 2006, 14:51
Сообщение #10


Участник
*

Группа: Новичок
Сообщений: 41
Регистрация: 7-02-05
Пользователь №: 2 473



Та, та, белый, белый, совсем карячий!

Поступить можно так, - пойти на сайт первоисточника - Atmel в раздел Application Notes, найти там AVR318, - там и описание и код на С для IAR. Можно проявить настойчивость, и сходить на сайт Dallasa, вы не поверите,- там тоже полно информации о том, как работать с 1-Wire интерфейсом.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 7 2006, 16:28
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(belenkoff @ Nov 7 2006, 15:12) *
Перейти на опрос другим способом

О господи! Причем тут 'опрос'! Вы на что 'жаловались' - на бред при минусе, так неудивительно,
ибо в преобразованиии очевидно (раз положительную температуру получаете нормальную) значения
написано такое количество бреда, что и смотреть нечего.
Цитата
или както выйти из положения с помощью хитромудрых математических манипуляций ??

Ну НЕТ совсем НЕТ никаких хитромудрых операций. Пример без хитромудростей, глупостей и плавучки привел, какие проблемы?
Цитата
первую неделю в Сях

Причем тут C, если для начала с элементарной арифметикой проблемы нешуточные.
Возьмите кусок бумаги и напишите как хотите сделать преобразование а уж потом пишите, хоть
на чем. Если нет мысли как сие сделать вообще, то чегоуж тут на языки пенять.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Laksus
сообщение Nov 8 2006, 08:41
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 146
Регистрация: 16-05-05
Пользователь №: 5 069



А "непонятное значение" это как?
_______________
Непонятно, как температура с DS18B20 может быть больше 1000 градусов?
Вроде ж не больше 125. Поэтому вряд ли это выполнится когда либо:
Код
if (temperature>=1000) {isfloat =0; temp = temperature/10;} //

И при положительных температурах останется всегда не деленным на 10.

А при отрицательной температуре у Вас всегда делится на 10:
Код
if (temperature>=0) {
temp = temperature;
if (temperature>=1000) {isfloat =0; temp = temperature/10;} //
...
}
else
{
isfloat=0;
temp = -temperature/10; // /10;
...

Может не надо делить на 10?
______________
Александр
2006 11 08
Go to the top of the page
 
+Quote Post
Miron
сообщение Nov 8 2006, 08:58
Сообщение #13


Частый гость
**

Группа: Validating
Сообщений: 149
Регистрация: 11-02-05
Из: Рязань
Пользователь №: 2 574



Ну что вы ругаете человека
Просто помогите
на самом деле здесь все просто
Надо объявить переменную
signed short ValueTermo; - двухбайтовое число со знаком
затем побайтно из массиса полученного с датчика
положить в него значение температуры
например так
ValueTermo=Buf_Mlan[1]*256+Buf_Mlan[0];
если нужно только целое значение
то просто делим на 16
если желаем иметь знаки после запятой
просто присваиваем ValueTermo переменной float
и тоже делим на 16
в итоге в С работаем с температурой со знаком

Удачи всем
Go to the top of the page
 
+Quote Post
belenkoff
сообщение Nov 12 2006, 20:04
Сообщение #14





Группа: Новичок
Сообщений: 4
Регистрация: 7-11-06
Пользователь №: 22 039



Спасибо всем за помощь!

void ShowTemp(void)
{
char i;
float temp;
unsigned int tt;
unsigned long TV;
bit Sign;


tt=ds18b20_temperature(&rom_code[0][0])/0.0625;
if (tt!=-9999)
{

if((tt & 0xf800) == 0xf800){
TV=~tt; TV&=0x0000ffff; TV++; Sign=1;}
else {TV=tt; TV&=0x0000ffff; Sign=0;}


if (Sign)
{
isfloat=0;
temperature=(TV-COEF)*0.0625; //COEF - число прогрешности, если вдруг чего
} else
{
isfloat=1;
temperature=(TV+COEF)*0.0625;
}
if (temperature<0) temperature=-temperature;

temp = temperature;
//********************
i=0;
while (temp>=10)
{
temp=temp-10;
i++;
};

buff1[1]=i;
buff3[1]=i;
i=0;
while (temp>=1)
{
temp=temp-1;
i++;
};
buff1[2]=i;
buff3[2]=i;
i=0;
while (temp>=0.1)
{
temp=temp-0.1;
i++;
};
buff1[3]=i;
buff3[3]=i;
i=0;
while (temp>=0.01)
{
temp=temp-0.01;
i++;
};
buff1[4]=i;
buff3[4]=i;
}
}

Жаль, что некоторые "ВЕЛИКИЕ" очень уж любят "чайников"

Может подскажете, как вместо такой ужасной процедуры разложения значения температуры использовать PRINF
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 12 2006, 20:56
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(belenkoff @ Nov 12 2006, 22:04) *
Может подскажете, как вместо такой ужасной процедуры разложения значения температуры использовать PRINF

А зачем этот 'шедевр' еще раз постить?
В первом-же посте написал. Код мой реальный. Весь этот ужас действительно заменяется несколькими строчками.
Причем ужас вызван отнюдь не использованием или не использованием printf() ( или sprintf() - это намек) - ....printf() это не более, чем последний необязательный штрих...

Цитата
Жаль, что некоторые "ВЕЛИКИЕ" очень уж любят "чайников"

Если это булыжник в мой огород, то я реально не люблю "ламеров", к "чайникам" отношусь спокойно и стараюсь помогать. Что впрочем не мешает
-называть вещи своими именами.
-не заниматься чрезмерным разжевыванием.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 10th July 2025 - 22:24
Рейтинг@Mail.ru


Страница сгенерированна за 0.01517 секунд с 7
ELECTRONIX ©2004-2016