Subversion Repositories NaviCtrl

Rev

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

Rev Author Line No. Line
1 ingob 1
/*#######################################################################################*/
2
/* !!! THIS IS NOT FREE SOFTWARE !!!                                                     */
3
/*#######################################################################################*/
4
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5
// + Copyright (c) 2008 Ingo Busker, Holger Buss
171 ingob 6
// + Nur für den privaten Gebrauch / NON-COMMERCIAL USE ONLY
1 ingob 7
// + FOR NON COMMERCIAL USE ONLY
8
// + www.MikroKopter.com
9
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
10
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), 
11
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist. 
12
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt 
13
// + bzgl. der Nutzungsbedingungen aufzunehmen. 
14
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen,
15
// + Verkauf von Luftbildaufnahmen, usw.
16
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
17
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, 
18
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen
19
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
20
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts
21
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de"
22
// + eindeutig als Ursprung verlinkt werden
23
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
24
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion
25
// + Benutzung auf eigene Gefahr
26
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden
27
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
171 ingob 28
// + Die Portierung oder Nutzung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur 
1 ingob 29
// + mit unserer Zustimmung zulässig
30
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
31
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen
32
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
33
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, 
34
// + this list of conditions and the following disclaimer.
35
// +   * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived
36
// +     from this software without specific prior written permission.
37
// +   * The use of this project (hardware, software, binary files, sources and documentation) is only permitted 
38
// +     for non-commercial use (directly or indirectly)
39
// +     Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted 
40
// +     with our written permission
41
// +   * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be 
42
// +     clearly linked as origin 
171 ingob 43
// +   * porting the sources to other systems or using the software on other systems (except hardware from www.mikrokopter.de) is not allowed
1 ingob 44
//
45
// +  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
46
// +  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
47
// +  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
48
// +  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
49
// +  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
50
// +  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
51
// +  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
52
// +  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
53
// +  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
54
// +  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
55
// +  POSSIBILITY OF SUCH DAMAGE. 
56
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
57
 
58
#include "main.h"
59
 
60
u8 DebugGetAnforderung = 0,DebugDisplayAnforderung = 0,DebugDataAnforderung = 0,GetVersionAnforderung = 0;
61
unsigned volatile char SioTmp = 0;
62
unsigned volatile char SendeBuffer[MAX_SENDE_BUFF];
63
unsigned volatile char RxdBuffer[MAX_EMPFANGS_BUFF];
64
unsigned volatile char NMEABuffer[MAX_EMPFANGS_BUFF];
65
unsigned volatile char NeuerDatensatzEmpfangen = 0;
66
unsigned volatile char NeueKoordinateEmpfangen = 0;
67
unsigned volatile char UebertragungAbgeschlossen = 1;
68
unsigned volatile char SendGPSPosAnforderung = 0;
69
unsigned volatile char CntCrcError = 0;
70
unsigned volatile char AnzahlEmpfangsBytes = 0;
71
unsigned volatile char PC_DebugTimeout = 0;
72
volatile unsigned char DebugTextAnforderung = 255;
73
unsigned char NurKanalAnforderung = 0;
74
 
75
UART_TypeDef *DebugUART = UART1;    
76
 
77
unsigned char RemotePollDisplayLine = 0;
78
u8 PcZugriff = 100;
79
u8 MotorTest[4] = {0,0,0,0};
80
u8 MeineSlaveAdresse;
81
volatile struct str_DebugOut    DebugOut;
82
struct str_ExternControl  ExternControl;
83
struct str_GPSPosition  GPS_Position;
84
struct str_VersionInfo VersionInfo;
85
struct str_PCTargetGPSPosition PCTargetGPSPosition;
86
s32 Debug_Timer;
87
static u16 ptr = 0;
88
unsigned char ConfirmFrame;
89
 
90
#define FIFO_TX_LEVEL  2
91
 
92
UART_InitTypeDef UART_InitStructure;
93
 
