Frage

Ich habe diese Funktionen weiter unten definiert, und wenn ich Device_ID Funktion zum Beispiel bitten die Familie Code, erhalte ich nur FF (sollte 28 sein), ich sowohl die Familie bekommen acctually Code, 48-Bit-Serien und das crc 8-Bit alle „Einsen“ zu sein. Es scheint, wie die Slave-Gerät Funktion arbeitet erfassen, wie es sollte .... Wenn ich den Slave anschließen er sagen, dass ich hier bin, und wenn ich nehme es weg ... kein Gerät vorhanden ist. Ich habe auch ein 5kohm Pull-up am 1wire.

Und ich nicht einen Anhaltspunkt, warum meine Device_ID arbeitet nicht, so meine Frage ist, warum tut es funktioniert !? u kann in diesem Code sieht etwas falsch (Im ein PIC 18F87J50 und ein DS18B20 mit):

Meine Aussage in Main:

     OSCTUNEbits.PLLEN = 1;

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

 Detect_Slave_Device();
 Device_ID( 0x33 );

Gebrauchte Funktionen:

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

Und nun einige OFTHE wichtig 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;}
War es hilfreich?

Lösung 2

Der Fehler war nicht der Code es sich von selbst, versuchte ich es auf einen digitalen Anschluss mit einem RC-Filter zu verbinden, eine kleine Leiter von 10 nF und einem Widerstand von 1k Ohm.

Ich wusste das nicht erst später. Vielen Dank für die Antwort, es war hilfreich.

Andere Tipps

Hier ist ein Code, dass ich für ein PIC18 schrieb einen DS18B20 zu lesen.

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