1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include "delay.h"
|
4 | #include <util/delay.h>
|
5 | #include <string.h>
|
6 | #include <stdlib.h>
|
7 | #include <util/crc16.h>
|
8 | #include <stdio.h>
|
9 |
|
10 |
|
11 | #ifndef F_CPU
|
12 | #define F_CPU 8000000
|
13 | #endif
|
14 |
|
15 |
|
16 | //1wire port
|
17 | //#define OW_PORT D
|
18 | //#define OW_PIN 7
|
19 |
|
20 | extern bool ow_reset(void);
|
21 | #define concat(a, b) a##b
|
22 | #define indir(a, b) concat(a, b)
|
23 | //#define ow_port indir(PORT, OW_PORT)
|
24 | //#define ow_pin indir(PIN, OW_PORT)
|
25 | //#define ow_ddr indir(DDR, OW_PORT)
|
26 | #define uchar unsigned char
|
27 |
|
28 | //char ow_pin=PIND;
|
29 | //char ow_port=PORTD;
|
30 | //char ow_ddr=DDRD;
|
31 | char OW_PIN=7;
|
32 |
|
33 | volatile char* ow_pin = &PIND;
|
34 | volatile char* ow_port = &PORTD;
|
35 | volatile char* ow_ddr = &DDRD;
|
36 |
|
37 |
|
38 |
|
39 | static void hw_init(void)
|
40 | {
|
41 | //DDRB = 0x2F;
|
42 | //PORTB = 0xFE;
|
43 | //DDRD = 0x12; // Input-Port, außer TxD
|
44 | //PORTD = 0xEF; // Pull-Ups aktivieren
|
45 |
|
46 | //TIMSK1 = 2;
|
47 | }
|
48 |
|
49 |
|
50 | static inline void clear_dq(void)
|
51 | {
|
52 | ow_port &= ~(1 << OW_PIN);
|
53 | ow_ddr |= (1 << OW_PIN);
|
54 | }
|
55 |
|
56 |
|
57 | static inline void set_dq(void)
|
58 | {
|
59 | ow_port &= ~(1 << OW_PIN);
|
60 | ow_ddr &= ~(1 << OW_PIN);
|
61 | }
|
62 |
|
63 |
|
64 | static inline uint8_t get_dq(void)
|
65 | {
|
66 | return (ow_pin & (1 << OW_PIN)) == 0;
|
67 | }
|
68 |
|
69 |
|
70 | bool ow_reset(void)
|
71 | {
|
72 | bool presence;
|
73 |
|
74 | cli();
|
75 | clear_dq();
|
76 | _delay_ms(0.48);
|
77 | set_dq();
|
78 | _delay_ms(0.07);
|
79 | presence = get_dq();
|
80 | sei();
|
81 | _delay_ms(0.24);
|
82 |
|
83 | return presence;
|
84 | }
|
85 |
|
86 | static uint8_t ow_read_bit(void)
|
87 | {
|
88 | bool res;
|
89 |
|
90 | cli();
|
91 | clear_dq();
|
92 | set_dq();
|
93 | _delay_us(15);
|
94 |
|
95 | res = get_dq();
|
96 | sei();
|
97 | _delay_us(60);
|
98 |
|
99 | return res? 0: 1;
|
100 | }
|
101 |
|
102 |
|
103 | static void ow_write_bit(bool bit)
|
104 | {
|
105 | cli();
|
106 | clear_dq();
|
107 | if (bit)
|
108 | set_dq();
|
109 | _delay_ms(0.1);
|
110 | set_dq();
|
111 | sei();
|
112 | }
|
113 |
|
114 |
|
115 | uint8_t ow_read_byte(void)
|
116 | {
|
117 | uint8_t i;
|
118 | uint8_t val = 0, mask;
|
119 |
|
120 | for (i = 0, mask = 1; i < 8; i++, mask <<= 1)
|
121 | {
|
122 | if (ow_read_bit())
|
123 | val |= mask;
|
124 | _delay_ms(0.1);
|
125 | }
|
126 |
|
127 | return val;
|
128 | }
|
129 |
|
130 |
|
131 | void ow_write_byte(uint8_t val)
|
132 | {
|
133 | uint8_t i;
|
134 | uint8_t mask;
|
135 |
|
136 | for (i = 0, mask = 1; i < 8; i++, mask <<= 1)
|
137 | {
|
138 | ow_write_bit(val & mask);
|
139 | }
|
140 | _delay_ms(0.1);
|
141 | }
|
142 |
|
143 |
|
144 | uint8_t ow_checkcrc(uint8_t *data, uint8_t nbytes)
|
145 | {
|
146 | uint8_t crc = 0, i;
|
147 |
|
148 | for (i = 0; i < nbytes; i++)
|
149 | crc = _crc_ibutton_update(crc, data[i]);
|
150 |
|
151 | return crc; // must be 0
|
152 | }
|
153 |
|
154 |
|
155 |
|
156 | static void Read_Temperature(void)
|
157 | {
|
158 | uint8_t get[9];
|
159 | uint8_t k;
|
160 | uchar s[30];
|
161 |
|
162 |
|
163 |
|
164 |
|
165 | ow_reset();
|
166 | ow_write_byte(0xCC); //Skip ROM
|
167 | ow_write_byte(0x44); // Start Conversion
|
168 | //for (i = 0; i < 750; i++)
|
169 | // _delay_ms(1);
|
170 | _delay_ms(1000);
|
171 | ow_reset();
|
172 | ow_write_byte(0xCC); // Skip ROM
|
173 | ow_write_byte(0xBE); // Read Scratch Pad
|
174 |
|
175 | for (k = 0; k < 9; k++){
|
176 | get[k] = ow_read_byte();
|
177 | //lcd_data(get[k]);
|
178 |
|
179 | }
|
180 | k = ow_checkcrc(get, 9);
|
181 |
|
182 |
|
183 |
|
184 |
|
185 |
|
186 |
|
187 |
|
188 | if (get[1] == 0x00) // + vorzeichen
|
189 | {lcd_string("+");}
|
190 |
|
191 | if (get[1] == 0xFF) // - vorzeichen
|
192 | {lcd_string("-");
|
193 | get[0]=255-get[0]; // minuswerte invertieren
|
194 | }
|
195 |
|
196 | get[0]=get[0]/2;
|
197 |
|
198 | //sprintf( (char*)s, "%04Xh", get[0] ); // hex value
|
199 | sprintf( (char*)s, "%3d Grad", get[0] ); // 1 Grad Dez
|
200 |
|
201 | lcd_string( (char*)s );
|
202 |
|
203 | }
|
204 |
|
205 |
|
206 |
|
207 | // Main
|
208 |
|
209 |
|
210 | void main(void) {
|
211 |
|
212 | uchar s[30];
|
213 |
|
214 | hw_init();
|
215 | lcd_init();
|
216 |
|
217 | while (1)
|
218 | {
|
219 |
|
220 |
|
221 | set_cursor(0,1);
|
222 | Read_Temperature(); // messen + Ausgabe
|
223 |
|
224 | }
|
225 |
|
226 | }
|