|
DS18B20 + Mega помогите !, траблы с отрицательной температурой |
|
|
|
Nov 7 2006, 10:44
|
Группа: Новичок
Сообщений: 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; } } }
|
|
|
|
|
 |
Ответов
|
Nov 12 2006, 20:04
|
Группа: Новичок
Сообщений: 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
|
|
|
|
|
Nov 12 2006, 20:56
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Nov 13 2006, 08:40
|
Участник

Группа: Свой
Сообщений: 57
Регистрация: 7-09-05
Пользователь №: 8 307

|
На самом деле здесь все просто. Температура читается из ОЗУ 18B20. Причем сама температура содержится в первых двух байтах (мл. байт по мл. адресу). Так вот, считывать эту температуру необходимо в двухбайтовую переменную (например, unsigned short). Далее, анализируете старший бит этой переменной, он всегда (вне зависимости от разрядности преобразования) говорит о знаке температуры (0 - положительная, 1 - отрицательная). Так вот, если отрицательная, то сама значащая часть (см. даташит), зависящая от заданной разрядности преобразования (по умолчанию - 12 разр.), дается в инверсном коде. Т.е. вам необходимо, при 1 в старшем разряде побитово инвертировать значение температуры, предварительно запомнив "-". Удачи.
|
|
|
|
|
Nov 13 2006, 10:57
|
Участник

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

|
Может приведенное ниже не столь красиво, ибо отсутствуют в выражении "всякие" там 1000, -9999 .. и другие десятичные цЫфры, зато давольно-таки оптимально, если глянуть в ассемблерный листинг: Код if (buf[1] > 0x0F) temperature = 0xFF00; else temperature = 0; temperature = temperature | (buf[0] >> 3) | (buf[1] << 5); WriteOutTemp(temperature);
... ... #pragma optimize=2 void WriteOutTemp(int temperature) { unsigned char nHalf = 0; temperature = temperature >> 1; if (SREG_C == 1) nHalf = 5; printf("T=%d.%d\r\n", temperature, nHalf); } С точностью один знак после запятой работает изумительно. А где printf, там и на индикатор вывести просто
|
|
|
|
Сообщений в этой теме
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 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 VXDRV Решил наконец код привести - пример из Delphi (был... Mar 5 2007, 12: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 =GM= Цитата(VXDRV @ Mar 5 2007, 09:40) Решил н... Mar 5 2007, 19:41  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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|