/branches/salvo_gps/Basis_V0066c/trunk/FlightCtrl.aps |
---|
0,0 → 1,0 |
<AVRStudio><MANAGEMENT><ProjectName>FlightCtrl</ProjectName><Created>15-May-2007 11:20:41</Created><LastEdit>12-Nov-2007 16:47:56</LastEdit><ICON>241</ICON><ProjectType>0</ProjectType><Created>15-May-2007 11:20:41</Created><Version>4</Version><Build>4, 13, 0, 528</Build><ProjectTypeName>AVR GCC</ProjectTypeName></MANAGEMENT><CODE_CREATION><ObjectFile>default\Flight-Ctrl.elf</ObjectFile><EntryFile></EntryFile><SaveFolder>G:\Mikrokopter\Flight_Crtl\v0066c\</SaveFolder></CODE_CREATION><DEBUG_TARGET><CURRENT_TARGET>AVR Simulator</CURRENT_TARGET><CURRENT_PART>ATmega644.xml</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND><HIDE>false</HIDE></IO_EXPAND><REGISTERNAMES><Register>R00</Register><Register>R01</Register><Register>R02</Register><Register>R03</Register><Register>R04</Register><Register>R05</Register><Register>R06</Register><Register>R07</Register><Register>R08</Register><Register>R09</Register><Register>R10</Register><Register>R11</Register><Register>R12</Register><Register>R13</Register><Register>R14</Register><Register>R15</Register><Register>R16</Register><Register>R17</Register><Register>R18</Register><Register>R19</Register><Register>R20</Register><Register>R21</Register><Register>R22</Register><Register>R23</Register><Register>R24</Register><Register>R25</Register><Register>R26</Register><Register>R27</Register><Register>R28</Register><Register>R29</Register><Register>R30</Register><Register>R31</Register></REGISTERNAMES><COM>Auto</COM><COMType>0</COMType><WATCHNUM>0</WATCHNUM><WATCHNAMES><Pane0></Pane0><Pane1></Pane1><Pane2></Pane2><Pane3></Pane3></WATCHNAMES><BreakOnTrcaeFull>0</BreakOnTrcaeFull></DEBUG_TARGET><Debugger><Triggers></Triggers></Debugger><AVRGCCPLUGIN><FILES><SOURCEFILE>uart.c</SOURCEFILE><SOURCEFILE>analog.c</SOURCEFILE><SOURCEFILE>eeprom.c</SOURCEFILE><SOURCEFILE>fc.c</SOURCEFILE><SOURCEFILE>GPS.c</SOURCEFILE><SOURCEFILE>main.c</SOURCEFILE><SOURCEFILE>menu.c</SOURCEFILE><SOURCEFILE>printf_P.c</SOURCEFILE><SOURCEFILE>rc.c</SOURCEFILE><SOURCEFILE>timer0.c</SOURCEFILE><SOURCEFILE>twimaster.c</SOURCEFILE><SOURCEFILE>math.c</SOURCEFILE><HEADERFILE>uart.h</HEADERFILE><HEADERFILE>_Settings.h</HEADERFILE><HEADERFILE>analog.h</HEADERFILE><HEADERFILE>fc.h</HEADERFILE><HEADERFILE>gps.h</HEADERFILE><HEADERFILE>main.h</HEADERFILE><HEADERFILE>menu.h</HEADERFILE><HEADERFILE>old_macros.h</HEADERFILE><HEADERFILE>printf_P.h</HEADERFILE><HEADERFILE>rc.h</HEADERFILE><HEADERFILE>Settings.h</HEADERFILE><HEADERFILE>timer0.h</HEADERFILE><HEADERFILE>twimaster.h</HEADERFILE><HEADERFILE>math.h</HEADERFILE><OTHERFILE>makefile</OTHERFILE></FILES><CONFIGS><CONFIG><NAME>default</NAME><USESEXTERNALMAKEFILE>YES</USESEXTERNALMAKEFILE><EXTERNALMAKEFILE>makefile</EXTERNALMAKEFILE><PART>atmega644</PART><HEX>1</HEX><LIST>1</LIST><MAP>1</MAP><OUTPUTFILENAME>Flight-Ctrl.elf</OUTPUTFILENAME><OUTPUTDIR>default\</OUTPUTDIR><ISDIRTY>1</ISDIRTY><OPTIONS><OPTION><FILE>GPS.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>analog.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>eeprom.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>fc.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>main.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>menu.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>printf_P.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>rc.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>timer0.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>twimaster.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>uart.c</FILE><OPTIONLIST></OPTIONLIST></OPTION></OPTIONS><INCDIRS/><LIBDIRS/><LIBS><LIB>libc.a</LIB><LIB>libm.a</LIB></LIBS><LINKOBJECTS/><OPTIONSFORALL>-Wall -gdwarf-2 -Wstrict-prototypes -std=gnu99 -DVERSION_HAUPTVERSION=0 -DVERSION_NEBENVERSION=64 -DVERSION_KOMPATIBEL=5 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums</OPTIONSFORALL><LINKEROPTIONS></LINKEROPTIONS><SEGMENTS/></CONFIG></CONFIGS><LASTCONFIG>default</LASTCONFIG><USES_WINAVR>1</USES_WINAVR><GCC_LOC>C:\Programme\WinAVR-20070525\bin\avr-gcc.exe</GCC_LOC><MAKE_LOC>C:\Programme\WinAVR-20070525\utils\bin\make.exe</MAKE_LOC></AVRGCCPLUGIN><ProjectFiles><Files><Name>G:\Mikrokopter\Flight_Crtl\v0066c\uart.h</Name><Name>G:\Mikrokopter\Flight_Crtl\v0066c\_Settings.h</Name><Name>G:\Mikrokopter\Flight_Crtl\v0066c\analog.h</Name><Name>G:\Mikrokopter\Flight_Crtl\v0066c\fc.h</Name><Name>G:\Mikrokopter\Flight_Crtl\v0066c\gps.h</Name><Name>G:\Mikrokopter\Flight_Crtl\v0066c\main.h</Name><Name>G:\Mikrokopter\Flight_Crtl\v0066c\menu.h</Name><Name>G:\Mikrokopter\Flight_Crtl\v0066c\old_macros.h</Name><Name>G:\Mikrokopter\Flight_Crtl\v0066c\printf_P.h</Name><Name>G:\Mikrokopter\Flight_Crtl\v0066c\rc.h</Name><Name>G:\Mikrokopter\Flight_Crtl\v0066c\Settings.h</Name><Name>G:\Mikrokopter\Flight_Crtl\v0066c\timer0.h</Name><Name>G:\Mikrokopter\Flight_Crtl\v0066c\twimaster.h</Name><Name>G:\Mikrokopter\Flight_Crtl\v0066c\math.h</Name><Name>G:\Mikrokopter\Flight_Crtl\v0066c\uart.c</Name><Name>G:\Mikrokopter\Flight_Crtl\v0066c\analog.c</Name><Name>G:\Mikrokopter\Flight_Crtl\v0066c\eeprom.c</Name><Name>G:\Mikrokopter\Flight_Crtl\v0066c\fc.c</Name><Name>G:\Mikrokopter\Flight_Crtl\v0066c\GPS.c</Name><Name>G:\Mikrokopter\Flight_Crtl\v0066c\main.c</Name><Name>G:\Mikrokopter\Flight_Crtl\v0066c\menu.c</Name><Name>G:\Mikrokopter\Flight_Crtl\v0066c\printf_P.c</Name><Name>G:\Mikrokopter\Flight_Crtl\v0066c\rc.c</Name><Name>G:\Mikrokopter\Flight_Crtl\v0066c\timer0.c</Name><Name>G:\Mikrokopter\Flight_Crtl\v0066c\twimaster.c</Name><Name>G:\Mikrokopter\Flight_Crtl\v0066c\math.c</Name></Files></ProjectFiles><IOView><usergroups/></IOView><Files><File00000><FileId>00000</FileId><FileName>timer0.c</FileName><Status>1</Status></File00000><File00001><FileId>00001</FileId><FileName>analog.h</FileName><Status>1</Status></File00001></Files><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio> |
/branches/salvo_gps/Basis_V0066c/trunk/GPS.c |
---|
0,0 → 1,639 |
/* |
This program (files gps.c and gps.h) is free software; you can redistribute it and/or modify |
it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; |
either version 3 of the License, or (at your option) any later version. |
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; |
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License and GNU Lesser General Public License for more details. |
You should have received a copy of GNU General Public License (License_GPL.txt) and |
GNU Lesser General Public License (License_LGPL.txt) along with this program. |
If not, see <http://www.gnu.org/licenses/>. |
Please note: All the other files for the project "Mikrokopter" by H.Buss are under the license (license_buss.txt) published by www.mikrokopter.de |
*/ |
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
Peter Muehlenbrock |
Auswertung der Daten vom GPS im ublox Format |
Hold Modus mit PID Regler |
Rückstuerz zur Basis Funktion |
Stand 24.10.2007 |
Anederung: 24.10. Altitude in relativer Position jetzt auch drin |
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
*/ |
#include "main.h" |
//#include "gps.h" |
// Defines fuer ublox Messageformat um Auswertung zu steuern |
#define UBLOX_IDLE 0 |
#define UBLOX_SYNC1 1 |
#define UBLOX_SYNC2 2 |
#define UBLOX_CLASS 3 |
#define UBLOX_ID 4 |
#define UBLOX_LEN1 5 |
#define UBLOX_LEN2 6 |
#define UBLOX_CKA 7 |
#define UBLOX_CKB 8 |
#define UBLOX_PAYLOAD 9 |
// ublox Protokoll Identifier |
#define UBLOX_NAV_POSUTM 0x08 |
#define UBLOX_NAV_STATUS 0x03 |
#define UBLOX_NAV_VELED 0x12 |
#define UBLOX_NAV_CLASS 0x01 |
#define UBLOX_SYNCH1_CHAR 0xB5 |
#define UBLOX_SYNCH2_CHAR 0x62 |
signed int GPS_Nick = 0; |
signed int GPS_Roll = 0; |
short int ublox_msg_state = UBLOX_IDLE; |
static uint8_t chk_a =0; //Checksum |
static uint8_t chk_b =0; |
short int gps_state,gps_sub_state; //Zustaende der Statemachine |
short int gps_updte_flag; |
signed int GPS_hdng_abs_2trgt; //Winkel zum Ziel bezogen auf Nordpol |
signed int GPS_hdng_rel_2trgt; //Winkel zum Ziel bezogen auf Nordachse des Kopters |
signed int GPS_dist_2trgt; //vorzeichenlose Distanz zum Ziel |
signed int gps_int_x,gps_int_y,gps_reg_x,gps_reg_y; |
static unsigned int rx_len; |
static unsigned int ptr_payload_data_end; |
unsigned int gps_alive_cnt; // Wird bei jedem gueltigen GPS Telegramm hochgezaehlt |
signed int hdng_2home,dist_2home; //Richtung und Entfernung zur home Position |
static signed gps_tick; //wird bei jedem Update durch das GPS Modul hochgezaehlt |
static short int hold_fast,hold_reset_int; //Flags fuer Hold Regler |
static uint8_t *ptr_payload_data; |
static uint8_t *ptr_pac_status; |
long int dist_flown; |
short int Get_GPS_data(void); |
NAV_POSUTM_t actual_pos; // Aktuelle Nav Daten werden hier im ublox Format abgelegt |
NAV_STATUS_t actual_status; // Aktueller Nav Status |
NAV_VELNED_t actual_speed; // Aktueller Geschwindigkeits und Richtungsdaten |
GPS_ABS_POSITION_t gps_act_position; // Alle wichtigen Daten zusammengefasst |
GPS_ABS_POSITION_t gps_home_position; // Die Startposition, beim Kalibrieren ermittelt |
GPS_REL_POSITION_t gps_rel_act_position; // Die aktuelle relative Position bezogen auf Home Position |
GPS_REL_POSITION_t gps_rel_hold_position; // Die gespeicherte Sollposition fuer GPS_ Hold Mode |
GPS_REL_POSITION_t gps_rel_start_position; // Die gespeicherte Ausgangsposition fuer GPS_ Home Mode |
// Initialisierung |
void GPS_Neutral(void) |
{ |
ublox_msg_state = UBLOX_IDLE; |
gps_state = GPS_CRTL_IDLE; |
gps_sub_state = GPS_CRTL_IDLE; |
actual_pos.status = 0; |
actual_speed.status = 0; |
actual_status.status = 0; |
gps_home_position.status = 0; // Noch keine gueltige Home Position |
gps_act_position.status = 0; |
gps_rel_act_position.status = 0; |
GPS_Nick = 0; |
GPS_Roll = 0; |
gps_updte_flag = 0; |
gps_int_x = 0; |
gps_int_y = 0; |
gps_alive_cnt = 0; |
} |
// Home Position sichern falls Daten verfuegbar sind. |
void GPS_Save_Home(void) |
{ |
short int n; |
n = Get_GPS_data(); |
if (n == 0) // Gueltige und aktuelle Daten ? |
{ |
// Neue GPS Daten liegen vor |
gps_home_position.utm_east = gps_act_position.utm_east; |
gps_home_position.utm_north = gps_act_position.utm_north; |
gps_home_position.utm_alt = gps_act_position.utm_alt; |
gps_home_position.status = 1; // Home Position gueltig |
} |
} |
// Relative Position zur Home Position bestimmen |
// Rueckgabewert 0= Daten sind aktuell und gueltig. 1= Keine Aenderung. 2= Daten ungueltig |
short int Get_Rel_Position(void) |
{ |
short int n = 0; |
n = Get_GPS_data(); |
if (n >=1) return (n); // nix zu tun, weil keine neue Daten da sind |
if (gps_alive_cnt < 400) gps_alive_cnt += 300; // Timeoutzaehler. Wird in Motorregler Routine ueberwacht und dekrementiert |
if (gps_home_position.status > 0) //Nur wenn Home Position vorliegt |
{ |
gps_rel_act_position.utm_east = (int) (gps_act_position.utm_east - gps_home_position.utm_east); |
gps_rel_act_position.utm_north = (int) (gps_act_position.utm_north - gps_home_position.utm_north); |
gps_rel_act_position.utm_alt = (int) (gps_act_position.utm_alt - gps_home_position.utm_alt); |
gps_rel_act_position.status = 1; // gueltige Positionsdaten |
n = 0; |
gps_updte_flag = 1; // zeigt an, dass neue Daten vorliegen. |
} |
else |
{ |
n = 2; //keine gueltigen Daten vorhanden |
gps_rel_act_position.status = 0; //keine gueltige Position weil keine home Position da ist. |
} |
return (n); |
} |
// Daten aus aktuellen ublox Messages extrahieren |
// Rueckgabewert 0= Daten sind aktuell und gueltig. 1= Keine Aenderung. 2= Daten ungueltig |
short int Get_GPS_data(void) |
{ |
short int n = 1; |
if (actual_pos.status == 0) return (1); //damit es schnell geht, wenn nix zu tun ist |
if ((actual_pos.status > 0) && (actual_status.status > 0) && (actual_speed.status > 0)) |
{ |
if (((actual_status.gpsfix_type & 0x03) >=2) && ((actual_status.nav_status_flag & 0x01) >=1)) // nur wenn Daten aktuell und gueltig sind |
{ |
gps_act_position.utm_east = actual_pos.utm_east/10; |
gps_act_position.utm_north = actual_pos.utm_north/10; |
gps_act_position.utm_alt = actual_pos.utm_alt/10; |
gps_act_position.speed_gnd = actual_speed.speed_gnd/10; |
gps_act_position.speed_gnd = actual_speed.speed_gnd/10; |
gps_act_position.heading = actual_speed.heading/100000; |
gps_act_position.status = 1; |
n = 0; //Daten gueltig |
} |
else |
{ |
gps_act_position.status = 0; //Keine gueltigen Daten |
n = 2; |
} |
actual_pos.status = 0; //neue ublox Messages anfordern |
actual_status.status = 0; |
actual_speed.status = 0; |
} |
return (n); |
} |
/* |
Daten vom GPS im ublox MSG Format auswerten |
Die Routine wird bei jedem Empfang eines Zeichens vom GPS Modul durch den UART IRQ aufgerufen |
// Die UBX Messages NAV_POSUTM, NAV_STATUS und NAV_VALED muessen aktiviert sein |
*/ |
void Get_Ublox_Msg(uint8_t rx) |
{ |
switch (ublox_msg_state) |
{ |
case UBLOX_IDLE: // Zuerst Synchcharacters pruefen |
if ( rx == UBLOX_SYNCH1_CHAR ) ublox_msg_state = UBLOX_SYNC1; |
else ublox_msg_state = UBLOX_IDLE; |
break; |
case UBLOX_SYNC1: |
if (rx == UBLOX_SYNCH2_CHAR) ublox_msg_state = UBLOX_SYNC2; |
else ublox_msg_state = UBLOX_IDLE; |
chk_a = 0,chk_b = 0; |
break; |
case UBLOX_SYNC2: |
if (rx == UBLOX_NAV_CLASS) ublox_msg_state = UBLOX_CLASS; |
else ublox_msg_state = UBLOX_IDLE; |
break; |
case UBLOX_CLASS: // Nur NAV Meldungen auswerten |
switch (rx) |
{ |
case UBLOX_NAV_POSUTM: |
ptr_pac_status = &actual_pos.status; |
if (*ptr_pac_status > 0) ublox_msg_state = UBLOX_IDLE; //Abbruch weil Daten noch nicht verwendet wurden |
else |
{ |
ptr_payload_data = &actual_pos; |
ptr_payload_data_end = &actual_pos.status; |
ublox_msg_state = UBLOX_LEN1; |
} |
break; |
case UBLOX_NAV_STATUS: |
ptr_pac_status = &actual_status.status; |
if (*ptr_pac_status > 0) ublox_msg_state = UBLOX_IDLE; |
else |
{ |
ptr_payload_data = &actual_status; |
ptr_payload_data_end = &actual_status.status; |
ublox_msg_state = UBLOX_LEN1; |
} |
break; |
case UBLOX_NAV_VELED: |
ptr_pac_status = &actual_speed.status; |
if (*ptr_pac_status > 0) ublox_msg_state = UBLOX_IDLE; |
else |
{ |
ptr_payload_data = &actual_speed; |
ptr_payload_data_end = &actual_speed.status; |
ublox_msg_state = UBLOX_LEN1; |
} |
break; |
default: |
ublox_msg_state = UBLOX_IDLE; |
break; |
} |
chk_a = UBLOX_NAV_CLASS + rx; |
chk_b = UBLOX_NAV_CLASS + chk_a; |
break; |
case UBLOX_LEN1: // Laenge auswerten |
rx_len = rx; |
chk_a += rx; |
chk_b += chk_a; |
ublox_msg_state = UBLOX_LEN2; |
break; |
case UBLOX_LEN2: // Laenge auswerten |
rx_len = rx_len + (rx *256); // Laenge ermitteln |
chk_a += rx; |
chk_b += chk_a; |
ublox_msg_state = UBLOX_PAYLOAD; |
break; |
case UBLOX_PAYLOAD: // jetzt Nutzdaten einlesen |
if (rx_len > 0) |
{ |
*ptr_payload_data = rx; |
chk_a += rx; |
chk_b += chk_a; |
--rx_len; |
if ((rx_len > 0) && (ptr_payload_data <= ptr_payload_data_end)) |
{ |
ptr_payload_data++; |
ublox_msg_state = UBLOX_PAYLOAD; |
} |
else ublox_msg_state = UBLOX_CKA; |
} |
else ublox_msg_state = UBLOX_IDLE; // Abbruch wegen Fehler |
break; |
case UBLOX_CKA: // Checksum pruefen |
if (rx == chk_a) ublox_msg_state = UBLOX_CKB; |
else ublox_msg_state = UBLOX_IDLE; // Abbruch wegen Fehler |
break; |
case UBLOX_CKB: // Checksum pruefen |
if (rx == chk_b) *ptr_pac_status = 1; // Paket ok |
ublox_msg_state = UBLOX_IDLE; |
break; |
default: |
ublox_msg_state = UBLOX_IDLE; |
break; |
} |
} |
//Zentrale Statemachine fuer alle GPS relevanten Regelungsablauefe |
short int GPS_CRTL(short int cmd) |
{ |
static unsigned int cnt; //Zaehler fuer diverse Verzoegerungen |
static signed int int_east,int_north; //Integrierer |
static signed int dist_north,dist_east; |
static signed int diff_east,diff_north; // Differenzierer (Differenz zum vorhergehenden x bzw. y Wert) |
static signed int diff_east_f,diff_north_f; // Differenzierer, gefiltert |
signed int n,diff_v; |
static signed int gps_g2t_act_v; // Aktuelle Geschwindigkeitsvorgabe fuer Home Funktion |
long signed int dev,n_l; |
signed int dist_frm_start_east,dist_frm_start_north; |
switch (cmd) |
{ |
case GPS_CMD_REQ_HOME: // Es soll zum Startpunkt zurueckgeflogen werden. |
if ((gps_state != GPS_CRTL_HOLD_ACTIVE) && (gps_state != GPS_CRTL_HOME_ACTIVE)) |
{ |
cnt++; |
if (cnt > 500) // erst nach Verzoegerung |
{ |
// Erst mal initialisieren |
cnt = 0; |
gps_tick = 0; |
hold_fast = 0; |
hold_reset_int = 0; // Integrator enablen |
int_east = 0, int_north = 0; |
gps_reg_x = 0, gps_reg_y = 0; |
dist_east = 0, dist_north = 0; |
diff_east_f = 0, diff_north_f= 0; |
diff_east = 0, diff_north = 0; |
dist_flown = 0; |
gps_g2t_act_v = 0; |
gps_sub_state = GPS_CRTL_IDLE; |
// aktuelle positionsdaten abspeichern |
if (gps_rel_act_position.status > 0) |
{ |
gps_rel_start_position.utm_east = gps_rel_act_position.utm_east; |
gps_rel_start_position.utm_north= gps_rel_act_position.utm_north; |
gps_rel_start_position.status = 1; // gueltige Positionsdaten |
gps_rel_hold_position.utm_east = gps_rel_act_position.utm_east; |
gps_rel_hold_position.utm_north = gps_rel_act_position.utm_north; |
gps_rel_hold_position.status = 1; // gueltige Positionsdaten |
//Richtung zur Home Position bezogen auf Nordpol bestimmen |
hdng_2home = arctan_i(-gps_rel_start_position.utm_east,-gps_rel_start_position.utm_north); |
// in Winkel 0...360 Grad umrechnen |
if (( gps_rel_start_position.utm_east < 0)) hdng_2home = ( 90-hdng_2home); |
else hdng_2home = (270 - hdng_2home); |
dist_2home = (int) get_dist(gps_rel_start_position.utm_east,gps_rel_start_position.utm_north,hdng_2home); //Entfernung zur Home Position bestimmen |
gps_state = GPS_CRTL_HOME_ACTIVE; |
return (GPS_STST_OK); |
} |
else |
{ |
gps_rel_start_position.status = 0; //Keine Daten verfuegbar |
gps_state = GPS_CRTL_IDLE; |
return(GPS_STST_ERR); // Keine Daten da |
} |
} |
else return(GPS_STST_PEND); // noch warten |
} |
break; |
// ****************************** |
case GPS_CMD_REQ_HOLD: // Die Lageregelung soll aktiviert werden. |
if (gps_state != GPS_CRTL_HOLD_ACTIVE) |
{ |
cnt++; |
if (cnt > 500) // erst nach Verzoegerung |
{ |
cnt = 0; |
// aktuelle positionsdaten abspeichern |
if (gps_rel_act_position.status > 0) |
{ |
hold_fast = 0; |
hold_reset_int = 0; // Integrator enablen |
int_east = 0, int_north = 0; |
gps_reg_x = 0, gps_reg_y = 0; |
dist_east = 0, dist_north = 0; |
diff_east_f = 0, diff_north_f= 0; |
diff_east = 0, diff_north = 0; |
gps_rel_hold_position.utm_east = gps_rel_act_position.utm_east; |
gps_rel_hold_position.utm_north = gps_rel_act_position.utm_north; |
gps_rel_hold_position.status = 1; // gueltige Positionsdaten |
gps_state = GPS_CRTL_HOLD_ACTIVE; |
return (GPS_STST_OK); |
} |
else |
{ |
gps_rel_hold_position.status = 0; //Keine Daten verfuegbar |
gps_state = GPS_CRTL_IDLE; |
return(GPS_STST_ERR); // Keine Daten da |
} |
} |
else return(GPS_STST_PEND); // noch warten |
} |
break; |
case GPS_CMD_STOP: // Lageregelung beenden |
cnt = 0; |
GPS_Nick = 0; |
GPS_Roll = 0; |
gps_int_x = 0; |
gps_int_y = 0; |
gps_sub_state = GPS_CRTL_IDLE; |
gps_state = GPS_CRTL_IDLE; |
return (GPS_STST_OK); |
break; |
default: |
return (GPS_STST_ERR); |
break; |
} |
switch (gps_state) |
{ |
case GPS_CRTL_IDLE: |
cnt = 0; |
return (GPS_STST_OK); |
break; |
case GPS_CRTL_HOME_ACTIVE: // Rueckflug zur Basis |
//Der Sollwert des Lagereglers wird der Homeposition angenaehert |
if (gps_rel_start_position.status >0) |
{ |
if ((gps_updte_flag > 0) && (gps_sub_state !=GPS_HOME_FINISHED)) // nur wenn neue GPS Daten vorliegen und nicht schon alles fertig ist |
{ |
gps_tick++; |
int d1,d2,d3; |
d1 = abs (gps_rel_hold_position.utm_east - gps_rel_act_position.utm_east ); |
d2 = abs (gps_rel_hold_position.utm_north - gps_rel_act_position.utm_north ); |
d3 = (dist_2home - (int)dist_flown); // Restdistanz zum Ziel |
if (d3 > GPS_G2T_DIST_MAX_STOP) // Schneller Rueckflug, noch weit weg vom Ziel |
{ |
if ((d1 < GPS_G2T_FAST_TOL) && (d2 < GPS_G2T_FAST_TOL)) //nur weiter wenn Lage innerhalb der Toleranz |
{ |
if (gps_g2t_act_v < GPS_G2T_V_MAX) gps_g2t_act_v++; //Geschwindigkeit langsam erhoehen |
dist_flown +=(long)gps_g2t_act_v; // Vorgabe der Strecke anhand der Geschwindigkeit |
gps_sub_state = GPS_HOME_FAST_IN_TOL; |
} |
else //Den Lageregler in Ruhe arbeiten lassen weil ausserhalb der Toleranz |
{ |
if (gps_g2t_act_v > 1) gps_g2t_act_v--; // Geschwindigkeit reduzieren |
dist_flown++; //Auch ausserhalb der Toleranz langsam erhoehen |
gps_sub_state = GPS_HOME_FAST_OUTOF_TOL; |
} |
hold_reset_int = 0; // Integrator einsschalten |
hold_fast = 1; // Regler fuer schnellen Flug |
dist_frm_start_east = (int)((dist_flown * (long)sin_i(hdng_2home))/1000); |
dist_frm_start_north = (int)((dist_flown * (long)cos_i(hdng_2home))/1000); |
gps_rel_hold_position.utm_east = gps_rel_start_position.utm_east + dist_frm_start_east; //naechster Zielpunkt |
gps_rel_hold_position.utm_north = gps_rel_start_position.utm_north + dist_frm_start_north; //naechster Zielpunkt |
} |
else if (d3 > GPS_G2T_DIST_HOLD) //Das Ziel naehert sich, deswegen abbremsen |
{ |
if ((d1 < GPS_G2T_NRML_TOL) && (d2 < GPS_G2T_NRML_TOL)) |
{ |
dist_flown += GPS_G2T_V_RAMP_DWN; // Vorgabe der Strecke anhand der Geschwindigkeit |
gps_sub_state = GPS_HOME_RMPDWN_IN_TOL; |
} |
else |
{ |
dist_flown++; //Auch ausserhalb der Toleranz langsam erhoehen |
gps_sub_state = GPS_HOME_RMPDWN_OUTOF_TOL; |
} |
hold_reset_int = 0; // Integrator ausschalten |
hold_fast = 1; // Wieder normal regeln |
dist_frm_start_east = (int)((dist_flown * (long)sin_i(hdng_2home))/1000); |
dist_frm_start_north = (int)((dist_flown * (long)cos_i(hdng_2home))/1000); |
gps_rel_hold_position.utm_east = gps_rel_start_position.utm_east + dist_frm_start_east; //naechster Zielpunkt |
gps_rel_hold_position.utm_north = gps_rel_start_position.utm_north + dist_frm_start_north; //naechster Zielpunkt |
} |
else //Soll-Ziel fast erreicht, Jetzt noch Reste ausgleichen, weil Zielpunkt nicht exakt bestimmt werden konnte (Fehler in Winkelfkt) |
{ |
if ((d1 < GPS_G2T_NRML_TOL) && (d2 < GPS_G2T_NRML_TOL)) // Jetzt bis zum Zielpunkt regeln |
{ |
gps_sub_state = GPS_HOME_IN_TOL; |
hold_fast = 0; // Wieder normal regeln |
hold_reset_int = 0; // Integrator wieder aktivieren |
if (gps_rel_hold_position.utm_east >= GPS_G2T_V_MIN) gps_rel_hold_position.utm_east -= GPS_G2T_V_MIN; |
else if (gps_rel_hold_position.utm_east <= -GPS_G2T_V_MIN ) gps_rel_hold_position.utm_east += GPS_G2T_V_MIN; |
if (gps_rel_hold_position.utm_north >= GPS_G2T_V_MIN) gps_rel_hold_position.utm_north -= GPS_G2T_V_MIN; |
else if (gps_rel_hold_position.utm_north <= - GPS_G2T_V_MIN ) gps_rel_hold_position.utm_north += GPS_G2T_V_MIN; |
if ((abs(gps_rel_hold_position.utm_east) <= GPS_G2T_V_MIN) && (abs(gps_rel_hold_position.utm_north) <=GPS_G2T_V_MIN)) |
{ |
gps_rel_hold_position.utm_east = 0; |
gps_rel_hold_position.utm_north = 0; |
gps_sub_state = GPS_HOME_FINISHED; |
} |
} |
else gps_sub_state = GPS_HOME_OUTOF_TOL; |
} |
} |
gps_state = GPS_CRTL_HOLD_ACTIVE; //Zwischensprung |
return (GPS_STST_OK); |
} |
else // Keine GPS Daten verfuegbar, deswegen Abbruch |
{ |
gps_state = GPS_CRTL_IDLE; |
return (GPS_STST_ERR); |
} |
break; |
case GPS_CRTL_HOLD_ACTIVE: // Hier werden die Daten fuer Nick und Roll errechnet |
if (gps_updte_flag >0) // nur wenn neue GPS Daten vorliegen |
{ |
gps_updte_flag = 0; |
// ab hier wird geregelt |
diff_east = -dist_east; //Alten Wert fuer Differenzier schon mal abziehen |
diff_north = -dist_north; |
dist_east = gps_rel_hold_position.utm_east - gps_rel_act_position.utm_east; |
dist_north = gps_rel_hold_position.utm_north - gps_rel_act_position.utm_north; |
int_east += dist_east; |
int_north += dist_north; |
diff_east += dist_east; // Differenz zur vorhergehenden East Position |
diff_north += dist_north; // Differenz zur vorhergehenden North Position |
if (hold_fast > 0) // wegen Sollpositionsspruengen im Fast Mode Differenzierer daempfen |
{ |
diff_east_f = ((diff_east_f *2)/3) + (diff_east *1/3); //Differenzierer filtern |
diff_north_f = ((diff_north_f *2)/3) + (diff_north*1/3); //Differenzierer filtern |
} |
else // schwache Filterung |
{ |
diff_east_f = ((diff_east_f * 1)/4) + ((diff_east *3)/4); //Differenzierer filtern |
diff_north_f = ((diff_north_f * 1)/4) + ((diff_north*3)/4); //Differenzierer filtern |
} |
#define GPSINT_MAX 30000 //neuer Wert ab 7.10.2007 Begrenzung |
if ((abs(int_east) > GPSINT_MAX) || (abs(int_north)> GPSINT_MAX)) //Bei zu hohem Wert Integrator auf Wert halten |
{ |
int_east -= dist_east; |
int_north -= dist_north; |
} |
if (hold_reset_int > 0) //Im Schnellen Mode Integrator abschalten |
{ |
int_east = 0; |
int_north = 0; |
} |
// Variable Verstarkung fuer Differenzierer ermitteln. Je weiter vom Ziel wir entfernt sind |
// desto groesser wird der Faktor. Es gibt aber einen Maximalwert. Bei 0 ist die Verstaerkung immer 1 |
signed long dist,int_east1,int_north1; |
int phi; |
phi = arctan_i(abs(dist_north),abs(dist_east)); |
dist = get_dist(dist_east,dist_north,phi); //Zunaechst Entfernung zum Ziel ermitteln |
if (hold_fast == 0) // je Nach Modus andere Verstaerkungskurve fuer Differenzierer |
{ |
diff_v = (int)((dist * (GPS_DIFF_NRML_MAX_V - 10)) / GPS_DIFF_NRML_MAX_D) +10; //Verstaerkung * 10 |
if (diff_v > GPS_DIFF_NRML_MAX_V) diff_v = GPS_DIFF_NRML_MAX_V; //begrenzen |
} |
else |
{ |
diff_v = (int)((dist * (GPS_DIFF_FAST_MAX_V - 10)) / GPS_DIFF_FAST_MAX_D) +10; //Verstaerkung * 10 |
if (diff_v > GPS_DIFF_FAST_MAX_V) diff_v = GPS_DIFF_FAST_MAX_V; //begrenzen |
} |
int diff_p; //Vom Modus abhaengige zusaetzliche Verstaerkung |
if (hold_fast > 0) diff_p = GPS_PROP_FAST_V; |
else diff_p = GPS_PROP_NRML_V; |
//I Werte begrenzen |
#define INT1_MAX (20 * GPS_V) |
int_east1 = ((((long)int_east) * Parameter_UserParam2)/32); |
int_north = ((((long)int_north) * Parameter_UserParam2)/32); |
if (int_east1 > INT1_MAX) int_east1 = INT1_MAX; //begrenzen |
else if (int_east1 < -INT1_MAX) int_east1 = -INT1_MAX; |
if (int_north1 > INT1_MAX) int_north1 = INT1_MAX; //begrenzen |
else if (int_north1 < -INT1_MAX) int_north1 = -INT1_MAX; |
//PID Regler Werte aufsummieren |
gps_reg_x = ((int)int_east1 + ((dist_east * Parameter_UserParam1 * diff_p)/(8*2))+ ((diff_east_f * diff_v * Parameter_UserParam3)/10)); // I + P +D Anteil X Achse |
gps_reg_y = ((int)int_north1 + ((dist_north * Parameter_UserParam1 * diff_p)/(8*2))+ ((diff_north_f * diff_v * Parameter_UserParam3)/10)); // I + P +D Anteil Y Achse |
//Ziel-Richtung bezogen auf Nordpol bestimmen |
GPS_hdng_abs_2trgt = arctan_i(gps_reg_x,gps_reg_y); |
// in Winkel 0...360 Grad umrechnen |
if ((gps_reg_x >= 0)) GPS_hdng_abs_2trgt = ( 90-GPS_hdng_abs_2trgt); |
else GPS_hdng_abs_2trgt = (270 - GPS_hdng_abs_2trgt); |
// Relative Richtung in bezug auf Nordachse des Kopters errechen |
n= GyroKomp_Int/GYROKOMP_INC_GRAD_DEFAULT; |
GPS_hdng_rel_2trgt = GPS_hdng_abs_2trgt - n; |
if ((GPS_hdng_rel_2trgt >180) && (GPS_hdng_abs_2trgt >=180)) GPS_hdng_rel_2trgt = GPS_hdng_rel_2trgt-360; |
else if (GPS_hdng_rel_2trgt >180) GPS_hdng_rel_2trgt = 360 - GPS_hdng_rel_2trgt; |
else if (GPS_hdng_rel_2trgt <-180) GPS_hdng_rel_2trgt = 360 + GPS_hdng_rel_2trgt; |
// Regelabweichung aus x,y zu Ziel in Distanz umrechnen |
if (abs(gps_reg_x) > abs(gps_reg_y) ) |
{ |
dev = (long)gps_reg_x; //Groesseren Wert wegen besserer Genauigkeit nehmen |
dev = abs((dev *1000) / (long) sin_i(GPS_hdng_abs_2trgt)); |
} |
else |
{ |
dev = (long)gps_reg_y; |
dev = abs((dev *1000) / (long) cos_i(GPS_hdng_abs_2trgt)); |
} |
GPS_dist_2trgt = (int) dev; |
// Winkel und Distanz in Nick und Rollgroessen umrechnen |
GPS_Roll = (int) +( (dev * (long) sin_i(GPS_hdng_rel_2trgt))/1000); |
GPS_Nick = (int) -( (dev * (long) cos_i(GPS_hdng_rel_2trgt))/1000); |
if (GPS_Roll > (GPS_NICKROLL_MAX * GPS_V)) GPS_Roll = (GPS_NICKROLL_MAX * GPS_V); |
else if (GPS_Roll < -(GPS_NICKROLL_MAX * GPS_V)) GPS_Roll = -(GPS_NICKROLL_MAX * GPS_V); |
if (GPS_Nick > (GPS_NICKROLL_MAX * GPS_V)) GPS_Nick = (GPS_NICKROLL_MAX * GPS_V); |
else if (GPS_Nick < -(GPS_NICKROLL_MAX * GPS_V)) GPS_Nick = -(GPS_NICKROLL_MAX * GPS_V); |
//Kleine Werte verstaerken, Grosse abschwaechen |
n = sin_i((GPS_Roll*90)/(GPS_NICKROLL_MAX * GPS_V)); |
n_l = ((long) GPS_NICKROLL_MAX * (long) n)/1000; |
GPS_Roll = (int) n_l; |
n = sin_i((GPS_Nick*90)/(GPS_NICKROLL_MAX * GPS_V)); |
n_l = ((long) GPS_NICKROLL_MAX * (long) n)/1000; |
GPS_Nick = (int) n_l; |
if ((abs(dist_east) > GPS_DIST_MAX) || (abs(dist_north) > GPS_DIST_MAX)) // bei zu grossem Abstand abbrechen |
{ |
GPS_Roll = 0; |
GPS_Nick = 0; |
gps_state = GPS_CRTL_IDLE; |
return (GPS_STST_ERR); |
break; |
} |
else |
{ |
if ( cmd == GPS_CMD_REQ_HOME ) gps_state = GPS_CRTL_HOME_ACTIVE; // State umsetzen |
return (GPS_STST_OK); |
} |
} |
else |
{ |
if ( cmd == GPS_CMD_REQ_HOME ) gps_state = GPS_CRTL_HOME_ACTIVE; // State umsetzen |
return (GPS_STST_OK); |
} |
break; |
default: |
gps_state = GPS_CRTL_IDLE; |
return (GPS_STST_ERR); |
break; |
} |
return (GPS_STST_ERR); |
} |
/branches/salvo_gps/Basis_V0066c/trunk/Hex-Files/BootLoader_MEGA644_20MHZ_V0_1.hex |
---|
0,0 → 1,64 |
:10F8000011241FBECFEFD0E1DEBFCDBF11E0A0E0DD |
:10F81000B1E0E0EEFBEF02C005900D92A030B10721 |
:10F82000D9F712E0A0E0B1E001C01D92A230B1070B |
:10F83000E1F70C943B7C0C941D7C0895982F8091EB |
:10F84000C00085FFFCCF9093C60008958091C00052 |
:10F850008823E4F78091C600992708958DE40E94DB |
:10F860001E7C8BE40E941E7C82E40E941E7C8CE441 |
:10F870000E941E7C0895CFEFD0E1DEBFCDBFE0E057 |
:10F88000F0E014915F01772474BE98E10FB6F8940C |
:10F8900090936000109260000FBE7092C5008AE2E3 |
:10F8A0008093C4008091C00082608093C0009093D8 |
:10F8B000C10086E08093C200EF01072D8091C00057 |
:10F8C00087FF0DC0013031F48091C6008A3AB1F152 |
:10F8D00000E005C08091C6008B3109F401E0CE0143 |
:10F8E00021968436910528F11F3F41F0112331F014 |
:10F8F000E0910001F091010109951BC01092C50033 |
:10F900008AE28093C4008AE00E941E7C8DE00E94FF |
:10F910001E7C86E50E941E7C80E30E941E7C8EE297 |
:10F920000E941E7C81E30E941E7C8AE30E941E7C52 |
:10F9300005C080E593EC0197F1F7C0CF0E942E7CC3 |
:10F940000E94267C813611F489E547C1813471F427 |
:10F950000E94267CA82EBB24BA2CAA240E94267CB6 |
:10F960009927A82AB92AB694A79406C1823629F401 |
:10F9700089E50E941E7C81E00BC1823409F083C0BE |
:10F980000E94267C9927D82FCC270E94267C992775 |
:10F99000C82BD92B0E94267C082F12E0812E11E063 |
:10F9A000912EEE24FF2464010894811C911CEC1616 |
:10F9B000FD0618F40E94267C01C08FEFD6018C93BF |
:10F9C0000894E11CF11CBFEFEB16F10461F358F34E |
:10F9D000E4E77E1609F0DEC0063409F03DC0FFEF13 |
:10F9E000AF16F7EFBF0608F033C0DE01A5016627AA |
:10F9F0007727440F551F661F771F6A017B01C2E0FE |
:10FA0000D1E001E08991992729913327322F2227CC |
:10FA1000822B932B0C01FA0100935700E8951124D7 |
:10FA20004E5F5F4F6F4F7F4F129761F785E0F60192 |
:10FA300080935700E89507B600FCFDCF81E18093E5 |
:10FA40005700E89576956795579547955A0194C064 |
:10FA500080E00E941E7C90C0053409F08DC0F50145 |
:10FA60009E01A2E0B1E0E1BD8F2F992782BD8D916B |
:10FA700080BD3196FA9AF99AF999FECF215030401B |
:10FA800091F75F0179C0873609F047C00E94267C54 |
:10FA90009927D82ECC240E94267C9927C82AD92AB7 |
:10FAA0000E94267C863411F5E6016501EE24FF24D0 |
:10FAB000CC0CDD1CEE1CFF1CF60105911491802F6F |
:10FAC0000E941E7C812F99270E941E7C82E090E07C |
:10FAD000A0E0B0E0C80ED91EEA1EFB1E229761F717 |
:10FAE000F694E794D794C79456012ACF853409F049 |
:10FAF00027CF7501E1BC8F2D992782BDF89A089414 |
:10FB0000E11CF11C80B50E941E7C0894C108D1083C |
:10FB1000C114D10479F7570113CF853601F594E765 |
:10FB2000791651F580E090E0A0E0B0E023E0FC0120 |
:10FB300020935700E89507B600FCFDCF80509F4FFB |
:10FB4000AF4FBF4F8F3FE7EF9E07E0E0AE07E0E02B |
:10FB5000BE0768F381E180935700E8950DC08534B6 |
:10FB600069F488E190E02CE00FB6F894A8958093B2 |
:10FB700060000FBE209360008DE02FC08035E1F360 |
:10FB80008C34D1F3803711F483E527C0843721F416 |
:10FB90000E941E7C80E021C0843521F40E94267CD6 |
:10FBA000782EEACF8B3109F4C9CE8A3A09F4C6CE51 |
:10FBB000863529F480E30E941E7C81E30EC08337E2 |
:10FBC00041F489E00E941E7C86E90E941E7C8EE141 |
:10FBD00004C08B3109F4B4CE8FE30E941E7CB0CEFA |
:040000030000F80001 |
:00000001FF |
/branches/salvo_gps/Basis_V0066c/trunk/Hex-Files/Flight-Ctrl_MEGA644_V0_66b.hex |
---|
0,0 → 1,1840 |
:100000000C9404020C941F020C941F020C941F0207 |
:100010000C941F020C941F020C941F020C941F02DC |
:100020000C941F020C94CC0B0C941F020C941F0216 |
:100030000C94A8150C941F020C941F020C941F0220 |
:100040000C941F020C941F020C94C50A0C941F02FE |
:100050000C9461040C941F020C942B040C941F024A |
:100060000C94D10C0C941F020C94D2140C941F020B |
:100070000A0D466C69676874436F6E74726F6C0A20 |
:100080000D48617264776172653A25642E25640AB1 |
:100090000D536F6674776172653A5625642E256438 |
:1000A000256320000A0D3D3D3D3D3D3D3D3D3D3D2F |
:1000B0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D70 |
:1000C0003D3D3D3D000A0D496E69742E2045455069 |
:1000D000524F4D3A2047656E6572696572652044DE |
:1000E000656661756C742D506172616D65746572C1 |
:1000F0002E2E2E000A0D42656E75747A65205061B1 |
:1001000072616D657465727361747A202564000A8A |
:100110000D4162676C65696368204C756674647232 |
:1001200075636B73656E736F722E2E004F4B0A0DE5 |
:10013000000A0D537465756572756E673A20004844 |
:10014000656164696E67486F6C64004E65757472B2 |
:10015000616C000A0A0D002E005B25695D002B2BE7 |
:10016000204D696B726F4B6F70746572202B2B0082 |
:1001700048573A5625642E25642053573A25642E55 |
:10018000256425630053657474696E673A2025649D |
:10019000200028632920486F6C67657220427573C0 |
:1001A0007300486F6568653A202020202025356956 |
:1001B00000536F6C6C486F6568653A20253569009F |
:1001C0004C756674647275636B3A20253569004F0F |
:1001D00066662020202020203A20253569004B65C6 |
:1001E000696E65200048F668656E726567656C75B6 |
:1001F0006E6700616B742E204C616765004E696309 |
:100200006B3A20202020202025356900526F6C6C2D |
:100210003A202020202020253569004B6F6D706129 |
:1002200073733A202020253569004B313A25346913 |
:1002300020204B323A25346920004B333A2534696B |
:1002400020204B343A25346920004B353A25346957 |
:1002500020204B363A25346920004B373A25346943 |
:1002600020204B383A25346920004E693A253469FC |
:100270002020526F3A253469200047733A253469AB |
:10028000202047693A253469200050313A253469E5 |
:10029000202050323A253469200050333A25346901 |
:1002A000202050343A25346920004779726F202D80 |
:1002B0002053656E736F72004E69636B202534693D |
:1002C00020282533692900526F6C6C202534692061 |
:1002D000282533692900476965722025346920285B |
:1002E00025336929004E69636B2025346920282550 |
:1002F00033692900526F6C6C20253469202825331E |
:1003000069290047696572202534692028253369E9 |
:100310002900414343202D2053656E736F72004EB8 |
:1003200069636B2025346920282533692900526FC1 |
:100330006C6C2025346920282533692900486F63B7 |
:100340006820253469202825336929005370616E9F |
:100350006E756E673A202025356900456D70662EF2 |
:10036000506567656C3A253569004B6F6D70617338 |
:100370007320202020202020005269636874756E4D |
:10038000673A2020253569004D657373776572746F |
:100390003A20202535690053746172743A20202078 |
:1003A000202025356900506F7469313A20202533AB |
:1003B0006900506F7469323A202025336900506F0C |
:1003C0007469333A202025336900506F7469343AD8 |
:1003D000202025336900536572766F202000536515 |
:1003E00074706F696E742020253369005374656CD6 |
:1003F0006C756E673A202533690052616E67653A05 |
:100400002533692D2533690011241FBECFEFD0E1BC |
:10041000DEBFCDBF11E0A0E0B1E0E4E3F2E702C04F |
:1004200005900D92A23AB107D9F715E0A2EAB1E022 |
:1004300001C01D92A23AB107E1F70C945A020C9444 |
:100440000000FB01863008F085E0489FD0011124B0 |
:10045000AC59BF4F842F9927019724F00E94063989 |
:100460000192FACF0895282FFB01863008F025E08D |
:10047000429FD0011124AC59BF4F842F9927019777 |
:1004800024F001900E940E39FACFA2E0B0E0022ED3 |
:100490000E940E390895A2E0B0E09D010E94063945 |
:1004A000802D863028F082E0D901082E0E940E3976 |
:1004B00099270895CFEFD0E1DEBFCDBF14B815B8AE |
:1004C00097EEE92E93E0F92E8EEC9FEFE80EF91EE1 |
:1004D000F7FEFACF88EEE82E83E0F82E189B02C0D4 |
:1004E0008BE001C08AE08093000181E887B98FEF3B |
:1004F00088B98BE184B981E085B98EE38AB9579ACE |
:1005000087EF8BB984B7877F84BF80916000886153 |
:10051000809360001092600080ED97E09093BD01A1 |
:100520008093BC01109206021092050210920305FE |
:1005300010920205109208021092070210920A020D |
:1005400010920902809100018A3011F4289801C0AC |
:10055000289A0E947C0B0E9449070E9493150E94D2 |
:10056000830C0E949B1478941092010482E480937F |
:10057000020486E08093030482E690E09F938F93C9 |
:1005800082E490E09F938F931F921F9280910001CD |
:100590006AE00E949638892F99279F938F938091C4 |
:1005A00000010E94963899279F938F9380E790E0EF |
:1005B0009F938F931F920E943B088DB79EB70D9615 |
:1005C0000FB6F8949EBF0FBE8DBF84EA90E09F9354 |
:1005D0008F931F920E943B08299A0F900F900F90C3 |
:1005E00001E010E0D8010E940639802D823461F1CB |
:1005F00085EC90E09F938F931F920E943B080E948E |
:100600005416C0E00F900F900F90C23039F0C330F5 |
:1006100019F40E945E1704C0C43010F00E94D9166D |
:1006200041E46AE275E08C2F0E943302CF5FC6304E |
:1006300060F3A2E0B0E083E0082E0E940E3982E46D |
:10064000D801082E0E940E390E944B0241E46AE252 |
:1006500075E00E9421020E944B0299279F938F937D |
:1006600084EF90E09F938F931F920E943B088091AC |
:1006700032050F900F900F900F900F9080FF20C0C9 |
:100680008FE091E09F938F931F920E943B0888EE2A |
:1006900093E00E94730B7C010E94890C0F900F90D5 |
:1006A0000F90C7010E94A20B8823D9F38CE291E03E |
:1006B0009F938F931F920E943B080F900F900F9073 |
:1006C0000E945319809100018A3011F4289801C0CA |
:1006D000289A80ED97E09093BD018093BC0188EE4D |
:1006E00093E09093FC038093FB0385E58093F603EE |
:1006F00081E391E09F938F931F920E943B0880912A |
:1007000032050F900F900F9082FF03C08FE391E0AE |
:1007100002C08BE491E09F938F931F920E943B084D |
:100720000F900F900F9083E591E09F938F931F920E |
:100730000E943B080E94A90F88E893E190938701EB |
:10074000809386010F900F900F908091C0018823B5 |
:1007500009F453C01092C0015B9A0E9427235B9852 |
:100760000E949D20209100012A3011F4289801C098 |
:10077000289A80910101882319F08150809301010A |
:1007800080910B02882329F080910B028150809385 |
:100790000B028091860190918701892B01F585E0FC |
:1007A00090E090938701809386010E94B514809118 |
:1007B0000301909104018F5F9F4FF9F4809104022F |
:1007C0008823D9F080E197E29093BD018093BC012A |
:1007D00080E890E090930401809303010EC0809123 |
:1007E00086019091870101979093870180938601FC |
:1007F0002A3011F4289801C0289A0E9467070E94A5 |
:100800004B06C7010E94A20B882309F49ECF80915A |
:100810004205282F332780910D0190910E018217F8 |
:1008200093079CF480910301909104018F5F9F4F87 |
:1008300061F480E797E19093BD018093BC0180E073 |
:1008400093E0909304018093030184E690E00E947A |
:10085000730B7C017ACF1F920F920FB60F92112467 |
:100860008F939F93EF93FF93809102018823E1F48C |
:100870008091B1019091B20101969093B201809361 |
:10088000B101FC01E853FD4FE081ED3019F08639EC |
:10089000910539F41092B2011092B10181E0809378 |
:1008A0000201E093C60004C01092B2011092B1019F |
:1008B000FF91EF919F918F910F900FBE0F901F901E |
:1008C00018951F920F920FB60F9211242F933F93FA |
:1008D0004F935F938F939F93AF93BF93EF93FF9348 |
:1008E00090E08091C6008093AC015091B7015639D9 |
:1008F00010F09093B8018091AC018D3009F05FC089 |
:100900008091B801823009F05AC09093B801852FC8 |
:100910009927855F9B4FFC01329740812091B3015D |
:100920003091B401241B3109DC0111978C91281BF3 |
:100930003109C9019F709093B4018093B30146E0DF |
:10094000969587954A95E1F7982F935C9093B5011A |
:100950002F733070235C2093B6018081981729F49F |
:100960008C91281711F491E006C090E08091A901C4 |
:100970008F5F8093A9018091AB01882309F06EC03D |
:10098000992309F46BC081E08093AB015093A801D7 |
:10099000E52FFF27E55FFB4F8DE0808380910D04FD |
:1009A000823509F05BC088E190E02CE00FB6F89446 |
:1009B000A895809360000FBE209360004FC02091E7 |
:1009C000B801822F992781309105F9F08230910585 |
:1009D0001CF4892B21F040C0029711F13DC0809199 |
:1009E000AC01833239F48091AB01882319F481E0A2 |
:1009F0008093B8018091AC0180930B0481E08093D7 |
:100A0000B7018091AC01992722C02F5F2093B801D4 |
:100A1000E52FFF27E55FFB4F8091AC01808309C084 |
:100A2000E52FFF27E55FFB4F8091AC0180835639AE |
:100A300020F45F5F5093B70102C01092B80120917B |
:100A4000AC018091B3019091B401820F911D9093FC |
:100A5000B4018093B30102C01092B801FF91EF91ED |
:100A6000BF91AF919F918F915F914F913F912F9146 |
:100A70000F900FBE0F901F901895AC01A0E0B0E052 |
:100A80009D01A817B90748F4E8ECF2E08191280F1E |
:100A9000311D1196A417B507C8F33F70FD01E85347 |
:100AA000FD4FC90156E0969587955A95E1F7835C0D |
:100AB00080831196FD01E853FD4F2F733070822F14 |
:100AC000835C8083A753BD4F8DE08C93109202010D |
:100AD0008091C8028093C60008951F93CF93DF933F |
:100AE000382FEA01722F10E083E28093C8026093EE |
:100AF000C9023093CA02A3E0B0E0772309F458C0DA |
:100B0000772311F4972F07C0FE01E10FF11D1F5F3E |
:100B10009081715011F4472F0EC0FE01E10FF11DBD |
:100B20001F5F4081715039F0FE01E10FF11D1F5F21 |
:100B30006081715001C0672FFD01E853FD4F892F7F |
:100B400086958695835C80831196FD01E853FD4F61 |
:100B5000892F99278370907024E0880F991F2A9518 |
:100B6000E1F755279A0194E0369527959A95E1F794 |
:100B7000822B835C80831196FD01E853FD4F4F70FB |
:100B80005070440F551F440F551F862F992726E09C |
:100B9000969587952A95E1F7842B835C808311963F |
:100BA000FD01E853FD4F6F73635C60831196A5CF21 |
:100BB000CD010E943D05DF91CF911F9108951F93B4 |
:100BC000CF93DF93EC0110E0662309F460C0A22FFD |
:100BD000BB271297E42FFF27E55FFB4F30813D5382 |
:100BE0004F5FE42FFF27E55FFB4F50815D534F5F61 |
:100BF000E42FFF27E55FFB4F70817D534F5FE42FAC |
:100C0000FF27E55FFB4FE081ED534F5F842F99276E |
:100C1000A817B907E4F1832F9927880F991F880F28 |
:100C2000991F352F32953F70382B852F99278F705C |
:100C30009070F4E0880F991FFA95E1F7572F5695B9 |
:100C40005695582B872F99278370907076E0880FE0 |
:100C5000991F7A95E1F78E2B61506F3FC1F0FE012D |
:100C6000E10FF11D30831F5F61506F3F81F0FE0186 |
:100C7000E10FF11D50831F5F61506F3F41F0FE0196 |
:100C8000E10FF11D80831F5F662309F0A3CFDF9181 |
:100C9000CF911F910895CF93DF93CDB7DEB7229701 |
:100CA0000FB6F894DEBF0FBECDBF8091AB01882395 |
:100CB00009F4D4C08FEF8093010180910D0499272E |
:100CC000813791059CF48C3691050CF07FC08736F6 |
:100CD000910509F455C08836910524F483369105B1 |
:100CE000A1F0BAC08836910519F1B6C084379105D4 |
:100CF000D1F1853791052CF48137910509F444C071 |
:100D0000ABC086379105C1F1A7C02091A80143E08F |
:100D10006BE086EF93E00E94DF058091E401909103 |
:100D2000F803892B8093E40181E08093AE0194C0A5 |
:100D30002091A80143E062E0CE0101960E94DF0508 |
:100D40008091E4019981892B8093E4018A818F3F0E |
:100D500021F481E08093A60102C01092A60181E0F7 |
:100D60008093AF0179C02091A80143E064E082EA5A |
:100D700091E00E94DF0570C081E08093AD016CC0FE |
:100D800081E08093B00168C02091A80143E062E057 |
:100D9000CE0101960E94DF0589818F3F61F0863088 |
:100DA00010F085E0898341E46AE275E089810E9460 |
:100DB0002102898102C00E944B0221E44AE255E0EF |
:100DC0006091C702855B0E946D0546C02091A80115 |
:100DD00043E061E48AE295E00E94DF0580910D0422 |
:100DE00041E46AE275E08B560E943302A2E0B0E073 |
:100DF00080910D048B56082E0E940E398091550566 |
:100E00009927AA27BB27BC01CD0124EC39E040E09B |
:100E100050E00E947738DC01CB01809382019093EF |
:100E20008301A0938401B093850180915605992791 |
:100E3000AA27BB27BC01CD010E947738DC01CB017A |
:100E400080937E0190937F01A0938001B0938101F4 |
:100E50000E944B020E94E3171092AB0122960FB63C |
:100E6000F894DEBF0FBECDBFDF91CF910895CF9331 |
:100E7000C82F8A3019F48DE00E9437078091C00096 |
:100E800085FFFCCFC093C60080E090E0CF9108952D |
:100E9000089588E18093C1008091C00082608093B2 |
:100EA000C0008091C10080688093C1008091C10022 |
:100EB00080648093C1008AE28093C40088EC90E053 |
:100EC0000E94730B9093F5038093F403089580912F |
:100ED0000201882309F474C08091B001882371F065 |
:100EE00080910201882351F02BE046EF53E060919E |
:100EF000C70287E40E946D051092B0018091F4034F |
:100F00009091F5030E94A20B882321F48091AE01F9 |
:100F10008823B1F080910201882391F022E441EA14 |
:100F200054E06091C70284E40E946D051092AE0106 |
:100F300084EF91E00E94730B9093F5038093F40388 |
:100F40008091AF01882351F180910201882331F112 |
:100F50000E94B20F1092AF013091B901832F8F5FC1 |
:100F60008093B901843021F06091A601662359F085 |
:100F700026E14EEF54E060E084E30E946D058FEFC0 |
:100F80008093B9010BC024E1829FC0011124815FCD |
:100F90009E4FAC01832F8F5C0E946D058091AD0147 |
:100FA000882371F080910201882351F02AE041E00A |
:100FB00054E06091C70286E50E946D051092AD0174 |
:100FC0000895982F8091E304813069F48091E501C0 |
:100FD000E82FFF27E15FFE4F90838F5F8093E5014D |
:100FE00021E030E005C0892F0E943707282F3327E2 |
:100FF000C90108950F931F93CF93DF938C01EB01E9 |
:10100000672B39F0F80181918F010E94E107219748 |
:10101000C9F7DF91CF911F910F9108950F931F93FF |
:10102000CF93DF938C01EB01672B41F0F8010F5F49 |
:101030001F4F84910E94E1072197C1F7DF91CF9163 |
:101040001F910F910895CF93C82F181634F480E2A2 |
:101050000E94E107C1501C16D4F3CF910895CF939D |
:10106000C82F181634F480E30E94E107C1501C1603 |
:10107000D4F3CF9108952F923F924F925F926F9247 |
:101080007F928F929F92AF92BF92CF92DF92EF9218 |
:10109000FF920F931F93CF93DF93CDB7DEB7E09707 |
:1010A0000FB6F894DEBF0FBECDBF26968FAD269744 |
:1010B0002896EEADFFAD28971CA61DA61EA61FA65E |
:1010C0008093E304A8E46A2E712C6C0E7D1E5F01F0 |
:1010D000C50105C0053239F00894A11CB11CF50109 |
:1010E00004910023B9F7B501681B790B11F00E9438 |
:1010F0000E08002309F430C20894A11CB11C552429 |
:1011000058AA252C1FEF59A6F5010894A11CB11C63 |
:101110000491053721F0802F80628837F1F450FE6A |
:101120000EC0F30124E030E0620E731E80819181D5 |
:10113000A281B3818CA79DA7AEA7BFA70EC0F30164 |
:10114000A2E0B0E06A0E7B1E808191819C01442761 |
:1011500055272CA73DA74EA75FA7003221F489A5EC |
:10116000882391F61BC0033211F438E081C00A32A3 |
:1011700011F00D3289F40A3251F4F30142E050E0EB |
:10118000640E751E208022200CF0BECF219450E109 |
:10119000552A8FED5822B8CF0B3211F409A7B4CFDE |
:1011A0000E32C1F5F5010894A11CB11C04910A325C |
:1011B00079F4F301A2E0B0E06A0E7B1E60817181D8 |
:1011C000BFEF6F3F7B0714F46FEF7FEF162F9CCFBD |
:1011D00060E070E0802F80538A30A0F4CB01F3E010 |
:1011E000880F991FFA95E1F7860F971F680F791FEF |
:1011F000600F711D60537040F5010894A11CB11C73 |
:101200000491E8CFEFEF6F3F7E0714F46FEF7FEFAD |
:10121000162F7FCF003329F454FC76CFF0E25F2AFB |
:1012200073CF802F81538930D8F460E070E0CB0118 |
:10123000E3E0880F991FEA95E1F7860F971F680F83 |
:10124000791F600F711D60537040F5010894A11C57 |
:10125000B11C0491802F80538A3048F3262E59CF39 |
:10126000083619F424E0522A4FCF0C3619F431E035 |
:10127000532A4ACF033661F44E010894811C911C15 |
:10128000F30142E050E0640E751E808189831BC12A |
:10129000043421F0043611F00936B1F5043411F4A8 |
:1012A00051E0552A50FE0AC0F30184E090E0680E38 |
:1012B000791E20813181428153810CC0F30142E0CB |
:1012C00050E0640E751E808191819C01442737FD9A |
:1012D0004095542F2CA73DA74EA75FA78CA59DA591 |
:1012E000AEA5BFA5B7FF0DC0B095A095909581950F |
:1012F0009F4FAF4FBF4F8CA79DA7AEA7BFA78DE253 |
:1013000089A77AE0472E7BC00F3411F00F3639F4ED |
:101310000F3411F491E0592A68E0462E6FC000376F |
:10132000A1F4F301A2E0B0E06A0E7B1E80819181FE |
:101330009C01442755272CA73DA74EA75FA750E146 |
:10134000452E30E4532A08E759C00337C1F5F301AD |
:1013500042E050E0640E751E8080918081149104FB |
:1013600089F44E010894811C911C88E289838EE6E1 |
:10137000F401818385E78B838CE68C838D8389E2FE |
:101380008E831F8217FD13C0812F992787FD9095AB |
:10139000AC0160E070E0C4010E940237009729F0C0 |
:1013A000D82ED8181D150CF090C0D12E8EC0F40187 |
:1013B00001900020E9F73197DE2ED81886C0053558 |
:1013C00011F0053739F4053511F4F1E05F2A4AE0F0 |
:1013D000442E14C0083519F0083709F06CC030E10C |
:1013E000432E53FE0BC02CA53DA54EA55FA5211590 |
:1013F00031054105510511F030E4532A19A618AB07 |
:1014000017FD02C04FED542229E2822E912C8C0E42 |
:101410009D1E8CA59DA5AEA5BFA50097A105B105F4 |
:1014200021F498A9992309F43FC0C42CDD24EE24AB |
:10143000FF2433242CA53DA54EA55FA52C153D0505 |
:101440004E055F0510F091E0392E6CA57DA58EA5A7 |
:101450009FA5A70196010E94C938DC01CB01182F76 |
:101460008A3010F4105D04C0195A083509F41F7D44 |
:10147000D4011E934D016CA57DA58EA59FA5A70146 |
:1014800096010E94C9382CA73DA74EA75FA733201D |
:1014900081F6B8E04B1641F453FE06C0103321F03C |
:1014A00080E3F40182934F01CE010196D82ED81823 |
:1014B000F8E2DF0E0BC0002309F44EC04E01089481 |
:1014C000811C911C098381E0D82E19A61D2DC8A866 |
:1014D000CD18C7FCCC2489A5882311F01F5F02C05A |
:1014E00056FC1E5F1C0DE52CFF24C7018073907015 |
:1014F000892B21F4822D811B0E94230889A5882332 |
:1015000029F061E070E0CE01899609C0E6FE09C0CD |
:1015100080E38AA70BA762E070E0CE018A960E9462 |
:10152000FA07C70180739070809721F4822D811B88 |
:101530000E942F088C2D0E942F088D2D992787FD42 |
:101540009095BC01C4010E94FA07E4FEC1CD822D32 |
:10155000811B0E942308BCCDE0960FB6F894DEBF35 |
:101560000FBECDBFDF91CF911F910F91FF90EF90F4 |
:10157000DF90CF90BF90AF909F908F907F906F90B3 |
:101580005F904F903F902F9008951F920F920FB64B |
:101590000F9211242F933F935F936F937F938F93B9 |
:1015A0009F93AF93BF938091C30181508093C301F8 |
:1015B0008F3FB9F489E08093C301809105018F5F6B |
:1015C000817080930501882319F481E08093C00124 |
:1015D0008091C1019091C20101969093C2018093C4 |
:1015E000C1018091BC019091BD010297C8F080912A |
:1015F000BC019091BD0101979093BD018093BC0106 |
:101600008091BC019091BD012091030130910401B2 |
:1016100082239323892B11F021E009C020E007C029 |
:1016200020E08FEF9FEF909304018093030180915E |
:101630000001222331F08A3011F45A9A07C0479AE8 |
:1016400005C08A3011F45A9801C04798809132053C |
:1016500083FF3BC0349B0AC08091BE019091BF01C3 |
:1016600001969093BF018093BE012FC08091BE016F |
:101670009091BF01892B79F08091BE019091BF01BB |
:10168000805A9F4040F48091BE019091BF01909399 |
:101690001B0280931A0280911A0290911B022091E2 |
:1016A000180230911902821B930B845E9D4F68E6ED |
:1016B00071E00E94B638845B90409093170280934B |
:1016C00016021092BF011092BE01BF91AF919F917F |
:1016D0008F917F916F915F913F912F910F900FBEEE |
:1016E0000F901F9018952091C1013091C201280FD1 |
:1016F000391FC901019608958AE090E00E94730B9A |
:101700009093C5018093C40182E085BD83EA84BDC6 |
:1017100017BC88E788BD96E096BD83EC8093B00047 |
:101720009093B100809170008260809370008091EE |
:101730006E00816080936E008AE08093B300109207 |
:10174000B20008952091C1013091C201821B930B18 |
:10175000892F99278695807490700895CF93DF9391 |
:101760000E94730BEC01CE010E94A20B8823D9F3D7 |
:10177000DF91CF910895CF93DF930E94730BEC011B |
:1017800003C08FEE80937A00CE010E94A20B8823C3 |
:10179000C1F3DF91CF9108951F920F920FB60F9270 |
:1017A00011242F933F934F935F936F937F938F9366 |
:1017B0009F93AF93BF93CF93DF93EF93FF9380916A |
:1017C00006018150809306018F3F09F085C083E8B0 |
:1017D0008093B00080916C01C82FDD27D093BB01AE |
:1017E000C093BA0180915A0560914C0580FF2AC0D0 |
:1017F00077278827992720915402309155024091EC |
:1018000056025091570257FF04C021583F4F4F4F87 |
:101810005F4FA7E05595479537952795AA95D1F73E |
:101820000E94773897FF04C061507E4F8F4F9F4FC3 |
:10183000F9E09595879577956795FA95D1F7C60F55 |
:10184000D71F29C0772788279927209154023091E4 |
:101850005502409156025091570257FF04C021583B |
:101860003F4F4F4F5F4FE7E0559547953795279589 |
:10187000EA95D1F70E94773897FF04C061507E4FF8 |
:101880008F4F9F4F39E095958795779567953A9556 |
:10189000D1F7C61BD70BD093BB01C093BA0180917F |
:1018A0004D0599272091BA013091BB0128173907BE |
:1018B00034F080914E0599278217930724F4909372 |
:1018C000BB018093BA018091BA018093B3008091EB |
:1018D0004F058093060104C083E08093B0005F98B9 |
:1018E000FF91EF91DF91CF91BF91AF919F918F9138 |
:1018F0007F916F915F914F913F912F910F900FBE0C |
:101900000F901F90189510927C008FEE80937A00B4 |
:1019100008950F931F93CF93DF9303E010E0D80156 |
:101920000E940639802DC82FDD27C531D10508F06A |
:101930002A97C7BD84E690E00E94BB0B8091070107 |
:10194000909108018255934010F4C0E0D0E0CA3F66 |
:10195000D105C0F4C7BD82E390E00E94BB0B87E5D0 |
:1019600091E09F938F931F920E943B088091070103 |
:10197000909108010F900F900F908458934010F0B1 |
:101980002196E5CFD8010C2E0E940E39C093F104A8 |
:101990008CE291E00E94BB0BDF91CF911F910F91E0 |
:1019A00008951F920F920FB60F921124EF92FF929B |
:1019B0000F931F932F933F934F935F936F937F9357 |
:1019C0008F939F93AF93BF93CF93DF93EF93FF9347 |
:1019D00010927A008091DD01682F77278F5F8093C6 |
:1019E000DD016530710509F48EC066307105BCF407 |
:1019F0006230710509F44AC0633071053CF4611529 |
:101A0000710531F161307105C1F17DC2633071053D |
:101A100009F446C06430710509F45DC074C26830D1 |
:101A2000710509F4C3C0693071054CF46630710565 |
:101A300009F482C06730710509F49BC064C2693043 |
:101A4000710509F4D0C06A30710509F4DCC15BC2CC |
:101A500080917800909179009093DF018093DE016E |
:101A600081E08093DC018091C6019091C7010196CD |
:101A70009093C7018093C6014AC2809178009091EB |
:101A800079009093E1018093E0018EC0809178000D |
:101A9000909179009093E3018093E20184E0B0C1DA |
:101AA00080910D0190910E019C01220F331F280F90 |
:101AB000391F80917800909179000E94A238260FFA |
:101AC000371F369527953695279530930E0120932D |
:101AD0000D0186E095C180915E0290915F02209198 |
:101AE000780030917900821B930B9093E5048093EA |
:101AF000E4048091E4049091E5049093D5018093EF |
:101B0000D40187E07DC18091780090917900209187 |
:101B1000600230916102821B930B9093F0048093DA |
:101B2000EF048091EF049091F0049093D30180939F |
:101B3000D2011092DC01EBC1809100012091DE0105 |
:101B40003091DF018A3049F48091780090917900DA |
:101B5000820F931F9695879506C08091780090918B |
:101B60007900820F931F9093D7018093D60181E073 |
:101B700047C1809100012091E0013091E1018A305C |
:101B800049F48091780090917900820F931F969587 |
:101B9000879506C08091780090917900820F931FFD |
:101BA0009093D9018093D80182E02AC180910001ED |
:101BB0002091E2013091E3018A3049F4809178006C |
:101BC00090917900820F931F9695879506C080911A |
:101BD000780090917900820F931F9093DB0180939E |
:101BE000DA0185E00DC18091780090917900AA27F3 |
:101BF00097FDA095BA2FBC01CD010E94B5377B019E |
:101C00008C0180915A0290915B02A0915C02B0918C |
:101C10005D029C01AD01C801B7010E940F37DC01D4 |
:101C2000CB01BC01CD010E949837DC01CB01909320 |
:101C3000D1018093D0018091E4049091E5048091DA |
:101C4000E4049091E50497FF03C0909581959F4F20 |
:101C500097FD0396AC01559547955595479580910D |
:101C6000EF049091F0048091EF049091F00497FFBD |
:101C700003C0909581959F4F9C0197FF02C02D5FF7 |
:101C80003F4F3595279535952795240F351F809122 |
:101C9000D0019091D101820F931F9093D101809335 |
:101CA000D0018091D0019091D101029724F18091CF |
:101CB0005A0290915B02A0915C02B0915D0220E01B |
:101CC00030E048E454E4BC01CD010E94BF378823D2 |
:101CD0000CF044C080915A0290915B02A0915C028A |
:101CE000B0915D022AE037ED43EA5CE3BC01CD012F |
:101CF0000E94103729C08091D0019091D1018F5F4F |
:101D00009F4F64F580915A0290915B02A0915C0212 |
:101D1000B0915D0220E030E046E154E4BC01CD0129 |
:101D20000E94C2371816D4F480915A0290915B0237 |
:101D3000A0915C02B0915D022AE037ED43EA5CE3DA |
:101D4000BC01CD010E940F37DC01CB0180935A0208 |
:101D500090935B02A0935C02B0935D0281E080935C |
:101D6000CA0180917800909179009093E704809364 |
:101D7000E6048091D0019091D1019C01442737FD68 |
:101D80004095542F80911C0290911D02A0911E023B |
:101D9000B0911F02820F931FA41FB51F80931C02D6 |
:101DA00090931D02A0931E02B0931F0220911C026B |
:101DB00030911D0240911E0250911F0257FF04C036 |
:101DC00021503C4F4F4F5F4F7AE0559547953795DF |
:101DD00027957A95D1F780911C0290911D02A091D0 |
:101DE0001E02B0911F02821B930BA40BB50B8093B4 |
:101DF0001C0290931D02A0931E02B0931F0283E069 |
:101E00008093DC0184C08091F4049091F5042091CA |
:101E1000780030917900820F931F9093F50480939E |
:101E2000F4048091EC048F5F8093EC048091EC04C7 |
:101E3000853008F468C08091780090917900909383 |
:101E40000801809307011092EC048091E8049091BE |
:101E5000E9042091F4043091F504821B930B209146 |
:101E6000020230910302821B930B9093C90180936D |
:101E7000C8018091F4049091F504EC01EE27D7FDA0 |
:101E8000E095FE2F2091090130910A0140910B014C |
:101E900050910C01DA01C901880F991FAA1FBB1FBD |
:101EA000820F931FA41FB51FC80FD91FEA1FFB1F66 |
:101EB000F7FF03C02396E11DF11D82E0F595E7953C |
:101EC000D795C7958A95D1F7C0930901D0930A0198 |
:101ED000E0930B01F0930C018091090190910A01AC |
:101EE000A0910B01B0910C019C018091E8049091AC |
:101EF000E904821B930B90930302809302021092D9 |
:101F0000F5041092F4041092DC011092DD0180912E |
:101F1000DC0180937C008091DD01882319F08FEE35 |
:101F200080937A00FF91EF91DF91CF91BF91AF91B4 |
:101F30009F918F917F916F915F914F913F912F91E1 |
:101F40001F910F91FF90EF900F900FBE0F901F9079 |
:101F5000189590E2EFE0F1E08FE49193815087FFD4 |
:101F6000FCCF08951F93CF93DF938091E40180FF0E |
:101F70000CC08091E801882311F0815002C080914B |
:101F800069018093E8010E94A90F8091E40181FF1B |
:101F900007C08091E8018F5F8093E8010E94A90F3C |
:101FA0008091E401992780FF04C081FF02C0109254 |
:101FB000E80181E18093E5018091E80199279F93F1 |
:101FC0008F9389E591E09F938F9311E01F930E9477 |
:101FD0003B080F900F900F900F900F908091E801A9 |
:101FE000C82FDD27C530D10509F45DC2C630D10543 |
:101FF000ACF4C230D10509F4E2C0C330D10534F4E9 |
:10200000209719F1219709F472C08AC4C330D10511 |
:1020100009F443C1249709F4ABC182C4C830D10587 |
:1020200009F496C3C930D10544F4C630D10509F48A |
:102030000BC3279709F46CC373C4C930D10509F4E5 |
:10204000C9C32A9709F41AC46BC41092E5018EE53E |
:1020500091E09F938F931F930E943B0884E18093AC |
:10206000E5010F900F900F9082E690E09F938F9381 |
:1020700082E490E09F938F93DF93CF938091000150 |
:102080006AE00E949638892F99279F938F938091B9 |
:1020900000010E94963899279F938F9380E791E0E3 |
:1020A0009F938F931F930E943B0888E28093E501E2 |
:1020B0008DB79EB70D960FB6F8949EBF0FBE8DBF1D |
:1020C0000E944B0299279F938F9385E891E09F93FD |
:1020D0008F931F930E943B088CE38093E5010F9040 |
:1020E0000F900F900F900F9082E991E05FC0809168 |
:1020F000320580FF49C01092E50180910202909163 |
:1021000003029F938F9382EA91E09F938F931F9393 |
:102110000E943B0884E18093E5010F900F900F909F |
:102120000F900F9080910002909101029F938F93E6 |
:1021300081EB91E09F938F931F930E943B0888E26D |
:102140008093E5010F900F900F900F900F9080916A |
:102150000701909108019F938F9380EC91E09F93EA |
:102160008F931F930E943B088CE38093E5010F90AF |
:102170000F900F900F900F908091F10499279F93EB |
:102180008F938FEC91E06FC384E18093E5018EED36 |
:1021900091E09F938F931F930E943B0888E2809366 |
:1021A000E5010F900F900F9085EE91E09F938F9334 |
:1021B0001F930E943B080F900F900F90B6C3109290 |
:1021C000E50183EF91E09F938F931F930E943B085B |
:1021D00084E18093E5010F900F900F90809154025D |
:1021E00090915502A0915602B0915702B7FF04C0DA |
:1021F00081509C4FAF4FBF4F6AE0B595A79597951B |
:1022000087956A95D1F7BF93AF939F938F938DEF87 |
:1022100091E09F938F931F930E943B0888E28093E5 |
:10222000E5018DB79EB707960FB6F8949EBF0FBE17 |
:102230008DBF80914C0290914D02A0914E02B091C1 |
:102240004F02B7FF04C081509C4FAF4FBF4F5AE0C1 |
:10225000B595A795979587955A95D1F7BF93AF9365 |
:102260009F938F938CE092E09F938F931F930E9494 |
:102270003B088CE38093E5018DB79EB707960FB6B8 |
:10228000F8949EBF0FBE8DBF80911A0290911B02E1 |
:102290009F938F938BE192E0E6C21092E5018091CB |
:1022A0000205909103059F938F9380910005909173 |
:1022B00001059F938F938AE292E09F938F931F93E0 |
:1022C0000E943B0884E18093E5018DB79EB7079695 |
:1022D0000FB6F8949EBF0FBE8DBF809106059091FA |
:1022E00007059F938F9380910405909105059F9317 |
:1022F0008F938AE392E09F938F931F930E943B08F2 |
:1023000088E28093E5018DB79EB707960FB6F894E3 |
:102310009EBF0FBE8DBF80910A0590910B059F93C4 |
:102320008F9380910805909109059F938F938AE47C |
:1023300092E09F938F931F930E943B088CE38093BE |
:10234000E5018DB79EB707960FB6F8949EBF0FBEF6 |
:102350008DBF80910E0590910F059F938F93809173 |
:102360000C0590910D059F938F938AE592E0CAC268 |
:102370001092E50180912B05E82FFF27EE0FFF1F3C |
:10238000E250FB4F808191819F938F9380912A052A |
:10239000E82FFF27EE0FFF1FE250FB4F8081918156 |
:1023A0009F938F938AE692E09F938F931F930E944F |
:1023B0003B0884E18093E5018DB79EB707960FB681 |
:1023C000F8949EBF0FBE8DBF80912D05E82FFF278B |
:1023D000EE0FFF1FE250FB4F808191819F938F93FF |
:1023E00080912C05E82FFF27EE0FFF1FE250FB4FD7 |
:1023F000808191819F938F938AE792E09F938F933F |
:102400001F930E943B0888E28093E5018DB79EB739 |
:1024100007960FB6F8949EBF0FBE8DBF80912F0513 |
:10242000E82FFF27EE0FFF1FE250FB4F80819181C5 |
:102430009F938F9380912E05E82FFF27EE0FFF1FAC |
:10244000E250FB4F808191819F938F938AE892E0C5 |
:102450009F938F931F930E943B088CE38093E50129 |
:102460008DB79EB707960FB6F8949EBF0FBE8DBF6F |
:1024700080913105E82FFF27EE0FFF1FE250FB4F41 |
:10248000808191819F938F9380913005E82FFF2762 |
:10249000EE0FFF1FE250FB4F808191819F938F933E |
:1024A0008AE992E02FC21092E5018AEA92E09F93B6 |
:1024B0008F931F930E943B08809100010F900F9013 |
:1024C0000F908A3009F05AC084E18093E501809131 |
:1024D0006A0290916B029F938F938091DA019091A1 |
:1024E000DB0120916A0230916B02821B930B9F9358 |
:1024F0008F9388EB92E09F938F931F930E943B08EA |
:1025000088E28093E5018DB79EB707960FB6F894E1 |
:102510009EBF0FBE8DBF80916802909169029F930C |
:102520008F938091D8019091D901209168023091C8 |
:102530006902821B930B9F938F9387EC92E09F938A |
:102540008F931F930E943B088CE38093E5018DB726 |
:102550009EB707960FB6F8949EBF0FBE8DBF8091B1 |
:102560006602909167029F938F938091940590915A |
:1025700095059F938F9386ED92E0C4C184E180938B |
:10258000E50180916A0290916B0297FD0196959505 |
:1025900087959F938F938091DA019091DB01209131 |
:1025A0006A0230916B02821B930B9F938F9385EE8F |
:1025B00092E09F938F931F930E943B0888E2809341 |
:1025C000E5018DB79EB707960FB6F8949EBF0FBE74 |
:1025D0008DBF809168029091690297FD0196959553 |
:1025E00087959F938F938091D8019091D9012091E5 |
:1025F000680230916902821B930B9F938F9384EF43 |
:1026000092E09F938F931F930E943B088CE38093EB |
:10261000E5018DB79EB707960FB6F8949EBF0FBE23 |
:102620008DBF809166029091670297FD0196959506 |
:1026300087959F938F9380919405909195059F9393 |
:102640008F9383E093E05EC11092E50182E193E015 |
:102650009F938F931F930E943B0884E18093E50131 |
:102660000F900F900F9080916002909161029F9364 |
:102670008F938091D2019091D3019F938F938FE19B |
:1026800093E09F938F931F930E943B0888E280936F |
:10269000E5018DB79EB707960FB6F8949EBF0FBEA3 |
:1026A0008DBF80915E0290915F029F938F93809186 |
:1026B000D4019091D5019F938F938EE293E09F93E5 |
:1026C0008F931F930E943B088CE38093E5018DB7A5 |
:1026D0009EB707960FB6F8949EBF0FBE8DBF809130 |
:1026E0005A0290915B02A0915C02B0915D02BC0124 |
:1026F000CD010E949837DC01CB019F938F9380918D |
:102700007C0590917D059F938F938DE393E0FAC0B4 |
:1027100084E18093E50180910D0190910E019F93DA |
:102720008F938CE493E09F938F931F930E943B08B9 |
:1027300088E28093E5010F900F900F900F900F901B |
:1027400080910B0299279F938F938BE593E08BC029 |
:102750001092E5018AE693E09F938F931F930E9466 |
:102760003B0884E18093E5010F900F900F908091DA |
:102770001602909117029F938F9389E793E09F939E |
:102780008F931F930E943B0888E28093E5010F908E |
:102790000F900F900F900F9080911A0290911B0252 |
:1027A0009F938F9388E893E09F938F931F930E944A |
:1027B0003B088CE38093E5010F900F900F900F90F2 |
:1027C0000F9080911802909119029F938F9387E93F |
:1027D00093E049C01092E50180911202909113029A |
:1027E0009F938F9386EA93E09F938F931F930E940A |
:1027F0003B0884E18093E5010F900F900F900F90BC |
:102800000F9080911002909111029F938F9382EB11 |
:1028100093E09F938F931F930E943B0888E28093DD |
:10282000E5010F900F900F900F900F9080910E0286 |
:1028300090910F029F938F938EEB93E09F938F93D2 |
:102840001F930E943B088CE38093E5010F900F904B |
:102850000F900F900F9080910C0290910D029F931A |
:102860008F938AEC93E09F938F931F930E943B0872 |
:102870000F900F900F900F900F9057C01092E5019E |
:1028800086ED93E09F938F931F930E943B0884E112 |
:102890008093E5010F900F900F9080916C01992724 |
:1028A0009F938F938EED93E09F938F931F930E943E |
:1028B0003B0888E28093E5010F900F900F900F90F6 |
:1028C0000F908091BA019091BB019F938F938CEEF2 |
:1028D00093E09F938F931F930E943B088CE3809318 |
:1028E000E5010F900F900F900F900F9080914E0583 |
:1028F00099279F938F9380914D0599279F938F934D |
:102900008AEF93E09F938F931F930E943B088DB7AC |
:102910009EB707960FB6F8949EBF0FBE8DBF05C039 |
:102920008150809369011092E8011092E401DF91D7 |
:10293000CF911F9108951092B9008AE28093B80058 |
:10294000089585EA8093BC0080E090E0089584E9D2 |
:102950008093BC0008951092B9008093BB0085E875 |
:102960008093BC0080E090E008950E94A71410922C |
:10297000EB018091BB001092EA0180E88093BC00DB |
:102980001092BD001092BA001092BB001092B900D4 |
:102990001092B8000E949B140E94A11480E00E9433 |
:1029A000AB1408951F920F920FB60F9211242F931C |
:1029B0003F934F935F936F937F938F939F93AF93C7 |
:1029C000BF93EF93FF938091EB01282F33278F5F05 |
:1029D0008093EB012330310509F446C024303105E2 |
:1029E0004CF421303105D1F0223031057CF5232B18 |
:1029F00081F083C025303105E1F1253031050CF43B |
:102A000041C026303105F1F12730310509F45AC0B3 |
:102A100074C08091EA01880F8E5A51C08091EA01FA |
:102A2000282F33278F5F8093EA012130310509F485 |
:102A30003EC0223031051CF4232BB1F15EC02230A0 |
:102A40003105C1F123303105C1F157C00E94A714EF |
:102A50008091EA01843018F41092EB0102C01092C8 |
:102A6000EA010E94A11449C08091E901880F8D5AA2 |
:102A700026C08091E901E82FFF27EA50FB4F8091A3 |
:102A8000BB0080838091E90199278130910579F01D |
:102A9000823091051CF4892B39F02FC082309105CA |
:102AA00049F0039751F029C080916F0508C08091CB |
:102AB000740505C080918C0502C080918E050E942E |
:102AC000AB141BC09091E901E92FFF27EA50FB4F9F |
:102AD0008091BB008483892F8F5F8093E9018430CC |
:102AE00010F01092E9010E94A7148AE090E0909300 |
:102AF0008701809386011092EB018091BC00806871 |
:102B00008093BC00FF91EF91BF91AF919F918F9106 |
:102B10007F916F915F914F913F912F910F900FBED9 |
:102B20000F901F90189583EC8093810080916F0027 |
:102B3000806280936F00109267021092660210927A |
:102B400069021092680210926B0210926A02089554 |
:102B50001F920F920FB60F9211242F933F934F9312 |
:102B60005F936F937F938F939F93AF93BF93EF93F5 |
:102B7000FF9340918600509187008091EC019091E5 |
:102B8000ED01481B590B809186009091870090932E |
:102B9000ED018093EC01CA018D5D9540835699410A |
:102BA00048F481E090E09093EF018093EE01109261 |
:102BB0006A0169C02091EE013091EF012A303105A0 |
:102BC0000CF061C0CA018B5F9040845B914008F0BB |
:102BD00043C0425D5140F901E20FF31FE250FB4F49 |
:102BE00080819181BA01681B790BCB0177FF03C00B |
:102BF000909581959F4F06974CF480910B02883CED |
:102C000028F480910B02865F80930B02F901E20F9A |
:102C1000F31FDF01A250BB4F8D919C9111979C0136 |
:102C2000220F331F280F391F240F351F37FF02C013 |
:102C30002D5F3F4FC9019595879595958795EC5EDA |
:102C4000FA4F2D913C911197AC01421B530B5183CC |
:102C5000408311969C938E938091EE019091EF01A9 |
:102C600001969093EF018093EE01059711F45D9A20 |
:102C700001C05D988091EE019091EF01069711F4EB |
:102C80005C9A01C05C98FF91EF91BF91AF919F91C9 |
:102C90008F917F916F915F914F913F912F910F9005 |
:102CA0000FBE0F901F90189581E080932A0582E057 |
:102CB00080932B0583E080932C0594E090932D0561 |
:102CC00055E050932E0586E080932F0587E0809392 |
:102CD000300538E03093310580E4809332058EE191 |
:102CE000809333058BEF809335054AE0409336059A |
:102CF00022E3209334052093380590933705909371 |
:102D0000390530933A058EE080933B058FE0809340 |
:102D10003C058AEF80933D058AE180933E0580E87B |
:102D200080933F0588E78093400536E9309341055D |
:102D30008EE58093420583E28093430584E180938E |
:102D400044051092450510924605109247051092D1 |
:102D500048051092490510924A0594E690934B0558 |
:102D600088E280934C0510925A0520934D053093CC |
:102D70004E0550934F05209350058AE580935105E9 |
:102D800020935205109259059093530586E4809341 |
:102D90005405909355059093560540935705AFE51C |
:102DA000B5E0E8E8F1E08CE001900D928150E1F7A8 |
:102DB000089581E080932A0532E030932B0583E06B |
:102DC00080932C0594E090932D0545E040932E05CB |
:102DD00086E080932F0587E08093300588E080931C |
:102DE000310580E4809332058EE1809333058BEFCB |
:102DF000809335058AE08093360522E320933405DD |
:102E000020933805309337059093390510923A0591 |
:102E100080933B058FE080933C058AEF80933D05CE |
:102E20008AE180933E0580E880933F058FEA809396 |
:102E30004005809341058EE58093420583E28093AF |
:102E4000430584E1809344051092450510924605A0 |
:102E500010924705109248051092490510924A05B4 |
:102E600094E690934B0588E280934C0510925A05A6 |
:102E700020934D0586E980934E0540934F0520939E |
:102E800050058AE58093510520935205109259050B |
:102E90009093530580E58093540590935505909346 |
:102EA000560580E180935705AFE5B5E0EFE8F1E026 |
:102EB0008CE001900D928150E1F7089581E08093BC |
:102EC0002A0552E050932B0543E040932C0584E003 |
:102ED00080932D0565E060932E0586E080932F0595 |
:102EE00087E08093300538E03093310581EC8093A2 |
:102EF00032058EE18093330524E6209335058AE080 |
:102F00008093360592E3909334059093380550935F |
:102F100037054093390510923A0530933B058FE011 |
:102F200080933C058AEF80933D058AE180933E05BE |
:102F300080E880933F0588EC809340058FEA80937A |
:102F400041058EE58093420583E28093430584E149 |
:102F5000809344051092450510924605109247054E |
:102F6000109248051092490510924A0520934B058E |
:102F700088E280934C0510925A0590934D0586E99E |
:102F800080934E0560934F05909350058AE580939A |
:102F9000510590935205109259052093530580E5F1 |
:102FA00080935405209355052093560580E1809326 |
:102FB0005705AFE5B5E0E7E9F1E08CE001900D924F |
:102FC0008150E1F70895CF93C82FC150CF3F81F0D2 |
:102FD00080910402882361F484E690E09093BD011F |
:102FE0008093BC018AEF90E00E94AE0BC15080F745 |
:102FF000CF91089510927A008091DA019091DB01CF |
:1030000090937605809375058091D8019091D901B0 |
:1030100090936E0580936D058091D6019091D701B4 |
:1030200090939505809394058091D2019091D3015E |
:10303000AA2797FDA095BA2FBC01CD012CE030E066 |
:1030400040E050E00E947738DC01CB01909392057C |
:10305000809391058091D4019091D501AA2797FD85 |
:10306000A095BA2FBC01CD010E947738DC01CB01BD |
:1030700090939C0580939B058091D0019091D10104 |
:1030800090937D0580937C058FEE80937A008091EC |
:103090002E05E82FFF27EE0FFF1FE250FB4F808128 |
:1030A000918182599F4F209112023091130228176B |
:1030B00039071CF42F5F3F4F0CC0808191818259EA |
:1030C0009F4F821793074CF42115310531F02150A1 |
:1030D0003040309313022093120280912F05E82F85 |
:1030E000FF27EE0FFF1FE250FB4F80819181825935 |
:1030F0009F4F2091100230911102281739071CF4BC |
:103100002F5F3F4F0CC08081918182599F4F821762 |
:1031100093074CF42115310531F0215030403093A4 |
:1031200011022093100280913005E82FFF27EE0F47 |
:10313000FF1FE250FB4F8081918182599F4F209168 |
:103140000E0230910F02281739071CF42F5F3F4FF2 |
:103150000CC08081918182599F4F821793074CF454 |
:103160002115310531F02150304030930F0220936A |
:103170000E0280913105E82FFF27EE0FFF1FE2506E |
:10318000FB4F8081918182599F4F20910C02309199 |
:103190000D02281739071CF42F5F3F4F0CC08081A8 |
:1031A000918182599F4F821793074CF42115310565 |
:1031B00031F02150304030930D0220930C02809169 |
:1031C00012029091130297FF05C010921302109201 |
:1031D00012020AC08F3F910539F034F08FEF90E072 |
:1031E0009093130280931202809110029091110229 |
:1031F00097FF05C010921102109210020AC08F3F73 |
:10320000910539F034F08FEF90E0909311028093A4 |
:10321000100280910E0290910F0297FF05C010924C |
:103220000F0210920E020AC08F3F910539F034F060 |
:103230008FEF90E090930F0280930E0280910C022A |
:1032400090910D0297FF05C010920D0210920C0292 |
:103250000AC08F3F910539F034F08FEF90E09093E2 |
:103260000D0280930C02809155059927AA27BB2750 |
:10327000BC01CD0124EC39E040E050E00E947738F9 |
:10328000DC01CB018093820190938301A0938401A0 |
:10329000B093850180937E0190937F01A09380017C |
:1032A000B093810108951092610210926002109211 |
:1032B0005F0210925E0280E090E0A0E0B0E08093B8 |
:1032C0005A0290935B02A0935C02B0935D0210924D |
:1032D0006B0210926A0210926902109268021092B8 |
:1032E0006702109266021092F1011092F0010E94A2 |
:1032F000FA1784E690E00E94BB0B0E94FA178091B7 |
:10330000320580FF10C08091070190910801875B12 |
:10331000934038F480910701909108018E5E9240AD |
:1033200010F40E94890C8091DA019091DB01909356 |
:103330006B0280936A028091D8019091D901909399 |
:103340006902809368028091D6019091D701909391 |
:10335000670280936602809168029091690290935F |
:1033600065028093640280916A0290916B0290934F |
:1033700063028093620280919B0590919C058091ED |
:103380009B0590919C0597FF03C0909581959F4F59 |
:103390006CE070E00E94B63870935F0260935E024A |
:1033A000809191059091920580919105909192055F |
:1033B00097FF03C0909581959F4F6CE070E00E944D |
:1033C000B63870936102609360028091E604909138 |
:1033D000E704AA2797FDA095BA2FBC01CD010E9452 |
:1033E000B537DC01CB0180935A0290935B02A09326 |
:1033F0005C02B0935D02109234021092350210927A |
:10340000360210923702109230021092310210925E |
:1034100032021092330210922C0210922D0210925E |
:103420002E0210922F02109228021092290210925E |
:103430002A0210922B02109224021092250210925E |
:1034400026021092270210927605109275051092AE |
:103450006E0510926D05109295051092940580915D |
:10346000090190910A01A0910B01B0910C01909378 |
:10347000E9048093E8041092C9011092C8011092E7 |
:103480001C0210921D0210921E0210921F028091C7 |
:103490001A0290911B0290931902809318020E94C5 |
:1034A000D83682E390E09093BD018093BC01809177 |
:1034B00055059927AA27BB27BC01CD0124EC39E08B |
:1034C00040E050E00E947738DC01CB01809382011C |
:1034D00090938301A0938401B09385018091560558 |
:1034E0009927AA27BB27BC01CD010E947738DC01B0 |
:1034F000CB0180937E0190937F01A0938001B093D4 |
:1035000081010895DF92EF92FF920F931F93CF9363 |
:10351000DF9380916602909167022091D6013091ED |
:10352000D701821B930B909395058093940580910E |
:10353000D8019091D9012091680230916902821BD3 |
:10354000930B90936E0580936D058091DA019091B5 |
:10355000DB0120916A0230916B02821B930B9093E6 |
:1035600076058093750580919105909192057C0177 |
:103570000027F7FC0095102F8091D2019091D30184 |
:10358000AA2797FDA095BA2FBC01CD012CE030E011 |
:1035900040E050E00E947738DC01CB01E80EF91ED4 |
:1035A0000A1F1B1F17FF05C00894E11CF11C011D19 |
:1035B000111D15950795F794E794F0929205E09206 |
:1035C000910580919B0590919C057C010027F7FC5B |
:1035D0000095102F8091D4019091D501AA2797FDD5 |
:1035E000A095BA2FBC01CD012CE030E040E050E0C6 |
:1035F0000E947738DC01CB01E80EF91E0A1F1B1F61 |
:1036000017FF05C00894E11CF11C011D111D159543 |
:103610000795F794E794F0929C05E0929B058091C2 |
:103620007C0590917D059C01442737FD4095542FE2 |
:103630008091D0019091D101AA2797FDA095BA2F32 |
:10364000280F391F4A1F5B1F57FF04C02F5F3F4FD2 |
:103650004F4F5F4F559547953795279530937D058B |
:1036600020937C058091D2019091D3016CE070E0B1 |
:10367000869F9001879F300D969F300D1124C901C0 |
:103680009C01442737FD4095542F8091440290912E |
:103690004502A0914602B0914702820F931FA41FDA |
:1036A000B51F8093440290934502A0934602B093C5 |
:1036B00047028091D4019091D501869F9001879F08 |
:1036C000300D969F300D1124C9019C01442737FD10 |
:1036D0004095542F8091400290914102A091420266 |
:1036E000B0914302820F931FA41FB51F8093400225 |
:1036F00090934102A0934202B09343028091E6046A |
:103700009091E704805C92409C01442737FD4095EE |
:10371000542F80913C0290913D02A0913E02B091C5 |
:103720003F02820F931FA41FB51F80933C0290930A |
:103730003D02A0933E02B0933F0280919405909188 |
:1037400095059C01442737FD4095542F8091240214 |
:1037500090912502A0912602B0912702820F931F1B |
:10376000A41FB51F8093240290932502A0932602E4 |
:10377000B093270280919405909195059C01442770 |
:1037800037FD4095542F8091200290912102A09105 |
:103790002202B0912302820F931FA41FB51F8093B2 |
:1037A000200290932102A0932202B0932302D09092 |
:1037B000FB01DD2009F0A2C08091FA01882309F005 |
:1037C0009DC08091320586FF99C0A0913402B091CE |
:1037D0003502C0913602D0913702D7FF04C0A15004 |
:1037E000B04FCF4FDF4F1CE0D595C795B795A79544 |
:1037F0001A95D1F780919405909195059C014427E5 |
:1038000037FD4095542FBD01CE010E947738DC0171 |
:10381000CB012091F101E22EFF2400271127BC01EA |
:10382000CD01A80197010E947738DC01CB0180937C |
:103830006C0290936D02A0936E02B0936F02B7FF7B |
:1038400004C08150984FAF4FBF4FCBE0B595A795BF |
:1038500097958795CA95D1F780936C0290936D02E6 |
:10386000A0936E02B0936F02A0912C02B0912D0232 |
:10387000C0912E02D0912F02D7FF04C0A150B04FAB |
:10388000CF4FDF4FFCE0D595C795B795A795FA9533 |
:10389000D1F780919405909195059C01442737FDBF |
:1038A0004095542FBD01CE010E947738DC01CB0139 |
:1038B000BC01CD01A80197010E947738DC01CB0142 |
:1038C0008093700290937102A0937202B09373027E |
:1038D000B7FF04C08150984FAF4FBF4FEBE0B59595 |
:1038E000A79597958795EA95D1F780937002909365 |
:1038F0007102A0937202B093730210C01092700212 |
:1039000010927102109272021092730210926C0265 |
:1039100010926D0210926E0210926F0280916D05EE |
:1039200090916E0520916C0230916D02820F931F71 |
:1039300090936E0580936D050091F001202F332741 |
:10394000442755278091700290917102A0917202D4 |
:10395000B0917302BC01CD010E9477389B01AC018C |
:1039600097FF04C021503E4F4F4F5F4F79E0559570 |
:103970004795379527957A95D1F780916D05909168 |
:103980006E05820F931F90936E0580936D05809155 |
:103990006D0590916E059C01442737FD4095542F8D |
:1039A0008091280290912902A0912A02B0912B02C5 |
:1039B000820F931FA41FB51F8093280290932902A2 |
:1039C000A0932A02B0932B0280916D0590916E0511 |
:1039D0002091FE013091FF01821B930B9C01442733 |
:1039E00037FD4095542F80912C0290912D02A0918B |
:1039F0002E02B0912F02820F931FA41FB51F809338 |
:103A00002C0290932D02A0932E02B0932F0280914E |
:103A10002C0290912D02A0912E02B0912F02C09104 |
:103A20007E01D0917F01E0918001F0918101C81762 |
:103A3000D907EA07FB0704F580E197E2A0E0B0E0D0 |
:103A40008C1B9D0BAE0BBF0B80932C0290932D0211 |
:103A5000A0932E02B0932F0280912C0290912D0200 |
:103A6000A0912E02B0912F028093280290932902F8 |
:103A7000A0932A02B0932B0222273327A9012C1BE3 |
:103A80003D0B4E0B5F0B80912C0290912D02A0916B |
:103A90002E02B0912F0282179307A407B507E4F412 |
:103AA000C051D742E040F040C0932C02D0932D0289 |
:103AB000E0932E02F0932F0280912C0290912D0220 |
:103AC000A0912E02B0912F02809328029093290298 |
:103AD000A0932A02B0932B028091D8019091D90132 |
:103AE0000F9734F488E19CEF90936E0580936D05F9 |
:103AF0008091D8019091D901079734F480E398EF31 |
:103B000090936E0580936D05109100011A30A9F411 |
:103B10008091D8019091D901835F934034F088EE71 |
:103B200093E090936E0580936D058091D8019091FC |
:103B3000D9018A5F9340DCF014C08091D801909144 |
:103B4000D901855E974034F088EE93E090936E053E |
:103B500080936D058091D8019091D901835F974042 |
:103B600034F080ED97E090936E0580936D05809121 |
:103B70007505909176052091700230917102821B3B |
:103B8000930B9093760580937505202F3327442758 |
:103B9000552780916C0290916D02A0916E02B091B8 |
:103BA0006F02BC01CD010E9477389B01AC0197FFE9 |
:103BB00004C021503E4F4F4F5F4F69E055954795E8 |
:103BC000379527956A95D1F780917505909176057F |
:103BD000821B930B909376058093750580917505F4 |
:103BE000909176059C01442737FD4095542F809194 |
:103BF000300290913102A0913202B0913302820FD3 |
:103C0000931FA41FB51F8093300290933102A0939D |
:103C10003202B09333028091750590917605209120 |
:103C2000FC013091FD01821B930B9C01442737FD61 |
:103C30004095542F8091340290913502A091360224 |
:103C4000B0913702820F931FA41FB51F80933402D7 |
:103C500090933502A0933602B093370280913402DC |
:103C600090913502A0913602B0913702C091820145 |
:103C7000D0918301E0918401F0918501C817D907A3 |
:103C8000EA07FB0704F580E197E2A0E0B0E08C1BB7 |
:103C90009D0BAE0BBF0B8093340290933502A09323 |
:103CA0003602B09337028091340290913502A09190 |
:103CB0003602B09137028093300290933102A09384 |
:103CC0003202B093330222273327A9012C1B3D0B6C |
:103CD0004E0B5F0B8091340290913502A091360219 |
:103CE000B091370282179307A407B507E4F4C051D7 |
:103CF000D742E040F040C0933402D0933502E093C5 |
:103D00003602F09337028091340290913502A091EF |
:103D10003602B09137028093300290933102A09323 |
:103D20003202B09333028091DA019091DB010F9758 |
:103D300034F488E19CEF909376058093750580912B |
:103D4000DA019091DB01079734F480E398EF9093C8 |
:103D50007605809375051A30A9F48091DA01909167 |
:103D6000DB01835F934034F088EE93E09093760517 |
:103D7000809375058091DA019091DB018A5F934011 |
:103D8000DCF014C08091DA019091DB01855E9740F0 |
:103D900034F088EE93E090937605809375058091DA |
:103DA000DA019091DB01835F974034F080ED97E07A |
:103DB00090937605809375058FEE80937A008091BD |
:103DC0006D0590916E059093BA048093B90480912B |
:103DD000240290912502A0912602B091270280939F |
:103DE000380290933902A0933A02B0933B0280913B |
:103DF000340290913502A0913602B091370280933F |
:103E0000540290935502A0935602B09357028091AA |
:103E10002C0290912D02A0912E02B0912F0280933E |
:103E20004C0290934D02A0934E02B0934F028091AA |
:103E3000300290913102A0913202B091330280930E |
:103E4000500290935102A0935202B093530280917A |
:103E5000280290912902A0912A02B0912B0280930E |
:103E6000480290934902A0934A02B0934B0280917A |
:103E7000320587FF6EC0DD2009F06BC08091FA012A |
:103E8000882309F066C08091750590917605893C7C |
:103E900091058CF02091750530917605220F331F26 |
:103EA000220F331F8091750590917605820F931F25 |
:103EB0008052934017C08091750590917605885384 |
:103EC0009F4FA4F42091750530917605220F331F82 |
:103ED000220F331F8091750590917605820F931FF5 |
:103EE000805E9C4F909376058093750580916D055B |
:103EF00090916E05893C91058CF020916D05309173 |
:103F00006E05220F331F220F331F80916D05909194 |
:103F10006E05820F931F8052934017C080916D05EC |
:103F200090916E0588539F4FA4F420916D053091B8 |
:103F30006E05220F331F220F331F80916D05909164 |
:103F40006E05820F931F805E9C4F90936E05809349 |
:103F50006D0580912E05E82FFF27EE0FFF1FE25021 |
:103F6000FB4F8081918182599F4F209112023091A5 |
:103F70001302281739071CF42F5F3F4F0CC08081B4 |
:103F8000918182599F4F821793074CF42115310577 |
:103F900031F021503040309313022093120280916F |
:103FA0002F05E82FFF27EE0FFF1FE250FB4F808108 |
:103FB000918182599F4F2091100230911102281750 |
:103FC00039071CF42F5F3F4F0CC0808191818259CB |
:103FD0009F4F821793074CF42115310531F0215082 |
:103FE0003040309311022093100280913005E82F69 |
:103FF000FF27EE0FFF1FE250FB4F80819181825916 |
:104000009F4F20910E0230910F02281739071CF4A0 |
:104010002F5F3F4F0CC08081918182599F4F821743 |
:1040200093074CF42115310531F021503040309385 |
:104030000F0220930E0280913105E82FFF27EE0F2B |
:10404000FF1FE250FB4F8081918182599F4F209149 |
:104050000C0230910D02281739071CF42F5F3F4FD7 |
:104060000CC08081918182599F4F821793074CF435 |
:104070002115310531F02150304030930D0220934D |
:104080000C02809112029091130297FF05C01092CA |
:104090001302109212020AC08F3F910539F034F0DA |
:1040A0008FEF90E0909313028093120280911002A0 |
:1040B0009091110297FF05C0109211021092100208 |
:1040C0000AC08F3F910539F034F08FEF90E0909364 |
:1040D00011028093100280910E0290910F0297FFBF |
:1040E00005C010920F0210920E020AC08F3F910578 |
:1040F00039F034F08FEF90E090930F0280930E022E |
:1041000080910C0290910D0297FF05C010920D0254 |
:1041100010920C020AC08F3F910539F034F08FEFF6 |
:1041200090E090930D0280930C02DF91CF911F914C |
:104130000F91FF90EF90DF90089580910402882303 |
:1041400001F58093740580936F0580938C058093AF |
:104150008E058091A201882311F080936F058091D4 |
:10416000A301882311F0809374058091A401882312 |
:1041700011F080938E058091A501882311F0809322 |
:104180008C0580916F0599279093BC048093BB04A4 |
:104190008091740599279093BE048093BD0480910B |
:1041A0008E0599279093C0048093BF0480918C055D |
:1041B00099279093C2048093C1041092EB0110924E |
:1041C000EA010E94A11408951F93809135058B3F49 |
:1041D00098F08B3F19F4809112020EC08C3F19F4B5 |
:1041E0008091100209C08D3F19F480910E0204C025 |
:1041F0008E3F21F480910C028093740180917401B0 |
:10420000882321F08F3F11F480937401809134054D |
:104210008B3F98F08B3F19F4809112020EC08C3FB7 |
:1042200019F48091100209C08D3F19F480910E029B |
:1042300004C08E3F21F480910C028093750180911F |
:104240007501882329F0843618F084E6809375017F |
:10425000809136058B3F98F08B3F19F480911202C4 |
:104260000EC08C3F19F48091100209C08D3F19F4E3 |
:1042700080910E0204C08E3F21F480910C02809345 |
:10428000730180917301882329F0843618F084E645 |
:1042900080937301809138058B3F98F08B3F19F420 |
:1042A000809112020EC08C3F19F48091100209C057 |
:1042B0008D3F19F480910E0204C08E3F21F480914D |
:1042C0000C028093720180917201882321F08F3F4C |
:1042D00011F48093720180913F058B3F98F08B3FE2 |
:1042E00019F4809112020EC08C3F19F480911002D3 |
:1042F00009C08D3F19F480910E0204C08E3F21F455 |
:1043000080910C028093710180917101882321F0CA |
:104310008F3F11F480937101809140058B3F98F09D |
:104320008B3F19F4809112020EC08C3F19F48091DA |
:10433000100209C08D3F19F480910E0204C08E3F17 |
:1043400021F480910C0280937001809170018B3078 |
:1043500010F48AE002C08F3F11F4809370018091C5 |
:1043600041058B3F98F08B3F19F4809112020EC0EB |
:104370008C3F19F48091100209C08D3F19F480918F |
:104380000E0204C08E3F21F480910C0280936F01D5 |
:1043900080916F01882321F08F3F11F480936F018A |
:1043A000809146058B3F98F08B3F19F48091120263 |
:1043B0000EC08C3F19F48091100209C08D3F19F492 |
:1043C00080910E0204C08E3F21F480910C028093F4 |
:1043D0006D0180916D01882321F08F3F11F480934E |
:1043E0006D01809147058B3F98F08B3F19F48091C8 |
:1043F00012020EC08C3F19F48091100209C08D3F4B |
:1044000019F480910E0204C08E3F21F480910C02B9 |
:104410008093F5018091F501882321F08F3F11F4FD |
:104420008093F501809148058B3F98F08B3F19F4FC |
:10443000809112020EC08C3F19F48091100209C0C5 |
:104440008D3F19F480910E0204C08E3F21F48091BB |
:104450000C028093F4018091F401882321F08F3FB6 |
:1044600011F48093F401809149058B3F98F08B3FC4 |
:1044700019F4809112020EC08C3F19F48091100241 |
:1044800009C08D3F19F480910E0204C08E3F21F4C3 |
:1044900080910C028093F3018091F301882321F035 |
:1044A0008F3F11F48093F30180914A058B3F98F080 |
:1044B0008B3F19F4809112020EC08C3F19F4809149 |
:1044C000100209C08D3F19F480910E0204C08E3F86 |
:1044D00021F480910C028093F2018091F2018823F3 |
:1044E00021F08F3F11F48093F20180914B058B3FB7 |
:1044F00098F08B3F19F4809112020EC08C3F19F492 |
:104500008091100209C08D3F19F480910E0204C001 |
:104510008E3F21F480910C0280936C0180916C019C |
:10452000882321F08F3F11F480936C018091500516 |
:104530008B3F98F08B3F19F4809112020EC08C3F94 |
:1045400019F48091100209C08D3F19F480910E0278 |
:1045500004C08E3F21F480910C0280936B01809106 |
:104560006B01882321F08F3F11F480936B018091C0 |
:1045700053058B3F98F08B3F19F4809112020EC0C7 |
:104580008C3F19F48091100209C08D3F19F480917D |
:104590000E0204C08E3F21F480910C028093F10141 |
:1045A0008091F101882321F08F3F11F48093F10174 |
:1045B000809154058B3F98F08B3F19F48091120243 |
:1045C0000EC08C3F19F48091100209C08D3F19F480 |
:1045D00080910E0204C08E3F21F480910C028093E2 |
:1045E000F0018091F001882321F08F3F11F4809336 |
:1045F000F00110916D01812F992787FD9095A92FCA |
:10460000B92FBC01CD010E94B53717FF06C020E0CD |
:1046100030E040E853E40E94103727E137EB41EDEA |
:1046200058E30E942F38DC01CB01809376019093F0 |
:104630007701A0937801B093790180913D05809333 |
:10464000930580913C05809377051F9108953F92D3 |
:104650004F925F926F927F928F929F92AF92BF9292 |
:10466000CF92DF92EF92FF920F931F93CF93DF933E |
:104670000E94821A299A80912C05E82FFF27EE0FBD |
:10468000FF1FE250FB4F8080918028E730E0820ED0 |
:10469000931E97FE02C08824992480910B028436D1 |
:1046A00008F05EC080910101882399F48091030194 |
:1046B000909104018F5F9F4F61F488E99AE3909392 |
:1046C000BD018093BC0180E09CE090930401809345 |
:1046D00003018091900290919102009731F001972F |
:1046E000909391028093900204C010920402109261 |
:1046F0001502809100018A3011F4289A01C028988F |
:104700008091950290919602815D974030F1809161 |
:104710004305882E992481E08093150280912A0513 |
:10472000E82FFF27EE0FFF1FE250FB4F1182108290 |
:1047300080912B05E82FFF27EE0FFF1FE250FB4F64 |
:104740001182108280912D05E82FFF27EE0FFF1FA9 |
:10475000E250FB4F11821082D8C110920402D5C1E1 |
:1047600080910B028D3808F4D0C1109215029091FF |
:10477000440582E3989FC001112490939102809395 |
:10478000900259E2851691046CF080919502909107 |
:1047900096026FEF8F3F960729F00196909396024D |
:1047A000809395028091950290919602883C9105A4 |
:1047B00020F078E28716910404F5109274021092AA |
:1047C000750210927602109277021092780210927F |
:1047D000790210927A0210927B02109224021092B7 |
:1047E00025021092260210922702109220021092A7 |
:1047F0002102109222021092230289EC8816910461 |
:104800000CF4E3C020910402222309F0DEC0809161 |
:104810002D05E82FFF27EE0FFF1FE250FB4F808191 |
:1048200091818C3491050CF4CEC0809192028F5FFF |
:1048300080939202893C08F4C8C029982093920280 |
:10484000109296021092950230912A05E32FFF27CD |
:10485000EE0FFF1FE250FB4F80819181873491055D |
:10486000B4F480912B05E82FFF27EE0FFF1FE250D5 |
:10487000FB4F808191810190F081E02DF7FF03C013 |
:10488000F095E195FF4FE734F1050CF47AC041E073 |
:1048900020912B05A22FBB27AA0FBB1FA250BB4FF5 |
:1048A0008D919C9111978734910544F0E32FFF2758 |
:1048B000EE0FFF1FE250FB4F808191818D919C9103 |
:1048C0008734910574F080912A05E82FFF27EE0FB9 |
:1048D000FF1FE250FB4F80819181873491050CF0DE |
:1048E00042E0E22FFF27EE0FFF1FE250FB4F8081D7 |
:1048F00091818634910574F480912A05E82FFF2771 |
:10490000EE0FFF1FE250FB4F8081918187349105AC |
:104910000CF043E0E22FFF27EE0FFF1FE250FB4FAA |
:10492000808191818A5B9F4F74F480912A05E82FE2 |
:10493000FF27EE0FFF1FE250FB4F808191818734EC |
:1049400091050CF044E0E22FFF27EE0FFF1FE2502D |
:10495000FB4F808191818A5B9F4F74F480912A057F |
:10496000E82FFF27EE0FFF1FE250FB4F8081918160 |
:10497000863491050CF445E0A2E0B0E0042E0E94DC |
:104980000E398091320580FF10C08091070190910F |
:104990000801875B934038F48091070190910801EA |
:1049A0008E5E924010F40E94890C0E944B0241E4FA |
:1049B0006AE275E00E9421020E9453190E944B0294 |
:1049C0000E94E31702C02093920283E288169104AA |
:1049D0000CF09BC020912D05E22FFF27EE0FFF1F4B |
:1049E000E250FB4F80819181855B9F4F0CF06DC041 |
:1049F000809193028F5F80939302893C08F467C093 |
:104A000088EC8093930281E090E0909396028093EB |
:104A1000950281E08093040210927C0210927D0244 |
:104A200010927E0210927F021092240210922502B0 |
:104A30001092260210922702109220021092210258 |
:104A40001092220210922302109234021092350228 |
:104A5000109236021092370210922C0210922D0200 |
:104A600010922E0210922F028091540290915502C2 |
:104A7000A0915602B0915702809330029093310278 |
:104A8000A0933202B093330280914C0290914D0278 |
:104A9000A0914E02B0914F02809328029093290278 |
:104AA000A0932A02B0932B02109274021092750206 |
:104AB0001092760210927702109278021092790288 |
:104AC00010927A0210927B0202C010929302E22F9F |
:104AD000FF27EE0FFF1FE250FB4F808191818C3446 |
:104AE00091058CF0809194028F5F80939402893CB1 |
:104AF00060F01092040288EC809394021092960267 |
:104B00001092950202C01092940280916A01815025 |
:104B100080936A0180916A018F3F29F0809115028C |
:104B2000882309F485C20E94E42060902A05E62DBE |
:104B3000FF27EE0FFF1FDF01A250BB4F0091390589 |
:104B4000C02FDD278D919C918C9F50018D9FB00CC3 |
:104B50009C9FB00C1124EC5EFA4F80913A05482FCF |
:104B6000552780819181849FB001859F700D949F0E |
:104B7000700D1124A60EB71EB0920A02A09209026F |
:104B800070902B05E72DFF27EE0FFF1FDF01A250CE |
:104B9000BB4F8D919C918C9F90018D9F300D9C9F60 |
:104BA000300D1124EC5EFA4F80819181849FB00119 |
:104BB000859F700D949F700D1124260F371F309321 |
:104BC00008022093070280912D05E82FFF27EE0FA2 |
:104BD000FF1FE250FB4F80819181909581959F4FFF |
:104BE000909306028093050210917001812F9927FE |
:104BF00087FD9095A92FB92FBC01CD010E94B53733 |
:104C000017FF06C020E030E040E853E40E94103770 |
:104C100020E030E040E251E40E941037DC01CB019B |
:104C200020E030E040E85BE3BC01CD010E942F387A |
:104C30006B017C01609396057093970580939805AE |
:104C40009093990510916F01812F992787FD909579 |
:104C5000A92FB92FBC01CD010E94B53717FF06C09F |
:104C600020E030E040E853E40E94103720E030EECE |
:104C70004BE257E40E945237DC01CB018093880558 |
:104C800090938905A0938A05B0938B058091320596 |
:104C900082FF0CC080E090E0A0E0B0E08093880547 |
:104CA00090938905A0938A05B0938B0520E030E0AE |
:104CB00040E050E0C701B6010E94BF37882364F48A |
:104CC00080E090E0A0E0B0E0809396059093970597 |
:104CD000A0939805B09399058091880590918905D6 |
:104CE000A0918A05B0918B0520E030E040E050E0D3 |
:104CF000BC01CD010E94BF37882364F480E090E0BE |
:104D0000A0E0B0E08093880590938905A0938A0580 |
:104D1000B0938B0560915905862F992782FDAEC00F |
:104D200083FDACC08091540290915502A09156022F |
:104D3000B091570281569A4EA040B040DCF0CE01AF |
:104D400023E0880F991F2A95E1F79501281B390B5D |
:104D500030930A02209309028091540290915502E7 |
:104D6000A0915602B091570281589843A140B0409B |
:104D700094F126C08091540290915502A091560260 |
:104D8000B0915702805A9541AF4FBF4F24F59E0115 |
:104D900013E0220F331F1A95E1F72A0D3B1D3093C4 |
:104DA0000A02209309028091540290915502A09129 |
:104DB0005602B091570281589843A140B0405CF030 |
:104DC000B4E0CC0FDD1FBA95E1F72C1B3D0B3093FF |
:104DD0000A022093090280914C0290914D02A09109 |
:104DE0004E02B0914F0281569A4EA040B0407CF0E6 |
:104DF000402F5527CA01A3E0880F991FAA95E1F714 |
:104E00002091070230910802281B390B1BC08091AA |
:104E10004C0290914D02A0914E02B0914F02805AE7 |
:104E20009541AF4FBF4F54F5402F5527CA01F3E0CE |
:104E3000880F991FFA95E1F7209107023091080237 |
:104E4000280F391F309308022093070280914C02EB |
:104E500090914D02A0914E02B0914F02815898431B |
:104E6000A140B0405CF0E4E0440F551FEA95E1F743 |
:104E7000241B350B3093080220930702E72DFF27F0 |
:104E8000EE0FFF1FE250FB4F40915105242F3327B7 |
:104E9000808191812817390734F462FF04C081E0D2 |
:104EA0008093F90113C0E72DFF27EE0FFF1FE2509B |
:104EB000FB4F842F992720915205821B9109208155 |
:104EC00031812817390714F41092F90140912B050C |
:104ED000E42FFF27EE0FFF1FE250FB4F50915105CB |
:104EE000852F992722273327281B390B8081918111 |
:104EF0008217930744F48091590583FF04C081E031 |
:104F00008093F80116C08091F801882391F0E42F76 |
:104F1000FF27EE0FFF1FE250FB4F809152059927AC |
:104F2000851B9109208131818217930714F4109217 |
:104F3000F801E62DFF27EE0FFF1FE250FB4F4091D7 |
:104F40005105242F3327808191812817390744F494 |
:104F50008091590580FF04C081E08093F60117C05D |
:104F60008091F601882399F0E62DFF27EE0FFF1FB1 |
:104F7000E250FB4F842F992720915205821B910903 |
:104F8000208131812817390714F41092F6014091DD |
:104F90002A05E42FFF27EE0FFF1FE250FB4F509131 |
:104FA0005105852F992722273327281B390B80810C |
:104FB00091818217930744F48091590581FF04C0C1 |
:104FC00081E08093F70116C08091F701882391F06A |
:104FD000E42FFF27EE0FFF1FE250FB4F8091520599 |
:104FE0009927851B9109208131818217930714F439 |
:104FF0001092F7018091F901882319F48091F8014A |
:10500000811181E08093FA018091F601882321F4D7 |
:105010008091F701882351F081E08093FB01109289 |
:10502000FA011092F9011092F80102C08093FB017D |
:105030002091FA01222331F084E690E09093BD01A3 |
:105040008093BC01222321F48091FB01882339F055 |
:10505000809150059927881599050CF44C017090A2 |
:105060001502772041F1109206021092050210926B |
:105070000A021092090210920802109207028DECA7 |
:105080009CECACECBDE38093960590939705A093C0 |
:105090009805B09399058AE097EDA3EABBE3809366 |
:1050A000880590938905A0938A05B0938B0510928B |
:1050B000FA011092FB018091800590918105A091E9 |
:1050C0008205B091830520915402309155024091A0 |
:1050D000560250915702820F931FA41FB51F809351 |
:1050E000800590938105A0938205B09383058091FC |
:1050F000840590918505A0918605B0918705209142 |
:105100004C0230914D0240914E0250914F02820F5D |
:10511000931FA41FB51F8093840590938505A093CA |
:105120008605B09387058091780590917905A091C7 |
:105130007A05B0917B052091500230915102409147 |
:10514000520250915302820F931FA41FB51F8093E8 |
:10515000780590937905A0937A05B0937B058091AB |
:10516000700590917105A0917205B0917305209121 |
:1051700048023091490240914A0250914B02820FFD |
:10518000931FA41FB51F8093700590937105A09382 |
:105190007205B09373052091FB01222329F48091BD |
:1051A000FA01882309F45CC010924402109245026F |
:1051B0001092460210924702109240021092410251 |
:1051C00010924202109243021092800510928105C3 |
:1051D0001092820510928305109284051092850525 |
:1051E0001092860510928705109278051092790525 |
:1051F00010927A0510927B0510927005109271053D |
:1052000010927205109273058091340290913502CC |
:10521000A0913602B0913702809330029093310210 |
:10522000A0933202B093330280912C0290912D0210 |
:10523000A0912E02B0912F02809328029093290210 |
:10524000A0932A02B0932B021092C7011092C601BC |
:105250001092FD011092FC011092FF011092FE01CC |
:105260008091C6019091C7018F3F910509F008F424 |
:1052700021C6222309F0E2C58091FA01882309F0B2 |
:10528000DDC58091800590918105A0918205B09146 |
:105290008305B7FF04C081509F4FAF4FBF4F892F89 |
:1052A0009A2FAB2FBB27A7FDBA95809380059093CB |
:1052B0008105A0938205B093830580918405909128 |
:1052C0008505A0918605B0918705B7FF04C0815080 |
:1052D0009F4FAF4FBF4F892F9A2FAB2FBB27A7FDF3 |
:1052E000BA958093840590938505A0938605B09325 |
:1052F000870580913E05E82EFF2400271127209185 |
:105300004402309145024091460250914702C80143 |
:10531000B7010E94773897FF04C061507F4F8F4FCD |
:105320009F4FBB2797FDBA95A92F982F872F809362 |
:10533000440290934502A0934602B0934702209105 |
:105340004002309141024091420250914302C80113 |
:10535000B7010E94773897FF04C061507F4F8F4F8D |
:105360009F4FBB2797FDBA95A92F982F872F809322 |
:10537000400290934102A0934202B0934302809175 |
:105380003C0290913D02A0913E02B0913F02B7FFD6 |
:1053900004C081509F4FAF4FBF4F892F9A2FAB2F23 |
:1053A000BB27A7FDBA9580933C0290933D02A09342 |
:1053B0003E02B0933F02E0908005F090810500919D |
:1053C0008205109183058091440290914502A0913D |
:1053D0004602B0914702E81AF90A0A0B1B0BE09249 |
:1053E0008802F092890200938A0210938B02C09186 |
:1053F00057052C2F332744275527C801B7010E9492 |
:10540000EB3820939B0230939C0240939D02509373 |
:105410009E022091A9023091AA024091AB025091C4 |
:10542000AC028091800590918105A0918205B09198 |
:105430008305281B390B4A0B5B0B57FF07C05095A0 |
:105440004095309521953F4F4F4F5F4F285833413E |
:10545000404050400CF03FC0C801B7012CEB32E097 |
:1054600040E050E00E94EB382093800230938102AC |
:105470004093820250938302213231054105510548 |
:1054800064F080E290E0A0E0B0E08093800290932E |
:105490008102A0938202B093830280918002909156 |
:1054A0008102A0918202B0918302805E9F4FAF4F34 |
:1054B000BF4F64F480EE9FEFAFEFBFEF80938002A9 |
:1054C00090938102A0938202B09383028091800224 |
:1054D0009091810208C08091FC019091FD0197FD9F |
:1054E0000196959587959093FD018093FC01E0903E |
:1054F0008405F090850500918605109187058091BF |
:10550000400290914102A0914202B0914302E81AF8 |
:10551000F90A0A0B1B0BE0928C02F0928D020093A9 |
:105520008E0210938F022C2F332744275527C80152 |
:10553000B7010E94EB3820939F023093A002409362 |
:10554000A1025093A2022091AD023091AE0240918F |
:10555000AF025091B0028091840590918505A09191 |
:105560008605B0918705281B390B4A0B5B0B57FF4B |
:1055700007C050954095309521953F4F4F4F5F4F55 |
:1055800028583341404050400CF03FC0C801B7019B |
:105590002CEB32E040E050E00E94EB382093840294 |
:1055A0003093850240938602509387022132310561 |
:1055B0004105510564F080E290E0A0E0B0E0809306 |
:1055C000840290938502A0938602B0938702809113 |
:1055D000840290918502A0918602B0918702805E3C |
:1055E0009F4FAF4FBF4F64F480EE9FEFAFEFBFEF21 |
:1055F0008093840290938502A0938602B0938702E1 |
:10560000809184029091850208C08091FE01909162 |
:10561000FF0197FD0196959587959093FF018093E3 |
:10562000FE018091800590918105A0918205B09145 |
:1056300083058093A9029093AA02A093AB02B09332 |
:10564000AC028091840590918505A0918605B0916A |
:1056500087058093AD029093AE02A093AF02B09302 |
:10566000B0028091340290913502A0913602B0913F |
:10567000370220919B0230919C0240919D025091F3 |
:105680009E02821B930BA40BB50B80933402909364 |
:105690003502A0933602B093370280912C0290918C |
:1056A0002D02A0912E02B0912F0220919F023091E5 |
:1056B000A0024091A1025091A202821B930BA40B65 |
:1056C000B50B80932C0290932D02A0932E02B093E1 |
:1056D0002F028091780590917905A0917A05B0917B |
:1056E0007B05B7FF04C081509F4FAF4FBF4F892F3D |
:1056F0009A2FAB2FBB27A7FDBA958093780590937F |
:105700007905A0937A05B0937B05809170059091FF |
:105710007105A0917205B0917305B7FF04C0815067 |
:105720009F4FAF4FBF4F892F9A2FAB2FBB27A7FD9E |
:10573000BA958093700590937105A0937205B0930C |
:105740007305E0907805F090790500917A05109145 |
:105750007B058091440290914502A0914602B09150 |
:105760004702E81AF90A0A0B1B0BE0928002F0923A |
:105770008102009382021093830220917005309180 |
:10578000710540917205509173058091400290918E |
:105790004102A0914202B0914302281B390B4A0BEF |
:1057A0005B0B2093840230938502409386025093D2 |
:1057B0008702E0928802F092890200938A02109395 |
:1057C0008B0220938C0230938D0240938E02509373 |
:1057D0008F028091300290913102A0913202B091FB |
:1057E00033028E199F09A00BB10B80933002909366 |
:1057F0003102A0933202B09333028091280290913B |
:105800002902A0912A02B0912B02821B930BA40BB8 |
:10581000B50B8093280290932902A0932A02B0939B |
:105820002B022091FE013091FF01C901F3E0880FA6 |
:10583000991FFA95E1F7820F931F820F931F9093A0 |
:10584000E0048093DF048091440290914502A0918E |
:105850004602B0914702BC01CD012AE130E040E0B0 |
:1058600050E00E94EB383093C6042093C504809129 |
:10587000400290914102A0914202B0914302BC01CA |
:10588000CD012AE130E040E050E00E94EB38309357 |
:10589000C8042093C7048091880290918902909354 |
:1058A000CA048093C90480918C0290918D029093D8 |
:1058B000CC048093CB048091800590918105A091C8 |
:1058C0008205B0918305BC01CD012AE130E040E0C2 |
:1058D00050E00E94EB383093CE042093CD048091A9 |
:1058E000840590918505A0918605B0918705BC013E |
:1058F000CD012AE130E040E050E00E94EB383093E7 |
:10590000D0042093CF0480919B0290919C029093AD |
:10591000DC048093DB0480919F029091A00290931D |
:10592000DE048093DD0481E090E09093A4028093F4 |
:10593000A30281E0E81684E0F80680E0080780E032 |
:1059400018070CF46AC08091A502882309F461C08D |
:10595000D801C70117FF07C088279927DC018E19D6 |
:105960009F09A00BB10BB7FF04C081509C4FAF4FF4 |
:10597000BF4FEAE0B595A79597958795EA95D1F73A |
:1059800001969093A4028093A302D801C70117FF48 |
:1059900003C00396A11DB11D72E0B595A79597951B |
:1059A00087957A95D1F780939B0290939C02A09360 |
:1059B0009D02B0939E0289589341A040B04064F08C |
:1059C00088E893E1A0E0B0E080939B0290939C0272 |
:1059D000A0939D02B0939E02809134029091350273 |
:1059E000A0913602B091370220919B0230919C0227 |
:1059F00040919D0250919E02821B930BA40BB50B0C |
:105A00008093340290933502A0933602B09337020C |
:105A100006C081E08093A50202C01092A502C09149 |
:105A20008802D0918902E0918A02F0918B02C03005 |
:105A30003CEFD3073FEFE3073FEFF3070CF071C0F4 |
:105A40008091A602882309F468C0CE01DF01F7FF28 |
:105A500007C088279927DC018C1B9D0BAE0BBF0B61 |
:105A60009C01AD01B7FF04C021503C4F4F4F5F4F29 |
:105A70006AE055954795379527956A95D1F78091B6 |
:105A8000A3029091A402820F931F9093A40280938B |
:105A9000A302CE01DF01F7FF03C00396A11DB11DD4 |
:105AA00042E0B595A795979587954A95D1F780934C |
:105AB0009B0290939C02A0939D02B0939E028857F4 |
:105AC0009C4EAF4FBF4F64F488E79CEEAFEFBFEF43 |
:105AD00080939B0290939C02A0939D02B0939E02A0 |
:105AE0008091340290913502A0913602B091370234 |
:105AF00020919B0230919C0240919D0250919E0208 |
:105B0000821B930BA40BB50B809334029093350248 |
:105B1000A0933602B093370206C081E08093A602BC |
:105B200002C01092A6028091A3029091A402049751 |
:105B300034F083E090E09093A4028093A302C138F4 |
:105B4000D105E105F10574F080916A0290916B0234 |
:105B50002091A3023091A402820F931F90936B02B5 |
:105B600080936A02C058DF4FEF4FFF4F74F480916B |
:105B70006A0290916B022091A3023091A402821BD1 |
:105B8000930B90936B0280936A0281E090E0909374 |
:105B9000A4028093A30210929F021092A00210927E |
:105BA000A1021092A202C0918C02D0918D02E091CC |
:105BB0008E02F0918F02C13064E0D60760E0E60704 |
:105BC00060E0F6070CF46AC08091A702882309F40C |
:105BD00061C0CE01DF01F7FF07C088279927DC01EC |
:105BE0008C1B9D0BAE0BBF0BB7FF04C081509C4FAD |
:105BF000AF4FBF4F3AE0B595A795979587953A95E2 |
:105C0000D1F701969093A4028093A302CE01DF0105 |
:105C1000F7FF03C00396A11DB11D22E0B595A7951E |
:105C2000979587952A95D1F780939F029093A0022C |
:105C3000A093A102B093A20289589341A040B04022 |
:105C400064F088E893E1A0E0B0E080939F02909335 |
:105C5000A002A093A102B093A20280912C02909185 |
:105C60002D02A0912E02B0912F0220919F0230911F |
:105C7000A0024091A1025091A202821B930BA40B9F |
:105C8000B50B80932C0290932D02A0932E02B0931B |
:105C90002F0206C081E08093A70202C01092A702E3 |
:105CA000C0308CEFD8078FEFE8078FEFF8070CF0C4 |
:105CB00071C08091A802882309F468C0CE01DF0179 |
:105CC000F7FF07C088279927DC018C1B9D0BAE0BC3 |
:105CD000BF0B9C01AD01B7FF04C021503C4F4F4F9B |
:105CE0005F4F0AE055954795379527950A95D1F767 |
:105CF0008091A3029091A402820F931F9093A4021B |
:105D00008093A302CE01DF01F7FF03C00396A11D1C |
:105D1000B11D12E0B595A795979587951A95D1F77E |
:105D200080939F029093A002A093A102B093A2023D |
:105D300088579C4EAF4FBF4F64F488E79CEEAFEF9F |
:105D4000BFEF80939F029093A002A093A102B09313 |
:105D5000A20280912C0290912D02A0912E02B0916E |
:105D60002F0220919F023091A0024091A1025091F8 |
:105D7000A202821B930BA40BB50B80932C02909371 |
:105D80002D02A0932E02B0932F0206C081E08093D3 |
:105D9000A80202C01092A80280919F029091A002D6 |
:105DA0009093DA048093D9048091A3029091A40285 |
:105DB000049734F083E090E09093A4028093A302D0 |
:105DC000C138D105E105F10574F080916802909128 |
:105DD00069022091A3023091A402820F931F909335 |
:105DE000690280936802C058DF4FEF4FFF4F74F491 |
:105DF00080916802909169022091A3023091A402DF |
:105E0000821B930B909369028093680280916802D1 |
:105E1000909169022091640230916502821B930B7C |
:105E20009C01B3E0220F331FBA95E1F7280F391F09 |
:105E3000280F391F3093D4042093D30410924402C6 |
:105E400010924502109246021092470210924002B0 |
:105E500010924102109242021092430210923C02B0 |
:105E600010923D0210923E0210923F021092800565 |
:105E7000109281051092820510928305109284057C |
:105E8000109285051092860510928705109278056C |
:105E90001092790510927A0510927B051092700588 |
:105EA0001092710510927205109273051092C7013D |
:105EB0001092C601C0910502D0910602CE01D7FF13 |
:105EC00004C0882799278C1B9D0B45973CF0809137 |
:105ED000320584FD03C081E080939A02D0903B0597 |
:105EE000ED2CFF2400271127BE01882777FD809520 |
:105EF000982F9E01D7FF04C0222733272C1B3D0B70 |
:105F0000442737FD4095542F0E9477389B01AC0100 |
:105F1000C801B7010E94773897FF04C061507E4FD7 |
:105F20008F4F9F4FA9E09595879577956795AA958F |
:105F3000D1F78D2D99278C9FA0018D9F500D9C9F8F |
:105F4000500D1124CA0157FD039695958795959597 |
:105F50008795680F791FCB01AA2797FDA095BA2FC7 |
:105F600080937C0290937D02A0937E02B0937F0287 |
:105F7000209124023091250240912602509127025F |
:105F8000281B390B4A0B5B0B20932402309325020C |
:105F9000409326025093270280912402909125027B |
:105FA000A0912602B09127028155934CA040B040A9 |
:105FB00064F080E593ECA0E0B0E08093240290933D |
:105FC0002502A0932602B09327028091240290918B |
:105FD0002502A0912602B0912702805B9C43AF4F1F |
:105FE000BF4F64F480EB9CE3AFEFBFEF80932402DC |
:105FF00090932502A0932602B093270280911A0263 |
:1060000090911B02892B09F4AAC08091320583FF6D |
:10601000A6C08091540290915502A0915602B09171 |
:106020005702B7FF04C081509E4FAF4FBF4FE9E00A |
:10603000B595A79597958795EA95D1F79C0197FF18 |
:1060400003C0309521953F4F80914C0290914D02B5 |
:10605000A0914E02B0914F02B7FF04C081509E4FF5 |
:10606000AF4FBF4F79E0B595A795979587957A95EE |
:10607000D1F7BC0197FF03C0709561957F4F26173C |
:1060800037070CF49B0129313105A4F480919A0261 |
:10609000882381F08091B1029091B202892B51F452 |
:1060A00080911A0290911B0290931902809318021A |
:1060B00010929A0280917101482F5527249FC001A8 |
:1060C000259F900D349F900D112497FDCF969C0134 |
:1060D00066E0359527956A95E1F7421B530B9A01C7 |
:1060E00014161506B4F58091B1029091B202009792 |
:1060F00071F58091160290911702829FA001839FF3 |
:10610000500D929F500D11249A0157FF02C0215E3D |
:106110003F4F55E0359527955A95E1F7442737FDD0 |
:106120004095542F8091240290912502A09126023F |
:10613000B0912702820F931FA41FB51F80932402E2 |
:1061400090932502A0932602B093270208C00197DE |
:1061500002C084EF91E09093B2028093B1028091EB |
:1061600099028150809399028F3F09F085C088E1A0 |
:106170008093990280913E05E82EFF240027112785 |
:106180008091540290915502A0915602B09157020D |
:10619000BC01CD01A80197010E94EB383093A40403 |
:1061A0002093A30480914C0290914D02A0914E0245 |
:1061B000B0914F02BC01CD01A80197010E94EB38BC |
:1061C0003093A6042093A5048091910590919205A7 |
:1061D0009093A8048093A70480919B0590919C05BF |
:1061E0009093AA048093A9048091940590919505B9 |
:1061F0009093AC048093AB048091020290910302CF |
:106200009093AE048093AD0480911C0290911D0286 |
:10621000A0911E02B0911F02B7FF04C081509E4F93 |
:10622000AF4FBF4F49E0B595A795979587954A958C |
:10623000D1F79093B0048093AF0480911A029091AB |
:106240001B029093B4048093B30480910D0190914C |
:106250000E019093B6048093B50480910B029927A8 |
:106260009093B8048093B70480917C0590917D054C |
:106270009093C4048093C3048091FB01A090960581 |
:10628000B0909705C0909805D09099058823A9F003 |
:106290008091750590917605AA2797FDA095BA2F54 |
:1062A000BC01CD010E94B537DC01CB01A6019501EF |
:1062B000BC01CD010E942F383AC0809154029091C8 |
:1062C0005502A0915602B0915702BC01CD010E9427 |
:1062D000B5377B018C018091880590918905A0914B |
:1062E0008A05B0918B059C01AD01C801B7010E94E0 |
:1062F0002F387B018C018091750590917605AA2736 |
:1063000097FDA095BA2FBC01CD010E94B537DC01E5 |
:10631000CB01A6019501BC01CD010E942F38DC0103 |
:10632000CB019C01AD01C801B7010E941037DC010F |
:10633000CB01BC01CD010E949837DC01CB019093C9 |
:106340007605809375058091FA01A0909605B0902E |
:106350009705C0909805D09099058823A9F0809161 |
:106360006D0590916E05AA2797FDA095BA2FBC01E7 |
:10637000CD010E94B537DC01CB01A6019501BC011E |
:10638000CD010E942F383AC080914C0290914D026D |
:10639000A0914E02B0914F02BC01CD010E94B537D1 |
:1063A0007B018C018091880590918905A0918A05D7 |
:1063B000B0918B059C01AD01C801B7010E942F3837 |
:1063C0007B018C0180916D0590916E05AA2797FD48 |
:1063D000A095BA2FBC01CD010E94B537DC01CB01DD |
:1063E000A6019501BC01CD010E942F38DC01CB0133 |
:1063F0009C01AD01C801B7010E941037DC01CB013F |
:10640000BC01CD010E949837DC01CB0190936E0551 |
:1064100080936D058091940590919505AA2797FD2D |
:10642000A095BA2FBC01CD010E94B5377B018C012C |
:106430008091960590919705A0919805B091990546 |
:106440009C01AD01C801B7010E942F385B016C01AE |
:106450008091380290913902A0913A02B0913B02AA |
:10646000BC01CD010E94B5377B018C01809188056C |
:1064700090918905A0918A05B0918B059C01AD0191 |
:10648000C801B7010E942F38DC01CB0120E030E0C9 |
:1064900040E05FE3BC01CD010E942F38DC01CB015D |
:1064A0009C01AD01C601B5010E941037DC01CB0192 |
:1064B000BC01CD010E949837DC01CB01909395057A |
:1064C0008093940580917505909176058150984050 |
:1064D00034F080E098E09093760580937505809184 |
:1064E0007505909176058050984F34F480E098EFD0 |
:1064F000909376058093750580916D0590916E055A |
:106500008150984034F080E098E090936E0580933D |
:106510006D0580916D0590916E058050984F34F413 |
:1065200080E098EF90936E0580936D0580919405BF |
:10653000909195058150984034F080E098E09093D8 |
:1065400095058093940580919405909195058050D0 |
:10655000984F34F480E098EF9093950580939405DC |
:1065600080913205992780FFE1C02091740181FF5D |
:106570000EC02233B0F4809102029091030244973E |
:106580009093010280930002109214020DC080913A |
:106590003705289FC00111244497909301028093EE |
:1065A000000281E080931402772021F01092010212 |
:1065B0001092000200910202109103022091000249 |
:1065C00030910102201731070CF0B0C08091140205 |
:1065D000882309F4ABC0021B130B80917301992728 |
:1065E000089FB001099F700D189F700D1124CB01F9 |
:1065F00077FD0F968C0134E0159507953A95E1F7F4 |
:10660000C401801B910B8C0180917501282F3327C9 |
:106610008091C8019091C901829FA001839F500D74 |
:10662000929F500D1124CA0157FD079623E09595BE |
:1066300087952A95E1F7081B190BA0911C02B091D0 |
:106640001D02C0911E02D0911F02D7FF04C0A150AD |
:10665000BE4FCF4FDF4F89E0D595C795B795A7952A |
:106660008A95D1F780917201282F33274427552727 |
:10667000BD01CE010E94773897FF04C0615E7F4F55 |
:106680008F4F9F4FC5E09595879577956795CA95EC |
:10669000D1F7633371051CF062E370E006C05FEF71 |
:1066A0006E3C750714F46EEC7FEF061B170B8091A0 |
:1066B0009702909198029C01B4E0220F331FBA9583 |
:1066C000E1F7281B390B200F311F37FF02C0215F74 |
:1066D0003F4FA4E035952795AA95E1F730939802AE |
:1066E0002093970280913305482F552724173507AB |
:1066F00074F48416950624F0509398024093970200 |
:106700008416950624F490929802809297028091C4 |
:106710009702909198028816990624F49092980214 |
:106720008092970280909702909098029092B20483 |
:106730008092B104C0919405D091950580917C021E |
:1067400090917D02C81BD90BCE01AA2797FDA09579 |
:10675000BA2FBC01CD010E94B5377B018C01C40169 |
:10676000AA2797FDA095BA2FBC01CD010E94B5378D |
:106770005B016C019B01AC01C801B7010E94C237EB |
:1067800018163CF4C601B5010E949837DC01CB0114 |
:10679000EC01CE01AA2797FDA095BA2FBC01CD012F |
:1067A0000E94B537DC01CB018601750117FB1095FE |
:1067B00017F91095A8019701BC01CD010E94BF37C0 |
:1067C00088233CF4C801B7010E949837DC01CB0153 |
:1067D000EC01C536D10514F0C4E6D0E06FEFCC393A |
:1067E000D60714F4CCE9DFEF74E18716910414F4B2 |
:1067F000C0E0D0E02091090230910A028091C502E8 |
:106800009091C602281B390B8091750590917605F1 |
:10681000821B930BAA2797FDA095BA2FBC01CD012F |
:106820000E94B537DC01CB0140907A0150907B018A |
:1068300060907C0170907D019C01AD01C301B201AB |
:106840000E942F38DC01CB01BC01CD010E9498379A |
:10685000DC01CB0190937F0580937E0580917E05BE |
:1068600090917F05AA2797FDA095BA2F20917402D9 |
:10687000309175024091760250917702280F391FAE |
:106880004A1F5B1F20937402309375024093760277 |
:10689000509377026091740270917502121613067C |
:1068A00014061506C4F4CB0177FF04C08827992786 |
:1068B000861B970B97FF02C081509F4F892F990F1E |
:1068C000990B0196AA2797FDA095BA2F281B390B83 |
:1068D0004A0B5B0B16C0CB0177FF03C090958195E7 |
:1068E0009F4F97FF02C081509F4F892F990F990B9F |
:1068F0000196AA2797FDA095BA2F280F391F4A1F86 |
:106900005B1F20937402309375024093760250937C |
:1069100077028091740290917502A0917602B091F5 |
:10692000770281589E43A040B04064F080E89EE327 |
:10693000A0E0B0E08093740290937502A093760279 |
:10694000B09377028091740290917502A0917602C3 |
:10695000B09177028058914CAF4FBF4F64F480E8FC |
:1069600091ECAFEFBFEF8093740290937502A09308 |
:106970007602B093770280917E0590917F05AA27D9 |
:1069800097FDA095BA2FBC01CD010E94B5377B01C0 |
:106990008C018091740290917502A0917602B09161 |
:1069A0007702BC01CD010E94B537DC01CB01A0907C |
:1069B0007601B0907701C0907801D09079019C0168 |
:1069C000AD01C601B5010E942F38DC01CB019C014D |
:1069D000AD01C801B7010E941037DC01CB01BC0139 |
:1069E000CD010E949837DC01CB01AC01CE01D7FF6D |
:1069F00004C0882799278C1B9D0B880D991D880F33 |
:106A0000991F8417950764F4CE01D7FF04C0882727 |
:106A100099278C1B9D0BA401480F591F440F551F2C |
:106A2000CE01D7FF04C0882799278C1B9D0B880DAA |
:106A3000991D2EEF3FEF829FB001839F700D929FB3 |
:106A4000700D11244617570784F4CE01D7FF04C0F8 |
:106A5000882799278C1B9D0B880D991D829FA0016B |
:106A6000839F500D929F500D11249401240F351FC8 |
:106A70002C0F3D1F37FF03C020E030E007C080919E |
:106A800093059927821793070CF49C0130907705A2 |
:106A9000832D9927281739070CF49C0120936F0543 |
:106AA0009401241B350B2C0F3D1F37FF03C020E042 |
:106AB00030E007C0809193059927821793070CF463 |
:106AC0009C01832D9927281739070CF49C012093EA |
:106AD000740520910702309108028091C3029091C1 |
:106AE000C402281B390B80916D0590916E05821BA5 |
:106AF000930BAA2797FDA095BA2FBC01CD010E9448 |
:106B0000B537DC01CB019C01AD01C301B2010E948C |
:106B10002F38DC01CB01BC01CD010E949837DC018C |
:106B2000CB0190936C0580936B0580916B059091E0 |
:106B30006C05AA2797FDA095BA2F20917802309175 |
:106B4000790240917A0250917B02280F391F4A1F27 |
:106B50005B1F209378023093790240937A0250931E |
:106B60007B02609178027091790212161306140666 |
:106B70001506C4F4CB0177FF04C088279927861B2C |
:106B8000970B97FF02C081509F4F892F990F990B48 |
:106B90000196AA2797FDA095BA2F281B390B4A0BFF |
:106BA0005B0B16C0CB0177FF03C0909581959F4F7B |
:106BB00097FF02C081509F4F892F990F990B019623 |
:106BC000AA2797FDA095BA2F280F391F4A1F5B1FD0 |
:106BD000209378023093790240937A0250937B029B |
:106BE0008091780290917902A0917A02B0917B0213 |
:106BF00081589E43A040B04064F080E89EE3A0E04E |
:106C0000B0E08093780290937902A0937A02B093D7 |
:106C10007B028091780290917902A0917A02B091E2 |
:106C20007B028058914CAF4FBF4F64F480E891ECE9 |
:106C3000AFEFBFEF8093780290937902A0937A022E |
:106C4000B0937B0280916B0590916C05AA2797FD0C |
:106C5000A095BA2FBC01CD010E94B5377B018C01F4 |
:106C60008091780290917902A0917A02B0917B0292 |
:106C7000BC01CD010E94B537DC01CB019C01AD0107 |
:106C8000C601B5010E942F38DC01CB019C01AD018A |
:106C9000C801B7010E941037DC01CB01BC01CD0156 |
:106CA0000E949837DC01CB01AC01CE01D7FF04C0B4 |
:106CB000882799278C1B9D0B880D991D880F991F7C |
:106CC0008417950764F4CE01D7FF04C0882799275D |
:106CD0008C1B9D0BA401480F591F440F551FCE015B |
:106CE000D7FF04C0882799278C1B9D0B880D991D01 |
:106CF0002EEF3FEF829FB001839F700D929F700D2A |
:106D000011244617570784F4CE01D7FF04C0882703 |
:106D100099278C1B9D0B880D991D829FA001839F35 |
:106D2000500D929F500D11249401240F351F2C1BE0 |
:106D30003D0B37FF03C020E030E007C08091930592 |
:106D40009927821793070CF49C01832D9927281704 |
:106D500039070CF49C0120938E059401241B350BFC |
:106D60002C1B3D0B37FF03C020E030E007C08091B3 |
:106D700093059927821793070CF49C01832D99277B |
:106D8000281739070CF49C0120938C05DF91CF91D3 |
:106D90001F910F91FF90EF90DF90CF90BF90AF9039 |
:106DA0009F908F907F906F905F904F903F9008954D |
:106DB0008091BF029091C002A091C102B091C20225 |
:106DC0008093B7029093B802A093B902B093BA022D |
:106DD0008091BB029091BC02A091BD02B091BE0215 |
:106DE0008093B3029093B402A093B502B093B6021D |
:106DF00008951092C6021092C5021092C402109219 |
:106E0000C3020895FC014150504030F00190061635 |
:106E1000D1F73197CF0108958827992708955058C1 |
:106E2000192EEFD001D0D2C0BA17620773078407BA |
:106E30009507B1F188F40EF410940B2EBA2FA02D03 |
:106E4000062E622F202D072E732F302D082E842F13 |
:106E5000402D092E952F502DFF275523B9F0591B92 |
:106E600049F0573E98F0469537952795A795F040FD |
:106E70005395C9F776F0BA0F621F731F841F30F461 |
:106E8000879577956795B795F040939517FA0F2EEC |
:106E90000895BF1BBB27BA0B620B730B840BF6CF95 |
:106EA000DEF6DBC0AED001D091C0552359F0992356 |
:106EB00069F09F575F57951B33F442F4903811F4F3 |
:106EC000915805C09BC091589F3F09F4C6C0BB278D |
:106ED000112462177307840730F4660F771F881F29 |
:106EE000BB1F915098F311D00F920FD00F920DD07D |
:106EF000A0E82617370748071B0609F0A048BA2F55 |
:106F0000602D7F918F9100240895A0E800246217DE |
:106F100073078407B10528F0621B730B840BB1095A |
:106F20000A2A660F771F881FBB1FA69581F7089551 |
:106F300097FB73D09F3738F0FEE9F91B982F872F06 |
:106F4000762F6B2F05C086C09695879577956795A8 |
:106F5000F150D0F73EF490958095709561957F4FF4 |
:106F60008F4F9F4F0895E89403C097FB0EF4F3DF13 |
:106F7000B62F672F782F892F9EE9002427C00ED0C7 |
:106F80005EF004C00BD026F001C008D019F020F448 |
:106F90008FEF089580E0089581E0089597FB092E12 |
:106FA000052600F8689430D0E89407FC07C0621703 |
:106FB00073078407950721F008F4009407949894C8 |
:106FC00008959A95BB0F661F771F881F1124992378 |
:106FD000A1F08823B2F79F3F59F0BB0F48F421F48A |
:106FE000002011F460FF04C06F5F7F4F8F4F9F4FF1 |
:106FF000881F9795879597F908952CC09FEF80EC8F |
:107000000895052E092607FA440F551F5F3F79F0B2 |
:10701000AA27A51708F051E04795880F991F9F3FB1 |
:1070200031F0BB27B91708F091E0879508959F913B |
:107030009F911124E3CF97FB880F991F9F3F31F059 |
:10704000BB27B91708F091E0879508959F919F910C |
:107050001124D4CF66277727882799270895D1DF71 |
:1070600001D0B4CF992339F0552329F09F575F57AA |
:10707000950F13F49AF1F1CF91589F3FE1F3629F7E |
:10708000A12D0F92BB27639FA00DB11DEE27729F0C |
:10709000A00DB11DEE1FAF93AA27649FB00DE11D97 |
:1070A000739FB00DE11DAA1F6627829FB00DE11DE1 |
:1070B000A61F5527749FE00DA11D551F839FE00D4E |
:1070C000A11D561F849FA00D511D852F7A2F6E2F55 |
:1070D0001F900F9088231AF4939539F48FCF000CEA |
:1070E000111CBB1F661F771F881F01280895629F10 |
:1070F000D001739FF001829FE00DF11D649FE00DB0 |
:10710000F11D929FF00D839FF00D749FF00D659F10 |
:10711000F00D9927729FB00DE11DF91F639FB00D0F |
:10712000E11DF91FBD01CF0111240895991B79E0DC |
:1071300004C0991F961708F0961B881F7A95C9F707 |
:1071400080950895AA1BBB1B51E107C0AA1FBB1F56 |
:10715000A617B70710F0A61BB70B881F991F5A95E3 |
:10716000A9F780959095BC01CD01089597FB092E54 |
:1071700007260AD077FD04D0E5DF06D000201AF4F8 |
:10718000709561957F4F0895F6F7909581959F4F83 |
:107190000895A1E21A2EAA1BBB1BFD010DC0AA1F58 |
:1071A000BB1FEE1FFF1FA217B307E407F50720F070 |
:1071B000A21BB30BE40BF50B661F771F881F991FEB |
:1071C0001A9469F760957095809590959B01AC0134 |
:1071D000BD01CF01089597FB092E05260ED057FD5E |
:1071E00004D0D7DF0AD0001C38F450954095309574 |
:1071F00021953F4F4F4F5F4F0895F6F7909580953B |
:10720000709561957F4F8F4F9F4F0895F999FECFED |
:10721000B2BDA1BDF89A119600B40895F999FECFB8 |
:10722000B2BDA1BD00BC11960FB6F894FA9AF99AB6 |
:047230000FBE0895F0 |
:107234000A6401FFFF010AFF03007D0000640048A7 |
:10724400616C6C6F2057656C7400000000000000D6 |
:10725400000000000000000000000000000000002A |
:10726400000000000000000000000000000000001A |
:10727400000000000000000000000000000000000A |
:1072840000000000000000000000000000000001F9 |
:1072940002030405060708090A0A0146640A02965D |
:1072A40096403A10FB3017B7D1380000803F90D099 |
:1072B400030090D00300640053706F727400004B9D |
:1072C400616D6572610000426567696E6E6572008A |
:0272D4000000B8 |
:00000001FF |
/branches/salvo_gps/Basis_V0066c/trunk/Hex-Files/WasIstWas.txt |
---|
0,0 → 1,15 |
+++++++++++++++++++++++++ |
+ Flight-Ctrl: |
+++++++++++++++++++++++++ |
BootLoader_MEGA644_20MHZ_V0_1.hex |
Der Bootloader wird per ISP eingespielt |
Der Bootloader nur dann eingespielt werden, wenn noch nie ein Bootloader eingespielt wurde! |
Danach können Softwareupdates seriell eingespielt werden. |
Flight-Ctrl_MEGA644_Vx_yy.hex |
Aktuelle Firmware |
Wird per serielle Schnittstelle (durch den Bootloader) eingespielt |
Flight-Ctrl SW > 0.62 benötigt das Kopter-Tool >1.47 |
/branches/salvo_gps/Basis_V0066c/trunk/Kopter-Tool/MikroKopter-Tool.exe |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/branches/salvo_gps/Basis_V0066c/trunk/License.txt |
---|
0,0 → 1,52 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + Nur für den privaten Gebrauch |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten und nichtkommerziellen Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt und genannt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-profit use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet, our webpage (http://www.MikroKopter.de) must be |
// + clearly linked and named as origin |
// + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
/branches/salvo_gps/Basis_V0066c/trunk/Settings.h |
---|
--- branches/salvo_gps/Basis_V0066c/trunk/_Settings.h (nonexistent) |
+++ branches/salvo_gps/Basis_V0066c/trunk/_Settings.h (revision 446) |
@@ -0,0 +1,50 @@ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Testmodi |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define MOTOR_OFF 0 |
+#define MOTOR_TEST 0 |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Abstimmung |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define ACC_AMPLIFY 12 |
+#define FAKTOR_P 1 |
+#define FAKTOR_I 0.0001 |
+ |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Debug-Interface |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define SIO_DEBUG 1 // Soll der Debugger aktiviert sein? |
+#define MIN_DEBUG_INTERVALL 250 // in diesem Intervall werden Debugdaten ohne Aufforderung gesendet |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Sender |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ #define K_NICK 0 |
+ #define K_ROLL 1 |
+ #define K_GAS 2 |
+ #define K_GIER 3 |
+ #define K_POTI1 4 |
+ #define K_POTI2 5 |
+ #define K_POTI3 6 |
+ #define K_POTI4 7 |
+// +++++++++++++++++++++++++++++++ |
+// + Getestete Settings: |
+// +++++++++++++++++++++++++++++++ |
+// Setting: Kamera |
+// Stick_P:3 |
+// Stick_D:0 |
+// Gyro_P: 175 |
+// Gyro_I: 175 |
+// Ki_Anteil: 10 |
+// +++++++++++++++++++++++++++++++ |
+// + Getestete Settings: |
+// +++++++++++++++++++++++++++++++ |
+// Setting: Normal |
+// Stick_P:2 |
+// Stick_D:8 |
+// Gyro_P: 80 |
+// Gyro_I: 150 |
+// Ki_Anteil: 5 |
+ |
/branches/salvo_gps/Basis_V0066c/trunk/analog.c |
---|
0,0 → 1,145 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_ax, Aktuell_ay,Aktuell_az, UBat = 100; |
volatile int AdWertNick = 0, AdWertRoll = 0, AdWertGier = 0; |
volatile int AdWertAccRoll = 0,AdWertAccNick = 0,AdWertAccHoch = 0; |
volatile char MessanzahlNick = 0, MessanzahlRoll = 0, MessanzahlGier = 0; |
volatile char messanzahl_AccNick = 0, messanzahl_AccRoll = 0, messanzahl_AccHoch = 0; |
volatile long Luftdruck = 32000; |
volatile int StartLuftdruck; |
volatile unsigned int MessLuftdruck = 1023; |
unsigned char DruckOffsetSetting; |
volatile int HoeheD = 0; |
volatile char messanzahl_Druck; |
volatile int tmpLuftdruck; |
volatile unsigned int ZaehlMessungen = 0; |
//####################################################################################### |
// |
void ADC_Init(void) |
//####################################################################################### |
{ |
ADMUX = 0;//Referenz ist extern |
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADIE); |
//Free Running Mode, Division Factor 128, Interrupt on |
} |
void SucheLuftruckOffset(void) |
{ |
unsigned int off; |
off = eeprom_read_byte(&EEPromArray[EEPROM_ADR_LAST_OFFSET]); |
if(off > 20) off -= 10; |
OCR0A = off; |
Delay_ms_Mess(100); |
if(MessLuftdruck < 850) off = 0; |
for(; off < 250;off++) |
{ |
OCR0A = off; |
Delay_ms_Mess(50); |
printf("."); |
if(MessLuftdruck < 900) break; |
} |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_LAST_OFFSET], off); |
DruckOffsetSetting = off; |
Delay_ms_Mess(300); |
} |
//####################################################################################### |
// |
SIGNAL(SIG_ADC) |
//####################################################################################### |
{ |
static unsigned char kanal=0,state = 0; |
static unsigned int gier1, roll1, nick1; |
ANALOG_OFF; |
switch(state++) |
{ |
case 0: |
gier1 = ADC; |
kanal = 1; |
ZaehlMessungen++; |
break; |
case 1: |
roll1 = ADC; |
kanal = 2; |
break; |
case 2: |
nick1 = ADC; |
kanal = 4; |
break; |
case 3: |
UBat = (3 * UBat + ADC / 3) / 4;//(UBat + ((ADC * 39) / 256) + 19) / 2; |
kanal = 6; |
break; |
case 4: |
Aktuell_ay = NeutralAccY - ADC; |
AdWertAccRoll = Aktuell_ay; |
kanal = 7; |
break; |
case 5: |
Aktuell_ax = ADC - NeutralAccX; |
AdWertAccNick = Aktuell_ax; |
kanal = 0; |
break; |
case 6: |
if(PlatinenVersion == 10) AdWertGier = (ADC + gier1) / 2; |
else AdWertGier = ADC + gier1; |
kanal = 1; |
break; |
case 7: |
if(PlatinenVersion == 10) AdWertRoll = (ADC + roll1) / 2; |
else AdWertRoll = ADC + roll1; |
kanal = 2; |
break; |
case 8: |
if(PlatinenVersion == 10) AdWertNick = (ADC + nick1) / 2; |
else AdWertNick = ADC + nick1; |
kanal = 5; |
break; |
case 9: |
AdWertAccHoch = (signed int) ADC - NeutralAccZ; |
AdWertAccHoch += abs(Aktuell_ay) / 4 + abs(Aktuell_ax) / 4; |
if(AdWertAccHoch > 1) |
{ |
if(NeutralAccZ < 800) NeutralAccZ+= 0.02; |
} |
else if(AdWertAccHoch < -1) |
{ |
if(NeutralAccZ > 600) NeutralAccZ-= 0.02; |
} |
messanzahl_AccHoch = 1; |
Aktuell_az = ADC; |
Mess_Integral_Hoch += AdWertAccHoch; // Integrieren |
Mess_Integral_Hoch -= Mess_Integral_Hoch / 1024; // dämfen |
kanal = 3; |
break; |
case 10: |
tmpLuftdruck += ADC; |
if(++messanzahl_Druck >= 5) |
{ |
MessLuftdruck = ADC; |
messanzahl_Druck = 0; |
HoeheD = (int)(StartLuftdruck - tmpLuftdruck - HoehenWert); // D-Anteil = neuerWert - AlterWert |
Luftdruck = (tmpLuftdruck + 3 * Luftdruck) / 4; |
HoehenWert = StartLuftdruck - Luftdruck; |
tmpLuftdruck = 0; |
} |
kanal = 0; |
state = 0; |
break; |
default: |
kanal = 0; |
state = 0; |
break; |
} |
ADMUX = kanal; |
if(state != 0) ANALOG_ON; |
} |
/branches/salvo_gps/Basis_V0066c/trunk/analog.h |
---|
0,0 → 1,24 |
/*####################################################################################### |
#######################################################################################*/ |
extern volatile int UBat; |
extern volatile int AdWertNick, AdWertRoll, AdWertGier; |
extern volatile int AdWertAccRoll,AdWertAccNick,AdWertAccHoch; |
extern volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_ax, Aktuell_ay,Aktuell_az; |
extern volatile long Luftdruck; |
extern volatile char messanzahl_Druck; |
extern volatile unsigned int ZaehlMessungen; |
extern unsigned char DruckOffsetSetting; |
extern volatile int HoeheD; |
extern volatile unsigned int MessLuftdruck; |
extern volatile int StartLuftdruck; |
extern volatile char MessanzahlNick; |
unsigned int ReadADC(unsigned char adc_input); |
void ADC_Init(void); |
void SucheLuftruckOffset(void); |
#define ANALOG_OFF ADCSRA=0 |
#define ANALOG_ON ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADIE) |
/branches/salvo_gps/Basis_V0066c/trunk/eeprom.c |
---|
0,0 → 1,165 |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Konstanten |
// + 0-250 -> normale Werte |
// + 251 -> Poti1 |
// + 252 -> Poti2 |
// + 253 -> Poti3 |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
void DefaultKonstanten1(void) |
{ |
EE_Parameter.Kanalbelegung[K_NICK] = 1; |
EE_Parameter.Kanalbelegung[K_ROLL] = 2; |
EE_Parameter.Kanalbelegung[K_GAS] = 3; |
EE_Parameter.Kanalbelegung[K_GIER] = 4; |
EE_Parameter.Kanalbelegung[K_POTI1] = 5; |
EE_Parameter.Kanalbelegung[K_POTI2] = 6; |
EE_Parameter.Kanalbelegung[K_POTI3] = 7; |
EE_Parameter.Kanalbelegung[K_POTI4] = 8; |
EE_Parameter.GlobalConfig = CFG_ACHSENKOPPLUNG_AKTIV;//CFG_HOEHENREGELUNG | /*CFG_HOEHEN_SCHALTER |*/ CFG_KOMPASS_AKTIV | CFG_KOMPASS_FIX;//0x01; |
EE_Parameter.Hoehe_MinGas = 30; |
EE_Parameter.MaxHoehe = 251; // Wert : 0-250 251 -> Poti1 |
EE_Parameter.Hoehe_P = 10; // Wert : 0-32 |
EE_Parameter.Luftdruck_D = 50; // Wert : 0-250 |
EE_Parameter.Hoehe_ACC_Wirkung = 50; // Wert : 0-250 |
EE_Parameter.Hoehe_Verstaerkung = 4; // Wert : 0-50 |
EE_Parameter.Stick_P = 2; //2 // Wert : 1-6 |
EE_Parameter.Stick_D = 4; //8 // Wert : 0-64 |
EE_Parameter.Gier_P = 14; // Wert : 1-20 |
EE_Parameter.Gas_Min = 15; // Wert : 0-32 |
EE_Parameter.Gas_Max = 230; // Wert : 33-250 |
EE_Parameter.GyroAccFaktor = 26; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
EE_Parameter.Gyro_P = 120; //80 // Wert : 0-250 |
EE_Parameter.Gyro_I = 150; // Wert : 0-250 |
EE_Parameter.UnterspannungsWarnung = 100; // Wert : 0-250 |
EE_Parameter.NotGas = 90; // Wert : 0-250 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 80; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
EE_Parameter.I_Faktor = 0; |
EE_Parameter.UserParam1 = 0; //zur freien Verwendung |
EE_Parameter.UserParam2 = 2; //zur freien Verwendung |
EE_Parameter.UserParam3 = 0; //zur freien Verwendung |
EE_Parameter.UserParam4 = 0; //zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoNickCompInvert = 0; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 50; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickMax = 150; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickRefresh = 5; |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.LoopConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
EE_Parameter.AchsKopplung1 = 100; |
EE_Parameter.AchsGegenKopplung1 = 70; |
EE_Parameter.WinkelUmschlagNick = 100; |
EE_Parameter.WinkelUmschlagRoll = 100; |
EE_Parameter.GyroAccAbgleich = 10; // 1/k |
memcpy(EE_Parameter.Name, "Sport\0", 12); |
} |
void DefaultKonstanten2(void) |
{ |
EE_Parameter.Kanalbelegung[K_NICK] = 1; |
EE_Parameter.Kanalbelegung[K_ROLL] = 2; |
EE_Parameter.Kanalbelegung[K_GAS] = 3; |
EE_Parameter.Kanalbelegung[K_GIER] = 4; |
EE_Parameter.Kanalbelegung[K_POTI1] = 5; |
EE_Parameter.Kanalbelegung[K_POTI2] = 6; |
EE_Parameter.Kanalbelegung[K_POTI3] = 7; |
EE_Parameter.Kanalbelegung[K_POTI4] = 8; |
EE_Parameter.GlobalConfig = CFG_ACHSENKOPPLUNG_AKTIV;//CFG_HOEHENREGELUNG | /*CFG_HOEHEN_SCHALTER |*/ CFG_KOMPASS_AKTIV;//0x01; |
EE_Parameter.Hoehe_MinGas = 30; |
EE_Parameter.MaxHoehe = 251; // Wert : 0-250 251 -> Poti1 |
EE_Parameter.Hoehe_P = 10; // Wert : 0-32 |
EE_Parameter.Luftdruck_D = 50; // Wert : 0-250 |
EE_Parameter.Hoehe_ACC_Wirkung = 50; // Wert : 0-250 |
EE_Parameter.Hoehe_Verstaerkung = 2; // Wert : 0-50 |
EE_Parameter.Stick_P = 4; //2 // Wert : 1-6 |
EE_Parameter.Stick_D = 0; //8 // Wert : 0-64 |
EE_Parameter.Gier_P = 10; // Wert : 1-20 |
EE_Parameter.Gas_Min = 15; // Wert : 0-32 |
EE_Parameter.Gas_Max = 230; // Wert : 33-250 |
EE_Parameter.GyroAccFaktor = 26; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
EE_Parameter.Gyro_P = 175; //80 // Wert : 0-250 |
EE_Parameter.Gyro_I = 175; // Wert : 0-250 |
EE_Parameter.UnterspannungsWarnung = 100; // Wert : 0-250 |
EE_Parameter.NotGas = 90; // Wert : 0-250 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 80; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
EE_Parameter.I_Faktor = 0; |
EE_Parameter.UserParam1 = 0; // zur freien Verwendung |
EE_Parameter.UserParam2 = 0; // zur freien Verwendung |
EE_Parameter.UserParam3 = 0; // zur freien Verwendung |
EE_Parameter.UserParam4 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoNickCompInvert = 0; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 50; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickMax = 150; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickRefresh = 5; |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.LoopConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts |
EE_Parameter.AchsKopplung1 = 100; // Faktor, mit dem Gier die Achsen Roll und Nick verkoppelt |
EE_Parameter.AchsGegenKopplung1 = 80; |
EE_Parameter.WinkelUmschlagNick = 100; |
EE_Parameter.WinkelUmschlagRoll = 100; |
EE_Parameter.GyroAccAbgleich = 16; // 1/k |
memcpy(EE_Parameter.Name, "Kamera\0", 12); |
} |
void DefaultKonstanten3(void) |
{ |
EE_Parameter.Kanalbelegung[K_NICK] = 1; |
EE_Parameter.Kanalbelegung[K_ROLL] = 2; |
EE_Parameter.Kanalbelegung[K_GAS] = 3; |
EE_Parameter.Kanalbelegung[K_GIER] = 4; |
EE_Parameter.Kanalbelegung[K_POTI1] = 5; |
EE_Parameter.Kanalbelegung[K_POTI2] = 6; |
EE_Parameter.Kanalbelegung[K_POTI3] = 7; |
EE_Parameter.Kanalbelegung[K_POTI4] = 8; |
EE_Parameter.GlobalConfig = CFG_HOEHENREGELUNG | CFG_DREHRATEN_BEGRENZER | CFG_ACHSENKOPPLUNG_AKTIV;///*CFG_HOEHEN_SCHALTER |*/ CFG_KOMPASS_AKTIV;//0x01; |
EE_Parameter.Hoehe_MinGas = 30; |
EE_Parameter.MaxHoehe = 100; // Wert : 0-250 251 -> Poti1 |
EE_Parameter.Hoehe_P = 10; // Wert : 0-32 |
EE_Parameter.Luftdruck_D = 50; // Wert : 0-250 |
EE_Parameter.Hoehe_ACC_Wirkung = 50; // Wert : 0-250 |
EE_Parameter.Hoehe_Verstaerkung = 2; // Wert : 0-50 |
EE_Parameter.Stick_P = 3; //2 // Wert : 1-6 |
EE_Parameter.Stick_D = 0; //8 // Wert : 0-64 |
EE_Parameter.Gier_P = 8; // Wert : 1-20 |
EE_Parameter.Gas_Min = 15; // Wert : 0-32 |
EE_Parameter.Gas_Max = 230; // Wert : 33-250 |
EE_Parameter.GyroAccFaktor = 26; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
EE_Parameter.Gyro_P = 200; //80 // Wert : 0-250 |
EE_Parameter.Gyro_I = 175; // Wert : 0-250 |
EE_Parameter.UnterspannungsWarnung = 100; // Wert : 0-250 |
EE_Parameter.NotGas = 90; // Wert : 0-250 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 80; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
EE_Parameter.I_Faktor = 0; |
EE_Parameter.UserParam1 = 0; // zur freien Verwendung |
EE_Parameter.UserParam2 = 0; // zur freien Verwendung |
EE_Parameter.UserParam3 = 0; // zur freien Verwendung |
EE_Parameter.UserParam4 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoNickCompInvert = 0; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 50; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickMax = 150; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickRefresh = 5; |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.LoopConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts |
EE_Parameter.AchsKopplung1 = 100; // Faktor, mit dem Gier die Achsen Roll und Nick verkoppelt |
EE_Parameter.AchsGegenKopplung1 = 80; |
EE_Parameter.WinkelUmschlagNick = 100; |
EE_Parameter.WinkelUmschlagRoll = 100; |
EE_Parameter.GyroAccAbgleich = 16; // 1/k |
memcpy(EE_Parameter.Name, "Beginner\0", 12); |
} |
/branches/salvo_gps/Basis_V0066c/trunk/fc.c |
---|
0,0 → 1,1205 |
/*####################################################################################### |
Flight Control |
#######################################################################################*/ |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + Nur für den privaten Gebrauch |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-commercial use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be |
// + clearly linked as origin |
// + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Aenderungen von Peter Muehlenbrock ("Salvo") Stand 6.10.2007 |
/* |
Driftkompensation fuer Gyros verbessert |
Linearsensor mit fixem Neutralwert |
Ersatzkompass abgeleitet aus Magnetkompass und Giergyro fuer nahezu neigungsunabhaengige Kompassfunktion |
*/ |
#include "main.h" |
#include "eeprom.c" |
unsigned char h,m,s; |
volatile unsigned int I2CTimeout = 100; |
volatile int MesswertNick,MesswertRoll,MesswertGier; |
volatile int AdNeutralNick = 0,AdNeutralRoll = 0,AdNeutralGier = 0,StartNeutralRoll = 0,StartNeutralNick = 0; |
volatile int Mittelwert_AccNick, Mittelwert_AccRoll,Mittelwert_AccHoch, NeutralAccX=0, NeutralAccY=0; |
volatile float NeutralAccZ = 0; |
unsigned char CosinusNickWinkel = 0, CosinusRollWinkel = 0; |
volatile long IntegralNick = 0,IntegralNick2 = 0; |
volatile long IntegralRoll = 0,IntegralRoll2 = 0; |
volatile long IntegralAccNick = 0,IntegralAccRoll = 0,IntegralAccZ = 0; |
volatile long Integral_Gier = 0; |
volatile long Mess_IntegralNick = 0,Mess_IntegralNick2 = 0; |
volatile long Mess_IntegralRoll = 0,Mess_IntegralRoll2 = 0; |
volatile long Mess_Integral_Gier = 0,Mess_Integral_Gier2 = 0; |
volatile long MittelIntegralNick,MittelIntegralRoll,MittelIntegralNick2,MittelIntegralRoll2; |
volatile long Mess_Integral_Hoch = 0; |
volatile int KompassValue = 0; |
volatile int KompassStartwert = 0; |
volatile int KompassRichtung = 0; |
unsigned char MAX_GAS,MIN_GAS; |
unsigned char Notlandung = 0; |
unsigned char HoehenReglerAktiv = 0; |
long Umschlag180Nick = 250000L, Umschlag180Roll = 250000L; |
//Salvo 12.10.2007 |
uint8_t magkompass_ok=0; |
uint8_t gps_cmd = GPS_CMD_STOP; |
static int ubat_cnt =0; |
static int gas_actual,gas_mittel; //Parameter fuer Gasreduzierung bei unterspannung |
int w,v; |
//Salvo End |
//Salvo 2.9.2007 Ersatzkompass |
volatile long GyroKomp_Int; |
volatile int GyroKomp_Value; // Der ermittelte Kompasswert aus Gyro und Magnetkompass |
// Salvo End |
float GyroFaktor; |
float IntegralFaktor; |
volatile int DiffNick,DiffRoll; |
int Poti1 = 0, Poti2 = 0, Poti3 = 0, Poti4 = 0; |
volatile unsigned char Motor_Vorne,Motor_Hinten,Motor_Rechts,Motor_Links, Count; |
unsigned char MotorWert[5]; |
volatile unsigned char SenderOkay = 0; |
int StickNick = 0,StickRoll = 0,StickGier = 0; |
char MotorenEin = 0; |
int HoehenWert = 0; |
int SollHoehe = 0; |
int I_LageRoll = 0,I_LageNick = 0; |
float Kp = FAKTOR_P; |
float Ki = FAKTOR_I; |
unsigned char Looping_Nick = 0,Looping_Roll = 0; |
unsigned char Looping_Links = 0, Looping_Rechts = 0, Looping_Unten = 0, Looping_Oben = 0; |
unsigned char Parameter_Luftdruck_D = 48; // Wert : 0-250 |
unsigned char Parameter_MaxHoehe = 251; // Wert : 0-250 |
unsigned char Parameter_Hoehe_P = 16; // Wert : 0-32 |
unsigned char Parameter_Hoehe_ACC_Wirkung = 58; // Wert : 0-250 |
unsigned char Parameter_KompassWirkung = 64; // Wert : 0-250 |
unsigned char Parameter_Gyro_P = 50; // Wert : 10-250 |
unsigned char Parameter_Gyro_I = 150; // Wert : 0-250 |
unsigned char Parameter_Gier_P = 2; // Wert : 1-20 |
unsigned char Parameter_I_Faktor = 10; // Wert : 1-20 |
unsigned char Parameter_UserParam1 = 0; |
unsigned char Parameter_UserParam2 = 0; |
unsigned char Parameter_UserParam3 = 0; |
unsigned char Parameter_UserParam4 = 0; |
unsigned char Parameter_ServoNickControl = 100; |
unsigned char Parameter_LoopGasLimit = 70; |
unsigned char Parameter_AchsKopplung1 = 0; |
unsigned char Parameter_AchsGegenKopplung1 = 0; |
struct mk_param_struct EE_Parameter; |
void Piep(unsigned char Anzahl) |
{ |
while(Anzahl--) |
{ |
if(MotorenEin) return; //auf keinen Fall im Flug! |
beeptime = 100; |
Delay_ms(250); |
} |
} |
//############################################################################ |
// Nullwerte ermitteln |
void SetNeutral(void) |
//############################################################################ |
{ |
NeutralAccX = 0; |
NeutralAccY = 0; |
NeutralAccZ = 0; |
AdNeutralNick = 0; |
AdNeutralRoll = 0; |
AdNeutralGier = 0; |
Parameter_AchsKopplung1 = 0; |
Parameter_AchsGegenKopplung1 = 0; |
CalibrierMittelwert(); |
Delay_ms_Mess(100); |
CalibrierMittelwert(); |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
{ |
if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
} |
AdNeutralNick= AdWertNick; |
AdNeutralRoll= AdWertRoll; |
AdNeutralGier= AdWertGier; |
StartNeutralRoll = AdNeutralRoll; |
StartNeutralNick = AdNeutralNick; |
// Salvo 1.9.2007 ACC mit festen neutralwerten ***** |
if (ACC_NEUTRAL_FIXED > 0) |
{ |
NeutralAccX = ACC_NICK_NEUTRAL; |
NeutralAccY = ACC_ROLL_NEUTRAL; |
} |
else |
{ // Automatisch bei Offsetabgleich ermitteln |
NeutralAccX = abs(Mittelwert_AccNick) / ACC_AMPLIFY; |
NeutralAccY = abs(Mittelwert_AccRoll) / ACC_AMPLIFY; |
} |
// Salvo End |
NeutralAccZ = Aktuell_az; |
Mess_IntegralNick = 0; |
Mess_IntegralNick2 = 0; |
Mess_IntegralRoll = 0; |
Mess_IntegralRoll2 = 0; |
Mess_Integral_Gier = 0; |
MesswertNick = 0; |
MesswertRoll = 0; |
MesswertGier = 0; |
StartLuftdruck = Luftdruck; |
HoeheD = 0; |
Mess_Integral_Hoch = 0; |
KompassStartwert = KompassValue; |
GPS_Neutral(); |
beeptime = 50; |
Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L; |
Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagRoll * 2500L; |
//Salvo 13.10.2007 Ersatzkompass und Gas |
GyroKomp_Int = KompassValue * GYROKOMP_INC_GRAD_DEFAULT; //Neu ab 3.1.2007 |
gas_mittel = 30; |
gas_actual = gas_mittel; |
// Salvo End |
} |
//############################################################################ |
// Bearbeitet die Messwerte |
void Mittelwert(void) |
//############################################################################ |
{ |
static signed long tmpl,tmpl2; |
MesswertGier = (signed int) AdNeutralGier - AdWertGier; |
MesswertRoll = (signed int) AdWertRoll - AdNeutralRoll; |
MesswertNick = (signed int) AdWertNick - AdNeutralNick; |
// Beschleunigungssensor ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mittelwert_AccNick = ((long)Mittelwert_AccNick * 1 + ((ACC_AMPLIFY * (long)AdWertAccNick))) / 2L; |
Mittelwert_AccRoll = ((long)Mittelwert_AccRoll * 1 + ((ACC_AMPLIFY * (long)AdWertAccRoll))) / 2L; |
Mittelwert_AccHoch = ((long)Mittelwert_AccHoch * 1 + ((long)AdWertAccHoch)) / 2L; |
IntegralAccNick += ACC_AMPLIFY * AdWertAccNick; |
IntegralAccRoll += ACC_AMPLIFY * AdWertAccRoll; |
IntegralAccZ += Aktuell_az - 704;//NeutralAccZ; |
// Gier ++++++++++++++++++++++++++++++++++++++++++++++++ |
//Salvo 12.11.2007 |
GyroKomp_Int += MesswertGier; |
//Salvo End |
Mess_Integral_Gier += MesswertGier; |
Mess_Integral_Gier2 += MesswertGier; |
// Kopplungsanteil +++++++++++++++++++++++++++++++++++++ |
if(!Looping_Nick && !Looping_Roll && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV)) |
{ |
tmpl = Mess_IntegralNick / 4096L; |
tmpl *= MesswertGier; |
tmpl *= Parameter_AchsKopplung1; //125 |
tmpl /= 2048L; |
tmpl2 = Mess_IntegralRoll / 4096L; |
tmpl2 *= MesswertGier; |
tmpl2 *= Parameter_AchsKopplung1; |
tmpl2 /= 2048L; |
} |
else tmpl = tmpl2 = 0; |
// Roll ++++++++++++++++++++++++++++++++++++++++++++++++ |
MesswertRoll += tmpl; |
MesswertRoll += (tmpl2*Parameter_AchsGegenKopplung1)/512L; //109 |
Mess_IntegralRoll2 += MesswertRoll; |
Mess_IntegralRoll += MesswertRoll - I_LageRoll; |
if(Mess_IntegralRoll > Umschlag180Roll) |
{ |
Mess_IntegralRoll = -(Umschlag180Roll - 10000L); |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
} |
if(Mess_IntegralRoll <-Umschlag180Roll) |
{ |
Mess_IntegralRoll = (Umschlag180Roll - 10000L); |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
} |
if(AdWertRoll < 15) MesswertRoll = -1000; |
if(AdWertRoll < 7) MesswertRoll = -2000; |
if(PlatinenVersion == 10) |
{ |
if(AdWertRoll > 1010) MesswertRoll = +1000; |
if(AdWertRoll > 1017) MesswertRoll = +2000; |
} |
else |
{ |
if(AdWertRoll > 2020) MesswertRoll = +1000; |
if(AdWertRoll > 2034) MesswertRoll = +2000; |
} |
// Nick ++++++++++++++++++++++++++++++++++++++++++++++++ |
MesswertNick -= tmpl2; |
MesswertNick -= (tmpl*Parameter_AchsGegenKopplung1)/512L; |
Mess_IntegralNick2 += MesswertNick; |
Mess_IntegralNick += MesswertNick - I_LageNick; |
if(Mess_IntegralNick > Umschlag180Nick) |
{ |
Mess_IntegralNick = -(Umschlag180Nick - 10000L); |
Mess_IntegralNick2 = Mess_IntegralNick; |
} |
if(Mess_IntegralNick <-Umschlag180Nick) |
{ |
Mess_IntegralNick = (Umschlag180Nick - 10000L); |
Mess_IntegralNick2 = Mess_IntegralNick; |
} |
if(AdWertNick < 15) MesswertNick = -1000; |
if(AdWertNick < 7) MesswertNick = -2000; |
if(PlatinenVersion == 10) |
{ |
if(AdWertNick > 1010) MesswertNick = +1000; |
if(AdWertNick > 1017) MesswertNick = +2000; |
} |
else |
{ |
if(AdWertNick > 2020) MesswertNick = +1000; |
if(AdWertNick > 2034) MesswertNick = +2000; |
} |
//++++++++++++++++++++++++++++++++++++++++++++++++ |
// ADC einschalten |
ANALOG_ON; |
//++++++++++++++++++++++++++++++++++++++++++++++++ |
DebugOut.Analog[11] = MesswertRoll; |
Integral_Gier = Mess_Integral_Gier; |
IntegralNick = Mess_IntegralNick; |
IntegralRoll = Mess_IntegralRoll; |
IntegralNick2 = Mess_IntegralNick2; |
IntegralRoll2 = Mess_IntegralRoll2; |
if(EE_Parameter.GlobalConfig & CFG_DREHRATEN_BEGRENZER && !Looping_Nick && !Looping_Roll) |
{ |
if(MesswertNick > 200) MesswertNick += 4 * (MesswertNick - 200); |
else if(MesswertNick < -200) MesswertNick += 4 * (MesswertNick + 200); |
if(MesswertRoll > 200) MesswertRoll += 4 * (MesswertRoll - 200); |
else if(MesswertRoll < -200) MesswertRoll += 4 * (MesswertRoll + 200); |
} |
if(Poti1 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110) Poti1++; else if(Poti1 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110 && Poti1) Poti1--; |
if(Poti2 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110) Poti2++; else if(Poti2 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110 && Poti2) Poti2--; |
if(Poti3 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110) Poti3++; else if(Poti3 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110 && Poti3) Poti3--; |
if(Poti4 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110) Poti4++; else if(Poti4 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110 && Poti4) Poti4--; |
if(Poti1 < 0) Poti1 = 0; else if(Poti1 > 255) Poti1 = 255; |
if(Poti2 < 0) Poti2 = 0; else if(Poti2 > 255) Poti2 = 255; |
if(Poti3 < 0) Poti3 = 0; else if(Poti3 > 255) Poti3 = 255; |
if(Poti4 < 0) Poti4 = 0; else if(Poti4 > 255) Poti4 = 255; |
} |
//############################################################################ |
// Messwerte beim Ermitteln der Nullage |
void CalibrierMittelwert(void) |
//############################################################################ |
{ |
// ADC auschalten, damit die Werte sich nicht während der Berechnung ändern |
ANALOG_OFF; |
MesswertNick = AdWertNick; |
MesswertRoll = AdWertRoll; |
MesswertGier = AdWertGier; |
Mittelwert_AccNick = ACC_AMPLIFY * (long)AdWertAccNick; |
Mittelwert_AccRoll = ACC_AMPLIFY * (long)AdWertAccRoll; |
Mittelwert_AccHoch = (long)AdWertAccHoch; |
// ADC einschalten |
ANALOG_ON; |
if(Poti1 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110) Poti1++; else if(Poti1 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110 && Poti1) Poti1--; |
if(Poti2 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110) Poti2++; else if(Poti2 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110 && Poti2) Poti2--; |
if(Poti3 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110) Poti3++; else if(Poti3 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110 && Poti3) Poti3--; |
if(Poti4 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110) Poti4++; else if(Poti4 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110 && Poti4) Poti4--; |
if(Poti1 < 0) Poti1 = 0; else if(Poti1 > 255) Poti1 = 255; |
if(Poti2 < 0) Poti2 = 0; else if(Poti2 > 255) Poti2 = 255; |
if(Poti3 < 0) Poti3 = 0; else if(Poti3 > 255) Poti3 = 255; |
if(Poti4 < 0) Poti4 = 0; else if(Poti4 > 255) Poti4 = 255; |
Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L; |
Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagNick * 2500L; |
} |
//############################################################################ |
// Senden der Motorwerte per I2C-Bus |
void SendMotorData(void) |
//############################################################################ |
{ |
if(MOTOR_OFF || !MotorenEin) |
{ |
Motor_Hinten = 0; |
Motor_Vorne = 0; |
Motor_Rechts = 0; |
Motor_Links = 0; |
if(MotorTest[0]) Motor_Vorne = MotorTest[0]; |
if(MotorTest[1]) Motor_Hinten = MotorTest[1]; |
if(MotorTest[2]) Motor_Links = MotorTest[2]; |
if(MotorTest[3]) Motor_Rechts = MotorTest[3]; |
} |
DebugOut.Analog[12] = Motor_Vorne; |
DebugOut.Analog[13] = Motor_Hinten; |
DebugOut.Analog[14] = Motor_Links; |
DebugOut.Analog[15] = Motor_Rechts; |
//Start I2C Interrupt Mode |
twi_state = 0; |
motor = 0; |
i2c_start(); |
} |
//############################################################################ |
// Trägt ggf. das Poti als Parameter ein |
void ParameterZuordnung(void) |
//############################################################################ |
{ |
#define CHK_POTI(b,a,min,max) { if(a > 250) { if(a == 251) b = Poti1; else if(a == 252) b = Poti2; else if(a == 253) b = Poti3; else if(a == 254) b = Poti4;} else b = a; if(b <= min) b = min; else if(b >= max) b = max;} |
CHK_POTI(Parameter_MaxHoehe,EE_Parameter.MaxHoehe,0,255); |
CHK_POTI(Parameter_Luftdruck_D,EE_Parameter.Luftdruck_D,0,100); |
CHK_POTI(Parameter_Hoehe_P,EE_Parameter.Hoehe_P,0,100); |
CHK_POTI(Parameter_Hoehe_ACC_Wirkung,EE_Parameter.Hoehe_ACC_Wirkung,0,255); |
CHK_POTI(Parameter_KompassWirkung,EE_Parameter.KompassWirkung,0,255); |
CHK_POTI(Parameter_Gyro_P,EE_Parameter.Gyro_P,10,255); |
CHK_POTI(Parameter_Gyro_I,EE_Parameter.Gyro_I,0,255); |
CHK_POTI(Parameter_I_Faktor,EE_Parameter.I_Faktor,0,255); |
CHK_POTI(Parameter_UserParam1,EE_Parameter.UserParam1,0,255); |
CHK_POTI(Parameter_UserParam2,EE_Parameter.UserParam2,0,255); |
CHK_POTI(Parameter_UserParam3,EE_Parameter.UserParam3,0,255); |
CHK_POTI(Parameter_UserParam4,EE_Parameter.UserParam4,0,255); |
CHK_POTI(Parameter_ServoNickControl,EE_Parameter.ServoNickControl,0,255); |
CHK_POTI(Parameter_LoopGasLimit,EE_Parameter.LoopGasLimit,0,255); |
CHK_POTI(Parameter_AchsKopplung1, EE_Parameter.AchsKopplung1,0,255); |
CHK_POTI(Parameter_AchsGegenKopplung1,EE_Parameter.AchsGegenKopplung1,0,255); |
Ki = (float) Parameter_I_Faktor * 0.0001; |
MAX_GAS = EE_Parameter.Gas_Max; |
MIN_GAS = EE_Parameter.Gas_Min; |
} |
//############################################################################ |
// |
void MotorRegler(void) |
//############################################################################ |
{ |
int motorwert,pd_ergebnis,h,tmp_int; |
int GierMischanteil,GasMischanteil; |
static long SummeNick=0,SummeRoll=0; |
static long sollGier = 0,tmp_long,tmp_long2; |
static long IntegralFehlerNick = 0; |
static long IntegralFehlerRoll = 0; |
static unsigned int RcLostTimer; |
static unsigned char delay_neutral = 0; |
static unsigned char delay_einschalten = 0,delay_ausschalten = 0; |
static unsigned int modell_fliegt = 0; |
static int hoehenregler = 0; |
static char TimerWerteausgabe = 0; |
static char NeueKompassRichtungMerken = 0; |
static long ausgleichNick, ausgleichRoll; |
Mittelwert(); |
//****** GPS Daten holen *************** |
short int n; |
if (gps_alive_cnt > 0) gps_alive_cnt--; //Dekrementieren. Wenn 0 kommen keine ausreichenden GPS Meldungen (Timeout) |
n = Get_Rel_Position(); |
if (n == 0) |
{ |
ROT_ON; //led blitzen lassen |
} |
//******PROVISORISCH*************** |
GRN_ON; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gaswert ermitteln |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
GasMischanteil = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] + 120; |
//Salvo 13.10.2007 langsame Gasreduktion bei Unterspannung. Als Ausgangswert wird der bei UBAT=k gemessen Mittelwert genommen |
// und dieser dann langsam zwangsweise reduziert |
if (UBat <= EE_Parameter.UnterspannungsWarnung - 2) //Unterhalb der Piepser Schwelle aktivieren |
{ |
if (ubat_cnt > 700) |
{ |
ubat_cnt = 0; |
if (gas_actual > ((gas_mittel*12)/15)) gas_actual--; |
} |
else ubat_cnt++; |
if (GasMischanteil > gas_actual) GasMischanteil = gas_actual; |
} |
else //Falls UBAT wieder ok ist |
{ |
if (ubat_cnt > 1000) |
{ |
gas_mittel = ((gas_mittel*9) + GasMischanteil)/10; //Filtern |
gas_actual = GasMischanteil; |
} |
else |
{ |
ubat_cnt++; |
if ((ubat_cnt % 10) == 0) |
{ |
if (gas_actual < GasMischanteil) gas_actual++; |
else gas_actual = GasMischanteil; |
} |
} |
GasMischanteil = gas_actual; |
} |
// Salvo End |
if(GasMischanteil < 0) GasMischanteil = 0; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Empfang schlecht |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(SenderOkay < 100) |
{ |
if(!PcZugriff) |
{ |
if(BeepMuster == 0xffff) |
{ |
beeptime = 15000; |
BeepMuster = 0x0c00; |
} |
} |
if(RcLostTimer) RcLostTimer--; |
else |
{ |
MotorenEin = 0; |
Notlandung = 0; |
} |
ROT_ON; |
if(modell_fliegt > 2000) // wahrscheinlich in der Luft --> langsam absenken |
{ |
GasMischanteil = EE_Parameter.NotGas; |
Notlandung = 1; |
PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] = 0; |
PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] = 0; |
PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] = 0; |
} |
else MotorenEin = 0; |
} |
else |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Emfang gut |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(SenderOkay > 140) |
{ |
Notlandung = 0; |
RcLostTimer = EE_Parameter.NotGasZeit * 50; |
if(GasMischanteil > 40) |
{ |
if(modell_fliegt < 0xffff) modell_fliegt++; |
} |
if((modell_fliegt < 200) || (GasMischanteil < 40)) |
{ |
SummeNick = 0; |
SummeRoll = 0; |
Mess_Integral_Gier = 0; |
Mess_Integral_Gier2 = 0; |
} |
if((GasMischanteil > 200) && MotorenEin == 0) |
{ |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// auf Nullwerte kalibrieren |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] > 75) // Neutralwerte |
{ |
unsigned char setting = 2; |
if(++delay_neutral > 200) // nicht sofort |
{ |
GRN_OFF; |
SetNeutral(); |
MotorenEin = 0; |
delay_neutral = 0; |
modell_fliegt = 0; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70 || abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) > 70) |
{ |
unsigned char setting=1; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < 70) setting = 1; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 2; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 3; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] <-70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 4; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] <-70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < 70) setting = 5; |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], setting); // aktiven Datensatz merken |
} |
ReadParameterSet(GetActiveParamSetNumber(), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
Piep(GetActiveParamSetNumber()); |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
{ |
if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
} |
GPS_Save_Home(); //Daten sind jetzt hoffentlich verfuegbar |
if (gps_home_position.status > 0 ) |
{ |
Delay_ms(1000); //akustisch verkuenden dass GPS Home Daten da sind |
beeptime = 2000; |
Delay_ms(500); |
} |
} |
} |
else delay_neutral = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gas ist unten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(GasMischanteil < 35) |
{ |
// Starten |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] < -75) |
{ |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Einschalten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(++delay_einschalten > 200) |
{ |
delay_einschalten = 200; |
modell_fliegt = 1; |
MotorenEin = 1; |
sollGier = 0; |
Mess_Integral_Gier = 0; |
Mess_Integral_Gier2 = 0; |
Mess_IntegralNick = 0; |
Mess_IntegralRoll = 0; |
Mess_IntegralNick2 = IntegralNick; |
Mess_IntegralRoll2 = IntegralRoll; |
SummeNick = 0; |
SummeRoll = 0; |
} |
} |
else delay_einschalten = 0; |
//Auf Neutralwerte setzen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Auschalten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] > 75) |
{ |
if(++delay_ausschalten > 200) // nicht sofort |
{ |
MotorenEin = 0; |
delay_ausschalten = 200; |
modell_fliegt = 0; |
} |
} |
else delay_ausschalten = 0; |
} |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// neue Werte von der Funke |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!NewPpmData-- || Notlandung) |
{ |
ParameterZuordnung(); |
StickNick = PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P; |
StickNick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; |
StickRoll = PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P; |
StickRoll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; |
StickGier = -PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]; |
GyroFaktor = ((float)Parameter_Gyro_P + 10.0) / 256.0; |
IntegralFaktor = ((float) Parameter_Gyro_I) / 44000; |
if(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) IntegralFaktor = 0; |
if(GyroFaktor < 0) GyroFaktor = 0; |
if(IntegralFaktor < 0) IntegralFaktor = 0; |
// greift in den Stick ein, um ungewolltes überschlagen zu verhindern |
if(!(EE_Parameter.LoopConfig & CFG_LOOP_LINKS) && !(EE_Parameter.LoopConfig & CFG_LOOP_RECHTS)) |
{ |
if(IntegralNick > 60000) |
{ |
StickNick -= 8 * EE_Parameter.Stick_P; |
if(IntegralNick > 80000) StickNick -= 16 * EE_Parameter.Stick_P; |
} |
else |
if(IntegralNick < -60000) |
{ |
StickNick += 8 * EE_Parameter.Stick_P; |
if(IntegralNick > 80000) StickNick -= 16 * EE_Parameter.Stick_P; |
} |
if(IntegralRoll > 60000) |
{ |
StickRoll -= 8 * EE_Parameter.Stick_P; |
if(IntegralRoll > 80000) StickRoll -= 16 * EE_Parameter.Stick_P; |
} |
else |
if(IntegralRoll < -60000) |
{ |
StickRoll += 8 * EE_Parameter.Stick_P; |
if(IntegralRoll > 80000) StickRoll -= 16 * EE_Parameter.Stick_P; |
} |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Looping? |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > EE_Parameter.LoopThreshold) && EE_Parameter.LoopConfig & CFG_LOOP_LINKS) Looping_Links = 1; |
else |
{ |
{ |
if((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < (EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese))) Looping_Links = 0; |
} |
} |
if((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < -EE_Parameter.LoopThreshold) && EE_Parameter.LoopConfig & CFG_LOOP_RECHTS) Looping_Rechts = 1; |
else |
{ |
if(Looping_Rechts) // Hysterese |
{ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > -(EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese)) Looping_Rechts = 0; |
} |
} |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > EE_Parameter.LoopThreshold) && EE_Parameter.LoopConfig & CFG_LOOP_OBEN) Looping_Oben = 1; |
else |
{ |
if(Looping_Oben) // Hysterese |
{ |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < (EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese))) Looping_Oben = 0; |
} |
} |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < -EE_Parameter.LoopThreshold) && EE_Parameter.LoopConfig & CFG_LOOP_UNTEN) Looping_Unten = 1; |
else |
{ |
if(Looping_Unten) // Hysterese |
{ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > -(EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese)) Looping_Unten = 0; |
} |
} |
if(Looping_Links || Looping_Rechts) Looping_Roll = 1; else Looping_Roll = 0; |
if(Looping_Oben || Looping_Unten) {Looping_Nick = 1; Looping_Roll = 0; Looping_Links = 0; Looping_Rechts = 0;} else Looping_Nick = 0; |
} // Ende neue Funken-Werte |
if(Looping_Roll) beeptime = 100; |
if(Looping_Roll || Looping_Nick) |
{ |
if(GasMischanteil > EE_Parameter.LoopGasLimit) GasMischanteil = EE_Parameter.LoopGasLimit; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Bei Empfangsausfall im Flug |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(Notlandung) |
{ |
StickGier = 0; |
StickNick = 0; |
StickRoll = 0; |
GyroFaktor = 0.1; |
IntegralFaktor = 0.005; |
Looping_Roll = 0; |
Looping_Nick = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Integrale auf ACC-Signal abgleichen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define ABGLEICH_ANZAHL 256L |
MittelIntegralNick += IntegralNick; // Für die Mittelwertbildung aufsummieren |
MittelIntegralRoll += IntegralRoll; |
MittelIntegralNick2 += IntegralNick2; |
MittelIntegralRoll2 += IntegralRoll2; |
if(Looping_Nick || Looping_Roll) |
{ |
IntegralAccNick = 0; |
IntegralAccRoll = 0; |
MittelIntegralNick = 0; |
MittelIntegralRoll = 0; |
MittelIntegralNick2 = 0; |
MittelIntegralRoll2 = 0; |
Mess_IntegralNick2 = Mess_IntegralNick; |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
ZaehlMessungen = 0; |
I_LageNick = 0; |
I_LageRoll = 0; |
} |
if(ZaehlMessungen >= ABGLEICH_ANZAHL) |
{ |
static int cnt = 0; |
static char last_n_p,last_n_n,last_r_p,last_r_n; |
static long MittelIntegralNick_Alt,MittelIntegralRoll_Alt; |
if(!Looping_Nick && !Looping_Roll) |
{ |
MittelIntegralNick /= ABGLEICH_ANZAHL; |
MittelIntegralRoll /= ABGLEICH_ANZAHL; |
IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL; |
IntegralAccRoll = (EE_Parameter.GyroAccFaktor * IntegralAccRoll) / ABGLEICH_ANZAHL; |
IntegralAccZ = IntegralAccZ / ABGLEICH_ANZAHL; |
#define MAX_I 32 |
// Nick ++++++++++++++++++++++++++++++++++++++++++++++++ |
IntegralFehlerNick = (long)(MittelIntegralNick - (long)IntegralAccNick); |
ausgleichNick = IntegralFehlerNick / EE_Parameter.GyroAccAbgleich; |
if(labs(MittelIntegralNick_Alt - MittelIntegralNick) < 5000) |
{ |
tmp_long = IntegralFehlerNick / 700L; |
if(tmp_long > MAX_I) tmp_long = MAX_I; |
if(tmp_long <-MAX_I) tmp_long =-MAX_I; |
I_LageNick = tmp_long; |
} |
else |
{ |
I_LageNick /= 2; |
} |
// Roll ++++++++++++++++++++++++++++++++++++++++++++++++ |
IntegralFehlerRoll = (long)(MittelIntegralRoll - (long)IntegralAccRoll); |
ausgleichRoll = IntegralFehlerRoll / EE_Parameter.GyroAccAbgleich; |
if(labs(MittelIntegralRoll_Alt - MittelIntegralRoll) < 5000) |
{ |
tmp_long2 = IntegralFehlerRoll / 700L; |
if(tmp_long2 > MAX_I) tmp_long2 = MAX_I; |
if(tmp_long2 <-MAX_I) tmp_long2 =-MAX_I; |
I_LageRoll = tmp_long2; |
} |
else |
{ |
I_LageRoll /=2; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++ |
MittelIntegralNick_Alt = MittelIntegralNick; |
MittelIntegralRoll_Alt = MittelIntegralRoll; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++ |
Mess_IntegralNick -= ausgleichNick; |
Mess_IntegralRoll -= ausgleichRoll; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gyro-Drift ermitteln |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
MittelIntegralNick2 /= ABGLEICH_ANZAHL; |
MittelIntegralRoll2 /= ABGLEICH_ANZAHL; |
tmp_long = (long)(MittelIntegralNick2 - (long)IntegralAccNick); |
tmp_long2 = (long)(MittelIntegralRoll2 - (long)IntegralAccRoll); |
//DebugOut.Analog[25] = MittelIntegralRoll2 / 26; |
IntegralFehlerNick = tmp_long; |
IntegralFehlerRoll = tmp_long2; |
Mess_IntegralNick2 -= IntegralFehlerNick; |
Mess_IntegralRoll2 -= IntegralFehlerRoll; |
// IntegralFehlerNick = (IntegralFehlerNick * 1 + tmp_long) / 2; |
// IntegralFehlerRoll = (IntegralFehlerRoll * 1 + tmp_long2) / 2; |
//Salvo Ersatzkompass Ueberlauf korrigieren |
if (GyroKomp_Int >= ((long)360 * GYROKOMP_INC_GRAD_DEFAULT)) GyroKomp_Int = GyroKomp_Int - (GYROKOMP_INC_GRAD_DEFAULT *(long)360); //neu ab 3.11.2007 |
if (GyroKomp_Int < 0) GyroKomp_Int = GyroKomp_Int + (GYROKOMP_INC_GRAD_DEFAULT *(long)360); //neu ab 3.11.2007 |
ROT_OFF; |
// Salvo End |
/* |
DebugOut.Analog[30] = I_LageRoll * 10; |
DebugOut.Analog[17] = IntegralAccNick / 26; |
DebugOut.Analog[18] = IntegralAccRoll / 26; |
DebugOut.Analog[19] = IntegralFehlerNick;// / 26; |
DebugOut.Analog[20] = IntegralFehlerRoll;// / 26; |
DebugOut.Analog[21] = MittelIntegralNick / 26; |
DebugOut.Analog[22] = MittelIntegralRoll / 26; |
DebugOut.Analog[28] = ausgleichNick; |
DebugOut.Analog[29] = ausgleichRoll; |
*/ |
#define FEHLER_LIMIT (ABGLEICH_ANZAHL/2) |
#define FEHLER_LIMIT2 (ABGLEICH_ANZAHL*4) |
// Nick +++++++++++++++++++++++++++++++++++++++++++++++++ |
cnt = 1;// + labs(IntegralFehlerNick) / 4096; |
if(IntegralFehlerNick > FEHLER_LIMIT2) |
{ |
if(last_n_p) |
{ |
cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2; |
ausgleichNick = IntegralFehlerNick / 8; |
if(ausgleichNick > 5000) ausgleichNick = 5000; |
Mess_IntegralNick -= ausgleichNick; |
} |
else last_n_p = 1; |
} else last_n_p = 0; |
if(IntegralFehlerNick < -FEHLER_LIMIT2) |
{ |
if(last_n_n) |
{ |
cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2; |
ausgleichNick = IntegralFehlerNick / 8; |
if(ausgleichNick < -5000) ausgleichNick = -5000; |
Mess_IntegralNick -= ausgleichNick; |
} |
else last_n_n = 1; |
} else last_n_n = 0; |
if(cnt > 3) cnt = 3; |
if(IntegralFehlerNick > FEHLER_LIMIT) AdNeutralNick += cnt; |
if(IntegralFehlerNick < -FEHLER_LIMIT) AdNeutralNick -= cnt; |
// Roll +++++++++++++++++++++++++++++++++++++++++++++++++ |
cnt = 1;// + labs(IntegralFehlerRoll) / 4096; |
ausgleichRoll = 0; |
if(IntegralFehlerRoll > FEHLER_LIMIT2) |
{ |
if(last_r_p) |
{ |
cnt += labs(IntegralFehlerRoll) / FEHLER_LIMIT2; |
ausgleichRoll = IntegralFehlerRoll / 4; |
if(ausgleichRoll > 5000) ausgleichRoll = 5000; |
Mess_IntegralRoll -= ausgleichRoll; |
} |
else last_r_p = 1; |
} else last_r_p = 0; |
if(IntegralFehlerRoll < -FEHLER_LIMIT2) |
{ |
if(last_r_n) |
{ |
cnt += labs(IntegralFehlerRoll) / FEHLER_LIMIT2; |
ausgleichRoll = IntegralFehlerRoll / 4; |
if(ausgleichRoll < -5000) ausgleichRoll = -5000; |
Mess_IntegralRoll -= ausgleichRoll; |
} |
else last_r_n = 1; |
} else last_r_n = 0; |
DebugOut.Analog[27] = ausgleichRoll; |
if(cnt > 3) cnt = 3; |
if(IntegralFehlerRoll > FEHLER_LIMIT) AdNeutralRoll += cnt; |
if(IntegralFehlerRoll < -FEHLER_LIMIT) AdNeutralRoll -= cnt; |
DebugOut.Analog[24] = 10*(AdNeutralRoll - StartNeutralRoll); |
} |
IntegralAccNick = 0; |
IntegralAccRoll = 0; |
IntegralAccZ = 0; |
MittelIntegralNick = 0; |
MittelIntegralRoll = 0; |
MittelIntegralNick2 = 0; |
MittelIntegralRoll2 = 0; |
ZaehlMessungen = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gieren |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(abs(StickGier) > 20) // war 35 |
{ |
if(!(EE_Parameter.GlobalConfig & CFG_KOMPASS_FIX)) NeueKompassRichtungMerken = 1; |
} |
tmp_int = (long) EE_Parameter.Gier_P * ((long)StickGier * abs(StickGier)) / 512L; // expo y = ax + bx² |
tmp_int += (EE_Parameter.Gier_P * StickGier) / 4; |
sollGier = tmp_int; |
Mess_Integral_Gier -= tmp_int; |
if(Mess_Integral_Gier > 50000) Mess_Integral_Gier = 50000; // begrenzen |
if(Mess_Integral_Gier <-50000) Mess_Integral_Gier =-50000; |
// Salvo Ersatzkompass 26.9.2007 ********************** |
if ((Kompass_Neuer_Wert > 0)) |
{ |
Kompass_Neuer_Wert = 0; |
w = (abs(Mittelwert_AccNick)); |
v = (abs(Mittelwert_AccRoll)); |
if ((w < ACC_WAAGRECHT_LIMIT) && (v < ACC_WAAGRECHT_LIMIT)) //Ersatzkompass nur mit Magnetkompass aktualisieren wenn alles ok |
{ |
if ((abs(KompassValue - Kompass_Value_Old)) <= 5) // Aufeinanderfolgende Werte duerfen nur minimal abweichen |
{ |
magkompass_ok = 1; // Flag dass Magnetkompass stabil arbeitet |
GyroKomp_Int = (GyroKomp_Int )/GYROKOMP_INC_GRAD_DEFAULT; |
w = KompassValue - GyroKomp_Int; |
if ((w > 0) && (w < 180)) |
{ |
++GyroKomp_Int; |
} |
else if ((w > 0) && (w >= 180)) |
{ |
--GyroKomp_Int; |
} |
else if ((w < 0) && (w >= -180)) |
{ |
--GyroKomp_Int; |
} |
else if ((w < 0) && (w < -180)) |
{ |
++GyroKomp_Int; |
} |
if (GyroKomp_Int < 0) GyroKomp_Int = GyroKomp_Int + 360; |
GyroKomp_Int = (GyroKomp_Int%360) * GYROKOMP_INC_GRAD_DEFAULT; // An Magnetkompasswert annaehern |
} |
} |
else magkompass_ok = 0; |
} |
// Salvo End ************************* |
// Salvo 6.10.2007 |
// GPS Home aktivieren wenn Knueppel in Ruhelage und Hoehenschalter aktiviert ist |
//GPS Hold Aktiveren wenn Knueppel in Ruhelage sind |
if ((EE_Parameter.GlobalConfig & CFG_GPS_AKTIV) && (abs(StickRoll) < GPS_STICK_HOLDOFF) && (abs(StickNick) < GPS_STICK_HOLDOFF) && (gps_alive_cnt > 0)) |
{ |
if (Parameter_MaxHoehe > 200) |
{ |
if ( gps_cmd == GPS_CMD_REQ_HOLD) gps_cmd = GPS_CMD_STOP; // erst mal stoppen, denn altes Kommando wurde noch nicht beendet |
else gps_cmd = GPS_CMD_REQ_HOME; |
n = GPS_CRTL(gps_cmd); |
} |
else |
{ |
if ( gps_cmd == GPS_CMD_REQ_HOME) gps_cmd = GPS_CMD_STOP; // erst mal stoppen, denn altes Kommando wurde noch nicht beendet |
else gps_cmd = GPS_CMD_REQ_HOLD; |
n= GPS_CRTL(gps_cmd); |
} |
} |
else (n= GPS_CRTL(GPS_CMD_STOP)); //GPS Lageregelung beenden |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Kompass |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(KompassValue && (EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV) && (Kompass_present > 0)) |
{ |
if(v > w) w = v; // grösste Neigung ermitteln |
// Salvo 13.9.2007 Nur wenn Magnetkompass ordentliche Werte liefert |
if ((magkompass_ok > 0) && NeueKompassRichtungMerken) |
{ |
KompassStartwert = KompassValue; |
NeueKompassRichtungMerken = 0; |
} |
// Salvo 13.9.2007 |
w=0; |
// Salvo End |
w = (w * Parameter_KompassWirkung) / 64; // auf die Wirkung normieren |
w = Parameter_KompassWirkung - w; // Wirkung ggf drosseln |
if(w > 0) |
{ |
// Salvo Kompasssteuerung ********************** |
if (magkompass_ok > 0) Mess_Integral_Gier += (KompassRichtung * w) / 32; // nach Kompass ausrichten |
// Salvo End |
} |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Debugwerte zuordnen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!TimerWerteausgabe--) |
{ |
TimerWerteausgabe = 24; |
DebugOut.Analog[0] = IntegralNick / EE_Parameter.GyroAccFaktor; |
DebugOut.Analog[1] = IntegralRoll / EE_Parameter.GyroAccFaktor; |
DebugOut.Analog[2] = Mittelwert_AccNick; |
DebugOut.Analog[3] = Mittelwert_AccRoll; |
DebugOut.Analog[4] = MesswertGier; |
DebugOut.Analog[5] = HoehenWert; |
DebugOut.Analog[6] =(Mess_Integral_Hoch / 512); |
DebugOut.Analog[8] = KompassValue; |
DebugOut.Analog[9] = GyroKomp_Int/GYROKOMP_INC_GRAD_DEFAULT; |
// Diverse parameter Debugging |
DebugOut.Analog[16] = dataset_cnt; |
DebugOut.Analog[17] = UBat; |
DebugOut.Analog[18] = MesswertNick; |
DebugOut.Analog[19] = MesswertRoll; |
DebugOut.Analog[20] = MesswertGier; |
DebugOut.Analog[21] = StickNick; |
DebugOut.Analog[22] = StickRoll; |
DebugOut.Analog[23] = StickGier; |
// GPS Debugging |
DebugOut.Analog[26] = gps_rel_act_position.utm_east; |
DebugOut.Analog[27] = gps_rel_act_position.utm_north; |
DebugOut.Analog[28] = gps_rel_act_position.utm_alt; |
DebugOut.Analog[29] = gps_sub_state+(20*gps_cmd); |
/* DebugOut.Analog[16] = motor_rx[0]; |
DebugOut.Analog[17] = motor_rx[1]; |
DebugOut.Analog[18] = motor_rx[2]; |
DebugOut.Analog[19] = motor_rx[3]; |
DebugOut.Analog[20] = motor_rx[0] + motor_rx[1] + motor_rx[2] + motor_rx[3]; |
DebugOut.Analog[20] /= 14; |
DebugOut.Analog[21] = motor_rx[4]; |
DebugOut.Analog[22] = motor_rx[5]; |
DebugOut.Analog[23] = motor_rx[6]; |
DebugOut.Analog[24] = motor_rx[7]; |
DebugOut.Analog[25] = motor_rx[4] + motor_rx[5] + motor_rx[6] + motor_rx[7]; |
*/ |
// DebugOut.Analog[9] = MesswertNick; |
// DebugOut.Analog[9] = SollHoehe; |
// DebugOut.Analog[10] = Mess_Integral_Gier / 128; |
// DebugOut.Analog[11] = KompassStartwert; |
// DebugOut.Analog[10] = Parameter_Gyro_I; |
// DebugOut.Analog[10] = EE_Parameter.Gyro_I; |
// DebugOut.Analog[9] = KompassRichtung; |
// DebugOut.Analog[10] = GasMischanteil; |
// DebugOut.Analog[3] = HoeheD * 32; |
// DebugOut.Analog[4] = hoehenregler; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Drehgeschwindigkeit und -winkel zu einem Istwert zusammenfassen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(Looping_Nick) MesswertNick = MesswertNick * GyroFaktor; |
else MesswertNick = IntegralNick * IntegralFaktor + MesswertNick * GyroFaktor; |
if(Looping_Roll) MesswertRoll = MesswertRoll * GyroFaktor; |
else MesswertRoll = IntegralRoll * IntegralFaktor + MesswertRoll * GyroFaktor; |
// MesswertGier = MesswertGier * (GyroFaktor/2) + Integral_Gier * IntegralFaktor; |
MesswertGier = MesswertGier * (GyroFaktor) + Integral_Gier * IntegralFaktor/2; |
// Maximalwerte abfangen |
#define MAX_SENSOR 2048 |
if(MesswertNick > MAX_SENSOR) MesswertNick = MAX_SENSOR; |
if(MesswertNick < -MAX_SENSOR) MesswertNick = -MAX_SENSOR; |
if(MesswertRoll > MAX_SENSOR) MesswertRoll = MAX_SENSOR; |
if(MesswertRoll < -MAX_SENSOR) MesswertRoll = -MAX_SENSOR; |
if(MesswertGier > MAX_SENSOR) MesswertGier = MAX_SENSOR; |
if(MesswertGier < -MAX_SENSOR) MesswertGier = -MAX_SENSOR; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Höhenregelung |
// Die Höhenregelung schwächt lediglich das Gas ab, erhöht es allerdings nicht |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//OCR0B = 180 - (Poti1 + 120) / 4; |
//DruckOffsetSetting = OCR0B; |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung |
{ |
int tmp_int; |
if(EE_Parameter.GlobalConfig & CFG_HOEHEN_SCHALTER) // Regler wird über Schalter gesteuert |
{ |
if(Parameter_MaxHoehe < 50) |
{ |
SollHoehe = HoehenWert - 20; // Parameter_MaxHoehe ist der PPM-Wert des Schalters |
HoehenReglerAktiv = 0; |
} |
else |
HoehenReglerAktiv = 1; |
} |
else |
{ |
SollHoehe = Parameter_MaxHoehe * EE_Parameter.Hoehe_Verstaerkung - 20; |
HoehenReglerAktiv = 1; |
} |
if(Notlandung) SollHoehe = 0; |
h = HoehenWert; |
if((h > SollHoehe) && HoehenReglerAktiv) // zu hoch --> drosseln |
{ h = ((h - SollHoehe) * (int) Parameter_Hoehe_P) / 16; // Differenz bestimmen --> P-Anteil |
h = GasMischanteil - h; // vom Gas abziehen |
h -= (HoeheD * Parameter_Luftdruck_D)/8; // D-Anteil |
tmp_int = ((Mess_Integral_Hoch / 512) * (signed long) Parameter_Hoehe_ACC_Wirkung) / 32; |
if(tmp_int > 50) tmp_int = 50; |
else if(tmp_int < -50) tmp_int = -50; |
h -= tmp_int; |
hoehenregler = (hoehenregler*15 + h) / 16; |
if(hoehenregler < EE_Parameter.Hoehe_MinGas) // nicht unter MIN |
{ |
if(GasMischanteil >= EE_Parameter.Hoehe_MinGas) hoehenregler = EE_Parameter.Hoehe_MinGas; |
if(GasMischanteil < EE_Parameter.Hoehe_MinGas) hoehenregler = GasMischanteil; |
} |
if(hoehenregler > GasMischanteil) hoehenregler = GasMischanteil; // nicht mehr als Gas |
GasMischanteil = hoehenregler; |
} |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Mischer und PI-Regler |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DebugOut.Analog[7] = GasMischanteil; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gier-Anteil |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define MUL_G 1.0 |
GierMischanteil = MesswertGier - sollGier; // Regler für Gier |
//GierMischanteil = 0; |
if(GierMischanteil > (MUL_G * GasMischanteil)) GierMischanteil = MUL_G * GasMischanteil; |
if(GierMischanteil < -(MUL_G * GasMischanteil)) GierMischanteil = -(MUL_G * GasMischanteil); |
if(GierMischanteil > 100) GierMischanteil = 100; |
if(GierMischanteil < -100) GierMischanteil = -100; |
if(GasMischanteil < 20) GierMischanteil = 0; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Nick-Achse |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DiffNick = Kp * (MesswertNick - (StickNick - GPS_Nick)); // Differenz bestimmen |
SummeNick += DiffNick; // I-Anteil |
if(SummeNick > 0) SummeNick-= (abs(SummeNick)/256 + 1); else SummeNick += abs(SummeNick)/256 + 1; |
if(SummeNick > 16000) SummeNick = 16000; |
if(SummeNick < -16000) SummeNick = -16000; |
pd_ergebnis = DiffNick + Ki * SummeNick; // PI-Regler für Nick |
// Motor Vorn |
#define MUL 2 |
if(pd_ergebnis > MUL * (GasMischanteil + abs(GierMischanteil))) pd_ergebnis = MUL * (GasMischanteil + abs(GierMischanteil)); |
if(pd_ergebnis < -MUL * (GasMischanteil + abs(GierMischanteil))) pd_ergebnis = -MUL * (GasMischanteil + abs(GierMischanteil)); |
motorwert = GasMischanteil + pd_ergebnis + GierMischanteil; // Mischer |
if ((motorwert < 0)) motorwert = 0; |
else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
Motor_Vorne = motorwert; |
// Motor Heck |
motorwert = GasMischanteil - pd_ergebnis + GierMischanteil; |
if ((motorwert < 0)) motorwert = 0; |
else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
Motor_Hinten = motorwert; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Roll-Achse |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DiffRoll = Kp * (MesswertRoll - (StickRoll - GPS_Roll)); // Differenz bestimmen |
SummeRoll += DiffRoll; // I-Anteil |
if(SummeRoll > 0) SummeRoll-= (abs(SummeRoll)/256 + 1); else SummeRoll += abs(SummeRoll)/256 + 1; |
if(SummeRoll > 16000) SummeRoll = 16000; |
if(SummeRoll < -16000) SummeRoll = -16000; |
pd_ergebnis = DiffRoll + Ki * SummeRoll; // PI-Regler für Roll |
if(pd_ergebnis > MUL * (GasMischanteil + abs(GierMischanteil))) pd_ergebnis = MUL * (GasMischanteil + abs(GierMischanteil)); |
if(pd_ergebnis < -MUL * (GasMischanteil + abs(GierMischanteil))) pd_ergebnis = -MUL * (GasMischanteil + abs(GierMischanteil)); |
// Motor Links |
motorwert = GasMischanteil + pd_ergebnis - GierMischanteil; |
if ((motorwert < 0)) motorwert = 0; |
else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
Motor_Links = motorwert; |
// Motor Rechts |
motorwert = GasMischanteil - pd_ergebnis - GierMischanteil; |
if ((motorwert < 0)) motorwert = 0; |
else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
Motor_Rechts = motorwert; |
// +++++++++++++++++++++++++++++++++++++++++++++++ |
} |
/branches/salvo_gps/Basis_V0066c/trunk/fc.h |
---|
0,0 → 1,162 |
/*####################################################################################### |
Flight Control |
#######################################################################################*/ |
#ifndef _FC_H |
#define _FC_H |
extern volatile unsigned int I2CTimeout; |
//Salvo 1.9.2007 Neutralwerte fuer ACC Sensor fest einstellen. Startausrichtung ist dann egal ! ***** |
// Laut Datenblatt sind die Werte ueber Zeit und Temperatur sehr stabil. |
#define ACC_NEUTRAL_FIXED 1 // wenn eins werden die Neutralwerte fuer den ACC Sensor festeingestellt |
#define ACC_NICK_NEUTRAL 518 // ADC Wandler Wert in Neutrallage (0g): Vom individuellen Sensor abhaengig |
#define ACC_ROLL_NEUTRAL 516 // ADC Wandler wert in Neutrallage (0g) |
#define ACC_WAAGRECHT_LIMIT 100 // Nick und Roll kleiner als dieser Wert gelten als Kriterium fuer waagrechte Lage |
// Salvo End |
//Salvo 2.9.2007 Ersatzkompass: Gyroincrements/Grad als Defaultwert ***** |
// Laut Datenblatt sind die Werte ueber Zeit und Temperatur sehr stabil. |
#define GYROKOMP_INC_GRAD_DEFAULT 1250 // Gyroincrements/Grad als Defaultwert |
// Salvo End |
extern unsigned char Parameter_UserParam1 ; |
extern unsigned char Parameter_UserParam2 ; |
extern unsigned char Parameter_UserParam3 ; |
// Salvo End |
extern unsigned char Sekunde,Minute; |
extern volatile long IntegralNick,IntegralNick2; |
extern volatile long IntegralRoll,IntegralRoll2; |
extern volatile long Mess_IntegralNick,Mess_IntegralNick2; |
extern volatile long Mess_IntegralRoll,Mess_IntegralRoll2; |
extern volatile long IntegralAccNick,IntegralAccRoll; |
extern volatile long Mess_Integral_Hoch; |
extern volatile long Integral_Gier,Mess_Integral_Gier,Mess_Integral_Gier2; |
extern volatile int KompassValue; |
extern volatile int KompassStartwert; |
extern volatile int KompassRichtung; |
extern int HoehenWert; |
extern int SollHoehe; |
extern volatile int MesswertNick,MesswertRoll,MesswertGier; |
extern volatile int AdNeutralNick,AdNeutralRoll,AdNeutralGier, Mittelwert_AccNick, Mittelwert_AccRoll; |
extern volatile int NeutralAccX, NeutralAccY,Mittelwert_AccHoch; |
extern volatile float NeutralAccZ; |
extern long Umschlag180Nick, Umschlag180Roll; |
//Salvo 2.9.2007 Ersatzkompass |
extern volatile long GyroKomp_Int; |
extern volatile int GyroKomp_Inc_Grad; |
extern volatile int GyroKomp_Value; // Der ermittelte Kompasswert aus Gyro und Magnetkompass |
// Salvo End |
void MotorRegler(void); |
void SendMotorData(void); |
void CalibrierMittelwert(void); |
void Mittelwert(void); |
void SetNeutral(void); |
void Piep(unsigned char Anzahl); |
extern void DefaultKonstanten(void); |
void DefaultKonstanten1(void); |
void DefaultKonstanten2(void); |
extern unsigned char h,m,s; |
extern volatile unsigned char Timeout ; |
extern unsigned char CosinusNickWinkel, CosinusRollWinkel; |
extern volatile long IntegralNick,IntegralNick2; |
extern volatile long IntegralRoll,IntegralRoll2; |
extern volatile long Integral_Gier; |
extern volatile long Mess_IntegralNick,Mess_IntegralNick2; |
extern volatile long Mess_IntegralRoll,Mess_IntegralRoll2; |
extern volatile long Mess_Integral_Gier; |
extern volatile int DiffNick,DiffRoll; |
extern int Poti1, Poti2, Poti3, Poti4; |
extern volatile unsigned char Motor_Vorne,Motor_Hinten,Motor_Rechts,Motor_Links, Count; |
extern unsigned char MotorWert[5]; |
extern volatile unsigned char SenderOkay; |
extern int StickNick,StickRoll,StickGier; |
extern char MotorenEin; |
extern void DefaultKonstanten1(void); |
extern void DefaultKonstanten2(void); |
#define STRUCT_PARAM_LAENGE 65 |
struct mk_param_struct |
{ |
unsigned char Kanalbelegung[8]; // GAS[0], GIER[1],NICK[2], ROLL[3], POTI1, POTI2, POTI3 |
unsigned char GlobalConfig; // 0x01=Höhenregler aktiv,0x02=Kompass aktiv, 0x04=GPS aktiv, 0x08=Heading Hold aktiv |
unsigned char Hoehe_MinGas; // Wert : 0-100 |
unsigned char Luftdruck_D; // Wert : 0-250 |
unsigned char MaxHoehe; // Wert : 0-32 |
unsigned char Hoehe_P; // Wert : 0-32 |
unsigned char Hoehe_Verstaerkung; // Wert : 0-50 |
unsigned char Hoehe_ACC_Wirkung; // Wert : 0-250 |
unsigned char Stick_P; // Wert : 1-6 |
unsigned char Stick_D; // Wert : 0-64 |
unsigned char Gier_P; // Wert : 1-20 |
unsigned char Gas_Min; // Wert : 0-32 |
unsigned char Gas_Max; // Wert : 33-250 |
unsigned char GyroAccFaktor; // Wert : 1-64 |
unsigned char KompassWirkung; // Wert : 0-32 |
unsigned char Gyro_P; // Wert : 10-250 |
unsigned char Gyro_I; // Wert : 0-250 |
unsigned char UnterspannungsWarnung; // Wert : 0-250 |
unsigned char NotGas; // Wert : 0-250 //Gaswert bei Empängsverlust |
unsigned char NotGasZeit; // Wert : 0-250 // Zeitbis auf NotGas geschaltet wird, wg. Rx-Problemen |
unsigned char UfoAusrichtung; // X oder + Formation |
unsigned char I_Faktor; // Wert : 0-250 |
unsigned char UserParam1; // Wert : 0-250 |
unsigned char UserParam2; // Wert : 0-250 |
unsigned char UserParam3; // Wert : 0-250 |
unsigned char UserParam4; // Wert : 0-250 |
unsigned char ServoNickControl; // Wert : 0-250 // Stellung des Servos |
unsigned char ServoNickComp; // Wert : 0-250 // Einfluss Gyro/Servo |
unsigned char ServoNickMin; // Wert : 0-250 // Anschlag |
unsigned char ServoNickMax; // Wert : 0-250 // Anschlag |
unsigned char ServoNickRefresh; // |
unsigned char LoopGasLimit; // Wert: 0-250 max. Gas während Looping |
unsigned char LoopThreshold; // Wert: 0-250 Schwelle für Stickausschlag |
unsigned char LoopHysterese; // Wert: 0-250 Hysterese für Stickausschlag |
unsigned char AchsKopplung1; // Wert: 0-250 Faktor, mit dem Gier die Achsen Roll und Nick koppelt (NickRollMitkopplung) |
unsigned char AchsGegenKopplung1; // Wert: 0-250 Faktor, mit dem Gier die Achsen Roll und Nick Gegenkoppelt (NickRollGegenkopplung) |
unsigned char WinkelUmschlagNick; // Wert: 0-250 180°-Punkt |
unsigned char WinkelUmschlagRoll; // Wert: 0-250 180°-Punkt |
unsigned char GyroAccAbgleich; // 1/k (Koppel_ACC_Wirkung) |
unsigned char Driftkomp; |
//------------------------------------------------ |
unsigned char LoopConfig; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
unsigned char ServoNickCompInvert; // Wert : 0-250 0 oder 1 // WICHTIG!!! am Ende lassen |
unsigned char Reserved[4]; |
char Name[12]; |
}; |
/* |
unsigned char ServoNickMax; // Wert : 0-250 |
unsigned char ServoNickRefresh; // |
unsigned char LoopGasLimit; // Wert: 0-250 max. Gas während Looping |
unsigned char LoopThreshold; // Wert: 0-250 Schwelle für Stickausschlag |
//------------------------------------------------ |
unsigned char LoopConfig; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
unsigned char ServoNickCompInvert; // Wert : 0-250 0 oder 1 // WICHTIG!!! am Ende lassen |
unsigned char Reserved[4]; |
char Name[12]; |
*/ |
extern struct mk_param_struct EE_Parameter; |
extern unsigned char Parameter_Luftdruck_D; |
extern unsigned char Parameter_MaxHoehe; |
extern unsigned char Parameter_Hoehe_P; |
extern unsigned char Parameter_Hoehe_ACC_Wirkung; |
extern unsigned char Parameter_KompassWirkung; |
extern unsigned char Parameter_Gyro_P; |
extern unsigned char Parameter_Gyro_I; |
extern unsigned char Parameter_Gier_P; |
extern unsigned char Parameter_ServoNickControl; |
extern unsigned char Parameter_AchsKopplung1; |
extern unsigned char Parameter_AchsGegenKopplung1; |
#endif //_FC_H |
/branches/salvo_gps/Basis_V0066c/trunk/flight.pnproj |
---|
0,0 → 1,0 |
<Project name="Flight-Ctrl"><File path="uart.h"></File><File path="main.c"></File><File path="main.h"></File><File path="makefile"></File><File path="uart.c"></File><File path="printf_P.h"></File><File path="printf_P.c"></File><File path="timer0.c"></File><File path="timer0.h"></File><File path="old_macros.h"></File><File path="twimaster.c"></File><File path="version.txt"></File><File path="twimaster.h"></File><File path="rc.c"></File><File path="rc.h"></File><File path="fc.h"></File><File path="fc.c"></File><File path="menu.h"></File><File path="menu.c"></File><File path="_Settings.h"></File><File path="analog.c"></File><File path="analog.h"></File><File path="GPS.c"></File><File path="gps.h"></File><File path="License.txt"></File><File path="eeprom.c"></File></Project> |
/branches/salvo_gps/Basis_V0066c/trunk/flight.pnps |
---|
0,0 → 1,0 |
<pd><ViewState><e p="Flight-Ctrl" x="true"></e></ViewState></pd> |
/branches/salvo_gps/Basis_V0066c/trunk/gps.h |
---|
0,0 → 1,134 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Peter Muehlenbrock ("Salvo") |
// Definitionen fuer Modul GPS |
// Stand 12.10.007 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
extern signed int GPS_Nick; |
extern signed int GPS_Roll; |
extern void GPS_Neutral(void); |
extern void Get_Ublox_Msg(uint8_t rx) ; |
//extern short int Get_GPS_data(void); |
extern short int Get_Rel_Position(void); |
extern void GPS_Save_Home(void); |
extern short int GPS_CRTL(short int cmd); |
typedef struct { |
unsigned long utm_itow; // time of week |
long utm_east; // UTM Ost in cm |
long utm_north; // UTM Nord in cm |
long utm_alt; // hoehe in cm |
uint8_t utm_zone; // |
uint8_t utm_hem; // Hemisphere Indicator |
uint8_t status; // 0: kein gueltiges Paket 1: alles ok |
} NAV_POSUTM_t; |
typedef struct { |
unsigned long itow; // time of week |
uint8_t gpsfix_type;// 3=3D Fix |
uint8_t nav_status_flag; |
uint8_t nav_diff_status; |
uint8_t nav_resevd; |
long nav_tff; // Time to First Fix in ms |
long nav_msss; // ms since startup |
uint8_t status; // 0: kein gueltiges Paket 1: alles ok |
} NAV_STATUS_t; |
typedef struct { |
unsigned long itow; |
long speed_n; // in cm/s |
long speed_e; // in cm/s |
long speed_alt; // in cm/s |
unsigned long speed_3d; // in cm/s |
unsigned long speed_gnd; // V ueber Grund in cm/s |
long heading; // Richtung in deg/10000 |
unsigned long sacc; // Speed Genauigkeit in cm/s |
unsigned long cacc; // Richtungsgenauigkeit in deg |
uint8_t status; // 0: kein gueltiges Paket 1: alles ok |
} NAV_VELNED_t; |
typedef struct { |
long utm_east; // UTM Ost in 10 cm |
long utm_north; // UTM Nord in 10 cm |
long utm_alt; // hoehe in 10 cm |
unsigned long speed_gnd; // V ueber Grund in 10cm/s |
unsigned heading; // Richtung in Grad |
uint8_t status; // 0: keine gueltigen Daten 1: alles ok |
} GPS_ABS_POSITION_t; |
typedef struct { // Struktur fuer Relative GPS Daten (bezogen z.B. auf Home Position) |
int utm_east; // UTM Ost in 10 cm |
int utm_north; // UTM Nord in 10 cm |
int utm_alt ; // UTM Altiude in 10 cm |
uint8_t status; // 0: keine gueltigen Daten 1: alles ok |
} GPS_REL_POSITION_t; |
extern GPS_ABS_POSITION_t gps_act_position; |
extern GPS_ABS_POSITION_t gps_home_position; |
extern GPS_REL_POSITION_t gps_rel_act_position; |
extern GPS_REL_POSITION_t gps_rel_hold_position; |
extern short int gps_state,gps_sub_state; |
extern signed int GPS_hdng_abs_2trgt; |
extern signed int GPS_hdng_rel_2trgt; |
extern signed int GPS_dist_2trgt; |
extern signed int gps_reg_x,gps_reg_y; |
extern signed int GPS_dist_2trgt; |
extern unsigned int gps_alive_cnt; |
//nur provisorisch fuer Debugausgaben |
extern signed hdng_2home,dist_2home; //Richtung und Entfernung zur home Position |
extern long int dist_flown; |
// Zustaende der zentralen GPS statemachine |
#define GPS_CRTL_IDLE 0 // |
#define GPS_CRTL_HOLD_ACTIVE 1 // Lageregelung aktiv |
#define GPS_CRTL_HOME_ACTIVE 2 // Rueckflug zur Basis Aktiv |
#define GPS_HOME_FAST_IN_TOL 3 // Rueckflug: Aktuelle Position innerhalb der Toleranz |
#define GPS_HOME_FAST_OUTOF_TOL 4 // Rueckflug: Aktuelle Position ausserhalb der Toleranz |
#define GPS_HOME_RMPDWN_IN_TOL 5 // Rueckflug: beim Abbremsen Position innerhalb der Toleranz |
#define GPS_HOME_RMPDWN_OUTOF_TOL 6 // Rueckflug: beim Abbremsen Position ausserhalb der Toleranz |
#define GPS_HOME_IN_TOL 7 // Rueckflug: Nahe am Ziel innerhalb der Toleranz |
#define GPS_HOME_OUTOF_TOL 8 // Rueckflug: Nahe am Ziel ausserhalb der Toleranz |
#define GPS_HOME_FINISHED 9 // Rueckflug zur Basis abgeschlossen |
// Kommandokonstanten fuer die zentrale GPS Statemachine |
#define GPS_CMD_STOP 0 // Lageregelung soll deaktiviert werden |
#define GPS_CMD_REQ_INIT 1 // Initialisierung |
#define GPS_CMD_REQ_HOLD 3 // Lageregelung soll aktiviert werden |
#define GPS_CMD_REQ_HOME 4 // Das Heimfliegen soll aktiviert werden |
// Statusmeldungen der zentralen GPS statemachine |
#define GPS_STST_OK 0 // Kommando erfolgreich und abgeschlossen |
#define GPS_STST_PEND 1 // Kommando noch nicht komplett durchgefuehrt |
#define GPS_STST_ERR 2 // Fehler |
// GPS Lageregler |
#define GPS_NICKROLL_MAX 40 // Maximaler Einfluss des GPS Lagereglers auf Nick und Roll |
#define GPS_DIST_MAX 400 // Maximal zulaessige Distanz bevor Regelung gestoppt wird (in 10cm) |
#define GPS_STICK_HOLDOFF 25 // Wenn der Nick oder Roll Stickwerte groesser sind, wird GPS_HOLD deaktiviert |
#define GPS_V 8 // Teilerfaktor Regelabweichung zu Ausgabewert |
// Differenzierer Kennwerte fuer von Distanz abhaengige Verstaerkung, abhaengig vom Modus. |
#define GPS_DIFF_NRML_MAX_V 20 //maximale Verstaerkung * 10 |
#define GPS_DIFF_NRML_MAX_D 30 //Entfernung bei der maximale Verstaerkung erreicht wird in 10cm |
#define GPS_DIFF_FAST_MAX_V 15 //maximale Verstaerkung * 10 im Fast mode |
#define GPS_DIFF_FAST_MAX_D 50 //Entfernung bei der maximale Verstaerkung erreicht wird in 10cm im Fast mode |
// P-Regler Verstaerkung |
#define GPS_PROP_NRML_V 2 //maximale Verstaerkung * 2 |
#define GPS_PROP_FAST_V 2 //maximale Verstaerkung * 2 im Fast mode |
// GPS G2T /Go to Target Regler |
#define GPS_G2T_DIST_MAX_STOP 50 // Ab dieser Entfernung vom Zielpunkt soll die Geschwindigkeit runtergeregelt werden( in 10 cm) |
#define GPS_G2T_DIST_HOLD 30 // Ab dieser Entfernung vom Zielpunkt wird mit Minimaler Geschwindigkeit eingeregelt |
#define GPS_G2T_V_MAX 12 // Maximale Geschwindigkeit (in 10cm/0.25 Sekunden) mit der der Sollpunkt geaendert wird. |
#define GPS_G2T_V_RAMP_DWN 6 // Geschwindigkeit (in 10cm/0.25ekunden) in der Naehe der Home Position um abzubremsen |
#define GPS_G2T_V_MIN 3 // Minimale (in 10cm/0.25 Sekunden) ganz nahe an Homeposition. |
#define GPS_G2T_FAST_TOL 60 // Bei grosser Entfernung vom Ziel: Der Sollwert wird nur geaendert wenn die aktuelle Position nicht mehr als diesem Wert vom Sollwert abweicht |
#define GPS_G2T_NRML_TOL 40 // Bei kleiner Entfernung vom Ziel: Der Sollwert wird nur geaendert wenn die aktuelle Position nicht mehr als diesem Wert vom Sollwert abweicht |
/branches/salvo_gps/Basis_V0066c/trunk/main.c |
---|
0,0 → 1,233 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + Nur für den privaten Gebrauch |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten und nicht-kommerziellen Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt und genannt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-commercial use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be |
// + clearly linked as origin |
// + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
unsigned char EEPromArray[E2END+1] EEMEM; |
unsigned char PlatinenVersion = 10; |
// -- 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); |
} |
// -- 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); |
} |
//############################################################################ |
//Hauptprogramm |
int main (void) |
//############################################################################ |
{ |
unsigned int timer; |
//unsigned int timer2 = 0; |
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 |
PORTD = 0xF7; // LED |
MCUSR &=~(1<<WDRF); |
WDTCSR |= (1<<WDCE)|(1<<WDE); |
WDTCSR = 0; |
beeptime = 2000; |
StickGier = 0; PPM_in[K_GAS] = 0;StickRoll = 0; StickNick = 0; |
ROT_OFF; |
Timer_Init(); |
UART_Init(); |
rc_sum_init(); |
ADC_Init(); |
i2c_init(); |
// SPI_MasterInit(); |
sei(); |
VersionInfo.Hauptversion = VERSION_HAUPTVERSION; |
VersionInfo.Nebenversion = VERSION_NEBENVERSION; |
VersionInfo.PCKompatibel = VERSION_KOMPATIBEL; |
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\r=============================="); |
GRN_ON; |
#define EE_DATENREVISION 66 // 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); |
} |
ReadParameterSet(GetActiveParamSetNumber(), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
printf("\n\rBenutze Parametersatz %d", GetActiveParamSetNumber()); |
if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
printf("\n\rAbgleich Luftdrucksensor.."); |
timer = SetDelay(1000); |
SucheLuftruckOffset(); |
while (!CheckDelay(timer)); |
printf("OK\n\r"); |
} |
SetNeutral(); |
ROT_OFF; |
beeptime = 2000; |
DebugIn.Analog[1] = 1000; |
DebugIn.Digital[0] = 0x55; |
printf("\n\rSteuerung: "); |
if (EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) printf("HeadingHold"); |
else printf("Neutral"); |
printf("\n\n\r"); |
LcdClear(); |
I2CTimeout = 5000; |
while (1) |
{ |
if (UpdateMotor) // ReglerIntervall |
{ |
// SPI_TransmitByte(); |
UpdateMotor=0; |
//PORTD |= 0x08; |
MotorRegler(); |
//PORTD &= ~0x08; |
SendMotorData(); |
ROT_OFF; |
if(PcZugriff) PcZugriff--; |
if(SenderOkay) SenderOkay--; |
if(!I2CTimeout) |
{ |
I2CTimeout = 5; |
i2c_reset(); |
if((BeepMuster == 0xffff) && MotorenEin) |
{ |
beeptime = 10000; |
BeepMuster = 0x0080; |
} |
} |
else |
{ |
I2CTimeout--; |
ROT_OFF; |
} |
} |
if(SIO_DEBUG) |
{ |
DatenUebertragung(); |
BearbeiteRxDaten(); |
} |
else BearbeiteRxDaten(); |
if(CheckDelay(timer)) |
{ |
if(UBat < EE_Parameter.UnterspannungsWarnung) |
{ |
if(BeepMuster == 0xffff) |
{ |
beeptime = 6000; |
BeepMuster = 0x0300; |
} |
} |
// SPI_StartTransmitPacket(); |
timer = SetDelay(100); |
} |
} |
return (1); |
} |
/branches/salvo_gps/Basis_V0066c/trunk/main.h |
---|
0,0 → 1,100 |
#ifndef _MAIN_H |
#define _MAIN_H |
//Hier die Quarz Frequenz einstellen |
#if defined (__AVR_ATmega32__) |
#define SYSCLK 20000000L //Quarz Frequenz in Hz |
#endif |
#if defined (__AVR_ATmega644__) |
#define SYSCLK 20000000L //Quarz Frequenz in Hz |
//#define SYSCLK 16000000L //Quarz Frequenz in Hz |
#endif |
// neue Hardware |
#define ROT_OFF {if(PlatinenVersion == 10) PORTB &=~0x01; else PORTB |= 0x01;} |
#define ROT_ON {if(PlatinenVersion == 10) PORTB |= 0x01; else PORTB &=~0x01;} |
#define ROT_FLASH PORTB ^= 0x01 |
#define GRN_OFF PORTB &=~0x02 |
#define GRN_ON PORTB |= 0x02 |
#define GRN_FLASH PORTB ^= 0x02 |
#define F_CPU SYSCLK |
//#ifndef F_CPU |
//#error ################## F_CPU nicht definiert oder ungültig ############# |
//#endif |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define EEPROM_ADR_VALID 1 |
#define EEPROM_ADR_ACTIVE_SET 2 |
#define EEPROM_ADR_LAST_OFFSET 3 |
#define EEPROM_ADR_PARAM_BEGIN 100 |
#define CFG_HOEHENREGELUNG 0x01 |
#define CFG_HOEHEN_SCHALTER 0x02 |
#define CFG_HEADING_HOLD 0x04 |
#define CFG_KOMPASS_AKTIV 0x08 |
#define CFG_KOMPASS_FIX 0x10 |
#define CFG_GPS_AKTIV 0x20 |
#define CFG_ACHSENKOPPLUNG_AKTIV 0x40 |
#define CFG_DREHRATEN_BEGRENZER 0x80 |
#define CFG_LOOP_OBEN 0x01 |
#define CFG_LOOP_UNTEN 0x02 |
#define CFG_LOOP_LINKS 0x04 |
#define CFG_LOOP_RECHTS 0x08 |
//#define SYSCLK |
//extern unsigned long SYSCLK; |
extern volatile int i_Nick[20],i_Roll[20],DiffNick,DiffRoll; |
extern volatile unsigned char SenderOkay; |
extern unsigned char CosinusNickWinkel, CosinusRollWinkel; |
extern unsigned char PlatinenVersion; |
void ReadParameterSet (unsigned char number, unsigned char *buffer, unsigned char length); |
void WriteParameterSet(unsigned char number, unsigned char *buffer, unsigned char length); |
extern unsigned char GetActiveParamSetNumber(void); |
extern unsigned char EEPromArray[]; |
#include <stdlib.h> |
#include <string.h> |
#include <avr/io.h> |
#include <avr/pgmspace.h> |
#include <avr/interrupt.h> |
#include <avr/eeprom.h> |
#include <avr/boot.h> |
#include <avr/wdt.h> |
#include "old_macros.h" |
#include "_Settings.h" |
#include "printf_P.h" |
#include "timer0.h" |
#include "uart.h" |
#include "analog.h" |
#include "twimaster.h" |
#include "menu.h" |
#include "rc.h" |
#include "fc.h" |
#include "math.h" |
#include "gps.h" |
#include "spi.h" |
#ifndef EEMEM |
#define EEMEM __attribute__ ((section (".eeprom"))) |
#endif |
#define DEBUG_DISPLAY_INTERVALL 123 // in ms |
#define DELAY_US(x) ((unsigned int)( (x) * 1e-6 * F_CPU )) |
#endif //_MAIN_H |
/branches/salvo_gps/Basis_V0066c/trunk/makefile |
---|
0,0 → 1,411 |
#-------------------------------------------------------------------- |
# MCU name |
MCU = atmega644 |
F_CPU = 20000000 |
#------------------------------------------------------------------- |
HAUPT_VERSION = 0 |
NEBEN_VERSION = 66 |
VERSION_INDEX = 2 |
VERSION_KOMPATIBEL = 6 # PC-Kompatibilität |
#------------------------------------------------------------------- |
ifeq ($(MCU), atmega32) |
# FUSE_SETTINGS= -u -U lfuse:w:0xff:m -U hfuse:w:0xcf:m |
HEX_NAME = MEGA32 |
endif |
ifeq ($(MCU), atmega644) |
FUSE_SETTINGS = -u -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
#FUSE_SETTINGS = -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
# -u bei neuen Controllern wieder einspielen |
HEX_NAME = MEGA644 |
endif |
ifeq ($(F_CPU), 16000000) |
QUARZ = 16MHZ |
endif |
ifeq ($(F_CPU), 20000000) |
QUARZ = 20MHZ |
endif |
# Output format. (can be srec, ihex, binary) |
FORMAT = ihex |
# Target file name (without extension). |
ifeq ($(VERSION_INDEX), 0) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)a |
endif |
ifeq ($(VERSION_INDEX), 1) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)b |
endif |
ifeq ($(VERSION_INDEX), 2) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)c |
endif |
ifeq ($(VERSION_INDEX), 3) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)d |
endif |
ifeq ($(VERSION_INDEX), 4) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)e |
endif |
ifeq ($(VERSION_INDEX), 5) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)f |
endif |
# Optimization level, can be [0, 1, 2, 3, s]. 0 turns off optimization. |
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) |
OPT = s |
########################################################################################################## |
# List C source files here. (C dependencies are automatically generated.) |
SRC = main.c uart.c printf_P.c timer0.c analog.c menu.c |
SRC += twimaster.c rc.c fc.c GPS.c math.c |
#spi.c |
########################################################################################################## |
# List Assembler source files here. |
# Make them always end in a capital .S. Files ending in a lowercase .s |
# will not be considered source files but generated files (assembler |
# output from the compiler), and will be deleted upon "make clean"! |
# Even though the DOS/Win* filesystem matches both .s and .S the same, |
# it will preserve the spelling of the filenames, and gcc itself does |
# care about how the name is spelled on its command-line. |
ASRC = |
# List any extra directories to look for include files here. |
# Each directory must be seperated by a space. |
EXTRAINCDIRS = |
# Optional compiler flags. |
# -g: generate debugging information (for GDB, or for COFF conversion) |
# -O*: optimization level |
# -f...: tuning, see gcc manual and avr-libc documentation |
# -Wall...: warning level |
# -Wa,...: tell GCC to pass this to the assembler. |
# -ahlms: create assembler listing |
CFLAGS = -O$(OPT) \ |
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \ |
-Wall -Wstrict-prototypes \ |
-Wa,-adhlns=$(<:.c=.lst) \ |
$(patsubst %,-I%,$(EXTRAINCDIRS)) |
# Set a "language standard" compiler flag. |
# Unremark just one line below to set the language standard to use. |
# gnu99 = C99 + GNU extensions. See GCC manual for more information. |
#CFLAGS += -std=c89 |
#CFLAGS += -std=gnu89 |
#CFLAGS += -std=c99 |
CFLAGS += -std=gnu99 |
CFLAGS += -DVERSION_HAUPTVERSION=$(HAUPT_VERSION) -DVERSION_NEBENVERSION=$(NEBEN_VERSION) -DVERSION_KOMPATIBEL=$(VERSION_KOMPATIBEL) -DVERSION_INDEX=$(VERSION_INDEX) |
# Optional assembler flags. |
# -Wa,...: tell GCC to pass this to the assembler. |
# -ahlms: create listing |
# -gstabs: have the assembler create line number information; note that |
# for use in COFF files, additional information about filenames |
# and function names needs to be present in the assembler source |
# files -- see avr-libc docs [FIXME: not yet described there] |
ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs |
# Optional linker flags. |
# -Wl,...: tell GCC to pass this to linker. |
# -Map: create map file |
# --cref: add cross reference to map file |
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref |
# Additional libraries |
# Minimalistic printf version |
#LDFLAGS += -Wl,-u,vfprintf -lprintf_min |
# Floating point printf version (requires -lm below) |
#LDFLAGS += -Wl,-u,vfprintf -lprintf_flt |
# -lm = math library |
LDFLAGS += -lm |
##LDFLAGS += -T./linkerfile/avr5.x |
# Programming support using avrdude. Settings and variables. |
# Programming hardware: alf avr910 avrisp bascom bsd |
# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500 |
# |
# Type: avrdude -c ? |
# to get a full listing. |
# |
#AVRDUDE_PROGRAMMER = stk200 |
AVRDUDE_PROGRAMMER = dt006 |
#AVRDUDE_PROGRAMMER = ponyser |
#falls Ponyser ausgewählt wird, muss sich unsere avrdude-Configdatei im Bin-Verzeichnis des Compilers befinden |
#AVRDUDE_PORT = com1 # programmer connected to serial device |
AVRDUDE_PORT = lpt1 # programmer connected to parallel port |
#AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex |
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex $(FUSE_SETTINGS) |
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep |
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) |
# Uncomment the following if you want avrdude's erase cycle counter. |
# Note that this counter needs to be initialized first using -Yn, |
# see avrdude manual. |
#AVRDUDE_ERASE += -y |
# Uncomment the following if you do /not/ wish a verification to be |
# performed after programming the device. |
AVRDUDE_FLAGS += -V |
# Increase verbosity level. Please use this when submitting bug |
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude> |
# to submit bug reports. |
#AVRDUDE_FLAGS += -v -v |
# --------------------------------------------------------------------------- |
# Define directories, if needed. |
DIRAVR = c:/winavr |
DIRAVRBIN = $(DIRAVR)/bin |
DIRAVRUTILS = $(DIRAVR)/utils/bin |
DIRINC = . |
DIRLIB = $(DIRAVR)/avr/lib |
# Define programs and commands. |
SHELL = sh |
CC = avr-gcc |
OBJCOPY = avr-objcopy |
OBJDUMP = avr-objdump |
SIZE = avr-size |
# Programming support using avrdude. |
AVRDUDE = avrdude |
REMOVE = rm -f |
COPY = cp |
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex |
ELFSIZE = $(SIZE) -A $(TARGET).elf |
# Define Messages |
# English |
MSG_ERRORS_NONE = Errors: none |
MSG_BEGIN = -------- begin -------- |
MSG_END = -------- end -------- |
MSG_SIZE_BEFORE = Size before: |
MSG_SIZE_AFTER = Size after: |
MSG_COFF = Converting to AVR COFF: |
MSG_EXTENDED_COFF = Converting to AVR Extended COFF: |
MSG_FLASH = Creating load file for Flash: |
MSG_EEPROM = Creating load file for EEPROM: |
MSG_EXTENDED_LISTING = Creating Extended Listing: |
MSG_SYMBOL_TABLE = Creating Symbol Table: |
MSG_LINKING = Linking: |
MSG_COMPILING = Compiling: |
MSG_ASSEMBLING = Assembling: |
MSG_CLEANING = Cleaning project: |
# Define all object files. |
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) |
# Define all listing files. |
LST = $(ASRC:.S=.lst) $(SRC:.c=.lst) |
# Combine all necessary flags and optional flags. |
# Add target processor to flags. |
#ALL_CFLAGS = -mmcu=$(MCU) -DF_CPU=$(F_CPU) -I. $(CFLAGS) |
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) |
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) |
# Default target. |
all: begin gccversion sizebefore $(TARGET).elf $(TARGET).hex $(TARGET).eep \ |
$(TARGET).lss $(TARGET).sym sizeafter finished end |
# Eye candy. |
# AVR Studio 3.x does not check make's exit code but relies on |
# the following magic strings to be generated by the compile job. |
begin: |
@echo |
@echo $(MSG_BEGIN) |
finished: |
@echo $(MSG_ERRORS_NONE) |
end: |
@echo $(MSG_END) |
@echo |
# Display size of file. |
sizebefore: |
@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi |
sizeafter: |
@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; fi |
# Display compiler version information. |
gccversion : |
@$(CC) --version |
# Convert ELF to COFF for use in debugging / simulating in |
# AVR Studio or VMLAB. |
COFFCONVERT=$(OBJCOPY) --debugging \ |
--change-section-address .data-0x800000 \ |
--change-section-address .bss-0x800000 \ |
--change-section-address .noinit-0x800000 \ |
--change-section-address .eeprom-0x810000 |
coff: $(TARGET).elf |
@echo |
@echo $(MSG_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof |
extcoff: $(TARGET).elf |
@echo |
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof |
# Program the device. |
program: $(TARGET).hex $(TARGET).eep |
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) |
# Create final output files (.hex, .eep) from ELF output file. |
%.hex: %.elf |
@echo |
@echo $(MSG_FLASH) $@ |
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ |
%.eep: %.elf |
@echo |
@echo $(MSG_EEPROM) $@ |
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ |
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@ |
# Create extended listing file from ELF output file. |
%.lss: %.elf |
@echo |
@echo $(MSG_EXTENDED_LISTING) $@ |
$(OBJDUMP) -h -S $< > $@ |
# Create a symbol table from ELF output file. |
%.sym: %.elf |
@echo |
@echo $(MSG_SYMBOL_TABLE) $@ |
avr-nm -n $< > $@ |
# Link: create ELF output file from object files. |
.SECONDARY : $(TARGET).elf |
.PRECIOUS : $(OBJ) |
%.elf: $(OBJ) |
@echo |
@echo $(MSG_LINKING) $@ |
$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) |
# Compile: create object files from C source files. |
%.o : %.c |
@echo |
@echo $(MSG_COMPILING) $< |
$(CC) -c $(ALL_CFLAGS) $< -o $@ |
# Compile: create assembler files from C source files. |
%.s : %.c |
$(CC) -S $(ALL_CFLAGS) $< -o $@ |
# Assemble: create object files from assembler source files. |
%.o : %.S |
@echo |
@echo $(MSG_ASSEMBLING) $< |
$(CC) -c $(ALL_ASFLAGS) $< -o $@ |
# Target: clean project. |
clean: begin clean_list finished end |
clean_list : |
@echo |
@echo $(MSG_CLEANING) |
# $(REMOVE) $(TARGET).hex |
$(REMOVE) $(TARGET).eep |
$(REMOVE) $(TARGET).obj |
$(REMOVE) $(TARGET).cof |
$(REMOVE) $(TARGET).elf |
$(REMOVE) $(TARGET).map |
$(REMOVE) $(TARGET).obj |
$(REMOVE) $(TARGET).a90 |
$(REMOVE) $(TARGET).sym |
$(REMOVE) $(TARGET).lnk |
$(REMOVE) $(TARGET).lss |
$(REMOVE) $(OBJ) |
$(REMOVE) $(LST) |
$(REMOVE) $(SRC:.c=.s) |
$(REMOVE) $(SRC:.c=.d) |
# Automatically generate C source code dependencies. |
# (Code originally taken from the GNU make user manual and modified |
# (See README.txt Credits).) |
# |
# Note that this will work with sh (bash) and sed that is shipped with WinAVR |
# (see the SHELL variable defined above). |
# This may not work with other shells or other seds. |
# |
%.d: %.c |
set -e; $(CC) -MM $(ALL_CFLAGS) $< \ |
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > $@; \ |
[ -s $@ ] || rm -f $@ |
# Remove the '-' if you want to see the dependency files generated. |
-include $(SRC:.c=.d) |
# Listing of phony targets. |
.PHONY : all begin finish end sizebefore sizeafter gccversion coff extcoff \ |
clean clean_list program |
/branches/salvo_gps/Basis_V0066c/trunk/menu.c |
---|
0,0 → 1,128 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
unsigned int TestInt = 0; |
#define ARRAYGROESSE 10 |
unsigned char Array[ARRAYGROESSE] = {1,2,3,4,5,6,7,8,9,10}; |
char DisplayBuff[80] = "Hallo Welt"; |
unsigned char DispPtr = 0; |
unsigned char RemoteTasten = 0; |
#define KEY1 0x01 |
#define KEY2 0x02 |
#define KEY3 0x04 |
#define KEY4 0x08 |
#define KEY5 0x10 |
void LcdClear(void) |
{ |
unsigned char i; |
for(i=0;i<80;i++) DisplayBuff[i] = ' '; |
} |
void Menu(void) |
{ |
static unsigned char MaxMenue = 10,MenuePunkt=0; |
if(RemoteTasten & KEY1) { if(MenuePunkt) MenuePunkt--; else MenuePunkt = MaxMenue; LcdClear(); } |
if(RemoteTasten & KEY2) { MenuePunkt++; LcdClear(); } |
if((RemoteTasten & KEY1) && (RemoteTasten & KEY2)) MenuePunkt = 0; |
LCD_printfxy(17,0,"[%i]",MenuePunkt); |
switch(MenuePunkt) |
{ |
case 0: |
LCD_printfxy(0,0,"++ MikroKopter ++"); |
LCD_printfxy(0,1,"HW:V%d.%d SW:%d.%d%c",PlatinenVersion/10,PlatinenVersion%10,VERSION_HAUPTVERSION, VERSION_NEBENVERSION,VERSION_INDEX+'a'); |
LCD_printfxy(0,2,"Setting: %d ",GetActiveParamSetNumber()); |
LCD_printfxy(0,3,"(c) Holger Buss"); |
// if(RemoteTasten & KEY3) TestInt--; |
// if(RemoteTasten & KEY4) TestInt++; |
break; |
case 1: |
if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
LCD_printfxy(0,0,"Hoehe: %5i",HoehenWert); |
LCD_printfxy(0,1,"SollHoehe: %5i",SollHoehe); |
LCD_printfxy(0,2,"Luftdruck: %5i",MessLuftdruck); |
LCD_printfxy(0,3,"Off : %5i",DruckOffsetSetting); |
} |
else |
{ |
LCD_printfxy(0,1,"Keine "); |
LCD_printfxy(0,2,"Höhenregelung"); |
} |
break; |
case 2: |
LCD_printfxy(0,0,"akt. Lage"); |
LCD_printfxy(0,1,"Nick: %5i",IntegralNick/1024); |
LCD_printfxy(0,2,"Roll: %5i",IntegralRoll/1024); |
LCD_printfxy(0,3,"Kompass: %5i",KompassValue); |
break; |
case 3: |
LCD_printfxy(0,0,"K1:%4i K2:%4i ",PPM_in[1],PPM_in[2]); |
LCD_printfxy(0,1,"K3:%4i K4:%4i ",PPM_in[3],PPM_in[4]); |
LCD_printfxy(0,2,"K5:%4i K6:%4i ",PPM_in[5],PPM_in[6]); |
LCD_printfxy(0,3,"K7:%4i K8:%4i ",PPM_in[7],PPM_in[8]); |
break; |
case 4: |
LCD_printfxy(0,0,"Ni:%4i Ro:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_NICK]],PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]); |
LCD_printfxy(0,1,"Gs:%4i Gi:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_GAS]],PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]); |
LCD_printfxy(0,2,"P1:%4i P2:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]],PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]]); |
LCD_printfxy(0,3,"P3:%4i P4:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]],PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]]); |
break; |
case 5: |
LCD_printfxy(0,0,"Gyro - Sensor"); |
if(PlatinenVersion == 10) |
{ |
LCD_printfxy(0,1,"Nick %4i (%3i)",AdWertNick - AdNeutralNick, AdNeutralNick); |
LCD_printfxy(0,2,"Roll %4i (%3i)",AdWertRoll - AdNeutralRoll, AdNeutralRoll); |
LCD_printfxy(0,3,"Gier %4i (%3i)",MesswertGier, AdNeutralGier); |
} |
else |
{ |
LCD_printfxy(0,1,"Nick %4i (%3i)",AdWertNick - AdNeutralNick, AdNeutralNick/2); |
LCD_printfxy(0,2,"Roll %4i (%3i)",AdWertRoll - AdNeutralRoll, AdNeutralRoll/2); |
LCD_printfxy(0,3,"Gier %4i (%3i)",MesswertGier, AdNeutralGier/2); |
} |
break; |
case 6: |
LCD_printfxy(0,0,"ACC - Sensor"); |
LCD_printfxy(0,1,"Nick %4i (%3i)",AdWertAccNick,NeutralAccX); |
LCD_printfxy(0,2,"Roll %4i (%3i)",AdWertAccRoll,NeutralAccY); |
LCD_printfxy(0,3,"Hoch %4i (%3i)",Mittelwert_AccHoch/*accumulate_AccHoch / messanzahl_AccHoch*/,(int)NeutralAccZ); |
break; |
case 7: |
LCD_printfxy(0,1,"Spannung: %5i",UBat); |
LCD_printfxy(0,2,"Empf.Pegel:%5i",SenderOkay); |
break; |
case 8: |
LCD_printfxy(0,0,"Kompass "); |
LCD_printfxy(0,1,"Richtung: %5i",KompassRichtung); |
LCD_printfxy(0,2,"Messwert: %5i",KompassValue); |
LCD_printfxy(0,3,"Start: %5i",KompassStartwert); |
break; |
case 9: |
LCD_printfxy(0,0,"Poti1: %3i",Poti1); |
LCD_printfxy(0,1,"Poti2: %3i",Poti2); |
LCD_printfxy(0,2,"Poti3: %3i",Poti3); |
LCD_printfxy(0,3,"Poti4: %3i",Poti4); |
break; |
case 10: |
LCD_printfxy(0,0,"Servo " ); |
LCD_printfxy(0,1,"Setpoint %3i",Parameter_ServoNickControl); |
LCD_printfxy(0,2,"Stellung: %3i",ServoValue); |
LCD_printfxy(0,3,"Range:%3i-%3i",EE_Parameter.ServoNickMin,EE_Parameter.ServoNickMax); |
break; |
default: MaxMenue = MenuePunkt - 1; |
MenuePunkt = 0; |
break; |
} |
RemoteTasten = 0; |
} |
/branches/salvo_gps/Basis_V0066c/trunk/menu.h |
---|
0,0 → 1,6 |
extern void Menu(void); |
extern void LcdClear(void); |
extern char DisplayBuff[80]; |
extern unsigned char DispPtr; |
extern unsigned char RemoteTasten; |
/branches/salvo_gps/Basis_V0066c/trunk/old_macros.h |
---|
0,0 → 1,47 |
/* |
For backwards compatibility only. |
Ingo Busker ingo@mikrocontroller.com |
*/ |
#ifndef cbi |
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) |
#endif |
#ifndef sbi |
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) |
#endif |
#ifndef inb |
#define inb(sfr) _SFR_BYTE(sfr) |
#endif |
#ifndef outb |
#define outb(sfr, val) (_SFR_BYTE(sfr) = (val)) |
#endif |
#ifndef inw |
#define inw(sfr) _SFR_WORD(sfr) |
#endif |
#ifndef outw |
#define outw(sfr, val) (_SFR_WORD(sfr) = (val)) |
#endif |
#ifndef outp |
#define outp(val, sfr) outb(sfr, val) |
#endif |
#ifndef inp |
#define inp(sfr) inb(sfr) |
#endif |
#ifndef BV |
#define BV(bit) _BV(bit) |
#endif |
#ifndef PRG_RDB |
#define PRG_RDB pgm_read_byte |
#endif |
/branches/salvo_gps/Basis_V0066c/trunk/printf_P.c |
---|
0,0 → 1,480 |
// Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist nicht von der Lizenz für den MikroKopter-Teil unterstellt |
/* |
Copyright (C) 1993 Free Software Foundation |
This file is part of the GNU IO Library. This library is free |
software; you can redistribute it and/or modify it under the |
terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) |
any later version. |
This library is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this library; see the file COPYING. If not, write to the Free |
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
As a special exception, if you link this library with files |
compiled with a GNU compiler to produce an executable, this does not cause |
the resulting executable to be covered by the GNU General Public License. |
This exception does not however invalidate any other reasons why |
the executable file might be covered by the GNU General Public License. */ |
/* |
* Copyright (c) 1990 Regents of the University of California. |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. [rescinded 22 July 1999] |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
/****************************************************************************** |
This file is a patched version of printf called _printf_P |
It is made to work with avr-gcc for Atmel AVR MCUs. |
There are some differences from standard printf: |
1. There is no floating point support (with fp the code is about 8K!) |
2. Return type is void |
3. Format string must be in program memory (by using macro printf this is |
done automaticaly) |
4. %n is not implemented (just remove the comment around it if you need it) |
5. If LIGHTPRINTF is defined, the code is about 550 bytes smaller and the |
folowing specifiers are disabled : |
space # * . - + p s o O |
6. A function void uart_sendchar(char c) is used for output. The UART must |
be initialized before using printf. |
Alexander Popov |
sasho@vip.orbitel.bg |
******************************************************************************/ |
/* |
* Actual printf innards. |
* |
* This code is large and complicated... |
*/ |
#include <string.h> |
#ifdef __STDC__ |
#include <stdarg.h> |
#else |
#include <varargs.h> |
#endif |
#include "main.h" |
//#define LIGHTPRINTF |
char PrintZiel; |
char Putchar(char zeichen) |
{ |
if(PrintZiel == OUT_LCD) { DisplayBuff[DispPtr++] = zeichen; return(1);} |
else return(uart_putchar(zeichen)); |
} |
void PRINT(const char * ptr, unsigned int len) |
{ |
for(;len;len--) Putchar(*ptr++); |
} |
void PRINTP(const char * ptr, unsigned int len) |
{ |
for(;len;len--) Putchar(pgm_read_byte(ptr++)); |
} |
void PAD_SP(signed char howmany) |
{ |
for(;howmany>0;howmany--) Putchar(' '); |
} |
void PAD_0(signed char howmany) |
{ |
for(;howmany>0;howmany--) Putchar('0'); |
} |
#define BUF 40 |
/* |
* Macros for converting digits to letters and vice versa |
*/ |
#define to_digit(c) ((c) - '0') |
#define is_digit(c) ((c)<='9' && (c)>='0') |
#define to_char(n) ((n) + '0') |
/* |
* Flags used during conversion. |
*/ |
#define LONGINT 0x01 /* long integer */ |
#define LONGDBL 0x02 /* long double; unimplemented */ |
#define SHORTINT 0x04 /* short integer */ |
#define ALT 0x08 /* alternate form */ |
#define LADJUST 0x10 /* left adjustment */ |
#define ZEROPAD 0x20 /* zero (as opposed to blank) pad */ |
#define HEXPREFIX 0x40 /* add 0x or 0X prefix */ |
void _printf_P (char ziel,char const *fmt0, ...) /* Works with string from FLASH */ |
{ |
va_list ap; |
register const char *fmt; /* format string */ |
register char ch; /* character from fmt */ |
register int n; /* handy integer (short term usage) */ |
register char *cp; /* handy char pointer (short term usage) */ |
const char *fmark; /* for remembering a place in fmt */ |
register unsigned char flags; /* flags as above */ |
signed char width; /* width from format (%8d), or 0 */ |
signed char prec; /* precision from format (%.3d), or -1 */ |
char sign; /* sign prefix (' ', '+', '-', or \0) */ |
unsigned long _ulong=0; /* integer arguments %[diouxX] */ |
#define OCT 8 |
#define DEC 10 |
#define HEX 16 |
unsigned char base; /* base for [diouxX] conversion */ |
signed char dprec; /* a copy of prec if [diouxX], 0 otherwise */ |
signed char dpad; /* extra 0 padding needed for integers */ |
signed char fieldsz; /* field size expanded by sign, dpad etc */ |
/* The initialization of 'size' is to suppress a warning that |
'size' might be used unitialized. It seems gcc can't |
quite grok this spaghetti code ... */ |
signed char size = 0; /* size of converted field or string */ |
char buf[BUF]; /* space for %c, %[diouxX], %[eEfgG] */ |
char ox[2]; /* space for 0x hex-prefix */ |
PrintZiel = ziel; // bestimmt, LCD oder UART |
va_start(ap, fmt0); |
fmt = fmt0; |
/* |
* Scan the format for conversions (`%' character). |
*/ |
for (;;) { |
for (fmark = fmt; (ch = pgm_read_byte(fmt)) != '\0' && ch != '%'; fmt++) |
/* void */; |
if ((n = fmt - fmark) != 0) { |
PRINTP(fmark, n); |
} |
if (ch == '\0') |
goto done; |
fmt++; /* skip over '%' */ |
flags = 0; |
dprec = 0; |
width = 0; |
prec = -1; |
sign = '\0'; |
rflag: ch = PRG_RDB(fmt++); |
reswitch: |
#ifdef LIGHTPRINTF |
if (ch=='o' || ch=='u' || (ch|0x20)=='x') { |
#else |
if (ch=='u' || (ch|0x20)=='x') { |
#endif |
if (flags&LONGINT) { |
_ulong=va_arg(ap, unsigned long); |
} else { |
register unsigned int _d; |
_d=va_arg(ap, unsigned int); |
_ulong = flags&SHORTINT ? (unsigned long)(unsigned short)_d : (unsigned long)_d; |
} |
} |
#ifndef LIGHTPRINTF |
if(ch==' ') { |
/* |
* ``If the space and + flags both appear, the space |
* flag will be ignored.'' |
* -- ANSI X3J11 |
*/ |
if (!sign) |
sign = ' '; |
goto rflag; |
} else if (ch=='#') { |
flags |= ALT; |
goto rflag; |
} else if (ch=='*'||ch=='-') { |
if (ch=='*') { |
/* |
* ``A negative field width argument is taken as a |
* - flag followed by a positive field width.'' |
* -- ANSI X3J11 |
* They don't exclude field widths read from args. |
*/ |
if ((width = va_arg(ap, int)) >= 0) |
goto rflag; |
width = -width; |
} |
flags |= LADJUST; |
flags &= ~ZEROPAD; /* '-' disables '0' */ |
goto rflag; |
} else if (ch=='+') { |
sign = '+'; |
goto rflag; |
} else if (ch=='.') { |
if ((ch = PRG_RDB(fmt++)) == '*') { |
n = va_arg(ap, int); |
prec = n < 0 ? -1 : n; |
goto rflag; |
} |
n = 0; |
while (is_digit(ch)) { |
n = n*10 + to_digit(ch); |
ch = PRG_RDB(fmt++); |
} |
prec = n < 0 ? -1 : n; |
goto reswitch; |
} else |
#endif /* LIGHTPRINTF */ |
if (ch=='0') { |
/* |
* ``Note that 0 is taken as a flag, not as the |
* beginning of a field width.'' |
* -- ANSI X3J11 |
*/ |
if (!(flags & LADJUST)) |
flags |= ZEROPAD; /* '-' disables '0' */ |
goto rflag; |
} else if (ch>='1' && ch<='9') { |
n = 0; |
do { |
n = 10 * n + to_digit(ch); |
ch = PRG_RDB(fmt++); |
} while (is_digit(ch)); |
width = n; |
goto reswitch; |
} else if (ch=='h') { |
flags |= SHORTINT; |
goto rflag; |
} else if (ch=='l') { |
flags |= LONGINT; |
goto rflag; |
} else if (ch=='c') { |
*(cp = buf) = va_arg(ap, int); |
size = 1; |
sign = '\0'; |
} else if (ch=='D'||ch=='d'||ch=='i') { |
if(ch=='D') |
flags |= LONGINT; |
if (flags&LONGINT) { |
_ulong=va_arg(ap, long); |
} else { |
register int _d; |
_d=va_arg(ap, int); |
_ulong = flags&SHORTINT ? (long)(short)_d : (long)_d; |
} |
if ((long)_ulong < 0) { |
_ulong = -_ulong; |
sign = '-'; |
} |
base = DEC; |
goto number; |
} else |
/* |
if (ch=='n') { |
if (flags & LONGINT) |
*va_arg(ap, long *) = ret; |
else if (flags & SHORTINT) |
*va_arg(ap, short *) = ret; |
else |
*va_arg(ap, int *) = ret; |
continue; // no output |
} else |
*/ |
#ifndef LIGHTPRINTF |
if (ch=='O'||ch=='o') { |
if (ch=='O') |
flags |= LONGINT; |
base = OCT; |
goto nosign; |
} else if (ch=='p') { |
/* |
* ``The argument shall be a pointer to void. The |
* value of the pointer is converted to a sequence |
* of printable characters, in an implementation- |
* defined manner.'' |
* -- ANSI X3J11 |
*/ |
/* NOSTRICT */ |
_ulong = (unsigned int)va_arg(ap, void *); |
base = HEX; |
flags |= HEXPREFIX; |
ch = 'x'; |
goto nosign; |
} else if (ch=='s') { // print a string from RAM |
if ((cp = va_arg(ap, char *)) == NULL) { |
cp=buf; |
cp[0] = '('; |
cp[1] = 'n'; |
cp[2] = 'u'; |
cp[4] = cp[3] = 'l'; |
cp[5] = ')'; |
cp[6] = '\0'; |
} |
if (prec >= 0) { |
/* |
* can't use strlen; can only look for the |
* NUL in the first `prec' characters, and |
* strlen() will go further. |
*/ |
char *p = (char*)memchr(cp, 0, prec); |
if (p != NULL) { |
size = p - cp; |
if (size > prec) |
size = prec; |
} else |
size = prec; |
} else |
size = strlen(cp); |
sign = '\0'; |
} else |
#endif /* LIGHTPRINTF */ |
if(ch=='U'||ch=='u') { |
if (ch=='U') |
flags |= LONGINT; |
base = DEC; |
goto nosign; |
} else if (ch=='X'||ch=='x') { |
base = HEX; |
/* leading 0x/X only if non-zero */ |
if (flags & ALT && _ulong != 0) |
flags |= HEXPREFIX; |
/* unsigned conversions */ |
nosign: sign = '\0'; |
/* |
* ``... diouXx conversions ... if a precision is |
* specified, the 0 flag will be ignored.'' |
* -- ANSI X3J11 |
*/ |
number: if ((dprec = prec) >= 0) |
flags &= ~ZEROPAD; |
/* |
* ``The result of converting a zero value with an |
* explicit precision of zero is no characters.'' |
* -- ANSI X3J11 |
*/ |
cp = buf + BUF; |
if (_ulong != 0 || prec != 0) { |
register unsigned char _d,notlastdigit; |
do { |
notlastdigit=(_ulong>=base); |
_d = _ulong % base; |
if (_d<10) { |
_d+='0'; |
} else { |
_d+='a'-10; |
if (ch=='X') _d&=~0x20; |
} |
*--cp=_d; |
_ulong /= base; |
} while (notlastdigit); |
#ifndef LIGHTPRINTF |
// handle octal leading 0 |
if (base==OCT && flags & ALT && *cp != '0') |
*--cp = '0'; |
#endif |
} |
size = buf + BUF - cp; |
} else { //default |
/* "%?" prints ?, unless ? is NUL */ |
if (ch == '\0') |
goto done; |
/* pretend it was %c with argument ch */ |
cp = buf; |
*cp = ch; |
size = 1; |
sign = '\0'; |
} |
/* |
* All reasonable formats wind up here. At this point, |
* `cp' points to a string which (if not flags&LADJUST) |
* should be padded out to `width' places. If |
* flags&ZEROPAD, it should first be prefixed by any |
* sign or other prefix; otherwise, it should be blank |
* padded before the prefix is emitted. After any |
* left-hand padding and prefixing, emit zeroes |
* required by a decimal [diouxX] precision, then print |
* the string proper, then emit zeroes required by any |
* leftover floating precision; finally, if LADJUST, |
* pad with blanks. |
*/ |
/* |
* compute actual size, so we know how much to pad. |
*/ |
fieldsz = size; |
dpad = dprec - size; |
if (dpad < 0) |
dpad = 0; |
if (sign) |
fieldsz++; |
else if (flags & HEXPREFIX) |
fieldsz += 2; |
fieldsz += dpad; |
/* right-adjusting blank padding */ |
if ((flags & (LADJUST|ZEROPAD)) == 0) |
PAD_SP(width - fieldsz); |
/* prefix */ |
if (sign) { |
PRINT(&sign, 1); |
} else if (flags & HEXPREFIX) { |
ox[0] = '0'; |
ox[1] = ch; |
PRINT(ox, 2); |
} |
/* right-adjusting zero padding */ |
if ((flags & (LADJUST|ZEROPAD)) == ZEROPAD) |
PAD_0(width - fieldsz); |
/* leading zeroes from decimal precision */ |
PAD_0(dpad); |
/* the string or number proper */ |
PRINT(cp, size); |
/* left-adjusting padding (always blank) */ |
if (flags & LADJUST) |
PAD_SP(width - fieldsz); |
} |
done: |
va_end(ap); |
} |
/branches/salvo_gps/Basis_V0066c/trunk/printf_P.h |
---|
0,0 → 1,19 |
#ifndef _PRINTF_P_H_ |
#define _PRINTF_P_H_ |
#include <avr/pgmspace.h> |
#define OUT_V24 0 |
#define OUT_LCD 1 |
void _printf_P (char, char const *fmt0, ...); |
extern char PrintZiel; |
#define printf_P(format, args...) _printf_P(OUT_V24,format , ## args) |
#define printf(format, args...) _printf_P(OUT_V24,PSTR(format) , ## args) |
#define LCD_printfxy(x,y,format, args...) { DispPtr = y * 20 + x; _printf_P(OUT_LCD,PSTR(format) , ## args);} |
#define LCD_printf(format, args...) { _printf_P(OUT_LCD,PSTR(format) , ## args);} |
#endif |
/branches/salvo_gps/Basis_V0066c/trunk/rc.c |
---|
0,0 → 1,85 |
/*####################################################################################### |
Decodieren eines RC Summen Signals |
#######################################################################################*/ |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "rc.h" |
#include "main.h" |
volatile int PPM_in[11]; |
volatile int PPM_diff[11]; // das diffenzierte Stick-Signal |
volatile unsigned char NewPpmData = 1; |
//############################################################################ |
//zum decodieren des PPM-Signals wird Timer1 mit seiner Input |
//Capture Funktion benutzt: |
void rc_sum_init (void) |
//############################################################################ |
{ |
TCCR1B=(1<<CS11)|(1<<CS10)|(1<<ICES1)|(1<<ICNC1);//|(1 << WGM12); //timer1 prescale 64 |
// PWM |
//TCCR1A = (1 << COM1B1) | (1 << WGM11) | (1 << WGM10); |
//TCCR1B |= (1 << WGM12); |
//OCR1B = 55; |
TIMSK1 |= _BV(ICIE1); |
AdNeutralGier = 0; |
AdNeutralRoll = 0; |
AdNeutralNick = 0; |
return; |
} |
//############################################################################ |
//Diese Routine startet und inizialisiert den Timer für RC |
SIGNAL(SIG_INPUT_CAPTURE1) |
//############################################################################ |
{ |
static unsigned int AltICR=0; |
signed int signal = 0,tmp; |
static int index; |
signal = (unsigned int) ICR1 - AltICR; |
AltICR = ICR1; |
//Syncronisationspause? |
if ((signal > 1500) && (signal < 8000)) |
{ |
index = 1; |
NewPpmData = 0; // Null bedeutet: Neue Daten |
// OCR2A = Poti2/2 + 80; |
} |
else |
{ |
if(index < 10) |
{ |
if((signal > 250) && (signal < 687)) |
{ |
signal -= 466; |
// Stabiles Signal |
if(abs(signal - PPM_in[index]) < 6) { if(SenderOkay < 200) SenderOkay += 10;} |
tmp = (3 * (PPM_in[index]) + signal) / 4; |
// if(tmp > signal+1) tmp--; else |
// if(tmp < signal-1) tmp++; |
PPM_diff[index] = tmp - PPM_in[index]; |
PPM_in[index] = tmp; |
} |
index++; |
if(index == 5) PORTD |= 0x20; else PORTD &= ~0x20; // Servosignal an J3 anlegen |
if(index == 6) PORTD |= 0x10; else PORTD &= ~0x10; // Servosignal an J4 anlegen |
if(index == 7) PORTD |= 0x08; else PORTD &= ~0x08; // Servosignal an J5 anlegen |
} |
} |
} |
/branches/salvo_gps/Basis_V0066c/trunk/rc.h |
---|
0,0 → 1,29 |
/*####################################################################################### |
Derkodieren eines RC Summen Signals |
#######################################################################################*/ |
#ifndef _RC_H |
#define _RC_H |
#if defined (__AVR_ATmega32__) |
#define TIMER_TEILER CK64 |
#define TIMER_RELOAD_VALUE 250 |
#endif |
#if defined (__AVR_ATmega644__) |
//#define TIMER_TEILER CK64 |
#define TIMER_RELOAD_VALUE 250 |
//#define TIMER_TEILER CK256 // bei 20MHz |
//#define TIMER_RELOAD_VALUE -78 // bei 20MHz |
#endif |
#define GAS PPM_in[2] |
extern void rc_sum_init (void); |
extern volatile int PPM_in[11]; |
extern volatile int PPM_diff[11]; // das diffenzierte Stick-Signal |
extern volatile unsigned char NewPpmData; |
#endif //_RC_H |
/branches/salvo_gps/Basis_V0066c/trunk/spi.c |
---|
0,0 → 1,86 |
// ######################## SPI - FlightCtrl ################### |
#include "main.h" |
struct str_ToNaviCtrl ToNaviCtrl; |
struct str_FromNaviCtrl FromNaviCtrl; |
unsigned char SPI_BufferIndex; |
volatile unsigned char SPI_Buffer[sizeof(FromNaviCtrl)]; |
unsigned char *Ptr_buffer = (unsigned char *) &ToNaviCtrl; |
//------------------------------------------------------ |
void SPI_MasterInit(void) |
{ |
DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK); // Set MOSI and SCK output, all others input |
SLAVE_SELECT_DDR_PORT |= (1 << SPI_SLAVE_SELECT); |
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(0<<SPIE); // Enable SPI, Master, set clock rate fck/64 |
SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); |
} |
//------------------------------------------------------ |
void SPI_StartTransmitPacket(void) |
{ |
if ((SLAVE_SELECT_PORT & (1 << SPI_SLAVE_SELECT)) == 0) return; // transfer of prev. packet not completed |
SLAVE_SELECT_PORT &= ~(1 << SPI_SLAVE_SELECT); // SelectSlave |
UpdateSPI_Buffer(); // update buffer |
SPI_BufferIndex = 1; |
DebugOut.Analog[16]++; |
// -- Debug-Output --- |
cli(); |
DebugOut.Analog[20] = FromNaviCtrl.Comp; |
DebugOut.Analog[21] = FromNaviCtrl.GPS_Nick; |
DebugOut.Analog[22] = FromNaviCtrl.GPS_Roll; |
DebugOut.Analog[23] = FromNaviCtrl.CompassValue; |
sei(); |
//---- |
SPDR = ToNaviCtrl.Comp; // Start transmission |
} |
//------------------------------------------------------ |
//SIGNAL(SIG_SPI) |
void SPI_TransmitByte(void) |
{ |
if (!(SPSR & (1 << SPIF))) return; |
if (SPI_BufferIndex < sizeof(FromNaviCtrl)) |
{ SPI_Buffer[SPI_BufferIndex]= SPDR; // get data |
//if(SPDR!= 0x00) DebugOut.Analog[19]++; ; |
} |
if (SPI_BufferIndex < sizeof(ToNaviCtrl)) |
{ SPDR = Ptr_buffer[SPI_BufferIndex]; |
} |
else |
{ |
unsigned char *ptr = (unsigned char *)&FromNaviCtrl; |
unsigned char i; |
SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
memcpy(ptr, (unsigned char *) SPI_Buffer, sizeof(SPI_Buffer)); |
} |
SPI_BufferIndex++; |
} |
//------------------------------------------------------ |
void UpdateSPI_Buffer(void) |
{ |
cli(); |
ToNaviCtrl.Comp = SPI_PROTOCOL_COMP; |
ToNaviCtrl.IntegralNick = (int) (IntegralNick >> 4); |
ToNaviCtrl.IntegralRoll = (int) (IntegralRoll >> 4); |
ToNaviCtrl.StickNick = (char) StickNick; |
ToNaviCtrl.StickRoll = (char) StickRoll; |
ToNaviCtrl.StickGier = (char) StickGier; |
sei(); |
} |
/branches/salvo_gps/Basis_V0066c/trunk/spi.h |
---|
0,0 → 1,46 |
// ######################## SPI - FlightCtrl ################### |
#ifndef _SPI_H |
#define _SPI_H |
#define SPI_PROTOCOL_COMP 1 |
//----------------------------------------- |
#define DDR_SPI DDRB |
#define DD_SS PB4 |
#define DD_SCK PB7 |
#define DD_MOSI PB5 |
#define DD_MISO PB6 |
#define SLAVE_SELECT_DDR_PORT DDRC |
#define SLAVE_SELECT_PORT PORTC |
#define SPI_SLAVE_SELECT PC5 |
struct str_ToNaviCtrl |
{ |
unsigned char Comp; |
int IntegralNick; |
int IntegralRoll; |
char StickNick,StickRoll,StickGier; |
}; |
struct str_FromNaviCtrl |
{ |
unsigned char Comp; |
int GPS_Nick; |
int GPS_Roll; |
int CompassValue; |
}; |
extern struct str_ToNaviCtrl ToNaviCtrl; |
extern struct str_FromNaviCtrl FromNaviCtrl; |
extern void SPI_MasterInit(void); |
extern void SPI_StartTransmitPacket(void); |
extern void UpdateSPI_Buffer(void); |
extern void SPI_TransmitByte(void); |
#endif |
/branches/salvo_gps/Basis_V0066c/trunk/timer0.c |
---|
0,0 → 1,193 |
#include "main.h" |
volatile unsigned int CountMilliseconds = 0; |
volatile static unsigned int tim_main; |
volatile unsigned char UpdateMotor = 0; |
volatile unsigned int cntKompass = 0; |
volatile unsigned int beeptime = 0; |
unsigned int BeepMuster = 0xffff; |
int ServoValue = 0; |
//Salvo 8.9.2007 |
volatile uint8_t Kompass_Neuer_Wert= 0; |
volatile unsigned int Kompass_Value_Old = 0; |
// Salvo End |
//Salvo 21.9.2007 |
short unsigned int Kompass_present= 0; //>0 bedeutet dass der Kompass vorhanden ist |
// Salvo End |
enum { |
STOP = 0, |
CK = 1, |
CK8 = 2, |
CK64 = 3, |
CK256 = 4, |
CK1024 = 5, |
T0_FALLING_EDGE = 6, |
T0_RISING_EDGE = 7 |
}; |
// Aenderungen von Peter Muehlenbrock ("Salvo") Stand 21.9.2007 |
/* |
Driftkompensation fuer Gyros verbessert |
Linearsensor mit fixem Neutralwert |
Ersatzkompass abgeleitet aus Magnetkompass und Giergyro fuer nahezu neigungsubhaengige Kompassfunktion |
*/ |
SIGNAL (SIG_OVERFLOW0) // 8kHz |
{ |
static unsigned char cnt_1ms = 1,cnt = 0; |
unsigned char pieper_ein = 0; |
// TCNT0 -= 250;//TIMER_RELOAD_VALUE; |
if(!cnt--) |
{ |
if (Kompass_present > 0) Kompass_present--; //Runterzaehlen. Wenn 0 ist der Kompass nicht vorhanden |
cnt = 9; |
cnt_1ms++; |
cnt_1ms %= 2; |
if(!cnt_1ms) UpdateMotor = 1; |
CountMilliseconds++; |
} |
if(beeptime > 1) |
{ |
beeptime--; |
if(beeptime & BeepMuster) |
{ |
pieper_ein = 1; |
} |
else pieper_ein = 0; |
} |
else |
{ |
pieper_ein = 0; |
BeepMuster = 0xffff; |
} |
if(pieper_ein) |
{ |
if(PlatinenVersion == 10) PORTD |= (1<<2); // Speaker an PORTD.2 |
else PORTC |= (1<<7); // Speaker an PORTC.7 |
} |
else |
{ |
if(PlatinenVersion == 10) PORTD &= ~(1<<2); |
else PORTC &= ~(1<<7); |
} |
// if(EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV) |
{ |
if(PINC & 0x10) |
{ |
cntKompass++; |
} |
else |
{ |
if((cntKompass) && (cntKompass < 4000)) |
{ |
// Salvo Kompassoffset 30.8.2007 und 21.9.2007 *********** |
Kompass_present = 255; |
Kompass_Value_Old = KompassValue; |
KompassValue = cntKompass -KOMPASS_OFFSET; |
if (KompassValue < 0) |
{ |
KompassValue += 360; |
} |
if (KompassValue >= 360) |
{ |
KompassValue -= 360; |
} |
// Salvo End |
} |
// if(cntKompass < 10) cntKompass = 10; |
// KompassValue = (unsigned long)((unsigned long)(cntKompass-10)*720L + 1L) / 703L; |
KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180; |
//Salvo 13.9.2007 Ok Erkennung des Magnetkompasses |
Kompass_Neuer_Wert = 1; |
// Salvo End |
cntKompass = 0; |
} |
} |
} |
void Timer_Init(void) |
{ |
tim_main = SetDelay(10); |
TCCR0B = CK8; |
TCCR0A = (1<<COM0A1)|(1<<COM0B1)|3;//fast PWM |
OCR0A = 0; |
OCR0B = 120; |
TCNT0 = (unsigned char)-TIMER_RELOAD_VALUE; // reload |
//OCR1 = 0x00; |
TCCR2A=(1<<COM2A1)|(1<<COM2A0)|3; |
TCCR2B=(0<<CS20)|(1<<CS21)|(1<<CS22); |
// TIMSK2 |= _BV(TOIE2); |
TIMSK2 |= _BV(OCIE2A); |
TIMSK0 |= _BV(TOIE0); |
OCR2A = 10; |
TCNT2 = 0; |
} |
// ----------------------------------------------------------------------- |
unsigned int SetDelay (unsigned int t) |
{ |
// TIMSK0 &= ~_BV(TOIE0); |
return(CountMilliseconds + t + 1); |
// TIMSK0 |= _BV(TOIE0); |
} |
// ----------------------------------------------------------------------- |
char CheckDelay(unsigned int t) |
{ |
// TIMSK0 &= ~_BV(TOIE0); |
return(((t - CountMilliseconds) & 0x8000) >> 9); |
// TIMSK0 |= _BV(TOIE0); |
} |
// ----------------------------------------------------------------------- |
void Delay_ms(unsigned int w) |
{ |
unsigned int akt; |
akt = SetDelay(w); |
while (!CheckDelay(akt)); |
} |
void Delay_ms_Mess(unsigned int w) |
{ |
unsigned int akt; |
akt = SetDelay(w); |
while (!CheckDelay(akt)) ANALOG_ON; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Servo ansteuern |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
SIGNAL(SIG_OUTPUT_COMPARE2A) |
{ |
static unsigned char timer = 10; |
if(!timer--) |
{ |
TCCR2A=(1<<COM2A1)|(0<<COM2A0)|3; |
ServoValue = Parameter_ServoNickControl; |
if(EE_Parameter.ServoNickCompInvert & 0x01) ServoValue += ((long) EE_Parameter.ServoNickComp * (IntegralNick / 128)) / 512; |
else ServoValue -= ((long) EE_Parameter.ServoNickComp * (IntegralNick / 128)) / 512; |
if(ServoValue < EE_Parameter.ServoNickMin) ServoValue = EE_Parameter.ServoNickMin; |
else if(ServoValue > EE_Parameter.ServoNickMax) ServoValue = EE_Parameter.ServoNickMax; |
OCR2A = ServoValue;// + 75; |
timer = EE_Parameter.ServoNickRefresh; |
} |
else |
{ |
TCCR2A =3; |
PORTD&=~0x80; |
} |
} |
/branches/salvo_gps/Basis_V0066c/trunk/timer0.h |
---|
0,0 → 1,26 |
#define TIMER_TEILER CK8 |
#define TIMER_RELOAD_VALUE 250 |
// Salvo Kompassoffset 31.8.2007 *********** |
#define KOMPASS_OFFSET 135 // Winkel zwischen Nordachse Kopter und Nordachse Kompass |
// Salvo End |
void Timer_Init(void); |
void Delay_ms(unsigned int); |
void Delay_ms_Mess(unsigned int); |
unsigned int SetDelay (unsigned int t); |
char CheckDelay (unsigned int t); |
extern volatile unsigned int CountMilliseconds; |
extern volatile unsigned char UpdateMotor; |
extern volatile unsigned int beeptime; |
extern volatile unsigned int cntKompass; |
extern int ServoValue; |
extern unsigned int BeepMuster; |
//Salvo 21.9.2007 |
extern volatile uint8_t Kompass_Neuer_Wert; |
extern volatile unsigned int Kompass_Value_Old; |
extern unsigned short int Kompass_present; |
// Salvo End |
/branches/salvo_gps/Basis_V0066c/trunk/twimaster.c |
---|
0,0 → 1,152 |
/*############################################################################ |
############################################################################*/ |
#include "main.h" |
unsigned char twi_state = 0; |
unsigned char motor = 0; |
unsigned char motorread = 0; |
unsigned char motor_rx[8]; |
//############################################################################ |
//Initzialisieren der I2C (TWI) Schnittstelle |
void i2c_init(void) |
//############################################################################ |
{ |
TWSR = 0; |
TWBR = ((SYSCLK/SCL_CLOCK)-16)/2; |
} |
//############################################################################ |
//Start I2C |
char i2c_start(void) |
//############################################################################ |
{ |
TWCR = (1<<TWSTA) | (1<<TWEN) | (1<<TWINT) | (1<<TWIE); |
return(0); |
} |
//############################################################################ |
//Start I2C |
void i2c_stop(void) |
//############################################################################ |
{ |
TWCR = (1<<TWEN) | (1<<TWSTO) | (1<<TWINT); |
} |
void i2c_reset(void) |
//############################################################################ |
{ |
i2c_stop(); |
twi_state = 0; |
motor = TWDR; |
motor = 0; |
TWCR = 0x80; |
TWAMR = 0; |
TWAR = 0; |
TWDR = 0; |
TWSR = 0; |
TWBR = 0; |
i2c_init(); |
i2c_start(); |
i2c_write_byte(0); |
} |
//############################################################################ |
//Start I2C |
char i2c_write_byte(char byte) |
//############################################################################ |
{ |
TWSR = 0x00; |
TWDR = byte; |
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE); |
return(0); |
} |
//############################################################################ |
//Start I2C |
SIGNAL (TWI_vect) |
//############################################################################ |
{ |
switch (twi_state++) |
{ |
case 0: |
i2c_write_byte(0x52+(motor*2)); |
break; |
case 1: |
switch(motor++) |
{ |
case 0: |
i2c_write_byte(Motor_Vorne); |
break; |
case 1: |
i2c_write_byte(Motor_Hinten); |
break; |
case 2: |
i2c_write_byte(Motor_Rechts); |
break; |
case 3: |
i2c_write_byte(Motor_Links); |
break; |
} |
break; |
case 2: |
i2c_stop(); |
if (motor<4) twi_state = 0; |
else motor = 0; |
i2c_start(); |
break; |
//Liest Daten von Motor |
case 3: |
i2c_write_byte(0x53+(motorread*2)); |
break; |
case 4: |
switch(motorread) |
{ |
case 0: |
i2c_write_byte(Motor_Vorne); |
break; |
case 1: |
i2c_write_byte(Motor_Hinten); |
break; |
case 2: |
i2c_write_byte(Motor_Rechts); |
break; |
case 3: |
i2c_write_byte(Motor_Links); |
break; |
} |
break; |
case 5: //1 Byte vom Motor lesen |
motor_rx[motorread] = TWDR; |
case 6: |
switch(motorread) |
{ |
case 0: |
i2c_write_byte(Motor_Vorne); |
break; |
case 1: |
i2c_write_byte(Motor_Hinten); |
break; |
case 2: |
i2c_write_byte(Motor_Rechts); |
break; |
case 3: |
i2c_write_byte(Motor_Links); |
break; |
} |
break; |
case 7: //2 Byte vom Motor lesen |
motor_rx[motorread+4] = TWDR; |
motorread++; |
if (motorread>3) motorread=0; |
i2c_stop(); |
I2CTimeout = 10; |
twi_state = 0; |
} |
TWCR |= 0x80; |
} |
/branches/salvo_gps/Basis_V0066c/trunk/twimaster.h |
---|
0,0 → 1,33 |
/*############################################################################ |
############################################################################*/ |
#ifndef _I2C_MASTER_H |
#define _I2C_MASTER_H |
//############################################################################ |
// I2C Konstanten |
#define SCL_CLOCK 200000L |
#define I2C_TIMEOUT 30000 |
#define I2C_START 0x08 |
#define I2C_REPEATED_START 0x10 |
#define I2C_TX_SLA_ACK 0x18 |
#define I2C_TX_DATA_ACK 0x28 |
#define I2C_RX_SLA_ACK 0x40 |
#define I2C_RX_DATA_ACK 0x50 |
//############################################################################ |
extern unsigned char twi_state; |
extern unsigned char motor; |
extern unsigned char motorread; |
extern unsigned char motor_rx[8]; |
void i2c_reset(void); |
extern void i2c_init (void); // I2C initialisieren |
extern char i2c_start (void); // Start I2C |
extern void i2c_stop (void); // Stop I2C |
extern char i2c_write_byte (char byte); // 1 Byte schreiben |
extern void i2c_reset(void); |
#endif |
/branches/salvo_gps/Basis_V0066c/trunk/uart.c |
---|
0,0 → 1,343 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
#include "uart.h" |
unsigned char DebugGetAnforderung = 0,DebugDisplayAnforderung = 0,DebugDataAnforderung = 0,GetVersionAnforderung = 0; |
unsigned volatile char SioTmp = 0; |
unsigned volatile char SendeBuffer[MAX_SENDE_BUFF]; |
unsigned volatile char RxdBuffer[MAX_EMPFANGS_BUFF]; |
unsigned volatile char NMEABuffer[MAX_EMPFANGS_BUFF]; |
unsigned volatile char NeuerDatensatzEmpfangen = 0; |
unsigned volatile char NeueKoordinateEmpfangen = 0; |
unsigned volatile char UebertragungAbgeschlossen = 1; |
unsigned volatile char CntCrcError = 0; |
unsigned volatile char AnzahlEmpfangsBytes = 0; |
unsigned volatile char PC_DebugTimeout = 0; |
unsigned char NurKanalAnforderung = 0; |
unsigned char PcZugriff = 100; |
unsigned char MotorTest[4] = {0,0,0,0}; |
unsigned char MeineSlaveAdresse; |
struct str_DebugOut DebugOut; |
struct str_Debug DebugIn; |
struct str_VersionInfo VersionInfo; |
int Debug_Timer; |
//Salvo 26.10.2007 |
int dataset_cnt=0; //Zahelt die uebertragenen Debugdaten |
//Salvo End |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ Sende-Part der Datenübertragung |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
SIGNAL(INT_VEC_TX) |
{ |
static unsigned int ptr = 0; |
unsigned char tmp_tx; |
if(!UebertragungAbgeschlossen) |
{ |
ptr++; // die [0] wurde schon gesendet |
tmp_tx = SendeBuffer[ptr]; |
if((tmp_tx == '\r') || (ptr == MAX_SENDE_BUFF)) |
{ |
ptr = 0; |
UebertragungAbgeschlossen = 1; |
} |
UDR = tmp_tx; |
} |
else ptr = 0; |
} |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ 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; |
//Salvo 11.9.2007 GPS Daten holen |
Get_Ublox_Msg(SioTmp); // Daten vom GPS Modul holen |
// Salvo End |
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; |
} |
} |
// -------------------------------------------------------------------------- |
void AddCRC(unsigned int wieviele) |
{ |
unsigned int tmpCRC = 0,i; |
for(i = 0; i < wieviele;i++) |
{ |
tmpCRC += SendeBuffer[i]; |
} |
tmpCRC %= 4096; |
SendeBuffer[i++] = '=' + tmpCRC / 64; |
SendeBuffer[i++] = '=' + tmpCRC % 64; |
SendeBuffer[i++] = '\r'; |
UebertragungAbgeschlossen = 0; |
UDR = SendeBuffer[0]; |
} |
// -------------------------------------------------------------------------- |
void SendOutData(unsigned char cmd,unsigned char modul, unsigned char *snd, unsigned char len) |
{ |
unsigned int pt = 0; |
unsigned char a,b,c; |
unsigned char ptr = 0; |
SendeBuffer[pt++] = '#'; // Startzeichen |
SendeBuffer[pt++] = modul; // Adresse (a=0; b=1,...) |
SendeBuffer[pt++] = cmd; // Commando |
while(len) |
{ |
if(len) { a = snd[ptr++]; len--;} else a = 0; |
if(len) { b = snd[ptr++]; len--;} else b = 0; |
if(len) { c = snd[ptr++]; len--;} else c = 0; |
SendeBuffer[pt++] = '=' + (a >> 2); |
SendeBuffer[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4)); |
SendeBuffer[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6)); |
SendeBuffer[pt++] = '=' + ( c & 0x3f); |
} |
AddCRC(pt); |
} |
// -------------------------------------------------------------------------- |
void Decode64(unsigned char *ptrOut, unsigned char len, unsigned char ptrIn,unsigned char max) // Wohin mit den Daten; Wie lang; Wo im RxdBuffer |
{ |
unsigned char a,b,c,d; |
unsigned char ptr = 0; |
unsigned char x,y,z; |
while(len) |
{ |
a = RxdBuffer[ptrIn++] - '='; |
b = RxdBuffer[ptrIn++] - '='; |
c = RxdBuffer[ptrIn++] - '='; |
d = RxdBuffer[ptrIn++] - '='; |
if(ptrIn > max - 2) break; // nicht mehr Daten verarbeiten, als empfangen wurden |
x = (a << 2) | (b >> 4); |
y = ((b & 0x0f) << 4) | (c >> 2); |
z = ((c & 0x03) << 6) | d; |
if(len--) ptrOut[ptr++] = x; else break; |
if(len--) ptrOut[ptr++] = y; else break; |
if(len--) ptrOut[ptr++] = z; else break; |
} |
} |
// -------------------------------------------------------------------------- |
void BearbeiteRxDaten(void) |
{ |
if(!NeuerDatensatzEmpfangen) return; |
// unsigned int tmp_int_arr1[1]; |
// unsigned int tmp_int_arr2[2]; |
// unsigned int tmp_int_arr3[3]; |
unsigned char tmp_char_arr2[2]; |
// unsigned char tmp_char_arr3[3]; |
// unsigned char tmp_char_arr4[4]; |
//if(!MotorenEin) |
PcZugriff = 255; |
switch(RxdBuffer[2]) |
{ |
case 'c':// Debugdaten incl. Externe IOs usw |
Decode64((unsigned char *) &DebugIn,sizeof(DebugIn),3,AnzahlEmpfangsBytes); |
/* for(unsigned char i=0; i<4;i++) |
{ |
EE_CheckAndWrite(&EE_Buffer[EE_DEBUGWERTE + i*2], DebugIn.Analog[i]); |
EE_CheckAndWrite(&EE_Buffer[EE_DEBUGWERTE + i*2 + 1], DebugIn.Analog[i] >> 8); |
}*/ |
RemoteTasten |= DebugIn.RemoteTasten; |
DebugDataAnforderung = 1; |
break; |
case 'h':// x-1 Displayzeilen |
Decode64((unsigned char *) &tmp_char_arr2[0],sizeof(tmp_char_arr2),3,AnzahlEmpfangsBytes); |
RemoteTasten |= tmp_char_arr2[0]; |
if(tmp_char_arr2[1] == 255) NurKanalAnforderung = 1; else NurKanalAnforderung = 0; // keine Displaydaten |
DebugDisplayAnforderung = 1; |
break; |
case 't':// Motortest |
Decode64((unsigned char *) &MotorTest[0],sizeof(MotorTest),3,AnzahlEmpfangsBytes); |
break; |
case 'v': // Version-Anforderung und Ausbaustufe |
GetVersionAnforderung = 1; |
break; |
case 'g':// "Get"-Anforderung für Debug-Daten |
// Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
DebugGetAnforderung = 1; |
break; |
case 'q':// "Get"-Anforderung für Settings |
// Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
Decode64((unsigned char *) &tmp_char_arr2[0],sizeof(tmp_char_arr2),3,AnzahlEmpfangsBytes); |
if(tmp_char_arr2[0] != 0xff) |
{ |
if(tmp_char_arr2[0] > 5) tmp_char_arr2[0] = 5; |
ReadParameterSet(tmp_char_arr2[0], (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
SendOutData('L' + tmp_char_arr2[0] -1,MeineSlaveAdresse,(unsigned char *) &EE_Parameter.Kanalbelegung[0],STRUCT_PARAM_LAENGE); |
} |
else |
SendOutData('L' + GetActiveParamSetNumber()-1,MeineSlaveAdresse,(unsigned char *) &EE_Parameter.Kanalbelegung[0],STRUCT_PARAM_LAENGE); |
break; |
case 'l': |
case 'm': |
case 'n': |
case 'o': |
case 'p': // Parametersatz speichern |
Decode64((unsigned char *) &EE_Parameter.Kanalbelegung[0],STRUCT_PARAM_LAENGE,3,AnzahlEmpfangsBytes); |
WriteParameterSet(RxdBuffer[2] - 'l' + 1, (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], RxdBuffer[2] - 'l' + 1); // aktiven Datensatz merken |
Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L; |
Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagRoll * 2500L; |
Piep(GetActiveParamSetNumber()); |
break; |
} |
// DebugOut.AnzahlZyklen = Debug_Timer_Intervall; |
NeuerDatensatzEmpfangen = 0; |
} |
//############################################################################ |
//Routine für die Serielle Ausgabe |
int uart_putchar (char c) |
//############################################################################ |
{ |
if (c == '\n') |
uart_putchar('\r'); |
//Warten solange bis Zeichen gesendet wurde |
loop_until_bit_is_set(USR, UDRE); |
//Ausgabe des Zeichens |
UDR = c; |
return (0); |
} |
// -------------------------------------------------------------------------- |
void WriteProgramData(unsigned int pos, unsigned char wert) |
{ |
//if (ProgramLocation == IN_RAM) Buffer[pos] = wert; |
// else eeprom_write_byte(&EE_Buffer[pos], wert); |
// Buffer[pos] = wert; |
} |
//############################################################################ |
//INstallation der Seriellen Schnittstelle |
void UART_Init (void) |
//############################################################################ |
{ |
//Enable TXEN im Register UCR TX-Data Enable & RX Enable |
UCR=(1 << TXEN) | (1 << RXEN); |
// UART Double Speed (U2X) |
USR |= (1<<U2X); |
// RX-Interrupt Freigabe |
UCSRB |= (1<<RXCIE); |
// TX-Interrupt Freigabe |
UCSRB |= (1<<TXCIE); |
//Teiler wird gesetzt |
UBRR=(SYSCLK / (BAUD_RATE * 8L) - 1); |
//UBRR = 33; |
//öffnet einen Kanal für printf (STDOUT) |
//fdevopen (uart_putchar, 0); |
//sbi(PORTD,4); |
Debug_Timer = SetDelay(200); |
} |
//--------------------------------------------------------------------------------------------- |
void DatenUebertragung(void) |
{ |
static char dis_zeile = 0; |
if(!UebertragungAbgeschlossen) return; |
if(DebugGetAnforderung && UebertragungAbgeschlossen) // Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
{ |
SendOutData('G',MeineSlaveAdresse,(unsigned char *) &DebugIn,sizeof(DebugIn)); |
DebugGetAnforderung = 0; |
} |
if((CheckDelay(Debug_Timer) || DebugDataAnforderung) && UebertragungAbgeschlossen) |
{ |
SendOutData('D',MeineSlaveAdresse,(unsigned char *) &DebugOut,sizeof(DebugOut)); |
DebugDataAnforderung = 0; |
//Salvo 26.10.2007 Counter fuer Erkennung von fehlenden Daten per Bluetoothuebertragung |
dataset_cnt++; |
// Salvo End |
Debug_Timer = SetDelay(MIN_DEBUG_INTERVALL); |
} |
if(DebugDisplayAnforderung && UebertragungAbgeschlossen) |
{ |
Menu(); |
DebugDisplayAnforderung = 0; |
if(++dis_zeile == 4 || NurKanalAnforderung) |
{ |
SendOutData('4',0,(unsigned char *)&PPM_in,sizeof(PPM_in)); // DisplayZeile übertragen |
dis_zeile = -1; |
} |
else SendOutData('0' + dis_zeile,0,(unsigned char *)&DisplayBuff[20 * dis_zeile],20); // DisplayZeile übertragen |
} |
if(GetVersionAnforderung && UebertragungAbgeschlossen) |
{ |
SendOutData('V',MeineSlaveAdresse,(unsigned char *) &VersionInfo,sizeof(VersionInfo)); |
GetVersionAnforderung = 0; |
} |
} |
/branches/salvo_gps/Basis_V0066c/trunk/uart.h |
---|
0,0 → 1,97 |
#ifndef _UART_H |
#define _UART_H |
#define MAX_SENDE_BUFF 150 |
#define MAX_EMPFANGS_BUFF 150 |
//Salvo 26.10.2007 |
extern int dataset_cnt; |
// salvo End |
void BearbeiteRxDaten(void); |
extern unsigned char DebugGetAnforderung; |
extern unsigned volatile char SendeBuffer[MAX_SENDE_BUFF]; |
extern unsigned volatile char RxdBuffer[MAX_EMPFANGS_BUFF]; |
extern unsigned volatile char UebertragungAbgeschlossen; |
extern unsigned volatile char PC_DebugTimeout; |
extern unsigned volatile char NeueKoordinateEmpfangen; |
extern unsigned char MeineSlaveAdresse; |
extern unsigned char PcZugriff; |
extern int Debug_Timer; |
extern void UART_Init (void); |
extern int uart_putchar (char c); |
extern void boot_program_page (uint32_t page, uint8_t *buf); |
extern void DatenUebertragung(void); |
extern void DecodeNMEA(void); |
extern void BearbeiteRxDaten(void); |
extern unsigned char MotorTest[4]; |
struct str_DebugOut |
{ |
unsigned char Digital[2]; |
unsigned int Analog[32]; // Debugwerte |
}; |
extern struct str_DebugOut DebugOut; |
struct str_Debug |
{ |
unsigned char Digital[2]; |
unsigned char RemoteTasten; |
unsigned int Analog[4]; |
}; |
extern struct str_Debug DebugIn; |
struct str_VersionInfo |
{ |
unsigned char Hauptversion; |
unsigned char Nebenversion; |
unsigned char PCKompatibel; |
unsigned char Rserved[7]; |
}; |
extern struct str_VersionInfo VersionInfo; |
//Die Baud_Rate der Seriellen Schnittstelle ist 9600 Baud |
//#define BAUD_RATE 9600 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 14400 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 28800 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 38400 //Baud Rate für die Serielle Schnittstelle |
#define BAUD_RATE 57600 //Baud Rate für die Serielle Schnittstelle |
//Anpassen der seriellen Schnittstellen Register wenn ein ATMega128 benutzt wird |
#if defined (__AVR_ATmega128__) |
# define USR UCSR0A |
# define UCR UCSR0B |
# define UDR UDR0 |
# define UBRR UBRR0L |
# define EICR EICRB |
#endif |
#if defined (__AVR_ATmega32__) |
# define USR UCSRA |
# define UCR UCSRB |
# define UBRR UBRRL |
# define EICR EICRB |
# define INT_VEC_RX SIG_UART_RECV |
# define INT_VEC_TX SIG_UART_TRANS |
#endif |
#if defined (__AVR_ATmega644__) |
# define USR UCSR0A |
# define UCR UCSR0B |
# define UDR UDR0 |
# define UBRR UBRR0L |
# define EICR EICR0B |
# define TXEN TXEN0 |
# define RXEN RXEN0 |
# define RXCIE RXCIE0 |
# define TXCIE TXCIE0 |
# define U2X U2X0 |
# define UCSRB UCSR0B |
# define UDRE UDRE0 |
# define INT_VEC_RX SIG_USART_RECV |
# define INT_VEC_TX SIG_USART_TRANS |
#endif |
#endif //_UART_H |
/branches/salvo_gps/Basis_V0066c/trunk/version.txt |
---|
0,0 → 1,91 |
------- |
V0.53 27.04.2007 H.Buss |
- erste öffentliche Version |
V0.53b 29.04.2007 H.Buss |
- der FAKTOR_I war versehentlich auf Null, dann liegt der MikroKopter nicht so hart in der Luft |
V0.53c 29.04.2007 H.Buss |
- es gib ein Menü, in dem die Werte der Kanäle nach Nick, Roll, Gas,... sortiert sind. |
Die angezeigten Werte waren nicht die Werte der Funke |
V0.54 01.05.2007 H.Buss |
- die Paramtersätze können jetzt vor dem Start ausgewählt werden |
Dazu wird beim Kalibrieren der Messwerte (Gashebel oben links) der Nick-Rollhebel abgefragt: |
2 3 4 |
1 x 5 |
- - - |
Bedeutet: Nick-Rollhebel Links Mitte = Setting:1 Links Oben = Setting:2 usw. |
- der Faktor_I für den Hauptregler ist hinzugekommen. Im Heading-Hold-Modus sollte er vergössert werden, was Stabilität bringt |
V0.55 14.05.2007 H.Buss |
- es können nun Servos an J3,J4,J5 mit den Kanälen 5-7 gesteuert werden |
V0.56 14.05.2007 H.Buss |
- es gab Probleme mit Funken, die mehr als 8 Kanäle haben, wenn mehrere Kanäle dann auf Null waren |
- Funken, die nicht bis +-120 aussteuern können, sollten jetzt auch gehen |
V0.57 24.05.2007 H.Buss |
- Der Höhenregler kann nun auch mittels Schalter bedient werden |
- Bug im Gier-Algorithmus behoben; Schnelles Gieren fürhrte dazu, dass der MK zu weit gedreht hat |
- Kompass-Einfluss dämpfen bei Neigung |
- Man kann zwischen Kompass FIX (Richtung beim Kalibrieren) und Variabel (einstellbar per Gier) wählen |
- Der Motortest vom Kopter-Tool geht jetzt |
- Man kann den Parametersätzen einen Namen geben |
- Das Kamerasetting ist unter Setting 2 defaultmässig integriert |
V0.58 30.05.2007 H.Buss |
- Der Höhenregler-Algorithmus wird nun umgangen, wenn der Höhenreglerschalter aus ist |
V0.60 17.08.2007 H.Buss |
- "Schwindel-Bug" behoben |
- Die Poti-Werte werden jetzt auf Unterlauf (<0) überprüft |
- Poti4 zugefügt |
- Es werden jetzt 8 Kanäle ausgewertet |
- Kamera-Servo (an J7) |
- Die Settings müssen überschrieben werden |
V0.61 - V0.63 H.Buss 27.09.2007 |
- Poti 4 und Kanal 8 werden im Menü angezeigt |
- ein paar Kleinigkeiten bei den DefaultKonstanten2 bereinigt |
- Analog.c: Aktuell_ax korrigiert |
- auf 32 Debug-Kanäle erweitert |
- Loopings sind jetzt möglich und einzeln im KopterTool freischaltbar |
- leichte Anpassungen im Gier - Geschwindigkeit und Drift |
- die Hardwareversion V1.1 wird erkannt und das Programm stellt sich auf die geänderte Gyroverstärkung und die geänderten Portpins ein |
- die Software startet nach dem Einschalten schneller, weil der Luftdruckoffset schneller gefunden wird |
- die PPM-Ausgänge liegen wieder an den Pins an |
- Details an der Sensordatenverarbeitung -> es fliegt sich geringfügig anders |
- der MK ist bei wenig Gas nicht mehr so giftig -> soll das Landen vereinfachen |
- I2C-Bus läuft jetzt sicher nach einer Störung wieder an |
- Sticksignale werden präziser ausgewertet |
- Stick-Kanäle werden ans Kopter-Tool übertragen |
- Es muss die Version V1.47 des Kopter-Tool verwendet werden |
- Die Settings werden auf Default zurückgesetzt |
- am Piepen kann man die Fehlerart unterscheiden |
1. einzelnes Piepen beim Einschalten und Kalibrieren |
2. langsames Intervall mindestens 1 Sek -> Empfangsausfall |
3. schnelleres Intervall mindestens 1 Sek -> Akku |
4. sehr schnelles Intervall mindestens 1 Sek -> Kommunikation zu den Reglern gestört |
V0.64 H.Buss 30.09.2007 |
- beim Gieren wurden die Achsen nicht hart genug geregelt |
V0.65a H.Buss 15.10.2007 |
- Integral im Mischer wieder integriert |
- Feinabstimmung im ACC/Gyro Abgleich -> 1/32 & 100 |
- ACC/Gyro Abgleich auch bei HH |
V0.66a H.Buss 3.11.2007 |
- Messwertverarbeitung aus dem Analog-Interrupt entfernt |
- Analogmessung hängt jetzt am FC-Timing |
- Looping-Stick-Hysterese eingebaut |
- Looping-180°-Umschlag einstellbar |
- Achsenkopplung: Gierbewegung verkoppelt Nick und Roll |
- Lageregelung nach ACC-Sensor verbessert |
- zusätzlicher I-Anteil in der Lageregelung verbessert die Neutrallage |
- Gyrodriftkompensation überarbeitet |
- Bug in der Gier-Stick-Berechnung behoben |
- Gyro-Messung auf 1kHz beschleunigt |