Vra

Ek het hierdie funksies hieronder omskryf, en toe ek DEVICE_ID funksie vra byvoorbeeld van die familie-kode, kry ek net VF (behoort te wees 28), acctually ek beide die familie-kode, 48-bit reeks, en die CRC 8 bit al "kinders" wees nie. Dit lyk asof die spoor slaaf toestel funksie werke wat hy moet .... As ek verbind die slaaf se ek hier sê hy, en as ek dit weg ... geen huidige toestel. Ek het ook 'n 5kohm trek-up by die 1wire.

En Ek dont 'n idee het hoekom my DEVICE_ID Moenie werk, so my vraag is hoekom nie die geval is dit werk !? kan u sien iets verkeerd binne hierdie kode (Im met behulp van 'n PIC 18F87J50 en een DS18B20):

My stelling in Main:

     OSCTUNEbits.PLLEN = 1;

 Init_Registers();
 Init_Settings();
 Init_Ports();
 Init_Glcd();

 Detect_Slave_Device();
 Device_ID( 0x33 );

Gebruik funksies:

    void Detect_Slave_Device(void){ 
 uint8_t value;
 OW_reset_pulse();
 if (OW_reset_pulse())
 {
  Display_Cls();
  Display_StringAt("No Device Present!",5,6);
  Delay_1sec();
  Delay_1sec();
 } else {
  Display_Cls();
  Display_StringAt("Device Present!",5,6);
  Delay_1sec();
  Delay_1sec(); }}

   uint8_t OW_reset_pulse(void){
 uint8_t presence_detect;

   drive_OW_low();     // Drive the bus low

  Delay_us(200);     // Delay at least 480 microsecond (us)
 Delay_us(200);
 Delay_us(85);  

  drive_OW_high ();      // Release the bus
         // Here should the client drive low
 Delay_us(50);     // Delay 50 microsecond (us)

 presence_detect = read_OW(); // Sample for presence pulse from slave

  Delay_us(200);       // Delay 435 microsecond (us)
 Delay_us(200);
 Delay_us(35);  

 drive_OW_high ();       // Release the bus

 return presence_detect;} 

    void drive_OW_low (void){
 LATHbits.LATH0 = 0;
 TRISHbits.TRISH0 = 0; }// Output

    void drive_OW_high (void){
 LATHbits.LATH0 = 0;
 TRISHbits.TRISH0 = 1;} // Input

    uint8_t read_OW (void){
 unsigned char read_data=0;

 TRISHbits.TRISH0 = 1;

  if (1 == PORTHbits.RH0)
   read_data = 1;
  else  
  read_data = 0;

 return read_data;}

En nou 'n paar VAN DIE belangrik DEVICE_ID:

    void Device_ID( uint8_t command ){
 uint8_t loop, family, checksum, ROM_CODE[8];   // 1 byte CRC, 6 bytes SERIAL, 1 byte Family code
 static char container[1];

 OW_reset_pulse();
 OW_write_byte( 0x33 );   // READ ROM COMMAND DS18B20

 for(loop = 0; loop < 9; loop++) // 1 byte in per time = 64-bits
 {
  ROM_CODE[loop] = OW_read_byte();
 }

 family = ROM_CODE[1];
 checksum = ROM_CODE[8];
 And so on = Print MY VALUES ->

   void OW_write_byte (uint8_t write_data){
 uint8_t loop;

 for (loop = 0; loop < 8; loop++)
 {
  OW_write_bit(write_data & 0x01);  //Sending LS-bit first
  write_data >>= 1;     // shift the data byte for the next bit to send
 } }

   void OW_write_bit (uint8_t write_bit){
 if (write_bit)       // Write 1 time slot
 { 
  Brakepoint();     // 1 us
  //writing a bit '1'
  drive_OW_low();     // Drive the bus low
  Delay_us(6);     // Delay 6 microsecond (us)
  drive_OW_high ();      // Release the bus
  Delay_us(64);;     // Delay 64 microsecond (us)
 }
 else        // Write 0 time slot
 {
  Brakepoint();     // 1 us
  //writing a bit '0'
  drive_OW_low();     // Drive the bus low
  Delay_us(65);     // Delay 65 microsecond (us)
  drive_OW_high ();      // Release the bus
  Delay_us(10);     // Delay 10 microsecond for recovery (us)
 }} 

   uint8_t OW_read_byte (void)
 uint8_t loop, result=0;

 for (loop = 0; loop < 8; loop++)
 {

  result >>= 1;     // shift the result to get it ready for the next bit to receive
  if (OW_read_bit())
   result |= 0x80;   // if result is one, then set MS-bit
 }
 return result;     }

   uint8_t OW_read_bit (void){
 uint8_t read_data;       // Reading a bit 
 Brakepoint();       // 1 us
 drive_OW_low();       // Drive the bus low
 Delay_us(6);       // delay 6 microsecond (us)
 drive_OW_high ();        // Release the bus
 Delay_us(9);       // delay 9 microsecond (us)

 read_data = read_OW();     //Read the status of OW_PIN

 Delay_us(55);       // delay 55 microsecond (us) 
 return read_data;}
Was dit nuttig?

Oplossing 2

Die fout was nie die kode dit self, het ek probeer om dit te koppel aan 'n digitale hawe met 'n RC filter, 'n klein dirigent van 10nf en 'n weerstand van 1k ohm.

Ek het dit nie geweet totdat later. Dankie vir die reaksie, dit was nuttig.

Ander wenke

Hier is 'n paar kode wat ek geskryf het vir 'n PIC18 'n DS18B20 lees.

/****************************************************************************
* temperature.h
****************************************************************************/

#ifndef TEMP_H
#define TEMP_H

extern double read_temp(void) ;
extern void start_temp(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 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;
}
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top