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

DS18B20 глючит, или руки кривые

Добавлено: Сб янв 07, 2012 11:57:49
Payalnick
Всем привет. В общем был у меня датчик DS18B20, в прошлом году делал на нем пару термометров на макетной плате по чужим прошивкам, положительная температура работала, а отрицательную не показывал...

Вот решил на праздники свою прошивку написать, она очень простая, выводит температуру на лсд 16х2. Положительную температуру показывает, а на отрицательной выдает -9999. Как думаете что с ним? Может при пайке повредил что-то?

Помогите, если не сложно.

Вот собстна код:

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

#include <mega8.h>
#asm
   .equ __w1_port=0x18 ;PORTB
   .equ __w1_bit=0
#endasm
#include <1wire.h>
#asm
   .equ __lcd_port=0x12 ;PORTD
#endasm
#include <lcd.h>             
#include <ds18b20.h>             
#include <stdio.h> 
char  t[33];
          
int temp;
void main(void)

{
w1_init();

lcd_init(16);
lcd_clear();
 while(1){
 temp=ds18b20_temperature(0);
 if (temp>65480) {temp=(65535-temp)+1;}
 lcd_gotoxy(0,0);
 sprintf(t,"t=%i.%u\xdfC",temp,temp%1); 
 lcd_puts(t);}
  }
 

Re: DS18B20 глючит, или руки кривые

Добавлено: Сб янв 07, 2012 12:13:14
md5sum
Payalnick писал(а):Вот собстна код:

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

 if (temp>65480) {temp=(65535-temp)+1;}
 
Это зачем?
int temp не принимает значения больше 32767 :) Если только специально не привести тип к unsigned.
Дальше используется sprintf, который сам отрицательные значения понимает...
Если уж хочется преобразовать, то if (temp<0) temp=-temp;

Re: DS18B20 глючит, или руки кривые

Добавлено: Сб янв 07, 2012 12:21:57
zlogic
посмотрите мой код...

// Индикация температуры
if(temp_msb & 0x80) temp_sign = true;
else temp_sign = false;
temp = temp_msb << 8 + temp_lsb;
if(temp_sign)
{
temp = 0xffff - temp;
temp++;
}
else temp &= 0x07ff;
tempC = temp * 0.0625;
MySprintf(str, tempC); // Это моя оригинальная функция форматного вывода...

Re: DS18B20 глючит, или руки кривые

Добавлено: Сб янв 07, 2012 12:28:08
Payalnick
md5sum писал(а):
Payalnick писал(а):Вот собстна код:

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

 if (temp>65480) {temp=(65535-temp)+1;}
 
Это зачем?
int temp не принимает значения больше 32767 :) Если только специально не привести тип к unsigned.
Дальше используется sprintf, который сам отрицательные значения понимает...
Если уж хочется преобразовать, то if (temp<0) temp=-temp;
У моего знакомого так было написано и все работало. Может паленый датчик? Схожу новый куплю и проверю.

Re: DS18B20 глючит, или руки кривые

Добавлено: Сб янв 07, 2012 13:15:04
Payalnick
В общем купил новый датчик, припаял к шлефу, прошил МК этим:

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

#include <mega8.h>
#asm
   .equ __w1_port=0x18 ;PORTB
   .equ __w1_bit=0
#endasm
#include <1wire.h>
#asm
   .equ __lcd_port=0x12 ;PORTD
#endasm
#include <lcd.h>             
#include <ds18b20.h>             
#include <stdio.h> 
char  t[33];
          
int temp;
void main(void)

{ int a;
w1_init();

lcd_init(16);
lcd_clear();
 while(1){
 temp=ds18b20_temperature(0);
 lcd_gotoxy(0,0);
 sprintf(t,"t=%i.%u\xdfC",temp,temp%1); 
 lcd_puts(t);}
  }
Выводит 25 градусов, сую датчик в холодильник, доходит до 0, затем пишет 65535(типо -1), потом 65534(типо -2) и так до -7, а потом -9999. Вот почему так? Магазин продал мне паленый датчик? Или его лучше не паять а вставлять в панельку какую-нить?

Re: DS18B20 глючит, или руки кривые

Добавлено: Сб янв 07, 2012 13:40:41
md5sum
Ну... можно купить третий датчик, вставить в панельку, получить тот-же результат...
И только тогда начать подозревать, что что-то в программе исправить надо :))

Re: DS18B20 глючит, или руки кривые

Добавлено: Сб янв 07, 2012 15:25:24
Payalnick
Ок, буду искать косяки. Спасибо

Re: DS18B20 глючит, или руки кривые

Добавлено: Сб янв 07, 2012 15:33:54
md5sum
Payalnick писал(а):Ок, буду искать косяки. Спасибо
Для начала исключить датчик и

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

void main(void)
{
lcd_init(16);
lcd_clear();
temp=-25;
lcd_gotoxy(0,0);
sprintf(t,"t=%i.%u\xdfC",temp,temp%1); 
lcd_puts(t);
while (1) {};
}
добиться показания -25

Во вторых поясните смысл этого sprintf(t,"t=%i.%u\xdfC",temp,temp%1);
Вы выводите: знаковое целое температуру, точку, беззнаковое целое остаток от деления температуры на 1.
Это заклинание такое? :))

