|
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 7 2006, 11:09
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Nov 7 2006, 11:41
|

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

|
Цитата(zltigo @ Nov 7 2006, 19:32)  Цитата(haker_fox @ Nov 7 2006, 13:18)  проанализируйте его внимательно.
Наверное имелось ввиду, что нужно читать между строк, поскльку в исходнике начисто отсутствует преобразование полученного числа в температуру, в чем собственно и была 'проблема'. Действительно  прошу прощения, но я не нарочно. Дело было давно и я почему-то был уверен, что в этом коде есть необходимая информация....
--------------------
Выбор.
|
|
|
|
|
Nov 7 2006, 11:42
|
Группа: Новичок
Сообщений: 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; }
|
|
|
|
|
Nov 7 2006, 12:15
|

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

|
Цитата(belenkoff @ Nov 7 2006, 13:42)  Я ползовался стандартной библиотечной функцией 1. Стандарнтых (определенных а стандартых С библиотеках) не существуе 2. Можете переадресовать часть комплиментов писателям того, что Вы называете "стандартной", но ведь и голову на плечах тоже надо иметь, прежде, чем что-то кем-то написанное и 'нахаляву' выложенное.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 7 2006, 13:12
|
Группа: Новичок
Сообщений: 4
Регистрация: 7-11-06
Пользователь №: 22 039

|
Дык и пытаюсь думать, но за первую неделю в Сях как то думается с трудом ... особенно PRINTF() и др.
В данной ситуации как поступить? Перейти на опрос другим способом или както выйти из положения с помощью хитромудрых математических манипуляций ??
|
|
|
|
|
Nov 7 2006, 14:51
|
Участник

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

|
Та, та, белый, белый, совсем карячий! Поступить можно так, - пойти на сайт первоисточника - Atmel в раздел Application Notes, найти там AVR318, - там и описание и код на С для IAR. Можно проявить настойчивость, и сходить на сайт Dallasa, вы не поверите,- там тоже полно информации о том, как работать с 1-Wire интерфейсом.
|
|
|
|
|
Nov 7 2006, 16:28
|

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

|
Цитата(belenkoff @ Nov 7 2006, 15:12)  Перейти на опрос другим способом О господи! Причем тут 'опрос'! Вы на что 'жаловались' - на бред при минусе, так неудивительно, ибо в преобразованиии очевидно (раз положительную температуру получаете нормальную) значения написано такое количество бреда, что и смотреть нечего. Цитата или както выйти из положения с помощью хитромудрых математических манипуляций ?? Ну НЕТ совсем НЕТ никаких хитромудрых операций. Пример без хитромудростей, глупостей и плавучки привел, какие проблемы? Цитата первую неделю в Сях Причем тут C, если для начала с элементарной арифметикой проблемы нешуточные. Возьмите кусок бумаги и напишите как хотите сделать преобразование а уж потом пишите, хоть на чем. Если нет мысли как сие сделать вообще, то чегоуж тут на языки пенять.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 8 2006, 08:41
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
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
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|