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

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Payalnick
Открыл глаза
Сообщения: 58
Зарегистрирован: Сб янв 07, 2012 11:41:25

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

Сообщение 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);}
  }
 
Помогите нупу в написании программ)
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

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

Сообщение md5sum »

Payalnick писал(а):Вот собстна код:

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

 if (temp>65480) {temp=(65535-temp)+1;}
 

Это зачем?
int temp не принимает значения больше 32767 :) Если только специально не привести тип к unsigned.
Дальше используется sprintf, который сам отрицательные значения понимает...
Если уж хочется преобразовать, то if (temp<0) temp=-temp;
— Не говорите мне что делать и я не скажу куда Вам идти...
zlogic
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Сб дек 17, 2011 07:54:04

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

Сообщение 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); // Это моя оригинальная функция форматного вывода...
Payalnick
Открыл глаза
Сообщения: 58
Зарегистрирован: Сб янв 07, 2012 11:41:25

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

Сообщение Payalnick »

md5sum писал(а):
Payalnick писал(а):Вот собстна код:

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

 if (temp>65480) {temp=(65535-temp)+1;}
 

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


У моего знакомого так было написано и все работало. Может паленый датчик? Схожу новый куплю и проверю.
Помогите нупу в написании программ)
Payalnick
Открыл глаза
Сообщения: 58
Зарегистрирован: Сб янв 07, 2012 11:41:25

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

Сообщение 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. Вот почему так? Магазин продал мне паленый датчик? Или его лучше не паять а вставлять в панельку какую-нить?
Помогите нупу в написании программ)
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

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

Сообщение md5sum »

Ну... можно купить третий датчик, вставить в панельку, получить тот-же результат...
И только тогда начать подозревать, что что-то в программе исправить надо :))
— Не говорите мне что делать и я не скажу куда Вам идти...
Payalnick
Открыл глаза
Сообщения: 58
Зарегистрирован: Сб янв 07, 2012 11:41:25

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

Сообщение Payalnick »

Ок, буду искать косяки. Спасибо
Помогите нупу в написании программ)
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

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

Сообщение 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.
Это заклинание такое? :))
— Не говорите мне что делать и я не скажу куда Вам идти...
Payalnick
Открыл глаза
Сообщения: 58
Зарегистрирован: Сб янв 07, 2012 11:41:25

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

Сообщение Payalnick »

Так, значит тупо надо на экранчик вывести отрицательное число без подключения датчика, ща проверим)

Да я еще не очень разобрал с функцией sprintf, вот и приходится такие заклинания писать)
Помогите нупу в написании программ)
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

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

Сообщение md5sum »

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

http://www.opennet.ru/man.shtml?topic=printf&category=3&russian=0
— Не говорите мне что делать и я не скажу куда Вам идти...
Payalnick
Открыл глаза
Сообщения: 58
Зарегистрирован: Сб янв 07, 2012 11:41:25

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

Сообщение Payalnick »

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

http://www.opennet.ru/man.shtml?topic=printf&category=3&russian=0

Благодарю, почитаем)
Помогите нупу в написании программ)
Payalnick
Открыл глаза
Сообщения: 58
Зарегистрирован: Сб янв 07, 2012 11:41:25

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

Сообщение Payalnick »

Ну вывел -25 на экран, все нормально.
Помогите нупу в написании программ)
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

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

Сообщение md5sum »

Payalnick писал(а):Ну вывел -25 на экран, все нормально.

Тогда покажи этот файлик
#include <ds18b20.h>
— Не говорите мне что делать и я не скажу куда Вам идти...
Payalnick
Открыл глаза
Сообщения: 58
Зарегистрирован: Сб янв 07, 2012 11:41:25

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

Сообщение Payalnick »

md5sum писал(а):
Payalnick писал(а):Ну вывел -25 на экран, все нормально.

Тогда покажи этот файлик
#include <ds18b20.h>

То есть покажи? Скинуть код библиотеки?
Помогите нупу в написании программ)
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

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

Сообщение md5sum »

Payalnick писал(а):
md5sum писал(а):
Payalnick писал(а):Ну вывел -25 на экран, все нормально.

Тогда покажи этот файлик
#include <ds18b20.h>

То есть покажи? Скинуть код библиотеки?

Ну во первых это только заголовочный файл.
Код библиотеки мне неинтересен...
Скорее всего вся проблема в неявном приведении типов.

Библиотека страшнозасекреченная/коммерческая? :)) Тогда переходите на opensource.
Можете из моей поделки примеров набрать - не жалко http://radiokot.ru/forum/viewtopic.php?f=25&t=55505
— Не говорите мне что делать и я не скажу куда Вам идти...
Payalnick
Открыл глаза
Сообщения: 58
Зарегистрирован: Сб янв 07, 2012 11:41:25

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

Сообщение Payalnick »

Библиотека как библиотека, не засекреченная, стандартная CVAVRовская.

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

А чего вы там про типы говорили? Как понять "неявное"?
Помогите нупу в написании программ)
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

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

Сообщение md5sum »

Payalnick писал(а):Библиотека как библиотека, не засекреченная, стандартная CVAVRовская.

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

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

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

можно сделать так: temp=(int)ds18b20_temperature(0);
тогда Вы явно укажете, что перед присвоением значения результат функции привести к знаковому целому (отбросить дробную часть и выровнить до 16 бит).
— Не говорите мне что делать и я не скажу куда Вам идти...
Payalnick
Открыл глаза
Сообщения: 58
Зарегистрирован: Сб янв 07, 2012 11:41:25

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

Сообщение Payalnick »

md5sum писал(а):
Payalnick писал(а):Библиотека как библиотека, не засекреченная, стандартная CVAVRовская.

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

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

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

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

А если создать переменную типа double или float, в нее записать значение температуры и вывести? Будут ли выводиться десятые?
Помогите нупу в написании программ)
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

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

Сообщение md5sum »

Payalnick писал(а):А если создать переменную типа double или float, в нее записать значение температуры и вывести? Будут ли выводиться десятые?

Должны...
sprintf(t,"t=%.1f\xdfC",temp);
— Не говорите мне что делать и я не скажу куда Вам идти...
Payalnick
Открыл глаза
Сообщения: 58
Зарегистрирован: Сб янв 07, 2012 11:41:25

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

Сообщение Payalnick »

Я нашел вроде проблемку. Щас прошил пустой МК старой прошивкой, на экран вывело сразу -9999. Может когда датчик набирает отрицательную температуру, он отключается?
Помогите нупу в написании программ)
Закрыто

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