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(80); // 66 us
|
13 | err = (DS1820_PIN & (1<<used_pin)) >> used_pin; // no presence detect --> err=1 otherwise err=0
|
14 | _delay_us(400); // 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(2);
|
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(48);
|
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 | // Read temperature
|
92 | //-----------------------------------------
|
93 | float ds1820_read_temp(uint8_t used_pin)
|
94 | {
|
95 | uint8_t error;
|
96 | uint16_t i=0;
|
97 | uint8_t scratchpad[9];
|
98 | float temp=0;
|
99 |
|
100 | scratchpad[0]=0;
|
101 | scratchpad[1]=0;
|
102 | scratchpad[2]=0;
|
103 | scratchpad[3]=0;
|
104 | scratchpad[4]=0;
|
105 | scratchpad[5]=0;
|
106 | scratchpad[6]=0;
|
107 | scratchpad[7]=0;
|
108 | scratchpad[8]=0;
|
109 |
|
110 | error=ds1820_reset(used_pin);
|
111 | //1. Reset
|
112 | if (error==0){
|
113 | ds1820_wr_byte(0xCC,used_pin); //2. skip ROM
|
114 | ds1820_wr_byte(0x44,used_pin); //3. ask for temperature conversion
|
115 |
|
116 | for (i = 0;i < 760;i++){ //4. wait until conversion is finished
|
117 | _delay_ms(1);
|
118 | }
|
119 |
|
120 | // while (ds1820_re_byte(used_pin)!=0xFF){ //4. wait until conversion is finished
|
121 | // _delay_us(10);
|
122 | // i++;
|
123 | // }
|
124 |
|
125 | error=ds1820_reset(used_pin); //5. Reset
|
126 | ds1820_wr_byte(0xCC,used_pin); //6. skip ROM
|
127 | ds1820_wr_byte(0xBE,used_pin); //7. Read entire scratchpad 9 bytes
|
128 |
|
129 | for (i=0; i<9; i++) //8. Get scratchpad byte by byte
|
130 | {
|
131 | scratchpad[i]=ds1820_re_byte(used_pin); //9. read one DS18S20 byte
|
132 | }
|
133 |
|
134 | // scratchpad[1]=0b00000010; // Testbytes for Temperatur calculation
|
135 | // scratchpad[0]=0b01010001;
|
136 | }
|
137 | if((scratchpad[1]&0xF8)==0x00){ .
|
138 | temp = (float)(((scratchpad[1]<<8)+scratchpad[0]));
|
139 | temp *= 0.0625;
|
140 |
|
141 | }else{
|
142 | uint8_t tmp;
|
143 | tmp =scratchpad[0];
|
144 | tmp= ~ tmp;
|
145 | tmp= tmp >> 1;
|
146 | temp = (-1)*(tmp+1);
|
147 | if ((scratchpad[0]&0b00000001)==1){
|
148 | temp=temp+0.5;
|
149 | }
|
150 |
|
151 | }
|
152 |
|
153 | // temp=scratchpad[2]; // Return Scratchpad Byte X for Controll
|
154 |
|
155 | return temp;
|
156 |
|
157 | }
|
158 | //-----------------------------------------
|
159 | // Initialize DS18S20
|
160 | //-----------------------------------------
|
161 | uint8_t ds1820_init(uint8_t used_pin)
|
162 | {
|
163 | uint8_t error;
|
164 | error=ds1820_reset(used_pin); //1. Reset
|
165 | if (error==0){
|
166 | ds1820_wr_byte(0xCC,used_pin); //2. skip ROM
|
167 | ds1820_wr_byte(0x44,used_pin); //3. ask for temperature conversion
|
168 | for (i = 0;i < 1000;i++){ //4. wait until conversion is finished
|
169 | _delay_us(900);
|
170 | }
|
171 | error=ds1820_reset(used_pin); //5. Reset
|
172 | ds1820_wr_byte(0xCC,used_pin); //6. skip ROM
|
173 | ds1820_wr_byte(0xBE,used_pin); //7. Read entire scratchpad 9 bytes
|
174 | }
|
175 | return error;
|
176 |
|
177 | }
|