Subversion Repositories FlightCtrl

Rev

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

Rev 819 Rev 823
Line 1... Line 1...
1
// ######################## SPI - FlightCtrl ###################
1
// ######################## SPI - FlightCtrl ###################
2
#include "main.h"
2
#include "main.h"
Line 3... Line 3...
3
 
3
 
4
 
4
 
5
struct str_ToNaviCtrl_Version   ToNaviCtrl_Version;
5
//struct str_ToNaviCtrl_Version   ToNaviCtrl_Version;
6
struct str_FromNaviCtrl_Version   FromNaviCtrl_Version;
6
//struct str_FromNaviCtrl_Version   FromNaviCtrl_Version;
Line 7... Line 7...
7
struct str_ToNaviCtrl_Value   ToNaviCtrl_Value;
7
struct str_ToNaviCtrl   ToNaviCtrl;
8
struct str_FromNaviCtrl_Value   FromNaviCtrl_Value;
8
struct str_FromNaviCtrl   FromNaviCtrl;
Line 9... Line 9...
9
 
9
 
10
unsigned char              SPI_BufferIndex;
10
unsigned char              SPI_BufferIndex;
Line 11... Line 11...
11
unsigned char              SPI_RxBufferIndex;
11
unsigned char              SPI_RxBufferIndex;
12
 
12
 
Line -... Line 13...
-
 
13
volatile unsigned char     SPI_Buffer[sizeof(FromNaviCtrl) + 8];
-
 
14
unsigned char *SPI_TX_Buffer;
-
 
15
 
13
volatile unsigned char     SPI_Buffer[sizeof(FromNaviCtrl_Value) + 8];
16
unsigned char SPITransferCompleted, SPI_ChkSum;
Line 14... Line 17...
14
unsigned char *SPI_TX_Buffer, *ToNaviCtrl_Chksum;
17
unsigned char SPI_RxDataValid;
15
 
18
 
16
unsigned char SPITransferCompleted, SPI_ChkSum;
19
unsigned char SPI_CommandSequence[] = { SPI_CMD_USER, SPI_CMD_STICK, SPI_CMD_USER, SPI_CMD_STICK, SPI_CMD_CAL_COMPASS };
Line 30... Line 33...
30
  SLAVE_SELECT_PORT |=  (1 << SPI_SLAVE_SELECT);
33
  SLAVE_SELECT_PORT |=  (1 << SPI_SLAVE_SELECT);
31
  SPITransferCompleted = 1;
34
  SPITransferCompleted = 1;
Line 32... Line 35...
32
 
35
 
Line 33... Line 36...
33
  //SPDR = 0x00;  // dummy write
36
  //SPDR = 0x00;  // dummy write
34
 
37
 
Line 35... Line 38...
35
  ToNaviCtrl_Value.Sync1 = 0xAA;
38
  ToNaviCtrl.Sync1 = 0xAA;
36
  ToNaviCtrl_Value.Sync2 = 0x83;
39
  ToNaviCtrl.Sync2 = 0x83;
37
 
40
 
38
  ToNaviCtrl_Value.Command = SPI_CMD_VALUE;
-
 
39
  ToNaviCtrl_Value.IntegralNick = 0;
-
 
40
  ToNaviCtrl_Value.IntegralRoll = 0;
-
 
41
  ToNaviCtrl_Value.StickNick = 0;
-
 
42
  ToNaviCtrl_Value.StickRoll = 0;//(char) StickRoll;
41
  ToNaviCtrl.Command = SPI_CMD_USER;
43
  ToNaviCtrl_Value.StickGier = 0;//(char) StickGier;
42
  ToNaviCtrl.IntegralNick = 0;
Line 44... Line 43...
44
  ToNaviCtrl_Value.CalState = 0;
43
  ToNaviCtrl.IntegralRoll = 0;
45
  SPI_RxDataValid = 0;
44
  SPI_RxDataValid = 0;
46
}
45
}
47
 
46
 
