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

 
 
> 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
 
Start new topic
Ответов
VXDRV
сообщение Mar 5 2007, 12:40
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 67
Регистрация: 5-02-07
Пользователь №: 25 074



Решил наконец код привести - пример из Delphi (был под рукой), кому надо тот переведёт и на C и на ассемблер:

var
TH_TEMPERATURE:Byte;
TL_TEMPERATURE:Byte;
INT_TEMPERATURE:WORD;
SIGN:WORD;
TEMPERATURE:REAL;

собственно сама процедура:

TL_TEMPERATURE:=FT_In_Buffer[8];
TH_TEMPERATURE:=FT_In_Buffer[9];

INT_TEMPERATURE:=TH_TEMPERATURE*256+TL_TEMPERATURE;
SIGN:=INT_TEMPERATURE and $8000;
if SIGN=0 then
begin
TEMPERATURE:=INT_TEMPERATURE*0.0625;
end
else
begin
TEMPERATURE:=-(not(INT_TEMPERATURE)+1)*0.0625;
end;
Label1.Caption:=FloatToStrF(TEMPERATURE,ffFixed,6,4)

Принцип:
Определяем старший бит в двух байтах накладывая маску (SIGN:=INT_TEMPERATURE and $8000). Если SIGN равен нулю значит температура положительна - ничего не делаем умножаем и готово.
Иначе SIGN=$8000 (или 0x8000) температура отрицательна - берём инверсию, прибавляем единицу (что-то здесь связано с дополнительным кодом что ли), умножаем, добавляем минус и готово.
У меня работает - удачи!

P.S - В Windows есть очень хорошая программа - Калькулятор (calc.exe) - В инженерном виде позволяет проверить многие вещи.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Mar 5 2007, 19:41
Сообщение #3


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(VXDRV @ Mar 5 2007, 09:40) *
Решил наконец код привести - пример из Delphi (был под рукой), кому надо тот переведёт и на C и на ассемблер:

var
TH_TEMPERATURE:Byte;
TL_TEMPERATURE:Byte;
INT_TEMPERATURE:WORD;
SIGN:WORD;
TEMPERATURE:REAL;

собственно сама процедура:

TL_TEMPERATURE:=FT_In_Buffer[8];
TH_TEMPERATURE:=FT_In_Buffer[9];

INT_TEMPERATURE:=TH_TEMPERATURE*256+TL_TEMPERATURE;
SIGN:=INT_TEMPERATURE and $8000;
if SIGN=0 then
begin
TEMPERATURE:=INT_TEMPERATURE*0.0625;
end
else
begin
TEMPERATURE:=-(not(INT_TEMPERATURE)+1)*0.0625;
end;
Label1.Caption:=FloatToStrF(TEMPERATURE,ffFixed,6,4)

Принцип:
Определяем старший бит в двух байтах накладывая маску (SIGN:=INT_TEMPERATURE and $8000). Если SIGN равен нулю значит температура положительна - ничего не делаем умножаем и готово.
Иначе SIGN=$8000 (или 0x8000) температура отрицательна - берём инверсию, прибавляем единицу (что-то здесь связано с дополнительным кодом что ли), умножаем, добавляем минус и готово.
У меня работает - удачи!

P.S - В Windows есть очень хорошая программа - Калькулятор (calc.exe) - В инженерном виде позволяет проверить многие вещи.

Не пойму, зачем такие сложности? Почему нельзя вот так?
Код
         TL_TEMPERATURE:=FT_In_Buffer[8];
         TH_TEMPERATURE:=FT_In_Buffer[9];
         INT_TEMPERATURE:=TH_TEMPERATURE*256+TL_TEMPERATURE;
         TEMPERATURE:=INT_TEMPERATURE*0.0625;

