DS18s20 Temperratur Berechnung

Gast #4437087
Lesenswert?

Ich versuche meine Temperratur vom ds18s20 zu berechnen ich bekomme 
immer nur 127 angezeigt .

Die ident vom Sensor kann ich auslesen ohne fehler
Sensor ID: 16.173.84.123.1.8
Könnte mir jemand weiterhelfen.
danke

1
//----------------------------------------
2
// Reset DS18S20
3
//----------------------------------------
4
uint8_t ds1820_reset(uint8_t used_pin)
5
{
6
  uint8_t err=100;
7
  DS1820_DDR |= 1<<used_pin;            // define as ouput
8
  DS1820_PORT &= ~(1<<used_pin);          //Pull low
9
  _delay_us(480);        ;          // 480 us
10
  DS1820_DDR &= ~(1<<used_pin);            // define as input
11
  DS1820_PORT |= 1<<used_pin;            //Pullup on
12
  _delay_us(66);                    // 66 us
13
  err = (DS1820_PIN & (1<<used_pin)) >> used_pin;  // no presence detect --> err=1 otherwise err=0
14
  _delay_us(240);                  // 240 us
15
  if( (DS1820_PIN & (1<<used_pin)) == 0 ){      // short circuit --> err=2
16
    err = 2;
17
  }
18
  return err;
19
}
20
//-----------------------------------------
21
// Write one bit to DS18S20
22
//-----------------------------------------
23
void ds1820_wr_bit(uint8_t wrbit,uint8_t used_pin)
24
{
25
  if (wrbit ==0)  {
26
    DS1820_DDR |= 1<<used_pin;          // define as ouput
27
      DS1820_PORT &= ~(1<<used_pin);        //Pull low
28
    _delay_us(60);
29
    DS1820_DDR &= ~(1<<used_pin);        // define as input
30
      DS1820_PORT |= 1<<used_pin;          //Pullup on
31
    _delay_us(4);
32
  }
33
  if (wrbit ==1)  {
34
    DS1820_DDR |= 1<<used_pin;          // define as ouput
35
      DS1820_PORT &= ~(1<<used_pin);        //Pull low
36
    _delay_us(10);
37
    DS1820_DDR &= ~(1<<used_pin);        // define as input
38
      DS1820_PORT |= 1<<used_pin;          //Pullup on
39
    _delay_us(54);
40
  }
41
}
42
//-----------------------------------------
43
// Read one bit from DS18S20
44
//-----------------------------------------
45
uint8_t ds1820_re_bit(uint8_t used_pin)
46
{
47
  uint8_t rebit;
48
  DS1820_DDR |= 1<<used_pin;              // define as ouput
49
    DS1820_PORT &= ~(1<<used_pin);            //Pull low
50
  _delay_us(1);
51
  DS1820_DDR &= ~(1<<used_pin);            // define as input
52
  DS1820_PORT |= 1<<used_pin;              //Pullup on
53
  _delay_us(10);
54
  rebit = (DS1820_PIN & (1<<used_pin)) >> used_pin;   //Read bit
55
  _delay_us(50);
56
  return rebit;                
57
}
58
//-----------------------------------------
59
// Read 1 byte from DS18S20
60
//-----------------------------------------
61
uint8_t ds1820_re_byte(uint8_t used_pin)
62
{
63
  uint8_t rebyte =0x00;
64
  uint8_t rebit;
65
  uint8_t i;
66

67
  for (i=0;i<8;i++)
68
  {
69
    rebit=ds1820_re_bit(used_pin);
70
    //delay_us(2);                  //be on the save side
71
    if (rebit==1){
72
      rebyte|=(1<<i);
73
    }
74
  }
75
  return(rebyte);
76
}
77
//-----------------------------------------
78
// Write 1 byte to DS18S20
79
//-----------------------------------------
80
void ds1820_wr_byte(uint8_t wrbyte,uint8_t used_pin)
81
{
82
  uint8_t i;
83
  for (i=0; i<8; i++) // writes byte, one bit at a time
84
  {      
85
    ds1820_wr_bit((wrbyte & 0b00000001),used_pin);
86
    wrbyte = wrbyte >> 1;
87
  }
88
  _delay_us(5);
89
}
90

91

92
void convert(uint8_t used_pin)
93
{
94

95
uint8_t i = 0;
96
uint8_t ow_buffer[10];
97
int16_t Vorkommastelle;
98

99
  
100
  cli();
101
  
102
    ds1820_reset(used_pin);                  //1. Reset
103
    ds1820_wr_byte(0xCC,used_pin);                //2. skip ROM
104
    ds1820_wr_byte(0x44,used_pin);                //3. ask for temperature conversion
105
                 
106
     _delay_ms(1000);
107

108
      ds1820_reset(used_pin);                //5. Reset
109
    ds1820_wr_byte(0xCC,used_pin);                //6. skip ROM
110
    ds1820_wr_byte(0xBE,used_pin);                //7. Read entire scratchpad 9 bytes
111
    
112
    for (i=0; i<9; i++)                       //8. Get scratchpad byte by byte
113
     {
114
        ow_buffer[i]=ds1820_re_byte(used_pin);         //9. read one DS18S20 byte
115
    }
116
  
117

118
   sei();
119

120

121
Vorkommastelle = (int16_t)( ( ow_buffer[1] << 8 ) | ow_buffer[0] ); 
122
sprintf( txbuf, "%+03d.%1d", Vorkommastelle/2, ( Vorkommastelle%2) * 5 ); 
123

124
rf12_txdata_TEST(txbuf,22);
125
}
#4437095
Lesenswert?

lucas (Gast)

>Ich versuche meine Temperratur vom ds18s20 zu berechnen ich bekomme
>immer nur 127 angezeigt .

Schon wieder oder immer noch? Das hatten wir doch schon mehrmals in den 
letzten Tagen.

Beitrag "Delay mit Timer"

Beitrag "DS18s20 Temperatur über 20Grad"

Beitrag "Mal wieder DS18S20"

>Die ident vom Sensor kann ich auslesen ohne fehler
>Sensor ID: 16.173.84.123.1.8

Das ist keine IP-Adresse sondern einfach 7 Bytes + CRC.

Beitrag "Re: Delay mit Timer"
Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.