Subversion Repositories FlightCtrl

Rev

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

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