Forum: Mikrocontroller und Digitale Elektronik DS18s20 Temperratur Berechnung


von lucas (Gast)


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
}

: Gesperrt durch Moderator
von Falk B. (falk)


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"

von Uwe S. (de0508)


Lesenswert?

Man, warum fängst Du schon wieder einen Thread an?

Falk hat Dir doch funktionieren Code verlinkt. Denn kann man nutzen und 
(ist) fertig.

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.