49,61 → 49,41 |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
#include <avr/boot.h> |
|
unsigned char EEPromArray[E2END+1] EEMEM; |
unsigned char PlatinenVersion = 10; |
unsigned char SendVersionToNavi = 1; |
// -- Parametersatz aus EEPROM lesen --- |
// number [0..5] |
void ReadParameterSet(unsigned char number, unsigned char *buffer, unsigned char length) |
{ |
if (number > 5) number = 5; |
eeprom_read_block(buffer, &EEPromArray[EEPROM_ADR_PARAM_BEGIN + length * number], length); |
} |
#include <avr/io.h> |
#include <avr/interrupt.h> |
|
#include "main.h" |
#include "timer0.h" |
#include "timer2.h" |
#include "uart.h" |
#if defined (__AVR_ATmega644P__) |
#include "uart1.h" |
#endif |
#include "led.h" |
#include "menu.h" |
#include "fc.h" |
#include "rc.h" |
#include "analog.h" |
#include "printf_P.h" |
#ifdef USE_KILLAGREG |
#include "mm3.h" |
#endif |
#ifdef USE_NAVICTRL |
#include "spi.h" |
#endif |
#if !defined (USE_KILLAGREG) && !defined (USE_NAVICTRL) |
#include "mk3mag.h" |
#endif |
#include "twimaster.h" |
#include "eeprom.h" |
#include "_Settings.h" |
|
// -- Parametersatz ins EEPROM schreiben --- |
// number [0..5] |
void WriteParameterSet(unsigned char number, unsigned char *buffer, unsigned char length) |
{ |
if(number > 5) number = 5; |
eeprom_write_block(buffer, &EEPromArray[EEPROM_ADR_PARAM_BEGIN + length * number], length); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], number); // diesen Parametersatz als aktuell merken |
} |
|
unsigned char GetActiveParamSetNumber(void) |
{ |
unsigned char set; |
set = eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET]); |
if(set > 5) |
{ |
set = 2; |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], set); // diesen Parametersatz als aktuell merken |
} |
return(set); |
} |
uint8_t BoardRelease = 10; |
|
void CalMk3Mag(void) |
{ |
static unsigned char stick = 1; |
|
if(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > -20) stick = 0; |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < -70) && !stick) |
{ |
stick = 1; |
WinkelOut.CalcState++; |
if(WinkelOut.CalcState > 4) |
{ |
// WinkelOut.CalcState = 0; // in Uart.c |
beeptime = 1000; |
} |
else Piep(WinkelOut.CalcState); |
} |
DebugOut.Analog[19] = WinkelOut.CalcState; |
} |
|
|
//############################################################################ |
//Hauptprogramm |
int main (void) |
111,130 → 91,164 |
{ |
unsigned int timer; |
|
//unsigned int timer2 = 0; |
// disable interrupts global |
cli(); |
|
// get board release |
DDRB = 0x00; |
PORTB = 0x00; |
for(timer = 0; timer < 1000; timer++); // verzögern |
if(PINB & 0x01) PlatinenVersion = 11; else PlatinenVersion = 10; |
DDRC = 0x81; // SCL |
PORTC = 0xff; // Pullup SDA |
DDRB = 0x1B; // LEDs und Druckoffset |
PORTB = 0x01; // LED_Rot |
DDRD = 0x3E; // Speaker & TXD & J3 J4 J5 |
DDRD |=0x80; // J7 |
for(timer = 0; timer < 1000; timer++); // make some delay |
if(PINB & (1<<PINB0)) BoardRelease = 11; |
else BoardRelease = 10; |
|
PORTD = 0xF7; // LED |
// set LED ports as output |
DDRB |= (1<<DDB1)|(1<<DDB0); |
ROT_ON; |
GRN_OFF; |
|
|
// disable watchdog |
MCUSR &=~(1<<WDRF); |
WDTCSR |= (1<<WDCE)|(1<<WDE); |
WDTCSR = 0; |
|
beeptime = 2000; |
BeepTime = 2000; |
|
StickGier = 0; PPM_in[K_GAS] = 0;StickRoll = 0; StickNick = 0; |
PPM_in[CH_THRUST] = 0; |
StickYaw = 0; |
StickRoll = 0; |
StickPitch = 0; |
|
ROT_OFF; |
|
Timer_Init(); |
UART_Init(); |
rc_sum_init(); |
// initalize modules |
LED_Init(); |
TIMER0_Init(); |
TIMER2_Init(); |
USART0_Init(); |
|
#if defined (__AVR_ATmega644P__) |
if (BoardRelease == 11) USART1_Init(); |
#endif |
|
RC_Init(); |
ADC_Init(); |
i2c_init(); |
I2C_Init(); |
|
#ifdef USE_KILLAGREG |
MM3_Init(); |
#endif |
#ifdef USE_NAVICTRL |
SPI_MasterInit(); |
#endif |
#if !defined (USE_KILLAGREG) && !defined (USE_NAVICTRL) |
MK3MAG_Init(); |
#endif |
|
|
// enable interrupts global |
sei(); |
|
VersionInfo.Hauptversion = VERSION_HAUPTVERSION; |
VersionInfo.Nebenversion = VERSION_NEBENVERSION; |
VersionInfo.PCKompatibel = VERSION_KOMPATIBEL; |
VersionInfo.Major = VERSION_MAJOR; |
VersionInfo.Minor = VERSION_MINOR; |
VersionInfo.PCCompatible = VERSION_COMPATIBLE; |
|
printf("\n\rFlightControl\n\rHardware:%d.%d\n\rSoftware:V%d.%d%c ",PlatinenVersion/10,PlatinenVersion%10, VERSION_HAUPTVERSION, VERSION_NEBENVERSION,VERSION_INDEX + 'a'); |
printf("\n\rFlightControl\n\rHardware:%d.%d\n\rSoftware:V%d.%d%c ",BoardRelease/10,BoardRelease%10, VERSION_MAJOR, VERSION_MINOR,VERSION_INDEX + 'a'); |
printf("\n\r=============================="); |
GRN_ON; |
|
#define EE_DATENREVISION 70 // wird angepasst, wenn sich die EEPROM-Daten geändert haben |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_VALID]) != EE_DATENREVISION) |
{ |
printf("\n\rInit. EEPROM: Generiere Default-Parameter..."); |
DefaultKonstanten1(); |
for (unsigned char i=0;i<6;i++) |
{ |
if(i==2) DefaultKonstanten2(); // Kamera |
if(i==3) DefaultKonstanten3(); // Beginner |
if(i>3) DefaultKonstanten2(); // Kamera |
WriteParameterSet(i, (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
} |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], 3); // default-Setting |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_VALID], EE_DATENREVISION); |
} |
// Parameter set handling |
ParamSet_Init(); |
|
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) > 4) |
if(GetParamWord(PID_ACC_PITCH) > 1023) |
{ |
printf("\n\rACC nicht abgeglichen!"); |
printf("\n\rACC not calibrated!"); |
} |
|
ReadParameterSet(GetActiveParamSetNumber(), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
printf("\n\rBenutze Parametersatz %d", GetActiveParamSetNumber()); |
//wait for a short time (otherwise the RC channel check won't work below) |
timer = SetDelay(500); |
while(!CheckDelay(timer)); |
|
|
if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
#if !defined (USE_KILLAGREG) && !defined (USE_NAVICTRL) |
printf("\n\rSupport for MK3MAG Compass"); |
#endif |
|
|
if(ParamSet.GlobalConfig & CFG_HEIGHT_CONTROL) |
{ |
printf("\n\rAbgleich Luftdrucksensor.."); |
printf("\n\rCalibrating air pressure sensor.."); |
timer = SetDelay(1000); |
SucheLuftruckOffset(); |
SearchAirPressureOffset(); |
while (!CheckDelay(timer)); |
printf("OK\n\r"); |
} |
|
#ifdef USE_KILLAGREG |
printf("\n\rSupport for MicroMag3 Compass"); |
#if defined (__AVR_ATmega644P__) |
if(BoardRelease == 10) |
{ |
printf("\n\rSupport for GPS at 1st UART"); |
} |
else |
{ |
printf("\n\rSupport for GPS at 2nd UART"); |
} |
#else // (__AVR_ATmega644__) |
printf("\n\rSupport for GPS at 1st UART"); |
#endif |
#endif |
|
SetNeutral(); |
|
ROT_OFF; |
|
beeptime = 2000; |
BeepTime = 2000; |
ExternControl.Digital[0] = 0x55; |
|
|
printf("\n\rSteuerung: "); |
if (EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) printf("HeadingHold"); |
printf("\n\rControl: "); |
if (ParamSet.GlobalConfig & CFG_HEADING_HOLD) printf("HeadingHold"); |
else printf("Neutral"); |
|
printf("\n\n\r"); |
|
LcdClear(); |
LCD_Clear(); |
|
I2CTimeout = 5000; |
WinkelOut.Orientation = 1; |
|
while (1) |
{ |
if(UpdateMotor) // control interval |
{ |
UpdateMotor=0; // reset Flag, is enabled every 2 ms by isr of timer0 |
//PORTD |= (1<<PORTD4); |
MotorControl(); |
//PORTD &= ~(1<<PORTD4); |
|
if(UpdateMotor) // ReglerIntervall |
{ |
UpdateMotor=0; |
//PORTD |= 0x08; |
if(WinkelOut.CalcState) CalMk3Mag(); |
else MotorRegler(); |
//PORTD &= ~0x08; |
SendMotorData(); |
|
ROT_OFF; |
if(PcZugriff) PcZugriff--; |
|
if(PcAccess) PcAccess--; |
else |
{ |
DubWiseKeys[0] = 0; |
DubWiseKeys[1] = 0; |
ExternControl.Config = 0; |
ExternStickNick = 0; |
ExternStickPitch= 0; |
ExternStickRoll = 0; |
ExternStickGier = 0; |
ExternStickYaw = 0; |
} |
if(SenderOkay) SenderOkay--; |
|
if(!I2CTimeout) |
{ |
I2CTimeout = 5; |
i2c_reset(); |
if((BeepMuster == 0xffff) && MotorenEin) |
I2C_Reset(); |
if((BeepModulation == 0xFFFF) && MotorsOn) |
{ |
beeptime = 10000; |
BeepMuster = 0x0080; |
BeepTime = 10000; // 1 second |
BeepModulation = 0x0080; |
} |
} |
else |
242,38 → 256,42 |
I2CTimeout--; |
ROT_OFF; |
} |
if(SIO_DEBUG && (!UpdateMotor || !MotorenEin)) |
|
if(SIO_DEBUG && (!UpdateMotor || !MotorsOn)) |
{ |
DatenUebertragung(); |
BearbeiteRxDaten(); |
USART0_TransmitTxData(); |
USART0_ProcessRxData(); |
} |
else BearbeiteRxDaten(); |
else USART0_ProcessRxData(); |
|
if(CheckDelay(timer)) |
{ |
if(UBat < EE_Parameter.UnterspannungsWarnung) |
if(UBat < ParamSet.LowVoltageWarning) |
{ |
if(BeepMuster == 0xffff) |
if(BeepModulation == 0xFFFF) |
{ |
beeptime = 6000; |
BeepMuster = 0x0300; |
BeepTime = 6000; // 0.6 seconds |
BeepModulation = 0x0300; |
} |
} |
/* if(SendVersionToNavi) |
{ |
SPI_StartTransmitPacket(SPI_CMD_VERSION);//# |
SendVersionToNavi = 0; |
#ifdef USE_NAVICTRL |
SPI_StartTransmitPacket(); |
SendSPI = 4; |
#endif |
timer = SetDelay(20); // every 20 ms |
} |
else SPI_StartTransmitPacket(SPI_CMD_VALUE);//# |
*/ |
SPI_StartTransmitPacket();//# |
} |
|
SendSPI = 4; |
timer = SetDelay(20); |
#ifdef USE_NAVICTRL |
if(!SendSPI) |
{ // SendSPI is decremented in timer0.c with a rate of 9.765 kHz. |
// within the SPI_TransmitByte() routine the value is set to 4. |
// I.e. the SPI_TransmitByte() is called at a rate of 9.765 kHz/4= 2441.25 Hz, |
// and therefore the time of transmission of a complete spi-packet (32 bytes) is 32*4/9.765 kHz = 13.1 ms. |
SPI_TransmitByte(); |
} |
//if(UpdateMotor) DebugOut.Analog[26]++; |
#endif |
} |
if(!SendSPI) { SPI_TransmitByte(); } |
} |
return (1); |
} |
|