sensor DS1621

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

sensor DS1621

Mensagempor antonio » 06 Nov 2009 17:26

Pessoal tudo bem!

Tinha aqui na bancada um sensor de temperatura DS1621 jah a muito,agora querendo fazer alguma coisa com o bichi pesquisando por tudo lado nao achei nada de jeito para me ajudar !

Fiz o seguinte codigo ,mas não funca soh mostra no LCd o numero 235.0 e nao mexe nem que vc o coloca na geladera! qual serà o erro algem tem ideia??

Pessoal dar uma olhda neste codigo pra ver o que esta mal e se possivel correguir por favor!!

desde jah agradeço qualquer ajuda

O codigo..

#include <16f877A.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT
#include <lcd.c>
#include <DS1621.C>//biblioteca DS1621

#use standard_io (b)
//#use standard_io (a)
//#use standard_io(c)
#use standard_io(D)




void main() {
float value;

lcd_init();
delay_ms(50);

init_temp();

while(1) {
value = read_temp();
delay_ms(20);
printf(lcd_Putc,"\f%03.1f",value);
delay_ms(100);
}
}

//A biblioteca pra DS1621

///////////////////////////////////////////////////////////////////////////
//// ////
//// Library for a Dallas 1621 Temperature chip ////
//// ////
//// init_temp(); Call before the other functions are used ////
//// ////
//// d = read_temp(); Read the temerature in degrees (0-255) ////
//// ////
//// ////
//// (C) Copyright 1996,1997 Custom Computer Services ////
//// ////
///////////////////////////////////////////////////////////////////////////

#use i2c(master,sda=PIN_D0, scl=PIN_D1)


void temp_config(byte data) {

i2c_start();
i2c_write(0x90);
i2c_write(0xac);
i2c_write(data);
i2c_stop();
delay_ms(11);
}


void init_temp() {
output_high(PIN_B7);
output_high(PIN_B6);
i2c_start();
i2c_write(0x90);
i2c_write(0xee);
i2c_stop();
temp_config(8);
}


byte read_temp() { ////// Returns degrees F (0-255)
byte datah,datal;
long data;

i2c_start();
i2c_write(0x90);
i2c_write(0xaa);
i2c_start();
i2c_write(0x91);
datah=i2c_read();
datal=i2c_read(0);
i2c_stop();
data=datah;
data=data*9;
if((datal&0x80)!=0)
data=data+4;
data=(data/5)+32;
datal=data;
return(datal);
}
antonio
Byte
 
Mensagens: 209
Registrado em: 15 Out 2006 12:34

Mensagempor tcpipchip » 07 Nov 2009 08:36

Por coencidencia

É o assunto que vou falar em sala de aula semana que vem

http://www.inf.furb.br/~maw/topicos/top ... p_viii.pdf

TCPIPCHIP

PS: voce deve conhecer i2c e complemento de 2, ok ?
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor antonio » 07 Nov 2009 10:00

tcpipchip escreveu:PS: voce deve conhecer i2c e complemento de 2, ok ?


Tenho andando lendo sobre a i2c,mais confesso que não entra tam facil!

Vi o pdf e como jà tinha dado uma olhada no datasheet ficou mais claro!
Vc programa em Basic, eu estou procurando o maximo informaçao em C da CCS !

No santo google por increvel para parece não encontei nada de jeito!

Atè + ajuda
antonio
Byte
 
Mensagens: 209
Registrado em: 15 Out 2006 12:34

Mensagempor vtrx » 07 Nov 2009 10:04

Vejo muita gente tendo dificuldade neste protocolo em linguagens que não seja o ASM.
Avatar do usuário
vtrx
Dword
 
Mensagens: 2240
Registrado em: 20 Abr 2008 21:01

Mensagempor tcpipchip » 07 Nov 2009 12:35

http://www.inf.furb.br/~maw/topicos/topicos_cap_v.pdf

Tem este outro capitulo que escrevi...

TCPIPCHIP
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor antonio » 14 Nov 2009 06:07

Ola pessoal tudo bem!!
Grato pelos capitulos TCPIPCHIP
Estando meio sumido, aqui vai continuação do problema,trocando de sensor para DS1631a coisa melhorou mas teima em mostrar o numeros decimais estranhos como .....75.3,74.6 etc.
Pesquisando mais informação sobre este tema no google descobri que esse valor è em ""degrees Fahrenheit"" e que preciso passar para ""degrees Celsius.""
Agora eu não conhecimento para isso ,algem aqui pode ajudar em fazer essa conversão?? eu pensava que a biblioteca do ds1631 fazia automaticamente tal conversão!!

estou usando a seginte bibliotaca abaixo;

desde jà agradeço

//#ifndef DAL_SCL
//#if defined(__PCD__)
#define DAL_SCL PIN_D1
#define DAL_SDA PIN_D0
//#else
//#define DAL_SCL PIN_B0
//#define DAL_SDA PIN_B1
//#endif

#define read_temp read_full_temp // for backwards compatability

#use i2c(master, sda=DAL_SDA, scl=DAL_SCL)


void temp_config(BYTE data) {

i2c_start();
i2c_write(0x90);
i2c_write(0xac);
i2c_write(data);
i2c_stop();
}


void init_temp() {
output_high(DAL_SDA);
output_high(DAL_SCL);
i2c_start();
i2c_write(0x90);
i2c_write(0x51);
i2c_stop();
temp_config(0xc);
}


