Страница 1 из 1
DS18b20 Atmega8 CodeVision и температура ниже 0°С
Добавлено: Вс фев 12, 2012 17:07:13
Dexter_khm
Здравствуйте делаю часы на Atmega8 которые показывают температуру 2 датчика DS18b20, один дома второй на улицу.
Пишу все под Кодевижн. Все Ок пока вокруг тепло

Но когда выкидываешь датчик на улицу он показывает такое:
Код: Выделить всё
Temp1: 65465
Temp2: 154 //тут все Ок 15.4°С
Temp1: 65457// а вот тут должно быть чтото типа -7.8°С но на практике получается что не должно
Temp2: 159
Temp1: 65457
Temp2: 170
Страранно!!!
Но вобщем я так понял функция CodeVision ds1820_temperature_10(); возвращает температуру в целочисленном беззнаковом значении. Тоесть 0°С это 65535 значения датчика.
Пытаюсь разобрать эту лабуду вот мой код:
Код: Выделить всё
int Temp1, Temp2;
.
.
.
int GetTemp(char i)
{
int temp;
#asm("cli");
temp= (int) ds1820_temperature_10(&ds1820_rom_codes[i][0])/10; //читаем температуру
#asm("sei");
if (temp>1000){ //если датчик выдаёт больше 1000
temp=(65535-temp)+1; //Но даже при значении 65535 он сюда не проходит!!!!
}
return temp;
}
.
.
.
Temp1=GetTemp(0);
Temp2=GetTemp(1);
printf("Temp1: %u\n\r", Temp1);
printf("Temp2: %u\n\r", Temp2);
Вобщем не могу обработать минусовые температуры. В программировании я не мастер предпологаю что гдето затупил с привидением типов.
Помогите пожалуйста!!!!!
Re: DS18b20 Atmega8 CodeVision и температура ниже 0°С
Добавлено: Вс фев 12, 2012 17:32:05
Мастер Ломастер
уж на что я не владею CVAVR, но и то, читая массовые сообщения о термомтерах на этом форуме, четко знаю, что функция CVAVR возвращает температуру в формате float - то есть в виде дробного числа со знаком. с чего вы взяли, что это беззнаковое целое - не пойму. может, изредка надо читать справочнуюсистему к CVAVR - там ведь все функции подробно описаны...
Re: DS18b20 Atmega8 CodeVision и температура ниже 0°С
Добавлено: Вс фев 12, 2012 17:53:22
urry
(с) Не стреляйте в пианиста, он играет, как умеет...
Код: Выделить всё
temp= (int) ds1820_temperature_10(&ds1820_rom_codes[i][0])/10; //читаем температуру
#asm("sei");
if (temp > 4095)
{ //если датчик выдаёт больше 1000
temp^=0xFFFF;
temp+=1; //Но даже при значении 65535 он сюда не проходит!!!!
}
return temp;
Re: DS18b20 Atmega8 CodeVision и температура ниже 0°С
Добавлено: Вс фев 12, 2012 18:22:24
Dexter_khm
urry писал(а):(с) Не стреляйте в пианиста, он играет, как умеет...
Код: Выделить всё
temp= (int) ds1820_temperature_10(&ds1820_rom_codes[i][0])/10; //читаем температуру
#asm("sei");
if (temp > 4095)
{ //если датчик выдаёт больше 1000
temp^=0xFFFF;
temp+=1; //Но даже при значении 65535 он сюда не проходит!!!!
}
return temp;
вот такой результат
Код: Выделить всё
Ok
Temp1: 65413
Temp2: 138
Temp1: 65412
Temp2: 138
Temp1: 65411
Temp2: 138
Temp1: 65409
Temp2:
137
А тем временем за окном -7С
Re: DS18b20 Atmega8 CodeVision и температура ниже 0°С
Добавлено: Вс фев 12, 2012 18:26:55
Dexter_khm
Еще такое вычитал в хедере DS18B20.h
int ds1820_temperature_10(unsigned char *addr);
Так всетаки результат Float или int ????
Codevision 2.05
Re: DS18b20 Atmega8 CodeVision и температура ниже 0°С
Добавлено: Вс фев 12, 2012 18:30:06
IfoR
Всё просто:
Код: Выделить всё
printf("Temp1: %d\n\r", Temp1);
printf("Temp2: %d\n\r", Temp2);
u (беззнаковое целое) на d(знаковое целое) поменяйте.
Re: DS18b20 Atmega8 CodeVision и температура ниже 0°С
Добавлено: Вс фев 12, 2012 18:30:46
Мастер Ломастер
"e="Dexter_khm"]Еще такое вычитал в хедере DS18B20.h
int ds1820_temperature_10(unsigned char *addr);
Так всетаки результат Float или int ????
Codevision 2.05[/quote]прочтите, наконец, HELP - там ведь все описано! конкретно эта ваша функция возвращает int, а без _10 на конце - float"
Re: DS18b20 Atmega8 CodeVision и температура ниже 0°С
Добавлено: Вс фев 12, 2012 18:51:03
Dexter_khm
IfoR писал(а):Всё просто:
Код: Выделить всё
printf("Temp1: %d\n\r", Temp1);
printf("Temp2: %d\n\r", Temp2);
u (беззнаковое целое) на d(знаковое целое) поменяйте.
да спасибо так понятнее стало
Код: Выделить всё
Ok
Temp1: -137
Temp2: 138
Temp1: -136
Temp2: 137
Temp1: -135
Temp2: 137
Temp1: -132
Temp2: 138
надо с выводом на семисегментники чтото думать на минусе получается разбиение на знакоместа глючит, на + все нормально
Код: Выделить всё
{
\\5 семисегментника у меня
Seg5= Temp1-((Temp1/10)*10);
Seg4= (Temp1-((Temp1/100)*100))/10;
Seg3= Temp1/100;
if (Temp1>0)
{
Seg2= 10; //когда ничего не светится
}
else
{ак
Seg2= 20;// Знак "-"
}
Seg1=18;// Знак "У" Улица типа
И еще вопрос у меня на опрос 2х датчиков уходит примерно секунда, из зи етого сильно дергается индикация.?????
Re: DS18b20 Atmega8 CodeVision и температура ниже 0°С
Добавлено: Вс фев 12, 2012 19:00:22
IfoR
Не понял что происходит, но я попробую ответить:
Заменить это:
Код: Выделить всё
Seg5= Temp1-((Temp1/10)*10);
Seg4= (Temp1-((Temp1/100)*100))/10;
Seg3= Temp1/100;
На это:
Код: Выделить всё
unsigned int utemp = (Temp1<0)?(-Temp1):(Temp1);
Seg5= utemp-((utemp/10)*10);
Seg4= (utemp-((utemp/100)*100))/10;
Seg3= utemp/100;
А к чему такие дикие преобразования?
Может быть имелось ввиду это?
Код: Выделить всё
unsigned int utemp = (Temp1<0)?(-Temp1):(Temp1);
Seg5= utemp%10;
Seg4= (utemp/10)%10;
Seg3= utemp/100;
И еще вопрос у меня на опрос 2х датчиков уходит примерно секунда, из зи етого сильно дергается индикация.?????
А где вопрос-то?

Re: DS18b20 Atmega8 CodeVision и температура ниже 0°С
Добавлено: Вс фев 12, 2012 19:48:31
Dexter_khm
Пардон четозатупил и не довел мысль до конца. Так вот задержка при опросе датчиков получается в раене секунды . Вопрос можноли как то ускорить опрос датчиков???
Re: DS18b20 Atmega8 CodeVision и температура ниже 0°С
Добавлено: Вс фев 12, 2012 19:53:46
IfoR
Ну это зависит от того, что именно так долго выполняется: датчик так долго сканирует температуру или программа так построена. Покажите код программы, что ли.
Re: DS18b20 Atmega8 CodeVision и температура ниже 0°С
Добавлено: Пн фев 13, 2012 17:20:56
Dexter_khm
IfoR писал(а):
Может быть имелось ввиду это?
Код: Выделить всё
unsigned int utemp = (Temp1<0)?(-Temp1):(Temp1);
Seg5= utemp%10;
Seg4= (utemp/10)%10;
Seg3= utemp/100;
Да Спасибо вот так заработало

Re: DS18b20 Atmega8 CodeVision и температура ниже 0°С
Добавлено: Пн фев 13, 2012 17:27:57
Dexter_khm
И вот нашел почему тормозил опрос датчиков.
Вот функция CodeVision
Код: Выделить всё
int ds1820_temperature_10(unsigned char *addr)
{
if (ds1820_select(addr)==0) return -9999;
w1_write(0x44);
delay_ms(550); //А вот и задержка поєтому если опрашивать 2 датчика набегает Секунда
if (ds1820_read_spd(addr)==0) return -9999;
w1_init();
return (((int)__ds1820_scratch_pad.temp_msb<<8)|
__ds1820_scratch_pad.temp_lsb)*5;
}
Буду думать как ее подрезать.
Re: DS18b20 Atmega8 CodeVision и температура ниже 0°С
Добавлено: Пн фев 13, 2012 17:34:11
ploop
Что там резать? Свою функцию (копипаст этой, но без задержки), отправляй команду на преобразование ВСЕМ датчикам, а в конце ставь задержку в 1 сек.
Re: DS18b20 Atmega8 CodeVision и температура ниже 0°С
Добавлено: Вт фев 14, 2012 01:58:06
demiurg301
Dexter_khm писал(а):И вот нашел почему тормозил опрос датчиков.
Вот функция CodeVision
Буду думать как ее подрезать.
Чото вы действительно читать не могёте...
В функции есть название датчика DS1820, а у вас DS18
B20. Для него есть другая либа.
Вот её header
unsigned char ds18b20_select(unsigned char *addr);
unsigned char ds18b20_read_spd(unsigned char *addr);
float ds18b20_temperature(unsigned char *addr);
unsigned char ds18b20_init(unsigned char *addr,signed char temp_low,signed char temp_high,
unsigned char resolution);
Возращает флоат... Не надо ничё резать...
В хелпе есть пример использования с rom кодами.