Re: DS18B20 глючит, или руки кривые

Добавлено: Сб янв 07, 2012 15:37:32
Payalnick
Так, значит тупо надо на экранчик вывести отрицательное число без подключения датчика, ща проверим)

Да я еще не очень разобрал с функцией sprintf, вот и приходится такие заклинания писать)

Re: DS18B20 глючит, или руки кривые

Добавлено: Сб янв 07, 2012 15:38:54
md5sum
Payalnick писал(а):я еще не очень разобрал с функцией sprintf, вот и приходится такие заклинания писать)
http://www.opennet.ru/man.shtml?topic=p ... &russian=0

Re: DS18B20 глючит, или руки кривые

Добавлено: Сб янв 07, 2012 15:40:30
Payalnick
md5sum писал(а):
Payalnick писал(а):я еще не очень разобрал с функцией sprintf, вот и приходится такие заклинания писать)
http://www.opennet.ru/man.shtml?topic=p ... &russian=0
Благодарю, почитаем)

Re: DS18B20 глючит, или руки кривые

Добавлено: Сб янв 07, 2012 15:56:03
Payalnick
Ну вывел -25 на экран, все нормально.

Re: DS18B20 глючит, или руки кривые

Добавлено: Сб янв 07, 2012 15:57:33
md5sum
Payalnick писал(а):Ну вывел -25 на экран, все нормально.
Тогда покажи этот файлик
#include <ds18b20.h>

Re: DS18B20 глючит, или руки кривые

Добавлено: Сб янв 07, 2012 15:59:18
Payalnick
md5sum писал(а):
Payalnick писал(а):Ну вывел -25 на экран, все нормально.
Тогда покажи этот файлик
#include <ds18b20.h>
То есть покажи? Скинуть код библиотеки?

Re: DS18B20 глючит, или руки кривые

Добавлено: Сб янв 07, 2012 16:10:22
md5sum
Payalnick писал(а):
md5sum писал(а): Тогда покажи этот файлик
#include <ds18b20.h>
То есть покажи? Скинуть код библиотеки?
Ну во первых это только заголовочный файл.
Код библиотеки мне неинтересен...
Скорее всего вся проблема в неявном приведении типов.

Библиотека страшнозасекреченная/коммерческая? :)) Тогда переходите на opensource.
Можете из моей поделки примеров набрать - не жалко http://radiokot.ru/forum/viewtopic.php?f=25&t=55505

Re: DS18B20 глючит, или руки кривые

Добавлено: Сб янв 07, 2012 16:19:11
Payalnick
Библиотека как библиотека, не засекреченная, стандартная CVAVRовская.

Посмотрю, покачаю.

А чего вы там про типы говорили? Как понять "неявное"?

Re: DS18B20 глючит, или руки кривые

Добавлено: Сб янв 07, 2012 16:24:42
md5sum
Payalnick писал(а):Библиотека как библиотека, не засекреченная, стандартная CVAVRовская.

Посмотрю, покачаю.

А чего вы там про типы говорили? Как понять "неявное"?
temp=ds18b20_temperature(0);
temp - знаковое целое.
ds18b20_temperature(0) возвращает или float или double.
Как компилятор выполнит присвоение - только ему известно, т.к. явно не указано, то можно и тупым копированием области памяти (сколько влезет).

можно сделать так: temp=(int)ds18b20_temperature(0);
тогда Вы явно укажете, что перед присвоением значения результат функции привести к знаковому целому (отбросить дробную часть и выровнить до 16 бит).

Re: DS18B20 глючит, или руки кривые

Добавлено: Сб янв 07, 2012 16:26:31
Payalnick
md5sum писал(а):
Payalnick писал(а):Библиотека как библиотека, не засекреченная, стандартная CVAVRовская.

Посмотрю, покачаю.

А чего вы там про типы говорили? Как понять "неявное"?
temp=ds18b20_temperature(0);
temp - знаковое целое.
ds18b20_temperature(0) возвращает или float или double.
Как компилятор выполнит присвоение - только ему известно, т.к. явно не указано, то можно и тупым копированием области памяти (сколько влезет).

можно сделать так: temp=(int)ds18b20_temperature(0);
тогда Вы явно укажете, что перед присвоением значения результат функции привести к знаковому целому (отбросить дробную часть и выровнить до 16 бит).
А если создать переменную типа double или float, в нее записать значение температуры и вывести? Будут ли выводиться десятые?

Re: DS18B20 глючит, или руки кривые

Добавлено: Сб янв 07, 2012 16:30:13
md5sum
Payalnick писал(а):А если создать переменную типа double или float, в нее записать значение температуры и вывести? Будут ли выводиться десятые?
Должны...
sprintf(t,"t=%.1f\xdfC",temp);

Re: DS18B20 глючит, или руки кривые

Добавлено: Сб янв 07, 2012 16:32:52
Payalnick
Я нашел вроде проблемку. Щас прошил пустой МК старой прошивкой, на экран вывело сразу -9999. Может когда датчик набирает отрицательную температуру, он отключается?