94
const unsigned char ANALOG_TEXT[32][16] =
95
{
96
   //1234567890123456 
97
    "WinkelNick      ", //0
98
    "WinkelRoll      ",
99
    "AccNick         ",
100
    "AccRoll         ",
101
    "AN4             ",
102
    "AN5             ", //5
103
    "GPS-Data Counter",
104
    "7               ",
105
    "8               ",
106
    "9               ",
107
    "10              ", //10
108
    "Poti1           ",
109
    "SPI Error       ",
110
    "SPI Okay        ",
111
    "Poti2           ",
112
    "Poti3           ", //15
113
    "I2C_ReadByte    ",
114
    "ACC_Speed_N     ",
115
    "ACC_Speed_E     ",
116
    "                ",
117
    "                ", //20
118
//    "Distance_N      ",
119
//    "Distance_E      ", //20
120
    "N_Speed         ",
121
    "E_Speed             ",
122
    "I_North         ",
123
    "I_East          ",
124
    "GyroKompass     ", //25
125
    "Heading         ",
126
//    "Distance2Target ",
127
//    "Direction2Target",
128
    "Distance N      ",
129
    "Distance E      ",
130
    "GPS_NICK        ",
131
    "GPS_ROLL        ", //30
132
    "Used_Sat        "
133
};
134
 
135
 
136
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
137
//++ Sende- und Empfangs-Part der Datenübertragung, incl. CRC-Auswertung
138
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
139
void UART1_IRQHandler(void)
140
{
141
 // ---------------------------- Receive ------------------------------------
142
 
143
 if((UART_GetITStatus(UART1, UART_IT_Receive) != RESET)|| (UART_GetITStatus(UART1, UART_IT_ReceiveTimeOut) != RESET) )
144
 {
145
  static u16 crc;
146
  static u8 crc1,crc2,buf_ptr;
147
  static u8 UartState = 0;
148
  u8 CrcOkay = 0;
149
 
150
  if (DebugUART != UART1)
151
  {
152
    while (UART_GetFlagStatus(UART1, UART_FLAG_RxFIFOEmpty) != SET)
153
          UART_SendData(DebugUART, UART_ReceiveData(UART1));
154
  }
155
  else
156
  while ((UART_GetFlagStatus(UART1, UART_FLAG_RxFIFOEmpty) != SET)&& (!NeuerDatensatzEmpfangen))
157
 {
158
 
159
     SioTmp = UART_ReceiveData(UART1);
160
 
161
 
162
  if(buf_ptr >= MAX_EMPFANGS_BUFF)    UartState = 0;
163
  if(SioTmp == '\r' && UartState == 2)
164
  {
165
   UartState = 0;
166
   crc -= RxdBuffer[buf_ptr-2];
167
   crc -= RxdBuffer[buf_ptr-1];
168
   crc %= 4096;
169
   crc1 = '=' + crc / 64;
170
   crc2 = '=' + crc % 64;
171
   CrcOkay = 0;
172
   if((crc1 == RxdBuffer[buf_ptr-2]) && (crc2 == RxdBuffer[buf_ptr-1])) CrcOkay = 1; else { CrcOkay = 0; CntCrcError++;};
173
   if(!NeuerDatensatzEmpfangen && CrcOkay) // Datensatz schon verarbeitet
174
    {
175
     NeuerDatensatzEmpfangen = 1;
176
 
177
//     GPIO_ToggleBit(GPIO6, GPIO_Pin_2); 
178
 
179
         AnzahlEmpfangsBytes = buf_ptr;
180
     RxdBuffer[buf_ptr] = '\r';
181
         if(RxdBuffer[2] == 'R')
182
         {
183
           PowerOff();
184
           VIC_DeInit();
185
           Execute_Bootloader(); // Reset-Commando - Bootloader starten
186
         }
187
        // while (UART_GetFlagStatus(UART1, UART_FLAG_RxFIFOEmpty) != SET) SioTmp = UART_ReceiveData(UART1); 
188
 
189
         //BearbeiteRxDaten();
190
         break;
191
        }                                
192
  }
193
  else
194
  switch(UartState)
195
  {
196
   case 0:
197
          if(SioTmp == '#' && !NeuerDatensatzEmpfangen) UartState = 1;  // Startzeichen und Daten schon verarbeitet
198
                  buf_ptr = 0;
199
                  RxdBuffer[buf_ptr++] = SioTmp;
200
                  crc = SioTmp;
201
          break;
202
   case 1: // Adresse auswerten
203
                  UartState++;
204
                  RxdBuffer[buf_ptr++] = SioTmp;
205
                  crc += SioTmp;
206
                  break;
207
   case 2: //  Eingangsdaten sammeln
208
                  RxdBuffer[buf_ptr] = SioTmp;
209
                  if(buf_ptr < MAX_EMPFANGS_BUFF) buf_ptr++;
210
                  else UartState = 0;
211
                  crc += SioTmp;
212
                  break;
213
   default:
214
          UartState = 0;
215
          break;
216
   }
217
 
218
 
219
  }
220
 
221
  }
222
 
223
   UART_ClearITPendingBit(UART1, UART_IT_Receive);
224
   UART_ClearITPendingBit(UART1, UART_IT_ReceiveTimeOut);
225
 
226
}
227
 
