/trunk/eeprom.c |
---|
55,6 → 55,7 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include <string.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include "91x_lib.h" |
#include "i2c.h" |
#include "uart1.h" |
64,6 → 65,7 |
#include "crc16.h" |
#include "main.h" |
#include "spi_slave.h" |
#include "params.h" |
// The EEPROM M24C64 (64k) ist connected via I2C1 interface to the controller. |
325,6 → 327,30 |
} |
} |
void WriteBaroCalibrationToEEprom(void) |
{ |
#define BARO_KOMPATIBLE 1 |
s16 data[2]; |
data[0] = LuftdruckTemperaturKompensation; |
data[1] = data[0] + BARO_KOMPATIBLE; |
EEPROM_WriteBlock(EEPROM_ADR_BARO_KALIBRATION,(u8 *)&data,4); |
NCParams[NCPARAMS_BARO_KOMPENSATION] = LuftdruckTemperaturKompensation; |
NCParamState[NCPARAMS_BARO_KOMPENSATION] = NCRARAM_STATE_VALID; |
} |
void ReadBaroCalibrationfromEEprom(void) |
{ |
s16 data[2]; |
EEPROM_ReadBlock(EEPROM_ADR_BARO_KALIBRATION,(u8 *)&data,4); |
if(data[0] + BARO_KOMPATIBLE == data[1]) |
{ |
LuftdruckTemperaturKompensation = data[0]; |
if(abs(LuftdruckTemperaturKompensation) > 250) LuftdruckTemperaturKompensation = 0; |
} |
NCParams[NCPARAMS_BARO_KOMPENSATION] = LuftdruckTemperaturKompensation; |
NCParamState[NCPARAMS_BARO_KOMPENSATION] = NCRARAM_STATE_VALID; |
if(LuftdruckTemperaturKompensation) UART1_PutString("\r\n Baro Temperature Calibration active\r\n"); |
} |
/trunk/eeprom.h |
---|
2,6 → 2,7 |
#define __EEPROM_H |
// two calibrtion sets for extern and intern sensor |
#define EEPROM_ADR_BARO_KALIBRATION 46 // 46 - 49 |
#define EEPROM_ADR_MAG_CALIBRATION_INTERN 50 |
#define EEPROM_ADR_MAG_CALIBRATION_EXTERN 70 |
#define EEPROM_ADR_LICENSE_DATA_CRC 124// - 600 |
36,6 → 37,8 |
extern void ClearLicenseText(void); |
extern u8 ReadOemNameFromEEPROM(void); |
extern void WriteOemNameToEEPROM(void); |
extern void WriteBaroCalibrationToEEprom(void); |
extern void ReadBaroCalibrationfromEEprom(void); |
#endif // EEPROM_H |
/trunk/main.c |
---|
91,6 → 91,7 |
u8 TransmitAlsoToFC = 0; |
#endif |
u32 TimerCheckError; |
u32 TimerSecond; |
u8 ErrorCode = 0; |
u16 BeepTime; |
u8 NCFlags = 0; |
116,6 → 117,8 |
u8 IamMaster = NOTHING; // for Master/Slave Redundance |
u16 ToFC_Parachute_Off; |
u8 IO1_Function = 0; |
s16 LuftdruckTemperaturKompensation = 0, LuftdruckTemperaturOffset = 0; |
u8 BaroCalState = 0; |
//---------------------------------------------------------------------------------------------------- |
void SCU_Config(void) |
577,6 → 580,50 |
TimerCheckError = SetDelay(1000); |
} |
// ++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Baro Temperature offset |
// ++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!BaroCalState && LuftdruckTemperaturKompensation) |
{ |
LuftdruckTemperaturOffset = (31 * (s32)LuftdruckTemperaturOffset + ((FC_Temperatur_raw - FC_StartTemperature*10) * LuftdruckTemperaturKompensation) / 100) / 32; |
} |
/* |
DebugOut.Analog[] = FC_Temperatur_raw/10; |
DebugOut.Analog[] = FC_Temperatur; |
DebugOut.Analog[] = NaviData.Altimeter_5cm * 5; |
DebugOut.Analog[] = LuftdruckTemperaturOffset; |
*/ |
// ++++++++++++++++++++++++++++++++++++++++++++++++ |
// + one second timer |
// ++++++++++++++++++++++++++++++++++++++++++++++++ |
if(CheckDelay(TimerSecond)) // one second Timer |
{ |
TimerSecond += 1000; |
if(FC.StatusFlags & FC_STATUS_FLY) |
{ |
NaviData.FlyingTime++; // we want to count the battery-time |
TimeSinceMotorStart++; |
} |
// ++++++++++++++++++++++++++++++++++++++++++++++++ |
// + FC 3.0 Temperature |
// ++++++++++++++++++++++++++++++++++++++++++++++++ |
if(UART_VersionInfo.HWMajor >= 30) |
{ |
if(FC_Temperatur == -1000 && FC_Temperatur_raw != -10000) // init |
{ |
FC_Temperatur = FC_Temperatur_raw/10; |
FC_StartTemperature = FC_Temperatur; |
} |
else |
if(FC_Temperatur > FC_Temperatur_raw/10) FC_Temperatur--; |
else |
if(FC_Temperatur < FC_Temperatur_raw/10) FC_Temperatur++; |
} |
} |
// ++++++++++++++++++++++++++++++++++++++++++++++++ |
// ---------------- Error Check Timing ---------------------------- |
if(CheckDelay(TimerCheckError) || (FC.StatusFlags & FC_STATUS_START && !(oldFcFlags & FC_STATUS_START))) // Timer or FY wants to start |
{ |
605,12 → 652,6 |
if(!CheckDelay(SPI0_Timeout) || (DebugUART == UART1)) CheckErrors(); |
if(FC.StatusFlags & FC_STATUS_FLY) |
{ |
NaviData.FlyingTime++; // we want to count the battery-time |
TimeSinceMotorStart++; |
} |
if(EE_Parameter.Revision == 0) RequestConfigFromFC = 1; |
if(SerialLinkOkay) SerialLinkOkay--; |
if(SerialLinkOkay < 250 - 6) NCFlags |= NC_FLAG_NOSERIALLINK; // 6 seconds timeout for serial communication |
693,6 → 734,7 |
//UART_VersionInfo.HWMajor = 30; |
LED_GRN_ON; |
TimerCheckError = SetDelay(3000); |
TimerSecond = SetDelay(3500); |
UART1_PutString("\r\n++++++++++++++++++++++++++++++++++++++++++"); |
UART1_PutString("\r\n Version information:"); |
750,6 → 792,7 |
{ |
EXT2_Init(); // External Output EXT2 |
CanbusInit(); |
ReadBaroCalibrationfromEEprom(); |
} |
if(FromCamCtrl.CamStatus) |
{ |
758,6 → 801,7 |
UART1_PutString(msg); |
} |
else if(Compass_I2CPort == NCMAG_PORT_INTERN) UART1_PutString(" No CamCtrl connected \r\n"); |
// ++++++++++++++++++++++++++++++++++++++++++++++ |
for (;;) // the endless main loop |
{ |
/trunk/main.h |
---|
37,7 → 37,7 |
#define CAN_SLAVE_COMPATIBLE 2 |
#ifndef FOLLOW_ME |
#define FC_SPI_COMPATIBLE 83 // <------------------ |
#define FC_SPI_COMPATIBLE 84 // <------------------ |
#else |
#define FC_SPI_COMPATIBLE 0xFF |
#endif |
198,6 → 198,7 |
#define Poti7 FC.Poti[6] |
#define Poti8 FC.Poti[7] |
extern s16 LuftdruckTemperaturKompensation, LuftdruckTemperaturOffset; |
extern u16 BeepTime; |
extern u8 NCFlags; |
extern u8 ClearFCStatusFlags; |
333,6 → 334,7 |
extern s16 SimulatedDirection; // simulated compass direction |
extern u16 ToFC_Parachute_Off; // forced Switch off via IO1 |
extern u8 IO1_Function; |
extern u8 BaroCalState; |
#define OEM_NAME_LENGHT 16 |
extern u8 OEM_String[OEM_NAME_LENGHT+1]; |
/trunk/menu.c |
---|
74,6 → 74,7 |
#include "canbus.h" |
#include "triggerlog.h" |
#include "CamCtrl.h" |
#include "eeprom.h" |
u8 DispPtr = 0; |
s8 DisplayBuff[DISPLAYBUFFSIZE]; |
80,7 → 81,7 |
u8 MenuItem = 0; |
u8 MaxMenuItem = 30; |
u8 MaxMenuItem = 31; |
void Menu_Putchar(char c) |
{ |
698,7 → 699,87 |
} |
} |
break; |
case 31: // Temperaturecompensation of the Barosensor |
{ |
static s32 dT = 0, tAlt = 0, faktor = 0; |
static s32 dP = 0, pAlt = 0; |
static u8 stored = 0, heateroff_msg = 0; |
if(BaroCalState) |
{ |
dP = NaviData.Altimeter_5cm/2 - pAlt; |
dT = FC_Temperatur - tAlt; |
faktor = (dP * 100) / dT; |
if(abs(dT) < 130) LCD_printfxy(0,0,"Warm up slowly") |
else |
if(FC.StatusFlags & FC_STATUS_MOTOR_RUN) LCD_printfxy(0,0,"Motors off! ") |
else LCD_printfxy(0,0,"Wait... "); |
if((abs(FC_Temperatur_raw/10 - tAlt) >= 250)) heateroff_msg = 1; |
if((abs(FC_Temperatur_raw/10 - tAlt) <= 150)) heateroff_msg = 0; |
if(heateroff_msg) LCD_printfxy(0,0,"Heater off! "); |
LCD_printfxy(0,1,"T=%4dC dT=%3dC ",FC_Temperatur_raw/100,dT/10 ); |
LCD_printfxy(0,2,"P=%4dm dP=%3dm ",NaviData.Altimeter_5cm/20,dP/10 ); |
if(dT > 30) LCD_printfxy(0,3,"K=%4dcm/C ",faktor) |
else LCD_printfxy(0,3," (cancel)",faktor); |
if(abs(dT) > 120 && (abs(FC_Temperatur_raw/10 - FC_Temperatur) <= 5)) // kein Temperaturgradient und mehr als 12°C erwärmt |
{ |
heateroff_msg = 0; |
LCD_printfxy(12,3,"(save)"); |
LCD_printfxy(0,0,"Okay "); |
if(Keys & KEY4) // Store |
{ |
LuftdruckTemperaturKompensation = faktor; |
WriteBaroCalibrationToEEprom(); |
BaroCalState = 0; |
stored = 1; |
} |
} |
else LCD_printfxy(15,3,"(--) "); |
} |
else |
if(UART_VersionInfo.HWMajor >= 30) |
{ |
LCD_printfxy(0,0,"Barometer"); |
LCD_printfxy(0,1,"Temperat.= %4d.%1dC ",FC_Temperatur_raw/100,abs(FC_Temperatur_raw%100)/10); |
LCD_printfxy(0,2,"Faktor = %4dcm/C ",LuftdruckTemperaturKompensation); |
//LCD_printfxy(0,3,"Offset =%4dcm ",LuftdruckTemperaturOffset); |
if(stored) LCD_printfxy(0,3,"Stored "); |
if((abs(FC_Temperatur_raw/10 - FC_Temperatur) <= 5)) // kein Temperaturgradient |
{ |
LCD_printfxy(15,3,"(CAL)"); |
if(Keys & KEY4) // next step |
{ |
pAlt = NaviData.Altimeter_5cm/2; |
tAlt = FC_Temperatur_raw/10; |
FC_Temperatur = FC_Temperatur_raw/10; |
BaroCalState = 1; |
stored = 0; |
} |
} |
else LCD_printfxy(15,3,"(---)"); |
} |
else |
{ |
LCD_printfxy(0,0,"Barometer"); |
LCD_printfxy(0,1,"Temperat = ??C "); |
LCD_printfxy(0,2,"Faktor = ?? cm/C"); |
LCD_printfxy(0,3,"Not supported"); |
} |
if(Keys & KEY3) BaroCalState = 0; // cancel |
} |
break; |
default: |
//MaxMenuItem = MenuItem - 1; |
MenuItem = 0; |
/trunk/params.c |
---|
3,8 → 3,8 |
#include "spi_slave.h" |
#include "waypoints.h" |
s16 NCParams[255]; |
u8 NCParamState[255]; |
s16 NCParams[256]; |
u8 NCParamState[256]; |
void NCParams_Init(void) |
{ |
26,6 → 26,11 |
switch(id) |
{ |
case NCPARAMS_BARO_KOMPENSATION: |
LuftdruckTemperaturKompensation = *pvalue; |
WriteBaroCalibrationToEEprom(); |
break; |
case NCPARAMS_FORCE_NEW_COMPASS_DIRECTION: |
CAM_Orientation.UpdateMask |= FORCE_AZIMUTH_ROTATION; |
// Break fehlt hier absichtlich |
/trunk/params.h |
---|
1,6 → 1,9 |
#ifndef _PARAMS_H |
#define _PARAMS_H |
extern s16 NCParams[256]; |
extern u8 NCParamState[256]; |
// ids 0...255 |
#define NCPARAMS_GPS_TARGETSPEED 0 |
#define NCPARAMS_NEW_COMPASS_DIRECTION_SETPOINT 1 |
11,6 → 14,7 |
#define NCPARAMS_WP_EVENT_ONCE 6 |
#define NCPARAMS_WP_EVENT_FOREVER 7 |
#define NCPARAMS_FORCE_NEW_COMPASS_DIRECTION 8 |
#define NCPARAMS_BARO_KOMPENSATION 255 |
#define NCPARAM_STATE_UNDEFINED 0 |
#define NCRARAM_STATE_VALID 1 |
/trunk/spi_slave.c |
---|
521,6 → 521,8 |
ToFlightCtrl.Param.Byte[9] = ToFC_MaxWpListIndex; |
ToFlightCtrl.Param.sInt[5] = GyroCompassCorrected / 10; // Bytes 10 & 11 |
ToFlightCtrl.Param.Byte[12] = CamCtrlCharacter; |
ToFlightCtrl.Param.Byte[13] = BaroCalState; |
ToFlightCtrl.Param.sInt[7] = LuftdruckTemperaturOffset; // Bytes 14 & 15 |
break; |
case SPI_NCCMD_GPSINFO: |
/trunk/ubx.c |
---|
311,6 → 311,8 |
GPSData.SatFix = UbxSol.GPSfix; |
//if(Parameter.User3 > 100) { GPSData.NumOfSats = 0; GPSData.SatFix = 0;} |
//if(Parameter.User3 > 100) { GPSData.SatFix = 0;} |
//DebugOut.Analog[] = UbxPosLlh.Hacc; |
//DebugOut.Analog[] = UbxPosLlh.Vacc; |
GPSData.Position_Accuracy = UbxSol.PAcc; // in steps of 1cm |
GPSData.Speed_Accuracy = UbxSol.SAcc; // in steps of 1cm/s |
SetGPSTime(&SystemTime); // update system time |