Subversion Repositories FlightCtrl

Compare Revisions

Ignore whitespace Rev 521 → Rev 522

/branches/Flight-Ctrl_V0_67g_3_GPS_work_Jochen_2UART/uart.c
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)
{