|
|
View previous topic :: View next topic |
Author |
Message |
linux123
Joined: 09 Oct 2006 Posts: 17
|
two DS18s20 (indoor and outdoor) |
Posted: Mon Oct 09, 2006 10:18 am |
|
|
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
|
|
Posted: Mon Oct 09, 2006 4:30 pm |
|
|
You will need to post some code before we can help you
Mark |
|
|
Douglas Kennedy
Joined: 07 Sep 2003 Posts: 755 Location: Florida
|
|
Posted: Mon Oct 09, 2006 6:43 pm |
|
|
wrong post |
|
|
linux123
Joined: 09 Oct 2006 Posts: 17
|
Code |
Posted: Tue Oct 10, 2006 10:08 am |
|
|
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();
}
} |
|
|
|
|
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
|