/branches/salvo_gierkompass/GPS.c |
---|
0,0 → 1,211 |
/* |
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 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 for more details. You should have received a copy of the GNU General Public License |
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 |
Regelung fuer GPS noch nicht implementiert |
Stand 11.9.2007 |
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
*/ |
#include "main.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; |
static uint8_t ublox_msg_state = UBLOX_IDLE; |
static uint8_t chk_a =0; //Checksum |
static uint8_t chk_b =0; |
static unsigned int rx_len; |
unsigned int cnt0,cnt1,cnt2; //******Provisorisch |
static unsigned int ptr_payload_data_end; |
static uint8_t *ptr_payload_data; |
static uint8_t *ptr_pac_status; |
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_POSITION_t gps_act_position; // Alle wichtigen Daten zusammengefasst |
void GPS_Neutral(void) // Initialisierung |
{ |
ublox_msg_state = UBLOX_IDLE; |
actual_pos.status= 0; |
actual_speed.status= 0; |
actual_status.status= 0; |
} |
void Get_GPS_data(void) // Daten aus aktuellen ublox Messages extrahieren |
{ |
if (actual_pos.status == 0) return; //damit es schnell geht, wenn nix zu tun ist |
if ((actual_pos.status > 0) && (actual_status.status > 0) && (actual_speed.status > 0)) |
{ |
cnt1++; //**** noch Rausschmeissen |
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; |
} |
actual_pos.status = 0; |
actual_status.status = 0; |
actual_speed.status = 0; |
} |
} |
/* |
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; |
} |
} |
/branches/salvo_gierkompass/Hex-Files/Flight-Ctrl_MEGA644_V0_63_gierkompensiert.hex |
---|
0,0 → 1,1500 |
:100000000C94EC010C9409020C9409020C94090262 |
:100010000C9409020C9409020C9409020C94090234 |
:100020000C9409020C94080B0C9409020C9409021C |
:100030000C94C1140C9409020C9409020C9409024A |
:100040000C9409020C9409020C94440A0C940902C1 |
:100050000C9451040C9409020C941B040C94090296 |
:100060000C94EE0B0C9409020C94F6130C940902F8 |
:100070000A0A0D004E65757472616C004865616412 |
:10008000696E67486F6C64000A0D5374657565721C |
:10009000756E673A20004F4B0A0D000A0D416267EA |
:1000A0006C65696368204C756674647275636B7304 |
:1000B000656E736F722E2E000A0D42656E75747A2E |
:1000C0006520506172616D657465727361747A2028 |
:1000D0002564000A0D496E69742E20454550524F23 |
:1000E0004D3A2047656E65726965726520446566A4 |
:1000F00061756C742D506172616D657465722E2E20 |
:100100002E000A0D3D3D3D3D3D3D3D3D3D3D3D3DCE |
:100110003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D0F |
:100120003D3D000A0D466C69676874436F6E7472DA |
:100130006F6C0A0D48617264776172653A25642EAE |
:1001400025640A0D536F6674776172653A562564AB |
:100150002E256420002E0052616E67653A253369B2 |
:100160002D253369005374656C6C756E673A2025D4 |
:10017000336900536574706F696E7420202533698C |
:1001800000536572766F202000506F7469343A20F6 |
:100190002025336900506F7469333A202025336974 |
:1001A00000506F7469323A202025336900506F7413 |
:1001B00069313A20202533690053746172743A2002 |
:1001C00020202020253569004D6573737765727492 |
:1001D0003A2020253569005269636874756E673A64 |
:1001E0002020253569004B6F6D70617373202020CE |
:1001F0002020202000456D70662E506567656C3AA2 |
:10020000253569005370616E6E756E673A20202542 |
:10021000356900486F6368202534692028253369D3 |
:100220002900526F6C6C20253469202825336929F8 |
:10023000004E69636B202534692028253369290025 |
:10024000414343202D2053656E736F7200476965EB |
:10025000722025346920282533692900526F6C6C7F |
:1002600020253469202825336929004E69636B20D5 |
:10027000253469202825336929004779726F202D9C |
:100280002053656E736F720050333A253469202015 |
:1002900050343A253469200050313A253469202001 |
:1002A00050323A253469200047733A2534692020BA |
:1002B00047693A25346920004E693A25346920207F |
:1002C000526F3A25346920004B373A253469202093 |
:1002D0004B383A25346920004B353A2534692020C3 |
:1002E0004B363A25346920004B333A2534692020B7 |
:1002F0004B343A25346920004B313A2534692020AB |
:100300004B323A25346920004B6F6D706173733A3C |
:1003100020202025356900526F6C6C3A2020202067 |
:100320002020253569004E69636B3A20202020206B |
:100330002025356900616B742E204C61676500488B |
:10034000F668656E726567656C756E67004B65690A |
:100350006E6520004F66662020202020203A202550 |
:100360003569004C756674647275636B3A20253587 |
:100370006900536F6C6C486F6568653A2025356974 |
:1003800000486F6568653A202020202025356900E7 |
:1003900028632920486F6C6765722042757373006B |
:1003A00053657474696E673A202564200048573A93 |
:1003B0005625642E25642053573A25642E25640063 |
:1003C0002B2B204D696B726F4B6F70746572202BF5 |
:1003D0002B005B25695D000011241FBECFEFD0E12B |
:1003E000DEBFCDBF11E0A0E0B1E0ECE1FDE502C071 |
:1003F00005900D92A039B107D9F715E0A0E9B1E059 |
:1004000001C01D92A433B107E1F70E9448020C9489 |
:100410008D2E0C94000022E030E0D9010E94792E4C |
:10042000802D863028F082E0D901082E0E94812E8E |
:1004300099270895FB01282F863008F025E0842FA6 |
:100440009927429FD0011124AC59BF4F019724F046 |
:1004500001900E94812EFACFA2E0B0E0022E0E940D |
:10046000812E0895CF93DF93FB01C42FDD278630C3 |
:1004700008F085E0489FD0011124AC59BF4F219767 |
:1004800024F00E94792E0192FACFDF91CF91089546 |
:100490001F93CF93DF93189B02C08BE001C08AE0CB |
:1004A0008093000181E887B98FEF88B98BE184B927 |
:1004B00081E085B98EE38AB9579A87EF8BB984B703 |
:1004C000877F84BF80916000886180936000109274 |
:1004D000600080ED97E09093AD018093AC011092A5 |
:1004E0002E0210922D021092BD041092BC041092A4 |
:1004F0002C0210922B0210922A0210922902809153 |
:1005000000018A3011F4289801C0289A0E94AF0B8C |
:100510000E9423060E94AC140E94E80B0E94DC1388 |
:1005200078941092BB038FE38093BC0385E08093A3 |
:10053000BD03209100018FE390E09F938F931F9262 |
:100540001F92822F6AE00E94092E892F99279F937C |
:100550008F93822F0E94092E99279F938F9383E276 |
:1005600091E09F938F931F920E94B70782E091E0E2 |
:100570009F938F931F920E94B707299AA1E0B0E042 |
:100580000E94792E802D2DB73EB7225F3F4F0FB6C8 |
:10059000F8943EBF0FBE2DBF8E33A9F183ED90E0DE |
:1005A0009F938F931F920E94B7070E94551C4AE3A6 |
:1005B00064EE74E080E00E941A0211E00F900F9048 |
:1005C0000F90123049F40E94DE1B4AE364EE74E09F |
:1005D00082E00E941A0213E04AE364EE74E0812F85 |
:1005E0000E941A021F5F163060F382E022E030E0C2 |
:1005F000D901082E0E94812E8EE321503040D9016E |
:10060000082E0E94812EC2E0D0E0DE010E94792EE9 |
:10061000802D863028F082E0DE01082E0E94812E97 |
:100620004AE364EE74E00E943202DE010E94792EF9 |
:10063000802D863028F082E0DE01082E0E94812E77 |
:1006400099279F938F9388EB90E09F938F931F92AE |
:100650000E94B7078091EC040F900F900F900F90BD |
:100660000F9080FF20C08BE990E09F938F931F92A3 |
:100670000E94B70788EE93E00E94F30AEC010E9403 |
:10068000AA0F0F900F900F90CE010E94FC0A8823B2 |
:10069000D9F386E990E09F938F931F920E94B7074A |
:1006A0000F900F900F900E94131D809100018A30CF |
:1006B00011F4289801C0289A80ED97E09093AD013D |
:1006C0008093AC0188EE93E09093B6038093B503DA |
:1006D00085E58093B00388E890E09F938F931F9205 |
:1006E0000E94B7078091EC040F900F900F9082FF4B |
:1006F00003C08CE790E002C084E790E09F938F9363 |
:100700001F920E94B7070F900F900F9080E790E024 |
:100710009F938F931F920E94B7070E94EE0F88E865 |
:1007200093E190937B0180937A010F900F900F904B |
:100730008091A901882309F451C01092A9010E9457 |
:100740005E1E0E94CC1C209100012A3011F42898D2 |
:1007500001C0289A80910201882319F0815080936A |
:10076000020180912802882329F08091280281507B |
:100770008093280280917A0190917B01892B01F569 |
:1007800085E090E090937B0180937A010E9486142B |
:1007900080910301909104018F5F9F4FF9F4809144 |
:1007A0002F028823D9F080E197E29093AD018093E6 |
:1007B000AC0180E890E090930401809303010EC0A7 |
:1007C00080917A0190917B01019790937B018093B6 |
:1007D0007A012A3011F4289801C0289A0E943E0616 |
:1007E0000E94B406CE010E94FC0A882309F4A0CF1F |
:1007F00020910701309108018091FC049927281766 |
:1008000039079CF480910301909104018F5F9F4F01 |
:1008100061F480E797E19093AD018093AC0180E0B3 |
:1008200093E0909304018093030184E690E00E949A |
:10083000F30AEC017DCF1F920F920FB60F92112495 |
:100840008F939F93EF93FF93809101018823E1F4AD |
:100850008091A5019091A60101969093A6018093A5 |
:10086000A501FC01EE57FD4FE081ED3019F086390E |
:10087000910539F41092A6011092A50181E08093B0 |
:100880000101E093C60004C01092A6011092A501D8 |
:10089000FF91EF919F918F910F900FBE0F901F903E |
:1008A00018951F920F920FB60F9211242F933F931A |
:1008B0004F938F939F93AF93BF93CF93DF93EF9318 |
:1008C000FF938091C600809394014091A001463926 |
:1008D00010F010929F01809194018D3009F05CC05E |
:1008E00080919F01823009F057C010929F01A42F80 |
:1008F000BB27FD01ED53FC4F3081ED01CC53DC4FA4 |
:1009000028818091A3019091A401831B9109821BEE |
:1009100091099F709093A4018093A3019C0196E09C |
:10092000369527959A95E1F7235C2093A201982F9D |
:100930009F73935C9093A1018081281729F488818B |
:10094000981711F491E006C0809197018F5F809312 |
:10095000970190E080919501882309F064C0992364 |
:1009600009F461C081E08093950140939801AB53F5 |
:10097000BC4F8DE08C938091C703823509F053C042 |
:1009800088E190E02CE00FB6F894A8958093600081 |
:100990000FBE2093600047C080919F018130D9F045 |
:1009A000813018F08230E9F530C0809194018332B3 |
:1009B00039F480919501882319F481E080939F0197 |
:1009C000809194018093C50381E08093A001809180 |
:1009D0009401992715C082E080939F01E42FFF279F |
:1009E00080919401EB53FC4F80834F5F4093A001B3 |
:1009F000209194018091A3019091A401820F911DF7 |
:100A00009093A4018093A3010EC0E42FFF2780914F |
:100A10009401EB53FC4F8083463938F310929F01C9 |
:100A2000E7CF10929F01FF91EF91DF91CF91BF919E |
:100A3000AF919F918F914F913F912F910F900FBE4A |
:100A40000F901F901895DC0120E030E040E050E06E |
:100A5000E2E8F2E005C08191280F311D4F5F5F4F42 |
:100A60004A175B07C1F73F70C90136E09695879535 |
:100A70003A95E1F7835CFD01EE57FD4F80831196B7 |
:100A80002F73235CFD01EE57FD4F2083AD57BD4F03 |
:100A90008DE08C9310920101809182028093C600B8 |
:100AA0000895EF92FF920F931F93CF93DF937A01F4 |
:100AB000722F93E290938202609383028093840268 |
:100AC00003E010E060E0A5E8B2E046C0F701E60F01 |
:100AD000F11D90816F5F715019F4E0E040E00FC0AC |
:100AE000F701E60FF11D40816F5F715011F4E0E0F6 |
:100AF00006C0F701E60FF11DE0816F5F7150892F8D |
:100B000086958695835C8C935527892F99278370CA |
:100B1000907024E0880F991F2A95E1F79A0194E0DC |
:100B2000369527959A95E1F7822B835CED018983B1 |
:100B30004F705070440F551F440F551F8E2F8295D4 |
:100B4000869586958370842B835C8A83EF73E35C40 |
:100B5000EB830C5F1F4F1496772309F0B7CFC801C2 |
:100B60000E942305DF91CF911F910F91FF90EF908D |
:100B700008951F93CF93DF93EC0170E0A22FBB2762 |
:100B8000129748C0E42FFF27EB53FC4F30814F5F93 |
:100B9000E42FFF27EB53FC4F50814F5FE42FFF27DB |
:100BA000EB53FC4F10814F5FE42FFF27EB53FC4FBB |
:100BB00020814F5F842F9927A817B90774F15D53DF |
:100BC000FE01E70FF11D3D53330F330F852F829543 |
:100BD0008F70382B3083613001F1912F9D537F5FEF |
:100BE000FE01E70FF11D71505295507F892F8695B8 |
:100BF0008695582B508363506F3F79F07E5FFE01DE |
:100C0000E70FF11D9295990F990F907C2D53922B20 |
:100C100090837F5F662309F0B5CFDF91CF911F915D |
:100C200008951F93182F8A3019F48DE00E94110641 |
:100C30008091C00085FFFCCF1093C60080E090E05B |
:100C40001F9108950895E1ECF0E088E18083A0EC25 |
:100C5000B0E08C9182608C938081806880838081F9 |
:100C6000806480838AE28093C40088EC90E00E94D4 |
:100C7000F30A9093AF038093AE030895809101012E |
:100C8000882309F470C080919001882371F08091CD |
:100C90000101882351F02BE040EB53E06091810289 |
:100CA00087E40E945105109290018091AE039091CB |
:100CB000AF030E94FC0A882321F4809192018823CB |
:100CC000B1F080910101882391F022E44BE554E0DA |
:100CD0006091810284E40E9451051092920184EF98 |
:100CE00091E00E94F30A9093AF038093AE0380914A |
:100CF0009101882331F180910101882311F10E9433 |
:100D0000F70F1092910180919E01982F9F5F909311 |
:100D10009E01943059F426E148EB54E060E084E30E |
:100D20000E9451058FEF80939E010BC044E1949F78 |
:100D3000A0011124475E5E4F24E160E08F5C0E94B9 |
:100D4000510580919301882371F0809101018823DE |
:100D500051F02AE04BEB53E06091810286E50E945E |
:100D600051051092930108951F93CF93DF93CDB750 |
:100D7000DEB722970FB6F894DEBF0FBECDBF8091CD |
:100D80009501882309F490C08FEF80930201809130 |
:100D9000C703813758F48C3608F067C08736C9F12D |
:100DA0008836C1F0833609F07DC008C0843721F150 |
:100DB000863759F1813709F075C02FC0209198010D |
:100DC00043E06BE080EB93E00E94B90581E0809303 |
:100DD000920168C02091980143E062E0CE01019643 |
:100DE0000E94B9058091CE019981892B8093CE0113 |
:100DF00081E08093910156C02091980143E064E026 |
:100E00008AE991E00E94B9054DC081E08093930189 |
:100E100049C081E08093900145C02091980143E052 |
:100E200062E0CE0101960E94B90589818F3F89F069 |
:100E3000863010F085E089834AE364EE74E08981AE |
:100E40000E94320289812AE344EE54E060918102DB |
:100E500008C0109181020E940B022AE344EE54E084 |
:100E6000612F855B0E9451051DC02091980143E0D0 |
:100E70006AE384EE94E00E94B9058091C7034AE3D7 |
:100E800064EE74E08B560E941A028091C7038B5661 |
:100E9000A2E0B0E0082E0E94812E0E940B0299274A |
:100EA0000E94491E1092950122960FB6F894DEBF5B |
:100EB0000FBECDBFDF91CF911F910895982F8091E4 |
:100EC0009D04813069F48091CD01E82FFF27E75E12 |
:100ED000FE4F90838F5F8093CD0121E030E005C00D |
:100EE000892F0E941106282F3327C90108951F93C7 |
:100EF000182F04C080E30E945E0711501116D4F32E |
:100F00001F9108951F93182F04C080E20E945E076E |
:100F100011501116D4F31F9108950F931F93CF937F |
:100F2000DF938C01EB0108C0F8010F5F1F4FE491C4 |
:100F30008E2F0E945E0721972097B1F7DF91CF9106 |
:100F40001F910F9108950F931F93CF93DF938C01FF |
:100F5000EB0106C0F80181918F010E945E07219785 |
:100F60002097C1F7DF91CF911F910F9108952F9294 |
:100F70003F924F925F926F927F928F929F92AF9229 |
:100F8000BF92CF92DF92EF92FF920F931F93CF9376 |
:100F9000DF93CDB7DEB7E3970FB6F894DEBF0FBE91 |
:100FA000CDBF29968FAD299780939D04CE01855B97 |
:100FB0009F4F9D838C832B964EAC5FAC2B971EA6C8 |
:100FC0001FA618AA19AA820102C00F5F1F4FF801BD |
:100FD000F490FF2019F0F5E2FF16B9F7B801641993 |
:100FE000750919F0C2010E948D07FF2009F433C270 |
:100FF00028010894411C511C1982AC81BD81332405 |
:101000001BAA2FEF2AABF2010894411C511C7490CB |
:1010100035E7731621F0872D80628837C1F430FEE2 |
:101020000BC02D913D914D915C9113972EA73FA739 |
:1010300048AB59AB14960BC08D919C9111979C01B4 |
:10104000442755272EA73FA748AB59AB129630E24D |
:10105000731621F489818823B1F67EC043E27416A9 |
:1010600009F47CC05AE2751621F08DE2781671F40D |
:1010700008C0FD011296E081EBABE7FFC4CFE1951C |
:10108000EBAB90E1392AEFED3E22BDCFFBE27F16BC |
:1010900009F462C02EE2721691F592012F5F3F4F64 |
:1010A000F20184918A3221F0782E20E030E01AC0DB |
:1010B000FD0112964081518157FF02C04FEF5FEF53 |
:1010C0004AAB2901A0CFC90153E0880F991F5A9557 |
:1010D000E1F7220F331F280F391F270D311D205331 |
:1010E000304074903196872D80538A3060F32F0101 |
:1010F000A90137FF02C04FEF5FEF4AAB89CFF0E3A2 |
:101100007F1629F434FC7FCF20E2322A7CCF872D52 |
:1011100081538930D8F420E030E0C90103E0880F22 |
:10112000991F0A95E1F7220F331F280F391F270D4A |
:10113000311D20533040F2010894411C511C749021 |
:10114000872D80538A3048F32BAB62CF38E6731675 |
:1011500041F444E0342A57CF798255CF58E0352AFC |
:1011600052CF8CE6781619F491E0392A4CCFBD8322 |
:10117000AC83E3E67E1639F41296BD83AC831297F6 |
:101180008C918E8311C1F4E47F1639F024E6721637 |
:1011900031F039E6731631F502C041E0342A30FEF1 |
:1011A00008C01496BD83AC831E910E91FE90EE9004 |
:1011B0000AC01296BD83AC839E918E917C0100275C |
:1011C000F7FC0095102F17FF0AC010950095F094BA |
:1011D000E094E11CF11C011D111D8DE28983BAE030 |
:1011E0002B2E83C05FE4751621F08FE6781631F45C |
:1011F00002C091E0392AA8E02A2E72C0E0E77E16EC |
:1012000089F41296BD83AC839E918E919C014427F4 |
:1012100055272EA73FA748AB59AB30E4332AF8E750 |
:101220007F2E5CC043E77416C9F51296BD83AC836C |
:101230009E908E908114910489F488E28E838EE6CC |
:101240008F8385E788878CE689878A8789E28B8701 |
:101250001C86E6E08E2E912C8C0E9D1E5AA957FD01 |
:1012600013C0452F552747FD509560E070E0C4013D |
:101270000E94752C009711F41AA90DC088191AA99B |
:1012800081174CF4182F07C0F40101900020E9F7F2 |
:1012900031971E2F1819198240E090C085E5781605 |
:1012A00021F095E7791631F402C0A1E03A2A7AE0FC |
:1012B000272E16C0B8E57B1621F0E8E77E1609F068 |
:1012C0006FC033FE0BC02EA53FA548A959A9211513 |
:1012D00031054105510511F030E4332A60E1262E35 |
:1012E0001982EEA4FFA408A919A94AA947FD02C0C2 |
:1012F0005FED3522E114F1040105110569F48AA9B5 |
:10130000882351F41EA61FA618AA19AA5EE2852EEC |
:10131000912C8C0E9D1E3EC04EE2842E912C8C0E84 |
:101320009D1EA22CBB24CC24DD24C801B701A6013C |
:1013300095010E943C2E6A3020F430E3632E660E45 |
:1013400008C027E5622E660E98E5791611F4AFED18 |
:101350006A22F40162924F01C801B701A60195010A |
:101360000E943C2E2EA73FA748AB59ABEA14FB04C2 |
:101370000C051D0518F079018A01D7CFF8E02F166A |
:1013800049F433FE07C020E3621621F080E3D40164 |
:101390008E934D01FE01E8191E2F125D4AA90EC061 |
:1013A000772009F458C07E82198200E096E0892EE9 |
:1013B000912C8C0E9D1E11E021E005C0212F042FE1 |
:1013C000011B07FD00E08981882319F0812F8F5FC1 |
:1013D00006C036FC02C0812F02C0822F8E5FB82E5D |
:1013E000B00EE32CFF2480E3C82ED12CCE20DF20CA |
:1013F000C114D10421F48BA98B190E948207898121 |
:10140000882329F061E070E0CE01019609C0E6FE74 |
:1014100009C080E38A837B8262E070E0CE0102969D |
:101420000E94A307F0E2CF16D10421F48BA98B19F7 |
:101430000E947707802F0E947707612F772767FD2B |
:101440007095C4010E94A307E4FEBDCD8BA98B1942 |
:101450000E948207B8CDE3960FB6F894DEBF0FBEA8 |
:10146000CDBFDF91CF911F910F91FF90EF90DF9053 |
:10147000CF90BF90AF909F908F907F906F905F9034 |
:101480004F903F902F9008951F920F920FB60F929A |
:1014900011242F933F935F936F937F938F939F9329 |
:1014A000AF93BF938091B00181508093B0018F3F83 |
:1014B000B9F489E08093B001809106018F5F81705B |
:1014C00080930601882319F481E08093A90180911B |
:1014D000A7019091A80101969093A8018093A7017C |
:1014E0008091AC019091AD010297B8F08091AC0170 |
:1014F0009091AD0101979093AD018093AC018091E3 |
:10150000AC019091AD01209103013091040182233F |
:101510009323892B09F053C006C08FEF9FEF909360 |
:10152000040180930301809100018A3039F404C0E2 |
:101530005A9A05C0479A03C05A9801C047988091AB |
:10154000EC0483FF42C0349B0AC08091AA019091B1 |
:10155000AB0101969093AB018093AA0136C08091B4 |
:10156000AA019091AB01892B79F08091AA01909109 |
:10157000AB01805A9F4040F48091AA019091AB0149 |
:101580009093190280931802809118029091190289 |
:1015900020911A0230911B02821B930B845E9D4F97 |
:1015A00068E671E00E94292E845B904090931D02B2 |
:1015B00080931C021092AB011092AA0106C0809188 |
:1015C00000018A3009F0B6CFB3CFBF91AF919F91A0 |
:1015D0008F917F916F915F913F912F910F900FBEEF |
:1015E0000F901F9018952091A7013091A8012F5FAF |
:1015F0003F4F820F931F08952091A7013091A801BA |
:10160000821B930B892F99278695807499270895BB |
:101610001F920F920FB60F921124EF92FF920F9329 |
:101620001F932F933F934F935F936F937F938F936A |
:101630009F93AF93BF93CF93DF93EF93FF938091EB |
:1016400005018150809305018F3F09F06DC083E84B |
:101650008093B00080918D01C82FDD27D093AF011A |
:10166000C093AE0180910D05E090060580FF1EC07D |
:101670006091E8017091E9018091EA019091EB019C |
:10168000FF240027112720E830E040E050E00E94CE |
:101690005E2EC801B7010E94EA2D20E032E040E052 |
:1016A00050E00E945E2EC20FD31F1DC06091E80162 |
:1016B0007091E9018091EA019091EB01FF240027EC |
:1016C000112720E830E040E050E00E945E2EC80183 |
:1016D000B7010E94EA2D20E032E040E050E00E9495 |
:1016E0005E2EC21BD30BD093AF01C093AE012091ED |
:1016F000AE013091AF01809107059927281739076E |
:1017000034F08091080599278217930724F4909369 |
:10171000AF018093AE018091AE018093B3008091C0 |
:1017200009058093050104C083E08093B0005F98B1 |
:10173000FF91EF91DF91CF91BF91AF919F918F91E9 |
:101740007F916F915F914F913F912F911F910F91D9 |
:10175000FF90EF900F900FBE0F901F901895809103 |
:10176000A7019091A8010B969093B2018093B101CB |
:1017700082E085BD83EA84BD17BC88E788BD96E01A |
:1017800096BD83EC8093B0009093B100E0E7F0E069 |
:10179000808182608083EEE6F0E0808181608083DA |
:1017A0008AE08093B3001092B20008952091A701BF |
:1017B0003091A8012F5F3F4F280F391F8091A7015B |
:1017C0009091A801A901481B590B57FFF7CF089525 |
:1017D00010927C008FEE80937A0008951F920F92F2 |
:1017E0000FB60F921124EF92FF920F931F932F9336 |
:1017F0003F934F935F936F937F938F939F93AF9399 |
:10180000BF93CF93DF93EF93FF9310927A004091B1 |
:10181000C9014F5F4093C9014150433009F4B4C13D |
:10182000443038F4413009F469C0423008F008C14E |
:101830000DC0453009F4E8C1453008F4C2C1463056 |
:1018400009F407C2473009F063C3EAC22091DB0103 |
:101850003091DC018091780090917900281B390B40 |
:10186000809100018A3011F0220F331F8091B7015F |
:101870009091B801820F931F9093B8018093B701A4 |
:101880008091C1018F5F8093C10180910C02909182 |
:101890000D02A0910E02B0910F02442737FD409532 |
:1018A000542F820F931FA41FB51F80930C02909397 |
:1018B0000D02A0930E02B0930F028091100290913E |
:1018C0001102A0911202B0911302820F931FA41F64 |
:1018D000B51F8093100290931102A0931202B0934F |
:1018E000130281E08093CA018091C7019091C801E1 |
:1018F00001969093C8018093C7010EC36091780050 |
:10190000709179008091D9019091DA01681B790B6F |
:10191000809100018A3011F0660F771F80910402D8 |
:1019200090910502A0910602B09107029B01442705 |
:1019300037FD4095542F820F931FA41FB51F80932E |
:10194000040290930502A0930602B09307028091CF |
:10195000080290910902A0910A02B0910B02820F35 |
:10196000931FA41FB51F8093080290930902A093B0 |
:101970000A02B0930B028091040290910502A0919B |
:101980000602B0910702815F9A4BA440B04064F018 |
:1019900080E393E9ABEFBFEF8093040290930502DD |
:1019A000A0930602B0930702809104029091050271 |
:1019B000A0910602B091070280519544AB4FBF4FF2 |
:1019C00064F480ED9CE6A4E0B0E080930402909380 |
:1019D0000502A0930602B0930702809178009091CF |
:1019E00079000F9710F468E17CEF80917800909176 |
:1019F0007900079710F460E378EF80917800909178 |
:101A00007900835F934010F068EE73E08091780076 |
:101A1000909179008A5F934010F060ED77E08091BB |
:101A2000B5019091B601860F971F9093B6018093F0 |
:101A3000B5018091C0018F5F8093C00182E0A1C099 |
:101A400060917800709179008091D7019091D801D0 |
:101A5000681B790B809100018A3011F0660F771FA7 |
:101A60008091FC019091FD01A091FE01B091FF01D8 |
:101A70009B01442737FD4095542F820F931FA41FCD |
:101A8000B51F8093FC019093FD01A093FE01B093DC |
:101A9000FF018091000290910102A0910202B09199 |
:101AA0000302820F931FA41FB51F8093000290931F |
:101AB0000102A0930202B09303028091FC01909175 |
:101AC000FD01A091FE01B091FF01815F9A4BA440FE |
:101AD000B04064F080E393E9ABEFBFEF8093FC018B |
:101AE0009093FD01A093FE01B093FF018091FC0152 |
:101AF0009091FD01A091FE01B091FF0180519544AC |
:101B0000AB4FBF4F64F480ED9CE6A4E0B0E080935F |
:101B1000FC019093FD01A093FE01B093FF01809121 |
:101B20007800909179000F9710F468E17CEF809134 |
:101B3000780090917900079710F460E378EF809136 |
:101B4000780090917900835F934010F068EE73E025 |
:101B500080917800909179008A5F934010F060ED59 |
:101B600077E08091B3019091B401860F971F909315 |
:101B7000B4018093B3018091BF018F5F8093BF0157 |
:101B800084E08093CA01C8C14091070150910801C7 |
:101B900080917800909179009A01220F331F240FD1 |
:101BA000351F63E070E00E94152E260F371F369513 |
:101BB000279536952795309308012093070186E0F5 |
:101BC000E0CF8091DF019091E00120917800309189 |
:101BD0007900821B930B90939F0480939E048091C5 |
:101BE000B9019091BA0120919E0430919F04820F17 |
:101BF000931F9093BA018093B9018091C3018F5FC5 |
:101C00008093C30187E0BDCF8091780090917900E7 |
:101C10002091DD013091DE01821B930B9093AA0489 |
:101C20008093A9048091BB019091BC012091A904EB |
:101C30003091AA04820F931F9093BC018093BB0143 |
:101C40008091C2018F5F8093C2014093CA0186E0F8 |
:101C5000E4C06091780070917900E090E101F0902B |
:101C6000E2010091E3011091E401882777FD80955E |
:101C7000982F0E94282DA80197010E94822C0E9473 |
:101C80000B2D7093BE016093BD012091BD01309179 |
:101C9000BE01E0919E04F0919F048091A90490916F |
:101CA000AA0497FF03C0909581959F4F64E070E070 |
:101CB0000E94292EEB01CF01F7FF03C0909581957B |
:101CC0009F4F64E070E00E94292E260F371F2C0FD3 |
:101CD0003D1F3093BE012093BD018091BD019091C5 |
:101CE000BE01029704F16091E1017091E2018091DF |
:101CF000E3019091E40120E030E048E454E40E94E4 |
:101D0000322D88230CF03CC06091E1017091E2011A |
:101D10008091E3019091E4012AE037ED43EA5CE32E |
:101D20000E94832C25C08091BD019091BE018F5FE0 |
:101D30009F4F34F56091E1017091E2018091E301E0 |
:101D40009091E40120E030E046E154E40E94352D1A |
:101D50001816B4F46091E1017091E2018091E30101 |
:101D60009091E4012AE037ED43EA5CE30E94822C83 |
:101D70006093E1017093E2018093E3019093E401A9 |
:101D800081E08093C40180917800909179009093D4 |
:101D9000A1048093A0042091140230911502409177 |
:101DA0001602509117028091BD019091BE01AA27A1 |
:101DB00097FDA095BA2F280F391F4A1F5B1F20934C |
:101DC0001402309315024093160250931702E090CC |
:101DD0001402F09015020091160210911702609102 |
:101DE000140270911502809116029091170220E062 |
:101DF00034E040E050E00E945E2EE21AF30A040B49 |
:101E0000150BE0921402F092150200931602109343 |
:101E1000170283E08093CA0187E08093C9017CC0E8 |
:101E20008091AE049091AF042091780030917900B8 |
:101E3000820F931F9093AF048093AE048091A60409 |
:101E40008F5F8093A6048091A604853008F460C05B |
:101E5000809178009091790090930E0180930D010C |
:101E60001092A6048091A2049091A3042091AE0444 |
:101E70003091AF04821B930B2091300230913102DC |
:101E8000821B930B9093C6018093C5016091AE04B1 |
:101E90007091AF04E0900901F0900A0100910B01EC |
:101EA00010910C01882777FD8095982FA801970144 |
:101EB000220F331F441F551F2E0D3F1D401F511F62 |
:101EC000620F731F841F951F24E030E040E050E054 |
:101ED0000E945E2E2093090130930A0140930B016A |
:101EE00050930C012091A2043091A3048091090128 |
:101EF00090910A01A0910B01B0910C01281B390BA4 |
:101F000030933102209330021092AF041092AE044D |
:101F10001092CA011092C9018091CA0180937C007D |
:101F20008FEE80937A00FF91EF91DF91CF91BF9177 |
:101F3000AF919F918F917F916F915F914F913F9161 |
:101F40002F911F910F91FF90EF900F900FBE0F9068 |
:101F50001F901895CF93DF93A3E0B0E00E94792EF5 |
:101F6000802DC82FDD27C531D10508F02A97C7BDC0 |
:101F700084E690E00E94D60B80910D0190910E01B5 |
:101F800082559340D0F4C0E0D0E017C0C7BD82E3D3 |
:101F900090E00E94D60B85E591E09F938F931F926E |
:101FA0000E94B70780910D0190910E010F900F9044 |
:101FB0000F908458934020F02196CA3FD10530F30A |
:101FC000A3E0B0E00C2E0E94812EC093AB048CE203 |
:101FD00091E00E94D60BDF91CF910895E9E1F1E005 |
:101FE00080E2819391E0E936F907D9F70895FF92ED |
:101FF0000F931F938091CE01282F3327C901817041 |
:102000009070682F882391F08091CF01882311F080 |
:10201000815002C0809169018093CF01E9E1F1E034 |
:1020200080E2819391E0E936F907D9F7A90142707E |
:10203000507021FF0DC08091CF018F5F8093CF0141 |
:10204000E9E1F1E080E2819391E0E936F907D9F71F |
:10205000662321F0452B11F01092CF0181E180938E |
:10206000CD018091CF0199279F938F9382ED93E0CB |
:102070009F938F9311E0F12EFF920E94B70700917A |
:10208000CF010F900F900F900F900F90053009F433 |
:10209000F8C1063090F4023009F4C8C0033030F4BF |
:1020A0000023F1F0013009F07CC35DC0033009F476 |
:1020B00012C1043009F075C361C1083009F4B9C216 |
:1020C000093038F4063009F432C2073009F069C328 |
:1020D0008DC2093009F4EAC20A3009F062C324C390 |
:1020E0001092CD0180EC93E09F938F93FF920E941A |
:1020F000B70784E18093CD01209100018FE390E048 |
:102100009F938F931F921F92822F6AE00E94092E45 |
:10211000892F99279F938F93822F0E94092E9927A9 |
:102120009F938F938DEA93E09F938F93FF920E94EA |
:10213000B70788E28093CD010E940B0299279F93F5 |
:102140008F9380EA93E09F938F93FF920E94B7074B |
:102150008CE38093CD0180E993E09F938F93FF926E |
:102160000E94B707B4C08091EC0480FF47C0109272 |
:10217000CD0180913002909131029F938F9381E83D |
:1021800093E09F938F930F930E94B70784E180930E |
:10219000CD0180913202909133029F938F9382E719 |
:1021A00093E09F938F930F930E94B70788E28093E9 |
:1021B000CD0180910D0190910E019F938F9383E645 |
:1021C00093E09F938F930F930E94B7078CE38093C4 |
:1021D000CD018091AB0499279F938F9384E593E081 |
:1021E0009F938F930F930E94B7078DB79EB7449626 |
:1021F0000FB6F8949EBF0FBE8DBFD8C284E1809306 |
:10220000CD018DE493E09F938F930F930E94B707C6 |
:1022100088E28093CD018FE393E09F938F930F9398 |
:102220000E94B7078DB79EB70696E2CF1092CD01F8 |
:1022300085E393E09F938F93FF920E94B70784E119 |
:102240008093CD016091E8017091E9018091EA01EC |
:102250009091EB0120E034E040E050E00E945E2EDF |
:102260005F934F933F932F9386E293E09F938F93D7 |
:10227000FF920E94B70788E28093CD016091F00140 |
:102280007091F1018091F2019091F30120E034E02E |
:1022900040E050E00E945E2E5F934F933F932F9358 |
:1022A00087E193E09F938F93FF920E94B7078CE39F |
:1022B0008093CD0180911802909119029F938F9382 |
:1022C00088E093E09F938F93FF920E94B7078DB7AA |
:1022D0009EB746968DCF1092CD018091BC0490910F |
:1022E000BD042091BA043091BB049F938F933F9318 |
:1022F0002F9388EF92E09F938F93FF920E94B707EE |
:1023000084E18093CD018091C0049091C10420911B |
:10231000BE043091BF049F938F933F932F9388EE19 |
:1023200092E09F938F93FF920E94B70788E2809379 |
:10233000CD018091C4049091C5042091C2043091D4 |
:10234000C3049F938F933F932F9388ED92E09F93C5 |
:102350008F93FF920E94B7078CE38093CD01809109 |
:10236000C8049091C9042091C6043091C7049F937A |
:102370008F933F932F9388EC92E07AC01092CD0117 |
:10238000E091E504FF27EE0FFF1FE854FB4F20818B |
:102390003181E091E404FF27EE0FFF1FE854FB4F6B |
:1023A000808191813F932F939F938F9388EB92E04D |
:1023B0009F938F93FF920E94B70784E18093CD0192 |
:1023C000E091E704FF27EE0FFF1FE854FB4F208149 |
:1023D0003181E091E604FF27EE0FFF1FE854FB4F29 |
:1023E000808191813F932F939F938F9388EA92E00E |
:1023F0009F938F93FF920E94B70788E28093CD014D |
:10240000E091E904FF27EE0FFF1FE854FB4F208106 |
:102410003181E091E804FF27EE0FFF1FE854FB4FE6 |
:10242000808191813F932F939F938F9388E992E0CE |
:102430009F938F93FF920E94B7078CE38093CD0107 |
:10244000E091EB04FF27EE0FFF1FE854FB4F2081C4 |
:102450003181E091EA04FF27EE0FFF1FE854FB4FA4 |
:10246000808191813F932F939F938F9388E892E08F |
:102470009F938F93FF920E94B7078DB79EB74C969C |
:10248000B7CE1092CD018AE792E09F938F93FF928F |
:102490000E94B70784E18093CD012091D70130914C |
:1024A000D8018091B3019091B4016091BF013F9335 |
:1024B0002F9377270E94292E7F936F938BE692E0CC |
:1024C0009F938F93FF920E94B70788E28093CD017C |
:1024D0002091D9013091DA018091B5019091B60136 |
:1024E0006091C0013F932F9377270E94292E7F93FD |
:1024F0006F938CE592E09F938F93FF920E94B707B2 |
:102500008CE38093CD012091DB013091DC0180913F |
:10251000B7019091B8016091C1013F932F93772744 |
:102520000E94292E7F936F938DE492E056C0109203 |
:10253000CD0180E492E09F938F93FF920E94B707B2 |
:1025400084E18093CD012091DD013091DE01809105 |
:10255000BB019091BC016091C2013F932F937727FB |
:102560000E94292E7F936F9381E392E09F938F9334 |
:10257000FF920E94B70788E28093CD012091DF018E |
:102580003091E0018091B9019091BA016091C3014D |
:102590003F932F9377270E94292E7F936F9382E298 |
:1025A00092E09F938F93FF920E94B7078CE38093F2 |
:1025B000CD016091E1017091E2018091E301909180 |
:1025C000E4010091A0041091A1040E940B2D7F93BF |
:1025D0006F931F930F9383E192E09F938F93FF92EA |
:1025E0000E94B7078DB79EB7489602CE84E18093CC |
:1025F000CD0180910701909108019F938F9384E012 |
:1026000092E09F938F93FF920E94B70788E2809396 |
:10261000CD018091280299279F938F9385EF91E0B8 |
:102620009F938F93FF920E94B7078DB79EB70A962C |
:10263000DFCD1092CD0186EE91E09F938F93FF92B4 |
:102640000E94B70784E18093CD0180911C02909194 |
:102650001D029F938F9387ED91E09F938F93FF923D |
:102660000E94B70788E28093CD0180911802909173 |
:1026700019029F938F9388EC91E09F938F93FF9221 |
:102680000E94B7078CE38093CD0180911A0290914C |
:102690001B029F938F9389EB91E09F938F93FF92FF |
:1026A0000E94B7078DB79EB74296A2CD1092CD017A |
:1026B00080912002909121029F938F938DEA91E067 |
:1026C0009F938F93FF920E94B70784E18093CD017F |
:1026D00080912202909123029F938F9381EA91E04F |
:1026E0009F938F93FF920E94B70788E28093CD015A |
:1026F00080912402909125029F938F9385E991E028 |
:102700009F938F93FF920E94B7078CE38093CD0134 |
:1027100080912602909127029F938F9389E891E000 |
:102720009F938F93FF925FCD1092CD0181E891E04E |
:102730009F938F93FF920E94B70784E18093CD010E |
:1027400080918D0199279F938F9383E791E09F93C9 |
:102750008F93FF920E94B70788E28093CD0180910A |
:10276000AE019091AF019F938F9385E691E09F9387 |
:102770008F93FF920E94B7078CE38093CD018091E5 |
:10278000080599279F938F938091070599279F9319 |
:102790008F9387E591E09F938F93FF920E94B707F5 |
:1027A00024CD0150009369011092CF011092CE0107 |
:1027B0001F910F91FF9008951092B9008AE28093C3 |
:1027C000B800089585EA8093BC0080E090E0089509 |
:1027D00084E98093BC0008951092B9008093BB00F7 |
:1027E00085E88093BC0080E090E008951F920F92EE |
:1027F0000FB60F9211248F939F93EF93FF938091C5 |
:10280000D0018F5F8093D00181508330A9F1843053 |
:1028100028F4813091F0823008F50AC0853089F1C2 |
:102820008530B8F18630A9F1873009F061C045C024 |
:102830008091D101880F8E5A09C08091D1018F5F9C |
:102840008093D101815027C0809171021092B9000C |
:102850008093BB0085E88093BC004AC084E98093E4 |
:10286000BC008091D101843018F41092D00102C0D4 |
:102870001092D10185EAEFCF8091D201880F8D5A55 |
:10288000E5CF8091BB00E091D201FF27E055FB4FDF |
:1028900080838091D201813039F08130A8F282307A |
:1028A00031F0833029F506C080917202CFCF80913C |
:1028B0007502CCCF80917702C9CF8091D2019091DF |
:1028C000BB00E82FFF27E055FB4F94838F5F809379 |
:1028D000D201843010F01092D20184E98093BC00C0 |
:1028E0008AE090E090937B0180937A011092D0016E |
:1028F0008091BC0080688093BC00FF91EF919F9114 |
:102900008F910F900FBE0F901F9018954CEB50E0D9 |
:1029100084E9DA018C931092D0012BEB30E0F901BD |
:1029200080811092D10180E88C931092BD001092AA |
:10293000BA001082E9EBF0E01082A8EBB0E01C9244 |
:1029400010828AE28C9385EADA018C931082F90175 |
:10295000108285E88C93089583EC80938100EFE6E4 |
:10296000F0E08081806280831092DC011092DB01B4 |
:102970001092DA011092D9011092D8011092D70169 |
:1029800008951F920F920FB60F9211240F931F9369 |
:102990002F933F934F935F936F937F938F939F9367 |
:1029A000AF93BF93CF93DF93EF93FF932091860074 |
:1029B000309187008091D5019091D601281B390B69 |
:1029C00080918600909187009093D6018093D501E5 |
:1029D000C9018D5D95408356994148F481E090E0AE |
:1029E0009093D4018093D30110926A0166C0C09184 |
:1029F000D301D091D401CA30D1050CF05EC0C90119 |
:102A00008B5F9040845B914008F052C08901025D69 |
:102A10001140FE01EE0FFF1FE854FB4F80819181B2 |
:102A20009801281B390BC90137FF03C09095819588 |
:102A30009F4F06974CF480912802883C28F480919F |
:102A40002802865F80932802FE01EE0FFF1FE854E4 |
:102A5000FB4F20813181C901880F991F820F931F7D |
:102A6000800F911F64E070E00E94292EC80101963A |
:102A7000861797071CF46150704007C00150104042 |
:102A80006017710714F46F5F7F4FFE01EE0FFF1F99 |
:102A9000DF01A854BB4F8D919C9111979B01281B7E |
:102AA000390BE253FB4F3183208311967C936E9355 |
:102AB0002196D093D401C093D301FF91EF91DF9180 |
:102AC000CF91BF91AF919F918F917F916F915F91C6 |
:102AD0004F913F912F911F910F910F900FBE0F902B |
:102AE0001F901895AF92BF92CF92DF92EF92FF9214 |
:102AF0000F931F9310927A008091BF01882369F091 |
:102B00008091B3019091B4016091BF0177270E9439 |
:102B1000292E70932105609320058091C0018823A0 |
:102B200069F08091B5019091B6016091C00177275D |
:102B30000E94292E70931F0560931E058091C1018C |
:102B4000882369F08091B7019091B8016091C1012B |
:102B500077270E94292E70932D0560932C05809174 |
:102B6000C2018823D9F1E0902905F0902A056091EF |
:102B7000BB017091BC012091C2010027F7FC0095B8 |
:102B8000102F5701680183E0AA0CBB1CCC1CDD1C74 |
:102B90008A95D1F7AE18BF08C00AD10A882777FDF9 |
:102BA0008095982FB4E0660F771F881F991FBA95FC |
:102BB000D1F73327442755270E945E2EA20EB31E5D |
:102BC000C41ED51EC601B50128E030E040E050E04B |
:102BD0000E945E2E30932A05209329058091C3011F |
:102BE0008823D9F1E0903205F09033056091B90166 |
:102BF0007091BA012091C3010027F7FC0095102FB6 |
:102C000057016801A3E0AA0CBB1CCC1CDD1CAA95D3 |
:102C1000D1F7AE18BF08C00AD10A882777FD809582 |
:102C2000982FF4E0660F771F881F991FFA95D1F748 |
:102C30003327442755270E945E2EA20EB31EC41EC2 |
:102C4000D51EC601B50128E030E040E050E00E940A |
:102C50005E2E30933305209332058091C401882382 |
:102C6000A1F1E0902305F09024056091BD017091E1 |
:102C7000BE012091C4010027F7FC0095102F5701D9 |
:102C80006801E3E0AA0CBB1CCC1CDD1CEA95D1F763 |
:102C9000AE18BF08C00AD10A882777FD8095982F03 |
:102CA0003327442755270E945E2EA20EB31EC41E52 |
:102CB000D51EC601B50128E030E040E050E00E949A |
:102CC0005E2E30932405209323051092B4011092B8 |
:102CD000B3011092BF011092B6011092B50110928B |
:102CE000C0011092B8011092B7011092C101109268 |
:102CF000BA011092B9011092C3011092BC01109256 |
:102D0000BB011092C2011092BE011092BD0110923F |
:102D1000C40180910C0290910D02A0910E02B0911D |
:102D20000F028093F8019093F901A093FA01B093F8 |
:102D3000FB018091FC019091FD01A091FE01B091F9 |
:102D4000FF018093E8019093E901A093EA01B09319 |
:102D5000EB018091040290910502A0910602B091CE |
:102D600007028093F0019093F101A093F201B093D8 |
:102D7000F3018091000290910102A0910202B091B2 |
:102D800003028093EC019093ED01A093EE01B093C8 |
:102D9000EF018091080290910902A0910A02B0917E |
:102DA0000B028093F4019093F501A093F601B09388 |
:102DB000F7018FEE80937A0020912002309121025A |
:102DC0008091E804E82FFF27EE0FFF1FE854FB4F28 |
:102DD0008081918182599F4F281739071CF42F5FFA |
:102DE0003F4F0CC08081918182599F4F821793077A |
:102DF0004CF42115310531F021503040309321023F |
:102E00002093200220912202309123028091E90434 |
:102E1000E82FFF27EE0FFF1FE854FB4F80819181C1 |
:102E200082599F4F281739071CF42F5F3F4F0CC062 |
:102E30008081918182599F4F821793074CF421150D |
:102E4000310531F02150304030932302209322028B |
:102E500020912402309125028091EA04E82FFF2777 |
:102E6000EE0FFF1FE854FB4F8081918182599F4FE5 |
:102E7000281739071CF42F5F3F4F0CC080819181C8 |
:102E800082599F4F821793074CF42115310531F079 |
:102E900021503040309325022093240220912602B5 |
:102EA000309127028091EB04E82FFF27EE0FFF1FE0 |
:102EB000E854FB4F8081918182599F4F2817390731 |
:102EC0001CF42F5F3F4F0CC08081918182599F4F2E |
:102ED000821793074CF42115310531F02150304011 |
:102EE00030932702209326028091200290912102A4 |
:102EF00097FF05C010922102109220020AC08F3F56 |
:102F0000910539F034F08FEF90E090932102809397 |
:102F10002002809122029091230297FF05C0109217 |
:102F20002302109222020AC08F3F910539F034F03B |
:102F30008FEF90E0909323028093220280912402ED |
:102F40009091250297FF05C010922502109224024D |
:102F50000AC08F3F910539F034F08FEF90E09093E5 |
:102F6000250280932402809126029091270297FFE8 |
:102F700005C010922702109226020AC08F3F9105C9 |
:102F800039F034F08FEF90E090932702809326027F |
:102F90001F910F91FF90EF90DF90CF90BF90AF9077 |
:102FA000089510927A008091BF01882369F0809182 |
:102FB000B3019091B4016091BF0177270E94292E3F |
:102FC00070932105609320058091C001882369F0EA |
:102FD0008091B5019091B6016091C00177270E9460 |
:102FE000292E70931F0560931E058091C1018823CF |
:102FF00069F08091B7019091B8016091C101772784 |
:103000000E94292E70932D0560932C058091C2019A |
:103010008823D1F06091BB017091BC012091C20165 |
:10302000882777FD8095982FF4E0660F771F881F1B |
:10303000991FFA95D1F73327442755270E945E2E12 |
:1030400030932A05209329058091C3018823D1F06C |
:103050006091B9017091BA012091C301882777FD71 |
:103060008095982FE4E0660F771F881F991FEA95D7 |
:10307000D1F73327442755270E945E2E309333051E |
:10308000209332058091C401882399F06091BD019D |
:103090007091BE012091C401882777FD8095982FFB |
:1030A0003327442755270E945E2E30932405209312 |
:1030B00023051092B4011092B3011092BF01109237 |
:1030C000B6011092B5011092C0011092B801109291 |
:1030D000B7011092C1011092BA011092B901109279 |
:1030E000C3011092BC011092BB011092C201109258 |
:1030F000BE011092BD011092C4018FEE80937A0040 |
:1031000020912002309121028091E804E82FFF27CE |
:10311000EE0FFF1FE854FB4F8081918182599F4F32 |
:10312000281739071CF42F5F3F4F0CC08081918115 |
:1031300082599F4F821793074CF42115310531F0C6 |
:10314000215030403093210220932002209122020E |
:10315000309123028091E904E82FFF27EE0FFF1F33 |
:10316000E854FB4F8081918182599F4F281739077E |
:103170001CF42F5F3F4F0CC08081918182599F4F7B |
:10318000821793074CF42115310531F0215030405E |
:1031900030932302209322022091240230912502B1 |
:1031A0008091EA04E82FFF27EE0FFF1FE854FB4F42 |
:1031B0008081918182599F4F281739071CF42F5F16 |
:1031C0003F4F0CC08081918182599F4F8217930796 |
:1031D0004CF42115310531F0215030403093250257 |
:1031E0002093240220912602309127028091EB0443 |
:1031F000E82FFF27EE0FFF1FE854FB4F80819181DE |
:1032000082599F4F281739071CF42F5F3F4F0CC07E |
:103210008081918182599F4F821793074CF4211529 |
:10322000310531F02150304030932702209326029F |
:10323000809120029091210297FF05C010922102F7 |
:10324000109220020AC08F3F910539F034F08FEFC1 |
:1032500090E090932102809320028091220290912D |
:10326000230297FF05C010922302109222020AC087 |
:103270008F3F910539F034F08FEF90E09093230267 |
:1032800080932202809124029091250297FF05C02D |
:1032900010922502109224020AC08F3F910539F046 |
:1032A00034F08FEF90E09093250280932402809178 |
:1032B00026029091270297FF05C0109227021092D4 |
:1032C000260208958F3F910539F034F08FEF90E09A |
:1032D000909327028093260208951F938091EF0414 |
:1032E0008B3F98F08B3F19F4809120020EC08C3FE9 |
:1032F00019F48091220209C08D3F19F480912402B3 |
:1033000004C08E3F21F48091260280938501809134 |
:103310008501882319F41092850104C08F3F11F4B0 |
:10332000809385018091EE048B3F98F08B3F19F4D8 |
:10333000809120020EC08C3F19F48091220209C0B6 |
:103340008D3F19F48091240204C08E3F21F48091B6 |
:1033500026028093840180918401882319F41092BD |
:10336000840105C0843618F084E68093840180913E |
:10337000F0048B3F98F08B3F19F4809120020EC02F |
:103380008C3F19F48091220209C08D3F19F480917D |
:10339000240204C08E3F21F480912602809386018E |
:1033A00080918601882319F41092860105C0843625 |
:1033B00018F084E6809386018091F2048B3F98F0A8 |
:1033C0008B3F19F4809120020EC08C3F19F480913C |
:1033D000220209C08D3F19F48091240204C08E3F5F |
:1033E00021F48091260280938701809187018823B0 |
:1033F00019F41092870104C08F3F11F48093870164 |
:103400008091F9048B3F98F08B3F19F48091200252 |
:103410000EC08C3F19F48091220209C08D3F19F42F |
:103420008091240204C08E3F21F480912602809373 |
:10343000880180918801882319F41092880104C0C2 |
:103440008F3F11F4809388018091FA048B3F98F0AC |
:103450008B3F19F4809120020EC08C3F19F48091AB |
:10346000220209C08D3F19F48091240204C08E3FCE |
:1034700021F48091260280938901809189018B300B |
:1034800010F48AE002C08F3F11F48093890180918B |
:10349000FB048B3F98F08B3F19F4809120020EC003 |
:1034A0008C3F19F48091220209C08D3F19F480915C |
:1034B000240204C08E3F21F48091260280938A0169 |
:1034C00080918A01882319F410928A0104C08F3FE9 |
:1034D00011F480938A01809100058B3F98F08B3F17 |
:1034E00019F4809120020EC08C3F19F480912202C1 |
:1034F00009C08D3F19F48091240204C08E3F21F44D |
:103500008091260280938C0180918C01882319F48C |
:1035100010928C0104C08F3F11F480938C01809134 |
:1035200001058B3F98F08B3F19F4809120020EC06B |
:103530008C3F19F48091220209C08D3F19F48091CB |
:10354000240204C08E3F21F480912602809336022B |
:1035500080913602882319F41092360204C08F3FFE |
:1035600011F480933602809102058B3F98F08B3FD7 |
:1035700019F4809120020EC08C3F19F48091220230 |
:1035800009C08D3F19F48091240204C08E3F21F4BC |
:10359000809126028093370280913702882319F4A4 |
:1035A0001092370204C08F3F11F48093370280914C |
:1035B00003058B3F98F08B3F19F4809120020EC0D9 |
:1035C0008C3F19F48091220209C08D3F19F480913B |
:1035D000240204C08E3F21F4809126028093380299 |
:1035E00080913802882319F41092380204C08F3F6A |
:1035F00011F480933802809104058B3F98F08B3F43 |
:1036000019F4809120020EC08C3F19F4809122029F |
:1036100009C08D3F19F48091240204C08E3F21F42B |
:10362000809126028093390280913902882319F40F |
:103630001092390204C08F3F11F4809339029091A7 |
:1036400005059B3FB0F09B3F19F48091200204C018 |
:103650009C3F29F48091220280938D010CC09D3FF4 |
:1036600019F480912402F8CF9E3F29F4809126021C |
:10367000F3CF90938D0180918D01882319F41092DE |
:103680008D0104C08F3F11F480938D019B3FB0F0FA |
:103690009B3F19F48091200204C09C3F29F4809143 |
:1036A000220280938D010CC09D3F19F48091240269 |
:1036B000F8CF9E3F29F480912602F3CF90938D019D |
:1036C00080918D01882319F410928D0104C08F3FE1 |
:1036D00011F480938D019B3FB0F09B3F19F48091D2 |
:1036E000200204C09C3F29F48091220280938D0126 |
:1036F0000CC09D3F19F480912402F8CF9E3F29F41D |
:1037000080912602F3CF90938D0180918D018823C3 |
:1037100019F410928D0104C08F3F11F480938D0134 |
:1037200080910A058B3F98F08B3F19F4809120021D |
:103730000EC08C3F19F48091220209C08D3F19F40C |
:103740008091240204C08E3F21F480912602809350 |
:103750008E0180918E01882319F410928E0104C08D |
:103760008F3F11F480938E0110918C01612F772788 |
:1037700067FD7095872F972F0E94282D17FF06C091 |
:1037800020E030E040E853E40E94832C27E137EB4F |
:1037900041ED58E30E94A22D609380017093810156 |
:1037A00080938201909383018091F70480932B058D |
:1037B0008091F604809322051F91089581E0809303 |
:1037C000E40432E03093E50483E08093E60424E0EF |
:1037D0002093E70445E04093E80486E08093E90401 |
:1037E00087E08093EA0488E08093EB041092EC0475 |
:1037F0008EE18093ED048BEF8093EF048AE0809359 |
:10380000F00492E39093EE049093F2043093F10469 |
:103810002093F3041092F40480E18093F5048FE088 |
:103820008093F6048AEF8093F7048AE18093F8048A |
:1038300080E88093F9048FEA8093FA048093FB0474 |
:103840008EE58093FC0483E28093FD0484E1809301 |
:10385000FE041092FF0410920005109201051092D0 |
:103860000205109203051092040584E68093050575 |
:1038700088E28093060510920D059093070586E96E |
:10388000809308054093090590930A058AE5809383 |
:103890000B0510920C05A2E1B5E0EBE6F1E08CE03F |
:1038A00001900D928150E1F7089581E08093E40446 |
:1038B00082E08093E50483E08093E60494E09093B3 |
:1038C000E70445E04093E80486E08093E90487E05C |
:1038D0008093EA0438E03093EB041092EC048EE11C |
:1038E0008093ED048BEF8093EF048AE08093F004E3 |
:1038F00022E32093EE042093F2049093F10490933A |
:10390000F3043093F40480E18093F5048FE0809316 |
:10391000F6048AEF8093F7048AE18093F80480E844 |
:103920008093F90488E78093FA0496E99093FB0466 |
:103930008EE58093FC0483E28093FD0484E1809310 |
:10394000FE041092FF0410920005109201051092DF |
:103950000205109203051092040584E68093050584 |
:1039600088E28093060510920D0520930705909339 |
:1039700008054093090520930A058AE580930B0505 |
:1039800010920C05A2E1B5E0E3E7F1E08CE00190D4 |
:103990000D928150E1F7089580912F02882301F55F |
:1039A00010927202109271021092750210927702B8 |
:1039B00080919A01882311F08093710280919B017C |
:1039C000882311F08093720280919C01882311F06A |
:1039D0008093770280919D01882311F08093750276 |
:1039E0008091710299279093760480937504809159 |
:1039F00072029927909378048093770480917702DC |
:103A0000992790937A04809379048091750299277D |
:103A100090937C0480937B041092D0011092D1018A |
:103A20000E94E2130895CF93DF931092DE0110926B |
:103A3000DD011092E0011092DF0180E090E0A0E053 |
:103A4000B0E08093E1019093E201A093E301B09391 |
:103A5000E4011092D8011092D7011092DA0110926D |
:103A6000D9011092DC011092DB010E94D11785E090 |
:103A700090E00E94F30AEC01CE010E94FC0A882328 |
:103A8000D9F30E94D1178091EC0480FF10C080917F |
:103A90000D0190910E01875B934038F480910D01E8 |
:103AA00090910E018E5E924010F40E94AA0F8091B8 |
:103AB00000018A3041F5809120059091210597FF02 |
:103AC00003C0909581959F4F9093D8018093D70123 |
:103AD00080911E0590911F0597FF03C090958195D9 |
:103AE0009F4F9093DA018093D90180912C0590919A |
:103AF0002D0597FF03C0909581959F4F9093DC0112 |
:103B00008093DB0133C0809120059091210597FFC0 |
:103B100003C0909581959F4F62E070E00E94292E2E |
:103B20007093D8016093D70180911E0590911F0575 |
:103B300097FF03C0909581959F4F62E070E00E94CF |
:103B4000292E7093DA016093D90180912C05909110 |
:103B50002D0597FF03C0909581959F4F62E070E01F |
:103B60000E94292E7093DC016093DB018091320565 |
:103B70009091330597FF03C0909581959F4F60E129 |
:103B800070E00E94292E7093E0016093DF01809124 |
:103B9000290590912A0597FF03C0909581959F4F25 |
:103BA00060E170E00E94292E7093DE016093DD01D8 |
:103BB0006091A0047091A104882777FD8095982FCB |
:103BC0000E94282D6093E1017093E2018093E3014C |
:103BD0009093E4011092FC011092FD011092FE01FD |
:103BE0001092FF0110920002109201021092020244 |
:103BF0001092030210920402109205021092060223 |
:103C000010920702109208021092090210920A0202 |
:103C100010920B0210920C0210920D0210920E02E2 |
:103C200010920F02109221051092200510921F058C |
:103C300010921E0510922D0510922C0580910901FD |
:103C400090910A01A0910B01B0910C019093A304F3 |
:103C50008093A2041092C6011092C5011092140222 |
:103C600010921502109216021092170280911802FB |
:103C70009091190290931B0280931A020E944B2C80 |
:103C800082E390E09093AD018093AC01DF91CF91FE |
:103C900008951F93182F0EC080912F02882361F47E |
:103CA00084E690E09093AD018093AC018AEF90E0C0 |
:103CB0000E94D60B115080F71F9108952F923F92CA |
:103CC0004F925F926F927F928F929F92AF92BF922C |
:103CD000CF92DF92EF92FF920F931F93CF93DF93D8 |
:103CE000CDB7DEB724970FB6F894DEBF0FBECDBFB9 |
:103CF0000E947215299AE091E604FF27EE0FFF1F3C |
:103D0000E854FB4F6080718048E750E0640E751EF8 |
:103D100077FE02C06624772480912802843608F05A |
:103D20005BC080910201882399F4809103019091F6 |
:103D300004018F5F9F4F61F488E99AE39093AD018E |
:103D40008093AC0180E09CE0909304018093030198 |
:103D50008091450290914602009731F0019790932F |
:103D600046028093450204C010922F0210921E0258 |
:103D7000809100018A3011F4289A01C0289880911E |
:103D8000400290914102815D974018F18091FD04BD |
:103D9000682E772481E080931E02E091E404FF27DF |
:103DA000EE0FFF1FE854FB4F11821082E091E504F3 |
:103DB000FF27EE0FFF1FE854FB4F11821082E091A6 |
:103DC000E704FF27EE0FFF1FE854FB4F118210821C |
:103DD000CAC110922F02C7C1809128028D3808F401 |
:103DE000C2C110921E028091FE0422E3829FC00194 |
:103DF0001124909346028093450279E2671671047C |
:103E00006CF08091400290914102AFEF8F3F9A0792 |
:103E100081F101969093410280934002809140028B |
:103E200090914102883C910520F0B8E26B16710434 |
:103E300004F51092570210925802109259021092F3 |
:103E40005A0210925302109254021092550210928C |
:103E5000560210920C0210920D0210920E02109255 |
:103E60000F02109210021092110210921202109280 |
:103E70001302E9EC6E1671040CF4D5C080912F0288 |
:103E8000882309F070C1E091E704FF27EE0FFF1FC0 |
:103E9000E854FB4F808191818C3491050CF4C0C0B3 |
:103EA000809144028F5F80934402893C08F45BC197 |
:103EB000299810922F0210924402109241021092FF |
:103EC00040028091E404282F3327F901EE0FFF1FF1 |
:103ED000E854FB4F80819181873491059CF4E091F7 |
:103EE000E504FF27EE0FFF1FE854FB4F0190F08120 |
:103EF000E02DF7FF03C0F095E195FF4FE734F105A2 |
:103F00000CF46CC08091E504682F7727DB01AA0FC1 |
:103F1000BB1FA854BB4F8D919C911197873491057D |
:103F20003CF0F901EE0FFF1FE854FB4F80819181B7 |
:103F30008D919C918734910564F0F901EE0FFF1F7C |
:103F4000E854FB4F808191818734910514F042E061 |
:103F500001C041E0FB01EE0FFF1FE854FB4F8081E1 |
:103F60009181863491055CF4F901EE0FFF1FE8544E |
:103F7000FB4F80819181873491050CF043E0FB0178 |
:103F8000EE0FFF1FE854FB4F808191818A5B9F4FAA |
:103F90005CF4F901EE0FFF1FE854FB4F8081918123 |
:103FA000873491050CF044E0660F771F68547B4F0F |
:103FB000DB018D919C918A5B9F4F5CF4220F331F34 |
:103FC00028543B4FF90180819181863491050CF48E |
:103FD00045E0A2E0B0E0042E0E94812E8091EC0426 |
:103FE00080FF10C080910D0190910E01875B93407E |
:103FF00038F480910D0190910E018E5E924010F484 |
:104000000E94AA0F0E940B024AE364EE74E00E9431 |
:1040100032020E94131D0E940B020E94491EA3C07F |
:1040200010924402A0C043E2641671040CF09BC0DD |
:104030008091E704482F5527FA01EE0FFF1FE8543F |
:10404000FB4F80819181855B9F4F0CF06DC080910B |
:1040500043028F5F80934302893C08F467C088EC79 |
:104060008093430281E090E090934102809340026C |
:1040700081E080932F0210924F0210925002109212 |
:1040800051021092520210920C0210920D021092E4 |
:104090000E0210920F021092100210921102109252 |
:1040A0001202109213021092FC011092FD01109264 |
:1040B000FE011092FF01109204021092050210926C |
:1040C0000602109207028091E8019091E901A09107 |
:1040D000EA01B091EB018093000290930102A0935A |
:1040E0000202B09303028091F0019091F101A0913E |
:1040F000F201B091F3018093080290930902A0931A |
:104100000A02B0930B0210925702109258021092BA |
:10411000590210925A0210925302109254021092B5 |
:1041200055021092560202C010924302440F551FCE |
:1041300048545B4FDA018D919C918C3491058CF041 |
:10414000809142028F5F80934202893C60F010921E |
:104150002F0288EC8093420210924102109240029A |
:1041600002C01092420280916A01815080936A01DC |
:1041700080916A018F3F29F080911E02882309F403 |
:10418000BCC10E946D19E091E404FF27EE0FFF1FF0 |
:10419000DF01A854BB4F4D915C918091F304482EF0 |
:1041A0005524E253FB4F808191812091F404332701 |
:1041B000449D5001459DB00C549DB00C1124FC0150 |
:1041C000E29FC001E39F900DF29F900D1124A80E75 |
:1041D000B91EB0922A02A0922902E091E504FF27BD |
:1041E000EE0FFF1FDF01A854BB4F4D915C91E253CE |
:1041F000FB4F80819181449D4001459D900C549DD1 |
:10420000900C1124AC01429FC001439F900D529F1E |
:10421000900D1124880E991E90922C0280922B02F0 |
:10422000E091E704FF27EE0FFF1FE854FB4F80816A |
:104230009181909581959F4F90932E0280932D02AE |
:1042400010918901612F772767FD7095872F972F30 |
:104250000E94282D17FF06C020E030E040E853E41C |
:104260000E94832C20E030E040E251E40E94832C45 |
:1042700020E030E040E85BE30E94A22D6B017C016E |
:1042800060932E0570932F05809330059093310530 |
:1042900010918A01612F772767FD7095872F972FDF |
:1042A0000E94282D17FF06C020E030E040E853E4CC |
:1042B0000E94832C20E030EE4BE257E40E94C52C94 |
:1042C0006093250570932605809327059093280514 |
:1042D0008091EC0482FF0CC080E090E0A0E0B0E0B0 |
:1042E0008093250590932605A0932705B093280574 |
:1042F00020E030E040E050E0C701B6010E94322DDE |
:10430000882364F480E090E0A0E0B0E080932E0584 |
:1043100090932F05A0933005B093310520E030E055 |
:1043200040E050E0609125057091260580912705B9 |
:10433000909128050E94322D882364F480E090E05B |
:10434000A0E0B0E08093250590932605A093270573 |
:10435000B093280580910C05992782FDCEC083FD7E |
:10436000CCC08091E8019091E901A091EA01B0915F |
:10437000EB0181569A4EA040B04044F1C20173E077 |
:10438000880F991F7A95E1F7A501481B590B5093A7 |
:104390002A02409329028091E8019091E901A091BD |
:1043A000EA01B091EB0181589843A140B0400CF470 |
:1043B0003FC0C20164E0880F991F6A95E1F7481B6E |
:1043C000590B50932A024093290232C08091E80190 |
:1043D0009091E901A091EA01B091EB01805A9541D9 |
:1043E000AF4FBF4F2CF5920153E0220F331F5A9568 |
:1043F000E1F72A0D3B1D30932A0220932902809178 |
:10440000E8019091E901A091EA01B091EB01815896 |
:104410009843A140B04064F0C20144E0880F991F66 |
:104420004A95E1F7281B390B30932A022093290281 |
:104430008091F0019091F101A091F201B091F3010E |
:1044400081569A4EA040B0403CF1C20133E0880F43 |
:10445000991F3A95E1F7A401481B590B50932C0280 |
:1044600040932B028091F0019091F101A091F20113 |
:10447000B091F30181589843A140B0400CF43DC085 |
:1044800024E0440C551C2A95E1F744195509509332 |
:104490002C0240932B0231C08091F0019091F101E8 |
:1044A000A091F201B091F301805A9541AF4FBF4FF7 |
:1044B00024F5920193E0220F331F9A95E1F7280D1E |
:1044C000391D30932C0220932B028091F0019091A2 |
:1044D000F101A091F201B091F30181589843A140FC |
:1044E000B0405CF084E0440C551C8A95E1F7241937 |
:1044F000350930932C0220932B028091E504E82F9C |
:10450000FF27EE0FFF1FE854FB4F20813181809180 |
:104510000B05482F55274217530724F480910C05AB |
:1045200082FD0DC02081318188279927841B950B3E |
:10453000281739077CF480910C0583FF0BC081E0BC |
:104540008093350280910A0599278615970524F4F2 |
:104550003C0102C0109235028091E404E82FFF274D |
:10456000EE0FFF1FE854FB4F8081918148175907D8 |
:1045700024F480910C0580FD0DC0208131818827B5 |
:104580009927841B950B281739078CF480910C050B |
:1045900081FF0DC081E0809334021092350280913A |
:1045A0000A0599278615970524F43C0102C010924C |
:1045B000340290901E02992041F110922E02109226 |
:1045C0002D0210922A021092290210922C021092AF |
:1045D0002B028DEC9CECACECBDE380932E0590930C |
:1045E0002F05A0933005B09331058AE097EDA3EA3B |
:1045F000BBE38093250590932605A0932705B093F0 |
:10460000280510923502109234028091C7019091D2 |
:10461000C8018D54914008F41CC12091EC013091E7 |
:10462000ED014091EE015091EF018091E8019091F0 |
:10463000E901A091EA01B091EB01281B390B4A0B6B |
:104640005B0BE090F401F090F5010091F601109100 |
:10465000F7018091F0019091F101A091F201B091E8 |
:10466000F301E81AF90A0A0B1B0B1092C801109209 |
:10467000C70110927A006091290570912A0577FF91 |
:1046800003C0709561957F4FE0913205F09133053D |
:10469000F7FF03C0F095E195FF4F8FEE80937A000E |
:1046A0006436710574F5E436F10574F5273A310581 |
:1046B0004105510534F08091D7019091D8010196C0 |
:1046C0000AC02A553F4F4F4F5F4F4CF48091D7019E |
:1046D0009091D80101979093D8018093D70187EAF0 |
:1046E000E816F104010511050CF066C09AE5E9161B |
:1046F0009FEFF9069FEF09079FEF19070CF074C0B1 |
:104700006AC0683C71059CF5E83CF10584F52E34DF |
:10471000A1E03A07A0E04A07A0E05A0734F08091F0 |
:10472000D7019091D80101960AC0235B3E4F4F4FAD |
:104730005F4F4CF48091D7019091D80101979093ED |
:10474000D8018093D701EEE4EE16E1E0FE06E0E04A |
:104750000E07E0E01E0784F5F3EBEF16FEEFFF0611 |
:10476000FFEF0F07FFEF1F070CF03EC034C02B39DF |
:1047700062E0360760E0460760E0560734F080915B |
:10478000D7019091D80101960AC026563D4F4F4F50 |
:104790005F4F4CF48091D7019091D801019790938D |
:1047A000D8018093D7018BE9E81682E0F80680E013 |
:1047B000080780E0180734F08091D9019091DA0160 |
:1047C00001960EC096E6E9169DEFF9069FEF0907E0 |
:1047D0009FEF19074CF48091D9019091DA0101976C |
:1047E0009093DA018093D90110927A008091E801C8 |
:1047F0009091E901A091EA01B091EB018093000250 |
:1048000090930102A0930202B09303028091F00101 |
:104810009091F101A091F201B091F301809308020F |
:1048200090930902A0930A02B0930B028091F801C1 |
:104830009091F901A091FA01B091FB0180931002CF |
:1048400090931102A0931202B09313028FEE809303 |
:104850007A004091250550912605609127057091B9 |
:10486000280549835A836B837C8320E030E040E055 |
:1048700050E069817A818B819C810E94322D88234E |
:1048800009F4F7C080913402882309F0F2C08091C6 |
:104890003502882309F0EDC06091E8017091E901CB |
:1048A0008091EA019091EB012091F804A22EBB24A3 |
:1048B000CC24DD24E0902905F0902A05A60195017D |
:1048C0000E945E2E0027F7FC0095102F2E193F093D |
:1048D000400B510B20934B0230934C0240934D02FE |
:1048E00050934E028091290590912A05AA2797FDA1 |
:1048F000A095BA2FB7FF07C0B095A0959095819568 |
:104900009F4FAF4FBF4F883C9105A105B1053CF4C7 |
:10491000CA01B90128E030E040E050E006C0CA0119 |
:10492000B90120E130E040E050E00E945E2E20938B |
:104930004B0230934C0240934D0250934E026091D3 |
:10494000F0017091F1018091F2019091F301E090FA |
:104950003205F0903305A60195010E945E2E0027D6 |
:10496000F7FC0095102F2E193F09400B510B209397 |
:104970004702309348024093490250934A02809183 |
:10498000320590913305AA2797FDA095BA2FB7FF5E |
:1049900007C0B095A095909581959F4FAF4FBF4FA1 |
:1049A000883C9105A105B1053CF4CA01B90128E094 |
:1049B00030E040E050E006C0CA01B90120E130E03B |
:1049C00040E050E00E945E2E209347023093480260 |
:1049D0004093490250934A0280914B0290914C02BD |
:1049E000A0914D02B0914E02853F51E0950750E0F5 |
:1049F000A50750E0B5072CF084EF91E0A0E0B0E00F |
:104A000009C08C509E4FAF4FBF4F64F48CE09EEFB7 |
:104A1000AFEFBFEF80934B0290934C02A0934D02F7 |
:104A2000B0934E028091470290914802A0914902B2 |
:104A3000B0914A02853F71E0970770E0A70770E0E8 |
:104A4000B7072CF084EF91E0A0E0B0E009C08C50F3 |
:104A50009E4FAF4FBF4FECF48CE09EEFAFEFBFEF38 |
:104A60008093470290934802A0934902B0934A0270 |
:104A700010C010924B0210924C0210924D021092F4 |
:104A80004E02109247021092480210924902109270 |
:104A90004A0210927A008091290590912A0597FF89 |
:104AA00003C0909581959F4F209132053091330539 |
:104AB00037FF03C0309521953F4F84369105E4F5CB |
:104AC00024363105E4F58091FC019091FD01A0911F |
:104AD000FE01B091FF0120914B0230914C024091B8 |
:104AE0004D0250914E02821B930BA40BB50B809389 |
:104AF000FC019093FD01A093FE01B093FF01809112 |
:104B0000040290910502A0910602B0910702209143 |
:104B10004702309148024091490250914A02821B5B |
:104B2000930BA40BB50B8093040290930502A09302 |
:104B30000602B0930702BEC0883C9105D4F5283C1C |
:104B40003105D4F5E090FC01F090FD010091FE01EB |
:104B50001091FF0160914B0270914C0280914D02C7 |
:104B600090914E0222E030E040E050E00E945E2E44 |
:104B7000E21AF30A040B150BE092FC01F092FD011E |
:104B80000093FE011093FF01E0900402F0900502F3 |
:104B9000009106021091070260914702709148024D |
:104BA0008091490290914A0222E030E040E050E0DA |
:104BB00073C080599140D4F520593140BCF5E09044 |
:104BC000FC01F090FD010091FE011091FF01609148 |
:104BD0004B0270914C0280914D0290914E0224E064 |
:104BE00030E040E050E00E945E2EE21AF30A040B2F |
:104BF000150BE092FC01F092FD010093FE01109371 |
:104C0000FF01E0900402F09005020091060210916D |
:104C10000702609147027091480280914902909189 |
:104C20004A0224E030E040E050E036C0E090FC0171 |
:104C3000F090FD010091FE011091FF0160914B0287 |
:104C400070914C0280914D0290914E0228E030E02C |
:104C500040E050E00E945E2EE21AF30A040B150BAE |
:104C6000E092FC01F092FD010093FE011093FF0120 |
:104C7000E0900402F09005020091060210910702F4 |
:104C800060914702709148028091490290914A02D6 |
:104C900028E030E040E050E00E945E2EE21AF30A85 |
:104CA000040B150BE0920402F09205020093060239 |
:104CB0001093070200912D0210912E02A80117FFF8 |
:104CC00004C044275527401B510B443251053CF08A |
:104CD0008091EC0484FD03C081E080933C0220912C |
:104CE000F5043327049FC001059F900D149F900D7C |
:104CF0001124BC01269FC001279F900D369F900D67 |
:104D0000112460E072E00E94292EFB01209FC00167 |
:104D1000219F900D309F900D112464E070E00E945F |
:104D2000292EE60FF71F1F01442437FC4094542C12 |
:104D300020924F0230925002409251025092520201 |
:104D400080910C0290910D02A0910E02B0910F0281 |
:104D500082199309A409B50980930C0290930D025E |
:104D6000A0930E02B0930F02809110029091110255 |
:104D7000A0911202B091130282199309A409B509F6 |
:104D80008093100290931102A0931202B093130229 |
:104D900080910C0290910D02A0910E02B0910F0231 |
:104DA000895A9146A040B04064F088EA91E6A0E0BC |
:104DB000B0E080930C0290930D02A0930E02B0938A |
:104DC0000F0280910C0290910D02A0910E02B09101 |
:104DD0000F0288559E49AF4FBF4F64F488E59EE9A6 |
:104DE000AFEFBFEF80930C0290930D02A0930E02E1 |
:104DF000B0930F028FEE80937A0080911802909109 |
:104E00001902892B09F4A1C08091EC0483FF9DC095 |
:104E10006091E8017091E9018091EA019091EB01C4 |
:104E200020E032E040E050E00E945E2E890137FF32 |
:104E300003C0109501951F4F6091F0017091F10131 |
:104E40008091F2019091F30120E032E040E050E0E7 |
:104E50000E945E2EB90137FF03C0709561957F4FA8 |
:104E6000601771070CF4B80169317105A4F48091E1 |
:104E70003C02882381F080913A0290913B02892B79 |
:104E800051F4809118029091190290931B02809323 |
:104E90001A0210923C02209188013327629FC001C0 |
:104EA000639F900D729F900D112460E470E00E944A |
:104EB000292EA901461B570B141615060CF03FC0EE |
:104EC00010927A0020913A0230913B02211531056F |
:104ED00061F500910C0210910D0220910E023091AB |
:104EE0000F0280911C0290911D02BC01649FC001C1 |
:104EF000659F900D749F900D112460E270E00E94F8 |
:104F0000292E882777FD8095982F060F171F281FB9 |
:104F1000391F00930C0210930D0220930E02309360 |
:104F20000F028FEE80937A0010C08FEE80937A008C |
:104F30002150304030933B0220933A0206C084EF68 |
:104F400091E090933B0280933A0280913D02815020 |
:104F500080933D028F3F09F062C081E380933D0260 |
:104F60006091E8017091E9018091EA019091EB0173 |
:104F7000E090F804FF2400271127A80197010E9460 |
:104F80005E2E30935E0420935D046091F001709179 |
:104F9000F1018091F2019091F301A80197010E9423 |
:104FA0005E2E3093600420935F04809129059091D8 |
:104FB0002A05909362048093610480913205909158 |
:104FC0003305909364048093630480912C05909141 |
:104FD0002D05909366048093650480913002909132 |
:104FE0003102909368048093670460911402709179 |
:104FF0001502809116029091170220E032E040E005 |
:1050000050E00E945E2E30936A04209369048091E0 |
:1050100018029091190290936E0480936D04809110 |
:1050200034028823A9F0609120057091210588271A |
:1050300077FD8095982F0E94282D20912E05309184 |
:105040002F0540913005509131050E94A22D2EC0B0 |
:105050006091E8017091E9018091EA019091EB0182 |
:10506000E0902005F09021050E94282D29813A81A9 |
:105070004B815C810E94A22D5B016C010027F7FC33 |
:105080000095102FC801B7010E94282D20912E05F0 |
:1050900030912F0540913005509131050E94A22D8D |
:1050A0009B01AC01C601B5010E94832C0E940B2D0F |
:1050B0007093210560932005809135028823A9F023 |
:1050C00060911E0570911F05882777FD8095982FA8 |
:1050D0000E94282D20912E0530912F0540913005FA |
:1050E000509131050E94A22D2EC06091F001709167 |
:1050F000F1018091F2019091F301E0901E05F09092 |
:105100001F050E94282D29813A814B815C810E94D4 |
:10511000A22D5B016C010027F7FC0095102FC80140 |
:10512000B7010E94282D20912E0530912F05409126 |
:105130003005509131050E94A22D9B01AC01C601A2 |
:10514000B5010E94832C0E940B2D70931F05609364 |
:105150001E0560912C0570912D05E090F801F090EE |
:10516000F9010091FA011091FB01882777FD8095E4 |
:10517000982F0E94282D20912E0530912F054091C7 |
:105180003005509131050E94A22D5B016C01C801D0 |
:10519000B7010E94282D29813A814B815C810E94B0 |
:1051A000A22D20E030E040E05FE30E94A22D9B01B1 |
:1051B000AC01C601B5010E94832C0E940B2D709397 |
:1051C0002D0560932C05809120059091210581503B |
:1051D000984034F080E098E090932105809320057A |
:1051E00080912005909121058050984F34F480E003 |
:1051F00098EF909321058093200580911E05909152 |
:105200001F058150984034F080E098E090931F058E |
:1052100080931E0580911E0590911F058050984F28 |
:1052200034F480E098EF90931F0580931E058091E1 |
:105230002C0590912D058150984034F080E098E045 |
:1052400090932D0580932C0580912C0590912D0530 |
:105250008050984F34F480E098EF90932D05809320 |
:105260002C058091EC04992780FFBCC0209185011A |
:1052700081FF0EC02233B0F4809130029091310250 |
:105280004497909333028093320210921F020DC014 |
:105290008091F104289FC001112444979093330218 |
:1052A0008093320281E080931F02992021F01092B6 |
:1052B000330210923202209130023091310240913B |
:1052C000320250913302421753070CF08BC0809189 |
:1052D0001F02882309F486C0241B350B80918601A8 |
:1052E0009927AC01249FC001259F900D349F900DFC |
:1052F000112460E170E00E94292E8301061B170B28 |
:105300002091C5013091C601809184019927BC018B |
:10531000269FC001279F900D369F900D112468E0B5 |
:1053200070E00E94292E061B170B609114027091E9 |
:105330001502809116029091170220E032E040E0C1 |
:1053400050E00E945E2ECA01B901209187013327E7 |
:10535000442755270E94EA2D20E230E040E050E04B |
:105360000E945E2E7FEF2E3C370714F42EEC3FEFA9 |
:1053700080913E0290913F02AC01B4E0440F551F72 |
:10538000BA95E1F7481B590B2333310514F022E39A |
:1053900030E0021B130BCA01800F911F60E170E027 |
:1053A0000E94292E70933F0260933E028091ED048B |
:1053B0009927681779073CF4681679065CF0909392 |
:1053C0003F0280933E0280913E0290913F02681618 |
:1053D000790624F470923F0260923E0260903E0291 |
:1053E00070903F028091300290913102A1E08134AF |
:1053F0009A07DCF08091E5018823E9F480910301AC |
:10540000909104018F5F9F4F61F480EA9FE0909339 |
:10541000AD018093AC0180E093E090930401809310 |
:10542000030181E08093E50106C08F3F910509F0FB |
:1054300014F41092E50170926C0460926B048090F9 |
:105440002C0590902D0582189308B301882777FDCD |
:105450008095982F0E94282D5B016C0123E333E394 |
:1054600043EB5FE30E94A22D7B018C01B4018827EE |
:1054700077FD8095982F0E94282DA80197010E9402 |
:10548000352D18162CF4C801B7010E940B2D4B01C5 |
:1054900023E333E343EB5FEBC601B5010E94A22D8A |
:1054A0007B018C01B401882777FD8095982F0E949D |
:1054B000282DA80197010E94322D88232CF4C801C1 |
:1054C000B7010E940B2D4B01EAE06E16710414F433 |
:1054D0008824992420907C0130907D0140907E01A9 |
:1054E00050907F0160912005709121052091290243 |
:1054F00030912A0240915B0250915C02241B350BD3 |
:10550000621B730B882777FD8095982F0E94282DAA |
:105510009B01AC01C201B1010E94A22D0E940B2D82 |
:10552000709374026093730280917302909174027D |
:105530008C01222717FD2095322F809157029091E0 |
:105540005802A0915902B0915A02080F191F2A1F40 |
:105550003B1F009357021093580220935902309337 |
:105560005A021016110612061306ACF4C80117FFF2 |
:1055700003C0909581959F4F60E071E00E94292EB5 |
:105580006F5F7F4F882777FD8095982F061B170B3D |
:10559000280B390B14C0C80117FF03C090958195E3 |
:1055A0009F4F60E071E00E94292E6F5F7F4F882738 |
:1055B00077FD8095982F060F171F281F391F00931E |
:1055C0005702109358022093590230935A02809147 |
:1055D000570290915802A0915902B0915A02813815 |
:1055E000FEE39F07F0E0AF07F0E0BF072CF080E894 |
:1055F0009EE3A0E0B0E009C08058914CAF4FBF4F90 |
:1056000064F480E891ECAFEFBFEF80935702909382 |
:105610005802A0935902B0935A022091730230911C |
:1056200074027301EE0CFF1CC7012E153F050CF42C |
:10563000C901CC24DD24CE18DF08B601C816D9066E |
:105640000CF4BC019301280D391D260F371F37FFBD |
:1056500003C040E050E008C080912B05482F55273B |
:10566000241735070CF4A90180912205A82EBB242C |
:10567000C501A416B5060CF4CA018093710293010A |
:10568000261B370B280D391D37FF03C080E090E043 |
:1056900007C080912B059927281739070CF4C901F9 |
:1056A0009501A816B9060CF49C0120937202609132 |
:1056B0001E0570911F0520912B0230912C02409104 |
:1056C0005D0250915E02241B350B621B730B882711 |
:1056D00077FD8095982F0E94282D9B01AC01C20177 |
:1056E000B1010E94A22D0E940B2D70937002609355 |
:1056F0006F0280916F02909170028C01222717FD3A |
:105700002095322F8091530290915402A09155021E |
:10571000B0915602080F191F2A1F3B1F0093530216 |
:10572000109354022093550230935602101611061E |
:1057300012061306ACF4C80117FF03C090958195BB |
:105740009F4F60E071E00E94292E6F5F7F4F882796 |
:1057500077FD8095982F061B170B280B390B14C06B |
:10576000C80117FF03C0909581959F4F60E071E0DD |
:105770000E94292E6F5F7F4F882777FD8095982F95 |
:10578000060F171F281F391F00935302109354024E |
:105790002093550230935602809153029091540207 |
:1057A000A0915502B091560281384EE3940740E033 |
:1057B000A40740E0B4072CF080E89EE3A0E0B0E04E |
:1057C00009C08058914CAF4FBF4F64F480E891EC12 |
:1057D000AFEFBFEF8093530290935402A093550212 |
:1057E000B093560280916F029091700297018E15CE |
:1057F0009F050CF49C01B601C216D3060CF4B90146 |
:105800009301260F371F2819390937FF03C040E0DD |
:1058100050E008C080912B05482F552724173507E5 |
:105820000CF4A9019501A416B5060CF49A01209375 |
:105830007702661A770AB3016819790977FF03C0FE |
:1058400020E030E008C080912B05282F3327621715 |
:1058500073070CF49B01C501A216B3060CF4C90131 |
:105860008093750224960FB6F894DEBF0FBECDBFAD |
:10587000DF91CF911F910F91FF90EF90DF90CF902C |
:10588000BF90AF909F908F907F906F905F904F9060 |
:105890003F902F90089580915F0290916002A091B7 |
:1058A0006102B09162028093670290936802A093B4 |
:1058B0006902B0936A028091630290916402A091A0 |
:1058C0006502B091660280936B0290936C02A09384 |
:1058D0006D02B0936E02089510925C0210925B020A |
:1058E00010925E0210925D020895FC0141505040FA |
:1058F00030F001900616D1F73197CF01089588272F |
:10590000992708955058192EEFD001D0D2C0BA1758 |
:105910006207730784079507B1F188F40EF41094B9 |
:105920000B2EBA2FA02D062E622F202D072E732F9F |
:10593000302D082E842F402D092E952F502DFF2716 |
:105940005523B9F0591B49F0573E98F046953795C5 |
:105950002795A795F0405395C9F776F0BA0F621FC7 |
:10596000731F841F30F4879577956795B795F0403E |
:10597000939517FA0F2E0895BF1BBB27BA0B620B26 |
:10598000730B840BF6CFDEF6DBC0AED001D091C036 |
:10599000552359F0992369F09F575F57951B33F4AE |
:1059A00042F4903811F4915805C09BC091589F3F24 |
:1059B00009F4C6C0BB27112462177307840730F4AB |
:1059C000660F771F881FBB1F915098F311D00F925D |
:1059D0000FD00F920DD0A0E82617370748071B06F7 |
:1059E00009F0A048BA2F602D7F918F91002408956F |
:1059F000A0E80024621773078407B10528F0621B32 |
:105A0000730B840BB1090A2A660F771F881FBB1F0F |
:105A1000A69581F7089597FB73D09F3738F0FEE97C |
:105A2000F91B982F872F762F6B2F05C086C0969570 |
:105A3000879577956795F150D0F73EF490958095CE |
:105A4000709561957F4F8F4F9F4F0895E89403C0E5 |
:105A500097FB0EF4F3DFB62F672F782F892F9EE97F |
:105A6000002427C00ED05EF004C00BD026F001C089 |
:105A700008D019F020F48FEF089580E0089581E0B8 |
:105A8000089597FB092E052600F8689430D0E89415 |
:105A900007FC07C0621773078407950721F008F415 |
:105AA00000940794989408959A95BB0F661F771FEA |
:105AB000881F11249923A1F08823B2F79F3F59F042 |
:105AC000BB0F48F421F4002011F460FF04C06F5FA5 |
:105AD0007F4F8F4F9F4F881F9795879597F9089510 |
:105AE0002CC09FEF80EC0895052E092607FA440F7D |
:105AF000551F5F3F79F0AA27A51708F051E0479599 |
:105B0000880F991F9F3F31F0BB27B91708F091E02C |
:105B1000879508959F919F911124E3CF97FB880F5C |
:105B2000991F9F3F31F0BB27B91708F091E0879587 |
:105B300008959F919F911124D4CF662777278827B6 |
:105B400099270895D1DF01D0B4CF992339F0552397 |
:105B500029F09F575F57950F13F49AF1F1CF9158A1 |
:105B60009F3FE1F3629FA12D0F92BB27639FA00D82 |
:105B7000B11DEE27729FA00DB11DEE1FAF93AA2796 |
:105B8000649FB00DE11D739FB00DE11DAA1F662734 |
:105B9000829FB00DE11DA61F5527749FE00DA11D2A |
:105BA000551F839FE00DA11D561F849FA00D511D01 |
:105BB000852F7A2F6E2F1F900F9088231AF49395BC |
:105BC00039F48FCF000C111CBB1F661F771F881F75 |
:105BD00001280895629FD001739FF001829FE00D1C |
:105BE000F11D649FE00DF11D929FF00D839FF00D5C |
:105BF000749FF00D659FF00D9927729FB00DE11D08 |
:105C0000F91F639FB00DE11DF91FBD01CF011124E4 |
:105C10000895991B79E004C0991F961708F0961B08 |
:105C2000881F7A95C9F780950895AA1BBB1B51E17F |
:105C300007C0AA1FBB1FA617B70710F0A61BB70BFC |
:105C4000881F991F5A95A9F780959095BC01CD01A1 |
:105C5000089597FB092E07260AD077FD04D0E5DFCB |
:105C600006D000201AF4709561957F4F0895F6F7DD |
:105C7000909581959F4F0895A1E21A2EAA1BBB1BF8 |
:105C8000FD010DC0AA1FBB1FEE1FFF1FA217B30708 |
:105C9000E407F50720F0A21BB30BE40BF50B661F1E |
:105CA000771F881F991F1A9469F7609570958095E2 |
:105CB00090959B01AC01BD01CF01089597FB092E82 |
:105CC00005260ED057FD04D0D7DF0AD0001C38F4CB |
:105CD00050954095309521953F4F4F4F5F4F089518 |
:105CE000F6F790958095709561957F4F8F4F9F4FF8 |
:105CF0000895F999FECFB2BDA1BDF89A119600B4EE |
:105D00000895F999FECFB2BDA1BD00BC11960FB6A2 |
:0C5D1000F894FA9AF99A0FBE0895FFCF9C |
:105D1C000A0164FFFF0A016400007D0000FF03011B |
:105D2C0002030405060708090A48616C6C6F2057CA |
:105D3C00656C740000000000000000000000000012 |
:105D4C000000000000000000000000000000000047 |
:105D5C000000000000000000000000000000000037 |
:105D6C000000000000000000000000000000000027 |
:105D7C000000000000000000000A014B616D65721C |
:105D8C0061000053706F7274000064000000803F6B |
:105D9C0017B7D13830FB103A409696020A64460089 |
:00000001FF |
/branches/salvo_gierkompass/License_buss.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_gierkompass/Settings.h |
---|
--- _Settings.h (nonexistent) |
+++ _Settings.h (revision 187) |
@@ -0,0 +1,50 @@ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Testmodi |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define MOTOR_OFF 0 |
+#define MOTOR_TEST 0 |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Abstimmung |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define ACC_AMPLIFY 16 |
+#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 Degugdaten 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_gierkompass/analog.c |
---|
0,0 → 1,157 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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 AccumulateNick = 0, AccumulateRoll = 0, AccumulateGier = 0; |
volatile int accumulate_AccRoll = 0,accumulate_AccNick = 0,accumulate_AccHoch = 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; |
for(off=0; off < 250;off++) |
{ |
OCR0A = off; |
Delay_ms(50); |
printf("."); |
if(MessLuftdruck < 900) break; |
} |
DruckOffsetSetting = off; |
Delay_ms(200); |
} |
//####################################################################################### |
// |
SIGNAL(SIG_ADC) |
//####################################################################################### |
{ |
static unsigned char kanal=0,state = 0; |
signed int wert; |
ANALOG_OFF; |
switch(state++) |
{ |
case 0: |
wert = (signed int) AdNeutralGier - ADC; |
AccumulateGier += wert; // |
MessanzahlGier++; |
Mess_Integral_Gier += wert;// / 16; |
Mess_Integral_Gier2 += wert; |
GyroKomp_Int += wert; |
GyroKomp_Int2 += wert; |
kanal = 1; |
ZaehlMessungen++; |
break; |
case 1: |
wert = (signed int) ADC - AdNeutralRoll; |
Mess_IntegralRoll += wert; |
Mess_IntegralRoll2 += wert; |
if(ADC < 10) wert = -700; |
if(ADC > 1000) wert = +700; |
AccumulateRoll += wert; |
MessanzahlRoll++; |
kanal = 2; |
break; |
case 2: |
wert = (signed int) ADC - AdNeutralNick; |
Mess_IntegralNick += wert; |
Mess_IntegralNick2 += wert; |
if(ADC < 10) wert = -700; |
if(ADC > 1000) wert = +700; |
AccumulateNick += wert; |
MessanzahlNick++; |
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; |
accumulate_AccRoll += Aktuell_ay; |
messanzahl_AccRoll++; |
kanal = 7; |
break; |
case 5: |
Aktuell_ay = ADC - NeutralAccX; |
accumulate_AccNick += Aktuell_ay; |
messanzahl_AccNick++; |
kanal = 5; |
state = 6; |
break; |
case 6: |
accumulate_AccHoch = (signed int) ADC - NeutralAccZ; |
accumulate_AccHoch += abs(Aktuell_ay) / 4 + abs(Aktuell_ax) / 4; |
if(accumulate_AccHoch > 1) |
{ |
if(NeutralAccZ < 800) NeutralAccZ+= 0.02; |
} |
else if(accumulate_AccHoch < -1) |
{ |
if(NeutralAccZ > 600) NeutralAccZ-= 0.02; |
} |
messanzahl_AccHoch = 1; |
Aktuell_az = ADC; |
Mess_Integral_Hoch += accumulate_AccHoch; // Integrieren |
Mess_Integral_Hoch -= Mess_Integral_Hoch / 1024; // dämfen |
// Mess_Integral_Hoch -= Mess_Integral_Hoch / 512; // dämfen |
/* if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
kanal = 3; |
state = 7; |
} |
else |
{ |
kanal = 0; |
state = 0; |
}*/ |
kanal = 3; |
state = 7; |
break; |
case 7: |
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; |
ANALOG_ON; |
} |
/branches/salvo_gierkompass/analog.h |
---|
0,0 → 1,23 |
/*####################################################################################### |
#######################################################################################*/ |
extern volatile int UBat; |
extern volatile int AccumulateNick, AccumulateRoll, AccumulateGier,accumulate_AccRoll,accumulate_AccNick,accumulate_AccHoch; |
extern volatile char MessanzahlNick, MessanzahlRoll, MessanzahlGier,messanzahl_AccNick, messanzahl_AccRoll,messanzahl_AccHoch; |
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 unsigned int ReadADC(unsigned char adc_input); |
extern void ADC_Init(void); |
extern 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_gierkompass/eeprom.c |
---|
--- fc.c (nonexistent) |
+++ fc.c (revision 187) |
@@ -0,0 +1,974 @@ |
+/*####################################################################################### |
+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. |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ |
+#include "main.h" |
+ |
+unsigned char h,m,s; |
+volatile unsigned char Timeout = 0; |
+volatile int MesswertNick,MesswertRoll,MesswertGier; |
+volatile int AdNeutralNick = 0,AdNeutralRoll = 0,AdNeutralGier = 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 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 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; |
+static int SignalSchlecht = 0; |
+ //Salvo 2.9.2007 Ersatzkompass |
+volatile long GyroKomp_Int,GyroKomp_Int2; |
+volatile int GyroKomp_Inc_Grad; // Gyroincrements / Grad |
+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 w,v; |
+ |
+float Kp = FAKTOR_P; |
+float Ki = FAKTOR_I; |
+ |
+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; |
+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) |
+//############################################################################ |
+{ |
+ unsigned int timer; |
+ NeutralAccX = 0; |
+ NeutralAccY = 0; |
+ NeutralAccZ = 0; |
+ AdNeutralNick = 0; |
+ AdNeutralRoll = 0; |
+ AdNeutralGier = 0; |
+ CalibrierMittelwert(); |
+ timer = SetDelay(5); |
+ while (!CheckDelay(timer)); |
+ CalibrierMittelwert(); |
+ if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
+ { |
+ if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
+ } |
+ AdNeutralNick= abs(MesswertNick); |
+ AdNeutralRoll= abs(MesswertRoll); |
+ AdNeutralGier= abs(MesswertGier); |
+// Salvo 1.9.2007 ACC mit festen neutralwerten ***** |
+ if (ACC_NEUTRAL_FIXED > 0) |
+ { |
+ NeutralAccX = ACC_X_NEUTRAL; |
+ NeutralAccY = ACC_Y_NEUTRAL; |
+ } |
+ else |
+ { // Automatisch bei Offsetabgleich ermitteln |
+ NeutralAccY = abs(Mittelwert_AccRoll) / ACC_AMPLIFY; |
+ NeutralAccX = abs(Mittelwert_AccNick) / 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; |
+//Salvo 2.9.2007 Ersatzkompass |
+ GyroKomp_Int = 0; |
+ GyroKomp_Int2 = 0; |
+ GyroKomp_Inc_Grad = GYROKOMP_INC_GRAD_DEFAULT; |
+// Salvo End |
+} |
+ |
+//############################################################################ |
+// Bildet den Mittelwert aus den Messwerten |
+void Mittelwert(void) |
+//############################################################################ |
+{ |
+ // ADC auschalten, damit die Werte sich nicht während der Berechnung ändern |
+ ANALOG_OFF; |
+ if(MessanzahlNick) (MesswertNick = AccumulateNick / MessanzahlNick); |
+ if(MessanzahlRoll) (MesswertRoll = AccumulateRoll / MessanzahlRoll); |
+ if(MessanzahlGier) (MesswertGier = AccumulateGier / MessanzahlGier); |
+ if(messanzahl_AccNick) Mittelwert_AccNick = ((long)Mittelwert_AccNick * 7 + ((ACC_AMPLIFY * (long)accumulate_AccNick) / messanzahl_AccNick)) / 8L; |
+ if(messanzahl_AccRoll) Mittelwert_AccRoll = ((long)Mittelwert_AccRoll * 7 + ((ACC_AMPLIFY * (long)accumulate_AccRoll) / messanzahl_AccRoll)) / 8L; |
+ if(messanzahl_AccHoch) Mittelwert_AccHoch = ((long)Mittelwert_AccHoch * 7 + ((long)accumulate_AccHoch) / messanzahl_AccHoch) / 8L; |
+ AccumulateNick = 0; MessanzahlNick = 0; |
+ AccumulateRoll = 0; MessanzahlRoll = 0; |
+ AccumulateGier = 0; MessanzahlGier = 0; |
+ accumulate_AccRoll = 0;messanzahl_AccRoll = 0; |
+ accumulate_AccNick = 0;messanzahl_AccNick = 0; |
+ accumulate_AccHoch = 0;messanzahl_AccHoch = 0; |
+ Integral_Gier = Mess_Integral_Gier; |
+// Integral_Gier2 = Mess_Integral_Gier2; |
+ IntegralNick = Mess_IntegralNick; |
+ IntegralRoll = Mess_IntegralRoll; |
+ IntegralNick2 = Mess_IntegralNick2; |
+ IntegralRoll2 = Mess_IntegralRoll2; |
+ // ADC einschalten |
+ ANALOG_ON; |
+ |
+//------------------------------------------------------------------------------ |
+ 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; |
+ if(MessanzahlNick) (MesswertNick = AccumulateNick / MessanzahlNick); |
+ if(MessanzahlRoll) (MesswertRoll = AccumulateRoll / MessanzahlRoll); |
+ if(MessanzahlGier) (MesswertGier = AccumulateGier / MessanzahlGier); |
+ if(messanzahl_AccNick) Mittelwert_AccNick = ((ACC_AMPLIFY * (long)accumulate_AccNick) / messanzahl_AccNick); |
+ if(messanzahl_AccRoll) Mittelwert_AccRoll = (ACC_AMPLIFY * (long)accumulate_AccRoll) / messanzahl_AccRoll; |
+ if(messanzahl_AccHoch) Mittelwert_AccHoch = ((long)accumulate_AccHoch) / messanzahl_AccHoch; |
+ AccumulateNick = 0; MessanzahlNick = 0; |
+ AccumulateRoll = 0; MessanzahlRoll = 0; |
+ AccumulateGier = 0; MessanzahlGier = 0; |
+ accumulate_AccRoll = 0;messanzahl_AccRoll = 0; |
+ accumulate_AccNick = 0;messanzahl_AccNick = 0; |
+ accumulate_AccHoch = 0;messanzahl_AccHoch = 0; |
+ // 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; |
+} |
+ |
+//############################################################################ |
+// 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(); |
+} |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// + 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 = 0;//CFG_HOEHENREGELUNG | /*CFG_HOEHEN_SCHALTER |*/ CFG_KOMPASS_AKTIV | CFG_KOMPASS_FIX;//0x01; |
+ EE_Parameter.Hoehe_MinGas = 30; |
+ EE_Parameter.MaxHoehe = 251; // Wert : 0-32 251 -> Poti1 |
+ EE_Parameter.Hoehe_P = 10; // Wert : 0-32 |
+ EE_Parameter.Luftdruck_D = 70; // Wert : 0-250 |
+ EE_Parameter.Hoehe_ACC_Wirkung = 30; // Wert : 0-250 |
+ EE_Parameter.Hoehe_Verstaerkung = 2; // 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 = 16; // Wert : 1-20 |
+ EE_Parameter.Gas_Min = 15; // Wert : 0-32 |
+ EE_Parameter.Gas_Max = 250; // Wert : 33-250 |
+ EE_Parameter.GyroAccFaktor = 26; // Wert : 1-64 |
+ EE_Parameter.KompassWirkung = 64; // 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 = 50; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
+ EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
+ EE_Parameter.I_Faktor = 5; |
+ 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; |
+ memcpy(EE_Parameter.Name, "Normal\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.GlobalConfig = 0;//CFG_HOEHENREGELUNG | /*CFG_HOEHEN_SCHALTER |*/ CFG_KOMPASS_AKTIV;//0x01; |
+ EE_Parameter.Hoehe_MinGas = 30; |
+ EE_Parameter.MaxHoehe = 251; // Wert : 0-32 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 = 2; //2 // Wert : 1-6 |
+ EE_Parameter.Stick_D = 0; //8 // Wert : 0-64 |
+ EE_Parameter.Gier_P = 16; // Wert : 1-20 |
+ EE_Parameter.Gas_Min = 15; // Wert : 0-32 |
+ EE_Parameter.Gas_Max = 250; // Wert : 33-250 |
+ EE_Parameter.GyroAccFaktor = 26; // Wert : 1-64 |
+ EE_Parameter.KompassWirkung = 64; // 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 = 50; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
+ EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
+ EE_Parameter.I_Faktor = 5; |
+ 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.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; |
+ memcpy(EE_Parameter.Name, "Kamera\0", 12); |
+} |
+ |
+ |
+//############################################################################ |
+// 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); |
+ |
+ unsigned char ServoNickComp; // Wert : 0-250 // Einfluss Gyro/Servo |
+ unsigned char ServoNickCompInvert; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
+ unsigned char ServoNickMin; // Wert : 0-250 // Anschlag |
+ unsigned char ServoNickMax; // Wert : 0-250 // Anschlag |
+ |
+ |
+ CHK_POTI(Parameter_ServoNickControl,EE_Parameter.ServoNickControl,0,255); |
+ CHK_POTI(Parameter_ServoNickControl,EE_Parameter.ServoNickControl,0,255); |
+ CHK_POTI(Parameter_ServoNickControl,EE_Parameter.ServoNickControl,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 int IntegralFehlerNick = 0; |
+ static int 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; |
+ Mittelwert(); |
+//******PROVISORISCH*************** |
+ Get_GPS_data(); |
+ if (gps_act_position.status > 0) |
+ { |
+ ROT_ON; |
+ gps_act_position.status = 0; |
+ } |
+ |
+//******PROVISORISCH*************** |
+ GRN_ON; |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Gaswert ermitteln |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ GasMischanteil = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] + 120; |
+ if(GasMischanteil < 0) GasMischanteil = 0; |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Emfang schlecht |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(SenderOkay < 100) |
+ { |
+ if(!PcZugriff) beeptime = 500; |
+ 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; |
+/* Poti1 = 65; |
+ Poti2 = 48; |
+ Poti3 = 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; |
+ 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) |
+ { |
+ 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(); |
+ } |
+ } |
+ } |
+ 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; |
+ } |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Bei Empfangsausfall im Flug |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ if(Notlandung) |
+ { |
+ StickGier = 0; |
+ StickNick = 0; |
+ StickRoll = 0; |
+ GyroFaktor = 0.1; |
+ IntegralFaktor = 0.005; |
+ } |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Gyro-Drift kompensieren |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define DRIFT_FAKTOR 3 |
+ if(ZaehlMessungen >= 1000 / DRIFT_FAKTOR) |
+ { |
+// Salvo 8.9.2007 Ersatzkompass ******* |
+ ANALOG_OFF; // ADC ausschalten, damit die Werte sich nicht während der Berechnung ändern |
+ if (GyroKomp_Int/GYROKOMP_INC_GRAD_DEFAULT >=360 ) |
+ { |
+// GyroKomp_Int = GyroKomp_Int- (long)(GYROKOMP_INC_GRAD_DEFAULT *360); |
+ GyroKomp_Int = 0; |
+ } |
+ ANALOG_ON; // ADC einschalten |
+ ROT_OFF; |
+// Salvo End |
+ |
+ IntegralFehlerNick = IntegralNick2 - IntegralNick; |
+ IntegralFehlerRoll = IntegralRoll2 - IntegralRoll; |
+ ZaehlMessungen = 0; |
+// Salvo 1.9.2007 ************************* |
+// Abgleich Roll und Nick Gyro vollsteandig nur, wenn nahezu waagrechte Lage, ansonsten abschwaechen |
+ ANALOG_OFF; // ADC ausschalten, damit die Werte sich nicht während der Berechnung ändern |
+ w = (abs(Mittelwert_AccNick)); |
+ v = (abs(Mittelwert_AccRoll)); |
+ ANALOG_ON; // ADC einschalten |
+ if ((w < ACC_WAAGRECHT_LIMIT) && (v < ACC_WAAGRECHT_LIMIT)) |
+ { |
+ if(IntegralFehlerNick > 500/DRIFT_FAKTOR) AdNeutralNick++; |
+ if(IntegralFehlerNick < -500/DRIFT_FAKTOR) AdNeutralNick--; |
+ if(IntegralFehlerRoll > 500/DRIFT_FAKTOR) AdNeutralRoll++; |
+ if(IntegralFehlerRoll < -500/DRIFT_FAKTOR) AdNeutralRoll--; |
+ } |
+ else if ((w < 2*ACC_WAAGRECHT_LIMIT) && (v < 2*ACC_WAAGRECHT_LIMIT)) // langsamer kompensieren, weil ACC Werte unsicherer sind, was die Neigung angeht |
+ { |
+ if(IntegralFehlerNick > 500*2/DRIFT_FAKTOR) AdNeutralNick++; |
+ if(IntegralFehlerNick < -500*2/DRIFT_FAKTOR) AdNeutralNick--; |
+ if(IntegralFehlerRoll > 500*2/DRIFT_FAKTOR) AdNeutralRoll++; |
+ if(IntegralFehlerRoll < -500*2/DRIFT_FAKTOR) AdNeutralRoll--; |
+ } |
+ else // noch langsamer kompensieren, weil ACC Werte unsicherer sind, was die Neigung angeht |
+ { |
+ if(IntegralFehlerNick > 500*4/DRIFT_FAKTOR) AdNeutralNick++; |
+ if(IntegralFehlerNick < -500*4/DRIFT_FAKTOR) AdNeutralNick--; |
+ if(IntegralFehlerRoll > 500*4/DRIFT_FAKTOR) AdNeutralRoll++; |
+ if(IntegralFehlerRoll < -500*4/DRIFT_FAKTOR) AdNeutralRoll--; |
+ } |
+// Salvo End |
+ |
+// Salvo 31.8.2007 Abgleich Giergyro nur wenn Kompass aktiv und ok ist *********************** |
+// Ohne Kompass wird die Pseudo-Gyrodrift durch die Driftkompensation nur verschlimmert |
+// Ohne Driftkompensation ist die Gierachse wesentlich stabiler |
+ if ((EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV) && (!SignalSchlecht)) |
+ { |
+ if(Mess_Integral_Gier2 > 500/DRIFT_FAKTOR) AdNeutralGier--; |
+ if(Mess_Integral_Gier2 <-500/DRIFT_FAKTOR) AdNeutralGier++; |
+ } |
+ else |
+ { |
+ Mess_Integral_Gier2 = 0; |
+ } |
+// Salvo End *********************** |
+ ANALOG_OFF; // ADC ausschalten, damit die Werte sich nicht während der Berechnung ändern |
+ Mess_IntegralNick2 = IntegralNick; |
+ Mess_IntegralRoll2 = IntegralRoll; |
+ Mess_Integral_Gier2 = Integral_Gier; |
+ ANALOG_ON; // ADC einschalten |
+ } |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Integrale auf ACC-Signal abgleichen |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick) / 16; |
+ tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll) / 16; |
+#define AUSGLEICH 500 |
+ if(tmp_long > AUSGLEICH) tmp_long = AUSGLEICH; |
+ if(tmp_long < -AUSGLEICH) tmp_long =-AUSGLEICH; |
+ if(tmp_long2 > AUSGLEICH) tmp_long2 = AUSGLEICH; |
+ if(tmp_long2 <-AUSGLEICH) tmp_long2 =-AUSGLEICH; |
+ |
+ ANALOG_OFF; // ADC ausschalten, damit die Werte sich nicht während der Berechnung ändern |
+ // Salvo 1.9.2007 Volle Korrektur nur wenn waagrechte Lage, sonst abgeschawecht ***************** |
+ w = (abs(Mittelwert_AccNick)); |
+ v = (abs(Mittelwert_AccRoll)); |
+ if ((w < ACC_WAAGRECHT_LIMIT) && (v < ACC_WAAGRECHT_LIMIT)) |
+ { |
+ Mess_IntegralNick -= tmp_long; |
+ Mess_IntegralRoll -= tmp_long2; |
+ } |
+ else if ((w < 2 * ACC_WAAGRECHT_LIMIT) && (v < 2 * ACC_WAAGRECHT_LIMIT)) |
+ { |
+ Mess_IntegralNick -= tmp_long/2; //Vorher 8 |
+ Mess_IntegralRoll -= tmp_long2/2; |
+ } |
+ else if ((w < 4 * ACC_WAAGRECHT_LIMIT) && (v < 4 * ACC_WAAGRECHT_LIMIT)) |
+ { |
+ Mess_IntegralNick -= tmp_long/4; |
+ Mess_IntegralRoll -= tmp_long2/4; |
+ } |
+ else |
+ { |
+ Mess_IntegralNick -= tmp_long/8; |
+ Mess_IntegralRoll -= tmp_long2/8; |
+ } |
+// Salvo End *********************** |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Gieren |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ sollGier = StickGier; |
+ if(abs(StickGier) > 35) |
+ { |
+ if(!(EE_Parameter.GlobalConfig & CFG_KOMPASS_FIX)) NeueKompassRichtungMerken = 1; |
+ } |
+ tmp_int = EE_Parameter.Gier_P * (sollGier * abs(sollGier)) / 256; // expo |
+ Mess_Integral_Gier -= tmp_int; |
+ if(Mess_Integral_Gier > 30000) Mess_Integral_Gier = 30000; // begrenzen |
+ if(Mess_Integral_Gier <-30000) Mess_Integral_Gier =-30000; |
+// Salvo Gewolltes Gieren ignorieren 30.8.2007 ********************** |
+ Mess_Integral_Gier2 -= tmp_int; |
+// Salvo End ************************* |
+ ANALOG_ON; // ADC einschalten |
+ |
+// Salvo Ersatzkompass 8.9.2007 ********************** |
+ if (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 alle sok |
+ { |
+ if ((abs(KompassValue - Kompass_Value_Old)) < 5) // Aufeinanderfolgende Werte duerfen nur minimal abweichen |
+ { |
+ ANALOG_OFF; // ADC ausschalten, damit die Werte sich nicht während der Berechnung ändern |
+ 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 |
+ ANALOG_ON; // ADC einschalten |
+ } |
+ } |
+ Kompass_Neuer_Wert = 0; |
+ } |
+ |
+// Salvo End ************************* |
+ |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Kompass |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ //KompassValue = 12; |
+ if(KompassValue && (EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV)) |
+ { |
+ w = abs(IntegralNick /512); // mit zunehmender Neigung den Einfluss drosseln |
+ v = abs(IntegralRoll /512); |
+ if(v > w) w = v; // grösste Neigung ermitteln |
+ if(w < 20 && NeueKompassRichtungMerken && !SignalSchlecht) |
+ { |
+ KompassStartwert = KompassValue; |
+ NeueKompassRichtungMerken = 0; |
+ } |
+ w = (w * Parameter_KompassWirkung) / 64; // auf die Wirkung normieren |
+ w = Parameter_KompassWirkung - w; // Wirkung ggf drosseln |
+ if(w > 0) |
+ { |
+ ANALOG_OFF; // ADC ausschalten, damit die Werte sich nicht während der Berechnung ändern |
+ |
+// Salvo 30.8.2007 Winkelbegrenzung ********************** |
+ if ((!SignalSchlecht) ) |
+ { |
+ if (abs(KompassRichtung) < 135 ) |
+ { |
+ Mess_Integral_Gier += (KompassRichtung * w) / 32; // nach Kompass ausrichten |
+ } |
+ } |
+ // Salvo End ************************* |
+ |
+ ANALOG_ON; // ADC einschalten |
+ if(SignalSchlecht) SignalSchlecht--; |
+ } |
+ else SignalSchlecht = 500; // so lange das Signal taub stellen --> ca. 1 sek |
+ } |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Debugwerte zuordnen |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+DebugOut.Sekunden++; |
+ if(!TimerWerteausgabe--) |
+ { |
+ TimerWerteausgabe = 49; |
+// DebugOut.Analog[0] = MesswertNick; |
+// DebugOut.Analog[1] = MesswertRoll; |
+// DebugOut.Analog[2] = MesswertGier; |
+ 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[7] = GasMischanteil; |
+ DebugOut.Analog[8] = KompassValue; |
+// ******provisorisch |
+ DebugOut.Analog[9] = cnt1; |
+// DebugOut.Analog[10] = cnt1; |
+// DebugOut.Analog[11] = cnt2; |
+ DebugOut.Analog[10] = (gps_act_position.utm_east/10) % 10000; |
+ DebugOut.Analog[11] = (gps_act_position.utm_north/10) % 10000; |
+// ******provisorisch |
+ |
+ /* |
+ DebugOut.Analog[9] = GyroKomp_Int/GYROKOMP_INC_GRAD_DEFAULT; |
+ DebugOut.Analog[10] = GyroKomp_Int2/GYROKOMP_INC_GRAD_DEFAULT; |
+ DebugOut.Analog[11] = GyroKomp_Inc_Grad; |
+ DebugOut.Analog[12] = GyroKomp_Value; |
+*/ |
+// 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 |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ MesswertNick = IntegralNick * IntegralFaktor + MesswertNick * GyroFaktor; |
+ MesswertRoll = IntegralRoll * IntegralFaktor + MesswertRoll * GyroFaktor; |
+ MesswertGier = MesswertGier * (GyroFaktor/2) + Integral_Gier * IntegralFaktor; |
+ |
+ // 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 |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Gier-Anteil |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ GierMischanteil = MesswertGier - sollGier; // Regler für Gier |
+ if(GierMischanteil > 100) GierMischanteil = 100; |
+ if(GierMischanteil < -100) GierMischanteil = -100; |
+// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// 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 |
+ motorwert = GasMischanteil + pd_ergebnis + GierMischanteil; // Mischer |
+ if ((motorwert < 0) | (GasMischanteil < 10)) 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) | (GasMischanteil < 10)) 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 |
+ // Motor Links |
+ motorwert = GasMischanteil + pd_ergebnis - GierMischanteil; |
+ if ((motorwert < 0) | (GasMischanteil < 10)) 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) | (GasMischanteil < 10)) motorwert = 0; |
+ else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
+ if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
+ Motor_Rechts = motorwert; |
+ // +++++++++++++++++++++++++++++++++++++++++++++++ |
+ |
+} |
+ |
/branches/salvo_gierkompass/fc.h |
---|
0,0 → 1,126 |
/*####################################################################################### |
Flight Control |
#######################################################################################*/ |
#ifndef _FC_H |
#define _FC_H |
//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_X_NEUTRAL 518 // ADC Wandler Wert in Neutrallage (0g): Vom individuellen Sensor abhaengig |
#define ACC_Y_NEUTRAL 516 // ADC Wandler wert in Neutrallage (0g) |
#define ACC_Z_NEUTRAL 745 // ADC Wandler Wert in Neutrallage (1g) |
#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 volatile unsigned char Timeout; |
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 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; |
//Salvo 2.9.2007 Ersatzkompass |
extern volatile long GyroKomp_Int,GyroKomp_Int2; |
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); |
unsigned char h,m,s; |
volatile unsigned char Timeout ; |
unsigned char CosinusNickWinkel, CosinusRollWinkel; |
volatile long IntegralNick,IntegralNick2; |
volatile long IntegralRoll,IntegralRoll2; |
volatile long Integral_Gier; |
volatile long Mess_IntegralNick,Mess_IntegralNick2; |
volatile long Mess_IntegralRoll,Mess_IntegralRoll2; |
volatile long Mess_Integral_Gier; |
volatile int DiffNick,DiffRoll; |
extern int Poti1, Poti2, Poti3, Poti4; |
volatile unsigned char Motor_Vorne,Motor_Hinten,Motor_Rechts,Motor_Links, Count; |
unsigned char MotorWert[5]; |
volatile unsigned char SenderOkay; |
int StickNick,StickRoll,StickGier; |
char MotorenEin; |
extern void DefaultKonstanten(void); |
#define STRUCT_PARAM_LAENGE 58 |
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; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
unsigned char ServoNickCompInvert; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
unsigned char Reserved[7]; |
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; |
#endif //_FC_H |
/branches/salvo_gierkompass/flight_ctrl.aps |
---|
0,0 → 1,0 |
<AVRStudio><MANAGEMENT><ProjectName>flight_ctrl</ProjectName><Created>28-Aug-2007 19:41:41</Created><LastEdit>11-Sep-2007 20:26:56</LastEdit><ICON>241</ICON><ProjectType>0</ProjectType><Created>28-Aug-2007 19:41:41</Created><Version>4</Version><Build>4, 13, 0, 528</Build><ProjectTypeName>AVR GCC</ProjectTypeName></MANAGEMENT><CODE_CREATION><ObjectFile>flight_ctrl.elf</ObjectFile><EntryFile></EntryFile><SaveFolder>C:\Mikrokopter\Flight_Crtl\svn\work\</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><modules><module></module></modules><Triggers><trigger clsid="{11A8571C-BF39-4FA7-8642-286DD19644B8}" enabled="1" variable="{"GPS.c", 44} ptr_position" condition="0" access="0" value1="0" value2="0" elements="1" hitcount="1" continue="0" customType="0" customScope="0"/></Triggers></Debugger><AVRGCCPLUGIN><FILES><SOURCEFILE>main.c</SOURCEFILE><SOURCEFILE>uart.c</SOURCEFILE><SOURCEFILE>analog.c</SOURCEFILE><SOURCEFILE>eeprom.c</SOURCEFILE><SOURCEFILE>fc.c</SOURCEFILE><SOURCEFILE>GPS.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>0</LIST><MAP>0</MAP><OUTPUTFILENAME>flight_ctrl.elf</OUTPUTFILENAME><OUTPUTDIR>default\</OUTPUTDIR><ISDIRTY>0</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>math.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/><LINKOBJECTS/><OPTIONSFORALL>-Wall -gdwarf-2 -O0 -fsigned-char</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><IOView><usergroups/></IOView><Files><File00000><FileId>00000</FileId><FileName>main.c</FileName><Status>1</Status></File00000><File00001><FileId>00001</FileId><FileName>fc.c</FileName><Status>1</Status></File00001><File00002><FileId>00002</FileId><FileName>fc.h</FileName><Status>1</Status></File00002><File00003><FileId>00003</FileId><FileName>timer0.c</FileName><Status>1</Status></File00003><File00004><FileId>00004</FileId><FileName>timer0.h</FileName><Status>1</Status></File00004><File00005><FileId>00005</FileId><FileName>uart.c</FileName><Status>1</Status></File00005><File00006><FileId>00006</FileId><FileName>C:\Mikrokopter\PitSchu\070812_v5.1b\GPS.c</FileName><Status>1</Status></File00006><File00007><FileId>00007</FileId><FileName>math.c</FileName><Status>1</Status></File00007><File00008><FileId>00008</FileId><FileName>analog.c</FileName><Status>1</Status></File00008><File00009><FileId>00009</FileId><FileName>menu.c</FileName><Status>1</Status></File00009><File00010><FileId>00010</FileId><FileName>main.h</FileName><Status>1</Status></File00010><File00011><FileId>00011</FileId><FileName>math.h</FileName><Status>1</Status></File00011><File00012><FileId>00012</FileId><FileName>gps.h</FileName><Status>1</Status></File00012><File00013><FileId>00013</FileId><FileName>GPS.c</FileName><Status>1</Status></File00013><File00014><FileId>00014</FileId><FileName>analog.h</FileName><Status>1</Status></File00014></Files><Workspace><File00000><Position>262 81 1402 765</Position><LineCol>89 12</LineCol><State>Maximized</State></File00000><File00001><Position>365 311 1335 745</Position><LineCol>445 0</LineCol></File00001><File00002><Position>203 101 1173 535</Position><LineCol>0 0</LineCol></File00002><File00003><Position>230 136 1200 570</Position><LineCol>144 0</LineCol></File00003><File00004><Position>257 171 1227 605</Position><LineCol>23 0</LineCol></File00004><File00005><Position>226 57 1366 741</Position><LineCol>60 0</LineCol></File00005><File00006><Position>208 45 1348 729</Position><LineCol>57 0</LineCol></File00006><File00007><Position>371 255 1341 689</Position><LineCol>18 0</LineCol></File00007><File00008><Position>202 41 1342 725</Position><LineCol>157 0</LineCol></File00008><File00009><Position>290 184 1260 618</Position><LineCol>18 0</LineCol></File00009><File00010><Position>344 220 1314 654</Position><LineCol>75 17</LineCol></File00010><File00011><Position>425 325 1395 759</Position><LineCol>9 0</LineCol></File00011><File00012><Position>263 115 1233 549</Position><LineCol>0 0</LineCol></File00012><File00013><Position>266 117 1236 551</Position><LineCol>0 0</LineCol></File00013><File00014><Position>293 152 1263 586</Position><LineCol>0 0</LineCol></File00014></Workspace><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio> |
/branches/salvo_gierkompass/gps.h |
---|
0,0 → 1,66 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Peter Muehlenbrock |
// Definitionen fuer Modul GPS |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
extern signed int GPS_Nick; |
extern signed int GPS_Roll; |
extern void GPS_Neutral(void); |
extern void Get_Ublox_Msg(uint8_t rx) ; |
extern void Get_GPS_data(void); |
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_POSITION_t; |
/* |
extern NAV_VELNED_t actual_speed; |
extern NAV_STATUS_t actual_status; |
extern NAV_POSUTM_t actual_position; |
*/ |
extern GPS_POSITION_t gps_act_position; |
extern unsigned int cnt0,cnt1,cnt2; |
/branches/salvo_gierkompass/main.c |
---|
0,0 → 1,211 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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; |
// -- 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) |
{ |
return(eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET])); |
} |
//############################################################################ |
//Hauptprogramm |
int main (void) |
//############################################################################ |
{ |
unsigned int timer; |
unsigned int timer2 = 0; |
DDRC = 0x01; // 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(); |
sei(); |
VersionInfo.Hauptversion = VERSION_HAUPTVERSION; |
VersionInfo.Nebenversion = VERSION_NEBENVERSION; |
VersionInfo.PCKompatibel = VERSION_KOMPATIBEL; |
printf("\n\rFlightControl V%d.%d ", VERSION_HAUPTVERSION, VERSION_NEBENVERSION); |
printf("\n\r=============================="); |
GRN_ON; |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_VALID]) != 59) // seit V 0.60 |
{ |
printf("\n\rInit. EEPROM: Generiere Default-Parameter..."); |
DefaultKonstanten1(); |
for (unsigned char i=0;i<6;i++) |
{ |
if(i==2) DefaultKonstanten2(); |
WriteParameterSet(i, (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
} |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], 1); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_VALID], 59); |
} |
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(2500); |
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(); |
while (1) |
{ |
if (UpdateMotor) // ReglerIntervall |
{ |
UpdateMotor=0; |
MotorRegler(); |
SendMotorData(); |
ROT_OFF; |
if(PcZugriff) PcZugriff--; |
if(SenderOkay) SenderOkay--; |
if (UBat < EE_Parameter.UnterspannungsWarnung) |
{ |
beeptime = 2000; |
} |
if(!Timeout) |
{ |
i2c_init(); |
} |
else |
{ |
ROT_OFF; |
} |
} |
if(SIO_DEBUG) |
{ |
DatenUebertragung(); |
BearbeiteRxDaten(); |
} |
else BearbeiteRxDaten(); |
if(CheckDelay(timer2)) |
{ |
if(MotorenEin) PORTC ^= 0x10; else PORTC &= ~0x10; |
timer = SetDelay(500); |
} |
} |
return (1); |
} |
/branches/salvo_gierkompass/main.h |
---|
0,0 → 1,93 |
#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 PORTB &=~0x01 |
#define ROT_ON PORTB |= 0x01 |
#define ROT_FLASH PORTB ^= 0x01 |
#define GRN_OFF PORTB &=~0x02 |
#define GRN_ON PORTB |= 0x02 |
#define GRN_FLASH PORTD ^= 0x02 |
//#ifndef F_CPU |
//#error ################## F_CPU nicht definiert oder ungültig ############# |
//#endif |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//#define ANZ_MITTELWERT 4 |
#define EEPROM_ADR_VALID 1 |
#define EEPROM_ADR_ACTIVE_SET 2 |
#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 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 void ReadParameterSet (unsigned char number, unsigned char *buffer, unsigned char length); |
extern 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 "gps.h" |
#include "math.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_gierkompass/makefile |
---|
0,0 → 1,391 |
#-------------------------------------------------------------------- |
# MCU name |
MCU = atmega644 |
F_CPU = 20000000 |
#------------------------------------------------------------------- |
HAUPT_VERSION = 0 |
NEBEN_VERSION = 06 |
VERSION_KOMPATIBEL = 4 # 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). |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION) |
# 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 math.c |
SRC += twimaster.c rc.c fc.c GPS.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) |
# 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_gierkompass/math.c |
---|
0,0 → 1,373 |
/* |
This program (files math.c and math.h) 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 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 for more details. You should have received a copy of the GNU General Public License |
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 |
Winkelfunktionen sin, cos und arctan in |
brute-force Art: Sehr Schnell, nicht sonderlich genau, aber ausreichend |
Stand 11.9.2007 |
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
*/ |
// arctan Funktion: Eingabewert x,y Rueckgabe =arctan(x,y) in grad |
signed int arctan_i(signed int x, signed int y) |
{ |
short int sign = 0; |
signed int i; |
if (y > x) // x,y Werte vertauschen |
{ |
sign = 1; |
i = x; |
x = y; |
y = i; |
} |
} |
// cosinus Funktion: Eingabewert Winkel in Grad, Rueckgabe =cos(winkel)*1000 |
signed int cos_i(signed int winkel) |
{ |
winkel = sin_i(90-winkel); |
return winkel; |
} |
// sinus Funktion: Eingabewert Winkel in Grad, Rueckgabe =sin(winkel)*1000 |
signed int sin_i(signed int winkel) |
{ |
short int m; |
winkel = winkel % 360; |
// Quadranten auswerten |
if ((winkel >= 90 ) && (winkel <180)) |
{ |
winkel = 180 - winkel; |
m = 1; |
} |
else if ((winkel >= 180 ) && (winkel <270)) |
{ |
winkel = winkel - 180; |
m = -1; |
} |
else if ((winkel >= 270 ) && (winkel < 360)) |
{ |
winkel = 360 -winkel ; |
m = -1; |
} |
else if ((winkel < 0) && (winkel > -90)) |
{ |
winkel = (abs(winkel)); |
m = -1; |
} |
else if ((winkel < -90) && (winkel > -180)) |
{ |
winkel = 180-(abs(winkel)); |
m = -1; |
} |
else if ((winkel < -180) && (winkel > -270)) |
{ |
winkel = (abs(winkel))-180; |
m = +1; |
} |
else if ((winkel < -270) && (winkel > -360)) |
{ |
winkel = 360-abs(winkel); |
m = +1; |
} |
else |
{ |
m = +1; |
} |
//Aus Tabelle Werte holen |
switch (winkel) |
{ |
case 1: |
winkel = 17; |
break; |
case 2: |
winkel = 35; |
break; |
case 3: |
winkel = 52; |
break; |
case 4: |
winkel = 70; |
break; |
case 5: |
winkel = 87; |
break; |
case 6: |
winkel = 105; |
break; |
case 7: |
winkel = 122; |
break; |
case 8: |
winkel = 139; |
break; |
case 9: |
winkel = 156; |
break; |
case 10: |
winkel = 174; |
break; |
case 11: |
winkel = 191; |
break; |
case 12: |
winkel = 208; |
break; |
case 13: |
winkel = 225; |
break; |
case 14: |
winkel = 242; |
break; |
case 15: |
winkel = 259; |
break; |
case 16: |
winkel = 276; |
break; |
case 17: |
winkel = 292; |
break; |
case 18: |
winkel = 309; |
break; |
case 19: |
winkel = 326; |
break; |
case 20: |
winkel = 342; |
break; |
case 21: |
winkel = 359; |
break; |
case 22: |
winkel = 375; |
break; |
case 23: |
winkel = 391; |
break; |
case 24: |
winkel = 407; |
break; |
case 25: |
winkel = 423; |
break; |
case 26: |
winkel = 438; |
break; |
case 27: |
winkel = 454; |
break; |
case 28: |
winkel = 469; |
break; |
case 29: |
winkel = 485; |
break; |
case 30: |
winkel = 500; |
break; |
case 31: |
winkel = 515; |
break; |
case 32: |
winkel = 530; |
break; |
case 33: |
winkel = 545; |
break; |
case 34: |
winkel = 559; |
break; |
case 35: |
winkel = 574; |
break; |
case 36: |
winkel = 588; |
break; |
case 37: |
winkel = 602; |
break; |
case 38: |
winkel = 616; |
break; |
case 39: |
winkel = 630; |
break; |
case 40: |
winkel = 643; |
break; |
case 41: |
winkel = 656; |
break; |
case 42: |
winkel = 682; |
break; |
case 43: |
winkel = 682; |
break; |
case 44: |
winkel = 695; |
break; |
case 45: |
winkel = 707; |
break; |
case 46: |
winkel = 719; |
break; |
case 47: |
winkel = 731; |
case 48: |
winkel = 743; |
break; |
case 49: |
winkel = 755; |
break; |
case 50: |
winkel = 766; |
break; |
case 51: |
winkel = 777; |
break; |
case 52: |
winkel = 788; |
break; |
case 53: |
winkel = 799; |
break; |
case 54: |
winkel = 809; |
break; |
case 55: |
winkel = 819; |
break; |
case 56: |
winkel = 829; |
break; |
case 57: |
winkel = 839; |
break; |
case 58: |
winkel = 848; |
break; |
case 59: |
winkel = 857; |
break; |
case 60: |
winkel = 866; |
break; |
case 61: |
winkel = 875; |
break; |
case 62: |
winkel = 883; |
break; |
case 63: |
winkel = 891; |
break; |
case 64: |
winkel = 899; |
break; |
case 65: |
winkel = 906; |
break; |
case 66: |
winkel = 914; |
break; |
case 67: |
winkel = 921; |
break; |
case 68: |
winkel = 927; |
break; |
case 69: |
winkel = 934; |
break; |
case 70: |
winkel = 940; |
break; |
case 71: |
winkel = 946; |
break; |
case 72: |
winkel = 951; |
break; |
case 73: |
winkel = 956; |
break; |
case 74: |
winkel = 961; |
break; |
case 75: |
winkel = 966; |
break; |
case 76: |
winkel = 970; |
break; |
case 77: |
winkel = 974; |
break; |
case 78: |
winkel = 978; |
break; |
case 79: |
winkel = 982; |
break; |
case 80: |
winkel = 985; |
break; |
case 81: |
winkel = 988; |
break; |
case 82: |
winkel = 990; |
break; |
case 83: |
winkel = 993; |
break; |
case 84: |
winkel = 995; |
break; |
case 85: |
winkel = 996; |
break; |
case 86: |
winkel = 998; |
break; |
case 87: |
winkel = 999; |
break; |
case 88: |
winkel = 999; |
break; |
case 89: |
winkel = 1000; |
break; |
case 90: |
winkel = 1000; |
break; |
default: |
winkel = 0; |
break; |
} |
return (winkel*m); |
} |
/branches/salvo_gierkompass/math.h |
---|
0,0 → 1,9 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Peter Muehlenbrock |
// Definitionen fuer Modul math |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
extern signed int sin_i(signed int winkel); |
extern signed int cos_i(signed int winkel); |
extern signed int arctan_i(signed int x, signed int y); |
/branches/salvo_gierkompass/menu.c |
---|
0,0 → 1,118 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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,"V%d.%d",VERSION_HAUPTVERSION, VERSION_NEBENVERSION); |
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 Kanäle ",PPM_in[7]); |
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 Kanäle ",PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]]); |
break; |
case 5: |
LCD_printfxy(0,0,"Gyro - Sensor"); |
LCD_printfxy(0,1,"Nick %4i (%3i)",AccumulateNick / MessanzahlNick, AdNeutralNick); |
LCD_printfxy(0,2,"Roll %4i (%3i)",AccumulateRoll / MessanzahlRoll, AdNeutralRoll); |
LCD_printfxy(0,3,"Gier %4i (%3i)",AccumulateGier / MessanzahlGier, AdNeutralGier); |
break; |
case 6: |
LCD_printfxy(0,0,"ACC - Sensor"); |
LCD_printfxy(0,1,"Nick %4i (%3i)",accumulate_AccNick / messanzahl_AccNick,NeutralAccX); |
LCD_printfxy(0,2,"Roll %4i (%3i)",accumulate_AccRoll / messanzahl_AccRoll,NeutralAccY); |
LCD_printfxy(0,3,"Hoch %4i (%3i)",Aktuell_az/*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_gierkompass/menu.h |
---|
0,0 → 1,5 |
extern void Menu(void); |
extern char DisplayBuff[80]; |
extern unsigned char DispPtr; |
unsigned char RemoteTasten; |
/branches/salvo_gierkompass/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_gierkompass/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_gierkompass/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 |
extern 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_gierkompass/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; |
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;} |
signal = (3 * (PPM_in[index]) + signal) / 4; |
//373 entspricht ca. 1.5ms also Mittelstellung |
PPM_diff[index] = signal - PPM_in[index]; |
PPM_in[index] = signal; |
} |
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_gierkompass/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_gierkompass/timer0.c |
---|
0,0 → 1,155 |
#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; |
int ServoValue = 0; |
//Salvo 8.9.2007 |
volatile uint8_t Kompass_Neuer_Wert= 0; |
volatile unsigned int Kompass_Value_Old = 0; |
// Salvo End |
enum { |
STOP = 0, |
CK = 1, |
CK8 = 2, |
CK64 = 3, |
CK256 = 4, |
CK1024 = 5, |
T0_FALLING_EDGE = 6, |
T0_RISING_EDGE = 7 |
}; |
SIGNAL (SIG_OVERFLOW0) // 8kHz |
{ |
static unsigned char cnt_1ms = 1,cnt = 0; |
// TCNT0 -= 250;//TIMER_RELOAD_VALUE; |
if(!cnt--) |
{ |
cnt = 9; |
cnt_1ms++; |
cnt_1ms %= 2; |
if(!cnt_1ms) UpdateMotor = 1; |
CountMilliseconds++; |
if(Timeout) Timeout--; |
} |
if(beeptime > 1) |
{ |
beeptime--; |
PORTD |= (1<<2); |
} |
else |
PORTD &= ~(1<<2); |
// if(EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV) |
{ |
if(PINC & 0x10) |
{ |
cntKompass++; |
} |
else |
{ |
if((cntKompass) && (cntKompass < 4000)) |
{ |
// Salvo Kompassoffset 30.8.2007 *********** |
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; |
Kompass_Neuer_Wert = 1; |
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 = -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)); |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// 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; |
// DebugOut.Analog[10] = ServoValue; |
OCR2A = ServoValue;// + 75; |
timer = EE_Parameter.ServoNickRefresh; |
} |
else |
{ |
TCCR2A =3; |
PORTD&=~0x80; |
} |
} |
/branches/salvo_gierkompass/timer0.h |
---|
0,0 → 1,23 |
#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); |
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; |
//Salvo 9.9.2007 |
extern volatile uint8_t Kompass_Neuer_Wert; |
extern volatile unsigned int Kompass_Value_Old; |
// Salvo End |
/branches/salvo_gierkompass/twimaster.c |
---|
0,0 → 1,131 |
/*############################################################################ |
############################################################################*/ |
#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); |
} |
//############################################################################ |
//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(); |
twi_state = 0; |
} |
} |
/branches/salvo_gierkompass/twimaster.h |
---|
0,0 → 1,32 |
/*############################################################################ |
############################################################################*/ |
#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_init (void); // I2C initialisieren |
char i2c_start (void); // Start I2C |
void i2c_stop (void); // Stop I2C |
char i2c_write_byte (char byte); // 1 Byte schreiben |
#endif |
/branches/salvo_gierkompass/uart.c |
---|
0,0 → 1,330 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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 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; |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ 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[1] == MeineSlaveAdresse || (RxdBuffer[1] == 'a')) && */(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]; |
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 |
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; |
Debug_Timer = SetDelay(MIN_DEBUG_INTERVALL); |
} |
if(DebugDisplayAnforderung && UebertragungAbgeschlossen) |
{ |
Menu(); |
DebugDisplayAnforderung = 0; |
if(++dis_zeile == 4) dis_zeile = 0; |
SendOutData('0' + dis_zeile,0,&DisplayBuff[20 * dis_zeile],20); // DisplayZeile übertragen |
} |
if(GetVersionAnforderung && UebertragungAbgeschlossen) |
{ |
SendOutData('V',MeineSlaveAdresse,(unsigned char *) &VersionInfo,sizeof(VersionInfo)); |
GetVersionAnforderung = 0; |
} |
} |
/branches/salvo_gierkompass/uart.h |
---|
0,0 → 1,93 |
#ifndef _UART_H |
#define _UART_H |
#define MAX_SENDE_BUFF 150 |
#define MAX_EMPFANGS_BUFF 150 |
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 unsigned char MotorTest[4]; |
struct str_DebugOut |
{ |
unsigned char Digital[13]; |
unsigned int AnzahlZyklen; |
unsigned int Zeit; |
unsigned char Sekunden; |
unsigned int Analog[16]; // 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_gierkompass/version.txt |
---|
0,0 → 1,49 |
------- |
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 |
/branches/salvo_gierkompass/. |
---|
Property changes: |
Added: svn:ignore |
+Flight-Ctrl_MEGA644_V0_60.map |
+Flight-Ctrl_MEGA644_V0_60.sym |
+Flight-Ctrl_MEGA644_V0_60.eep |
+Flight-Ctrl_MEGA644_V0_60.elf |
+Flight-Ctrl_MEGA644_V0_60.hex |
+Flight-Ctrl_MEGA644_V0_60.lss |
+*.map |
+*.hex |
+Flight-Ctrl_MEGA644_V0_06.elf |
+Flight-Ctrl_MEGA644_V0_06.hex |
+Flight-Ctrl_MEGA644_V0_06.lss |
+Flight-Ctrl_MEGA644_V0_06.map |
+Flight-Ctrl_MEGA644_V0_06.sym |
+Flight-Ctrl_MEGA644_V0_06.eep |
+*.chm |