CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

two DS18s20 (indoor and outdoor)

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
linux123



Joined: 09 Oct 2006
Posts: 17

View user's profile Send private message

two DS18s20 (indoor and outdoor)
PostPosted: Mon Oct 09, 2006 10:18 am     Reply with quote

hy, i need check two temps, one indoor and other outdoor.
Thaks.
i use PIC18F454 and DS18s20, one read ok, but second read from DS18s20 print 127.5cº.
Markdem



Joined: 24 Jun 2005
Posts: 206

View user's profile Send private message Send e-mail

PostPosted: Mon Oct 09, 2006 4:30 pm     Reply with quote

You will need to post some code before we can help you

Mark
Douglas Kennedy



Joined: 07 Sep 2003
Posts: 755
Location: Florida

View user's profile Send private message AIM Address

PostPosted: Mon Oct 09, 2006 6:43 pm     Reply with quote

wrong post
linux123



Joined: 09 Oct 2006
Posts: 17

View user's profile Send private message

Code
PostPosted: Tue Oct 10, 2006 10:08 am     Reply with quote

Sorry..., this my code:
I use two pin from 18f452 to read two sensor, but, read first sensor in call, the second, return 127.5, and erro CRC.

#include <18f452.h>
#use delay(clock=4000000)
#fuses hs,nowdt,put,nobrownout,nolvp
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7,bits=8, ERRORS) //Comunicação com outra PIC
#define pino_int pin_d3 //Pino responsavel pela temperatura externa
#define pino_ext pin_c4 //Pino responsavel pela temperatura interna

struct celcius //Estrutura de variaveis para tratar informações do termometro
{
int16 interno;
int16 externo;
int conta;
int interface;
int buffer[2][9];
float temp;
} temp;



#inline //Inseri o codigo no local da chamada
void seta_saida_1w (void) //Função para receber bit na interface.
{
if(temp.interface==1)
output_float(pino_int);
else
output_float(pino_ext);
}

#inline //Inseri o codigo no local da chamada
void limpa_saida_1w (void) // coloca a saída em nível 0
{
if(temp.interface==1)
output_low(pino_int);
else
output_low(pino_ext);
}

boolean reset_1w(void) // reseta os dispositivos no barramento
{
boolean presente;
limpa_saida_1w();
delay_us(480);
seta_saida_1w();
delay_us(60);
if(temp.interface==1)
presente=input(pino_int);
else
presente=input(pino_ext);
delay_us(240);
return(presente); // 0 = dispositivo presente 1 = nenhum dispositivo detectado
}

void alimenta_barramento_1w(void)// força o barramento em nível alto utilizado com dispositivos alimentados no modo parasita
{
if(temp.interface==1)
output_high(pino_int);
else
output_high(pino_ext);
delay_ms(1000);
seta_saida_1w();
}

boolean le_bit_1w(void) // lê um bit do barramento 1-wire dá um pulso na linha, inicia quadro de leitura
{
limpa_saida_1w(); //coloca saida em zero
seta_saida_1w(); //retorna a saída a um
delay_us(15); // aguarda o dispositivo colocar o dado na saída
if(temp.interface==1)
return(input(pino_int)); // retorna o dado
else
return(input(pino_ext)); // retorna o dado
}

void escreve_bit_1w(boolean bit) // escreve um bit no barramento 1-wire
{
limpa_saida_1w();
if(bit)
seta_saida_1w(); // coloca dado 1 na saida
delay_us (120);
seta_saida_1w();
}

byte le_byte_1w (void) //lê um byte do barramento 1-wire
{
byte i, dado=0; //lê oito bits iniciando pelo bit menos significativo
for(i=0;i<8;i++)
{
if(le_bit_1w())
dado|=0x01<<i;
delay_us(90); // aguarda o fim do quadro de leitura do bit atual
}
return (dado);
}

void escreve_byte_1w(char dado) // escreve um byte no barramento 1-wire
{
byte i, temp; // envia o byte iniciando do bit menos significativo
for(i=0; i<8>>i; // desloca o dado 1 bit à direita
temp &= 0x01; // isola o bit 0 (LSB)
escreve_bit_1w(temp); // escreve o bit no barramento
}
}

int calc_crc(int *dados, int quantidade) ///Função para calcular o CRC dos dados do leitor de temperatura.
{
int shift_reg=0, data_bit, sr_lsb, fb_bit, i, j;
for(i=0; i<quantidade; i++) // loop de bytes
{
for(j=0; j<8>>j)&0x01;
sr_lsb = shift_reg & 0x01;
fb_bit = (data_bit ^ sr_lsb) & 0x01;
shift_reg = shift_reg >> 1;
if(fb_bit)
{
shift_reg = shift_reg ^ 0x8c;
}
}
}
return(shift_reg);
}

void temperatura(void) //Função para ler a temperatura.
{
reset_1w();
escreve_byte_1w(0xcc); // comando skip ROM
escreve_byte_1w(0x44); // inicia conversão da temperatura
reset_1w(); // reseta o dispositivo
escreve_byte_1w(0xf0); // comando para testa de leitura de dois sensores.
escreve_byte_1w(0xcc); // comando skip ROM
escreve_byte_1w(0xbe); // comando de leitura da memória de rascunho
for(temp.conta=0; temp.conta<9; temp.conta++) // efetua a leitura dos nove bytes da memória de rascunho
temp.buffer[temp.interface][temp.conta]=le_byte_1w();
if(temp.buffer[temp.interface][8]!=calc_crc(temp.buffer[temp.interface],8))
printf("\rTEMP ERRO CRC:%u e %u\n",temp.buffer[temp.interface][8],calc_crc(temp.buffer[temp.interface],8));
reset_1w();
escreve_byte_1w(0xcc);
temp.temp=(long) (temp.buffer[temp.interface][1]<<8>200)
temp.temp=0;
printf("\rT-IN:%3.2f\n",temp.temp);

temp.interface=1; //Chaveia o sistema para le a temperatura externa.
temperatura();
if(temp.temp>200)
temp.temp=0;
printf("\rT-OUT:%3.2f\n",temp.temp);

puts("\rPressione uma Tecla\n");
getc();
}
}
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group