Subversion Repositories FlightCtrl

Rev

Rev 838 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
838 MikeW 1
/*############################################################################
2
############################################################################*/
3
 
4
#include "main.h"
5
#include "kafi.h"
6
 
7
unsigned char twi_state = 0;
8
unsigned char motor = 0;
9
unsigned char motorread = 0;
10
unsigned char motor_rx[8];
11
 
12
unsigned int TriggerMagneticHeading = 0;
13
unsigned int TriggerSonicReading = 0;
14
 
15
 
16
//############################################################################
17
//Initzialisieren der I2C (TWI) Schnittstelle
18
void i2c_init(void)
19
//############################################################################
20
{
839 MikeW 21
        TWSR = 0;
22
        TWBR = ((SYSCLK/SCL_CLOCK)-16)/2;
838 MikeW 23
}
24
 
25
//############################################################################
26
//Start I2C
27
char i2c_start(void)
28
//############################################################################
29
{
30
    TWCR = (1<<TWSTA) | (1<<TWEN) | (1<<TWINT) | (1<<TWIE);
31
    return(0);
32
}
33
 
34
//############################################################################
35
//Start I2C
36
void i2c_stop(void)
37
//############################################################################
38
{
39
    TWCR = (1<<TWEN) | (1<<TWSTO) | (1<<TWINT);
40
}
41
 
42
void i2c_reset(void)
43
//############################################################################
44
{
839 MikeW 45
        i2c_stop();                
46
        twi_state = 0;
47
        motor = TWDR;
48
        motor = 0;
49
        TWCR = 0x80;
50
        TWAMR = 0;
51
        TWAR = 0;
52
        TWDR = 0;
53
        TWSR = 0;
54
        TWBR = 0;
55
        i2c_init();
56
        i2c_start();
57
        i2c_write_byte(0);
838 MikeW 58
}
59
 
60
//############################################################################
61
//Start I2C
62
char i2c_write_byte(char byte)
63
//############################################################################
64
{
65
    TWSR = 0x00;
66
    TWDR = byte;
67
    TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE);
68
 
69
    return(0);    
70
}
71
 
