Subversion Repositories FlightCtrl

Rev

Rev 1479 | Rev 1639 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1479 Rev 1638
Line 90... Line 90...
90
{
90
{
91
   TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE);
91
   TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE);
92
}
92
}
Line 93... Line 93...
93
 
93
 
94
 
94
 
95
 
95
/*
96
//############################################################################
96
//############################################################################
97
SIGNAL (TWI_vect)
97
SIGNAL (TWI_vect)
98
//############################################################################
98
//############################################################################
Line 214... Line 214...
214
                i2c_stop();
214
                i2c_stop();
215
                I2CTimeout = 10;
215
                I2CTimeout = 10;
216
                twi_state = 0;
216
                twi_state = 0;
217
                break;
217
                break;
218
        default: twi_state = 0;
218
        default: twi_state = 0;
-
 
219
                break;
-
 
220
                }
-
 
221
 TWCR |= 0x80;
-
 
222
}
-
 
223
*/
-
 
224
 
-
 
225
/*
-
 
226
                if(DataArray[3] & 0x01) Parameter.PwmScaling            = DataArray[4];
-
 
227
                if(DataArray[3] & 0x02) Parameter.MaxStrom                      = DataArray[5];
-
 
228
                if(DataArray[3] & 0x04) Parameter.TemperaturLimiter = DataArray[6];
-
 
229
                if(DataArray[3] & 0x08) Parameter.SkaliereStrom         = DataArray[7];
-
 
230
                if(DataArray[3] & 0x10) Parameter.Bitconfig                     = DataArray[8];
-
 
231
*/
-
 
232
 
-
 
233
//############################################################################
-
 
234
SIGNAL (TWI_vect)
-
 
235
//############################################################################
-
 
