Страница 1 из 1

Проблемы получения температуры болше 60 градусов от DS18B20

Добавлено: Чт июн 26, 2008 15:34:02
ppvitek
Товарищи, пожалуйста, помогите решить проблему с получением температуры от ds18b20.
Необходимо с минимальной задержкой получать значение температуры. Интересует только целая часть. Значение температуры необходимо выдавать в виде unsigned char (1 байт)

Использую Atmega8L.
Инициализация шины 1wire и поиск датчиков проходят без проблем. Опрос температуры тоже работает, но только до тех пор, пока температура не становится больше 60 градусов. Как только температура должна перепрыгнуть на 61 градус, начинает валиться всякая чушь.
Подскажите, где может скрываться проблема?

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

//Запрос температуры датчика с номером s_num
unsigned char GetTemperature(unsigned char s_num)
{
  long temp;
  unsigned char res;
  #asm("cli")
  temp= ds18b20_temperature(&rom_code[s_num][0]);
  #asm("sei")
  memcpy(&res,(unsigned char *)&temp,1);
  return res;
}


void main(void)
{
...

/ Инициализация температурных датчиков DS18B20
/* detect how many DS18B20 devices
   are connected to the 1 Wire bus */
devices_count=w1_search(0xf0,rom_code);
if (devices_count>MAX_DEVICES) devices_count=MAX_DEVICES; 

for (i=0;i<devices_count;i++)
    if (!ds18b20_init(&rom_code[i][0],20,30,DS18B20_9BIT_RES))
       {
       while(1);
       };

while(1)
{
unsigned char t=GetTemperature(0);
transmit(); //передача t по RS232
}
}

Добавлено: Чт июн 26, 2008 18:42:17
ARV
1. не увидел, чтобы давалось время на преобразование - если не ошибаюсь, то по умолчанию это 750 миллисекунд - у вас бесконечный цикл без задержек вообще
2. memcpy для получения однобайтного результата?! а какой тип имеет функция ds18b20_temperature()? если я не ошибаюсь, то прекрасно должна работать функция uchar res = ds18b20_temperature(...)

Добавлено: Пт июн 27, 2008 09:59:41
ppvitek
Согласно документации DS18B20 я должен получить 4 байта, в которых определен каждый бит. В связи с тем, что программирую в CodeVisionAVR нашел в ней библиотеку для работы с DS18B20 и там функция ds18b20_temperature(...) возвращает тип float. Время на преобразование выделяется внутри этой функции.
memcpy для получения однобайтного результата?! а какой тип имеет функция ds18b20_temperature()? если я не ошибаюсь, то прекрасно должна работать функция uchar res = ds18b20_temperature(...)
Согласен, но здесь суть не в этом.

Добавлено: Пт июл 04, 2008 06:53:00
Mamonth
Да нет, дело как раз в этом...
Вы учли как хранится значение типа long int в памяти? Вы ведь копируете как раз младший байт...
Давайте-ка откажитесь от memcpy и просто по-тупому уберите лишнее, например присвоив значение температуры к типу меньшей длины.

Добавлено: Пт июл 04, 2008 07:17:08
mr.Kirill
Кстати насчет встроенной библиотеки DS18B20 в CodeVisionAVR.
С какой версией работаете? Нормально работа идет только с версии 1.25.8...

Добавлено: Пт июл 04, 2008 08:09:05
EKuzmich
Сейчас занимаюсь этим вопросом по связке ds18b20 к мега8 вот код проверил работает
температору подымал до 70

float a[4];
unsigned char b;
char buf[20];

for (i=0;i<devices;){

a=ds18b20_temperature(&rom_codes[i++][0]);
}

b=a[0];
itoa(b,buf);
lcd_puts(buf);