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 support@ccsinfo.com

DS18S20 Parasite mode

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



Joined: 30 Jan 2007
Posts: 56
Location: Viana do Castelo - Portugal

View user's profile Send private message

DS18S20 Parasite mode
PostPosted: Fri Mar 30, 2007 9:58 am     Reply with quote

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

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

PostPosted: Fri Mar 30, 2007 3:26 pm     Reply with quote

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

View user's profile Send private message

PostPosted: Sat Mar 31, 2007 11:14 am     Reply with quote

The problem is i cant stop the program because the forced pull-up.
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