228
// --------------------------------------------------------------------------
229
void UART1_Transmit(void)
230
{
231
    u8 tmp_tx;
232
 
233
  if((!UebertragungAbgeschlossen) && (UART_GetFlagStatus(UART1, UART_FLAG_TxFIFOFull) == RESET))  
234
  {
235
 
236
   tmp_tx = SendeBuffer[ptr];  
237
 
238
   if((tmp_tx == '\r') || (ptr == MAX_SENDE_BUFF))
239
     {
240
       ptr = 0;
241
       UebertragungAbgeschlossen = 1;
242
     }
243
 
244
   UART_SendData(UART1, tmp_tx);
245
 
246
   ptr++;
247
  }
248
}
249
 
250
// --------------------------------------------------------------------------
251
void AddCRC(u16 wieviele)
252
{
253
 u16 tmpCRC = 0,i;
254
 //u8 count = FIFO_TX_LEVEL + 2 ;
255
 
256
 for(i = 0; i < wieviele;i++)
257
  {
258
   tmpCRC += SendeBuffer[i];
259
  }
260
   tmpCRC %= 4096;
261
   SendeBuffer[i++] = '=' + tmpCRC / 64;
262
   SendeBuffer[i++] = '=' + tmpCRC % 64;
263
   SendeBuffer[i++] = '\r';
264
 
265
 
266
  ptr = 0;
267
 
268
 
269
 // USB_Send_Data((u8 *) SendeBuffer,i);
270
 
271
  {
272
    UART_SendData(UART1,SendeBuffer[ptr++]);
273
    UebertragungAbgeschlossen = 0;
274
 
275
  }
276
}
277
 
278
 
279
 
280
// --------------------------------------------------------------------------
281
void SendOutData(u8 cmd,u8 modul, u8 *snd, u8 len)
282
{
283
 u16 pt = 0;
284
 u8 a,b,c;
285
 u8 ptr = 0;
286
 
287
 SendeBuffer[pt++] = '#';               // Startzeichen
288
 SendeBuffer[pt++] = modul;             // Adresse (a=0; b=1,...)
289
 SendeBuffer[pt++] = cmd;                       // Commando
290
 
291
 while(len)
292
  {
293
   if(len) { a = snd[ptr++]; len--;} else a = 0;
294
   if(len) { b = snd[ptr++]; len--;} else b = 0;
295
   if(len) { c = snd[ptr++]; len--;} else c = 0;
296
   SendeBuffer[pt++] = '=' + (a >> 2);
297
   SendeBuffer[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4));
298
   SendeBuffer[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6));
299
   SendeBuffer[pt++] = '=' + ( c & 0x3f);
300
  }
301
 AddCRC(pt);
302
}
303
 
304
 
