View previous topic :: View next topic |
Author |
Message |
joven
Joined: 30 Jan 2007 Posts: 56 Location: Viana do Castelo - Portugal
|
DS18S20 Parasite mode |
Posted: Fri Mar 30, 2007 9:58 am |
|
|
Hi
I'm testing the DS18S20 temperature sensor.
When i connect the 3 wires (Vcc, GND and 1 wire bus with pull-up resistor) can read the temperature.
For school project i need use the DS18S20 in parasite mode.
I don't how can change the code or the circuit for parasite mode.
Driver 1 Wite
Code: |
/************************************************************************/
/* 1WIRE.C - Biblioteca de comunicação 1-wire */
/* */
/* */
/* */
/************************************************************************/
// definição do pino de comunicação
// Para utilizar outro pino, basta incluir uma nova definição antes
// de incluir este arquivo na aplicação desejada
#ifndef pino_1w
#define pino_1w pin_A2 // define o pino RD0 como comunicação 1-wire
#endif
#inline
void seta_saida_1w (void)
// coloca a saída em la impedância
{
output_float (pino_1w);
}
#inline
void limpa_saida_1w (void)
// coloca a saída em nível 0
{
output_low (pino_1w);
}
boolean reset_1w(void)
// reseta os dispositivos no barramento
{
boolean presente;
limpa_saida_1w ();
delay_us(480); //480
seta_saida_1w ();
delay_us(60);
presente = input (pino_1w);
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
{
output_high (pino_1w);
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
return (input(pino_1w)); // 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
}
}
|
DS18S20:
Code: |
float read_ds1820_temp()
{
int buffer[9], conta;
float temp;
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 (0xcc); // comando skip ROM
// comando de leitura da memória de rascunho
escreve_byte_1w (0xbe);
// efetua a leitura dos nove bytes da memória de rascunho
for (conta = 0; conta<9; conta++)
buffer[conta]=le_byte_1w ();
temp = (long) (buffer[1]<<8) + buffer[0];
temp = (temp / 2) - 0.25 + (float) ((buffer[7]-buffer[6])/buffer[7]);
return temp;
}
|
Thanks |
|
|
rwyoung
Joined: 12 Nov 2003 Posts: 563 Location: Lawrence, KS USA
|
|
Posted: Fri Mar 30, 2007 3:26 pm |
|
|
Pretty much covered in the data sheet, particularly on pages 4 & 5.
http://datasheets.maxim-ic.com/en/ds/DS18S20.pdf _________________ Rob Young
The Screw-Up Fairy may just visit you but he has crashed on my couch for the last month! |
|
|
joven
Joined: 30 Jan 2007 Posts: 56 Location: Viana do Castelo - Portugal
|
|
Posted: Sat Mar 31, 2007 11:14 am |
|
|
The problem is i cant stop the program because the forced pull-up. |
|
|
|