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

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Родился
Сообщения: 2
Зарегистрирован: Чт июн 26, 2008 15:20:11

Сообщение 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
}
}
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Родился
Сообщения: 2
Зарегистрирован: Чт июн 26, 2008 15:20:11

Сообщение ppvitek »

Согласно документации DS18B20 я должен получить 4 байта, в которых определен каждый бит. В связи с тем, что программирую в CodeVisionAVR нашел в ней библиотеку для работы с DS18B20 и там функция ds18b20_temperature(...) возвращает тип float. Время на преобразование выделяется внутри этой функции.
memcpy для получения однобайтного результата?! а какой тип имеет функция ds18b20_temperature()? если я не ошибаюсь, то прекрасно должна работать функция uchar res = ds18b20_temperature(...)
Согласен, но здесь суть не в этом.
Вымогатель припоя
Аватара пользователя
Сообщения: 534
Зарегистрирован: Пн янв 16, 2006 08:00:17
Откуда: Иркутск

Сообщение Mamonth »

Да нет, дело как раз в этом...
Вы учли как хранится значение типа long int в памяти? Вы ведь копируете как раз младший байт...
Давайте-ка откажитесь от memcpy и просто по-тупому уберите лишнее, например присвоив значение температуры к типу меньшей длины.
Today fine night...
Реклама
Эиком - электронные компоненты и радиодетали
Мучитель микросхем
Аватара пользователя
Сообщения: 438
Зарегистрирован: Вт сен 25, 2007 19:40:26
Откуда: Челябинск

Сообщение mr.Kirill »

Кстати насчет встроенной библиотеки DS18B20 в CodeVisionAVR.
С какой версией работаете? Нормально работа идет только с версии 1.25.8...
Реклама
Родился
Сообщения: 2
Зарегистрирован: Пт июл 04, 2008 07:59:55
Откуда: Симферополь

Сообщение 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);
Контактная информация:
Реклама
Закрыто

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