3,10 → 3,6 |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// + |
// + GPS read out: |
// + modified Version of the Pitschu Brushless Ufo - (c) Peter Schulten, Mülheim, Germany |
// + only for non-profit use |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|
#include "main.h" |
14,6 → 10,7 |
|
unsigned char DebugGetAnforderung = 0,DebugDisplayAnforderung = 0,DebugDataAnforderung = 0,GetVersionAnforderung = 0; |
unsigned volatile char SioTmp = 0; |
unsigned volatile char SioTmp1 = 0; |
unsigned volatile char SendeBuffer[MAX_SENDE_BUFF]; |
unsigned volatile char RxdBuffer[MAX_EMPFANGS_BUFF]; |
unsigned volatile char NMEABuffer[MAX_EMPFANGS_BUFF]; |
38,41 → 35,43 |
const unsigned char ANALOG_TEXT[32][16] = |
{ |
//1234567890123456 |
"IntegralNick____", //00 |
"IntegralRoll____", //01 |
"AccNick_________", //02 |
"AccRoll_________", //03 |
"P_GPS_Faktor____", //04 |
"D_GPS_Faktor____", //05 |
"Soll_Pos_North__", //06 |
"Soll_Pos_East___", //07 |
"KompassValue____", //08 |
"UBat____________", //09 |
"SenderOkay______", //10 |
"GPSFix__________", //11 |
"Gesamtstrom_____", //12 |
"Geschwindigkeit_", //13 |
"Pos.north_______", //14 |
"Pos.east________", //15 |
"Poti3___________", //16 |
"Höhe_GPS________", //17 |
"Home_North______", //18 |
"Home_East_______", //19 |
"Posabw_North____", //20 |
"Posabw_East_____", //21 |
"P_Einfluss_North", //22 |
"P_Einfluss_East_", //23 |
"D_Einfluss_North", //24 |
"D_Einfluss_East_", //25 |
"NORTH_MITTEL____", //26 |
"EAST_MITTEL_____", //27 |
"GPS_Nick________", //28 |
"GPS_Roll________", //29 |
"StickNick_______", //30 |
"StickRoll_______" //31 |
"IntegralNick ", //0 |
"IntegralRoll ", |
"AccNick ", |
"AccRoll ", |
"GyroGier ", |
"HoehenWert ", //5 |
"AccZ ", |
"Gas ", |
"KompassValue ", |
"Spannung ", |
"Empfang ", //10 |
"Analog11 ", |
"Motor_Vorne ", |
"Motor_Hinten ", |
"Motor_Links ", |
"Motor_Rechts ", //15 |
"Acc_Z ", |
"MittelAccNick ", |
"MittelAccRoll ", |
"IntegralErrNick ", |
"IntegralErrRoll ", //20 |
"MittelIntNick ", |
"MittelIntRoll ", |
"NeutralNick ", |
"RollOffset ", |
"IntRoll*Faktor ", //25 |
"Analog26 ", |
"DirektAusglRoll ", |
"MesswertRoll ", |
"AusgleichRoll ", |
"I-LageRoll ", //30 |
"StickRoll " |
}; |
|
|
|
|
char newData_navPosUtm = 0; // Flag, wenn neue PosUtm-Daten vorliegen (211007Kr) |
|
static uint8_t gpsState; |
189,12 → 188,80 |
else ptr = 0; |
} |
|
void GPSscanData (void) |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ Empfangs-Part der Datenübertragung, incl. CRC-Auswertung |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
SIGNAL(INT_VEC_RX) |
{ |
static unsigned int crc; |
static unsigned char crc1,crc2,buf_ptr; |
static unsigned char UartState = 0; |
unsigned char CrcOkay = 0; |
|
SioTmp = UDR; |
if(buf_ptr >= MAX_EMPFANGS_BUFF) UartState = 0; |
if(SioTmp == '\r' && UartState == 2) |
{ |
UartState = 0; |
crc -= RxdBuffer[buf_ptr-2]; |
crc -= RxdBuffer[buf_ptr-1]; |
crc %= 4096; |
crc1 = '=' + crc / 64; |
crc2 = '=' + crc % 64; |
CrcOkay = 0; |
if((crc1 == RxdBuffer[buf_ptr-2]) && (crc2 == RxdBuffer[buf_ptr-1])) CrcOkay = 1; else { CrcOkay = 0; CntCrcError++;}; |
if(!NeuerDatensatzEmpfangen && CrcOkay) // Datensatz schon verarbeitet |
{ |
NeuerDatensatzEmpfangen = 1; |
AnzahlEmpfangsBytes = buf_ptr; |
RxdBuffer[buf_ptr] = '\r'; |
if(RxdBuffer[2] == 'R') wdt_enable(WDTO_250MS); // Reset-Commando |
} |
} |
else |
switch(UartState) |
{ |
case 0: |
if(SioTmp == '#' && !NeuerDatensatzEmpfangen) UartState = 1; // Startzeichen und Daten schon verarbeitet |
buf_ptr = 0; |
RxdBuffer[buf_ptr++] = SioTmp; |
crc = SioTmp; |
break; |
case 1: // Adresse auswerten |
UartState++; |
RxdBuffer[buf_ptr++] = SioTmp; |
crc += SioTmp; |
break; |
case 2: // Eingangsdaten sammeln |
RxdBuffer[buf_ptr] = SioTmp; |
if(buf_ptr < MAX_EMPFANGS_BUFF) buf_ptr++; |
else UartState = 0; |
crc += SioTmp; |
break; |
default: |
UartState = 0; |
break; |
} |
} |
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ Sende-Part der Datenübertragung an zweiten UART |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
SIGNAL(SIG_USART1_TRANS) |
{ |
//zum 2te Uart (GPS) wird im Moment nichts gesendet |
|
|
} |
|
|
|
|
void GPSscanData (void) |
{ |
|
if (navStatus.packetStatus == 1) // valid packet |
{ |
actualPos.GPSFix = navStatus.GPSfix; |
234,23 → 301,20 |
|
} |
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ Empfangs-Part der Datenübertragung, incl. CRC-Auswertung |
//++ Empfangs-Part der Datenübertragung von zweitem UART |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
SIGNAL(INT_VEC_RX) |
SIGNAL(SIG_USART1_RECV) |
{ |
static unsigned int crc; |
static unsigned char crc1,crc2,buf_ptr; |
static unsigned char UartState = 0; |
unsigned char CrcOkay = 0; |
|
SioTmp = UDR; |
|
uint8_t c; |
uint8_t re; |
|
re = (UCSR0A & (_B1(FE0) | _B1(DOR0))); // any error occured ? |
c = SioTmp; |
SioTmp1 = UDR1; |
|
re = (UCSR1A & (_B1(FE1) | _B1(DOR1))); // any error occured ? |
c = SioTmp1; |
|
#ifdef GPS_DEBUG |
*bp++ = c; |
258,10 → 322,10 |
if (v24state == 0) |
{ |
v24state = 1; |
UDR0 = *ep++; |
UDR1 = *ep++; |
if (ep >= buf+200) |
ep = buf; |
UCSR0B |= _B1(UDRIE0); //enable further irqs |
UCSR1B |= _B1(UDRIE1); //enable further irqs |
} |
#endif |
|
371,54 → 435,6 |
GPSscanData (); |
|
|
|
|
|
|
|
if(buf_ptr >= MAX_EMPFANGS_BUFF) UartState = 0; |
if(SioTmp == '\r' && UartState == 2) |
{ |
UartState = 0; |
crc -= RxdBuffer[buf_ptr-2]; |
crc -= RxdBuffer[buf_ptr-1]; |
crc %= 4096; |
crc1 = '=' + crc / 64; |
crc2 = '=' + crc % 64; |
CrcOkay = 0; |
if((crc1 == RxdBuffer[buf_ptr-2]) && (crc2 == RxdBuffer[buf_ptr-1])) CrcOkay = 1; else { CrcOkay = 0; CntCrcError++;}; |
if(!NeuerDatensatzEmpfangen && CrcOkay) // Datensatz schon verarbeitet |
{ |
NeuerDatensatzEmpfangen = 1; |
AnzahlEmpfangsBytes = buf_ptr; |
RxdBuffer[buf_ptr] = '\r'; |
if(RxdBuffer[2] == 'R') wdt_enable(WDTO_250MS); // Reset-Commando |
} |
} |
else |
switch(UartState) |
{ |
case 0: |
if(SioTmp == '#' && !NeuerDatensatzEmpfangen) UartState = 1; // Startzeichen und Daten schon verarbeitet |
buf_ptr = 0; |
RxdBuffer[buf_ptr++] = SioTmp; |
crc = SioTmp; |
break; |
case 1: // Adresse auswerten |
UartState++; |
RxdBuffer[buf_ptr++] = SioTmp; |
crc += SioTmp; |
break; |
case 2: // Eingangsdaten sammeln |
RxdBuffer[buf_ptr] = SioTmp; |
if(buf_ptr < MAX_EMPFANGS_BUFF) buf_ptr++; |
else UartState = 0; |
crc += SioTmp; |
break; |
default: |
UartState = 0; |
break; |
} |
} |
|
|
439,6 → 455,7 |
} |
|
|
|
// -------------------------------------------------------------------------- |
void SendOutData(unsigned char cmd,unsigned char modul, unsigned char *snd, unsigned char len) |
{ |
615,10 → 632,35 |
//fdevopen (uart_putchar, 0); |
//sbi(PORTD,4); |
Debug_Timer = SetDelay(200); |
|
gpsState = GPS_EMPTY; |
} |
|
|
//############################################################################ |
//INstallation der 2ten Seriellen Schnittstelle |
void UART1_Init (void) |
//############################################################################ |
{ |
//Enable TXEN im Register UCR TX-Data Enable & RX Enable |
|
UCSR1B=(1 << TXEN1) | (1 << RXEN1); |
// UART Double Speed (U2X) |
UCSR1A |= (1<<U2X1); |
// RX-Interrupt Freigabe |
UCSR1B |= (1<<RXCIE1); |
// TX-Interrupt Freigabe |
UCSR1B |= (1<<TXCIE1); |
|
//Teiler wird gesetzt |
UBRR1L=(SYSCLK / (BAUD_RATE1 * 8L) - 1); |
//UBRR1L = 33; |
//öffnet einen Kanal für printf (STDOUT) |
//fdevopen (uart_putchar, 0); |
//sbi(PORTD,4); |
Debug_Timer = SetDelay(200); |
} |
|
|
|
//--------------------------------------------------------------------------------------------- |
void DatenUebertragung(void) |
{ |