305
// --------------------------------------------------------------------------
306
void Decode64(u8 *ptrOut, u8 len, u8 ptrIn,u8 max)  // Wohin mit den Daten; Wie lang; Wo im RxdBuffer
307
{
308
 u8 a,b,c,d;
309
 u8 ptr = 0;
310
 u8 x,y,z;
311
 while(len)
312
  {
313
   a = RxdBuffer[ptrIn++] - '=';
314
   b = RxdBuffer[ptrIn++] - '=';
315
   c = RxdBuffer[ptrIn++] - '=';
316
   d = RxdBuffer[ptrIn++] - '=';
317
   if(ptrIn > max - 2) break;     // nicht mehr Daten verarbeiten, als empfangen wurden
318
 
319
   x = (a << 2) | (b >> 4);
320
   y = ((b & 0x0f) << 4) | (c >> 2);
321
   z = ((c & 0x03) << 6) | d;
322
 
323
   if(len--) ptrOut[ptr++] = x; else break;
324
   if(len--) ptrOut[ptr++] = y; else break;
325
   if(len--) ptrOut[ptr++] = z; else break;
326
  }
327
 
328
}
329
 
330
// --------------------------------------------------------------------------
331
void BearbeiteRxDaten(void)
332
{
333
 if(!NeuerDatensatzEmpfangen) return;
334
 
335
// u16 tmp_int_arr1[1];
336
// u16 tmp_int_arr2[2];
337
// u16 tmp_int_arr3[3];
338
 u8  tmp_char_arr2[2];
339
 s32 tmp_long_arr2[2];
340
// u8 tmp_char_arr3[3];
341
// u8 tmp_char_arr4[4];
342
 //if(!MotorenEin) 
343
 PcZugriff = 255;
344
  switch(RxdBuffer[2])
345
  {
346
    case 'a':// Texte der Analogwerte
347
            Decode64((unsigned char *) &tmp_char_arr2[0],sizeof(tmp_char_arr2),3,AnzahlEmpfangsBytes);
348
            DebugTextAnforderung = tmp_char_arr2[0];
349
                        break;
350
   case 'b':
351
                        Decode64((unsigned char *) &ExternControl,sizeof(ExternControl),3,AnzahlEmpfangsBytes);
352
                        RemoteTasten |= ExternControl.RemoteTasten;
353
            ConfirmFrame = ExternControl.Frame;
354
            break;
355
   case 'c':
356
                        Decode64((unsigned char *) &ExternControl,sizeof(ExternControl),3,AnzahlEmpfangsBytes);
357
                        RemoteTasten |= ExternControl.RemoteTasten;
358
            ConfirmFrame = ExternControl.Frame;
359
            DebugDataAnforderung = 1;
360
            break;
361
   case 'h':// x-1 Displayzeilen
362
            Decode64((unsigned char *) &tmp_char_arr2[0],sizeof(tmp_char_arr2),3,AnzahlEmpfangsBytes);
363
            RemoteTasten |= tmp_char_arr2[0];
364
                        if(tmp_char_arr2[1] == 255) NurKanalAnforderung = 1; else NurKanalAnforderung = 0; // keine Displaydaten
365
                        DebugDisplayAnforderung = 1;
366
                        break;
367
   case 't':// Motortest
368
            Decode64((unsigned char *) &MotorTest[0],sizeof(MotorTest),3,AnzahlEmpfangsBytes);
369
                        break;
370
   case 's'://  neue PCTargetGPSPosition
371
            Decode64((unsigned char *) &tmp_long_arr2[0],sizeof(tmp_long_arr2),3,AnzahlEmpfangsBytes);
372
            PCTargetGPSPosition.Longitude = tmp_long_arr2[0];
373
            PCTargetGPSPosition.Latitude = tmp_long_arr2[1];
374
                    NewPCTargetGPSPosition = 1;
375
                        break;
376
   case 'k':// Keys von DubWise
377
    //        Decode64((unsigned char *) &DubWiseKeys[0],sizeof(DubWiseKeys),3,AnzahlEmpfangsBytes);
378
                        ConfirmFrame = 1;
379
                        break;
380
   case 'v': // Version-Anforderung     und Ausbaustufe
381
            GetVersionAnforderung = 1;
382
            break;                                                               
383
   case 'g':// "Get"-Anforderung für Debug-Daten 
384
            // Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen
385
            DebugGetAnforderung = 1;
386
            break;
387
 
388
   case 'l':
389
   case 'm':
390
   case 'n':
391
   case 'o':
392
   case 'p': // Parametersatz speichern
393
/*            Decode64((u8 *) &EE_Parameter.Kanalbelegung[0],STRUCT_PARAM_LAENGE,3,AnzahlEmpfangsBytes);
394
                        WriteParameterSet(RxdBuffer[2] - 'l' + 1, (u8 *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE);
395
            eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], RxdBuffer[2] - 'l' + 1);  // aktiven Datensatz merken
396
            Piep(GetActiveParamSetNumber());*/
397
         break;
398
 
399
 
400
  }
401
// DebugOut.AnzahlZyklen =  Debug_Timer_Intervall;
402
 NeuerDatensatzEmpfangen = 0;
403
 
404
}
405
 