48
//------------------------------------------------------
47
//------------------------------------------------------
49
void SPI_StartTransmitPacket(unsigned char command)
48
void SPI_StartTransmitPacket(void)
Line 50... Line 49...
50
{
49
{
-
 
50
   //if ((SLAVE_SELECT_PORT & (1 << SPI_SLAVE_SELECT)) == 0) return;    // transfer of prev. packet not completed
Line 51... Line -...
51
   //if ((SLAVE_SELECT_PORT & (1 << SPI_SLAVE_SELECT)) == 0) return;    // transfer of prev. packet not completed
-
 
52
   if (!SPITransferCompleted) return;
-
 
53
//   _delay_us(30); 
-
 
54
   
51
   if (!SPITransferCompleted) return;
55
   SLAVE_SELECT_PORT &=  ~(1 << SPI_SLAVE_SELECT);  // SelectSlave
-
 
56
   
-
 
57
   switch(command)
52
//   _delay_us(30); 
58
   {
-
 
59
     case SPI_CMD_VERSION: SPI_TX_Buffer  = (unsigned char *) &ToNaviCtrl_Version;
-
 
60
                                                   ToNaviCtrl_Chksum = (unsigned char *) &ToNaviCtrl_Version.Chksum;
-
 
61
            break;       
-
 
62
       
-
 
Line 63... Line 53...
63
         case SPI_CMD_VALUE: SPI_TX_Buffer = (unsigned char *) &ToNaviCtrl_Value;
53
   
64
                             ToNaviCtrl_Chksum = (unsigned char *) &ToNaviCtrl_Value.Chksum;
54
   SLAVE_SELECT_PORT &=  ~(1 << SPI_SLAVE_SELECT);  // SelectSlave
-
 
55
   SPI_TX_Buffer = (unsigned char *) &ToNaviCtrl;
65
            break;
56
   
66
 
57
   ToNaviCtrl.Command = SPI_CommandSequence[SPI_CommandCounter++];
67
   }
58
   if (SPI_CommandCounter >= sizeof(SPI_CommandSequence)) SPI_CommandCounter = 0;
68
   
59
   
69
   
60
   SPITransferCompleted = 0;
70
   SPITransferCompleted = 0;
61
   UpdateSPI_Buffer();                              // update buffer
71
   UpdateSPI_Buffer();                              // update buffer
62
 
-
 
63
   SPI_BufferIndex = 1;
72
   SPI_BufferIndex = 1;
64
  //ebugOut.Analog[16]++; 
73
  //ebugOut.Analog[16]++; 
-
 
74
   // -- Debug-Output ---
65
   // -- Debug-Output ---
Line 75... Line 66...
75
   //----
66
   //----
Line 76... Line 67...
76
   asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
67
   asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
Line 116... Line 107...
116
           break;      
107
           break;      
Line 117... Line 108...
117
           
108
           
118
   case 2:
109
   case 2:
119
                   SPI_Buffer[SPI_RxBufferIndex++]= rxdata;             // get data
110
                   SPI_Buffer[SPI_RxBufferIndex++]= rxdata;             // get data
120
           //DebugOut.Analog[19]++;
111
           //DebugOut.Analog[19]++;
121
           if (SPI_RxBufferIndex >= sizeof(FromNaviCtrl_Value))
112
           if (SPI_RxBufferIndex >= sizeof(FromNaviCtrl))
Line 122... Line 113...
122
                   {  
113
                   {  
123
                         
114
                         
124
                if (rxdata == rxchksum)
115
                if (rxdata == rxchksum)
Line 125... Line 116...
125
                        {
116
                        {
Line 126... Line 117...
126
                  unsigned char *ptr = (unsigned char *)&FromNaviCtrl_Value;
117
                  unsigned char *ptr = (unsigned char *)&FromNaviCtrl;
127
     
118
     
Line 136... Line 127...
136
                  else rxchksum += rxdata;
127
                  else rxchksum += rxdata;
137
        break;   
128
        break;   
Line 138... Line 129...
138
         
129
         
Line 139... Line 130...
139
  }            
130
  }            
140
 
131
 
141
   if (SPI_BufferIndex < sizeof(ToNaviCtrl_Value))  
132
   if (SPI_BufferIndex < sizeof(ToNaviCtrl))  
142
     {
133
     {
143
           SLAVE_SELECT_PORT &=  ~(1 << SPI_SLAVE_SELECT);  // SelectSlave
134
           SLAVE_SELECT_PORT &=  ~(1 << SPI_SLAVE_SELECT);  // SelectSlave
144
           asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
135
           asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
Line 145... Line 136...
145
           asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
136
           asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
146
           asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
137
           asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");         asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop");
147
           
138
           
Line 148... Line 139...
148
           SPDR = SPI_TX_Buffer[SPI_BufferIndex];
139
           SPDR = SPI_TX_Buffer[SPI_BufferIndex];
149
           *ToNaviCtrl_Chksum += SPI_TX_Buffer[SPI_BufferIndex];
140
           ToNaviCtrl.Chksum += SPI_TX_Buffer[SPI_BufferIndex];
Line 159... Line 150...
159
//------------------------------------------------------
150
//------------------------------------------------------
160
void UpdateSPI_Buffer(void)
151
void UpdateSPI_Buffer(void)
161
{
152
{
162
  static unsigned char i =0;
153
  static unsigned char i =0;
163
  cli();
154
  cli();
164
  ToNaviCtrl_Value.Command = SPI_CMD_VALUE;
-
 
-
 
155
 
165
  ToNaviCtrl_Value.IntegralNick = (int) (IntegralNick / 1024);
156
  ToNaviCtrl.IntegralNick = (int) (IntegralNick / 1024);
166
  ToNaviCtrl_Value.IntegralRoll = (int) (IntegralRoll / 1024);
157
  ToNaviCtrl.IntegralRoll = (int) (IntegralRoll / 1024);
167
  ToNaviCtrl_Value.StickNick = (char) PPM_in[EE_Parameter.Kanalbelegung[K_NICK]];
-
 
168
  ToNaviCtrl_Value.StickRoll = (char) PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]];
-
 
169
  ToNaviCtrl_Value.StickGier = (char) PPM_in[EE_Parameter.Kanalbelegung[K_GIER]];
-
 
170
  ToNaviCtrl_Value.GyroCompass = ErsatzKompass / GIER_GRAD_FAKTOR;
158
  ToNaviCtrl.GyroCompass = ErsatzKompass / GIER_GRAD_FAKTOR;
171
  ToNaviCtrl_Value.AccNick = (int) ACC_AMPLIFY * (NaviAccNick / NaviCntAcc);
159
  ToNaviCtrl.AccNick = (int) ACC_AMPLIFY * (NaviAccNick / NaviCntAcc);
172
  ToNaviCtrl_Value.AccRoll = (int) ACC_AMPLIFY * (Mittelwert_AccRoll / NaviCntAcc);
160
  ToNaviCtrl.AccRoll = (int) ACC_AMPLIFY * (Mittelwert_AccRoll / NaviCntAcc);
173
  NaviCntAcc = 0; NaviAccNick = 0; NaviAccRoll = 0;
161
  NaviCntAcc = 0; NaviAccNick = 0; NaviAccRoll = 0;
174
  ToNaviCtrl_Value.User1 = Parameter_UserParam1;
162
//  ToNaviCtrl.User8 = Parameter_UserParam8;
-
 
163
//  ToNaviCtrl.CalState = WinkelOut.CalcState;
-
 
164
 
-
 
165
   switch(ToNaviCtrl.Command)  // 
-
 
166
   {
-
 
167
         case SPI_CMD_USER:
175
  ToNaviCtrl_Value.User2 = Parameter_UserParam2;
168
                                ToNaviCtrl.Param.Byte[0] = Parameter_UserParam1;
176
  ToNaviCtrl_Value.User3 = Parameter_UserParam3;
169
                                ToNaviCtrl.Param.Byte[1] = Parameter_UserParam2;
177
  ToNaviCtrl_Value.User4 = Parameter_UserParam4;
170
                                ToNaviCtrl.Param.Byte[2] = Parameter_UserParam3;
178
  ToNaviCtrl_Value.User5 = Parameter_UserParam5;
171
                                ToNaviCtrl.Param.Byte[3] = Parameter_UserParam4;
179
  ToNaviCtrl_Value.User6 = Parameter_UserParam6;
172
                                ToNaviCtrl.Param.Byte[4] = Parameter_UserParam5;
180
  ToNaviCtrl_Value.User7 = Parameter_UserParam7;
173
                                ToNaviCtrl.Param.Byte[5] = Parameter_UserParam6;
181
//  ToNaviCtrl_Value.User8 = Parameter_UserParam8;
174
                                ToNaviCtrl.Param.Byte[6] = Parameter_UserParam7;
-
 
175
            break;
-
 
176
 
-
 
177
         case SPI_CMD_STICK:
-
 
178
                                ToNaviCtrl.Param.Byte[0] = (char) PPM_in[EE_Parameter.Kanalbelegung[K_GAS]];
-
 
179
                                ToNaviCtrl.Param.Byte[1] = (char) PPM_in[EE_Parameter.Kanalbelegung[K_GIER]];
-
 
180
                                ToNaviCtrl.Param.Byte[2] = (char) PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]];
-
 
181
                    ToNaviCtrl.Param.Byte[3] = (char) PPM_in[EE_Parameter.Kanalbelegung[K_NICK]];
-
 
182
                                ToNaviCtrl.Param.Byte[4] = (char) PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]];
-
 
183
                                ToNaviCtrl.Param.Byte[5] = (char) PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]];
