سؤال

أحتاج إلى مساعدة مؤهلة! أنا برمجة في C ++، باستخدام الموافقة المسبقة عن علم 18F87J50 ومحاولة توصيل DS18B20 في ميناء H0 الخاص بي!

أعتقد أن برنامجي الأساسي هو الصحيح .... المشكلة التي لدي بها (أعتقد أنني لدي)، هي عند تنفيذ أمر ROM، أنا أبحث عن رمز ROM 64 بت.

يجب أن تخبرني البايت الأول عن الأسرة التي ينتمي إليها المكون (28 ساعة). يجب أن تعطيني 88 بت القادم تسلسلي UNIQ لهذا المكون فقط. يتم استخدام آخر واحد ل CRC.

هل أفكر في الوقت المناسب عند القيام بذلك:

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

إذا طلبت رمز في ROM_CODE [1-6] يجب أن أحصل على رقم UNIQ؟ لا ينبغي أن أكون؟

أطيب التحيات!

هل كانت مفيدة؟

المحلول

حسنا، ربما تكون أفضل طريقة للوصول إلى الرقم التسلسلي لنسخها إلى مخزن مؤقت منفصل باستخدام 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];

...

ال &ROM_CODE[1] هل هناك لجلب عنوان العنصر الثاني في ROM_CODE. ROM_CODE+1 قد تعمل أيضا، لكني ج هي لمسة صدئة.

تتم إضافة NULL (' 0') في النهاية كما يستخدم C سلاسل غير ذات النهاية. وبعد سيؤدي ذلك إلى التأكد من أنه متوافق مع إجراءات C-Library C والتعابير C المستخدمة بشكل شائع.

يمكنك أيضا الوصول إليها مباشرة من الصفيف. ولكن هذا سيكون من الصعب العمل مع ومن غير المرجح أن تكون يستحق كل هذا العناء ما لم تكن حقا بحاجة إلى أن 6 بايت من الذاكرة.

اعتمادا على مدى تطور تطبيقك، قد ترغب في التفاف هذا في فئة. اجتياز المخزن المؤقت للطابع 8 إلى المنشئ ثم استخدم طرق مثل getFamily() / getSerial() لاسترداد المعلومات التي تريدها.

للحصول على تطبيق بسيط للغاية، هذا الكثير من التعليمات البرمجية الإضافية لتبسيط شيء ما بالفعل قابل للإدارة للغاية.

نصائح أخرى

فيما يلي بعض الكود الذي يجب أن يسمح لك بقراءة معرف الجهاز. أعتقد أن رمزك يعمل بسرعة هنا هو بعض الكود الذي اعتدت على واجهة مع 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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top