Pregunta

Necesito su ayuda calificada! Estoy de programación en C ++, usando un PIC 18F87J50 y tratando de conectar DS18B20 en mi puerto H0!

Creo que mi programación subyacente es correcta por lo que .... el problema que tengo (que tengo), es cuando la realización de un comando ROM, estoy buscando la ROM de código de 64 bits.

El primer byte me diga qué familia pertenece el componente a (28h). Los siguientes 48 bits me deben dar una serie uniq sólo para ese componente. El último de ellos se utiliza para un CRC.

estoy pensando derecho cuando se hace de esta manera:

void Device_ID( uint8_t command ){
    uint8_t ROM_CODE[8]; // 1 byte CRC, 6 bytes SERIAL, 1 byte Family code
    uint8_t loop;
    static char container[8];

    OW_reset_pulse();
    OW_write_byte( command );

    for(loop = 0; loop < 8; loop++)     // 1 byte in per time = 64-bits
    {
        ROM_CODE[loop] = OW_read_byte(); 
    }

    HexToStrWithZeros(ROM_CODE[0], container);
    Display_Cls();
    Display_StringAt ("Family Code: ",5,6);
    Display_Buffer (container);
}

Si pido el código en ROM_CODE [1-6] que debería obtener el número uniq ?? should'nt I ??

Saludos cordiales!

¿Fue útil?

Solución

Bueno, la mejor manera de acceder al número de serie es probablemente copiarlo en una búfer separado utilizando strncpy .

#include <string.h>

...

char family;
char serial[7]; // Extra byte for null terminator
char checksum;

...

family = ROM_CODE[0];

strncpy(serial, &ROM_CODE[1], 6);
serial[6] = '\0';

checksum = ROM_CODE[7];

...

El &ROM_CODE[1] está allí para buscar a la dirección del segundo elemento de ROM_CODE. ROM_CODE+1 también puede trabajar, pero mi C es un toque oxidado.

El nulo ( '\ 0') se añade al final como C utiliza cadenas terminadas en cero . Esto se asegurará de que es compatible con las rutinas de biblioteca C y de uso general C modismos.

Usted también puede acceder a ella directamente desde la matriz. Pero eso será más difícil trabajar con y es poco probable que vale la pena a menos que realmente necesita que 6 bytes de memoria.

En función de lo sofisticado que su aplicación es, es posible que desee terminar con esto en una clase. Pasar el buffer de 8 caracteres para el constructor y luego utilizar métodos como getFamily() / getSerial() para recuperar la información que desea.

Para una aplicación muy simple, sin embargo, eso es una gran cantidad de código extra para simplificar algo que ya es muy manejable.

Otros consejos

Aquí hay un código que debe permitir a leer la ID de dispositivo. Creo que el código se ejecuta a ayunar Aquí hay un código que he usado para interactuar con el DS18B20.

/****************************************************************************
* temperature.h
****************************************************************************/

#ifndef TEMP_H
#define TEMP_H

extern double read_temp ( void );
extern   void start_temp( void );
extern   void Device_ID ( void );

#endif

/****************************************************************************
* temperature.c
****************************************************************************/

void     reset_ow(void);
void     write_ow(uint8_t  b);
uint8_t  read_ow (void);

#define OW_TEMP_SIG LATHbits.LATH0
#define OW_TEMP_TRIS TRISHbits.TRISH0
#define OW_TEMP_SIG_IN PORTHbits.RH0
#define DIR_OUT 0
#define DIR_IN 1


void Device_ID( void )
{
    uint8_t loop; 
   uint8_t family; 
   uint8_t checksum; 
   uint8_t ROM_CODE[8];         // 1 byte CRC, 6 bytes SERIAL, 1 byte Family code

   reset_ow();
   write_ow(0x33); // READ ROM COMMAND DS18B20

    for(loop = 0; loop < 8; loop++) // 1 byte in per time = 64-bits
    {
        ROM_CODE[loop] = read_ow();
    }

    family = ROM_CODE[0];
    checksum = ROM_CODE[7];

  // add extra code to handle code
}

void start_temp(void) 
{
   uint8_t i;

   OW_TEMP_SIG=1;
   OW_TEMP_TRIS=DIR_OUT;
   for ( i=0;i<100;i++)
   {
       Delay_us(100);
   }
   reset_ow();
   write_ow(0xcc); // skip rom
   write_ow(0x44); // start t conv
}

double read_temp(void) 
{
   double temp=0;
   S16 itemp;

   reset_ow();
   write_ow(0xcc); // skip rom
   write_ow(0xbe); // read scratch pad
   itemp=read_ow();
   itemp|=(S16)read_ow()<<8;

   temp = itemp*(0.0625);
   OW_TEMP_TRIS=DIR_IN;
   OW_TEMP_SIG=1;
   return temp; 
}


void reset_ow(void)
{
   OW_TEMP_TRIS=DIR_OUT;
   OW_TEMP_SIG=0;
   Delay_us(250);
   Delay_us(250);
   OW_TEMP_TRIS=DIR_IN;
   OW_TEMP_SIG=1;
   Delay_us(250);
   Delay_us(250);
}

void write_ow(uint8_t b)
{
   uint8_t i;

   OW_TEMP_SIG=1;
   OW_TEMP_TRIS=DIR_OUT;
   for ( i=0;i<8;i++)
   {
      OW_TEMP_SIG=0;
      if ( b & 0x01 )
      {
         Delay_us(10);
         OW_TEMP_SIG=1;
      }
      Delay_us(70);
      OW_TEMP_SIG=1;
      Delay_us(10);
      b >>= 1;
   }
   OW_TEMP_TRIS=DIR_IN;
   OW_TEMP_SIG=1;
}

uint8_t read_ow(void)
{
   uint8_t b=0;
   uint8_t m;
   uint8_t i;

   m=1;
   for ( i=0;i<8;i++)
   {
      OW_TEMP_SIG=1;
      OW_TEMP_TRIS=DIR_OUT;
      OW_TEMP_SIG=0;        
      Delay_us(8);
      OW_TEMP_TRIS=DIR_IN;
      OW_TEMP_SIG=1;
      Delay_us(15);

      if ( 1 == OW_TEMP_SIG_IN )
      {
         b |= m;
      }
      m <<=1;
      Delay_us(60);
   }
   OW_TEMP_TRIS=DIR_IN;
   OW_TEMP_SIG=1;
   return b;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top