236
{                           // 2    3   4   5   6   7   8  9
-
 
237
 unsigned char test[] = {0,0,'#',0x1F,255,30,100,64,0x00,7,8,9,10};
-
 
238
 static unsigned char missing_motor,send = 0,crc = 0;
-
 
239
     switch(twi_state++)
-
 
240
        {
-
 
241
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
242
// Writing the Data
-
 
243
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
244
        case 0:
-
 
245
                        while(Mixer.Motor[motor][0] <= 0 && motor < MAX_MOTORS) motor++;  // skip if not used
-
 
246
                                if(motor == MAX_MOTORS)  // writing finished -> now read
-
 
247
                                {
-
 
248
                                 motor = 0;
-
 
249
                                 twi_state = 4;
-
 
250
                                 i2c_write_byte(0x53+(motorread*2));
-
 
251
                                 }
-
 
252
                                else i2c_write_byte(0x52+(motor*2));
-
 
253
                                send = 0;
-
 
254
                break;
-
 
255
        case 1:
-
 
256
                i2c_write_byte(Motor[motor].SetPoint);
-
 
257
                if(!(Motor[motor].Version & MOTOR_STATE_NEW_PROTOCOL_MASK)) twi_state++;
-
 
258
                break;
-
 
259
        case 2:
-
 
260
                if(!send++)
-
 
261
                                 {
-
 
262
                                  i2c_write_byte((Motor[motor].SetPointLowerBits << 1));// + (7 << 0));
-
 
263
                                  crc = 0xAA;
-
 
264
                                 }
-
 
265
                                else
-
 
266
                if(send == 9) i2c_write_byte(crc);
-
 
267
                                else          
-
 
268
                                 {
-
 
269
                                  crc += test[send];
-
 
270
                                  i2c_write_byte(test[send]);
-
 
271
                                }
-
 
272
                if(!MotorenEin && motor == motorread  && !PC_MotortestActive && (Motor[motorread].Version & MOTOR_STATE_NEW_PROTOCOL_MASK)) if(send <= 10) twi_state--;
-
 
273
                break;
-
 
274
        case 3:
-
 
275
                        motor++;
-
 
276
                if(TWSR == 0x30)
-
 
277
                                 {
-
 
278
                                  if(!missing_motor) missing_motor = motor;
-
 
279
                                  if((Motor[motor-1].State & MOTOR_STATE_ERROR_MASK) < MOTOR_STATE_ERROR_MASK) Motor[motor-1].State++; // increment error counter and handle overflow
-
 
280
                                 }
-
 
281
                i2c_stop();
-
 
282
                I2CTimeout = 10;
-
 
283
                twi_state = 0;
-
 
284
                i2c_start();
-
 
285
                break;
-
 
286
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
287
// Reading Data
-
 
288
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
289
        case 4:
-
 
290
               //Transmit 1st byte for reading
-
 
291
                if(TWSR != 0x40)  // Error?
-
 
292
                 {
-
 
293
                  Motor[motorread].State &= ~MOTOR_STATE_PRESENT_MASK; // clear present bit
-
 
294
                  motorread++;
-
 
295
                  if(motorread >= MAX_MOTORS) motorread = 0;
-
 
296
                  i2c_stop();
-
 
297
                  twi_state = 0;
-
 
298
                 }
-
 
299
                 else
-
 
300
                 {
-
 
301
                  Motor[motorread].State |= MOTOR_STATE_PRESENT_MASK; // set present bit
-
 
302
                  I2C_ReceiveByte();
-
 
303
                 }
-
 
304
                MissingMotor = missing_motor;
-
 
305
                missing_motor = 0;
-
 
306
                break;
-
 
307
        case 5: //Read 1st byte and transmit 2nd Byte
-
 
308
                Motor[motorread].Current = TWDR;
-
 
309
                I2C_ReceiveByte(); //nack
-
 
310
                break;
-
 
311
        case 6:
-
 
312
                       //Read 2nd byte and transmit 3rd Byte
-
 
313
                Motor[motorread].MaxPWM = TWDR;
-
 
314
                                if(TWDR == 250)  
-
 
315
                                 {
-
 
316
                                  //if(!Motor[motor].SetPoint) 
-
 
317
                                  Motor[motorread].Version |= MOTOR_STATE_NEW_PROTOCOL_MASK;
-
 
318
                                 }
-
 
319
                                I2C_ReceiveLastByte(); //nack
-
 
320
                break;
-
 
321
        case 7: // read next 
-
 
322
                                if(TWDR == 255) { if(!MotorenEin) Motor[motorread].Version = 0; DebugOut.Analog[24]++;}
-
 
323
                                Motor[motorread].Temperature = TWDR;
-
 
324
                                motorread++; // next motor
-
 
325
                if(motorread >= MAX_MOTORS) { motorread = 0; }
-
 
326
                i2c_stop();
-
 
327
                twi_state = 0;
-
 
328
                break;
-
 
329
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
330
// writing Gyro-Offset
-
 
331
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
 
332
        case 18:
-
 
333
                i2c_write_byte(0x98); // Address of the DAC
-
 
334
                break;
-
 
335
        case 19:
-
 
336
                i2c_write_byte(0x10); // Update Channel A
-
 
337
                break;
-
 
338
        case 20:
-
 
339
                i2c_write_byte(AnalogOffsetNick); // Value
-
 
340
                break;
-
 
341
        case 21:
-
 
342
                i2c_write_byte(0x80); // Value
-
 
343
                break;
-
 
344
        case 22:
-
 
345
                i2c_stop();
-
 
346
                I2CTimeout = 10;
-
 
347
                i2c_start();
-
 
348
                break;
-
 
349
        case 23:
-
 
350
                i2c_write_byte(0x98); // Address of the DAC
-
 
351
                break;
-
 
352
        case 24:
-
 
353
                i2c_write_byte(0x12); // Update Channel B
-
 
354
                break;
-
 
355
        case 25:
-
 
356
                i2c_write_byte(AnalogOffsetRoll); // Value
-
 
357
                break;
-
 
358
        case 26:
-
 
359
                i2c_write_byte(0x80); // Value
-
 
360
                break;
-
 
361
        case 27:
-
 
362
                i2c_stop();
-
 
363
                I2CTimeout = 10;
-
 
364
                i2c_start();
-
 
365
                break;
-
 
366
        case 28:
-
 
367
                i2c_write_byte(0x98); // Address of the DAC
-
 
368
                break;
-
 
369
        case 29:
-
 
370
                i2c_write_byte(0x14); // Update Channel C
-
 
371
                break;
-
 
372
        case 30:
-
 
373
                i2c_write_byte(AnalogOffsetGier); // Value
-
 
374
                break;
-
 
375
        case 31:
-
 
376
                i2c_write_byte(0x80); // Value
-
 
377
                break;
-
 
378
        case 32:
-
 
379
                i2c_stop();
-
 
380
                I2CTimeout = 10;
-
 
381
                twi_state = 0;
-
 
382
                break;
-
 
383
        default: twi_state = 0;
219
                break;
384
                break;
220
                }
385
                }
221
 TWCR |= 0x80;
386
 TWCR |= 0x80;
222
}
387
}