Subversion Repositories FlightCtrl

Rev

Rev 1111 | Rev 1174 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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