Question

J'ai besoin de votre aide qualifié! Je suis en C ++ programmation, en utilisant un PIC 18F87J50 et d'essayer de se connecter à mon DS18B20 H0 Port!

Je pense que ma programmation sous-jacente est correcte si le problème .... je (crois que je l'ai), est lors de l'exécution d'une commande de ROM, je recherche du code ROM 64 bits.

Le premier octet doit me dire quelle famille appartient à la composante (28h). Les 48 bits suivants devraient me donner une série uniq pour tout ce composant. Le dernier est utilisé pour un CRC.

Suis-je penser à droite quand faire comme ceci:

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 je demande le code ROM_CODE [1-6] Je devrais obtenir le numéro de uniq ?? should'nt I ??

Cordialement!

Était-ce utile?

La solution

Eh bien, la meilleure façon d'accéder au numéro de série est probablement de le copier dans un tampon séparé en utilisant 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];

...

Le &ROM_CODE[1] est là pour chercher l'adresse du 2ème élément ROM_CODE. ROM_CODE+1 peut également fonctionner, mais mon C est une touche rouillée.

Le nul ( '\ 0') est ajoutée à la fin comme utilise C chaînes à zéro terminal . Cela fera en sorte qu'il est compatible avec les routines de la bibliothèque C et couramment utilisés idiomes C.

Vous pouvez également y accéder directement à partir du tableau. Mais ce sera plus difficile de travailler avec et peu susceptibles d'être la peine à moins que vous vraiment ont besoin que 6 octets de mémoire.

Selon le degré de sophistication de votre application est, vous pouvez envelopper cela dans une classe. Passez le tampon de 8 caractères au constructeur et ensuite utiliser des méthodes telles que getFamily() / getSerial() pour récupérer les informations que vous souhaitez.

Pour une application très simple si, c'est beaucoup de code supplémentaire pour simplifier quelque chose qui est déjà très facile à gérer.

Autres conseils

Voici le code qui devrait vous permettre de lire l'ID du périphérique. Je pense que votre code est en cours d'exécution à jeûner est un code ici que je l'habitude d'interface avec le 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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top