Subversion Repositories FlightCtrl

Rev

Rev 1805 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1805 Rev 1821
Line 124... Line 124...
124
#define SPI_TXSYNCBYTE2 0x83
124
#define SPI_TXSYNCBYTE2 0x83
125
#define SPI_RXSYNCBYTE1 0x81
125
#define SPI_RXSYNCBYTE1 0x81
126
#define SPI_RXSYNCBYTE2 0x55
126
#define SPI_RXSYNCBYTE2 0x55
Line 127... Line 127...
127
 
127
 
128
typedef enum {
-
 
129
  SPI_SYNC1,
128
typedef enum {
130
  SPI_SYNC2,
-
 
131
  SPI_DATA
129
        SPI_SYNC1, SPI_SYNC2, SPI_DATA
Line 132... Line 130...
132
} SPI_RXState_t;
130
} SPI_RXState_t;
133
 
131
 
134
// data exchange packets to and From NaviCtrl
132
// data exchange packets to and From NaviCtrl
135
ToNaviCtrl_t                    toNaviCtrl;
133
ToNaviCtrl_t toNaviCtrl;
Line 136... Line -...
136
FromNaviCtrl_t                  fromNaviCtrl;
-
 
137
SPI_VersionInfo_t               SPI_VersionInfo;
134
FromNaviCtrl_t fromNaviCtrl;
138
 
135
SPI_VersionInfo_t SPI_VersionInfo;
139
 
136
 
140
// rx packet buffer
137
// rx packet buffer
141
#define SPI_RXBUFFER_LEN sizeof(fromNaviCtrl)
138
#define SPI_RXBUFFER_LEN sizeof(fromNaviCtrl)
Line 151... Line 148...
151
uint8_t SPITransferCompleted, SPI_ChkSum;
148
uint8_t SPITransferCompleted, SPI_ChkSum;
152
uint8_t SPI_RxDataValid = 0;
149
uint8_t SPI_RxDataValid = 0;
153
uint8_t NCDataOkay = 0;
150
uint8_t NCDataOkay = 0;
154
uint8_t NCSerialDataOkay = 0;
151
uint8_t NCSerialDataOkay = 0;
Line -... Line 152...
-
 
152
 
155
 
153
uint8_t SPI_CommandSequence[] = { SPI_CMD_USER, SPI_CMD_STICK,
156
uint8_t SPI_CommandSequence[] = { SPI_CMD_USER, SPI_CMD_STICK, SPI_CMD_PARAMETER1, SPI_CMD_STICK, SPI_CMD_MISC, SPI_CMD_VERSION };
154
                SPI_CMD_PARAMETER1, SPI_CMD_STICK, SPI_CMD_MISC, SPI_CMD_VERSION };
Line 157... Line 155...
157
uint8_t SPI_CommandCounter = 0;
155
uint8_t SPI_CommandCounter = 0;
158
 
156
 