406
 
407
//############################################################################
408
//Routine für die Serielle Ausgabe
409
s16 uart_putchar (char c)
410
//############################################################################
411
{
412
        if (c == '\n')
413
                uart_putchar('\r');
414
 
415
        while (UART_GetFlagStatus(UART1, UART_FLAG_TxFIFOFull) != RESET);
416
        UART_SendData(UART1, c);
417
 
418
        return (0);
419
}
420
// --------------------------------------------------------------------------
421
void SerialPutString(u8 *s)
422
{
423
    while (*s != '\0')
424
    {
425
        uart_putchar(*s);
426
        s ++;
427
    }
428
}
429
 
430
//############################################################################
431
//Init der Seriellen Schnittstelle
432
void Debug_UART1_Init (void)
433
//############################################################################
434
{
435
    GPIO_InitTypeDef GPIO_InitStructure;
436
 
437
    SCU_APBPeriphClockConfig(__UART1, ENABLE);  // Enable the UART1 Clock 
438
    SCU_APBPeriphClockConfig(__GPIO3, ENABLE);  // Enable the GPIO3 Clock 
439
 
440
    /*Configure UART1_Rx pin GPIO3.2*/
441
    GPIO_DeInit(GPIO3);
442
        GPIO_InitStructure.GPIO_Direction =     GPIO_PinInput;
443
    GPIO_InitStructure.GPIO_Pin =                       GPIO_Pin_2;
444
    GPIO_InitStructure.GPIO_Type =                      GPIO_Type_PushPull ;
445
    GPIO_InitStructure.GPIO_IPConnected =       GPIO_IPConnected_Enable;
446
    GPIO_InitStructure.GPIO_Alternate =         GPIO_InputAlt1  ;
447
    GPIO_Init(GPIO3, &GPIO_InitStructure);
448
 
449
    /*Configure UART1_Tx pin GPIO3.3*/
450
        GPIO_InitStructure.GPIO_Direction =     GPIO_PinOutput;
451
    GPIO_InitStructure.GPIO_Pin =                       GPIO_Pin_3;
452
    GPIO_InitStructure.GPIO_Type =                      GPIO_Type_PushPull ;
453
    GPIO_InitStructure.GPIO_Alternate =         GPIO_OutputAlt2  ;
454
    GPIO_Init(GPIO3, &GPIO_InitStructure);
455
 
456
  /* UART1 configured as follow:
457
          - Word Length = 8 Bits
458
          - One Stop Bit
459
          - No parity
460
          - BaudRate = 57600 baud
461
          - Hardware flow control Disabled
462
          - Receive and transmit enabled
463
          - Receive and transmit FIFOs are Disabled
464
    */
465
    UART_InitStructure.UART_WordLength =                        UART_WordLength_8D;
466
    UART_InitStructure.UART_StopBits =                          UART_StopBits_1;
467
    UART_InitStructure.UART_Parity =                            UART_Parity_No ;
468
    UART_InitStructure.UART_BaudRate =                          BAUD_RATE ;
469
    UART_InitStructure. UART_HardwareFlowControl =      UART_HardwareFlowControl_None;
470
    UART_InitStructure.UART_Mode =                                      UART_Mode_Tx_Rx;
471
    //UART_InitStructure.UART_FIFO =                                    UART_FIFO_Disable;
472
    UART_InitStructure.UART_FIFO =                                      UART_FIFO_Enable;
473
    UART_InitStructure.UART_TxFIFOLevel = UART_FIFOLevel_1_2;
474
    UART_InitStructure.UART_RxFIFOLevel = UART_FIFOLevel_1_2;
475
 
476
        UART_DeInit(UART1);
477
    UART_Init(UART1, &UART_InitStructure);
478
 
479
    UART_ITConfig(UART1, UART_IT_Receive | UART_IT_ReceiveTimeOut /*| UART_IT_Transmit */, ENABLE);
480
    //UART_ITConfig(UART1, UART_IT_Receive , ENABLE);    
481
 
482
 
483
 
484
        UART_Cmd(UART1, ENABLE);
485
 
486
    VIC_Config(UART1_ITLine, VIC_IRQ, 4);
487
    VIC_ITCmd(UART1_ITLine, ENABLE);  
488
 
489
  Debug_Timer = SetDelay(3000);  
490
  //----------------------------------------
491
 
492
 
493
}
494
 