signed long read_full_temp() { // Returns hundreths of degrees F (-67 to 257)
long datal; //long datal;
signed long datah, data;


i2c_start();
i2c_write(0x90);
i2c_write(0xaa);
i2c_start();
i2c_write(0x91);
datah=i2c_read();
datal=i2c_read(0);
i2c_stop();

data = datah * 100;
data += (datal << 8 ) / 655;
data=data*9;
data = (data / 5) + 3200;

return(data);
}
antonio
Byte
 
Mensagens: 209
Registrado em: 15 Out 2006 12:34

Mensagempor tcpipchip » 14 Nov 2009 10:01

Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor antonio » 14 Nov 2009 10:58

brigado colega por ajudar!!

Eu fiz o codigo abaixo, dà um xarope pro minino....e dà uma olhada pra ver se vai certo!

#include <16f877A.h>
#fuses XT,NOLVP,NOWDT,PUT
#use DELAY(clock=4000000)
#include <DS1631.c>
#include <math.h>
#include <lcd.c>

void main(){
float value;

lcd_init();
delay_ms(50);

init_temp();

while(true){

value = read_full_temp();
value /= 100.0;
value=(value-32)/1.8;// aqui foi o que eu mudei
printf(lcd_putc,"\f%03.1f", value);
delay_ms(1000);

}

}
antonio
Byte
 
Mensagens: 209
Registrado em: 15 Out 2006 12:34

Mensagempor Djalma Toledo Rodrigues » 14 Nov 2009 11:56

Do Datasheet:
Código: Selecionar todos
The DS1621 measures temperature using a bandgap-based temperature sensor.
A delta-sigma analog-todigital
converter (ADC) converts the measured temperature to a digital value that is calibrated
 in °C;
 for °F applications, a lookup table or conversion routine must be used.

The temperature reading is provided in a 9-bit, two’s complement


Resumindo:
Temp em °C ---> Se quizer Farena. Converta

Saída 9 Bits em Complemento de 2

Recordando:
Complemento de 2 é: Inverte todos os bits e soma 1
.
Editado pela última vez por Djalma Toledo Rodrigues em 15 Nov 2009 10:43, em um total de 2 vezes.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor antonio » 14 Nov 2009 14:35

Ola Djalma agradeço seu comentario!

Olha soh eu realmente visitei o data sim, mas como meu ingles è meio fraco e como eu pesquisei por tudo lado e nao encontrei grande ajuda,foi a razão que me levou a eu pedir ajuda aqui!! eu soh posto aqui duvida quando jah nao tem mais por onde entender!

O colega tcpipchip deu ajuda de do wikipedia e eu lendo tudo là vi a formula e fiz o programa em C acima ,agora se està bem não tenho ninima ideia fisicamente ainda nao testei , porque como não tenho certeza do que estou fazendo, entao è melhor os proficionais aqui do forum dar uma olhada e entao seguir em frente!

Dà uma olhada aí !

Peço desculpa por minha ignorancia!e agradeço o ajuda de tudos

Um abraço
antonio
Byte
 
Mensagens: 209
Registrado em: 15 Out 2006 12:34

Mensagempor Djalma Toledo Rodrigues » 14 Nov 2009 15:14

tcpipchip escreveu:http://www.inf.furb.br/~maw/topicos/topicos_cap_v.pdf

... TCPIPCHIP

O Basic é um 'barato' simples e fácil de aprender

Lamentávelmente não há Interpretador ou Compilador que gere o Programa Objeto eficiênte.
.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor Djalma Toledo Rodrigues » 14 Nov 2009 15:32

antonio escreveu: Djalma ... eu soh posto aqui duvida quando jah nao tem mais por onde entender!

O colega tcpipchip deu ajuda de do wikipedia e eu lendo tudo là vi a formula e fiz ...

Peço desculpa por minha ignorancia!e agradeço o ajuda de tudos

Um abraço


Tudo bem Antonio é assim mesmo que se procede

Se a Saida já é em °C, apenas em Complemento para Dois, que Fórmula ?
A não ser que pretenda em Fahrenheit

Desculpe você a "minha ignorância" mas, como é antipático, e desnecessário,
ler isso. Evite

Abraço Antônio e bons °C
.
Editado pela última vez por Djalma Toledo Rodrigues em 15 Nov 2009 12:12, em um total de 1 vez.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor Andre_Cruz » 15 Nov 2009 11:23

Antonio,

Sua função "read_temp()" retorna o valor em integer de 0 a 255, e você esta trabalhando com com uma variavél do tipo float, no CCS não sei como fica a conversão de integer para float, em C ANSI você usa o modificador de tipo "(float)" e o valor sai do tipo float.

Exemplo:
Código: Selecionar todos
float temperatura ; Declaro a variavél "temperatura" do tipo float
.
.
.

temperatura = read_temp();
; Aqui você atribui o valor retornado pela função "read_temp()" que é integer  na variavél "temperatura" que é float.

Em C ANSI

temperatura = (float) read_temp();

;Converte o valor integer para float


Abraço
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor antonio » 15 Nov 2009 17:10

Hoi andre tudo bem!!não tah facil não

Vou tentar fazer alguma coisa,caso não vai posto aqui as duvidas!

Um abraço
antonio
Byte
 
Mensagens: 209
Registrado em: 15 Out 2006 12:34

Mensagempor tcpipchip » 15 Nov 2009 18:38

Nao esqueca que temperaturas negativas retornam em complemento de 2, ok ?
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Próximo

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x