Negative werte vom ds1820 erhalten??

Gast #783547
Lesenswert?

Hier der Code habe ich hier aus dem Forum übernommen funktioniert alles 
über 0 grad aber unter null fehlt mir das - zeichen.

Wie bekomme ich das vorzeichen`???

void read_meas( void )
{
  uchar id[8], diff;
  uchar s[30];
  uchar i;
 uint temp;

  for( diff = SEARCH_FIRST; diff != LAST_DEVICE; ){
    diff = w1_rom_search( diff, id );

    if( diff == PRESENCE_ERR ){
      send_UART( "No Sensor found" );
      break;
    }
    if( diff == DATA_ERR ){
      send_UART( "Bus Error" );
      break;
    }
    if( id[0] == 0x28 || id[0] == 0x10 ){  // temperature sensor
      send_UART( "ID: " );
      for( i = 0; i < 8; i++ ){
  sprintf( s, "%02X ", id[i] );
      send_UART( &s[0] );
      }
      w1_byte_wr( READ );      // read command
      temp = w1_byte_rd();      // low byte
      temp |= (uint)w1_byte_rd() << 8;    // high byte
      if( id[0] == 0x10 )      // 9 -> 12 bit
        temp <<= 3;
      sprintf( s, "  T: %04X = ", temp );  // hex value
      send_UART( &s[0] );
      sprintf( s, "%4d.%01d Grad Celsius\r\n", temp >> 4, (temp << 12) / 
6553 ); // 0.1øC
      send_UART( &s[0] );
    }
  }
  send_UART( "" );
}

danke
#783561
Lesenswert?

Für negative Werte ist ein "unsigned int" nicht wirklich geeignet. Aus
1
uint temp;
2
temp |= (uint)w1_byte_rd() << 8;    // high byte
mach
1
int temp;
2
temp |= (int16_t)(w1_byte_rd() << 8);    // high byte
Über die Nachkommastelle musst du dann aber noch ein bischen nachdenken.
Gast #783771
Lesenswert?

Da klar steht das im Datenblatt, Messbereich (ab -55°, genau ab -10°, 
dazu Umrechnungsformel Messdaten -> Temperaturwert). Muss halt nur deine 
Software richtig schreiben. Oh, die hast du in irgendeiner Tonne 
gefunden? Tja, vielleicht mal selber mache, statt irgendwas blind 
kopieren.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren