문제

나는 당신의 자격을 갖춘 도움이 필요합니다! PIC 18F87J50을 사용하여 C ++로 프로그래밍하고 H0 포트에서 DS18B20을 연결하려고합니다!

나는 나의 기본 프로그래밍이 정확하다고 생각합니다 .... 내가 가진 문제 (내가 가지고 있다고 생각)는 ROM 명령을 수행 할 때 64 비트 ROM 코드를 찾고 있습니다.

첫 번째 바이트는 구성 요소가 (28h)에 속하는 패밀리를 알려야합니다. 다음 48 비트는 해당 구성 요소에 대한 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 작동 할 수도 있지만 내 C는 터치가 녹슬 었습니다.

C가 사용하면 NULL ( ' 0')이 끝에 추가됩니다. 널리 터진 줄. 이를 통해 C 라이브러리 루틴과 일반적으로 사용되는 C 관용구와 호환됩니다.

배열에서 직접 액세스 할 수도 있습니다. 그러나 그것은 당신과 함께 일하기가 더 어려울 것이고 당신이 할 가치가 없을 것입니다. 진짜 6 바이트의 메모리가 필요합니다.

앱이 얼마나 정교한 지에 따라 클래스에서 랩핑 할 수 있습니다. 8 문자 버퍼를 생성자로 전달한 다음 방법을 사용합니다. getFamily() / getSerial() 원하는 정보를 검색합니다.

그러나 매우 간단한 앱의 경우, 이미 매우 관리 할 수있는 것을 단순화하기위한 많은 추가 코드입니다.

다른 팁

다음은 장치 ID를 읽을 수있는 몇 가지 코드입니다. 귀하의 코드는 여기에서 Fast로 실행되고 있다고 생각합니다. 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