72
//############################################################################
73
//Start I2C
74
SIGNAL (TWI_vect)
75
//############################################################################
76
{
77
#if 0   
78
        int motorwert = 0;
79
        int scale_p = (int) (MAX(0, (PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 170)) / 4.F)  / 6;
80
    int scale_d = (int) (MAX(0, (PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 170)) / 4.F)  / 6;
81
#endif
839 MikeW 82
 
838 MikeW 83
    switch (twi_state++)
839 MikeW 84
        {
85
        case 0:
86
                i2c_write_byte(0x52+(motor*2));
87
                break;
88
        case 1:
89
                switch(motor++)
90
                {
91
                case 0:
838 MikeW 92
#if 0           
839 MikeW 93
                        pd_ergebnis = (int) (scale_p* DiffNick + scale_d * (AdWertNick - AdNeutralNick - Roll_Y_Off)) / 10;                            
94
                        if(pd_ergebnis >  (GasMischanteil + abs(GierMischanteil)))
95
                        {
96
                                pd_ergebnis =  (GasMischanteil + abs(GierMischanteil));
97
                        }
98
                        if(pd_ergebnis < -(GasMischanteil + abs(GierMischanteil)))
99
                        {
100
                                pd_ergebnis = -(GasMischanteil + abs(GierMischanteil));
101
                        }
102
                        /* M o t o r   V o r n */      
103
                        motorwert = GasMischanteil + pd_ergebnis + GierMischanteil;
104
                        if ((motorwert < 0))
105
                        {
106
                                motorwert = 0;
107
                        }      
108
                        else if(motorwert > MAX_GAS)
109
                        {
110
                                motorwert = MAX_GAS;
111
                        }
112
                        if (motorwert < MIN_GAS)
113
                        {
114
                                motorwert = MIN_GAS;
115
                        }
116
                        Motor_Vorne = motorwert;         
117
                        if(!MotorenEin)
118
                        {
119
                                Motor_Vorne = 0;
120
                                if(MotorTest[0]) Motor_Vorne = MotorTest[0];
121
                        }
838 MikeW 122
#endif  
839 MikeW 123
                        i2c_write_byte(Motor_Vorne);
124
                        break;
125
                case 1:
838 MikeW 126
#if 0           
839 MikeW 127
                        pd_ergebnis = (scale_p * DiffNick + scale_d * (AdWertNick - AdNeutralNick - Roll_Y_Off)) / 10;                         
128
                        if(pd_ergebnis >  (GasMischanteil + abs(GierMischanteil)))
129
                        {
130
                                pd_ergebnis =  (GasMischanteil + abs(GierMischanteil));
131
                        }
132
                        if(pd_ergebnis < -(GasMischanteil + abs(GierMischanteil)))
133
                        {
134
                                pd_ergebnis = -(GasMischanteil + abs(GierMischanteil));
135
                        }
136
                        /* M o t o r   H e c k */
137
                        motorwert = GasMischanteil - pd_ergebnis + GierMischanteil;
138
                        if ((motorwert < 0))
139
                        {
140
                                motorwert = 0;
141
                        }
142
                        else if(motorwert > MAX_GAS)
143
                        {
144
                                motorwert = MAX_GAS;
145
                        }
146
                        if (motorwert < MIN_GAS)
147
                        {
148
                                motorwert = MIN_GAS;
149
                        }
150
                        Motor_Hinten = motorwert;      
151
 
152
                        if(!MotorenEin)
153
                        {
154
                                Motor_Hinten = 0;
155
                                if(MotorTest[1]) Motor_Hinten = MotorTest[1];
156
                        }                                      
838 MikeW 157
#endif                                                  
839 MikeW 158
                        i2c_write_byte(Motor_Hinten);
159
                        break;
160
                case 2:
838 MikeW 161
#if 0           
839 MikeW 162
                        pd_ergebnis = (scale_p * DiffRoll + scale_d * (AdWertRoll - AdNeutralRoll - Roll_X_Off)) / 10;
163
                        if(pd_ergebnis >  (GasMischanteil + abs(GierMischanteil)))
164
                        {
165
                                pd_ergebnis =  (GasMischanteil + abs(GierMischanteil));
166
                        }
167
                        if(pd_ergebnis < -(GasMischanteil + abs(GierMischanteil)))
168
                        {
169
                                pd_ergebnis = -(GasMischanteil + abs(GierMischanteil));
170
                        }
171
                        /* M o t o r   R e c h t s */
172
                        motorwert = GasMischanteil - pd_ergebnis - GierMischanteil;    
173
                        if (motorwert < 0)
174
                        {
175
                                motorwert = 0;
176
                        }
177
                        else if(motorwert > MAX_GAS)
178
                        {
179
                                motorwert = MAX_GAS;
180
                        }
181
                        if (motorwert < MIN_GAS)
182
                        {
183
                                motorwert = MIN_GAS;   
184
                        }
185
                        Motor_Rechts = motorwert;      
186
                        if(!MotorenEin)
187
                        {
188
                                Motor_Rechts = 0;
189
                                if(MotorTest[3]) Motor_Rechts = MotorTest[3];
190
                        }
838 MikeW 191
#endif                                                                  
839 MikeW 192
                        i2c_write_byte(Motor_Rechts);
193
                        break;
194
                case 3:        
838 MikeW 195
#if 0
839 MikeW 196
                        pd_ergebnis =  (scale_p* DiffRoll + scale_d * (AdWertRoll - AdNeutralRoll - Roll_X_Off)) / 10;
197
                        if(pd_ergebnis >  (GasMischanteil + abs(GierMischanteil)))
198
                        {
199
                                pd_ergebnis =  (GasMischanteil + abs(GierMischanteil));
200
                        }
201
                        if(pd_ergebnis < -(GasMischanteil + abs(GierMischanteil)))
202
                        {
203
                                pd_ergebnis = -(GasMischanteil + abs(GierMischanteil));
204
                        }
205
                        /* M o t o r   L i n k s */
206
                        motorwert = GasMischanteil + pd_ergebnis - GierMischanteil;
207
                        if (motorwert < 0)
208
                        {
209
                                motorwert = 0;
210
                        }
211
                        else if(motorwert > MAX_GAS)
212
                        {
213
                                motorwert = MAX_GAS;
214
                        }
215
                        if (motorwert < MIN_GAS)
216
                        {
217
                                motorwert = MIN_GAS;
218
                        }
219
                        Motor_Links = motorwert;                       
220
                        if(!MotorenEin)
221
                        {
222
                                Motor_Links = 0;
223
                                if(MotorTest[2]) Motor_Links = MotorTest[2];
224
                        }
838 MikeW 225
#endif                          
839 MikeW 226
                        i2c_write_byte(Motor_Links);
227
                        break;
838 MikeW 228
                    }
839 MikeW 229
                                        break;
838 MikeW 230
        case 2:
839 MikeW 231
                        i2c_stop();
232
                        if (motor<4) twi_state = 0;
233
                        else motor = 0;
234
                        i2c_start();  
235
                        break;
236
 
237
                        //Liest Daten von Motor
838 MikeW 238
        case 3:
839 MikeW 239
                        i2c_write_byte(0x53+(motorread*2));
240
                        break;
838 MikeW 241
        case 4:
839 MikeW 242
                        switch(motorread)
243
                        {
244
                        case 0:
245
                                i2c_write_byte(Motor_Vorne);
246
                                break;
247
                        case 1:
248
                                i2c_write_byte(Motor_Hinten);
249
                                break;
250
                        case 2:
251
                                i2c_write_byte(Motor_Rechts);
252
                                break;
253
                        case 3:
254
                                i2c_write_byte(Motor_Links);
255
                                break;
256
                        }
257
                        break;
258
                        case 5: //1 Byte vom Motor lesen       
838 MikeW 259
                motor_rx[motorread] = TWDR;
839 MikeW 260
 
261
                        case 6:
838 MikeW 262
                switch(motorread)
839 MikeW 263
                                {
264
                                case 0:
265
                                        i2c_write_byte(Motor_Vorne);
266
                                        break;
267
                                case 1:
268
                                        i2c_write_byte(Motor_Hinten);
269
                                        break;
270
                                case 2:
271
                                        i2c_write_byte(Motor_Rechts);
272
                                        break;
273
                                case 3:
274
                                        i2c_write_byte(Motor_Links);
275
                                        break;
276
                                }
838 MikeW 277
                break;  
839 MikeW 278
                                case 7: //2 Byte vom Motor lesen       
279
                                        motor_rx[motorread+4] = TWDR;
280
                                        motorread++;
281
                                        if (motorread>3) motorread=0;
282
                                        i2c_stop();
283
                                        I2CTimeout = 10;
284
                                        twi_state = 0;
838 MikeW 285
}
839 MikeW 286
                        #if 0
287
                        break; 
288
                        TriggerMagneticHeading++;
289
                        TriggerMagneticHeading %= 50;
290
                        TriggerSonicReading++;
291
                        TriggerSonicReading %= 200;
292
 
293
                        if (TriggerMagneticHeading == 1)
294
                        {
295
                                // Get Magnetic Heading 
296
                                i2c_start();  
838 MikeW 297
                                twi_state = 8;
298
                                break;
839 MikeW 299
                        }
300
 
301
                        if (TriggerSonicReading == 1)
302
                        {
303
                                // Get Ultrasonic Reading
304
                                i2c_start();  
838 MikeW 305
                                twi_state = 20;
306
                                break;           
839 MikeW 307
                        }
308
                        else if (TriggerSonicReading == 190)
309
                        {
310
                                // Get Ultrasonic Reading
311
                                i2c_start();  
838 MikeW 312
                                twi_state = 30;
313
                                break;           
839 MikeW 314
                        }
315
                        else
316
                        {              
317
                                I2CTimeout = 10;
318
                                twi_state = 0;
319
                                break;
320
                        }
838 MikeW 321
 
839 MikeW 322
                                case 8:
323
                                        i2c_write_byte(0xC0);
324
                                        break;
325
                                case 9:
326
                                        i2c_write_byte(0x02);
327
                                        break;
328
                                case 10:
329
                                        i2c_start();
330
                                        break;
331
                                case 11:
332
                                        i2c_write_byte(0xC1);
333
                                        break;                 
334
                                case 12:
335
                                        i2c_write_byte(MagneticHeading);
336
                                        break;                 
337
                                case 13:
338
                                        MagneticHeading = (0x0F & TWDR)  << 8;
339
                                        i2c_stop();
340
                                        i2c_start();  
341
                                        break;
342
                                case 14:
343
                                        i2c_write_byte(0xC0);
344
                                        break;
345
                                case 15:
346
                                        i2c_write_byte(0x03);
347
                                        break;
348
                                case 16:
349
                                        i2c_start();
350
                                        break;
351
                                case 17:
352
                                        i2c_write_byte(0xC1);
353
                                        break;                 
354
                                case 18:
355
                                        i2c_write_byte(MagneticHeading);
356
                                        break;                 
357
                                case 19:
358
                                        MagneticHeading += TWDR;                               
359
                                        i2c_stop();
360
                                        I2CTimeout = 22;
361
                                        twi_state = 0;
362
                                        break;
363
 
364
                                        /* Trigger Ultrasonic Ping */
365
                                case 20:  /* Ping */
366
                                        i2c_write_byte(0xE0);  /* Send I2C Adress */
367
                                        break;
368
                                case 21:
369
                                        i2c_write_byte(0x00);  /* Send I2C Register */
370
                                        break;
371
                                case 22:
372
                                        i2c_write_byte(82); /* Send I2C Value */
373
                                        break;
374
                                case 24:
375
                                        VersionID = TWDR;
376
                                        i2c_stop();
377
                                        I2CTimeout = 22;
378
                                        twi_state = 0;
379
                                        UltrasonicPingCnt++;
380
                                        break;
381
                                case 30:
382
                                        i2c_write_byte(0xE0);/* Send I2C Adress */
383
                                        break;
384
                                case 31:
385
                                        i2c_write_byte(0x02); /* Send I2C Register */
386
                                        break;
387
                                case 32:
388
                                        i2c_start();
389
                                        break;
390
                                case 33:
391
                                        i2c_write_byte(0xE1);
392
                                        break;                 
393
                                case 34:
394
                                        i2c_write_byte(255);
395
                                        break;                 
396
                                case 35:
397
                                        UltrasonicRange = TWDR  << 8;/* Read I2C Value */
398
                                        UltrasonicRangeHigh = TWDR;
399
                                        i2c_stop();
400
                                        i2c_start();  
401
                                        break;
402
                                case 36:
403
                                        i2c_write_byte(0xE0);
404
                                        break;
405
                                case 37:
406
                                        i2c_write_byte(0x03);
407
                                        break;
408
                                case 38:
409
                                        i2c_start();
410
                                        break;
411
                                case 39:
412
                                        i2c_write_byte(0xE1);
413
                                        break;                 
414
                                case 40:
415
                                        i2c_write_byte(UltrasonicRangeLow);
416
                                        break;                 
417
                                case 41:
418
                                        UltrasonicRange += TWDR;               
419
                                        UltrasonicRangeLow = TWDR;             
420
                                        i2c_stop();
421
                                        I2CTimeout = 22;
422
                                        twi_state = 0;
423
                                        break;         
838 MikeW 424
    }
425
#endif
839 MikeW 426
        TWCR |= 0x80;
838 MikeW 427
 }