-
 
184
                                ToNaviCtrl.Param.Byte[6] = (char) PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]];
-
 
185
                    ToNaviCtrl.Param.Byte[7] = (char) PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]];
-
 
186
 
-
 
187
            break;
-
 
188
         case SPI_CMD_CAL_COMPASS:
182
  ToNaviCtrl_Value.CalState = WinkelOut.CalcState;
189
                                ToNaviCtrl.Param.Byte[0] = WinkelOut.CalcState;
-
 
190
            break;
-
 
191
   }
-
 
192
 
-
 
193
 
183
  sei();
194
  sei();
Line -... Line 195...
-
 
195
 
-
 
196
 
184
 
197
 
185
  if (SPI_RxDataValid)
198
  if (SPI_RxDataValid)
186
  {
199
  {
187
    GPS_Nick = FromNaviCtrl_Value.GPS_Nick;
200
    GPS_Nick = FromNaviCtrl.GPS_Nick;
188
    GPS_Roll = FromNaviCtrl_Value.GPS_Roll;
201
    GPS_Roll = FromNaviCtrl.GPS_Roll;
189
    KompassValue = FromNaviCtrl_Value.CompassValue;
202
    KompassValue = FromNaviCtrl.CompassValue;
Line 190... Line 203...
190
    KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180;
203
    KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180;
-
 
204
 
-
 
205
    if (FromNaviCtrl.BeepTime > beeptime) beeptime = FromNaviCtrl.BeepTime;
-
 
206
       
-
 
207
          switch (FromNaviCtrl.Command)
-
 
208
          {
-
 
209
            case  SPI_CMD_OSD_DATA:
-
 
210
//                                ToFlightCtrl.Param.Byte[0] = OsdBar;
-
 
211
//                                ToFlightCtrl.Param.Int[1]  = Distance;
-
 
212
                  break;
-
 
213
 
-
 
214
            case  SPI_CMD_GPS_POS:
-
 
215
//                                ToFlightCtrl.Param.Long[0]  = GPS_Data.Longitude;
-
 
216
//                                ToFlightCtrl.Param.Long[1]  = GPS_Data.Latitude;
-
 
217
                  break;
-
 
218
 
-
 
219
            case  SPI_CMD_GPS_TARGET:
-
 
220
//                                ToFlightCtrl.Param.Long[0]  = GPS_Data.TargetLongitude;
-
 
221
//                                ToFlightCtrl.Param.Long[1]  = GPS_Data.TargetLatitude;
-
 
222
                  break;
-
 
223
 
-
 
224
                default:
191
 
225
                  break;
192
    if (FromNaviCtrl_Value.BeepTime > beeptime) beeptime = FromNaviCtrl_Value.BeepTime;
226
          }
193
  }
227
  }
194
  else
228
  else
195
  {
229
  {