DS18b20 Atmega8 CodeVision и температура ниже 0°С

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Dexter_khm
Родился
Сообщения: 8
Зарегистрирован: Вс фев 12, 2012 16:40:54

DS18b20 Atmega8 CodeVision и температура ниже 0°С

Сообщение Dexter_khm »

Здравствуйте делаю часы на Atmega8 которые показывают температуру 2 датчика DS18b20, один дома второй на улицу.
Пишу все под Кодевижн. Все Ок пока вокруг тепло :)) Но когда выкидываешь датчик на улицу он показывает такое:

Код: Выделить всё

Temp1: 65465
Temp2: 154   //тут все Ок 15.4°С  
Temp1: 65457// а вот тут должно быть чтото типа -7.8°С  но на практике получается что не должно 
Temp2: 159
Temp1: 65457
Temp2: 170
Страранно!!! :shock:
Но вобщем я так понял функция 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);
Вобщем не могу обработать минусовые температуры. В программировании я не мастер предпологаю что гдето затупил с привидением типов.

Помогите пожалуйста!!!!!
Реклама
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: DS18b20 Atmega8 CodeVision и температура ниже 0°С

Сообщение Мастер Ломастер »

уж на что я не владею CVAVR, но и то, читая массовые сообщения о термомтерах на этом форуме, четко знаю, что функция CVAVR возвращает температуру в формате float - то есть в виде дробного числа со знаком. с чего вы взяли, что это беззнаковое целое - не пойму. может, изредка надо читать справочнуюсистему к CVAVR - там ведь все функции подробно описаны...
битва с дураками проиграна, победители торжествуют. слава победителям!
Реклама
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: DS18b20 Atmega8 CodeVision и температура ниже 0°С

Сообщение 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;
Dexter_khm
Родился
Сообщения: 8
Зарегистрирован: Вс фев 12, 2012 16:40:54

Re: DS18b20 Atmega8 CodeVision и температура ниже 0°С

Сообщение 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С
Реклама
Эиком - электронные компоненты и радиодетали
Dexter_khm
Родился
Сообщения: 8
Зарегистрирован: Вс фев 12, 2012 16:40:54

Re: DS18b20 Atmega8 CodeVision и температура ниже 0°С

Сообщение Dexter_khm »

Еще такое вычитал в хедере DS18B20.h

int ds1820_temperature_10(unsigned char *addr);

Так всетаки результат Float или int ????

Codevision 2.05
Реклама
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: DS18b20 Atmega8 CodeVision и температура ниже 0°С

Сообщение IfoR »

Всё просто:

Код: Выделить всё

      printf("Temp1: %d\n\r", Temp1);
      printf("Temp2: %d\n\r", Temp2); 
u (беззнаковое целое) на d(знаковое целое) поменяйте.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Реклама
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: DS18b20 Atmega8 CodeVision и температура ниже 0°С

Сообщение Мастер Ломастер »

"e="Dexter_khm"]Еще такое вычитал в хедере DS18B20.h

int ds1820_temperature_10(unsigned char *addr);

Так всетаки результат Float или int ????

Codevision 2.05[/quote]прочтите, наконец, HELP - там ведь все описано! конкретно эта ваша функция возвращает int, а без _10 на конце - float"
битва с дураками проиграна, победители торжествуют. слава победителям!
Dexter_khm
Родился
Сообщения: 8
Зарегистрирован: Вс фев 12, 2012 16:40:54

Re: DS18b20 Atmega8 CodeVision и температура ниже 0°С

Сообщение 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х датчиков уходит примерно секунда, из зи етого сильно дергается индикация.?????
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: DS18b20 Atmega8 CodeVision и температура ниже 0°С

Сообщение 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х датчиков уходит примерно секунда, из зи етого сильно дергается индикация.?????
А где вопрос-то? :)
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Dexter_khm
Родился
Сообщения: 8
Зарегистрирован: Вс фев 12, 2012 16:40:54

Re: DS18b20 Atmega8 CodeVision и температура ниже 0°С

Сообщение Dexter_khm »

Пардон четозатупил и не довел мысль до конца. Так вот задержка при опросе датчиков получается в раене секунды . Вопрос можноли как то ускорить опрос датчиков???
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: DS18b20 Atmega8 CodeVision и температура ниже 0°С

Сообщение IfoR »

Ну это зависит от того, что именно так долго выполняется: датчик так долго сканирует температуру или программа так построена. Покажите код программы, что ли.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Dexter_khm
Родился
Сообщения: 8
Зарегистрирован: Вс фев 12, 2012 16:40:54

Re: DS18b20 Atmega8 CodeVision и температура ниже 0°С

Сообщение Dexter_khm »

IfoR писал(а): Может быть имелось ввиду это?

Код: Выделить всё

      unsigned int utemp = (Temp1<0)?(-Temp1):(Temp1);
      
      Seg5= utemp%10;
      Seg4= (utemp/10)%10;
      Seg3= utemp/100;  
Да Спасибо вот так заработало :))
Dexter_khm
Родился
Сообщения: 8
Зарегистрирован: Вс фев 12, 2012 16:40:54

Re: DS18b20 Atmega8 CodeVision и температура ниже 0°С

Сообщение 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;
}
Буду думать как ее подрезать.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: DS18b20 Atmega8 CodeVision и температура ниже 0°С

Сообщение ploop »

Что там резать? Свою функцию (копипаст этой, но без задержки), отправляй команду на преобразование ВСЕМ датчикам, а в конце ставь задержку в 1 сек.
demiurg301
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Re: DS18b20 Atmega8 CodeVision и температура ниже 0°С

Сообщение demiurg301 »

Dexter_khm писал(а):И вот нашел почему тормозил опрос датчиков.

Вот функция CodeVision

Буду думать как ее подрезать.
Чото вы действительно читать не могёте...

В функции есть название датчика DS1820, а у вас DS18B20. Для него есть другая либа.

Вот её 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 кодами.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»