Rev 918 | Rev 1166 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 918 | Rev 1111 | ||
---|---|---|---|
1 | /*############################################################################ |
1 | /*############################################################################ |
2 | ############################################################################*/ |
2 | ############################################################################*/ |
3 | 3 | ||
4 | #include "main.h" |
4 | #include "main.h" |
5 | 5 | ||
6 | volatile unsigned char twi_state = 0; |
6 | volatile unsigned char twi_state = 0; |
7 | unsigned char motor = 0; |
7 | unsigned char motor = 0; |
8 | unsigned char motorread = 0; |
8 | unsigned char motorread = 0; |
9 | unsigned char motor_rx[8]; |
9 | unsigned char motor_rx[16]; |
10 | 10 | ||
11 | //############################################################################ |
11 | //############################################################################ |
12 | //Initzialisieren der I2C (TWI) Schnittstelle |
12 | //Initzialisieren der I2C (TWI) Schnittstelle |
13 | void i2c_init(void) |
13 | void i2c_init(void) |
14 | //############################################################################ |
14 | //############################################################################ |
15 | { |
15 | { |
16 | TWSR = 0; |
16 | TWSR = 0; |
17 | TWBR = ((SYSCLK/SCL_CLOCK)-16)/2; |
17 | TWBR = ((SYSCLK/SCL_CLOCK)-16)/2; |
18 | } |
18 | } |
19 | 19 | ||
20 | //############################################################################ |
20 | //############################################################################ |
21 | //Start I2C |
21 | //Start I2C |
22 | char i2c_start(void) |
22 | char i2c_start(void) |
23 | //############################################################################ |
23 | //############################################################################ |
24 | { |
24 | { |
25 | TWCR = (1<<TWSTA) | (1<<TWEN) | (1<<TWINT) | (1<<TWIE); |
25 | TWCR = (1<<TWSTA) | (1<<TWEN) | (1<<TWINT) | (1<<TWIE); |
26 | return(0); |
26 | return(0); |
27 | } |
27 | } |
28 | 28 | ||
29 | //############################################################################ |
29 | //############################################################################ |
30 | //Start I2C |
30 | //Start I2C |
31 | void i2c_stop(void) |
31 | void i2c_stop(void) |
32 | //############################################################################ |
32 | //############################################################################ |
33 | { |
33 | { |
34 | TWCR = (1<<TWEN) | (1<<TWSTO) | (1<<TWINT); |
34 | TWCR = (1<<TWEN) | (1<<TWSTO) | (1<<TWINT); |
35 | } |
35 | } |
36 | 36 | ||
37 | void i2c_reset(void) |
37 | void i2c_reset(void) |
38 | //############################################################################ |
38 | //############################################################################ |
39 | { |
39 | { |
40 | i2c_stop(); |
40 | i2c_stop(); |
41 | twi_state = 0; |
41 | twi_state = 0; |
42 | motor = TWDR; |
42 | motor = TWDR; |
43 | motor = 0; |
43 | motor = 0; |
44 | TWCR = 0x80; |
44 | TWCR = 0x80; |
45 | TWAMR = 0; |
45 | TWAMR = 0; |
46 | TWAR = 0; |
46 | TWAR = 0; |
47 | TWDR = 0; |
47 | TWDR = 0; |
48 | TWSR = 0; |
48 | TWSR = 0; |
49 | TWBR = 0; |
49 | TWBR = 0; |
50 | i2c_init(); |
50 | i2c_init(); |
51 | i2c_start(); |
51 | i2c_start(); |
52 | i2c_write_byte(0); |
52 | i2c_write_byte(0); |
53 | } |
53 | } |
54 | 54 | ||
55 | //############################################################################ |
55 | //############################################################################ |
56 | //Start I2C |
56 | //Start I2C |
57 | char i2c_write_byte(char byte) |
57 | char i2c_write_byte(char byte) |
58 | //############################################################################ |
58 | //############################################################################ |
59 | { |
59 | { |
60 | TWSR = 0x00; |
60 | TWSR = 0x00; |
61 | TWDR = byte; |
61 | TWDR = byte; |
62 | TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE); |
62 | TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE); |
63 | 63 | ||
64 | return(0); |
64 | return(0); |
65 | 65 | ||
66 | } |
66 | } |
- | 67 | ||
- | 68 | #ifdef OCTO |
|
- | 69 | //############################################################################ |
|
- | 70 | //Start I2C |
|
- | 71 | SIGNAL (TWI_vect) |
|
- | 72 | //############################################################################ |
|
- | 73 | { |
|
- | 74 | switch (twi_state++) |
|
- | 75 | { |
|
- | 76 | case 0: |
|
- | 77 | i2c_write_byte(0x52+(motor*2)); |
|
- | 78 | break; |
|
- | 79 | case 1: |
|
- | 80 | switch(motor++) |
|
- | 81 | { |
|
- | 82 | case 0: |
|
- | 83 | i2c_write_byte(Motor1); |
|
- | 84 | break; |
|
- | 85 | case 1: |
|
- | 86 | i2c_write_byte(Motor2); |
|
- | 87 | break; |
|
- | 88 | case 2: |
|
- | 89 | i2c_write_byte(Motor3); |
|
- | 90 | break; |
|
- | 91 | case 3: |
|
- | 92 | i2c_write_byte(Motor4); |
|
- | 93 | break; |
|
- | 94 | case 4: |
|
- | 95 | i2c_write_byte(Motor5); |
|
- | 96 | break; |
|
- | 97 | case 5: |
|
- | 98 | i2c_write_byte(Motor6); |
|
- | 99 | break; |
|
- | 100 | case 6: |
|
- | 101 | i2c_write_byte(Motor7); |
|
- | 102 | break; |
|
- | 103 | case 7: |
|
- | 104 | i2c_write_byte(Motor8); |
|
- | 105 | break; |
|
- | 106 | } |
|
- | 107 | break; |
|
- | 108 | case 2: |
|
- | 109 | i2c_stop(); |
|
- | 110 | if (motor<8) twi_state = 0; |
|
- | 111 | else motor = 0; |
|
- | 112 | i2c_start(); |
|
- | 113 | break; |
|
- | 114 | ||
- | 115 | //Liest Daten von Motor |
|
- | 116 | case 3: |
|
- | 117 | i2c_write_byte(0x53+(motorread*2)); |
|
- | 118 | break; |
|
- | 119 | case 4: |
|
- | 120 | switch(motorread) |
|
- | 121 | { |
|
- | 122 | case 0: |
|
- | 123 | i2c_write_byte(Motor1); |
|
- | 124 | break; |
|
- | 125 | case 1: |
|
- | 126 | i2c_write_byte(Motor2); |
|
- | 127 | break; |
|
- | 128 | case 2: |
|
- | 129 | i2c_write_byte(Motor3); |
|
- | 130 | break; |
|
- | 131 | case 3: |
|
- | 132 | i2c_write_byte(Motor4); |
|
- | 133 | break; |
|
- | 134 | case 4: |
|
- | 135 | i2c_write_byte(Motor5); |
|
- | 136 | break; |
|
- | 137 | case 5: |
|
- | 138 | i2c_write_byte(Motor6); |
|
- | 139 | break; |
|
- | 140 | case 6: |
|
- | 141 | i2c_write_byte(Motor7); |
|
- | 142 | break; |
|
- | 143 | case 7: |
|
- | 144 | i2c_write_byte(Motor8); |
|
- | 145 | break; |
|
- | 146 | } |
|
- | 147 | break; |
|
- | 148 | case 5: //1 Byte vom Motor lesen |
|
- | 149 | motor_rx[motorread] = TWDR; |
|
- | 150 | ||
- | 151 | case 6: |
|
- | 152 | switch(motorread) |
|
- | 153 | { |
|
- | 154 | case 0: |
|
- | 155 | i2c_write_byte(Motor1); |
|
- | 156 | break; |
|
- | 157 | case 1: |
|
- | 158 | i2c_write_byte(Motor2); |
|
- | 159 | break; |
|
- | 160 | case 2: |
|
- | 161 | i2c_write_byte(Motor3); |
|
- | 162 | break; |
|
- | 163 | case 3: |
|
- | 164 | i2c_write_byte(Motor4); |
|
- | 165 | break; |
|
- | 166 | case 4: |
|
- | 167 | i2c_write_byte(Motor5); |
|
- | 168 | break; |
|
- | 169 | case 5: |
|
- | 170 | i2c_write_byte(Motor6); |
|
- | 171 | break; |
|
- | 172 | case 6: |
|
- | 173 | i2c_write_byte(Motor7); |
|
- | 174 | break; |
|
- | 175 | case 7: |
|
- | 176 | i2c_write_byte(Motor8); |
|
- | 177 | break; |
|
- | 178 | } |
|
- | 179 | break; |
|
- | 180 | case 7: //2 Byte vom Motor lesen |
|
- | 181 | motor_rx[motorread+4] = TWDR; |
|
- | 182 | motorread++; |
|
- | 183 | if (motorread>7) motorread=0; |
|
- | 184 | i2c_stop(); |
|
- | 185 | I2CTimeout = 10; |
|
- | 186 | twi_state = 0; |
|
- | 187 | break; |
|
- | 188 | case 8: // Gyro-Offset |
|
- | 189 | i2c_write_byte(0x98); // Address of the DAC |
|
- | 190 | break; |
|
- | 191 | case 9: |
|
- | 192 | i2c_write_byte(0x10); // Update Channel A |
|
- | 193 | break; |
|
- | 194 | case 10: |
|
- | 195 | i2c_write_byte(AnalogOffsetNick); // Value |
|
- | 196 | break; |
|
- | 197 | case 11: |
|
- | 198 | i2c_write_byte(0x80); // Value |
|
- | 199 | break; |
|
- | 200 | case 12: |
|
- | 201 | i2c_stop(); |
|
- | 202 | I2CTimeout = 10; |
|
- | 203 | i2c_start(); |
|
- | 204 | break; |
|
- | 205 | case 13: |
|
- | 206 | i2c_write_byte(0x98); // Address of the DAC |
|
- | 207 | break; |
|
- | 208 | case 14: |
|
- | 209 | i2c_write_byte(0x12); // Update Channel B |
|
- | 210 | break; |
|
- | 211 | case 15: |
|
- | 212 | i2c_write_byte(AnalogOffsetRoll); // Value |
|
- | 213 | break; |
|
- | 214 | case 16: |
|
- | 215 | i2c_write_byte(0x80); // Value |
|
- | 216 | break; |
|
- | 217 | case 17: |
|
- | 218 | i2c_stop(); |
|
- | 219 | I2CTimeout = 10; |
|
- | 220 | i2c_start(); |
|
- | 221 | break; |
|
- | 222 | case 18: |
|
- | 223 | i2c_write_byte(0x98); // Address of the DAC |
|
- | 224 | break; |
|
- | 225 | case 19: |
|
- | 226 | i2c_write_byte(0x14); // Update Channel C |
|
- | 227 | break; |
|
- | 228 | case 20: |
|
- | 229 | i2c_write_byte(AnalogOffsetGier); // Value |
|
- | 230 | break; |
|
- | 231 | case 21: |
|
- | 232 | i2c_write_byte(0x80); // Value |
|
- | 233 | break; |
|
- | 234 | case 22: |
|
- | 235 | i2c_stop(); |
|
- | 236 | I2CTimeout = 10; |
|
- | 237 | twi_state = 0; |
|
- | 238 | break; |
|
- | 239 | } |
|
- | 240 | TWCR |= 0x80; |
|
- | 241 | } |
|
67 | 242 | #else |
|
68 | //############################################################################ |
243 | //############################################################################ |
69 | //Start I2C |
244 | //Start I2C |
70 | SIGNAL (TWI_vect) |
245 | SIGNAL (TWI_vect) |
71 | //############################################################################ |
246 | //############################################################################ |
72 | { |
247 | { |
73 | switch (twi_state++) |
248 | switch (twi_state++) |
74 | { |
249 | { |
75 | case 0: |
250 | case 0: |
76 | i2c_write_byte(0x52+(motor*2)); |
251 | i2c_write_byte(0x52+(motor*2)); |
77 | break; |
252 | break; |
78 | case 1: |
253 | case 1: |
79 | switch(motor++) |
254 | switch(motor++) |
80 | { |
255 | { |
81 | case 0: |
256 | case 0: |
82 | i2c_write_byte(Motor_Vorne); |
257 | i2c_write_byte(Motor_Vorne); |
83 | break; |
258 | break; |
84 | case 1: |
259 | case 1: |
85 | i2c_write_byte(Motor_Hinten); |
260 | i2c_write_byte(Motor_Hinten); |
86 | break; |
261 | break; |
87 | case 2: |
262 | case 2: |
88 | i2c_write_byte(Motor_Rechts); |
263 | i2c_write_byte(Motor_Rechts); |
89 | break; |
264 | break; |
90 | case 3: |
265 | case 3: |
91 | i2c_write_byte(Motor_Links); |
266 | i2c_write_byte(Motor_Links); |
92 | break; |
267 | break; |
93 | } |
268 | } |
94 | break; |
269 | break; |
95 | case 2: |
270 | case 2: |
96 | i2c_stop(); |
271 | i2c_stop(); |
97 | if (motor<4) twi_state = 0; |
272 | if (motor<4) twi_state = 0; |
98 | else motor = 0; |
273 | else motor = 0; |
99 | i2c_start(); |
274 | i2c_start(); |
100 | break; |
275 | break; |
101 | 276 | ||
102 | //Liest Daten von Motor |
277 | //Liest Daten von Motor |
103 | case 3: |
278 | case 3: |
104 | i2c_write_byte(0x53+(motorread*2)); |
279 | i2c_write_byte(0x53+(motorread*2)); |
105 | break; |
280 | break; |
106 | case 4: |
281 | case 4: |
107 | switch(motorread) |
282 | switch(motorread) |
108 | { |
283 | { |
109 | case 0: |
284 | case 0: |
110 | i2c_write_byte(Motor_Vorne); |
285 | i2c_write_byte(Motor_Vorne); |
111 | break; |
286 | break; |
112 | case 1: |
287 | case 1: |
113 | i2c_write_byte(Motor_Hinten); |
288 | i2c_write_byte(Motor_Hinten); |
114 | break; |
289 | break; |
115 | case 2: |
290 | case 2: |
116 | i2c_write_byte(Motor_Rechts); |
291 | i2c_write_byte(Motor_Rechts); |
117 | break; |
292 | break; |
118 | case 3: |
293 | case 3: |
119 | i2c_write_byte(Motor_Links); |
294 | i2c_write_byte(Motor_Links); |
120 | break; |
295 | break; |
121 | } |
296 | } |
122 | break; |
297 | break; |
123 | case 5: //1 Byte vom Motor lesen |
298 | case 5: //1 Byte vom Motor lesen |
124 | motor_rx[motorread] = TWDR; |
299 | motor_rx[motorread] = TWDR; |
125 | 300 | ||
126 | case 6: |
301 | case 6: |
127 | switch(motorread) |
302 | switch(motorread) |
128 | { |
303 | { |
129 | case 0: |
304 | case 0: |
130 | i2c_write_byte(Motor_Vorne); |
305 | i2c_write_byte(Motor_Vorne); |
131 | break; |
306 | break; |
132 | case 1: |
307 | case 1: |
133 | i2c_write_byte(Motor_Hinten); |
308 | i2c_write_byte(Motor_Hinten); |
134 | break; |
309 | break; |
135 | case 2: |
310 | case 2: |
136 | i2c_write_byte(Motor_Rechts); |
311 | i2c_write_byte(Motor_Rechts); |
137 | break; |
312 | break; |
138 | case 3: |
313 | case 3: |
139 | i2c_write_byte(Motor_Links); |
314 | i2c_write_byte(Motor_Links); |
140 | break; |
315 | break; |
141 | } |
316 | } |
142 | break; |
317 | break; |
143 | case 7: //2 Byte vom Motor lesen |
318 | case 7: //2 Byte vom Motor lesen |
144 | motor_rx[motorread+4] = TWDR; |
319 | motor_rx[motorread+4] = TWDR; |
145 | motorread++; |
320 | motorread++; |
146 | if (motorread>3) motorread=0; |
321 | if (motorread>3) motorread=0; |
147 | i2c_stop(); |
322 | i2c_stop(); |
148 | I2CTimeout = 10; |
323 | I2CTimeout = 10; |
149 | twi_state = 0; |
324 | twi_state = 0; |
150 | break; |
325 | break; |
151 | case 8: // Gyro-Offset |
326 | case 8: // Gyro-Offset |
152 | i2c_write_byte(0x98); // Address of the DAC |
327 | i2c_write_byte(0x98); // Address of the DAC |
153 | break; |
328 | break; |
154 | case 9: |
329 | case 9: |
155 | i2c_write_byte(0x10); // Update Channel A |
330 | i2c_write_byte(0x10); // Update Channel A |
156 | break; |
331 | break; |
157 | case 10: |
332 | case 10: |
158 | i2c_write_byte(AnalogOffsetNick); // Value |
333 | i2c_write_byte(AnalogOffsetNick); // Value |
159 | break; |
334 | break; |
160 | case 11: |
335 | case 11: |
161 | i2c_write_byte(0x80); // Value |
336 | i2c_write_byte(0x80); // Value |
162 | break; |
337 | break; |
163 | case 12: |
338 | case 12: |
164 | i2c_stop(); |
339 | i2c_stop(); |
165 | I2CTimeout = 10; |
340 | I2CTimeout = 10; |
166 | i2c_start(); |
341 | i2c_start(); |
167 | break; |
342 | break; |
168 | case 13: |
343 | case 13: |
169 | i2c_write_byte(0x98); // Address of the DAC |
344 | i2c_write_byte(0x98); // Address of the DAC |
170 | break; |
345 | break; |
171 | case 14: |
346 | case 14: |
172 | i2c_write_byte(0x12); // Update Channel B |
347 | i2c_write_byte(0x12); // Update Channel B |
173 | break; |
348 | break; |
174 | case 15: |
349 | case 15: |
175 | i2c_write_byte(AnalogOffsetRoll); // Value |
350 | i2c_write_byte(AnalogOffsetRoll); // Value |
176 | break; |
351 | break; |
177 | case 16: |
352 | case 16: |
178 | i2c_write_byte(0x80); // Value |
353 | i2c_write_byte(0x80); // Value |
179 | break; |
354 | break; |
180 | case 17: |
355 | case 17: |
181 | i2c_stop(); |
356 | i2c_stop(); |
182 | I2CTimeout = 10; |
357 | I2CTimeout = 10; |
183 | i2c_start(); |
358 | i2c_start(); |
184 | break; |
359 | break; |
185 | case 18: |
360 | case 18: |
186 | i2c_write_byte(0x98); // Address of the DAC |
361 | i2c_write_byte(0x98); // Address of the DAC |
187 | break; |
362 | break; |
188 | case 19: |
363 | case 19: |
189 | i2c_write_byte(0x14); // Update Channel C |
364 | i2c_write_byte(0x14); // Update Channel C |
190 | break; |
365 | break; |
191 | case 20: |
366 | case 20: |
192 | i2c_write_byte(AnalogOffsetGier); // Value |
367 | i2c_write_byte(AnalogOffsetGier); // Value |
193 | break; |
368 | break; |
194 | case 21: |
369 | case 21: |
195 | i2c_write_byte(0x80); // Value |
370 | i2c_write_byte(0x80); // Value |
196 | break; |
371 | break; |
197 | case 22: |
372 | case 22: |
198 | i2c_stop(); |
373 | i2c_stop(); |
199 | I2CTimeout = 10; |
374 | I2CTimeout = 10; |
200 | twi_state = 0; |
375 | twi_state = 0; |
201 | break; |
376 | break; |
202 | } |
377 | } |
203 | TWCR |= 0x80; |
378 | TWCR |= 0x80; |
204 | } |
379 | } |
- | 380 | #endif |
|
205 | 381 |