/branches/v0.80d-Arthur-P/FlightCtrl.aps |
---|
0,0 → 1,0 |
<AVRStudio><MANAGEMENT><ProjectName>FlightCtrl</ProjectName><Created>15-May-2007 11:20:41</Created><LastEdit>11-Oct-2007 22:58:54</LastEdit><ICON>241</ICON><ProjectType>0</ProjectType><Created>15-May-2007 11:20:41</Created><Version>4</Version><Build>4, 13, 0, 528</Build><ProjectTypeName>AVR GCC</ProjectTypeName></MANAGEMENT><CODE_CREATION><ObjectFile>default\Flight-Ctrl.elf</ObjectFile><EntryFile></EntryFile><SaveFolder>F:\SVN\MikroKopter\FlightCtrl\branches\V0.64_ZeroWarnings\</SaveFolder></CODE_CREATION><DEBUG_TARGET><CURRENT_TARGET>AVR Simulator</CURRENT_TARGET><CURRENT_PART>ATmega644.xml</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND><HIDE>false</HIDE></IO_EXPAND><REGISTERNAMES><Register>R00</Register><Register>R01</Register><Register>R02</Register><Register>R03</Register><Register>R04</Register><Register>R05</Register><Register>R06</Register><Register>R07</Register><Register>R08</Register><Register>R09</Register><Register>R10</Register><Register>R11</Register><Register>R12</Register><Register>R13</Register><Register>R14</Register><Register>R15</Register><Register>R16</Register><Register>R17</Register><Register>R18</Register><Register>R19</Register><Register>R20</Register><Register>R21</Register><Register>R22</Register><Register>R23</Register><Register>R24</Register><Register>R25</Register><Register>R26</Register><Register>R27</Register><Register>R28</Register><Register>R29</Register><Register>R30</Register><Register>R31</Register></REGISTERNAMES><COM>Auto</COM><COMType>0</COMType><WATCHNUM>0</WATCHNUM><WATCHNAMES><Pane0></Pane0><Pane1></Pane1><Pane2></Pane2><Pane3></Pane3></WATCHNAMES><BreakOnTrcaeFull>0</BreakOnTrcaeFull></DEBUG_TARGET><Debugger><Triggers></Triggers></Debugger><AVRGCCPLUGIN><FILES><SOURCEFILE>uart.c</SOURCEFILE><SOURCEFILE>analog.c</SOURCEFILE><SOURCEFILE>eeprom.c</SOURCEFILE><SOURCEFILE>fc.c</SOURCEFILE><SOURCEFILE>GPS.c</SOURCEFILE><SOURCEFILE>main.c</SOURCEFILE><SOURCEFILE>menu.c</SOURCEFILE><SOURCEFILE>printf_P.c</SOURCEFILE><SOURCEFILE>rc.c</SOURCEFILE><SOURCEFILE>timer0.c</SOURCEFILE><SOURCEFILE>twimaster.c</SOURCEFILE><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></FILES><CONFIGS><CONFIG><NAME>default</NAME><USESEXTERNALMAKEFILE>NO</USESEXTERNALMAKEFILE><EXTERNALMAKEFILE></EXTERNALMAKEFILE><PART>atmega644</PART><HEX>1</HEX><LIST>1</LIST><MAP>1</MAP><OUTPUTFILENAME>Flight-Ctrl.elf</OUTPUTFILENAME><OUTPUTDIR>default\</OUTPUTDIR><ISDIRTY>1</ISDIRTY><OPTIONS><OPTION><FILE>GPS.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>analog.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>eeprom.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>fc.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>main.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>menu.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>printf_P.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>rc.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>timer0.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>twimaster.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>uart.c</FILE><OPTIONLIST></OPTIONLIST></OPTION></OPTIONS><INCDIRS/><LIBDIRS/><LIBS><LIB>libc.a</LIB><LIB>libm.a</LIB></LIBS><LINKOBJECTS/><OPTIONSFORALL>-Wall -gdwarf-2 -Wstrict-prototypes -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -DVERSION_HAUPTVERSION=0 -DVERSION_NEBENVERSION=64 -DVERSION_KOMPATIBEL=5</OPTIONSFORALL><LINKEROPTIONS></LINKEROPTIONS><SEGMENTS/></CONFIG></CONFIGS><LASTCONFIG>default</LASTCONFIG><USES_WINAVR>1</USES_WINAVR><GCC_LOC>C:\Program Files\WinAVR\bin\avr-gcc.exe</GCC_LOC><MAKE_LOC>C:\Program Files\WinAVR\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>uart.c</FileName><Status>1</Status></File00001><File00002><FileId>00002</FileId><FileName>menu.c</FileName><Status>1</Status></File00002><File00003><FileId>00003</FileId><FileName>timer0.c</FileName><Status>1</Status></File00003><File00004><FileId>00004</FileId><FileName>fc.c</FileName><Status>1</Status></File00004><File00005><FileId>00005</FileId><FileName>fc.h</FileName><Status>1</Status></File00005><File00006><FileId>00006</FileId><FileName>menu.h</FileName><Status>1</Status></File00006><File00007><FileId>00007</FileId><FileName>TWIMASTER.C</FileName><Status>1</Status></File00007><File00008><FileId>00008</FileId><FileName>twimaster.h</FileName><Status>1</Status></File00008><File00009><FileId>00009</FileId><FileName>uart.h</FileName><Status>1</Status></File00009><File00010><FileId>00010</FileId><FileName>_Settings.h</FileName><Status>1</Status></File00010><File00011><FileId>00011</FileId><FileName>analog.h</FileName><Status>1</Status></File00011><File00012><FileId>00012</FileId><FileName>gps.h</FileName><Status>1</Status></File00012><File00013><FileId>00013</FileId><FileName>main.h</FileName><Status>1</Status></File00013><File00014><FileId>00014</FileId><FileName>old_macros.h</FileName><Status>1</Status></File00014><File00015><FileId>00015</FileId><FileName>printf_P.h</FileName><Status>1</Status></File00015><File00016><FileId>00016</FileId><FileName>rc.h</FileName><Status>1</Status></File00016><File00017><FileId>00017</FileId><FileName>Settings.h</FileName><Status>1</Status></File00017><File00018><FileId>00018</FileId><FileName>timer0.h</FileName><Status>1</Status></File00018></Files><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio> |
/branches/v0.80d-Arthur-P/GPS.c |
---|
0,0 → 1,32 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) Holger Buss, Ingo Busker |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
signed int GPS_Nick = 0; |
signed int GPS_Roll = 0; |
signed int GPS_Nick2 = 0; |
signed int GPS_Roll2 = 0; |
long GpsAktuell_X = 0; |
long GpsAktuell_Y = 0; |
long GpsZiel_X = 0; |
long GpsZiel_Y = 0; |
void GPS_Neutral(void) |
{ |
GpsZiel_X = GpsAktuell_X; |
GpsZiel_Y = GpsAktuell_Y; |
} |
void GPS_BerechneZielrichtung(void) |
{ |
GPS_Nick = 0; |
GPS_Roll = 0; |
} |
/branches/v0.80d-Arthur-P/Hex-Files/Flight-Ctrl_MEGA644_V0_80d.hex |
---|
0,0 → 1,3926 |
:100000000C94DF060C9425070C9425070C94250707 |
:100010000C9425070C9425070C9425070C942507B0 |
:100020000C9425070C940C170C9425070C942507A9 |
:100030000C942D350C9425070C9425070C9425075A |
:100040000C9425070C9425070C9485150C94250712 |
:100050000C94550C0C9425070C941F0C0C9425073C |
:100060000C94211C0C9425070C94D1300C9425077A |
:100070000C94F3760C9425070C94EF714C1C511CD6 |
:10008000561C5F1C761C8D1C9D1CAD1CCA1CB61E0C |
:100090008D1C781D891DB81DD61DF31D4D1EA81E73 |
:1000A00086201821D5215522BE226E237925D625FA |
:1000B00043268D26D82625277627D0272F28C928FE |
:1000C00064295E2AF93020316331D331EB312C328F |
:1000D000DF329F339F339F339F339F339F339F3351 |
:1000E0009F339F339F339F33563358335D3375337C |
:1000F00077330A0D426174743A0020256420436509 |
:100100006C6C732000204C6F77207761726E696E83 |
:1001100067206C6576656C3A2025642E2564000A9C |
:100120000D466F756E6420424C2D4374726C3A20FC |
:10013000002564000A0D0A0D2121204D4953534921 |
:100140004E4720424C2D4354524C3A2025642021E6 |
:1001500021000A0D3D3D3D3D3D3D3D3D3D3D3D3D8B |
:100160003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3DBF |
:100170003D3D3D3D3D3D3D000A0D43616C69627270 |
:100180006174696E67207072657373757265207330 |
:10019000656E736F722E2E004F4B0A0D000A0D46CE |
:1001A0006C696768742D74696D65202575206D69AB |
:1001B0006E2020546F74616C3A2575206D696E0055 |
:1001C0000A0D436F6E74726F6C3A2000486561646B |
:1001D000696E67486F6C64004E6F726D616C2028A9 |
:1001E0004143432D4D6F646529000A0D3D3D3D3D62 |
:1001F0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D2F |
:100200003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D0A51 |
:100210000D00416E676C654E69636B2020202020C5 |
:100220002020416E676C65526F6C6C20202020206E |
:1002300020204163634E69636B2020202020202012 |
:100240002020416363526F6C6C20202020202020EE |
:1002500020205961774779726F20202020202020AC |
:1002600020204865696768742056616C7565202098 |
:1002700020204163635A202020202020202020209D |
:1002800020204761732020202020202020202020B3 |
:100290002020436F6D706173732056616C7565200B |
:1002A0002020566F6C74616765205B302E31565D7F |
:1002B00020205265636569766572204C6576656CB1 |
:1002C00020204779726F20436F6D70617373202017 |
:1002D00020204D6F746F722031202020202020209C |
:1002E00020204D6F746F722032202020202020208B |
:1002F00020204D6F746F722033202020202020207A |
:1003000020204D6F746F7220342020202020202068 |
:1003100020203136202020202020202020202020B6 |
:1003200020203137202020202020202020202020A5 |
:100330002020313820202020202020202020202094 |
:100340002020313920202020202020202020202083 |
:100350002020536572766F2020202020202020202E |
:100360002020486F7665726761732020202020204E |
:10037000202043757272656E74205B302E31415DB2 |
:1003800020204361706163697479205B6D41685D11 |
:100390002020323420202020202020202020202037 |
:1003A0002020323520202020202020202020202026 |
:1003B0002020323620202020202020202020202015 |
:1003C0002020323720202020202020202020202004 |
:1003D00020204932432D4572726F72202020202048 |
:1003E0002020424C204C696D697420202020202060 |
:1003F00020204750535F4E69636B2020202020202F |
:1004000020204750535F526F6C6C2020202020200A |
:10041000202021212120494E434F4D504154494233 |
:100420004C4520212121002E000A0D20444143206B |
:100430006F7220493243204552524F522120436867 |
:1004400065636B204932432C2033567265662C203D |
:1004500044414320616E6420424C2D4374726C0011 |
:100460005B25695D005B25695D002B204D696B7222 |
:100470006F4B6F70746572202B0048573A56256495 |
:100480002E25642053573A25642E25642563005396 |
:10049000657474696E673A2564202573004861723B |
:1004A0006477617265204572726F7220313A2564FB |
:1004B000202121004D697373696E6720424C2D43E2 |
:1004C00074726C3A25642121004D6978657220456B |
:1004D00072726F722100493243204552524F5221AD |
:1004E0002121004865696768743A20202535690034 |
:1004F000536574706F696E743A2535690050726582 |
:1005000073737572653A253569004F666673657455 |
:100510003A20202535690048656967687420636F53 |
:100520006E74726F6C0044495341424C454400481C |
:10053000656967687420636F6E74726F6C004449FC |
:100540005341424C4544006163742E2062656172E0 |
:10055000696E67004E69636B3A20202020202025B9 |
:10056000356900526F6C6C3A202020202020253500 |
:100570006900436F6D706173733A202020253569DF |
:10058000004B313A25346920204B323A253469201A |
:10059000004B333A25346920204B343A2534692006 |
:1005A000004B353A25346920204B363A25346920F2 |
:1005B000004B373A25346920204B383A25346920DE |
:1005C000004E693A2534692020526F3A253469205B |
:1005D0000047733A253469202047693A2534692059 |
:1005E0000050313A253469202050323A25346920B0 |
:1005F0000050333A253469202050343A253469209C |
:10060000004779726F202D2053656E736F72004E14 |
:1006100069636B25346920282533692E25692900F3 |
:10062000526F6C6C25346920282533692E25692981 |
:100630000047696572253469202825336929004EF1 |
:1006400069636B2025346920282533692E25782994 |
:1006500000526F6C6C2025346920282533692E25C3 |
:1006600078290059617720202534692028253369AD |
:1006700029004E69636B20253469202825336929B8 |
:10068000282533692900526F6C6C20253469202895 |
:1006900025336929282533692900596177202025C8 |
:1006A00034692028253369292825336929004143E5 |
:1006B00043202D2053656E736F72004E69636B206B |
:1006C00025346920282533692900526F6C6C202558 |
:1006D0003469202825336929005A20202020253418 |
:1006E0006920282533692900566F6C746167653A63 |
:1006F0002020202533692E253169560043757272FA |
:10070000656E743A2020202533692E253169410019 |
:10071000506F7765723A20202020202534695700D9 |
:100720004469736368617267653A202535696D4174 |
:10073000680052656365697665720052432D5253B5 |
:1007400053493A202020202534690052432D517509 |
:10075000616C6974793A202534690052432D4368ED |
:10076000616E6E656C733A25346900436F6D70611C |
:1007700073730048656164696E673A2020253569A6 |
:100780000056616C75653A2020202025356900539C |
:10079000746172743A2020202025356900506F74EE |
:1007A00069313A202025336900506F7469323A204C |
:1007B0002025336900506F7469333A20202533694E |
:1007C00000506F7469343A202025336900506F74EB |
:1007D00069353A202025336900506F7469363A2014 |
:1007E0002025336900506F7469373A20202533691A |
:1007F00000506F7469383A202025336900536572C0 |
:10080000766F202000536574706F696E7420202508 |
:10081000336900506F736974696F6E3A20253369CC |
:100820000052616E67653A2533692D2533690045AD |
:10083000787465726E436F6E74726F6C2020004E18 |
:10084000693A2534692020526F3A253469200047DF |
:10085000733A253469202047693A253469200048D5 |
:10086000693A253469202043663A253469200042DC |
:100870004C2D4374726C204572726F727320002588 |
:10088000336420253364202533642025336420001D |
:1008900025336420253364202533642025336420E8 |
:1008A00000253364202533642025336420253364F8 |
:1008B0002000424C2054656D7065726174757265DC |
:1008C00000253369202533692025336920253369C4 |
:1008D00020002533692025336920253369202533FD |
:1008E00069200025336920253369202533692025B7 |
:1008F00033692000424C2D4374726C20666F756E14 |
:1009000064200020256320202025632020202563EB |
:10091000202020256320002025632020202563201F |
:10092000202025632020202563200020256320200F |
:10093000202D2020202D2020202D2000313000319E |
:100940003100313200466C696768742D54696D65F9 |
:10095000202000546F74616C3A2535756D696E0006 |
:100960004163743A20202535756D696E00287265E3 |
:1009700073657429000A0D47656E65726174696E4E |
:10098000672064656661756C7420506172616D6585 |
:1009900074657220536574202564000A0D557369CF |
:1009A0006E6720506172616D657465722053657465 |
:1009B000202564000A0D47656E65726174696E6773 |
:1009C0002064656661756C74204D69786572205489 |
:1009D00061626C65000A0D4D697865722D436F6E1A |
:1009E0006669673A202725732720282575204D6FD3 |
:1009F000746F727329000A0D3D3D3D3D3D3D3D3D07 |
:100A00003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D16 |
:100A10003D3D3D3D3D3D000A0D414343206E6F7419 |
:100A20002063616C69627261746564210D0A000A59 |
:100A30000D506C6561736520636F6E6E6563742025 |
:100A40005370656B7472756D207265636569766548 |
:100A50007220666F722062696E64696E67204E4F05 |
:100A6000572E2E2E006F6B2E0A0D0054696D656F88 |
:100A700075742E0A0D0000008F001E01AD013B02AF |
:100A8000CA025803E603740402058F051B06A70675 |
:100A90003307BE074808D2085B09E3096B0AF20A6C |
:100AA000780BFD0B810C040D860D070E870E060FCB |
:100AB000840F00107B10F5106E11E5115B12CF1240 |
:100AC0004213B31323149214FE146A15D3153B1664 |
:100AD000A11605176717C81727188318DE183719C6 |
:100AE0008E19E319361A871AD61A231B6E1BB61BEA |
:100AF000FD1B411C831CC31C001D3C1D751DAB1D33 |
:100B0000E01D121E421E6F1E9A1EC31EE91E0D1FFF |
:100B10002E1F4D1F691F841F9B1FB01FC31FD31F94 |
:100B2000E11FEC1FF51FFB1FFF1F0020030100004A |
:100B3000C76B00020101BA6C010302024E6D020094 |
:100B40000303AB6D2532692E2531695600253364C8 |
:100B5000256320253033646D005374617475730010 |
:100B60004552524F523A20253264002534692025DF |
:100B700032693A25303269002534696D25630025D4 |
:100B80003369202533692025336920253369002501 |
:100B900033692025336920253369202533690054C2 |
:100BA000656D706572617475726573202020200018 |
:100BB0002563432020202020002532692E2531691D |
:100BC0005620202533692E25316941002534695787 |
:100BD000202536696D4168002532756D2F732053CD |
:100BE00061743A2564200020203344004E6F46781B |
:100BF000004447505300486F6D653A2533646D20BB |
:100C00002533642563004E6F204E6176694374720C |
:100C10006C21000A0D7777772E4D696B726F4B6FE1 |
:100C2000707465722E6465202863292048695379A1 |
:100C30007374656D7320476D6248000A0D746865B2 |
:100C400020757365206F66207468697320736F6602 |
:100C50007477617265206973206F6E6C792070659E |
:100C6000726D6974746564200A0D6F6E206F72690D |
:100C700067696E616C204D696B726F4B6F70746544 |
:100C8000722D48617264776172650041435420445B |
:100C9000534C004A65746920736174656C6C6974A7 |
:100CA000005370656B7472756D20736174656C6C44 |
:100CB000697420284C6F77207265736F6C75746946 |
:100CC0006F6E29005370656B7472756D207361745B |
:100CD000656C6C6974202832303438290053706593 |
:100CE0006B7472756D20736174656C6C6974004D02 |
:100CF000756C74697369676E616C2050504D000AA1 |
:100D00000D52656365697665723A2000756E6B6E8B |
:100D10006F776E2E205573696E672050504D2E2EC2 |
:100D20002E006E6F7420737570706F72746564201E |
:100D3000627920686172647761726521000A0D3DF5 |
:100D40003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3DD3 |
:100D50003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3DC3 |
:100D60003D3D000A0D466C69676874436F6E74728E |
:100D70006F6C0A0D48617264776172653A25642E62 |
:100D800025640A0D536F6674776172653A5625645F |
:100D90002E2564256320000A0D3D3D3D3D3D3D3D32 |
:100DA0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D73 |
:100DB0003D3D3D3D3D3D3D3D3D3D3D3D0000112422 |
:100DC0001FBECFEFD0E1DEBFCDBF11E0A0E0B1E0AC |
:100DD000ECE4F4EF02C005900D92A23FB107D9F701 |
:100DE00018E0A2EFB1E001C01D92AC39B107E1F704 |
:100DF0006AEAE2E0F0E081E2809357007491AE018C |
:100E00004F5F5F4F20EF37EFDA019FE0F9012F5F6F |
:100E10003F4F84918D93915097FFF8CF773911F41C |
:100E20000000FECFFA019EE0819168276095915005 |
:100E300097FFFACF8889681721F0773911F40000FD |
:100E4000FECF0E94E6070C94257A0C940000809156 |
:100E50000406E82FFF27EE0FFF1FE55DF84F8081A6 |
:100E600091818D5E9F4F14F01092030180819181DA |
:100E70008A5B9F4FCCF4809103018823A9F481E021 |
:100E80008093030180915B048F5F80935B048530C6 |
:100E900038F088EE93E0909322028093210204C000 |
:100EA00066E970E00E94973880915B0499279093DF |
:100EB000D5058093D40508951F93CF93DF93182F02 |
:100EC000882389F082EF90E09F938F9389E692E1E7 |
:100ED0009F938F93E0912704F091280409950F9038 |
:100EE0000F900F900F9080912706823308F044C036 |
:100EF00084EF91E00E948C16EC01112329F0CE01C1 |
:100F00000E9495168823D9F3C2E0D0E026E530E0B0 |
:100F100080911D0190911E018217930730F0219658 |
:100F2000255D3F4FC730D10598F38091270699275B |
:100F3000C89F9001C99F300DD89F300D1124209378 |
:100F400000011123D9F068EC70E08C2F0E949738D3 |
:100F5000DF93CF938AEF90E09F938F9389E692E19E |
:100F60009F938F93E0912704F091280409958DB702 |
:100F70009EB706968DBF02C080930001112311F128 |
:100F8000809100016AE00E947879892F99279F93C8 |
:100F90008F93809100010E94787999279F938F9376 |
:100FA00085E091E09F938F9389E692E19F938F93E1 |
:100FB000E0912704F091280409952DB73EB7285FEA |
:100FC0003F4F2DBFDF91CF911F910895CFEFD0E11B |
:100FD000DEBFCDBF8824992414B815B807EE13E0FE |
:100FE0000253104017FFFCCF189B06C0199B02C08C |
:100FF0008DE007C08BE005C0199B02C084E101C0F1 |
:101000008AE08093020181E887B93E9A8FEF88B920 |
:101010008BE184B981E085B98EE38AB987E48BB925 |
:10102000469A84B7877F84BF8091600088618093EF |
:1010300060001092600084EC99E09093220280930B |
:10104000210210921603109215031092300710928D |
:101050002F07109218031092170310921A03109280 |
:10106000190320910201243128F084EC94E0A0E0DF |
:10107000B0E004C08BE095E0A0E0B0E08093950183 |
:1010800090939601A0939701B09398012A3011F0A4 |
:10109000243110F0289801C0289A0E94F5160E9469 |
:1010A000C6160E9471120E9411350E94DA1A0E941F |
:1010B00088300E94D2630E949A6E0E9426768091A8 |
:1010C00002018C3010F4299A01C0299878940E946A |
:1010D000A22F80916B02826080936B0210926D024E |
:1010E0000E94FF4384EF91E00E948C168C01809156 |
:1010F0006B0280FD05C0C8010E9495168823B9F3D4 |
:101100008FE191E09F938F93B9E6AB2EB2E1BB2EB6 |
:10111000BF92AF92E0912704F0912804099580EAEC |
:101120009FE00E948C168C01C0E0D0E00F900F90E1 |
:101130000F900F90ADECEA2EA6E0FA2EF1E8CF2E3C |
:10114000F6E0DF2E0E94FF4380916B0280FD05C018 |
:10115000C8010E9495168823B9F3F60180811816FC |
:10116000ACF40BC00E94FF4380916B0280FD05C070 |
:10117000C8010E9495168823B9F3C8010E949516EC |
:10118000882321F4F7018081882364F7F7018081A7 |
:1011900087FF18C02196DF93CF93219781E391E0D9 |
:1011A0009F938F93BF92AF92E0912704F091280410 |
:1011B00009958091F2018F5F8093F2018DB79EB700 |
:1011C00006968DBF2196E4E0F0E0CE0EDF1E88E0AB |
:1011D00090E0E80EF91ECC30D10508F4B3CFC0E0A2 |
:1011E000D0E00AEC16E0E1E8EE2EE6E0FE2EF80193 |
:1011F000838187FD1CC0F70180811816C4F42196F5 |
:10120000DF93CF93219784E391E09F938F9389E6B7 |
:1012100092E19F938F93E0912704F0912804099520 |
:1012200082E080931F028DB79EB706968DBFF801AE |
:10123000838180788383219684E090E0E80EF91E14 |
:10124000085F1F4FCC30D10590F282E591E09F936B |
:101250008F93C9E6D2E1DF93CF93E0912704F09119 |
:1012600028040995909102068091F2010F900F9049 |
:101270000F900F90981728F480914104806180931B |
:10128000410488E791E09F938F93DF93CF93E091A0 |
:101290002704F0912804099588EE93E00E948C16AB |
:1012A0008C010E94E01A0F900F900F900F90C801D0 |
:1012B0000E9495168823D9F388E991E09F938F9334 |
:1012C000DF93CF93E0912704F0912804099580E003 |
:1012D0000E945939809102010F900F900F900F904A |
:1012E0008A3011F0843110F0289801C0289A80EDDE |
:1012F00097E0909322028093210285E580935D041C |
:101300008EE090E00E941A2E9927182F00278FE078 |
:1013100090E00E941A2E080F111D1093F8010093FF |
:10132000F7018AE090E00E941A2E9927182F0027D3 |
:101330008BE090E00E941A2E080F111D1093F60109 |
:101340000093F5010F5F1F4F39F08091F7019091E5 |
:10135000F8018F5F9F4F41F41092F8011092F7014E |
:101360001092F6011092F5018091F5019091F6012D |
:101370009F938F938091F7019091F8019F938F93A2 |
:101380008DE991E09F938F93DF93CF93E0912704B2 |
:10139000F091280409958DB79EB708968DBF80EC13 |
:1013A00091E09F938F93DF93CF93E0912704F09187 |
:1013B00028040995809110060F900F900F900F90C0 |
:1013C000E0912704F091280482FF07C08CEC91E0A3 |
:1013D0009F938F93DF93CF9308C088ED91E09F9305 |
:1013E0008F9389E692E19F938F9309950F900F90C9 |
:1013F0000F900F900E94FD1F88E893E19093920157 |
:101400008093910181E080935C040E945C0780914D |
:101410002A060E948C758AEE91E09F938F93DF934A |
:10142000CF93E0912704F0912804099580ED97E08F |
:101430000E948C168C018AEF90E00E948C16EC01C1 |
:1014400083E08093AC050F900F900F900F90CE012A |
:101450000E949516882339F084E690E00E948C164D |
:10146000EC010E94E27680912502882309F4DFC115 |
:1014700080910F01882309F4DAC11092250280912E |
:101480005B04882319F00E94270702C00E9493463C |
:101490000E94FF43209102012A3011F0243110F004 |
:1014A000289801C0289A80911B03909141048823B9 |
:1014B00039F080911B03815080931B03977F0AC0F2 |
:1014C00080916F00806280936F0010922C071092C1 |
:1014D0002B07986090934104809191019091920123 |
:1014E0000197909392018093910180919101909145 |
:1014F0009201892B29F080916C02882309F43EC067 |
:101500008091910190919201892B01F50E94AE305A |
:1015100085E090E090939201809391018091E6059F |
:101520009091E70501969093E7058093E6058091F9 |
:10153000E70280688093E702809141048160809394 |
:1015400041048091AD0582608093AD0580910801D2 |
:10155000909109018F5F9F4F19F5809112038823A5 |
:10156000F9F080E197E2909322028093210280E8D3 |
:1015700090E0909309018093080112C02A3011F085 |
:10158000243110F0289801C0289A8091210290916E |
:101590002202892B29F48091E7028F778093E7025A |
:1015A00080912502882309F042C10E94B5120E9451 |
:1015B000930EC8010E949516882309F434C10C5E6D |
:1015C0001F4F80916C0290914104882339F0926002 |
:1015D000909341048091AD0582600CC09D7F9093F3 |
:1015E00041048091910190919201079728F0809198 |
:1015F000AD058D7F8093AD05809191019091920111 |
:10160000079728F0809141048E7F80934104809158 |
:101610000501882321F081508093050125C0809326 |
:1016200067041092F3021092F2021092F1021092EB |
:10163000F0021092EF021092EE0280910801909158 |
:1016400009018F5F9F4F81F480911B03882361F410 |
:1016500088E99AE3909322028093210280E09CE043 |
:1016600090930901809308018091E801893C70F012 |
:1016700081508093E8018091E7028F7B8093E7029D |
:10168000809141048B7F8093410435C0809109088B |
:10169000882309F18091E70280648093E7028091BA |
:1016A0004104846080934104809108019091090174 |
:1016B0008F5F9F4F81F480911203882361F088E946 |
:1016C0009AE3909322028093210280E098EA90931B |
:1016D0000901809308011092F9031092F803109207 |
:1016E000F7031092F6038FEF9FEF909337088093E4 |
:1016F00036081092E80180910001282F332780914D |
:101700001D0190911E0182179307CCF48091E7028E |
:1017100080628093E70280910801909109018F5FB8 |
:101720009F4FC1F480E797E19093220280932102BA |
:1017300080E093E090930901809308010BC08091B1 |
:10174000210290912202892B29F48091E7028F7D5A |
:101750008093E7020E94D06784E08093200280910A |
:101760001203882329F45AEA852E55E0952E12C0DB |
:101770008091F9018F5F8093F901813359F41092C0 |
:10178000F9018091F3019091F40101969093F40195 |
:101790008093F3010894811C911CF2E78F16FBE003 |
:1017A0009F0609F040C0882499242091F7013091C8 |
:1017B000F8012F5F3F4F3093F8012093F70180919C |
:1017C000F5019091F60101969093F6018093F50151 |
:1017D000832F9927682F8EE090E00E94222E80911F |
:1017E000F7019091F8019070682F8FE090E00E94CF |
:1017F000222E8091F5019091F601892F9927682F6B |
:101800008AE090E00E94222E8091F5019091F601ED |
:101810009070682F8BE090E00E94222E84E190E08F |
:101820000E948C168C010E9420680E94B16E8091EB |
:101830002002882309F00BCE0E94F36308CE1F928A |
:101840000F920FB60F9211248F939F93EF93FF93F4 |
:10185000809107018823E1F4809113029091140292 |
:1018600001969093140280931302FC01E45FFA4FF7 |
:10187000E081ED3019F0803A910539F410921402AC |
:101880001092130281E080930701E093C60004C028 |
:101890001092140210921302FF91EF919F918F9179 |
:1018A0000F900FBE0F901F9018951F920F920FB6BA |
:1018B0000F9211242F933F934F935F936F937F93D6 |
:1018C0008F939F93AF93BF93CF93EF93FF9390E04A |
:1018D0008091C60080930B0250911902503A10F08B |
:1018E00090931A0280910B028D3009F065C08091AF |
:1018F0001A02823009F060C090931A02852F99274E |
:1019000086599B4FFC0132974081209115023091FE |
:101910001602241B3109DC0111978C91281B310917 |
:10192000C9019F70909316028093150246E0969528 |
:1019300087954A95E1F7982F935C909317022F7340 |
:101940003070235C209318028081981729F48C91C1 |
:10195000281711F491E006C090E0809108028F5F93 |
:1019600080930802C0910A02CC2309F074C0992325 |
:1019700009F471C081E080930A02580F5093070266 |
:101980005150E52FFF27E659FB4F8DE08083809172 |
:101990006C04823509F05FC00E94FD1F88E190E071 |
:1019A0002CE00FB6F894A895809360000FBE2093AA |
:1019B0006000C0931F024FC020911A02822F992706 |
:1019C00081309105F9F0823091051CF4892B21F0CA |
:1019D00040C0029711F13DC080910B02833239F46F |
:1019E00080910A02882319F481E080931A02809181 |
:1019F0000B0280936A0481E08093190280910B02AC |
:101A0000992722C02F5F20931A02E52FFF27E6595E |
:101A1000FB4F80910B02808309C0E52FFF27E65919 |
:101A2000FB4F80910B028083503A20F45F5F50930C |
:101A3000190202C010921A0220910B028091150225 |
:101A400090911602820F911D9093160280931502B9 |
:101A500002C010921A02FF91EF91CF91BF91AF9106 |
:101A60009F918F917F916F915F914F913F912F91B6 |
:101A70000F900FBE0F901F901895AC01A0E0B0E042 |
:101A80009D01A817B90748F4ECE0F5E08191280F13 |
:101A9000311D1196A417B507C8F33F70FD01E45F2F |
:101AA000FA4FC90156E0969587955A95E1F7835C00 |
:101AB00080831196FD01E45FFA4F2F733070822FFF |
:101AC000835C8083A35FBA4F8DE08C9310920701F3 |
:101AD00080910C058093C6000895A0E0B0E0E3E794 |
:101AE000FDE00C94F1792C859D850E85BB2483E265 |
:101AF00080930C059F5990930D0520930E0533E0BC |
:101B0000E32EF12C002309F49EC0CF84D888BE01B7 |
:101B10006D5E7F4FA989BA890150109709F493C06F |
:101B20001097B9F0F601EB0DF11DB3949081119768 |
:101B300091F4002349F1FB016E5F7F4FDB01C08010 |
:101B4000D1806E5F7F4F0D90BC91A02DBB240150C2 |
:101B500002C090E019C01097B9F0F601EB0DF11D2D |
:101B6000B3944081119791F4002341F1FB016E5F22 |
:101B70007F4FDB01C080D1806E5F7F4F0D90BC91A5 |
:101B8000A02DBB24015002C040E018C01097B1F056 |
:101B9000F601EB0DF11DB3941081119781F4002330 |
:101BA00071F0FB013296DB01CD90DC90BF016E5FDE |
:101BB0007F4FA081B181BB24015001C010E0F7012B |
:101BC000E45FFA4F892F86958695835C808308941D |
:101BD000E11CF11CF701E45FFA4F892F992783700C |
:101BE000907024E0880F991F2A95E1F755279A01F4 |
:101BF00094E0369527959A95E1F7822B835C808354 |
:101C00000894E11CF11CF701E45FFA4F4F7050702B |
:101C1000440F551F440F551F812F992726E0969595 |
:101C200087952A95E1F7842B835C80830894E11CD7 |
:101C3000F11CF701E45FFA4F1F73135C10830894E3 |
:101C4000E11CF11C6ACFC7010E943D0DE9E00C9434 |
:101C50000D7AA3E07A2F409107024650442309F4FD |
:101C600058C0E72FFF27E659FB4F80818D537F5FD8 |
:101C7000E72FFF27E659FB4F20812D537F5FE72F8A |
:101C8000FF27E659FB4F30813D537F5FE72FFF274A |
:101C9000E659FB4F60816D537F5F9927880F991F2D |
:101CA000880F991F522F52955F70582B822F9927BA |
:101CB0008F709070F4E0880F991FFA95E1F7232F49 |
:101CC00026952695282B832F992783709070E6E020 |
:101CD000880F991FEA95E1F7682B41504F3FC9F0F3 |
:101CE000EA2FFF27E659FB4F5083AF5F41504F3F2C |
:101CF00081F0EA2FFF27E659FB4F2083AF5F415069 |
:101D00004F3F39F0EA2FFF27E659FB4F6083AF5F63 |
:101D1000A5CF8DE694E09093060280930502A35030 |
:101D2000A09304020895A2E0B0E0E9E9FEE00C947B |
:101D3000F77980910A02882309F4C7C30E94290E0B |
:101D400080916B04823609F081C280916C049927DE |
:101D50008137910509F4C0C082379105C4F48D36EE |
:101D6000910509F482C08E36910544F48B349105B7 |
:101D700031F18636910509F454C168C28E36910559 |
:101D800009F45BC08037910509F49FC05FC28537B5 |
:101D9000910509F4E2C18637910544F48337910532 |
:101DA00009F4DCC08437910539F150C287379105B9 |
:101DB00009F410C28937910509F46AC147C2E0915C |
:101DC0000502F09106028081918190932E03809309 |
:101DD0002D0320912B0330912C03821B930B845EE7 |
:101DE0009D4F68E671E00E949879845B90409093E3 |
:101DF0002A03809329032AC280910702A091050239 |
:101E0000B0910602853140F080E1E5E4F4E00D9008 |
:101E100001928A95E1F70DC08D919D910D90BC9135 |
:101E2000A02D8093450490934604A0934704B0935B |
:101E3000480480EF809302024BC080910701882301 |
:101E4000E1F38DE490E09F938F9384E796E09F9376 |
:101E50008F9381E08F938F938EE48F930E946D0D0B |
:101E60008DB79EB707968DBFF1C1A0910502B091C5 |
:101E700006021C91113081F48DE4E4E7F6E00D9048 |
:101E800001928A95E1F70E94222F198380914104E3 |
:101E90008F7E8093410401C01982809107018823BD |
:101EA000E1F381E090E09F938F93CE0101969F93A1 |
:101EB0008F9381E08F938F938DE48F930E946D0DAC |
:101EC000ADB7BEB71796ADBFC1C181E080930D021B |
:101ED0008FEF80930501BAC1E0910502F0910602EF |
:101EE00080818F3F39F40E94852FE0910502F091A7 |
:101EF00006028083E0910502F0910602808188232A |
:101F000011F481E003C0863010F085E08083E09119 |
:101F10000502F091060280810E94382EE0910502B0 |
:101F2000F091060280818983809107018823E1F383 |
:101F300080E790E09F938F9383E096E09F938F9349 |
:101F400081E090E09F938F93CE0101969F938F93B2 |
:101F500082E08F9381E08F9381E571C1209105022A |
:101F600030910602D9018C918150853008F040C033 |
:101F7000F90181818435E1F52F5F3F4F80E7E3E090 |
:101F8000F6E0D9010D9001928A95E1F7F90182916D |
:101F90000E94A12E809142069927AA27BB27BC0147 |
:101FA000CD0124EC39E040E050E00E945979DC0199 |
:101FB000CB018093B5019093B601A093B701B09384 |
:101FC000B801809143069927AA27BB27BC01CD0100 |
:101FD0000E945979DC01CB018093B1019093B20149 |
:101FE000A093B301B093B4010E94852F898301C0EF |
:101FF0001982809107018823E1F381E090E09F93AB |
:102000008F93CE0101969F938F9381E08F938F934F |
:1020100083E58F930E946D0D8DB79EB707968DBF98 |
:1020200026C0E0910502F0910602E0818E2F8150DA |
:10203000853018F48E2F0E94382E0E94852F8983B8 |
:10204000809107018823E1F381E090E09F938F93D3 |
:10205000CE0101969F938F9381E08F938F9386E4B7 |
:102060008F930E946D0DADB7BEB71796ADBF80912F |
:102070001203882329F46EE670E089810E94973864 |
:1020800080E00E945C0780912A060E948C75DEC069 |
:10209000E0910502F09106028081992787FD9095D5 |
:1020A00090934607809345078181992787FD9095F6 |
:1020B00090934807809347078281992787FD9095E1 |
:1020C00090934A07809349078381992787FD9095CC |
:1020D00090934C0780934B078481992787FD9095B7 |
:1020E00090934E0780934D078581992787FD9095A2 |
:1020F0009093500780934F078681992787FD90958D |
:1021000090935207809351078781992787FD909577 |
:1021100090935407809353078085992787FD909566 |
:1021200090935607809355078185992787FD909551 |
:1021300090935807809357078285992787FD90953C |
:1021400090935A07809359078385992787FD909527 |
:1021500090935C0780935B0779C0E0910502F09152 |
:10216000060280810E946A348A83882319F481E000 |
:10217000898301C01982809107018823E1F388E0F7 |
:1021800090E09F938F9382EC96E09F938F9321E052 |
:1021900030E03F932F9380910502909106029F9328 |
:1021A0008F933F932F93CE0102969F938F933F93EC |
:1021B0002F93CE01820F931F9F938F9384E08F9371 |
:1021C00081E08F9385E58F930E946D0DEDB7FEB78B |
:1021D00073963BC0809104028930C0F120910502C2 |
:1021E000309106022F5F3F4F88E0A2ECB6E0F90184 |
:1021F00001900D928A95E1F7D9018E910E94C0332A |
:102200008A83882319F481E0898301C0198280912F |
:1022100007018823E1F321E030E03F932F93CE01C3 |
:1022200002969F938F933F932F93CE01820F931F1C |
:102230009F938F9382E08F9381E08F9387E58F93B5 |
:102240000E946D0DEDB7FEB73B96EDBF80916C041B |
:1022500099278436910509F4CDC085369105ACF4F3 |
:102260008136910509F481C0823691052CF48B34B6 |
:10227000910509F45DC021C18236910509F482C03F |
:102280008336910509F491C018C18C36910509F483 |
:10229000FFC08D3691054CF48736910509F40AC1CB |
:1022A0008836910509F4C4C008C18437910529F026 |
:1022B0008637910509F4FAC000C180910702A09108 |
:1022C0000502B0910602803140F080E1E5E4F4E0DF |
:1022D0000D9001928A95E1F70DC08D919D910D9021 |
:1022E000BC91A02D8093450490934604A09347048D |
:1022F000B0934804809107018823E1F31F928091F5 |
:1023000004018F9384E58F930E946D0D8AEF809373 |
:1023100002028FEF8093050180EA9FE00E948C16F5 |
:102320009093FB018093FA010F900F900F90C5C01E |
:10233000E0910502F09106028081918190932E0335 |
:1023400080932D0320912B0330912C03821B930B40 |
:10235000845E9D4F68E671E00E949879845B9040AE |
:1023600090932A0380932903A8C0E0910502F0917D |
:102370000602808180930601803298F08FE180937D |
:1023800006010FC0A0910502B09106028BE0EDE5B9 |
:10239000F4E00D9001928A95E1F7809166048093B4 |
:1023A000EE058FEF8093050188C08091FE0190912A |
:1023B000FF01892B89F4E0910502F0910602E0818A |
:1023C000EE2351F08AE0E89FC00111240E948C1690 |
:1023D0009093380480933704E0910502F09106024F |
:1023E00090818AE0989FC00111249093FF0180930F |
:1023F000FE0115C08FEF80930501E0910502F09179 |
:10240000060290818AE0989FC001112490930102F6 |
:1024100080930002892B19F081E080930F0280EAFB |
:102420009FE00E948C169093FB018093FA0145C0B7 |
:102430008FEF80930501E0910502F09106029081F3 |
:1024400097FD08C082E080930C021092FD0110926B |
:10245000FC011AC0909580916402892B80936402DC |
:1024600091818AE0989FC00111249093FD0180938F |
:10247000FC0184E080930C0280EA9FE00E948C16AD |
:102480009093FB018093FA0181E08093100215C0C4 |
:102490008FEF80930501E0910502F09106028081A3 |
:1024A0008093650281E08093110207C081E08093F0 |
:1024B0000E0203C081E08093120210920A02109271 |
:1024C00006021092050210920402E3E0CE5F0C9423 |
:1024D000137A982F8091C00085FFFCCF9093C6009F |
:1024E00008950F931F9388E18093C1008091C000ED |
:1024F00082608093C0008091C10080688093C10099 |
:102500008091C10080648093C10000E010E00093DE |
:10251000C5008AE290E08093C4008091000290910F |
:1025200001020E948C1690933A04809339048CED3A |
:1025300090E00E948C169093690480936804109236 |
:102540003B0480E580933C0483E080933F048BE070 |
:1025500080933D0410923E041093060200930502FE |
:10256000109204021F910F910895A0E1B0E0EBEBEF |
:10257000F2E10C94F47980910701882309F4C1C237 |
:102580008091FA019091FB010E949516882361F0D9 |
:102590001092FD011092FC011092010210920002B3 |
:1025A0001092FF011092FE018091FC019091FD01BB |
:1025B000892B41F080910A0590910B050E94951698 |
:1025C000882329F480911002882309F460C0809147 |
:1025D0000701882309F45BC080910C0200E211E03E |
:1025E0008430A8F00E94112080E590E09F938F93A3 |
:1025F0001F930F9381E08F938F9388E48F930E94B2 |
:102600006D0D2DB73EB7295F3F4F2DBF34C01092DF |
:10261000660282E194E09F938F9386E090E29F931D |
:102620008F93E0912704F0912804099584E190E0CC |
:102630009F938F931F930F9381E090E09F938F93CD |
:102640008CE092E09F938F9382E08F9381E08F9351 |
:1026500088E48F930E946D0D80910C02982F8F5FFC |
:1026600080930C022DB73EB7215F3F4F2DBF9430B2 |
:1026700010F010920C028091FC019091FD010E94DB |
:102680008C1690930B0580930A051092100280918E |
:102690001102882351F180910701882331F10E94B2 |
:1026A000112080E590E09F938F9380E291E09F93CB |
:1026B0008F9321E030E03F932F938FE191E09F9340 |
:1026C0008F933F932F9385E692E09F938F9383E0C0 |
:1026D0008F9381E08F938CE48F930E946D0D109205 |
:1026E00011028DB79EB70F968DBF80910E02882381 |
:1026F000D1F0809107018823B1F08AE090E09F93A8 |
:102700008F938BE394E09F938F9381E08F938F93CC |
:1027100086E58F930E946D0D10920E022DB73EB785 |
:10272000295F3F4F2DBF809112028823D9F08091FD |
:1027300007018823B9F08BE090E09F938F938DE59C |
:1027400094E09F938F9381E08F93809104018F9306 |
:1027500087E48F930E946D0D109212028DB79EB781 |
:1027600007968DBF80916804909169040E94951628 |
:10277000882309F461C080910701882309F45CC0B3 |
:1027800080911F069927880F991F880F991F7C0138 |
:102790000027F7FC0095102F80916F039091700334 |
:1027A000A0917103B0917203BC01CD01A801970102 |
:1027B0000E94CD793093560420935504809167038D |
:1027C00090916803A0916903B0916A03BC01CD01A7 |
:1027D000A80197010E94CD793093580420935704A3 |
:1027E0008091FC02809359048091FB0280935A04EB |
:1027F00088E090E09F938F9385E594E09F938F937B |
:1028000081E08F9383E08F938BE68F930E946D0D11 |
:1028100080915B042DB73EB7295F3F4F2DBF8530B8 |
:1028200018F086E080935B0483E690E00E948C16AB |
:102830009093690480936804809100029091010252 |
:10284000892B41F08091390490913A040E949516A9 |
:10285000882321F480910F02882339F180910701A8 |
:10286000882319F10E948D3782E490E09F938F9323 |
:102870008CEA95E09F938F9381E08F938F9384E40C |
:102880008F930E946D0D10920F028DB79EB7079621 |
:102890008DBF8091000290910102009731F00E945B |
:1028A0008C1690933A04809339048091FE019091A4 |
:1028B000FF01892B09F4B8C0809137049091380446 |
:1028C0000E949516882309F4AFC0809107018823E0 |
:1028D00009F4AAC080911F069927880F991F880FB5 |
:1028E000991F7C010027F7FC0095102F80916F0342 |
:1028F00090917003A0917103B0917203BC01CD015E |
:10290000A80197010E94CD7930932A0420932904CD |
:102910008091670390916803A0916903B0916A0365 |
:10292000BC01CD01A80197010E94CD7930932C0400 |
:1029300020932B042091F1073091F2074091F30787 |
:102940005091F407DA01C90163E0880F991FAA1FAB |
:10295000BB1F6A95D1F7820F931FA41FB51F820F6B |
:10296000931FA41FB51F20919501309196014091AE |
:10297000970150919801BC01CD010E94CD7930930F |
:102980002E0420932D048091370390913803A09159 |
:102990003903B0913A0339E0B595A7959795879596 |
:1029A0003A95D1F780932F048091330390913403AB |
:1029B000A0913503B091360329E0B595A795979579 |
:1029C00087952A95D1F78093300480913F039091A9 |
:1029D0004003A0914103B091420309E0B595A7954A |
:1029E000979587950A95D1F7809331048EE090E012 |
:1029F0009F938F9389E294E09F938F9381E08F93CD |
:102A00008F9383E48F930E946D0D8091FE019091CE |
:102A1000FF010E948C1690933804809337042DB7E1 |
:102A20003EB7295F3F4F2DBF809106018F3F71F167 |
:102A3000992714E0880F991F1A95E1F78E5E9D4F34 |
:102A400040E150E0BC01CE0101960E94AC7780E1EC |
:102A500090E09F938F93CE0101969F938F9381E097 |
:102A600090E09F938F9386E091E09F938F9382E015 |
:102A70008F9381E08F9381E48F930E946D0D8FEF90 |
:102A8000809306018DB79EB70B968DBF8091EE05A2 |
:102A90008823D1F0809107018823B1F081E090E094 |
:102AA0009F938F938EEE95E09F938F9381E08F930A |
:102AB0008F9382E48F930E946D0D1092EE052DB7D7 |
:102AC0003EB7295F3F4F2DBF80910D028823C9F08B |
:102AD000809107018823A9F084E390E09F938F936E |
:102AE0008BE297E09F938F9381E08F938F9380E5A4 |
:102AF0008F930E946D0D10920D028DB79EB70796B1 |
:102B00008DBFE6E0C05F0C94107A1F920F920FB653 |
:102B10000F9211242F933F935F936F937F938F9323 |
:102B20009F93AF93BF93EF93FF9320E08091200298 |
:102B3000882329F080912002815080932002809187 |
:102B40000A04882319F0815080930A048091280296 |
:102B50008150809328028F3F09F057C089E080930D |
:102B600028028091260290912702019690932702D5 |
:102B70008093260280910A018F5F817080930A0101 |
:102B8000882319F481E08093250286B18091210287 |
:102B900090912202892B21F18091210290912202B1 |
:102BA0000B9750F080912102909122020A97909306 |
:102BB00022028093210204C010922202109221026C |
:102BC0008091210290912202209108013091090107 |
:102BD00082239323892B11F021E008C020E006C056 |
:102BE0008FEF9FEF9093090180930801809102017C |
:102BF000222331F08A3011F45A9A07C0479A05C04F |
:102C00008A3011F45A9801C047988091290288238C |
:102C100009F472C02091E801222309F06DC080916F |
:102C2000100683FF69C086B19927FC01E071F0703E |
:102C300084FF14C080912302909124020196909306 |
:102C40002402809323028091230290912402895EC2 |
:102C5000934008F451C0209329024EC08091230272 |
:102C600090912402892B09F443C080912302909112 |
:102C700024028A569140E0F580912302909124022B |
:102C800069E270E00E94847980912302909124028D |
:102C9000860F971F90932402809323028091230232 |
:102CA000909124020B9750F080912302909124027E |
:102CB0000A9790932E0380932D0304C0F0932E0364 |
:102CC000E0932D0380912D0390912E0320912B03EF |
:102CD00030912C03821B930B845E9D4F68E671E05C |
:102CE0000E949879845B904090932A0380932903F3 |
:102CF0001092240210922302FF91EF91BF91AF91A5 |
:102D00009F918F917F916F915F913F912F910F9044 |
:102D10000FBE0F901F901895209126023091270228 |
:102D2000280F391FC901019608952091260230917C |
:102D30002702821B930B892F9927869580749070A8 |
:102D40000895CF93DF930E948C16EC01CE010E9470 |
:102D500095168823D9F3DF91CF910895CF93DF9310 |
:102D60000E948C16EC0109C080910F01882329F084 |
:102D700090930F018FEC80937A00CE010E949516FC |
:102D8000982F882389F3DF91CF9108959FB7F89406 |
:102D90005F983E9A469A8091B0008F708093B00001 |
:102DA0008091B00083608093B0008091B1008B73FC |
:102DB0008093B1008091B1008B608093B10010923C |
:102DC000B2008FEF8093B3008091B0008068809351 |
:102DD000B000809170008A7F8093700080917000B5 |
:102DE0008260809370009FBF08958AE090E00E9407 |
:102DF0008C16909331028093300282E085BD83EA85 |
:102E000084BD17BC84EB88BD86E086BD80916E00D2 |
:102E1000816080936E0008951F920F920FB60F92FB |
:102E200011242F933F934F935F936F937F938F93CF |
:102E30009F93AF93BF93CF93DF93EF93FF938091D3 |
:102E4000020190912A02843108F011C1992309F0FE |
:102E50006AC38091B00086FFECC08091B0008F7B88 |
:102E60008093B00089EA93E090932C0280932B0228 |
:102E700080910B0190910C019C01220F331F280FB0 |
:102E8000391F8091A1019927880F991F880F991FD9 |
:102E9000280F391F37FF02C02D5F3F4FC90195959D |
:102EA00087959595879590930C0180930B0190934E |
:102EB0001E0280931D02809165066091310620916B |
:102EC0006F0330917003409171035091720380FF42 |
:102ED0002CC0772788279927EA01D90157FF04C01A |
:102EE000A158BF4FCF4FDF4FE7E0D595C795B795B6 |
:102EF000A795EA95D1F79D01AE010E9459799B01F2 |
:102F0000AC0197FF04C0215C3F4F4F4F5F4F66E01D |
:102F100055954795379527956A95D1F780911D026C |
:102F200090911E02820F931F2BC077278827992725 |
:102F3000EA01D90157FF04C0A158BF4FCF4FDF4F5F |
:102F400027E0D595C795B795A7952A95D1F79D0107 |
:102F5000AE010E9459799B01AC0197FF04C0215C2E |
:102F60003F4F4F4F5F4FF6E0559547953795279563 |
:102F7000FA95D1F780911D0290911E02821B930B4E |
:102F800090931E0280931D0280913206282F3327D2 |
:102F9000220F331F220F331F80911D0290911E02BA |
:102FA000821793077CF080913306282F3327220F56 |
:102FB000331F220F331F80911D0290911E0228178C |
:102FC000390724F430931E0220931D0220912B0216 |
:102FD00030912C0280911D0290911E02280F391F02 |
:102FE0002050324030932C0220932B0280911D02FE |
:102FF00090911E0297FD03969595879595958795D7 |
:1030000090931E0280931D0245E02D3D340718F079 |
:103010008CED95E005C02757314030F487E791E00B |
:1030200090932C0280932B0280912B0290912C0282 |
:1030300043C28091B00080648093B00080913806D4 |
:10304000282F33278DED96E0289FA001299F500D52 |
:10305000389F500D1124CA0120912D0230912E026B |
:10306000821B930B90932C0280932B0259C29923BD |
:1030700009F059C28091B00086FF23C28091B00050 |
:103080008F7B8093B000E0912F02EE23F1F48091CA |
:103090003806282F33278DED96E0289FA001299F21 |
:1030A000500D389F500D1124CA0120912D023091EE |
:1030B0002E02821B930B90932C0280932B02109272 |
:1030C0002E0210922D02469A2BC289EA93E0909329 |
:1030D0002C0280932B028E2F99278330910509F4BF |
:1030E000A4C1843091053CF48130910561F00297D0 |
:1030F00009F4D2C0AAC18430910509F499C1059799 |
:1031000009F4A0C1A2C180910B0190910C019C0116 |
:10311000220F331F280F391F8091A1019927880F93 |
:10312000991F880F991F280F391F37FF02C02D5F85 |
:103130003F4FC901959587959595879590930C017B |
:1031400080930B0190931E0280931D02809165066F |
:103150006091310620916F033091700340917103AB |
:103160005091720380FF2CC0772788279927EA01A6 |
:10317000D90157FF04C0A158BF4FCF4FDF4F27E001 |
:10318000D595C795B795A7952A95D1F79D01AE011D |
:103190000E9459799B01AC0197FF04C0215C3F4F0D |
:1031A0004F4F5F4FA6E05595479537952795AA95C0 |
:1031B000D1F780911D0290911E02820F931F27C0AC |
:1031C00077278827992757FF04C021583F4F4F4F33 |
:1031D0005F4FF7E05595479537952795FA95D1F7C5 |
:1031E0000E9459799B01AC0197FF04C0215C3F4FBD |
:1031F0004F4F5F4FE6E05595479537952795EA95F0 |
:10320000D1F780911D0290911E02821B930B909327 |
:103210001E0280931D0280913206282F3327220F31 |
:10322000331F220F331F80911D0290911E028217BF |
:1032300093077CF080913306282F3327220F331F0A |
:10324000220F331F80911D0290911E02281739070B |
:1032500024F430931E0220931D0280912B02909142 |
:103260002C0220911D0230911E02820F931F80506C |
:10327000924090932C0280932B0280911D0290919A |
:103280001E0297FD03969595879595958795909342 |
:103290001E0280931D02ECC080910D0190910E01E1 |
:1032A0009C01220F331F280F391F8091A0019927FD |
:1032B000880F991F880F991F280F391F37FF02C0E9 |
:1032C0002D5F3F4FC901959587959595879590936B |
:1032D0000E0180930D0190931C0280931B0280913C |
:1032E000650660913506A0916703B0916803C091AF |
:1032F0006903D0916A0381FF2AC07727882799271D |
:103300009D01AE01D7FF04C021583F4F4F4F5F4F83 |
:10331000A7E05595479537952795AA95D1F70E942F |
:1033200059799B01AC0197FF04C0215C3F4F4F4F7F |
:103330005F4FF6E05595479537952795FA95D1F764 |
:1033400080911B0290911C02820F931F29C0772746 |
:10335000882799279D01AE01D7FF04C021583F4F10 |
:103360004F4F5F4FE7E05595479537952795EA957D |
:10337000D1F70E9459799B01AC0197FF04C0215CF1 |
:103380003F4F4F4F5F4F76E05595479537952795BF |
:103390007A95D1F780911B0290911C02821B930BAE |
:1033A00090931C0280931B0280913606282F3327AE |
:1033B000220F331F220F331F80911B0290911C029A |
:1033C000821793077CF080913706282F3327220F2E |
:1033D000331F220F331F80911B0290911C0228176C |
:1033E000390724F430931C0220931B0280912B0296 |
:1033F00090912C0220911B0230911C02820F931F8E |
:103400008050924090932C0280932B0280911B025B |
:1034100090911C0297FD03969595879595958795B4 |
:1034200090931C0280931B0223C08091BF0702C0AF |
:10343000809199079927880F991F880F991F8755A1 |
:103440009E4F12C08091C707F5CFFF27EE0FFF1FD9 |
:10345000E55DF84F20813181220F331F80912B02CF |
:1034600090912C02820F931F90932C0280932B0239 |
:1034700080912B0290912C0255E08D3D950718F01C |
:103480008CED95E005C08757914030F487E791E0D7 |
:1034900090932C0280932B0220912B0230912C02CE |
:1034A0002C5B304030932C0220932B0280912D0214 |
:1034B00090912E02820F931F90932E0280932D02E3 |
:1034C0002FC08091B00080648093B0008CEB90E0BE |
:1034D00090932C0280932B0280912D0290912E02CA |
:1034E00084549F4F90932E0280932D0280911F024F |
:1034F000882321F080911B03853B20F480911F02DB |
:10350000823011F4469801C0469A80912F028F5F55 |
:1035100080932F0290913806981710F410922F0282 |
:1035200081E080932A0220912B0230912C0241E00D |
:103530002F37340730F08FEF8093B3002F5F304088 |
:103540000FC02F3F3105C9F0C0F0A9014F5F5040B7 |
:103550004F37510550F480E88093B3002058304035 |
:1035600030932C0220932B0212C08FEF8093B30074 |
:1035700050932C0240932B020AC080912B0280931F |
:10358000B30010922C0210922B0210922A02FF918B |
:10359000EF91DF91CF91BF91AF919F918F917F91EB |
:1035A0006F915F914F913F912F910F900FBE0F90B0 |
:1035B0001F90189510927C008FEC80937A000895EC |
:1035C000CF93DF9383E090E00E941A2EC82FDD276F |
:1035D000C531D10508F02A97C7BD1092360284E69E |
:1035E00090E00E94AE1680911301909114018052D8 |
:1035F000934010F4C0E0D0E0CA3FD105F8F4C7BD55 |
:1036000082E390E00E94AE1687E294E09F938F934E |
:1036100089E692E19F938F93E0912704F09128042B |
:10362000099580911301909114010F900F900F90C4 |
:103630000F908052934010F02196DECF6C2F83E0E4 |
:1036400090E00E94222EC093FF058091100680FF1B |
:1036500009C08C2F8A508B3E28F0809140048064F2 |
:1036600080934004C7BD8CE291E00E94AE16DF91CA |
:10367000CF910895EF92FF921F93CF9310E080EDCA |
:1036800097E00E948C167C01CCE8133019F4CB3003 |
:1036900008F0C9E010E080914602909147028C5FEB |
:1036A000934024F48091120181500AC08091460217 |
:1036B000909147028750944034F0809112018F5FBF |
:1036C0008093120101C011E0809144029091450263 |
:1036D0008C5F934024F48091110181500AC0809145 |
:1036E0004402909145028750944034F0809111013A |
:1036F0008F5F8093110101C01F5F80914202909102 |
:1037000043028C5F934024F48091100181500AC0E1 |
:10371000809142029091430287509440C4F080917E |
:1037200010018F5F8093100113C089E294E09F9392 |
:103730008F9389E692E19F938F93E0912704F09114 |
:10374000280409950F900F900F900F905FC01F5F96 |
:1037500082E18093700280916B028E7F80936B0276 |
:1037600085EA8093BC00809112018A3040F48091F8 |
:1037700040048160809340048AE08093120180912C |
:103780001201863F40F080914004816080934004A4 |
:1037900085EF80931201809111018A3040F480916D |
:1037A00040048260809340048AE0809311018091FC |
:1037B0001101863F40F08091400482608093400474 |
:1037C00085EF80931101809110018A3040F480913F |
:1037D00040048460809340048AE0809310018091CB |
:1037E0001001863F40F08091400484608093400443 |
:1037F00085EF8093100180917002882339F0C70112 |
:103800000E949516882309F090CFF5CF10920F01F2 |
:103810008FEC80937A0080910F018823E1F3CA3006 |
:1038200020F48AE090E00E94AE16C15009F02DCF3E |
:1038300086E490E00E94AE16CF911F91FF90EF902A |
:1038400008951F920F920FB60F921124AF92BF925C |
:10385000CF92DF92EF92FF920F931F932F933F939C |
:103860004F935F936F937F938F939F93AF93BF9388 |
:10387000EF93FF9380914F02282F3327442755273A |
:103880008F5F80934F02F9012231310508F08CC31C |
:10389000E25CFF4F0C941F7A809178009091790040 |
:1038A00046C080917800909179002CC18091780079 |
:1038B00090917900909352028093510257C1809168 |
:1038C0007803909179032091780030917900821BE0 |
:1038D000930B9093F0058093EF058091EF05909105 |
:1038E000F00590935C0280935B025EC1809178004A |
:1038F0009091790020917A0330917B03821B930B86 |
:103900009093FE058093FD058091FD059091FE0545 |
:1039100090935E0280935D0249C38091550290911D |
:1039200056022091780030917900820F931F909376 |
:1039300056028093550281E03AC3809153029091E0 |
:1039400054022091780030917900820F931F909358 |
:1039500054028093530284E02AC380911D01909108 |
:103960001E019C01220F331F280F391F8091780000 |
:103970009091790063E070E00E948479260F371FF0 |
:10398000369527953695279530931E0120931D0176 |
:1039900085E00DC380917800909179004091740387 |
:1039A00050917503841B950B90933D0280933C02CC |
:1039B00080913C0290913D02029704F122E04E3E3C |
:1039C000520784F4209150022B5F2093500225501F |
:1039D0008091E8029091E902845F914018F4215FA0 |
:1039E0002093500280915002853684F14F5F5F4FE3 |
:1039F0005093750340937403845626C080913C0213 |
:103A000090913D028F5F9F4F0CF532E04732530794 |
:103A1000ECF0209150022550209350022B5F8091B2 |
:103A2000E8029091E902845F914018F42F502093AE |
:103A30005002809150028C394CF4415050405093C8 |
:103A40007503409374038C598093500281E08093F6 |
:103A50003B0280917800909179009093F6058093D5 |
:103A6000F50580913C0290913D029C01442737FD71 |
:103A70004095542F80912F0390913003A0913103F2 |
:103A8000B0913203820F931FA41FB51F80932F03A1 |
:103A900090933003A0933103B093320320912F030E |
:103AA00030913003409131035091320357FF04C0ED |
:103AB00021503C4F4F4F5F4F0AE055954795379542 |
:103AC00027950A95D1F780912F0390913003A0910B |
:103AD0003103B0913203821B930BA40BB50B80937F |
:103AE0002F0390933003A0933103B09332032EC180 |
:103AF0008091530290915402209178003091790086 |
:103B0000820F931F909354028093530210924E029F |
:103B100050C2809102018A3071F4809178009091B6 |
:103B200079002091510230915202820F931F019629 |
:103B30009695879517C04091510250915202843159 |
:103B400058F02091780030917900240F351F8FEFC5 |
:103B500097E0821B930B06C08091780090917900CA |
:103B6000840F951F909343028093420286E01FC208 |
:103B700080917803909179032091780030917900B9 |
:103B8000821B930B9093F0058093EF058091EF05D6 |
:103B90009091F00520915B0230915C02820F931F9F |
:103BA000909341028093400287E001C280917800A7 |
:103BB0009091790020917A0330917B03821B930BC3 |
:103BC0009093FE058093FD058091FD059091FE0583 |
:103BD00020915D0230915E02820F931F90933F020D |
:103BE00080933E02E3C120915502309156028091AC |
:103BF000780090917900280F391F30935602209356 |
:103C00005502809102018A3019F4220F331F04C03B |
:103C1000220F331F220F331F309356022093550279 |
:103C20002091550230915602C90137FD0796A3E055 |
:103C300095958795AA95E1F7909347028093460260 |
:103C40008091570290915802820F931F97FD019621 |
:103C500095958795909358028093570220918403FD |
:103C600030918503821B930B90931C0180931B0161 |
:103C700020914C0230914D0280911B0190911C01CA |
:103C8000280F391F37FF02C02F5F3F4F359527950B |
:103C900030934D0220934C024ECE2091530230912E |
:103CA00054028091780090917900280F391F309349 |
:103CB000540220935302809102018A3019F4220F9A |
:103CC000331F04C0220F331F220F331F30935402BF |
:103CD000209353022091530230915402C90137FDC1 |
:103CE000079663E0959587956A95E1F7909345026D |
:103CF000809344028091590290915A02820F931F3F |
:103D000097FD01969595879590935A028093590255 |
:103D10002091820330918303821B930B90931A01AD |
:103D20008093190120914A0230914B028091190130 |
:103D300090911A01280F391F37FF02C02F5F3F4FA4 |
:103D40003595279530934B0220934A0283E02FC18B |
:103D500010924F0281E080930F0180913202909186 |
:103D6000330201969093330280933202809178005F |
:103D70009091790090931401809313018091130125 |
:103D800090911401AA27BB27A0905F02B090600217 |
:103D9000C0906102D0906202A80EB91ECA1EDB1E3E |
:103DA000A0925F02B0926002C0926102D092620261 |
:103DB000809163028F5F80936302823108F4F6C0C2 |
:103DC0008091150190911601A0911701B0911801F1 |
:103DD0007C018D0123E0EE0CFF1C001F111F2A95B2 |
:103DE000D1F7E81AF90A0A0B1B0BEA0CFB1C0C1D95 |
:103DF0001D1D80913602992787FD9095A92FB92F17 |
:103E0000BC01CD0126EC34E240E050E00E9459793B |
:103E1000DC01CB01E81AF90A0A0B1B0BD801C70118 |
:103E20000496A11DB11DB7FF05C0D801C7010B96AF |
:103E3000A11DB11D13E0B595A795979587951A9586 |
:103E4000D1F78093150190931601A0931701B093B9 |
:103E500018018091F7059091F8057C010027F7FC87 |
:103E60000095102F8091150190911601A0911701D6 |
:103E7000B0911801E81AF90A0A0B1B0BE0920D0326 |
:103E8000F0920E0300930F0310931003209137025A |
:103E9000309138024091390250913A0257FF04C0E4 |
:103EA000215F3F4F4F4F5F4FF4E055954795379552 |
:103EB0002795FA95D1F78091370290913802A09119 |
:103EC0003902B0913A02821B930BA40BB50B80937D |
:103ED000370290933802A0933902B0933A0280914E |
:103EE000370290913802A0913902B0913A028E0DBA |
:103EF0009F1DA01FB11F8093370290933802A0939B |
:103F00003902B0933A028091340290913502AC01AB |
:103F1000E5E0440F551FEA95E1F7481B590B8091E6 |
:103F2000370290913802A0913902B0913A02B7FF5E |
:103F300003C00F96A11DB11D74E0B595A795979587 |
:103F400087957A95D1F720910D0330910E03281BA8 |
:103F5000390B63E0220F331F6A95E1F7240F351FF9 |
:103F600037FF02C0215E3F4F45E0359527954A95C2 |
:103F7000E1F73093350220933402D601C501D7FE14 |
:103F800003C00196A11DB11DB595A795979587957D |
:103F900080935F0290936002A0936102B0936202EB |
:103FA00089E08093630202C010924F0282E0809306 |
:103FB0004E0280914E0280937C0080914F028823B4 |
:103FC00019F08FEC80937A00FF91EF91BF91AF9140 |
:103FD0009F918F917F916F915F914F913F912F9121 |
:103FE0001F910F91FF90EF90DF90CF90BF90AF9017 |
:103FF0000F900FBE0F901F90189590E2E0E2F1E055 |
:104000008FE49193815087FFFCCF089590916602D1 |
:10401000E0E2F1E0E90FF11D80839F5F909366027B |
:104020000895EF92FF920F931F93CF93DF93209108 |
:10403000640220FF0AC080916502882311F081503C |
:1040400002C080911F018093650221FF0CC09091F6 |
:10405000650280911F01981719F41092650203C040 |
:104060009F5F90936502822F992780FF04C081FF94 |
:1040700002C0109265020E94FD1F80916502282FE8 |
:104080003327C6E0EC2EC0E2FC2EC0912704D0916D |
:1040900028048A3098F481E1809366023F932F933D |
:1040A00080E694E09F938F93FF92EF92FE01099533 |
:1040B0002DB73EB72A5F3F4F2DBF11C080E18093DF |
:1040C00066023F932F9385E694E09F938F93FF9230 |
:1040D000EF92FE0109958DB79EB706968DBF209190 |
:1040E0006502822F9927AA27BB27FC01429710F06F |
:1040F0000C94BE2AE05BFF4FB6E0EB2EB0E2FB2E45 |
:10410000C0912704D09128040C941F7A1092660263 |
:104110008AE694E09F938F9306E010E2FF92EF927D |
:10412000FE01099584E1809366020F900F900F9035 |
:104130000F9084E690E09F938F9380E590E09F93AB |
:104140008F931F921F92809102016AE00E947879FA |
:10415000892F99279F938F93809102010E947879EC |
:1041600099279F938F938AE794E09F938F93FF9271 |
:10417000EF92E0912704F0912804099588E280935A |
:1041800066022DB73EB7225F3F4F2DBF85E796E011 |
:104190009F938F930E94852F99279F938F938FE8EA |
:1041A00094E09F938F93FF92EF92E0912704F09118 |
:1041B000280409958DB79EB708968DBF909140044D |
:1041C000992351F08CE380936602892F99279F935E |
:1041D0008F938DE994E085C690916C02992371F0DC |
:1041E0008CE380936602892F99279F938F9384EBAA |
:1041F00094E09F938F931F930F9391C080914104FC |
:1042000084FF07C08CE38093660289EC94E00C94F1 |
:10421000502A8091910190919201069710F00C9490 |
:10422000C72A8CE38093660286ED94E00C94502AB2 |
:1042300080911006A6E0EA2EA0E2FA2EC091270493 |
:10424000D091280480FF74C01092660280910D0303 |
:1042500090910E03A0910F03B0911003BC01CD010A |
:1042600025E030E040E050E00E94CD793F932F936D |
:1042700083EE94E09F938F93FF92EF92FE01099556 |
:1042800084E1809366022DB73EB72A5F3F4F2DBF72 |
:104290008091090390910A03A0910B03B0910C0344 |
:1042A000BC01CD0125E030E040E050E00E94CD7936 |
:1042B0003F932F9380EF94E09F938F93FF92EF9221 |
:1042C000E0912704F0912804099588E28093660222 |
:1042D0008DB79EB706968DBF809113019091140102 |
:1042E0009F938F938DEF94E09F938F93FF92EF9224 |
:1042F000E0912704F091280409958CE380936602ED |
:104300002DB73EB72A5F3F4F2DBF87B599279F93A3 |
:104310008F938AE095E09F938F93FF92EF92E091C5 |
:104320002704F091280409958DB79EB706962FC7EC |
:104330001092660287E195E09F938F93FF92EF9230 |
:10434000FE01099584E1809366020F900F900F9013 |
:104350000F9086E295E09F938F93FF92EF92E0910A |
:104360002704F0912804099588E2809366020F9053 |
:104370000F900F900F908FE295E09F938F93FF9295 |
:10438000EF92E0912704F091280409958CE3809343 |
:1043900066020F900F900F900F908EE395E09F9321 |
:1043A0008F93FF92EF920C94542A1092660287E446 |
:1043B00095E09F938F9306E010E2FF92EF92FE014B |
:1043C000099584E1809366020F900F900F900F90F3 |
:1043D00080916F0390917003A0917103B09172036B |
:1043E000B7FF04C081509C4FAF4FBF4FFAE0B59567 |
:1043F000A79597958795FA95D1F7BF93AF939F931C |
:104400008F9384E595E09F938F931F930F93E09193 |
:104410002704F0912804099588E2809366022DB75D |
:104420003EB7285F3F4F2DBF80916703909168038F |
:10443000A0916903B0916A03B7FF04C081509C4FFB |
:10444000AF4FBF4FEAE0B595A79597958795EA9549 |
:10445000D1F7BF93AF939F938F9383E695E09F939C |
:104460008F931F930F93E0912704F09128040995EF |
:104470008CE3809366028DB79EB708968DBF8091BE |
:104480002D0390912E039F938F9382E795E09F9346 |
:104490008F931F930F93E0912704F09128040995BF |
:1044A0002DB73EB72A5F3F4F0DC71092660280912D |
:1044B0002F07909130079F938F9380912D079091B4 |
:1044C0002E079F938F9381E895E09F938F93FF92A0 |
:1044D000EF92FE01099584E1809366028DB79EB745 |
:1044E00008968DBF80913307909134079F938F93E7 |
:1044F00080913107909132079F938F9381E995E0E6 |
:104500009F938F93FF92EF92E0912704F0912804FC |
:10451000099588E2809366022DB73EB7285F3F4F2A |
:104520002DBF80913707909138079F938F9380918B |
:104530003507909136079F938F9381EA95E09F937B |
:104540008F93FF92EF92E0912704F0912804099550 |
:104550008CE3809366028DB79EB708968DBF8091DD |
:104560003B0790913C079F938F93809139079091DF |
:104570003A079F938F9381EB95E0A2C01092660259 |
:1045800080910506E82FFF27EE0FFF1FE55DF84F2E |
:10459000808191819F938F9380910406E82FFF275C |
:1045A000EE0FFF1FE55DF84F808191819F938F9300 |
:1045B00081EC95E09F938F93FF92EF92FE01099516 |
:1045C00084E1809366028DB79EB708968DBF809177 |
:1045D0000706E82FFF27EE0FFF1FE55DF84F8081EC |
:1045E00091819F938F9380910606E82FFF27EE0F0E |
:1045F000FF1FE55DF84F8081918188589F4F9F9301 |
:104600008F9381ED95E09F938F93FF92EF92E091CE |
:104610002704F0912804099588E2809366022DB75B |
:104620003EB7285F3F4F2DBF80910906E82FFF2737 |
:10463000EE0FFF1FE55DF84F8081918182599F4FFA |
:104640009F938F9380910806E82FFF27EE0FFF1F9F |
:10465000E55DF84F8081918182599F4F9F938F93A1 |
:1046600081EE95E09F938F93FF92EF92E091270464 |
:10467000F091280409958CE3809366028DB79EB76C |
:1046800008968DBF80910B06E82FFF27EE0FFF1FC6 |
:10469000E55DF84F8081918182599F4F9F938F9361 |
:1046A00080910A06E82FFF27EE0FFF1FE55DF84F08 |
:1046B0008081918182599F4F9F938F9381EF95E0E5 |
:1046C0009F938F93FF92EF92E0912704F09128043B |
:1046D00009952DB73EB7285F3F4FF4C5109266028B |
:1046E00081E096E09F938F9306E010E2FF92EF92B5 |
:1046F000FE010995809102010F900F900F900F908D |
:104700008A3009F0A1C084E180936602809184031D |
:10471000909185039C0197FF02C0295F3F4F287F3E |
:10472000821B930B9F938F938091840390918503B9 |
:1047300097FD079673E0959587957A95E1F79F9396 |
:104740008F93209184033091850337FF02C0295F46 |
:104750003F4F63E0359527956A95E1F780914602D2 |
:1047600090914702821B930B9F938F938FE096E06B |
:104770009F938F931F930F93E0912704F091280448 |
:10478000099588E2809366028DB79EB70A968DBF21 |
:1047900080918203909183039C0197FF02C0295F5F |
:1047A0003F4F287F821B930B9F938F9380918203AF |
:1047B0009091830397FD079653E0959587955A95B9 |
:1047C000E1F79F938F93209182033091830337FF0A |
:1047D00002C0295F3F4F43E0359527954A95E1F7A1 |
:1047E0008091440290914502821B930B9F938F937B |
:1047F00080E296E09F938F931F930F93E09127049D |
:10480000F091280409958CE3809366022DB73EB79A |
:10481000265F3F4F2DBF80918003909181039F932E |
:104820008F93809180039091810320914202309177 |
:104830004302821B930B9F938F9381E396E09F9398 |
:104840008F931F930F93A3C38B3019F0843108F417 |
:10485000ADC084E1809366028091840390918503CA |
:104860009C0197FF02C0215F3F4F207F821B930B6B |
:1048700097FD0196959587959F938F9380918403DB |
:104880009091850397FD0F9624E0959587952A953D |
:10489000E1F79F938F93209184033091850337FF35 |
:1048A00002C0295F3F4F83E0359527958A95E1F750 |
:1048B0008091460290914702821B930B9F938F93A6 |
:1048C0008FE396E09F938F931F930F93E0912704BC |
:1048D000F0912804099588E2809366022DB73EB7CF |
:1048E000265F3F4F2DBF80918203909183039C01EF |
:1048F00097FF02C0215F3F4F207F821B930B97FDE4 |
:104900000196959587959F938F93809182039091BF |
:10491000830397FD0F96B4E095958795BA95E1F7D7 |
:104920009F938F93209182033091830337FF02C0BE |
:10493000295F3F4FA3E035952795AA95E1F7809130 |
:10494000440290914502821B930B9F938F9381E5C4 |
:1049500096E09F938F931F930F93E0912704F0911C |
:10496000280409958CE3809366028DB79EB70A965A |
:104970008DBF809180039091810397FD019695955D |
:1049800087959F938F9380918003909181032091CD |
:10499000420230914302821B930B9F938F9383E6D5 |
:1049A00096E09F938F931F930F938ECE8D3009F0D7 |
:1049B000EEC584E1809366028091120199279F934E |
:1049C0008F93809184039091850397FD0F96E4E087 |
:1049D00095958795EA95E1F79F938F9320918403AE |
:1049E0003091850337FF02C0295F3F4F73E0359553 |
:1049F00027957A95E1F78091460290914702821BB4 |
:104A0000930B9F938F9382E796E09F938F931F93CF |
:104A10000F93E0912704F0912804099588E2809390 |
:104A200066028DB79EB70A968DBF809111019927B6 |
:104A30009F938F93809182039091830397FD0F96AC |
:104A400064E0959587956A95E1F79F938F93209100 |
:104A500082033091830337FF02C0295F3F4F53E049 |
:104A6000359527955A95E1F780914402909145023A |
:104A7000821B930B9F938F9386E896E09F938F936F |
:104A80001F930F93E0912704F091280409958CE37C |
:104A9000809366022DB73EB7265F3F4F2DBF8091B2 |
:104AA000100199279F938F938091800390918103A8 |
:104AB00097FD0196959587959F938F93809180039D |
:104AC000909181032091420230914302821B930B0B |
:104AD0009F938F938AE996E09F938F931F930F93F1 |
:104AE000E0912704F091280409958DB79EB70A96A6 |
:104AF0004EC3109266028EEA96E09F938F93FF92C8 |
:104B0000EF92FE01099584E1809366020F900F9069 |
:104B10000F900F9080917A0390917B039F938F93D6 |
:104B200080913E0290913F029F938F938BEB96E092 |
:104B30009F938F93FF92EF92E0912704F0912804C6 |
:104B4000099588E2809366022DB73EB7285F3F4FF4 |
:104B50002DBF80917803909179039F938F938091DB |
:104B60004002909141029F938F938AEC96E09F932D |
:104B70008F93FF92EF92E0912704F091280409951A |
:104B80008CE3809366028DB79EB708968DBF8091A7 |
:104B90007403909175039F938F9380913C02909141 |
:104BA0003D029F938F9389ED96E08ACD1092660225 |
:104BB00080911D0190911E016AE070E00E94987939 |
:104BC0009F938F9380911D0190911E016AE070E088 |
:104BD0000E9498797F936F9388EE96E09F938F93CE |
:104BE000FF92EF92FE01099584E1809366028DB7F2 |
:104BF0009EB708968DBF80916808909169086AE019 |
:104C000070E00E9484799F938F93809168089091BF |
:104C100069086AE070E00E9484797F936F938CEF5B |
:104C200096E09F938F93FF92EF92E0912704F0918B |
:104C30002804099588E2809366022DB73EB7285F65 |
:104C40003F4F2DBF80916A0890916B089F938F937F |
:104C500080E197E09F938F93FF92EF92E09127047A |
:104C6000F091280409958CE3809366028DB79EB776 |
:104C700006968DBF80916C0890916D089F938F93DD |
:104C800080E297E02EC11092660282E397E09F9344 |
:104C90008F93FF92EF92FE01099584E18093660263 |
:104CA0000F900F900F900F9080912B0790912C07F1 |
:104CB0009F938F938BE397E09F938F93FF92EF9255 |
:104CC000E0912704F0912804099588E28093660218 |
:104CD0008DB79EB706968DBF80911B0399279F9332 |
:104CE0008F938BE497E09F938F93FF92EF92E091E5 |
:104CF0002704F091280409958CE3809366022DB770 |
:104D00003EB72A5F3F4F2DBF80912A079927019711 |
:104D10009F938F938BE597E0FECA109266028BE615 |
:104D200097E09F938F93FF92EF92FE01099584E1A4 |
:104D3000809366020F900F900F900F90809129033F |
:104D400090912A039F938F9383E797E09F938F938C |
:104D5000FF92EF92E0912704F0912804099588E2F0 |
:104D6000809366022DB73EB72A5F3F4F2DBF8091DB |
:104D70002D0390912E039F938F9381E897E09F934B |
:104D80008F93FF92EF92E0912704F0912804099508 |
:104D90008CE3809366028DB79EB706968DBF809197 |
:104DA0002B0390912C039F938F938FE897E099C0EA |
:104DB0001092660280911C0399279F938F938DE92F |
:104DC00097E09F938F93FF92EF92FE01099584E104 |
:104DD000809366028DB79EB706968DBF80911D03A6 |
:104DE00099279F938F9389EA97E09F938F93FF92E0 |
:104DF000EF92E0912704F0912804099588E28093CE |
:104E000066022DB73EB72A5F3F4F2DBF80911E032C |
:104E100099279F938F9385EB97E09F938F93FF92B2 |
:104E2000EF92E0912704F091280409958CE3809398 |
:104E300066028DB79EB706968DBF80911F03992796 |
:104E40009F938F9381EC97E04CC010926602809103 |
:104E5000200399279F938F938DEC97E09F938F93D7 |
:104E6000FF92EF92FE01099584E1809366028DB76F |
:104E70009EB706968DBF8091210399279F938F93AC |
:104E800089ED97E09F938F93FF92EF92E091270433 |
:104E9000F0912804099588E2809366022DB73EB709 |
:104EA0002A5F3F4F2DBF8091220399279F938F93B5 |
:104EB00085EE97E09F938F93FF92EF92E091270406 |
:104EC000F091280409958CE3809366028DB79EB714 |
:104ED00006968DBF8091230399279F938F9381EF2F |
:104EE00097E09F938F93FF92EF92D5CA109266023C |
:104EF0008DEF97E09F938F93FF92EF92FE010995BC |
:104F000084E1809366020F900F900F900F90809134 |
:104F1000A10199279F938F9385E098E09F938F93AA |
:104F2000FF92EF92E0912704F0912804099588E21E |
:104F3000809366028DB79EB706968DBF80911D0245 |
:104F400090911E029F938F9383E198E09F938F939C |
:104F5000FF92EF92E0912704F091280409958CE3E9 |
:104F6000809366022DB73EB72A5F3F4F2DBF8091D9 |
:104F7000330699279F938F938091320699279F93A9 |
:104F80008F9381E298E09F938F93FF92EF92E0914D |
:104F90002704F091280409958DB79EB70896F7C0AD |
:104FA000109266028FE298E09F938F93FF92EF92A8 |
:104FB000FE01099584E1809366020F900F900F9097 |
:104FC0000F9080916104992787FD90959F938F930F |
:104FD00080916004992787FD90959F938F938FE32D |
:104FE00098E09F938F93FF92EF92E0912704F091C6 |
:104FF0002804099588E2809366022DB73EB7285FA2 |
:105000003F4F2DBF80916204992787FD90959F9314 |
:105010008F938091630499279F938F938FE498E0F7 |
:105020009F938F93FF92EF92E0912704F0912804D1 |
:1050300009958CE3809366028DB79EB708968DBF65 |
:105040008091670499279F938F9380916404992797 |
:1050500087FD90959F938F938FE598E031CB1092C9 |
:1050600066028FE698E09F938F93FF92EF92FE0186 |
:10507000099584E1809366020F900F900F900F9036 |
:105080008091E50699278F7790709F938F938091F9 |
:10509000DD0699278F7790709F938F938091D50627 |
:1050A00099278F7790709F938F938091CD06992742 |
:1050B0008F7790709F938F938FE798E09F938F9354 |
:1050C000FF92EF92E0912704F0912804099588E27D |
:1050D000809366028DB79EB70C968DBF80910507B1 |
:1050E00099278F7790709F938F938091FD069927D2 |
:1050F0008F7790709F938F938091F50699278F7784 |
:1051000090709F938F938091ED0699278F77907081 |
:105110009F938F9380E998E09F938F93FF92EF92F4 |
:10512000E0912704F091280409958CE380936602AE |
:105130002DB73EB7245F3F4F2DBF8091250799279C |
:105140008F7790709F938F9380911D0799278F770A |
:1051500090709F938F938091150799278F77907008 |
:105160009F938F9380910D0799278F7790709F93CE |
:105170008F9381EA98E09F938F93FF92EF92E09153 |
:105180002704F091280409958DB79EB70C968DBF22 |
:10519000FEC11092660282EB98E09F938F93FF927C |
:1051A000EF92FE01099584E1809366020F900F90C3 |
:1051B0000F900F908091E906992787FD90959F9316 |
:1051C0008F938091E106992787FD90959F938F9308 |
:1051D0008091D906992787FD90959F938F93809111 |
:1051E000D106992787FD90959F938F9381EC98E046 |
:1051F0009F938F93FF92EF92E0912704F091280400 |
:10520000099588E2809366022DB73EB7245F3F4F31 |
:105210002DBF80910907992787FD90959F938F93C4 |
:1052200080910107992787FD90959F938F93809197 |
:10523000F906992787FD90959F938F938091F106AA |
:10524000992787FD90959F938F9382ED98E09F9388 |
:105250008F93FF92EF92E0912704F0912804099533 |
:105260008CE3809366028DB79EB70C968DBF8091BC |
:105270002907992787FD90959F938F938091210708 |
:10528000992787FD90959F938F9380911907992770 |
:1052900087FD90959F938F9380911107992787FDA4 |
:1052A00090959F938F9383EE98E09F938F93FF92B7 |
:1052B000EF92E0912704F091280409952DB73EB7AD |
:1052C000245F3F4F2DBF63C11092660284EF98E0C8 |
:1052D0009F938F9306E010E2FF92EF92FE010995F3 |
:1052E00084E1809366020F900F900F900F90809151 |
:1052F000E506881F8827881F97E0899FC001112431 |
:105300008D969F938F938091DD06881F8827881F35 |
:1053100096E0899FC00111248D969F938F93809171 |
:10532000D506881F8827881F95E0899FC001112412 |
:105330008D969F938F938091CD06881F8827881F15 |
:105340009927880F991F880F991F8D969F938F9388 |
:1053500083E099E09F938F93FF92EF92E09127046F |
:10536000F0912804099588E2809366028DB79EB774 |
:105370000C968DBF80910507881F8827881F9BE0AA |
:10538000899FC00111248D969F938F938091FD0674 |
:10539000881F8827881F9AE0899FC00111248D9655 |
:1053A0009F938F938091F506881F8827881F99E027 |
:1053B000899FC00111248D969F938F938091ED0654 |
:1053C000881F8827881F992723E0880F991F2A950F |
:1053D000E1F78D969F938F9387E199E09F938F9349 |
:1053E000FF92EF92E0912704F091280409958CE355 |
:1053F000809366022DB73EB7245F3F4F2DBF80914B |
:105400000D07881F8827881F9CE0899FC0011124F1 |
:105410008D969F938F938BE299E09F938F93FF924A |
:10542000EF92E0912704F0912804099580911507E7 |
:105430002DB73EB72A5F3F4F2DBF87FF12C080E4D4 |
:10544000809366028CE399E09F938F93FF92EF9293 |
:10545000E0912704F091280409950F900F900F9088 |
:105460000F9080911D0787FF12C084E4809366022D |
:105470008FE399E09F938F931F930F93E0912704FD |
:10548000F091280409950F900F900F900F90809144 |
:10549000250787FF7CC088E48093660282E499E058 |
:1054A0009F938F931F930F93E0912704F09128040B |
:1054B00009950F900F900F900F9069C0109266029F |
:1054C00085E499E09F938F93FF92EF92FE010995F7 |
:1054D00084E1809366020F900F900F900F9080915F |
:1054E000F5019091F6019F938F9383E599E09F9347 |
:1054F0008F93FF92EF92E0912704F0912804099591 |
:1055000088E2809366028DB79EB706968DBF809124 |
:10551000F7019091F8019F938F9380E699E09F9314 |
:105520008F93FF92EF92E0912704F0912804099560 |
:1055300089E4809366022DB73EB72A5F3F4F2DBFA7 |
:105540008DE699E09F938F93FF92EF92E09127046D |
:10555000F09128040995809164020F900F900F90AC |
:105560000F9083FF14C01092F8011092F70160E0D1 |
:1055700070E08EE090E00E94332E09C080911F0100 |
:10558000281719F4215020931F01109265021092E0 |
:105590006402E6E0CDB7DEB70C94107AF999FECF3D |
:1055A00092BD81BDF89A80B599270895F999FECFEB |
:1055B0001FBA92BD81BD60BD0FB6F894FA9AF99AF0 |
:1055C0000FBE08954AEA20E030E02617370740F47E |
:1055D000FC018191480F2F5F3F4F26173707C8F313 |
:1055E000842F99270895EAEA40E050E046175707CC |
:1055F00078F49C01F999FECF32BD21BDF89A80B5AF |
:10560000E80F4F5F5F4F2F5F3F4F4617570790F3ED |
:105610008E2F9927089581E08093060682E080937B |
:10562000050683E08093040684E08093070685E006 |
:105630008093080686E08093090687E080930A0637 |
:1056400088E080930B0689E080930C068AE08093C3 |
:105650000D068BE080930E068CE080930F06089574 |
:105660001F93CF93DF9384E580930306809102011B |
:10567000843150F08AE080932306109245068BE136 |
:1056800080931F068EE40AC083E08093230680E2A5 |
:10569000809345068EE180931F0685E58093420640 |
:1056A000809343068AE68093100683E08093660623 |
:1056B000AEE1A09311068FEF80931306EFE0E09325 |
:1056C0001406A093120610921606F8E0F09317063F |
:1056D00080E4809318061092190684E180931506E1 |
:1056E0008EE080931A06B0E1B0931B061CE0109385 |
:1056F0001C06F0931D0686EE80931E0680E88093BC |
:10570000200650E55093210686E9809322065093A7 |
:1057100024068093250676E07093260681E2809326 |
:1057200027068DE2809328069AE59093290680E269 |
:1057300080932B0610922C0610922D0610922E06A6 |
:1057400010922F06109247061092480610924906B2 |
:1057500010924A0634E63093300648E24093310610 |
:1057600061E0609365061092320627EF20933306BE |
:10577000709338068DE78093390680933A068093BC |
:105780003B0630933406409335061092360620933C |
:10579000370682E380933C0690933D0680933E0655 |
:1057A0001092640690933F06509340066093410622 |
:1057B000B0934406309346068FE580934B0683EF03 |
:1057C00080934D068AEA80934F0680935006E093BB |
:1057D0004C06E0934E068EEF8093510630935206AE |
:1057E0009093530690935406909355068BE48093C0 |
:1057F0005606809357068093580610925906709368 |
:105800005A06F0935B0690935C06A0935D06309376 |
:105810005E0630935F0682E08093600660932A06FE |
:105820001092620610926306A7E6B6E0E0E7F1E0A8 |
:10583000ED01019009921A95E1F760E770E0CD0162 |
:10584000845690400E94E22A80937306DF91CF91A4 |
:105850001F910895CF93DF9384E580930306809191 |
:105860000201843150F08AE08093230610924506AD |
:105870008BE180931F068EE40AC083E080932306A9 |
:1058800080E2809345068EE180931F0685E5809334 |
:105890004206809343068AE68093100683E0809355 |
:1058A00066067EE1709311068FEF809313069FE0EA |
:1058B00090931406709312061092160668E0609397 |
:1058C000170680E480931806109219069093150627 |
:1058D0008AE080931A0680E180931B0656E050937D |
:1058E0001C0660931D0686EE80931E0680E880935A |
:1058F00020062AE52093210688E78093220620933C |
:105900002406809325065093260681E2809327067D |
:105910008DE28093280620932906E0E2E0932B068F |
:1059200010922C0610922D0610922E0610922F0621 |
:1059300010924706109248061092490610924A06A5 |
:1059400044E64093300638E230933106F1E0F093BC |
:1059500065061092320697EF9093330650933806FF |
:105960008DE78093390680933A0680933B064093F7 |
:10597000340630933506109236069093370682E34C |
:1059800080933C0620933D0680933E061092640669 |
:1059900020933F0680E5809340068CE38093410688 |
:1059A000E09344069BE4909346068FE580934B0674 |
:1059B00083EF80934D068AEA80934F0680935006CA |
:1059C00084E180934C0680934E068EEF80935106BF |
:1059D0004093520620935306209354062093550675 |
:1059E0009093560690935706909358061092590636 |
:1059F00050935A0660935B0620935C0670935D0695 |
:105A000040935E0640935F0682E080936006F093C9 |
:105A10002A061092620610926306A7E6B6E08CE0B2 |
:105A2000E7E7F1E0ED01019009928A95E1F760E77F |
:105A300070E0CD01845690400E94E22A8093730664 |
:105A4000DF91CF910895CF93DF9384E58093030690 |
:105A500080910201843150F08AE0809323061092F5 |
:105A600045068BE180931F068EE40AC083E0809395 |
:105A7000230680E2809345068EE180931F0685E52C |
:105A800080934206809343068AE68093100683E063 |
:105A9000809366066EE1609311068FEF8093130684 |
:105AA0009FE090931406609312061092160678E019 |
:105AB0007093170680E4809318061092190690934D |
:105AC000150670931A0690E190931B0656E05093CA |
:105AD0001C0670931D0686EE80931E0680E8809358 |
:105AE000200634E63093210688E78093220630931F |
:105AF0002406809325065093260681E2809327068C |
:105B00008DE2809328062AE52093290690932B06A0 |
:105B100010922C0610922D0610922E0610922F062F |
:105B200010924706109248061092490610924A06B3 |
:105B30003093300648E240933106E1E0E093650699 |
:105B40001092320697EF90933306509338068DE704 |
:105B50008093390680933A0680933B06309334064F |
:105B600040933506109236069093370682E3809371 |
:105B70003C0620933D0680933E06109264062093D7 |
:105B80003F0680E58093400696E49093410680E2CC |
:105B900080934406909346068FE580934B0683EFEF |
:105BA00080934D068AEA80934F0680935006609357 |
:105BB0004C0660934E068EEF80935106309352064A |
:105BC0002093530620935406209355068BE480932C |
:105BD00056068093570680935806109259065093A4 |
:105BE0005A0670935B0620935C0660935D063093C3 |
:105BF0005E0630935F0682E080936006E0932A069B |
:105C00001092620610926306A7E6B6E08CE0EFE71A |
:105C1000F1E0ED01019009928A95E1F760E770E00B |
:105C2000CD01845690400E94E22A80937306DF9152 |
:105C3000CF910895F999FECF92BD81BDF89A80B5B4 |
:105C400099270895F999FECF1FBA92BD81BD60BD15 |
:105C50000FB6F894FA9AF99A0FBE08956EEC7AE2AC |
:105C60000E94E777089546ED5AE20E942178089550 |
:105C7000EF92FF920F931F93CF93C82F81508530DF |
:105C800008F0C3E081E7C89F8001112483EFE82E6C |
:105C90008FEFF82EE00EF11E60E770E0C7010E9462 |
:105CA000F32A682F98012D593F4F8FB39927AC01E4 |
:105CB0004270507081FDF9CF32BD21BDF89A80B598 |
:105CC000861711F0CA0121C08FB399279C01227059 |
:105CD000307081FDF9CFF2BCE1BCF89A80B5843513 |
:105CE00011F0C90112C081E7C89FC00111240D97AE |
:105CF0002EEC3AE241E750E0BC0183E096E00E94DE |
:105D0000C2770E94116881E090E0CF911F910F91BE |
:105D1000FF90EF900895282F863010F025E003C003 |
:105D2000882309F421E0F999FECF1FBA82E090E0C0 |
:105D300092BD81BD20BD0FB6F894FA9AF99A0FBEB4 |
:105D40000895CF93C82F80910306843509F042C08F |
:105D5000C63010F0C5E003C0CC2309F43BC060E7B7 |
:105D600070E083E096E00E94E22A8093730681E768 |
:105D7000C89FC001112426ED3AE241E750E063E0FC |
:105D800076E00D970E94FF7726ED3AE24CE050E076 |
:105D900064E076E080E590E00E94FF776CE070E0E0 |
:105DA00084E096E00E94E22A282FF999FECF1FBADC |
:105DB0008CE590E092BD81BD20BD0FB6F894FA9AB3 |
:105DC000F99A0FBE8C2F0E948B2E0E94116881E0E1 |
:105DD00090E002C080E090E0CF9108956DE470E023 |
:105DE00088EE93E00E94F32A482F8FB399279C01F5 |
:105DF0002270307081FDF9CF85E394E092BD81BDC2 |
:105E0000F89A80B5841779F48FB399279C01227092 |
:105E1000307081FDF9CF88EE93E092BD81BDF89A94 |
:105E200080B5813011F0C90108952EEC3AE24EE4BC |
:105E300050E068EE73E084E796E00E94C27781E06C |
:105E400090E00895809174068130A9F46DE470E0CB |
:105E500084E796E00E94E22A8093C10626ED3AE2AA |
:105E60004EE450E064E776E088EE93E00E94FF772E |
:105E700081E090E0089580E090E00895CF93DF9373 |
:105E800081E080937406E4E7F6E08FE015861686DD |
:105E90001786108A8150349687FFF8CF80E480936C |
:105EA00081068093820610928306809384068093F5 |
:105EB000850690EC9093860610928706809388065C |
:105EC0008093890610928A0690938B0690938C0695 |
:105ED00080938D0610928E0680938F069093900685 |
:105EE000A5E7B6E087E0E9E8F1E0ED01019009926D |
:105EF0008A95E1F76DE470E0CD0101970E94E22AF6 |
:105F00008093C106DF91CF910895F999FECF82E089 |
:105F100090E092BD81BDF89A80B5282F863078F048 |
:105F200023E0322FF999FECF1FBA82E090E092BDB4 |
:105F300081BD30BD0FB6F894FA9AF99A0FBE822F40 |
:105F400099270895DF92EF92FF920F931F93CF93BB |
:105F5000FF24DF2CEF2C81E090E00E941A2E843584 |
:105F600039F031E0E32E64E581E090E00E94222EDA |
:105F70006CE070E080E590E00E94F32AC82FF99968 |
:105F8000FECF8CE590E092BD81BDF89A80B58C176C |
:105F900011F421E0D22EC1E001E010E0EE2029F45E |
:105FA0008C2F0E94382E8823C1F591E0F92E1F9383 |
:105FB0000F9385E799E09F938F9389E692E19F93F2 |
:105FC0008F93E0912704F091280409958DB79EB72F |
:105FD00006968DBF0230110549F0033011054CF4CF |
:105FE0000130110531F40E94302B05C00E942A2C8B |
:105FF00002C00E94232DDD2059F02EEC3AE24CE045 |
:1060000050E060E570E084E096E00E94C27702C054 |
:106010000E940B2B8C2F0E94A12ECF5F0F5F1F4F72 |
:10602000C63008F4BBCFFF2019F083E00E948B2E0E |
:106030000E94852FC82F0E94382E8C2F99279F935E |
:106040008F938BE999E09F938F9309E612E11F9359 |
:106050000F93E0912704F091280409958DB79EB71E |
:1060600006968DBFEE2021F40E94EE2E882399F42F |
:1060700084EB99E09F938F931F930F93E0912704F4 |
:10608000F091280409950E943E2F0E94222F0F9024 |
:106090000F900F900F901092020690E0E1E8F6E06A |
:1060A000CFE08081349618160CF49F5FC150C7FF73 |
:1060B000F8CF90930206892F99279F938F9385E7B6 |
:1060C00096E09F938F9385ED99E09F938F931F9315 |
:1060D0000F93E0912704F091280409958DB79EB79E |
:1060E00008968DBF86EF99E09F938F931F930F9330 |
:1060F000E0912704F091280409950F900F900F90DC |
:106100000F90CF911F910F91FF90EF90DF90089526 |
:106110009FB7F8943998389A88B1836088B980918C |
:10612000B9008C7F8093B9008AE28093B800109206 |
:10613000700210926E0210926D02EAECF6E08BE0B3 |
:1061400010821182128213821482158216821782A3 |
:106150008150389687FFF4CF9FBF08951092700248 |
:1061600084E98093BC0010926E0210926D0280E868 |
:106170008093BC001092BD001092BA001092BB0038 |
:106180001092B9001092B8000E9488301092BB00A3 |
:1061900085E88093BC0080916B02826080936B02E3 |
:1061A00008951F920F920FB60F9211242F933F93D1 |
:1061B0004F935F938F939F93EF93FF938091700220 |
:1061C000282F3327442755278F5F80937002F901CA |
:1061D0002731310508F0B3C2EE59FF4F0C941F7AF6 |
:1061E00080916E028C3090F480916E028F5F80936C |
:1061F0006E0280916E02E82FFF27EE0FFF1FEE0F59 |
:10620000FF1FEC58F94F8585181654F780916E02E0 |
:106210008C3070F010926A021092690210926E0235 |
:1062200085E08093700280916D02880F8D5A04C0C2 |
:1062300080916E02880F8E5A8093BB0085E874C2ED |
:1062400080916E02E82FFF2783E0EE0FFF1F8A95F3 |
:10625000E1F7E653F94F81818093BB0085E8809395 |
:10626000BC0080916E02E82FFF27EE0FFF1FEE0F9C |
:10627000FF1FEE0FFF1FE653F94F808180FF91C093 |
:1062800080916E02E82FFF27EE0FFF1FEE0FFF1F1A |
:10629000EE0FFF1FE653F94F8281882329F080918A |
:1062A0000206873008F45FC28091690290916A0209 |
:1062B000892B09F058C28091670290916802892B5E |
:1062C00009F051C26EC080916E0221E030E002C040 |
:1062D000220F331F8A95E2F780916702909168023E |
:1062E00028233923232B79F080916E02E82FFF2792 |
:1062F000EE0FFF1FEE0FFF1FEE0FFF1FE653F94FCC |
:1063000080E184830DC080916E02E82FFF27EE0F9D |
:10631000FF1FEE0FFF1FEE0FFF1FE653F94F148212 |
:1063200080916E02E82FFF2753E0EE0FFF1F5A9572 |
:10633000E1F7E653F94F8481282F332743E0220FFA |
:10634000331F4A95E1F780916E02E82FFF2793E013 |
:10635000EE0FFF1F9A95E1F7E653F94F82818770A0 |
:10636000822B8093BB0085E88093BC0020916E0255 |
:1063700081E090E002C0880F991F2A95E2F72091F2 |
:10638000690230916A0282239323892B51F082ECB7 |
:1063900096E0909374028093730288E08093750274 |
:1063A000E2C184E080C1E0917302F09174028191B6 |
:1063B0008093BB0085E88093BC00F0937402E09367 |
:1063C000730280917502815080937502882309F4CD |
:1063D000CAC183E068C18091B900803351F58091D2 |
:1063E0007102882329F480916E028F5F809371027D |
:1063F00080916E02E82FFF2783E0EE0FFF1F8A9542 |
:10640000E1F7E653F94F838199278F7790708F37A3 |
:1064100091057CF480916E02E82FFF27EE0FFF1F9D |
:10642000EE0FFF1FEE0FFF1FE653F94F83818F5FC3 |
:1064300083831092700284E98093BC008AE090E02C |
:10644000909392018093910180916E028F5F80936F |
:106450006E021092700262C18091B9008034A9F17D |
:1064600080916D02E82FFF27EE0FFF1FEE0FFF1F39 |
:10647000EE0FFF1FE653F94F83818F77838380915F |
:106480006D028F5F80936D0280916D028C30A0F061 |
:1064900010926D021092680210926702809172024F |
:1064A0008F5F809372028C3038F01092720280916C |
:1064B0006B028D7F80936B0280916B028160809371 |
:1064C0006B021092700284E971C080916D02E82F16 |
:1064D000FF27EE0FFF1FEE0FFF1FEE0FFF1FE6530C |
:1064E000F94F83818068838380916D02E82FFF27B5 |
:1064F000EE0FFF1FEE0FFF1FEE0FFF1FE653F94FCA |
:10650000808180FF2FC080916D02E82FFF2753E02C |
:10651000EE0FFF1F5A95E1F7E653F94F8481992753 |
:10652000009751F04097D9F582EC96E09093740271 |
:106530008093730288E031C080916D02992743E017 |
:10654000880F991F4A95E1F78153994F90937402F0 |
:106550008093730290916D02809172029817E1F41A |
:1065600083E01BC080916D02992733E0880F991F4B |
:106570003A95E1F78153994F909374028093730297 |
:1065800080916B0281FD06C090916D028091720234 |
:10659000981711F482E001C081E080937502809128 |
:1065A0007502813011F485E801C085EC8093BC0050 |
:1065B0008091710280936C0210927102D4C0E091BC |
:1065C0007302F09174028091BB008083809173020A |
:1065D000909174020196909374028093730280915B |
:1065E0007502815080937502823010F085EC58C09E |
:1065F000813011F485E854C080916B0281FF2DC079 |
:106600008091E70280FD1DC080916D02E82FFF2779 |
:1066100023E0EE0FFF1F2A95E1F7E653F94F86813D |
:106620008A3F79F480916D02E82FFF2793E0EE0F07 |
:10663000FF1F9A95E1F7E653F94F808181608083CF |
:106640000CC080916D02E82FFF2783E0EE0FFF1F43 |
:106650008A95E1F7E653F94F108280916D028F5FC2 |
:1066600080936D0280916D028C30A0F010926D02CB |
:106670001092680210926702809172028F5F80937D |
:1066800072028C3038F01092720280916B028D7F12 |
:1066900080936B021092700284E98093BC0049C021 |
:1066A0008093BC0086E0809370025DC088E9C4CD11 |
:1066B00080916F02880F805FBFCD80916F02992714 |
:1066C0008130910561F0823091051CF4892B21F015 |
:1066D0004AC0029739F047C080911201ADCD809138 |
:1066E0001101AACD80911001A7CD80E8A5CD10920F |
:1066F000700284E98093BC008AE090E0909392015C |
:106700008093910180916F02823088F480916F02B2 |
:106710008F5F80936F0282E18093700280916B02A1 |
:106720008E7F80936B0285EA8093BC001CC0109220 |
:106730006F0280916B02816080936B0214C0109293 |
:10674000700284E98093BC0080916B028160809329 |
:106750006B028AE090E090939201809391011092F5 |
:106760006E0210926D02FF91EF919F918F915F9158 |
:106770004F913F912F910F900FBE0F901F90189542 |
:106780001F93CF93DF93182F80911203882321F456 |
:1067900080910202882319F081E090E097C01D30BB |
:1067A00008F092C01123B1F0E12FFF2723E0EE0F94 |
:1067B000FF1F2A95E1F7E653F94F3597808135960B |
:1067C00088230CF081C03897808180FD03C083E06E |
:1067D00090E07CC08091C206823019F084E090E0A5 |
:1067E00075C067E070E082EC96E00E94E22A90912A |
:1067F000C906891719F085E090E068C080ED97E040 |
:106800000E948C16EC0180916B0280FD05C0CE01C8 |
:106810000E9495168823B9F3112319F48FEF90E0A5 |
:106820000BC0212F33272150304081E090E002C07F |
:10683000880F991F2A95E2F790936A028093690264 |
:10684000A1E0B0E0EAECF6E040E050E06BE0CD0122 |
:10685000042E02C0880F991F0A94E2F72091690262 |
:1068600030916A0282239323892B11F011821282C4 |
:1068700061504F5F5F4F389667FFE9CF10926E020D |
:106880001092700280916B028E7F80936B0285EA7A |
:106890008093BC0080916B0280FD05C0CE010E94F8 |
:1068A00095168823B9F38091690290916A02892B29 |
:1068B00029F0CE010E949516882311F38091690278 |
:1068C00090916A02009711F082E090E0DF91CF9101 |
:1068D0001F9108950F931F93CF93DF93982F80916B |
:1068E0001203882321F480910202882319F081E0A9 |
:1068F00090E092C09D30A0F4992319F486E090E0D6 |
:106900008BC0C92FDD27FE0133E0EE0FFF1F3A9544 |
:10691000E1F7E653F94F35978081359687FD03C03F |
:1069200082E090E079C03897808180FD03C083E0E9 |
:1069300090E072C080ED97E00E948C168C018091EF |
:106940006B0280FD05C0C8010E9495168823B9F32B |
:10695000219721E030E0C90102C0880F991FCA9534 |
:10696000E2F79093680280936702D901EAECF6E0BF |
:1069700040E050E06BE0CD01042E02C0880F991F6B |
:106980000A94E2F7209167023091680282239323F0 |
:10699000892B11F01182128261504F5F5F4F389640 |
:1069A00067FFE9CF10926D021092C2061092C906DD |
:1069B0001092700280916B028E7F80936B0285EA49 |
:1069C0008093BC0080916B0280FD05C0C8010E94CD |
:1069D00095168823B9F38091670290916802892BFC |
:1069E00029F0C8010E949516882311F38091C206F0 |
:1069F000823019F084E090E00FC067E070E082EC34 |
:106A000096E00E94E22A9091C906891719F085E064 |
:106A100090E002C080E090E0DF91CF911F910F9154 |
:106A2000089589E1AFE5B7E0EBE2F7E0118210826B |
:106A3000329611961C921E921296815087FFF6CFC5 |
:106A400010928103109280031092830310928203AC |
:106A5000109285031092840308951F920F920FB62F |
:106A60000F9211240F931F932F933F934F935F9394 |
:106A70006F937F938F939F93AF93BF93CF93DF9346 |
:106A8000EF93FF938091660682FDCFC04091860010 |
:106A9000509187008091770290917802481B590BA2 |
:106AA000809186009091870090937802809377027E |
:106AB000CA018D549440A0917902B0917A02835F0B |
:106AC0009A4178F48091790280932A07149714F000 |
:106AD0001092930181E090E090937A028093790282 |
:106AE00007C2AD30B1050CF003C2CA018B5F904004 |
:106AF000845B914008F074C0425D5140FD01EA0F93 |
:106B0000FB1FE55DF84F80819181FA01E81BF90BCD |
:106B1000CF01F7FF03C0909581959F4F06975CF4D6 |
:106B200080911B03883C20F480911B03865F01C089 |
:106B300088EC80931B03FD01EA0FFB1FE55DF84F16 |
:106B4000808191819C01220F331F280F391F240F50 |
:106B5000351F37FF02C02D5F3F4FE901D595C7951F |
:106B6000D595C795CA0101968C179D0714F42197F6 |
:106B700006C041505040C417D5070CF421968091AF |
:106B80001B03833CE0F08D010A0F1B1FF801E55D3C |
:106B9000F84F808191819E01281B390BC90163E068 |
:106BA00070E00E949879CB01880F991F860F971F7C |
:106BB000015A184FD80111969C938E9307C0AA0FC3 |
:106BC000BB1FA15AB84F11961C921E92E0917902F8 |
:106BD000F0917A02EE0FFF1FE55DF84FD183C0837D |
:106BE0002091790230917A022F5F3F4F30937A02E1 |
:106BF0002093790280910201843108F079C1253017 |
:106C0000310511F45D9A01C05D98809179029091EF |
:106C10007A028630910511F45C9A01C05C9807975E |
:106C200011F45B9A65C15B9863C1409186005091F5 |
:106C3000870080917B0290917C02481B590B8091C8 |
:106C400086009091870090937C0280937B02CA011A |
:106C50008D5494406091E502835F9A4108F07AC0B8 |
:106C60006093760280917602843008F453C090914C |
:106C70002A0780917602981709F04CC05091E602DD |
:106C80005B3008F43FC0109293011092E50240E09F |
:106C90005F31C0F0E42FFF27EE0FFF1F9F012F543D |
:106CA0003D4FDF01A55DB84F8D919C91D9018D932A |
:106CB0009C93DF01A15AB84F8D919C91E553FD4FF4 |
:106CC00091838083E42FFF27EE0FFF1F9F01255D37 |
:106CD000384FDF01A358BD4F8D919C91D90111967A |
:106CE0009C938E93DF01A956BD4F8D919C91E15AE3 |
:106CF000F84F91838083842F8F5F482F8D3040F22F |
:106D00008093E5028091E6028F3FB9F08F5F809318 |
:106D1000E60213C08091E602853620F08AE0809377 |
:106D2000E60202C01092E602809102018A3011F060 |
:106D3000843110F0289A01C0289881E08093E50200 |
:106D400080911203882309F0D3C08091760280934A |
:106D50002A07CEC06D3008F0A3C0CA018B5F9040F7 |
:106D6000845B914008F07EC0425D5140E62FFF27D2 |
:106D7000EE0FFF1FE358FD4F80819181FA01E81B60 |
:106D8000F90BCF0105960B97B0F48091E6028A319A |
:106D900020F080911B03865F05C08B3028F0809126 |
:106DA0001B038E5F80931B0380911B03893C18F0AB |
:106DB00088EC80931B03E62FFF27EE0FFF1FE3589D |
:106DC000FD4F808191819C01220F331F280F391FB5 |
:106DD000240F351F37FF02C02D5F3F4FE901D595C6 |
:106DE000C795D595C795CA0101968C179D0714F4D0 |
:106DF000219706C041505040C417D5070CF4219686 |
:106E000080911B038E3BD8F0E62FFF27EE0FFF1F6C |
:106E1000DF01A358BD4F8D919C919E01281B390B1A |
:106E2000C90163E070E00E949879CB01880F991F37 |
:106E3000860F971FE956FD4F9183808308C0E62F88 |
:106E4000FF27EE0FFF1FE956FD4F11821082809140 |
:106E5000E502E82FFF27EE0FFF1FE358FD4FD18318 |
:106E6000C08309C0809102018A3011F0843110F092 |
:106E7000289A01C0289880910201843188F4809179 |
:106E8000E502853011F45D9A05C05D98863011F4F5 |
:106E90005C9A05C05C98873011F45B9A01C05B98DE |
:106EA0008091E502843120F48F5F8093E50220C059 |
:106EB0008431F1F4809102018A3011F0843110F0B4 |
:106EC000289A01C028988EE18093E5022CE0CFE556 |
:106ED000D7E0A1EBB2E0EBE2F7E08D919D919183D9 |
:106EE00080833296198218822296215027FFF5CF8F |
:106EF000FF91EF91DF91CF91BF91AF919F918F91D2 |
:106F00007F916F915F914F913F912F911F910F91C1 |
:106F10000F900FBE0F901F901895EF92FF920F9356 |
:106F20001F9380911F069927880F991F880F991F1B |
:106F30007C010027F7FC0095102F80916F03909142 |
:106F40007003A0917103B0917203BC01CD01A8013F |
:106F500097010E94CD793093AF052093AE058091C3 |
:106F6000670390916803A0916903B0916A03BC0123 |
:106F7000CD01A80197010E94CD793093B1052093EE |
:106F8000B0058091E5079091E60797FD03969595EA |
:106F90008795959587959093B3058093B2058091D9 |
:106FA000F5079091F60797FD03969595879595952A |
:106FB00087959093B5058093B40580918003909157 |
:106FC00081032091420230914302821B930B9093E4 |
:106FD000B7058093B60580910D0390910E03A091A3 |
:106FE0000F03B0911003BC01CD0125E030E040E07B |
:106FF00050E00E94CD793093B9052093B805809177 |
:107000003C0290913D029093BB058093BA0580911C |
:107010002D0390912E039093BF058093BE05809120 |
:107020001D0190911E019093C1058093C005809130 |
:107030001B0399279093C3058093C2058091F107A4 |
:107040009091F207A091F307B091F4072091950178 |
:10705000309196014091970150919801BC01CD016A |
:107060000E94CD793093C5052093C4058091CB064D |
:1070700099279093C7058093C6058091D3069927D9 |
:107080009093C9058093C8058091DB06992790935A |
:10709000CB058093CA058091E30699279093CD058F |
:1070A0008093CC0580911D0290911E029093D7058C |
:1070B0008093D60580916808909169089093DB05CC |
:1070C0008093DA0580916C0890916D089093DD05AE |
:1070D0008093DC0580916E0899279093E905809351 |
:1070E000E8058091F8039091F9039093EB05809364 |
:1070F000EA058091F6039091F7039093ED05809354 |
:10710000EC0580914004882321F480914104882378 |
:1071100021F08091AD05816003C08091AD058E7F27 |
:107120008093AD051F910F91FF90EF9008951F93ED |
:10713000CF93DF93182FEB01809112038823A1F4E2 |
:1071400011501F3F89F0D0932202C09321028091F9 |
:10715000210290912202892BD1F7CE018C0F9D1F25 |
:107160000E94A116115078F7DF91CF911F910895D9 |
:10717000CF93DF93809102018D3011F40E943A1B6E |
:1071800010927A0080914602909147029093AC074A |
:107190008093AB07809144029091450290939D07A4 |
:1071A00080939C0780914202909143029093EB0759 |
:1071B0008093EA0720913E0230913F02C901880F77 |
:1071C000991F880F991F820F931F820F931F90930F |
:1071D000E6078093E5072091400230914102C90102 |
:1071E000880F991F880F991F820F931F820F931F7B |
:1071F0009093F6078093F5078FEC80937A00ACE1CB |
:10720000B3E0C8E0D6E097E08991E82FFF27EE0FC2 |
:10721000FF1FE55DF84F0190F081E02DE259FF4F2F |
:107220001E161F061CF0E0E0F0E005C0EF3FF10580 |
:1072300014F0EFEFF0E08C91282F3327E217F307DB |
:1072400014F4815004C02E173F0714F48F5F8C9301 |
:107250009150119697FFD8CF809142069927AA277F |
:10726000BB27BC01CD0124EC39E040E050E00E9496 |
:107270005979DC01CB018093B5019093B601A093BD |
:10728000B701B093B801809143069927AA27BB277D |
:10729000BC01CD010E945979DC01CB018093B10181 |
:1072A0009093B201A093B301B093B401DF91CF9159 |
:1072B0000895A0E0B0E0EFE5F9E30C94EE79882EB4 |
:1072C000C0E0D0E07E016E0110924004469AD09357 |
:1072D0007B03C0937A03D0937903C0937803D09350 |
:1072E0007503C0937403D0938503C0938403D09334 |
:1072F0008303C0938203D0938103C09380031092D1 |
:107300009E0110929D01109236020E94B83884E6C8 |
:1073100090E00E94AE160E94B8388091100680FF5F |
:1073200010C08091130190911401875B934038F451 |
:1073300080911301909114018E5E924010F40E948E |
:10734000E01A0FE18AE090E00E94AE1680914202BE |
:1073500090914302C80FD91F809146029091470235 |
:10736000E80EF91E8091440290914502C80ED91E84 |
:10737000015007FFE7CF9701205F3F4F36952795D4 |
:10738000369527953093850320938403C601409654 |
:10739000969587959695879590938303809382031E |
:1073A0006096F5E0D695C795FA95E1F7D0938103FD |
:1073B000C093800390937F0380937E0330937D037B |
:1073C00020937C03882009F441C08091E5079091C7 |
:1073D000E60797FF03C0909581959F4F6CE070E0A2 |
:1073E0000E9498799B0170937B0360937A0380914C |
:1073F000F5079091F60797FF03C0909581959F4FF1 |
:107400006CE070E00E949879709379036093780340 |
:107410008091F5059091F605909375038093740320 |
:10742000B90184E090E00E94332E6091780370915E |
:10743000790386E090E00E94332E6091740370918E |
:10744000750388E090E00E94332E65C084E090E0F0 |
:107450000E942E2E90937B0380937A0386E090E027 |
:107460000E942E2E909379038093780388E090E019 |
:107470000E942E2E9C01909375038093740380913B |
:107480007A0390917B038150984050F48091780367 |
:10749000909179038150984018F421503440D8F1EC |
:1074A00087E19AE09F938F9389E692E19F938F9370 |
:1074B000E0912704F091280409958091E5079091C7 |
:1074C000E60797FF03C0909581959F4F6CE070E0B1 |
:1074D0000E94987970937B0360937A038091F507FB |
:1074E0009091F60797FF03C0909581959F4F6CE0B0 |
:1074F00070E00E949879709379036093780380918B |
:10750000F5059091F60590937503809374030F90A1 |
:107510000F900F900F901092AC071092AB07109243 |
:107520009D0710929C071092EB071092EA0784E6E1 |
:1075300090E00E94AE1680913E0290913F029C0125 |
:10754000220F331F220F331F280F391F280F391F17 |
:107550003093E6072093E507809140029091410225 |
:107560008C01000F111F000F111F080F191F080FAA |
:10757000191F1093F6070093F50780911F06C82E78 |
:10758000DD24EE24FF24442737FD4095542FC70106 |
:10759000B6010E9459794B015C0160936F037093AF |
:1075A000700380937103909372039801442737FD11 |
:1075B0004095542FC701B6010E945979DC01CB01D7 |
:1075C0008093670390936803A0936903B0936A0361 |
:1075D00080924B0390924C03A0924D03B0924E03C5 |
:1075E0008093430390934403A0934503B0934603D1 |
:1075F00010923F03109240031092410310924203F5 |
:107600008091150190911601A0911701B091180178 |
:107610009093F8058093F70510923502109234028A |
:1076200010922F0310923003109231031092320304 |
:1076300080912D0390912E0390932C0380932B0324 |
:107640000E94A86382E390E090932202809321023B |
:10765000809142069927AA27BB27BC01CD0124ECC3 |
:1076600039E040E050E00E945979DC01CB018856B6 |
:10767000954CAF4FBF4F8093B5019093B601A09347 |
:10768000B701B093B801809143069927AA27BB2779 |
:10769000BC01CD010E945979DC01CB018856954C83 |
:1076A000AF4FBF4F8093B1019093B201A093B3014C |
:1076B000B093B40110929A011092990180912D0318 |
:1076C00090912E03AA2797FDA095BA2F209195019E |
:1076D000309196014091970150919801BC01CD01E4 |
:1076E0000E945979DC01CB018093F1079093F20756 |
:1076F000A093F307B093F40710922603109225038A |
:1077000081E0809301010E9411688091E70284600A |
:107710008093E7028FEF809363081092640880E201 |
:1077200080936508CCE1D3E0A8E0B6E007E08D9156 |
:10773000E82FFF27EE0FFF1FE55DF84F8081918155 |
:1077400082598993015007FFF2CF84E680931B038F |
:1077500080911F02882311F0469A579A80918403E2 |
:107760009091850380569940815C9B4228F08091DE |
:107770004004816080934004809182039091830350 |
:1077800080569940815C9B4228F080914004826041 |
:107790008093400480918003909181038C529140AA |
:1077A0008957954028F0809140048460809340047C |
:1077B00080917A0390917B038C529140835C91403D |
:1077C00028F0809140048860809340048091780381 |
:1077D000909179038C529140835C914028F0809184 |
:1077E00040048061809340048091740390917503FC |
:1077F000805092408355914028F0809140048062EF |
:1078000080934004ECE0CDB7DEB70C940A7AA3E194 |
:10781000B0E0EDE0FCE30C94E87980918003909176 |
:1078200081032091420230914302821B930B90937B |
:10783000EB078093EA0780914C0290914D0297FDEF |
:1078400007969C0153E0359527955A95E1F73093BB |
:10785000AC072093AB0780914A0290914B0297FDB1 |
:10786000079643E0959587954A95E1F790939D0794 |
:1078700080939C073093B7072093B6079093AF0788 |
:107880008093AE078091E5079091E607AC01440F25 |
:10789000551F480F591F20913E0230913F02C901E8 |
:1078A000880F991F880F991F820F931F820F931FB4 |
:1078B000480F591F57FF02C04D5F5F4F55954795C1 |
:1078C000559547955093E6074093E5078091F50756 |
:1078D0009091F607AC01440F551F480F591F209196 |
:1078E000400230914102C901880F991F880F991FEA |
:1078F000820F931F820F931F480F591F57FF02C01B |
:107900004D5F5F4F55954795559547955093F607B1 |
:107910004093F50720913E0230913F02C901880F44 |
:10792000991F880F991F820F931F820F931F9C012D |
:10793000442737FD4095542F80915F039091600359 |
:10794000A0916103B0916203820F931FA41FB51F22 |
:1079500080935F0390936003A0936103B0936203ED |
:107960002091400230914102C901880F991F880F70 |
:10797000991F820F931F820F931F9C01442737FD8D |
:107980004095542F80915B0390915C03A0915D031F |
:10799000B0915E03820F931FA41FB51F80935B03FA |
:1079A00090935C03A0935D03B0935E038091C00746 |
:1079B0009091C10720913E0230913F02820F931FA8 |
:1079C0009093C1078093C0078091ED079091EE07D7 |
:1079D0002091400230914102820F931F9093EE0755 |
:1079E0008093ED07809176039091770301969093B1 |
:1079F0007703809376038091F5059091F6052091A9 |
:107A0000740330917503821B930B9C01442737FD4F |
:107A10004095542F8091570390915803A09159039A |
:107A2000B0915A03820F931FA41FB51F8093570371 |
:107A300090935803A0935903B0935A038FEC80930B |
:107A40007A0010920F012091470330914803409132 |
:107A5000490350914A0329873A874B875C87295409 |
:107A60003B46414050402CF028E43BE641E050E0EA |
:107A70000DC089859A85AB85BC85885B9449AE4FDE |
:107A8000BF4F4CF428EB34E94EEF5FEF2D833E837C |
:107A90004F83588708C089859A85AB85BC858D83BF |
:107AA0009E83AF83B88720914F033091500340915C |
:107AB0005103509152032D873E874F87588B29548D |
:107AC0003B46414050402CF028E43BE641E050E08A |
:107AD0000DC08D859E85AF85B889885B9449AE4F72 |
:107AE000BF4F4CF428EB34E94EEF5FEF29833A8324 |
:107AF0004B835C8308C08D859E85AF85B88989835B |
:107B00009A83AB83BC83A091EA07B091EB07BB8B50 |
:107B1000AA8BFD01CF01AA2797FDA095BA2FA090AF |
:107B20003F03B0904003C0904103D0904203A80EA1 |
:107B3000B91ECA1EDB1EA0923F03B0924003C09242 |
:107B40004103D0924203E090F107F090F2070091D8 |
:107B5000F3071091F407E80EF91E0A1F1B1FE092AD |
:107B6000F107F092F2070093F3071093F407F091F6 |
:107B70000203F98BFF2309F098C180910103882348 |
:107B800009F093C18091100686FF8FC180919C07F8 |
:107B900090919D07AA2797FDA095BA2FBC01CD0112 |
:107BA00029813A814B815C810E9459799B01AC010A |
:107BB00097FF04C02150384F4F4F5F4F6BE05595F2 |
:107BC0004795379527956A95D1F780919D01682E45 |
:107BD000772488249924CA01B901A40193010E9441 |
:107BE0005979DC01CB018093900390939103A0938A |
:107BF0009203B0939303B7FF04C08150904FAF4FEF |
:107C0000BF4F1C012D013CE05594479437942794B5 |
:107C10003A95D1F7209290033092910340929203CB |
:107C2000509293038091AB079091AC07AA2797FDE0 |
:107C3000A095BA2FBC01CD012D813E814F81588581 |
:107C40000E94597997FF04C06150784F8F4F9F4F22 |
:107C50002BE095958795779567952A95D1F7A4019F |
:107C600093010E945979DC01CB0180939403909396 |
:107C70009503A0939603B0939703B7FF04C0815078 |
:107C8000904FAF4FBF4F9C01AD018CE0559547958C |
:107C9000379527958A95D1F72093940330939503D0 |
:107CA0004093960350939703809190039091910392 |
:107CB00090939407809393078091940390919503F8 |
:107CC000909398078093970722193309440955091F |
:107CD0002093940330939503409396035093970316 |
:107CE000E20EF31E041F151FE092F107F092F20757 |
:107CF0000093F3071093F40780919C018823B1F45B |
:107D000057FF04C02F5F3F4F4F4F5F4F559547952B |
:107D100037952795A21AB30AC40AD50AA0923F0341 |
:107D2000B0924003C0924103D09242032A893B891A |
:107D300079010027F7FC0095102F80919403909112 |
:107D40009503A0919603B0919703E80EF91E0A1FC0 |
:107D50001B1FC801B70129813A814B815C810E94B8 |
:107D600059799B01AC0197FF04C02150384F4F4F08 |
:107D70005F4FBBE05595479537952795BA95D1F755 |
:107D800080919E01A82EBB24CC24DD24CA01B90118 |
:107D9000A60195010E945979DC01CB0180938803EB |
:107DA00090938903A0938A03B0938B03B7FF04C019 |
:107DB0008150904FAF4FBF4F3C014D01ACE09594C7 |
:107DC000879477946794AA95D1F76092880370920C |
:107DD000890380928A0390928B03C801B7012D8199 |
:107DE0003E814F8158850E94597997FF04C06150A8 |
:107DF000784F8F4F9F4FFBE09595879577956795C7 |
:107E0000FA95D1F7A60195010E945979DC01CB01C1 |
:107E100080938C0390938D03A0938E03B0938F0374 |
:107E2000B7FF04C08150904FAF4FBF4FAC01BD01B1 |
:107E3000ECE07595679557954795EA95D1F740938E |
:107E40008C0350938D0360938E0370938F032A8964 |
:107E50003B8937FF03C0309521953F4F21343105D1 |
:107E6000E4F1D401C30197FE07C0B095A0959095A9 |
:107E700081959F4FAF4FBF4F81389105A105B10547 |
:107E800084F4DB01CA0177FF07C0B095A0959095F7 |
:107E900081959F4FAF4FBF4F81389105A105B10527 |
:107EA000E4F081E08093270318C0109298071092A5 |
:107EB0009707109294071092930710928C031092D8 |
:107EC0008D0310928E0310928F03109288031092EC |
:107ED000890310928A0310928B0380918C039091F6 |
:107EE0008D03A0918E03B0918F03BC01CD0124E6D8 |
:107EF00030E040E050E00E94CD79E0908803F090BF |
:107F00008903E21AF30AF092AA07E092A907809186 |
:107F1000880390918903A0918A03B0918B03BC01DF |
:107F2000CD0124E630E040E050E00E94CD79DA0156 |
:107F3000C90120918C0330918D038C01021B130B1E |
:107F400010939F0700939E07809195019091960151 |
:107F5000A0919701B0919801BC01CD0128E631E0D4 |
:107F600040E050E00E9459792091F1073091F207EA |
:107F70004091F3075091F407261737074807590730 |
:107F800064F0261B370B480B590B2093F1073093F5 |
:107F9000F2074093F3075093F4072091F1073091D3 |
:107FA000F2074091F3075091F40757FF0CC0260FDA |
:107FB000371F481F591F2093F1073093F207409352 |
:107FC000F3075093F40760919C0770919D076E0D25 |
:107FD0007F1D9B01442737FD4095542F809143031B |
:107FE00090914403A0914503B0914603820F931FE3 |
:107FF000A41FB51F8093430390934403A0934503AC |
:10800000B09346038091070390910803681B790B96 |
:10801000CB01AA2797FDA095BA2F29853A854B85D4 |
:108020005C85820F931FA41FB51F80934703909315 |
:108030004803A0934903B0934A03C090B101D09084 |
:10804000B201E090B301F090B401C816D906EA0677 |
:10805000FB06C4F488EA91E6A0E0B0E08C199D0923 |
:10806000AE09BF098093470390934803A093490347 |
:10807000B0934A038093430390934403A093450332 |
:10808000B093460322273327A9012C193D094E0935 |
:108090005F098091470390914803A0914903B091F3 |
:1080A0004A0382179307A407B507B4F4D701C601A2 |
:1080B000885A9146A040B04080934703909348036C |
:1080C000A0934903B0934A038093430390934403DE |
:1080D000A0934503B09346036091AB077091AC0742 |
:1080E000600F711F9B01442737FD4095542F8091ED |
:1080F0004B0390914C03A0914D03B0914E03820F1E |
:10810000931FA41FB51F80934B0390934C03A09320 |
:108110004D03B0934E038091050390910603681BB5 |
:10812000790BCB01AA2797FDA095BA2F2D853E8507 |
:108130004F855889820F931FA41FB51F80934F034B |
:1081400090935003A0935103B0935203E090B50174 |
:10815000F090B6010091B7011091B801E816F90648 |
:108160000A071B07C4F488EA91E6A0E0B0E08E1984 |
:108170009F09A00BB10B80934F0390935003A093E2 |
:108180005103B093520380934B0390934C03A093FD |
:108190004D03B0934E0322273327A9012E193F091F |
:1081A000400B510B80914F0390915003A0915103CC |
:1081B000B091520382179307A407B507B4F4D8010E |
:1081C000C701885A9146A040B04080934F039093D6 |
:1081D0005003A0935103B093520380934B039093A9 |
:1081E0004C03A0934D03B0934E0380913F039091B5 |
:1081F0004003A0914103B0914203809353039093B5 |
:108200005403A0935503B093560380914F0390916C |
:108210005003A0915103B091520380936F03909348 |
:108220007003A0937103B093720380914703909100 |
:108230004803A0914903B0914A0380936703909348 |
:108240006803A0936903B0936A0380914B039091F4 |
:108250004C03A0914D03B0914E0380936B03909318 |
:108260006C03A0936D03B0936E03809143039091D0 |
:108270004403A0914503B091460380936303909318 |
:108280006403A0936503B093660380911B019091F2 |
:108290001C0197FD079633E0959587953A95E1F790 |
:1082A0009093AC078093AB078091190190911A01CC |
:1082B00097FD079623E0959587952A95E1F790938A |
:1082C0009D0780939C0780914602909147020F97EB |
:1082D00034F488E19CEF9093AC078093AB078091D6 |
:1082E000460290914702079734F480E398EF909309 |
:1082F000AC078093AB07209102012A30A9F480914A |
:10830000460290914702835F934034F088EE93E0F9 |
:108310009093AC078093AB078091460290914702FF |
:108320008A5F9340DCF014C080914602909147022E |
:10833000815D974034F088EE93E09093AC07809392 |
:10834000AB078091460290914702805E974034F0DF |
:1083500080ED97E09093AC078093AB078091440247 |
:10836000909145020F9734F488E19CEF90939D071C |
:1083700080939C078091440290914502079734F4C2 |
:1083800080E398EF90939D0780939C072A30A9F48F |
:108390008091440290914502835F934034F088EECF |
:1083A00093E090939D0780939C0780914402909165 |
:1083B00045028A5F9340DCF014C0809144029091A2 |
:1083C0004502815D974034F088EE93E090939D07DD |
:1083D00080939C078091440290914502805E974073 |
:1083E00034F080ED97E090939D0780939C07E09197 |
:1083F000A801EE2309F4B7C040911B0150911C0164 |
:108400008091980390919903481B590B50939F03B7 |
:1084100040939E0320911B0130911C01280F391FAE |
:1084200037FF02C02F5F3F4F359527953093990353 |
:1084300020939803413851051CF080E890E005C076 |
:1084400040585F4F34F480E89FEF90939F038093F0 |
:108450009E038E2F9927A0919E03B0919F03A89F02 |
:10846000A001A99F500DB89F500D112457FF02C0C5 |
:10847000415F5F4F14E0559547951A95E1F780915C |
:10848000AB079091AC07840F951F9093AC07809336 |
:10849000AB076091190170911A0180919A03909134 |
:1084A0009B03681B790B70939D0360939C03409121 |
:1084B000190150911A01480F591F57FF02C04F5F11 |
:1084C0005F4F5595479550939B0340939A036138AE |
:1084D00071051CF080E890E005C060587F4F34F4CF |
:1084E00080E89FEF90939D0380939C032E2F33276A |
:1084F00080919C0390919D03829FB001839F700D9A |
:10850000929F700D1124AB0177FF02C0415F5F4F56 |
:10851000E4E055954795EA95E1F780919C079091A5 |
:108520009D07840F951F90939D0780939C07A29FA2 |
:10853000C001A39F900DB29F900D11249C018091CA |
:108540001B0190911C01820F931F90931C0180933B |
:108550001B018091190190911A01860F971F90932A |
:108560001A01809319010091AE071091AF07809115 |
:10857000930790919407101611065CF59C0197FFE4 |
:1085800004C022273327281B390BC901AA2797FDCE |
:10859000A095BA2F20919C01332744275527BC0171 |
:1085A000CD010E9459799B01AC0197FF04C0215C69 |
:1085B0003F4F4F4F5F4F76E055954795379527953D |
:1085C0007A95D1F78091A9079091AA07820F931FFE |
:1085D00027C097FF03C0909581959F4FAA2797FDCD |
:1085E000A095BA2F20919C01332744275527BC0121 |
:1085F000CD010E9459799B01AC0197FF04C0215C19 |
:108600003F4F4F4F5F4F66E05595479537952795FC |
:108610006A95D1F78091A9079091AA07821B930BC5 |
:108620009093AA078093A907E090B607F090B70748 |
:1086300080919707909198071E141F045CF59C0188 |
:1086400097FF04C022273327281B390BC901AA270B |
:1086500097FDA095BA2F20919C01332744275527D9 |
:10866000BC01CD010E9459799B01AC0197FF04C068 |
:10867000215C3F4F4F4F5F4F96E05595479537959B |
:1086800027959A95D1F780919E0790919F07820F29 |
:10869000931F27C097FF03C0909581959F4FAA27EE |
:1086A00097FDA095BA2F20919C0133274427552789 |
:1086B000BC01CD010E9459799B01AC0197FF04C018 |
:1086C000215C3F4F4F4F5F4F86E05595479537955B |
:1086D00027958A95D1F780919E0790919F07821BDD |
:1086E000930B90939F0780939E078091100687FFBE |
:1086F00044C09989992309F040C0809101038823DF |
:10870000E1F5A1E0EA16A1E0FA064CF08091AB0792 |
:108710009091AC078E0D9F1D805091400DC0B0E030 |
:10872000EB16BFEFFB0664F48091AB079091AC07AA |
:108730008E0D9F1D80509F4F9093AC078093AB0789 |
:10874000E1E001301E074CF080919C0790919D075D |
:10875000800F911F805091400CC0FFEF00301F0729 |
:1087600064F480919C0790919D07800F911F805029 |
:108770009F4F90939D0780939C07ACE1B3E068E026 |
:1087800076E057E0FB018191BF01E82FFF27EE0F54 |
:10879000FF1FE55DF84F0190F081E02DE259FF4F9A |
:1087A000EF3FF10521F01CF0EFEFF0E004C0F7FF20 |
:1087B00002C0E0E0F0E04C91242F3327E217F307EA |
:1087C000B1F0CF01821B930B97FD079613E09595AF |
:1087D00087951A95E1F7242F280F2C93822F99273C |
:1087E000E817F90714F4215001C02F5F2C93515062 |
:1087F000119657FFC7CFE2E1CD5E0C94047A8091C9 |
:108800001203882301F58091E7028C7F8093E702B1 |
:10881000A5E4B4E0EAECF6E09BE080910202882354 |
:1088200009F48C938D91818312829150389697FF31 |
:10883000F4CF80910202882359F080910202815086 |
:108840008093020205C08091E70281608093E70275 |
:1088500010926E021092700280916B028E7F809354 |
:108860006B0285EA8093BC00089580911206883FD0 |
:1088700038F0EFEFF0E0E81BF109E45EFC4F808197 |
:108880008093AE018091AE01882329F0843618F0E0 |
:1088900084E68093AE0180911406883F38F0EFEFB4 |
:1088A000F0E0E81BF109E45EFC4F80818093AC01AD |
:1088B0008091AC01882329F0843618F084E68093F7 |
:1088C000AC0180912106883F38F0EFEFF0E0E81B23 |
:1088D000F109E45EFC4F80818093A7018091A7019C |
:1088E0008B3010F48AE002C08F3F11F48093A7010F |
:1088F00080914C06883F38F0EFEFF0E0E81BF1097B |
:10890000E45EFC4F80818093C2078091C207823071 |
:1089100010F481E002C08F3F11F48093C207809170 |
:108920004E06883F38F0EFEFF0E0E81BF109E45E17 |
:10893000FC4F80818093E8078091E807823010F433 |
:1089400081E002C08F3F11F48093E80780913906DF |
:10895000883F38F0EFEFF0E0E81BF109E45EFC4FF0 |
:1089600080818093BF0780913A06883F38F0EFEF0F |
:10897000F0E0E81BF109E45EFC4F808180939907E9 |
:1089800080913B06883F38F0EFEFF0E0E81BF109FB |
:10899000E45EFC4F80818093C70790911306983F57 |
:1089A00018F49093AD0109C0EFEFF0E0E91BF10975 |
:1089B000E45EFC4F80818093AD01983F18F4909362 |
:1089C000AD0109C0EFEFF0E0E91BF109E45EFC4FF7 |
:1089D00080818093AD0180911606883F38F0EFEFDB |
:1089E000F0E0E81BF109E45EFC4F80818093AB016D |
:1089F00080911806883F38F0EFEFF0E0E81BF109AE |
:108A0000E45EFC4F80818093A90180912006883F1D |
:108A100038F0EFEFF0E0E81BF109E45EFC4F8081F5 |
:108A20008093AA0180912206883F38F0EFEFF0E0B2 |
:108A3000E81BF109E45EFC4F80818093A6018091E0 |
:108A40002306883F38F0EFEFF0E0E81BF109E45E21 |
:108A5000FC4F80818093A80180912406883F38F0E4 |
:108A6000EFEFF0E0E81BF109E45EFC4F80818093BA |
:108A7000A50180912506883F38F0EFEFF0E0E81B74 |
:108A8000F109E45EFC4F80818093A40180912B0664 |
:108A9000883F38F0EFEFF0E0E81BF109E45EFC4FAF |
:108AA00080818093A20180912C06883F38F0EFEFFF |
:108AB000F0E0E81BF109E45EFC4F80818093FC024A |
:108AC00080912D06883F38F0EFEFF0E0E81BF109C8 |
:108AD000E45EFC4F80818093FB0280912E06883FEC |
:108AE00038F0EFEFF0E0E81BF109E45EFC4F808125 |
:108AF0008093FA0280912F06883F38F0EFEFF0E084 |
:108B0000E81BF109E45EFC4F80818093F9028091BB |
:108B10004706883F38F0EFEFF0E0E81BF109E45E2C |
:108B2000FC4F80818093F80280914806883F38F09E |
:108B3000EFEFF0E0E81BF109E45EFC4F80818093E9 |
:108B4000F70280914906883F38F0EFEFF0E0E81B2C |
:108B5000F109E45EFC4F80818093F60280914A0621 |
:108B6000883F38F0EFEFF0E0E81BF109E45EFC4FDE |
:108B700080818093F50280913006883F38F0EFEFD6 |
:108B8000F0E0E81BF109E45EFC4F80818093A101D5 |
:108B900080913406883F38F0EFEFF0E0E81BF109F0 |
:108BA000E45EFC4F80818093A00180913C06883F69 |
:108BB00038F0EFEFF0E0E81BF109E45EFC4F808154 |
:108BC00080939F0180913F06883F38F0EFEFF0E0FF |
:108BD000E81BF109E45EFC4F808180939E01809147 |
:108BE0004006883F38F0EFEFF0E0E81BF109E45E63 |
:108BF000FC4F808180939D0180914106883F38F031 |
:108C0000EFEFF0E0E81BF109E45EFC4F8081809318 |
:108C10009C0180914606883F38F0EFEFF0E0E81BBA |
:108C2000F109E45EFC4F808180939B018091610695 |
:108C3000883F38F0EFEFF0E0E81BF109E45EFC4F0D |
:108C400080818093F8078091A201282F33272F5F1E |
:108C50003F4F8CE398E2B9010E9498797093B0017C |
:108C60006093AF0180911E068093E90780911D06F5 |
:108C70008093B00790916306933320F181E0809355 |
:108C8000F402983F58F0EFEFF0E0E91BF109E45EE1 |
:108C9000FC4F8081823310F41092F40280913608E8 |
:108CA0009091370897FF08C08091F402882321F043 |
:108CB00080914004806803C0809140048F77809346 |
:108CC000400402C01092F402809136089091370857 |
:108CD00097FF1DC0809112038823C9F08091F40290 |
:108CE0008823A9F080910801909109018F5F9F4F1F |
:108CF00071F488E99AE3909322028093210280E044 |
:108D000094EA90930901809308011092F4028091F3 |
:108D1000F402882339F080919E01823D18F4825E2E |
:108D200080939E010895A5E3B0E0E9E9F6E40C9490 |
:108D3000E8790E94073C309102013C3010F4299AF6 |
:108D400001C02998E0901303F0901403F9A2E8A25F |
:108D50008091B00799270A96E816F90614F499A3AA |
:108D600088A380911B03843608F05CC08091B40313 |
:108D70009091B503009731F001979093B5038093DC |
:108D8000B40307C0109212038091E7028F7E809394 |
:108D9000E7023A3011F0343110F0289A01C02898D7 |
:108DA0008091E8029091E902895E9340C0F1809140 |
:108DB0002806282F332739A328A38091E702806152 |
:108DC0008093E70280910406A82FBB27AA0FBB1F40 |
:108DD000FD01E15AF84F1182108280910506282F7B |
:108DE0003327220F331FC901815A984FFC0111828A |
:108DF0001082A55DB84F11961C921E92255D384FCA |
:108E0000D90111961C921E9280910706E82FFF2728 |
:108E1000EE0FFF1FE55DF84F11821082AAC210927B |
:108E20001203A7C280911B038D3808F4A2C280915F |
:108E3000E7028F7E8093E7029091290682E3989F54 |
:108E4000C00111249093B5038093B403E8A1F9A164 |
:108E5000B9978CF080911203882369F08091E80221 |
:108E60009091E902FFEF8F3F9F0729F001969093C1 |
:108E7000E9028093E8028091E8029091E9028F3F35 |
:108E8000910509F038F510923703109238031092CB |
:108E9000390310923A031092330310923403109264 |
:108EA0003503109236031092A0031092A103109282 |
:108EB000A2031092A30310923F031092400310925A |
:108EC0004103109242038A3F910549F481E0809367 |
:108ED000BA0305C08091E70282608093E702809127 |
:108EE0000606E82FFF27EE0FFF1FE55DF84F808194 |
:108EF0009181813591050CF441C120911203222307 |
:108F000009F03CC180910706E82FFF27EE0FFF1FF5 |
:108F1000E55DF84F808191818C3491050CF406C198 |
:108F20008091B6038F5F8093B603893C08F426C115 |
:108F30003C3010F4299801C0299A10921203109223 |
:108F4000B6031092E9021092E80230910406E32F72 |
:108F5000FF27EE0FFF1FE55DF84F80819181873479 |
:108F60009105B4F480910506E82FFF27EE0FFF1F4F |
:108F7000E55DF84F808191810190F081E02DF7FF50 |
:108F800003C0F095E195FF4FE734F1050CF478C08C |
:108F900041E020910506A22FBB27AA0FBB1FA55DAC |
:108FA000B84F8D919C9111978734910544F0E32F30 |
:108FB000FF27EE0FFF1FE55DF84F808191818D91B6 |
:108FC0009C918734910574F080910406E82FFF2767 |
:108FD000EE0FFF1FE55DF84F808191818734910589 |
:108FE0000CF042E0E22FFF27EE0FFF1FE55DF84F88 |
:108FF000808191818634910574F480910406E82F74 |
:10900000FF27EE0FFF1FE55DF84F808191818734C8 |
:1090100091050CF043E0E22FFF27EE0FFF1FE55D07 |
:10902000F84F808191818A5B9F4F74F48091040690 |
:10903000E82FFF27EE0FFF1FE55DF84F808191813C |
:10904000873491050CF044E0E22FFF27EE0FFF1F5D |
:10905000E55DF84F808191818A5B9F4F74F4809128 |
:109060000406E82FFF27EE0FFF1FE55DF84F808114 |
:109070009181863491050CF445E0842F0E948B2E5B |
:1090800080910506E82FFF27EE0FFF1FE55DF84FE3 |
:10909000808191810190F081E02DF7FF03C0F09570 |
:1090A000E195FF4F7E97BCF480910406E82FFF27DF |
:1090B000EE0FFF1FE55DF84F808191818A5B9F4F26 |
:1090C00054F481E080935B0488EE93E09093220255 |
:1090D0008093210253C00E94852F0E94382E80E089 |
:1090E0000E945C0780912A060E948C758091100670 |
:1090F00080FF10C08091130190911401875B934011 |
:1091000038F480911301909114018E5E924010F416 |
:109110000E94E01A10921F0280E00E94593981E0FB |
:109120008093B90380931F02579A1FC08081918159 |
:10913000855B9F4F0CF58091B6038F5F8093B603DC |
:10914000893CE0F03C3010F4299801C0299A109233 |
:1091500012031092B6031092E9021092E80281E025 |
:109160000E94593981E08093B9030E94852F68E7F6 |
:1091700070E00E94973802C02093B60380910606E3 |
:10918000E82FFF27EE0FFF1FE55DF84F80819181EB |
:109190008B5A9F4F0CF0EDC020911203E09107060F |
:1091A000222309F0CAC0FF27EE0FFF1FE55DF84F2D |
:1091B00080819181855B9F4F0CF0BCC08091B7038B |
:1091C0008F5F8093B703893C08F4D3C02093B70323 |
:1091D00080914004882309F0A6C08091B9038823B8 |
:1091E00009F4A1C081E090E09093E9028093E80245 |
:1091F00081E0809312031092A0031092A1031092B9 |
:10920000A2031092A30310923F0310924003109206 |
:1092100041031092420310923B0310923C031092C0 |
:109220003D0310923E0380911F06E82EFF24002785 |
:1092300011278091E5079091E6079C01442737FDAF |
:109240004095542FC801B7010E945979DC01CB0128 |
:1092500080934F0390935003A0935103B093520314 |
:109260008091F5079091F6079C01442737FD4095C2 |
:10927000542FC801B7010E945979DC01CB018093BA |
:10928000470390934803A0934903B0934A03809106 |
:109290006F0390917003A0917103B091720380935A |
:1092A0004B0390934C03A0934D03B0934E038091D6 |
:1092B000670390916803A0916903B0916A0380935A |
:1092C000430390934403A0934503B0934603109245 |
:1092D0003703109238031092390310923A03109218 |
:1092E00033031092340310923503109236038091A9 |
:1092F000E70288608093E702909162068FE0989F72 |
:109300009001112480912D0390912E03820F931FC1 |
:1093100068E671E00E94987997FD0196959587958A |
:109320008093730326C08CED95E090932202809386 |
:1093300021021FC02093B7031CC0FF27EE0FFF1FA1 |
:10934000E55DF84F808191818C34910584F08091A6 |
:10935000B8038F5F8093B803893C58F010921203D2 |
:109360001092B8031092E9021092E80202C0109223 |
:10937000B803809193018150809393018091930170 |
:109380008F3F21F08091E70284FF82C30E94354421 |
:109390008091C3039091C4039C01220F331F280FB7 |
:1093A000391FA0900406AA2DBB27AA0FBB1FFD01E1 |
:1093B000E55DF84F90901A06492D552780819181DF |
:1093C000849FF001859FF00D949FF00D11242E0FC6 |
:1093D0003F1F37FF02C02D5F3F4FB901759567955D |
:1093E00075956795A15AB84F80911B06082F1127D4 |
:1093F0008D919C91809F7001819FF00C909FF00C4B |
:1094000011246E0D7F1D7093C4036093C30380917C |
:10941000C5039091C6039C01220F331F280F391FEB |
:10942000B0900506AB2DBB27AA0FBB1FFD01E55D64 |
:10943000F84F80819181849FF001859FF00D949F6A |
:10944000F00D11242E0F3F1F37FF02C02D5F3F4F3D |
:10945000A9015595479555954795A15AB84F8D91B6 |
:109460009C91809F7001819FF00C909FF00C1124C3 |
:109470004E0D5F1D5093C6034093C5039E012F5FA1 |
:109480003F4F8FE1E0ECF1E0D90101900D928A9518 |
:10949000E1F78091F402882309F448C0CB0177FDFD |
:1094A0000396DC01B595A795B595A795CA0157FD1B |
:1094B0000396FC01F595E795F595E7958091E9010F |
:1094C000682F772767FD70956A9F90016B9F300D1D |
:1094D0007A9F300D11248091FC03482F552747FDBA |
:1094E00050954E9FC0014F9F900D5E9F900D11248F |
:1094F000280F391F37FF02C0295F3F4F03E0359522 |
:1095000027950A95E1F730931A03209319036E9F6C |
:1095100090016F9F300D7E9F300D11244A9FC00136 |
:109520004B9F900D5A9F900D112444C0809162066C |
:10953000082F1127DE01A00FB11FFD019781909325 |
:10954000E901020F131FD8018C918093FC03A92F0E |
:10955000BB27A7FDB095A69F9001A79F300DB69F92 |
:10956000300D1124E82FFF27E7FDF095E49FC0019F |
:10957000E59F900DF49F900D1124280F391F37FFA0 |
:1095800002C0295F3F4F13E0359527951A95E1F703 |
:1095900030931A0320931903A49F9001A59F300DC7 |
:1095A000B49F300D1124E69FC001E79F900DF69FF8 |
:1095B000900D1124281B390B37FF02C0295F3F4F44 |
:1095C000F3E035952795FA95E1F73093180320934A |
:1095D000170380910706E82FFF27EE0FFF1FE55DB9 |
:1095E000F84F80819181909581959F4F90931603BC |
:1095F000809315038330910514F0029705C0BFEFE7 |
:109600008E3F9B0734F402969093160380931503C4 |
:1096100004C010921603109215038091F8039091E4 |
:10962000F9032091F4033091F503820F931FC0904A |
:109630001903D0901A03C81AD90AD0921A03C092FB |
:1096400019038091F6039091F7032091F203309172 |
:10965000F303820F931F0091170310911803081B47 |
:10966000190B109318030093170380910606E82F37 |
:10967000FF27EE0FFF1FE55DF84FE080F180E8E780 |
:10968000F0E0EE0EFF1EF0921403E09213038091BF |
:10969000A7019927AA2797FDA095BA2FBC01CD0154 |
:1096A0000E94CD78DC01CB0120E030E040E251E4C3 |
:1096B000BC01CD010E943B78DC01CB01BC01CD0196 |
:1096C0000E949F78DC01CB018093EF078091A60177 |
:1096D0008093C8078091A5019927AA2797FDA09597 |
:1096E000BA2FBC01CD010E94CD78DC01CB0120E076 |
:1096F00030E040E251E4BC01CD010E943B78DC0146 |
:10970000CB01BC01CD010E949F78DC01CB0180938D |
:10971000A3078091A4018093B8078091670480FF1C |
:1097200059C08091F807813808F454C080916004D2 |
:10973000992787FD9095292D3327829FA001839F2C |
:10974000500D929F500D1124C40ED51ED0921A03B5 |
:10975000C092190380916104992787FD9095829F9B |
:10976000B001839F700D929F700D1124060F171F7B |
:10977000109318030093170380916204282F332756 |
:1097800027FD30958091150390911603820F931F4A |
:10979000909316038093150380916404282F332738 |
:1097A00027FD3095809115069927289FD001299F84 |
:1097B000B00D389FB00D1124B0939A01A093990178 |
:1097C0008091630499278E159F0524F490931403C8 |
:1097D00080931303809113039091140397FF04C0A7 |
:1097E00010921403109213038091100682FF02C09E |
:1097F0001092C8074091190350911A03CA0157FDEE |
:1098000003969C01359527953595279537FF03C01D |
:10981000309521953F4F8091EC029091ED02821797 |
:109820009307B4F4CA0157FF03C0909581959F4FE9 |
:1098300097FD039695958795959587959093ED025D |
:109840008093EC028536910544F084E690E001C0F7 |
:1098500001979093ED028093EC0240911703509191 |
:109860001803CA0157FD03969C0135952795359538 |
:10987000279537FF03C0309521953F4F8091EA022D |
:109880009091EB0282179307B4F4CA0157FF03C00B |
:10989000909581959F4F97FD039695958795959502 |
:1098A00087959093EB028093EA028536910544F008 |
:1098B00084E690E001C001979093EB028093EA0266 |
:1098C0008091E70284FF08C01092ED021092EC0232 |
:1098D0001092EB021092EA02EB2DFF27EE0FFF1F12 |
:1098E000E55DF84F40913D06242F3327808191811B |
:1098F0002817390744F48091640682FF04C081E090 |
:109900008093000313C0EB2DFF27EE0FFF1FE55DD3 |
:10991000F84F842F992720913E06821B91092081C0 |
:1099200031812817390714F410920003409105067D |
:10993000E42FFF27EE0FFF1FE55DF84F50913D0626 |
:10994000852F992722273327281B390B8081918166 |
:109950008217930744F48091640683FF04C081E07A |
:109960008093FF0216C08091FF02882391F0E42FBC |
:10997000FF27EE0FFF1FE55DF84F80913E06992708 |
:10998000851B9109208131818217930714F410926D |
:10999000FF02EA2DFF27EE0FFF1FE55DF84F409114 |
:1099A0003D06242F3327808191812817390744F4FD |
:1099B0008091640680FF04C081E08093FD0217C09F |
:1099C0008091FD02882399F0EA2DFF27EE0FFF1FFB |
:1099D000E55DF84F842F992720913E06821B91095F |
:1099E000208131812817390714F41092FD0240912B |
:1099F0000406E42FFF27EE0FFF1FE55DF84F50919F |
:109A00003D06852F992722273327281B390B808174 |
:109A100091818217930744F48091640681FF04C00A |
:109A200081E08093FE0216C08091FE02882391F0AF |
:109A3000E42FFF27EE0FFF1FE55DF84F80913E06F4 |
:109A40009927851B9109208131818217930714F48E |
:109A50001092FE0280910003882319F48091FF0286 |
:109A6000811181E0809301038091FD02882321F41C |
:109A70008091FE02882351F081E0809302031092CE |
:109A80000103109200031092FF0202C080930203B0 |
:109A900080910103882321F480910203882369F0D7 |
:109AA00080913C069927E8A1F9A18E179F0714F42D |
:109AB00099A388A381E0809327038091E70284FF24 |
:109AC0001AC0109216031092150310921A031092E6 |
:109AD000190310921803109217039AE59093EF0759 |
:109AE00088E78093C8079093A3078093B8071092E4 |
:109AF0000103109202038091BB079091BC07A091D3 |
:109B0000BD07B091BE0720916F0330917003409163 |
:109B1000710350917203820F931FA41FB51F80938E |
:109B2000BB079093BC07A093BD07B093BE0780917D |
:109B3000C3079091C407A091C507B091C6072090B4 |
:109B40006703309068034090690350906A03820D68 |
:109B5000931DA41DB51D8093C3079093C407A093C4 |
:109B6000C507B093C6078091B2079091B307A09143 |
:109B7000B407B091B507E0906B03F0906C030091CF |
:109B80006D0310916E03EAA2FBA20CA31DA38E0D20 |
:109B90009F1DA01FB11F8093B2079093B307A0939E |
:109BA000B407B093B5078091A4079091A507A09141 |
:109BB000A607B091A707E0906303F09064030091BB |
:109BC000650310916603EEA2FFA208A719A78E0DE8 |
:109BD0009F1DA01FB11F8093A4079093A507A0937A |
:109BE000A607B093A707F0900203FAA6FF2029F476 |
:109BF00080910103882309F460C010925F031092E2 |
:109C00006003109261031092620310925B03109242 |
:109C10005C0310925D0310925E031092BB071092DA |
:109C2000BC071092BD071092BE071092C307109296 |
:109C3000C4071092C5071092C6071092B20710927F |
:109C4000B3071092B4071092B5071092A4071092B0 |
:109C5000A5071092A6071092A70780914F03909135 |
:109C60005003A0915103B091520380934B03909302 |
:109C70004C03A0934D03B0934E0380914703909102 |
:109C80004803A0914903B0914A0380934303909302 |
:109C90004403A0934503B0934603109233021092FD |
:109CA00032021092060310920503109208031092DC |
:109CB00007030AA5002309F0F2C18091010388235C |
:109CC00009F0EDC18091F5059091F6058150924023 |
:109CD0002CF480911203882309F4E1C19090630869 |
:109CE000A0901F066091E5077091E6077BAB6AAB19 |
:109CF0008091F5079091F6079DAB8CAB9FEF99167D |
:109D000009F4D9C0BB24CC24DD24CA01B901A601C1 |
:109D100095010E94CD7979018A01EAA9FBA9CF01B9 |
:109D2000AA2797FDA095BA2FE81AF90A0A0B1B0B70 |
:109D3000C201B101A60195010E94CD7959016A01C4 |
:109D40002CA93DA9C901AA2797FDA095BA2FA81A49 |
:109D5000B90ACA0ADB0A292C332427FC3094432C85 |
:109D6000532CC801B701A20191010E94597997FFB4 |
:109D700004C061507E4F8F4F9F4F3B014C0109E063 |
:109D800095948794779467940A95D1F7C601B501A5 |
:109D9000A20191010E94597997FF04C061507E4F42 |
:109DA0008F4F9F4F5B016C0119E0D594C794B79416 |
:109DB000A7941A95D1F78091EC029091ED0281342D |
:109DC00091053CF48091EA029091EB028134910577 |
:109DD000D4F0D401C30197FE03C00196A11DB11DAB |
:109DE0003C014D019594879477946794D601C50101 |
:109DF000D7FE03C00196A11DB11D5C016D01D59474 |
:109E0000C794B794A79480910706E82FFF27EE0F19 |
:109E1000FF1FE55DF84F808191810190F081E02D79 |
:109E2000F7FF03C0F095E195FF4F7A97A4F0C401C6 |
:109E3000B30123E030E040E050E00E94CD793901E9 |
:109E40004A01C601B50123E030E040E050E00E9445 |
:109E5000CD7959016A0180916508282F332727FDA4 |
:109E60003095432F532F261537054805590514F40F |
:109E700039014A01992787FD9095909581959F4FCB |
:109E8000AA2797FDA095BA2F681679068A069B0621 |
:109E900014F43C014D012A153B054C055D0514F4F5 |
:109EA00059016A01A816B906CA06DB060CF0CFC034 |
:109EB0005C016D01CCC0EA2CFF2400271127CA01E8 |
:109EC000B901A80197010E94CD7939014A014AA937 |
:109ED0005BA9CA01AA2797FDA095BA2F681A790A2B |
:109EE0008A0A9B0AC201B101A80197010E94CD799B |
:109EF00059016A016CA97DA9CB01AA2797FDA095FC |
:109F0000BA2FA81AB90ACA0ADB0AD401C30197FEFC |
:109F100003C00F96A11DB11D3C014D01F4E09594C5 |
:109F2000879477946794FA95D1F7D601C501D7FE47 |
:109F300003C00F96A11DB11D5C016D01E4E0D59435 |
:109F4000C794B794A794EA95D1F78091EC029091C9 |
:109F5000ED02813491053CF48091EA029091EB028C |
:109F600081349105A4F0C401B30123E030E040E066 |
:109F700050E00E94CD7939014A01C601B50123E0C4 |
:109F800030E040E050E00E94CD7959016A018091B3 |
:109F90000706E82FFF27EE0FFF1FE55DF84F8081D2 |
:109FA00091810190F081E02DF7FF03C0F095E195DC |
:109FB000FF4F7A97A4F0C401B30123E030E040E002 |
:109FC00050E00E94CD7939014A01C601B50123E074 |
:109FD00030E040E050E00E94CD7959016A0171E221 |
:109FE00067167104810491042CF070E2672E712CC5 |
:109FF000812C912C80EE68168FEF78068FEF880603 |
:10A000008FEF980644F460EE662E6FEF762E6FEFBA |
:10A01000862E6FEF962E91E2A916B104C104D104E9 |
:10A020002CF050E2A52EB12CC12CD12CA0EEAA16FA |
:10A03000AFEFBA06AFEFCA06AFEFDA0644F440EE70 |
:10A04000A42E4FEFB42E4FEFC42E4FEFD42E80919D |
:10A050004F0390915003A0915103B0915203861980 |
:10A060009709A809B90980934F0390935003A093CF |
:10A070005103B09352038091470390914803A091FC |
:10A080004903B0914A038A199B09AC09BD09809321 |
:10A09000470390934803A0934903B0934A038091E8 |
:10A0A0003202909133028F3F910509F008F4C4C544 |
:10A0B000BAA5BB2309F04EC580910103882309F09E |
:10A0C00049C580912703882309F044C5E0914506DE |
:10A0D000EBA7EE2309F43EC58091BB079091BC0726 |
:10A0E000A091BD07B091BE07B7FF04C081509F4F3C |
:10A0F000AF4FBF4FE92EFA2E0B2F112707FD1A95F0 |
:10A10000E092BB07F092BC070093BD071093BE0717 |
:10A110008091C3079091C407A091C507B091C6076D |
:10A12000B7FF04C081509F4FAF4FBF4F892F9A2F69 |
:10A13000AB2FBB27A7FDBA958CA79DA7AEA7BFA73E |
:10A140008093C3079093C407A093C507B093C60735 |
:10A1500080911F06A82EBB24CC24DD2420915F0310 |
:10A16000309160034091610350916203C601B501D3 |
:10A170000E94597997FF04C061507F4F8F4F9F4FC6 |
:10A18000672E782E892E992487FC9A9460925F031B |
:10A1900070926003809261039092620320915B034E |
:10A1A00030915C0340915D0350915E03C601B5019F |
:10A1B0000E94597997FF04C061507F4F8F4F9F4F86 |
:10A1C000272E382E492E552447FC5A9420925B03A3 |
:10A1D00030925C0340925D0350925E03809157037E |
:10A1E00090915803A0915903B0915A03B7FF04C04E |
:10A1F00081509F4FAF4FBF4F892F9A2FAB2FBB2757 |
:10A20000A7FDBA958093570390935803A0935903E1 |
:10A21000B0935A03D801C70186199709A809B9094B |
:10A220008093AC039093AD03A093AE03B093AF03C0 |
:10A2300020914406E22EFF2400271127BC01CD0106 |
:10A24000A80197010E94CD7959016A012093BB03AF |
:10A250003093BC034093BD035093BE038CA59DA5D2 |
:10A26000AEA5BFA582199309A409B5098093B003CF |
:10A270009093B103A093B203B093B303BC01CD019B |
:10A28000A80197010E94CD792093BF033093C003AA |
:10A290004093C1035093C203D601C501D7FE04C049 |
:10A2A00081509F4FAF4FBF4F892F9A2FAB2FBB27A6 |
:10A2B000A7FDBA95909306038093050357FF04C04A |
:10A2C00021503F4F4F4F5F4FBB2757FDBA95A52FEA |
:10A2D000942F832F90930803809307038091EC02BF |
:10A2E0009091ED0281349105DCF48091EA02909125 |
:10A2F000EB0281349105A4F480910706E82FFF2733 |
:10A30000EE0FFF1FE55DF84F808191810190F08194 |
:10A31000E02DF7FF03C0F095E195FF4F7A97E4F049 |
:10A32000809163088F3FC1F48091050390910603EB |
:10A3300097FD019695958795909306038093050365 |
:10A34000809107039091080397FD01969595879555 |
:10A3500090930803809307038091B2079091B3070D |
:10A36000A091B407B091B507B7FF04C081509F4FCB |
:10A37000AF4FBF4F892F9A2FAB2FBB27A7FDBA95A1 |
:10A380008093B2079093B307A093B407B093B50737 |
:10A390008091A4079091A507A091A607B091A70767 |
:10A3A000B7FF04C081509F4FAF4FBF4F892F9A2FE7 |
:10A3B000AB2FBB27A7FDBA958093A4079093A50761 |
:10A3C000A093A607B093A70780916F0390917003A5 |
:10A3D000A0917103B09172032AA13BA14CA15DA190 |
:10A3E000281B390B4A0B5B0B2093A4033093A50366 |
:10A3F0004093A6035093A70380916703909168034D |
:10A40000A0916903B0916A03EEA0FFA008A519A569 |
:10A41000E81AF90A0A0B1B0BE092A803F092A903B1 |
:10A420000093AA031093AB032093AC033093AD03C6 |
:10A430004093AE035093AF03E092B003F092B103A8 |
:10A440000093B2031093B30380914B0390914C039C |
:10A45000A0914D03B0914E03821B930BA40BB50B3F |
:10A4600080934B0390934C03A0934D03B0934E0302 |
:10A470008091430390914403A0914503B09146031A |
:10A480008E199F09A00BB10B809343039093440353 |
:10A49000A0934503B0934603FBA5FF23E1F0209171 |
:10A4A000250330912603213831054CF0809180033B |
:10A4B00090918103019690938103809380032058AB |
:10A4C0003F4F4CF4809180039091810301979093CA |
:10A4D000810380938003109226031092250381E06C |
:10A4E00090E09093C8038093C703A090AC03B09012 |
:10A4F000AD03C090AE03D090AF03D601C501D7FE27 |
:10A5000007C088279927DC018A199B09AC09BD0976 |
:10A5100081509240A040B04034F084E090E09093AD |
:10A52000C8038093C7038091CD039091CE03A0917F |
:10A53000CF03B091D0032091BB073091BC0740916D |
:10A54000BD075091BE07821B930BA40BB50B815E18 |
:10A55000914BAF4FBF4F8F539C49A040B04028F064 |
:10A560008091640889310CF4FFC031E0A31630E11A |
:10A57000B30630E0C30630E0D3060CF473C080911C |
:10A58000C903882309F46AC0D601C501D7FE07C0F4 |
:10A5900088279927DC018A199B09AC09BD099C0110 |
:10A5A000AD01B7FF04C021503E4F4F4F5F4F09E050 |
:10A5B00055954795379527950A95D1F78091C7030B |
:10A5C0009091C803820F931F9093C8038093C70391 |
:10A5D000D601C501D7FE03C00796A11DB11D13E02A |
:10A5E000B595A795979587951A95D1F78093BB0355 |
:10A5F0009093BC03A093BD03B093BE0389589341CD |
:10A60000A040B04064F088E893E1A0E0B0E080931F |
:10A61000BB039093BC03A093BD03B093BE032091F2 |
:10A62000BB033091BC034091BD035091BE0357FF63 |
:10A6300004C021503F4F4F4F5F4F232F342F452FE2 |
:10A64000552747FD5A958091050390910603820F87 |
:10A65000931F909306038093050306C081E08093C7 |
:10A66000C90302C01092C90350E0A51650EFB50609 |
:10A670005FEFC5065FEFD5060CF073C08091CA038B |
:10A68000882309F46AC0D601C501D7FE07C0882710 |
:10A690009927DC018A199B09AC09BD099C01AD0110 |
:10A6A000B7FF04C021503E4F4F4F5F4FF9E0559523 |
:10A6B000479537952795FA95D1F78091C7039091E3 |
:10A6C000C803820F931F9093C8038093C703D601DA |
:10A6D000C501D7FE03C00796A11DB11DE3E0B595E6 |
:10A6E000A79597958795EA95D1F78093BB039093AB |
:10A6F000BC03A093BD03B093BE0388579C4EAF4FDD |
:10A70000BF4F64F488E79CEEAFEFBFEF8093BB03CD |
:10A710009093BC03A093BD03B093BE032091BB03F1 |
:10A720003091BC034091BD035091BE0357FF04C05C |
:10A7300021503F4F4F4F5F4F232F342F452F552729 |
:10A7400047FD5A958091050390910603820F931F50 |
:10A75000909306038093050311C081E08093CA03A0 |
:10A760000DC01092CA030AC01092C8031092C7030A |
:10A7700088EE93E09093BA018093B9017BA5272FCF |
:10A7800033278091C7039091C8032817390724F411 |
:10A790003093C8032093C703E0916408EE2379F057 |
:10A7A0002E2F332727FD30958091C7039091C80342 |
:10A7B0002817390724F43093C8032093C703409126 |
:10A7C000AC035091AD036091AE037091AF0341387B |
:10A7D00051056105710574F08091840390918503A2 |
:10A7E0002091C7033091C803820F931F9093850374 |
:10A7F0008093840340585F4F6F4F7F4F74F4809174 |
:10A800008403909185032091C7033091C803821B74 |
:10A81000930B909385038093840381E090E0909361 |
:10A82000C8038093C703A090B003B090B103C09059 |
:10A83000B203D090B303D601C501D7FE07C0882765 |
:10A840009927DC018A199B09AC09BD098150924006 |
:10A85000A040B04034F084E090E09093C80380932F |
:10A86000C7038091D1039091D203A091D303B091FB |
:10A87000D4032091C3073091C4074091C50750917C |
:10A88000C607821B930BA40BB50B815E914BAF4F98 |
:10A89000BF4F8F539C49A040B04018F0E9310CF4F1 |
:10A8A000FFC011E0A11610E1B10610E0C10610E0F2 |
:10A8B000D1060CF473C08091CB03882309F46AC0DD |
:10A8C000D601C501D7FE07C088279927DC018A1960 |
:10A8D0009B09AC09BD099C01AD01B7FF04C0215023 |
:10A8E0003E4F4F4F5F4F69E05595479537952795F8 |
:10A8F0006A95D1F78091C7039091C803820F931F87 |
:10A900009093C8038093C703D601C501D7FE03C047 |
:10A910000796A11DB11D23E0B595A795979587953D |
:10A920002A95D1F78093BF039093C003A093C103EE |
:10A93000B093C20389589341A040B04064F088E8C6 |
:10A9400093E1A0E0B0E08093BF039093C003A09395 |
:10A95000C103B093C2032091BF033091C003409163 |
:10A96000C1035091C20357FF04C021503F4F4F4FC6 |
:10A970005F4F232F342F452F552747FD5A95809140 |
:10A98000070390910803820F931F9093080380930D |
:10A99000070306C081E08093CB0302C01092CB0373 |
:10A9A00030E0A31630EFB3063FEFC3063FEFD30608 |
:10A9B0000CF073C08091CC03882309F46AC0D601DF |
:10A9C000C501D7FE07C088279927DC018A199B0992 |
:10A9D000AC09BD099C01AD01B7FF04C021503E4F39 |
:10A9E0004F4F5F4F09E055954795379527950A9545 |
:10A9F000D1F78091C7039091C803820F931F909362 |
:10AA0000C8038093C703D601C501D7FE03C00796CC |
:10AA1000A11DB11D13E0B595A795979587951A953A |
:10AA2000D1F78093BF039093C003A093C103B09369 |
:10AA3000C20388579C4EAF4FBF4F64F488E79CEE2B |
:10AA4000AFEFBFEF8093BF039093C003A093C10308 |
:10AA5000B093C2032091BF033091C0034091C10362 |
:10AA60005091C20357FF04C021503F4F4F4F5F4FDB |
:10AA7000232F342F452F552747FD5A9580910703E3 |
:10AA800090910803820F931F90930803809307030C |
:10AA900011C081E08093CC030DC01092CC030AC09A |
:10AAA0001092C8031092C70388EE93E09093BA0106 |
:10AAB0008093B9015BA5252F33278091C70390911F |
:10AAC000C8032817390724F43093C8032093C70319 |
:10AAD00080916408882379F0282F332727FD30954B |
:10AAE0008091C7039091C8032817390724F4309345 |
:10AAF000C8032093C7034091B0035091B103609104 |
:10AB0000B2037091B303413851056105710574F0CA |
:10AB100080918203909183032091C7033091C803F1 |
:10AB2000820F931F909383038093820340585F4F5B |
:10AB30006F4F7F4FCCF480918203909183032091DB |
:10AB4000C7033091C803821B930B909383038093B8 |
:10AB500082030AC0109208031092070310920603A2 |
:10AB600010920503109227038091C807882341F4AF |
:10AB70001092080310920703109206031092050327 |
:10AB80008091BB079091BC07A091BD07B091BE0713 |
:10AB90008093CD039093CE03A093CF03B093D003C3 |
:10ABA0008091C3079091C407A091C507B091C607D3 |
:10ABB0008093D1039093D203A093D303B093D40393 |
:10ABC00010925F031092600310926103109262036F |
:10ABD00010925B0310925C0310925D0310925E036F |
:10ABE00010925703109258031092590310925A036F |
:10ABF0001092BB071092BC071092BD071092BE07BF |
:10AC00001092C3071092C4071092C5071092C6078E |
:10AC10001092B2071092B3071092B4071092B507C2 |
:10AC20001092A4071092A5071092A6071092A707EA |
:10AC30001092330210923202009115031091160304 |
:10AC4000C80117FF04C088279927801B910B4097E4 |
:10AC50006CF088EE93E09093BA018093B9018091F3 |
:10AC6000100684FD03C081E08093BA03F0901C06B7 |
:10AC7000AF2CBB24CC24DD24B801882777FD809538 |
:10AC8000982F980117FF04C022273327201B310B70 |
:10AC9000442737FD4095542F0E9459799B01AC0100 |
:10ACA000C601B5010E94597997FF04C061507E4FDB |
:10ACB0008F4F9F4FF9E09595879577956795FA9512 |
:10ACC000D1F79B018F2D9927809FD001819FB00DD7 |
:10ACD000909FB00D1124CD01B7FD039695958795F2 |
:10ACE00095958795280F391F442737FD4095542F98 |
:10ACF0002093A0033093A1034093A2035093A30396 |
:10AD000080913F0390914003A0914103B091420391 |
:10AD1000821B930BA40BB50B80933F0390934003CE |
:10AD2000A0934103B09342038155934CA040B0409F |
:10AD300064F080E593ECA0E0B0E080933F03909353 |
:10AD40004003A0934103B093420380913F0390914D |
:10AD50004003A0914103B0914203805B9C43AF4FFD |
:10AD6000BF4F64F480EB9CE3AFEFBFEF80933F03F2 |
:10AD700090934003A0934103B0934203A0902D030E |
:10AD8000B0902E03A114B10409F478C1809110068B |
:10AD900083FF74C180916F0390917003A091710340 |
:10ADA000B0917203B7FF04C081509E4FAF4FBF4FA9 |
:10ADB00079E0B595A795979587957A95D1F76C0128 |
:10ADC00097FF04C0D094C194D108D39480916703B5 |
:10ADD00090916803A0916903B0916A03B7FF04C022 |
:10ADE00081509E4FAF4FBF4F69E0B595A79597959E |
:10ADF00087956A95D1F7BC0197FF03C0709561955F |
:10AE00007F4FC616D7060CF46B01B601D7FE02C001 |
:10AE1000695F7F4F2B0153E0559447945A95E1F7B2 |
:10AE200042E0E42EF12C4E0C5F1C0CE112E0A00E6F |
:10AE3000B11E75010027F7FC0095102F24EE3DEFA1 |
:10AE4000A20EB31E8091F1079091F207A091F30733 |
:10AE5000B091F407609095017090960180909701F1 |
:10AE600090909801BC01CD01A40193010E94CD797D |
:10AE7000E21AF30A040B150BC801B70128E631E00A |
:10AE800040E050E00E94CD79DC01CB013CE4E32EB0 |
:10AE90003FEFF32EE80EF91E0091B9011091BA01AF |
:10AEA0000115110589F539E1C316D1046CF58091BE |
:10AEB0002503909126038E0D9F1D9093260380936A |
:10AEC00025038091BA038823F9F0C501AA2797FDCD |
:10AED000A095BA2FBC01CD01A40193010E9459791C |
:10AEE000DC01CB018093F1079093F207A093F30765 |
:10AEF000B093F407BC01CD010E94CD7930932C03AF |
:10AF000020932B031092BA03C70124E0880F991FE6 |
:10AF10002A95E1F7B2010E949879CB01AA2797FD03 |
:10AF2000A095BA2F2091F1073091F2074091F307D5 |
:10AF30005091F407280F391F4A1F5B1F2093F10718 |
:10AF40003093F2074093F3075093F407F090AA016F |
:10AF50006F2D7727C69EC001C79E900DD69E900D7F |
:10AF6000112497FD4F966C0195E0D594C7949A955E |
:10AF7000E1F76C197D096B0177FD7AC001151105A8 |
:10AF800009F06FC00091EC021091ED028091EA028D |
:10AF90009091EB02080F191F17FF02C0095F1F4FA6 |
:10AFA00083E0159507958A95E1F7005C1F4FCA016C |
:10AFB000B901A40193010E94CD79DA01C901209160 |
:10AFC0002B0330912C03442737FD4095542F821BCF |
:10AFD000930BA40BB50B845E9D4FAF4FBF4FBC01CD |
:10AFE000CD0128E631E040E050E00E94CD79DC015F |
:10AFF000CB01845B90408C9DA0018D9D500D9C9D4C |
:10B00000500D1124CA01B8010E94987983E0F89E7E |
:10B0100060011124C616D70614F4B60108C08827AB |
:10B0200099278C199D09681779070CF4BC019B01BD |
:10B03000442737FD4095542F80913F039091400362 |
:10B04000A0914103B0914203820F931FA41FB51F2B |
:10B0500080933F0390934003A0934103B093420336 |
:10B060000DC0015010401093BA010093B90106C001 |
:10B0700084EF91E09093BA018093B9018091270306 |
:10B08000882381F010923303109234031092350319 |
:10B09000109236031092370310923803109239033E |
:10B0A00010923A03709002037720F1F48091C80760 |
:10B0B000282F33274427552780916F0390917003E1 |
:10B0C000A0917103B0917203BC01CD010E94597926 |
:10B0D000DC01CB01BC01CD0128EF3AE240E050E0B9 |
:10B0E0000E94CD79290102C0442455249090010387 |
:10B0F0009920F1F48091C807282F3327442755273A |
:10B100008091670390916803A0916903B0916A03ED |
:10B11000BC01CD010E945979DC01CB01BC01CD01FC |
:10B1200028EF3AE240E050E00E94CD79190102C0D8 |
:10B130002224332480919E0790919F07893C91059A |
:10B140001CF088EC90E005C088539F4F34F488E3EE |
:10B150009FEF90939F0780939E078091A9079091FE |
:10B16000AA07893C91051CF088EC90E005C0885343 |
:10B170009F4F34F488E39FEF9093AA078093A90729 |
:10B180008091AB079091AC07AA2797FDA095BA2FA5 |
:10B190002091EF07A22EBB24CC24DD24BC01CD01DD |
:10B1A000A60195010E9459799B01AC0180919E07EF |
:10B1B00090919F07AA2797FDA095BA2F17E0880FB7 |
:10B1C000991FAA1FBB1F1A95D1F7280F391F4A1FB5 |
:10B1D0005B1F57FF04C0215C3F4F4F4F5F4FA6E0FE |
:10B1E0005595479537952795AA95D1F77201E20EA7 |
:10B1F000F31EF092AC07E092AB0780919C07909110 |
:10B200009D07AA2797FDA095BA2FBC01CD01A601E5 |
:10B2100095010E9459799B01AC018091A9079091F9 |
:10B22000AA07AA2797FDA095BA2FF7E0880F991FC4 |
:10B23000AA1FBB1FFA95D1F7280F391F4A1F5B1FA2 |
:10B2400057FF04C0215C3F4F4F4F5F4FE6E05595DD |
:10B25000479537952795EA95D1F78101020F131F7E |
:10B2600010939D0700939C078091EA079091EB074C |
:10B27000880F991FAA2797FDA095BA2F2091A307A1 |
:10B28000332744275527BC01CD010E9459795B0122 |
:10B290006C0197FF08C08FE390E0A0E0B0E0A80E3B |
:10B2A000B91ECA1EDB1E76E0D594C794B794A79446 |
:10B2B0007A95D1F78091B807282F3327442755274F |
:10B2C0008091530390915403A0915503B09156037C |
:10B2D000BC01CD010E945979DC01CB01BC01CD013B |
:10B2E00020EF35E540E050E00E94CD79B501620FD6 |
:10B2F000731F7093EB076093EA0791E0E91690E102 |
:10B30000F90634F080E090E19093AC078093AB07AE |
:10B310008091AB079091AC078050904F34F480E05F |
:10B3200090EF9093AC078093AB070150104134F03D |
:10B3300080E090E190939D0780939C0780919C070B |
:10B3400090919D078050904F34F480E090EF90935F |
:10B350009D0780939C076150704134F080E090E13C |
:10B360009093EB078093EA078091EA079091EB07AF |
:10B370008050904F34F480E090EF9093EB078093EF |
:10B38000EA0780910001482F552780911D01909177 |
:10B390001E014817590794F420911D0130911E0198 |
:10B3A00068A179A1649FC001659F900D749F900D65 |
:10B3B0001124B9010E94847979A368A388A199A175 |
:10B3C000880F991F880F991F99A388A34091100691 |
:10B3D00040FF92C6992009F08FC6772009F08CC6ED |
:10B3E000CC24DD24460180910303909104039093C3 |
:10B3F000D9058093D80520918603309187032115C4 |
:10B40000310509F03FC080911301909114018959D1 |
:10B41000934058F087B5853F20F4809136028150E3 |
:10B4200011C081E08093E0034EC0809113019091A0 |
:10B4300014018436910508F587B58B30D0F08091E2 |
:10B4400036028F5F809336029AE0890290011124C0 |
:10B450008091FF05821B87BD8CE291E090932202D0 |
:10B46000809321028EE591E0909387038093860379 |
:10B470002AC081E08093DF0326C07092DF037092C0 |
:10B48000E00321C080910D0390910E03A0910F0362 |
:10B49000B091100354E0880F991FAA1FBB1F5A9543 |
:10B4A000D1F78093370290933802A0933902B0937A |
:10B4B0003A02D0923502C09234022150304030938B |
:10B4C0008703209386032091AD0141FF24C02233DE |
:10B4D000D8F48091BF0181508093BF018F3FD9F58F |
:10B4E0001092280380910D0390910E03A0910F03F9 |
:10B4F000B09110038093090390930A03A0930B0368 |
:10B50000B0930C0381E004C081E08093280388ECB1 |
:10B510008093BF0120C08091990190919A01820F80 |
:10B52000911D209115063327829FF001839FF00D16 |
:10B53000929FF00D1124CF01AA2797FDA095BA2F55 |
:10B540008093090390930A03A0930B03B0930C0319 |
:10B5500081E08093280380916F0390917003A09104 |
:10B560007103B0917203E0909501F0909601009103 |
:10B57000970110919801BC01CD01A80197010E948B |
:10B58000CD7959016A018091670390916803A09178 |
:10B590006903B0916A03BC01CD01A80197010E9423 |
:10B5A000CD79B901C5010E9482773C01CC971CF08E |
:10B5B0004CE3642E712CC3010E94BF6B3C0180E2FE |
:10B5C0008093940180912803882309F421C48091F9 |
:10B5D000E70299279C012071307084FD19C46091A5 |
:10B5E000660660FD04C08091100681FD07C008A1B9 |
:10B5F00019A13093D6032093D50397C18091E70218 |
:10B6000081FF69C14091BB015091BC01CA010F96F5 |
:10B61000209113033091140382179307ACF58091A6 |
:10B62000DF03882389F58091E10381FF13C08D7FBB |
:10B630008093E10380910D0390910E03A0910F037D |
:10B64000B09110038093090390930A03A0930B0316 |
:10B65000B0930C038091E10381608093E103241B8C |
:10B66000350B2F50304037FF03C0309521953F4FA9 |
:10B670008091D5039091D603820F931F9093D603A8 |
:10B680008093D5038BE26EC0CA010F972817390744 |
:10B69000ACF58091E003882389F58091E10380FF78 |
:10B6A00013C08E7F8093E10380910D0390910E0370 |
:10B6B000A0910F03B09110038093090390930A03A4 |
:10B6C000A0930B03B0930C038091E10382608093FD |
:10B6D000E103241B350B215F3F4F37FF03C030953B |
:10B6E00021953F4F8091D5039091D603821B930BF8 |
:10B6F0009093D6038093D5038DE234C02091E1036B |
:10B70000822F992783709070892B59F12C7F209379 |
:10B71000E1031092D6031092D50320910D033091CE |
:10B720000E0340910F0350911003209309033093AF |
:10B730000A0340930B0350930C0361FF06C084EF90 |
:10B7400091E090932202809321028091110388233B |
:10B7500041F423333105410551051CF081E080930C |
:10B7600011038DE3809394012091D5033091D6038A |
:10B77000C90137FF04C088279927821B930B81508A |
:10B7800092400CF491C0809115069927289FA00142 |
:10B79000299F500D389F500D1124CA0160E075E0BB |
:10B7A0000E949879CB01AA2797FDA095BA2F2091E6 |
:10B7B000090330910A0340910B0350910C03280FA9 |
:10B7C000391F4A1F5B1F2093090330930A034093DC |
:10B7D0000B0350930C031092D6031092D503A09044 |
:10B7E0000D03B0900E03C0900F03D0901003D6014C |
:10B7F000C50180509440A040B04082179307A40731 |
:10B80000B5075CF4D601C50180509C4FAF4FBF4FC8 |
:10B81000281739074A075B0744F080930903909380 |
:10B820000A03A0930B03B0930C038091660681FF7B |
:10B8300006C08BE490E090932202809321028091D5 |
:10B840001906882389F5409103035091040357FF9B |
:10B8500002C04D5F5F4F559547955595479580912F |
:10B860001D0190911E01209100013327489FB001D6 |
:10B87000499F700D589F700D1124CB01B9010E9492 |
:10B8800098797093BC016093BB01663471051CF418 |
:10B8900086E490E005C06739710534F086E990E0F0 |
:10B8A0009093BC018093BB018091860390918703A4 |
:10B8B000892BB9F180910D0390910E03A0910F0394 |
:10B8C000B09110038093090390930A03A0930B0394 |
:10B8D000B0930C0326C080910D0390910E03A091AC |
:10B8E0000F03B091100380599140A040B040809365 |
:10B8F000090390930A03A0930B03B0930C03809168 |
:10B900001906882311F0992702C088E790E09093E8 |
:10B91000BC018093BB0188A199A1909304038093FB |
:10B9200003030091030310910403A0900D03B09052 |
:10B930000E03C0900F03D0901003209109033091A3 |
:10B940000A0340910B0350910C032A153B054C054B |
:10B950005D0524F08091660680FD9CC2809186037F |
:10B9600090918703892B39F0009103031091040310 |
:10B97000CC24DD24C9C0D601C501821B930BA40BC6 |
:10B98000B50B8093A4039093A503A093A603B09353 |
:10B99000A7038230E0E89E07EFEFAE07EFEFBE07A8 |
:10B9A0002CF481E090E8AFEFBFEF09C08F5F9F47B5 |
:10B9B000A040B04064F08FEF9FE7A0E0B0E080933C |
:10B9C000A4039093A503A093A603B093A703C090EC |
:10B9D000A403D090A5038091AC01282F33274427DE |
:10B9E00055278091A4039091A503A091A603B0913F |
:10B9F000A703BC01CD010E94597997FF04C0615E85 |
:10BA00007F4F8F4F9F4F25E0959587957795679549 |
:10BA10002A95D1F76093A4037093A5038093A6039E |
:10BA20009093A70365302EEF72072FEF82072FEF59 |
:10BA300092072CF484E09EEFAFEFBFEF09C0605097 |
:10BA400074408040904064F080E094E0A0E0B0E07A |
:10BA50008093A4039093A503A093A603B093A70398 |
:10BA60008090A4039090A503209134023091350278 |
:10BA700037FF02C0295F3F4F83E0359527958A95B0 |
:10BA8000E1F74FEF223834071CF421E83FEF05C0FF |
:10BA90002038310514F020E830E0C901AA2797FDCD |
:10BAA000A095BA2F2091AE01332744275527BC011A |
:10BAB000CD010E94597997FF04C06D5F7F4F8F4F72 |
:10BAC0009F4FB2E09595879577956795BA95D1F791 |
:10BAD0009B015FEF613075071CF420E03FEF06C06B |
:10BAE0006F3F710519F014F020E031E08091E1031F |
:10BAF000882341F0C90137FD03969C0135952795B0 |
:10BB000035952795820E931E2091AB01222309F4CF |
:10BB100054C060912F037091300380913103909154 |
:10BB2000320397FF04C061587F4F8F4F9F4FF7E05C |
:10BB30009595879577956795FA95D1F7332744279B |
:10BB400055270E94597997FF04C0615E7F4F8F4F40 |
:10BB50009F4FE5E09595879577956795EA95D1F79D |
:10BB60006093A4037093A5038093A6039093A70307 |
:10BB70006138AFEF7A07AFEF8A07AFEF9A072CF47F |
:10BB800080E89FEFAFEFBFEF0AC06F3F71058105FF |
:10BB9000910569F064F080E091E0A0E0B0E080936E |
:10BBA000A4039093A503A093A603B093A703809149 |
:10BBB000A4039091A503880E991E8091A901282FB6 |
:10BBC000332780916708992787FD9095289FF0017A |
:10BBD000299FF00D389FF00D11249F01F7FF02C03F |
:10BBE00021583F4F220F232F221F330BFFEF213805 |
:10BBF0003F071CF420E83FEF06C02F3F310519F046 |
:10BC000014F020E031E0820E931EC401AA2797FDB4 |
:10BC1000A095BA2FE0900303F09004039701442706 |
:10BC200037FD4095542FBC01CD010E94597997FFF3 |
:10BC300004C061507E4F8F4F9F4F59E09595879577 |
:10BC4000779567955A95D1F7061B170B8091D50309 |
:10BC50009091D603892B09F060C01E141F040CF0CC |
:10BC60005CC09601D7FE03C0309521953F4F2D3320 |
:10BC7000310540F48091D9039091DA038017910740 |
:10BC800074F526C02C53304045E0369527954A95EB |
:10BC9000E1F72031310510F02FE030E04091D90379 |
:10BCA0005091DA031C141D04E4F480E190E0821B3F |
:10BCB000930B489F9001499F300D589F300D1124E0 |
:10BCC00094E0369527959A95E1F72017310720F5EE |
:10BCD0008091BD019091BE0108171907F4F08C0105 |
:10BCE0001CC0205F3F4F8091BD019091BE01829F9B |
:10BCF000B001839F700D929F700D11249B0184E011 |
:10BD0000369527958A95E1F74017510714F08A0177 |
:10BD100004C00217130708F08901C801AA2797FD7C |
:10BD2000A095BA2F1DE0880F991FAA1FBB1F1A9557 |
:10BD3000D1F79301442737FD4095542FBC01CD0125 |
:10BD40000E94CD792093A8033093A9034093AA03BE |
:10BD50005093AB030091A8031091A9038091D703DE |
:10BD60009091D8039C01220F331F280F391F200FF9 |
:10BD7000311F37FF02C02D5F3F4FA90155954795F1 |
:10BD8000559547955093D8034093D703809111065A |
:10BD9000282F3327220F331F220F331F2417350775 |
:10BDA0006CF48091E907282F3327220F331F220FCD |
:10BDB000331F205530404217530724F03093D803E7 |
:10BDC0002093D7038091660680FF0DC08091D70332 |
:10BDD0009091D803A8A1B9A18A179B0724F0B0932A |
:10BDE000D803A093D70328A139A12E193F0937FF03 |
:10BDF00002C02D5F3F4F3595279535952795E091EA |
:10BE0000D703F091D803E20FF31FF9A3E8A342C0D0 |
:10BE100080911906882301F5609103037091040352 |
:10BE200077FF02C06D5F7F4F759567957595679534 |
:10BE300040911D0150911E0180910001282F332750 |
:10BE4000649FC001659F900D749F900D1124B901EE |
:10BE50000E949879CB0101C099279093BC018093EF |
:10BE6000BB018091BB019091BC01873491051CF40A |
:10BE700086E490E005C08639910534F086E990E0CB |
:10BE80009093BC018093BB01E8A0F9A0F092D80385 |
:10BE9000E092D7038091E70299279C0122703070CD |
:10BEA00081FF1CC18091DB039091DC03A091DD0335 |
:10BEB000B091DE030097A105B10521F08091110337 |
:10BEC0008130B1F408A119A1C801AA2797FDA09556 |
:10BED000BA2F2EE0880F991FAA1FBB1F2A95D1F7F2 |
:10BEE0008093DB039093DC03A093DD03B093DE0328 |
:10BEF00080911103813019F482E08093110328A10D |
:10BF000039A1C901AA2797FDA095BA2F930144270B |
:10BF100037FD4095542FBC01CD010E945979DC01B9 |
:10BF2000CB018093A8039093A903A093AA03B09395 |
:10BF3000AB03B7FF04C08150904EAF4FBF4F5C01C1 |
:10BF40006D010DE0D594C794B794A7940A95D1F7E5 |
:10BF5000A092A803B092A903C092AA03D092AB0307 |
:10BF60006091E8027091E9023FE0603A730750F592 |
:10BF70008091DB039091DC03A091DD03B091DE039F |
:10BF80009C01AD011AE056954795379527951A956E |
:10BF9000D1F7821B930BA40BB50BA6019501F4E01E |
:10BFA000220F331F441F551FFA95D1F7820F931F9D |
:10BFB000A41FB51F8093DB039093DC03A093DD03E4 |
:10BFC000B093DE0360547F4118F58091DB039091BC |
:10BFD000DC03A091DD03B091DE039C01AD01ECE038 |
:10BFE0005695479537952795EA95D1F7821B930B80 |
:10BFF000A40BB50BA601950172E0220F331F441F5D |
:10C00000551F7A95D1F7820F931FA41FB51F29C022 |
:10C0100080913402909135028091340290913502E2 |
:10C0200097FF03C0909581959F4F843691050CF53D |
:10C030008091DB039091DC03A091DD03B091DE03DE |
:10C040009C01AD016EE056954795379527956A9509 |
:10C05000D1F7821B930BA40BB50B8A0D9B1DAC1D56 |
:10C06000BD1D8093DB039093DC03A093DD03B093AD |
:10C07000DE038091DB039091DC03A091DD03B0919E |
:10C08000DE032EE0B695A795979587952A95D1F76B |
:10C09000909304038093030340911706442399F07F |
:10C0A00055279C01BA010E949879C901861B970BFC |
:10C0B0009093DA038093D903260F371F3093BE0184 |
:10C0C0002093BD0119C01092DA031092D9038FEFAB |
:10C0D00093E09093BE018093BD010EC010921103B6 |
:10C0E0001092DB031092DC031092DD031092DE034A |
:10C0F00030930403209303035091B00758AB252FCE |
:10C100003327220F331F220F331F285D3F4F68A1B3 |
:10C1100079A12617370714F039A328A37091E907EE |
:10C1200079AB872F9927880F991F880F991F805502 |
:10C130009040A8A1B9A18A179B0714F499A388A3DA |
:10C1400080916C02882321F480916E088F3FA1F0CA |
:10C150008091E8029091E9020297C09768F4E8A103 |
:10C16000F9A11E161F0644F481E090E09093E902C5 |
:10C170008093E80239A328A3E8A0F9A0F092BD05B6 |
:10C18000E092BC058091A0039091A103A091A2032D |
:10C19000B091A30312E0880F991FAA1FBB1F1A9525 |
:10C1A000D1F7C090EA07D090EB07C81AD90A8701E7 |
:10C1B000013A11058CF0C701F7FC0196959587951A |
:10C1C0008C159D050CF46C01909581959F4FC816B8 |
:10C1D000D90694F46C0110C011E5C116D1041CF00D |
:10C1E000E0E5CE2ED12C20EBC2162FEFD20624F4A0 |
:10C1F00070EBC72E7FEFD72E49A9242F3327220FAC |
:10C20000331F220F331FC90168A179A1861B970B29 |
:10C210008C159D050CF46C0188A199A1821B930BD0 |
:10C22000C816D9060CF46C018091AB079091AC074D |
:10C230006091190370911A03861B970B9093BA07AC |
:10C240008093B907A090C807209137033091380335 |
:10C250004091390350913A03AA2041F0461A570AF7 |
:10C26000C201AA2797FDA095BA2F04C0AA2797FD5F |
:10C27000A095BA2F280F391F4A1F5B1F2093370341 |
:10C28000309338034093390350933A038091370336 |
:10C2900090913803A0913903B0913A0381509A4F9D |
:10C2A000A040B04064F080E09AEFA0E0B0E080935E |
:10C2B000370390933803A0933903B0933A038091E6 |
:10C2C000370390913803A0913903B0913A0380501D |
:10C2D0009640AF4FBF4F64F480E096E0AFEFBFEF02 |
:10C2E0008093370390933803A0933903B0933A03B4 |
:10C2F000B09026062B2D33278091B9079091BA076D |
:10C30000289F7001299FF00C389FF00C1124970191 |
:10C31000F7FE02C0295F3F4F790153E0F594E7949F |
:10C320005A95E1F70091AF011091B00198014427AF |
:10C3300037FD4095542F8091370390913803A09199 |
:10C340003903B0913A03BC01CD010E94CD79E20ED0 |
:10C35000F31E90909B01692D7727882799279601D6 |
:10C36000D7FE04C0222733272C193D0937FF02C00E |
:10C370002F5F3F4F3595279548A159A1240F351FB1 |
:10C38000442737FD4095542F0E94597997FF04C0E8 |
:10C39000615C7F4F8F4F9F4F26E0959587957795EE |
:10C3A00067952A95D1F79B016E157F050CF47B01EB |
:10C3B000309521953F4FE216F3060CF479018091F8 |
:10C3C0009C0790919D076091170370911803861B3D |
:10C3D000970B90939B0780939A072091330330919A |
:10C3E00034034091350350913603AA2041F0261AB8 |
:10C3F000370AC101AA2797FDA095BA2F04C0AA2722 |
:10C4000097FDA095BA2F280F391F4A1F5B1F209355 |
:10C4100033033093340340933503509336038091B4 |
:10C42000330390913403A0913503B09136038150CA |
:10C430009A4FA040B04064F080E09AEFA0E0B0E0F6 |
:10C440008093330390933403A0933503B093360362 |
:10C450008091330390913403A0913503B09136035A |
:10C4600080509640AF4FBF4F64F480E096E0AFEF4E |
:10C47000BFEF8093330390933403A0933503B093BD |
:10C4800036032B2D332780919A0790919B07289F85 |
:10C49000D001299FB00D389FB00D11249D01B7FF29 |
:10C4A00002C0295F3F4F5901B3E0B594A794BA95F4 |
:10C4B000E1F79801442737FD4095542F80913303CD |
:10C4C00090913403A0913503B0913603BC01CD01A6 |
:10C4D0000E94CD79A20EB31E692D77278827992750 |
:10C4E0009601D7FE04C0222733272C193D0937FFB8 |
:10C4F00002C02F5F3F4F35952795E8A1F9A12E0F78 |
:10C500003F1F442737FD4095542F0E94597997FFCC |
:10C5100004C0615C7F4F8F4F9F4FF6E095958795E4 |
:10C5200077956795FA95D1F79B016A157B050CF411 |
:10C530005B01309521953F4FA216B3060CF45901CB |
:10C54000EAEC6E2EE6E07E2E71E8872E76E0972EDE |
:10C550006BE0362E59EC452E57E0552ED4012C9128 |
:10C5600012160CF0DFC0203419F408A119A11EC066 |
:10C57000E8A1F9A1CF01AA2797FDA095BA2F3327EB |
:10C5800027FD3095432F532FBC01CD010E945979CF |
:10C5900097FF04C0615C7F4F8F4F9F4F46E095959A |
:10C5A0008795779567954A95D1F78B01F40121819D |
:10C5B000203419F40E0D1F1D22C0203C19F40E1951 |
:10C5C0001F091DC0C701AA2797FDA095BA2F3327C1 |
:10C5D00027FD3095432F532FBC01CD010E9459797F |
:10C5E00097FF04C0615C7F4F8F4F9F4F36E095955A |
:10C5F0008795779567953A95D1F7060F171FF40140 |
:10C600002281203419F40A0D1B1D22C0203C19F48C |
:10C610000A191B091DC0C501AA2797FDA095BA2FAD |
:10C62000332727FD3095432F532FBC01CD010E94A6 |
:10C63000597997FF04C0615C7F4F8F4F9F4F26E071 |
:10C6400095958795779567952A95D1F7060F171FCA |
:10C65000F4012381203419F40C0D1D1D22C0203C4F |
:10C6600019F40C191D091DC0C601AA2797FDA09534 |
:10C67000BA2F332727FD3095432F532FBC01CD010F |
:10C680000E94597997FF04C0615C7F4F8F4F9F4F85 |
:10C69000B6E09595879577956795BA95D1F7060F8A |
:10C6A000171FD2018D919C91801791075CF4BC01FA |
:10C6B000600F711F77FF02C06F5F7F4F8B01159571 |
:10C6C000079504C0000F111F081B190BB8A98B2F69 |
:10C6D0009927880F991F880F991F8017910754F485 |
:10C6E000E9A98E2F9927880F991F880F991F08177E |
:10C6F00019070CF08C01C80117FD039695958795D5 |
:10C7000095958795F3018183880F991F880F991F4D |
:10C710009801281B390BC901880F8283D2010D9320 |
:10C720001C9303C0F301118212823A9402E010E0DC |
:10C73000400E511E24E030E0820E931E48E050E08F |
:10C74000640E751E37FE0ACFE2E1CB5C0C94047ACE |
:10C750008091EE039091EF03A091F003B091F1036B |
:10C760008093E6039093E703A093E803B093E90373 |
:10C770008091EA039091EB03A091EC03B091ED035B |
:10C780008093E2039093E303A093E403B093E50363 |
:10C7900008951092F9031092F8031092F703109283 |
:10C7A000F603089584B1806A84B93D9A82E58CBD10 |
:10C7B0001DBC459A81E08093FB078AEA80930C08B0 |
:10C7C00083E880930D088AE080930E081092100889 |
:10C7D00010920F0810921208109211081092660819 |
:10C7E00010922E0808953091FB07332309F085C07D |
:10C7F0000DB407FE82C084E080932002459A2EB5D6 |
:10C800008091FD0399278130910589F0823091054F |
:10C810001CF4892B21F03EC00297B9F03BC0309345 |
:10C820002D082093FE032138A9F581E008C02535A5 |
:10C8300049F48091FE03820F8093FE0382E080938F |
:10C84000FD0328C03093FD0325C080912D08E82FFB |
:10C85000FF27E75BF74F20838F5F80932D08909130 |
:10C86000FE038A31A0F0291769F48AE1A9E4B8E04F |
:10C87000EFE2F8E00D9001928A95E1F781E0809374 |
:10C880002E0802C030932E081092FD0303C0920FB1 |
:10C890009093FE0320910B08203208F028C04598A1 |
:10C8A0000000000000000000000000000000000088 |
:10C8B0000000000000000000000000000000000078 |
:10C8C0000000000000000000000000000000000068 |
:10C8D000E0910408F0910508E20FF11D80818EBD02 |
:10C8E00080912B089081890F80932B0803C081E0F1 |
:10C8F0008093FB072F5F20930B080895EF92FF9220 |
:10C900000F931F9380911F069927880F991F880FF7 |
:10C91000991F7C010027F7FC0095102F80916F0371 |
:10C9200090917003A0917103B0917203BC01CD018D |
:10C93000A80197010E94CD793093100820930F0829 |
:10C940008091670390916803A0916903B0916A0395 |
:10C95000BC01CD01A80197010E94CD793093120846 |
:10C96000209311082091F1073091F2074091F307CD |
:10C970005091F407DA01C901E3E0880F991FAA1F5B |
:10C98000BB1FEA95D1F7820F931FA41FB51F820F1B |
:10C99000931FA41FB51F20919501309196014091DE |
:10C9A000970150919801BC01CD010E94CD7930933F |
:10C9B000180820931708809180039091810320919B |
:10C9C000420230914302821B930B90931E08809386 |
:10C9D0001D08E0917603F09177038091C007909154 |
:10C9E000C107BF010E949879CB019B01220F331F21 |
:10C9F000220F331F280F391F280F391F37FF02C09E |
:10CA00002D5F3F4F35952795359527953093140821 |
:10CA1000209313088091ED079091EE07BF010E94CB |
:10CA200098799B01220F331F220F331F260F371FC8 |
:10CA3000260F371F37FF02C02D5F3F4F35952795D3 |
:10CA40003595279530931608209315081092770393 |
:10CA5000109276031092C1071092C0071092EE0751 |
:10CA60001092ED0780910E0899278D30910509F4F9 |
:10CA700066C08E3091055CF48B30910509F48EC050 |
:10CA80008C3091050CF00FC10A9761F0A8C18F306E |
:10CA9000910509F47CC18F3091050CF45CC140977D |
:10CAA00099F19DC18091FC0280931F088091FB0247 |
:10CAB000809320088091FA02809321088091F902E6 |
:10CAC000809322088091F802809323088091F702D6 |
:10CAD000809324088091F602809325088091F502C6 |
:10CAE000809326088091E702809327088091E702CF |
:10CAF000837F8093E7020E94852F8093280880918E |
:10CB00007303809329086BC180916808909169082C |
:10CB10009093200880931F0880916C0890916D0875 |
:10CB2000909322088093210880911D0190911E010D |
:10CB300080932308809100018093240850C1809144 |
:10CB4000510680931F08809152068093200880919F |
:10CB50005306809321088091540680932208809187 |
:10CB6000550680932308809159068093240880916C |
:10CB70005A068093250880915B0680932608809151 |
:10CB80005E068093270880915C0680932808809138 |
:10CB90005D068093290880915F06DAC0F894809141 |
:10CBA0000606E82FFF27EE0FFF1FE55DF84F019007 |
:10CBB000F081E02DE038F1051CF0EFE7F0E006C071 |
:10CBC0002FEFE138F20714F4E1E8FFEFE0931F08DC |
:10CBD00080910706E82FFF27EE0FFF1FE55DF84F56 |
:10CBE0000190F081E02DE038F1051CF0EFE7F0E076 |
:10CBF00006C06FEFE138F60714F4E1E8FFEFE093C9 |
:10CC0000200880910506E82FFF27EE0FFF1FE55D46 |
:10CC1000F84F0190F081E02DE038F1051CF0EFE7CE |
:10CC2000F0E006C08FEFE138F80714F4E1E8FFEF19 |
:10CC3000E093210880910406E82FFF27EE0FFF1FE5 |
:10CC4000E55DF84F0190F081E02DE038F1051CF032 |
:10CC5000EFE7F0E006C02FEFE138F20714F4E1E867 |
:10CC6000FFEF7894E093220880911C0380932308BF |
:10CC700080911D038093240880911E0380932508D2 |
:10CC800080911F03809326088091200380932708BA |
:10CC900080912103809328088091220380932908A2 |
:10CCA0008091230355C080915B04863018F0109268 |
:10CCB0005B0485E080931F088091600680932008C4 |
:10CCC00080910D0390910E03A0910F03B09110037A |
:10CCD000BC01CD0125E030E040E050E00E94CD797C |
:10CCE00030932208209321088091090390910A0330 |
:10CCF000A0910B03B0910C03BC01CD0125E030E005 |
:10CD000040E050E00E94CD7930932408209323081E |
:10CD100080915606809325088091570680932608B7 |
:10CD2000809158068093270880911B0380932808E0 |
:10CD300080912B0790912C07809329088091BC0546 |
:10CD40009091BD0597FD0396959587959595879547 |
:10CD500080932A0844C010921F0880E58093200821 |
:10CD600083E0809321088EE0809322088091020165 |
:10CD7000809323088091400480932408809141048B |
:10CD800080932508809142048093260828C08091D2 |
:10CD9000380680931F088091650680932008809153 |
:10CDA000A10180932108809131068093220880910F |
:10CDB0003206809323088091330680932408809163 |
:10CDC000A0018093250880913506809326088091E4 |
:10CDD0003606809327088091370680932808809133 |
:10CDE0002E08882309F4CFC08AEF8093E801409190 |
:10CDF000300850913108CA0181509E4F8F5F934097 |
:10CE0000B0F42091320830913308C90181509E4F0F |
:10CE10008F5F934060F48091100685FF08C05093A7 |
:10CE2000F9034093F8033093F7032093F6038091BE |
:10CE300036089091370821E08936920724F49093C0 |
:10CE40002E0380932D0380912D0390912E0320912A |
:10CE50002B0330912C03821B930B845E9D4F68E65D |
:10CE600071E00E949879845B904090932A038093AC |
:10CE7000290320913A0830913B088091210290913A |
:10CE800022028217930740F480915B04882321F4E7 |
:10CE9000309322022093210280912F08992788360F |
:10CEA000910549F18936910524F48736910531F0D1 |
:10CEB00072C08936910509F445C06DC080913C0867 |
:10CEC0008093630880913D088093650880913E08B7 |
:10CED0008093640880913F088093660880914008A1 |
:10CEE00080936708809141088093E901809142080E |
:10CEF0008093FC0350C080913C0880930608809189 |
:10CF00003D088093070880913E088093080880912F |
:10CF10003F08809309088091400880930A08809117 |
:10CF2000AC0590914108892B8093AC059091420803 |
:10CF30009093FA038091AD0583709C70892B809348 |
:10CF4000AD0529C080913C088093FC0780913D0885 |
:10CF50008093FD0780913E088093FE0780913F08F3 |
:10CF60008093FF07809140089091410890930108B9 |
:10CF700080930008809142089091430890930308A1 |
:10CF80008093020808C01092F9031092F8031092DF |
:10CF9000F7031092F6031F910F91FF90EF90089501 |
:10CFA0008091FB07882309F43BC045988CE098E00A |
:10CFB00090930508809304089091FB03E92FFF27C5 |
:10CFC000E152FE4F9F5F9093FB03808180930E0898 |
:10CFD000993010F01092FB031092FB070E947E64C0 |
:10CFE00081E080930B0800000000000000000000BA |
:10CFF0000000000000000000000000000000000031 |
:10D000000000000000000000000000000000000020 |
:10D0100000000000000080910C0880932B088EBD5A |
:10D02000089587B18C6087B94298439810920004A4 |
:10D0300080E88093EB011092FF038093EA0108954A |
:10D04000809105048150809305048F3F09F0F4C05E |
:10D0500094E0909305048091E702807BE1F0809159 |
:10D060004F06882349F080910804882311F4909397 |
:10D07000000481E080930804809150068823B9F071 |
:10D0800080910904882319F484E08093FF0381E0F0 |
:10D09000809309040CC08093080480930904809154 |
:10D0A0004B068093060480914D068093070480917F |
:10D0B0000804882309F040C080916406282F332794 |
:10D0C00024FF07C080911203882319F425FD4DC069 |
:10D0D0004EC090914C06983F50F08091C2078D3D14 |
:10D0E00030F08091060488230CF43FC040C0983F84 |
:10D0F00048F08091C2078A3028F480910604882382 |
:10D10000B4F133C0809100048150809300048F3FBC |
:10D1100079F58091C2078150809300048091EB01E2 |
:10D12000813011F480E801C086958093EB018091F5 |
:10D13000EB019091060417C0809100048150809308 |
:10D1400000048F3FA9F489E0809300048091EB01F3 |
:10D15000813011F480E801C086958093EB018091C5 |
:10D16000EB0190914F06892311F0429A01C0429839 |
:10D1700080910904882309F043C080916406282F18 |
:10D18000332724FF07C080911203882319F426FD5A |
:10D1900050C034C090914E06983F50F08091E807FF |
:10D1A0008D3D30F08091070488230CF442C026C0E6 |
:10D1B000983F48F08091E8078A3028F4809107046E |
:10D1C0008823E4F036C08091FF0381508093FF03F1 |
:10D1D0008F3F91F58091E80781508093FF03809104 |
:10D1E000EA01813011F480E801C086958093EA015C |
:10D1F0008091EA01909107048923D9F44398089516 |
:10D200008091FF0381508093FF038F3FA9F489E051 |
:10D210008093FF038091EA01813011F480E801C01E |
:10D2200086958093EA018091EA01909150068923C6 |
:10D2300011F0439A0895439808954FB724E130E0E0 |
:10D24000F8948091C9008F778093C9008091C900BC |
:10D250008F7B8093C9008091C9008F7D8093C90026 |
:10D260005A9A52985B9A539A832F99278093CD00AC |
:10D270002093CC008091C80082608093C80080E138 |
:10D280008093C9008091CA008F778093CA008091F3 |
:10D29000CA008F7B8093CA008091CA008F7D8093E3 |
:10D2A000CA008091CA008F7E8093CA008091CA0014 |
:10D2B000877F8093CA008091C9008B7F8093C900CB |
:10D2C0008091CA0084608093CA008091CA00826005 |
:10D2D0008093CA008091C80087FF03C08091CE0070 |
:10D2E000F9CF8091C90080688093C9004FBF08952D |
:10D2F000FF920F931F93CF93DF9380E197E20E94F9 |
:10D300008C16EC01FF248091C9008F778093C900AF |
:10D310008091C9008F7E8093C9005A988FE29AE06D |
:10D320009F938F9309E612E11F930F93E0912704D7 |
:10D33000F091280409950F900F900F900F9002C064 |
:10D340004A996CC0CE010E9495168823C9F3E091DA |
:10D350002704F0912804FF2009F468C085E69AE0CC |
:10D360009F938F931F930F930995529A0F900F904D |
:10D370000F900F90CE010E9495168823D9F383E673 |
:10D3800090E05A9A019797FFFCCF8FE891E05A9866 |
:10D39000019797FFFCCF89E090E05A9A019797FF99 |
:10D3A000FCCF89E090E05A98019797FFFCCF8FE877 |
:10D3B00091E05A9A019797FFFCCF8FE891E05A9835 |
:10D3C000019797FFFCCF89E090E05A9A019797FF69 |
:10D3D000FCCF89E090E05A98019797FFFCCF8FE847 |
:10D3E00091E05A9A019797FFFCCF8FE891E05A9805 |
:10D3F000019797FFFCCF89E090E05A9A019797FF39 |
:10D40000FCCF89E090E05A98019797FFFCCF8FE816 |
:10D4100091E05A9A019797FFFCCF13C08AE590E0FC |
:10D420000E948C16EC0191E0F92E91CF8BE69AE0E8 |
:10D430009F938F931F930F9309950F900F900F90C9 |
:10D440000F9052985A980E941D69E5E0CDB7DEB75B |
:10D450000C94117AEF92FF920F931F93CF93DF9367 |
:10D46000482F00E010E08091EC01813061F41092CF |
:10D47000EC0184E480930A0410920C0410920B04D3 |
:10D4800010920D042BC180910A04882319F421E025 |
:10D4900030E001C0980190910B04992371F4232B83 |
:10D4A00011F081E010C084E480930A0490930C048E |
:10D4B00090930B0490930D04FAC0913069F4232BE0 |
:10D4C00009F0EBC082E080930B0480910C048F5F25 |
:10D4D00080930C0483E0E9C09230D1F4232B09F04F |
:10D4E000DCC083E080930A0440930D0490910C0407 |
:10D4F000923039F410920E0447FF03C081E080930C |
:10D500000E0483E080930B049F5F90930C04CFC0C4 |
:10D51000933009F0C2C0232B09F0BFC090930A04D6 |
:10D5200082E080930B0480910C048F5F80930C0445 |
:10D5300020910D04822F9927782F6627842F992711 |
:10D54000682B792B80912A06813049F47370CB01C6 |
:10D550008050924063E070E00E94987917C082305A |
:10D5600061F47770CB018050944066E070E00E94D7 |
:10D5700098792695269526950BC07370685671404C |
:10D58000CB0177FD0196BC0175956795269526958B |
:10D59000022F11270F7010700F5F1F4F0D301105F4 |
:10D5A00008F074C07801E00EF11EF701E55DF84F58 |
:10D5B000808191819B01281B390BC90137FF03C072 |
:10D5C000909581959F4F069794F480911B03883C1A |
:10D5D00030F480911B03865F80931B0308C088ECA6 |
:10D5E00080931B0380916F008F7D80936F00F70104 |
:10D5F000E55DF84F808191819C01220F331F280F38 |
:10D60000391F260F371F37FF02C02D5F3F4FE9013B |
:10D61000D595C795D595C795CB0101968C179D07D4 |
:10D6200014F4219706C061507040C617D7070CF458 |
:10D63000219680911B03843BD0F0F701E55DF84F04 |
:10D6400080819181FE01E81BF90BCF0163E070E05E |
:10D650000E949879CB01880F991F860F971F2FE59D |
:10D6600037E0E20EF31EF7019183808307C02FE5B8 |
:10D6700037E0E20EF31EF70111821082000F111F36 |
:10D68000055D184FF801D183C08311C00231110527 |
:10D6900070F081E08093EC010AC081E08093EC019E |
:10D6A00010920C0410920E0484E480930A0480917A |
:10D6B0000C04803198F080910E04882331F480911D |
:10D6C000EC01882311F48093930110920C041092C2 |
:10D6D0000E0410920B0484E480930A04E6E0CDB7B4 |
:10D6E000DEB70C94107ACF93FC0197FF05C0CFEF03 |
:10D6F000F095E195FF4F01C0C1E028E631E0CF0190 |
:10D70000B9010E949879FC018B35910554F08B5535 |
:10D7100090408A35910538F484EB90E08E1B9F0B86 |
:10D72000FC0141E00DC0CF01855B90408A35910539 |
:10D7300018F4E45BF04003C02E1B3F0BF9014FEFE0 |
:10D74000EE0FFF1FEA58F54F259134918C2F992742 |
:10D7500087FD9095289FB001299F700D389F700D0F |
:10D760001124842F992787FD9095689FA001699FB8 |
:10D77000500D789F500D1124CA01CF9108952AE5CC |
:10D7800030E0281B390BC9010E94736B0895CF93B9 |
:10D79000DF9380E00E94287180911D0190911E010D |
:10D7A0006AE070E00E9498799F938F9380911D01A9 |
:10D7B00090911E016AE070E00E9498797F936F93C8 |
:10D7C00084E49BE09F938F93CBE1D1E7DF93CF93EA |
:10D7D000E0912704F091280409952DB73EB7285F02 |
:10D7E0003F4F2DBF8091E8018823B9F186E00E9468 |
:10D7F000287180910008909101086AE070E00E9411 |
:10D8000084797F936F938FED90E09F938F938091B6 |
:10D81000F1079091F207A091F307B091F4072091DE |
:10D820009501309196014091970150919801BC016A |
:10D83000CD010E94CD793F932F938DE49BE09F9380 |
:10D840008F93DF93CF93E0912704F09128040995FB |
:10D850008DB79EB70A968DBF12C086E00E942871D0 |
:10D8600089E59BE09F938F93DF93CF93E09127040B |
:10D87000F091280409950F900F900F900F908091D0 |
:10D88000FA038823C1F086E00E9428718091FA0390 |
:10D8900099279F938F9380E69BE09F938F93DF93CD |
:10D8A000CF93E0912704F091280409952DB73EB756 |
:10D8B0002A5F3F4F2DBF80E10E9428718091F301C4 |
:10D8C0009091F4016CE370E00E9484799F938F93B0 |
:10D8D0008091F3019091F4016CE370E00E948479EF |
:10D8E0007F936F9380916C0890916D089F938F93B5 |
:10D8F0008BE69BE09F938F93CBE1D1E7DF93CF93B0 |
:10D90000E0912704F09128040995809110062DB725 |
:10D910003EB7265F3F4F2DBF80FF29C08AE10E949E |
:10D9200028718091940199279F938F9380910D0383 |
:10D9300090910E03A0910F03B0911003BC01CD0193 |
:10D9400024E630E040E050E00E94CD793F932F93F1 |
:10D9500088E79BE09F938F93DF93CF93E091270419 |
:10D96000F091280409958DB79EB708968DBFDF9179 |
:10D97000CF910895CF93DF9380E00E94287180912A |
:10D98000E906992787FD90959F938F938091E106F3 |
:10D99000992787FD90959F938F938091D90699271A |
:10D9A00087FD90959F938F938091D106992787FD4E |
:10D9B00090959F938F938FE79BE09F938F93CBE1FD |
:10D9C000D1E7DF93CF93E0912704F09128040995E4 |
:10D9D00080E10E9428712DB73EB7245F3F4F2DBFD5 |
:10D9E00080910907992787FD90959F938F93809148 |
:10D9F0000107992787FD90959F938F938091F90652 |
:10DA0000992787FD90959F938F938091F106992791 |
:10DA100087FD90959F938F938FE89BE09F938F93C3 |
:10DA2000DF93CF93E0912704F0912804099580912A |
:10DA300002062DB73EB7245F3F4F2DBF853098F4C7 |
:10DA400080E10E9428718FE99BE09F938F93DF9381 |
:10DA5000CF93E0912704F091280409950F900F903F |
:10DA60000F900F9018C08730B0F488E10E942871A1 |
:10DA70008FED90E09F938F9380EB9BE09F938F932C |
:10DA8000DF93CF93E0912704F091280409958DB797 |
:10DA90009EB706968DBFDF91CF9108950F931F9388 |
:10DAA00080E00E9428712AE030E08091680890911F |
:10DAB0006908B9010E9484799F938F9380916808C7 |
:10DAC00090916908B9010E9484797F936F93809146 |
:10DAD0001D0190911E01B9010E9498799F938F9327 |
:10DAE00080911D0190911E01B9010E9498797F9348 |
:10DAF0006F9389EB9BE09F938F930BE111E71F934B |
:10DB00000F93E0912704F0912804099580E10E9489 |
:10DB100028718DB79EB70C968DBF80916C0890913F |
:10DB20006D089F938F9380916A0890916B089F93E3 |
:10DB30008F938CEC9BE09F938F931F930F93E091B7 |
:10DB40002704F091280409958DB79EB708968DBFDC |
:10DB50001F910F9108950F931F93CF93DF9380919F |
:10DB6000E801CBE1D1E7882309F478C080E00E9486 |
:10DB700028718091FD0799279F938F938091FF07CC |
:10DB800099279F938F9388ED9BE09F938F938E01AE |
:10DB9000DF93CF93E0912704F091280409958DB786 |
:10DBA0009EB708968DBF8091FE07833031F48CE0DC |
:10DBB0000E94287187EE9BE005C08CE00E942871CE |
:10DBC0008CEE9BE09F938F93DF93CF93E09127049C |
:10DBD000F091280409950F900F900F900F9080916D |
:10DBE000FC0781FF12C08CE00E94287181EF9BE04E |
:10DBF0009F938F931F930F93E0912704F091280434 |
:10DC000009950F900F900F900F9080E10E9428715E |
:10DC10008FED90E09F938F9380910208909103087D |
:10DC20009F938F9380910008909101086AE070E0C3 |
:10DC30000E9484797F936F9386EF9BE09F938F93ED |
:10DC40008BE191E79F938F93E0912704F091280453 |
:10DC500009958DB79EB70A968DBF12C082E00E94CB |
:10DC6000287186E09CE09F938F93DF93CF93E091A0 |
:10DC70002704F091280409950F900F900F900F90B2 |
:10DC8000DF91CF911F910F910895CF93C82F2091CD |
:10DC90000F042093100499278F32910509F18033E6 |
:10DCA00091051CF44F97A1F02CC08F34910501F120 |
:10DCB0008F38910531F5222319F481E090E038C0C6 |
:10DCC00086E0289FF0011124E45DF44F849117C091 |
:10DCD00086E0289FF0011124E35DF44F84910FC08A |
:10DCE00086E0289FF0011124E25DF44F849107C083 |
:10DCF00086E0289FF0011124E15DF44F8491809328 |
:10DD00000F0490910F04809110049813C0E00E94BA |
:10DD10002E7190910F0486E0989FF0011124E05D30 |
:10DD2000F44F259134918C2FF901099580E090E012 |
:10DD3000CF910895109269081092680810926D08AA |
:10DD400010926C0810926B0810926A0810926E087C |
:10DD50008AE090E00E948C16909312048093110444 |
:10DD60000895CF93DF9380911104909112040E9443 |
:10DD70009516882309F4AFC0809111049091120484 |
:10DD80000A969093120480931104E0E0F0E09F0162 |
:10DD900090E05FEFAAECB6E04BE0ED018B8187FFEE |
:10DDA0000BC09F5F8D81E80FF11D8981280F311D08 |
:10DDB0008E81851708F4582F4150189647FFEDCFF4 |
:10DDC00050936E08232B41F52091170430911804CD |
:10DDD0004091190450911A04BB27A52F942F832F2B |
:10DDE0009093160480931504AA27BB27281B390B90 |
:10DDF0004A0B5B0BCF01AA27BB27280F391F4A1FED |
:10DE00005B1F209317043093180440931904509318 |
:10DE10001A04E5E0F0E013C02091150430911604D7 |
:10DE20002E173F0718F4E21BF30B02C0E0E0F0E00E |
:10DE3000892F9927880F991FE80FF91F3596F093BE |
:10DE40006908E0936808EF3FF10578F480911D01BF |
:10DE500090911E018E9F90018F9F300D9E9F300DDF |
:10DE60001124C90164E670E013C0CF01969587952F |
:10DE70009695879520911D0130911E01289FA00144 |
:10DE8000299F500D389F500D1124CA0169E170E09F |
:10DE90000E94847970936B0860936A082091130440 |
:10DEA000309114042E0F3F1F309314042093130459 |
:10DEB0005EE02131350778F080916C0890916D0813 |
:10DEC000019690936D0880936C0820513E403093EA |
:10DED000140420931304DF91CF9108954FB720E4E9 |
:10DEE00030E0F8948091C9008F778093C9008091C9 |
:10DEF000C9008F7B8093C9008091C9008F7D80937A |
:10DF0000C9005A9A52985B9A539A832F9927809303 |
:10DF1000CD002093CC008091C80082608093C8001F |
:10DF200088E18093C9008091CA008F778093CA00EE |
:10DF30008091CA008F7B8093CA008091CA008F7D38 |
:10DF40008093CA008091CA008F7E8093CA0080911E |
:10DF5000CA00877F8093CA008091C9008B7F80931D |
:10DF6000C9008091CA0084608093CA008091CA0071 |
:10DF700082608093CA008091C80087FF03C08091AF |
:10DF8000CE00F9CF8091C90080688093C9004FBF4F |
:10DF900008950F931F93CF93DF93482F4F5F8931DD |
:10DFA00008F089C080912A07841710F440932A074B |
:10DFB000CB0183539B4268E170E00E949879A42FC3 |
:10DFC000BB27FD01EA0FFB1FE55DF84F80819181C2 |
:10DFD0009B01281B390BC90137FF03C09095819520 |
:10DFE0009F4F069794F480911B03883C30F48091F6 |
:10DFF0001B03865F80931B0308C088EC80931B0380 |
:10E0000080916F008F7D80936F00FD01EA0FFB1FF1 |
:10E01000E55DF84F808191819C01220F331F280F0D |
:10E02000391F260F371F37FF02C02D5F3F4FE90111 |
:10E03000D595C795D595C795CB0101968C179D07AA |
:10E0400014F4219706C061507040C617D7070CF42E |
:10E05000219680911B03843BD8F08D010A0F1B1F72 |
:10E06000F801E55DF84F80819181FE01E81BF90B15 |
:10E07000CF0163E070E00E949879CB01880F991F6F |
:10E08000860F971F015A184FF8019183808307C0AC |
:10E09000AA0FBB1FA15AB84F11961C921E92E42FD3 |
:10E0A000FF27EE0FFF1FE55DF84FD183C08344309B |
:10E0B00011F410929301DF91CF911F910F91089568 |
:10E0C000CF93DF9320916F08822F9927807F9070E4 |
:10E0D000409709F06CC02F3109F046C0809170085C |
:10E0E00080931F042091720820932104809173086B |
:10E0F00080932004822F992790932C0780932B07DD |
:10E10000222309F054C080910406282F3327220FC0 |
:10E11000331FF901E15AF84F1182108280910506F0 |
:10E12000A82FBB27AA0FBB1FFD01E15AF84F118290 |
:10E13000108280910706E82FFF27EE0FFF1FCF0107 |
:10E14000815A984FEC0119821882255D384FE901F8 |
:10E1500019821882A55DB84F11961C921E92E55D3A |
:10E16000F84F1182108223C0C22FCF70CA30F8F44A |
:10E170008091700880939908809171088093980825 |
:10E180008091720880939B088091730880939A080D |
:10E1900060919808709199088C2F0E94C96F6091C6 |
:10E1A0009A0870919B088C2F8F5F0E94C96FDF9136 |
:10E1B000CF910895CF93C82F8F3F49F480912204C7 |
:10E1C0008F3F29F4109224041092230432C020912E |
:10E1D0002404222339F4CF3111F485E001C084E016 |
:10E1E0008093250480912504909123048217A0F444 |
:10E1F000892F8095809323048F3F19F48EEF8093AD |
:10E20000230480912304C81711F40E9460701092B7 |
:10E210002404109223040BC0E22FFF27E159F74F8B |
:10E22000C0832F5F209324049C0F90932304C093FA |
:10E230002204CF91089590911E04933240F4E92F67 |
:10E24000FF27EB58F74F80839F5F90931E0408953C |
:10E25000833218F48D5F80931E04089590E2E8E7FE |
:10E26000F8E08FE19193815087FFFCCF0895CF9321 |
:10E27000CFB723E031E0F8948091C9008F77809385 |
:10E28000C9008091C9008F7B8093C9008091C9002B |
:10E290008F7D8093C9005A9A52985B9A539A832F24 |
:10E2A00099278093CD002093CC008091C800826094 |
:10E2B0008093C80088E18093C9008091CA008F775D |
:10E2C0008093CA008091CA008F7B8093CA0080919E |
:10E2D000CA0080628093CA008091CA0080618093E6 |
:10E2E000CA008091CA0088608093CA008091C900EA |
:10E2F00084608093C9008091CA0084608093CA00C2 |
:10E300008091CA0082608093CA008091C80087FF14 |
:10E3100003C08091CE00F9CF8091C90080688093BE |
:10E32000C9008091C90080648093C9000E942E7149 |
:10E33000CFBFCF910895282F99278F709070892B88 |
:10E3400031F4209580911D04822B80931D04089543 |
:10E350008091EF01882309F441C08091E70285FF95 |
:10E360000AC082E98093750883E28093760885E588 |
:10E370008093770802C0109275088091F0018F3069 |
:10E3800071F480911D040E94456E882341F081E95B |
:10E39000809375088093760881E3809377081092C4 |
:10E3A000EF018091C80085FFFCCF8091C9008F7E6E |
:10E3B0008093C9008091C9008E7F8093C9008091AD |
:10E3C0007508882311F48EEF01C08EE78093CE008C |
:10E3D00080911D048093F00110921D0408951F92F6 |
:10E3E0000F920FB60F9211248F939F93EF93FF9389 |
:10E3F0009091EF01992309F040C080912604882371 |
:10E4000061F480917508882311F483E003C0813999 |
:10E4100099F481E0809326040FC0833099F48091B1 |
:10E420007508882349F0909375088091C9008E7F04 |
:10E430008093C9008EEF1EC08091C90081608093D7 |
:10E44000C9000EC0833261F48091C9008E7F809331 |
:10E45000C9008FEF8093CE0081E08093EF0114C05C |
:10E4600080912604E82FFF27EB58F74F8F5F8093AA |
:10E47000260480818093CE0007C0109226048091EC |
:10E48000C90080618093C900FF91EF919F918F91A6 |
:10E490000F900FBE0F901F901895EF92FF920F9361 |
:10E4A0001F93CF93DF937C018B01EA01452B39F059 |
:10E4B000F80181918F01F70109952197C9F7E6E0ED |
:10E4C000CDB7DEB70C94107AEF92FF920F931F93A3 |
:10E4D000CF93DF937C018B01EA01452B41F0F801DA |
:10E4E0000F5F1F4F8491F70109952197C1F7E6E06F |
:10E4F000CDB7DEB70C94107A0F931F93CF938C0196 |
:10E50000C62F161634F480E2F8010995C1501C1686 |
:10E51000D4F3CF911F910F9108950F931F93CF9331 |
:10E520008C01C62F161634F480E3F8010995C1500A |
:10E530001C16D4F3CF911F910F910895A5E3B0E07D |
:10E54000E4EAF2E70C94E8792E96EEADFFAD2E9753 |
:10E5500088249924540180911C04882321F42C964A |
:10E560001FAE1EAE2C975EE4452E512C4C0E5D1E48 |
:10E570006F01B60105C0153239F00894C11CD11CD9 |
:10E58000F60114911123B9F7A601461B570B31F080 |
:10E590002C968EAD9FAD2C970E946472112309F4C6 |
:10E5A0006AC20894C11CD11CFF24FDA6FCA64FEF33 |
:10E5B000E42EF9A6F6010894C11CD11C149115375C |
:10E5C00021F0812F80628837B1F4F0FE0AC0F20199 |
:10E5D00024E030E0420E531E80809180A280B38000 |
:10E5E0000AC0F20142E050E0440E551E8081918144 |
:10E5F0004C01AA24BB24103221F489A58823D1F62A |
:10E600001DC0133219F458E0F52AD4CF1A3211F094 |
:10E610001D3291F41A3259F4F20182E090E0480E72 |
:10E62000591EE081ECA7EE232CF6E195ECA790E1D2 |
:10E63000F92AAFEDFA22BECF1B3211F419A7BACFD7 |
:10E640001E32C1F5F6010894C11CD11C14911A3276 |
:10E6500079F4F20122E030E0420E531E40815181F4 |
:10E660003FEF4F3F530714F44FEF5FEFE42EA2CF7D |
:10E6700040E050E0812F80538A30A0F4CA0133E09B |
:10E68000880F991F3A95E1F7840F951F480F591F7E |
:10E69000410F511D40535040F6010894C11CD11C3C |
:10E6A0001491E8CF8FEF4F3F580714F44FEF5FEF0F |
:10E6B000E42E85CF103329F4F4FC7CCF90E2F92AC4 |
:10E6C00079CF812F81538930D8F440E050E0CA01DE |
:10E6D00023E0880F991F2A95E1F7840F951F480FB3 |
:10E6E000591F410F511D40535040F6010894C11C61 |
:10E6F000D11C1491812F80538A3048F34CA75FCFEF |
:10E70000183619F4A4E0FA2A55CF1C3619F4B1E0F2 |
:10E71000FB2A50CF133661F43E010894611C711C32 |
:10E72000F20122E030E0420E531E808189833CC119 |
:10E73000143421F0143611F0193651F5143411F453 |
:10E7400031E0F32AF0FE0AC0F20144E050E0440E4A |
:10E75000551E80809180A280B3800CC0F20182E0BF |
:10E7600090E0480E591E808191814C01AA2497FCAB |
:10E77000A094BA2CB7FE0AC0B094A0949094809450 |
:10E78000811C911CA11CB11C8DE289A70AE06FC0FD |
:10E790001F3411F01F3631F41F3411F491E0F92ABF |
:10E7A00008E064C0103779F4F201A2E0B0E04A0E4C |
:10E7B0005B1E808191814C01AA24BB2400E1B0E45E |
:10E7C000FB2A18E753C01337C1F5F20122E030E00D |
:10E7D000420E531E608071806114710489F43E0101 |
:10E7E0000894611C711C88E289838EE6F3018183A1 |
:10E7F00085E78B838CE68C838D8389E28E831F82F1 |
:10E80000E7FC13C08E2D992787FD9095AC0160E041 |
:10E8100070E0C3010E94B577009729F0382E3618B2 |
:10E82000E3140CF0C3C03E2CC1C0F30101900020E2 |
:10E83000E9F731973E2E3618B9C0153511F0153766 |
:10E8400031F4153511F4F1E0FF2A0AE00FC0183554 |
:10E8500019F0183709F0A0C000E1F3FE07C08114D9 |
:10E860009104A104B10411F020E4F22A19A6EDA646 |
:10E87000E7FC02C03FEDF32289E2682E712C6C0E9A |
:10E880007D1E81149104A104B10421F44DA54423FB |
:10E8900009F47BC0802F9927AA27BB278EA79FA7A3 |
:10E8A000A8ABB9AB202E332490E0891690E09906EE |
:10E8B00091E0A90690E0B90648F0C501B4012EA583 |
:10E8C0003FA548A959A90E94AB7917C0AFEF8A1696 |
:10E8D0009104A104B10449F040F0C401B1010E94C7 |
:10E8E00084799B014427552708C0882D602F0E94FA |
:10E8F0007879282F3327442755272AAB3BAB4CABDD |
:10E900005DAB0A3059F48AA9880F880F880F9AA93D |
:10E91000990F890F382D381B832F10C0003139F41F |
:10E920008AA98295807F482D481B842F07C08AA919 |
:10E93000880F880F880F582D581B852F90E02EA523 |
:10E940003FA548A959A982169306A406B50608F062 |
:10E9500091E08AA89BA8ACA8BDA88A3010F4805D7D |
:10E9600004C0895A183509F48F7DD3018E933D0177 |
:10E97000992309F099CF083041F4F3FE06C08033A3 |
:10E9800021F080E3FD0182933F01CE010196382EF4 |
:10E990003618F8E23F0E0BC0112309F46CC03E019B |
:10E9A0000894611C711C1983B1E03B2E19A6032D3C |
:10E9B0002DA4231827FC222489A5882311F00F5F9A |
:10E9C00002C0F6FC0E5F020DEF2CFF24C70180731E |
:10E9D0009070892B49F48CA5801B682F2C968EADE6 |
:10E9E0009FAD2C970E947C7289A5882331F041E06D |
:10E9F00050E0BE01675D7F4F0AC0E6FE0EC080E3B7 |
:10EA00008AA71BA742E050E0BE01665D7F4F2C96AF |
:10EA10008EAD9FAD2C970E944D72C7018073907090 |
:10EA2000809749F48CA5801B682F2C968EAD9FADE6 |
:10EA30002C970E948D72622D2C968EAD9FAD2C97D7 |
:10EA40000E948D72832D992787FD9095AC01B301AB |
:10EA50002C968EAD9FAD2C970E944D72E4FE89CD11 |
:10EA60002CA5201B2CA7622F2C968EAD9FAD2C972A |
:10EA70000E947C727ECDE2E1CB5C0C94047A2FB7CD |
:10EA800040E0F894E0E0F0E081E280935700949158 |
:10EA9000E2E0F0E0809357003491E4E0F0E080930E |
:10EAA000570084912FBF9E3199F4363941F4893053 |
:10EAB00011F441E00DC08A3059F442E009C0373901 |
:10EAC00039F4863011F443E003C0853009F444E0A2 |
:10EAD000842F992708959FB7F8948091C900877F64 |
:10EAE0008093C9008091C9008F7E8093C900809176 |
:10EAF000C9008F778093C9008091C9008F7B809374 |
:10EB0000C9008091C9008F7D8093C90052985A9A9C |
:10EB100053985B9A9FBF08951F93CF93DF93182F4D |
:10EB200080911C04882309F48DC08091EE01181790 |
:10EB300009F488C080911B04882321F40E943F754A |
:10EB400080931B048FEF9CE09F938F93C9E6D2E1E3 |
:10EB5000DF93CF93E0912704F091280409950F905B |
:10EB60000F900F900F90812F99278230910501F11E |
:10EB7000833091052CF4009761F0019769F024C06F |
:10EB800084309105D9F084309105ACF00597C9F037 |
:10EB90001BC08FEE9CE002C08DED9CE09F938F9395 |
:10EBA000DF93CF93E0912704F0912804099518C0D2 |
:10EBB00084EC9CE0F3CF81EA9CE0F0CF83E99CE019 |
:10EBC000EDCF8BE89CE0EACF8CE09DE09F938F93A4 |
:10EBD000DF93CF93E0912704F0912804099510E08A |
:10EBE0000F900F900F900F9080911B04843011F0C4 |
:10EBF000823099F40E946B75812F8150833018F414 |
:10EC00000E941D691DC0143019F40E94377118C08C |
:10EC10001530B1F40E946E6F13C0112389F082E2A7 |
:10EC20009DE09F938F9389E692E19F938F93E0916C |
:10EC30002704F091280409950F900F900F900F90E2 |
:10EC40001093EE01DF91CF911F9108950F931F93C1 |
:10EC500081E080931C044091ED01EBE3FCE020E0B7 |
:10EC600030E05FE4849199272F5F3F4F829FB0018E |
:10EC7000839F700D929F700D11244627515031963D |
:10EC800057FFF0CF4093ED01E3E1FCE020E030E0FE |
:10EC900057E2849199272F5F3F4F829FB001839F56 |
:10ECA000700D929F700D112446275150319657FFD9 |
:10ECB000F0CF4093ED0180911B04882321F40E9442 |
:10ECC0003F7580931B048091ED01833459F088E1F6 |
:10ECD00090E029E20FB6F894A895809360000FBEEB |
:10ECE000209360008EE992E7909328048093270494 |
:10ECF0008DE39DE09F938F9309E612E11F930F939D |
:10ED0000E0912704F091280409950F900F900F903F |
:10ED10000F9084E690E09F938F9380E590E09F931F |
:10ED20008F931F921F92809102016AE00E9478796E |
:10ED3000892F99279F938F93809102010E94787960 |
:10ED400099279F938F9383E69DE09F938F931F93C3 |
:10ED50000F93E0912704F091280409958BE39CE040 |
:10ED60009F938F931F930F93E0912704F0912804B2 |
:10ED7000099583E19CE09F938F931F930F93E091FC |
:10ED80002704F091280409958DB79EB746968DBF4C |
:10ED900087E99DE09F938F931F930F93E091270442 |
:10EDA000F0912804099583EC8093810080916F0095 |
:10EDB000806280936F000F900F900F900F901F91C3 |
:10EDC0000F91089580911C04882361F08091EE01D9 |
:10EDD000843011F40E94A8718091ED01833411F008 |
:10EDE00010921C0408951F920F920FB60F921124D7 |
:10EDF0002F933F934F935F936F937F938F939F9343 |
:10EE0000AF93BF93EF93FF932091CE009091EE01CB |
:10EE1000892F8150833020F4822F0E942A6A0BC0F0 |
:10EE2000943021F4822F0E949B7105C0953019F413 |
:10EE3000822F0E94DA70FF91EF91BF91AF919F9165 |
:10EE40008F917F916F915F914F913F912F910F9093 |
:10EE50000FBE0F901F9018950024222733274427B8 |
:10EE600051E0BB27EE27FF27A0E1660F771F881F21 |
:10EE7000991F001C221F331F441F660F771F881F16 |
:10EE8000991F001C221F331F441F2AF4050E2B1F3D |
:10EE90003E1F4F1F04C0051A2B0B3E0B4F0B550F87 |
:10EEA000BB1FEE1F587F556047FD5250AA95E9F6EB |
:10EEB000E695B7955795E695B7955795852F9B2F6E |
:10EEC00008952227332741E0552768E0880F991FCE |
:10EED000221F331F880F991F221F331F1AF4240F7C |
:10EEE000351F02C0241B350B440F551F487F45605A |
:10EEF00037FD42506A9551F7569547955695479577 |
:10EF0000842F0895AA2797FF04C0809590958A1FA3 |
:10EF10009A1F77FF04C0609570956A1F7A1F669FDD |
:10EF20009001779FA001679F300D411D5A1F300D42 |
:10EF3000411D5A1F889FF001999F2E0F3F1F401DB2 |
:10EF4000511D899F300D411D5A1F300D411D5A1F03 |
:10EF5000CA01B901112480CFFB01DC0102C0059078 |
:10EF60000D9241505040D8F70895FC014150504057 |
:10EF700030F001900616D1F73197CF010895882718 |
:10EF800099270895A0E0B0E0E8ECF7E70C94F07959 |
:10EF90006C017B01EA01590121978FEFCF3FD80720 |
:10EFA00089F086010894C11CD11CC7010894E11C9A |
:10EFB000F11CF5010995F80180832197FFEFCF3F00 |
:10EFC000DF0779F7EAE0CDB7DEB70C940C7ACF9281 |
:10EFD000DF92EF92FF920F931F937C016B01FB0175 |
:10EFE0000995082FC7010196F6010995182FC80148 |
:10EFF0001F910F91FF90EF90DF90CF900895A0E0C8 |
:10F00000B0E0E5E0F8E70C94F2798C017B01EA01CD |
:10F01000690121978FEFCF3FD80771F0F701219158 |
:10F020007F01C8010F5F1F4F622FF60109952197DD |
:10F03000FFEFCF3FDF0791F7E8E0CDB7DEB70C94E5 |
:10F040000E7ACF92DF92EF92FF920F931F936C0193 |
:10F050008B017A01FA010995812F9927682FC60142 |
:10F060000196F70109951F910F91FF90EF90DF90A6 |
:10F07000CF9008955058BB27AA270ED0E0C0D1D01A |
:10F0800030F0D6D020F031F49F3F11F41EF4C6C00A |
:10F090000EF4E095E7FBBCC0E92FE2D080F3BA178D |
:10F0A000620773078407950718F071F49EF5FAC09C |
:10F0B0000EF4E0950B2EBA2FA02D0B01B901900193 |
:10F0C0000C01CA01A0011124FF27591B99F0593FD7 |
:10F0D00050F4503E68F11A16F040A22F232F342F1F |
:10F0E0004427585FF3CF469537952795A795F0406D |
:10F0F0005395C9F77EF41F16BA0B620B730B840B82 |
:10F10000BAF09150A1F0FF0FBB1F661F771F881F39 |
:10F11000C2F70EC0BA0F621F731F841F48F4879591 |
:10F1200077956795B795F7959E3F08F0B3CF939580 |
:10F13000880F08F09927EE0F97958795089598D036 |
:10F1400088F09F5790F0B92F9927B751A0F0D1F0D0 |
:10F15000660F771F881F991F1AF0BA95C9F712C05A |
:10F16000B13081F09FD0B1E008959CC0672F782F17 |
:10F170008827B85F39F0B93FCCF3869577956795C6 |
:10F18000B395D9F73EF490958095709561957F4F32 |
:10F190008F4F9F4F0895E89409C097FB3EF49095D8 |
:10F1A0008095709561957F4F8F4F9F4F9923A9F060 |
:10F1B000F92F96E9BB279395F695879577956795EF |
:10F1C000B795F111F8CFFAF4BB0F11F460FF1BC033 |
:10F1D0006F5F7F4F8F4F9F4F16C0882311F096E9C6 |
:10F1E00011C0772321F09EE8872F762F05C0662374 |
:10F1F00071F096E8862F70E060E02AF09A95660F2D |
:10F20000771F881FDAF7880F9695879597F90895E5 |
:10F2100097F99F6780E870E060E008959FEF80ECC9 |
:10F22000089500240A94161617061806090608956C |
:10F2300000240A9412161306140605060895092ED2 |
:10F240000394000C11F4882352F0BB0F40F4BF2B41 |
:10F2500011F460FF04C06F5F7F4F8F4F9F4F089581 |
:10F2600057FD9058440F551F59F05F3F71F0479577 |
:10F27000880F97FB991F61F09F3F79F0879508955C |
:10F28000121613061406551FF2CF4695F1DF08C07B |
:10F29000161617061806991FF1CF86957105610598 |
:10F2A00008940895E894BB2766277727CB0197F940 |
:10F2B0000895629FD001739FF001829FE00DF11DC0 |
:10F2C000649FE00DF11D929FF00D839FF00D749FE0 |
:10F2D000F00D659FF00D9927729FB00DE11DF91F8C |
:10F2E000639FB00DE11DF91FBD01CF0111240895E9 |
:10F2F000991B79E004C0991F961708F0961B881F88 |
:10F300007A95C9F780950895AA1BBB1B51E107C0E8 |
:10F31000AA1FBB1FA617B70710F0A61BB70B881FA5 |
:10F32000991F5A95A9F780959095BC01CD01089534 |
:10F3300097FB092E07260AD077FD04D0E5DF06D01B |
:10F3400000201AF4709561957F4F0895F6F7909517 |
:10F3500081959F4F0895A1E21A2EAA1BBB1BFD01A8 |
:10F360000DC0AA1FBB1FEE1FFF1FA217B307E407A4 |
:10F37000F50720F0A21BB30BE40BF50B661F771FFC |
:10F38000881F991F1A9469F76095709580959095DC |
:10F390009B01AC01BD01CF01089597FB092E052605 |
:10F3A0000ED057FD04D0D7DF0AD0001C38F450959A |
:10F3B0004095309521953F4F4F4F5F4F0895F6F799 |
:10F3C00090958095709561957F4F8F4F9F4F0895D1 |
:10F3D0002F923F924F925F926F927F928F929F9265 |
:10F3E000AF92BF92CF92DF92EF92FF920F931F9353 |
:10F3F000CF93DF93CDB7DEB7CA1BDB0B0FB6F89404 |
:10F40000DEBF0FBECDBF09942A88398848885F8443 |
:10F410006E847D848C849B84AA84B984C884DF80B4 |
:10F42000EE80FD800C811B81AA81B981CE0FD11D98 |
:10F430000FB6F894DEBF0FBECDBFED010895EE0FFD |
:0CF44000FF1F0590F491E02D0994FFCF10 |
:10F44C005E010A010164FF01FFFF01FC01FC0101E7 |
:10F45C00737373FF03007D0000C409C409640011B9 |
:10F46C0048656C6C6F20576F726C64000000000074 |
:10F47C000000000000000000000000000000000080 |
:10F48C000000000000000000000000000000000070 |
:10F49C000000000000000000000000000000000060 |
:10F4AC000000000000000000000000000000000050 |
:10F4BC0053706F727400004E6F726D616C0000427D |
:10F4CC006567696E6E6572000051756164726F00DC |
:10F4DC0000640001200B050000ECFF6440415A461B |
:10F4EC0064640A02969696960840403A10FB3038AF |
:10F4FC000190D0030090D00300F4017800FF036466 |
:10F50C0000020406070808080706040200FEFCFABD |
:10F51C00F9F8F8F8F9FAFCFE000204060708080BE3 |
:10F52C000A0D0B0C0E0B0F10FA2001010170FF01DC |
:02F53C000F00BE |
:00000001FF |
/branches/v0.80d-Arthur-P/Hex-Files/WasIstWas.txt |
---|
0,0 → 1,51 |
+++++++++++++++++++++++++ |
+ Flight-Ctrl: |
+++++++++++++++++++++++++ |
BootLoader_MEGA644_20MHZ_V0_1.hex |
Der Bootloader wird per ISP eingespielt |
Der Bootloader nur dann eingespielt werden, wenn noch nie ein Bootloader eingespielt wurde! |
Danach können Softwareupdates seriell eingespielt werden. |
Flight-Ctrl_MEGA644_Vx_yy.hex |
Aktuelle Firmware |
Wird per serielle Schnittstelle (durch den Bootloader) eingespielt |
//+++++++++++ |
// Quadro: |
// 1 |
// 4 3 |
// 2 |
//+++++++++++ |
// Reverse Props on 1 2 |
//+++++++++++ |
// Octo: |
// 1 2 |
// 8 3 |
// 7 4 |
// 6 5 |
//+++++++++++ |
//+++++++++++ |
// Octo2: |
// 1 |
// 8 2 |
// 7 3 |
// 6 4 |
// 5 |
//+++++++++++ |
//+++++++++++ |
// Octo3: |
// 1 |
// 2 |
// 8 7 3 4 |
// 5 |
// 6 |
//+++++++++++ |
// Reverse Props on octo: 1 3 5 7 |
/branches/v0.80d-Arthur-P/License.txt |
---|
0,0 → 1,52 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) Holger Buss, Ingo Busker |
// + Nur für den privaten Gebrauch / NON-COMMERCIAL USE ONLY |
// + 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 oder Nutzung 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 the sources to other systems or using the software on other systems (except 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/v0.80d-Arthur-P/Settings.h |
---|
--- branches/v0.80d-Arthur-P/Spektrum.c (nonexistent) |
+++ branches/v0.80d-Arthur-P/Spektrum.c (revision 1732) |
@@ -0,0 +1,406 @@ |
+/*####################################################################################### |
+Decodieren eines RC Summen Signals oder Spektrum Empfänger-Satellit |
+#######################################################################################*/ |
+ |
+#include "Spektrum.h" |
+#include "main.h" |
+// Achtung: RECEIVER_SPEKTRUM_EXP wird in der Main.h gesetzt |
+ |
+unsigned char SpektrumTimer = 0; |
+ |
+#ifdef RECEIVER_SPEKTRUM_EXP |
+unsigned char s_excnt = 0; // Counter for Spektrum-Expander |
+unsigned char s_exparity = 0; // Parity Bit for Spektrum-Expander |
+signed char s_exdata[11]; // Data for Spektrum-Expander |
+#endif |
+//--------------------------------------------------------------// |
+//--------------------------------------------------------------// |
+void SpektrumBinding(void) |
+{ |
+ unsigned int timerTimeout = SetDelay(10000); // Timeout 10 sec. |
+ unsigned char connected = 0; |
+ unsigned int delaycounter; |
+ |
+ UCSR1B &= ~(1 << RXCIE1); // disable rx-interrupt |
+ UCSR1B &= ~(1<<RXEN1); // disable Uart-Rx |
+ PORTD &= ~(1 << PORTD2); // disable pull-up |
+ |
+ printf("\n\rPlease connect Spektrum receiver for binding NOW..."); |
+ |
+ while(!CheckDelay(timerTimeout)) |
+ { |
+ if (PIND & (1 << PORTD2)) { timerTimeout = SetDelay(90); connected = 1; break; } |
+ } |
+ |
+ if (connected) |
+ { |
+ |
+ printf("ok.\n\r"); |
+ DDRD |= (1 << DDD2); // Rx as output |
+ |
+ while(!CheckDelay(timerTimeout)); // delay after startup of RX |
+ for (delaycounter = 0; delaycounter < 100; delaycounter++) PORTD |= (1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 400; delaycounter++) PORTD &= ~(1 << PORTD2); |
+ |
+ for (delaycounter = 0; delaycounter < 10; delaycounter++) PORTD |= (1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 10; delaycounter++) PORTD &= ~(1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 400; delaycounter++) PORTD |= (1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 400; delaycounter++) PORTD &= ~(1 << PORTD2); |
+ |
+ for (delaycounter = 0; delaycounter < 10; delaycounter++) PORTD |= (1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 10; delaycounter++) PORTD &= ~(1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 400; delaycounter++) PORTD |= (1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 400; delaycounter++) PORTD &= ~(1 << PORTD2); |
+ |
+ for (delaycounter = 0; delaycounter < 10; delaycounter++) PORTD |= (1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 10; delaycounter++) PORTD &= ~(1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 400; delaycounter++) PORTD |= (1 << PORTD2); |
+ |
+ } |
+ else |
+ { printf("Timeout.\n\r"); |
+ |
+ |
+ } |
+ |
+ DDRD &= ~(1 << DDD2); // RX as input |
+ PORTD &= ~(1 << PORTD2); |
+ |
+ SpektrumUartInit(); // init Uart again |
+} |
+ |
+//############################################################################ |
+// USART1 initialisation from killagreg |
+void SpektrumUartInit(void) |
+//############################################################################ |
+ { |
+ // -- Start of USART1 initialisation for Spekturm seriell-mode |
+ // USART1 Control and Status Register A, B, C and baud rate register |
+ uint8_t sreg = SREG; |
+ |
+ uint16_t ubrr = (uint16_t) ((uint32_t) SYSCLK/(8 * 115200) - 1); |
+ |
+ // disable all interrupts before reconfiguration |
+ cli(); |
+ // disable RX-Interrupt |
+ UCSR1B &= ~(1 << RXCIE1); |
+ // disable TX-Interrupt |
+ UCSR1B &= ~(1 << TXCIE1); |
+ // disable DRE-Interrupt |
+ UCSR1B &= ~(1 << UDRIE1); |
+ // set direction of RXD1 and TXD1 pins |
+ // set RXD1 (PD2) as an input pin |
+ PORTD |= (1 << PORTD2); |
+ DDRD &= ~(1 << DDD2); |
+ |
+ // set TXD1 (PD3) as an output pin |
+ PORTD |= (1 << PORTD3); |
+ DDRD |= (1 << DDD3); |
+ |
+ // USART0 Baud Rate Register |
+ // set clock divider |
+ UBRR1H = (uint8_t)(ubrr>>8); |
+ UBRR1L = (uint8_t)ubrr; |
+ // enable double speed operation |
+ UCSR1A |= (1 << U2X1); |
+ // enable receiver and transmitter |
+ //UCSR1B = (1<<RXEN1)|(1<<TXEN1); |
+ |
+ UCSR1B = (1<<RXEN1); |
+ // set asynchronous mode |
+ UCSR1C &= ~(1 << UMSEL11); |
+ UCSR1C &= ~(1 << UMSEL10); |
+ // no parity |
+ UCSR1C &= ~(1 << UPM11); |
+ UCSR1C &= ~(1 << UPM10); |
+ // 1 stop bit |
+ UCSR1C &= ~(1 << USBS1); |
+ // 8-bit |
+ UCSR1B &= ~(1 << UCSZ12); |
+ UCSR1C |= (1 << UCSZ11); |
+ UCSR1C |= (1 << UCSZ10); |
+ // flush receive buffer explicit |
+ while(UCSR1A & (1<<RXC1)) UDR1; |
+ // enable RX-interrupts at the end |
+ UCSR1B |= (1 << RXCIE1); |
+ // -- End of USART1 initialisation |
+ // restore global interrupt flags |
+ |
+ SREG = sreg; |
+ return; |
+ } |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// + Copyright (c) Rainer Walther |
+// + RC-routines from original MK rc.c (c) H&I |
+// + Useful infos from Walter: http://www.rcgroups.com/forums/showthread.php?t=714299&page=2 |
+// + only for non-profit use |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// |
+// 20080808 rw Modified for Spektrum AR6100 (PPM) |
+// 20080823 rw Add Spektrum satellite receiver on USART1 (644P only) |
+// 20081213 rw Add support for Spektrum DS9 Air-Tx-Module (9 channels) |
+// Replace AR6100-coding with original composit-signal routines |
+// |
+// --- |
+// Entweder Summensignal ODER Spektrum-Receiver anschließen. Nicht beides gleichzeitig betreiben! |
+// Binding is not implemented. Bind with external Receiver. |
+// Servo output J3, J4, J5 not serviced |
+// |
+// Anschuß Spektrum Receiver |
+// Orange: 3V von der FC (keinesfalls an 5V anschließen!) |
+// Schwarz: GND |
+// Grau: RXD1 (Pin 3) auf 10-Pol FC-Stecker |
+// |
+// --- |
+// Satellite-Reciever connected on USART1: |
+// |
+// DX7/DX6i: One data-frame at 115200 baud every 22ms. |
+// DX7se: One data-frame at 115200 baud every 11ms. |
+// byte1: unknown |
+// byte2: unknown |
+// byte3: and byte4: channel data (FLT-Mode) |
+// byte5: and byte6: channel data (Roll) |
+// byte7: and byte8: channel data (Nick) |
+// byte9: and byte10: channel data (Gier) |
+// byte11: and byte12: channel data (Gear Switch) |
+// byte13: and byte14: channel data (Gas) |
+// byte15: and byte16: channel data (AUX2) |
+// |
+// DS9 (9 Channel): One data-frame at 115200 baud every 11ms, alternating frame 1/2 for CH1-7 / CH8-9 |
+// 1st Frame: |
+// byte1: unknown |
+// byte2: unknown |
+// byte3: and byte4: channel data |
+// byte5: and byte6: channel data |
+// byte7: and byte8: channel data |
+// byte9: and byte10: channel data |
+// byte11: and byte12: channel data |
+// byte13: and byte14: channel data |
+// byte15: and byte16: channel data |
+// 2nd Frame: |
+// byte1: unknown |
+// byte2: unknown |
+// byte3: and byte4: channel data |
+// byte5: and byte6: channel data |
+// byte7: and byte8: 0xffff |
+// byte9: and byte10: 0xffff |
+// byte11: and byte12: 0xffff |
+// byte13: and byte14: 0xffff |
+// byte15: and byte16: 0xffff |
+// |
+// Each channel data (16 bit= 2byte, first msb, second lsb) is arranged as: |
+// |
+// Bits: F 0 C3 C2 C1 C0 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 |
+// |
+// 0 means a '0' bit |
+// F: 1 = indicates beginning of 2nd frame for CH8-9 (DS9 only) |
+// C3 to C0 is the channel number. 0 to 9 (4 bit, as assigned in the transmitter) |
+// D9 to D0 is the channel data (10 bit) 0xaa..0x200..0x356 for 100% transmitter-travel |
+// |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ |
+#define MIN_FRAMEGAP 68 // 7ms |
+#define MAX_BYTEGAP 3 // 310us |
+ |
+ |
+//############################################################################ |
+// Wird im UART-Interrupt aufgerufen |
+//############################################################################ |
+void SpektrumParser(unsigned char c) |
+{ |
+ static unsigned char Sync=0, FrameCnt=0, ByteHigh=0, ReSync=1, Frame2=0; |
+ unsigned int Channel, index = 0; |
+ signed int signal = 0, tmp; |
+ int bCheckDelay; |
+// c = UDR1; // get data byte |
+ if(ReSync == 1) |
+ { |
+ // wait for beginning of new frame |
+ ReSync = 0; |
+ SpektrumTimer = MIN_FRAMEGAP; |
+ FrameCnt = 0; |
+ Sync = 0; |
+ ByteHigh = 0; |
+ } |
+ else |
+ { |
+ if(!SpektrumTimer) bCheckDelay = 1; else bCheckDelay = 0;//CheckDelay(FrameTimer); |
+ if ( Sync == 0 ) |
+ { |
+ if(bCheckDelay) |
+ { |
+ // nach einer Pause von mind. 7ms erstes Sync-Character gefunden |
+ // Zeichen ignorieren, da Bedeutung unbekannt |
+ Sync = 1; |
+ FrameCnt ++; |
+ SpektrumTimer = MAX_BYTEGAP; |
+ } |
+ else |
+ { |
+ // Zeichen kam vor Ablauf der 7ms Sync-Pause |
+ // warten auf erstes Sync-Zeichen |
+ SpektrumTimer = MIN_FRAMEGAP; |
+ FrameCnt = 0; |
+ Sync = 0; |
+ ByteHigh = 0; |
+ } |
+ } |
+ else if((Sync == 1) && !bCheckDelay) |
+ { |
+ // zweites Sync-Character ignorieren, Bedeutung unbekannt |
+ Sync = 2; |
+ FrameCnt ++; |
+ SpektrumTimer = MAX_BYTEGAP; |
+ } |
+ else if((Sync == 2) && !bCheckDelay) |
+ { |
+ SpektrumTimer = MAX_BYTEGAP; |
+ // Datenbyte high |
+ ByteHigh = c; |
+ if (FrameCnt == 2) |
+ { |
+ // is 1st Byte of Channel-data |
+ // Frame 1 with Channel 1-7 comming next |
+ Frame2 = 0; |
+ if(ByteHigh & 0x80) |
+ { |
+ // DS9: Frame 2 with Channel 8-9 comming next |
+ Frame2 = 1; |
+ } |
+ } |
+ Sync = 3; |
+ FrameCnt ++; |
+ } |
+ else if((Sync == 3) && !bCheckDelay) |
+ { |
+ // Datenbyte low |
+ // High-Byte for next channel comes next |
+ SpektrumTimer = MAX_BYTEGAP; |
+ Sync = 2; |
+ FrameCnt ++; |
+ Channel = ((unsigned int)ByteHigh << 8) | c; |
+ if(EE_Parameter.Receiver == RECEIVER_SPEKTRUM) |
+ { |
+ signal = Channel & 0x3ff; |
+ signal -= 0x200; // Offset, range 0x000..0x3ff? |
+ signal = signal/3; // scaling to fit PPM resolution |
+ index = (ByteHigh >> 2) & 0x0f; |
+ } |
+ else |
+ if(EE_Parameter.Receiver == RECEIVER_SPEKTRUM_HI_RES) |
+ { |
+ signal = Channel & 0x7ff; |
+ signal -= 0x400; // Offset, range 0x000..0x7ff? |
+ signal = signal/6; // scaling to fit PPM resolution |
+ index = (ByteHigh >> 3) & 0x0f; |
+ } |
+ else |
+ //if(EE_Parameter.Receiver == RECEIVER_SPEKTRUM_LOW_RES) |
+ { |
+ signal = Channel & 0x3ff; |
+ signal -= 360; // Offset, range 0x000..0x3ff? |
+ signal = signal/2; // scaling to fit PPM resolution |
+ index = (ByteHigh >> 2) & 0x0f; |
+ } |
+ |
+ index++; |
+ if(index < 13) |
+ { |
+ // Stabiles Signal |
+#ifdef RECEIVER_SPEKTRUM_EXP |
+ if (index == 2) index = 4; // Analog channel reassigment (2 <-> 4) for logical numbering (1,2,3,4) |
+ else if (index == 4) index = 2; |
+#endif |
+ if(abs(signal - PPM_in[index]) < 6) |
+ { |
+ if(SenderOkay < 200) SenderOkay += 10; |
+ else |
+ { |
+ SenderOkay = 200; |
+ TIMSK1 &= ~_BV(ICIE1); // disable PPM-Input |
+ } |
+ } |
+ tmp = (3 * (PPM_in[index]) + signal) / 4; |
+ if(tmp > signal+1) tmp--; else |
+ if(tmp < signal-1) tmp++; |
+ |
+#ifdef RECEIVER_SPEKTRUM_EXP |
+ if(index == 6) // FLIGHT-MODE - The channel used for our data uplink |
+ { |
+ if (signal > 100) // SYNC received |
+ { |
+ if (s_exdata[s_excnt] == 125) s_exparity = ~s_exparity; // Bit = 1 -> Re-Invert parity bit |
+ if ((s_excnt == 6 && ((s_exparity != 0 && s_exdata[s_excnt] == -125) || (s_exparity == 0 && s_exdata[s_excnt] == 125))) || (s_excnt == 9 && ((s_exparity == 0 && s_exdata[s_excnt] == -125) || (s_exparity != 0 && s_exdata[s_excnt] == 125)))) // Parity check |
+ { |
+ if (s_exdata[1] == 125 && s_exdata[2] == -125) PPM_in[5] = -125; // Reconstruct tripole Flight-Mode value (CH5) |
+ else if (s_exdata[1] == -125 && s_exdata[2] == -125) PPM_in[5] = 0; // Reconstruct tripole Flight-Mode value (CH5) |
+ else if (s_exdata[1] == -125 && s_exdata[2] == 125) PPM_in[5] = 125; // Reconstruct tripole Flight-Mode value (CH5) |
+ PPM_in[6] = s_exdata[3]; // Elevator (CH6) |
+ PPM_in[11] = s_exdata[4]; // Aileron (CH11) |
+ PPM_in[12] = s_exdata[5]; // Rudder (CH12) |
+ |
+ if (s_excnt == 9) // New Mode (12 Channels) |
+ { |
+ if (s_exdata[7] == 125) PPM_in[8] += 5; // Hover Pitch UP (CH8) |
+ if (s_exdata[8] == 125) PPM_in[8] -= 5; // Hover Pitch DN (CH8) |
+ if (PPM_in[8] < -125) PPM_in[8] = -125; // Range-Limit |
+ else if (PPM_in[8] > 125) PPM_in[8] = 125; // Range-Limit |
+ PPM_in[10] = s_exdata[6]; // AUX2 (CH10) |
+ } |
+ } |
+ |
+ s_excnt = 0; // Reset bitcounter |
+ s_exparity = 0; // Reset parity bit |
+ } |
+ |
+ if (signal < 10) s_exdata[++s_excnt] = -125; // Bit = 0 -> value = -125 (min) |
+ if (s_excnt == 10) s_excnt = 0; // Overflow protection |
+ if (signal < -100) |
+ { |
+ s_exdata[s_excnt] = 125; // Bit = 1 -> value = 125 (max) |
+ s_exparity = ~s_exparity; // Bit = 1 -> Invert parity bit |
+ } |
+ |
+ } |
+#endif |
+ if(SenderOkay >= 180) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; |
+ else PPM_diff[index] = 0; |
+ |
+#ifdef RECEIVER_SPEKTRUM_EXP |
+ if (index < 5 ) PPM_in[index] = tmp; // Update normal potis (CH1-4) |
+ else if (index == 5) PPM_in[7] = signal; // Gear (CH7) |
+ else if (index == 7) PPM_in[9] = signal; // Hover Throttle (CH9) |
+#else |
+ PPM_in[index] = tmp; |
+#endif |
+ } |
+ else if(index > 17) ReSync = 1; // hier stimmt was nicht: neu synchronisieren |
+ } |
+ else |
+ { |
+ // hier stimmt was nicht: neu synchronisieren |
+ ReSync = 1; |
+ FrameCnt = 0; |
+ Frame2 = 0; |
+ // new frame next, nach fruehestens 7ms erwartet |
+ SpektrumTimer = MIN_FRAMEGAP; |
+ } |
+ |
+ // 16 Bytes eingetroffen -> Komplett |
+ if(FrameCnt >= 16) |
+ { |
+ // Frame complete |
+ if(Frame2 == 0) |
+ { |
+ // Null bedeutet: Neue Daten |
+ // nur beim ersten Frame (CH 0-7) setzen |
+ if(!ReSync) NewPpmData = 0; |
+ } |
+ FrameCnt = 0; |
+ Frame2 = 0; |
+ Sync = 0; |
+ SpektrumTimer = MIN_FRAMEGAP; |
+ } |
+ } |
+} |
/branches/v0.80d-Arthur-P/Spektrum.h |
---|
0,0 → 1,12 |
/*####################################################################################### |
Dekodieren eines Spektrum Signals |
#######################################################################################*/ |
#ifndef _SPEKTRUM_H |
#define _SPEKTRUM_H |
void SpektrumUartInit(void); |
void SpektrumBinding(void); |
extern unsigned char SpektrumTimer; |
extern void SpektrumParser(unsigned char c); |
#endif //_RC_H |
/branches/v0.80d-Arthur-P/analog.c |
---|
0,0 → 1,252 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) Holger Buss, Ingo Busker |
// + only for non-profit use |
// + www.MikroKopter.com |
// + porting the sources to other systems or using the software on other systems (except hardware from www.mikrokopter.de) is not allowed |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
#include "eeprom.h" |
volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_ax, Aktuell_ay,Aktuell_az, UBat = 100; |
volatile int AdWertNickFilter = 0, AdWertRollFilter = 0, AdWertGierFilter = 0; |
volatile int HiResNick = 2500, HiResRoll = 2500; |
volatile int AdWertNick = 0, AdWertRoll = 0, AdWertGier = 0; |
volatile int AdWertAccRoll = 0,AdWertAccNick = 0,AdWertAccHoch = 0; |
volatile char messanzahl_AccHoch = 0; |
volatile long Luftdruck = 32000; |
volatile long SummenHoehe = 0; |
volatile int StartLuftdruck; |
volatile unsigned int MessLuftdruck = 1023; |
unsigned char DruckOffsetSetting; |
signed char ExpandBaro = 0; |
volatile int VarioMeter = 0; |
volatile unsigned int ZaehlMessungen = 0; |
unsigned char AnalogOffsetNick = 115,AnalogOffsetRoll = 115,AnalogOffsetGier = 115; |
volatile unsigned char AdReady = 1; |
float NeutralAccZ_float; |
//####################################################################################### |
// |
void ADC_Init(void) |
//####################################################################################### |
{ |
ADMUX = 0;//Referenz ist extern |
ANALOG_ON; |
} |
#define DESIRED_H_ADC 800 |
void SucheLuftruckOffset(void) |
{ |
unsigned int off; |
off = GetParamByte(PID_PRESSURE_OFFSET); |
if(off > 20) off -= 10; |
OCR0A = off; |
ExpandBaro = 0; |
Delay_ms_Mess(100); |
if(MessLuftdruck < DESIRED_H_ADC) off = 0; |
for(; off < 250;off++) |
{ |
OCR0A = off; |
Delay_ms_Mess(50); |
printf("."); |
if(MessLuftdruck < DESIRED_H_ADC) break; |
} |
SetParamByte(PID_PRESSURE_OFFSET, off); |
DruckOffsetSetting = off; |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) && (DruckOffsetSetting < 10 || DruckOffsetSetting >= 245)) VersionInfo.HardwareError[0] |= DEFEKT_PRESSURE; |
OCR0A = off; |
Delay_ms_Mess(300); |
} |
void SucheGyroOffset(void) |
{ |
unsigned char i, ready = 0; |
int timeout; |
timeout = SetDelay(2000); |
for(i=140; i != 0; i--) |
{ |
if(ready == 3 && i > 10) i = 9; |
ready = 0; |
if(AdWertNick < 1020) AnalogOffsetNick--; else if(AdWertNick > 1030) AnalogOffsetNick++; else ready++; |
if(AdWertRoll < 1020) AnalogOffsetRoll--; else if(AdWertRoll > 1030) AnalogOffsetRoll++; else ready++; |
if(AdWertGier < 1020) AnalogOffsetGier--; else if(AdWertGier > 1030) AnalogOffsetGier++; else ready++; |
I2C_Start(TWI_STATE_GYRO_OFFSET_TX); |
if(AnalogOffsetNick < 10) { VersionInfo.HardwareError[0] |= DEFEKT_G_NICK; AnalogOffsetNick = 10;}; if(AnalogOffsetNick > 245) { VersionInfo.HardwareError[0] |= DEFEKT_G_NICK; AnalogOffsetNick = 245;}; |
if(AnalogOffsetRoll < 10) { VersionInfo.HardwareError[0] |= DEFEKT_G_ROLL; AnalogOffsetRoll = 10;}; if(AnalogOffsetRoll > 245) { VersionInfo.HardwareError[0] |= DEFEKT_G_ROLL; AnalogOffsetRoll = 245;}; |
if(AnalogOffsetGier < 10) { VersionInfo.HardwareError[0] |= DEFEKT_G_GIER; AnalogOffsetGier = 10;}; if(AnalogOffsetGier > 245) { VersionInfo.HardwareError[0] |= DEFEKT_G_GIER; AnalogOffsetGier = 245;}; |
while(twi_state) if(CheckDelay(timeout)) {printf("\n\r DAC or I2C ERROR! Check I2C, 3Vref, DAC and BL-Ctrl"); break;} |
AdReady = 0; |
ANALOG_ON; |
while(!AdReady); |
if(i<10) Delay_ms_Mess(10); |
} |
Delay_ms_Mess(70); |
} |
/* |
0 n |
1 r |
2 g |
3 y |
4 x |
5 n |
6 r |
7 u |
8 z |
9 L |
10 n |
11 r |
12 g |
13 y |
14 x |
15 n |
16 r |
17 L |
*/ |
//####################################################################################### |
// |
ISR(ADC_vect) |
//####################################################################################### |
{ |
static unsigned char kanal=0,state = 0; |
static signed char subcount = 0; |
static signed int gier1, roll1, nick1, nick_filter, roll_filter; |
static signed int accy, accx; |
static long tmpLuftdruck = 0; |
static char messanzahl_Druck = 0; |
switch(state++) |
{ |
case 0: |
nick1 = ADC; |
kanal = AD_ROLL; |
break; |
case 1: |
roll1 = ADC; |
kanal = AD_GIER; |
break; |
case 2: |
gier1 = ADC; |
kanal = AD_ACC_Y; |
break; |
case 3: |
Aktuell_ay = NeutralAccY - ADC; |
accy = Aktuell_ay; |
kanal = AD_ACC_X; |
break; |
case 4: |
Aktuell_ax = ADC - NeutralAccX; |
accx = Aktuell_ax; |
kanal = AD_NICK; |
break; |
case 5: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 6: |
roll1 += ADC; |
kanal = AD_UBAT; |
break; |
case 7: |
UBat = (3 * UBat + ADC / 3) / 4; |
kanal = AD_ACC_Z; |
break; |
case 8: |
AdWertAccHoch = (signed int) ADC - NeutralAccZ; |
if(AdWertAccHoch > 1) |
{ |
if(NeutralAccZ < 750) |
{ |
subcount += 5; |
if(modell_fliegt < 500) subcount += 10; |
} |
if(subcount > 100) { NeutralAccZ++; subcount -= 100;} |
} |
else if(AdWertAccHoch < -1) |
{ |
if(NeutralAccZ > 550) |
{ |
subcount -= 5; |
if(modell_fliegt < 500) subcount -= 10; |
if(subcount < -100) { NeutralAccZ--; subcount += 100;} |
} |
} |
messanzahl_AccHoch = 1; |
Aktuell_az = ADC; |
Mess_Integral_Hoch += AdWertAccHoch; // Integrieren |
Mess_Integral_Hoch -= Mess_Integral_Hoch / 1024; // dämfen |
kanal = AD_DRUCK; |
break; |
// "case 9:" fehlt hier absichtlich |
case 10: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 11: |
roll1 += ADC; |
kanal = AD_GIER; |
break; |
case 12: |
if(PlatinenVersion == 10) AdWertGier = (ADC + gier1 + 1) / 2; |
else |
if(PlatinenVersion >= 20) AdWertGier = 2047 - (ADC + gier1); |
else AdWertGier = (ADC + gier1); |
kanal = AD_ACC_Y; |
break; |
case 13: |
Aktuell_ay = NeutralAccY - ADC; |
AdWertAccRoll = (Aktuell_ay + accy); |
kanal = AD_ACC_X; |
break; |
case 14: |
Aktuell_ax = ADC - NeutralAccX; |
AdWertAccNick = (Aktuell_ax + accx); |
kanal = AD_NICK; |
break; |
case 15: |
nick1 += ADC; |
if(PlatinenVersion == 10) nick1 *= 2; else nick1 *= 4; |
AdWertNick = nick1 / 8; |
nick_filter = (nick_filter + nick1) / 2; |
HiResNick = nick_filter - AdNeutralNick; |
AdWertNickFilter = (AdWertNickFilter + HiResNick) / 2; |
kanal = AD_ROLL; |
break; |
case 16: |
roll1 += ADC; |
if(PlatinenVersion == 10) roll1 *= 2; else roll1 *= 4; |
AdWertRoll = roll1 / 8; |
roll_filter = (roll_filter + roll1) / 2; |
HiResRoll = roll_filter - AdNeutralRoll; |
AdWertRollFilter = (AdWertRollFilter + HiResRoll) / 2; |
kanal = AD_DRUCK; |
break; |
case 17: |
state = 0; |
AdReady = 1; |
ZaehlMessungen++; |
// "break" fehlt hier absichtlich |
case 9: |
MessLuftdruck = ADC; |
tmpLuftdruck += MessLuftdruck; |
if(++messanzahl_Druck >= 18) |
{ |
Luftdruck = (7 * Luftdruck + tmpLuftdruck - (18 * 523) * (long)ExpandBaro + 4) / 8; // -523.19 counts per 10 counts offset step |
HoehenWert = StartLuftdruck - Luftdruck; |
SummenHoehe -= SummenHoehe/SM_FILTER; |
SummenHoehe += HoehenWert; |
VarioMeter = (31 * VarioMeter + 8 * (int)(HoehenWert - SummenHoehe/SM_FILTER))/32; |
tmpLuftdruck /= 2; |
messanzahl_Druck = 18/2; |
} |
kanal = AD_NICK; |
break; |
default: |
kanal = 0; state = 0; kanal = AD_NICK; |
break; |
} |
ADMUX = kanal; |
if(state != 0) ANALOG_ON; |
} |
/branches/v0.80d-Arthur-P/analog.h |
---|
0,0 → 1,47 |
#ifndef _ANALOG_H |
#define _ANALOG_H |
/*####################################################################################### |
#######################################################################################*/ |
#define SM_FILTER 16 |
extern volatile int UBat; |
extern volatile int AdWertNick, AdWertRoll, AdWertGier; |
extern volatile int AdWertAccRoll,AdWertAccNick,AdWertAccHoch; |
extern volatile int HiResNick, HiResRoll; |
extern volatile int AdWertNickFilter, AdWertRollFilter, AdWertGierFilter; |
extern volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_ax, Aktuell_ay,Aktuell_az; |
extern volatile long Luftdruck; |
extern volatile long SummenHoehe; |
extern volatile char messanzahl_Druck; |
extern volatile unsigned int ZaehlMessungen; |
extern unsigned char DruckOffsetSetting; |
extern signed char ExpandBaro; |
extern volatile int VarioMeter; |
extern volatile unsigned int MessLuftdruck; |
extern volatile int StartLuftdruck; |
extern volatile char MessanzahlNick; |
extern unsigned char AnalogOffsetNick,AnalogOffsetRoll,AnalogOffsetGier; |
extern volatile unsigned char AdReady; |
unsigned int ReadADC(unsigned char adc_input); |
void ADC_Init(void); |
void SucheLuftruckOffset(void); |
void SucheGyroOffset(void); |
#define AD_GIER 0 |
#define AD_ROLL 1 |
#define AD_NICK 2 |
#define AD_DRUCK 3 |
#define AD_UBAT 4 |
#define AD_ACC_Z 5 |
#define AD_ACC_Y 6 |
#define AD_ACC_X 7 |
#define ANALOG_OFF ADCSRA=0 |
#define ANALOG_ON ADCSRA=(1<<ADEN)|(1<<ADSC)|(0<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADIE) |
//Signle trigger Mode, Interrupt on |
#endif //_ANALOG_H |
/branches/v0.80d-Arthur-P/capacity.c |
---|
0,0 → 1,143 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) Holger Buss, Ingo Busker |
// + Thanks to Marcel Haller (Lion) for the nice idea and first implementation |
// + Nur für den privaten Gebrauch |
// + www.MikroKopter.com |
// + porting the sources to other systems or using the software on other systems (except hardware from www.mikrokopter.de) is not allowed |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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 "capacity.h" |
#include "twimaster.h" |
#include "main.h" |
#include "timer0.h" |
#include "analog.h" |
#define CAPACITY_UPDATE_INTERVAL 10 // 10 ms |
#define FC_OFFSET_CURRENT 5 // calculate with a current of 0.5A |
#define BL_OFFSET_CURRENT 2 // calculate with a current of 0.2A |
// global varialbles |
unsigned short update_timer = 0; |
Capacity_t Capacity; |
// initialize capacity calculation |
void Capacity_Init(void) |
{ |
Capacity.ActualCurrent = 0; |
Capacity.UsedCapacity = 0; |
Capacity.ActualPower = 0; |
Capacity.MinOfMaxPWM = 0; |
update_timer = SetDelay(CAPACITY_UPDATE_INTERVAL); |
} |
// called in main loop at a regular interval |
void Capacity_Update(void) |
{ |
unsigned short Current, SetSum; // max value will be 255 * 12 = 3060 |
static unsigned short SubCounter = 0; |
static unsigned short CurrentOffset = 0; |
static unsigned long SumCurrentOffset = 0; |
unsigned char i, NumOfMotors, MinOfMaxPWM; |
if(CheckDelay(update_timer)) |
{ |
update_timer += CAPACITY_UPDATE_INTERVAL; // do not use SetDelay to avoid timing leaks |
// determine sum of all present BL currents and setpoints |
Current = 0; |
SetSum = 0; |
NumOfMotors = 0; |
MinOfMaxPWM = 255; |
for(i = 0; i < MAX_MOTORS; i++) |
{ |
if(Motor[i].State & MOTOR_STATE_PRESENT_MASK) |
{ |
NumOfMotors++; |
Current += (unsigned int)(Motor[i].Current); |
SetSum += (unsigned int)(Motor[i].SetPoint); |
if(Motor[i].MaxPWM < MinOfMaxPWM) MinOfMaxPWM = Motor[i].MaxPWM; |
} |
} |
Capacity.MinOfMaxPWM = MinOfMaxPWM; |
if(SetSum == 0) // if all setpoints are 0 |
{ // determine offsets of motor currents |
#define CURRENT_AVERAGE 8 // 8bit = 256 * 10 ms = 2.56s average time |
CurrentOffset = (unsigned int)(SumCurrentOffset>>CURRENT_AVERAGE); |
SumCurrentOffset -= CurrentOffset; |
SumCurrentOffset += Current; |
// after averaging set current to static offset |
Current = FC_OFFSET_CURRENT; |
} |
else // some motors are running, includes also motor test condition, where "MotorRunning" is false |
{ // subtract offset |
if(Current > CurrentOffset) Current -= CurrentOffset; |
else Current = 0; |
// add the FC and BL Offsets |
Current += FC_OFFSET_CURRENT + NumOfMotors * BL_OFFSET_CURRENT; |
} |
// update actual Current |
Capacity.ActualCurrent = Current; |
// update actual Power |
if(Current < 255) Capacity.ActualPower = (UBat * Current) / 100; // in W higher resolution |
else Capacity.ActualPower = (UBat * (Current/4)) / 25; // in W |
// update used capacity |
SubCounter += Current; |
// 100mA * 1ms * CAPACITY_UPDATE_INTERVAL = 1 mA * 100 ms * CAPACITY_UPDATE_INTERVAL |
// = 1mA * 0.1s * CAPACITY_UPDATE_INTERVAL = 1mA * 1min / (600 / CAPACITY_UPDATE_INTERVAL) |
// = 1mAh / (36000 / CAPACITY_UPDATE_INTERVAL) |
#define SUB_COUNTER_LIMIT (36000 / CAPACITY_UPDATE_INTERVAL) |
if(SubCounter > SUB_COUNTER_LIMIT) |
{ |
Capacity.UsedCapacity++; // we have one mAh more |
SubCounter -= SUB_COUNTER_LIMIT; // keep the remaining sub part |
} |
} // EOF check delay update timer |
} |
/branches/v0.80d-Arthur-P/capacity.h |
---|
0,0 → 1,18 |
#ifndef _CAPACITY_H |
#define _CAPACITY_H |
typedef struct |
{ |
unsigned short ActualCurrent; // in 0.1A Steps |
unsigned short ActualPower; // in 0.1W |
unsigned short UsedCapacity; // in mAh |
unsigned char MinOfMaxPWM; // BL Power Limit |
} __attribute__((packed)) Capacity_t; |
extern Capacity_t Capacity; |
void Capacity_Init(void); |
void Capacity_Update(void); |
#endif //_CAPACITY_H |
/branches/v0.80d-Arthur-P/debug.c |
---|
0,0 → 1,48 |
#include "main.h" |
#include "debug.h" |
#ifdef DEBUG // only include functions if DEBUG is defined in main.h |
#warning : "### DEBUG-Funktion aktiv ###" |
unsigned char Debug_BufPtr = 0; |
struct str_Debug tDebug; |
unsigned char SendDebugOutput = 0; |
// function called from _printf_P to output character |
void Debug_Putchar(char c) |
{ |
if (!SendDebugOutput) |
{ |
tDebug.Text[Debug_BufPtr++] = c; // copy character to buffer |
if (Debug_BufPtr > 30) Debug_BufPtr = 30; // avoid buffer overflow |
} |
} |
void DebugSend(unsigned char cmd) |
{ |
if (!SendDebugOutput) |
{ |
tDebug.Cmd = cmd; |
tDebug.Text[Debug_BufPtr] = '\0'; // end of text marker |
Debug_BufPtr = 0; // set bufferindex to 0 |
SendDebugOutput = 1; // set flag to trasmit data the next time in serial transmit function |
} |
} |
#endif |
/* |
add the following code block to the serial transmit function |
#ifdef DEBUG // only include functions if DEBUG is defined |
if(SendDebugOutput && UebertragungAbgeschlossen) |
{ |
SendOutData('0', FC_ADDRESS, 1, (unsigned char *) &tDebug, sizeof(tDebug)); |
SendDebugOutput = 0; |
} |
#endif |
*/ |
/branches/v0.80d-Arthur-P/debug.h |
---|
0,0 → 1,60 |
#ifndef _DEBUG_H |
#define _DEBUG_H |
// ---------------------------------------------- |
#define CMD_NONE 0x00 |
#define CMD_RAW_OUTPUT 0x01 |
#define CMD_ERROR_MSG 0x02 |
#define CMD_WARNING_MSG 0x04 |
#define CMD_GREEN_MSG 0x08 |
// debug console in MK-Tool can also handle ANSI ESC seq. |
#define ANSI_ATTRIBUTE_OFF "\033[0m" |
#define ANSI_BOLD "\033[1m" |
#define ANSI_UNDERSCORE "\033[4m" |
#define ANSI_BLINK "\033[5m" |
#define ANSI_INVERSE "\033[7m" |
#define ANSI_INVISIBLE "\033[8m" |
#define ANSI_COLOR_BLACK "\033[30m" |
#define ANSI_COLOR_RED "\033[31m" |
#define ANSI_COLOR_GREEN "\033[32m" |
#define ANSI_COLOR_YELLOW "\033[33m" |
#define ANSI_COLOR_BLUE "\033[34m" |
#define ANSI_COLOR_VIOLETT "\033[35m" |
#define ANSI_COLOR_KOBALTBLUE "\033[36m" |
#define ANSI_COLOR_WHITE "\033[37m" |
#define ANSI_CLEAR "\033[2J" |
#define ANSI_HOME "\033[H" |
// macros for easier use |
#ifdef DEBUG // only include functions if DEBUG is defined in main.h |
#define Debug(format, args...) { _printf_P(&Debug_Putchar, PSTR(format) , ## args); DebugSend(CMD_NONE); } |
#define Debug_Raw(format, args...) { _printf_P(&Debug_Putchar, PSTR(format) , ## args); DebugSend(CMD_RAW_OUTPUT); } |
#define Debug_Warning(format, args...) { _printf_P(&Debug_Putchar, PSTR(format) , ## args); DebugSend(CMD_WARNING_MSG); } |
#define Debug_Error(format, args...) { _printf_P(&Debug_Putchar, PSTR(format) , ## args); DebugSend(CMD_ERROR_MSG); } |
#define Debug_OK(format, args...) { _printf_P(&Debug_Putchar, PSTR(format) , ## args); DebugSend(CMD_GREEN_MSG); } |
struct str_Debug |
{ |
unsigned char Cmd; // bitcoded command |
char Text[32]; |
}; |
extern struct str_Debug tDebug; |
unsigned char SendDebugOutput; |
void Debug_Putchar(char c); |
void DebugSend(unsigned char cmd); |
#else // dummy macros (won't waste flash, if #DEBUG is disabled) |
#define Debug(format, args...) ; |
#define Debug_Raw(format, args...) ; |
#define Debug_Warning(format, args...) ; |
#define Debug_Error(format, args...) ; |
#define Debug_OK(format, args...) ; |
#endif |
// ---------------------------------------------- |
#endif |
/branches/v0.80d-Arthur-P/eeprom.c |
---|
0,0 → 1,715 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) Holger Buss, Ingo Busker |
// + Nur für den privaten Gebrauch |
// + porting the sources to other systems or using the software on other systems (except hardware from www.mikrokopter.de) is not allowed |
// + 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. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Contant Values |
// + 0-250 -> normale Values |
// + 251 -> Poti1 |
// + 252 -> Poti2 |
// + 253 -> Poti3 |
// + 254 -> Poti4 |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#ifndef EEMEM |
#define EEMEM __attribute__ ((section (".eeprom"))) |
#endif |
#include <avr/eeprom.h> |
#include <string.h> |
#include "eeprom.h" |
#include "uart.h" |
#include "led.h" |
#include "main.h" |
#include "fc.h" |
#include "twimaster.h" |
paramset_t EE_Parameter; |
MixerTable_t Mixer; |
uint8_t RequiredMotors; |
uint8_t RAM_Checksum(uint8_t* pBuffer, uint16_t len) |
{ |
uint8_t crc = 0xAA; |
uint16_t i; |
for(i=0; i<len; i++) |
{ |
crc += pBuffer[i]; |
} |
return crc; |
} |
uint8_t EEProm_Checksum(uint16_t EEAddr, uint16_t len) |
{ |
uint8_t crc = 0xAA; |
uint16_t off; |
for(off=0; off<len; off++) |
{ |
crc += eeprom_read_byte((uint8_t*)(EEAddr + off));; |
} |
return crc; |
} |
void ParamSet_DefaultStickMapping(void) |
{ |
EE_Parameter.Kanalbelegung[K_GAS] = 1; |
EE_Parameter.Kanalbelegung[K_ROLL] = 2; |
EE_Parameter.Kanalbelegung[K_NICK] = 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.Kanalbelegung[K_POTI5] = 9; |
EE_Parameter.Kanalbelegung[K_POTI6] = 10; |
EE_Parameter.Kanalbelegung[K_POTI7] = 11; |
EE_Parameter.Kanalbelegung[K_POTI8] = 12; |
} |
/***************************************************/ |
/* Default Values for parameter set 1 */ |
/***************************************************/ |
void ParamSet_DefaultSet1(void) // sport |
{ |
EE_Parameter.Revision = EEPARAM_REVISION; |
if(PlatinenVersion >= 20) |
{ |
EE_Parameter.Gyro_D = 10; |
EE_Parameter.Driftkomp = 0; |
EE_Parameter.GyroAccFaktor = 27; |
EE_Parameter.WinkelUmschlagNick = 78; |
EE_Parameter.WinkelUmschlagRoll = 78; |
} |
else |
{ |
EE_Parameter.Gyro_D = 3; |
EE_Parameter.Driftkomp = 32; |
EE_Parameter.GyroAccFaktor = 30; |
EE_Parameter.WinkelUmschlagNick = 85; |
EE_Parameter.WinkelUmschlagRoll = 85; |
} |
EE_Parameter.GlobalConfig = CFG_ACHSENKOPPLUNG_AKTIV | CFG_KOMPASS_AKTIV | CFG_GPS_AKTIV | CFG_HOEHEN_SCHALTER; |
EE_Parameter.ExtraConfig = CFG2_HEIGHT_LIMIT | CFG2_VARIO_BEEP;// | CFG_SENSITIVE_RC |
EE_Parameter.Hoehe_MinGas = 30; |
EE_Parameter.MaxHoehe = 255; // Wert : 0-247 255 -> Poti1 |
EE_Parameter.Hoehe_P = 15; // Wert : 0-32 |
EE_Parameter.Luftdruck_D = 30; // Wert : 0-247 |
EE_Parameter.Hoehe_ACC_Wirkung = 00; // Wert : 0-247 |
EE_Parameter.Hoehe_HoverBand = 8; // Wert : 0-247 |
EE_Parameter.Hoehe_GPS_Z = 64; // Wert : 0-247 |
EE_Parameter.Hoehe_StickNeutralPoint = 0; // Wert : 0-247 (0 = Hover-Estimation) |
EE_Parameter.Hoehe_Verstaerkung = 20; // Wert : 0-50 |
EE_Parameter.Stick_P = 14; // Wert : 1-20 |
EE_Parameter.Stick_D = 16; // Wert : 0-20 |
EE_Parameter.Gier_P = 12; // Wert : 1-20 |
EE_Parameter.Gas_Min = 8; // Wert : 0-32 |
EE_Parameter.Gas_Max = 230; // Wert : 33-247 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-247 |
EE_Parameter.Gyro_P = 80; // Wert : 0-247 |
EE_Parameter.Gyro_I = 150; // Wert : 0-247 |
EE_Parameter.Gyro_Gier_P = 80; // Wert : 0-247 |
EE_Parameter.Gyro_Gier_I = 150; // Wert : 0-247 |
EE_Parameter.Gyro_Stability = 6; // Wert : 1-8 |
EE_Parameter.UnterspannungsWarnung = 33; // Wert : 0-247 ( Automatische Zellenerkennung bei < 50) |
EE_Parameter.NotGas = 45; // Wert : 0-247 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 90; // Wert : 0-247 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.I_Faktor = 32; |
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.UserParam5 = 0; // zur freien Verwendung |
EE_Parameter.UserParam6 = 0; // zur freien Verwendung |
EE_Parameter.UserParam7 = 0; // zur freien Verwendung |
EE_Parameter.UserParam8 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-247 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-247 // Einfluss Gyro/Servo |
EE_Parameter.ServoCompInvert = 1; // Wert : 0-247 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 0; // Wert : 0-247 // Anschlag |
EE_Parameter.ServoNickMax = 247; // Wert : 0-247 // Anschlag |
EE_Parameter.ServoNickRefresh = 6; |
EE_Parameter.Servo3 = 125; |
EE_Parameter.Servo4 = 125; |
EE_Parameter.Servo5 = 125; |
EE_Parameter.ServoRollControl = 100; // Wert : 0-247 // Stellung des Servos |
EE_Parameter.ServoRollComp = 40; // Wert : 0-247 // Einfluss Gyro/Servo |
EE_Parameter.ServoRollMin = 0; // Wert : 0-247 // Anschlag |
EE_Parameter.ServoRollMax = 247; // Wert : 0-247 // Anschlag |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-247 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.BitConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
EE_Parameter.AchsKopplung1 = 90; |
EE_Parameter.AchsKopplung2 = 80; |
EE_Parameter.CouplingYawCorrection = 1; |
EE_Parameter.GyroAccAbgleich = 16; // 1/k; |
EE_Parameter.DynamicStability = 100; |
EE_Parameter.J16Bitmask = 95; |
EE_Parameter.J17Bitmask = 243; |
EE_Parameter.WARN_J16_Bitmask = 0xAA; |
EE_Parameter.WARN_J17_Bitmask = 0xAA; |
EE_Parameter.J16Timing = 15; |
EE_Parameter.J17Timing = 15; |
EE_Parameter.NaviGpsModeControl = 254; // 254 -> Poti 2 |
EE_Parameter.NaviGpsGain = 100; |
EE_Parameter.NaviGpsP = 90; |
EE_Parameter.NaviGpsI = 90; |
EE_Parameter.NaviGpsD = 90; |
EE_Parameter.NaviGpsPLimit = 75; |
EE_Parameter.NaviGpsILimit = 75; |
EE_Parameter.NaviGpsDLimit = 75; |
EE_Parameter.NaviGpsACC = 0; |
EE_Parameter.NaviGpsMinSat = 6; |
EE_Parameter.NaviStickThreshold = 8; |
EE_Parameter.NaviWindCorrection = 90; |
EE_Parameter.NaviSpeedCompensation = 30; |
EE_Parameter.NaviOperatingRadius = 100; |
EE_Parameter.NaviAngleLimitation = 100; |
EE_Parameter.NaviPH_LoginTime = 2; |
EE_Parameter.Receiver = RECEIVER_SPEKTRUM; |
EE_Parameter.OrientationAngle = 0; |
EE_Parameter.OrientationModeControl = 0; |
memcpy(EE_Parameter.Name, "Sport\0", 12); |
EE_Parameter.crc = RAM_Checksum((uint8_t*)(&EE_Parameter), sizeof(EE_Parameter)-1); |
} |
/***************************************************/ |
/* Default Values for parameter set 2 */ |
/***************************************************/ |
void ParamSet_DefaultSet2(void) // normal |
{ |
EE_Parameter.Revision = EEPARAM_REVISION; |
if(PlatinenVersion >= 20) |
{ |
EE_Parameter.Gyro_D = 10; |
EE_Parameter.Driftkomp = 0; |
EE_Parameter.GyroAccFaktor = 27; |
EE_Parameter.WinkelUmschlagNick = 78; |
EE_Parameter.WinkelUmschlagRoll = 78; |
} |
else |
{ |
EE_Parameter.Gyro_D = 3; |
EE_Parameter.Driftkomp = 32; |
EE_Parameter.GyroAccFaktor = 30; |
EE_Parameter.WinkelUmschlagNick = 85; |
EE_Parameter.WinkelUmschlagRoll = 85; |
} |
EE_Parameter.GlobalConfig = CFG_ACHSENKOPPLUNG_AKTIV | CFG_KOMPASS_AKTIV | CFG_GPS_AKTIV | CFG_HOEHEN_SCHALTER; |
EE_Parameter.ExtraConfig = CFG2_HEIGHT_LIMIT | CFG2_VARIO_BEEP;// CFG_SENSITIVE_RC |
EE_Parameter.Hoehe_MinGas = 30; |
EE_Parameter.MaxHoehe = 255; // Wert : 0-247 255 -> Poti1 |
EE_Parameter.Hoehe_P = 15; // Wert : 0-32 |
EE_Parameter.Luftdruck_D = 30; // Wert : 0-247 |
EE_Parameter.Hoehe_ACC_Wirkung = 0; // Wert : 0-247 |
EE_Parameter.Hoehe_HoverBand = 8; // Wert : 0-247 |
EE_Parameter.Hoehe_GPS_Z = 64; // Wert : 0-247 |
EE_Parameter.Hoehe_StickNeutralPoint = 0;// Wert : 0-247 (0 = Hover-Estimation) |
EE_Parameter.Hoehe_Verstaerkung = 15; // Wert : 0-50 |
EE_Parameter.Stick_P = 10; // Wert : 1-20 |
EE_Parameter.Stick_D = 16; // Wert : 0-20 |
EE_Parameter.Gier_P = 6; // Wert : 1-20 |
EE_Parameter.Gas_Min = 8; // Wert : 0-32 |
EE_Parameter.Gas_Max = 230; // Wert : 33-247 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-247 |
EE_Parameter.Gyro_P = 90; // Wert : 0-247 |
EE_Parameter.Gyro_I = 120; // Wert : 0-247 |
EE_Parameter.Gyro_Gier_P = 90; // Wert : 0-247 |
EE_Parameter.Gyro_Gier_I = 120; // Wert : 0-247 |
EE_Parameter.Gyro_Stability = 6; // Wert : 1-8 |
EE_Parameter.UnterspannungsWarnung = 33; // Wert : 0-247 ( Automatische Zellenerkennung bei < 50) |
EE_Parameter.NotGas = 45; // Wert : 0-247 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 90; // Wert : 0-247 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.I_Faktor = 32; |
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.UserParam5 = 0; // zur freien Verwendung |
EE_Parameter.UserParam6 = 0; // zur freien Verwendung |
EE_Parameter.UserParam7 = 0; // zur freien Verwendung |
EE_Parameter.UserParam8 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-247 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-247 // Einfluss Gyro/Servo |
EE_Parameter.ServoCompInvert = 1; // Wert : 0-247 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 0; // Wert : 0-247 // Anschlag |
EE_Parameter.ServoNickMax = 247; // Wert : 0-247 // Anschlag |
EE_Parameter.ServoNickRefresh = 6; |
EE_Parameter.Servo3 = 125; |
EE_Parameter.Servo4 = 125; |
EE_Parameter.Servo5 = 125; |
EE_Parameter.ServoRollControl = 100; // Wert : 0-247 // Stellung des Servos |
EE_Parameter.ServoRollComp = 40; // Wert : 0-247 // Einfluss Gyro/Servo |
EE_Parameter.ServoRollMin = 0; // Wert : 0-247 // Anschlag |
EE_Parameter.ServoRollMax = 247; // Wert : 0-247 // Anschlag |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-247 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.BitConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts |
EE_Parameter.AchsKopplung1 = 90; |
EE_Parameter.AchsKopplung2 = 80; |
EE_Parameter.CouplingYawCorrection = 60; |
EE_Parameter.GyroAccAbgleich = 32; // 1/k |
EE_Parameter.DynamicStability = 75; |
EE_Parameter.J16Bitmask = 95; |
EE_Parameter.J17Bitmask = 243; |
EE_Parameter.WARN_J16_Bitmask = 0xAA; |
EE_Parameter.WARN_J17_Bitmask = 0xAA; |
EE_Parameter.J16Timing = 20; |
EE_Parameter.J17Timing = 20; |
EE_Parameter.NaviGpsModeControl = 254; // 254 -> Poti 2 |
EE_Parameter.NaviGpsGain = 100; |
EE_Parameter.NaviGpsP = 90; |
EE_Parameter.NaviGpsI = 90; |
EE_Parameter.NaviGpsD = 90; |
EE_Parameter.NaviGpsPLimit = 75; |
EE_Parameter.NaviGpsILimit = 75; |
EE_Parameter.NaviGpsDLimit = 75; |
EE_Parameter.NaviGpsACC = 0; |
EE_Parameter.NaviGpsMinSat = 6; |
EE_Parameter.NaviStickThreshold = 8; |
EE_Parameter.NaviWindCorrection = 90; |
EE_Parameter.NaviSpeedCompensation = 30; |
EE_Parameter.NaviOperatingRadius = 100; |
EE_Parameter.NaviAngleLimitation = 100; |
EE_Parameter.NaviPH_LoginTime = 2; |
EE_Parameter.Receiver = RECEIVER_SPEKTRUM; |
EE_Parameter.OrientationAngle = 0; |
EE_Parameter.OrientationModeControl = 0; |
memcpy(EE_Parameter.Name, "Normal\0", 12); |
EE_Parameter.crc = RAM_Checksum((uint8_t*)(&EE_Parameter), sizeof(EE_Parameter)-1); |
} |
/***************************************************/ |
/* Default Values for parameter set 3 */ |
/***************************************************/ |
void ParamSet_DefaultSet3(void) // beginner |
{ |
EE_Parameter.Revision = EEPARAM_REVISION; |
if(PlatinenVersion >= 20) |
{ |
EE_Parameter.Gyro_D = 10; |
EE_Parameter.Driftkomp = 0; |
EE_Parameter.GyroAccFaktor = 27; |
EE_Parameter.WinkelUmschlagNick = 78; |
EE_Parameter.WinkelUmschlagRoll = 78; |
} |
else |
{ |
EE_Parameter.Gyro_D = 3; |
EE_Parameter.Driftkomp = 32; |
EE_Parameter.GyroAccFaktor = 30; |
EE_Parameter.WinkelUmschlagNick = 85; |
EE_Parameter.WinkelUmschlagRoll = 85; |
} |
EE_Parameter.GlobalConfig = /*CFG_DREHRATEN_BEGRENZER |*/ CFG_ACHSENKOPPLUNG_AKTIV | CFG_KOMPASS_AKTIV | CFG_GPS_AKTIV | CFG_HOEHEN_SCHALTER; |
EE_Parameter.ExtraConfig = CFG2_HEIGHT_LIMIT | CFG2_VARIO_BEEP;// | CFG_SENSITIVE_RC |
EE_Parameter.Hoehe_MinGas = 30; |
EE_Parameter.MaxHoehe = 255; // Wert : 0-247 255 -> Poti1 |
EE_Parameter.Hoehe_P = 15; // Wert : 0-32 |
EE_Parameter.Luftdruck_D = 30; // Wert : 0-247 |
EE_Parameter.Hoehe_ACC_Wirkung = 0; // Wert : 0-247 |
EE_Parameter.Hoehe_HoverBand = 8; // Wert : 0-247 |
EE_Parameter.Hoehe_GPS_Z = 64; // Wert : 0-247 |
EE_Parameter.Hoehe_StickNeutralPoint = 0;// Wert : 0-247 (0 = Hover-Estimation) |
EE_Parameter.Hoehe_Verstaerkung = 15; // Wert : 0-50 |
EE_Parameter.Stick_P = 8; // Wert : 1-20 |
EE_Parameter.Stick_D = 16; // Wert : 0-20 |
EE_Parameter.Gier_P = 6; // Wert : 1-20 |
EE_Parameter.Gas_Min = 8; // Wert : 0-32 |
EE_Parameter.Gas_Max = 230; // Wert : 33-247 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-247 |
EE_Parameter.Gyro_P = 100; // Wert : 0-247 |
EE_Parameter.Gyro_I = 120; // Wert : 0-247 |
EE_Parameter.Gyro_Gier_P = 100; // Wert : 0-247 |
EE_Parameter.Gyro_Gier_I = 120; // Wert : 0-247 |
EE_Parameter.Gyro_Stability = 6; // Wert : 1-8 |
EE_Parameter.UnterspannungsWarnung = 33; // Wert : 0-247 ( Automatische Zellenerkennung bei < 50) |
EE_Parameter.NotGas = 45; // Wert : 0-247 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 90; // Wert : 0-247 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.I_Faktor = 16; |
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.UserParam5 = 0; // zur freien Verwendung |
EE_Parameter.UserParam6 = 0; // zur freien Verwendung |
EE_Parameter.UserParam7 = 0; // zur freien Verwendung |
EE_Parameter.UserParam8 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-247 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-247 // Einfluss Gyro/Servo |
EE_Parameter.ServoCompInvert = 1; // Wert : 0-247 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 0; // Wert : 0-247 // Anschlag |
EE_Parameter.ServoNickMax = 247; // Wert : 0-247 // Anschlag |
EE_Parameter.ServoNickRefresh = 6; |
EE_Parameter.Servo3 = 125; |
EE_Parameter.Servo4 = 125; |
EE_Parameter.Servo5 = 125; |
EE_Parameter.ServoRollControl = 100; // Wert : 0-247 // Stellung des Servos |
EE_Parameter.ServoRollComp = 40; // Wert : 0-247 // Einfluss Gyro/Servo |
EE_Parameter.ServoRollMin = 0; // Wert : 0-247 // Anschlag |
EE_Parameter.ServoRollMax = 247; // Wert : 0-247 // Anschlag |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-247 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.BitConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts |
EE_Parameter.AchsKopplung1 = 90; |
EE_Parameter.AchsKopplung2 = 80; |
EE_Parameter.CouplingYawCorrection = 70; |
EE_Parameter.GyroAccAbgleich = 32; // 1/k |
EE_Parameter.DynamicStability = 70; |
EE_Parameter.J16Bitmask = 95; |
EE_Parameter.J17Bitmask = 243; |
EE_Parameter.WARN_J16_Bitmask = 0xAA; |
EE_Parameter.WARN_J17_Bitmask = 0xAA; |
EE_Parameter.J16Timing = 30; |
EE_Parameter.J17Timing = 30; |
EE_Parameter.NaviGpsModeControl = 254; // 254 -> Poti 2 |
EE_Parameter.NaviGpsGain = 100; |
EE_Parameter.NaviGpsP = 90; |
EE_Parameter.NaviGpsI = 90; |
EE_Parameter.NaviGpsD = 90; |
EE_Parameter.NaviGpsPLimit = 75; |
EE_Parameter.NaviGpsILimit = 75; |
EE_Parameter.NaviGpsDLimit = 75; |
EE_Parameter.NaviGpsACC = 0; |
EE_Parameter.NaviGpsMinSat = 6; |
EE_Parameter.NaviStickThreshold = 8; |
EE_Parameter.NaviWindCorrection = 90; |
EE_Parameter.NaviSpeedCompensation = 30; |
EE_Parameter.NaviOperatingRadius = 100; |
EE_Parameter.NaviAngleLimitation = 100; |
EE_Parameter.NaviPH_LoginTime = 2; |
EE_Parameter.Receiver = RECEIVER_SPEKTRUM; |
EE_Parameter.OrientationAngle = 0; |
EE_Parameter.OrientationModeControl = 0; |
memcpy(EE_Parameter.Name, "Beginner\0", 12); |
EE_Parameter.crc = RAM_Checksum((uint8_t*)(&EE_Parameter), sizeof(EE_Parameter)-1); |
} |
/***************************************************/ |
/* Read Parameter from EEPROM as byte */ |
/***************************************************/ |
uint8_t GetParamByte(uint16_t param_id) |
{ |
return eeprom_read_byte((uint8_t*)(EEPROM_ADR_PARAM_BEGIN + param_id)); |
} |
/***************************************************/ |
/* Write Parameter to EEPROM as byte */ |
/***************************************************/ |
void SetParamByte(uint16_t param_id, uint8_t value) |
{ |
eeprom_write_byte((uint8_t*)(EEPROM_ADR_PARAM_BEGIN + param_id), value); |
} |
/***************************************************/ |
/* Read Parameter from EEPROM as word */ |
/***************************************************/ |
uint16_t GetParamWord(uint16_t param_id) |
{ |
return eeprom_read_word((uint16_t *)(EEPROM_ADR_PARAM_BEGIN + param_id)); |
} |
/***************************************************/ |
/* Write Parameter to EEPROM as word */ |
/***************************************************/ |
void SetParamWord(uint16_t param_id, uint16_t value) |
{ |
eeprom_write_word((uint16_t*)(EEPROM_ADR_PARAM_BEGIN + param_id), value); |
} |
/***************************************************/ |
/* Read Parameter Set from EEPROM */ |
/***************************************************/ |
// number [1..5] |
uint8_t ParamSet_ReadFromEEProm(uint8_t setnumber) |
{ |
uint8_t crc; |
uint16_t eeaddr; |
// range the setnumber |
if((1 > setnumber) || (setnumber > 5)) setnumber = 3; |
// calculate eeprom addr |
eeaddr = EEPROM_ADR_PARAMSET + PARAMSET_STRUCT_LEN * (setnumber - 1); |
// calculate checksum from eeprom |
crc = EEProm_Checksum(eeaddr, PARAMSET_STRUCT_LEN - 1); |
// check crc |
if(crc != eeprom_read_byte((uint8_t*)(eeaddr + PARAMSET_STRUCT_LEN - 1))) return 0; |
// check revision |
if(eeprom_read_byte((uint8_t*)(eeaddr)) != EEPARAM_REVISION) return 0; |
// read paramset from eeprom |
eeprom_read_block((void *) &EE_Parameter, (void*)(EEPROM_ADR_PARAMSET + PARAMSET_STRUCT_LEN * (setnumber - 1)), PARAMSET_STRUCT_LEN); |
LED_Init(); |
return 1; |
} |
/***************************************************/ |
/* Write Parameter Set to EEPROM */ |
/***************************************************/ |
// number [1..5] |
uint8_t ParamSet_WriteToEEProm(uint8_t setnumber) |
{ |
uint8_t crc; |
if(EE_Parameter.Revision == EEPARAM_REVISION) // write only the right revision to eeprom |
{ |
if(setnumber > 5) setnumber = 5; |
if(setnumber < 1) return 0; |
// update checksum |
EE_Parameter.crc = RAM_Checksum((uint8_t*)(&EE_Parameter), sizeof(EE_Parameter)-1); |
// write paramset to eeprom |
eeprom_write_block((void *) &EE_Parameter, (void*)(EEPROM_ADR_PARAMSET + PARAMSET_STRUCT_LEN * (setnumber - 1)), PARAMSET_STRUCT_LEN); |
// backup channel settings to separate block in eeprom |
eeprom_write_block( (void*)(EE_Parameter.Kanalbelegung), (void*)(EEPROM_ADR_CHANNELS), sizeof(EE_Parameter.Kanalbelegung)); |
// write crc of channel block to eeprom |
crc = RAM_Checksum((uint8_t*)(EE_Parameter.Kanalbelegung), sizeof(EE_Parameter.Kanalbelegung)); |
eeprom_write_byte((uint8_t*)(EEPROM_ADR_CHANNELS + sizeof(EE_Parameter.Kanalbelegung)), crc); |
// update active settings number |
SetActiveParamSet(setnumber); |
LED_Init(); |
return 1; |
} |
// wrong revision |
return 0; |
} |
/***************************************************/ |
/* Read MixerTable from EEPROM */ |
/***************************************************/ |
uint8_t MixerTable_ReadFromEEProm(void) |
{ |
uint8_t crc; |
// calculate checksum in eeprom |
crc = EEProm_Checksum(EEPROM_ADR_MIXERTABLE, sizeof(Mixer) - 1); |
// check crc |
if( crc != eeprom_read_byte((uint8_t*)(EEPROM_ADR_MIXERTABLE + sizeof(Mixer) - 1)) ) return 0; |
// check revision |
if(eeprom_read_byte((uint8_t*)(EEPROM_ADR_MIXERTABLE)) != EEMIXER_REVISION) return 0; |
// read mixer table |
eeprom_read_block((void *) &Mixer, (void*)(EEPROM_ADR_MIXERTABLE), sizeof(Mixer)); |
return 1; |
} |
/***************************************************/ |
/* Write Mixer Table to EEPROM */ |
/***************************************************/ |
uint8_t MixerTable_WriteToEEProm(void) |
{ |
if(Mixer.Revision == EEMIXER_REVISION) |
{ |
// update crc |
Mixer.crc = RAM_Checksum((uint8_t*)(&Mixer), sizeof(Mixer) - 1); |
// write to eeprom |
eeprom_write_block((void *) &Mixer, (void*)(EEPROM_ADR_MIXERTABLE), sizeof(Mixer)); |
return 1; |
} |
else return 0; |
} |
/***************************************************/ |
/* Default Values for Mixer Table */ |
/***************************************************/ |
void MixerTable_Default(void) // Quadro |
{ |
uint8_t i; |
Mixer.Revision = EEMIXER_REVISION; |
// clear mixer table |
for(i = 0; i < 16; i++) |
{ |
Mixer.Motor[i][MIX_GAS] = 0; |
Mixer.Motor[i][MIX_NICK] = 0; |
Mixer.Motor[i][MIX_ROLL] = 0; |
Mixer.Motor[i][MIX_YAW] = 0; |
} |
// default = Quadro |
Mixer.Motor[0][MIX_GAS] = 64; Mixer.Motor[0][MIX_NICK] = +64; Mixer.Motor[0][MIX_ROLL] = 0; Mixer.Motor[0][MIX_YAW] = +64; |
Mixer.Motor[1][MIX_GAS] = 64; Mixer.Motor[1][MIX_NICK] = -64; Mixer.Motor[1][MIX_ROLL] = 0; Mixer.Motor[1][MIX_YAW] = +64; |
Mixer.Motor[2][MIX_GAS] = 64; Mixer.Motor[2][MIX_NICK] = 0; Mixer.Motor[2][MIX_ROLL] = -64; Mixer.Motor[2][MIX_YAW] = -64; |
Mixer.Motor[3][MIX_GAS] = 64; Mixer.Motor[3][MIX_NICK] = 0; Mixer.Motor[3][MIX_ROLL] = +64; Mixer.Motor[3][MIX_YAW] = -64; |
memcpy(Mixer.Name, "Quadro\0", 7); |
Mixer.crc = Mixer.crc = RAM_Checksum((uint8_t*)(&Mixer), sizeof(Mixer) - 1); |
} |
/***************************************************/ |
/* Get active parameter set */ |
/***************************************************/ |
uint8_t GetActiveParamSet(void) |
{ |
uint8_t setnumber; |
setnumber = eeprom_read_byte((uint8_t*)(EEPROM_ADR_PARAM_BEGIN + PID_ACTIVE_SET)); |
if(setnumber > 5) |
{ |
setnumber = 3; |
eeprom_write_byte((void*)(EEPROM_ADR_PARAM_BEGIN+PID_ACTIVE_SET), setnumber); |
} |
return(setnumber); |
} |
/***************************************************/ |
/* Set active parameter set */ |
/***************************************************/ |
void SetActiveParamSet(uint8_t setnumber) |
{ |
if(setnumber > 5) setnumber = 5; |
if(setnumber < 1) setnumber = 1; |
eeprom_write_byte((uint8_t*)(EEPROM_ADR_PARAM_BEGIN + PID_ACTIVE_SET), setnumber); |
} |
/***************************************************/ |
/* Initialize EEPROM Parameter Sets */ |
/***************************************************/ |
void ParamSet_Init(void) |
{ |
uint8_t channel_backup = 0, bad_params = 0, ee_default = 0,i; |
if(EEPARAM_REVISION != GetParamByte(PID_EE_REVISION) ) |
{ |
ee_default = 1; // software update or forced by mktool |
SetParamByte(PID_EE_REVISION, EEPARAM_REVISION); |
} |
// 1st check for a valid channel backup in eeprom |
i = EEProm_Checksum(EEPROM_ADR_CHANNELS, sizeof(EE_Parameter.Kanalbelegung)); |
if(i == eeprom_read_byte((uint8_t*)(EEPROM_ADR_CHANNELS + sizeof(EE_Parameter.Kanalbelegung))) ) channel_backup = 1; |
// parameter check |
// check all 5 parameter settings |
for (i = 1;i < 6; i++) |
{ |
if(ee_default || !ParamSet_ReadFromEEProm(i)) // could not read paramset from eeprom |
{ |
bad_params = 1; |
printf("\n\rGenerating default Parameter Set %d",i); |
switch(i) |
{ |
case 1: |
ParamSet_DefaultSet1(); // Fill ParamSet Structure to default parameter set 1 (Sport) |
break; |
case 2: |
ParamSet_DefaultSet2(); // Kamera |
break; |
case 3: |
ParamSet_DefaultSet3(); // Beginner |
break; |
default: |
ParamSet_DefaultSet3(); // Kamera |
break; |
} |
if(channel_backup) // if we have an channel mapping backup in eeprom |
{ // restore it from eeprom |
eeprom_read_block((void *)EE_Parameter.Kanalbelegung, (void*)(EEPROM_ADR_CHANNELS), sizeof(EE_Parameter.Kanalbelegung)); |
} |
else |
{ // use default mapping |
ParamSet_DefaultStickMapping(); |
} |
ParamSet_WriteToEEProm(i); |
} |
} |
if(bad_params) // at least one of the parameter settings were invalid |
{ |
// default-Setting is parameter set 3 |
SetActiveParamSet(3); |
} |
// read active parameter set to ParamSet stucture |
i = GetActiveParamSet(); |
ParamSet_ReadFromEEProm(i); |
printf("\n\rUsing Parameter Set %d", i); |
// load mixer table |
if(ee_default || !MixerTable_ReadFromEEProm() ) |
{ |
printf("\n\rGenerating default Mixer Table"); |
MixerTable_Default(); // Quadro |
MixerTable_WriteToEEProm(); |
} |
// determine motornumber |
RequiredMotors = 0; |
for(i = 0; i < 16; i++) |
{ |
if(Mixer.Motor[i][MIX_GAS] > 0) RequiredMotors++; |
} |
printf("\n\rMixer-Config: '%s' (%u Motors)",Mixer.Name, RequiredMotors); |
printf("\n\r=============================="); |
} |
/branches/v0.80d-Arthur-P/eeprom.h |
---|
0,0 → 1,238 |
#ifndef _EEPROM_H |
#define _EEPROM_H |
#include <inttypes.h> |
#include "twimaster.h" |
#define EEPARAM_REVISION 84 // is count up, if paramater stucture has changed (compatibility) |
#define EEMIXER_REVISION 1 // is count up, if mixer stucture has changed (compatibility) |
#define EEPROM_ADR_PARAM_BEGIN 0 |
#define PID_EE_REVISION 1 // byte |
#define PID_ACTIVE_SET 2 // byte |
#define PID_PRESSURE_OFFSET 3 // byte |
#define PID_ACC_NICK 4 // word |
#define PID_ACC_ROLL 6 // word |
#define PID_ACC_TOP 8 // word |
#define PID_FLIGHT_MINUTES_TOTAL 10 // word |
#define PID_FLIGHT_MINUTES 14 // word |
#define EEPROM_ADR_CHANNELS 80 // 80 - 93, 12 bytes + 1 byte crc |
#define EEPROM_ADR_PARAMSET 100 // 100 - 650, 5 * 110 bytes |
#define EEPROM_ADR_MIXERTABLE 1000 // 1000 - 1078, 78 bytes |
#define EEPROM_ADR_BLCONFIG 1200 // 1200 - 1296, 12 * 8 bytes |
#define MIX_GAS 0 |
#define MIX_NICK 1 |
#define MIX_ROLL 2 |
#define MIX_YAW 3 |
typedef struct |
{ |
uint8_t Revision; |
int8_t Name[12]; |
int8_t Motor[16][4]; |
uint8_t crc; |
} __attribute__((packed)) MixerTable_t; |
extern MixerTable_t Mixer; |
extern uint8_t RequiredMotors; |
#define CFG_HOEHENREGELUNG 0x01 |
#define CFG_HOEHEN_SCHALTER 0x02 |
#define CFG_HEADING_HOLD 0x04 |
#define CFG_KOMPASS_AKTIV 0x08 |
#define CFG_KOMPASS_FIX 0x10 |
#define CFG_GPS_AKTIV 0x20 |
#define CFG_ACHSENKOPPLUNG_AKTIV 0x40 |
#define CFG_DREHRATEN_BEGRENZER 0x80 |
#define CFG_LOOP_OBEN 0x01 |
#define CFG_LOOP_UNTEN 0x02 |
#define CFG_LOOP_LINKS 0x04 |
#define CFG_LOOP_RECHTS 0x08 |
#define CFG_MOTOR_BLINK 0x10 |
#define CFG_MOTOR_OFF_LED1 0x20 |
#define CFG_MOTOR_OFF_LED2 0x40 |
#define CFG_RES4 0x80 |
#define CFG2_HEIGHT_LIMIT 0x01 |
#define CFG2_VARIO_BEEP 0x02 |
#define CFG_SENSITIVE_RC 0x04 |
// bit mask for ParamSet.Config0 |
#define CFG0_AIRPRESS_SENSOR 0x01 |
#define CFG0_HEIGHT_SWITCH 0x02 |
#define CFG0_HEADING_HOLD 0x04 |
#define CFG0_COMPASS_ACTIVE 0x08 |
#define CFG0_COMPASS_FIX 0x10 |
#define CFG0_GPS_ACTIVE 0x20 |
#define CFG0_AXIS_COUPLING_ACTIVE 0x40 |
#define CFG0_ROTARY_RATE_LIMITER 0x80 |
// defines for the receiver selection |
#define RECEIVER_PPM 0 |
#define RECEIVER_SPEKTRUM 1 |
#define RECEIVER_SPEKTRUM_HI_RES 2 |
#define RECEIVER_SPEKTRUM_LOW_RES 3 |
#define RECEIVER_JETI 4 |
#define RECEIVER_ACT_DSL 5 |
#define RECEIVER_UNKNOWN 0xFF |
// defines for lookup ParamSet.ChannelAssignment |
#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 |
#define K_POTI5 8 |
#define K_POTI6 9 |
#define K_POTI7 10 |
#define K_POTI8 11 |
// values above 247 representing poti1 to poti8 |
// poti1 = 255 |
// poti2 = 254 |
// poti3 = 253 |
// poti4 = 252 |
// poti5 = 251 |
// poti6 = 250 |
// poti7 = 249 |
// poti8 = 248 |
typedef struct |
{ |
unsigned char Revision; |
unsigned char Kanalbelegung[12]; // 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 Hoehe_HoverBand; // Wert : 0-250 |
unsigned char Hoehe_GPS_Z; // Wert : 0-250 |
unsigned char Hoehe_StickNeutralPoint;// 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 Gyro_D; // Wert : 0-250 |
unsigned char Gyro_Gier_P; // Wert : 10-250 |
unsigned char Gyro_Gier_I; // Wert : 0-250 |
unsigned char Gyro_Stability; // Wert : 0-16 |
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 Receiver; // 0= Summensignal, 1= Spektrum, 2 =Jeti, 3=ACT DSL, 4=ACT S3D |
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 |
//--- Seit V0.75 |
unsigned char ServoRollControl; // Wert : 0-250 // Stellung des Servos |
unsigned char ServoRollComp; // Wert : 0-250 |
unsigned char ServoRollMin; // Wert : 0-250 |
unsigned char ServoRollMax; // Wert : 0-250 |
//--- |
unsigned char ServoNickRefresh; // Speed of the Servo |
unsigned char Servo3; // Value or mapping of the Servo Output |
unsigned char Servo4; // Value or mapping of the Servo Output |
unsigned char Servo5; // Value or mapping of the Servo Output |
unsigned char LoopGasLimit; // Wert: 0-250 max. Gas während Looping |
unsigned char LoopThreshold; // Wert: 0-250 Schwelle für Stickausschlag |
unsigned char LoopHysterese; // Wert: 0-250 Hysterese für Stickausschlag |
unsigned char AchsKopplung1; // Wert: 0-250 Faktor, mit dem Gier die Achsen Roll und Nick koppelt (NickRollMitkopplung) |
unsigned char AchsKopplung2; // Wert: 0-250 Faktor, mit dem Nick und Roll verkoppelt werden |
unsigned char CouplingYawCorrection; // Wert: 0-250 Faktor, mit dem Nick und Roll verkoppelt werden |
unsigned char WinkelUmschlagNick; // Wert: 0-250 180°-Punkt |
unsigned char WinkelUmschlagRoll; // Wert: 0-250 180°-Punkt |
unsigned char GyroAccAbgleich; // 1/k (Koppel_ACC_Wirkung) |
unsigned char Driftkomp; |
unsigned char DynamicStability; |
unsigned char UserParam5; // Wert : 0-250 |
unsigned char UserParam6; // Wert : 0-250 |
unsigned char UserParam7; // Wert : 0-250 |
unsigned char UserParam8; // Wert : 0-250 |
//---Output --------------------------------------------- |
unsigned char J16Bitmask; // for the J16 Output |
unsigned char J16Timing; // for the J16 Output |
unsigned char J17Bitmask; // for the J17 Output |
unsigned char J17Timing; // for the J17 Output |
// seit version V0.75c |
unsigned char WARN_J16_Bitmask; // for the J16 Output |
unsigned char WARN_J17_Bitmask; // for the J17 Output |
//---NaviCtrl--------------------------------------------- |
unsigned char NaviGpsModeControl; // Parameters for the Naviboard |
unsigned char NaviGpsGain; |
unsigned char NaviGpsP; |
unsigned char NaviGpsI; |
unsigned char NaviGpsD; |
unsigned char NaviGpsPLimit; |
unsigned char NaviGpsILimit; |
unsigned char NaviGpsDLimit; |
unsigned char NaviGpsACC; |
unsigned char NaviGpsMinSat; |
unsigned char NaviStickThreshold; |
unsigned char NaviWindCorrection; |
unsigned char NaviSpeedCompensation; |
unsigned char NaviOperatingRadius; |
unsigned char NaviAngleLimitation; |
unsigned char NaviPH_LoginTime; |
//---Ext.Ctrl--------------------------------------------- |
unsigned char ExternalControl; // for serial Control |
//---CareFree--------------------------------------------- |
unsigned char OrientationAngle; // Where is the front-direction? |
unsigned char OrientationModeControl; // switch for CareFree |
//------------------------------------------------ |
unsigned char BitConfig; // (war Loop-Cfg) Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
unsigned char ServoCompInvert; // // 0x01 = Nick, 0x02 = Roll 0 oder 1 // WICHTIG!!! am Ende lassen |
unsigned char ExtraConfig; // bitcodiert |
char Name[12]; |
unsigned char crc; // must be the last byte! |
} paramset_t; |
#define PARAMSET_STRUCT_LEN sizeof(paramset_t) |
extern paramset_t EE_Parameter; |
extern uint8_t RAM_Checksum(uint8_t* pBuffer, uint16_t len); |
extern void ParamSet_Init(void); |
extern uint8_t ParamSet_ReadFromEEProm(uint8_t setnumber); |
extern uint8_t ParamSet_WriteToEEProm(uint8_t setnumber); |
extern uint8_t GetActiveParamSet(void); |
extern void SetActiveParamSet(uint8_t setnumber); |
extern uint8_t MixerTable_ReadFromEEProm(void); |
extern uint8_t MixerTable_WriteToEEProm(void); |
extern uint8_t GetParamByte(uint16_t param_id); |
extern void SetParamByte(uint16_t param_id, uint8_t value); |
extern uint16_t GetParamWord(uint16_t param_id); |
extern void SetParamWord(uint16_t param_id, uint16_t value); |
#endif //_EEPROM_H |
/branches/v0.80d-Arthur-P/fc.c |
---|
0,0 → 1,1707 |
/*####################################################################################### |
Flight Control |
#######################################################################################*/ |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) Holger Buss, Ingo Busker |
// + Nur für den privaten Gebrauch / NON-COMMERCIAL USE ONLY |
// + 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 oder Nutzung 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 the sources to other systems or using the software on other systems (except 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" |
#include "mymath.h" |
#include "isqrt.h" |
unsigned char h,m,s; |
unsigned int BaroExpandActive = 0; |
int MesswertNick,MesswertRoll,MesswertGier,MesswertGierBias, RohMesswertNick,RohMesswertRoll; |
int TrimNick, TrimRoll; |
int AdNeutralNick = 0,AdNeutralRoll = 0,AdNeutralGier = 0,StartNeutralRoll = 0,StartNeutralNick = 0; |
int Mittelwert_AccNick, Mittelwert_AccRoll; |
unsigned int NeutralAccX=0, NeutralAccY=0; |
int NaviAccNick, NaviAccRoll,NaviCntAcc = 0; |
int NeutralAccZ = 0; |
unsigned char ControlHeading = 0;// in 2° |
long IntegralNick = 0,IntegralNick2 = 0; |
long IntegralRoll = 0,IntegralRoll2 = 0; |
long IntegralAccNick = 0,IntegralAccRoll = 0,IntegralAccZ = 0; |
long Integral_Gier = 0; |
long Mess_IntegralNick = 0,Mess_IntegralNick2 = 0; |
long Mess_IntegralRoll = 0,Mess_IntegralRoll2 = 0; |
long Mess_Integral_Gier = 0,Mess_Integral_Gier2 = 0; |
long MittelIntegralNick,MittelIntegralRoll,MittelIntegralNick2,MittelIntegralRoll2; |
long SummeNick=0,SummeRoll=0; |
volatile long Mess_Integral_Hoch = 0; |
int KompassValue = 0; |
int KompassStartwert = 0; |
int KompassRichtung = 0; |
unsigned int KompassSignalSchlecht = 500; |
unsigned char MAX_GAS,MIN_GAS; |
unsigned char HoehenReglerAktiv = 0; |
unsigned char TrichterFlug = 0; |
long Umschlag180Nick = 250000L, Umschlag180Roll = 250000L; |
long ErsatzKompass; |
int ErsatzKompassInGrad; // Kompasswert in Grad |
int GierGyroFehler = 0; |
char GyroFaktor,GyroFaktorGier; |
char IntegralFaktor,IntegralFaktorGier; |
int DiffNick,DiffRoll; |
//int Poti1 = 0, Poti2 = 0, Poti3 = 0, Poti4 = 0, Poti5 = 0, Poti6 = 0, Poti7 = 0, Poti8 = 0; |
unsigned char Poti[9] = {0,0,0,0,0,0,0,0}; |
volatile unsigned char SenderOkay = 0; |
int StickNick = 0,StickRoll = 0,StickGier = 0,StickGas = 0; |
char MotorenEin = 0,StartTrigger = 0; |
long HoehenWert = 0; |
long SollHoehe = 0; |
int LageKorrekturRoll = 0,LageKorrekturNick = 0, HoverGas = 0; |
//float Ki = FAKTOR_I; |
int Ki = 10300 / 33; |
unsigned char Looping_Nick = 0,Looping_Roll = 0; |
unsigned char Looping_Links = 0, Looping_Rechts = 0, Looping_Unten = 0, Looping_Oben = 0; |
unsigned char Parameter_Luftdruck_D = 48; // Wert : 0-250 |
unsigned char Parameter_MaxHoehe = 251; // Wert : 0-250 |
unsigned char Parameter_Hoehe_P = 16; // Wert : 0-32 |
unsigned char Parameter_Hoehe_ACC_Wirkung = 58; // Wert : 0-250 |
unsigned char Parameter_KompassWirkung = 64; // Wert : 0-250 |
unsigned char Parameter_Hoehe_GPS_Z = 64; // Wert : 0-250 |
unsigned char Parameter_Gyro_D = 8; // Wert : 0-250 |
unsigned char Parameter_Gyro_P = 150; // Wert : 10-250 |
unsigned char Parameter_Gyro_I = 150; // Wert : 0-250 |
unsigned char Parameter_Gyro_Gier_P = 150; // Wert : 10-250 |
unsigned char Parameter_Gyro_Gier_I = 150; // Wert : 10-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_UserParam5 = 0; |
unsigned char Parameter_UserParam6 = 0; |
unsigned char Parameter_UserParam7 = 0; |
unsigned char Parameter_UserParam8 = 0; |
unsigned char Parameter_ServoNickControl = 100; |
unsigned char Parameter_ServoRollControl = 100; |
unsigned char Parameter_LoopGasLimit = 70; |
unsigned char Parameter_AchsKopplung1 = 90; |
unsigned char Parameter_AchsKopplung2 = 65; |
unsigned char Parameter_CouplingYawCorrection = 64; |
//unsigned char Parameter_AchsGegenKopplung1 = 0; |
unsigned char Parameter_DynamicStability = 100; |
unsigned char Parameter_J16Bitmask; // for the J16 Output |
unsigned char Parameter_J16Timing; // for the J16 Output |
unsigned char Parameter_J17Bitmask; // for the J17 Output |
unsigned char Parameter_J17Timing; // for the J17 Output |
unsigned char Parameter_NaviGpsModeControl; // Parameters for the Naviboard |
unsigned char Parameter_NaviGpsGain; |
unsigned char Parameter_NaviGpsP; |
unsigned char Parameter_NaviGpsI; |
unsigned char Parameter_NaviGpsD; |
unsigned char Parameter_NaviGpsACC; |
unsigned char Parameter_NaviOperatingRadius; |
unsigned char Parameter_NaviWindCorrection; |
unsigned char Parameter_NaviSpeedCompensation; |
unsigned char Parameter_ExternalControl; |
unsigned char Parameter_Servo3,Parameter_Servo4,Parameter_Servo5; |
unsigned char CareFree = 0; |
signed int ExternStickNick = 0,ExternStickRoll = 0,ExternStickGier = 0, ExternHoehenValue = -20; |
int MaxStickNick = 0,MaxStickRoll = 0; |
unsigned int modell_fliegt = 0; |
volatile unsigned char FCFlags = 0; |
long GIER_GRAD_FAKTOR = 1291; |
signed int KopplungsteilNickRoll,KopplungsteilRollNick; |
signed int tmp_motorwert[MAX_MOTORS]; |
char VarioCharacter = ' '; |
#define LIMIT_MIN(value, min) {if(value <= min) value = min;} |
#define LIMIT_MAX(value, max) {if(value >= max) value = max;} |
#define LIMIT_MIN_MAX(value, min, max) {if(value <= min) value = min; else if(value >= max) value = max;} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Debugwerte zuordnen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
void CopyDebugValues(void) |
{ |
DebugOut.Analog[0] = IntegralNick / (EE_Parameter.GyroAccFaktor * 4); |
DebugOut.Analog[1] = IntegralRoll / (EE_Parameter.GyroAccFaktor * 4); |
DebugOut.Analog[2] = Mittelwert_AccNick / 4; |
DebugOut.Analog[3] = Mittelwert_AccRoll / 4; |
DebugOut.Analog[4] = (signed int) AdNeutralGier - AdWertGier; |
DebugOut.Analog[5] = HoehenWert/5; |
DebugOut.Analog[6] = AdWertAccHoch;//(Mess_Integral_Hoch / 512);// Aktuell_az; |
DebugOut.Analog[8] = KompassValue; |
DebugOut.Analog[9] = UBat; |
DebugOut.Analog[10] = SenderOkay; |
DebugOut.Analog[11] = ErsatzKompass / GIER_GRAD_FAKTOR; |
DebugOut.Analog[12] = Motor[0].SetPoint; |
DebugOut.Analog[13] = Motor[1].SetPoint; |
DebugOut.Analog[14] = Motor[2].SetPoint; |
DebugOut.Analog[15] = Motor[3].SetPoint; |
DebugOut.Analog[20] = ServoNickValue; |
DebugOut.Analog[22] = Capacity.ActualCurrent; |
DebugOut.Analog[23] = Capacity.UsedCapacity; |
// DebugOut.Analog[22] = FromNaviCtrl_Value.GpsZ; |
// DebugOut.Analog[29] = FromNaviCtrl_Value.SerialDataOkay; |
DebugOut.Analog[29] = Capacity.MinOfMaxPWM; |
DebugOut.Analog[30] = GPS_Nick; |
DebugOut.Analog[31] = GPS_Roll; |
if(VersionInfo.HardwareError[0] || VersionInfo.HardwareError[1]) DebugOut.Status[1] |= 1; else DebugOut.Status[1] &= 0xfe; |
} |
void Piep(unsigned char Anzahl, unsigned int dauer) |
{ |
if(MotorenEin) return; //auf keinen Fall im Flug! |
while(Anzahl--) |
{ |
beeptime = dauer; |
while(beeptime); |
Delay_ms(dauer * 2); |
} |
} |
//############################################################################ |
// Messwerte beim Ermitteln der Nullage |
void CalibrierMittelwert(void) |
//############################################################################ |
{ |
unsigned char i; |
if(PlatinenVersion == 13) SucheGyroOffset(); |
// ADC auschalten, damit die Werte sich nicht während der Berechnung ändern |
ANALOG_OFF; |
MesswertNick = AdWertNick; |
MesswertRoll = AdWertRoll; |
MesswertGier = AdWertGier; |
Mittelwert_AccNick = ACC_AMPLIFY * AdWertAccNick; |
Mittelwert_AccRoll = ACC_AMPLIFY * AdWertAccRoll; |
// ADC einschalten |
ANALOG_ON; |
for(i=0;i<8;i++) |
{ |
int tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_POTI1 + i]] + 110; |
LIMIT_MIN_MAX(tmp, 0, 255); |
if(Poti[i] > tmp) Poti[i]--; else if(Poti[i] < tmp) Poti[i]++; |
} |
Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L; |
Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagRoll * 2500L; |
} |
//############################################################################ |
// Nullwerte ermitteln |
void SetNeutral(unsigned char AccAdjustment) |
//############################################################################ |
{ |
unsigned char i; |
unsigned int gier_neutral=0, nick_neutral=0, roll_neutral=0; |
VersionInfo.HardwareError[0] = 0; |
HEF4017R_ON; |
NeutralAccX = 0; |
NeutralAccY = 0; |
NeutralAccZ = 0; |
AdNeutralNick = 0; |
AdNeutralRoll = 0; |
AdNeutralGier = 0; |
Parameter_AchsKopplung1 = 0; |
Parameter_AchsKopplung2 = 0; |
ExpandBaro = 0; |
CalibrierMittelwert(); |
Delay_ms_Mess(100); |
CalibrierMittelwert(); |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
{ |
if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
} |
#define NEUTRAL_FILTER 32 |
for(i=0; i<NEUTRAL_FILTER; i++) |
{ |
Delay_ms_Mess(10); |
gier_neutral += AdWertGier; |
nick_neutral += AdWertNick; |
roll_neutral += AdWertRoll; |
} |
AdNeutralNick= (nick_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER / 8); |
AdNeutralRoll= (roll_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER / 8); |
AdNeutralGier= (gier_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER); |
StartNeutralRoll = AdNeutralRoll; |
StartNeutralNick = AdNeutralNick; |
if(AccAdjustment) |
{ |
NeutralAccX = abs(Mittelwert_AccNick) / (2*ACC_AMPLIFY); |
NeutralAccY = abs(Mittelwert_AccRoll) / (2*ACC_AMPLIFY); |
NeutralAccZ = Aktuell_az; |
// Save ACC neutral settings to eeprom |
SetParamWord(PID_ACC_NICK, (uint16_t)NeutralAccX); |
SetParamWord(PID_ACC_ROLL, (uint16_t)NeutralAccY); |
SetParamWord(PID_ACC_TOP, (uint16_t)NeutralAccZ); |
} |
else |
{ |
// restore from eeprom |
NeutralAccX = (int16_t)GetParamWord(PID_ACC_NICK); |
NeutralAccY = (int16_t)GetParamWord(PID_ACC_ROLL); |
NeutralAccZ = (int16_t)GetParamWord(PID_ACC_TOP); |
// strange settings? |
if(((unsigned int) NeutralAccX > 2048) || ((unsigned int) NeutralAccY > 2048) || ((unsigned int) NeutralAccZ > 1024)) |
{ |
printf("\n\rACC not calibrated!\r\n"); |
NeutralAccX = abs(Mittelwert_AccNick) / (2*ACC_AMPLIFY); |
NeutralAccY = abs(Mittelwert_AccRoll) / (2*ACC_AMPLIFY); |
NeutralAccZ = Aktuell_az; |
} |
} |
MesswertNick = 0; |
MesswertRoll = 0; |
MesswertGier = 0; |
Delay_ms_Mess(100); |
Mittelwert_AccNick = ACC_AMPLIFY * AdWertAccNick; |
Mittelwert_AccRoll = ACC_AMPLIFY * AdWertAccRoll; |
IntegralNick = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccNick; |
IntegralRoll = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccRoll; |
Mess_IntegralNick2 = IntegralNick; |
Mess_IntegralRoll2 = IntegralRoll; |
Mess_Integral_Gier = 0; |
StartLuftdruck = Luftdruck; |
VarioMeter = 0; |
Mess_Integral_Hoch = 0; |
KompassStartwert = KompassValue; |
GPS_Neutral(); |
beeptime = 50; |
Umschlag180Nick = ((long) EE_Parameter.WinkelUmschlagNick * 2500L) + 15000L; |
Umschlag180Roll = ((long) EE_Parameter.WinkelUmschlagRoll * 2500L) + 15000L; |
ExternHoehenValue = 0; |
ErsatzKompass = KompassValue * GIER_GRAD_FAKTOR; |
GierGyroFehler = 0; |
SendVersionToNavi = 1; |
LED_Init(); |
FCFlags |= FCFLAG_CALIBRATE; |
FromNaviCtrl_Value.Kalman_K = -1; |
FromNaviCtrl_Value.Kalman_MaxDrift = 0; |
FromNaviCtrl_Value.Kalman_MaxFusion = 32; |
for(i=0;i<8;i++) |
{ |
Poti[i] = PPM_in[EE_Parameter.Kanalbelegung[K_POTI1 + i]] + 110; |
} |
SenderOkay = 100; |
if(ServoActive) |
{ |
HEF4017R_ON; |
DDRD |=0x80; // enable J7 -> Servo signal |
} |
if((AdNeutralNick < 150 * 16) || (AdNeutralNick > 850 * 16)) { VersionInfo.HardwareError[0] |= DEFEKT_G_NICK; }; |
if((AdNeutralRoll < 150 * 16) || (AdNeutralRoll > 850 * 16)) { VersionInfo.HardwareError[0] |= DEFEKT_G_ROLL; }; |
if((AdNeutralGier < 150 * 2) || (AdNeutralGier > 850 * 2)) { VersionInfo.HardwareError[0] |= DEFEKT_G_GIER; }; |
if((NeutralAccX < 300) || (NeutralAccX > 750)) { VersionInfo.HardwareError[0] |= DEFEKT_A_NICK; }; |
if((NeutralAccY < 300) || (NeutralAccY > 750)) { VersionInfo.HardwareError[0] |= DEFEKT_A_ROLL; }; |
if((NeutralAccZ < 512) || (NeutralAccZ > 850)) { VersionInfo.HardwareError[0] |= DEFEKT_A_Z; }; |
} |
//############################################################################ |
// Bearbeitet die Messwerte |
void Mittelwert(void) |
//############################################################################ |
{ |
static signed long tmpl,tmpl2,tmpl3,tmpl4; |
static signed int oldNick, oldRoll, d2Roll, d2Nick; |
signed long winkel_nick, winkel_roll; |
unsigned char i; |
MesswertGier = (signed int) AdNeutralGier - AdWertGier; |
MesswertNick = (signed int) AdWertNickFilter / 8; |
MesswertRoll = (signed int) AdWertRollFilter / 8; |
RohMesswertNick = MesswertNick; |
RohMesswertRoll = MesswertRoll; |
// Beschleunigungssensor ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mittelwert_AccNick = (Mittelwert_AccNick * 3 + ((ACC_AMPLIFY * AdWertAccNick))) / 4L; |
Mittelwert_AccRoll = (Mittelwert_AccRoll * 3 + ((ACC_AMPLIFY * AdWertAccRoll))) / 4L; |
IntegralAccNick += ACC_AMPLIFY * AdWertAccNick; |
IntegralAccRoll += ACC_AMPLIFY * AdWertAccRoll; |
NaviAccNick += AdWertAccNick; |
NaviAccRoll += AdWertAccRoll; |
NaviCntAcc++; |
IntegralAccZ += Aktuell_az - NeutralAccZ; |
//++++++++++++++++++++++++++++++++++++++++++++++++ |
// ADC einschalten |
ANALOG_ON; |
AdReady = 0; |
//++++++++++++++++++++++++++++++++++++++++++++++++ |
if(Mess_IntegralRoll > 93000L) winkel_roll = 93000L; |
else if(Mess_IntegralRoll <-93000L) winkel_roll = -93000L; |
else winkel_roll = Mess_IntegralRoll; |
if(Mess_IntegralNick > 93000L) winkel_nick = 93000L; |
else if(Mess_IntegralNick <-93000L) winkel_nick = -93000L; |
else winkel_nick = Mess_IntegralNick; |
// Gier ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mess_Integral_Gier += MesswertGier; |
ErsatzKompass += MesswertGier; |
// Kopplungsanteil +++++++++++++++++++++++++++++++++++++ |
if(!Looping_Nick && !Looping_Roll && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV)) |
{ |
tmpl3 = (MesswertRoll * winkel_nick) / 2048L; |
tmpl3 *= Parameter_AchsKopplung2; //65 |
tmpl3 /= 4096L; |
tmpl4 = (MesswertNick * winkel_roll) / 2048L; |
tmpl4 *= Parameter_AchsKopplung2; //65 |
tmpl4 /= 4096L; |
KopplungsteilNickRoll = tmpl3; |
KopplungsteilRollNick = tmpl4; |
tmpl4 -= tmpl3; |
ErsatzKompass += tmpl4; |
if(!Parameter_CouplingYawCorrection) Mess_Integral_Gier -= tmpl4/2; // Gier nachhelfen |
tmpl = ((MesswertGier + tmpl4) * winkel_nick) / 2048L; |
tmpl *= Parameter_AchsKopplung1; // 90 |
tmpl /= 4096L; |
tmpl2 = ((MesswertGier + tmpl4) * winkel_roll) / 2048L; |
tmpl2 *= Parameter_AchsKopplung1; |
tmpl2 /= 4096L; |
if(abs(MesswertGier) > 64) if(labs(tmpl) > 128 || labs(tmpl2) > 128) TrichterFlug = 1; |
//MesswertGier += (Parameter_CouplingYawCorrection * tmpl4) / 256; |
} |
else tmpl = tmpl2 = KopplungsteilNickRoll = KopplungsteilRollNick = 0; |
TrimRoll = tmpl - tmpl2 / 100L; |
TrimNick = -tmpl2 + tmpl / 100L; |
// Kompasswert begrenzen ++++++++++++++++++++++++++++++++++++++++++++++++ |
if(ErsatzKompass >= (360L * GIER_GRAD_FAKTOR)) ErsatzKompass -= 360L * GIER_GRAD_FAKTOR; // 360° Umschlag |
if(ErsatzKompass < 0) ErsatzKompass += 360L * GIER_GRAD_FAKTOR; |
// Roll ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mess_IntegralRoll2 += MesswertRoll + TrimRoll; |
Mess_IntegralRoll += MesswertRoll + TrimRoll - LageKorrekturRoll; |
if(Mess_IntegralRoll > Umschlag180Roll) |
{ |
Mess_IntegralRoll = -(Umschlag180Roll - 25000L); |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
} |
if(Mess_IntegralRoll <-Umschlag180Roll) |
{ |
Mess_IntegralRoll = (Umschlag180Roll - 25000L); |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
} |
// Nick ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mess_IntegralNick2 += MesswertNick + TrimNick; |
Mess_IntegralNick += MesswertNick + TrimNick - LageKorrekturNick; |
if(Mess_IntegralNick > Umschlag180Nick) |
{ |
Mess_IntegralNick = -(Umschlag180Nick - 25000L); |
Mess_IntegralNick2 = Mess_IntegralNick; |
} |
if(Mess_IntegralNick <-Umschlag180Nick) |
{ |
Mess_IntegralNick = (Umschlag180Nick - 25000L); |
Mess_IntegralNick2 = Mess_IntegralNick; |
} |
Integral_Gier = Mess_Integral_Gier; |
IntegralNick = Mess_IntegralNick; |
IntegralRoll = Mess_IntegralRoll; |
IntegralNick2 = Mess_IntegralNick2; |
IntegralRoll2 = Mess_IntegralRoll2; |
#define D_LIMIT 128 |
MesswertNick = HiResNick / 8; |
MesswertRoll = HiResRoll / 8; |
if(AdWertNick < 15) MesswertNick = -1000; if(AdWertNick < 7) MesswertNick = -2000; |
if(PlatinenVersion == 10) { if(AdWertNick > 1010) MesswertNick = +1000; if(AdWertNick > 1017) MesswertNick = +2000; } |
else { if(AdWertNick > 2000) MesswertNick = +1000; if(AdWertNick > 2015) MesswertNick = +2000; } |
if(AdWertRoll < 15) MesswertRoll = -1000; if(AdWertRoll < 7) MesswertRoll = -2000; |
if(PlatinenVersion == 10) { if(AdWertRoll > 1010) MesswertRoll = +1000; if(AdWertRoll > 1017) MesswertRoll = +2000; } |
else { if(AdWertRoll > 2000) MesswertRoll = +1000; if(AdWertRoll > 2015) MesswertRoll = +2000; } |
if(Parameter_Gyro_D) |
{ |
d2Nick = HiResNick - oldNick; |
oldNick = (oldNick + HiResNick)/2; |
if(d2Nick > D_LIMIT) d2Nick = D_LIMIT; |
else if(d2Nick < -D_LIMIT) d2Nick = -D_LIMIT; |
MesswertNick += (d2Nick * (signed int) Parameter_Gyro_D) / 16; |
d2Roll = HiResRoll - oldRoll; |
oldRoll = (oldRoll + HiResRoll)/2; |
if(d2Roll > D_LIMIT) d2Roll = D_LIMIT; |
else if(d2Roll < -D_LIMIT) d2Roll = -D_LIMIT; |
MesswertRoll += (d2Roll * (signed int) Parameter_Gyro_D) / 16; |
HiResNick += (d2Nick * (signed int) Parameter_Gyro_D); |
HiResRoll += (d2Roll * (signed int) Parameter_Gyro_D); |
} |
if(RohMesswertRoll > 0) TrimRoll += ((long) abs(KopplungsteilNickRoll) * Parameter_CouplingYawCorrection) / 64L; |
else TrimRoll -= ((long) abs(KopplungsteilNickRoll) * Parameter_CouplingYawCorrection) / 64L; |
if(RohMesswertNick > 0) TrimNick += ((long) abs(KopplungsteilRollNick) * Parameter_CouplingYawCorrection) / 64L; |
else TrimNick -= ((long) abs(KopplungsteilRollNick) * Parameter_CouplingYawCorrection) / 64L; |
if(EE_Parameter.GlobalConfig & CFG_DREHRATEN_BEGRENZER && !Looping_Nick && !Looping_Roll) |
{ |
if(RohMesswertNick > 256) MesswertNick += 1 * (RohMesswertNick - 256); |
else if(RohMesswertNick < -256) MesswertNick += 1 * (RohMesswertNick + 256); |
if(RohMesswertRoll > 256) MesswertRoll += 1 * (RohMesswertRoll - 256); |
else if(RohMesswertRoll < -256) MesswertRoll += 1 * (RohMesswertRoll + 256); |
} |
for(i=0;i<8;i++) |
{ |
int tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_POTI1 + i]] + 110; |
if(tmp > 255) tmp = 255; else if(tmp < 0) tmp = 0; |
if(tmp != Poti[i]) |
{ |
Poti[i] += (tmp - Poti[i]) / 8; |
if(Poti[i] > tmp) Poti[i]--; |
else Poti[i]++; |
} |
} |
} |
//############################################################################ |
// Senden der Motorwerte per I2C-Bus |
void SendMotorData(void) |
//############################################################################ |
{ |
unsigned char i; |
if(!MotorenEin) |
{ |
FCFlags &= ~(FCFLAG_MOTOR_RUN | FCFLAG_FLY); |
for(i=0;i<MAX_MOTORS;i++) |
{ |
if(!PC_MotortestActive) MotorTest[i] = 0; |
Motor[i].SetPoint = MotorTest[i]; |
Motor[i].SetPointLowerBits = 0; |
/* |
Motor[i].SetPoint = MotorTest[i] / 4; |
Motor[i].SetPointLowerBits = MotorTest[i] % 4; |
*/ |
} |
if(PC_MotortestActive) PC_MotortestActive--; |
} |
else FCFlags |= FCFLAG_MOTOR_RUN; |
//Start I2C Interrupt Mode |
motor_write = 0; |
I2C_Start(TWI_STATE_MOTOR_TX); |
} |
//############################################################################ |
// Trägt ggf. das Poti als Parameter ein |
void ParameterZuordnung(void) |
//############################################################################ |
{ |
unsigned char tmp; |
#define CHK_POTI(b,a) {if(a < 248) b = a; else b = Poti[255 - a];} |
#define CHK_POTI_MM(b,a,min,max) {CHK_POTI(b,a); LIMIT_MIN_MAX(b, min, max);} |
CHK_POTI_MM(Parameter_Luftdruck_D,EE_Parameter.Luftdruck_D,0,100); |
CHK_POTI_MM(Parameter_Hoehe_P,EE_Parameter.Hoehe_P,0,100); |
CHK_POTI_MM(Parameter_Gyro_P,EE_Parameter.Gyro_P,10,255); |
CHK_POTI_MM(Parameter_J16Timing,EE_Parameter.J16Timing,1,255); |
CHK_POTI_MM(Parameter_J17Timing,EE_Parameter.J17Timing,1,255); |
CHK_POTI(Parameter_Servo3,EE_Parameter.Servo3); |
CHK_POTI(Parameter_Servo4,EE_Parameter.Servo4); |
CHK_POTI(Parameter_Servo5,EE_Parameter.Servo5); |
CHK_POTI(Parameter_MaxHoehe,EE_Parameter.MaxHoehe); |
CHK_POTI(Parameter_MaxHoehe,EE_Parameter.MaxHoehe); |
CHK_POTI(Parameter_Hoehe_ACC_Wirkung,EE_Parameter.Hoehe_ACC_Wirkung); |
CHK_POTI(Parameter_Hoehe_GPS_Z,EE_Parameter.Hoehe_GPS_Z); |
CHK_POTI(Parameter_KompassWirkung,EE_Parameter.KompassWirkung); |
CHK_POTI(Parameter_Gyro_I,EE_Parameter.Gyro_I); |
CHK_POTI(Parameter_Gyro_D,EE_Parameter.Gyro_D); |
CHK_POTI(Parameter_Gyro_Gier_P,EE_Parameter.Gyro_Gier_P); |
CHK_POTI(Parameter_Gyro_Gier_I,EE_Parameter.Gyro_Gier_I); |
CHK_POTI(Parameter_I_Faktor,EE_Parameter.I_Faktor); |
CHK_POTI(Parameter_UserParam1,EE_Parameter.UserParam1); |
CHK_POTI(Parameter_UserParam2,EE_Parameter.UserParam2); |
CHK_POTI(Parameter_UserParam3,EE_Parameter.UserParam3); |
CHK_POTI(Parameter_UserParam4,EE_Parameter.UserParam4); |
CHK_POTI(Parameter_UserParam5,EE_Parameter.UserParam5); |
CHK_POTI(Parameter_UserParam6,EE_Parameter.UserParam6); |
CHK_POTI(Parameter_UserParam7,EE_Parameter.UserParam7); |
CHK_POTI(Parameter_UserParam8,EE_Parameter.UserParam8); |
CHK_POTI(Parameter_ServoNickControl,EE_Parameter.ServoNickControl); |
CHK_POTI(Parameter_ServoRollControl,EE_Parameter.ServoRollControl); |
CHK_POTI(Parameter_LoopGasLimit,EE_Parameter.LoopGasLimit); |
CHK_POTI(Parameter_AchsKopplung1,EE_Parameter.AchsKopplung1); |
CHK_POTI(Parameter_AchsKopplung2,EE_Parameter.AchsKopplung2); |
CHK_POTI(Parameter_CouplingYawCorrection,EE_Parameter.CouplingYawCorrection); |
// CHK_POTI(Parameter_AchsGegenKopplung1,EE_Parameter.AchsGegenKopplung1,0,255); |
CHK_POTI(Parameter_DynamicStability,EE_Parameter.DynamicStability); |
CHK_POTI(Parameter_ExternalControl,EE_Parameter.ExternalControl); |
Ki = 10300 / (Parameter_I_Faktor + 1); |
MAX_GAS = EE_Parameter.Gas_Max; |
MIN_GAS = EE_Parameter.Gas_Min; |
tmp = EE_Parameter.OrientationModeControl; |
if(tmp > 50) |
{ |
#ifdef SWITCH_LEARNS_CAREFREE |
if(!CareFree) ControlHeading = (((int) EE_Parameter.OrientationAngle * 15 + KompassValue) % 360) / 2; |
#endif |
CareFree = 1; |
if(tmp >= 248 && Poti[255 - tmp] < 50) CareFree = 0; |
if(FromNaviCtrl.CompassValue < 0 && CareFree) VersionInfo.HardwareError[0] |= DEFEKT_CAREFREE_ERR; else VersionInfo.HardwareError[0] &= ~DEFEKT_CAREFREE_ERR; |
} |
else CareFree = 0; |
if(FromNaviCtrl.CompassValue < 0 && MotorenEin && CareFree && BeepMuster == 0xffff) // ungültiger Kompasswert |
{ |
beeptime = 15000; |
BeepMuster = 0xA400; |
CareFree = 0; |
} |
if(CareFree) {if(Parameter_AchsKopplung1 < 210) Parameter_AchsKopplung1 += 30;} |
} |
//############################################################################ |
// |
void MotorRegler(void) |
//############################################################################ |
{ |
int pd_ergebnis_nick,pd_ergebnis_roll,tmp_int, tmp_int2; |
int GierMischanteil,GasMischanteil; |
static long sollGier = 0,tmp_long,tmp_long2; |
static long IntegralFehlerNick = 0; |
static long IntegralFehlerRoll = 0; |
static unsigned int RcLostTimer; |
static unsigned char delay_neutral = 0; |
static unsigned char delay_einschalten = 0,delay_ausschalten = 0; |
static unsigned char calibration_done = 0; |
static char NeueKompassRichtungMerken = 0; |
static long ausgleichNick, ausgleichRoll; |
int IntegralNickMalFaktor,IntegralRollMalFaktor; |
unsigned char i; |
Mittelwert(); |
GRN_ON; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gaswert ermitteln |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
GasMischanteil = StickGas; |
if(GasMischanteil < MIN_GAS + 10) GasMischanteil = MIN_GAS + 10; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Empfang schlecht |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(SenderOkay < 100) |
{ |
if(RcLostTimer) RcLostTimer--; |
else |
{ |
MotorenEin = 0; |
FCFlags &= ~FCFLAG_NOTLANDUNG; |
} |
ROT_ON; |
if(modell_fliegt > 1000) // wahrscheinlich in der Luft --> langsam absenken |
{ |
GasMischanteil = EE_Parameter.NotGas; |
FCFlags |= FCFLAG_NOTLANDUNG; |
PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] = 0; |
PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] = 0; |
PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] = 0; |
PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] = 0; |
PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] = 0; |
} |
else MotorenEin = 0; |
} |
else |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Emfang gut |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(SenderOkay > 140) |
{ |
FCFlags &= ~FCFLAG_NOTLANDUNG; |
RcLostTimer = EE_Parameter.NotGasZeit * 50; |
if(GasMischanteil > 40 && MotorenEin) |
{ |
if(modell_fliegt < 0xffff) modell_fliegt++; |
} |
if((modell_fliegt < 256)) |
{ |
SummeNick = 0; |
SummeRoll = 0; |
sollGier = 0; |
Mess_Integral_Gier = 0; |
if(modell_fliegt == 250) |
{ |
NeueKompassRichtungMerken = 1; |
} |
} else FCFlags |= FCFLAG_FLY; |
if((PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] > 80) && MotorenEin == 0) |
{ |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// auf Nullwerte kalibrieren |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] > 75) // Neutralwerte |
{ |
if(++delay_neutral > 200) // nicht sofort |
{ |
GRN_OFF; |
MotorenEin = 0; |
delay_neutral = 0; |
modell_fliegt = 0; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70 || abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) > 70) |
{ |
unsigned char setting=1; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < 70) setting = 1; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 2; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 3; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] <-70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 4; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] <-70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < 70) setting = 5; |
SetActiveParamSet(setting); // aktiven Datensatz merken |
} |
if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) < 30 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < -70) |
{ |
WinkelOut.CalcState = 1; |
beeptime = 1000; |
} |
else |
{ |
ParamSet_ReadFromEEProm(GetActiveParamSet()); |
LipoDetection(0); |
LIBFC_ReceiverInit(EE_Parameter.Receiver); |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
{ |
if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
} |
ServoActive = 0; |
SetNeutral(0); |
calibration_done = 1; |
ServoActive = 1; |
DDRD |=0x80; // enable J7 -> Servo signal |
Piep(GetActiveParamSet(),120); |
} |
} |
} |
else |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] < -75) // ACC Neutralwerte speichern |
{ |
if(++delay_neutral > 200) // nicht sofort |
{ |
GRN_OFF; |
MotorenEin = 0; |
delay_neutral = 0; |
modell_fliegt = 0; |
SetNeutral(1); |
calibration_done = 1; |
Piep(GetActiveParamSet(),120); |
} |
} |
else delay_neutral = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gas ist unten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] < 35-120) |
{ |
// Motoren Starten |
if(!MotorenEin) |
{ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] < -75) |
{ |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Einschalten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(++delay_einschalten > 200) |
{ |
delay_einschalten = 0; |
if(!VersionInfo.HardwareError[0] && calibration_done) |
{ |
modell_fliegt = 1; |
MotorenEin = 1; |
sollGier = 0; |
Mess_Integral_Gier = 0; |
Mess_Integral_Gier2 = 0; |
Mess_IntegralNick = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccNick; |
Mess_IntegralRoll = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccRoll; |
Mess_IntegralNick2 = IntegralNick; |
Mess_IntegralRoll2 = IntegralRoll; |
SummeNick = 0; |
SummeRoll = 0; |
FCFlags |= FCFLAG_START; |
ControlHeading = (((int) EE_Parameter.OrientationAngle * 15 + KompassValue) % 360) / 2; |
} |
else |
{ |
beeptime = 1500; // indicate missing calibration |
} |
} |
} |
else delay_einschalten = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Auschalten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
else // only if motors are running |
{ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] > 75) |
{ |
if(++delay_ausschalten > 200) // nicht sofort |
{ |
MotorenEin = 0; |
delay_ausschalten = 0; |
modell_fliegt = 0; |
} |
} |
else delay_ausschalten = 0; |
} |
} |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// neue Werte von der Funke |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!NewPpmData-- || (FCFlags & FCFLAG_NOTLANDUNG)) |
{ |
static int stick_nick,stick_roll; |
ParameterZuordnung(); |
stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4; |
stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; |
stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4; |
stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// CareFree und freie Wahl der vorderen Richtung |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
signed char sintab[31] = { 0, 2, 4, 6, 7, 8, 8, 8, 7, 6, 4, 2, 0, -2, -4, -6, -7, -8, -8, -8, -7, -6, -4, -2, 0, 2, 4, 6, 7, 8, 8}; |
if(CareFree) |
{ |
signed int nick, roll; |
nick = stick_nick / 4; |
roll = stick_roll / 4; |
StickNick = ((FromNC_Rotate_C * nick) + (FromNC_Rotate_S * roll)) / (32 / 4); |
StickRoll = ((FromNC_Rotate_C * roll) - (FromNC_Rotate_S * nick)) / (32 / 4); |
} |
else |
{ |
FromNC_Rotate_C = sintab[EE_Parameter.OrientationAngle + 6]; |
FromNC_Rotate_S = sintab[EE_Parameter.OrientationAngle]; |
StickNick = ((FromNC_Rotate_C * stick_nick) + (FromNC_Rotate_S * stick_roll)) / 8; |
StickRoll = ((FromNC_Rotate_C * stick_roll) - (FromNC_Rotate_S * stick_nick)) / 8; |
} |
StickGier = -PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]; |
if(StickGier > 2) StickGier -= 2; else |
if(StickGier < -2) StickGier += 2; else StickGier = 0; |
StickNick -= (GPS_Nick + GPS_Nick2); |
StickRoll -= (GPS_Roll + GPS_Roll2); |
StickGas = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] + 120; |
GyroFaktor = (Parameter_Gyro_P + 10.0); |
IntegralFaktor = Parameter_Gyro_I; |
GyroFaktorGier = (Parameter_Gyro_Gier_P + 10.0); |
IntegralFaktorGier = Parameter_Gyro_Gier_I; |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//+ Analoge Steuerung per Seriell |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(ExternControl.Config & 0x01 && Parameter_ExternalControl > 128) |
{ |
StickNick += (int) ExternControl.Nick * (int) EE_Parameter.Stick_P; |
StickRoll += (int) ExternControl.Roll * (int) EE_Parameter.Stick_P; |
StickGier += ExternControl.Gier; |
ExternHoehenValue = (int) ExternControl.Hight * (int)EE_Parameter.Hoehe_Verstaerkung; |
if(ExternControl.Gas < StickGas) StickGas = ExternControl.Gas; |
} |
if(StickGas < 0) StickGas = 0; |
if(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) IntegralFaktor = 0; |
if(abs(StickNick/STICK_GAIN) > MaxStickNick) |
{ |
MaxStickNick = abs(StickNick)/STICK_GAIN; |
if(MaxStickNick > 100) MaxStickNick = 100; |
} |
else MaxStickNick--; |
if(abs(StickRoll/STICK_GAIN) > MaxStickRoll) |
{ |
MaxStickRoll = abs(StickRoll)/STICK_GAIN; |
if(MaxStickRoll > 100) MaxStickRoll = 100; |
} |
else MaxStickRoll--; |
if(FCFlags & FCFLAG_NOTLANDUNG) {MaxStickNick = 0; MaxStickRoll = 0;} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Looping? |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > EE_Parameter.LoopThreshold) && EE_Parameter.BitConfig & CFG_LOOP_LINKS) Looping_Links = 1; |
else |
{ |
{ |
if((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < (EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese))) Looping_Links = 0; |
} |
} |
if((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < -EE_Parameter.LoopThreshold) && EE_Parameter.BitConfig & CFG_LOOP_RECHTS) Looping_Rechts = 1; |
else |
{ |
if(Looping_Rechts) // Hysterese |
{ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > -(EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese)) Looping_Rechts = 0; |
} |
} |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > EE_Parameter.LoopThreshold) && EE_Parameter.BitConfig & CFG_LOOP_OBEN) Looping_Oben = 1; |
else |
{ |
if(Looping_Oben) // Hysterese |
{ |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < (EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese))) Looping_Oben = 0; |
} |
} |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < -EE_Parameter.LoopThreshold) && EE_Parameter.BitConfig & CFG_LOOP_UNTEN) Looping_Unten = 1; |
else |
{ |
if(Looping_Unten) // Hysterese |
{ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > -(EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese)) Looping_Unten = 0; |
} |
} |
if(Looping_Links || Looping_Rechts) Looping_Roll = 1; else Looping_Roll = 0; |
if(Looping_Oben || Looping_Unten) { Looping_Nick = 1; Looping_Roll = 0; Looping_Links = 0; Looping_Rechts = 0;} else Looping_Nick = 0; |
} // Ende neue Funken-Werte |
if(Looping_Roll || Looping_Nick) |
{ |
if(GasMischanteil > EE_Parameter.LoopGasLimit) GasMischanteil = EE_Parameter.LoopGasLimit; |
TrichterFlug = 1; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Bei Empfangsausfall im Flug |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(FCFlags & FCFLAG_NOTLANDUNG) |
{ |
StickGier = 0; |
StickNick = 0; |
StickRoll = 0; |
GyroFaktor = 90; |
IntegralFaktor = 120; |
GyroFaktorGier = 90; |
IntegralFaktorGier = 120; |
Looping_Roll = 0; |
Looping_Nick = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Integrale auf ACC-Signal abgleichen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define ABGLEICH_ANZAHL 256L |
MittelIntegralNick += IntegralNick; // Für die Mittelwertbildung aufsummieren |
MittelIntegralRoll += IntegralRoll; |
MittelIntegralNick2 += IntegralNick2; |
MittelIntegralRoll2 += IntegralRoll2; |
if(Looping_Nick || Looping_Roll) |
{ |
IntegralAccNick = 0; |
IntegralAccRoll = 0; |
MittelIntegralNick = 0; |
MittelIntegralRoll = 0; |
MittelIntegralNick2 = 0; |
MittelIntegralRoll2 = 0; |
Mess_IntegralNick2 = Mess_IntegralNick; |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
ZaehlMessungen = 0; |
LageKorrekturNick = 0; |
LageKorrekturRoll = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!Looping_Nick && !Looping_Roll && (Aktuell_az > 512 || MotorenEin)) |
{ |
long tmp_long, tmp_long2; |
if(FromNaviCtrl_Value.Kalman_K != -1 /*&& !TrichterFlug*/) |
{ |
tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick); |
tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll); |
tmp_long = (tmp_long * FromNaviCtrl_Value.Kalman_K) / (32 * 16); |
tmp_long2 = (tmp_long2 * FromNaviCtrl_Value.Kalman_K) / (32 * 16); |
if((MaxStickNick > 64) || (MaxStickRoll > 64)) |
{ |
tmp_long /= 2; |
tmp_long2 /= 2; |
} |
if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25) |
{ |
tmp_long /= 3; |
tmp_long2 /= 3; |
} |
if(tmp_long > (long) FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long = (long) FromNaviCtrl_Value.Kalman_MaxFusion; |
if(tmp_long < (long)-FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long = (long)-FromNaviCtrl_Value.Kalman_MaxFusion; |
if(tmp_long2 > (long) FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long2 = (long) FromNaviCtrl_Value.Kalman_MaxFusion; |
if(tmp_long2 < (long)-FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long2 = (long)-FromNaviCtrl_Value.Kalman_MaxFusion; |
} |
else |
{ |
tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick); |
tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll); |
tmp_long /= 16; |
tmp_long2 /= 16; |
if((MaxStickNick > 64) || (MaxStickRoll > 64)) |
{ |
tmp_long /= 3; |
tmp_long2 /= 3; |
} |
if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25) |
{ |
tmp_long /= 3; |
tmp_long2 /= 3; |
} |
#define AUSGLEICH 32 |
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; |
} |
Mess_IntegralNick -= tmp_long; |
Mess_IntegralRoll -= tmp_long2; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(ZaehlMessungen >= ABGLEICH_ANZAHL) |
{ |
static int cnt = 0; |
static char last_n_p,last_n_n,last_r_p,last_r_n; |
static long MittelIntegralNick_Alt,MittelIntegralRoll_Alt; |
if(!Looping_Nick && !Looping_Roll && !TrichterFlug && EE_Parameter.Driftkomp) |
{ |
MittelIntegralNick /= ABGLEICH_ANZAHL; |
MittelIntegralRoll /= ABGLEICH_ANZAHL; |
IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL; |
IntegralAccRoll = (EE_Parameter.GyroAccFaktor * IntegralAccRoll) / ABGLEICH_ANZAHL; |
IntegralAccZ = IntegralAccZ / ABGLEICH_ANZAHL; |
#define MAX_I 0 |
// Nick ++++++++++++++++++++++++++++++++++++++++++++++++ |
IntegralFehlerNick = (long)(MittelIntegralNick - (long)IntegralAccNick); |
ausgleichNick = IntegralFehlerNick / EE_Parameter.GyroAccAbgleich; |
// Roll ++++++++++++++++++++++++++++++++++++++++++++++++ |
IntegralFehlerRoll = (long)(MittelIntegralRoll - (long)IntegralAccRoll); |
ausgleichRoll = IntegralFehlerRoll / EE_Parameter.GyroAccAbgleich; |
LageKorrekturNick = ausgleichNick / ABGLEICH_ANZAHL; |
LageKorrekturRoll = ausgleichRoll / ABGLEICH_ANZAHL; |
if(((MaxStickNick > 64) || (MaxStickRoll > 64) || (abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25)) && (FromNaviCtrl_Value.Kalman_K == -1)) |
{ |
LageKorrekturNick /= 2; |
LageKorrekturRoll /= 2; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gyro-Drift ermitteln |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
MittelIntegralNick2 /= ABGLEICH_ANZAHL; |
MittelIntegralRoll2 /= ABGLEICH_ANZAHL; |
tmp_long = IntegralNick2 - IntegralNick; |
tmp_long2 = IntegralRoll2 - IntegralRoll; |
IntegralFehlerNick = tmp_long; |
IntegralFehlerRoll = tmp_long2; |
Mess_IntegralNick2 -= IntegralFehlerNick; |
Mess_IntegralRoll2 -= IntegralFehlerRoll; |
if(EE_Parameter.Driftkomp) |
{ |
if(GierGyroFehler > ABGLEICH_ANZAHL/2) { AdNeutralGier++; } |
if(GierGyroFehler <-ABGLEICH_ANZAHL/2) { AdNeutralGier--; } |
} |
GierGyroFehler = 0; |
#define FEHLER_LIMIT (ABGLEICH_ANZAHL / 2) |
#define FEHLER_LIMIT1 (ABGLEICH_ANZAHL * 2) //4 |
#define FEHLER_LIMIT2 (ABGLEICH_ANZAHL * 16) //16 |
#define BEWEGUNGS_LIMIT 20000 |
// Nick +++++++++++++++++++++++++++++++++++++++++++++++++ |
cnt = 1;// + labs(IntegralFehlerNick) / 4096; |
if(labs(IntegralFehlerNick) > FEHLER_LIMIT1) cnt = 4; |
if(labs(MittelIntegralNick_Alt - MittelIntegralNick) < BEWEGUNGS_LIMIT || (FromNaviCtrl_Value.Kalman_MaxDrift > 3*8)) |
{ |
if(IntegralFehlerNick > FEHLER_LIMIT2) |
{ |
if(last_n_p) |
{ |
cnt += labs(IntegralFehlerNick) / (FEHLER_LIMIT2 / 8); |
ausgleichNick = IntegralFehlerNick / 8; |
if(ausgleichNick > 5000) ausgleichNick = 5000; |
LageKorrekturNick += ausgleichNick / ABGLEICH_ANZAHL; |
} |
else last_n_p = 1; |
} else last_n_p = 0; |
if(IntegralFehlerNick < -FEHLER_LIMIT2) |
{ |
if(last_n_n) |
{ |
cnt += labs(IntegralFehlerNick) / (FEHLER_LIMIT2 / 8); |
ausgleichNick = IntegralFehlerNick / 8; |
if(ausgleichNick < -5000) ausgleichNick = -5000; |
LageKorrekturNick += ausgleichNick / ABGLEICH_ANZAHL; |
} |
else last_n_n = 1; |
} else last_n_n = 0; |
} |
else |
{ |
cnt = 0; |
KompassSignalSchlecht = 1000; |
} |
if(cnt > EE_Parameter.Driftkomp) cnt = EE_Parameter.Driftkomp; |
if(FromNaviCtrl_Value.Kalman_MaxDrift) if(cnt > FromNaviCtrl_Value.Kalman_MaxDrift) cnt = FromNaviCtrl_Value.Kalman_MaxDrift; |
if(IntegralFehlerNick > FEHLER_LIMIT) AdNeutralNick += cnt; |
if(IntegralFehlerNick < -FEHLER_LIMIT) AdNeutralNick -= cnt; |
// Roll +++++++++++++++++++++++++++++++++++++++++++++++++ |
cnt = 1;// + labs(IntegralFehlerRoll) / 4096; |
if(labs(IntegralFehlerRoll) > FEHLER_LIMIT1) cnt = 4; |
if(labs(MittelIntegralRoll_Alt - MittelIntegralRoll) < BEWEGUNGS_LIMIT || (FromNaviCtrl_Value.Kalman_MaxDrift > 3*8)) |
{ |
if(IntegralFehlerRoll > FEHLER_LIMIT2) |
{ |
if(last_r_p) |
{ |
cnt += labs(IntegralFehlerRoll) / (FEHLER_LIMIT2 / 8); |
ausgleichRoll = IntegralFehlerRoll / 8; |
if(ausgleichRoll > 5000) ausgleichRoll = 5000; |
LageKorrekturRoll += ausgleichRoll / ABGLEICH_ANZAHL; |
} |
else last_r_p = 1; |
} else last_r_p = 0; |
if(IntegralFehlerRoll < -FEHLER_LIMIT2) |
{ |
if(last_r_n) |
{ |
cnt += labs(IntegralFehlerRoll) / (FEHLER_LIMIT2 / 8); |
ausgleichRoll = IntegralFehlerRoll / 8; |
if(ausgleichRoll < -5000) ausgleichRoll = -5000; |
LageKorrekturRoll += ausgleichRoll / ABGLEICH_ANZAHL; |
} |
else last_r_n = 1; |
} else last_r_n = 0; |
} else |
{ |
cnt = 0; |
KompassSignalSchlecht = 1000; |
} |
if(cnt > EE_Parameter.Driftkomp) cnt = EE_Parameter.Driftkomp; |
if(FromNaviCtrl_Value.Kalman_MaxDrift) if(cnt > FromNaviCtrl_Value.Kalman_MaxDrift) cnt = FromNaviCtrl_Value.Kalman_MaxDrift; |
if(IntegralFehlerRoll > FEHLER_LIMIT) AdNeutralRoll += cnt; |
if(IntegralFehlerRoll < -FEHLER_LIMIT) AdNeutralRoll -= cnt; |
} |
else |
{ |
LageKorrekturRoll = 0; |
LageKorrekturNick = 0; |
TrichterFlug = 0; |
} |
if(!IntegralFaktor) { LageKorrekturRoll = 0; LageKorrekturNick = 0;} // z.B. bei HH |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++ |
MittelIntegralNick_Alt = MittelIntegralNick; |
MittelIntegralRoll_Alt = MittelIntegralRoll; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++ |
IntegralAccNick = 0; |
IntegralAccRoll = 0; |
IntegralAccZ = 0; |
MittelIntegralNick = 0; |
MittelIntegralRoll = 0; |
MittelIntegralNick2 = 0; |
MittelIntegralRoll2 = 0; |
ZaehlMessungen = 0; |
} // ZaehlMessungen >= ABGLEICH_ANZAHL |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gieren |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(abs(StickGier) > 15) // war 35 |
{ |
KompassSignalSchlecht = 1000; |
if(!(EE_Parameter.GlobalConfig & CFG_KOMPASS_FIX)) |
{ |
NeueKompassRichtungMerken = 1; |
}; |
} |
tmp_int = (long) EE_Parameter.Gier_P * ((long)StickGier * abs(StickGier)) / 512L; // expo y = ax + bx² |
tmp_int += (EE_Parameter.Gier_P * StickGier) / 4; |
sollGier = tmp_int; |
Mess_Integral_Gier -= tmp_int; |
if(Mess_Integral_Gier > 50000) Mess_Integral_Gier = 50000; // begrenzen |
if(Mess_Integral_Gier <-50000) Mess_Integral_Gier =-50000; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Kompass |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(KompassValue && (EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV)) |
{ |
int w,v,r,fehler,korrektur; |
w = abs(IntegralNick /512); // mit zunehmender Neigung den Einfluss drosseln |
v = abs(IntegralRoll /512); |
if(v > w) w = v; // grösste Neigung ermitteln |
korrektur = w / 8 + 2; |
fehler = ((540 + KompassValue - (ErsatzKompass/GIER_GRAD_FAKTOR)) % 360) - 180; |
//fehler += MesswertGier / 12; |
if(!KompassSignalSchlecht && w < 25) |
{ |
GierGyroFehler += fehler; |
if(NeueKompassRichtungMerken) |
{ |
ErsatzKompass = KompassValue * GIER_GRAD_FAKTOR; |
KompassStartwert = (ErsatzKompass/GIER_GRAD_FAKTOR); |
NeueKompassRichtungMerken = 0; |
} |
} |
ErsatzKompass += (fehler * 16) / korrektur; |
w = (w * Parameter_KompassWirkung) / 32; // auf die Wirkung normieren |
w = Parameter_KompassWirkung - w; // Wirkung ggf drosseln |
if(w >= 0) |
{ |
if(!KompassSignalSchlecht) |
{ |
v = 64 + ((MaxStickNick + MaxStickRoll)) / 8; |
r = ((540 + (ErsatzKompass/GIER_GRAD_FAKTOR) - KompassStartwert) % 360) - 180; |
v = (r * w) / v; // nach Kompass ausrichten |
w = 3 * Parameter_KompassWirkung; |
if(v > w) v = w; // Begrenzen |
else |
if(v < -w) v = -w; |
Mess_Integral_Gier += v; |
} |
if(KompassSignalSchlecht) KompassSignalSchlecht--; |
} |
else KompassSignalSchlecht = 500; // so lange das Signal taub stellen --> ca. 1 sek |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Drehgeschwindigkeit und -winkel zu einem Istwert zusammenfassen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(TrichterFlug) { SummeRoll = 0; SummeNick = 0;}; |
if(!Looping_Nick) IntegralNickMalFaktor = (IntegralNick * IntegralFaktor) / (44000 / STICK_GAIN); else IntegralNickMalFaktor = 0; |
if(!Looping_Roll) IntegralRollMalFaktor = (IntegralRoll * IntegralFaktor) / (44000 / STICK_GAIN); else IntegralRollMalFaktor = 0; |
#define TRIM_MAX 200 |
if(TrimNick > TRIM_MAX) TrimNick = TRIM_MAX; else if(TrimNick <-TRIM_MAX) TrimNick =-TRIM_MAX; |
if(TrimRoll > TRIM_MAX) TrimRoll = TRIM_MAX; else if(TrimRoll <-TRIM_MAX) TrimRoll =-TRIM_MAX; |
MesswertNick = IntegralNickMalFaktor + (long)((long)MesswertNick * GyroFaktor + (long)TrimNick * 128L) / (256L / STICK_GAIN); |
MesswertRoll = IntegralRollMalFaktor + (long)((long)MesswertRoll * GyroFaktor + (long)TrimRoll * 128L) / (256L / STICK_GAIN); |
MesswertGier = (long)(MesswertGier * 2 * (long)GyroFaktorGier) / (256L / STICK_GAIN) + (long)(Integral_Gier * IntegralFaktorGier) / (2 * (44000 / STICK_GAIN)); |
// Maximalwerte abfangen |
// #define MAX_SENSOR (4096*STICK_GAIN) |
#define MAX_SENSOR (4096) |
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 |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(UBat > BattLowVoltageWarning) GasMischanteil = ((unsigned int)GasMischanteil * BattLowVoltageWarning) / UBat; // Gas auf das aktuelle Spannungvieveau beziehen |
GasMischanteil *= STICK_GAIN; |
// if height control is activated |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) && !(Looping_Roll || Looping_Nick)) // Höhenregelung |
{ |
#define HOVER_GAS_AVERAGE 16384L // 16384 * 2ms = 32s averaging |
#define HC_GAS_AVERAGE 4 // 4 * 2ms= 8ms averaging |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
#define OPA_OFFSET_STEP 15 |
#else |
#define OPA_OFFSET_STEP 10 |
#endif |
int HCGas, HeightDeviation = 0,GasReduction = 0; |
static int HeightTrimming = 0; // rate for change of height setpoint |
static int FilterHCGas = 0; |
static int StickGasHover = 120, HoverGasMin = 0, HoverGasMax = 1023; |
static unsigned long HoverGasFilter = 0; |
static unsigned char delay = 100, BaroAtUpperLimit = 0, BaroAtLowerLimit = 0; |
int CosAttitude; // for projection of hoover gas |
// get the current hooverpoint |
DebugOut.Analog[21] = HoverGas; |
// Expand the measurement |
// measurement of air pressure close to upper limit and no overflow in correction of the new OCR0A value occurs |
if(!BaroExpandActive) |
{ |
if(MessLuftdruck > 920) |
{ // increase offset |
if(OCR0A < (255 - OPA_OFFSET_STEP)) |
{ |
ExpandBaro -= 1; |
OCR0A = DruckOffsetSetting - OPA_OFFSET_STEP * ExpandBaro; // increase offset to shift ADC down |
beeptime = 300; |
BaroExpandActive = 350; |
} |
else |
{ |
BaroAtLowerLimit = 1; |
} |
} |
// measurement of air pressure close to lower limit and |
else |
if(MessLuftdruck < 100) |
{ // decrease offset |
if(OCR0A > OPA_OFFSET_STEP) |
{ |
ExpandBaro += 1; |
OCR0A = DruckOffsetSetting - OPA_OFFSET_STEP * ExpandBaro; // decrease offset to shift ADC up |
beeptime = 300; |
BaroExpandActive = 350; |
} |
else |
{ |
BaroAtUpperLimit = 1; |
} |
} |
else |
{ |
BaroAtUpperLimit = 0; |
BaroAtLowerLimit = 0; |
} |
} |
else // delay, because of expanding the Baro-Range |
{ |
// now clear the D-values |
SummenHoehe = HoehenWert * SM_FILTER; |
VarioMeter = 0; |
BaroExpandActive--; |
} |
// if height control is activated by an rc channel |
if(EE_Parameter.GlobalConfig & CFG_HOEHEN_SCHALTER) // Regler wird über Schalter gesteuert |
{ // check if parameter is less than activation threshold |
if(Parameter_MaxHoehe < 50) // for 3 or 2-state switch height control is disabled in lowest position |
{ //height control not active |
if(!delay--) |
{ |
HoehenReglerAktiv = 0; // disable height control |
SollHoehe = HoehenWert; // update SetPoint with current reading |
delay = 1; |
} |
} |
else |
{ //height control is activated |
HoehenReglerAktiv = 1; // enable height control |
delay = 200; |
} |
} |
else // no switchable height control |
{ |
SollHoehe = ((int16_t) ExternHoehenValue + (int16_t) Parameter_MaxHoehe) * (int)EE_Parameter.Hoehe_Verstaerkung; |
HoehenReglerAktiv = 1; |
} |
// calculate cos of nick and roll angle used for projection of the vertical hoover gas |
tmp_int = (int)(IntegralNick/GIER_GRAD_FAKTOR); // nick angle in deg |
tmp_int2 = (int)(IntegralRoll/GIER_GRAD_FAKTOR); // roll angle in deg |
CosAttitude = (int16_t)ihypot(tmp_int, tmp_int2); // phytagoras gives effective attitude angle in deg |
LIMIT_MAX(CosAttitude, 60); // limit effective attitude angle |
CosAttitude = c_cos_8192(CosAttitude); // cos of actual attitude |
VarioCharacter = ' '; |
if(HoehenReglerAktiv && !(FCFlags & FCFLAG_NOTLANDUNG)) |
{ |
#define HEIGHT_TRIM_UP 0x01 |
#define HEIGHT_TRIM_DOWN 0x02 |
static unsigned char HeightTrimmingFlag = 0x00; |
#define HEIGHT_CONTROL_STICKTHRESHOLD 15 |
// Holger original version |
// start of height control algorithm |
// the height control is only an attenuation of the actual gas stick. |
// I.e. it will work only if the gas stick is higher than the hover gas |
// and the hover height will be allways larger than height setpoint. |
if((EE_Parameter.ExtraConfig & CFG2_HEIGHT_LIMIT) || !(EE_Parameter.GlobalConfig & CFG_HOEHEN_SCHALTER)) // Regler wird über Schalter gesteuert) |
{ // old version |
HCGas = GasMischanteil; // take current stick gas as neutral point for the height control |
HeightTrimming = 0; |
} |
else |
{ |
// alternative height control |
// PD-Control with respect to hoover point |
// the thrust loss out of horizontal attitude is compensated |
// the setpoint will be fine adjusted with the gas stick position |
if(FCFlags & FCFLAG_FLY) // trim setpoint only when flying |
{ // gas stick is above hoover point |
if(StickGas > (StickGasHover + HEIGHT_CONTROL_STICKTHRESHOLD) && !BaroAtUpperLimit) |
{ |
if(HeightTrimmingFlag & HEIGHT_TRIM_DOWN) |
{ |
HeightTrimmingFlag &= ~HEIGHT_TRIM_DOWN; |
SollHoehe = HoehenWert; // update setpoint to current heigth |
} |
HeightTrimmingFlag |= HEIGHT_TRIM_UP; |
HeightTrimming += abs(StickGas - (StickGasHover + HEIGHT_CONTROL_STICKTHRESHOLD)); |
VarioCharacter = '+'; |
} // gas stick is below hoover point |
else if(StickGas < (StickGasHover - HEIGHT_CONTROL_STICKTHRESHOLD) && !BaroAtLowerLimit ) |
{ |
if(HeightTrimmingFlag & HEIGHT_TRIM_UP) |
{ |
HeightTrimmingFlag &= ~HEIGHT_TRIM_UP; |
SollHoehe = HoehenWert; // update setpoint to current heigth |
} |
HeightTrimmingFlag |= HEIGHT_TRIM_DOWN; |
HeightTrimming -= abs(StickGas - (StickGasHover - HEIGHT_CONTROL_STICKTHRESHOLD)); |
VarioCharacter = '-'; |
} |
else // Gas Stick in Hover Range |
{ |
if(HeightTrimmingFlag & (HEIGHT_TRIM_UP | HEIGHT_TRIM_DOWN)) |
{ |
HeightTrimmingFlag &= ~(HEIGHT_TRIM_UP | HEIGHT_TRIM_DOWN); |
HeightTrimming = 0; |
SollHoehe = HoehenWert; // update setpoint to current height |
if(EE_Parameter.ExtraConfig & CFG2_VARIO_BEEP) beeptime = 500; |
if(!StartTrigger && HoehenWert > 50) |
{ |
StartTrigger = 1; |
} |
} |
VarioCharacter = '='; |
} |
// Trim height set point |
if(abs(HeightTrimming) > 512) |
{ |
SollHoehe += (HeightTrimming * EE_Parameter.Hoehe_Verstaerkung)/(5 * 512 / 2); // move setpoint |
HeightTrimming = 0; |
LIMIT_MIN_MAX(SollHoehe, (HoehenWert-1024), (HoehenWert+1024)); // max. 10m Unterschied |
if(EE_Parameter.ExtraConfig & CFG2_VARIO_BEEP) beeptime = 75; |
//update hoover gas stick value when setpoint is shifted |
if(!EE_Parameter.Hoehe_StickNeutralPoint) |
{ |
StickGasHover = HoverGas/STICK_GAIN; //rescale back to stick value |
StickGasHover = (StickGasHover * UBat) / BattLowVoltageWarning; |
if(StickGasHover < 70) StickGasHover = 70; |
else if(StickGasHover > 150) StickGasHover = 150; |
} |
} |
if(BaroExpandActive) SollHoehe = HoehenWert; // update setpoint to current altitude if Expanding is active |
} //if FCFlags & MKFCFLAG_FLY |
else |
{ |
SollHoehe = HoehenWert - 400; |
if(EE_Parameter.Hoehe_StickNeutralPoint) StickGasHover = EE_Parameter.Hoehe_StickNeutralPoint; |
else StickGasHover = 120; |
HoverGas = GasMischanteil; |
} |
HCGas = HoverGas; // take hover gas (neutral point) |
} |
if(HoehenWert > SollHoehe || !(EE_Parameter.ExtraConfig & CFG2_HEIGHT_LIMIT)) |
{ |
// from this point the Heigth Control Algorithm is identical for both versions |
if(BaroExpandActive) // baro range expanding active |
{ |
HCGas = HoverGas; // hover while expanding baro adc range |
HeightDeviation = 0; |
} // EOF // baro range expanding active |
else // valid data from air pressure sensor |
{ |
// ------------------------- P-Part ---------------------------- |
tmp_long = (HoehenWert - SollHoehe); // positive when too high |
LIMIT_MIN_MAX(tmp_long, -32767L, 32767L); // avoid overflov when casting to int16_t |
HeightDeviation = (int)(tmp_long); // positive when too high |
tmp_long = (tmp_long * (long)Parameter_Hoehe_P) / 32L; // p-part |
LIMIT_MIN_MAX(tmp_long, -127 * STICK_GAIN, 256 * STICK_GAIN); // more than the full range makes no sense |
GasReduction = tmp_long; |
// ------------------------- D-Part 1: Vario Meter ---------------------------- |
tmp_int = VarioMeter / 8; |
LIMIT_MIN_MAX(tmp_int, -127, 128); |
tmp_int = (tmp_int * (long)Parameter_Luftdruck_D) / 4L; // scale to d-gain parameter |
LIMIT_MIN_MAX(tmp_int,-64 * STICK_GAIN, 64 * STICK_GAIN); |
if(HeightTrimmingFlag) tmp_int /= 4; // reduce d-part while trimming setpoint |
GasReduction += tmp_int; |
} // EOF no baro range expanding |
// ------------------------ D-Part 2: ACC-Z Integral ------------------------ |
if(Parameter_Hoehe_ACC_Wirkung) |
{ |
tmp_long = ((Mess_Integral_Hoch / 128L) * (int32_t) Parameter_Hoehe_ACC_Wirkung) / (128L / STICK_GAIN); |
LIMIT_MIN_MAX(tmp_long, -32 * STICK_GAIN, 64 * STICK_GAIN); |
GasReduction += tmp_long; |
} |
// ------------------------ D-Part 3: GpsZ ---------------------------------- |
tmp_int = (Parameter_Hoehe_GPS_Z * (int)FromNaviCtrl_Value.GpsZ)/128L; |
LIMIT_MIN_MAX(tmp_int, -32 * STICK_GAIN, 64 * STICK_GAIN); |
GasReduction += tmp_int; |
GasReduction = (long)((long)GasReduction * HoverGas) / 512; // scale to the gas value |
// ------------------------ ---------------------------------- |
HCGas -= GasReduction; |
// limit deviation from hoover point within the target region |
if(!HeightTrimming && HoverGas > 0) // height setpoint is not changed and hoover gas not zero |
{ |
unsigned int tmp; |
tmp = abs(HeightDeviation); |
if(tmp <= 60) |
{ |
LIMIT_MIN_MAX(HCGas, HoverGasMin, HoverGasMax); // limit gas around the hoover point |
} |
else |
{ |
tmp = (tmp - 60) / 32; |
if(tmp > 15) tmp = 15; |
if(HeightDeviation > 0) |
{ |
tmp = (HoverGasMin * (16 - tmp)) / 16; |
LIMIT_MIN_MAX(HCGas, tmp, HoverGasMax); // limit gas around the hoover point |
} |
else |
{ |
tmp = (HoverGasMax * (tmp + 16)) / 16; |
LIMIT_MIN_MAX(HCGas, HoverGasMin, tmp); // limit gas around the hoover point |
} |
} |
} |
// strech control output by inverse attitude projection 1/cos |
// + 1/cos(angle) ++++++++++++++++++++++++++ |
tmp_long2 = (int32_t)HCGas; |
tmp_long2 *= 8192L; |
tmp_long2 /= CosAttitude; |
HCGas = (int16_t)tmp_long2; |
// update height control gas averaging |
FilterHCGas = (FilterHCGas * (HC_GAS_AVERAGE - 1) + HCGas) / HC_GAS_AVERAGE; |
// limit height control gas pd-control output |
LIMIT_MIN_MAX(FilterHCGas, EE_Parameter.Hoehe_MinGas * STICK_GAIN, (MAX_GAS - 20) * STICK_GAIN); |
// set GasMischanteil to HeightControlGasFilter |
if(EE_Parameter.ExtraConfig & CFG2_HEIGHT_LIMIT) |
{ // old version |
LIMIT_MAX(FilterHCGas, GasMischanteil); // nicht mehr als Gas |
} |
GasMischanteil = FilterHCGas + (GasMischanteil - HoverGas) / 4; |
} |
}// EOF height control active |
else // HC not active |
{ |
//update hoover gas stick value when HC is not active |
if(!EE_Parameter.Hoehe_StickNeutralPoint) |
{ |
StickGasHover = HoverGas/STICK_GAIN; // rescale back to stick value |
StickGasHover = (StickGasHover * UBat) / BattLowVoltageWarning; |
} |
else StickGasHover = EE_Parameter.Hoehe_StickNeutralPoint; |
LIMIT_MIN_MAX(StickGasHover, 70, 150); // reserve some range for trim up and down |
FilterHCGas = GasMischanteil; |
} |
// Hover gas estimation by averaging gas control output on small z-velocities |
// this is done only if height contol option is selected in global config and aircraft is flying |
if((FCFlags & FCFLAG_FLY))// && !(FCFlags & FCFLAG_NOTLANDUNG)) |
{ |
if(HoverGasFilter == 0 || StartTrigger == 1) HoverGasFilter = HOVER_GAS_AVERAGE * (unsigned long)(GasMischanteil); // init estimation |
if(StartTrigger == 1) StartTrigger = 2; |
tmp_long2 = (int32_t)GasMischanteil; // take current thrust |
tmp_long2 *= CosAttitude; // apply attitude projection |
tmp_long2 /= 8192; |
// average vertical projected thrust |
if(modell_fliegt < 4000) // the first 8 seconds |
{ // reduce the time constant of averaging by factor of 4 to get much faster a stable value |
HoverGasFilter -= HoverGasFilter/(HOVER_GAS_AVERAGE/16L); |
HoverGasFilter += 16L * tmp_long2; |
} |
if(modell_fliegt < 8000) // the first 16 seconds |
{ // reduce the time constant of averaging by factor of 2 to get much faster a stable value |
HoverGasFilter -= HoverGasFilter/(HOVER_GAS_AVERAGE/4L); |
HoverGasFilter += 4L * tmp_long2; |
} |
else //later |
if(abs(VarioMeter) < 100) // only on small vertical speed |
{ |
HoverGasFilter -= HoverGasFilter/HOVER_GAS_AVERAGE; |
HoverGasFilter += tmp_long2; |
} |
HoverGas = (int16_t)(HoverGasFilter/HOVER_GAS_AVERAGE); |
if(EE_Parameter.Hoehe_HoverBand) |
{ |
int16_t band; |
band = HoverGas / EE_Parameter.Hoehe_HoverBand; // the higher the parameter the smaller the range |
HoverGasMin = HoverGas - band; |
HoverGasMax = HoverGas + band; |
} |
else |
{ // no limit |
HoverGasMin = 0; |
HoverGasMax = 1023; |
} |
} |
else |
{ |
StartTrigger = 0; |
HoverGasFilter = 0; |
HoverGas = 0; |
} |
}// EOF ParamSet.GlobalConfig & CFG_HEIGHT_CONTROL |
// limit gas to parameter setting |
LIMIT_MIN(GasMischanteil, (MIN_GAS + 10) * STICK_GAIN); |
if(GasMischanteil > (MAX_GAS - 20) * STICK_GAIN) GasMischanteil = (MAX_GAS - 20) * STICK_GAIN; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// all BL-Ctrl connected? |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(MissingMotor || Capacity.MinOfMaxPWM != 255) |
if(modell_fliegt > 1 && modell_fliegt < 50 && GasMischanteil > 0) |
{ |
modell_fliegt = 1; |
GasMischanteil = (MIN_GAS + 10) * STICK_GAIN; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Mischer und PI-Regler |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DebugOut.Analog[7] = GasMischanteil; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gier-Anteil |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
GierMischanteil = MesswertGier - sollGier * STICK_GAIN; // Regler für Gier |
#define MIN_GIERGAS (40*STICK_GAIN) // unter diesem Gaswert trotzdem Gieren |
if(GasMischanteil > MIN_GIERGAS) |
{ |
if(GierMischanteil > (GasMischanteil / 2)) GierMischanteil = GasMischanteil / 2; |
if(GierMischanteil < -(GasMischanteil / 2)) GierMischanteil = -(GasMischanteil / 2); |
} |
else |
{ |
if(GierMischanteil > (MIN_GIERGAS / 2)) GierMischanteil = MIN_GIERGAS / 2; |
if(GierMischanteil < -(MIN_GIERGAS / 2)) GierMischanteil = -(MIN_GIERGAS / 2); |
} |
tmp_int = MAX_GAS*STICK_GAIN; |
if(GierMischanteil > ((tmp_int - GasMischanteil))) GierMischanteil = ((tmp_int - GasMischanteil)); |
if(GierMischanteil < -((tmp_int - GasMischanteil))) GierMischanteil = -((tmp_int - GasMischanteil)); |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Nick-Achse |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DiffNick = MesswertNick - StickNick; // Differenz bestimmen |
if(IntegralFaktor) SummeNick += IntegralNickMalFaktor - StickNick; // I-Anteil bei Winkelregelung |
else SummeNick += DiffNick; // I-Anteil bei HH |
if(SummeNick > (STICK_GAIN * 16000L)) SummeNick = (STICK_GAIN * 16000L); |
if(SummeNick < -(16000L * STICK_GAIN)) SummeNick = -(16000L * STICK_GAIN); |
pd_ergebnis_nick = (EE_Parameter.Gyro_Stability * DiffNick) / 8 + SummeNick / Ki; // PI-Regler für Nick |
// Motor Vorn |
tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
if(pd_ergebnis_nick > tmp_int) pd_ergebnis_nick = tmp_int; |
if(pd_ergebnis_nick < -tmp_int) pd_ergebnis_nick = -tmp_int; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Roll-Achse |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DiffRoll = MesswertRoll - StickRoll; // Differenz bestimmen |
if(IntegralFaktor) SummeRoll += IntegralRollMalFaktor - StickRoll;// I-Anteil bei Winkelregelung |
else SummeRoll += DiffRoll; // I-Anteil bei HH |
if(SummeRoll > (STICK_GAIN * 16000L)) SummeRoll = (STICK_GAIN * 16000L); |
if(SummeRoll < -(16000L * STICK_GAIN)) SummeRoll = -(16000L * STICK_GAIN); |
pd_ergebnis_roll = (EE_Parameter.Gyro_Stability * DiffRoll) / 8 + SummeRoll / Ki; // PI-Regler für Roll |
tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
if(pd_ergebnis_roll > tmp_int) pd_ergebnis_roll = tmp_int; |
if(pd_ergebnis_roll < -tmp_int) pd_ergebnis_roll = -tmp_int; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Universal Mixer |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
for(i=0; i<MAX_MOTORS; i++) |
{ |
signed int tmp_int; |
if(Mixer.Motor[i][0] > 0) |
{ |
// Gas |
if(Mixer.Motor[i][0] == 64) tmp_int = GasMischanteil; else tmp_int = ((long)GasMischanteil * Mixer.Motor[i][0]) / 64L; |
// Nick |
if(Mixer.Motor[i][1] == 64) tmp_int += pd_ergebnis_nick; |
else if(Mixer.Motor[i][1] == -64) tmp_int -= pd_ergebnis_nick; |
else tmp_int += ((long)pd_ergebnis_nick * Mixer.Motor[i][1]) / 64L; |
// Roll |
if(Mixer.Motor[i][2] == 64) tmp_int += pd_ergebnis_roll; |
else if(Mixer.Motor[i][2] == -64) tmp_int -= pd_ergebnis_roll; |
else tmp_int += ((long)pd_ergebnis_roll * Mixer.Motor[i][2]) / 64L; |
// Gier |
if(Mixer.Motor[i][3] == 64) tmp_int += GierMischanteil; |
else if(Mixer.Motor[i][3] == -64) tmp_int -= GierMischanteil; |
else tmp_int += ((long)GierMischanteil * Mixer.Motor[i][3]) / 64L; |
if(tmp_int > tmp_motorwert[i]) tmp_int = (tmp_motorwert[i] + tmp_int) / 2; // MotorSmoothing |
else tmp_int = 2 * tmp_int - tmp_motorwert[i]; // MotorSmoothing |
LIMIT_MIN_MAX(tmp_int,MIN_GAS * 4,MAX_GAS * 4); |
Motor[i].SetPoint = tmp_int / 4; |
Motor[i].SetPointLowerBits = (tmp_int % 4)<<1; // (3 bits total) |
tmp_motorwert[i] = tmp_int; |
} |
else |
{ |
Motor[i].SetPoint = 0; |
Motor[i].SetPointLowerBits = 0; |
} |
} |
} |
/branches/v0.80d-Arthur-P/fc.h |
---|
0,0 → 1,120 |
/*####################################################################################### |
Flight Control |
#######################################################################################*/ |
#ifndef _FC_H |
#define _FC_H |
//#define GIER_GRAD_FAKTOR 1291L // Abhängigkeit zwischen GyroIntegral und Winkel |
//#define GIER_GRAD_FAKTOR 1160L |
extern long GIER_GRAD_FAKTOR; // Abhängigkeit zwischen GyroIntegral und Winkel |
#define STICK_GAIN 4 |
#define ACC_AMPLIFY 6 |
#define FCFLAG_MOTOR_RUN 0x01 |
#define FCFLAG_FLY 0x02 |
#define FCFLAG_CALIBRATE 0x04 |
#define FCFLAG_START 0x08 |
#define FCFLAG_NOTLANDUNG 0x10 |
#define FCFLAG_LOWBAT 0x20 |
#define FCFLAG_SPI_RX_ERR 0x40 |
#define FCFLAG_I2CERR 0x80 |
#define DEFEKT_G_NICK 0x01 |
#define DEFEKT_G_ROLL 0x02 |
#define DEFEKT_G_GIER 0x04 |
#define DEFEKT_A_NICK 0x08 |
#define DEFEKT_A_ROLL 0x10 |
#define DEFEKT_A_Z 0x20 |
#define DEFEKT_PRESSURE 0x40 |
#define DEFEKT_CAREFREE_ERR 0x80 |
#define DEFEKT_I2C 0x01 |
#define DEFEKT_BL_MISSING 0x02 |
#define DEFEKT_SPI_RX_ERR 0x04 |
#define DEFEKT_PPM_ERR 0x08 |
#define DEFEKT_MIXER_ERR 0x10 |
#define Poti1 Poti[0] |
#define Poti2 Poti[1] |
#define Poti3 Poti[2] |
#define Poti4 Poti[3] |
#define Poti5 Poti[4] |
#define Poti6 Poti[5] |
#define Poti7 Poti[6] |
#define Poti8 Poti[7] |
extern volatile unsigned char FCFlags; |
extern unsigned char Sekunde,Minute; |
extern unsigned int BaroExpandActive; |
extern long IntegralNick,IntegralNick2; |
extern long IntegralRoll,IntegralRoll2; |
//extern int IntegralNick,IntegralNick2; |
//extern int IntegralRoll,IntegralRoll2; |
extern unsigned char Poti[9]; |
extern long Mess_IntegralNick,Mess_IntegralNick2; |
extern long Mess_IntegralRoll,Mess_IntegralRoll2; |
extern long IntegralAccNick,IntegralAccRoll; |
extern long SummeNick,SummeRoll; |
extern volatile long Mess_Integral_Hoch; |
extern long Integral_Gier,Mess_Integral_Gier,Mess_Integral_Gier2; |
extern int KompassValue; |
extern int KompassStartwert; |
extern int KompassRichtung; |
extern unsigned char ControlHeading; |
extern int TrimNick, TrimRoll; |
extern long ErsatzKompass; |
extern int ErsatzKompassInGrad; // Kompasswert in Grad |
extern long HoehenWert; |
extern long SollHoehe; |
extern unsigned char CareFree; |
extern int MesswertNick,MesswertRoll,MesswertGier; |
extern int AdNeutralNick,AdNeutralRoll,AdNeutralGier, Mittelwert_AccNick, Mittelwert_AccRoll; |
extern unsigned int NeutralAccX, NeutralAccY; |
extern unsigned char HoehenReglerAktiv; |
extern int NeutralAccZ; |
extern long Umschlag180Nick, Umschlag180Roll; |
extern signed int ExternStickNick,ExternStickRoll,ExternStickGier; |
extern unsigned char Parameter_UserParam1,Parameter_UserParam2,Parameter_UserParam3,Parameter_UserParam4,Parameter_UserParam5,Parameter_UserParam6,Parameter_UserParam7,Parameter_UserParam8; |
extern int NaviAccNick,NaviAccRoll,NaviCntAcc; |
extern unsigned int modell_fliegt; |
extern void MotorRegler(void); |
extern void SendMotorData(void); |
//void CalibrierMittelwert(void); |
//void Mittelwert(void); |
extern void SetNeutral(unsigned char AccAdjustment); |
extern void Piep(unsigned char Anzahl, unsigned int dauer); |
extern void CopyDebugValues(void); |
extern unsigned char h,m,s; |
extern volatile unsigned char Timeout ; |
extern unsigned char CosinusNickWinkel, CosinusRollWinkel; |
extern int DiffNick,DiffRoll; |
//extern int Poti1, Poti2, Poti3, Poti4; |
extern volatile unsigned char SenderOkay; |
extern int StickNick,StickRoll,StickGier; |
extern char MotorenEin; |
extern unsigned char Parameter_Servo3,Parameter_Servo4,Parameter_Servo5; |
extern char VarioCharacter; |
extern int HoverGas; |
extern unsigned char Parameter_Luftdruck_D; |
extern unsigned char Parameter_MaxHoehe; |
extern unsigned char Parameter_Hoehe_P; |
extern unsigned char Parameter_Hoehe_ACC_Wirkung; |
extern unsigned char Parameter_KompassWirkung; |
extern unsigned char Parameter_Gyro_P; |
extern unsigned char Parameter_Gyro_I; |
extern unsigned char Parameter_Gier_P; |
extern unsigned char Parameter_ServoNickControl; |
extern unsigned char Parameter_ServoRollControl; |
extern unsigned char Parameter_AchsKopplung1; |
extern unsigned char Parameter_AchsKopplung2; |
//extern unsigned char Parameter_AchsGegenKopplung1; |
extern unsigned char Parameter_J16Bitmask; // for the J16 Output |
extern unsigned char Parameter_J16Timing; // for the J16 Output |
extern unsigned char Parameter_J17Bitmask; // for the J17 Output |
extern unsigned char Parameter_J17Timing; // for the J17 Output |
extern signed char MixerTable[MAX_MOTORS][4]; |
#endif //_FC_H |
/branches/v0.80d-Arthur-P/flight.pnproj |
---|
0,0 → 1,0 |
<Project name="Flight-Ctrl"><File path="uart.h"></File><File path="jeti.h"></File><File path="main.c"></File><File path="main.h"></File><File path="makefile"></File><File path="uart.c"></File><File path="printf_P.h"></File><File path="timer0.c"></File><File path="timer0.h"></File><File path="old_macros.h"></File><File path="twimaster.c"></File><File path="version.txt"></File><File path="twimaster.h"></File><File path="rc.c"></File><File path="rc.h"></File><File path="fc.h"></File><File path="menu.h"></File><File path="menu.c"></File><File path="_Settings.h"></File><File path="analog.c"></File><File path="analog.h"></File><File path="GPS.c"></File><File path="gps.h"></File><File path="License.txt"></File><File path="spi.h"></File><File path="spi.c"></File><File path="led.h"></File><File path="led.c"></File><File path="fc.c"></File><File path="mymath.c"></File><File path="mymath.h"></File><File path="isqrt.S"></File><File path="Spektrum.c"></File><File path="Spektrum.h"></File><File path="eeprom.h"></File><File path="eeprom.c"></File><File path="libfc.h"></File><File path="debug.c"></File><File path="debug.h"></File></Project> |
/branches/v0.80d-Arthur-P/flight.pnps |
---|
0,0 → 1,0 |
<pd><ViewState><e p="Flight-Ctrl" x="true"></e></ViewState></pd> |
/branches/v0.80d-Arthur-P/gps.h |
---|
0,0 → 1,7 |
extern signed int GPS_Nick; |
extern signed int GPS_Roll; |
extern signed int GPS_Nick2; |
extern signed int GPS_Roll2; |
void GPS_Neutral(void); |
void GPS_BerechneZielrichtung(void); |
/branches/v0.80d-Arthur-P/isqrt.S |
---|
0,0 → 1,203 |
;-----------------------------------------------------------------------------; |
; Fast integer squareroot routines for avr-gcc project (C)ChaN, 2008 |
; http://elm-chan.org/docs/avrlib/sqrt32.S |
;-----------------------------------------------------------------------------; |
; uint16_t isqrt32 (uint32_t n); |
; uint8_t isqrt16 (uint16_t n); |
; uint16_t ihypot (int16_t x, int16_t y); |
;-----------------------------------------------------------------------------: |
; 32bit integer squareroot |
;-----------------------------------------------------------------------------; |
; uint16_t isqrt32 ( |
; uint32_t n |
; ); |
; |
; Return Value: |
; Squareroot of n. |
; |
; Size = 53 words |
; Clock = 532..548 cycles |
; Stack = 0 byte |
.global isqrt32 |
.func isqrt32 |
isqrt32: |
clr r0 |
clr r18 |
clr r19 |
clr r20 |
ldi r21, 1 |
clr r27 |
clr r30 |
clr r31 |
ldi r26, 16 |
1: lsl r22 |
rol r23 |
rol r24 |
rol r25 |
rol r0 |
rol r18 |
rol r19 |
rol r20 |
lsl r22 |
rol r23 |
rol r24 |
rol r25 |
rol r0 |
rol r18 |
rol r19 |
rol r20 |
brpl 2f |
add r0, r21 |
adc r18, r27 |
adc r19, r30 |
adc r20, r31 |
rjmp 3f |
2: sub r0, r21 |
sbc r18, r27 |
sbc r19, r30 |
sbc r20, r31 |
3: lsl r21 |
rol r27 |
rol r30 |
andi r21, 0b11111000 |
ori r21, 0b00000101 |
sbrc r20, 7 |
subi r21, 2 |
dec r26 |
brne 1b |
lsr r30 |
ror r27 |
ror r21 |
lsr r30 |
ror r27 |
ror r21 |
mov r24, r21 |
mov r25, r27 |
ret |
.endfunc |
;-----------------------------------------------------------------------------: |
; 16bit integer squareroot |
;-----------------------------------------------------------------------------; |
; uint8_t isqrt16 ( |
; uint16_t n |
; ); |
; |
; Return Value: |
; Squareroot of n. |
; |
; Size = 33 words |
; Clock = 181..189 cycles |
; Stack = 0 byte |
.global isqrt16 |
.func isqrt16 |
isqrt16: |
clr r18 |
clr r19 |
ldi r20, 1 |
clr r21 |
ldi r22, 8 |
1: lsl r24 |
rol r25 |
rol r18 |
rol r19 |
lsl r24 |
rol r25 |
rol r18 |
rol r19 |
brpl 2f |
add r18, r20 |
adc r19, r21 |
rjmp 3f |
2: sub r18, r20 |
sbc r19, r21 |
3: lsl r20 |
rol r21 |
andi r20, 0b11111000 |
ori r20, 0b00000101 |
sbrc r19, 7 |
subi r20, 2 |
dec r22 |
brne 1b |
lsr r21 |
ror r20 |
lsr r21 |
ror r20 |
mov r24, r20 |
ret |
.endfunc |
;-----------------------------------------------------------------------------: |
; 16bit integer hypot (megaAVR is required) |
;-----------------------------------------------------------------------------; |
; uint16_t ihypot ( |
; int16_t x, |
; int16_t y |
; ); |
; |
; Return Value: |
; Squareroot of (x*x + y*y) |
; |
; Size = 42 words |
; Clock = 581..597 cycles |
; Stack = 0 byte |
.global ihypot |
.func ihypot |
ihypot: |
clr r26 |
sbrs r25, 7 |
rjmp 1f |
com r24 |
com r25 |
adc r24, r26 |
adc r25, r26 |
1: sbrs r23, 7 |
rjmp 2f |
com r22 |
com r23 |
adc r22, r26 |
adc r23, r26 |
2: mul r22, r22 |
movw r18, r0 |
mul r23, r23 |
movw r20, r0 |
mul r22, r23 |
add r19, r0 |
adc r20, r1 |
adc r21, r26 |
add r19, r0 |
adc r20, r1 |
adc r21, r26 |
mul r24, r24 |
movw r30, r0 |
mul r25, r25 |
add r18, r30 |
adc r19, r31 |
adc r20, r0 |
adc r21, r1 |
mul r24, r25 |
add r19, r0 |
adc r20, r1 |
adc r21, r26 |
add r19, r0 |
adc r20, r1 |
adc r21, r26 |
movw r24, r20 |
movw r22, r18 |
clr r1 |
rjmp isqrt32 |
.endfunc |
/branches/v0.80d-Arthur-P/isqrt.h |
---|
0,0 → 1,11 |
#ifndef _ISQRT_H |
#define _ISQRT_H |
#include <inttypes.h> |
// coded in assembler file |
extern uint16_t isqrt32(uint32_t n); |
extern uint8_t isqrt16(uint16_t n); |
extern uint16_t ihypot(int16_t x, int16_t y); |
#endif // _ISQRT_H |
/branches/v0.80d-Arthur-P/jetimenu.c |
---|
0,0 → 1,162 |
#include "jetimenu.h" |
#include "libfc.h" |
#include "printf_P.h" |
#include "main.h" |
#include "spi.h" |
#include "capacity.h" |
#define JETIBOX_KEY_RIGHT 0x1F |
#define JETIBOX_KEY_UP 0x2F |
#define JETIBOX_KEY_DOWN 0x4F |
#define JETIBOX_KEY_LEFT 0x8F |
#define JETIBOX_KEY_NONE 0x0F |
#define JETIBOX_KEY_UNDEF 0x00 |
#define JetiBox_printfxy(x,y,format, args...) { LIBFC_JetiBox_SetPos(y * 16 + x); _printf_P(&LIBFC_JetiBox_Putchar, PSTR(format) , ## args);} |
#define JetiBox_printf(format, args...) { _printf_P(&LIBFC_JetiBox_Putchar, PSTR(format) , ## args);} |
// ----------------------------------------------------------- |
// the menu functions |
// ----------------------------------------------------------- |
void Menu_Status(uint8_t key) |
{ //0123456789ABCDEF |
JetiBox_printfxy(0,0,"%2i.%1iV",UBat/10, UBat%10); |
if(NaviDataOkay) |
{ |
// JetiBox_printfxy(6,0,"%03dm %03d%c", GPSInfo.HomeDistance/10,GPSInfo.HomeBearing, 0xDF); |
JetiBox_printfxy(6,0,"%3d%c %03dm",(int)(ErsatzKompass / GIER_GRAD_FAKTOR), 0xDF, GPSInfo.HomeDistance/10); |
} |
else |
{ |
JetiBox_printfxy(6,0,"Status"); |
} |
if(NC_ErrorCode) JetiBox_printfxy(6,0,"ERROR: %2d",NC_ErrorCode); |
JetiBox_printfxy(0,1,"%4i %2i:%02i",Capacity.UsedCapacity,FlugSekunden/60,FlugSekunden%60); |
if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
JetiBox_printfxy(10,1,"%4im%c", (int16_t)(HoehenWert/100),VarioCharacter); |
} |
} |
void Menu_Temperature(uint8_t key) |
{ //0123456789ABCDEF |
JetiBox_printfxy(0,0,"%3i %3i %3i %3i", Motor[0].Temperature, Motor[1].Temperature, Motor[2].Temperature, Motor[3].Temperature); |
JetiBox_printfxy(0,1,"%3i %3i %3i %3i", Motor[4].Temperature, Motor[5].Temperature, Motor[6].Temperature, Motor[7].Temperature); |
if(RequiredMotors <= 4) |
{ |
JetiBox_printfxy(0,1,"Temperatures "); |
} |
else |
if(RequiredMotors <= 6) |
{ |
JetiBox_printfxy(8,1,"\%cC ",0xdf); |
} |
} |
void Menu_Battery(uint8_t key) |
{ //0123456789ABCDEF |
JetiBox_printfxy(0,0,"%2i.%1iV %3i.%1iA", UBat/10, UBat%10, Capacity.ActualCurrent/10, Capacity.ActualCurrent%10); |
JetiBox_printfxy(0,1,"%4iW %6imAh",Capacity.ActualPower, Capacity.UsedCapacity); |
} |
void Menu_PosInfo(uint8_t key) |
{ |
if(NaviDataOkay) |
{ |
JetiBox_printfxy(0,0,"%2um/s Sat:%d ",GPSInfo.Speed,GPSInfo.NumOfSats); |
switch (GPSInfo.SatFix) |
{ |
case SATFIX_3D: |
JetiBox_printfxy(12,0," 3D"); |
break; |
case SATFIX_2D: |
case SATFIX_NONE: |
default: |
JetiBox_printfxy(12,0,"NoFx"); |
break; |
} |
if(GPSInfo.Flags & FLAG_DIFFSOLN) |
{ |
JetiBox_printfxy(12,0,"DGPS"); |
} |
JetiBox_printfxy(0,1,"Home:%3dm %3d%c", GPSInfo.HomeDistance/10, GPSInfo.HomeBearing, 0xDF); |
} |
else |
{ //0123456789ABCDEF |
JetiBox_printfxy(2,0,"No NaviCtrl!"); |
} |
} |
// ----------------------------------------------------------- |
// the menu topology |
// ----------------------------------------------------------- |
typedef void (*pFctMenu) (uint8_t); // the menu item handler function pointer |
typedef struct{ |
int8_t left; |
int8_t right; |
int8_t up; |
int8_t down; |
pFctMenu pHandler; |
} MENU_ENTRY; |
// the menu navigation structure |
/* | |
3 - 0 - 1 - 2 - 3 - 0 |
*/ |
const MENU_ENTRY JetiBox_Menu[] PROGMEM= |
{ // l r u d pHandler |
{3, 1, 0, 0, &Menu_Status }, // 0 |
{0, 2, 1, 1, &Menu_Temperature }, // 1 |
{1, 3, 2, 2, &Menu_Battery }, // 2 |
{2, 0, 3, 3, &Menu_PosInfo }, // 3 |
}; |
// ----------------------------------------------------------- |
// Update display buffer |
// ----------------------------------------------------------- |
unsigned char JetiBox_Update(unsigned char key) |
{ |
static uint8_t item = 0, last_item = 0; // the menu item |
// navigate within the menu by key action |
last_item = item; |
switch(key) |
{ |
case JETIBOX_KEY_LEFT: |
if (item == 0) return (1); // switch back to jeti expander menu |
else item = pgm_read_byte(&JetiBox_Menu[item].left); //trigger to left menu item |
break; |
case JETIBOX_KEY_RIGHT: |
item = pgm_read_byte(&JetiBox_Menu[item].right); //trigger to right menu item |
break; |
case JETIBOX_KEY_UP: |
item = pgm_read_byte(&JetiBox_Menu[item].up); //trigger to up menu item |
break; |
case JETIBOX_KEY_DOWN: |
item = pgm_read_byte(&JetiBox_Menu[item].down); //trigger to down menu item |
break; |
default: |
break; |
} |
// if the menu item has been changed, do not pass the key to the item handler |
// to avoid jumping over to items |
if(item != last_item) key = JETIBOX_KEY_UNDEF; |
LIBFC_JetiBox_Clear(); |
//execute menu item handler |
((pFctMenu)(pgm_read_word(&(JetiBox_Menu[item].pHandler))))(key); |
return (0); |
} |
/branches/v0.80d-Arthur-P/jetimenu.h |
---|
0,0 → 1,6 |
#ifndef _JETIMENU_H |
#define _JETIMENU_H |
extern unsigned char JetiBox_Update(unsigned char key); |
#endif //_JETIMENU_H |
/branches/v0.80d-Arthur-P/led.c |
---|
0,0 → 1,99 |
#include <inttypes.h> |
#include "main.h" |
uint16_t LED1_Timing = 0; |
uint16_t LED2_Timing = 0; |
unsigned char J16Blinkcount = 0, J16Mask = 1; |
unsigned char J17Blinkcount = 0, J17Mask = 1; |
// initializes the LED control outputs J16, J17 |
void LED_Init(void) |
{ |
// set PC2 & PC3 as output (control of J16 & J17) |
DDRC |= (1<<DDC2)|(1<<DDC3); |
J16_OFF; |
J17_OFF; |
J16Blinkcount = 0; J16Mask = 128; |
J17Blinkcount = 0; J17Mask = 128; |
} |
// called in UpdateMotors() every 2ms |
void LED_Update(void) |
{ |
static char delay = 0; |
static unsigned char J16Bitmask = 0; |
static unsigned char J17Bitmask = 0; |
static unsigned char J16Warn = 0, J17Warn = 0; |
if(!delay--) // 10ms Intervall |
{ |
delay = 4; |
if(FCFlags & (FCFLAG_LOWBAT | FCFLAG_NOTLANDUNG | FCFLAG_I2CERR)) |
{ |
if(EE_Parameter.WARN_J16_Bitmask) |
{ |
if(!J16Warn) J16Blinkcount = 4; |
J16Warn = 1; |
} |
if(EE_Parameter.WARN_J17_Bitmask) |
{ |
if(!J17Warn) J17Blinkcount = 4; |
J17Warn = 1; |
} |
} |
else |
{ |
J16Warn = 0; |
J17Warn = 0; |
J16Bitmask = EE_Parameter.J16Bitmask; |
J17Bitmask = EE_Parameter.J17Bitmask; |
} |
if(!J16Warn) |
{ |
if((EE_Parameter.BitConfig & CFG_MOTOR_BLINK) && !MotorenEin) {if(EE_Parameter.BitConfig & CFG_MOTOR_OFF_LED1) J16_ON; else J16_OFF;} |
else |
if((EE_Parameter.J16Timing > 247) && (Parameter_J16Timing > 220)) {if(J16Bitmask & 128) J16_ON; else J16_OFF;} |
else |
if((EE_Parameter.J16Timing > 247) && (Parameter_J16Timing < 10)) {if(J16Bitmask & 128) J16_OFF; else J16_ON;} |
else |
if(!J16Blinkcount--) |
{ |
J16Blinkcount = Parameter_J16Timing-1; |
if(J16Mask == 1) J16Mask = 128; else J16Mask /= 2; |
if(J16Mask & J16Bitmask) J16_ON; else J16_OFF; |
} |
} |
else |
if(!J16Blinkcount--) |
{ |
J16Blinkcount = 10-1; |
if(J16Mask == 1) J16Mask = 128; else J16Mask /= 2; |
if(J16Mask & EE_Parameter.WARN_J16_Bitmask) J16_ON; else J16_OFF; |
} |
if(!J17Warn) |
{ |
if((EE_Parameter.BitConfig & CFG_MOTOR_BLINK) && !MotorenEin) {if(EE_Parameter.BitConfig & CFG_MOTOR_OFF_LED2) J17_ON; else J17_OFF;} |
else |
if((EE_Parameter.J17Timing > 247) && (Parameter_J17Timing > 220)) {if(J17Bitmask & 128) J17_ON; else J17_OFF;} |
else |
if((EE_Parameter.J17Timing > 247) && (Parameter_J17Timing < 10)) {if(J17Bitmask & 128) J17_OFF; else J17_ON;} |
else |
if(!J17Blinkcount--) |
{ |
J17Blinkcount = Parameter_J17Timing-1; |
if(J17Mask == 1) J17Mask = 128; else J17Mask /= 2; |
if(J17Mask & J17Bitmask) J17_ON; else J17_OFF; |
} |
} |
else |
if(!J17Blinkcount--) |
{ |
J17Blinkcount = 10-1; |
if(J17Mask == 1) J17Mask = 128; else J17Mask /= 2; |
if(J17Mask & EE_Parameter.WARN_J17_Bitmask) J17_ON; else J17_OFF; |
} |
} |
} |
/branches/v0.80d-Arthur-P/led.h |
---|
0,0 → 1,11 |
#include <avr/io.h> |
#define J16_ON PORTC |= (1<<PORTC2) |
#define J16_OFF PORTC &= ~(1<<PORTC2) |
#define J16_TOGGLE PORTC ^= (1<<PORTC2) |
#define J17_ON PORTC |= (1<<PORTC3) |
#define J17_OFF PORTC &= ~(1<<PORTC3) |
#define J17_TOGGLE PORTC ^= (1<<PORTC3) |
extern void LED_Init(void); |
extern void LED_Update(void); |
/branches/v0.80d-Arthur-P/libfc.h |
---|
0,0 → 1,20 |
#ifndef _LIBFC_H |
#define _LIBFC_H |
#define CPU_UNKNOWN 0 |
#define CPU_ATMEGA644 1 |
#define CPU_ATMEGA644P 2 |
#define CPU_ATMEGA1284 3 |
#define CPU_ATMEGA1284P 4 |
extern void LIBFC_Init(void); |
extern void LIBFC_Polling(void); |
extern void LIBFC_ReceiverInit(unsigned char rtype); |
extern void LIBFC_JetiBox_Putchar(char c); |
extern void LIBFC_JetiBox_SetPos(unsigned char index); |
extern void LIBFC_JetiBox_Clear(void); |
extern unsigned char LIBFC_GetCPUType(void); |
#endif //_LIBFC_H |
/branches/v0.80d-Arthur-P/main.c |
---|
0,0 → 1,402 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) Holger Buss, Ingo Busker |
// + Nur für den privaten Gebrauch / NON-COMMERCIAL USE ONLY |
// + 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 oder Nutzung 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 the sources to other systems or using the software on other systems (except 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 PlatinenVersion = 10; |
unsigned char SendVersionToNavi = 1; |
unsigned char BattLowVoltageWarning = 94; |
unsigned int FlugMinuten = 0,FlugMinutenGesamt = 0; |
unsigned int FlugSekunden = 0; |
pVoidFnct_pVoidFnctChar_const_fmt _printf_P; |
unsigned char FoundMotors = 0; |
void CalMk3Mag(void) |
{ |
static unsigned char stick = 1; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > -20) stick = 0; |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < -70) && !stick) |
{ |
stick = 1; |
WinkelOut.CalcState++; |
if(WinkelOut.CalcState > 4) |
{ |
// WinkelOut.CalcState = 0; // in Uart.c |
beeptime = 1000; |
} |
else Piep(WinkelOut.CalcState,150); |
} |
DebugOut.Analog[19] = WinkelOut.CalcState; |
} |
void LipoDetection(unsigned char print) |
{ |
#define MAX_CELL_VOLTAGE 43 // max cell volatage for LiPO |
unsigned int timer, cells; |
if(print) printf("\n\rBatt:"); |
if(EE_Parameter.UnterspannungsWarnung < 50) // automatische Zellenerkennung |
{ |
timer = SetDelay(500); |
if(print) while (!CheckDelay(timer)); |
// up to 6s LiPo, less than 2s is technical impossible |
for(cells = 2; cells < 7; cells++) |
{ |
if(UBat < cells * MAX_CELL_VOLTAGE) break; |
} |
BattLowVoltageWarning = cells * EE_Parameter.UnterspannungsWarnung; |
if(print) |
{ |
Piep(cells, 200); |
printf(" %d Cells ", cells); |
} |
} |
else BattLowVoltageWarning = EE_Parameter.UnterspannungsWarnung; |
if(print) printf(" Low warning level: %d.%d",BattLowVoltageWarning/10,BattLowVoltageWarning%10); |
} |
//############################################################################ |
//Hauptprogramm |
int main (void) |
//############################################################################ |
{ |
unsigned int timer,i,timer2 = 0, timerPolling; |
DDRB = 0x00; |
PORTB = 0x00; |
for(timer = 0; timer < 1000; timer++); // verzögern |
#if (defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)) |
PlatinenVersion = 21; |
#else |
if(PINB & 0x01) |
{ |
if(PINB & 0x02) PlatinenVersion = 13; |
else PlatinenVersion = 11; |
} |
else |
{ |
if(PINB & 0x02) PlatinenVersion = 20; |
else PlatinenVersion = 10; |
} |
#endif |
DDRC = 0x81; // SCL |
DDRC |=0x40; // HEF4017 Reset |
PORTC = 0xff; // Pullup SDA |
DDRB = 0x1B; // LEDs und Druckoffset |
PORTB = 0x01; // LED_Rot |
DDRD = 0x3E; // Speaker & TXD & J3 J4 J5 |
PORTD = 0x47; // LED |
HEF4017R_ON; |
MCUSR &=~(1<<WDRF); |
WDTCSR |= (1<<WDCE)|(1<<WDE); |
WDTCSR = 0; |
beeptime = 2500; |
StickGier = 0; PPM_in[K_GAS] = 0; StickRoll = 0; StickNick = 0; |
if(PlatinenVersion >= 20) GIER_GRAD_FAKTOR = 1220; else GIER_GRAD_FAKTOR = 1291; // unterschiedlich für ME und ENC |
ROT_OFF; |
Timer_Init(); |
TIMER2_Init(); |
UART_Init(); |
rc_sum_init(); |
ADC_Init(); |
I2C_Init(); |
SPI_MasterInit(); |
Capacity_Init(); |
LIBFC_Init(); |
GRN_ON; |
sei(); |
ParamSet_Init(); |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Check connected BL-Ctrls |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Check connected BL-Ctrls |
BLFlags |= BLFLAG_READ_VERSION; |
motor_read = 0; // read the first I2C-Data |
SendMotorData(); |
timer = SetDelay(500); |
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer |
printf("\n\rFound BL-Ctrl: "); |
timer = SetDelay(4000); |
for(i=0; i < MAX_MOTORS; i++) |
{ |
SendMotorData(); |
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer |
if(Mixer.Motor[i][0] > 0) // wait max 4 sec for the BL-Ctrls to wake up |
{ |
while(!CheckDelay(timer) && !(Motor[i].State & MOTOR_STATE_PRESENT_MASK) ) |
{ |
SendMotorData(); |
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer |
} |
} |
if(Motor[i].State & MOTOR_STATE_PRESENT_MASK) |
{ |
printf("%d",i+1); |
FoundMotors++; |
// if(Motor[i].Version & MOTOR_STATE_NEW_PROTOCOL_MASK) printf("(new) "); |
} |
} |
for(i=0; i < MAX_MOTORS; i++) |
{ |
if(!(Motor[i].State & MOTOR_STATE_PRESENT_MASK) && Mixer.Motor[i][0] > 0) |
{ |
printf("\n\r\n\r!! MISSING BL-CTRL: %d !!",i+1); |
ServoActive = 2; // just in case the FC would be used as camera-stabilizer |
} |
Motor[i].State &= ~MOTOR_STATE_ERROR_MASK; // clear error counter |
} |
printf("\n\r==================================="); |
if(RequiredMotors < FoundMotors) VersionInfo.HardwareError[1] |= DEFEKT_MIXER_ERR; |
//if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
printf("\n\rCalibrating pressure sensor.."); |
timer = SetDelay(1000); |
SucheLuftruckOffset(); |
while (!CheckDelay(timer)); |
printf("OK\n\r"); |
} |
SetNeutral(0); |
ROT_OFF; |
beeptime = 2000; |
ExternControl.Digital[0] = 0x55; |
FlugMinuten = (unsigned int)GetParamByte(PID_FLIGHT_MINUTES) * 256 + (unsigned int)GetParamByte(PID_FLIGHT_MINUTES + 1); |
FlugMinutenGesamt = (unsigned int)GetParamByte(PID_FLIGHT_MINUTES_TOTAL) * 256 + (unsigned int)GetParamByte(PID_FLIGHT_MINUTES_TOTAL + 1); |
if((FlugMinutenGesamt == 0xFFFF) || (FlugMinuten == 0xFFFF)) |
{ |
FlugMinuten = 0; |
FlugMinutenGesamt = 0; |
} |
printf("\n\rFlight-time %u min Total:%u min", FlugMinuten, FlugMinutenGesamt); |
printf("\n\rControl: "); |
if (EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) printf("HeadingHold"); |
else printf("Normal (ACC-Mode)"); |
LcdClear(); |
I2CTimeout = 5000; |
WinkelOut.Orientation = 1; |
LipoDetection(1); |
LIBFC_ReceiverInit(EE_Parameter.Receiver); |
printf("\n\r===================================\n\r"); |
//SpektrumBinding(); |
timer = SetDelay(2000); |
timerPolling = SetDelay(250); |
Debug(ANSI_CLEAR "FC-Start!\n\rFlugzeit: %d min", FlugMinutenGesamt); // Note: this won't waste flash memory, if #DEBUG is not active |
DebugOut.Status[0] = 0x01 | 0x02; |
while (1) |
{ |
if(CheckDelay(timerPolling)) |
{ |
timerPolling = SetDelay(100); |
LIBFC_Polling(); |
} |
if(UpdateMotor && AdReady) // ReglerIntervall |
{ |
UpdateMotor=0; |
if(WinkelOut.CalcState) CalMk3Mag(); |
else MotorRegler(); |
SendMotorData(); |
ROT_OFF; |
if(SenderOkay) { SenderOkay--; VersionInfo.HardwareError[1] &= ~DEFEKT_PPM_ERR; } |
else |
{ |
TIMSK1 |= _BV(ICIE1); // enable PPM-Input |
PPM_in[0] = 0; // set RSSI to zero on data timeout |
VersionInfo.HardwareError[1] |= DEFEKT_PPM_ERR; |
} |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//if(HoehenReglerAktiv && NaviDataOkay && SenderOkay < 160 && SenderOkay > 10 && FromNaviCtrl_Value.SerialDataOkay > 220) SenderOkay = 160; |
//if(HoehenReglerAktiv && NaviDataOkay && SenderOkay < 101 && SenderOkay > 10 && FromNaviCtrl_Value.SerialDataOkay > 1) SenderOkay = 101; |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!--I2CTimeout || MissingMotor) |
{ |
if(!I2CTimeout) |
{ |
I2C_Reset(); |
I2CTimeout = 5; |
DebugOut.Analog[28]++; // I2C-Error |
FCFlags |= FCFLAG_I2CERR; |
VersionInfo.HardwareError[1] |= DEFEKT_I2C; |
DebugOut.Status[1] |= 0x02; // BL-Error-Status |
} |
if((BeepMuster == 0xffff) && MotorenEin) |
{ |
beeptime = 10000; |
BeepMuster = 0x0080; |
} |
} |
else |
{ |
ROT_OFF; |
if(!beeptime) |
{ |
FCFlags &= ~FCFLAG_I2CERR; |
} |
} |
if(!UpdateMotor) |
{ |
DatenUebertragung(); |
BearbeiteRxDaten(); |
if(CheckDelay(timer)) |
{ |
static unsigned char second; |
timer += 20; // 20 ms interval |
if(MissingMotor) |
{ |
VersionInfo.HardwareError[1] |= DEFEKT_BL_MISSING; |
DebugOut.Status[1] |= 0x02; // BL-Error-Status |
} |
else |
{ |
VersionInfo.HardwareError[1] &= ~DEFEKT_BL_MISSING; |
if(I2CTimeout > 6) DebugOut.Status[1] &= ~0x02; // BL-Error-Status |
} |
if(I2CTimeout > 6) VersionInfo.HardwareError[1] &= ~DEFEKT_I2C; |
if(PcZugriff) PcZugriff--; |
else |
{ |
ExternControl.Config = 0; |
ExternStickNick = 0; |
ExternStickRoll = 0; |
ExternStickGier = 0; |
if(BeepMuster == 0xffff && SenderOkay == 0) |
{ |
beeptime = 15000; |
BeepMuster = 0x0c00; |
} |
} |
if(NaviDataOkay > 200) |
{ |
NaviDataOkay--; |
FCFlags &= ~FCFLAG_SPI_RX_ERR; |
VersionInfo.HardwareError[1] &= ~DEFEKT_SPI_RX_ERR; |
} |
else |
{ |
if(NC_Version.Compatible) |
{ |
FCFlags |= FCFLAG_SPI_RX_ERR; |
VersionInfo.HardwareError[1] |= DEFEKT_SPI_RX_ERR; |
if(BeepMuster == 0xffff && MotorenEin) |
{ |
beeptime = 15000; |
BeepMuster = 0xA800; |
} |
} |
GPS_Nick = 0; |
GPS_Roll = 0; |
//if(!beeptime) |
FromNaviCtrl.CompassValue = -1; |
NaviDataOkay = 0; |
} |
if(UBat < BattLowVoltageWarning) |
{ |
FCFlags |= FCFLAG_LOWBAT; |
if(BeepMuster == 0xffff) |
{ |
beeptime = 6000; |
BeepMuster = 0x0300; |
} |
} |
else if(!beeptime) FCFlags &= ~FCFLAG_LOWBAT; |
SPI_StartTransmitPacket(); |
SendSPI = 4; |
if(!MotorenEin) timer2 = 1450; // 0,5 Minuten aufrunden |
else |
if(++second == 49) |
{ |
second = 0; |
FlugSekunden++; |
} |
if(++timer2 == 2930) // eine Minute |
{ |
timer2 = 0; |
FlugMinuten++; |
FlugMinutenGesamt++; |
SetParamByte(PID_FLIGHT_MINUTES,FlugMinuten / 256); |
SetParamByte(PID_FLIGHT_MINUTES+1,FlugMinuten % 256); |
SetParamByte(PID_FLIGHT_MINUTES_TOTAL,FlugMinutenGesamt / 256); |
SetParamByte(PID_FLIGHT_MINUTES_TOTAL+1,FlugMinutenGesamt % 256); |
timer = SetDelay(20); // falls "timer += 20;" mal nicht geht |
} |
} |
LED_Update(); |
Capacity_Update(); |
} |
} |
if(!SendSPI) { SPI_TransmitByte(); } |
} |
return (1); |
} |
/branches/v0.80d-Arthur-P/main.h |
---|
0,0 → 1,75 |
#ifndef _MAIN_H |
#define _MAIN_H |
//#define DEBUG // use to activate debug output to MK-Tool: use Debug(text); |
//#define ACT_S3D_SUMMENSIGNAL |
//#define SWITCH_LEARNS_CAREFREE |
//#define RECEIVER_SPEKTRUM_EXP |
// neue Hardware |
#define ROT_OFF {if((PlatinenVersion == 10)||(PlatinenVersion >= 20)) PORTB &=~0x01; else PORTB |= 0x01;} |
#define ROT_ON {if((PlatinenVersion == 10)||(PlatinenVersion >= 20)) PORTB |= 0x01; else PORTB &=~0x01;} |
#define ROT_FLASH PORTB ^= 0x01 |
#define GRN_OFF {if((PlatinenVersion < 12)) PORTB &=~0x02; else PORTB |= 0x02;} |
#define GRN_ON {if((PlatinenVersion < 12)) PORTB |= 0x02; else PORTB &=~0x02;} |
#define GRN_FLASH PORTB ^= 0x02 |
#define SYSCLK F_CPU |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define J3High PORTD |= 0x20 |
#define J3Low PORTD &= ~0x20 |
#define J4High PORTD |= 0x10 |
#define J4Low PORTD &= ~0x10 |
#define J5High PORTD |= 0x08 |
#define J5Low PORTD &= ~0x08 |
extern volatile unsigned char SenderOkay; |
extern unsigned char BattLowVoltageWarning; |
extern unsigned char CosinusNickWinkel, CosinusRollWinkel; |
extern unsigned char PlatinenVersion; |
extern unsigned char SendVersionToNavi; |
extern unsigned char FoundMotors; |
void LipoDetection(unsigned char print); |
extern unsigned int FlugMinuten,FlugMinutenGesamt,FlugSekunden; |
#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 "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 "spi.h" |
#include "led.h" |
#include "spektrum.h" |
#include "capacity.h" |
#include "eeprom.h" |
#include "libfc.h" |
#include "debug.h" |
#endif //_MAIN_H |
/branches/v0.80d-Arthur-P/makefile |
---|
0,0 → 1,464 |
#-------------------------------------------------------------------- |
# MCU name |
#MCU = atmega1284p |
MCU = atmega644p |
F_CPU = 20000000 |
#------------------------------------------------------------------- |
VERSION_MAJOR = 0 |
VERSION_MINOR = 80 |
VERSION_PATCH = 3 |
VERSION_SERIAL_MAJOR = 11 # Serial Protocol |
VERSION_SERIAL_MINOR = 0 # Serial Protocol |
NC_SPI_COMPATIBLE = 14 # Navi-Kompatibilität |
#------------------------------------------------------------------- |
# get SVN revision |
REV := $(shell sh -c "cat .svn/entries | sed -n '4p'") |
ifeq ($(MCU), atmega1284p) |
FUSE_SETTINGS = -u -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
HEX_NAME = MEGA1284P |
LIBFC_EXT = 1284 |
endif |
ifeq ($(MCU), atmega644p) |
FUSE_SETTINGS = -u -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
HEX_NAME = MEGA644 |
LIBFC_EXT = 644 |
endif |
ifeq ($(F_CPU), 16000000) |
QUARZ = 16MHZ |
endif |
ifeq ($(F_CPU), 20000000) |
QUARZ = 20MHZ |
endif |
# Output format. (can be srec, ihex, binary) |
FORMAT = ihex |
# Target file name (without extension). |
ifeq ($(VERSION_PATCH), 0) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)a_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 1) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)b_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 2) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)c_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 3) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)d_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 4) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)e_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 5) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)f_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 6) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)g_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 7) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)h_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 8) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)i_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 9) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)j_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 10) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)k_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 11) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)L_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 12) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)m_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 13) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)n_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 14) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)o_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 15) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)p_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 16) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)q_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 17) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)r_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 18) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)s_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 19) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)t_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 20) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)u_SVN$(REV) |
endif |
# Optimization level, can be [0, 1, 2, 3, s]. 0 turns off optimization. |
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) |
OPT = s |
#OPT = 2 |
########################################################################################################## |
# List C source files here. (C dependencies are automatically generated.) |
SRC = main.c uart.c timer0.c analog.c menu.c eeprom.c |
SRC += twimaster.c rc.c fc.c GPS.c spi.c led.c Spektrum.c |
SRC += mymath.c jetimenu.c capacity.c debug.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 = isqrt.S |
# 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 |
# shrink code size |
CFLAGS += -mtiny-stack |
#CFLAGS += -fno-inline-functions |
CFLAGS += -mcall-prologues |
CFLAGS += -DF_CPU=$(F_CPU) -DVERSION_MAJOR=$(VERSION_MAJOR) -DVERSION_MINOR=$(VERSION_MINOR) -DVERSION_PATCH=$(VERSION_PATCH) -DVERSION_SERIAL_MAJOR=$(VERSION_SERIAL_MAJOR) -DVERSION_SERIAL_MINOR=$(VERSION_SERIAL_MINOR) -DNC_SPI_COMPATIBLE=$(NC_SPI_COMPATIBLE) |
# 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 += libfc$(LIBFC_EXT).a |
##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 = dt006 |
#AVRDUDE_PROGRAMMER = stk200 |
#AVRDUDE_PROGRAMMER = ponyser |
AVRDUDE_PROGRAMMER = avrispv2 |
#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_PORT = usb # programmer connected to USB |
#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 -c avrispv2 -P usb -p m32 -U flash:w:blink.hex |
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) -x -A $(TARGET).elf |
LIMITS = $(SIZE) --mcu=$(MCU) -C $(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 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 Size before:; $(ELFSIZE); $(HEXSIZE); $(LIMITS); echo; fi |
sizeafter: |
@if [ -f $(TARGET).elf ]; then echo Size after:; $(ELFSIZE); $(HEXSIZE); $(LIMITS); 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) Flight-Ctrl_*.hex |
$(REMOVE) Flight-Ctrl_*.eep |
$(REMOVE) $(TARGET).obj |
$(REMOVE) $(TARGET).cof |
$(REMOVE) Flight-Ctrl_*.elf |
$(REMOVE) Flight-Ctrl_*.map |
$(REMOVE) $(TARGET).obj |
$(REMOVE) $(TARGET).a90 |
$(REMOVE) Flight-Ctrl_*.sym |
$(REMOVE) $(TARGET).lnk |
$(REMOVE) $(TARGET).lss |
$(REMOVE) $(OBJ) |
$(REMOVE) $(LST) |
$(REMOVE) $(SRC:.c=.s) |
$(REMOVE) $(SRC:.c=.d) |
$(REMOVE) $(SRC:.c=.o) |
# 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/v0.80d-Arthur-P/menu.c |
---|
0,0 → 1,204 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) Holger Buss, Ingo Busker |
// + only for non-profit use |
// + www.MikroKopter.com |
// + porting the sources to other systems or using the software on other systems (except hardware from www.mikrokopter.de) is not allowed |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
#include "eeprom.h" |
char DisplayBuff[80] = "Hello World"; |
unsigned char DispPtr = 0; |
unsigned char MaxMenue = 17; |
unsigned char MenuePunkt = 0; |
unsigned char RemoteKeys = 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_Putchar(char c) |
{ |
DisplayBuff[DispPtr++] = c; |
} |
void Menu(void) |
{ |
if(RemoteKeys & KEY1) { if(MenuePunkt) MenuePunkt--; else MenuePunkt = MaxMenue;} |
if(RemoteKeys & KEY2) { if(MenuePunkt == MaxMenue) MenuePunkt = 0; else MenuePunkt++;} |
if((RemoteKeys & KEY1) && (RemoteKeys & KEY2)) MenuePunkt = 0; |
LcdClear(); |
if(MenuePunkt < 10) {LCD_printfxy(17,0,"[%i]",MenuePunkt);} |
else {LCD_printfxy(16,0,"[%i]",MenuePunkt);}; |
switch(MenuePunkt) |
{ |
case 0: |
LCD_printfxy(0,0,"+ MikroKopter +"); |
LCD_printfxy(0,1,"HW:V%d.%d SW:%d.%d%c",PlatinenVersion/10,PlatinenVersion%10, VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH +'a'); |
LCD_printfxy(0,2,"Setting:%d %s", GetActiveParamSet(),Mixer.Name); |
if(VersionInfo.HardwareError[0]) LCD_printfxy(0,3,"Hardware Error 1:%d !!",VersionInfo.HardwareError[0]) |
else |
if(MissingMotor) LCD_printfxy(0,3,"Missing BL-Ctrl:%d!!",MissingMotor) |
else |
if(VersionInfo.HardwareError[1] & DEFEKT_MIXER_ERR) LCD_printfxy(0,3,"Mixer Error!") |
else |
// if(VersionInfo.HardwareError[1]) LCD_printfxy(0,3,"Error 2:%d !!",VersionInfo.HardwareError[1]) |
// else |
if(I2CTimeout < 6) LCD_printfxy(0,3,"I2C ERROR!!!") |
break; |
case 1: |
if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
LCD_printfxy(0,0,"Height: %5i",(int)(HoehenWert/5)); |
LCD_printfxy(0,1,"Setpoint:%5i",(int)(SollHoehe/5)); |
LCD_printfxy(0,2,"Pressure:%5i",MessLuftdruck); |
LCD_printfxy(0,3,"Offset: %5i",OCR0A); |
} |
else |
{ |
LCD_printfxy(0,0,"Height control"); |
LCD_printfxy(0,1,"DISABLED"); |
LCD_printfxy(0,2,"Height control"); |
LCD_printfxy(0,3,"DISABLED"); |
} |
break; |
case 2: |
LCD_printfxy(0,0,"act. bearing"); |
LCD_printfxy(0,1,"Nick: %5i",IntegralNick/1024); |
LCD_printfxy(0,2,"Roll: %5i",IntegralRoll/1024); |
LCD_printfxy(0,3,"Compass: %5i",KompassValue); |
break; |
case 3: |
LCD_printfxy(0,0,"K1:%4i K2:%4i ",PPM_in[1],PPM_in[2]); |
LCD_printfxy(0,1,"K3:%4i K4:%4i ",PPM_in[3],PPM_in[4]); |
LCD_printfxy(0,2,"K5:%4i K6:%4i ",PPM_in[5],PPM_in[6]); |
LCD_printfxy(0,3,"K7:%4i K8:%4i ",PPM_in[7],PPM_in[8]); |
break; |
case 4: |
LCD_printfxy(0,0,"Ni:%4i Ro:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_NICK]],PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]); |
LCD_printfxy(0,1,"Gs:%4i Gi:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_GAS]]+120,PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]); |
LCD_printfxy(0,2,"P1:%4i P2:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]]+110,PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]]+110); |
LCD_printfxy(0,3,"P3:%4i P4:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]]+110,PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]]+110); |
break; |
case 5: |
LCD_printfxy(0,0,"Gyro - Sensor"); |
if(PlatinenVersion == 10) |
{ |
LCD_printfxy(0,1,"Nick%4i (%3i.%i)",AdWertNick - AdNeutralNick/8, AdNeutralNick/8, AdNeutralNick%8); |
LCD_printfxy(0,2,"Roll%4i (%3i.%i)",AdWertRoll - AdNeutralRoll/8, AdNeutralRoll/8, AdNeutralRoll%8); |
LCD_printfxy(0,3,"Gier%4i (%3i)",AdNeutralGier - AdWertGier, AdNeutralGier); |
} |
else |
if((PlatinenVersion == 11) || (PlatinenVersion >= 20)) |
{ |
LCD_printfxy(0,1,"Nick %4i (%3i.%x)",AdWertNick - AdNeutralNick/8, AdNeutralNick/16, (AdNeutralNick%16)/2); |
LCD_printfxy(0,2,"Roll %4i (%3i.%x)",AdWertRoll - AdNeutralRoll/8, AdNeutralRoll/16, (AdNeutralRoll%16)/2); |
LCD_printfxy(0,3,"Yaw %4i (%3i)",AdNeutralGier - AdWertGier, AdNeutralGier/2); |
} |
else |
if(PlatinenVersion == 13) |
{ |
LCD_printfxy(0,1,"Nick %4i (%3i)(%3i)",AdWertNick - AdNeutralNick/8, AdNeutralNick/16,AnalogOffsetNick); |
LCD_printfxy(0,2,"Roll %4i (%3i)(%3i)",AdWertRoll - AdNeutralRoll/8, AdNeutralRoll/16,AnalogOffsetRoll); |
LCD_printfxy(0,3,"Yaw %4i (%3i)(%3i)",AdNeutralGier - AdWertGier, AdNeutralGier/2,AnalogOffsetGier); |
} |
break; |
case 6: |
LCD_printfxy(0,0,"ACC - Sensor"); |
LCD_printfxy(0,1,"Nick %4i (%3i)",AdWertAccNick,NeutralAccX); |
LCD_printfxy(0,2,"Roll %4i (%3i)",AdWertAccRoll,NeutralAccY); |
LCD_printfxy(0,3,"Z %4i (%3i)",AdWertAccHoch,(int)NeutralAccZ); |
break; |
case 7: |
LCD_printfxy(0,0,"Voltage: %3i.%1iV",UBat/10, UBat%10); |
LCD_printfxy(0,1,"Current: %3i.%1iA",Capacity.ActualCurrent/10, Capacity.ActualCurrent%10); |
LCD_printfxy(0,2,"Power: %4iW",Capacity.ActualPower); |
LCD_printfxy(0,3,"Discharge: %5imAh", Capacity.UsedCapacity); |
break; |
case 8: |
LCD_printfxy(0,0,"Receiver"); |
LCD_printfxy(0,1,"RC-RSSI: %4i", PPM_in[0]); |
LCD_printfxy(0,2,"RC-Quality: %4i", SenderOkay); |
LCD_printfxy(0,3,"RC-Channels:%4i", Channels-1); |
break; |
case 9: |
LCD_printfxy(0,0,"Compass"); |
LCD_printfxy(0,1,"Heading: %5i",KompassRichtung); |
LCD_printfxy(0,2,"Value: %5i",KompassValue); |
LCD_printfxy(0,3,"Start: %5i",KompassStartwert); |
break; |
case 10: |
LCD_printfxy(0,0,"Poti1: %3i",Poti[0]); |
LCD_printfxy(0,1,"Poti2: %3i",Poti[1]); |
LCD_printfxy(0,2,"Poti3: %3i",Poti[2]); |
LCD_printfxy(0,3,"Poti4: %3i",Poti[3]); |
break; |
case 11: |
LCD_printfxy(0,0,"Poti5: %3i",Poti[4]); |
LCD_printfxy(0,1,"Poti6: %3i",Poti[5]); |
LCD_printfxy(0,2,"Poti7: %3i",Poti[6]); |
LCD_printfxy(0,3,"Poti8: %3i",Poti[7]); |
break; |
case 12: |
LCD_printfxy(0,0,"Servo " ); |
LCD_printfxy(0,1,"Setpoint %3i",Parameter_ServoNickControl); |
LCD_printfxy(0,2,"Position: %3i",ServoNickValue); |
LCD_printfxy(0,3,"Range:%3i-%3i",EE_Parameter.ServoNickMin,EE_Parameter.ServoNickMax); |
break; |
case 13: |
LCD_printfxy(0,0,"ExternControl " ); |
LCD_printfxy(0,1,"Ni:%4i Ro:%4i ",ExternControl.Nick,ExternControl.Roll); |
LCD_printfxy(0,2,"Gs:%4i Gi:%4i ",ExternControl.Gas,ExternControl.Gier); |
LCD_printfxy(0,3,"Hi:%4i Cf:%4i ",ExternControl.Hight,ExternControl.Config); |
break; |
case 14: |
LCD_printfxy(0,0,"BL-Ctrl Errors " ); |
LCD_printfxy(0,1,"%3d %3d %3d %3d ",Motor[0].State & MOTOR_STATE_ERROR_MASK,Motor[1].State & MOTOR_STATE_ERROR_MASK,Motor[2].State & MOTOR_STATE_ERROR_MASK,Motor[3].State & MOTOR_STATE_ERROR_MASK); |
LCD_printfxy(0,2,"%3d %3d %3d %3d ",Motor[4].State & MOTOR_STATE_ERROR_MASK,Motor[5].State & MOTOR_STATE_ERROR_MASK,Motor[6].State & MOTOR_STATE_ERROR_MASK,Motor[7].State & MOTOR_STATE_ERROR_MASK); |
LCD_printfxy(0,3,"%3d %3d %3d %3d ",Motor[8].State & MOTOR_STATE_ERROR_MASK,Motor[9].State & MOTOR_STATE_ERROR_MASK,Motor[10].State & MOTOR_STATE_ERROR_MASK,Motor[11].State & MOTOR_STATE_ERROR_MASK); |
break; |
case 15: |
LCD_printfxy(0,0,"BL Temperature" ); |
LCD_printfxy(0,1,"%3i %3i %3i %3i ",Motor[0].Temperature,Motor[1].Temperature,Motor[2].Temperature,Motor[3].Temperature); |
LCD_printfxy(0,2,"%3i %3i %3i %3i ",Motor[4].Temperature,Motor[5].Temperature,Motor[6].Temperature,Motor[7].Temperature); |
LCD_printfxy(0,3,"%3i %3i %3i %3i ",Motor[8].Temperature,Motor[9].Temperature,Motor[10].Temperature,Motor[11].Temperature); |
break; |
case 16: |
LCD_printfxy(0,0,"BL-Ctrl found " ); |
LCD_printfxy(0,1," %c %c %c %c ",'-' + 4 * (Motor[0].State>>7),'-' + 5 * (Motor[1].State>>7),'-' + 6 * (Motor[2].State>>7),'-' + 7 * (Motor[3].State>>7)); |
LCD_printfxy(0,2," %c %c %c %c ",'-' + 8 * (Motor[4].State>>7),'-' + 9 * (Motor[5].State>>7),'-' + 10 * (Motor[6].State>>7),'-' + 11 * (Motor[7].State>>7)); |
LCD_printfxy(0,3," %c - - - ",'-' + 12 * (Motor[8].State>>7)); |
if(Motor[9].State>>7) LCD_printfxy(4,3,"10"); |
if(Motor[10].State>>7) LCD_printfxy(8,3,"11"); |
if(Motor[11].State>>7) LCD_printfxy(12,3,"12"); |
break; |
case 17: |
LCD_printfxy(0,0,"Flight-Time " ); |
LCD_printfxy(0,1,"Total:%5umin",FlugMinutenGesamt); |
LCD_printfxy(0,2,"Act: %5umin",FlugMinuten); |
LCD_printfxy(13,3,"(reset)"); |
if(RemoteKeys & KEY4) |
{ |
FlugMinuten = 0; |
SetParamWord(PID_FLIGHT_MINUTES, FlugMinuten); |
} |
break; |
default: |
if(MenuePunkt == MaxMenue) MaxMenue--; |
MenuePunkt = 0; |
break; |
} |
RemoteKeys = 0; |
} |
/branches/v0.80d-Arthur-P/menu.h |
---|
0,0 → 1,17 |
#ifndef _MENU_H |
#define _MENU_H |
extern void Menu(void); |
extern void LcdClear(void); |
extern void Menu_Putchar(char c); |
extern char DisplayBuff[80]; |
extern unsigned char DispPtr; |
extern unsigned char MaxMenue; |
extern unsigned char MenuePunkt; |
extern unsigned char RemoteKeys; |
#define LCD_printfxy(x,y,format, args...) { DispPtr = y * 20 + x; _printf_P(&Menu_Putchar,PSTR(format) , ## args);} |
#define LCD_printf(format, args...) { _printf_P(&Menu_Putchar, PSTR(format) , ## args);} |
#endif //_MENU_H |
/branches/v0.80d-Arthur-P/mymath.c |
---|
0,0 → 1,41 |
#include <stdlib.h> |
#include <avr/pgmspace.h> |
#include "mymath.h" |
// discrete mathematics |
// Sinus with argument in degree at an angular resolution of 1 degree and a discretisation of 13 bit. |
const uint16_t pgm_sinlookup[91] PROGMEM = {0, 143, 286, 429, 571, 714, 856, 998, 1140, 1282, 1423, 1563, 1703, 1843, 1982, 2120, 2258, 2395, 2531, 2667, 2802, 2936, 3069, 3201, 3332, 3462, 3591, 3719, 3846, 3972, 4096, 4219, 4341, 4462, 4581, 4699, 4815, 4930, 5043, 5155, 5266, 5374, 5482, 5587, 5691, 5793, 5893, 5991, 6088, 6183, 6275, 6366, 6455, 6542, 6627, 6710, 6791, 6870, 6947, 7022, 7094, 7165, 7233, 7299, 7363, 7424, 7484, 7541, 7595, 7648, 7698, 7746, 7791, 7834, 7875, 7913, 7949, 7982, 8013, 8041, 8068, 8091, 8112, 8131, 8147, 8161, 8172, 8181, 8187, 8191, 8192}; |
int16_t c_sin_8192(int16_t angle) |
{ |
int8_t m,n; |
int16_t sinus; |
// avoid negative angles |
if (angle < 0) |
{ |
m = -1; |
angle = abs(angle); |
} |
else m = +1; |
// fold angle to intervall 0 to 359 |
angle %= 360; |
// check quadrant |
if (angle <= 90) n=1; // first quadrant |
else if ((angle > 90) && (angle <= 180)) {angle = 180 - angle; n = 1;} // second quadrant |
else if ((angle > 180) && (angle <= 270)) {angle = angle - 180; n = -1;} // third quadrant |
else {angle = 360 - angle; n = -1;} //fourth quadrant |
// get lookup value |
sinus = pgm_read_word(&pgm_sinlookup[angle]); |
// calculate sinus value |
return (sinus * m * n); |
} |
// Cosinus with argument in degree at an angular resolution of 1 degree and a discretisation of 13 bit. |
int16_t c_cos_8192(int16_t angle) |
{ |
return (c_sin_8192(90 - angle)); |
} |
/branches/v0.80d-Arthur-P/mymath.h |
---|
0,0 → 1,10 |
#ifndef _MYMATH_H |
#define _MYMATH_H |
#include <inttypes.h> |
extern int16_t c_sin_8192(int16_t angle); |
extern int16_t c_cos_8192(int16_t angle); |
extern int16_t c_atan2(int16_t y, int16_t x); |
extern uint32_t c_sqrt(uint32_t a); |
#endif // _MYMATH_H |
/branches/v0.80d-Arthur-P/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/v0.80d-Arthur-P/printf_P.h |
---|
0,0 → 1,69 |
// 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. |
*/ |
/******************************************************************************/ |
#ifndef _PRINTF_P_H_ |
#define _PRINTF_P_H_ |
#include <avr/pgmspace.h> |
// function pointer to external callback function |
typedef void (*pVoidFnctChar) (char ); |
typedef void (*pVoidFnct_pVoidFnctChar_const_fmt) (pVoidFnctChar, char const *fmt0, ...); |
extern pVoidFnct_pVoidFnctChar_const_fmt _printf_P; |
#endif //_PRINTF_P_H_ |
/branches/v0.80d-Arthur-P/rc.c |
---|
0,0 → 1,217 |
/*####################################################################################### |
Decodieren eines RC Summen Signals |
#######################################################################################*/ |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) Holger Buss, Ingo Busker |
// + only for non-profit use |
// + www.MikroKopter.com |
// + porting the sources to other systems or using the software on other systems (except hardware from www.mikrokopter.de) is not allowed |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "rc.h" |
#include "main.h" |
// Achtung: ACT_S3D_SUMMENSIGNAL wird in der Main.h gesetzt |
volatile int PPM_in[26]; |
volatile int PPM_diff[26]; // das diffenzierte Stick-Signal |
volatile char Channels,tmpChannels = 0; |
volatile unsigned char NewPpmData = 1; |
//############################################################################ |
//zum decodieren des PPM-Signals wird Timer1 mit seiner Input |
//Capture Funktion benutzt: |
void rc_sum_init (void) |
//############################################################################ |
{ |
unsigned char i; |
for(i=0;i<26;i++) |
{ |
PPM_in[i] = 0; |
PPM_diff[i] = 0; |
} |
AdNeutralGier = 0; |
AdNeutralRoll = 0; |
AdNeutralNick = 0; |
return; |
} |
#ifndef ACT_S3D_SUMMENSIGNAL |
//############################################################################ |
//Diese Routine startet und inizialisiert den Timer für RC |
ISR(TIMER1_CAPT_vect) |
//############################################################################ |
{ |
if(!(EE_Parameter.ExtraConfig & CFG_SENSITIVE_RC)) |
{ |
static unsigned int AltICR=0; |
signed int signal = 0,tmp; |
static int index; |
signal = (unsigned int) ICR1 - AltICR; |
AltICR = ICR1; |
//Syncronisationspause? (3.52 ms < signal < 25.6 ms) |
if((signal > 1100) && (signal < 8000)) |
{ |
Channels = index; |
if(index >= 4) NewPpmData = 0; // Null bedeutet: Neue Daten |
index = 1; |
} |
else |
{ |
if(index < 13) |
{ |
if((signal > 250) && (signal < 687)) |
{ |
signal -= 466; |
// Stabiles Signal |
if(abs(signal - PPM_in[index]) < 6) { if(SenderOkay < 200) SenderOkay += 10; else SenderOkay = 200;} |
tmp = (3 * (PPM_in[index]) + signal) / 4; |
if(tmp > signal+1) tmp--; else |
if(tmp < signal-1) tmp++; |
if(SenderOkay >= 195) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; |
else PPM_diff[index] = 0; |
PPM_in[index] = tmp; |
} |
index++; |
if(PlatinenVersion < 20) |
{ |
if(index == 5) J3High; else J3Low; // Servosignal an J3 anlegen |
if(index == 6) J4High; else J4Low; // Servosignal an J4 anlegen |
if(index == 7) J5High; else J5Low; // Servosignal an J5 anlegen |
} |
} |
} |
} |
else |
{ |
static unsigned int AltICR=0; |
static int ppm_in[13]; |
static int ppm_diff[13]; |
static int old_ppm_in[13]; |
static int old_ppm_diff[13]; |
signed int signal = 0,tmp; |
static unsigned char index, okay_cnt = 0; |
signal = (unsigned int) ICR1 - AltICR; |
AltICR = ICR1; |
//Syncronisationspause? (3.52 ms < signal < 25.6 ms) |
if((signal > 1100) && (signal < 8000)) |
{ |
tmpChannels = index; |
if(tmpChannels >= 4 && Channels == tmpChannels) |
{ |
if(okay_cnt > 10) |
{ |
NewPpmData = 0; // Null bedeutet: Neue Daten |
for(index = 0; index < 13; index++) |
{ |
if(okay_cnt > 30) |
{ |
old_ppm_in[index] = PPM_in[index]; |
old_ppm_diff[index] = PPM_diff[index]; |
} |
PPM_in[index] = ppm_in[index]; |
PPM_diff[index] = ppm_diff[index]; |
} |
} |
if(okay_cnt < 255) okay_cnt++; |
} |
else |
{ |
if(okay_cnt > 100) okay_cnt = 10; else okay_cnt = 0; |
ROT_ON; |
} |
index = 1; |
if(!MotorenEin) Channels = tmpChannels; |
} |
else |
{ |
if(index < 13) |
{ |
if((signal > 250) && (signal < 687)) |
{ |
signal -= 466; |
// Stabiles Signal |
if((abs(signal - ppm_in[index]) < 6)) |
{ |
if(okay_cnt > 25) SenderOkay += 10; |
else |
if(okay_cnt > 10) SenderOkay += 2; |
if(SenderOkay > 200) SenderOkay = 200; |
} |
tmp = (3 * (ppm_in[index]) + signal) / 4; |
if(tmp > signal+1) tmp--; else |
if(tmp < signal-1) tmp++; |
if(SenderOkay >= 190) ppm_diff[index] = ((tmp - ppm_in[index]) / 3) * 3; |
else ppm_diff[index] = 0; |
ppm_in[index] = tmp; |
} |
else ROT_ON; |
if(PlatinenVersion < 20) |
{ |
if(index == 5) J3High; else J3Low; // Servosignal an J3 anlegen |
if(index == 6) J4High; else J4Low; // Servosignal an J4 anlegen |
if(index == 7) J5High; else J5Low; // Servosignal an J5 anlegen |
} |
} |
if(index < 20) index++; |
else |
if(index == 20) |
{ |
unsigned char i; |
ROT_ON; |
index = 30; |
for(i=0;i<13;i++) // restore from older data |
{ |
PPM_in[i] = old_ppm_in[i]; |
PPM_diff[i] = 0; |
// okay_cnt /= 2; |
} |
} |
} |
} |
} |
#else |
//############################################################################ |
//Diese Routine startet und inizialisiert den Timer für RC |
ISR(TIMER1_CAPT_vect) |
//############################################################################ |
{ |
static unsigned int AltICR=0; |
signed int signal = 0,tmp; |
static int index; |
signal = (unsigned int) ICR1 - AltICR; |
signal /= 2; |
AltICR = ICR1; |
//Syncronisationspause? |
if((signal > 1100*2) && (signal < 8000*2)) |
{ |
if(index >= 4) NewPpmData = 0; // Null bedeutet: Neue Daten |
index = 1; |
} |
else |
{ |
if(index < 13) |
{ |
if((signal > 250) && (signal < 687*2)) |
{ |
signal -= 962; |
// Stabiles Signal |
if(abs(signal - PPM_in[index]) < 6) { if(SenderOkay < 200) SenderOkay += 10;} |
tmp = (3 * (PPM_in[index]) + signal) / 4; |
if(tmp > signal+1) tmp--; else |
if(tmp < signal-1) tmp++; |
if(SenderOkay >= 195) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; |
else PPM_diff[index] = 0; |
PPM_in[index] = tmp; |
} |
index++; |
} |
} |
} |
#endif |
/branches/v0.80d-Arthur-P/rc.h |
---|
0,0 → 1,31 |
/*####################################################################################### |
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_RELOAD_VALUE 250 |
#endif |
#if defined (__AVR_ATmega644P__) |
#define TIMER_RELOAD_VALUE 250 |
#endif |
#define GAS PPM_in[2] |
extern void rc_sum_init (void); |
extern volatile int PPM_in[26]; |
extern volatile int PPM_diff[26]; // das diffenzierte Stick-Signal |
extern volatile unsigned char NewPpmData; |
extern volatile char Channels,tmpChannels; |
#endif //_RC_H |
/branches/v0.80d-Arthur-P/spi.c |
---|
0,0 → 1,330 |
// ######################## SPI - FlightCtrl ################### |
#include "main.h" |
#include "eeprom.h" |
//struct str_ToNaviCtrl_Version ToNaviCtrl_Version; |
//struct str_FromNaviCtrl_Version FromNaviCtrl_Version; |
struct str_ToNaviCtrl ToNaviCtrl; |
struct str_FromNaviCtrl FromNaviCtrl; |
struct str_FromNaviCtrl_Value FromNaviCtrl_Value; |
struct str_SPI_VersionInfo NC_Version; |
struct str_GPSInfo GPSInfo; |
unsigned char SPI_BufferIndex; |
unsigned char SPI_RxBufferIndex; |
signed char FromNC_Rotate_C = 32, FromNC_Rotate_S = 0; |
volatile unsigned char SPI_Buffer[sizeof(FromNaviCtrl)]; |
unsigned char *SPI_TX_Buffer; |
unsigned char SPITransferCompleted, SPI_ChkSum; |
unsigned char SPI_RxDataValid,NaviDataOkay = 250; |
unsigned char SPI_CommandSequence[] = {SPI_FCCMD_STICK, SPI_FCCMD_USER, SPI_FCCMD_PARAMETER1, SPI_FCCMD_STICK, SPI_FCCMD_MISC, SPI_FCCMD_VERSION, SPI_FCCMD_STICK, SPI_FCCMD_SERVOS, SPI_FCCMD_ACCU}; |
unsigned char SPI_CommandCounter = 0; |
unsigned char NC_ErrorCode = 0; |
#ifdef USE_SPI_COMMUNICATION |
//------------------------------------------------------ |
void SPI_MasterInit(void) |
{ |
DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK); // Set MOSI and SCK output, all others input |
SLAVE_SELECT_DDR_PORT |= (1 << SPI_SLAVE_SELECT); |
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(0<<SPR0)|(0<<SPIE); // Enable SPI, Master, set clock rate fck/64 |
SPSR = 0;//(1<<SPI2X); |
SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); |
SPITransferCompleted = 1; |
//SPDR = 0x00; // dummy write |
ToNaviCtrl.Sync1 = 0xAA; |
ToNaviCtrl.Sync2 = 0x83; |
ToNaviCtrl.Command = SPI_FCCMD_USER; |
ToNaviCtrl.IntegralNick = 0; |
ToNaviCtrl.IntegralRoll = 0; |
FromNaviCtrl_Value.SerialDataOkay = 0; |
SPI_RxDataValid = 0; |
} |
//------------------------------------------------------ |
void SPI_StartTransmitPacket(void) |
{ |
//if ((SLAVE_SELECT_PORT & (1 << SPI_SLAVE_SELECT)) == 0) return; // transfer of prev. packet not completed |
if (!SPITransferCompleted) return; |
// _delay_us(30); |
SLAVE_SELECT_PORT &= ~(1 << SPI_SLAVE_SELECT); // SelectSlave |
SPI_TX_Buffer = (unsigned char *) &ToNaviCtrl; |
ToNaviCtrl.Command = SPI_CommandSequence[SPI_CommandCounter++]; |
if (SPI_CommandCounter >= sizeof(SPI_CommandSequence)) SPI_CommandCounter = 0; |
SPITransferCompleted = 0; |
UpdateSPI_Buffer(); // update buffer |
SPI_BufferIndex = 1; |
//ebugOut.Analog[16]++; |
// -- Debug-Output --- |
//---- |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
ToNaviCtrl.Chksum = ToNaviCtrl.Sync1; |
SPDR = ToNaviCtrl.Sync1; // Start transmission |
// SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
} |
//------------------------------------------------------ |
//SIGNAL(SIG_SPI) |
void SPI_TransmitByte(void) |
{ |
static unsigned char SPI_RXState = 0; |
unsigned char rxdata; |
static unsigned char rxchksum; |
if (SPITransferCompleted) return; |
if (!(SPSR & (1 << SPIF))) return; |
SendSPI = 4; |
// _delay_us(30); |
SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
rxdata = SPDR; |
switch ( SPI_RXState) |
{ |
case 0: |
SPI_RxBufferIndex = 0; |
rxchksum = rxdata; |
if (rxdata == 0x81 ) { SPI_RXState = 1; } // 1. Syncbyte ok |
break; |
case 1: |
if (rxdata == 0x55) { rxchksum += rxdata; SPI_RXState = 2; } // 2. Syncbyte ok |
else SPI_RXState = 0; |
break; |
case 2: |
SPI_Buffer[SPI_RxBufferIndex++]= rxdata; // get data |
//DebugOut.Analog[19]++; |
if (SPI_RxBufferIndex >= sizeof(FromNaviCtrl)) |
{ |
if (rxdata == rxchksum) |
{ |
unsigned char *ptr = (unsigned char *)&FromNaviCtrl; |
memcpy(ptr, (unsigned char *) SPI_Buffer, sizeof(SPI_Buffer)); |
SPI_RxDataValid = 1; |
} |
else SPI_RxDataValid = 0; |
SPI_RXState = 0; |
} |
else rxchksum += rxdata; |
break; |
} |
if (SPI_BufferIndex < sizeof(ToNaviCtrl)) |
{ |
SLAVE_SELECT_PORT &= ~(1 << SPI_SLAVE_SELECT); // SelectSlave |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
SPDR = SPI_TX_Buffer[SPI_BufferIndex]; |
ToNaviCtrl.Chksum += SPI_TX_Buffer[SPI_BufferIndex]; |
// SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
} |
else SPITransferCompleted = 1; |
SPI_BufferIndex++; |
} |
//------------------------------------------------------ |
void UpdateSPI_Buffer(void) |
{ |
signed int tmp; |
ToNaviCtrl.IntegralNick = (int) (IntegralNick / (long)(EE_Parameter.GyroAccFaktor * 4)); |
ToNaviCtrl.IntegralRoll = (int) (IntegralRoll / (long)(EE_Parameter.GyroAccFaktor * 4)); |
ToNaviCtrl.GyroCompass = (10 * ErsatzKompass) / GIER_GRAD_FAKTOR; |
ToNaviCtrl.GyroGier = (signed int) AdNeutralGier - AdWertGier; |
ToNaviCtrl.AccNick = ((int) ACC_AMPLIFY * (NaviAccNick / NaviCntAcc))/4; |
ToNaviCtrl.AccRoll = ((int) ACC_AMPLIFY * (NaviAccRoll / NaviCntAcc))/4; |
NaviCntAcc = 0; NaviAccNick = 0; NaviAccRoll = 0; |
// ToNaviCtrl.User8 = Parameter_UserParam8; |
// ToNaviCtrl.CalState = WinkelOut.CalcState; |
switch(ToNaviCtrl.Command) // |
{ |
case SPI_FCCMD_USER: |
ToNaviCtrl.Param.Byte[0] = Parameter_UserParam1; |
ToNaviCtrl.Param.Byte[1] = Parameter_UserParam2; |
ToNaviCtrl.Param.Byte[2] = Parameter_UserParam3; |
ToNaviCtrl.Param.Byte[3] = Parameter_UserParam4; |
ToNaviCtrl.Param.Byte[4] = Parameter_UserParam5; |
ToNaviCtrl.Param.Byte[5] = Parameter_UserParam6; |
ToNaviCtrl.Param.Byte[6] = Parameter_UserParam7; |
ToNaviCtrl.Param.Byte[7] = Parameter_UserParam8; |
ToNaviCtrl.Param.Byte[8] = (unsigned char) FCFlags; |
FCFlags &= ~(FCFLAG_CALIBRATE | FCFLAG_START); |
ToNaviCtrl.Param.Byte[9] = GetActiveParamSet(); |
ToNaviCtrl.Param.Byte[10] = ControlHeading; |
break; |
case SPI_FCCMD_ACCU: |
ToNaviCtrl.Param.Int[0] = Capacity.ActualCurrent; // 0.1A |
ToNaviCtrl.Param.Int[1] = Capacity.UsedCapacity; // mAh |
ToNaviCtrl.Param.Byte[4] = (unsigned char) UBat; // 0.1V |
ToNaviCtrl.Param.Byte[5] = (unsigned char) BattLowVoltageWarning; //0.1V |
break; |
case SPI_FCCMD_PARAMETER1: |
ToNaviCtrl.Param.Byte[0] = EE_Parameter.NaviGpsModeControl; // Parameters for the Naviboard |
ToNaviCtrl.Param.Byte[1] = EE_Parameter.NaviGpsGain; |
ToNaviCtrl.Param.Byte[2] = EE_Parameter.NaviGpsP; |
ToNaviCtrl.Param.Byte[3] = EE_Parameter.NaviGpsI; |
ToNaviCtrl.Param.Byte[4] = EE_Parameter.NaviGpsD; |
ToNaviCtrl.Param.Byte[5] = EE_Parameter.NaviGpsACC; |
ToNaviCtrl.Param.Byte[6] = EE_Parameter.NaviGpsMinSat; |
ToNaviCtrl.Param.Byte[7] = EE_Parameter.NaviStickThreshold; |
ToNaviCtrl.Param.Byte[8] = EE_Parameter.NaviOperatingRadius; |
ToNaviCtrl.Param.Byte[9] = EE_Parameter.NaviWindCorrection; |
ToNaviCtrl.Param.Byte[10] = EE_Parameter.NaviSpeedCompensation; |
ToNaviCtrl.Param.Byte[11] = EE_Parameter.NaviAngleLimitation; |
break; |
case SPI_FCCMD_STICK: |
cli(); |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[0] = (char) tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[1] = (char) tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[2] = (char) tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_NICK]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
sei(); |
ToNaviCtrl.Param.Byte[3] = (char) tmp; |
ToNaviCtrl.Param.Byte[4] = (unsigned char) Poti[0]; |
ToNaviCtrl.Param.Byte[5] = (unsigned char) Poti[1]; |
ToNaviCtrl.Param.Byte[6] = (unsigned char) Poti[2]; |
ToNaviCtrl.Param.Byte[7] = (unsigned char) Poti[3]; |
ToNaviCtrl.Param.Byte[8] = (unsigned char) Poti[4]; |
ToNaviCtrl.Param.Byte[9] = (unsigned char) Poti[5]; |
ToNaviCtrl.Param.Byte[10] = (unsigned char) Poti[6]; |
ToNaviCtrl.Param.Byte[11] = (unsigned char) Poti[7]; |
break; |
case SPI_FCCMD_MISC: |
if(WinkelOut.CalcState > 5) |
{ |
WinkelOut.CalcState = 0; |
ToNaviCtrl.Param.Byte[0] = 5; |
} |
else ToNaviCtrl.Param.Byte[0] = WinkelOut.CalcState; |
ToNaviCtrl.Param.Byte[1] = EE_Parameter.NaviPH_LoginTime; |
ToNaviCtrl.Param.Int[1] = (int)(HoehenWert/5); |
ToNaviCtrl.Param.Int[2] = (int)(SollHoehe/5); |
ToNaviCtrl.Param.Byte[6] = EE_Parameter.NaviGpsPLimit; |
ToNaviCtrl.Param.Byte[7] = EE_Parameter.NaviGpsILimit; |
ToNaviCtrl.Param.Byte[8] = EE_Parameter.NaviGpsDLimit; |
ToNaviCtrl.Param.Byte[9] = (unsigned char) SenderOkay; |
ToNaviCtrl.Param.Byte[10] = (unsigned char) PPM_in[0]; |
ToNaviCtrl.Param.Byte[11] = DebugOut.Analog[7] / 4; //GasMischanteil |
break; |
case SPI_FCCMD_VERSION: |
ToNaviCtrl.Param.Byte[0] = VERSION_MAJOR; |
ToNaviCtrl.Param.Byte[1] = VERSION_MINOR; |
ToNaviCtrl.Param.Byte[2] = VERSION_PATCH; |
ToNaviCtrl.Param.Byte[3] = NC_SPI_COMPATIBLE; |
ToNaviCtrl.Param.Byte[4] = PlatinenVersion; |
ToNaviCtrl.Param.Byte[5] = VersionInfo.HardwareError[0]; |
ToNaviCtrl.Param.Byte[6] = VersionInfo.HardwareError[1]; |
ToNaviCtrl.Param.Byte[7] = VersionInfo.HardwareError[2]; |
break; |
case SPI_FCCMD_SERVOS: |
ToNaviCtrl.Param.Byte[0] = EE_Parameter.ServoNickRefresh; // Parameters for the Servo Control |
ToNaviCtrl.Param.Byte[1] = EE_Parameter.ServoCompInvert; |
ToNaviCtrl.Param.Byte[2] = Parameter_ServoNickControl; |
ToNaviCtrl.Param.Byte[3] = EE_Parameter.ServoNickComp; |
ToNaviCtrl.Param.Byte[4] = EE_Parameter.ServoNickMin; |
ToNaviCtrl.Param.Byte[5] = EE_Parameter.ServoNickMax; |
ToNaviCtrl.Param.Byte[6] = Parameter_ServoRollControl; |
ToNaviCtrl.Param.Byte[7] = EE_Parameter.ServoRollComp; |
ToNaviCtrl.Param.Byte[8] = EE_Parameter.ServoRollMin; |
ToNaviCtrl.Param.Byte[9] = EE_Parameter.ServoRollMax; |
break; |
} |
if(SPI_RxDataValid) |
{ |
NaviDataOkay = 250; |
if(abs(FromNaviCtrl.GPS_Nick) < 512 && abs(FromNaviCtrl.GPS_Roll) < 512 && (EE_Parameter.GlobalConfig & CFG_GPS_AKTIV)) |
{ |
GPS_Nick = FromNaviCtrl.GPS_Nick; |
GPS_Roll = FromNaviCtrl.GPS_Roll; |
} |
if(FromNaviCtrl.CompassValue <= 360) KompassValue = FromNaviCtrl.CompassValue; |
KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180; |
if(FromNaviCtrl.BeepTime > beeptime && !WinkelOut.CalcState) beeptime = FromNaviCtrl.BeepTime; |
switch (FromNaviCtrl.Command) |
{ |
case SPI_NCCMD_KALMAN: |
FromNaviCtrl_Value.Kalman_K = FromNaviCtrl.Param.sByte[0]; |
FromNaviCtrl_Value.Kalman_MaxFusion = FromNaviCtrl.Param.sByte[1]; |
FromNaviCtrl_Value.Kalman_MaxDrift = FromNaviCtrl.Param.sByte[2]; |
FromNaviCtrl_Value.SerialDataOkay = FromNaviCtrl.Param.Byte[3]; |
FromNaviCtrl_Value.GpsZ = FromNaviCtrl.Param.Byte[4]; |
FromNC_Rotate_C = FromNaviCtrl.Param.Byte[5]; |
FromNC_Rotate_S = FromNaviCtrl.Param.Byte[6]; |
break; |
case SPI_NCCMD_VERSION: |
NC_Version.Major = FromNaviCtrl.Param.Byte[0]; |
NC_Version.Minor = FromNaviCtrl.Param.Byte[1]; |
NC_Version.Patch = FromNaviCtrl.Param.Byte[2]; |
NC_Version.Compatible = FromNaviCtrl.Param.Byte[3]; |
NC_Version.Hardware = FromNaviCtrl.Param.Byte[4]; |
DebugOut.Status[0] |= FromNaviCtrl.Param.Byte[5]; |
NC_ErrorCode = FromNaviCtrl.Param.Byte[6]; |
DebugOut.Status[1] = (DebugOut.Status[1] & (0x01|0x02)) | (FromNaviCtrl.Param.Byte[6] & (0x04 | 0x08)); |
break; |
case SPI_NCCMD_GPSINFO: |
GPSInfo.Flags = FromNaviCtrl.Param.Byte[0]; |
GPSInfo.NumOfSats = FromNaviCtrl.Param.Byte[1]; |
GPSInfo.SatFix = FromNaviCtrl.Param.Byte[2]; |
GPSInfo.Speed = FromNaviCtrl.Param.Byte[3]; |
GPSInfo.HomeDistance = FromNaviCtrl.Param.Int[2]; |
GPSInfo.HomeBearing = FromNaviCtrl.Param.sInt[3]; |
break; |
default: |
break; |
} |
} |
else |
{ |
// KompassValue = 0; |
// KompassRichtung = 0; |
GPS_Nick = 0; |
GPS_Roll = 0; |
} |
} |
#endif |
/branches/v0.80d-Arthur-P/spi.h |
---|
0,0 → 1,183 |
// ######################## SPI - FlightCtrl ################### |
#ifndef _SPI_H |
#define _SPI_H |
#include <util/delay.h> |
#define USE_SPI_COMMUNICATION |
//----------------------------------------- |
#define DDR_SPI DDRB |
#define SLAVE_SELECT_DDR_PORT DDRC |
#define SLAVE_SELECT_PORT PORTC |
#if defined(__AVR_ATmega1284P__) |
#define DD_SS PORTB4 |
#define DD_SCK PORTB7 |
#define DD_MOSI PORTB5 |
#define DD_MISO PORTB6 |
#define SPI_SLAVE_SELECT PORTC5 |
#else |
#define DD_SS PB4 |
#define DD_SCK PB7 |
#define DD_MOSI PB5 |
#define DD_MISO PB6 |
#define SPI_SLAVE_SELECT PC5 |
#endif |
// for compatibility reasons gcc3.x <-> gcc4.x |
#ifndef SPCR |
#define SPCR SPCR0 |
#endif |
#ifndef SPE |
#define SPE SPE0 |
#endif |
#ifndef MSTR |
#define MSTR MSTR0 |
#endif |
#ifndef SPR1 |
#define SPR1 SPR01 |
#endif |
#ifndef SPR0 |
#define SPR0 SPR00 |
#endif |
#ifndef SPIE |
#define SPIE SPIE0 |
#endif |
#ifndef SPDR |
#define SPDR SPDR0 |
#endif |
#ifndef SPIF |
#define SPIF SPIF0 |
#endif |
#ifndef SPSR |
#define SPSR SPSR0 |
#endif |
// ------------------------- |
#define SPI_FCCMD_USER 10 |
#define SPI_FCCMD_STICK 11 |
#define SPI_FCCMD_MISC 12 |
#define SPI_FCCMD_PARAMETER1 13 |
#define SPI_FCCMD_VERSION 14 |
#define SPI_FCCMD_SERVOS 15 |
#define SPI_FCCMD_ACCU 16 |
struct str_ToNaviCtrl |
{ |
unsigned char Sync1, Sync2; |
unsigned char Command; |
signed int IntegralNick; |
signed int IntegralRoll; |
signed int AccNick; |
signed int AccRoll; |
signed int GyroCompass; |
signed int GyroNick; |
signed int GyroRoll; |
signed int GyroGier; |
union |
{ |
unsigned char Byte[12]; |
char sByte[12]; |
unsigned int Int[6]; |
int sInt[6]; |
unsigned long Long[3]; |
long sLong[3]; |
float Float[3]; |
} Param; |
unsigned char Chksum; |
}; |
#define SPI_NCCMD_KALMAN 103 |
#define SPI_NCCMD_VERSION 104 |
#define SPI_NCCMD_GPSINFO 105 |
struct str_FromNaviCtrl |
{ |
unsigned char Command; |
signed int GPS_Nick; |
signed int GPS_Roll; |
signed int GPS_Gier; |
signed int CompassValue; |
signed int Status; |
unsigned int BeepTime; |
union |
{ |
unsigned char Byte[12]; |
char sByte[12]; |
unsigned int Int[6]; |
int sInt[6]; |
unsigned long Long[3]; |
long sLong[3]; |
float Float[3]; |
} Param; |
unsigned char Chksum; |
}; |
struct str_FromNaviCtrl_Value |
{ |
signed char Kalman_K; |
signed char Kalman_MaxDrift; |
signed char Kalman_MaxFusion; |
unsigned char SerialDataOkay; |
signed char GpsZ; |
}; |
struct str_SPI_VersionInfo |
{ |
unsigned char Major; |
unsigned char Minor; |
unsigned char Patch; |
unsigned char Compatible; |
unsigned char Hardware; |
}; |
// Satfix types for GPSData.SatFix |
#define SATFIX_NONE 0x00 |
#define SATFIX_DEADRECKOING 0x01 |
#define SATFIX_2D 0x02 |
#define SATFIX_3D 0x03 |
#define SATFIX_GPS_DEADRECKOING 0x04 |
#define SATFIX_TIMEONLY 0x05 |
// Flags for interpretation of the GPSData.Flags |
#define FLAG_GPSFIXOK 0x01 // (i.e. within DOP & ACC Masks) |
#define FLAG_DIFFSOLN 0x02 // (is DGPS used) |
#define FLAG_WKNSET 0x04 // (is Week Number valid) |
#define FLAG_TOWSET 0x08 // (is Time of Week valid) |
struct str_GPSInfo |
{ |
unsigned char Flags; // Status Flags |
unsigned char NumOfSats; // number of satelites |
unsigned char SatFix; // type of satfix |
unsigned char Speed; // m/sek |
unsigned int HomeDistance; // distance to Home in dm |
int HomeBearing; // bearing to home in deg |
}; |
#ifdef USE_SPI_COMMUNICATION |
extern struct str_GPSInfo GPSInfo; |
extern struct str_SPI_VersionInfo NC_Version; |
extern struct str_FromNaviCtrl_Value FromNaviCtrl_Value; |
extern struct str_ToNaviCtrl ToNaviCtrl; |
extern struct str_FromNaviCtrl FromNaviCtrl; |
extern unsigned char SPI_CommandCounter,NaviDataOkay; |
extern signed char FromNC_Rotate_C, FromNC_Rotate_S; |
extern unsigned char NC_ErrorCode; |
extern void SPI_MasterInit(void); |
extern void SPI_StartTransmitPacket(void); |
extern void UpdateSPI_Buffer(void); |
extern void SPI_TransmitByte(void); |
#else |
// -------------------------------- Dummy ----------------------------------------- |
#define SPI_MasterInit() ; |
#define SPI_StartTransmitPacket() ; |
#define UpdateSPI_Buffer() ; |
#define SPI_TransmitByte() ; |
#endif |
#endif |
/branches/v0.80d-Arthur-P/timer0.c |
---|
0,0 → 1,404 |
#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; |
volatile unsigned char SendSPI = 0, ServoActive = 0; |
unsigned int BeepMuster = 0xffff; |
volatile int16_t ServoNickValue = 0; |
volatile int16_t ServoRollValue = 0; |
enum { |
STOP = 0, |
CK = 1, |
CK8 = 2, |
CK64 = 3, |
CK256 = 4, |
CK1024 = 5, |
T0_FALLING_EDGE = 6, |
T0_RISING_EDGE = 7 |
}; |
ISR(TIMER0_OVF_vect) // 9,7kHz |
{ |
static unsigned char cnt_1ms = 1,cnt = 0, compass_active = 0; |
unsigned char pieper_ein = 0; |
if(SendSPI) SendSPI--; |
if(SpektrumTimer) SpektrumTimer--; |
if(!cnt--) |
{ |
cnt = 9; |
CountMilliseconds++; |
cnt_1ms++; |
cnt_1ms %= 2; |
if(!cnt_1ms) UpdateMotor = 1; |
if(!PINC & 0x10) compass_active = 1; |
if(beeptime) |
{ |
if(beeptime > 10) beeptime -= 10; else beeptime = 0; |
if(beeptime & BeepMuster) |
{ |
pieper_ein = 1; |
} |
else pieper_ein = 0; |
} |
else |
{ |
pieper_ein = 0; |
BeepMuster = 0xffff; |
} |
if(pieper_ein) |
{ |
if(PlatinenVersion == 10) PORTD |= (1<<2); // Speaker an PORTD.2 |
else PORTC |= (1<<7); // Speaker an PORTC.7 |
} |
else |
{ |
if(PlatinenVersion == 10) PORTD &= ~(1<<2); |
else PORTC &= ~(1<<7); |
} |
} |
if(compass_active && !NaviDataOkay && EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV) |
{ |
if(PINC & 0x10) |
{ |
if(++cntKompass > 1000) compass_active = 0; |
} |
else |
{ |
if((cntKompass) && (cntKompass < 362)) |
{ |
cntKompass += cntKompass / 41; |
if(cntKompass > 10) KompassValue = cntKompass - 10; else KompassValue = 0; |
KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180; |
} |
cntKompass = 0; |
} |
} |
} |
// ----------------------------------------------------------------------- |
unsigned int SetDelay (unsigned int t) |
{ |
// TIMSK0 &= ~_BV(TOIE0); |
return(CountMilliseconds + t + 1); |
// TIMSK0 |= _BV(TOIE0); |
} |
// ----------------------------------------------------------------------- |
char CheckDelay(unsigned int t) |
{ |
// TIMSK0 &= ~_BV(TOIE0); |
return(((t - CountMilliseconds) & 0x8000) >> 9); |
// TIMSK0 |= _BV(TOIE0); |
} |
// ----------------------------------------------------------------------- |
void Delay_ms(unsigned int w) |
{ |
unsigned int akt; |
akt = SetDelay(w); |
while (!CheckDelay(akt)); |
} |
void Delay_ms_Mess(unsigned int w) |
{ |
unsigned int akt; |
akt = SetDelay(w); |
while (!CheckDelay(akt)) if(AdReady) {AdReady = 0; ANALOG_ON;} |
} |
/*****************************************************/ |
/* Initialize Timer 2 */ |
/*****************************************************/ |
// The timer 2 is used to generate the PWM at PD7 (J7) |
// to control a camera servo for nick compensation. |
void TIMER2_Init(void) |
{ |
uint8_t sreg = SREG; |
// disable all interrupts before reconfiguration |
cli(); |
PORTD &= ~(1<<PORTD7); // set PD7 to low |
DDRC |= (1<<DDC6); // set PC6 as output (Reset for HEF4017) |
HEF4017R_ON; |
// Timer/Counter 2 Control Register A |
// Timer Mode is FastPWM with timer reload at OCR2A (Bits: WGM22 = 1, WGM21 = 1, WGM20 = 1) |
// PD7: Normal port operation, OC2A disconnected, (Bits: COM2A1 = 0, COM2A0 = 0) |
// PD6: Normal port operation, OC2B disconnected, (Bits: COM2B1 = 0, COM2B0 = 0) |
TCCR2A &= ~((1<<COM2A1)|(1<<COM2A0)|(1<<COM2B1)|(1<<COM2B0)); |
TCCR2A |= (1<<WGM21)|(1<<WGM20); |
// Timer/Counter 2 Control Register B |
// Set clock divider for timer 2 to SYSKLOCK/32 = 20MHz / 32 = 625 kHz |
// The timer increments from 0x00 to 0xFF with an update rate of 625 kHz or 1.6 us |
// hence the timer overflow interrupt frequency is 625 kHz / 256 = 2.44 kHz or 0.4096 ms |
// divider 32 (Bits: CS022 = 0, CS21 = 1, CS20 = 1) |
TCCR2B &= ~((1<<FOC2A)|(1<<FOC2B)|(1<<CS22)); |
TCCR2B |= (1<<CS21)|(1<<CS20)|(1<<WGM22); |
// Initialize the Timer/Counter 2 Register |
TCNT2 = 0; |
// Initialize the Output Compare Register A used for PWM generation on port PD7. |
OCR2A = 255; |
TCCR2A |= (1<<COM2A1); // set or clear at compare match depends on value of COM2A0 |
// Timer/Counter 2 Interrupt Mask Register |
// Enable timer output compare match A Interrupt only |
TIMSK2 &= ~((1<<OCIE2B)|(1<<TOIE2)); |
TIMSK2 |= (1<<OCIE2A); |
SREG = sreg; |
} |
//---------------------------- |
void Timer_Init(void) |
{ |
tim_main = SetDelay(10); |
TCCR0B = CK8; |
TCCR0A = (1<<COM0A1)|(1<<COM0B1)|3;//fast PWM |
OCR0A = 0; |
OCR0B = 180; |
TCNT0 = (unsigned char)-TIMER_RELOAD_VALUE; // reload |
//OCR1 = 0x00; |
TIMSK0 |= _BV(TOIE0); |
} |
/*****************************************************/ |
/* Control Servo Position */ |
/*****************************************************/ |
ISR(TIMER2_COMPA_vect) |
{ |
// frame len 22.5 ms = 14063 * 1.6 us |
// stop pulse: 0.3 ms = 188 * 1.6 us |
// min servo pulse: 0.6 ms = 375 * 1.6 us |
// max servo pulse: 2.4 ms = 1500 * 1.6 us |
// resolution: 1500 - 375 = 1125 steps |
#define IRS_RUNTIME 127 |
#define PPM_STOPPULSE 188 |
// #define PPM_FRAMELEN (14063 |
#define PPM_FRAMELEN (1757 * EE_Parameter.ServoNickRefresh) |
#define MINSERVOPULSE 375 |
#define MAXSERVOPULSE 1500 |
#define SERVORANGE (MAXSERVOPULSE - MINSERVOPULSE) |
static uint8_t PulseOutput = 0; |
static uint16_t RemainingPulse = 0; |
static uint16_t ServoFrameTime = 0; |
static uint8_t ServoIndex = 0; |
#define MULTIPLYER 4 |
static int16_t ServoNickOffset = (255 / 2) * MULTIPLYER; // initial value near center positon |
static int16_t ServoRollOffset = (255 / 2) * MULTIPLYER; // initial value near center positon |
if(PlatinenVersion < 20) |
{ |
//--------------------------- |
// Nick servo state machine |
//--------------------------- |
if(!PulseOutput) // pulse output complete |
{ |
if(TCCR2A & (1<<COM2A0)) // we had a low pulse |
{ |
TCCR2A &= ~(1<<COM2A0);// make a high pulse |
RemainingPulse = MINSERVOPULSE + SERVORANGE/2; // center position ~ 1.5ms |
ServoNickOffset = (ServoNickOffset * 3 + (int16_t)Parameter_ServoNickControl * MULTIPLYER) / 4; // lowpass offset |
ServoNickValue = ServoNickOffset; // offset (Range from 0 to 255 * 3 = 765) |
if(EE_Parameter.ServoCompInvert & 0x01) |
{ // inverting movement of servo |
ServoNickValue += (int16_t)( ( (int32_t)EE_Parameter.ServoNickComp * MULTIPLYER * (IntegralNick / 128L ) ) / (256L) ); |
} |
else |
{ // non inverting movement of servo |
ServoNickValue -= (int16_t)( ( (int32_t)EE_Parameter.ServoNickComp * MULTIPLYER * (IntegralNick / 128L ) ) / (256L) ); |
} |
// limit servo value to its parameter range definition |
if(ServoNickValue < ((int16_t)EE_Parameter.ServoNickMin * MULTIPLYER) ) |
{ |
ServoNickValue = (int16_t)EE_Parameter.ServoNickMin * MULTIPLYER; |
} |
else |
if(ServoNickValue > ((int16_t)EE_Parameter.ServoNickMax * MULTIPLYER) ) |
{ |
ServoNickValue = (int16_t)EE_Parameter.ServoNickMax * MULTIPLYER; |
} |
RemainingPulse += ServoNickValue - (256 / 2) * MULTIPLYER; // shift ServoNickValue to center position |
ServoNickValue /= MULTIPLYER; |
// range servo pulse width |
if(RemainingPulse > MAXSERVOPULSE ) RemainingPulse = MAXSERVOPULSE; // upper servo pulse limit |
else if(RemainingPulse < MINSERVOPULSE ) RemainingPulse = MINSERVOPULSE; // lower servo pulse limit |
// accumulate time for correct update rate |
ServoFrameTime = RemainingPulse; |
} |
else // we had a high pulse |
{ |
TCCR2A |= (1<<COM2A0); // make a low pulse |
RemainingPulse = PPM_FRAMELEN - ServoFrameTime; |
} |
// set pulse output active |
PulseOutput = 1; |
} |
} // EOF Nick servo state machine |
else |
{ |
//----------------------------------------------------- |
// PPM state machine, onboard demultiplexed by HEF4017 |
//----------------------------------------------------- |
if(!PulseOutput) // pulse output complete |
{ |
if(TCCR2A & (1<<COM2A0)) // we had a low pulse |
{ |
TCCR2A &= ~(1<<COM2A0);// make a high pulse |
if(ServoIndex == 0) // if we are at the sync gap |
{ |
RemainingPulse = PPM_FRAMELEN - ServoFrameTime; // generate sync gap by filling time to full frame time |
ServoFrameTime = 0; // reset servo frame time |
HEF4017R_ON; // enable HEF4017 reset |
} |
else // servo channels |
{ |
RemainingPulse = MINSERVOPULSE + SERVORANGE/2; // center position ~ 1.5ms |
switch(ServoIndex) // map servo channels |
{ |
case 1: // Nick Compensation Servo |
ServoNickOffset = (ServoNickOffset * 3 + (int16_t)Parameter_ServoNickControl * MULTIPLYER) / 4; // lowpass offset |
ServoNickValue = ServoNickOffset; // offset (Range from 0 to 255 * 3 = 765) |
if(EE_Parameter.ServoCompInvert & 0x01) |
{ // inverting movement of servo |
ServoNickValue += (int16_t)( ( (int32_t)EE_Parameter.ServoNickComp * MULTIPLYER * (IntegralNick / 128L ) ) / (256L) ); |
} |
else |
{ // non inverting movement of servo |
ServoNickValue -= (int16_t)( ( (int32_t)EE_Parameter.ServoNickComp * MULTIPLYER * (IntegralNick / 128L ) ) / (256L) ); |
} |
// limit servo value to its parameter range definition |
if(ServoNickValue < ((int16_t)EE_Parameter.ServoNickMin * MULTIPLYER) ) |
{ |
ServoNickValue = (int16_t)EE_Parameter.ServoNickMin * MULTIPLYER; |
} |
else |
if(ServoNickValue > ((int16_t)EE_Parameter.ServoNickMax * MULTIPLYER) ) |
{ |
ServoNickValue = (int16_t)EE_Parameter.ServoNickMax * MULTIPLYER; |
} |
RemainingPulse += ServoNickValue - (256 / 2) * MULTIPLYER; // shift ServoNickValue to center position |
ServoNickValue /= MULTIPLYER; |
break; |
case 2: // Roll Compensation Servo |
ServoRollOffset = (ServoRollOffset * 3 + (int16_t) Parameter_ServoRollControl * MULTIPLYER) / 4; // lowpass offset |
ServoRollValue = ServoRollOffset; // offset (Range from 0 to 255 * 3 = 765) |
if(EE_Parameter.ServoCompInvert & 0x02) |
{ // inverting movement of servo |
ServoRollValue += (int16_t)( ( (int32_t) EE_Parameter.ServoRollComp * MULTIPLYER * (IntegralRoll / 128L ) ) / (256L) ); |
} |
else |
{ // non inverting movement of servo |
ServoRollValue -= (int16_t)( ( (int32_t) EE_Parameter.ServoRollComp * MULTIPLYER * (IntegralRoll / 128L ) ) / (256L) ); |
} |
// limit servo value to its parameter range definition |
if(ServoRollValue < ((int16_t)EE_Parameter.ServoRollMin * MULTIPLYER) ) |
{ |
ServoRollValue = (int16_t)EE_Parameter.ServoRollMin * MULTIPLYER; |
} |
else |
if(ServoRollValue > ((int16_t)EE_Parameter.ServoRollMax * MULTIPLYER) ) |
{ |
ServoRollValue = (int16_t)EE_Parameter.ServoRollMax * MULTIPLYER; |
} |
RemainingPulse += ServoRollValue - (256 / 2) * MULTIPLYER; // shift ServoNickValue to center position |
ServoRollValue /= MULTIPLYER; |
//DebugOut.Analog[20] = ServoRollValue; |
break; |
case 3: |
RemainingPulse += ((int16_t)Parameter_Servo3 * MULTIPLYER) - (256 / 2) * MULTIPLYER; |
break; |
case 4: |
RemainingPulse += ((int16_t)Parameter_Servo4 * MULTIPLYER) - (256 / 2) * MULTIPLYER; |
break; |
case 5: |
RemainingPulse += ((int16_t)Parameter_Servo5 * MULTIPLYER) - (256 / 2) * MULTIPLYER; |
break; |
default: // other servo channels |
RemainingPulse += 2 * PPM_in[ServoIndex]; // add channel value, factor of 2 because timer 1 increments 3.2µs |
break; |
} |
// range servo pulse width |
if(RemainingPulse > MAXSERVOPULSE ) RemainingPulse = MAXSERVOPULSE; // upper servo pulse limit |
else if(RemainingPulse < MINSERVOPULSE ) RemainingPulse = MINSERVOPULSE; // lower servo pulse limit |
// substract stop pulse width |
RemainingPulse -= PPM_STOPPULSE; |
// accumulate time for correct sync gap |
ServoFrameTime += RemainingPulse; |
} |
} |
else // we had a high pulse |
{ |
TCCR2A |= (1<<COM2A0); // make a low pulse |
// set pulsewidth to stop pulse width |
RemainingPulse = PPM_STOPPULSE; |
// accumulate time for correct sync gap |
ServoFrameTime += RemainingPulse; |
if((ServoActive && SenderOkay > 180) || ServoActive == 2) HEF4017R_OFF; // disable HEF4017 reset |
else HEF4017R_ON; |
ServoIndex++; // change to next servo channel |
if(ServoIndex > EE_Parameter.ServoNickRefresh) ServoIndex = 0; // reset to the sync gap |
} |
// set pulse output active |
PulseOutput = 1; |
} |
} // EOF PPM state machine |
// General pulse output generator |
if(RemainingPulse > (255 + IRS_RUNTIME)) |
{ |
OCR2A = 255; |
RemainingPulse -= 255; |
} |
else |
{ |
if(RemainingPulse > 255) // this is the 2nd last part |
{ |
if((RemainingPulse - 255) < IRS_RUNTIME) |
{ |
OCR2A = 255 - IRS_RUNTIME; |
RemainingPulse -= 255 - IRS_RUNTIME; |
} |
else // last part > ISR_RUNTIME |
{ |
OCR2A = 255; |
RemainingPulse -= 255; |
} |
} |
else // this is the last part |
{ |
OCR2A = RemainingPulse; |
RemainingPulse = 0; |
PulseOutput = 0; // trigger to stop pulse |
} |
} // EOF general pulse output generator |
} |
/branches/v0.80d-Arthur-P/timer0.h |
---|
0,0 → 1,21 |
#define TIMER_TEILER CK8 |
#define TIMER_RELOAD_VALUE 250 |
#define HEF4017R_ON PORTC |= (1<<PORTC6) |
#define HEF4017R_OFF PORTC &= ~(1<<PORTC6) |
void Timer_Init(void); |
void TIMER2_Init(void); |
void Delay_ms(unsigned int); |
void Delay_ms_Mess(unsigned int); |
unsigned int SetDelay (unsigned int t); |
char CheckDelay (unsigned int t); |
extern volatile unsigned int CountMilliseconds; |
extern volatile unsigned char UpdateMotor; |
extern volatile unsigned int beeptime; |
extern volatile unsigned int cntKompass; |
extern unsigned int BeepMuster; |
extern volatile unsigned char SendSPI, ServoActive; |
extern volatile int16_t ServoNickValue; |
extern volatile int16_t ServoRollValue; |
/branches/v0.80d-Arthur-P/twimaster.c |
---|
0,0 → 1,467 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) Holger Buss, Ingo Busker |
// + Nur für den privaten Gebrauch |
// + www.MikroKopter.com |
// + porting the sources to other systems or using the software on other systems (except hardware from www.mikrokopter.de) is not allowed |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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 <avr/io.h> |
#include <avr/interrupt.h> |
#include <util/twi.h> |
#include "eeprom.h" |
#include "twimaster.h" |
#include "fc.h" |
#include "analog.h" |
#include "uart.h" |
#include "timer0.h" |
volatile uint8_t twi_state = TWI_STATE_MOTOR_TX; |
volatile uint8_t dac_channel = 0; |
volatile uint8_t motor_write = 0; |
volatile uint8_t motor_read = 0; |
volatile uint16_t I2CTimeout = 100; |
uint8_t MissingMotor = 0; |
volatile uint8_t BLFlags = 0; |
MotorData_t Motor[MAX_MOTORS]; |
// bit mask for witch BL the configuration should be sent |
volatile uint16_t BLConfig_WriteMask = 0; |
// bit mask for witch BL the configuration should be read |
volatile uint16_t BLConfig_ReadMask = 0; |
// buffer for BL Configuration |
BLConfig_t BLConfig; |
#define I2C_WriteByte(byte) {TWDR = byte; TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE);} |
#define I2C_ReceiveByte() {TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE) | (1<<TWEA);} |
#define I2C_ReceiveLastByte() {TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE);} |
#define SCL_CLOCK 200000L |
#define I2C_TIMEOUT 30000 |
#define TWI_BASE_ADDRESS 0x52 |
/**************************************************/ |
/* Initialize I2C (TWI) */ |
/**************************************************/ |
void I2C_Init(void) |
{ |
uint8_t i; |
uint8_t sreg = SREG; |
cli(); |
// SDA is INPUT |
DDRC &= ~(1<<DDC1); |
// SCL is output |
DDRC |= (1<<DDC0); |
// pull up SDA |
PORTC |= (1<<PORTC0)|(1<<PORTC1); |
// TWI Status Register |
// prescaler 1 (TWPS1 = 0, TWPS0 = 0) |
TWSR &= ~((1<<TWPS1)|(1<<TWPS0)); |
// set TWI Bit Rate Register |
TWBR = ((F_CPU/SCL_CLOCK)-16)/2; |
twi_state = TWI_STATE_MOTOR_TX; |
motor_write = 0; |
motor_read = 0; |
for(i=0; i < MAX_MOTORS; i++) |
{ |
Motor[i].Version = 0; |
Motor[i].SetPoint = 0; |
Motor[i].SetPointLowerBits = 0; |
Motor[i].State = 0; |
Motor[i].ReadMode = BL_READMODE_STATUS; |
Motor[i].Current = 0; |
Motor[i].MaxPWM = 0; |
Motor[i].Temperature = 0; |
} |
SREG = sreg; |
} |
void I2C_Reset(void) |
{ |
// stop i2c bus |
I2C_Stop(TWI_STATE_MOTOR_TX); |
motor_write = 0; |
motor_read = 0; |
TWCR = (1<<TWINT); // reset to original state incl. interrupt flag reset |
TWAMR = 0; |
TWAR = 0; |
TWDR = 0; |
TWSR = 0; |
TWBR = 0; |
I2C_Init(); |
I2C_WriteByte(0); |
BLFlags |= BLFLAG_READ_VERSION; |
} |
/****************************************/ |
/* I2C ISR */ |
/****************************************/ |
ISR (TWI_vect) |
{ |
static uint8_t missing_motor = 0, motor_read_temperature = 0; |
static uint8_t *pBuff = 0; |
static uint8_t BuffLen = 0; |
switch (twi_state++) |
{ |
// Master Transmit |
case 0: // TWI_STATE_MOTOR_TX |
// skip motor if not used in mixer |
while((Mixer.Motor[motor_write][MIX_GAS] <= 0) && (motor_write < MAX_MOTORS)) motor_write++; |
if(motor_write >= MAX_MOTORS) // writing finished, read now |
{ |
BLConfig_WriteMask = 0; // reset configuration bitmask |
motor_write = 0; // reset motor write counter for next cycle |
twi_state = TWI_STATE_MOTOR_RX; |
I2C_WriteByte(TWI_BASE_ADDRESS + TW_READ + (motor_read<<1) ); // select slave address in rx mode |
} |
else I2C_WriteByte(TWI_BASE_ADDRESS + TW_WRITE + (motor_write<<1) ); // select slave address in tx mode |
break; |
case 1: // Send Data to Slave |
I2C_WriteByte(Motor[motor_write].SetPoint); // transmit setpoint |
// if old version has been detected |
if(!(Motor[motor_write].Version & MOTOR_STATE_NEW_PROTOCOL_MASK)) |
{ |
twi_state = 4; //jump over sending more data |
} |
// the new version has been detected |
else if(!( (Motor[motor_write].SetPointLowerBits && (RequiredMotors < 7)) || BLConfig_WriteMask || BLConfig_ReadMask ) ) |
{ // or LowerBits are zero and no BlConfig should be sent (saves round trip time) |
twi_state = 4; //jump over sending more data |
} |
break; |
case 2: // lower bits of setpoint (higher resolution) |
if ((0x0001<<motor_write) & BLConfig_ReadMask) |
{ |
Motor[motor_write].ReadMode = BL_READMODE_CONFIG; // configuration request |
} |
else |
{ |
Motor[motor_write].ReadMode = BL_READMODE_STATUS; // normal status request |
} |
// send read mode and the lower bits of setpoint |
I2C_WriteByte((Motor[motor_write].ReadMode<<3)|(Motor[motor_write].SetPointLowerBits & 0x07)); |
// configuration tranmission request? |
if((0x0001<<motor_write) & BLConfig_WriteMask) |
{ // redirect tx pointer to configuration data |
pBuff = (uint8_t*)&BLConfig; // select config for motor |
BuffLen = sizeof(BLConfig_t); |
} |
else |
{ // jump to end of transmission for that motor |
twi_state = 4; |
} |
break; |
case 3: // send configuration |
I2C_WriteByte(*pBuff); |
pBuff++; |
if(--BuffLen > 0) twi_state = 3; // if there are some bytes left |
break; |
case 4: // repeat case 0-4 for all motors |
if(TWSR == TW_MT_DATA_NACK) // Data transmitted, NACK received |
{ |
if(!missing_motor) missing_motor = motor_write + 1; |
if((Motor[motor_write].State & MOTOR_STATE_ERROR_MASK) < MOTOR_STATE_ERROR_MASK) Motor[motor_write].State++; // increment error counter and handle overflow |
} |
I2C_Stop(TWI_STATE_MOTOR_TX); |
I2CTimeout = 10; |
motor_write++; // next motor |
I2C_Start(TWI_STATE_MOTOR_TX); // Repeated start -> switch slave or switch Master Transmit -> Master Receive |
break; |
// Master Receive Data |
case 5: // TWI_STATE_MOTOR_RX |
if(TWSR != TW_MR_SLA_ACK) // SLA+R transmitted but no ACK received |
{ // no response from the addressed slave received |
Motor[motor_read].State &= ~MOTOR_STATE_PRESENT_MASK; // clear present bit |
if(++motor_read >= MAX_MOTORS) |
{ // all motors read |
motor_read = 0; // restart from beginning |
BLConfig_ReadMask = 0; // reset read configuration bitmask |
if(++motor_read_temperature >= MAX_MOTORS) |
{ |
motor_read_temperature = 0; |
BLFlags &= ~BLFLAG_READ_VERSION; |
} |
} |
BLFlags |= BLFLAG_TX_COMPLETE; |
I2C_Stop(TWI_STATE_MOTOR_TX); |
} |
else |
{ // motor successfully addressed |
Motor[motor_read].State |= MOTOR_STATE_PRESENT_MASK; // set present bit |
if(Motor[motor_read].Version & MOTOR_STATE_NEW_PROTOCOL_MASK) |
{ |
// new BL found |
switch(Motor[motor_read].ReadMode) |
{ |
case BL_READMODE_CONFIG: |
pBuff = (uint8_t*)&BLConfig; |
BuffLen = sizeof(BLConfig_t); |
break; |
case BL_READMODE_STATUS: |
pBuff = (uint8_t*)&(Motor[motor_read].Current); |
if(motor_read == motor_read_temperature) BuffLen = 3; // read Current, MaxPwm & Temp |
else BuffLen = 1;// read Current only |
break; |
} |
} |
else // old BL version |
{ |
pBuff = (uint8_t*)&(Motor[motor_read].Current); |
if((BLFlags & BLFLAG_READ_VERSION) || (motor_read == motor_read_temperature)) BuffLen = 2; // Current & MaxPwm |
else BuffLen = 1; // read Current only |
} |
if(BuffLen == 1) |
{ |
I2C_ReceiveLastByte(); // read last byte |
} |
else |
{ |
I2C_ReceiveByte(); // read next byte |
} |
} |
MissingMotor = missing_motor; |
missing_motor = 0; |
break; |
case 6: // receive bytes |
*pBuff = TWDR; |
pBuff++; |
BuffLen--; |
if(BuffLen>1) |
{ |
I2C_ReceiveByte(); // read next byte |
} |
else if (BuffLen == 1) |
{ |
I2C_ReceiveLastByte(); // read last byte |
} |
else // nothing left |
{ |
if(BLFlags & BLFLAG_READ_VERSION) |
{ |
if(!(FCFlags & FCFLAG_MOTOR_RUN) && (Motor[motor_read].MaxPWM == 250) ) Motor[motor_read].Version |= MOTOR_STATE_NEW_PROTOCOL_MASK; |
else Motor[motor_read].Version = 0; |
} |
if(++motor_read >= MAX_MOTORS) |
{ |
motor_read = 0; // restart from beginning |
BLConfig_ReadMask = 0; // reset read configuration bitmask |
if(++motor_read_temperature >= MAX_MOTORS) |
{ |
motor_read_temperature = 0; |
BLFlags &= ~BLFLAG_READ_VERSION; |
} |
} |
I2C_Stop(TWI_STATE_MOTOR_TX); |
BLFlags |= BLFLAG_TX_COMPLETE; |
return; |
} |
twi_state = 6; // if there are some bytes left |
break; |
// writing Gyro-Offsets |
case 18: |
I2C_WriteByte(0x98); // Address the DAC |
break; |
case 19: |
I2C_WriteByte(0x10 + (dac_channel * 2)); // Select DAC Channel (0x10 = A, 0x12 = B, 0x14 = C) |
break; |
case 20: |
switch(dac_channel) |
{ |
case 0: |
I2C_WriteByte(AnalogOffsetNick); // 1st byte for Channel A |
break; |
case 1: |
I2C_WriteByte(AnalogOffsetRoll); // 1st byte for Channel B |
break; |
case 2: |
I2C_WriteByte(AnalogOffsetGier); // 1st byte for Channel C |
break; |
} |
break; |
case 21: |
I2C_WriteByte(0x80); // 2nd byte for all channels is 0x80 |
break; |
case 22: |
I2C_Stop(TWI_STATE_MOTOR_TX); |
I2CTimeout = 10; |
// repeat case 18...22 until all DAC Channels are updated |
if(dac_channel < 2) |
{ |
dac_channel ++; // jump to next channel |
I2C_Start(TWI_STATE_GYRO_OFFSET_TX); // start transmission for next channel |
} |
else |
{ |
dac_channel = 0; // reset dac channel counter |
BLFlags |= BLFLAG_TX_COMPLETE; |
} |
break; |
default: |
I2C_Stop(TWI_STATE_MOTOR_TX); |
BLFlags |= BLFLAG_TX_COMPLETE; |
I2CTimeout = 10; |
motor_write = 0; |
motor_read = 0; |
break; |
} |
} |
uint8_t I2C_WriteBLConfig(uint8_t motor) |
{ |
uint8_t i; |
uint16_t timer; |
if(MotorenEin || PC_MotortestActive) return(BLCONFIG_ERR_MOTOR_RUNNING); // not when motors are running! |
if(motor > MAX_MOTORS) return (BLCONFIG_ERR_MOTOR_NOT_EXIST); // motor does not exist! |
if(motor) |
{ |
if(!(Motor[motor-1].State & MOTOR_STATE_PRESENT_MASK)) return(BLCONFIG_ERR_MOTOR_NOT_EXIST); // motor does not exist! |
if(!(Motor[motor-1].Version & MOTOR_STATE_NEW_PROTOCOL_MASK)) return(BLCONFIG_ERR_HW_NOT_COMPATIBLE); // not a new BL! |
} |
// check BL configuration to send |
if(BLConfig.Revision != BLCONFIG_REVISION) return (BLCONFIG_ERR_SW_NOT_COMPATIBLE); // bad revison |
i = RAM_Checksum((uint8_t*)&BLConfig, sizeof(BLConfig_t) - 1); |
if(i != BLConfig.crc) return(BLCONFIG_ERR_CHECKSUM); // bad checksum |
timer = SetDelay(2000); |
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer |
// prepare the bitmask |
if(!motor) // 0 means all |
{ |
BLConfig_WriteMask = 0xFF; // all motors at once with the same configuration |
} |
else //only one specific motor |
{ |
BLConfig_WriteMask = 0x0001<<(motor-1); |
} |
for(i = 0; i < MAX_MOTORS; i++) |
{ |
if((0x0001<<i) & BLConfig_WriteMask) |
{ |
Motor[i].SetPoint = 0; |
Motor[i].SetPointLowerBits = 0; |
} |
} |
motor_write = 0; |
// needs at least MAX_MOTORS loops of 2 ms (12*2ms = 24ms) |
do |
{ |
I2C_Start(TWI_STATE_MOTOR_TX); // start an i2c transmission |
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer |
}while(BLConfig_WriteMask && !CheckDelay(timer)); // repeat until the BL config has been sent |
if(BLConfig_WriteMask) return(BLCONFIG_ERR_MOTOR_NOT_EXIST); |
return(BLCONFIG_SUCCESS); |
} |
uint8_t I2C_ReadBLConfig(uint8_t motor) |
{ |
uint8_t i; |
uint16_t timer; |
if(MotorenEin || PC_MotortestActive) return(BLCONFIG_ERR_MOTOR_RUNNING); // not when motors are running! |
if(motor > MAX_MOTORS) return (BLCONFIG_ERR_MOTOR_NOT_EXIST); // motor does not exist! |
if(motor == 0) return (BLCONFIG_ERR_READ_NOT_POSSIBLE); |
if(!(Motor[motor-1].State & MOTOR_STATE_PRESENT_MASK)) return(BLCONFIG_ERR_MOTOR_NOT_EXIST); // motor does not exist! |
if(!(Motor[motor-1].Version & MOTOR_STATE_NEW_PROTOCOL_MASK)) return(BLCONFIG_ERR_HW_NOT_COMPATIBLE); // not a new BL! |
timer = SetDelay(2000); |
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer |
// prepare the bitmask |
BLConfig_ReadMask = 0x0001<<(motor-1); |
for(i = 0; i < MAX_MOTORS; i++) |
{ |
if((0x0001<<i) & BLConfig_ReadMask) |
{ |
Motor[i].SetPoint = 0; |
Motor[i].SetPointLowerBits = 0; |
} |
} |
motor_read = 0; |
BLConfig.Revision = 0; // bad revision |
BLConfig.crc = 0; // bad checksum |
// needs at least MAX_MOTORS loops of 2 ms (12*2ms = 24ms) |
do |
{ |
I2C_Start(TWI_STATE_MOTOR_TX); // start an i2c transmission |
while(!(BLFlags & BLFLAG_TX_COMPLETE) && !CheckDelay(timer)); //wait for complete transfer |
}while(BLConfig_ReadMask && !CheckDelay(timer)); // repeat until the BL config has been received from all motors |
// validate result |
if(BLConfig.Revision != BLCONFIG_REVISION) return (BLCONFIG_ERR_SW_NOT_COMPATIBLE); // bad revison |
i = RAM_Checksum((uint8_t*)&BLConfig, sizeof(BLConfig_t) - 1); |
if(i != BLConfig.crc) return(BLCONFIG_ERR_CHECKSUM); // bad checksum |
return(BLCONFIG_SUCCESS); |
} |
/branches/v0.80d-Arthur-P/twimaster.h |
---|
0,0 → 1,100 |
#ifndef _I2C_MASTER_H |
#define _I2C_MASTER_H |
+ |
+#include <inttypes.h> |
+ |
+#define TWI_STATE_MOTOR_TX 0 |
+#define TWI_STATE_MOTOR_RX 5 |
+#define TWI_STATE_GYRO_OFFSET_TX 18 |
+ |
+extern volatile uint8_t twi_state; |
+extern volatile uint8_t motor_write; |
+extern volatile uint8_t motor_read; |
+ |
+ |
+extern uint8_t MissingMotor; |
+ |
+#define MAX_MOTORS 12 |
+#define MOTOR_STATE_PRESENT_MASK 0x80 |
+#define MOTOR_STATE_ERROR_MASK 0x7F |
+ |
+#define MOTOR_STATE_NEW_PROTOCOL_MASK 0x01 |
+ |
+#define BLFLAG_TX_COMPLETE 0x01 |
+#define BLFLAG_READ_VERSION 0x02 |
+ |
+extern volatile uint8_t BLFlags; |
+ |
+ |
+#define BL_READMODE_STATUS 0 |
+#define BL_READMODE_CONFIG 16 |
+ |
+typedef struct |
+{ |
+ uint8_t Version; // the version of the BL (0 = old) |
+ uint8_t SetPoint; // written by attitude controller |
+ uint8_t SetPointLowerBits; // for higher Resolution of new BLs |
+ uint8_t State; // 7 bit for I2C error counter, highest bit indicates if motor is present |
+ uint8_t ReadMode; // select data to read |
+ // the following bytes must be exactly in that order! |
+ uint8_t Current; // in 0.1 A steps, read back from BL |
+ uint8_t MaxPWM; // read back from BL is less than 255 if BL is in current limit |
+ int8_t Temperature; // old BL-Ctrl will return a 255 here, the new version the temp. in °C |
+} __attribute__((packed)) MotorData_t; |
+ |
+extern MotorData_t Motor[MAX_MOTORS]; |
+ |
+#define BLCONFIG_REVISION 2 |
+ |
+#define MASK_SET_PWM_SCALING 0x01 |
+#define MASK_SET_CURRENT_LIMIT 0x02 |
+#define MASK_SET_TEMP_LIMIT 0x04 |
+#define MASK_SET_CURRENT_SCALING 0x08 |
+#define MASK_SET_BITCONFIG 0x10 |
+#define MASK_RESET_CAPCOUNTER 0x20 |
+#define MASK_SET_DEFAULT_PARAMS 0x40 |
+#define MASK_SET_SAVE_EEPROM 0x80 |
+ |
+#define BITCONF_REVERSE_ROTATION 0x01 |
+#define BITCONF_RES1 0x02 |
+#define BITCONF_RES2 0x04 |
+#define BITCONF_RES3 0x08 |
+#define BITCONF_RES4 0x10 |
+#define BITCONF_RES5 0x20 |
+#define BITCONF_RES6 0x40 |
+#define BITCONF_RES7 0x80 |
+ |
+typedef struct |
+{ |
+ uint8_t Revision; // must be BL_REVISION |
+ uint8_t SetMask; // settings mask |
+ uint8_t PwmScaling; // maximum value of control pwm, acts like a thrust limit |
+ uint8_t CurrentLimit; // current limit in A |
+ uint8_t TempLimit; // in °C |
+ uint8_t CurrentScaling; // scaling factor for current measurement |
+ uint8_t BitConfig; // see defines above |
+ uint8_t crc; // checksum |
+} __attribute__((packed)) BLConfig_t; |
+ |
+extern BLConfig_t BLConfig; |
+ |
+extern volatile uint16_t I2CTimeout; |
+ |
+void I2C_Init (void); // Initialize I2C |
+#define I2C_Start(start_state) {twi_state = start_state; BLFlags &= ~BLFLAG_TX_COMPLETE; TWCR = (1<<TWSTA) | (1<<TWEN) | (1<<TWINT) | (1<<TWIE);} |
+#define I2C_Stop(start_state) {twi_state = start_state; TWCR = (1<<TWEN) | (1<<TWSTO) | (1<<TWINT);} |
+void I2C_Reset(void); // Reset I2C |
+ |
+#define BLCONFIG_SUCCESS 0 |
+#define BLCONFIG_ERR_MOTOR_RUNNING 1 |
+#define BLCONFIG_ERR_MOTOR_NOT_EXIST 2 |
+#define BLCONFIG_ERR_HW_NOT_COMPATIBLE 3 |
+#define BLCONFIG_ERR_SW_NOT_COMPATIBLE 4 |
+#define BLCONFIG_ERR_CHECKSUM 5 |
+#define BLCONFIG_ERR_READ_NOT_POSSIBLE 6 |
+ |
+uint8_t I2C_WriteBLConfig(uint8_t motor); |
+uint8_t I2C_ReadBLConfig(uint8_t motor); |
+ |
+#endif |
/branches/v0.80d-Arthur-P/uart.c |
---|
0,0 → 1,683 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) Holger Buss, Ingo Busker |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include <stdarg.h> |
#include <string.h> |
#include <avr/pgmspace.h> |
#include "main.h" |
#include "uart.h" |
#include "libfc.h" |
#include "eeprom.h" |
#define FC_ADDRESS 1 |
#define NC_ADDRESS 2 |
#define MK3MAG_ADDRESS 3 |
#define BL_CTRL_ADDRESS 5 |
#define ABO_TIMEOUT 4000 // disable abo after 4 seconds |
#define MAX_SENDE_BUFF 160 |
#define MAX_EMPFANGS_BUFF 160 |
#define BLPARAM_REVISION 1 |
#define MASK_SET_PWM_SCALING 0x01 |
#define MASK_SET_CURRENT_LIMIT 0x02 |
#define MASK_SET_TEMP_LIMIT 0x04 |
#define MASK_SET_CURRENT_SCALING 0x08 |
#define MASK_SET_BITCONFIG 0x10 |
#define MASK_RESET_CAPCOUNTER 0x20 |
#define MASK_SET_DEFAULT_PARAMS 0x40 |
#define MASK_SET_SAVE_EEPROM 0x80 |
typedef struct |
{ |
unsigned char Revision; // revision of parameter structure |
unsigned char Address; // target address |
unsigned char PwmScaling; // maximum value of pwm setpoint |
unsigned char CurrentLimit; // current limit in 1A steps |
unsigned char TemperatureLimit; // in °C |
unsigned char CurrentScaling; // scaling factor for current measurement |
unsigned char BitConfig; // see defines above |
unsigned char SetMask; // filter for active paramters |
unsigned char Checksum; // checksum for parameter sturcture |
} __attribute__((packed)) BLParameter_t; |
unsigned char GetExternalControl = 0,DebugDisplayAnforderung1 = 0, DebugDisplayAnforderung = 0,DebugDataAnforderung = 0,GetVersionAnforderung = 0, GetPPMChannelAnforderung = 0; |
unsigned char DisplayLine = 0; |
unsigned volatile char SioTmp = 0; |
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 TxdBuffer[MAX_SENDE_BUFF]; |
unsigned volatile char RxdBuffer[MAX_EMPFANGS_BUFF]; |
unsigned char *pRxData = 0; |
unsigned char RxDataLen = 0; |
unsigned volatile char PC_DebugTimeout = 0; |
unsigned volatile char PC_MotortestActive = 0; |
unsigned char DebugTextAnforderung = 255; |
unsigned char PcZugriff = 100; |
unsigned char MotorTest[16]; |
unsigned char MeineSlaveAdresse = 1; // Flight-Ctrl |
unsigned char ConfirmFrame; |
struct str_DebugOut DebugOut; |
struct str_ExternControl ExternControl; |
struct str_VersionInfo VersionInfo; |
struct str_WinkelOut WinkelOut; |
struct str_Data3D Data3D; |
int Display_Timer, Debug_Timer,Kompass_Timer,Timer3D; |
unsigned int DebugDataIntervall = 0, Intervall3D = 0, Display_Interval = 0; |
unsigned int AboTimeOut = 0; |
const unsigned char ANALOG_TEXT[32][16] PROGMEM = |
{ |
//1234567890123456 |
"AngleNick ", //0 |
"AngleRoll ", |
"AccNick ", |
"AccRoll ", |
"YawGyro ", |
"Height Value ", //5 |
"AccZ ", |
"Gas ", |
"Compass Value ", |
"Voltage [0.1V] ", |
"Receiver Level ", //10 |
"Gyro Compass ", |
"Motor 1 ", |
"Motor 2 ", |
"Motor 3 ", |
"Motor 4 ", //15 |
"16 ", |
"17 ", |
"18 ", |
"19 ", |
"Servo ", //20 |
"Hovergas ", |
"Current [0.1A] ", |
"Capacity [mAh] ", |
"24 ", |
"25 ", //25 |
"26 ", |
"27 ", |
"I2C-Error ", |
"BL Limit ", |
"GPS_Nick ", //30 |
"GPS_Roll " |
}; |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ Sende-Part der Datenübertragung |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
ISR(USART0_TX_vect) |
{ |
static unsigned int ptr = 0; |
unsigned char tmp_tx; |
if(!UebertragungAbgeschlossen) |
{ |
ptr++; // die [0] wurde schon gesendet |
tmp_tx = TxdBuffer[ptr]; |
if((tmp_tx == '\r') || (ptr == MAX_SENDE_BUFF)) |
{ |
ptr = 0; |
UebertragungAbgeschlossen = 1; |
} |
UDR0 = tmp_tx; |
} |
else ptr = 0; |
} |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ Empfangs-Part der Datenübertragung, incl. CRC-Auswertung |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
ISR(USART0_RX_vect) |
{ |
static unsigned int crc; |
static unsigned char crc1,crc2,buf_ptr; |
static unsigned char UartState = 0; |
unsigned char CrcOkay = 0; |
SioTmp = UDR0; |
if(buf_ptr >= MAX_SENDE_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 + 1; |
RxdBuffer[buf_ptr] = '\r'; |
if(RxdBuffer[2] == 'R') |
{ |
LcdClear(); |
wdt_enable(WDTO_250MS); // Reset-Commando |
ServoActive = 0; |
} |
} |
} |
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 += TxdBuffer[i]; |
} |
tmpCRC %= 4096; |
TxdBuffer[i++] = '=' + tmpCRC / 64; |
TxdBuffer[i++] = '=' + tmpCRC % 64; |
TxdBuffer[i++] = '\r'; |
UebertragungAbgeschlossen = 0; |
UDR0 = TxdBuffer[0]; |
} |
// -------------------------------------------------------------------------- |
void SendOutData(unsigned char cmd,unsigned char address, unsigned char BufferAnzahl, ...) //unsigned char *snd, unsigned char len) |
{ |
va_list ap; |
unsigned int pt = 0; |
unsigned char a,b,c; |
unsigned char ptr = 0; |
unsigned char *snd = 0; |
int len = 0; |
TxdBuffer[pt++] = '#'; // Startzeichen |
TxdBuffer[pt++] = 'a' + address; // Adresse (a=0; b=1,...) |
TxdBuffer[pt++] = cmd; // Commando |
va_start(ap, BufferAnzahl); |
if(BufferAnzahl) |
{ |
snd = va_arg(ap, unsigned char*); |
len = va_arg(ap, int); |
ptr = 0; |
BufferAnzahl--; |
} |
while(len) |
{ |
if(len) |
{ |
a = snd[ptr++]; |
len--; |
if((!len) && BufferAnzahl) |
{ |
snd = va_arg(ap, unsigned char*); |
len = va_arg(ap, int); |
ptr = 0; |
BufferAnzahl--; |
} |
} |
else a = 0; |
if(len) |
{ |
b = snd[ptr++]; |
len--; |
if((!len) && BufferAnzahl) |
{ |
snd = va_arg(ap, unsigned char*); |
len = va_arg(ap, int); |
ptr = 0; |
BufferAnzahl--; |
} |
} |
else b = 0; |
if(len) |
{ |
c = snd[ptr++]; |
len--; |
if((!len) && BufferAnzahl) |
{ |
snd = va_arg(ap, unsigned char*); |
len = va_arg(ap, int); |
ptr = 0; |
BufferAnzahl--; |
} |
} |
else c = 0; |
TxdBuffer[pt++] = '=' + (a >> 2); |
TxdBuffer[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4)); |
TxdBuffer[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6)); |
TxdBuffer[pt++] = '=' + ( c & 0x3f); |
} |
va_end(ap); |
AddCRC(pt); |
} |
// -------------------------------------------------------------------------- |
void Decode64(void) // die daten werden im rx buffer dekodiert, das geht nur, weil aus 4 byte immer 3 gemacht werden. |
{ |
unsigned char a,b,c,d; |
unsigned char x,y,z; |
unsigned char ptrIn = 3; // start at begin of data block |
unsigned char ptrOut = 3; |
unsigned char len = AnzahlEmpfangsBytes - 6; // von der Gesamtbytezahl eines Frames gehen 3 Bytes des Headers ('#',Addr, Cmd) und 3 Bytes des Footers (CRC1, CRC2, '\r') ab. |
while(len) |
{ |
a = RxdBuffer[ptrIn++] - '='; |
b = RxdBuffer[ptrIn++] - '='; |
c = RxdBuffer[ptrIn++] - '='; |
d = RxdBuffer[ptrIn++] - '='; |
x = (a << 2) | (b >> 4); |
y = ((b & 0x0f) << 4) | (c >> 2); |
z = ((c & 0x03) << 6) | d; |
if(len--) RxdBuffer[ptrOut++] = x; else break; |
if(len--) RxdBuffer[ptrOut++] = y; else break; |
if(len--) RxdBuffer[ptrOut++] = z; else break; |
} |
pRxData = (unsigned char*)&RxdBuffer[3]; // decodierte Daten beginnen beim 4. Byte |
RxDataLen = ptrOut - 3; // wie viele Bytes wurden dekodiert? |
} |
// -------------------------------------------------------------------------- |
void BearbeiteRxDaten(void) |
{ |
if(!NeuerDatensatzEmpfangen) return; |
unsigned char tempchar1, tempchar2; |
Decode64(); // dekodiere datenblock im Empfangsbuffer |
switch(RxdBuffer[1]-'a') // check for Slave Address |
{ |
case FC_ADDRESS: // FC special commands |
switch(RxdBuffer[2]) |
{ |
case 'K':// Kompasswert |
memcpy((unsigned char *)&KompassValue , (unsigned char *)pRxData, sizeof(KompassValue)); |
KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180; |
break; |
case 't':// Motortest |
if(AnzahlEmpfangsBytes > 20) memcpy(&MotorTest[0], (unsigned char *)pRxData, sizeof(MotorTest)); |
else memcpy(&MotorTest[0], (unsigned char *)pRxData, 4); |
PC_MotortestActive = 240; |
//while(!UebertragungAbgeschlossen); |
//SendOutData('T', MeineSlaveAdresse, 0); |
PcZugriff = 255; |
break; |
case 'n':// "Get Mixer |
while(!UebertragungAbgeschlossen); |
SendOutData('N', FC_ADDRESS, 1, (unsigned char *) &Mixer, sizeof(Mixer) - 1); |
Debug("Mixer lesen"); |
break; |
case 'm':// "Write Mixer |
if(pRxData[0] == EEMIXER_REVISION) |
{ |
memcpy(&Mixer, (unsigned char *)pRxData, sizeof(Mixer) - 1); |
MixerTable_WriteToEEProm(); |
tempchar1 = 1; |
VersionInfo.HardwareError[1] &= ~DEFEKT_MIXER_ERR; |
} |
else |
{ |
tempchar1 = 0; |
} |
while(!UebertragungAbgeschlossen); |
SendOutData('M', FC_ADDRESS, 1, &tempchar1, sizeof(tempchar1)); |
break; |
case 'p': // get PPM Channels |
GetPPMChannelAnforderung = 1; |
PcZugriff = 255; |
break; |
case 'q':// "Get"-Anforderung für Settings |
// Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
if(pRxData[0] == 0xFF) |
{ |
pRxData[0] = GetActiveParamSet(); |
} |
// limit settings range |
if(pRxData[0] < 1) pRxData[0] = 1; // limit to 5 |
else if(pRxData[0] > 5) pRxData[0] = 5; // limit to 5 |
// load requested parameter set |
ParamSet_ReadFromEEProm(pRxData[0]); |
tempchar1 = pRxData[0]; |
while(!UebertragungAbgeschlossen); |
SendOutData('Q', FC_ADDRESS, 2, &tempchar1, sizeof(tempchar1), (unsigned char *) &EE_Parameter, sizeof(EE_Parameter) - 1); |
Debug("Lese Setting %d", tempchar1); |
break; |
case 's': // Parametersatz speichern |
if((1 <= pRxData[0]) && (pRxData[0] <= 5) && (pRxData[1] == EEPARAM_REVISION)) // check for setting to be in range |
{ |
memcpy(&EE_Parameter, (uint8_t*)&pRxData[1], sizeof(EE_Parameter) - 1); |
ParamSet_WriteToEEProm(pRxData[0]); |
Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L; |
Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagRoll * 2500L; |
tempchar1 = GetActiveParamSet(); |
} |
else |
{ |
tempchar1 = 0; // mark in response an invlid setting |
} |
while(!UebertragungAbgeschlossen); |
SendOutData('S', FC_ADDRESS, 1, &tempchar1, sizeof(tempchar1)); |
if(!MotorenEin) Piep(tempchar1,110); |
LipoDetection(0); |
LIBFC_ReceiverInit(EE_Parameter.Receiver); |
break; |
case 'f': // auf anderen Parametersatz umschalten |
if((1 <= pRxData[0]) && (pRxData[0] <= 5)) ParamSet_ReadFromEEProm(pRxData[0]); |
tempchar1 = GetActiveParamSet(); |
while(!UebertragungAbgeschlossen); |
SendOutData('F', FC_ADDRESS, 1, &tempchar1, sizeof(tempchar1)); |
if(!MotorenEin) Piep(tempchar1,110); |
LipoDetection(0); |
LIBFC_ReceiverInit(EE_Parameter.Receiver); |
break; |
case 'y':// serial Potis |
PPM_in[13] = (signed char) pRxData[0]; PPM_in[14] = (signed char) pRxData[1]; PPM_in[15] = (signed char) pRxData[2]; PPM_in[16] = (signed char) pRxData[3]; |
PPM_in[17] = (signed char) pRxData[4]; PPM_in[18] = (signed char) pRxData[5]; PPM_in[19] = (signed char) pRxData[6]; PPM_in[20] = (signed char) pRxData[7]; |
PPM_in[21] = (signed char) pRxData[8]; PPM_in[22] = (signed char) pRxData[9]; PPM_in[23] = (signed char) pRxData[10]; PPM_in[24] = (signed char) pRxData[11]; |
break; |
case 'u': // request BL parameter |
Debug("Reading BL %d", pRxData[0]); |
// try to read BL configuration |
tempchar2 = I2C_ReadBLConfig(pRxData[0]); |
if(tempchar2 == BLCONFIG_SUCCESS) tempchar1 = 1; |
else tempchar1 = 0; |
while(!UebertragungAbgeschlossen); // wait for previous frame to be sent |
SendOutData('U', FC_ADDRESS, 4, &tempchar1, sizeof(tempchar1), &tempchar2, sizeof(tempchar2), &pRxData[0], 1, &BLConfig, sizeof(BLConfig_t)); |
break; |
case 'w': // write BL parameter |
Debug("Writing BL %d", pRxData[0]); |
if(RxDataLen >= 1+sizeof(BLConfig_t)) |
{ |
memcpy(&BLConfig, (uint8_t*)(&pRxData[1]), sizeof(BLConfig_t)); |
tempchar2 = I2C_WriteBLConfig(pRxData[0]); |
if(tempchar2 == BLCONFIG_SUCCESS) tempchar1 = 1; |
else tempchar1 = 0; // indicate error |
while(!UebertragungAbgeschlossen); // wait for previous frame to be sent |
SendOutData('W', FC_ADDRESS,2, &tempchar1, sizeof(tempchar1), &tempchar2, sizeof(tempchar2)); |
} |
break; |
} // case FC_ADDRESS: |
default: // any Slave Address |
switch(RxdBuffer[2]) |
{ |
// 't' comand placed here only for compatibility to BL |
case 't':// Motortest |
if(AnzahlEmpfangsBytes >= sizeof(MotorTest)) memcpy(&MotorTest[0], (unsigned char *)pRxData, sizeof(MotorTest)); |
else memcpy(&MotorTest[0], (unsigned char *)pRxData, 4); |
while(!UebertragungAbgeschlossen); |
SendOutData('T', MeineSlaveAdresse, 0); |
PC_MotortestActive = 250; |
PcZugriff = 255; |
AboTimeOut = SetDelay(ABO_TIMEOUT); |
break; |
// 'K' comand placed here only for compatibility to old MK3MAG software, that does not send the right Slave Address |
case 'K':// Kompasswert |
memcpy((unsigned char *)&KompassValue , (unsigned char *)pRxData, sizeof(KompassValue)); |
KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180; |
break; |
case 'a':// Texte der Analogwerte |
DebugTextAnforderung = pRxData[0]; |
if (DebugTextAnforderung > 31) DebugTextAnforderung = 31; |
PcZugriff = 255; |
break; |
case 'b': |
memcpy((unsigned char *)&ExternControl, (unsigned char *)pRxData, sizeof(ExternControl)); |
ConfirmFrame = ExternControl.Frame; |
PcZugriff = 255; |
break; |
case 'c': // Poll the 3D-Data |
if(!Intervall3D) { if(pRxData[0]) Timer3D = SetDelay(pRxData[0] * 10);} |
Intervall3D = pRxData[0] * 10; |
AboTimeOut = SetDelay(ABO_TIMEOUT); |
break; |
case 'd': // Poll the debug data |
PcZugriff = 255; |
DebugDataIntervall = (unsigned int)pRxData[0] * 10; |
if(DebugDataIntervall > 0) DebugDataAnforderung = 1; |
AboTimeOut = SetDelay(ABO_TIMEOUT); |
break; |
case 'h':// x-1 Displayzeilen |
PcZugriff = 255; |
if((pRxData[0] & 0x80) == 0x00) // old format |
{ |
DisplayLine = 2; |
Display_Interval = 0; |
} |
else // new format |
{ |
RemoteKeys |= ~pRxData[0]; |
Display_Interval = (unsigned int)pRxData[1] * 10; |
DisplayLine = 4; |
AboTimeOut = SetDelay(ABO_TIMEOUT); |
} |
DebugDisplayAnforderung = 1; |
break; |
case 'l':// x-1 Displayzeilen |
PcZugriff = 255; |
MenuePunkt = pRxData[0]; |
DebugDisplayAnforderung1 = 1; |
break; |
case 'v': // Version-Anforderung und Ausbaustufe |
GetVersionAnforderung = 1; |
break; |
case 'g':// |
GetExternalControl = 1; |
break; |
default: |
//unsupported command received |
break; |
} |
break; // default: |
} |
NeuerDatensatzEmpfangen = 0; |
pRxData = 0; |
RxDataLen = 0; |
} |
//############################################################################ |
//Routine für die Serielle Ausgabe |
void uart_putchar (char c) |
//############################################################################ |
{ |
//Warten solange bis Zeichen gesendet wurde |
loop_until_bit_is_set(UCSR0A, UDRE0); |
//Ausgabe des Zeichens |
UDR0 = c; |
} |
//############################################################################ |
//INstallation der Seriellen Schnittstelle |
void UART_Init (void) |
//############################################################################ |
{ |
unsigned int ubrr = (unsigned int) ((unsigned long) F_CPU/(8 * USART0_BAUD) - 1); |
//Enable TXEN im Register UCR TX-Data Enable & RX Enable |
UCSR0B = (1 << TXEN0) | (1 << RXEN0); |
// UART Double Speed (U2X) |
UCSR0A |= (1 << U2X0); |
// RX-Interrupt Freigabe |
UCSR0B |= (1 << RXCIE0); |
// TX-Interrupt Freigabe |
UCSR0B |= (1 << TXCIE0); |
// USART0 Baud Rate Register |
// set clock divider |
UBRR0H = (uint8_t)(ubrr >> 8); |
UBRR0L = (uint8_t)ubrr; |
Debug_Timer = SetDelay(DebugDataIntervall); |
Kompass_Timer = SetDelay(220); |
VersionInfo.SWMajor = VERSION_MAJOR; |
VersionInfo.SWMinor = VERSION_MINOR; |
VersionInfo.SWPatch = VERSION_PATCH; |
VersionInfo.ProtoMajor = VERSION_SERIAL_MAJOR; |
VersionInfo.ProtoMinor = VERSION_SERIAL_MINOR; |
pRxData = 0; |
RxDataLen = 0; |
} |
//--------------------------------------------------------------------------------------------- |
void DatenUebertragung(void) |
{ |
if(!UebertragungAbgeschlossen) return; |
if(CheckDelay(AboTimeOut)) |
{ |
Display_Interval = 0; |
DebugDataIntervall = 0; |
Intervall3D = 0; |
} |
if(((Display_Interval>0 && CheckDelay(Display_Timer)) || DebugDisplayAnforderung) && UebertragungAbgeschlossen) |
{ |
if(DisplayLine > 3)// new format |
{ |
Menu(); |
SendOutData('H', FC_ADDRESS, 1, (uint8_t *)DisplayBuff, 80); |
} |
else // old format |
{ |
LCD_printfxy(0,0,"!!! INCOMPATIBLE !!!"); |
SendOutData('H', FC_ADDRESS, 2, &DisplayLine, sizeof(DisplayLine), (uint8_t *)DisplayBuff, 20); |
if(DisplayLine++ > 3) DisplayLine = 0; |
} |
Display_Timer = SetDelay(Display_Interval); |
DebugDisplayAnforderung = 0; |
} |
if(DebugDisplayAnforderung1 && UebertragungAbgeschlossen) |
{ |
Menu(); |
SendOutData('L', FC_ADDRESS, 3, &MenuePunkt, sizeof(MenuePunkt), &MaxMenue, sizeof(MaxMenue), DisplayBuff, sizeof(DisplayBuff)); |
DebugDisplayAnforderung1 = 0; |
} |
if(GetVersionAnforderung && UebertragungAbgeschlossen) |
{ |
SendOutData('V', FC_ADDRESS, 1, (unsigned char *) &VersionInfo, sizeof(VersionInfo)); |
GetVersionAnforderung = 0; |
Debug_OK("Version gesendet"); |
} |
if(GetExternalControl && UebertragungAbgeschlossen) // Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
{ |
SendOutData('G',MeineSlaveAdresse, 1, (unsigned char *) &ExternControl, sizeof(ExternControl)); |
GetExternalControl = 0; |
} |
if((CheckDelay(Kompass_Timer)) && UebertragungAbgeschlossen) |
{ |
WinkelOut.Winkel[0] = (int) (IntegralNick / (EE_Parameter.GyroAccFaktor * 4)); // etwa in 0.1 Grad |
WinkelOut.Winkel[1] = (int) (IntegralRoll / (EE_Parameter.GyroAccFaktor * 4)); // etwa in 0.1 Grad |
WinkelOut.UserParameter[0] = Parameter_UserParam1; |
WinkelOut.UserParameter[1] = Parameter_UserParam2; |
SendOutData('k', MK3MAG_ADDRESS, 1, (unsigned char *) &WinkelOut,sizeof(WinkelOut)); |
if(WinkelOut.CalcState > 4) WinkelOut.CalcState = 6; // wird dann in SPI auf Null gesetzt |
Kompass_Timer = SetDelay(99); |
} |
if(((DebugDataIntervall>0 && CheckDelay(Debug_Timer)) || DebugDataAnforderung) && UebertragungAbgeschlossen) |
{ |
CopyDebugValues(); |
SendOutData('D', FC_ADDRESS, 1, (unsigned char *) &DebugOut,sizeof(DebugOut)); |
DebugDataAnforderung = 0; |
if(DebugDataIntervall>0) Debug_Timer = SetDelay(DebugDataIntervall); |
} |
if(Intervall3D > 0 && CheckDelay(Timer3D) && UebertragungAbgeschlossen) |
{ |
Data3D.Winkel[0] = (int) (IntegralNick / (EE_Parameter.GyroAccFaktor * 4)); // etwa in 0.1 Grad |
Data3D.Winkel[1] = (int) (IntegralRoll / (EE_Parameter.GyroAccFaktor * 4)); // etwa in 0.1 Grad |
Data3D.Winkel[2] = (int) ((10 * ErsatzKompass) / GIER_GRAD_FAKTOR); |
Data3D.Centroid[0] = SummeNick >> 9; |
Data3D.Centroid[1] = SummeRoll >> 9; |
Data3D.Centroid[2] = Mess_Integral_Gier >> 9; |
SendOutData('C', FC_ADDRESS, 1, (unsigned char *) &Data3D,sizeof(Data3D)); |
Timer3D = SetDelay(Intervall3D); |
} |
if(DebugTextAnforderung != 255) // Texte für die Analogdaten |
{ |
unsigned char label[16]; // local sram buffer |
memcpy_P(label, ANALOG_TEXT[DebugTextAnforderung], 16); // read lable from flash to sra |
SendOutData('A', FC_ADDRESS, 2, (unsigned char *)&DebugTextAnforderung, sizeof(DebugTextAnforderung),label, 16); |
DebugTextAnforderung = 255; |
} |
if(ConfirmFrame && UebertragungAbgeschlossen) // Datensatz bestätigen |
{ |
SendOutData('B', FC_ADDRESS, 1, (uint8_t*)&ConfirmFrame, sizeof(ConfirmFrame)); |
ConfirmFrame = 0; |
} |
if(GetPPMChannelAnforderung && UebertragungAbgeschlossen) |
{ |
SendOutData('P', FC_ADDRESS, 1, (unsigned char *) &PPM_in, sizeof(PPM_in)); |
GetPPMChannelAnforderung = 0; |
} |
#ifdef DEBUG // only include functions if DEBUG is defined |
if(SendDebugOutput && UebertragungAbgeschlossen) |
{ |
SendOutData('0', FC_ADDRESS, 1, (unsigned char *) &tDebug, sizeof(tDebug)); |
SendDebugOutput = 0; |
} |
#endif |
} |
/branches/v0.80d-Arthur-P/uart.h |
---|
0,0 → 1,85 |
#ifndef _UART_H |
#define _UART_H |
#define printf_P(format, args...) _printf_P(&uart_putchar, format , ## args) |
#define printf(format, args...) _printf_P(&uart_putchar, PSTR(format) , ## args) |
void BearbeiteRxDaten(void); |
extern unsigned char DebugGetAnforderung; |
extern unsigned volatile char UebertragungAbgeschlossen; |
extern unsigned volatile char PC_DebugTimeout; |
extern unsigned volatile char NeueKoordinateEmpfangen; |
extern unsigned volatile char PC_MotortestActive; |
extern unsigned char MeineSlaveAdresse; |
extern unsigned char PcZugriff; |
extern unsigned char RemotePollDisplayLine; |
extern int Debug_Timer,Kompass_Timer; |
extern void UART_Init (void); |
extern void uart_putchar (char c); |
extern void boot_program_page (uint32_t page, uint8_t *buf); |
extern void DatenUebertragung(void); |
extern void Uart1Init(void); |
extern void BearbeiteRxDaten(void); |
extern unsigned char MotorTest[16]; |
struct str_DebugOut |
{ |
unsigned char Status[2]; |
signed int Analog[32]; // Debugwerte |
}; |
extern struct str_DebugOut DebugOut; |
struct str_WinkelOut |
{ |
signed int Winkel[2]; |
unsigned char UserParameter[2]; |
unsigned char CalcState; |
unsigned char Orientation; |
}; |
extern struct str_WinkelOut WinkelOut; |
struct str_Data3D |
{ |
signed int Winkel[3]; // nick, roll, compass in 0,1° |
signed char Centroid[3]; |
signed char reserve[5]; |
}; |
extern struct str_Data3D Data3D; |
struct str_ExternControl |
{ |
unsigned char Digital[2]; |
unsigned char RemoteTasten; |
signed char Nick; |
signed char Roll; |
signed char Gier; |
unsigned char Gas; |
signed char Hight; |
unsigned char free; |
unsigned char Frame; |
unsigned char Config; |
}; |
extern struct str_ExternControl ExternControl; |
struct str_VersionInfo |
{ |
unsigned char SWMajor; |
unsigned char SWMinor; |
unsigned char ProtoMajor; |
unsigned char ProtoMinor; |
unsigned char SWPatch; |
unsigned char HardwareError[5]; |
}; |
extern struct str_VersionInfo VersionInfo; |
//#define USART0_BAUD 9600 |
//#define USART0_BAUD 14400 |
//#define USART0_BAUD 28800 |
//#define USART0_BAUD 38400 |
#define USART0_BAUD 57600 |
#endif //_UART_H |
/branches/v0.80d-Arthur-P/version.txt |
---|
0,0 → 1,420 |
------- |
V0.53 27.04.2007 H.Buss |
- erste öffentliche Version |
V0.53b 29.04.2007 H.Buss |
- der FAKTOR_I war versehentlich auf Null, dann liegt der MikroKopter nicht so hart in der Luft |
V0.53c 29.04.2007 H.Buss |
- es gib ein Menü, in dem die Werte der Kanäle nach Nick, Roll, Gas,... sortiert sind. |
Die angezeigten Werte waren nicht die Werte der Funke |
V0.54 01.05.2007 H.Buss |
- die Paramtersätze können jetzt vor dem Start ausgewählt werden |
Dazu wird beim Kalibrieren der Messwerte (Gashebel oben links) der Nick-Rollhebel abgefragt: |
2 3 4 |
1 x 5 |
- - - |
Bedeutet: Nick-Rollhebel Links Mitte = Setting:1 Links Oben = Setting:2 usw. |
- der Faktor_I für den Hauptregler ist hinzugekommen. Im Heading-Hold-Modus sollte er vergössert werden, was Stabilität bringt |
V0.55 14.05.2007 H.Buss |
- es können nun Servos an J3,J4,J5 mit den Kanälen 5-7 gesteuert werden |
V0.56 14.05.2007 H.Buss |
- es gab Probleme mit Funken, die mehr als 8 Kanäle haben, wenn mehrere Kanäle dann auf Null waren |
- Funken, die nicht bis +-120 aussteuern können, sollten jetzt auch gehen |
V0.57 24.05.2007 H.Buss |
- Der Höhenregler kann nun auch mittels Schalter bedient werden |
- Bug im Gier-Algorithmus behoben; Schnelles Gieren fürhrte dazu, dass der MK zu weit gedreht hat |
- Kompass-Einfluss dämpfen bei Neigung |
- Man kann zwischen Kompass FIX (Richtung beim Kalibrieren) und Variabel (einstellbar per Gier) wählen |
- Der Motortest vom Kopter-Tool geht jetzt |
- Man kann den Parametersätzen einen Namen geben |
- Das Kamerasetting ist unter Setting 2 defaultmässig integriert |
V0.58 30.05.2007 H.Buss |
- Der Höhenregler-Algorithmus wird nun umgangen, wenn der Höhenreglerschalter aus ist |
V0.60 17.08.2007 H.Buss |
- "Schwindel-Bug" behoben |
- Die Poti-Werte werden jetzt auf Unterlauf (<0) überprüft |
- Poti4 zugefügt |
- Es werden jetzt 8 Kanäle ausgewertet |
- Kamera-Servo (an J7) |
- Die Settings müssen überschrieben werden |
V0.61 - V0.63 H.Buss 27.09.2007 |
- Poti 4 und Kanal 8 werden im Menü angezeigt |
- ein paar Kleinigkeiten bei den DefaultKonstanten2 bereinigt |
- Analog.c: Aktuell_ax korrigiert |
- auf 32 Debug-Kanäle erweitert |
- Loopings sind jetzt möglich und einzeln im KopterTool freischaltbar |
- leichte Anpassungen im Gier - Geschwindigkeit und Drift |
- die Hardwareversion V1.1 wird erkannt und das Programm stellt sich auf die geänderte Gyroverstärkung und die geänderten Portpins ein |
- die Software startet nach dem Einschalten schneller, weil der Luftdruckoffset schneller gefunden wird |
- die PPM-Ausgänge liegen wieder an den Pins an |
- Details an der Sensordatenverarbeitung -> es fliegt sich geringfügig anders |
- der MK ist bei wenig Gas nicht mehr so giftig -> soll das Landen vereinfachen |
- I2C-Bus läuft jetzt sicher nach einer Störung wieder an |
- Sticksignale werden präziser ausgewertet |
- Stick-Kanäle werden ans Kopter-Tool übertragen |
- Es muss die Version V1.47 des Kopter-Tool verwendet werden |
- Die Settings werden auf Default zurückgesetzt |
- am Piepen kann man die Fehlerart unterscheiden |
1. einzelnes Piepen beim Einschalten und Kalibrieren |
2. langsames Intervall mindestens 1 Sek -> Empfangsausfall |
3. schnelleres Intervall mindestens 1 Sek -> Akku |
4. sehr schnelles Intervall mindestens 1 Sek -> Kommunikation zu den Reglern gestört |
V0.64 H.Buss 30.09.2007 |
- beim Gieren wurden die Achsen nicht hart genug geregelt |
V0.65a H.Buss 15.10.2007 |
- Integral im Mischer wieder integriert |
- Feinabstimmung im ACC/Gyro Abgleich -> 1/32 & 100 |
- ACC/Gyro Abgleich auch bei HH |
V0.66a H.Buss 3.11.2007 |
- Messwertverarbeitung aus dem Analog-Interrupt entfernt |
- Analogmessung hängt jetzt am FC-Timing |
- Looping-Stick-Hysterese eingebaut |
- Looping-180°-Umschlag einstellbar |
- Achsenkopplung: Gierbewegung verkoppelt Nick und Roll |
- Lageregelung nach ACC-Sensor verbessert |
- zusätzlicher I-Anteil in der Lageregelung verbessert die Neutrallage |
- Gyrodriftkompensation überarbeitet |
- Bug in der Gier-Stick-Berechnung behoben |
- Gyro-Messung auf 1kHz beschleunigt |
V0.67a H.Buss 16.11.2007 |
- der Hauptregler-I-Anteil wirkt jetzt nur noch auf den Winkel (ausser im HH-Mode) |
- Gyro-Acc-Abgleich jetzt wieder in jedem Zyklus |
- Feinabstimmung |
- Beim HH-Modus gab es noch Bugs |
V0.67e H.Buss 29.11.2007 |
- Parameter: Dynamic Stability und Driftfaktor eingeführt |
- Die Namen der Analogwerte werden jetzt zum Koptertool übertragen |
- Kompatibilität zum Koptertool erhöht |
V0.67f H.Buss 04.12.2007 |
- Das Integral des Hauptreglers wird jetzt linear entladen und nicht mehr proportional |
- Schub für Gier wird jetzt auf den Gaswert begrenzt, dadurch steigt der MK nicht mehr beim Gieren. Gier ist allerdings nicht mehr so agressiv |
- Die ACC-Nullwerte können jetzt dauerhaft im EEPROM gespeichert werden (Stick:Vollgas und Gier rechts) |
V0.68a I.Busker 28.12.2007 |
- SPI.c & SPI.h ins Projekt aufgenommen |
SPI-Kommuikation kann in SPI.h aktiviert/deaktivert werden |
V0.68c H.Buss 05.01.2008 |
- Stickauswertung verbessert -> träger und präziser |
- Alle Settings angepasst |
V0.69e H.Buss 05.05.2008 |
- kleinere Bugs beseitigt |
- Schneller Sinkflug jetzt möglich |
- Min- und Maxgas in den Settings geändert |
- Lagewinkel wird jetzt in 0,1 Grad an Kompass und Navi gesendet |
- Kalibrierung für MK3Mag -> Nick unten beim Kalibrieren |
- Kompassroutine um den Ersatzkompass (Gyro unterstützt Kompasswert) erweitert |
V0.69h H.Buss 21.05.2008 |
- STICK_GAIN = 4 eingeführt. Das erhöht die Auflösung der Sollwerte. Stick_P und Stick_I müssen nun um Faktor 4 erhöht werden |
- SenderOkay auch an das Naviboard übertragen |
- Bessere Parameter bei Senderausfall |
V0.69j H.Buss 30.05.2008 |
- Höhere Präzision der Achsenkopplung |
V0.69k H.Buss 31.05.2008 |
- Bug in SPI.C behoben |
- in 0.69h war ein Bug, der zu ungewollten Loopings führen konnte |
V0.69L H.Buss 14.06.2008 |
- feinere Cam-Servo-Auflösung |
V0.70a H.Buss 01.07.2008 |
- Unterstützung der V1.3-Hardware mit automatischem Hardware-Gyro-Abgleich |
V0.70b H.Buss 14.07.2008 |
- flexible Einstellungsmöglichkeit von J16 und J17 (Transistorausgänge) |
- eigene Parameter für GPS-Naviboard |
- eigener Parameter für ExternalControl (war vorher UserParameter1 bzw. 8) |
- neue Parameter im EEPROM-Datensatz: J16Bitmask, J16Timing, ExternalControl, Navi... |
- MikroKopterFlags eingeführt, damit das Navi den Status des MKs kennt |
- KopterTool-Kompatibilität auf 8 erhöht |
V0.70c H.Buss 30.07.2008 |
- Parameter der Datenfusion leicht modifiziert |
- EEPROM-Parameter für Looping-Umschlag angepasst (von 100 auf 85) |
- MaxStick wird auf 100 begrenzt |
V0.70d H.Buss 02.08.2008 |
- Transistorausgänge: das oberste Bit der Blinkmaske (im KopterTool linkes Bit) gibt nun den Zustand des Ausgangs im Schalterbetrieb an |
0.71b: H.Buss 19.10.2008 |
Kommunikation zum Navi erweitert: |
- Beeptime jetzt 32Bit |
- Datenfusion und Driftkopensation wird durch NaviBoard unterstützt |
0.71c: H.Buss 20.10.2008 |
- LoopConfig heisst jetzt BitConfig |
- 3-Fach-Schalter für Höhensteuerung möglich -> kann man mit GPS-Schalter zusammenlegen |
- bei den Settings wurde Setting[0] mit abgespeichert, welches es nicht gab. |
- in Zukunft werden bei neuen EEPROM-Settings die Kanäle von Setting 1 übernommen |
- Variablen NaviWindCorrection, NaviSpeedCompensation, NaviOperatingRadius eingeführt |
0.71f: H.Buss 15.11.2008 |
- Ausschalten der Höhenregelung per Schalter um 0,3 sek verzögert |
- bei der seriellen Übertragung hat die FC jetzt als SlaveAdresse die 1 |
- VersionInfo.NaviKompatibel eingeführt |
- wenn manuell gegiert wird, wird der GyroKompass-Wert auf den Kompasswert gesetzt |
- Luftdruckwert wird an das Navi übertragen |
- Der Baro-Offset wird jetzt nachgeführt, um den Messbereich zu erweitern. Geht nur bei Höhenregler mit Schalter |
- Debugdaten können jetzt mit 'f' gepollt werden |
0.71g: Gregor 09.12.2008 |
- Kommunikation überarbeitet |
Infos hier: http://www.mikrokopter.de/ucwiki/en/SerialCommands |
0.71h: H.Buss 15.12.2008 |
- Freigegebene Version |
- NaviAngleLimitation als Parameter zum Navi implementiert |
- Antwort auf CMD: 't' entfernt |
0.72d: H.Buss 22.01.2009 |
- OCTO als Compilerschalter |
- Unterstützung der FC 2.0 (ME) |
- GYRO_D eingeführt |
- Achsenkopplung jetzt auch auf Nick/Roll-Bewegung |
0.72e: H.Buss 27.01.2009 |
- die 0.72d hatte kein Integral im Gier |
- Parameter eingeführt: |
EE_Parameter.NaviGpsPLimit |
EE_Parameter.NaviGpsILimit |
EE_Parameter.NaviGpsDLimit |
EE_Parameter.NaviPH_LoginTime |
EE_Parameter.AchsKopplung2 |
EE_Parameter.CouplingYawCorrection |
0.72f: H.Buss 28.01.2009 |
- Bug im Ersatzkompass entfernt |
0.72h: H.Buss 05.02.2009 |
- Algorithmen beschleunigt -> Floats durch Fixkomma ersetzt |
- Achsentkopplung weiter verbessert |
- Nick- und Roll im Octo-Mischer auf jeweils vier Motoren aufgeteilt |
0.72i: H.Buss 07.02.2009 |
- Abtastrate von 1kHz auf 2kHz erhöht |
0.72j: H.Buss 09.02.2009 |
- neue Implementierung der Servoausgänge |
0.72k: H.Buss 10.02.2009 |
- Abtastrate auf 5kHz erhöht |
0.72L: H.Buss 13.02.2009 |
- Signalfilterung überarbeitet |
- OCTO2 implementiert |
0.72M: H.Buss 13.02.2009 |
- Code Cleanup |
0.72o: H.Buss 24.02.2009 |
- Abtastrate auf 2kHz |
- HW-Version an Navi |
- neuer Datensatz 'c' -> Lagedaten für 3D-Grafik |
- Auswerteroutine für Spectrum-Satteliten implementiert |
- Kanalsettings werden beim Parameterreset nicht mehr gelöscht |
- die Driftkompensation wird jetzt feiner aufgelöst --> EE_Parameter.Driftkomp muss mal 8 genommen werden |
- die Integrale und ACC-Werte werden jetzt im Scope in ca. 0,1° angezeigt (wie beim NaviBrd) |
0.72p: H.Buss 01.03.2009 |
- Octo3 erstellt |
- Analogwerte umbenannt |
0.73a-d: H.Buss 05.04.2009 |
- MixerTabelle implementiert |
- I2C-Bus auf bis zu 12 Motoren erweitert |
- die Busfehler der BL-Regler werden im Menü angezeigt |
- Revision der MixerTabelle eingeführt |
- MixerTabelle wird bei Parameterreset neu initialisiert |
- Motortest auf [12] erweitert |
- Motorschalter nicht mehr 3-Stufig |
0.74a |
- Datenfusion im Flug auch, wenn ACC-Z < 512 |
- Wert für die Luftdruck-Messbereichserweiterung abgefangen |
0.74d |
- Die Driftkompensation ist jetzt dreistufig -> 0,5% pro sekunde zusätzlich eingeführts |
0.75a G.Stobrawa 22.5.2009 |
- Extern Control also received from NC via SPI |
0.75b H.Buss 27.05.2009 |
- Spektrum-Singale schalten den PPM-Eingang aus |
- max. 2 Sekunden nach dem Start auf die BL-Regler warten |
- Automatische Zellenerkennung, wenn Spannungswarnung < 5,0V |
- Bei automatischer Zellenerkennung piept es je nach Zellenzahl |
- EE_DATENREVISION auf 76 erhöht |
- Servo: |
- Roll-Servo für FC ME implementiert |
- Update-Cmd stoppt Servos |
- Servos werden erst nach dem ersten Kalibrieren aktiviert |
0.75c G.Stobrawa 25.7.2009 |
- Übertragung der Servo-Settings zur NC |
- RSSI wird an NC gesendet, derzeit wird der Wert nicht gesetzt |
- Bugfix Messbereichsumschaltung des Luftdrucksensors springt |
- Auflösung des Luftdrucks nun bis auf 1 cm (5mal feiner) zur genaueren Berechnung des D-Anteils |
- Unterstützung von Warnings-Bitmasks für die J16, J17-Outputs bei Unterspannung |
- Unterspannung für einzelne Zelle´n von 3.2V auf 3.3V angehoben (9.6V --> 9.9V für 3S) |
0.75d H.Buss 13.8.2009 |
- RC-Routine: Empfangsausfall soll sicherer erkannt werden |
- Zellenerkennung nun auch beim Speichern der Settings |
- Warnungs-Blinkmaske auch bei Empfangsausfall |
0.75e H.Buss 18.8.2009 |
- LED-Blinken kann an die Motoren gekoppelt werden |
- Feinabstimmung des Höhenreglers |
0.75f H.Buss 27.8.2009 |
- D-Anteil des Höhenreglers jetzt mit Quadratischer Komponente |
- Lagewinkel wirkt jetzt mit 1/Cos(x) mit in den Höhenregler |
- leichte Modifikation der RC-Empfangroutine |
0.75g H.Buss 31.08.2009 |
- die Akkuspannung geht jetzt antiproportional ins Gas ein |
0.75h H.Buss 3.09.2009 |
- im Höhenregler werden jetzt die Stellwerte begrenzt --> max +- 16% vom geschätzten Schwebegas |
0.75i H.Buss 7.09.2009 |
- GpsZ vom Navi zur FC für den Höhenregler |
- "hoovergas-Variation" als Parameter |
- Kompatibilität zu NC und PC erhöht |
0.75j H.Buss 17.09.2009 |
- Laufzeitzähler eingebaut |
0.75k H.Buss 22.09.2009 |
- zweite Variante (Gregor) der Höhenregelung implementiert |
- umschaltbare RC-Routine |
0.75L H.Buss 23.09.2009 |
- SollHoehe und Gas geht nun auch an die NC |
0.75M H.Buss 29.09.2009 |
- Spektrum-Timing wird nun überwacht |
- die FC kann nun stand-Alone als Kamera-Stabilizer eingesetzt werden, weil die Servos aktiviert werden, wenn I2C fehlt |
0.75N H.Buss 29.09.2009 |
- Hoover-Stickpunkt wird bei aktivem Höhenregler nicht nachgeführt |
- Hoover-Stickpunkt kann per Parameter fest eingestellt werden |
- Baro-Messbereichserweiterung auch bei aktiviertem Höhenregler |
- Gyro_Gier_P und Gyro_Gier_I eingeführt |
- I2C_fehler-Zähler jetzt in den Analogdaten |
0.75o H.Buss 01.10.2009 |
- der Höhenregler wird jetzt nur alle 10ms bearbeitet |
- Baro-Messbereichserweiterung auch bei Poti als Sollwert |
0.76d H.Buss 10.10.2009 |
- bei aktiver Messbereichserweiterung wird die aktuelle Höhe übernommen |
0.76e H.Buss 27.10.2009 |
- es werden beim Start einmal alle BL-Regler angesprochen, damit BL-Regler#8 auch einen Selbsttest macht |
- S3D-ACT-Summensignal als Compilerschalter |
0.76f H.Buss 05.11.2009 |
- untere Spannungsgrenze der Unterspannungswarnung (9,3V) entfernt |
0.76g H.Buss 10.11.2009 |
- Casting-Fehler in der Gas-Berechnung |
0.77a H.Buss 11.11.2009 |
- Erweiterung auf 12 Kanäle |
- Bei Koptertool-Kanalabfrage kein Empfangsausfall-Piepsen |
- serielle Kanalerweiterung eingebaut -> PPM_in auf 25 erweitert |
- Servos3-5 einstellbar |
- neues Kommando "f" -> schaltet auf anderen Parametersatz um |
0.77b H.Buss 09.12.2009 |
- JetiBox: Menü wird übertragen |
- neu: FCFlags |= FCFLAG_I2CERR; |
- LED-Warn-Blinken nun mit festem Timing und abschaltbar |
0.77c H.Buss 07.01.2010 |
- zwei weitere Spektrum-Varianten implementiert |
0.77d H.Buss 25.01.2010 |
- Strom-Messung eingebaut |
0.78a H.Buss 03.02.2010 |
- Bugfix: Settingsumschaltung im Flug |
0.78b H.Buss |
- veröffentlichte Version |
0.78c H.Buss + G.Stobrawa 22.2.2010 |
- Bewegungsbegrenzung an Servo 3 to 5 der FC 2.0 |
- Theoretischer Variablenüberlauf bei Vario-Höhenregler |
- Anzeige des "SPI RX communication error" wenn GPS Option nicht aktiv |
- LED-Schwellwerte fürs Blinken waren unterschiedlich |
0.78c H.Buss + G.Stobrawa 04.3.2010 |
- Code cosmetics |
0.78f H.Buss + I.Busker 23.3.2010 |
- Unterstützung für Jeti-Expander |
- Begrenzung des Vario-Höhenreglers auf ein 10m-Fenster um Überläufe zu verhindern |
- Einführung eines Vario-Zeichens (+/-/ ) auf der Jetibox |
- BL-Timeout beim Start erhöht |
0.80a H. Buss + G.Stobrawa 20.5.2010 - 22.7.2010 |
- Motoren Starten nicht ohne Kalibrierung |
- Unterstützung der BL2.0-Regler |
- statt 8 nun 10 Bit Auflösung der Lageregekung |
- Unterstützung der BL2.0-Regler Konfiguration via MK-Tool |
- Parametersätze werden per I2C an die BL-Regler durchgereicht |
- "Care-Free" implementiert |
- Freie Belegung der "Vorne"-Richtung |
- nur wenn Motoren laufen: Beepen, wenn Carefree ohne Navi oder ohne gültigen MK3Mag-Wert |
- nur wenn Motoren laufen: Beepen wenn NC plötzlich ausfällt |
- #define RECEIVER_SPEKTRUM_EXP eingeführt |
- #define SWITCH_LEARNS_CAREFREE eingeführt |
- Schwerpunktanzeige in den 3D-Daten |
- Checksummen gesicherte Datenablage im EEProm |
- Fehlerdiagnose implementiert (Wiki: ErrorCodes) |
- ErrorCode aufs Jeti-Display |
- JetiMenü: bis acht Temperaturen der BL-Regler |
- GPSInfo.Speed im Jeti-Display |
- Compass-Richtung nun im Jeti-menü |
- diverse Änderungen im Höhenregler |
- P wirkt schwächer |
- D wirkt stärker |
- Anpassung der Höhenregelung auf Level des Hoovergases |
- AccZ schneller nachführen |
Parameter modifiziert: |
- EEPROM-Kompatibilität auf 84 -> Parameter werden resettet |
- EE_Parameter.Hoehe_ACC_Wirkung = 0; // war 30 |
- EE_Parameter.Hoehe_HoverBand = 8; // war 5 |
- Notgas = 45 |
- NotgasZeit = 90 |
- Beginnersetting: EE_Parameter.DynamicStability = 70; |
- Neu: GyroStability = 6 |
- GPS-Login-Time auf 2 reduziert |