Страница 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 писал(а):Вот собстна код:
Это зачем?
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 писал(а):Вот собстна код:
Это зачем?
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
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. Может когда датчик набирает отрицательную температуру, он отключается?