Embedded 单线问题

Embedded 单线问题,embedded,pic,pic18,1wire,Embedded,Pic,Pic18,1wire,我需要你合格的帮助! 我在C++编程,使用PIC18F8J50并尝试在我的H0端口连接DS18B20!p> 我认为我的基本编程是正确的,所以。。。。我(认为我有)的问题, 执行ROM命令时,我正在搜索64位ROM代码 第一个字节应该告诉我组件属于哪个族(28h)。 接下来的48位应该给我一个uniq序列,用于该组件。 最后一个用于CRC 我这样做的想法正确吗: void Device_ID( uint8_t command ){ uint8_t ROM_CODE[8]; // 1 byt

我需要你合格的帮助! 我在C++编程,使用PIC18F8J50并尝试在我的H0端口连接DS18B20!p> 我认为我的基本编程是正确的,所以。。。。我(认为我有)的问题, 执行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);
}
void设备ID(uint8\t命令){
uint8_t ROM_码[8];//1字节CRC,6字节串行,1字节系列码
uint8_t环;
静态字符容器[8];
OW_重置_脉冲();
OW_写入_字节(命令);
for(loop=0;loop<8;loop++)//每次1字节=64位
{
ROM_代码[循环]=OW_读取字节();
}
带零的HEXTOSTR(ROM_代码[0],容器);
显示_Cls();
显示字符串(“系列代码:”,5,6);
显示缓冲区(容器);
}
如果我要ROM_代码[1-6]中的代码,我应该得到uniq编号??我不应该吗


亲切的问候

那么,访问序列号的最佳方法可能是使用将其复制到单独的缓冲区中

#包括
...
查尔家族;
字符序列[7];//空终止符的额外字节
字符校验和;
...
系列=ROM_代码[0];
strncpy(串行和ROM_代码[1],6);
串行[6]='\0';
校验和=ROM_码[7];
...
&ROM\u code[1]
用于获取
ROM\u code
中第二个元素的地址
ROM_code+1
也可以工作,但我的C有点生锈了

null('\0')在C使用时添加到末尾。这将确保它与C库例程和常用的C习惯用法兼容

您还可以直接从阵列访问它。但是如果你真的不需要那6字节的内存,那么这将很难使用,也不可能值得

根据应用程序的复杂程度,您可能希望将其封装在类中。将8个字符的缓冲区传递给构造函数,然后使用
getFamily()
/
getSerial()
等方法检索所需的信息


不过,对于一个非常简单的应用程序,这需要大量额外的代码来简化一些已经非常容易管理的东西。

这里有一些代码可以让您读取设备ID。我认为您的代码运行得太快了。这里有一些我用来与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;
}
/****************************************************************************
*温度
****************************************************************************/
#ifndef温度
#定义温度
外部双读温度(无效);
外部无效开始温度(无效);
外部无效设备ID(无效);
#恩迪夫
/****************************************************************************
*温度,摄氏度
****************************************************************************/
无效重置(无效);
无效写入(uint8\t b);
uint8未读取(无效);
#定义OW_TEMP_SIG LATHbits.LATH0
#定义OW_TEMP_TRIS TRISHbits.TRISH0
#在PORTHbits.RH0中定义OW_TEMP_SIG_
#定义目录输出0
#在1中定义DIR_
无效设备ID(无效)
{
uint8_t环;
uint8_t家族;
uint8_t校验和;
uint8_t ROM_码[8];//1字节CRC,6字节串行,1字节系列码
重置_ow();
write_ow(0x33);//读取ROM命令DS18B20
for(loop=0;loop<8;loop++)//每次1字节=64位
{
ROM_代码[循环]=读取_ow();
}
系列=ROM_代码[0];
校验和=ROM_码[7];
//添加额外的代码来处理代码
}
无效开始温度(无效)
{
uint8_t i;
低温信号=1;
OW_TEMP_TRIS=直接输出;

对于(i=0;i在HexToStrWithZeros()内的是什么?Hi Sharptooth!!这是十六进制格式:void HexToStrWithZeros(uint16_t input,char*output){static const rom uint8_t digits[]=“0123456789ABCDEF”;uint8_t i=2;output+=i;*output='\0';do{*--output=digits[input&15];input>=4;}而(--i)}查看一些DS18B20代码,感谢您的回复!我的程序员记事本在执行此操作时抱怨“可疑指针转换”:strncpy(串行,&ROM_代码[1],6);这是问题吗?/ThanksOh…我刚刚尝试了您的建议,结果是相同的…这意味着我在执行此步骤之前做了一些错误的事情..:(那么学习使用GDB可能是值得的。它可以让你更仔细地观察正在发生的事情。GDB…那是什么?这里的问题是,我只会收到一个64位的数字,这是我打印到屏幕上的全部“个人”的FFFFFFFFF…等等。我的设备应该在ROM_代码中给我一个uniq号码[]这还不完全是一个sHm…我想我现在的问题或多或少在于函数之前的函数…所以这个问题得到了回答!
/****************************************************************************
* 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;
}