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