159
/*********************************************/
157
/*********************************************/
Line 192... Line 190...
192
/*  Update Data transferd by the SPI from/to NaviCtrl     */
190
/*  Update Data transferd by the SPI from/to NaviCtrl     */
193
/**********************************************************/
191
/**********************************************************/
194
void UpdateSPI_Buffer(void) {
192
void UpdateSPI_Buffer(void) {
195
  uint8_t i;
193
        uint8_t i;
196
  int16_t tmp;
194
        int16_t tmp;
-
 
195
        cli();
197
  cli(); // stop all interrupts to avoid writing of new data during update of that packet.
196
        // stop all interrupts to avoid writing of new data during update of that packet.
Line 198... Line 197...
198
 
197
 
-
 
198
        // update content of packet to NaviCtrl
199
  // update content of packet to NaviCtrl
199
        toNaviCtrl.IntegralPitch = (int16_t) ((10 * angle[PITCH])
-
 
200
                        / GYRO_DEG_FACTOR_PITCHROLL); // convert to multiple of 0.1°
200
  toNaviCtrl.IntegralPitch = (int16_t)((10 * angle[PITCH]) / GYRO_DEG_FACTOR_PITCHROLL); // convert to multiple of 0.1°
201
        toNaviCtrl.IntegralRoll = (int16_t) ((10 * angle[ROLL])
-
 
202
                        / GYRO_DEG_FACTOR_PITCHROLL); // convert to multiple of 0.1°
201
  toNaviCtrl.IntegralRoll  = (int16_t)((10 * angle[ROLL]) / GYRO_DEG_FACTOR_PITCHROLL);  // convert to multiple of 0.1°
203
        toNaviCtrl.GyroHeading = (int16_t) ((10 * yawGyroHeading)
202
  toNaviCtrl.GyroHeading   = (int16_t)((10 * yawGyroHeading)   / GYRO_DEG_FACTOR_YAW);   // convert to multiple of 0.1°
204
                        / GYRO_DEG_FACTOR_YAW); // convert to multiple of 0.1°
203
  toNaviCtrl.GyroPitch = rate_ATT[PITCH];
205
        toNaviCtrl.GyroPitch = rate_ATT[PITCH];
204
  toNaviCtrl.GyroRoll = rate_ATT[ROLL];
206
        toNaviCtrl.GyroRoll = rate_ATT[ROLL];
-
 
207
        toNaviCtrl.GyroYaw = yawRate;
205
  toNaviCtrl.GyroYaw  = yawRate;
208
        toNaviCtrl.AccPitch = (10 * getAngleEstimateFromAcc(PITCH))
-
 
209
                        / GYRO_DEG_FACTOR_PITCHROLL; // convert to multiple of 0.1°
206
  toNaviCtrl.AccPitch = (10 * getAngleEstimateFromAcc(PITCH)) / GYRO_DEG_FACTOR_PITCHROLL; // convert to multiple of 0.1°
210
        toNaviCtrl.AccRoll = (10 * getAngleEstimateFromAcc(ROLL))
Line 207... Line 211...
207
  toNaviCtrl.AccRoll  = (10 * getAngleEstimateFromAcc(ROLL))  / GYRO_DEG_FACTOR_PITCHROLL; // convert to multiple of 0.1°
211
                        / GYRO_DEG_FACTOR_PITCHROLL; // convert to multiple of 0.1°
Line 208... Line 212...
208
 
212
 
Line 237... Line 241...
237
    toNaviCtrl.Param.Byte[10] = staticParams.NaviSpeedCompensation;
241
                toNaviCtrl.Param.Byte[10] = staticParams.NaviSpeedCompensation;
238
    toNaviCtrl.Param.Byte[11] = staticParams.NaviAngleLimitation;
242
                toNaviCtrl.Param.Byte[11] = staticParams.NaviAngleLimitation;
239
    break;
243
                break;
Line 240... Line 244...
240
   
244
 
241
  case SPI_CMD_STICK:
245
        case SPI_CMD_STICK:
-
 
246
                tmp = PPM_in[staticParams.ChannelAssignment[CH_THROTTLE]];
-
 
247
                if (tmp > 127)
-
 
248
                        tmp = 127;
-
 
249
                else if (tmp < -128)
242
    tmp = PPM_in[staticParams.ChannelAssignment[CH_THROTTLE]];  if(tmp > 127) tmp = 127; else if(tmp < -128) tmp = -128;
250
                        tmp = -128;
243
    toNaviCtrl.Param.Byte[0] = (int8_t) tmp;
251
                toNaviCtrl.Param.Byte[0] = (int8_t) tmp;
-
 
252
                tmp = PPM_in[staticParams.ChannelAssignment[CH_YAW]];
-
 
253
                if (tmp > 127)
-
 
254
                        tmp = 127;
-
 
255
                else if (tmp < -128)
244
    tmp = PPM_in[staticParams.ChannelAssignment[CH_YAW]]; if(tmp > 127) tmp = 127; else if(tmp < -128) tmp = -128;
256
                        tmp = -128;
245
    toNaviCtrl.Param.Byte[1] = (int8_t) tmp;
257
                toNaviCtrl.Param.Byte[1] = (int8_t) tmp;
-
 
258
                tmp = PPM_in[staticParams.ChannelAssignment[CH_ROLL]];
-
 
259
                if (tmp > 127)
-
 
260
                        tmp = 127;
-
 
261
                else if (tmp < -128)
246
    tmp = PPM_in[staticParams.ChannelAssignment[CH_ROLL]]; if(tmp > 127) tmp = 127; else if(tmp < -128) tmp = -128;
262
                        tmp = -128;
247
    toNaviCtrl.Param.Byte[2] = (int8_t) tmp;
263
                toNaviCtrl.Param.Byte[2] = (int8_t) tmp;
-
 
264
                tmp = PPM_in[staticParams.ChannelAssignment[CH_PITCH]];
-
 
265
                if (tmp > 127)
-
 
266
                        tmp = 127;
-
 
267
                else if (tmp < -128)
248
    tmp = PPM_in[staticParams.ChannelAssignment[CH_PITCH]]; if(tmp > 127) tmp = 127; else if(tmp < -128) tmp = -128;
268
                        tmp = -128;
249
    toNaviCtrl.Param.Byte[3] = (int8_t) tmp;
269
                toNaviCtrl.Param.Byte[3] = (int8_t) tmp;
250
    toNaviCtrl.Param.Byte[4] = (uint8_t) variables[0];
270
                toNaviCtrl.Param.Byte[4] = (uint8_t) variables[0];
251
    toNaviCtrl.Param.Byte[5] = (uint8_t) variables[1];
271
                toNaviCtrl.Param.Byte[5] = (uint8_t) variables[1];
252
    toNaviCtrl.Param.Byte[6] = (uint8_t) variables[2];
272
                toNaviCtrl.Param.Byte[6] = (uint8_t) variables[2];
Line 276... Line 296...
276
    break;
296
                break;
277
  default:
297
        default:
278
    break;
298
                break;
279
  }
299
        }
