Frage

Ich brauche deine qualifizierte Hilfe! Ich programmiere in C ++, verwende ein PIC 18F87J50 und versuche, DS18B20 an meinem H0 -Port zu verbinden!

Ich denke, meine zugrunde liegende Programmierung ist korrekt. Das Problem, das ich habe (denke ich habe ich habe), ist, dass ich bei der Ausführung eines ROM-Befehls nach dem 64-Bit-ROM-Code suche.

Das erste Byte sollte mir sagen, zu welcher Familie die Komponente (28h) gehört. Die nächsten 48 Bit sollten mir eine Uniq -Serie für genau diese Komponente geben. Der letzte wird für eine CRC verwendet.

Denke ich richtig, wenn ich das mache:

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);
}

Wenn ich nach dem Code in Rom_Code [1-6] frage, sollte ich die UNIQ-Nummer erhalten? sollte ich nicht ??

Mit freundlichen Grüße!

War es hilfreich?

Lösung

Der beste Weg, um auf die Seriennummer zuzugreifen 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];

...

Das &ROM_CODE[1] Gibt es, um die Adresse des 2. Elements in abzurufen? ROM_CODE. ROM_CODE+1 Kann auch funktionieren, aber mein C ist ein Touch Rusty.

Der Null (' 0') wird am Ende hinzugefügt, wenn C verwendet Null-terminierte Saiten. Dadurch wird sichergestellt, dass es mit C -Bibliotheksroutinen und häufig verwendeten C -Idiomen kompatibel ist.

Sie können auch direkt über das Array darauf zugreifen. Aber das wird schwerer zu arbeiten und es ist unwahrscheinlich, dass es sich lohnt, es sei denn, Sie Ja wirklich brauche diese 6 Bytes Speicher.

Je nachdem, wie hoch Ihre App ist, möchten Sie dies möglicherweise in einer Klasse einwickeln. Übergeben Sie den 8 -Zeichenpuffer an den Konstruktor und verwenden Sie dann Methoden wie z. B. getFamily() / getSerial() Um die gewünschten Informationen abzurufen.

Für eine sehr einfache App ist dies eine Menge zusätzlicher Code, um etwas zu vereinfachen, das bereits sehr überschaubar ist.

Andere Tipps

Hier ist ein Code, mit dem Sie die Geräte -ID lesen können. Ich denke, Ihr Code wurde zu schnell ausgeführt. Hier ist ein Code, den ich mit dem DS18B20 mitgeteilt habe.

/****************************************************************************
* 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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top