Ну будет переменная TEMPERATURE отрицательной, ну и что? Принтф или FloatToStrF точно так же её напечатает, как и положительную, только со знаком минус.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- belenkoff   DS18B20 + Mega помогите !   Nov 7 2006, 10:44
- - Igor26   Посмотрите здесь, может что-то прояснится... http:...   Nov 7 2006, 11:06
- - zltigo   Цитата(belenkoff @ Nov 7 2006, 12:44) ......   Nov 7 2006, 11:09
- - haker_fox   Скачайте этот исходник (под IAR) и проанализируйте...   Nov 7 2006, 11:18
|- - zltigo   Цитата(haker_fox @ Nov 7 2006, 13:18) про...   Nov 7 2006, 11:32
|- - haker_fox   Цитата(zltigo @ Nov 7 2006, 19:32) Цитата...   Nov 7 2006, 11:41
|- - belenkoff   Цитата(zltigo @ Nov 7 2006, 14:32) Цитата...   Nov 7 2006, 11:42
|- - zltigo   Цитата(belenkoff @ Nov 7 2006, 13:42) Я п...   Nov 7 2006, 12:15
- - belenkoff   Дык и пытаюсь думать, но за первую неделю в Сях ка...   Nov 7 2006, 13:12
|- - zltigo   Цитата(belenkoff @ Nov 7 2006, 15:12) Пер...   Nov 7 2006, 16:28
|- - OlegIvanov   [/quote] Причем тут C, если для начала с элементар...   Mar 12 2007, 08:37
- - freux   Та, та, белый, белый, совсем карячий! Поступи...   Nov 7 2006, 14:51
- - Laksus   А "непонятное значение" это как? _______...   Nov 8 2006, 08:41
- - Miron   Ну что вы ругаете человека Просто помогите на само...   Nov 8 2006, 08:58
- - belenkoff   Спасибо всем за помощь! void ShowTemp(void) ...   Nov 12 2006, 20:04
|- - zltigo   Цитата(belenkoff @ Nov 12 2006, 22:04) Мо...   Nov 12 2006, 20:56
|- - КСПшник   На самом деле здесь все просто. Температура читает...   Nov 13 2006, 08:40
|- - freux   Может приведенное ниже не столь красиво, ибо отсут...   Nov 13 2006, 10:57
- - Andy Great   Вопрос по той же конфигурации. Пытаюсь использоват...   Nov 13 2006, 11:29
|- - simsim   signed char tt; //ds18b20_select(0); //w1_search(0...   Mar 4 2007, 18:09
|- - =GM=   Цитата(simsim @ Mar 4 2007, 15:09) signed...   Mar 4 2007, 19:40
|- - zltigo   Цитата(VXDRV @ Mar 5 2007, 11:40) Решил н...   Mar 5 2007, 13:20
||- - VXDRV   Цитата(zltigo @ Mar 5 2007, 13:20) Цитата...   Mar 5 2007, 17:55
|- - Naksojin   Я когда-то вот так делал.... unsigned char Check_...   Mar 6 2007, 18:52
- - umup   Для преобразования в формат с фиксированной запято...   Mar 6 2007, 19:27
- - Рома_С   Помогите мне пожалуйста, тоже проблемы с отрицател...   Mar 10 2007, 23:25
|- - =GM=   Цитата(Рома_С @ Mar 10 2007, 20:25) Помог...   Mar 11 2007, 01:22
- - Рома_С   А если нужно чтобы температура отображалась сточно...   Mar 11 2007, 18:17
|- - zltigo   Цитата(Рома_С @ Mar 11 2007, 17:17) А есл...   Mar 12 2007, 02:33
- - VXDRV   Дискретность 0,0625 если вы посмотрите DATA_SHEET....   Mar 12 2007, 00:39
|- - =GM=   Цитата(Рома_С @ Mar 11 2007, 15:17) А есл...   Mar 12 2007, 03:08
- - Рома_С   Свершилось чудо. E меня все получилось как я хотел...   Mar 13 2007, 19:48


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

 


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


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