495
 
496
//---------------------------------------------------------------------------------------------
497
void DatenUebertragung(void)  
498
{
499
 
500
 if(!UebertragungAbgeschlossen) return;
501
 
502
   if(DebugGetAnforderung && UebertragungAbgeschlossen)               // Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen
503
   {
504
      SendOutData('G',MeineSlaveAdresse,(unsigned char *) &ExternControl,sizeof(ExternControl));
505
          DebugGetAnforderung = 0;
506
   }
507
 
508
    if((CheckDelay(Debug_Timer) || DebugDataAnforderung) && UebertragungAbgeschlossen)  
509
         {
510
          SendOutData('D',MeineSlaveAdresse,(unsigned char *) &DebugOut,sizeof(DebugOut));
511
          DebugDataAnforderung = 0;
512
          Debug_Timer = SetDelay(2000);  
513
         }
514
    if(DebugTextAnforderung != 255) // Texte für die Analogdaten
515
     {
516
      SendOutData('A',DebugTextAnforderung + '0',(unsigned char *) ANALOG_TEXT[DebugTextAnforderung],16);
517
      DebugTextAnforderung = 255;
518
         }
519
     if(DebugDisplayAnforderung && UebertragungAbgeschlossen)
520
         {
521
      Menu();
522
          DebugDisplayAnforderung = 0;
523
      if(++RemotePollDisplayLine == 4 || NurKanalAnforderung)
524
      {
525
       SendOutData('4',0,(unsigned char *) &VersionInfo,sizeof(VersionInfo));   // DisplayZeile übertragen
526
       RemotePollDisplayLine = -1;
527
      }
528
      else  SendOutData('0' + RemotePollDisplayLine,0,(unsigned char *)&DisplayBuff[20 * RemotePollDisplayLine],20);   // DisplayZeile übertragen
529
         }
530
    if(GetVersionAnforderung && UebertragungAbgeschlossen)
531
     {
532
      SendOutData('V',MeineSlaveAdresse,(unsigned char *) &VersionInfo,sizeof(VersionInfo));
533
          GetVersionAnforderung = 0;
534
     }
535
    if(SendGPSPosAnforderung && UebertragungAbgeschlossen)
536
     {
537
      SendOutData('Q',MeineSlaveAdresse,(unsigned char *) &GPS_Position,sizeof(GPS_Position));
538
          SendGPSPosAnforderung = 0;
539
     }
540
 
541
}
542