Line -... Line 300...
-
 
300
 
280
 
301
        sei();
Line 281... Line 302...
281
  sei(); // enable all interrupts
302
        // enable all interrupts
282
 
303
 
283
  // analyze content of packet from NaviCtrl if valid
304
        // analyze content of packet from NaviCtrl if valid
284
  if (SPI_RxDataValid) {
305
        if (SPI_RxDataValid) {
-
 
306
                // update gps controls
285
    // update gps controls
307
                if (abs(fromNaviCtrl.GPSStickPitch) < 512 && abs(fromNaviCtrl.GPSStickRoll)
286
    if(abs(fromNaviCtrl.GPSStickPitch) < 512 && abs(fromNaviCtrl.GPSStickRoll) < 512 && (staticParams.GlobalConfig & CFG_GPS_ACTIVE)) {
308
                                < 512 && (staticParams.GlobalConfig & CFG_GPS_ACTIVE)) {
287
      GPSStickPitch     = fromNaviCtrl.GPSStickPitch;
309
                        GPSStickPitch = fromNaviCtrl.GPSStickPitch;
288
      GPSStickRoll      = fromNaviCtrl.GPSStickRoll;
310
                        GPSStickRoll = fromNaviCtrl.GPSStickRoll;
289
      NCDataOkay = 250;
311
                        NCDataOkay = 250;
Line 293... Line 315...
293
      compassHeading = fromNaviCtrl.CompassHeading;
315
                        compassHeading = fromNaviCtrl.CompassHeading;
294
    }
316
                }
295
    //if(compassHeading < 0) compassOffCourse = 0;
317
                //if(compassHeading < 0) compassOffCourse = 0;
296
    //else compassOffCourse = ((540 + compassHeading - compassCourse) % 360) - 180;
318
                //else compassOffCourse = ((540 + compassHeading - compassCourse) % 360) - 180;
297
    // NaviCtrl wants to beep?
319
                // NaviCtrl wants to beep?
298
    if (fromNaviCtrl.BeepTime > BeepTime && !compassCalState) BeepTime = fromNaviCtrl.BeepTime;
320
                if (fromNaviCtrl.BeepTime > BeepTime && !compassCalState)
-
 
321
                        BeepTime = fromNaviCtrl.BeepTime;
Line 299... Line 322...
299
   
322
 
300
    switch (fromNaviCtrl.Command) {
323
                switch (fromNaviCtrl.Command) {
301
    case SPI_KALMAN:
324
                case SPI_KALMAN:
302
      dynamicParams.KalmanK             = fromNaviCtrl.Param.Byte[0];
325
                        dynamicParams.KalmanK = fromNaviCtrl.Param.Byte[0];
Line 317... Line 340...
317
 
340
 
318
/*********************************************/
341
/*********************************************/
319
/*  Start Transmission of packet to NaviCtrl */
342
/*  Start Transmission of packet to NaviCtrl */
320
/*********************************************/
343
/*********************************************/
-
 
344
void SPI_StartTransmitPacket(void) {
321
void SPI_StartTransmitPacket(void){
345
        if (!SPITransferCompleted)
322
  if (!SPITransferCompleted) return; // return immediately if transfer is in progress
346
                return; // return immediately if transfer is in progress
323
  else // transmission was completed
347
        else // transmission was completed
324
    {
348
        {
Line 325... Line 349...
325
      SLAVE_SELECT_PORT &=  ~(1 << SPI_SLAVE_SELECT);  // Select slave
349
                SLAVE_SELECT_PORT &= ~(1 << SPI_SLAVE_SELECT); // Select slave
326
     
350
 
327
      // cyclic commands
351
                // cyclic commands
-
 
352
                toNaviCtrl.Command = SPI_CommandSequence[SPI_CommandCounter++];
Line 328... Line 353...
328
      toNaviCtrl.Command = SPI_CommandSequence[SPI_CommandCounter++];
353
                if (SPI_CommandCounter >= sizeof(SPI_CommandSequence))
329
      if (SPI_CommandCounter >= sizeof(SPI_CommandSequence)) SPI_CommandCounter = 0;
354
                        SPI_CommandCounter = 0;
Line 330... Line 355...
330
     
355
 
Line 331... Line 356...
331
      SPITransferCompleted = 0; // transfer is in progress
356
                SPITransferCompleted = 0; // transfer is in progress
332
      UpdateSPI_Buffer();    // update data in toNaviCtrl
357
                UpdateSPI_Buffer(); // update data in toNaviCtrl
-
 
358
 
-
 
359
                SPI_TxBufferIndex = 1; //proceed with 2nd byte
-
 
360
 
-
 
361
                // -- Debug-Output ---
-
 
362
                //----
-
 
363
                asm volatile ("nop");
-
 
364
                asm volatile ("nop");
-
 
365
                asm volatile ("nop");
-
 
366
                asm volatile ("nop");
333
     
367
                asm volatile ("nop");
-
 
368
                asm volatile ("nop");
-
 
369
                asm volatile ("nop");
-
 
370
                asm volatile ("nop");
-
 
371
                asm volatile ("nop");
-
 
372
                asm volatile ("nop");
-
 
373
                asm volatile ("nop");
-
 
374
                asm volatile ("nop");
-
 
375
                asm volatile ("nop");
-
 
376
                asm volatile ("nop");
-
 
377
                asm volatile ("nop");
-
 
378
                asm volatile ("nop");
334
      SPI_TxBufferIndex = 1; //proceed with 2nd byte
379
                asm volatile ("nop");
-
 
380
                asm volatile ("nop");
335
     
381
                asm volatile ("nop");
336
      // -- Debug-Output ---
382
                asm volatile ("nop");
337
      //----
383
                asm volatile ("nop");
338
      asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");      asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
384
                asm volatile ("nop");
339
      asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");      asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
385
                asm volatile ("nop");
Line 351... Line 397...
351
void SPI_TransmitByte(void) {
397
void SPI_TransmitByte(void) {
352
  static SPI_RXState_t SPI_RXState = SPI_SYNC1;
398
        static SPI_RXState_t SPI_RXState = SPI_SYNC1;
353
  uint8_t rxdata;
399
        uint8_t rxdata;
354
  static uint8_t rxchksum;
400
        static uint8_t rxchksum;
Line -... Line 401...
-
 
401
 
355
 
402
        if (SPITransferCompleted)
-
 
403
                return; // return immediatly if transfer was completed
356
  if (SPITransferCompleted) return;  // return immediatly if transfer was completed
404
        if (!(SPSR & (1 << SPIF)))
357
  if (!(SPSR & (1 << SPIF))) return; // return if no SPI-IRQ pending
405
                return; // return if no SPI-IRQ pending
Line 358... Line 406...
358
  SendSPI = 4; // mait 4 * 0.102 ms for the next call of SPI_TransmitByte() in the main loop
406
        SendSPI = 4; // mait 4 * 0.102 ms for the next call of SPI_TransmitByte() in the main loop
Line 359... Line 407...
359
 
407
 
Line 360... Line 408...
360
  SLAVE_SELECT_PORT |=  (1 << SPI_SLAVE_SELECT);   // DeselectSlave
408
        SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave
361
 
409
 
362
  rxdata = SPDR; // save spi data register
410
        rxdata = SPDR; // save spi data register
363
 
411
 
364
  switch (SPI_RXState) {
412
        switch (SPI_RXState) {
365
  case SPI_SYNC1: // first sync byte
-
 
366
    SPI_RxBufferIndex = 0; // set pointer to start of rx buffer
413
        case SPI_SYNC1: // first sync byte
367
    rxchksum = rxdata; // initialize checksum
414
                SPI_RxBufferIndex = 0; // set pointer to start of rx buffer
368
    if (rxdata == SPI_RXSYNCBYTE1 )
415
                rxchksum = rxdata; // initialize checksum
Line 369... Line 416...
369
      { // 1st Syncbyte found
416
                if (rxdata == SPI_RXSYNCBYTE1) { // 1st Syncbyte found
370
        SPI_RXState  = SPI_SYNC2; // trigger to state for second sync byte
417
                        SPI_RXState = SPI_SYNC2; // trigger to state for second sync byte
371
      }
-
 
372
    break;
418
                }
373
   
419
                break;
374
  case SPI_SYNC2: // second sync byte
-
 
375
    if (rxdata == SPI_RXSYNCBYTE2)
420
 
376
      { // 2nd Syncbyte found
421
        case SPI_SYNC2: // second sync byte
377
        rxchksum += rxdata; // update checksum
422
                if (rxdata == SPI_RXSYNCBYTE2) { // 2nd Syncbyte found
378
        SPI_RXState  = SPI_DATA;   // trigger to state for second sync byte
423
                        rxchksum += rxdata; // update checksum
379
      }
424
                        SPI_RXState = SPI_DATA; // trigger to state for second sync byte
Line 405... Line 450...
405
  }// eof switch(SPI_RXState)
450
        }// eof switch(SPI_RXState)
Line 406... Line 451...
406
 
451
 
407
  // if still some bytes left for transmission to NaviCtrl
452
        // if still some bytes left for transmission to NaviCtrl
408
  if (SPI_TxBufferIndex < SPI_TXBUFFER_LEN) {
453
        if (SPI_TxBufferIndex < SPI_TXBUFFER_LEN) {
-
 
454
                SLAVE_SELECT_PORT &= ~(1 << SPI_SLAVE_SELECT); // SelectSlave
-
 
455
                asm volatile ("nop");
-
 
456
                asm volatile ("nop");
-
 
457
                asm volatile ("nop");
-
 
458
                asm volatile ("nop");
-
 
459
                asm volatile ("nop");
-
 
460
                asm volatile ("nop");
409
      SLAVE_SELECT_PORT &=  ~(1 << SPI_SLAVE_SELECT);  // SelectSlave
461
                asm volatile ("nop");
-
 
462
                asm volatile ("nop");
-
 
463
                asm volatile ("nop");
-
 
464
                asm volatile ("nop");
-
 
465
                asm volatile ("nop");
-
 
466
                asm volatile ("nop");
-
 
467
                asm volatile ("nop");
-
 
468
                asm volatile ("nop");
-
 
469
                asm volatile ("nop");
-
 
470
                asm volatile ("nop");
-
 
471
                asm volatile ("nop");
-
 
472
                asm volatile ("nop");
-
 
473
                asm volatile ("nop");
-
 
474
                asm volatile ("nop");
410
      asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
475
                asm volatile ("nop");
411
      asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
476
                asm volatile ("nop");
-
 
477
                asm volatile ("nop");
Line 412... Line 478...
412
      asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");   asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
478
                asm volatile ("nop");
413
     
479
 
414
      SPDR = SPI_TxBuffer[SPI_TxBufferIndex]; // transmit byte
480
                SPDR = SPI_TxBuffer[SPI_TxBufferIndex]; // transmit byte
415
      toNaviCtrl.Chksum += SPI_TxBuffer[SPI_TxBufferIndex]; // update checksum for everey byte that was sent
481
                toNaviCtrl.Chksum += SPI_TxBuffer[SPI_TxBufferIndex]; // update checksum for everey byte that was sent