1 | #include <util/delay.h>
|
2 | #include <avr/io.h>
|
3 | #include <timer.h>
|
4 |
|
5 | #define OWDDR DDRA
|
6 | #define OWPIN PINA
|
7 | #define OWPORT PORTA
|
8 | #define OWICPIN PA3
|
9 |
|
10 | unsigned char rom_c[8];
|
11 |
|
12 | unsigned char ow_reset(void)
|
13 | {
|
14 | unsigned char zw;
|
15 |
|
16 | OWDDR |= (1<<OWICPIN); // 1-wire Leitung auf LOW (Ausgang)
|
17 | OWPORT &= ~(1<<OWICPIN); // DQ auf Low
|
18 |
|
19 | _delay_us(460); // 460 us warten
|
20 |
|
21 | OWPORT |= (1<<OWICPIN); // DQ auf High
|
22 | OWDDR &= ~(1<<OWICPIN); // 1-wire Leitung auf High (Eingang)
|
23 |
|
24 | _delay_us(65); // 65 us warten
|
25 |
|
26 | zw = (OWPIN & (1<<OWICPIN)) >> OWICPIN; // Zustand DQ einlesen
|
27 | _delay_us(420); // 420 us warten = Ende des Reset-Vorgangs
|
28 | return(zw); // Rueckgabe: 0 = Slave vorhanden, 1 = kein Slave vorhanden
|
29 | }
|
30 |
|
31 | void ow_wr_bit(unsigned char bitwert)
|
32 | {
|
33 | // Start Time Slot: DQ auf Low
|
34 | OWDDR |= (1<<OWICPIN); // 1-wire Leitung auf LOW (Ausgang)
|
35 | OWPORT &= ~(1<<OWICPIN); // DQ auf Low
|
36 |
|
37 | // Bei logŽ1Ž: sofort wieder auf High = nur kurzer Low-Impuls
|
38 | if(bitwert)
|
39 | {
|
40 | OWPORT |= (1<<OWICPIN); // DQ auf High
|
41 | }
|
42 |
|
43 | _delay_us(105); // ca. 105 us warten bis
|
44 |
|
45 | OWPORT |= (1<<OWICPIN); // DQ auf High
|
46 | }
|
47 |
|
48 | unsigned char ow_rd_bit(void)
|
49 | {
|
50 | unsigned char zw;
|
51 |
|
52 | OWDDR |= (1<<OWICPIN); // 1-wire Leitung auf LOW (Ausgang)
|
53 | OWPORT &= ~(1<<OWICPIN); // DQ auf Low
|
54 | OWPORT |= (1<<OWICPIN); // DQ sofort wieder High
|
55 | OWDDR &= ~(1<<OWICPIN); // 1-wire Leitung auf High (Eingang)
|
56 | _delay_us(15); // 15 us warten
|
57 | zw = (OWPIN & (1<<OWICPIN)) >> OWICPIN; // DQ einlesen und speichern
|
58 | _delay_us(105); // noch 105 us warten
|
59 | // bis Ende Time Slot
|
60 | return(zw); // Rückgabe von DQ
|
61 | }
|
62 |
|
63 | void ow_wr_byte(unsigned char dat)
|
64 | {
|
65 | unsigned char i;
|
66 | unsigned char maske = 1;
|
67 |
|
68 | // 8 Bits nacheinander raus schieben, LSB zuerst
|
69 | for (i=0; i<8; i++)
|
70 | {
|
71 | if (dat & maske) ow_wr_bit(1); // log.Ž1Ž senden
|
72 | else ow_wr_bit(0); // log.Ž0Ž senden
|
73 | maske = maske * 2; // nächstes Bit selektieren
|
74 | }
|
75 | }
|
76 |
|
77 | unsigned char ow_rd_byte(void)
|
78 | {
|
79 | unsigned char i;
|
80 | unsigned char wert = 0;
|
81 |
|
82 | // 8 Bits hintereinander einlesen, LSB zuerst
|
83 | for(i=0; i<8; i++)
|
84 | {
|
85 | if (ow_rd_bit()) wert |=0x01 << i;
|
86 | }
|
87 |
|
88 | return(wert);
|
89 | }
|
90 |
|
91 | unsigned char ow_rd_rom(void)
|
92 | {
|
93 | unsigned char i;
|
94 |
|
95 | // Start mit Master-Reset-Impuls u. Abfrage: Slave presence
|
96 | if(ow_reset())
|
97 | {
|
98 | while(1);
|
99 | }
|
100 |
|
101 | // Abfrage-Befehl senden: "READ ROM" = 0x33
|
102 | ow_wr_byte(0x33);
|
103 |
|
104 | // Antwort einlesen: 8 Byte = 64 Bit Identifier ins globale Array rom_c[.]
|
105 | for (i=0; i<8; i++)
|
106 | {
|
107 | rom_c[i] = ow_rd_byte();
|
108 | }
|
109 |
|
110 | return rom_c[8];
|
111 | }
|
112 |
|
113 |
|
114 |
|
115 | // SkipRom
|
116 |
|
117 | unsigned char Read_Skip_Temp(void)
|
118 | {
|
119 | char get[10];
|
120 | int k;
|
121 | char temp_c;
|
122 |
|
123 | ow_reset();
|
124 | ow_wr_byte(0xCC); //Skip ROM
|
125 | ow_wr_byte(0x44); // Start Conversion
|
126 | _delay_ms(800);
|
127 | ow_reset();
|
128 | ow_wr_byte(0xCC); // Skip ROM
|
129 | ow_wr_byte(0xBE); // Read Scratch Pad
|
130 | for (k=0;k<9;k++){get[k]=ow_rd_byte();}
|
131 |
|
132 | temp_c = get[0]; // Temp data plus lsb
|
133 | temp_c = temp_c/2;
|
134 |
|
135 | return (temp_c);
|
136 | }
|
137 |
|
138 | // MatchRom
|
139 |
|
140 | unsigned char Read_Match_Temp(unsigned char* romaddr)
|
141 | {
|
142 | int get[10];
|
143 | int k;
|
144 | int i;
|
145 | int temp_c;
|
146 |
|
147 | ow_reset();
|
148 | ow_wr_byte(0x55);
|
149 | for (i=0; i<8; i++)
|
150 | {
|
151 | ow_wr_byte(romaddr[i]);
|
152 | }
|
153 |
|
154 | ow_wr_byte(0x44); // Start Conversion
|
155 | _delay_ms(800);
|
156 | ow_reset();
|
157 |
|
158 | ow_wr_byte(0x55);
|
159 | for (i=0; i<8; i++)
|
160 | {
|
161 | ow_wr_byte(romaddr[i]);
|
162 | }
|
163 |
|
164 | ow_wr_byte(0xBE); // Read Scratch Pad
|
165 | for (k=0;k<9;k++){get[k]=ow_rd_byte();}
|
166 |
|
167 | temp_c = get[0];
|
168 | temp_c = temp_c / 2;
|
169 |
|
170 | return (temp_c);
|
171 | }
|