Subversion Repositories FlightCtrl

Rev

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

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