/branches/thjac/V1_12/Dokumentation/Anleitung_V1_12a.doc |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/branches/thjac/V1_12/Dokumentation/Anleitung_V1_12a.pdf |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/branches/thjac/V1_12/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/thjac/V1_12/GPS.c |
---|
0,0 → 1,32 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
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/thjac/V1_12/Hex-Files/BootLoader_MEGA644_20MHZ_V0_1.hex |
---|
0,0 → 1,64 |
:10F8000011241FBECFEFD0E1DEBFCDBF11E0A0E0DD |
:10F81000B1E0E0EEFBEF02C005900D92A030B10721 |
:10F82000D9F712E0A0E0B1E001C01D92A230B1070B |
:10F83000E1F70C943B7C0C941D7C0895982F8091EB |
:10F84000C00085FFFCCF9093C60008958091C00052 |
:10F850008823E4F78091C600992708958DE40E94DB |
:10F860001E7C8BE40E941E7C82E40E941E7C8CE441 |
:10F870000E941E7C0895CFEFD0E1DEBFCDBFE0E057 |
:10F88000F0E014915F01772474BE98E10FB6F8940C |
:10F8900090936000109260000FBE7092C5008AE2E3 |
:10F8A0008093C4008091C00082608093C0009093D8 |
:10F8B000C10086E08093C200EF01072D8091C00057 |
:10F8C00087FF0DC0013031F48091C6008A3AB1F152 |
:10F8D00000E005C08091C6008B3109F401E0CE0143 |
:10F8E00021968436910528F11F3F41F0112331F014 |
:10F8F000E0910001F091010109951BC01092C50033 |
:10F900008AE28093C4008AE00E941E7C8DE00E94FF |
:10F910001E7C86E50E941E7C80E30E941E7C8EE297 |
:10F920000E941E7C81E30E941E7C8AE30E941E7C52 |
:10F9300005C080E593EC0197F1F7C0CF0E942E7CC3 |
:10F940000E94267C813611F489E547C1813471F427 |
:10F950000E94267CA82EBB24BA2CAA240E94267CB6 |
:10F960009927A82AB92AB694A79406C1823629F401 |
:10F9700089E50E941E7C81E00BC1823409F083C0BE |
:10F980000E94267C9927D82FCC270E94267C992775 |
:10F99000C82BD92B0E94267C082F12E0812E11E063 |
:10F9A000912EEE24FF2464010894811C911CEC1616 |
:10F9B000FD0618F40E94267C01C08FEFD6018C93BF |
:10F9C0000894E11CF11CBFEFEB16F10461F358F34E |
:10F9D000E4E77E1609F0DEC0063409F03DC0FFEF13 |
:10F9E000AF16F7EFBF0608F033C0DE01A5016627AA |
:10F9F0007727440F551F661F771F6A017B01C2E0FE |
:10FA0000D1E001E08991992729913327322F2227CC |
:10FA1000822B932B0C01FA0100935700E8951124D7 |
:10FA20004E5F5F4F6F4F7F4F129761F785E0F60192 |
:10FA300080935700E89507B600FCFDCF81E18093E5 |
:10FA40005700E89576956795579547955A0194C064 |
:10FA500080E00E941E7C90C0053409F08DC0F50145 |
:10FA60009E01A2E0B1E0E1BD8F2F992782BD8D916B |
:10FA700080BD3196FA9AF99AF999FECF215030401B |
:10FA800091F75F0179C0873609F047C00E94267C54 |
:10FA90009927D82ECC240E94267C9927C82AD92AB7 |
:10FAA0000E94267C863411F5E6016501EE24FF24D0 |
:10FAB000CC0CDD1CEE1CFF1CF60105911491802F6F |
:10FAC0000E941E7C812F99270E941E7C82E090E07C |
:10FAD000A0E0B0E0C80ED91EEA1EFB1E229761F717 |
:10FAE000F694E794D794C79456012ACF853409F049 |
:10FAF00027CF7501E1BC8F2D992782BDF89A089414 |
:10FB0000E11CF11C80B50E941E7C0894C108D1083C |
:10FB1000C114D10479F7570113CF853601F594E765 |
:10FB2000791651F580E090E0A0E0B0E023E0FC0120 |
:10FB300020935700E89507B600FCFDCF80509F4FFB |
:10FB4000AF4FBF4F8F3FE7EF9E07E0E0AE07E0E02B |
:10FB5000BE0768F381E180935700E8950DC08534B6 |
:10FB600069F488E190E02CE00FB6F894A8958093B2 |
:10FB700060000FBE209360008DE02FC08035E1F360 |
:10FB80008C34D1F3803711F483E527C0843721F416 |
:10FB90000E941E7C80E021C0843521F40E94267CD6 |
:10FBA000782EEACF8B3109F4C9CE8A3A09F4C6CE51 |
:10FBB000863529F480E30E941E7C81E30EC08337E2 |
:10FBC00041F489E00E941E7C86E90E941E7C8EE141 |
:10FBD00004C08B3109F4B4CE8FE30E941E7CB0CEFA |
:040000030000F80001 |
:00000001FF |
/branches/thjac/V1_12/Hex-Files/Flight-Ctrl_MEGA644_V1_12a.hex |
---|
0,0 → 1,3284 |
:100000000C94B6030C94D1030C94D1030C94D1033B |
:100010000C94D1030C94D1030C94D1030C94D10310 |
:100020000C94D1030C9434150C94D1030C94D1038B |
:100030000C945B280C94D1030C94D1030C94D10341 |
:100040000C94D1030C94D1030C94CE130C94D103D3 |
:100050000C94D7080C94D1030C949E080C94D103F3 |
:100060000C942B1A0C94D1030C9416270C94D103E6 |
:100070000C940A5D0C94D1030C94D103D71ACA1ABC |
:10008000BE1AA41A8A1A661A781AA61DDA1CD71C78 |
:10009000661AC41CAA1C8A1C6A1C181CC61BE31AFC |
:1000A0008B277E27CB27AF27A3273C274D274D271C |
:1000B000542770276B275027582754276727742702 |
:1000C000502758275427632779275027DD270A0D03 |
:1000D0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D50 |
:1000E0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D40 |
:1000F0003D3D3D000A0D466C69676874436F6E7440 |
:10010000726F6C0A0D48617264776172653A25649A |
:100110002E25640A0D536F6674776172653A562511 |
:10012000642E2564256320000A0D47656E657261A3 |
:1001300074696E672064656661756C74204D6978BA |
:100140006572205461626C65000A0D4D69786572B4 |
:100150002D436F6E6669673A20272573272028256F |
:1001600075204D6F746F727329000A0D466F756E9E |
:100170006420424C2D4374726C3A200025642000A8 |
:100180000A0D0A0D2121204D495353494E47204263 |
:100190004C2D4354524C3A202564202121000A0D55 |
:1001A0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D7F |
:1001B0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D6F |
:1001C0003D3D3D000A0D496E69742E204545505253 |
:1001D0004F4D003A2047656E65726174696E672005 |
:1001E00044656661756C742D506172616D657465EE |
:1001F00072207573696E67206F6C64205374696335 |
:100200006B2053657474696E6773000A0D41434334 |
:10021000206E6F742063616C696272617465642022 |
:1002200021000A0D5573696E6720706172616D65FA |
:10023000746572736574202564000A0D43616C69EE |
:1002400062726174696E672070726573737572652E |
:100250002073656E736F722E2E004F4B0A0D000ACD |
:100260000D436F6E74726F6C3A200048656164696B |
:100270006E67486F6C64004E6F726D616C20284130 |
:1002800043432D4D6F646529000A0D3D3D3D3D3DC5 |
:100290003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D8E |
:1002A0003D3D3D3D3D3D3D3D3D3D3D3D3D3D0A0DE1 |
:1002B000002E000A0D20444143206F722049324332 |
:1002C000204552524F522120436865636B204932CA |
:1002D000432C2033567265662C2044414320616EC6 |
:1002E0006420424C2D4374726C005B25695D005B99 |
:1002F00025695D002B204D696B726F4B6F707465C3 |
:1003000072202B0048573A5625642E2564205357F7 |
:100310003A25642E256425630053657474696E67FD |
:100320003A256420257300493243204552524F52EA |
:10033000212121004D697373696E6720424C2D4362 |
:1003400074726C3A256421210028632920486F6C5F |
:10035000676572204275737300486F6568653A205F |
:100360002020202025356900536F6C6C486F65682C |
:10037000653A20253569004C756674647275636B47 |
:100380003A20253569004F66662020202020203A3B |
:1003900020253569004B65696E65200048F6686563 |
:1003A0006E726567656C756E6700616B742E204CAC |
:1003B000616765004E69636B3A202020202020256C |
:1003C000356900526F6C6C3A2020202020202535A2 |
:1003D00069004B6F6D706173733A20202025356979 |
:1003E000004B313A25346920204B323A25346920BC |
:1003F000004B333A25346920204B343A25346920A8 |
:10040000004B353A25346920204B363A2534692093 |
:10041000004B373A25346920204B383A253469207F |
:10042000004E693A2534692020526F3A25346920FC |
:100430000047733A253469202047693A25346920FA |
:100440000050313A253469202050323A2534692051 |
:100450000050333A253469202050343A253469203D |
:10046000004779726F202D2053656E736F72004EB6 |
:1004700069636B2025346920282533692E25692975 |
:1004800000526F6C6C2025346920282533692E2595 |
:100490006929004769657220253469202825336958 |
:1004A00029004E69636B2025346920282533692E85 |
:1004B00025782900526F6C6C20253469202825335B |
:1004C000692E25782900476965722025346920281E |
:1004D00025336929004E69636B202534692028255E |
:1004E000336929282533692900526F6C6C20253423 |
:1004F000692028253369292825336929004769653A |
:100500007220253469202825336929282533692953 |
:1005100000414343202D2053656E736F72004E6976 |
:10052000636B2025346920282533692900526F6CBC |
:100530006C2025346920282533692900486F6368B9 |
:1005400020253469202825336929005370616E6E97 |
:10055000756E673A202025356900456D70662E500E |
:100560006567656C3A253569004B6F6D7061737313 |
:1005700020202020202020005269636874756E6757 |
:100580003A2020253569004D657373776572743A9A |
:1005900020202535690053746172743A2020202090 |
:1005A0002025356900506F7469313A202025336960 |
:1005B00000506F7469323A202025336900506F74FF |
:1005C00069333A202025336900506F7469343A202A |
:1005D0002025336900536572766F202000536574BF |
:1005E000706F696E742020253369005374656C6CDC |
:1005F000756E673A202533690052616E67653A254A |
:1006000033692D2533690045787465726E436F6ECA |
:1006100074726F6C2020004E693A25346920205294 |
:100620006F3A253469200047733A25346920204702 |
:10063000693A253469200048693A25346920204305 |
:10064000663A2534692000424C2D4374726C204573 |
:1006500072726F727320002025336420202533646A |
:100660002020253364202025336420002025336496 |
:100670002020253364202025336420202533642066 |
:100680000020253364202025336420202533642076 |
:10069000202533642000424C2D4374726C20666F19 |
:1006A000756E6420002025632020202563202020F3 |
:1006B000256320202025632000202563202020257D |
:1006C000632020202563202020256320002025632F |
:1006D0002020202D2020202D2020202D0031300012 |
:1006E0003131003132005069746368537465756547 |
:1006F00072756E6720004D6F6475733A202020205C |
:1007000025387300537469636B44656C74613A20D7 |
:10071000253369005374616E6467617320203A2049 |
:10072000253369000A0D506C6561736520636F6E37 |
:100730006E656374205370656B7472756D2072659D |
:1007400063656976657220666F722062696E64699E |
:100750006E67204E4F572E2E2E006F6B2E0A0D0007 |
:1007600054696D656F75742E0A0D000011241FBE4B |
:10077000CFEFD0E1DEBFCDBF13E0A0E0B1E0EEE20D |
:10078000FAEC02C005900D92A23FB107D9F719E02B |
:10079000A2EFB3E001C01D92AC3DB107E1F70C94AC |
:1007A00079040C9400000E94BF5A0E94935E0E943C |
:1007B000975F0895282FFB018150853008F023E0D2 |
:1007C000842F9927332721503040829FD001839F67 |
:1007D000B00D929FB00D1124AC59BF4F019724F07A |
:1007E0000E94F9640192FACF0895863038F085E0CE |
:1007F000A2E0B0E0082E0E94066508958823C1F7A4 |
:100800000895582F863048F155E0842F9927252FD9 |
:10081000332721503040829FD001839FB00D929F9B |
:10082000B00D1124AC59BF4FFB01019724F001908A |
:100830000E940665FACFA2E6B0E0042E0E9406658B |
:10084000A0E5B0E088E0FB01182E0E941265852F1C |
:100850000E94F5030E94BF5A08958823B1F60895B7 |
:10086000CF93A2E0B0E00E94F964802DC82F8150A0 |
:10087000853020F0C3E08C2F0E94F5038C2F992740 |
:10088000CF9108958091AB08E82FFF27EE0FFF1F4F |
:10089000E758F74F808191818D5E9F4F14F0109241 |
:1008A0000201808191818A5B9F4F24F48091020133 |
:1008B000882319F02091460715C081E0809302013A |
:1008C00020914607280F20934607253038F088EE00 |
:1008D00093E0909316048093150404C0822F0E9425 |
:1008E000932BE8CF822F99279093140880931308B5 |
:1008F0000895CFEFD0E1DEBFCDBF14B815B807EE35 |
:1009000013E00253104017FFFCCF08EE13E0189BD2 |
:100910006DC1199B76C12DE02093010181E887B953 |
:100920003E9A8FEF88B98BE184B981E085B98EE377 |
:100930008AB9579A87E48BB9469A84B7877F84BF70 |
:10094000809160008861809360001092600080ED6B |
:1009500097E09093160480931504109285041092EA |
:10096000840410927E0810927D08109287041092E1 |
:1009700086041092890410928804243108F43CC142 |
:1009800088E894E0A0E0B0E080938503909386032C |
:10099000A0938703B09388032A3009F462C12431FD |
:1009A00009F45FC1289A0E941D150E94ED140E944F |
:1009B0000E0E0E9446280E94F9180E94D5260E9419 |
:1009C000015778948EEC90E09F938F931F920E9432 |
:1009D00039110F900F900F9081E690E09F938F93C5 |
:1009E0008CE090E09F938F9381E090E09F938F93B2 |
:1009F000809101016AE00E948964892F99279F9361 |
:100A00008F93809101010E94896499279F938F930E |
:100A100084EF90E09F938F931F920E9439118091F1 |
:100A2000C8002DB73EB7235F3F4F0FB6F8943EBFC7 |
:100A30000FBE2DBF803209F40CC1809101018C30B2 |
:100A400008F0D8C0299A49E06BEA78E083E00E9478 |
:100A5000DA03C8EED3E0DE010E94F964802D813014 |
:100A600009F4D1C088E291E09F938F931F920E9476 |
:100A700039110F900F900F902BE935E0F9018FE0BD |
:100A8000158616861786108A8150349687FFF8CF10 |
:100A900080E48093A8058093A9051092AA0580930D |
:100AA000AB058093AC0590EC9093AD051092AE052C |
:100AB0008093AF058093B0051092B1059093B20575 |
:100AC0009093B3058093B4051092B5058093B60555 |
:100AD0009093B70581E080939B054CE955E08BE04E |
:100AE000E3E0F1E0DA0101900D928A95E1F78DE4FF |
:100AF000DE01F901182E0E94126580918403992766 |
:100B00009F938F935F934F9389E491E09F938F938B |
:100B10001F920E9439112DB73EB7295F3F4F0FB684 |
:100B2000F8943EBF0FBE2DBF8AE691E09F938F934E |
:100B30001F920E94391110925604109219040E94BB |
:100B400073390F900F900F90809119048823E1F36F |
:100B500010925604EE24FF24ECE7CE2EE1E0DE2EC8 |
:100B6000109219040E947339809119048823E1F3CB |
:100B7000F701E359F74F8081882309F074C0E7013A |
:100B800021967E012C9760F3EE24FF2470E8C72E97 |
:100B900071E0D72E22C0F701EE0FFF1FEE0FFF1FEF |
:100BA000E556FA4F85851816F4F4E7012196DF9390 |
:100BB000CF93DF92CF929F930E9439110F900F90A5 |
:100BC0000F900F900F9081E598E0E80EF91ED70185 |
:100BD0001C927E012C9708F055C0F701E359F74F9E |
:100BE00090819923C1F2E7012196EDCF199B2FC087 |
:100BF00024E192CE299827CF8BE095E0A0E0B0E0E9 |
:100C0000C3CE2BE089CEA1E0B0E00E94F964802D34 |
:100C10008F3F09F427CF109284032BE935E08DE450 |
:100C2000DE01F901182E0E94016590918403F901FB |
:100C30003D962FE08081349618160CF49F5F21506A |
:100C400027FFF8CF909384034CE955E056CF2AE074 |
:100C500063CE8091CA00863009F0EFCE0E94115C0D |
:100C6000ECCE2898A0CEE7012196DF93CF93DF92B8 |
:100C7000CF921F920E9439110F900F900F900F90FA |
:100C80000F907FCF8EE991E09F938F931F920E94E8 |
:100C900039110F900F900F90A1E0B0E00E94F9641D |
:100CA000802D8B3409F057C1A4E0B0E00E94F964B4 |
:100CB000802D853008F037C20E9430044DE56BEA84 |
:100CC00078E00E94DA030E94300499279F938F9363 |
:100CD00082E292E09F938F931F920E94391180913C |
:100CE000B3080F900F900F900F900F9080FDF7C1F9 |
:100CF0000E94CF36809101018A3009F4EEC184311F |
:100D000009F4EBC1289A80ED97E090931604809344 |
:100D1000150485E5809348078FE592E09F938F93B4 |
:100D20001F920E9439118091B3080F900F900F907D |
:100D300082FFF6C18BE692E09F938F931F920E94F1 |
:100D400039110F900F900F9089E892E09F938F9345 |
:100D50001F920E9439110E94D3030E94721E88E8DC |
:100D600093E19093A8038093A70381E080934707C2 |
:100D70000F900F900F9080911904882309F48EC072 |
:100D800080911803882309F489C010921904809176 |
:100D90004607882309F48AC00E9442040E947339DE |
:100DA000209101012A3009F48AC0243109F487C056 |
:100DB000289A80910E03882309F487C0815080937C |
:100DC0000E0380918A04882329F080918A0481503F |
:100DD00080938A0480916205882369F08150809312 |
:100DE0006205882341F41092600510925F0510920D |
:100DF0005E0510925D058091A7039091A80301976D |
:100E00009093A8038093A7038091A7039091A803D0 |
:100E1000892B29F080915504882309F465C08091BD |
:100E2000A7039091A803892B09F464C08091110352 |
:100E3000909112038F5F9F4F09F46CC08091190449 |
:100E4000882321F080918104882311F40E944A0EA6 |
:100E50000E94360BC8010E94BA148823E9F08091E1 |
:100E6000C408282F332780912603909127038217E7 |
:100E7000930744F480911103909112038F5F9F4F69 |
:100E800009F45CC00E949D5984E08093140484E1BD |
:100E900090E00E94B1148C010E94D65A80911404F3 |
:100EA000882309F068CF0E94E15965CF0E94953DE3 |
:100EB0000E947339209101012A3009F076CF2898D9 |
:100EC00080910E03882309F079CF80935207109206 |
:100ED0006A041092690410926804109267041092D8 |
:100EE0006604109265046DCF2A3031F1243121F16E |
:100EF000289AA4CF0E94EB2685E090E09093A80367 |
:100F00008093A70380911103909112038F5F9F4FED |
:100F100009F094CF80918104882309F48FCF80E178 |
:100F200097E2909316048093150480E890E09093E4 |
:100F300012038093110382CF289880CF80E797E136 |
:100F4000909316048093150480E093E0909312032D |
:100F50008093110397CF0E946C2984EC91E09F93BA |
:100F60008F931F920E94391151E0952E0F900F9090 |
:100F70000F90C0E5D0E07E010894E11CF11C42E036 |
:100F8000C42ED12CCC0EDD1E33E0A32EB12CAC0E22 |
:100F9000BD1E24E0622E712C6C0E7D1E95E0492E44 |
:100FA000512C4C0E5D1E86E0282E312C2C0E3D1E41 |
:100FB000E2E09E1609F48BC0F3E09F1609F48AC0A4 |
:100FC00023E0291508F483C080910101843168F081 |
:100FD00085E08093C3081092DB088BE18093BF0803 |
:100FE0008EE48093D8088093D908DE010E94F964CA |
:100FF000802D8C3008F068C0D7010E94F964802DE4 |
:101000008C3008F061C0D6010E94F964802D8C30CC |
:1010100008F05AC0D5010E94F964802D8C3008F088 |
:1010200053C0DE010E94F964802D8093AB08D70184 |
:101030000E94F964802D8093AC08D6010E94F96467 |
:10104000802D8093AD08D5010E94F964802D809396 |
:10105000AE08D3010E94F964802D8093AF08D201BD |
:101060000E94F964802D8093B008D1010E94F96438 |
:10107000802D8093B108A7E5B0E00E94F964802D2F |
:101080008093B20831E0931651F483ED91E09F9381 |
:101090008F931F920E9439110F900F900F904DE582 |
:1010A0006BEA78E0892D0E940104939495E09915EC |
:1010B00008F07ECF83E00E94F5038BE4A1E0B0E06E |
:1010C000082E0E940665F0CD0E945329E8CF0E94A9 |
:1010D0001C2A7ACF0E94CE2A77CF289814CE8AE392 |
:1010E00092E09F938F931F920E94391188EE93E0B4 |
:1010F0000E94B1148C010E94FF180F900F900F9066 |
:10110000C8010E94BA148823D9F38AE592E09F931C |
:101110008F931F920E9439110F900F900F90E8CD7E |
:1011200087E792E009CE8BE092E09F938F931F9226 |
:101130000E9439110F900F900F90BECD1F920F9209 |
:101140000FB60F9211248F939F93EF93FF9380918B |
:1011500010038823A9F48091050490910604019658 |
:10116000FC01E850FA4FE081ED3079F086399105C5 |
:1011700061F09093060480930504E093C6000EC0CE |
:10118000109206041092050409C0109206041092F1 |
:10119000050481E080931003E093C600FF91EF9176 |
:1011A0009F918F910F900FBE0F901F9018951F92D7 |
:1011B0000F920FB60F9211242F933F934F935F938B |
:1011C0008F939F93AF93BF93EF93FF9390E08091A2 |
:1011D000C6008093FD0350910B04563910F0909394 |
:1011E0000C048091FD038D3091F020910C04822F2E |
:1011F00099278130910509F46AC0823091050CF479 |
:101200008CC0029709F47DC010920C04A6C02091F6 |
:101210000C04223061F790930C04852F99278B5A88 |
:10122000984FFC01329740812091070430910804C7 |
:10123000241B3109DC0111978C91281B3109C9014C |
:101240009F7090930804809307040024880F991FCF |
:10125000001C880F991F001C892F902D982F935CDC |
:10126000909309042F733070235C20930A048081CB |
:10127000891709F46CC090E08091FA038F5F809326 |
:10128000FA038091FC03882309F067C0992309F4CD |
:1012900064C081E08093FC03580F5093F9035150D0 |
:1012A000E52FFF27EB5AF84F8DE080838091570799 |
:1012B000823509F052C088E190E02CE00FB6F89436 |
:1012C000A895809360000FBE2093600046C02F5FFA |
:1012D00020930C04E52FFF27EB5AF84F8091FD0374 |
:1012E00080835F5F50930B042091FD03809107047E |
:1012F00090910804820F911D909308048093070435 |
:101300002CC0E52FFF27EB5AF84F8091FD03808317 |
:10131000563938F310920C04E7CF892B09F074CFBB |
:101320008091FD03833259F08091FD03809355072E |
:1013300081E080930B048091FD039927DDCF80919C |
:10134000FC03882389F781E080930C04EDCF8C9116 |
:10135000821709F090CF91E094CFFF91EF91BF9168 |
:10136000AF919F918F915F914F913F912F910F90EE |
:101370000FBE0F901F901895AC01A0E0B0E09D014A |
:10138000A817B90748F4E8EFF5E08191280F311D5F |
:101390001196A417B507C8F33F70FD01E850FA4F46 |
:1013A000C9010024880F991F001C880F991F001C79 |
:1013B000892F902D835C80831196FD01E850FA4FB0 |
:1013C0002F733070822F835C8083A750BA4F8DE0DB |
:1013D0008C93109210038091F8058093C6000895B5 |
:1013E000BF92CF92DF92EF92FF920F931F93CF9312 |
:1013F000DF93CDB7DEB72C859D857E85BB2483E248 |
:101400008093F8059F599093F9052093FA0503E01E |
:1014100010E0772309F4ADC0CF84D88843E1E42EEF |
:10142000F12CEC0EFD1EA989BA897150109709F4B0 |
:10143000A0C0109709F43CC0F601EB0DF11DB39468 |
:101440009081119789F47723A1F1F70122E030E030 |
:10145000E20EF31ED701C080D180E20EF31E0D9084 |
:10146000BC91A02DBB247150109719F1F601EB0D22 |
:10147000F11DB3944081119709F466C01097D1F023 |
:10148000F601EB0DF11DB39460811197A1F4772360 |
:1014900091F0F7013296D701CD90DC9032E0E32E47 |
:1014A000F12CEE0EFF1EA081B181BB24715003C050 |
:1014B00090E040E060E0F801E850FA4F892F86950F |
:1014C0008695835C80830F5F1F4FF801E850FA4FC9 |
:1014D000892F99278370907082959295907F982795 |
:1014E000807F982755279A01329522952F702327C0 |
:1014F0003F702327822B835C80830F5F1F4FF8018F |
:10150000E850FA4F4F705070440F551F440F551F4D |
:10151000862F99270024880F991F001C880F991F78 |
:10152000001C892F902D842B835C80830F5F1F4FBD |
:10153000F801E850FA4F6F73635C60830F5F1F4FD1 |
:10154000109709F076CF15C0772309F4B3CFF701D0 |
:10155000A2E0B0E0EA0EFB1ED701C080D18022E0FD |
:1015600030E0E20EF31E0D90BC91A02DBB24715013 |
:1015700085CFC8010E94BC09DF91CF911F910F91C7 |
:10158000FF90EF90DF90CF90BF900895A3E07A2F67 |
:101590004091F903465009F45FC0E72FFF27EB5A4B |
:1015A000F84F80818D537F5FE72FFF27EB5AF84F6D |
:1015B00020812D537F5FE72FFF27EB5AF84F3081B3 |
:1015C0003D537F5FE72FFF27EB5AF84F60816D5344 |
:1015D0007F5F9927880F991F880F991F522F529567 |
:1015E0005F70582B822F99278F70907082959295FB |
:1015F000907F9827807F9827232F26952695282B44 |
:10160000832F99278370907000249695879507946F |
:10161000969587950794982F802D682B41504F3FC2 |
:10162000D9F0EA2FFF27EB5AF84F5083AF5F4150B4 |
:101630004F3F91F0EA2FFF27EB5AF84F2083AF5F1F |
:1016400041504F3F49F0EA2FFF27EB5AF84F608394 |
:10165000AF5F442309F0A1CF88E597E09093F803AA |
:101660008093F703A350A093F6030895CF93DF93DD |
:10167000CDB7DEB722970FB6F894DEBF0FBECDBF51 |
:101680008091FC03882309F4ACC20E94C60A8091B1 |
:101690005607823609F471C080915707992784361E |
:1016A000910509F457C08536910584F58136910579 |
:1016B00009F44EC1823691050CF4C2C08236910500 |
:1016C00009F49AC183369105C1F48091F203909197 |
:1016D000F303892B09F04CC2A091F703B091F803F2 |
:1016E0009C91992309F03AC29C918AE0989FC0018D |
:1016F00011249093F3038093F2031092FC03109251 |
:10170000F8031092F7031092F6036BC28C36910522 |
:1017100009F410C18D3691050CF0B3C087369105E0 |
:1017200009F42BC18836910541F78FEF80930E03A2 |
:10173000E091F703F091F803808190915004892B98 |
:1017400080935004882311F01092FE0381E080936F |
:101750000204D3CFE091F703F091F80390818AE07F |
:10176000989FC001112490930C0380930B03892B45 |
:1017700021F281E080930104C0CF8091570799271F |
:101780008037910509F4F2C0813791050CF485C0CA |
:101790008337910509F45BC1843791050CF03CC196 |
:1017A0008137910509F078CFA091F703B091F80344 |
:1017B0008C918F3F09F409C28C91882309F000C2F3 |
:1017C00081E08C93A091F703B091F8034DE56BEAAB |
:1017D00078E08C910E94DA03809110038823E1F372 |
:1017E000E091F703F091F803808189838BE48A8389 |
:1017F0008DE590E09F938F938BEA98E09F938F9372 |
:1018000021E030E03F932F93CE0102969F938F9378 |
:101810003F932F93CE01820F931F9F938F9383E06B |
:101820008F9381E08F9381E58F930E94F009ADB78C |
:10183000BEB71F960FB6F894BEBF0FBEADBF2CCF7C |
:101840008B34910509F059CFE091F703F091F8033B |
:101850008081918190939D0480939C0420919A04AF |
:1018600030919B04821B930B845E9D4F68E671E070 |
:101870000E94A964845B904090939904809398049B |
:101880003CCF8437910509F47CC08637910509F077 |
:1018900034CF81E08093000430CF8D36910529F15B |
:1018A0008E3691050CF093C08B34910509F0F4CE7F |
:1018B000A091F703B091F8038D919C9190939D04B2 |
:1018C00080939C0420919A0430919B04821B930B7B |
:1018D000845E9D4F68E671E00E94A964845B90403D |
:1018E0009093990480939804D7CE80911003882315 |
:1018F000E1F3A091F703B091F8039C91913009F4C2 |
:101900003CC1198281E090E09F938F93CE010196B4 |
:101910009F938F9381E08F938F938DE48F930E9499 |
:10192000F0098DB79EB707960FB6F8949EBF0FBE0D |
:101930008DBFB2CE8FEF80930E03E091F703F0914D |
:10194000F80380818093510481E080930304D5CE15 |
:10195000E091F703F091F803E081E03258F08FE175 |
:1019600080930F038FEF80930E03C7CE81E08093A7 |
:10197000FF0392CEE0930F03F5CF81E08093040440 |
:10198000BCCE8091F903853108F4D7C0E091F7030C |
:10199000F091F80380E1A0E3B7E001900D928A9501 |
:1019A000E1F7809110038823E1F31F9280910D03EA |
:1019B0008F9384E58F930E94F0098AEF8093F4035C |
:1019C0008FEF80930E030F900F900F9096CE8E3670 |
:1019D000910509F061CE809110038823E1F38DE435 |
:1019E00090E09F938F938BE995E09F938F9381E095 |
:1019F0008F938F938EE492CFA091F703B091F80369 |
:101A00008BE0E8E4F7E00D9001928A95E1F7809190 |
:101A1000510780932D08A6CF8437910509F03CCE5D |
:101A20008091F903853108F4B9C0A091F703B09112 |
:101A3000F80380E1E0E3F7E00D9001928A95E1F789 |
:101A400080EF8093F4038FEF80930E0325CE2091D7 |
:101A5000F7033091F803F90180818150853018F443 |
:101A600081818B34E9F01982809110038823E1F39E |
:101A700081E090E09F938F93CE0101969F938F9387 |
:101A800081E08F938F9383E58F930E94F009EDB7E8 |
:101A9000FEB737960FB6F894FEBF0FBEEDBFFCCD74 |
:101AA0006BEA78E08DE52E5F3F4FDB01F901982F5F |
:101AB00001900D929A95E1F722503040482FD901BC |
:101AC0008C910E9401048091D8089927AA27BB27EE |
:101AD000BC01CD0124EC39E040E050E00E946A6492 |
:101AE000DC01CB018093A1039093A203A093A303F5 |
:101AF000B093A4038091D9089927AA27BB27BC01DA |
:101B0000CD010E946A64DC01CB0180939D03909318 |
:101B10009E03A0939F03B093A003E091F703F0917D |
:101B2000F80380810E94F5030E94300489830E949B |
:101B3000D30389810E94932B97CFE091F703F09113 |
:101B4000F80380819181A281B381809330079093C3 |
:101B50003107A0933207B093330723CF8AE0989FD1 |
:101B6000C00111240E94B1149093F7058093F605EB |
:101B7000A091F703B091F803B7CD4BE955E08DE4A0 |
:101B8000FA01282F0D9001922A95E1F7A8EEB3E013 |
:101B9000FA01182E0E9412659983B4CEA091F70322 |
:101BA000B091F8038D919D910D90BC91A02D8093E3 |
:101BB000300790933107A0933207B093330740CF9B |
:101BC000863008F403CE85E0FCCD0E943004E0911D |
:101BD000F703F091F8038083A091F703B091F80325 |
:101BE000EBCD22960FB6F894DEBF0FBECDBFDF91CE |
:101BF000CF910895CF93C82F8A3029F08091C000EB |
:101C000085FFFCCF04C08DE00E94FA0DF7CFC09392 |
:101C1000C60080E090E0CF910895089588E1809318 |
:101C2000C1008091C00082608093C0008091C1009B |
:101C300080688093C1008091C10080648093C1005E |
:101C40008AE28093C40080910B0390910C030E9460 |
:101C5000B11490932507809324078CED90E00E94A7 |
:101C6000B1149093540780935307109226078AE487 |
:101C70008093270784E080932A078AE080932807CF |
:101C800081E0809329071092F8031092F7031092D5 |
:101C9000F6030895EF92FF920F931F938091100324 |
:101CA000882309F478C280910204882309F082C055 |
:101CB00080910304882329F080911003882309F080 |
:101CC0007FC180910004882329F08091100388232C |
:101CD00009F05BC180910404882329F080911003EE |
:101CE000882309F036C180915307909154070E94D0 |
:101CF000BA14882329F080911003882309F0C8C002 |
:101D000080910B0390910C03892B09F084C1809181 |
:101D10000104882329F080911003882309F00FC261 |
:101D20008091F2039091F303892B09F07EC12091F9 |
:101D30000F032F3F59F180E190E09F938F93822F03 |
:101D4000992782959295907F9827807F9827855F25 |
:101D50009E4F9F938F9381E090E09F938F938FE0AE |
:101D600093E09F938F9382E08F9381E08F9381E440 |
:101D70008F930E94F0098FEF80930F038DB79EB76A |
:101D80000B960FB6F8949EBF0FBE8DBF80912D08A5 |
:101D9000882329F080911003882309F05EC0809188 |
:101DA000FF03882309F4F7C180911003882309F405 |
:101DB000F2C139C080911003882309F479CF0E94C1 |
:101DC0007B1E84E190E09F938F939091FE0384E1CA |
:101DD000989FC0011124875D9C4F9F938F9381E052 |
:101DE00090E09F938F938EEF93E09F938F9382E089 |
:101DF0008F9381E08F9388E48F930E94F009809104 |
:101E0000FE038F5F2DB73EB7255F3F4F0FB6F894A7 |
:101E10003EBF0FBE2DBF843008F4B8C11092FE0340 |
:101E20001092020445CF86E190E09F938F9389E75B |
:101E300098E09F938F9381E08F938F9380E58F93AA |
:101E40000E94F0091092FF038DB79EB707960FB658 |
:101E5000F8949EBF0FBE8DBF9EC181E090E09F931E |
:101E60008F938DE298E09F938F9381E08F938F9370 |
:101E700082E48F930E94F00910922D082DB73EB78F |
:101E8000295F3F4F0FB6F8943EBF0FBE2DBF87CFDF |
:101E90008091BF089927880F991F880F991F7C018F |
:101EA0000027F7FC0095102F8091D6049091D7045D |
:101EB000A091D804B091D904BC01CD01A80197012B |
:101EC0000E94DE6430934107209340078091CE0446 |
:101ED0009091CF04A091D004B091D104BC01CD0168 |
:101EE000A80197010E94DE643093430720934207C4 |
:101EF0008091720480934407809171048093450718 |
:101F000088E090E09F938F9380E497E09F938F9376 |
:101F100081E08F9383E08F9387E78F930E94F0098E |
:101F2000809146072DB73EB7295F3F4F0FB6F89413 |
:101F30003EBF0FBE2DBF853018F086E08093460768 |
:101F400083E690E00E94B114909354078093530766 |
:101F5000D7CE8BE090E09F938F9388E497E09F9398 |
:101F60008F9381E08F9380910D038F9387E48F93FC |
:101F70000E94F009109204048DB79EB707960FB621 |
:101F8000F8949EBF0FBE8DBFAECE8AE090E09F93C7 |
:101F90008F9386E297E09F938F9381E08F938F9347 |
:101FA00086E58F930E94F009109200042DB73EB78A |
:101FB000295F3F4F0FB6F8943EBF0FBE2DBF8ACEAC |
:101FC0000E947B1E80E590E09F938F9389E293E0CF |
:101FD0009F938F9321E030E03F932F9388E293E02B |
:101FE0009F938F933F932F9381E594E09F938F93DB |
:101FF00083E08F9381E08F938CE48F930E94F009AC |
:10200000109203048DB79EB70F960FB6F8949EBF3B |
:102010000FBE8DBF56CE80912407909125070E9458 |
:10202000BA14882309F077CE72CE8091F60590918C |
:10203000F7050E94BA14882309F479CE8091100321 |
:10204000882309F474CE8091BF089927880F991FBF |
:10205000880F991F7C010027F7FC0095102F8091B5 |
:10206000D6049091D704A091D804B091D904BC01B2 |
:10207000CD01A80197010E94DE643093E905209309 |
:10208000E8058091CE049091CF04A091D004B09146 |
:10209000D104BC01CD01A80197010E94DE643093F8 |
:1020A000EB052093EA0520916F093091700940916A |
:1020B000710950917209DA01C90103E0880F991F73 |
:1020C000AA1FBB1F0A95D1F7820F931FA41FB51F2C |
:1020D000820F931FA41FB51F2091850330918603A3 |
:1020E0004091870350918803BC01CD010E94DE64BA |
:1020F0003093ED052093EC058EE090E09F938F9355 |
:1021000088EE95E09F938F9381E08F938F9383E484 |
:102110008F930E94F0098091F2039091F3030E9443 |
:10212000B1149093F7058093F6052DB73EB7295F5C |
:102130003F4F0FB6F8943EBF0FBE2DBFF8CD82E4DF |
:1021400090E09F938F938BEE97E09F938F9381E026 |
:102150008F938F9384E48F930E94F009109201046F |
:102160008DB79EB707960FB6F8949EBF0FBE8DBF72 |
:1021700080910B0390910C03009709F4D1CD0E943C |
:10218000B1149093250780932407CACD8093FE0352 |
:10219000109202048DCD1F910F91FF90EF90089542 |
:1021A000982F80912E08813031F0892F0E94FA0DEE |
:1021B000282F33270CC080915204E82FFF27E75DBA |
:1021C000FC4F90838F5F8093520421E030E0C9017F |
:1021D00008950F931F93CF93DF938C01EB01672B2F |
:1021E00071F0F80181918F010E94D010219739F090 |
:1021F000F80181918F010E94D010219791F7DF9112 |
:10220000CF911F910F9108950F931F93CF93DF9359 |
:102210008C01EB01672B81F0F8010F5F1F4F849158 |
:102220000E94D010219741F0F8010F5F1F4F849159 |
:102230000E94D010219781F7DF91CF911F910F91CC |
:102240000895CF93C82F181634F480E20E94D0105E |
:10225000C1501C16D4F3CF910895CF93C82F1816F0 |
:1022600034F480E30E94D010C1501C16D4F3CF91F7 |
:1022700008952F923F924F925F926F927F928F922A |
:102280009F92AF92BF92CF92DF92EF92FF920F9305 |
:102290001F93CF93DF93CDB7DEB7E0970FB6F894D7 |
:1022A000DEBF0FBECDBF26968FAD26972896EEAD2A |
:1022B000FFAD289788249924540180932E0848E480 |
:1022C000C42ED12CCC0EDD1E7F01C701F701149165 |
:1022D000112331F0153221F00894E11CF11CF6CFE6 |
:1022E000B701681B790B09F095C0112309F43DC2B1 |
:1022F0000894E11CF11C1FA63FA4232C0FEF39A664 |
:10230000F7010894E11CF11C14911537C9F1812FD4 |
:1023100080628837A9F1103209F440C0133209F401 |
:102320008DC01A3209F479C01D3209F476C01B320F |
:10233000C9F11E32C9F1103309F48AC0812F8153CB |
:10234000893008F07EC060E070E0CB01880F991FF3 |
:10235000880F991F880F991F860F971F680F791F85 |
:10236000610F711D60537040F7010894E11CF11C6E |
:102370001491812F80538A3040F3262E153739F679 |
:1023800030FE3DC0F60184E090E0C80ED91E80808A |
:102390009180A280B380103209F0C0CF89A5882334 |
:1023A00009F0AECF19A7ACCFF7010894E11CF11CDE |
:1023B00014911A3209F451C060E070E014C0CB01EE |
:1023C000880F991F880F991F880F991F860F971FD5 |
:1023D000680F791F610F711D60537040F7010894F9 |
:1023E000E11CF11C1491812F80538A3040F3EFEFF0 |
:1023F0006F3F7E0714F46FEF7FEF062F86CFF60155 |
:1024000082E090E0C80ED91E808191814C01AA24FF |
:10241000BB2481CF0E94041168CF1A3251F4F60117 |
:1024200082E090E0C80ED91E208022200CF068CFF8 |
:10243000219490E1392AEFED3E2262CF98E0392ACB |
:102440005FCF1836C9F01C36D1F481E0382A58CF56 |
:1024500034FC56CFF0E23F2A53CFF60182E090E001 |
:10246000C80ED91E608171819FEF6F3F790714F408 |
:102470006FEF7FEF062F44CF24E0322A41CF13368F |
:1024800009F44DC1143409F41FC1143609F41CC1F8 |
:10249000193609F419C11F3409F40FC11F3609F4A4 |
:1024A0000CC1103709F4F9C0133709F4B2C015355F |
:1024B00009F4ECC0153709F4E9C0183509F444C033 |
:1024C000183709F441C0112309F44FC1CE01019618 |
:1024D0009DA78CA7198381E0482E19A6632C772429 |
:1024E000042D5FA4541857FC2DC029A5222331F1D7 |
:1024F0000F5F050DC30180739070892B09F42FC104 |
:10250000222309F027C166FC1BC1C30180739070B0 |
:10251000809709F410C1852D0E942D11842D9927D3 |
:1025200087FD9095BC018CA59DA50E94E91064FED5 |
:10253000CCCE822D801B0E942111C7CE66FED9CF42 |
:102540000E5FD7CF5524D1CFE0E1EEA733FE07C011 |
:1025500081149104A104B10411F0F0E43F2A19A6FA |
:102560000FA707FD02C02FED3222CE0189969DA74D |
:102570008CA781149104A104B10419F49FA5992397 |
:1025800061F1EEA54E2E55246624772418AA8414F2 |
:102590009504A604B70410F0F1E0F8ABC501B4014E |
:1025A000A30192010E94BC64DC01CB01082F8A3098 |
:1025B000F0F4005DECA5FDA50293FDA7ECA7C50115 |
:1025C000B401A30192010E94BC6449015A01F8A917 |
:1025D000FF23E1F62EA5283079F0632C7724CE0175 |
:1025E0000196482EFCA54F1A28E2420E79CF095ACF |
:1025F000183501F70F7DDECF632C772463FEEFCF14 |
:10260000003369F380E3ECA5FDA58293FDA7ECA759 |
:10261000E6CFF60182E090E0C80ED91E0190F0816D |
:10262000E02DFDA7ECA7EF2B81F4FE013196FDA76D |
:10263000ECA788E289838EE6818385E78B838CE62D |
:102640008C838D8389E28E831F8207FD15C0802FC6 |
:10265000992787FD9095AC0160E070E08CA59DA561 |
:102660000E948363009731F0482EFCA54F1A041591 |
:102670000CF033CF402E31CFECA5FDA5019000200A |
:10268000E9F731974E2E2CA5421A27CF153511F4B4 |
:1026900081E0382A9AE09EA762CFF60182E090E0BE |
:1026A000C80ED91E808191814C01AA24BB2490E1DF |
:1026B0009EA7E0E43E2A18E752CF1F3411F4E1E070 |
:1026C0003E2AF8E0FEA74BCF143411F491E0392AEA |
:1026D00030FE18C0F60184E090E0C80ED91E80805C |
:1026E0009180A280B380B7FE0AC0B094A094909469 |
:1026F0008094811C911CA11CB11C8DE289A79AE0D9 |
:102700009EA72ECFF60182E090E0C80ED91E8081F0 |
:1027100091814C01AA2497FCA094BA2CE4CFFE012D |
:102720003196FDA7ECA7F60182E090E0C80ED91E15 |
:1027300080818983D0CE822D801B0E942D11EBCE0B |
:1027400080E38AA71BA762E070E0CE018A960E9410 |
:10275000E910DBCE61E070E0CE018996F8CF822DE2 |
:10276000801B0E94211129A5CBCEE0960FB6F894CC |
:10277000DEBF0FBECDBFDF91CF911F910F91FF90B4 |
:10278000EF90DF90CF90BF90AF909F908F907F9011 |
:102790006F905F904F903F902F9008951F920F92EF |
:1027A0000FB60F9211242F933F935F936F937F93F4 |
:1027B0008F939F93AF93BF93EF93FF9380911404F4 |
:1027C000882329F08091140481508093140480910F |
:1027D0001C0481508F3F09F493C080931C048091A6 |
:1027E000150490911604029700F1809115049091C0 |
:1027F0001604019790931604809315048091150494 |
:102800009091160420911103309112038223932397 |
:10281000892B89F0809101018A3009F48BC0479A95 |
:102820008091B30883FF8DC010C08FEF9FEF90930E |
:10283000120380931103809101018A3009F478C05A |
:1028400047988091B30883FF7CC086B19927FC012B |
:10285000E071F07084FF0AC0809117049091180411 |
:10286000019690931804809317046BC0809117040D |
:1028700090911804892B49F18091170490911804C4 |
:102880008A56914010F5809117049091180469E2DE |
:1028900070E00E9495648091170490911804860F4F |
:1028A000971F9093180480931704809117049091B8 |
:1028B00018040B9708F440C08091170490911804F5 |
:1028C0000A9790939D0480939C0480919C0490911E |
:1028D0009D0420919A0430919B04821B930B845E8B |
:1028E0009D4F68E671E00E94A964845B90409093DC |
:1028F000990480939804109218041092170421C030 |
:1029000089E080931C04809113038F5F8170809312 |
:102910001303882319F481E08093190480911A0429 |
:1029200090911B04019690931B0480931A0457CF37 |
:102930005A9887CF5A9A85CFF0939D04E0939C04D0 |
:10294000C4CFFF91EF91BF91AF919F918F917F91F4 |
:102950006F915F913F912F910F900FBE0F901F903D |
:10296000189520911A0430911B04280F391FC901B2 |
:102970000196089520911A0430911B04821B930B39 |
:10298000892F99278695807490700895CF93DF934F |
:102990000E94B114EC01CE010E94BA148823D9F32D |
:1029A000DF91CF9108951F93CF93DF930E94B114CD |
:1029B000EC011FEC08C080911803882321F090934C |
:1029C000180310937A00CE010E94BA14982F88231E |
:1029D00091F3DF91CF911F9108959FB7F894579A83 |
:1029E0005F983E9A469A8091B0008F708093B000B5 |
:1029F0008091B00083608093B0008091B1008B73B0 |
:102A00008093B1008091B1008B608093B1001092EF |
:102A1000B2008FEF8093B3008091B0008068809304 |
:102A2000B000809170008A7F809370008091700068 |
:102A30008260809370009FBF08958AE090E00E94BA |
:102A4000B114909324048093230482E085BD83EA2B |
:102A500084BD17BC88E788BD86E086BD80916E0086 |
:102A6000816080936E0008951F920F920FB60F92AF |
:102A700011242F933F934F935F936F937F938F9383 |
:102A80009F93AF93BF93CF93DF93EF93FF93809187 |
:102A900001018431C0F480911D04882309F446C0EB |
:102AA00020911E0430911F0441E02F37340708F4B1 |
:102AB0009CC08FEF8093B3002F5F304030931F0492 |
:102AC00020931E0483C380911D04882349F78091BD |
:102AD000B00086FFADC08091B0008F7B8093B000C6 |
:102AE000E0912204EE2309F0EEC08091D108282F56 |
:102AF00033278DED96E0289FA001299F500D389F28 |
:102B0000500D1124CA012091200430912104821B10 |
:102B1000930B90931F0480931E0410922104109233 |
:102B20002004469A81E080931D04BACF8091B000C2 |
:102B300086FFA7C08091B0008F7B8093B00089EAA8 |
:102B400093E090931F0480931E048091140390914E |
:102B500015039C01220F331F280F391F809190030A |
:102B60009927880F991F880F991F280F391F37FD44 |
:102B700048C2C901959587959595879590931503BA |
:102B8000809314039093100480930F048091F708AE |
:102B900080FFDCC08091CE08682F7727882799278F |
:102BA0002091D6043091D7044091D8045091D90493 |
:102BB00057FD0CC2C7E05595479537952795CA959F |
:102BC000D1F70E946A649B01AC0197FD22C2B6E076 |
:102BD0005595479537952795BA95D1F780910F046C |
:102BE00090911004820F931FDBC02F3F310569F0D5 |
:102BF00060F0A9014F5F50404F37510588F480E8DD |
:102C00008093B3002058304059CF80911E048093A8 |
:102C1000B30010921F0410921E0410921D04D6C21D |
:102C20008FEF8093B30050931F0440931E04CEC2D5 |
:102C30008091B00080648093B0008CEB90E0909322 |
:102C40001F0480931E0480912004909121048454D9 |
:102C50009F4F909321048093200480911304882334 |
:102C600029F080918A04853B08F0F9C090912204F4 |
:102C70009F5F8091D108891708F0EEC0109222045E |
:102C800051CF8091B00080648093B0008091D108D2 |
:102C9000282F33278DED96E0289FA001299F500D06 |
:102CA000389F500D1124CA01209120043091210435 |
:102CB000821B930B90931F0480931E049C0181E060 |
:102CC00080931D04F1CE89EA93E090931F048093D2 |
:102CD0001E048E2F99278130910509F4C2C00297F6 |
:102CE00009F49CC1FF27EE0FFF1FE758F74F8081C3 |
:102CF0009181880F991F20911E0430911F04820F2B |
:102D0000931F90931F0480931E0420911E04309102 |
:102D10001F0455E02D3D350708F464C18CED95E0A6 |
:102D200090931F0480931E049C012C5B30403093D1 |
:102D30001F0420931E048091200490912104820F8F |
:102D4000931F9093210480932004ECCE8091CE08B1 |
:102D5000682F7727882799272091D6043091D704A8 |
:102D60004091D8045091D90457FD2BC1A7E0559547 |
:102D7000479537952795AA95D1F70E946A649B01DC |
:102D8000AC0197FD41C1F6E05595479537952795DC |
:102D9000FA95D1F780910F0490911004821B930B48 |
:102DA0009093100480930F048091CF08282F33272D |
:102DB000220F331F220F331F80910F0490911004B4 |
:102DC000821793077CF08091D008282F3327220F99 |
:102DD000331F220F331F80910F0490911004281786 |
:102DE000390724F43093100420930F0420910F042A |
:102DF0003091100480911E0490911F04280F391FF8 |
:102E00002050324080910F049091100497FDF7C03C |
:102E100095958795959587959093100480930F04C9 |
:102E200080910F04909110049093160880931508D8 |
:102E300045E02D3D340708F4CEC08CED95E090932D |
:102E40001F0480931E0420911E0430911F043093B0 |
:102E500021042093200433CF9093220463CE46981C |
:102E600005CF80911403909115039C01220F331F0D |
:102E7000280F391F809190039927880F991F880F79 |
:102E8000991F280F391F37FD7BC1C901959587957B |
:102E90009595879590931503809314039093100450 |
:102EA00080930F048091E00880FF3CC12091D604FC |
:102EB0003091D7044091D8045091D9048091CE0428 |
:102EC0009091CF04A091D004B091D104281B390B6C |
:102ED0004A0B5B0B8091F70880FF2DC18091CE08D3 |
:102EE000682F772788279927EA01D90157FD5FC105 |
:102EF00027E0D595C795B795A7952A95D1F79D0158 |
:102F0000AE010E946A649B01AC0197FD4BC1F6E0E3 |
:102F10005595479537952795FA95D1F780910F04E8 |
:102F200090911004820F931F9093100480930F04CC |
:102F30008091CF08282F3327220F331F220F331FF2 |
:102F400080910F0490911004821793077CF0809178 |
:102F5000D008282F3327220F331F220F331F8091D1 |
:102F60000F04909110042817390724F430931004AB |
:102F700020930F0480910F049091100420911E045F |
:102F800030911F04820F931F8050924090931F0432 |
:102F900080931E0480910F049091100497FDEEC061 |
:102FA00095958795959587959093100480930F0438 |
:102FB00080910F0490911004909316088093150847 |
:102FC000A4CE21583F4F4F4F5F4FD0CE21583F4F97 |
:102FD0004F4F5F4FEFCD51E02737350758F487E764 |
:102FE00091E02DCF81E02737380708F09ECE87E7A4 |
:102FF00091E096CE30931F0420931E0424CF0396B5 |
:1030000007CF2D5F3F4FB5CD215C3F4F4F4F5F4FF7 |
:10301000BACE215C3F4F4F4F5F4FD9CD8091160301 |
:10302000909117039C01220F331F280F391F205C3A |
:103030003E4F37FDB4C0C901959587959595879505 |
:10304000909317038093160390930E0480930D04BE |
:103050006091CE047091CF048091D0049091D104FE |
:1030600097FD98C0F7E09595879577956795FA95C0 |
:10307000D1F728EC30E040E050E00E946A6497FD10 |
:1030800084C0272F382F492F552747FD5A95809107 |
:103090000D0490910E04820F931F90930E04809361 |
:1030A0000D048091CF08282F3327220F331F220FC2 |
:1030B000331F80910D0490910E04821793077CF0CA |
:1030C0008091D008282F3327220F331F220F331F60 |
:1030D00080910D0490910E042817390724F4309341 |
:1030E0000E0420930D0480910D0490910E04209104 |
:1030F0001E0430911F04820F931F805092409093C2 |
:103100001F0480931E0480910D0490910E0497FD7E |
:103110003AC0959587959595879590930E048093E1 |
:103120000D04F3CD2091D6043091D7044091D804FA |
:103130005091D904CFCE8091CE08682F7727882769 |
:10314000992757FD3EC0E7E0559547953795279558 |
:10315000EA95D1F70E946A649B01AC0197FD2CC0EF |
:1031600066E055954795379527956A95D1F78091F3 |
:103170000F0490911004821B930BD6CE039610CFB0 |
:103180002D5F3F4F82CE0396C4CF61507F4F8F4F4C |
:103190009F4F77CF61587F4F8F4F9F4F63CF2D5FEA |
:1031A0003F4F49CF215C3F4F4F4F5F4FB0CEA158AB |
:1031B000BF4FCF4FDF4F9CCE215C3F4F4F4F5F4FF4 |
:1031C000CFCF21583F4F4F4F5F4FBDCFFF91EF9172 |
:1031D000DF91CF91BF91AF919F918F917F916F912F |
:1031E0005F914F913F912F910F900FBE0F901F90C5 |
:1031F000189510927C008FEC80937A000895EF92DE |
:10320000FF920F931F93CF93DF9303E010E0D80159 |
:103210000E94F964802DC82FDD27C531D10508F043 |
:103220002A97C7BD10922C0484E690E00E94D31424 |
:1032300080911C0390911D038255934010F4C0E0CF |
:10324000D0E0CA3FD105E0F481EBE82E82E0F82E11 |
:10325000C7BD82E390E00E94D314FF92EF921F92C9 |
:103260000E94391180911C0390911D030F900F90C3 |
:103270000F908255934020F02196CA3FD10540F32C |
:10328000D8010C2E0E940665C0933C088CE291E0A8 |
:103290000E94D314DF91CF911F910F91FF90EF9077 |
:1032A0000895EF92FF920F931F93CF93DF9300E067 |
:1032B00000932704009326040093250480ED97E0F3 |
:1032C0000E94B114EC011CE821E0F22E95EFE92EEA |
:1032D000033009F4ABC000E08091380490913904C8 |
:1032E0008C5F93400CF091C080911B0381508093C0 |
:1032F0001B0380913604909137048C5F93400CF04F |
:1033000079C080911A03815080931A03809134040C |
:10331000909135048C5F93400CF04AC08091190362 |
:1033200081508093190388E0809358040E94DB2623 |
:1033300080911B038A3008F055C0F09227048AE080 |
:1033400080931B0380911A038A3008F043C0F092E7 |
:1033500026048AE080931A03809119038A3098F535 |
:10336000F09225048AE08093190380915804882301 |
:1033700079F0CE010E94BA148823B9F383EB92E06E |
:103380009F938F931F920E9439110F900F900F906F |
:10339000109237088FEC80937A0080913708882349 |
:1033A000E1F31A3008F447C0115009F091CF48C03A |
:1033B0008091340490913504875094408CF1809131 |
:1033C00019038F5FAECF863F80F2F0922504E09222 |
:1033D0001903CBCF863F08F4BFCFF0922604E092CA |
:1033E0001A03BACF863F08F4ADCFF0922704E092DB |
:1033F0001B03A8CF809136049091370487509440E6 |
:103400008CF080911A038F5F7FCF80913804909168 |
:1034100039048750944044F080911B038F5F67CF3D |
:103420000F5F81CF0F5F72CF01E063CF1B3008F4D5 |
:1034300052CF19E050CF8AE090E00E94D314B4CF6D |
:1034400086E490E00E94D314DF91CF911F910F91F9 |
:10345000FF90EF9008951F920F920FB60F921124D4 |
:10346000EF92FF920F931F932F933F934F935F938E |
:103470006F937F938F939F93AF93BF93CF93DF937C |
:10348000EF93FF9320914104822F9927AA27BB270E |
:103490002F5FFC01429740F4E25CFF4FEE0FFF1FED |
:1034A0000590F491E02D09941092410482E08093FC |
:1034B00040048091400480937C00809141048823E3 |
:1034C00009F4F9C38FEC80937A00F5C3209341048B |
:1034D00080917800909179002091460430914704C2 |
:1034E000820F931F909347048093460481E0DFCFBF |
:1034F00020934104809178009091790020914404B8 |
:1035000030914504820F931F9093450480934404A7 |
:1035100084E0CDCF20934104809178009091790090 |
:103520002091E4043091E504821B930B90933B08B7 |
:1035300080933A0880913A0890913B0890934F0409 |
:1035400080934E0482E0B3CF209341048091E20443 |
:103550009091E3042091780030917900821B930BC5 |
:103560009093300880932F0880912F089091300815 |
:1035700090934D0480934C0487E099CF20934104AD |
:103580008091780090917900909343048093420455 |
:1035900086E08DCF2093410420917800309179000E |
:1035A00030934504209344041092400482CF20932A |
:1035B00041042091780030917900309347042093A2 |
:1035C000460481E074CF1092410481E08093180397 |
:1035D0008091280490912904019690932904809366 |
:1035E0002804809178009091790020913F083091D3 |
:1035F0004008820F931F9093400880933F0880916A |
:1036000037088F5F8093370880913708853008F43A |
:103610004DCF80913F089091400897FD36C3959516 |
:1036200087959093400880933F088091780090910F |
:10363000790090931D0380931C03109237088091AA |
:103640002A0490912B04BC01660F771F6295729536 |
:10365000707F7627607F7627681B790B80919A03AD |
:10366000482F552780912C04282F332727FD30958C |
:103670008FEF90E0289F8001299F100D389F100D3B |
:1036800011248091330890913408800F911F20916C |
:103690003F0830914008821B930B20917F043091AA |
:1036A0008004821B930B489F9001499F300D589FC7 |
:1036B000300D1124620F731F77FDE4C27595679575 |
:1036C00075956795759567957595679575956795E2 |
:1036D00070932B0460932A0480913F0890914008D6 |
:1036E000EC01EE27D7FDE095FE2F20911E033091CF |
:1036F0001F034091200350912103DA01C90163E0C7 |
:10370000880F991FAA1FBB1F6A95D1F7821B930BC5 |
:10371000A40BB50BC80FD91FEA1FFB1FCE01DF0199 |
:103720000496A11DB11DB7FDA7C243E0B595A795AD |
:10373000979587954A95D1F780931E0390931F0321 |
:10374000A0932003B0932103809133089091340813 |
:10375000800F911F20911E0330911F034091200381 |
:1037600050912103821B930B9093800480937F04DC |
:1037700080913F089091400897FD7CC29595879570 |
:103780009093400880933F0882E091CE20934104BB |
:103790002091780030917900809144049091450403 |
:1037A000280F391F809101018A3009F44DC2220F80 |
:1037B000331F220F331F3093450420934404C90163 |
:1037C00037FD51C2959587959595879595958795E0 |
:1037D000909337048093360480914A0490914B046F |
:1037E000820F931F97FD44C29595879590934B0444 |
:1037F00080934A042091EC043091ED04821B930BDA |
:10380000909323038093220320913C0430913D0444 |
:103810008091220390912303280F391F37FD25C281 |
:103820003595279530933D0420933C0483E03FCEAB |
:1038300020934104209178003091790080914604D2 |
:1038400090914704280F391F809101018A3009F4B3 |
:10385000F8C1220F331F220F331F309347042093E8 |
:103860004604C90137FDFDC19595879595958795C6 |
:1038700095958795909339048093380480914804F6 |
:1038800090914904820F931F97FDE9C19595879503 |
:1038900090934904809348042091EE043091EF0402 |
:1038A000821B930B909325038093240320913E0465 |
:1038B00030913F048091240390912503280F391FF4 |
:1038C00037FDCAC13595279530933F0420933E04B8 |
:1038D00081E0EDCD209341048091780090917900B2 |
:1038E0002091E4043091E504821B930B90933B08F4 |
:1038F00080933A0880913A0890913B0820914E04B9 |
:1039000030914F04820F931F9093310480933004C1 |
:1039100082E0CDCD209341048091E2049091E304B4 |
:103920002091780030917900821B930B909330089E |
:1039300080932F0880912F089091300820914C049B |
:1039400030914D04820F931F90933304809332047F |
:1039500087E0ADCD20934104809101018A3009F4C4 |
:1039600062C1843109F493C180917800909179000B |
:103970002091420430914304820F931F90933504A9 |
:103980008093340486E093CD2093410480917800A5 |
:10399000909179002091440430914504820F931F47 |
:1039A00090934504809344041092400482CD209368 |
:1039B000410417CE209341048091780090917900C2 |
:1039C000AA2797FDA095BA2FBC01CD010E94F063F4 |
:1039D0007B018C018091DC049091DD04A091DE04D8 |
:1039E000B091DF049C01AD01C801B7010E94906352 |
:1039F000DC01CB01BC01CD010E94D363DC01CB0112 |
:103A000090932F0480932E0480912E0490912F0484 |
:103A100002970CF4BAC08091DC049091DD04A0916F |
:103A2000DE04B091DF0420E030E84BE354E4BC0155 |
:103A3000CD010E94FA638823DCF58091DC0490912B |
:103A4000DD04A091DE04B091DF042AE037ED43EA03 |
:103A50005CE3BC01CD010E949163DC01CB0180934A |
:103A6000DC049093DD04A093DE04B093DF04809126 |
:103A70005F0490916004845F9140D0F48091DC04F5 |
:103A80009091DD04A091DE04B091DF042DEC3CECBC |
:103A90004CEC5DE3BC01CD010E949163DC01CB01E4 |
:103AA0008093DC049093DD04A093DE04B093DF04E4 |
:103AB00081E080932D04809178009091790090931B |
:103AC00032088093310880912E0490912F04AA2708 |
:103AD00097FDA095BA2F20919E0430919F044091AC |
:103AE000A0045091A104820F931FA41FB51F8093BF |
:103AF0009E0490939F04A093A004B093A1042091EE |
:103B00009E0430919F044091A0045091A10457FD60 |
:103B10009EC07AE055954795379527957A95D1F7C8 |
:103B200080919E0490919F04A091A004B091A10463 |
:103B3000821B930BA40BB50B80939E0490939F0460 |
:103B4000A093A004B093A10483E0B1CC20934104DE |
:103B500080912603909127039C01220F331F280F89 |
:103B6000391F809178009091790063E070E00E94A5 |
:103B70009564260F371F36952795369527953093F0 |
:103B800027032093260385E092CC80912E04909108 |
:103B90002F048F5F9F4F0CF08BCF8091DC049091AE |
:103BA000DD04A091DE04B091DF0420E030E849E0BC |
:103BB00054E4BC01CD010E94FD6318160CF078CFCF |
:103BC0008091DC049091DD04A091DE04B091DF04CB |
:103BD0002AE037ED43EA5CE3BC01CD010E9490632B |
:103BE000DC01CB018093DC049093DD04A093DE0420 |
:103BF000B093DF0480915F0490916004845F9140F2 |
:103C000008F056CF8091DC049091DD04A091DE0491 |
:103C1000B091DF042DEC3CEC4CEC5DE3BC01CD013C |
:103C20000E9490633BCF8091780090917900209121 |
:103C3000420430914304820F931F01969695879515 |
:103C40009DCE220F331F09CE220F331FB4CD21503A |
:103C50003C4F4F4F5F4F5DCF2F5F3F4F33CE0196AD |
:103C600015CE079601CE0796ADCD2F5F3F4FD8CD2D |
:103C70000196BACD019682CDCE01DF010B96A11D32 |
:103C8000B11D53CD615E7F4F19CD0196C8CC809197 |
:103C90007800909179002091420430914304820F82 |
:103CA000931F2FEF37E0281B390B309335042093F7 |
:103CB000340486E0FCCBFF91EF91DF91CF91BF916F |
:103CC000AF919F918F917F916F915F914F913F91B4 |
:103CD0002F911F910F91FF90EF900F900FBE0F90BB |
:103CE0001F90189590E2E9E2F3E08FE49193815000 |
:103CF00087FFFCCF08951F938091510420912803E2 |
:103D0000281710F4209351049091500490FF08C09C |
:103D100080915104882309F4E2C0815080935104BA |
:103D200091FF08C080915104821709F4D7C18F5FB9 |
:103D300080935104892F992780FF02C081FDCCC058 |
:103D40000E94721E909151049A3008F0A2C081E145 |
:103D500080935204892F99279F938F938AEE92E044 |
:103D60009F938F9381E08F930E9439110F900F9052 |
:103D70000F900F900F9020915104822F9927873038 |
:103D8000910509F4AEC1883091050CF08CC08330E8 |
:103D9000910509F433C2843091050CF0A3C0813041 |
:103DA000910509F499C2823091050CF4FFC210927A |
:103DB00052048AEA93E09F938F9311E01F930E942D |
:103DC000391184E1809352040F900F900F908091ED |
:103DD000D6049091D704A091D804B091D904B7FD2E |
:103DE0001EC63AE0B595A795979587953A95D1F770 |
:103DF000BF93AF939F938F9384EB93E09F938F93A5 |
:103E00001F930E94391188E2809352048DB79EB7A8 |
:103E100007960FB6F8949EBF0FBE8DBF8091CE045B |
:103E20009091CF04A091D004B091D104B7FDF2C518 |
:103E30002AE0B595A795979587952A95D1F7BF93D1 |
:103E4000AF939F938F9383EC93E09F938F931F93F4 |
:103E50000E9439118CE3809352042DB73EB7295F3D |
:103E60003F4F0FB6F8943EBF0FBE2DBF80919C040C |
:103E700090919D049F938F9382ED93E09F938F93F6 |
:103E80001F930E9439110F900F900F900F900F9079 |
:103E900088C780E180935204892F99279F938F933D |
:103EA0008FEE92E05DCF8B30910509F43BC18C30F1 |
:103EB00091050CF4C9C08D30910509F41FC58D30F2 |
:103EC00091050CF42AC30E9709F4AEC52150209336 |
:103ED00028031092510465C71092510431CF2093EA |
:103EE00051041ECF8530910509F408C406970CF0E3 |
:103EF00091C3109252048091AC08E82FFF27EE0F77 |
:103F0000FF1FE758F74F808191819F938F93809196 |
:103F1000AB08E82FFF27EE0FFF1FE758F74F808110 |
:103F200091819F938F9381E294E09F938F9311E00F |
:103F30001F930E94391184E1809352048DB79EB77C |
:103F400007960FB6F8949EBF0FBE8DBF8091AE0846 |
:103F5000E82FFF27EE0FFF1FE758F74F8081918171 |
:103F60009F938F938091AD08E82FFF27EE0FFF1FDF |
:103F7000E758F74F808191819F938F9381E394E07D |
:103F80009F938F931F930E94391188E2809352046C |
:103F90002DB73EB7295F3F4F0FB6F8943EBF0FBE17 |
:103FA0002DBF8091B008E82FFF27EE0FFF1FE758C5 |
:103FB000F74F808191819F938F938091AF08E82F75 |
:103FC000FF27EE0FFF1FE758F74F808191819F93E6 |
:103FD0008F9381E494E09F938F931F930E943911F4 |
:103FE0008CE3809352046DB77EB7695F7F4F0FB645 |
:103FF000F8947EBF0FBE6DBF8091B208E82FFF27F7 |
:10400000EE0FFF1FE758F74F808191819F938F93A9 |
:104010008091B108E82FFF27EE0FFF1FE758F74FF9 |
:10402000808191819F938F9381E594E09F938F93FB |
:104030001F930E9439118DB79EB707960FB6F8945B |
:104040009EBF0FBE8DBFADC68930910509F40BC46C |
:104050000A970CF01CC21092520489E695E09F93D7 |
:104060008F9311E01F930E94391184E180935204D1 |
:104070000F900F900F9080919804909199049F93C6 |
:104080008F9388E795E09F938F931F930E94391138 |
:1040900088E2809352040F900F900F900F900F9032 |
:1040A00080919C0490919D049F938F9387E895E065 |
:1040B0009F938F931F930E9439118CE38093520436 |
:1040C0000F900F900F900F900F9080919A04909105 |
:1040D0009B049F938F9386E995E0D0CE1092510474 |
:1040E00029CE84E180935204809126039091270386 |
:1040F0009F938F938BE495E09F938F9311E01F9391 |
:104100000E94391188E2809352040F900F900F9013 |
:104110000F900F9080918A0499279F938F938AE53F |
:1041200095E0ACCE1092520487E096E09F938F9377 |
:1041300011E01F930E94391184E1809352040F9083 |
:104140000F900F9080914C07992787FD90959F9332 |
:104150008F9380914B07992787FD90959F938F931D |
:1041600087E196E09F938F931F930E94391188E215 |
:10417000809352048DB79EB707960FB6F8949EBFF2 |
:104180000FBE8DBF80914D07992787FD90959F9316 |
:104190008F9380914E0799279F938F9387E296E0A4 |
:1041A0009F938F931F930E9439118CE38093520445 |
:1041B0002DB73EB7295F3F4F0FB6F8943EBF0FBEF5 |
:1041C0002DBF8091520799279F938F9380914F071E |
:1041D000992787FD90959F938F9387E396E09F9310 |
:1041E0008F931F930E9439116DB77EB7695F7F4F20 |
:1041F0000FB6F8947EBF0FBE6DBFD3C510925204A8 |
:1042000080917D0890917E089F938F9380917B0889 |
:1042100090917C089F938F9381EE93E09F938F936F |
:1042200011E01F930E94391184E1809352046DB70D |
:104230007EB7695F7F4F0FB6F8947EBF0FBE6DBF2C |
:1042400080918108909182089F938F9380917F083D |
:10425000909180089F938F9381EF93E09F938F932A |
:104260001F930E94391188E2809352048DB79EB744 |
:1042700007960FB6F8949EBF0FBE8DBF809185083C |
:10428000909186089F938F938091830890918408E2 |
:104290009F938F9381E094E09F938F931F930E944D |
:1042A00039118CE3809352042DB73EB7295F3F4FFD |
:1042B0000FB6F8943EBF0FBE2DBF80918908909134 |
:1042C0008A089F938F9380918708909188089F9385 |
:1042D0008F9381E194E083CF8091B30880FD1CC06F |
:1042E00084E18093520485E993E09F938F9311E0DA |
:1042F0001F930E94391188E2809352040F900F900F |
:104300000F908CE993E09F938F931F930E94391134 |
:104310000F900F900F9045C51092520480917F042A |
:10432000909180049F938F9389E593E09F938F935F |
:1043300011E01F930E94391184E1809352040F9081 |
:104340000F900F900F900F9080917D0490917E04BC |
:104350009F938F9388E693E09F938F931F930E9480 |
:10436000391188E2809352040F900F900F900F90B4 |
:104370000F9080911C0390911D039F938F9387E76B |
:1043800093E09F938F931F930E9439118CE3809346 |
:1043900052040F900F900F900F900F9080913C0857 |
:1043A00099279F938F9386E893E068CD892B09F036 |
:1043B0008DCD1092520484EF92E09F938F9311E081 |
:1043C0001F930E94391184E1809352040F900F9043 |
:1043D0000F9081E690E09F938F938CE090E09F9305 |
:1043E0008F9381E090E09F938F93809101016AE029 |
:1043F0000E948964892F99279F938F93809101014F |
:104400000E94896499279F938F9384E093E09F9300 |
:104410008F931F930E94391188E2809352042DB725 |
:104420003EB7235F3F4F0FB6F8943EBF0FBE2DBF80 |
:104430008CE995E09F938F930E94300499279F9376 |
:104440008F9389E193E09F938F931F930E9439117B |
:104450008091A7039091A8036DB77EB7695F7F4FE6 |
:104460000FB6F8947EBF0FBE6DBF069708F471C4F7 |
:1044700090915504992309F466C48CE38093520407 |
:10448000892F99279F938F9384E393E0F7CC109221 |
:10449000520485ED95E09F938F9311E01F930E9446 |
:1044A000391184E1809352040F900F900F90809106 |
:1044B000900399279F938F938DED95E09F938F9312 |
:1044C0001F930E94391188E2809352040F900F903D |
:1044D0000F900F900F9080911104909112049F9370 |
:1044E0008F938BEE95E09F938F931F930E943911CA |
:1044F0008CE3809352040F900F900F900F900F90C9 |
:104500008091D00899279F938F938091CF08992706 |
:104510009F938F9389EF95E062CE1092520487E4C7 |
:1045200096E09F938F9311E01F930E94391184E1CD |
:10453000809352040F900F900F9080915408992708 |
:104540009F938F938091530899279F938F93809186 |
:10455000520899279F938F938091510899279F9391 |
:104560008F9387E596E09F938F931F930E94391155 |
:1045700088E2809352048DB79EB70B960FB6F894DD |
:104580009EBF0FBE8DBF8091580899279F938F9330 |
:104590008091570899279F938F9380915608992768 |
:1045A0009F938F938091550899279F938F938CE6C3 |
:1045B00096E09F938F931F930E9439118CE3809311 |
:1045C00052042DB73EB7255F3F4F0FB6F8943EBF5C |
:1045D0000FBE2DBF80915C0899279F938F93809188 |
:1045E0005B0899279F938F9380915A0899279F93EF |
:1045F0008F938091590899279F938F9381E896E034 |
:104600009F938F931F930E9439116DB77EB7655F9B |
:104610007F4FEECD1092520481E195E09F938F93EE |
:1046200011E01F930E94391184E1809352040F908E |
:104630000F900F908091E4049091E5049F938F93E5 |
:1046400080913004909131049F938F938EE195E097 |
:104650009F938F931F930E94391188E28093520495 |
:104660006DB77EB7695F7F4F0FB6F8947EBF0FBE00 |
:104670006DBF8091E2049091E3049F938F938091AA |
:104680003204909133049F938F938DE295E09F9332 |
:104690008F931F930E9439118CE3809352048DB73E |
:1046A0009EB707960FB6F8949EBF0FBE8DBF809140 |
:1046B000DC049091DD04A091DE04B091DF04BC0124 |
:1046C000CD010E94D363DC01CB019F938F93809136 |
:1046D0002409909125099F938F938CE395E09F93F4 |
:1046E0008F931F930E9439112DB73EB7295F3F4F1B |
:1046F0000FB6F8943EBF0FBE2DBF53C310925204A5 |
:1047000081E694E09F938F9311E01F930E943911EB |
:10471000809101010F900F900F908A3009F491C29F |
:104720008B3009F4CDC1843109F4CAC18D3009F050 |
:1047300038C384E18093520480911B0399279F938F |
:104740008F934091EE045091EF04CA0157FD22C3AC |
:104750009595879595958795959587959595879541 |
:104760009F938F939A0157FD12C3359527953595E1 |
:104770002795359527958091380490913904821BAF |
:10478000930B9F938F9385ED94E09F938F931F934B |
:104790000E94391188E2809352046DB77EB7675F3B |
:1047A0007F4F0FB6F8947EBF0FBE6DBF80911A0386 |
:1047B00099279F938F934091EC045091ED04CA0187 |
:1047C00057FDEDC295958795959587959595879514 |
:1047D000959587959F938F939A0157FDDDC23595E7 |
:1047E0002795359527953595279580913604909195 |
:1047F0003704821B930B9F938F9389EE94E09F93D2 |
:104800008F931F930E9439118CE3809352048DB7CC |
:104810009EB709960FB6F8949EBF0FBE8DBF8091CC |
:10482000190399279F938F932091EA043091EB0409 |
:10483000C90137FDAAC2959587959F938F93809163 |
:10484000340490913504281B390B3F932F938DEF3F |
:1048500094E09F938F931F930E9439112DB73EB719 |
:10486000275F3F4F45CF1092520480919104909161 |
:1048700092049F938F9385EA95E09F938F9311E025 |
:104880001F930E94391184E1809352040F900F907E |
:104890000F900F900F9080918F04909190049F93B0 |
:1048A0008F9381EB95E09F938F931F930E94391113 |
:1048B00088E2809352040F900F900F900F900F900A |
:1048C00080918D0490918E049F938F938DEB95E052 |
:1048D0009F938F931F930E9439118CE3809352040E |
:1048E0000F900F900F900F900F9080918B049091EC |
:1048F0008C049F938F9389EC95E0C0CA1092520468 |
:1049000086E996E09F938F9311E01F930E943911DF |
:1049100084E1809352040F900F900F908091700863 |
:1049200099278D969F938F9380916F0899278D96E5 |
:104930009F938F9380916E0899278D969F938F9365 |
:1049400080916D0899278D969F938F9385EA96E0C5 |
:104950009F938F931F930E94391188E28093520492 |
:104960008DB79EB70B960FB6F8949EBF0FBE8DBF46 |
:104970008091740899278D969F938F9380917308E7 |
:1049800099278D969F938F938091720899278D9682 |
:104990009F938F938091710899278D969F938F9302 |
:1049A00089EB96E09F938F931F930E9439118CE3BC |
:1049B000809352042DB73EB7255F3F4F0FB6F89452 |
:1049C0003EBF0FBE2DBF8091750899278D969F938E |
:1049D0008F938DEC96E09F938F931F930E943911D4 |
:1049E0000F900F900F900F900F9080917608882372 |
:1049F00009F019C180917708882309F006C18091D8 |
:104A00007808882309F4CDC188E48093520483EEAA |
:104A100096E079CC81509C4FAF4FBF4F09CA81506F |
:104A20009C4FAF4FBF4FDDC91092520486EE96E007 |
:104A30009F938F9311E01F930E94391184E180931B |
:104A400052040F900F900F9080918505E82FFF275B |
:104A5000EE0FFF1FE651FC4F808191819F938F9352 |
:104A600086EF96E09F938F931F930E9439110F90CA |
:104A70000F900F900F900F9080918505811709F08E |
:104A800090C188E2809352048091860599279F9374 |
:104A90008F9384E097E09F938F931F930E94391127 |
:104AA0008CE3809352040F900F900F900F900F9013 |
:104AB0008091870599279F938F9384E197E0DEC9C2 |
:104AC00084E1809352044091EE045091EF04CA01B6 |
:104AD00057FD51C19C0135952795359527953595FD |
:104AE000279535952795C90182959295907F9827AE |
:104AF000807F9827BA01681B790BCB0177FD39C1FC |
:104B0000959587959F938F933F932F939A0157FD88 |
:104B10002DC1359527953595279535952795809104 |
:104B2000380490913904821B930B9F938F9382EAF0 |
:104B300094E09F938F931F930E94391188E2809392 |
:104B400052048DB79EB709960FB6F8949EBF0FBE5C |
:104B50008DBF4091EC045091ED04CA0157FD04C192 |
:104B60009C0135952795359527953595279535954C |
:104B70002795C90182959295907F9827807F9827E5 |
:104B8000BA01681B790BCB0177FDECC09595879531 |
:104B90009F938F933F932F939A0157FDE0C03595D4 |
:104BA00027953595279535952795809136049091D1 |
:104BB0003704821B930B9F938F9384EB94E09F9316 |
:104BC0008F931F930E9439118CE3809352048DB709 |
:104BD0009EB709960FB6F8949EBF0FBE8DBF209169 |
:104BE000EA043091EB04C90137FDC7C0959587955C |
:104BF0009F938F938091340490913504281B390B37 |
:104C00003F932F9386EC94E06ACD84E48093520422 |
:104C100080EE96E09F938F931F930E9439110F901F |
:104C20000F900F90ECCE80E4809352048DED96E0CF |
:104C30009F938F931F930E9439110F900F900F90A5 |
:104C4000D9CE84E1809352044091EE045091EF0458 |
:104C50009A0157FD97C03595279535952795359538 |
:104C60002795C901880F991F880F991F880F991FD1 |
:104C7000481B590B5F934F933F932F9380913804B8 |
:104C800090913904821B930B9F938F938FE694E04E |
:104C90009F938F931F930E94391188E2809352044F |
:104CA0002DB73EB7275F3F4F0FB6F8943EBF0FBEFC |
:104CB0002DBF4091EC045091ED049A0157FD5FC067 |
:104CC000359527953595279535952795C901880FF1 |
:104CD000991F880F991F880F991F481B590B5F93C5 |
:104CE0004F933F932F938091360490913704821B0A |
:104CF000930B9F938F9381E894E09F938F931F93DF |
:104D00000E9439118CE3809352046DB77EB7675FC0 |
:104D10007F4F0FB6F8947EBF0FBE6DBF8091EA043F |
:104D20009091EB049F938F938091EA049091EB0410 |
:104D30002091340430913504821B930B9F938F9301 |
:104D400083E994E073C98CE38093520489E493E08F |
:104D5000DACA8CE38093520487E293E0D4CA295FD5 |
:104D60003F4F1DCF019612CF0F96FACE295F3F4FCE |
:104D7000D0CE0196C5CE0F96ADCE019637CF295F26 |
:104D80003F4F9ECF295F3F4F66CF019654CD295F9D |
:104D90003F4FEBCC0F96DCCC295F3F4F20CD0F96D9 |
:104DA00011CD109250041F9108951092B9008AE21B |
:104DB0008093B800089585EA8093BC00089584E943 |
:104DC0008093BC0008951092B9008093BB0085E8E1 |
:104DD0008093BC0008950E94DF26109258048091B1 |
:104DE000BB001092570480E88093BC001092BD0075 |
:104DF0001092BA001092BB001092B9001092B80045 |
:104E00000E94D5260E94DB2680E00E94E3260895BA |
:104E10008093BB0085E88093BC00089585EC809367 |
:104E2000BC00089585E88093BC0008951F920F92FE |
:104E30000FB60F9211242F933F934F935F936F936D |
:104E40007F938F939F93AF93BF93EF93FF93809143 |
:104E50005804282F3327442755278F5F8093580401 |
:104E6000F90127313105C8F4E05BFF4FEE0FFF1F5A |
:104E70000590F491E02D099480915604E82FFF27C6 |
:104E8000EF5BF74F9091BB0090838F5F8C3008F4FD |
:104E90009DC0109256040E94DF2610925804E0C074 |
:104EA00080E80E94E326DCC088E90E94E326D8C09F |
:104EB0000E94DF268AE090E09093A8038093A703E6 |
:104EC0000E94DB26CDC084E10E94E326C9C082E1B6 |
:104ED0000E94E326C5C080911B030E94E326C0C048 |
:104EE00080E10E94E326BCC080911A030E94E32661 |
:104EF000B7C0809119030E94E326B2C08091570485 |
:104F0000E82FFF27E65AF64F8F5F80935704808182 |
:104F10000E94E326A5C090915704292FE92FFF276F |
:104F2000EE0FFF1FEE0FFF1FE556FA4F858518168F |
:104F30000CF054C09C3009F467C0990F892F8E5A29 |
:104F40000E94E3268DC080915604E82FFF27E35A84 |
:104F5000F74F8091BB0080830E94122781C080910F |
:104F6000B900803409F46EC080915604E82FFF2701 |
:104F7000E359F74F10828F5F8C3068F1109256041E |
:104F80000E94DF26109258048091590480935504A2 |
:104F90001092590465C08091B900803309F440C073 |
:104FA0000E94DF268AE090E09093A8038093A703F5 |
:104FB000109258040E94DB2653C00E94DF268AE02C |
:104FC00090E09093A8038093A70367CF8093560443 |
:104FD0000E94DF2662CF80935604D2CF9C3008F027 |
:104FE000A9CF922F9F5FE92FFF27EE0FFF1FEE0F34 |
:104FF000FF1FE556FA4F858518161CF0292F9C30A7 |
:1050000080F39093570496CF1092570483E08093D7 |
:10501000580480915604880F8D5A0E94E32620C0C0 |
:10502000809159048823C9F49091570490935904AE |
:10503000E92FFF27E05BF74F80818F5F09F48FEF47 |
:105040008083AECF80915604E82FFF27E359F74FB6 |
:105050008C5F80830E940E2797CF90915704E8CFF2 |
:105060008091BC0080688093BC00FF91EF91BF915C |
:10507000AF919F918F917F916F915F914F913F91F0 |
:105080002F910F900FBE0F901F90189583EC809377 |
:10509000810080916F00806280936F001092EB041A |
:1050A0001092EA041092ED041092EC041092EF04B6 |
:1050B0001092EE0408951F920F920FB60F921124D2 |
:1050C000EF92FF920F931F932F933F934F935F9312 |
:1050D0006F937F938F939F93AF93BF93CF93DF9300 |
:1050E000EF93FF93209186003091870080915A04BE |
:1050F00090915B04281B390B80918600909187006A |
:1051000090935B0480935A04C9018D549440835F4B |
:105110009A4178F480915C0490915D04049714F0B6 |
:1051200010928303C1E0D0E0D0935D04C0935C048F |
:10513000A3C0C0915C04D0915D04CA30D1050CF0CD |
:105140009BC0C9018B5F9040845B9140A8F0FE0139 |
:105150003196F0935D04E0935C04E530F10509F4C9 |
:105160006DC05D98E630F10509F466C05C9837972C |
:1051700009F460C05B9880C0225D3140FE01EC0FF5 |
:10518000FD1FE758F74F80819181F901E81BF90B6A |
:10519000CF01F7FD6DC0069754F480918A04883CD6 |
:1051A00008F05FC080918A04865F80938A04FE01C4 |
:1051B000EC0FFD1FE758F74F80819181AC01440F40 |
:1051C000551F480F591F420F531F57FD4EC07A01FC |
:1051D000F594E794F594E794C90101968E159F051F |
:1051E000BCF50894E108F10880918A04833C40F101 |
:1051F0008E010C0F1D1FF801E758F74F8081918138 |
:105200009701281B390BC90163E070E00E94A96473 |
:10521000CB01880F991F860F971F0157174FF80171 |
:1052200091838083FE01EC0FFD1FE758F74FF18259 |
:10523000E0828DCF5B9A20C05C9A99CF5D9A92CF25 |
:10524000FE01EC0FFD1FE157F74F11821082EACFEC |
:1052500021503040E216F3063CF60894E11CF11CA4 |
:10526000C3CF88EC80938A04A2CF4D5F5F4FAFCF4E |
:10527000909581959F4F8FCFFF91EF91DF91CF91C7 |
:10528000BF91AF919F918F917F916F915F914F915E |
:105290003F912F911F910F91FF90EF900F900FBEB4 |
:1052A0000F901F90189581E08093AB0882E0809367 |
:1052B000AC0883E08093AD0884E08093AE0885E07D |
:1052C0008093AF0886E08093B00887E08093B108B0 |
:1052D00088E08093B20808951F9388E68093B3080E |
:1052E0003EE13093B4088BEF8093B6088AE0809358 |
:1052F000B7083093B5083093B908E4E0E093B808F4 |
:105300005FE05093BA083093BB081CE01093BC08D0 |
:1053100078E07093BD0886EE8093BE083093BF0896 |
:1053200080E88093C00880E58093C10826E9209337 |
:10533000C20883E08093C3088EE58093C40883E2AB |
:105340008093C5083093C6081092C70860E2609346 |
:10535000C8081092C9081092CA081092CB0810927F |
:10536000CC081092DD081092DE081092DF0810922F |
:10537000E00844E64093CD0888E28093CE0810927E |
:10538000F70892E39093CF082093D00885E08093AC |
:10539000D1089093D2082AE52093D3089093D4089B |
:1053A0001092F6082093D50883E48093D6081092D3 |
:1053B000D70885E58093D8088093D90880E1809349 |
:1053C000DA086093DB084093DC088FE58093E108FE |
:1053D00083EF8093E3085093E2085093E4088DEF45 |
:1053E0008093E5084093E6082093E7082093E808B7 |
:1053F0002093E9088BE48093EA088093EB0880937C |
:10540000EC081092ED0886E08093EE087093EF08A8 |
:105410002093F0083093F1084093F2084093F3088A |
:10542000E093F408A9EAB3E0ECEFF8E00D90019204 |
:105430001A95E1F71F9108951F9388E68093B308AA |
:105440005EE15093B4088BEF8093B6088AE08093B6 |
:10545000B7085093B5085093B90893E09093B808F3 |
:105460001CE01093BA0880E18093BB0876E070934B |
:10547000BC0868E06093BD0886EE8093BE08509338 |
:10548000BF0880E88093C00880E58093C10888E762 |
:105490008093C2089093C3088EE58093C40883E28A |
:1054A0008093C5085093C6081092C70830E2309325 |
:1054B000C8081092C9081092CA081092CB0810921E |
:1054C000CC081092DD081092DE081092DF081092CE |
:1054D000E00844E64093CD0888E28093CE0810921D |
:1054E000F70892E39093CF0886E98093D00885E08F |
:1054F0008093D1089093D2082AE52093D308909303 |
:10550000D4081092F6082093D50883E48093D60837 |
:105510008CE38093D70885E58093D8088093D908D9 |
:105520003093DA083093DB089BE49093DC088FE536 |
:105530008093E10883EF8093E30884E18093E2089D |
:105540008093E4088DEF8093E5084093E60820936C |
:10555000E7082093E8082093E9089093EA089093DD |
:10556000EB089093EC081092ED087093EE086093AE |
:10557000EF082093F0085093F1084093F20840930D |
:10558000F30884E08093F408A0EBB3E0ECEFF8E0DC |
:105590000D9001921A95E1F71F91089588EE80937E |
:1055A000B3083EE13093B4088BEF8093B6088AE0ED |
:1055B0008093B7083093B5083093B90893E090937F |
:1055C000B80858E05093BA0820E12093BB0866E081 |
:1055D0006093BC085093BD0886EE8093BE0830935C |
:1055E000BF0880E88093C00844E64093C10888E77C |
:1055F0008093C2089093C3088EE58093C40883E229 |
:105600008093C50884E18093C6081092C708209350 |
:10561000C8081092C9081092CA081092CB081092BC |
:10562000CC081092DD081092DE081092DF0810926C |
:10563000E0084093CD0888E28093CE081092F708E6 |
:1056400092E39093CF0886E98093D00885E0809319 |
:10565000D1089093D2082AE52093D3089093D408D8 |
:105660001092F6082093D50883E48093D60886E448 |
:105670008093D70885E58093D8088093D90880E285 |
:105680008093DA088093DB089093DC088FE58093A1 |
:10569000E10883EF8093E3083093E2083093E40855 |
:1056A0008DEF8093E5084093E6082093E708209368 |
:1056B000E8082093E9088BE48093EA088093EB08DC |
:1056C0008093EC081092ED086093EE085093EF0879 |
:1056D0002093F0083093F1084093F2084093F308C8 |
:1056E00084E08093F4088CE0A8EBB3E0ECEFF8E002 |
:1056F0000D9001928A95E1F708956817790744F4AF |
:10570000680F791F77FD09C0CB019595879508959E |
:10571000681B790B861B970B08956F5F7F4FCB013A |
:105720009595879508950F931F93CF93C82FC150D8 |
:10573000CF3F81F004E610E080918104882351F48A |
:1057400010931604009315048AEF90E00E94C6148B |
:10575000C15090F7CF911F910F9108952F923F92D2 |
:105760004F925F926F927F928F929F92AF92BF9271 |
:10577000CF92DF92EF92FF920F931F93CF93DF931D |
:10578000CDB7DEB7ED970FB6F894DEBF0FBECDBF35 |
:105790002091EA043091EB04809134049091350417 |
:1057A000281B390B3A8729873093690920936809A8 |
:1057B00020913E0430913F0437FDD4C7359527959D |
:1057C00035952795359527953AA729A73C872B87A7 |
:1057D000790120913C0430913D0437FDC0C73595D7 |
:1057E000279535952795359527953CA72BA73E8777 |
:1057F0002D87F0922709E092260930931D09209306 |
:105800001C098091570990915809AA2797FDA095E6 |
:10581000BA2F7C018D01EE0CFF1C001F111FE80E3A |
:10582000F91E0A1F1B1F80913004909131049C01C6 |
:10583000442737FD4095542FDA01C901880F991F7D |
:10584000AA1FBB1F880F991FAA1FBB1F820F931F80 |
:10585000A41FB51F820F931FA41FB51FE80EF91ECA |
:105860000A1F1B1F17FD9CC715950795F794E79412 |
:1058700015950795F794E794F0925809E092570927 |
:105880008091730990917409AA2797FDA095BA2F6A |
:105890007C018D01EE0CFF1C001F111FE80EF91E8C |
:1058A0000A1F1B1F80913204909133049C014427EE |
:1058B00037FD4095542FDA01C901880F991FAA1F9F |
:1058C000BB1F880F991FAA1FBB1F820F931FA41F06 |
:1058D000B51F820F931FA41FB51FE80EF91E0A1FE4 |
:1058E0001B1F17FD54C715950795F794E794159559 |
:1058F0000795F794E794F0927409E0927309809108 |
:10590000240990912509AA2797FDA095BA2F9C01FB |
:10591000AD01220F331F441F551F280F391F4A1F87 |
:105920005B1F80912E0490912F04AA2797FDA095CC |
:10593000BA2F280F391F4A1F5B1F57FD16C75595F1 |
:1059400047953795279555954795379527953093E2 |
:105950002509209324092091300430913104C90194 |
:10596000880F991F880F991F820F931F820F931F13 |
:10597000AA2797FDA095BA2F2091C6043091C7049D |
:105980004091C8045091C904820F931FA41FB51FF2 |
:105990008093C6049093C704A093C804B093C9042D |
:1059A0002091320430913304C901880F991F880F68 |
:1059B000991F820F931F820F931FAA2797FDA0950F |
:1059C000BA2F2091C2043091C3044091C404509175 |
:1059D000C504820F931FA41FB51F8093C204909328 |
:1059E000C304A093C404B093C5048091310990917D |
:1059F00032092091300430913104820F931F90932B |
:105A000032098093310980916B0990916C09209142 |
:105A1000320430913304820F931F90936C0980936A |
:105A20006B098091E0049091E10401969093E10468 |
:105A30008093E0048091BE049091BF04A091C004C3 |
:105A4000B091C104BC01CD010E94F0635B016C0107 |
:105A50008091310890913208AA2797FDA095BA2F1E |
:105A6000BC01CD010E94F0637B018C018091DC04BC |
:105A70009091DD04A091DE04B091DF049C01AD01A2 |
:105A8000C801B7010E949063DC01CB019C01AD010C |
:105A9000C601B5010E949163DC01CB01BC01CD01BF |
:105AA0000E94D363DC01CB018093BE049093BF04BA |
:105AB000A093C004B093C1048FEC80937A0010923D |
:105AC00018032090AE043090AF044090B004509082 |
:105AD000B10439E423163BE6330631E0430630E0F7 |
:105AE00053060CF414C188E49BE6A1E0B0E08D837A |
:105AF0009E83AF83B8876090B6047090B70480909F |
:105B0000B8049090B90439E463163BE6730631E0BB |
:105B1000830630E093060CF4DCC488E49BE6A1E045 |
:105B2000B0E089839A83AB83BC8349855A85CA01D7 |
:105B3000AA2797FDA095BA2F2091A6043091A7041B |
:105B40004091A8045091A904280F391F4A1F5B1FD8 |
:105B50002DA33EA34FA358A7A0906F09B090700942 |
:105B6000C0907109D0907209A80EB91ECA1EDB1E22 |
:105B700086017501309178043BA3332309F0DAC024 |
:105B800080917704882309F0C2C44091B3084CA3E4 |
:105B900046FF13C6EBA5FCA5CF01AA2797FDA0954C |
:105BA000BA2FBC01CD0129813A814B815C810E94D1 |
:105BB0006A649B01AC0197FD2CC7BBE055954795E6 |
:105BC00037952795BA95D1F780918D03E82EFF245C |
:105BD00000271127C801B7010E946A6497FD14C706 |
:105BE000ACE09595879577956795AA95D1F76F87DE |
:105BF000788B898B9A8B6093F8047093F904809367 |
:105C0000FA049093FB0429A53AA5C901AA2797FD98 |
:105C1000A095BA2FBC01CD012D813E814F815885C1 |
:105C20000E946A649B01AC0197FD01C7FBE055959A |
:105C3000479537952795FA95D1F7C801B7010E9486 |
:105C40006A6497FDEFC6DC01CB01ECE0B595A79542 |
:105C500097958795EA95D1F78093FC049093FD047E |
:105C6000A093FE04B093FF042091F8043091F9044E |
:105C70003093A6082093A5082091FC043091FD04E0 |
:105C80003093AA082093A9082F85388949895A8911 |
:105C9000821B930BA40BB50B8AAF9BAFACAFBDAF10 |
:105CA0008093FC049093FD04A093FE04B093FF0442 |
:105CB000A80EB91ECA1EDB1E8601750130918C0329 |
:105CC0003DA7332309F0A3C58EA79FA7A8ABB9AB07 |
:105CD000B7FD61C62EA53FA548A959A95595479579 |
:105CE000379527958DA19EA1AFA1B8A5821B930BD7 |
:105CF000A40BB50B8DA39EA3AFA3B8A78093A60456 |
:105D00009093A704A093A804B093A9048CC598EB22 |
:105D1000291694E939069EEF49069FEF59060CF0C3 |
:105D2000F1C328EB34E94EEF5FEF2D833E834F83C1 |
:105D30005887E1CE2DA13EA14FA158A52093A604DE |
:105D40003093A7044093A8045093A9043091B3085A |
:105D50003CA31092AA081092A9081092A6081092CB |
:105D6000A5081092F4041092F5041092F604109213 |
:105D7000F7041092F0041092F1041092F2041092C1 |
:105D8000F30430918C033DA78091F4049091F504C5 |
:105D9000A091F604B091F704BC01CD0124E630E0F7 |
:105DA00040E050E00E94DE64DA01C9014091F00455 |
:105DB0005091F104481B590B58A34F8F8091F00468 |
:105DC0009091F104A091F204B091F304BC01CD01D3 |
:105DD00024E630E040E050E00E94DE64DA01C901D0 |
:105DE0002091F4043091F504821B930B9AA389A3AC |
:105DF0008091850390918603A0918703B0918803D9 |
:105E0000BC01CD0128E631E040E050E00E946A6428 |
:105E1000E616F7060807190744F057016801A61AA5 |
:105E2000B70AC80AD90A8601750117FDA3C4A09252 |
:105E30006F09B0927009C0927109D09272092BA5B6 |
:105E40003CA58F8D98A1280F391F79010027F7FCF9 |
:105E50000095102F8091AA049091AB04A091AC04FE |
:105E6000B091AD04E80EF91E0A1F1B1F570168010F |
:105E700080917B0490917C04281B390BC901AA27CF |
:105E800097FDA095BA2F280E391E4A1E5B1E209141 |
:105E90009D0330919E0340919F035091A0032215D2 |
:105EA00033054405550574F4A8EAEA2EA1E6FA2E56 |
:105EB000012D112DE21AF30A040B150B170128010D |
:105EC0005701680188279927DC01821B930BA40BDB |
:105ED000B50B281639064A065B060CF0E9C2F8E550 |
:105EE0002F2EFEE93F2EFFEF4F2EFFEF5F2E220EEB |
:105EF000331E441E551E2092AE043092AF044092D1 |
:105F0000B0045092B104820171012092AA0430922F |
:105F1000AB044092AC045092AD0429A53AA5A9A1C6 |
:105F2000BAA12A0F3B1FA901662757FD6095762F5E |
:105F30008091B2049091B304A091B404B091B504DF |
:105F4000480F591F6A1F7B1F5A016B01809179040A |
:105F500090917A04281B390BC901AA2797FDA095B7 |
:105F6000BA2F680E791E8A1E9B1E8091A103909104 |
:105F7000A203A091A303B091A4038EAB9FABA8AFE3 |
:105F8000B9AF86159705A805B90564F448EA51E646 |
:105F900060E070E0481B590B6A0B7B0B3A014B0128 |
:105FA0005A016B018EA99FA9A8ADB9ADB095A09576 |
:105FB000909581959F4FAF4FBF4F681679068A061F |
:105FC0009B060CF064C2E8E56E2EEEE97E2EEFEF44 |
:105FD0008E2EEFEF9E2E2EA93FA948AD59AD620E31 |
:105FE000731E841E951E6092B6047092B704809250 |
:105FF000B8049092B904B401A3016092B204709203 |
:10600000B3048092B4049092B5048DA19EA1AFA177 |
:10601000B8A58093BA049093BB04A093BC04B0933A |
:10602000BD046092D6047092D7048092D8049092F6 |
:10603000D9042092CE043092CF044092D0045092E2 |
:10604000D1044093D2045093D3046093D40470934A |
:10605000D504E092CA04F092CB040093CC041093D0 |
:10606000CD04809124039091250397FDA4C37C0166 |
:10607000F594E794F594E794F594E794FAA6E9A6E5 |
:10608000809122039091230397FD93C38C01159572 |
:10609000079515950795159507951CA70BA7809152 |
:1060A0003804909139040F9734F458E1E52E5CEFF1 |
:1060B000F52EFAA6E9A68091380490913904079745 |
:1060C00034F440E3E42E48EFF42EFAA6E9A620913A |
:1060D00001012A3009F46BC280913804909139048F |
:1060E000815D97400CF007C280913804909139048B |
:1060F000805E974034F080EDE82E87E0F82EFAA617 |
:10610000E9A680913604909137040F9724F408E1B2 |
:106110001CEF1CA70BA780913604909137040797BA |
:1061200024F400E318EF1CA70BA72A3009F455C28A |
:106130008091360490913704815D974024F008EEF9 |
:1061400013E01CA70BA78091360490913704805E62 |
:10615000974024F000ED17E01CA70BA7A091950332 |
:10616000AA2309F497C060912403709125038091BC |
:10617000000590910105681B790B20912403309153 |
:106180002503280F391F37FD3FC3359527953093D9 |
:10619000010520930005613871050CF43AC260E8EE |
:1061A00070E070930705609306058A2F9927869FF4 |
:1061B000F001879FF00D969FF00D1124CF01F7FDA0 |
:1061C00021C37C01F594E794F594E794F594E79462 |
:1061D000F594E79429A53AA5E20EF31EFAA6E9A6DE |
:1061E0004091220350912303809102059091030571 |
:1061F000481B590B2091220330912303280F391F8C |
:1062000037FDFDC235952795309303052093020590 |
:10621000413851050CF4F5C140E850E050930505B4 |
:10622000409304058A2F9927849FD001859FB00D44 |
:10623000949FB00D1124AD019D01B7FDDDC2890110 |
:106240001595079515950795159507951595079536 |
:10625000EBA5FCA50E0F1F1F1CA70BA7869F900187 |
:10626000879F300D969F300D1124C9012091240382 |
:1062700030912503820F931F90932503809324036D |
:106280008091220390912303480F591F50932303B9 |
:10629000409322034D855E85141615060CF0C1C18E |
:1062A0008091A5089091A60897FDA2C2AA2797FD04 |
:1062B000A095BA2F6DA5262F332744275527BC015B |
:1062C000CD010E946A6497FD8EC2E6E095958795A0 |
:1062D00077956795EA95D1F7AF8DB8A1A60FB71F4F |
:1062E000B0931809A09317094B855C851416150601 |
:1062F0000CF0C1C18091A9089091AA0897FD6FC2C6 |
:10630000AA2797FDA095BA2F6DA5262F33274427DE |
:106310005527BC01CD010E946A6497FD5BC246E02F |
:1063200095958795779567954A95D1F7A9A1BAA1D3 |
:10633000A60FB71FB0930D09A0930C093CA137FD20 |
:10634000C1C110930B0900930A09F0921A09E09257 |
:1063500019098091AF08E82FFF27EE0FFF1FE758BC |
:10636000F74F8081918182599F4FA0919104B09104 |
:106370009204A817B9070CF0EEC0CD0101969093D6 |
:10638000920480939104DC018091B008E82FFF27EC |
:10639000EE0FFF1FE758F74F8081918182599F4F81 |
:1063A00060918F0470919004681779070CF0C4C055 |
:1063B000CB0101969093900480938F04BC0180914F |
:1063C000B108E82FFF27EE0FFF1FE758F74F808136 |
:1063D000918182599F4F40918D0450918E044817AE |
:1063E00059070CF0D5C0CA01019690938E04809392 |
:1063F0008D04AC018091B208E82FFF27EE0FFF1F3C |
:10640000E758F74F8081918182599F4F20918B04EB |
:1064100030918C04281739070CF0ABC0C9010196E4 |
:1064200090938C0480938B049C01B7FD93C1AF3F84 |
:10643000B10539F034F08FEF90E09093920480939F |
:10644000910477FD76C16F3F710539F034F08FEF1D |
:1064500090E09093900480938F0457FD70C14F3F5C |
:10646000510539F034F08FEF90E090938E048093D3 |
:106470008D0437FD6AC12F3F310509F00CF4EEC2DF |
:106480008FEF90E090938C0480938B04E7C260922E |
:10649000B6047092B7048092B8049092B904A092A6 |
:1064A000B204B092B304C092B404D092B504ADCD9E |
:1064B0002092AE043092AF044092B0045092B104E6 |
:1064C000A092AA04B092AB04C092AC04D092AD04E6 |
:1064D00024CD98EB691694E979069EEF89069FEF23 |
:1064E00099062CF528EB34E94EEF5FEF29833A83C8 |
:1064F0004B835C831ACB98EEE92E93E0F92EFAA633 |
:10650000E9A6F2CD2D823E824F825886F4CA8DA133 |
:106510009EA1AFA1B8A58093A6049093A704A093D1 |
:10652000A804B093A9049091B3089CA312CC6982EB |
:106530007A828B829C82F9CA8081918182599F4F95 |
:10654000861797070CF03BCF6115710509F437CF1B |
:10655000CB0101972FCF8081918182599F4F8A175C |
:106560009B070CF011CF109709F40ECFCD010197C6 |
:1065700006CF8081918182599F4F821793070CF03B |
:1065800054CF2115310509F450CFC901019748CFE7 |
:106590008081918182599F4F841795070CF02ACFF3 |
:1065A0004115510509F426CFCA0101971ECF8091EC |
:1065B000380490913904835F934034F038EEE32E31 |
:1065C00033E0F32EFAA6E9A68091380490913904BD |
:1065D0008A5F93400CF495CD8ECD809136049091D6 |
:1065E0003704835F934024F008EE13E01CA70BA749 |
:1065F00080913604909137048A5F93400CF4AECDBD |
:10660000A9CD3FEF403853070CF008CE40E85FEFCC |
:1066100005CE8FEF603878070CF0C3CD60E87FEFD0 |
:10662000C0CD8091A5089091A60897FD9BC1AA278F |
:1066300097FDA095BA2FEDA52E2F33274427552778 |
:10664000BC01CD010E946A6497FDADC156E09595ED |
:106650008795779567955A95D1F72F8D38A1261B89 |
:10666000370B30931809209317094B855C85141656 |
:1066700015060CF43FCE8091A9089091AA0897FDC9 |
:106680006DC1AA2797FDA095BA2FEDA52E2F332710 |
:1066900044275527BC01CD010E946A6497FD88C13B |
:1066A00036E095958795779567953A95D1F729A125 |
:1066B0003AA1261B370B30930D0920930C093CA1FE |
:1066C00037FF3FCE4BA1442309F03BCE80917704A6 |
:1066D000882309F036CE8B859C85A1E081309A070E |
:1066E0000CF044C12B853C854FEF203034070CF073 |
:1066F000A3C189A59AA5280F391F3C872B87205055 |
:106700003F4F30931A0920931909AD85BE85E1E00A |
:10671000A130BE070CF465C12BA53CA5A20FB31F89 |
:10672000BE87AD87A050B140B0930B09A0930A0972 |
:1067300010CE1092900410928F0457FF90CE1092BA |
:106740008E0410928D0437FF96CE10928C04109216 |
:106750008B0484C1109292041092910472CE295F2E |
:106760003F4F3DC8295F3F4F29C82D5F3F4F4F4FD7 |
:106770005F4FE5C8E60EF71E081F191FE0926F096C |
:10678000F0927009009371091093720958CB23E0BD |
:1067900030E040E050E0E20EF31E041F151FA3C8D6 |
:1067A00083E090E0A0E0B0E0E80EF91E0A1F1B1F96 |
:1067B0005BC807966BCC07965ACC2DA13EA14FA182 |
:1067C00058A52093A6043093A7044093A80450939F |
:1067D000A904BFCA615C7F4F8F4F9F4FA0CD90959A |
:1067E00081959F4F8DCD615C7F4F8F4F9F4F6DCDBA |
:1067F000909581959F4F5ACD215F3F4F20CD2F5FC0 |
:106800003F4F00CD0F96DDCC2F5F3F4FBECC2DA16B |
:106810003EA14FA158A52093A6043093A70440930E |
:10682000A8045093A90489859A85AA2797FDA09565 |
:10683000BA2F2AAD3BAD4CAD5DAD820F931FA41FA7 |
:10684000B51F8B8B9C8BAD8BBE8BBC01CD01298181 |
:106850003A814B815C810E946A649B01AC0197FD87 |
:10686000BBC06BE055954795379527956A95D1F74D |
:1068700060918E03862F9927AA27BB278F8B988F2D |
:10688000A98FBA8FBC01CD010E946A6497FD9FC099 |
:106890002CE095958795779567952A95D1F76B8F1D |
:1068A0007C8F8D8F9E8F6093F0047093F1048093A2 |
:1068B000F2049093F3046B897C898D899E892D81E4 |
:1068C0003E814F8158850E946A649B01AC0197FD0F |
:1068D00079C08BE055954795379527958A95D1F7DF |
:1068E0006F89788D898D9A8D0E946A6497FD65C045 |
:1068F000BCE09595879577956795BA95D1F76AAB82 |
:106900007BAB8CAB9DAB6093F4047093F5048093E8 |
:10691000F6049093F70429853A8537FD7FC021342A |
:1069200031050CF431CA6B8D7C8D8D8D9E8D97FD5C |
:106930002AC0613871058105910564F46AA97BA9B3 |
:106940008CA99DA997FD82C06138710581059105CB |
:106950000CF41ACA81E08093950416CA909581952B |
:106960009F4F8FCE909581959F4F61CEE9A5FAA557 |
:106970008E0F9F1F9C878B878050914090931A09A0 |
:1069800080931909C2CE90958095709561957F4F3F |
:106990008F4F9F4FCECF0196A11DB11D8EA79FA7F0 |
:1069A000A8ABB9AB97C9615C7F4F8F4F9F4F4ECE5D |
:1069B000615C7F4F8F4F9F4F73CE6150704F8F4FF1 |
:1069C0009F4F96CF2150384F4F4F5F4F82CF61502E |
:1069D000704F8F4F9F4F5CCF2150384F4F4F5F4FBD |
:1069E00040CF4D855E856FEF4030560754F58BA53F |
:1069F0009CA5480F591F5E874D8740505F4F5093AD |
:106A00000B0940930A09A5CC6150704F8F4F9F4FDF |
:106A1000E7C82150384F4F4F5F4FCFC83095219571 |
:106A20003F4F7DCF6150704F8F4F9F4F0CC921500A |
:106A3000384F4F4F5F4FFAC8F0921A09E092190988 |
:106A400064CE10930B0900930A0983CC909580952E |
:106A5000709561957F4F8F4F9F4F76CFED960FB614 |
:106A6000F894DEBF0FBECDBFDF91CF911F910F9184 |
:106A7000FF90EF90DF90CF90BF90AF909F908F905E |
:106A80007F906F905F904F903F902F9008958091EE |
:106A900001018D3009F455C110927A0080913804BB |
:106AA0009091390490931A098093190980913604C2 |
:106AB0009091370490930B0980930A0980913404D4 |
:106AC000909135049093690980936809809130040E |
:106AD000909131049C01442737FD4095542FDA01F1 |
:106AE000C901880F991FAA1FBB1F880F991FAA1FD2 |
:106AF000BB1F820F931FA41FB51F820F931FA41FDC |
:106B0000B51F909358098093570980913204909152 |
:106B100033049C01442737FD4095542FDA01C90105 |
:106B2000880F991FAA1FBB1F880F991FAA1FBB1F81 |
:106B3000820F931FA41FB51F820F931FA41FB51FA1 |
:106B4000909374098093730980912E0490912F047F |
:106B500090932509809324098FEC80937A0080918B |
:106B6000AF08E82FFF27EE0FFF1FE758F74F808190 |
:106B7000918182599F4FA0919104B0919204A817DE |
:106B8000B9070CF085C0CD010196909392048093D3 |
:106B90009104DC018091B008E82FFF27EE0FFF1F62 |
:106BA000E758F74F8081918182599F4F60918F0400 |
:106BB00070919004681779070CF096C0CB0101968C |
:106BC0009093900480938F04BC018091B108E82FCA |
:106BD000FF27EE0FFF1FE758F74F80819181825901 |
:106BE0009F4F40918D0450918E04481759070CF027 |
:106BF0006CC0CA01019690938E0480938D04AC0101 |
:106C00008091B208E82FFF27EE0FFF1FE758F74FDC |
:106C10008081918182599F4F20918B0430918C0407 |
:106C2000281739070CF042C0C901019690938C04D3 |
:106C300080938B049C01B7FD7FC0AF3FB10511F07D |
:106C40000CF061C077FD67C06F3F710539F034F01B |
:106C50008FEF90E09093900480938F0457FD61C074 |
:106C60004F3F510539F034F08FEF90E090938E0450 |
:106C700080938D0437FD5BC02F3F310509F00CF484 |
:106C800063C08FEF90E090938C0480938B045CC082 |
:106C90008081918182599F4F8A179B070CF07ACF90 |
:106CA000109709F477CFCD0101976FCF8081918143 |
:106CB00082599F4F821793070CF0BDCF21153105E4 |
:106CC00009F4B9CFC9010197B1CF8081918182596F |
:106CD0009F4F841795070CF093CF4115510509F488 |
:106CE0008FCFCA01019787CF8081918182599F4FB1 |
:106CF000861797070CF069CF6115710509F465CF08 |
:106D0000CB0101975DCF8FEF90E090939204809339 |
:106D1000910477FF99CF1092900410928F0457FF3F |
:106D20009FCF10928E0410928D0437FFA5CF109242 |
:106D30008C0410928B0408C010929204109291045B |
:106D400081CF0E945119A8CE8091D8089927AA27EF |
:106D5000BB27BC01CD0124EC39E040E050E00E94AB |
:106D60006A64DC01CB018093A1039093A203A093FA |
:106D7000A303B093A4038091D9089927AA27BB271E |
:106D8000BC01CD010E946A64DC01CB0180939D03AC |
:106D900090939E03A0939F03B093A00308956F92D6 |
:106DA0007F928F929F92AF92BF92CF92DF92EF929B |
:106DB000FF920F931F93CF93DF93C0E0D0E07E014B |
:106DC0006E0110921304469AD093E504C093E40434 |
:106DD000D093E304C093E20480E090E0A0E0B0E050 |
:106DE0008093DC049093DD04A093DE04B093DF0471 |
:106DF000D093EF04C093EE04D093ED04C093EC0461 |
:106E0000D093EB04C093EA04D0933909C0933809B6 |
:106E100010928E0310928D0310922C040E9447351D |
:106E200084E690E00E94D3140E9447358091B30815 |
:106E300080FF10C080911C0390911D03875B9340DD |
:106E400008F07BC080911C0390911D038E5E9240E0 |
:106E500008F473C01FE18AE090E00E94D31480918F |
:106E6000340490913504C80FD91F80913804909153 |
:106E70003904E80EF91E8091360490913704C80E4B |
:106E8000D91E115017FFE7CFA701405F5F4F5695FE |
:106E90004795569547955093EF044093EE0496011D |
:106EA000205F3F4F36952795369527953093ED0413 |
:106EB0002093EC04CE014096969587959295829505 |
:106EC0008F7089279F7089279093EB048093EA0441 |
:106ED00090933909809338093093E9042093E804AA |
:106EE0005093E7044093E60444E050E0DA010E9446 |
:106EF000F964802D853020F1809173099091740997 |
:106F000097FD53C06CE070E00E94A9647093E304A5 |
:106F10006093E204809157099091580997FD56C0FB |
:106F20006CE070E00E94A9647093E5046093E4044F |
:106F300080913108909132084DC00E94FF188ACF8D |
:106F4000DA010E94F964802D9927982F8827DA01A9 |
:106F500011960E94F964202D820F911D9093E504F3 |
:106F60008093E404DA0112960E94F964802D992737 |
:106F7000982F8827DA0113960E94F964202D820F3A |
:106F8000911D9093E3048093E204DA0114960E9429 |
:106F9000F964802D9927982F8827DA0115960E9489 |
:106FA000F964202D820F911D15C0909581959F4FFA |
:106FB0006CE070E00E94A9647093E3046093E204C3 |
:106FC000809157099091580997FFAACF9095819584 |
:106FD0009F4FA6CFAA2797FDA095BA2FBC01CD0140 |
:106FE0000E94F063DC01CB018093DC049093DD040C |
:106FF000A093DE04B093DF0410921A0910921909CD |
:1070000010920B0910920A091092690910926809EE |
:1070100084E690E00E94D314809130049091310472 |
:10702000AA2797FDA095BA2F9C01AD01220F331F0F |
:10703000441F551F220F331F441F551F280F391F90 |
:107040004A1F5B1F280F391F4A1F5B1F30935809C7 |
:10705000209357098091320490913304AA2797FD19 |
:10706000A095BA2F7C018D01EE0CFF1C001F111F93 |
:10707000EE0CFF1C001F111FE80EF91E0A1F1B1F3C |
:10708000E80EF91E0A1F1B1FF0927409E0927309A3 |
:107090008091BF08682E772488249924C9019C0117 |
:1070A000442737FD4095542FC401B3010E946A6400 |
:1070B0005B016C016093D6047093D7048093D8046D |
:1070C0009093D9049701442737FD4095542FC4016C |
:1070D000B3010E946A64DC01CB018093CE049093DB |
:1070E000CF04A093D004B093D104A092B204B09284 |
:1070F000B304C092B404D092B5048093AA049093D0 |
:10710000AB04A093AC04B093AD041092A60410920B |
:10711000A7041092A8041092A90480911E039091D4 |
:107120001F03A0912003B091210390933408809312 |
:10713000330810922B0410922A0410929E0410928D |
:107140009F041092A0041092A10480919C0490913D |
:107150009D0490939B0480939A040E94D75682E3E7 |
:1071600090E090931604809315048091D808992795 |
:10717000AA27BB27BC01CD0124EC39E040E050E058 |
:107180000E946A64DC01CB018856954CAF4FBF4F1B |
:107190008093A1039093A203A093A303B093A403AD |
:1071A0008091D9089927AA27BB27BC01CD010E944D |
:1071B0006A64DC01CB018856954CAF4FBF4F80937A |
:1071C0009D0390939E03A0939F03B093A0031092FE |
:1071D0008A031092890380919C0490919D04AA27B0 |
:1071E00097FDA095BA2F2091850330918603409199 |
:1071F000870350918803BC01CD010E946A64DC01C1 |
:10720000CB0180936F0990937009A0937109B0939B |
:107210007209109294041092930411E010930001EB |
:107220000E94BF5A80915E04846080935E048FEF59 |
:107230008093D8091092D90980E28093DA0980916D |
:10724000AF08E82FFF27EE0FFF1FE758F74F8081A9 |
:10725000918182599F4F90939204809391048091E1 |
:10726000B008E82FFF27EE0FFF1FE758F74F808188 |
:10727000918182599F4F9093900480938F048091C5 |
:10728000B108E82FFF27EE0FFF1FE758F74F808167 |
:10729000918182599F4F90938E0480938D048091A9 |
:1072A000B208E82FFF27EE0FFF1FE758F74F808146 |
:1072B000918182599F4F90938C0480938B041093FB |
:1072C000130484E680938A04DF91CF911F910F917C |
:1072D000FF90EF90DF90CF90BF90AF909F908F90F6 |
:1072E0007F906F90089580915A099927909306088E |
:1072F0008093050880915B099927909308088093F3 |
:10730000070880915D09992790930A0880930908DE |
:1073100080915C09992790930C0880930B088091C9 |
:107320008104882321F08091C90880FF31C08091B9 |
:107330005E048C7F80935E0490E010C0A92FBB2771 |
:10734000FD01E05DF84F8083FD01E05DF84F808135 |
:10735000A65AB64F8C939F5F9C3080F48091F403C3 |
:10736000882361F3A92FBB27FD01E05DF84F8081E1 |
:10737000A65AB64F8C939F5F9C3080F38091F403A4 |
:10738000882359F08091F40381508093F40305C061 |
:1073900080915E04816080935E0410925804109284 |
:1073A00057040E94DB2608958091B6088B3F68F051 |
:1073B0008B3F09F4B7C28C3F09F45DC38D3F09F4DC |
:1073C00007C38E3F21F480918B04809399038091B1 |
:1073D000B5088B3F08F40FC28B3F09F40AC28C3FFB |
:1073E00009F43DC38D3F09F408C38E3F09F485C3FA |
:1073F00080919A03882309F003C280939A038091B5 |
:10740000B7088B3F08F403C28B3F09F4FEC18C3FE1 |
:1074100009F416C38D3F09F4F3C28E3F09F46AC321 |
:1074200080919803882309F0F7C180939803809195 |
:10743000B9088B3F68F08B3F09F454C28C3F09F4C4 |
:1074400002C38D3F09F4C7C28E3F21F480918B04A3 |
:10745000809397038091C0088B3F68F08B3F09F4BD |
:107460005EC28C3F09F404C38D3F09F4AEC28E3F67 |
:1074700021F480918B04809396038091C1088B3F07 |
:1074800008F4D1C18B3F09F4CCC18C3F09F4D5C2BB |
:107490008D3F09F4A6C28E3F09F429C3809194035D |
:1074A0008B3008F4C5C18F3F11F480939403809111 |
:1074B000C2088B3F68F08B3F09F41AC28C3F09F475 |
:1074C000CBC28D3F09F490C28E3F21F480918B0492 |
:1074D000809393038091C3088B3F68F08B3F09F43E |
:1074E0000AC28C3F09F4B2C28D3F09F477C28E3FC5 |
:1074F00021F480918B04809395032091C8082B3F41 |
:1075000008F49AC12B3F09F495C12C3F09F4C5C278 |
:107510002D3F09F451C22E3F09F4E6C22091910398 |
:107520008091C9088B3F08F08EC1809372048091CE |
:10753000CA088B3F68F08B3F09F4E3C18C3F09F424 |
:1075400094C28D3F09F435C28E3F21F480918B04A3 |
:10755000809371048091CB088B3F68F08B3F09F4D6 |
:10756000D3C18C3F09F47EC28D3F09F440C28E3FE7 |
:1075700021F480918B04809370048091CC088B3F20 |
:1075800068F08B3F09F4C3C18C3F09F462C28D3FA0 |
:1075900009F430C28E3F21F480918B0480936F04F4 |
:1075A0009091DD089B3F08F45DC19B3F09F4B2C197 |
:1075B0009C3F09F435C29D3F09F425C29E3F09F066 |
:1075C00053C180918B0480936E044091DE084B3F41 |
:1075D00008F04FC140936D048091DF088B3F68F045 |
:1075E0008B3F09F4BCC18C3F09F41FC28D3F09F4E5 |
:1075F00014C28E3F21F480918B0480936C0480919F |
:10760000E0088B3F68F08B3F09F4ACC18C3F09F474 |
:1076100035C28D3F09F4D3C18E3F21F480918B0494 |
:1076200080936B048091CD088B3F68F08B3F09F409 |
:107630009CC18C3F09F434C28D3F09F4B1C18E3F27 |
:1076400021F480918B04809390038091D2088B3F2A |
:1076500068F08B3F09F469C18C3F09F424C28D3F67 |
:1076600009F4A1C18E3F21F480918B0480938F0394 |
:107670008091D5088B3F68F08B3F09F459C18C3F4E |
:1076800009F408C28D3F09F491C18E3F21F4809125 |
:107690008B0480938E038091D6088B3F68F08B3FDC |
:1076A00009F449C18C3F09F4F2C18D3F09F475C159 |
:1076B0008E3F21F480918B0480938D038091D708B5 |
:1076C0008B3F68F08B3F09F439C18C3F09F4FAC154 |
:1076D0008D3F09F44DC18E3F21F480918B0480933E |
:1076E0008C038091DC088B3F68F08B3F09F429C143 |
:1076F0008C3F09F4EAC18D3F09F43DC18E3F21F46E |
:1077000080918B0480938B038091E2088B3F08F477 |
:10771000C3C08B3F09F4BEC08C3F09F4C7C18D3F85 |
:1077200009F42CC18E3F09F4D6C18091330982300F |
:1077300008F4B7C08F3F11F4809333099B3F08F4DE |
:10774000B2C09B3F09F400C19C3F09F49DC19D3F1D |
:1077500009F420C19E3F09F4C4C1809128098823FF |
:1077600009F0A7C0809328098091E4088B3F08F4B2 |
:10777000A7C08B3F09F4A2C08C3F09F4A0C18D3F84 |
:1077800009F402C18E3F09F4A9C1809166098230D3 |
:1077900008F49BC08F3F11F4809366094B3F08F4B7 |
:1077A00096C04B3F09F4D3C04C3F09F485C14D3F0F |
:1077B00009F4EDC04E3F09F48BC180912C09882358 |
:1077C00009F08BC080932C098091F5088B3F70F0F5 |
:1077D0008B3F09F48AC08C3F09F46BC18D3F09F4DB |
:1077E000D0C08E3F09F08CC180918B0480937609C4 |
:1077F00087C18091910480939A03882309F4FDCD79 |
:10780000843608F4FCCD84E6F8CD80919104809311 |
:107810009803882309F409CE843608F408CE84E658 |
:1078200004CE80919104809394038B3008F03BCE7A |
:107830008AE03BCE20919104209391038091C90866 |
:107840008B3F08F472CE8B3F09F458C08C3F09F48B |
:1078500018C18D3F09F4B6C08E3F09F068CE809103 |
:107860008B0463CE90936E044091DE084B3F08F486 |
:10787000B1CE4B3F09F46EC04C3F09F4D9C04D3F27 |
:1078800009F4C6C04E3F09F0A7CE80918B048093C7 |
:107890006D04A2CE8091910480933309823008F068 |
:1078A00049CF81E049CF892F80932809882309F4A3 |
:1078B00059CF8A3F08F458CF8AEF54CF8091910472 |
:1078C00080936609823008F065CF81E065CF842F10 |
:1078D00080932C09882309F475CF8A3F08F474CF6C |
:1078E0008AEF70CF80919104B3CD809191047ECFC7 |
:1078F00080919104EDCD80919104FDCD8091910412 |
:1079000014CE8091910424CE8091910434CE809144 |
:10791000910444CE8091910480936E0456CE809160 |
:107920009104A9CD8091910450CD809191049ECE77 |
:1079300080919104AECE80919104BECE809191044D |
:10794000CECE80919104DECE80919104ADCF809116 |
:107950009104BECF8091910480936D043DCE8091BF |
:1079600091044BCE809191045BCE809191046BCEBB |
:1079700080918D04B4CE80918D04C4CE80918D040D |
:107980008BCF80918D0432CF80918D0499CF8091DF |
:107990008D049ECF80918D0487CF80918D048CCEF5 |
:1079A00080918D0450CE80918D0460CE80918D04A5 |
:1079B00070CE80918D04CCCD20918D043DCF8091EF |
:1079C0008D042ECE80918D04B0CD80918D0453CD49 |
:1079D00080918D04FACC80918D043ACD80918D04F4 |
:1079E0008ACD80918D041FCF80918D0471CD8091BF |
:1079F0008D04C1CD80918D04D1CD80918D04FBCEBD |
:107A000080918D0404CF80918D0480936E04DDCD30 |
:107A100080918D0480936D04DFCD80918D04EDCD38 |
:107A200080918F0480936E04D0CD80918F04E5CD3A |
:107A300080918F0480936D04CFCD80918F04F3CE1D |
:107A400080918F04E4CE80918F0402CD80918F04C9 |
:107A500052CD80918F04A2CD80918F0439CD809139 |
:107A60008F04C9CE80918F0486CD80918F0470CD14 |
:107A700080918F0400CD80918F04A7CC80918F04DA |
:107A8000CFCD80918F0451CD80918F040DCF809107 |
:107A90008F0412CE80918F04FCCD20918F04CCCE28 |
:107AA00080918F04D0CD80918F04E0CD80918F04A0 |
:107AB000F3CE80918F049ACE80918F0409CF80916C |
:107AC0008F04FECE80918F040ACE80918F041ACE4F |
:107AD00080918B04FDCE80918B04DECE80918B044F |
:107AE000EFCE80918B04E0CE20918B04A5CE8091C7 |
:107AF0008B0499CE80918B048ACE80918B047BCEAF |
:107B000033272F5F3F4F8CE398E2B9010E94A964AD |
:107B100070939C0360939B038091BE0880936709D8 |
:107B20008091BD0880931E0908952F923F924F9235 |
:107B30005F926F927F928F929F92AF92BF92CF92FD |
:107B4000DF92EF92FF920F931F93CF93DF93CDB706 |
:107B5000DEB7EA970FB6F894DEBF0FBECDBF0E9426 |
:107B6000AE2B209101012C3010F00C945546299A2F |
:107B7000A0908204B0908304BA82A98280918A0482 |
:107B8000843610F00C94624680910E03882311F421 |
:107B90000C945F488091240590912505009711F47D |
:107BA0000C947B4A019790932505809324052A30F5 |
:107BB00011F40C94834A243111F40C94834A2898CC |
:107BC00080915F0490916004895E934010F40C945E |
:107BD000774A8091C508282F33273A83298381E08B |
:107BE000809397048091AB08A82FBB27AA0FBB1FD7 |
:107BF000FD01E157F74F118210828091AC08282FC8 |
:107C00003327220F331FC9018157974FFC0111827F |
:107C10001082A758B74F11961C921E922758374FC3 |
:107C2000D90111961C921E928091AE08E82FFF2771 |
:107C3000EE0FFF1FE758F74F1182108280918303E8 |
:107C4000815080938303809183038F3F29F0A0911B |
:107C50009704AA2309F4D5C20E94D4398091AB08B5 |
:107C6000E82FFF27EE0FFF1FE758F74F8081918124 |
:107C70004C01AA2497FCA094BA2C8091AC08E82F60 |
:107C8000FF27EE0FFF1FE758F74F808191816C01AE |
:107C9000EE24D7FCE094FE2C8091E00880FF77C0B2 |
:107CA000F094E094D094C094C11CD11CE11CF11C50 |
:107CB000C501B4012FE93BE140E050E00E946A6455 |
:107CC0004B015C01C701B6010E946A646B017C0133 |
:107CD000D501C4018C199D09AE09BF09BC01CD01B4 |
:107CE00020E137E240E050E00E94DE648901C80CE8 |
:107CF000D91CEA1CFB1CC701B60120E137E240E0B9 |
:107D000050E00E94DE64DA01C9014801AA2497FC10 |
:107D1000A094BA2C909581959F4F6C01EE24D7FCCE |
:107D2000E094FE2C1EE781169104A104B10414F026 |
:107D30000C94864A23E882162FEF92062FEFA206B4 |
:107D40002FEFB20644F4A3E88A2EAFEF9A2EAFEFDE |
:107D5000AA2EAFEFBA2E3EE7C316D104E104F10418 |
:107D60002CF0FDE7CF2ED12CE12CF12C43E8C416EA |
:107D70004FEFD4064FEFE4064FEFF40644F4E3E888 |
:107D8000CE2EEFEFDE2EEFEFEE2EEFEFFE2E8091F8 |
:107D9000330590913405AA2797FDA095BA2F950138 |
:107DA0008401081B190B2A0B3B0BC901B80123E006 |
:107DB00030E040E050E00E94DE64DA01C901880F43 |
:107DC000991FAA1FBB1F820F931FA41FB51F8C01F1 |
:107DD0008091350590913605AA2797FDA095BA2F79 |
:107DE000A7019601281B390B4A0B5B0BCA01B9018D |
:107DF00023E030E040E050E00E94DE64DA01C90197 |
:107E0000880F991FAA1FBB1F820F931FA41FB51FA6 |
:107E1000FC019092340580923305D0923605C092D1 |
:107E2000350580913705909138059C01220F331F4D |
:107E3000280F391F8091BA08682F7727689DC001E5 |
:107E4000699D900D789D900D1124280F391F37FFE3 |
:107E500002C00C94F1523595279535952795809160 |
:107E6000BB08482F5527409FC001419F900D509F50 |
:107E7000900D1124820F931F90933805809337053E |
:107E800020915F0530916005821B930B90938904CC |
:107E9000809388048091390590913A059C01220FC6 |
:107EA000331F280F391F6C9DC0016D9D900D7C9D67 |
:107EB000900D1124280F391F37FF02C00C94ED528A |
:107EC00035952795359527954E9FC0014F9F900D6D |
:107ED0005E9F900D1124820F931F90933A0580931B |
:107EE000390520915D0530915E05821B930B9093BF |
:107EF0008704809386048091AE08E82FFF27EE0F59 |
:107F0000FF1FE758F74F80819181909581959F4F92 |
:107F10008330910514F40C94154A029790938504CC |
:107F2000809384040E94FC5F8C01809194039927C4 |
:107F3000AA2797FDA095BA2FBC01CD010E94F0633E |
:107F4000DC01CB0120E030E040E251E4BC01CD0196 |
:107F50000E949163DC01CB01BC01CD010E94D3637F |
:107F6000DC01CB0180936D0960919303809311092B |
:107F7000609329098091520780FF06C0809176099D |
:107F8000813810F00C94AB4A109383040093820460 |
:107F9000809182049091830497FF02C00C94E75271 |
:107FA0008091B30882FD02C00C945E4A10923A0997 |
:107FB0004091880450918904CA0157FF02C00C9473 |
:107FC000694A959587959595879597FF02C00C947A |
:107FD000724A20916304309164042817390714F021 |
:107FE0000C941D4ACA0157FF02C00C94E95397FF35 |
:107FF00002C00C94E653BC0175956795759567951D |
:108000006536710514F40C94204A64E670E04091E2 |
:10801000860450918704CA0157FD02C00C94294A76 |
:108020000396959587959595879597FD02C00C9435 |
:10803000314A909581959F4F20916104309162045F |
:108040002817390714F40C943A4AC9010197A091F2 |
:108050009704AA2311F40C94544A109264041092C9 |
:10806000630410926204109261045091AC08E52FF1 |
:10807000FF27EE0FFF1FE758F74F4091D308242F3B |
:108080003327808191812817390734F48091F608CD |
:1080900082FF02C00C94A64AE52FFF27EE0FFF1FB8 |
:1080A000E758F74F842F99272091D408821B910914 |
:1080B000208131812817390714F410927604E52FB6 |
:1080C000FF27EE0FFF1FE758F74F842F992722272E |
:1080D0003327281B390B808191818217930734F451 |
:1080E0008091F60883FF02C00C94A14A8091750428 |
:1080F000882391F0E52FFF27EE0FFF1FE758F74F7A |
:108100008091D4089927841B91092081318182179D |
:10811000930714F40C942D4B6091AB08E62FFF27C6 |
:10812000EE0FFF1FE758F74F242F332780819181EF |
:108130002817390734F48091F60880FF02C00C94A8 |
:108140009B4A50917304552399F0E62FFF27EE0FB9 |
:10815000FF1FE758F74F842F99272091D408821BDF |
:108160009109208131812817390714F40C94284B88 |
:10817000E62FFF27EE0FFF1FE758F74F842F9927B1 |
:1081800022273327281B390B80819181821793077F |
:1081900034F48091F60881FF02C00C94964A8091D5 |
:1081A0007404882391F0E62FFF27EE0FFF1FE75896 |
:1081B000F74F8091D4089927841B91092081318140 |
:1081C0008217930714F40C94314B80917604882322 |
:1081D00031F480917504882311F40C94934A91E052 |
:1081E000552331F480917404882311F40C940E4BC0 |
:1081F00081E08093780410927704109276041092B4 |
:108200007504F0917704FB8FFF2321F480917804AB |
:10821000882369F08091D2089927A980BA808A15AD |
:108220009B0514F49A83898381E080939504AA23A3 |
:1082300011F40C94104A1092850410928404109248 |
:1082400089041092880410928704109286049AE59B |
:1082500090936D0988E780933A099093110988A358 |
:108260008093290910927704109278041B8E209134 |
:108270002D0930912E0940912F0950913009C0905D |
:10828000D604D090D704E090D804F090D904C9A2C5 |
:10829000DAA2EBA2FCA22C0D3D1D4E1D5F1D8091AC |
:1082A000340990913509A0913609B0913709E090D1 |
:1082B000CE04F090CF040091D0041091D104ED8A47 |
:1082C000FE8A0F8B188F8E0D9F1DA01FB11FA090CF |
:1082D0002009B0902109C0902209D0902309ADA6B1 |
:1082E000BEA6CFA6D8AAC090D204D090D304E09066 |
:1082F000D404F090D504CC8EDD8EEE8EFF8EEDA4EE |
:10830000FEA40FA518A9AC8CBD8CCE8CDF8CEA0C1A |
:10831000FB1C0C1D1D1DEDA6FEA60FA718ABC090E3 |
:108320001209D0901309E0901409F0901509C9A61C |
:10833000DAA6EBA6FCA6E090CA04F090CB0400916C |
:10834000CC041091CD04EDA2FEA20FA318A7A9A4FE |
:10835000BAA4CBA4DCA4AE0CBF1CC01ED11EA9A61F |
:10836000BAA6CBA6DCA6B0907804BF86BB2011F0DD |
:108370000C94AC490B8D002311F00C94AC49809304 |
:10838000340990933509A0933609B09337092093A7 |
:108390002D0930932E0940932F0950933009809175 |
:1083A000310890913208815092400CF09FC6809124 |
:1083B0008104882309F09AC68091280490912904A9 |
:1083C0008F3F910509F008F4A0C7EF85EE2311F067 |
:1083D0000C943A4BFB8DFF2311F00C943A4B009117 |
:1083E00095040C8B002311F00C943A4B1091DB0890 |
:1083F0001A8F112311F40C943A4B2DA53EA54FA5CD |
:1084000058A92093200930932109409322095093C1 |
:10841000230989A59AA5ABA5BCA5809312099093C1 |
:108420001309A0931409B093150980912D09909117 |
:108430002E09A0912F09B0913009B7FF02C00C940A |
:10844000D655292E3A2E4B2E552447FC5A9420926D |
:108450002D0930922E0940922F09509230098091B7 |
:10846000340990913509A0913609B0913709B7FFC9 |
:1084700002C00C94D055892F9A2FAB2FBB27A7FD94 |
:10848000BA958B839C83AD83BE838093340990938C |
:108490003509A0933609B09337098091BF08E82EBB |
:1084A000FF24002711272091C6043091C704409172 |
:1084B000C8045091C904C801B7010E946A6497FFBB |
:1084C00002C00C94EE55672E782E892E992487FCD5 |
:1084D0009A942091C2043091C3044091C4045091F5 |
:1084E000C504C801B7010E946A6497FF02C00C94DA |
:1084F000E855A72EB82EC92EDD24C7FCDA94D20188 |
:10850000C10186199709A809B9092091DA08E22E54 |
:10851000FF2400271127BC01CD01A80197010E946B |
:10852000DE6439014A0119012A018B819C81AD81E8 |
:10853000BE818A199B09AC09BD09BC01CD01A80106 |
:1085400097010E94DE64D401C30197FE02C00C941F |
:10855000E255892F9A2FAB2FBB27A7FDBA95BC01F7 |
:10856000DA01C90157FF02C00C94DC55892F9A2FFC |
:10857000AB2FBB27A7FDBA956C0180916304909146 |
:10858000640481349105D4F4809161049091620473 |
:10859000813491059CF48091AE08E82FFF27EE0FFF |
:1085A000FF1FE758F74F808191810190F081E02D06 |
:1085B000F7FF02C00C9459567A9734F08091D8098D |
:1085C0008F3F11F40C947155EC8CFD8C0E8D1F8D2A |
:1085D00029A13AA14BA15CA1E21AF30A040B150BE5 |
:1085E000EFAAF8AE09AF1AAFE0921405F0921505A4 |
:1085F00000931605109317058DA19EA1AFA1B8A5F4 |
:10860000ED88FE880F89188D8E199F09A00BB10B7C |
:108610008F839887A987BA87809318059093190547 |
:10862000A0931A05B0931B050FA918AD29AD3AAD5B |
:1086300000931C0510931D0520931E0530931F0504 |
:108640008093200590932105A0932205B0932305E4 |
:108650008091B2049091B304A091B404B091B50498 |
:10866000801B910BA20BB30B8093B2049093B304C5 |
:10867000A093B404B093B5048091AA049091AB0484 |
:10868000A091AC04B091AD042F81388549855A85FD |
:10869000821B930BA40BB50B8093AA049093AB049D |
:1086A000A093AC04B093AD043A8D332371F12091C3 |
:1086B0009304309194042138310594F08091EA04B8 |
:1086C0009091EB0401969093EB048093EA048091DF |
:1086D00038099091390901969093390980933809A6 |
:1086E00020583F4F94F48091EA049091EB04019755 |
:1086F0009093EB048093EA048091380990913909B2 |
:10870000019790933909809338091092940410923C |
:10871000930401E0A02EB12C8FA998ADA9ADBAADFC |
:10872000B7FF02C00C94BA5581509240A040B040AF |
:108730001CF014E0A12EB12C8091410590914205CE |
:10874000A0914305B0914405E0902D09F0902E09C9 |
:1087500000912F09109130098E199F09A00BB10BC0 |
:10876000815E914BAF4FBF4F8F539C49A040B040AB |
:1087700010F40C942855F091D909F98FF93114F4BB |
:108780000C94A455B0923C05A0923B058FA998ADDE |
:10879000A9ADBAAD81509041A040B04014F40C9402 |
:1087A000315580913D05882311F40C940656709341 |
:1087B0007A04609379048FA998ADA9ADBAADB7FFDB |
:1087C00002C00C949D569C01AD01B7FF02C00C94F1 |
:1087D000AC56B9E05595479537952795BA95D1F799 |
:1087E00080913B0590913C05820F931F90933C052F |
:1087F00080933B052FA938AD49AD5AAD57FF02C054 |
:108800000C94A65639014A01A3E095948794779475 |
:108810006794AA95D1F713012401F9E86F16F3E1E3 |
:108820007F06F0E08F06F0E09F0644F0F8E86F2E38 |
:10883000F3E17F2E812C912C13012401D401C3017B |
:1088400097FE02C00C946D56892F9A2FAB2FBB2731 |
:10885000A7FDBA95680F791F2FA938AD49AD5AAD5C |
:10886000203080EF38078FEF48078FEF580714F05C |
:108870000C94455580913E05882311F40C94C35502 |
:1088800070937A0460937904DA01C90157FF02C03A |
:108890000C9450569C01AD01B7FF02C00C94885651 |
:1088A00069E055954795379527956A95D1F7809159 |
:1088B0003B0590913C05820F931F90933C0580935C |
:1088C0003B052FA938AD49AD5AAD57FF02C00C94F6 |
:1088D000825639014A0143E09594879477946794CE |
:1088E0004A95D1F798E769169CEE79069FEF8906BD |
:1088F0009FEF990644F438E7632E3CEE732E3FEF6A |
:10890000832E3FEF932E60922B0570922C05809260 |
:108910002D0590922E05D401C30197FE02C00C9440 |
:108920006756892F9A2FAB2FBB27A7FDBA95609169 |
:10893000790470917A04680F791FAA8D2A2F332742 |
:1089400080913B0590913C052817390724F430931A |
:108950003C0520933B05B98DBB2379F02B2F3327A2 |
:1089600027FD309580913B0590913C0528173907EC |
:1089700024F430933C0520933B052FA938AD49AD35 |
:108980005AAD213831054105510574F08091EE044E |
:108990009091EF0420913B0530913C05820F931F8D |
:1089A0009093EF048093EE048FA998ADA9ADBAAD72 |
:1089B00080589F4FAF4FBF4F74F48091EE04909159 |
:1089C000EF0420913B0530913C05821B930B909363 |
:1089D000EF048093EE04B1E0AB2EB12C8F8198852B |
:1089E000A985BA85B7FF02C00C940B5681509240FE |
:1089F000A040B0401CF0A4E0AA2EB12C20E030E052 |
:108A000040E050E08091450590914605A0914705D2 |
:108A1000B09148056090340970903509809036090E |
:108A20009090370986199709A809B909815E914B79 |
:108A3000AF4FBF4F8F539C49A040B04028F0F98DF5 |
:108A4000F93114F40C948E55B0923C05A0923B057C |
:108A50008F819885A985BA8581509041A040B0400A |
:108A600014F40C94395580913F05882311F40C942B |
:108A7000F955D0927C04C0927B048F819885A9859A |
:108A8000BA85B7FF02C00C949456B7FF02C00C948D |
:108A90003B56F9E0B595A79597958795FA95D1F747 |
:108AA000A80EB91EB0923C05A0923B052F813885D7 |
:108AB00049855A8557FF02C00C943556E3E0559519 |
:108AC000479537952795EA95D1F72938F3E13F0780 |
:108AD000F0E04F07F0E05F0714F40C94255688E8A7 |
:108AE00093E1A0E0B0E080932F0590933005A09330 |
:108AF0003105B093320580912F0590913005A091FA |
:108B00003105B0913205B7FF02C00C942F56892F62 |
:108B10009A2FAB2FBB27A7FDBA95C0907B04D090AE |
:108B20007C04C80ED91E2F81388549855A8520308E |
:108B300080EF38078FEF48078FEF580714F00C9439 |
:108B4000355580914005882311F40C94F455D0924A |
:108B50007C04C0927B04DA01C90157FF02C00C9467 |
:108B600047569C01AD01B7FF02C00C944156B9E0D5 |
:108B70005595479537952795BA95D1F780913B053F |
:108B800090913C05820F931F90933C0580933B0589 |
:108B90002F81388549855A8557FF02C00C9461564C |
:108BA000A3E05595479537952795AA95D1F728378E |
:108BB0009CEE39079FEF49079FEF590714F00C947B |
:108BC0001B5688E79CEEAFEFBFEF80932F05909385 |
:108BD0003005A0933105B093320580912F05909117 |
:108BE0003005A0913105B0913205B7FF02C00C9459 |
:108BF0007356892F9A2FAB2FBB27A7FDBA95C0902C |
:108C00007B04D0907C04C80ED91EAA8D2A2F33274E |
:108C100080913B0590913C052817390724F4309347 |
:108C20003C0520933B05B98DBB2379F02B2F3327CF |
:108C300027FD309580913B0590913C052817390719 |
:108C400024F430933C0520933B052F8138854985DA |
:108C50005A85213831054105510574F08091EC04A5 |
:108C60009091ED0420913B0530913C05820F931FBC |
:108C70009093ED048093EC048F819885A985BA8543 |
:108C800080589F4FAF4FBF4F0CF00AC58091EC0446 |
:108C90009091ED0420913B0530913C05821B930B94 |
:108CA0009093ED048093EC04FBC42998A090820477 |
:108CB000B0908304BA82A98280918A04843610F429 |
:108CC0000C94C43D80918A048D3810F40C941E3E9F |
:108CD000109297049091C60882E3989FC0011124D6 |
:108CE0009093250580932405E981FA81B9970CF0CA |
:108CF0009BC480915F04909160048F3F910519F0AF |
:108D000010F00C94E0521092080510920905109290 |
:108D10000A0510920B0510920C0510920D05109289 |
:108D20000E0510920F058A3F910511F40C94FC5426 |
:108D30003091AD08E32FFF27EE0FFF1FE758F74FE5 |
:108D400080819181813591050CF4E9C040918104C5 |
:108D5000442309F0E4C08091AE08E82FFF27EE0F0E |
:108D6000FF1FE758F74F808191818C34910514F4EF |
:108D70000C944454809126058F5F893C10F40C9428 |
:108D800020552C3010F00C948B55299810928104AA |
:108D9000109226051092600410925F046091AB0857 |
:108DA000E62FFF27EE0FFF1FE758F74F80819181D5 |
:108DB0008734910514F00C9487555091AC08E52F39 |
:108DC000FF27EE0FFF1FE758F74F80819181019039 |
:108DD000F081E02DF7FF02C00C947956E734F105DD |
:108DE0000CF470C021E0A52FBB27AA0FBB1FA7580A |
:108DF000B74F8D919C9111978734910544F0E62FE0 |
:108E0000FF27EE0FFF1FE758F74F808191818D916B |
:108E10009C918734910564F0E62FFF27EE0FFF1F2A |
:108E2000E758F74F80819181873491050CF022E05B |
:108E3000E52FFF27EE0FFF1FE758F74F8081918145 |
:108E40008634910564F4E62FFF27EE0FFF1FE758E5 |
:108E5000F74F80819181873491050CF023E0E52F55 |
:108E6000FF27EE0FFF1FE758F74F808191818A5B44 |
:108E70009F4F64F4E62FFF27EE0FFF1FE758F74FD1 |
:108E800080819181873491050CF024E0E52FFF2744 |
:108E9000EE0FFF1FE758F74F808191818A5B9F4F4C |
:108EA00064F4E62FFF27EE0FFF1FE758F74F80818E |
:108EB0009181863491050CF425E0822F0E94F50300 |
:108EC0005091AC08E52FFF27EE0FFF1FE758F74F33 |
:108ED000808191810190F081E02DF7FF02C00C9418 |
:108EE00014567E9714F00C9451558091AB08E82FDE |
:108EF000FF27EE0FFF1FE758F74F808191818A5BB4 |
:108F00009F4F14F00C94515581E08093460788EEF2 |
:108F100093E090931604809315043091AD08E32FED |
:108F2000FF27EE0FFF1FE758F74F808191818B5A83 |
:108F30009F4F14F00C941E3ED090AE08ED2DFF27ED |
:108F4000EE0FFF1FE758F74F80819181855B9F4FA0 |
:108F500014F00C94C053809127058F5F893C10F466 |
:108F60000C94EB5488EC8093270581E090E090937B |
:108F7000600480935F0481E0809381041092100567 |
:108F80001092110510921205109213051092A6046A |
:108F90001092A7041092A8041092A9041092A2049F |
:108FA0001092A3041092A4041092A5048091BF080B |
:108FB000E82EFF2400271127809157099091580926 |
:108FC0009C01442737FD4095542FC801B7010E94EA |
:108FD0006A64DC01CB018093B6049093B704A0933C |
:108FE000B804B093B90480917309909174099C01FD |
:108FF000442737FD4095542FC801B7010E946A6489 |
:10900000DC01CB018093AE049093AF04A093B00435 |
:10901000B093B1048091D6049091D704A091D80464 |
:10902000B091D9048093B2049093B304A093B40494 |
:10903000B093B5048091CE049091CF04A091D00458 |
:10904000B091D1048093AA049093AB04A093AC0494 |
:10905000B093AD04109208051092090510920A050C |
:1090600010920B0510920C0510920D0510920E0532 |
:1090700010920F0580915E04886080935E04809159 |
:10908000E00881FD02C00C94C2538091B30880FFB8 |
:1090900010C080911C0390911D03875B934038F4AE |
:1090A00080911C0390911D038E5E924010F40E94EB |
:1090B000FF180E94CF36D090AE080C94C253809116 |
:1090C0001103909112038F5F9F4F11F00C94CA3DD2 |
:1090D00088E99AE3909316048093150480E09CE05D |
:1090E00090931203809311030C94CA3D9090D80979 |
:1090F0006FEF961611F40C94F7528091BF08A82ECA |
:10910000BB24CC24DD2469A17AA18BA19CA1A6015A |
:1091100095010E94DE6479018A018091570990913E |
:109120005809AA2797FDA095BA2FE81AF90A0A0B41 |
:109130001B0B6D897E898F89988DA60195010E94F0 |
:10914000DE6459016A018091730990917409AA271C |
:1091500097FDA095BA2FA81AB90ACA0ADB0A292CCA |
:10916000332427FC3094432C532CC201B101A801B5 |
:1091700097010E946A6497FD78C23B014C01F9E0B7 |
:109180009594879477946794FA95D1F7C201B101C9 |
:10919000A60195010E946A6497FF02C00C942254B4 |
:1091A0005B016C01E9E0D594C794B794A794EA9564 |
:1091B000D1F78091630490916404813491053CF46B |
:1091C000809161049091620481349105C4F0D401CE |
:1091D000C30197FE02C00C94F7543C014D019594D5 |
:1091E000879477946794D601C501D7FE02C00C948A |
:1091F000F2545C016D01D594C794B794A794809103 |
:10920000AE08E82FFF27EE0FFF1FE758F74F8081CA |
:1092100091810190F081E02DF7FF02C00C941D5464 |
:109220007A97A4F0C401B30123E030E040E050E0BD |
:109230000E94DE6439014A01C601B50123E030E035 |
:1092400040E050E00E94DE6459016A018091DA0931 |
:10925000282F332727FD3095432F532F2615370509 |
:109260004805590514F439014A01992787FD90955D |
:10927000909581959F4FAA2797FDA095BA2F6816C4 |
:1092800079068A069B0614F43C014D012A153B051C |
:109290004C055D0514F459016A01A816B906CA0601 |
:1092A000DB0614F45C016D018091B6049091B70463 |
:1092B000A091B804B091B90486199709A809B90911 |
:1092C0008093B6049093B704A093B804B093B90404 |
:1092D0008091AE049091AF04A091B004B091B1041C |
:1092E0008A199B09AC09BD098093AE049093AF0421 |
:1092F000A093B004B093B104809128049091290404 |
:109300008F3F910511F008F060C8ADA4BEA4CFA4B2 |
:10931000D8A8A0922009B0922109C0922209D09227 |
:109320002309C9A4DAA4EBA4FCA4C0921209D09228 |
:109330001309E0921409F0921509009195040C8B21 |
:10934000A0908404B0908504C501B7FE09C28827A7 |
:1093500099278A199B0904C21092C6041092C70467 |
:109360001092C8041092C9041092C2041092C3044F |
:109370001092C4041092C50410922D0910922E0967 |
:1093800010922F0910923009109234091092350969 |
:10939000109236091092370919A61AA61BA61CA608 |
:1093A00020E030E040E050E02DA73EA74FA758ABAB |
:1093B0008091B6049091B704A091B804B091B9041B |
:1093C0008093B2049093B304A093B404B093B50413 |
:1093D0008091AE049091AF04A091B004B091B1041B |
:1093E0008093AA049093AB04A093AC04B093AD0413 |
:1093F000109229041092280410927A041092790491 |
:1094000010927C0410927B043F85332311F00C945E |
:10941000DC414B8D442311F00C94DC410C94CF4182 |
:10942000B0902909B8A20C9437413FEF8E3F9307C3 |
:109430000CF073C002960C948E3FB90161507040DD |
:109440004091860450918704CA0157FF02C00C94D2 |
:109450001040959587959595879597FF02C00C9438 |
:10946000194020916104309162042817390714F0E3 |
:109470000C942540CA0157FF02C00C94F15397FF8A |
:1094800002C00C94EE5395958795959587958536F2 |
:10949000910514F40C94274084E690E0A091970481 |
:1094A000AA2311F00C942D409093620480936104E0 |
:1094B00070936404609363040C94354060933A099C |
:1094C0004091880450918904CA0157FD02C00C9450 |
:1094D000E13F0396959587959595879597FD02C0F1 |
:1094E0000C94E93F909581959F4F0C94E93F109221 |
:1094F00081040C941E3E10928104109297042A302D |
:1095000011F00C94DB3D289A0C94E03DBDE78B2EC6 |
:10951000912CA12CB12C0C949A3E1092850410929F |
:1095200084040C94923F982F0C94F04081E0809337 |
:1095300074040C94E54081E080937304582F0C94DC |
:10954000B84081E0809375040C948C4081E0809356 |
:1095500076040C945F4080914B07282F332727FD1A |
:1095600030958091BA08482F5527249FC001259F28 |
:10957000900D349F900D112420918804309189041E |
:10958000820F931F909389048093880480914C07E5 |
:10959000992787FD9095849FD001859FB00D949F5A |
:1095A000B00D1124CD012091860430918704820FE3 |
:1095B000931F909387048093860480914D07992789 |
:1095C00087FD90952091840430918504820F931F2C |
:1095D000909385048093840480914F07282F33272C |
:1095E00027FD30958091B8089927289FF001299F81 |
:1095F000F00D389FF00D1124F0938A03E093890356 |
:1096000080914E0799278017910714F00C94C43F5E |
:1096100090938304809382040C94C83F90937704C2 |
:10962000809378040C94014180918104882309F48B |
:1096300060CB80915F0490916004FFEF8F3F9F07A4 |
:1096400009F45BCB01969093600480935F0455CB43 |
:109650001092730450E00C94B840109275040C946E |
:109660008C40109274040C94E54061507E4F8F4FF3 |
:109670009F4F83CD60E070E06B01109295041C8ACF |
:10968000E0902D09F0902E0900912F0910913009DA |
:1096900060903409709035098090360990903709B0 |
:1096A00080913A09882309F031C710927C04109206 |
:1096B0007B0410927A0410927904E0924105F092B2 |
:1096C000420500934305109344056092450570924E |
:1096D000460580924705909248051092C604109264 |
:1096E000C7041092C8041092C9041092C2041092C8 |
:1096F000C3041092C4041092C5041092BE041092C8 |
:10970000BF041092C0041092C10410922D0910924F |
:109710002E0910922F0910923009109234091092DC |
:1097200035091092360910923709109220091092CB |
:109730002109109222091092230910921209109205 |
:10974000130910921409109215091092290410920D |
:109750002804A0908404B0908504C501B7FCF7CD1F |
:1097600040977CF068EE262E63E0362E3092A603FA |
:109770002092A5038091B30884FD03C081E080930B |
:109780002A05D090BC08ED2CFF2400271127B50135 |
:10979000882777FD8095982F9501B7FC0CC7442743 |
:1097A00037FD4095542F0E946A649B01AC01C801AB |
:1097B000B7010E946A6497FDF9C659E095958795AF |
:1097C000779567955A95D1F79B018D2D99278A9D9D |
:1097D000A0018B9D500D9A9D500D1124CA0157FD7B |
:1097E000E3C69595879595958795280F391FC901EB |
:1097F000AA2797FDA095BA2F809310059093110585 |
:10980000A0931205B09313052091A6043091A704EC |
:109810004091A8045091A904281B390B4A0B5B0BFB |
:10982000213563EC360760E0460760E056070CF42C |
:1098300064C680E593ECA0E0B0E08093A60490932A |
:10984000A704A093A804B093A9048091A6049091C2 |
:10985000A704A091A804B091A904805B9C43AF4FDA |
:10986000BF4F64F480EB9CE3AFEFBFEF8093A6049F |
:109870009093A704A093A804B093A90460909C04BB |
:1098800070909D046114710409F446C58091B30879 |
:1098900083FF42C589A19AA1ABA1BCA1B7FDADC709 |
:1098A00009E0B595A795979587950A95D1F798AF53 |
:1098B0008FAB97FDACC78D899E89AF89B88DB7FDF9 |
:1098C000A1C719E0B595A795979587951A95D1F7F2 |
:1098D000BC0197FDAEC7CFA8D8ACC616D70614F406 |
:1098E00078AF6FAB6FA978AD77FDA0C72B0155940A |
:1098F000479455944794559447940894411C511C9F |
:10990000ACE1EA2EA2E0FA2E6E0C7F1C7301002758 |
:10991000F7FC0095102F24EE3DEF620E731EA09011 |
:109920006F09B0907009C0907109D0907209809150 |
:10993000850390918603A0918703B0918803888B5B |
:10994000998BAA8BBB8BC601B501288939894A89B5 |
:109950005B890E94DE64E21AF30A040B150BC8014E |
:10996000B70128E631E040E050E00E94DE64DC010F |
:10997000CB018C01045B10408090680990906909CC |
:10998000C40197FC4EC78138910514F000E010E047 |
:109990002090A5033090A6032114310499F4AFA9B7 |
:1099A000B8AD59977CF48091930490919404800F02 |
:1099B000911F909394048093930480912A058823A7 |
:1099C00009F0EAC7C801880F991F880F991F880FEF |
:1099D000991FB2010E94A9649B01442737FD40955D |
:1099E000542F2A0D3B1D4C1D5D1D20936F09309394 |
:1099F00070094093710950937209F09096036F2D8E |
:109A00007727EFA9F8AD6E9FC0016F9F900D7E9FE5 |
:109A1000900D112497FD03C795958795959587958A |
:109A2000959587959595879595958795681B790B5D |
:109A300078AF6FAB77FDDAC62114310409F008C79F |
:109A40000091630410916404809161049091620418 |
:109A5000080F191F17FDE9C7159507951595079567 |
:109A600015950795005C1F4FCA01B90128893989EE |
:109A70004A895B890E94DE64DA01C90120919A0457 |
:109A800030919B04442737FD4095542F821B930B44 |
:109A9000A40BB50B845E9D4FAF4FBF4FBC01CD01F2 |
:109AA00028E631E040E050E00E94DE64DC01CB01BA |
:109AB000845B9040CFA8D8AC8C9D50018D9DB00C9C |
:109AC0009C9DB00C1124C501B8010E94A96483E0DB |
:109AD000F89E8001112418AF0FAB061717070CF082 |
:109AE000BFC6B801CB01AA2797FDA095BA2F209138 |
:109AF000A6043091A7044091A8045091A904820FB4 |
:109B0000931FA41FB51F8093A6049093A704A0934E |
:109B1000A804B093A9048091290581508F3F09F4CE |
:109B200004C4809329051C89112381F010920C052F |
:109B300010920D0510920E0510920F051092080557 |
:109B40001092090510920A0510920B052F85222309 |
:109B500009F0C4C480913A099927AA27BB27BC0100 |
:109B6000CD0129A13AA14BA15CA10E946A64DC014C |
:109B7000CB01BC01CD0128EF3AE240E050E00E9469 |
:109B8000DE6429013B8D332309F0A5C480913A0995 |
:109B90009927AA27BB27BC01CD012D893E894F8972 |
:109BA000588D0E946A64DC01CB01BC01CD0128EF15 |
:109BB0003AE240E050E00E94DE641901A0900C09F6 |
:109BC000B0900D0949ECA416B1040CF479C4E8EC8A |
:109BD000AE2EB12CB0920D09A0920C09009117097C |
:109BE00010911809093C11050CF462C408EC10E04E |
:109BF00010931809009317098091190990911A0977 |
:109C0000AA2797FDA095BA2F20916D09C22EDD24B9 |
:109C1000EE24FF24BC01CD01A70196010E946A64D5 |
:109C20009B01AC01C501AA2797FDA095BA2F67E05B |
:109C3000880F991FAA1FBB1F6A95D1F7280F391FDC |
:109C40004A1F5B1F57FD70C486E0559547953795B1 |
:109C500027958A95D1F7C201820F931F98AF8FABDA |
:109C60003C0180910A0990910B09AA2797FDA095C4 |
:109C7000BA2FBC01CD01A70196010E946A649B0125 |
:109C8000AC01C801AA2797FDA095BA2F07E0880F5D |
:109C9000991FAA1FBB1F0A95D1F7280F391F4A1F0A |
:109CA0005B1F57FD3CC416E05595479537952795A2 |
:109CB0001A95D1F75101A20EB31E6501880C991CAB |
:109CC000C401AA2797FDA095BA2F20911109332727 |
:109CD00044275527BC01CD010E946A647B018C0199 |
:109CE00097FD40C4B6E015950795F794E794BA95AB |
:109CF000D1F738A1832F9927AA27BB272091BA042F |
:109D00003091BB044091BC045091BD04BC01CD0115 |
:109D10000E946A64DC01CB01BC01CD0120EF35E576 |
:109D200040E050E00E94DE644701820E931EA401D1 |
:109D300094018FA998AD815090442CF0E0E0F0E4BC |
:109D4000F8AFEFAB3F01F0E06F16F0EC7F060CF0E0 |
:109D5000A8C380E090EC90931A098093190901E060 |
:109D6000C01600E4D00624F0A12CA0E4BA2E6501B0 |
:109D700010E0C11610ECD1060CF08EC380E090EC20 |
:109D800090930B0980930A09415050441CF020E045 |
:109D900030E4490180E0881680EC98060CF077C327 |
:109DA00080E090EC90936909809368098091550454 |
:109DB0008823C1F080915F04909160040297C0975E |
:109DC00088F4A981BA811A161B0664F481E090E038 |
:109DD0009093600480935F0480911E09E82FFF2711 |
:109DE000FA83E983A980BA80AA0CBB1CAA0CBB1C0D |
:109DF000BA82A9820E94CE5EA81AB90ABA82A98242 |
:109E0000A09067098A2D9927880F991F880F991F9D |
:109E100080559040C980DA808C159D0514F49A8392 |
:109E20008983E980FA80F092FC07E092FB07809139 |
:109E3000100590911105A0911205B0911305880F9E |
:109E4000991FAA1FBB1F880F991FAA1FBB1F009134 |
:109E5000680910916909081B190B1EAB0DAB97011E |
:109E6000213A31050CF42CC2C701F7FCBEC395950D |
:109E700087954DA95EA98417950714F49EAB8DAB09 |
:109E8000909581959F4FADA9BEA9A817B9070CF46D |
:109E900028C22A2D3327220F331F220F331FC90157 |
:109EA000A981BA818A1B9B0BEDA9FEA98E179F077A |
:109EB00014F49EAB8DAB69817A81621B730BCDA8C4 |
:109EC000DEA8C616D70614F47EAB6DAB0091190957 |
:109ED00010911A098091880490918904081B190B2C |
:109EE00010932B0900932A0990903A09992009F4BC |
:109EF000F8C2481A590AC201AA2797FDA095BA2F9D |
:109F0000209108053091090540910A0550910B05F3 |
:109F1000820F931FA41FB51F809308059093090516 |
:109F2000A0930A05B0930B0560910805709109058F |
:109F300080910A0590910B0561302AEF720720E0AD |
:109F4000820720E0920774F080E09AEFA0E0B0E092 |
:109F50008093080590930905A0930A05B0930B051B |
:109F6000BC01CD01603036E073073FEF83073FEF60 |
:109F7000930774F480E096E0AFEFBFEF809308059D |
:109F800090930905A0930A05B0930B05BC01CD0180 |
:109F9000E0909B03F0909C039701442737FD409588 |
:109FA000542F0E94DE646801C20ED31EB0908B0352 |
:109FB0006B2D7727882799272DA93EA937FDF0C259 |
:109FC00037FDD9C23595279549815A81240F351F10 |
:109FD000442737FD4095542F0E946A6497FDDBC2E9 |
:109FE00026E095958795779567952A95D1F79B01FA |
:109FF0006C157D050CF46B0166277727621B730BCC |
:10A00000C616D7060CF46B0100910A0910910B09D2 |
:10A010008091860490918704081B190B10930909FD |
:10A0200000930809992009F462C2281A390AC1016B |
:10A03000AA2797FDA095BA2F20910C0530910D0508 |
:10A0400040910E0550910F05820F931FA41FB51F5D |
:10A0500080930C0590930D05A0930E05B0930F050A |
:10A0600060910C0570910D0580910E0590910F0582 |
:10A0700061305AEF750750E0850750E0950774F09E |
:10A0800080E09AEFA0E0B0E080930C0590930D057E |
:10A09000A0930E05B0930F05BC01CD016030A6E082 |
:10A0A0007A07AFEF8A07AFEF9A0774F480E096E083 |
:10A0B000AFEFBFEF80930C0590930D05A0930E05B5 |
:10A0C000B0930F05BC01CD019701442737FD4095A2 |
:10A0D000542F0E94DE647801E20EF31E6B2D772769 |
:10A0E000882799272DA93EA937FD38C237FD21C2FF |
:10A0F00035952795E981FA812E0F3F1F442737FDBB |
:10A100004095542F0E946A6497FD23C216E09595EE |
:10A110008795779567951A95D1F79B016E157F0501 |
:10A120000CF47B0166277727621B730BE616F70694 |
:10A130000CF47B018601222717FD2095322F0B8717 |
:10A140001C872D873E8780911E09282F33273AAB25 |
:10A1500029AB4A2D55275CAB4BABBAE5CB2EB9E00A |
:10A16000DB2E0BE915E02701662457FC6094762C62 |
:10A170008DA99EA94C01AA2497FCA094BA2CABE00F |
:10A180003A2EFBE3EF2EF9E0FF2E06C0F8AFEFAB5F |
:10A19000EFA9D601EC93E6C5F801258512160CF05F |
:10A1A000A3C049815A81CA01AA2797FDA095BA2F59 |
:10A1B000332727FD3095432F532FBC01CD010E943B |
:10A1C0006A6497FDA2C0E6E09595879577956795B7 |
:10A1D000EA95D1F778AF6FABF8018685282F332742 |
:10A1E00027FD3095432F532F6B857C858D859E856C |
:10A1F0000E946A6497FD84C056E09595879577958F |
:10A2000067955A95D1F72FA938AD260F371F38AF6C |
:10A210002FABF8018785282F332727FD3095432F53 |
:10A22000532FC301B2010E946A6497FD64C046E0E7 |
:10A2300095958795779567954A95D1F72FA938AD6C |
:10A24000260F371F38AF2FABF8018089282F33270F |
:10A2500027FD3095432F532FC501B4010E946A6436 |
:10A26000DC01CB01B7FD43C036E0B595A7959795C6 |
:10A2700087953A95D1F7F701608171812FA938ADA3 |
:10A28000820F931F0E947D2BD7018D939C9397FD86 |
:10A2900041C0959587959595879598AF8FABE9A91E |
:10A2A000FAA98E179F070CF471CF2BA93CA94FA9CF |
:10A2B00058AD241735070CF06BCF38AF2FAB68CFF4 |
:10A2C000EDA9FEA9E135F10524F000E510E01EAB93 |
:10A2D0000DAB2DA93EA9205B3F4F0CF0DACD80EBF2 |
:10A2E0009FEF9EAB8DABD5CDD6011C923BC5CF96D3 |
:10A2F000A11DB11DB9CF615C7F4F8F4F9F4F97CF8D |
:10A30000615C7F4F8F4F9F4F77CF615C7F4F8F4F47 |
:10A310009F4F59CF0396BDCF8090680990906909EF |
:10A3200080912905815008F0FCCB88E180932905B4 |
:10A330008091BF089927880F991F880F991F7C016A |
:10A340000027F7FC0095102F69A17AA18BA19CA191 |
:10A35000A80197010E94DE643093EE072093ED0779 |
:10A360006D897E898F89988DA80197010E94DE648E |
:10A370003093F0072093EF07809157099091580987 |
:10A3800097FD22C295958795959587959093F207AD |
:10A390008093F107809173099091740997FD12C21F |
:10A3A00095958795959587959093F4078093F307F6 |
:10A3B0009092F6078092F50780917F049091800437 |
:10A3C0009093F8078093F7078091310890913208B5 |
:10A3D0009093FA078093F9077092FE076092FD0749 |
:10A3E0008091260390912703909300088093FF07A4 |
:10A3F00080916F0990917009A0917109B0917209D3 |
:10A400002091850330918603409187035091880302 |
:10A41000BC01CD010E94DE64309304082093030840 |
:10A4200080918A0499279093020880930108809173 |
:10A43000460799279093140880931308809111047C |
:10A440009091120490931608809315088091D90971 |
:10A45000992787FD909590932408809323088091F5 |
:10A46000DB099927909328088093270880915F053E |
:10A470009091600590932A088093290880915D054A |
:10A4800090915E0590932C0880932B084CCB3093D1 |
:10A490006909209368098ACCB0920B09A0920A0935 |
:10A4A00073CCEFA8F8ACF0921A09E092190957CCD6 |
:10A4B0006FEF083316070CF09FCB08E31FEF98CB24 |
:10A4C00058E3A5165FEFB5060CF088CB78E3A72E0E |
:10A4D0007FEFB72E7FCB2224332470CB4424552426 |
:10A4E00051CBC801AA2797FDA095BA2F09CDC80165 |
:10A4F000AA2797FDA095BA2F9FCD2093A60430934D |
:10A50000A7044093A8045093A9049FC9D0927C0447 |
:10A51000C0927B0470937A0460937904CEC8215C66 |
:10A520003F4F4F4F5F4FBFCB215C3F4F4F4F5F4F70 |
:10A530008BCB2F5F3F4F35952795E981FA812E0F01 |
:10A540003F1F442737FD4095542F0E946A6497FFB0 |
:10A55000DDCD615C7F4F8F4F9F4FD8CD30952195DA |
:10A560003F4FC4CD2FE330E040E050E0E20EF31E59 |
:10A57000041F151FB7CB2F5F3F4F35952795498196 |
:10A580005A81240F351F442737FD4095542F0E94D0 |
:10A590006A6497FF25CD615C7F4F8F4F9F4F20CD21 |
:10A5A000309521953F4F0CCD03961BC961507E4FCE |
:10A5B0008F4F9F4F02C9222733272A193B09EFC823 |
:10A5C00080915E04826080935E040C9498461092A1 |
:10A5D0008304109282040C94D03F2D5F3F4F0C9463 |
:10A5E000603F2D5F3F4F0C942B3F019640CC8091F4 |
:10A5F000BF08E82EFF240027112769A17AA18BA1AB |
:10A600009CA1A80197010E94DE6439014A01809152 |
:10A61000570990915809AA2797FDA095BA2F681A53 |
:10A62000790A8A0A9B0A6D897E898F89988DA8018B |
:10A6300097010E94DE6459016A018091730990912B |
:10A640007409AA2797FDA095BA2FA81AB90ACA0AB1 |
:10A65000DB0AD401C30197FCEFC13C014D0154E07A |
:10A6600095948794779467945A95D1F7D601C5014C |
:10A67000D7FCDEC15C016D0144E0D594C794B7946A |
:10A68000A7944A95D1F78091630490916404813432 |
:10A6900091050CF4F0C0C401B30123E030E040E0C8 |
:10A6A00050E00E94DE6439014A01C601B50123E091 |
:10A6B00030E040E050E00E94DE6459016A01809180 |
:10A6C000AE08E82FFF27EE0FFF1FE758F74F8081F6 |
:10A6D00091810190F081E02DF7FDA3C17A97A4F05C |
:10A6E000C401B30123E030E040E050E00E94DE64AA |
:10A6F00039014A01C601B50123E030E040E050E0F5 |
:10A700000E94DE6459016A0181E2681671048104C5 |
:10A7100091042CF030E2632E712C812C912C90EE60 |
:10A7200069169FEF79069FEF89069FEF990644F41B |
:10A7300020EE622E2FEF722E2FEF822E2FEF922E11 |
:10A74000A1E2AA16B104C104D1042CF090E2A92E12 |
:10A75000B12CC12CD12CB0EEAB16BFEFBB06BFEFB6 |
:10A76000CB06BFEFDB0614F00C94544980EEA82E04 |
:10A770008FEFB82E8FEFC82E8FEFD82E0C94544940 |
:10A7800010922705ED2DFF27EE0FFF1FE758F74F1B |
:10A79000808191818C3491058CF0809128058F5FA8 |
:10A7A000893C08F41BC11092810488EC8093280531 |
:10A7B0001092600410925F040C941E3E10922805C3 |
:10A7C0000C941E3E0396ECCD0396DCCD03960C94C0 |
:10A7D000FB3F909581959F4F0C94F73F03960C9407 |
:10A7E000434A909581959F4F0C943F4A84EF91E0A6 |
:10A7F0009093A6038093A5038EC981509E4FAF4FBF |
:10A80000BF4F4EC881509E4FAF4FBF4F5AC85C01DB |
:10A81000B094A194B108B394B8AEAFAA4CC84F9607 |
:10A82000FBC88827992788199909ADC8695F7F4FA8 |
:10A830005DC8709561957F4F4EC8F095E195FF4FCB |
:10A840000C94104961507E4F8F4F9F4F0C94D0480D |
:10A850000894210831083092A6032092A5035BC911 |
:10A860008FA998AD909581959F4F681779070CF047 |
:10A8700039C9BC0137C98091610490916204813467 |
:10A8800091050CF41CCF07CF80819181855B9F4F90 |
:10A890000CF0DAC0809126058F5F80932605893CF5 |
:10A8A00010F40C948F472C3008F0C3C12998A4E011 |
:10A8B000B0E08FEF082E0E9406651092810410927E |
:10A8C00026051092600410925F040E94CF36A4E027 |
:10A8D000B0E08091E4049091E50497FD22C2892FB5 |
:10A8E000990F990B082E0E940665A5E0B0E08091B3 |
:10A8F000E4049091E504082E0E940665A6E0B0E00D |
:10A900008091E2049091E30497FD08C2892F990F8A |
:10A91000990B082E0E940665A7E0B0E08091E20442 |
:10A920009091E304082E0E94066508E010E08091F3 |
:10A93000DC049091DD04A091DE04B091DF04BC0141 |
:10A94000CD010E94D363DC01CB019C0197FDB6C110 |
:10A95000832F992787FD9A95D801082E0E940665B6 |
:10A9600009E010E08091DC049091DD04A091DE0408 |
:10A97000B091DF04BC01CD010E94D363DC01CB01A7 |
:10A98000D801082E0E9406650E9430040E94932B75 |
:10A990003091AD080C948F4788EC90E090931604AA |
:10A9A00080931504C301AA2797FDA095BA2FBC0177 |
:10A9B000CD01288939894A895B890E946A645B01D3 |
:10A9C0006C010E94DE6430939B0420939A041092E1 |
:10A9D0002A050C94E24C80932705D4CE8093280559 |
:10A9E0000C941E3E0196A11DB11D0C94F9480196D0 |
:10A9F000A11DB11D0C94ED4881E080932A051092B1 |
:10AA00001005109211051092120510921305109264 |
:10AA1000A6041092A7041092A8041092A9040C9402 |
:10AA20009846F095E195FF4F59CE095F1F4F14C826 |
:10AA30000F96A11DB11D1ECE0F96A11DB11D0DCEED |
:10AA4000809326050C948F47409326050C948F47DE |
:10AA5000B0923C05A0923B052091D909298F0C9416 |
:10AA6000C64310923D050C942C44109240050C9462 |
:10AA7000054620932F0530933005409331055093C0 |
:10AA8000320510923F050C94934520922B0530928D |
:10AA90002C0540922D0550922E0510923E050C94E7 |
:10AAA0009D440E9430044DE56BEA78E00E94DA0391 |
:10AAB0008091B30880FF10C080911C0390911D030A |
:10AAC000875B934038F480911C0390911D038E5E48 |
:10AAD000924010F40E94FF180E94CF360E94D303C8 |
:10AAE00053CF70937A0460937904D0927C04C0921F |
:10AAF0007B04CB0177FD04C1BC0175956795C60148 |
:10AB0000D7FCFCC06C01D594C7940C94E4425091DE |
:10AB1000AC080C94F246299A0C94C64620932F0553 |
:10AB200030933005409331055093320510923C0527 |
:10AB300010923B05E8EE2E2EE3E03E2E3092A60367 |
:10AB40002092A5030C94054660922B0570922C056B |
:10AB500080922D0590922E0510923C0510923B0597 |
:10AB600088EE282E83E0382E3092A6032092A5038B |
:10AB70000C949D44B095A095909581959F4FAF4FB3 |
:10AB8000BF4F0C94944320922B0530922C05409299 |
:10AB90002D0550922E0581E080933E050C949D4436 |
:10ABA00081509F4FAF4FBF4F0C943B4281509F4FFE |
:10ABB000AF4FBF4F0C94214281509F4FAF4FBF4FBB |
:10ABC0000C94B64281509F4FAF4FBF4F0C94A94297 |
:10ABD00061507F4F8F4F9F4F0C94794261507F4F50 |
:10ABE0008F4F9F4F0C94634281E0809340050C94FB |
:10ABF000054620932F05309330054093310550933F |
:10AC0000320581E080933F050C94934581E0809369 |
:10AC10003D050C942C44B095A095909581959F4F3F |
:10AC2000AF4FBF4F0C94F644F095E195FF4F0C9455 |
:10AC30007147299A3CCE20932F05309330054093DD |
:10AC40003105509332050C94ED4520932F05309338 |
:10AC5000300540933105509332050C947B4581506B |
:10AC60009F4FAF4FBF4F0C948745295F3F4F4F4FCA |
:10AC70005F4F0C945E4581509E4FAF4FBF4F0C9479 |
:10AC8000494521503E4F4F4F5F4F0C94B745B0950B |
:10AC9000A095909581959F4FAF4FBF4F0C94B145B4 |
:10ACA000B095A095909581959F4FAF4FBF4F0C9455 |
:10ACB0004A44F095E195FF4F0C94DC4221503F4F00 |
:10ACC00047CE295F3F4F4F4F5F4F0C94D045815087 |
:10ACD0009F4FAF4FBF4F0C94914481509F4FAF4F48 |
:10ACE000BF4F0C94244481509F4FAF4FBF4F0C94E3 |
:10ACF000F945F095E195FF4F0C94EE46019602CF91 |
:10AD00000196FACE295F3F4F4F4F5F4F0C94694435 |
:10AD100021503E4F4F4F5F4F0C94504481509F4FF6 |
:10AD2000F5CD81509F4FDBCDB095A0959095819545 |
:10AD30009F4FAF4FBF4F0C944545B095A095909550 |
:10AD400081959F4FAF4FBF4F0C94E343295F3F4F17 |
:10AD50004F4F5F4F0C94024421503E4F4F4F5F4F77 |
:10AD60000C94E9433A94E2E0F0E0EE0EFF1E0C5F33 |
:10AD70001F4F0894C11CD11C37FE0ECAEA960FB6AD |
:10AD8000F894DEBF0FBECDBFDF91CF911F910F9121 |
:10AD9000FF90EF90DF90CF90BF90AF909F908F90FB |
:10ADA0007F906F905F904F903F902F90089580918B |
:10ADB000550590915605A0915705B091580580937F |
:10ADC0004D0590934E05A0934F05B093500580918B |
:10ADD000510590915205A0915305B091540580936F |
:10ADE000490590934A05A0934B05B0934C050895EF |
:10ADF0001092600510925F0510925E0510925D053D |
:10AE0000089584B1806A84B93D9A82E58CBD1DBCE9 |
:10AE1000459A91E0909379098AEA80937D0983E8C5 |
:10AE200080937E098AE080937F09109281091092B5 |
:10AE3000800910928309109282091092DB09109206 |
:10AE40009F099093A0098CE08093A1091092A20918 |
:10AE500086E08093A3090895EF92FF920F931F93CA |
:10AE6000F8948091BF089927880F991F880F991F20 |
:10AE70007C010027F7FC0095102F8091D60490915B |
:10AE8000D704A091D804B091D904BC01CD01A80188 |
:10AE900097010E94DE64309381092093800980919C |
:10AEA000CE049091CF04A091D004B091D104BC0104 |
:10AEB000CD01A80197010E94DE643093830920939D |
:10AEC000820920916F093091700940917109509168 |
:10AED0007209DA01C90173E0880F991FAA1FBB1F0D |
:10AEE0007A95D1F7820F931FA41FB51F820F931F6E |
:10AEF000A41FB51F209185033091860340918703DD |
:10AF000050918803BC01CD010E94DE643093890911 |
:10AF100020938809E091E004F091E10480913109E7 |
:10AF200090913209BF010E94A964CB019B01220FBD |
:10AF3000331F220F331F280F391F280F391F37FDEA |
:10AF4000F2C035952795359527953093850920933F |
:10AF5000840980916B0990916C09BF010E94A964DA |
:10AF60009B01220F331F220F331F260F371F260F7F |
:10AF7000371F37FDD5C035952795359527953093E3 |
:10AF80008709209386091092E1041092E004109240 |
:10AF900032091092310910926C0910926B0980915C |
:10AFA0007F0999278C30910509F48AC08D3091056D |
:10AFB0000CF06AC08A30910509F433C10B9709F48B |
:10AFC000B5C0789480919F09882309F4A0C020918E |
:10AFD000A5093091A609C90181509E4F8F5F93400A |
:10AFE000C8F44091A7095091A809CA0181509E4F09 |
:10AFF0008F5F934078F48091B30885FF0BC0309346 |
:10B00000600520935F0550935E0540935D058AEFD0 |
:10B01000809362058091AB099091AC0921E089365B |
:10B0200092070CF0E8C09C0190939D0480939C04CF |
:10B0300080919A0490919B04281B390BC901845E6E |
:10B040009D4F68E671E00E94A964845B90409093F4 |
:10B050009904809398042091AF093091B0098091B0 |
:10B060001504909116048217930740F480914607C7 |
:10B07000882321F430931604209315048091A409A9 |
:10B08000873609F055C1BCC08D30910509F404C163 |
:10B090000E9709F096CF8091A00980939009809136 |
:10B0A000A109809391098091A209809392098091CE |
:10B0B000A30980939309809101018093940981CF22 |
:10B0C00080914607863018F01092460785E08093FD |
:10B0D000900980917F0490918004909393098093CC |
:10B0E00092098091F408809391098091EA088093F5 |
:10B0F00094098091EB08809395098091EC088093E6 |
:10B100009609789480919F09882309F060CF109266 |
:10B11000600510925F0510925E0510925D0508C1F2 |
:10B120002D5F3F4F28CF2D5F3F4F0BCF8091AD0854 |
:10B13000E82FFF27EE0FFF1FE758F74F0190F08130 |
:10B14000E02DE038F1050CF0D8C02FEFE138F20720 |
:10B1500014F4E1E8FFEFE09390098091AE08E82F46 |
:10B16000FF27EE0FFF1FE758F74F0190F081E02D0A |
:10B17000E038F1050CF4D4C0EFE7F0E0E09391097A |
:10B180008091AC08E82FFF27EE0FFF1FE758F74F1D |
:10B190000190F081E02DE038F1050CF4B9C0EFE743 |
:10B1A000F0E0E09392098091AB08E82FFF27EE0FC3 |
:10B1B000FF1FE758F74F0190F081E02DE038F105CF |
:10B1C0000CF49EC0EFE7F0E0E093930980919104C6 |
:10B1D0008093940980918F048093950980918D04C8 |
:10B1E0008093960980918B048093970980918A04BB |
:10B1F00080939809E6CE20919C0430919D0418CF4D |
:10B200008091B1098093D8098091B2098093DA09BD |
:10B210008091B3098093D9098091B4098093DB09A7 |
:10B2200087C080917204809390098091710480930B |
:10B230009109809170048093920980916F048093AA |
:10B24000930980916E048093940980916D0480939A |
:10B25000950980916C048093960980916B0480938A |
:10B26000970980915E048093980980915E04837FA2 |
:10B2700080935E048091260390912703809399091F |
:10B280008091C40880939A09A2E0B0E00E94F9641A |
:10B29000802D80939B0995CE8091E508809390093D |
:10B2A0008091E608809391098091E7088093920944 |
:10B2B0008091E808809393098091E908809394092C |
:10B2C0008091ED08809395098091EE08809396090E |
:10B2D0008091EF08809397098091F20880939809F4 |
:10B2E0008091F008809399098091F10880939A09E0 |
:10B2F0008091F30880939B0964CEEFE7F0E02BCFB9 |
:10B300008FEFE138F8070CF05FCFE1E8FFEF5CCF9B |
:10B310006FEFE138F6070CF044CFE1E8FFEF41CFE3 |
:10B320004FEFE138F4070CF029CFE1E8FFEF26CF2B |
:10B330001F910F91FF90EF900895809179098823D4 |
:10B3400009F43BC045988DE799E090937B09809381 |
:10B350007A0980916105E82FFF27EE53FC4F982F63 |
:10B360009F5F808180937F09963008F027C090937B |
:10B370006105109279090E942C5781E080937C0925 |
:10B3800000000000000000000000000000000000BD |
:10B3900000000000000000000000000000000000AD |
:10B3A000000000000000000000000000000000009D |
:10B3B00080917D0980939C098EBD0895109261054E |
:10B3C000D8CF20917909222309F045C00DB407FE9A |
:10B3D00042C084E080931404459A3EB58091630591 |
:10B3E00099278130910509F437C0823091050CF41A |
:10B3F00051C0029709F439C020917C09203208F02D |
:10B4000030C045980000000000000000000000006F |
:10B41000000000000000000000000000000000002C |
:10B42000000000000000000000000000000000001C |
:10B4300000000000E0917A09F0917B09E20FF11D14 |
:10B4400080818EBD80919C099081890F80939C0999 |
:10B450002F5F20937C090895353551F120936305C2 |
:10B46000CBCF81E080937909F3CF80919E09E82FBB |
:10B47000FF27E254F64F30838F5F80939E098A3115 |
:10B4800000F180916405381711F120939F09109203 |
:10B490006305B2CF892B09F0AFCF20939E0930937B |
:10B4A0006405313809F0A8CF81E080936305A4CF0B |
:10B4B00080916405830F8093640582E08093630527 |
:10B4C0009BCF80916405830F8093640595CF8AE1BB |
:10B4D000EEEBF9E0A4EAB9E001900D928A95E1F76C |
:10B4E00081E080939F091092630586CF20E030E0D1 |
:10B4F000882321F080916505882381F48091DF08FD |
:10B5000099278071907095958795959587959595D4 |
:10B5100087952817390791F0429A089521E030E085 |
:10B520008091DF0899278071907095958795959502 |
:10B530008795959587952817390771F7429808954B |
:10B5400020E030E0882321F080916505882391F484 |
:10B550008091DF08992780729070959587959595D1 |
:10B56000879595958795959587952817390729F09B |
:10B57000439A089521E030E0EBCF4398089587B1D6 |
:10B580008C6087B9109266051092650580E00E9474 |
:10B59000765A80E00E94A05A10926C0580E8809351 |
:10B5A000C903109269058093C803089580916D05C1 |
:10B5B00081508F3FB9F180936D0530916A0540E06D |
:10B5C000332389F090916D0580916B05981740F1B8 |
:10B5D0008091C408282F3327809126039091270358 |
:10B5E00082179307ECF0842F0E94765A40E08091F6 |
:10B5F0006705882309F411C190916D058091680554 |
:10B60000981760F08091C408282F33278091260373 |
:10B6100090912703821793070CF0FFC041E0FDC013 |
:10B6200041E0E1CF89E080936D052091DF08822F12 |
:10B63000992781FD30C080FFBFC030918104332342 |
:10B6400071F58091AD08E82FFF27EE0FFF1FE75837 |
:10B65000F74F808191818C5A9F4F0CF180819181AD |
:10B6600085359105E4F48091AE08E82FFF27EE0FB1 |
:10B67000FF1FE758F74F80819181855B9F4F1CF436 |
:10B6800081E080936605808191818C3491053CF046 |
:10B690003093660504C08091810480936605E09133 |
:10B6A0006605422F5527BA016470707042FF19C0B9 |
:10B6B0008091C408282F3327809126039091270377 |
:10B6C0008217930774F443FD79C0E0936505809178 |
:10B6D0006D056F5F7F4F99270E94A96460936D0588 |
:10B6E00002C0E09365059091E2089B3F08F43FC0DB |
:10B6F00080913309873ED8F19091E108392F307855 |
:10B7000030936A058091C903892329F08091280923 |
:10B7100067E10E94896480936B059091E4089B3FE8 |
:10B72000B8F080916609873E98F09091E308892FE0 |
:10B730008078809367052091C803892F822329F0A0 |
:10B7400080912C0967E10E9489648093680537CF56 |
:10B750009B3FE0F0809166098A30C0F480E09091D0 |
:10B76000E30897FDE6CF81E080936705E4CF9B3F38 |
:10B77000B8F0809133098A3098F480E09091E10824 |
:10B7800097FF81E0382F30936A05BCCF809169051F |
:10B7900081508F3FB9F0809369059091E308CBCF3A |
:10B7A00080916C0581508F3F09F180936C059091D9 |
:10B7B000E10830916A05A6CF81E06FCF81E08093E8 |
:10B7C000650585CF809166098150809369058091D8 |
:10B7D000C8038130F1F08695282F8093C80390919B |
:10B7E000E308892F822380936705A7CF80913309CF |
:10B7F000815080936C058091C903813061F08695FA |
:10B800008093C9039091E108392F382330936A055A |
:10B810007BCF80E8E1CF80E8F3CF842F0E94A05A4D |
:10B8200008958091C9008F778093C9008091C900E5 |
:10B830008F7B8093C9008091C9008F7D8093C90060 |
:10B840005A9A52981092CD0084E190E08093CC00F7 |
:10B850008091C80082608093C80080E18093C90015 |
:10B860008091CA008F778093CA008091CA008F7B35 |
:10B870008093CA008091CA008F7D8093CA00809116 |
:10B88000CA008F7E8093CA008091CA00877F809310 |
:10B89000CA008091C9008B7F8093C9008091CA0043 |
:10B8A00084608093CA008091CA0082608093CA003D |
:10B8B0008091C80087FF0CC08091CE008091C800A5 |
:10B8C000882334F48091CE008091C8008823A4F3AB |
:10B8D0008091C90080688093C90008951F93CF9319 |
:10B8E000DF9380E197E20E94B114EC0110E08091B7 |
:10B8F000C9008F778093C9008091C9008F7E8093A3 |
:10B90000C9005A9884E297E09F938F931F930E94F7 |
:10B9100039110F900F900F90CE010E94BA14882316 |
:10B9200009F066C04A9BF8CF8AE590E00E94B11406 |
:10B93000EC018AE597E09F938F931F920E94391143 |
:10B94000529A0F900F900F90CE010E94BA14882344 |
:10B95000D9F383E690E05A9A019797FFFCCF8FE8DE |
:10B9600091E05A98019797FFFCCF89E090E05A9AAE |
:10B97000019797FFFCCF89E090E05A98019797FFD5 |
:10B98000FCCF8FE891E05A9A019797FFFCCF8FE8A0 |
:10B9900091E05A98019797FFFCCF89E090E05A9A7E |
:10B9A000019797FFFCCF89E090E05A98019797FFA5 |
:10B9B000FCCF8FE891E05A9A019797FFFCCF8FE870 |
:10B9C00091E05A98019797FFFCCF89E090E05A9A4E |
:10B9D000019797FFFCCF89E090E05A98019797FF75 |
:10B9E000FCCF8FE891E05A9A019797FFFCCF0AC0ED |
:10B9F00080E697E09F938F931F930E9439110F90D9 |
:10BA00000F900F9052985A980E94115CDF91CF913D |
:10BA10001F9108951F920F920FB60F921124EF926B |
:10BA2000FF920F931F932F933F934F935F936F93C7 |
:10BA30007F938F939F93AF93BF93CF93DF93EF93B6 |
:10BA4000FF930091CE008091CA039091CB030197A0 |
:10BA500009F45EC080917605909177050E94BA1432 |
:10BA6000482F552760916E0570916F05611571051E |
:10BA7000E9F16130710509F4EAC06230710509F439 |
:10BA8000EDC06330710509F45CC081E090E09093F3 |
:10BA9000CB038093CA031092710510927005109227 |
:10BAA000750510927405809170059091710540970D |
:10BAB000A0F08091740590917505892B11F4109276 |
:10BAC0008303109271051092700510927505109203 |
:10BAD000740510926F0510926E0587E090E00E9449 |
:10BAE000B1149093770580937605FDC0452BD9F26C |
:10BAF00081E090E090936F0580936E0580917005D2 |
:10BB00009091710501969093710580937005CBCF4C |
:10BB10001092CB031092CA0387E090E00E94B11408 |
:10BB200090937705809376051092710510927005B9 |
:10BB300010926F0510926E051092730510927205A7 |
:10BB4000D2C0452B09F0A1CF82E090E090936F0521 |
:10BB500080936E0580917005909171050196909388 |
:10BB60007105809370058091720590917305FC01B9 |
:10BB7000F695E795F695E795EF70F0703196982F6A |
:10BB80008827202F3327822B932B9370805092404D |
:10BB90000E94A964EB30F10508F085CF7F01EE0E1D |
:10BBA000FF1EF701E758F74F808191819B01281B09 |
:10BBB000390BC90137FD90C0069754F480918A046F |
:10BBC000883C08F087C080918A04865F80938A044D |
:10BBD000F701E758F74F808191819C01220F331FB5 |
:10BBE000280F391F260F371F37FD7AC0E901D59579 |
:10BBF000C795D595C795CB0101968C179D070CF07D |
:10BC00005CC0219780918A04843B08F450C087016E |
:10BC10000157174FF701E758F74F80819181FE01D7 |
:10BC2000E81BF90BCF0163E070E00E94A964CB012F |
:10BC3000880F991F860F971FF8019183808329E74A |
:10BC400038E0E20EF31EF701D183C0832CCF4115FB |
:10BC5000510509F012CF82E090E04CCF411551051B |
:10BC600009F00FCF802F9927909373058093720569 |
:10BC700020917005309171052230310569F083E023 |
:10BC800090E090936F0580936E052F5F3F4F309348 |
:10BC900071052093700507CF8091720587FF15C04D |
:10BCA00081E090E09093750580937405E8CFF701EB |
:10BCB000E157F74F11821082C2CF61507040C61712 |
:10BCC000D7070CF09FCF21969DCF509375054093D9 |
:10BCD0007405D5CF88EC7ACF909581959F4F6CCF26 |
:10BCE0002D5F3F4F83CFFF91EF91DF91CF91BF91B8 |
:10BCF000AF919F918F917F916F915F914F913F9104 |
:10BD00002F911F910F91FF90EF900F900FBE0F900A |
:10BD10001F9018951092820584EF91E0909316047D |
:10BD20008093150408950E948A5E089580917F048F |
:10BD30009091800490937B0580937A0580919E0476 |
:10BD400090919F04A091A004B091A104B7FF04C0FA |
:10BD500081589F4FAF4FBF4F27E0B595A795979557 |
:10BD600087952A95D1F79093810580938005089552 |
:10BD700081E08093820510927D0510927C051092DF |
:10BD80007F0510927E05109279051092780584EF58 |
:10BD900091E090931604809315040895EF92FF921A |
:10BDA0000F931F93CF93DF9300E010E08091820503 |
:10BDB000882309F4B0C080919704882309F0ABC0B0 |
:10BDC000E0907F04F090800480917A0590917B054B |
:10BDD000E81AF90A8091980399278E9DB0018F9DEA |
:10BDE000700D9E9D700D112477FD7AC08B01159505 |
:10BDF00007951595079580912A0490912B0497FD3E |
:10BE00007EC095958795080F191FC0919E04D0910B |
:10BE10009F04E091A004F091A104F7FD77C057E0E2 |
:10BE2000F595E795D795C7955A95D1F780918005F7 |
:10BE300090918105AA2797FDA095BA2FC81BD90B11 |
:10BE4000EA0BFB0B80919703282F332744275527B4 |
:10BE5000BE01CF010E946A6497FD53C045E09595ED |
:10BE60008795779567954A95D1F741E069317407D1 |
:10BE7000D4F188E191E090938405809383058091CB |
:10BE8000830590918405800F911F2091B808332776 |
:10BE9000289FA001299F500D389F500D1124CA01E1 |
:10BEA0006AE070E00E94A9648B018091B60899272E |
:10BEB000880F991F880F991F909581959F4F68173C |
:10BEC00079070CF48C0110937F0500937E05F092A6 |
:10BED0007D05E0927C0510937905009378051BC0E1 |
:10BEE0006D5F7F4F83CF5EEF683E75071CF488EE71 |
:10BEF0009EEFC1CF7093840560938305C0CF0196F8 |
:10BF000080CF615E7F4F8F4F9F4FA8CFC158DF4FCB |
:10BF1000EF4FFF4F84CF1093240800932308C801EC |
:10BF2000DF91CF911F910F91FF90EF900895CF93E4 |
:10BF3000DF938091B30880FF12C081E08093850574 |
:10BF4000E091F003F091F103EF3FF10589F080916A |
:10BF500085059927009751F10197D1F52EC01092D0 |
:10BF60008505E091F003F091F103EF3FF10579F7DA |
:10BF700084EF91E00E94B114EC01CE010E94BA144A |
:10BF80008823D9F38091AD08E82FFF27EE0FFF1F1C |
:10BF9000E758F74F0190F081E02DF093F103E09323 |
:10BFA000F0038091850599270097B1F6EC5AFF4F71 |
:10BFB0007CF082E0809385050BC0F7FD05C03697C5 |
:10BFC000C4F70E940C6004C0F095E195FF4FF7CFD5 |
:10BFD000DF91CF9108958091AD08E82FFF27EE0FF4 |
:10BFE000FF1FE758F74F808191819093220880933B |
:10BFF000210888589F4F08958091850599270097BB |
:10C0000029F0019731F080E090E008950E94EB5F05 |
:10C0100008950E941B600895AAE0B0E00E94F964B0 |
:10C02000802D80938705ACE0B0E00E94F964802DFC |
:10C03000809386050895EF92FF921F93CF93DF932D |
:10C040001091AD08E12FFF27EE0FFF1FE758F74FC4 |
:10C05000C081D1818091F0039091F103C81BD90B6D |
:10C0600080918104882309F465C0E0909005F090E8 |
:10C070009105F0929305E09292051C161D060CF0B6 |
:10C08000DFC09E01442737FD4095542FCA01B901F6 |
:10C090000E946A64DC01CB01BC01CD0126E930E0DD |
:10C0A00040E050E00E94DE64DA01C9018C0F9D1F60 |
:10C0B0009093910580939005609190057091910502 |
:10C0C000A0919405B0919505AB014A0F5B1F80913B |
:10C0D000960599278830910509F4CCC089309105DF |
:10C0E0000CF076C08430910509F4C2C18530910509 |
:10C0F0000CF02DC150938F0540938E058130910532 |
:10C1000009F42BC2039761F550938D0540938C057C |
:10C110002A974CF09B012E193F0937FDDEC22230D1 |
:10C1200031050CF4B7C284E690E0909398058093B3 |
:10C13000970516C010928D0510928C0510928F05F0 |
:10C1400010928E051092950510929405109291050B |
:10C150001092900581E08093960560E070E0DB012D |
:10C1600020918A0530918B0580918E0590918F05E5 |
:10C1700040918C0550918D05841B950B281739072C |
:10C180000CF4C901309521953F4F821793070CF4A9 |
:10C19000C90120918805309189052115310549F49F |
:10C1A000840F951F90938D0580938C0525E030E0DA |
:10C1B000AC0121503040309389052093880557FF0A |
:10C1C00093C210928D0510928C0540E050E08CC215 |
:10C1D0008B30910509F42FC18C3091050CF0A7C06C |
:10C1E0008930910509F495C10A9709F0ABC02091F7 |
:10C1F000990530919A052A0F3B1F30938F052093A4 |
:10C200008E058091970590919805019790939805D8 |
:10C2100080939705892B19F488E0809396052597DC |
:10C220000CF09ECF30939505209394050E94B85E44 |
:10C230008DE0809396056091900570919105F6C010 |
:10C240009E01442737FD4095542FCA01B9010E9431 |
:10C250006A64DC01CB01BC01CD0126E930E040E09D |
:10C2600050E00E94DE64DA01C9019E01281B390BEF |
:10C27000C9011ECF50938F0540938E05E12FFF27F4 |
:10C28000EE0FFF1FE758F74F808191818C5A9F4F27 |
:10C29000F4F184E690E0909398058093970536E05A |
:10C2A000E316F1044CF09701261B370B80918605AD |
:10C2B0009927281739074CF485E0E816F1040CF0AB |
:10C2C0004FCF8091E00882FF4BCF0E94965E809115 |
:10C2D00092059091930590939A05809399058AE031 |
:10C2E0008093960589E190E0909398058093970557 |
:10C2F00024E130E030938B0520938A05609190050E |
:10C3000070919105A0919405B09195052DCF8091E4 |
:10C3100097059091980501979093980580939705BC |
:10C32000892B09F0BCCF8EE080939605B8CF8D3075 |
:10C33000910509F4BDC08D3091050CF449C10E97EB |
:10C3400009F460C150938F0540938E0509CF863064 |
:10C35000910509F41AC150938F0540938E050797F4 |
:10C360000CF027C12091AC08E22FFF27EE0FFF1F32 |
:10C37000E758F74F808191818C5E9F4FBCF480918C |
:10C380008605843198F48F5F80938605ACE0B0E039 |
:10C39000082E0E94066584EF91E090931604809326 |
:10C3A000150484E0809396052091AC08E22FFF27C6 |
:10C3B000EE0FFF1FE758F74F808191814597ACF052 |
:10C3C00080918605882389F0815080938605ACE0B2 |
:10C3D000B0E0082E0E94066584EF91E09093160469 |
:10C3E0008093150484E08093960520919205309106 |
:10C3F0009305263031050CF400C1609190057091D1 |
:10C400009105261B370B8091860599272817390738 |
:10C410004CF084E08093960584EF91E090931604AD |
:10C420008093150410928F0510928E05A0919405AB |
:10C43000B091950595CE50938F0540938E05249627 |
:10C44000299790F5CB018E199F090196039760F506 |
:10C450008091970590919805019790939805809306 |
:10C460009705892B09F07CCE8CE08093960578CED9 |
:10C4700065307105A4F48091AC08E82FFF27EE0F1A |
:10C48000FF1FE758F74F808191810190F081E02DE7 |
:10C49000F7FDF2C035971CF485E080939605109265 |
:10C4A0008F0510928E055CCE89E08093960558CE5C |
:10C4B000B0938F05A0938E059E01D7FDE7C026306F |
:10C4C00031050CF44DCE0E948A5E209178053091A2 |
:10C4D000790537FD06C135952795359527958091C6 |
:10C4E000940590919505821B930B909395058093ED |
:10C4F000940560919005709191059B01280F391F5B |
:10C5000030938F0520938E0529E020939605DC015A |
:10C5100027CE50938F0540938E05E12FFF27EE0F16 |
:10C52000FF1FE758F74F808191818C5A9F4F0CF481 |
:10C530007DC084E690E090939805809397052496BB |
:10C54000299708F00DCE0E94965E89E190E09093C5 |
:10C550009805809397058BE06CCE8091AC08E82F0E |
:10C56000FF27EE0FFF1FE758F74F80819181873437 |
:10C5700091050CF46BC083E08093960584EF91E005 |
:10C580009093160480931504EBCD26970CF465C0A8 |
:10C59000809187059927909395058093940584173A |
:10C5A00095070CF06DC090938F0580938E05DC018C |
:10C5B000D7CDC630D105CCF08091CA08282F3327BB |
:10C5C00030938B0520938A0588E080939605CCCD27 |
:10C5D00050938F0540938E0550938D0540938C05A5 |
:10C5E000509395054093940521CECB5FDF4F0CF01F |
:10C5F000B7CD8EE080939605B3CD60919005709194 |
:10C60000910510CF22E030E030938B0520938A050E |
:10C61000109295051092940510928F0510928E0538 |
:10C6200086E080939605A0E0B0E09ECD80919705CE |
:10C630009091980501979093980580939705892B81 |
:10C6400009F07DCF8EE08093960579CF808191812E |
:10C650008A5B9F4F74F684E08FCF50938F05409391 |
:10C660008E058091870599278A179B0709F078CD59 |
:10C6700087E08093960574CDF095E195FF4F0ACF42 |
:10C6800050938F0540938E05DC016ACD309521953E |
:10C690003F4F15CF80919705909198050197909302 |
:10C6A000980580939705892B09F05ACD80918705CD |
:10C6B00099278417950709F453CD80918C058093B1 |
:10C6C0008705AAE0B0E0082E0E94066584EF91E09D |
:10C6D0009093160480931504AECD309521953F4F6D |
:10C6E0001ECD2D5F3F4FF7CEB0932008A0931F08BB |
:10C6F0007093220860932108CA01DF91CF911F91A6 |
:10C70000FF90EF900895FC014150504030F00190AF |
:10C710000616D1F73197CF010895882799270895F4 |
:10C720005058192EA6D001D08CC0BA1762077307D3 |
:10C7300084079507B1F188F40EF410940B2EBA2FEC |
:10C74000A02D062E622F202D072E732F302D082EA0 |
:10C75000842F402D092E952F502DFF275523B9F0FA |
:10C76000591B49F0573E98F0469537952795A79560 |
:10C77000F0405395C9F776F0BA0F621F731F841FFC |
:10C7800030F4879577956795B795F040939517FAAC |
:10C790000F2E0895BF1BBB27BA0B620B730B840BC4 |
:10C7A000F6CFDEF692C097FB70D09F3738F0FEE9E7 |
:10C7B000F91B982F872F762F6B2F05C083C0969576 |
:10C7C000879577956795F150D0F73EF490958095D1 |
:10C7D000709561957F4F8F4F9F4F0895E89403C0E8 |
:10C7E00097FB0EF4F3DFB62F672F782F892F9EE982 |
:10C7F000002427C00ED05EF004C00BD026F001C08C |
:10C8000008D019F020F48FEF089580E0089581E0BA |
:10C81000089597FB092E052600F868942DD0E8941A |
:10C8200007FC07C0621773078407950721F008F417 |
:10C8300000940794989408959A95BB0F661F771FEC |
:10C84000881F11249923A1F08823B2F79F3F59F044 |
:10C85000BB0F48F421F4002011F460FF04C06F5FA7 |
:10C860007F4F8F4F9F4F881F9795879597F9089512 |
:10C8700029C0052E092607FA440F551F5F3F79F09E |
:10C88000AA27A51708F051E04795880F991F9F3FE9 |
:10C8900031F0BB27B91708F091E0879508959F9173 |
:10C8A0009F91112414C097FB880F991F9F3F31F06F |
:10C8B000BB27B91708F091E0879508959F919F9144 |
:10C8C000112405C0662777278827992708959FEFA9 |
:10C8D00080EC0895629FD001739FF001829FE00D6C |
:10C8E000F11D649FE00DF11D929FF00D839FF00DEF |
:10C8F000749FF00D659FF00D9927729FB00DE11D9B |
:10C90000F91F639FB00DE11DF91FBD01CF01112477 |
:10C910000895991B79E004C0991F961708F0961B9B |
:10C92000881F7A95C9F780950895AA1BBB1B51E112 |
:10C9300007C0AA1FBB1FA617B70710F0A61BB70B8F |
:10C94000881F991F5A95A9F780959095BC01CD0134 |
:10C95000089597FB092E07260AD077FD04D0E5DF5E |
:10C9600006D000201AF4709561957F4F0895F6F770 |
:10C97000909581959F4F0895A1E21A2EAA1BBB1B8B |
:10C98000FD010DC0AA1FBB1FEE1FFF1FA217B3079B |
:10C99000E407F50720F0A21BB30BE40BF50B661FB1 |
:10C9A000771F881F991F1A9469F760957095809575 |
:10C9B00090959B01AC01BD01CF01089597FB092E15 |
:10C9C00005260ED057FD04D0D7DF0AD0001C38F45E |
:10C9D00050954095309521953F4F4F4F5F4F0895AB |
:10C9E000F6F790958095709561957F4F8F4F9F4F8B |
:10C9F0000895F999FECFB2BDA1BDF89A119600B481 |
:10CA00000895F7DF01921A94E1F70895F999FECF9E |
:10CA1000B2BDA1BD00BC11960FB6F894FA9AF99A6E |
:0ECA20000FBE08950190F2DF1A94E1F7089519 |
:10CA2E00010A0151756164726F0000416E676C6599 |
:10CA3E004E69636B20202020202020416E676C659C |
:10CA4E00526F6C6C202020202020204163634E69A1 |
:10CA5E00636B202020202020202020416363526F12 |
:10CA6E006C6C2020202020202020204779726F47D8 |
:10CA7E006965722020202020202020486967687474 |
:10CA8E002056616C756520202020204163635A205A |
:10CA9E0020202020202020202020204761732020CD |
:10CAAE002020202020202020202020436F6D706128 |
:10CABE0073732056616C7565202020566F6C7461FF |
:10CACE006765202020202020202020456D70666183 |
:10CADE006E672020202020202020204779726F2092 |
:10CAEE004B6F6D70617373202020204D6F746F72C9 |
:10CAFE002046726F6E7420202020204D6F746F724E |
:10CB0E0020526561722020202020204D6F746F729C |
:10CB1E00204C6566742020202020204D6F746F728B |
:10CB2E002052696768742020202020202020202099 |
:10CB3E0020202020202020202020202020202020E7 |
:10CB4E0020202020202020202020202020202020D7 |
:10CB5E0020202020202020202020204D4B334D61EE |
:10CB6E00672043616C537461746520536572766FF0 |
:10CB7E0020202020202020202020202020202020A7 |
:10CB8E002020202020202020202020202020202097 |
:10CB9E002020202020202020202020202020202087 |
:10CBAE002020202020202020202020202020202077 |
:10CBBE00202020202020202020202050697463680F |
:10CBCE004F66667365742020202020537469636B52 |
:10CBDE0056616C75652020202020204B616C6D61A4 |
:10CBEE006E5F4D617844726966742020202020208B |
:10CBFE0020202020202020202020204E6176692019 |
:10CC0E0053657269616C20446174614750535F4E85 |
:10CC1E0069636B20202020202020204750535F5234 |
:10CC2E006F6C6C2020202020202020C8000164FF83 |
:10CC3E0001FFFF01FC01FC0101737373FF03007D13 |
:10CC4E000000C409C40964000E48616C6C6F205763 |
:10CC5E00656C740000000000000000000000000081 |
:10CC6E0000000000000000000000000000000000B6 |
:10CC7E0000000000000000000000000000000000A6 |
:10CC8E000000000000000000000000000000000096 |
:10CC9E00000000000000000000010203040506076A |
:10CCAE0008090A01040B050000ECFF6440415A46D6 |
:10CCBE00640A02969608403A10FB30380190D00371 |
:10CCCE000090D00300F401640053706F7274000082 |
:10CCDE004E6F726D616C0000426567696E6E6572B3 |
:10CCEE0000000A0B0D0B0C0E010101004D4B202014 |
:10CCFE002020202020004D44202020202020200015 |
:10CD0E00496E76616C6964202000CC03D603E00383 |
:02CD1E00FF0014 |
:00000001FF |
/branches/thjac/V1_12/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/thjac/V1_12/License.txt |
---|
0,0 → 1,52 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + Nur für den privaten Gebrauch |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten und nichtkommerziellen Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt und genannt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-profit use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet, our webpage (http://www.MikroKopter.de) must be |
// + clearly linked and named as origin |
// + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
/branches/thjac/V1_12/Settings.h |
---|
--- thjac/V1_12/Spectrum.c (nonexistent) |
+++ thjac/V1_12/Spectrum.c (revision 1233) |
@@ -0,0 +1,310 @@ |
+/*####################################################################################### |
+Decodieren eines RC Summen Signals oder Spektrum Empfänger-Satellit |
+#######################################################################################*/ |
+ |
+#include "Spectrum.h" |
+#include "main.h" |
+ |
+//--------------------------------------------------------------// |
+ |
+//--------------------------------------------------------------// |
+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); |
+ |
+ Uart1Init(); // init Uart again |
+} |
+ |
+//############################################################################ |
+// zum Decodieren des Spektrum Satelliten wird USART1 benutzt. |
+// USART1 initialisation from killagreg |
+void Uart1Init(void) |
+//############################################################################ |
+ { |
+ // -- Start of USART1 initialisation for Spekturm seriell-mode |
+ // USART1 Control and Status Register A, B, C and baud rate register |
+ uint16_t ubrr = (uint16_t) ((uint32_t) SYSCLK/(8 * 115200) - 1); |
+ // 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); |
+ // 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 |
+ 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 |
+// |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ |
+//############################################################################ |
+//Diese Routine startet und inizialisiert den USART1 für seriellen Spektrum satellite reciever |
+SIGNAL(USART1_RX_vect) |
+//############################################################################ |
+{ |
+static unsigned int Sync=0, FrameCnt=0, ByteHigh=0, ReSync=1, Frame2=0, FrameTimer; |
+ unsigned int Channel, index; |
+ signed int signal, tmp; |
+ int bCheckDelay; |
+ uint8_t c; |
+ |
+ c = UDR1; // get data byte |
+ |
+ if (ReSync == 1) |
+ { |
+ // wait for beginning of new frame |
+ ReSync = 0; |
+ |
+ FrameTimer = SetDelay(7); // minimum 7ms zwischen den frames |
+ FrameCnt = 0; |
+ Sync = 0; |
+ ByteHigh = 0; |
+ } |
+ else |
+ { |
+ bCheckDelay = 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 ++; |
+ } |
+ else |
+ { |
+ // Zeichen kam vor Ablauf der 7ms Sync-Pause |
+ // warten auf erstes Sync-Zeichen |
+ } |
+ } |
+ else if((Sync == 1) && !bCheckDelay) |
+ { |
+ // zweites Sync-Character ignorieren, Bedeutung unbekannt |
+ Sync = 2; |
+ FrameCnt ++; |
+ } |
+ else if((Sync == 2) && !bCheckDelay) |
+ { |
+ // 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 |
+ Sync = 2; |
+ FrameCnt ++; |
+ |
+ index = (ByteHigh >> 2) & 0x0f; |
+ index ++; |
+ Channel = (ByteHigh << 8) | c; |
+ signal = Channel & 0x3ff; |
+ signal -= 0x200; // Offset, range 0x000..0x3ff? |
+ signal = signal/3; // scaling to fit PPM resolution |
+ |
+ if(index >= 0 && index <= 10) |
+ { |
+ // 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 >= 180) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; |
+ else PPM_diff[index] = 0; |
+ PPM_in[index] = tmp; |
+ } |
+ } |
+ else |
+ { |
+ // hier stimmt was nicht: neu synchronisieren |
+ ReSync = 1; |
+ FrameCnt = 0; |
+ Frame2 = 0; |
+ } |
+ |
+ // 16 Bytes per frame |
+ if(FrameCnt >= 16) |
+ { |
+ // Frame complete |
+ if(Frame2 == 0) |
+ { |
+ // Null bedeutet: Neue Daten |
+ // nur beim ersten Frame (CH 0-7) setzen |
+ NewPpmData = 0; |
+ } |
+ |
+ // new frame next, nach fruehestens 7ms erwartet |
+ FrameCnt = 0; |
+ Frame2 = 0; |
+ Sync = 0; |
+ } |
+ // Zeit bis zum nächsten Zeichen messen |
+ FrameTimer = SetDelay(7); |
+ } |
+} |
+ |
+ |
/branches/thjac/V1_12/Spectrum.h |
---|
0,0 → 1,9 |
/*####################################################################################### |
Dekodieren eines Spectrum Signals |
#######################################################################################*/ |
#ifndef _SPECTRUM_H |
#define _SPECTRUM_H |
void Uart1Init(void); |
void SpektrumBinding(void); |
#endif //_RC_H |
/branches/thjac/V1_12/_Settings.h |
---|
0,0 → 1,43 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Abstimmung |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define ACC_AMPLIFY 6 |
#define FAKTOR_P 1 |
#define FAKTOR_I 0.0001 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Debug-Interface |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define SIO_DEBUG 1 // Soll der Debugger aktiviert sein? |
#define MIN_DEBUG_INTERVALL 250 // in diesem Intervall werden Degugdaten ohne Aufforderung gesendet |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Sender |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define K_NICK 0 |
#define K_ROLL 1 |
#define K_GAS 2 |
#define K_GIER 3 |
#define K_POTI1 4 |
#define K_POTI2 5 |
#define K_POTI3 6 |
#define K_POTI4 7 |
// +++++++++++++++++++++++++++++++ |
// + Getestete Settings: |
// +++++++++++++++++++++++++++++++ |
// Setting: Kamera |
// Stick_P:3 |
// Stick_D:0 |
// Gyro_P: 175 |
// Gyro_I: 175 |
// Ki_Anteil: 10 |
// +++++++++++++++++++++++++++++++ |
// + Getestete Settings: |
// +++++++++++++++++++++++++++++++ |
// Setting: Normal |
// Stick_P:2 |
// Stick_D:8 |
// Gyro_P: 80 |
// Gyro_I: 150 |
// Ki_Anteil: 5 |
/branches/thjac/V1_12/altcon.c |
---|
0,0 → 1,119 |
/* altcon.c |
* |
* Copyright 2009 Thomas Jachmann |
*/ |
#include "main.h" |
#include "altcon.h" |
#include "parameter.h" |
#include "fc.h" |
static char enabled = 0; |
static int accZOffset = 0; |
static int lastError = 0; |
static int lastN = 0; // Zuletzt errechneter Fehlerwert |
static int temp; // Temporäre Werte; wird mehrfach verwendet |
int pressureOffset = 0; |
int averageN = 0; |
extern unsigned char Notlandung; // aus fc.c |
extern int airPressure; |
/* |
* Höhenregler initialisieren |
*/ |
void altcon_init( void ) { |
altcon_stop(); |
} |
/* |
* Speichert die aktuelle Höhe als Sollhöhe |
*/ |
void altcon_lock( void ) { |
pressureOffset = analog_airPressure(); |
accZOffset = Mess_Integral_Hoch / 128; |
} |
/* |
* Startet den Höhenregler |
*/ |
void altcon_start( void ) { |
enabled = 1; |
lastError = 0; |
lastN = 0; |
averageN = 0; |
// Einschalten der Höhenregelung signalisieren |
beeptime = 500; |
} |
/* |
* Stoppt den Höhenregler |
*/ |
void altcon_stop( void ) { |
enabled = 0; |
// Ausschalten der Höhenregelung signalisieren |
beeptime = 500; |
} |
/* |
* Berechnet den Korrekturwert für die Höhenregelung |
*/ |
int altcon_error( void ) { |
int register n = 0; |
int register error; |
if( enabled && !Notlandung ) { |
// Fehlerwert für Regler ermitteln |
error = analog_airPressure() - pressureOffset; |
// Proportionalanteil |
n = ( PARAM_ALT_P * error ) / 4; // dividiert durch ( 16 / STICK_GAIN ) = 16 / 4 = 4 |
// Differenzialanteil wird in analog.c berechnet |
n += analog_airPressureDiff() / 2; |
// ACC-Z-Integral zur Dämpfung einbeziehen |
temp = ( ( ( Mess_Integral_Hoch / 128 ) - accZOffset ) * (signed long) PARAM_ALT_ACC ) / 32; |
// Dämpfung limitieren |
if( temp > ( 70 * STICK_GAIN ) ) |
temp = 70 * STICK_GAIN; |
else if( temp < -( 70 * STICK_GAIN ) ) |
temp = -( 70 * STICK_GAIN ); |
n += temp; |
// Verstärkung des Fehlerwertes zur Anpassung des Gewichtes |
n = n * PARAM_ALT_GAIN / 10; |
int altMax = PARAM_ALT_MAX * STICK_GAIN; |
// Limitierung des Korrekturwertes nach oben |
if( n < -altMax ) |
n = -altMax; |
lastN = n; |
lastError = error; |
/* Berechnung einer exponentiellen Glättung für den neuen Gaswert bei Verlassen der |
* Höhenregelung. Dies soll ein zu heftiges Reagieren mindern. */ |
// averageN = averageN + PARAM_ALT_EXP_SMOOTHING_FACTOR * ( n - averageN ) / 100; |
averageN = n; |
} |
DebugOut.Analog[27] = n; |
return n; |
} |
/branches/thjac/V1_12/altcon.h |
---|
0,0 → 1,20 |
/* altcon.h |
* |
* Copyright 2009 Thomas Jachmann |
*/ |
#ifndef ALTCON_H |
#define ALTCON_H |
#define altcon_avgerror() averageN |
extern int pressureOffset; |
extern int averageN; |
extern void altcon_init( void ); |
extern void altcon_start( void ); |
extern void altcon_lock( void ); |
extern void altcon_stop( void ); |
extern int altcon_error( void ); |
#endif // ALTCON_H |
/branches/thjac/V1_12/analog.c |
---|
0,0 → 1,459 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_ax, Aktuell_ay,Aktuell_az, UBat = 100; |
volatile int 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 int StartLuftdruck; |
volatile unsigned int MessLuftdruck = 1023; |
unsigned char DruckOffsetSetting; |
signed char ExpandBaro = 0; |
volatile int HoeheD = 0; |
volatile char messanzahl_Druck; |
volatile int tmpLuftdruck; |
volatile unsigned int ZaehlMessungen = 0; |
unsigned char AnalogOffsetNick = 115,AnalogOffsetRoll = 115,AnalogOffsetGier = 115; |
unsigned char GyroDefektN = 0,GyroDefektR = 0,GyroDefektG = 0; |
volatile unsigned char AdReady = 1; |
//####################################################################################### |
// |
void ADC_Init(void) |
//####################################################################################### |
{ |
ADMUX = 0;//Referenz ist extern |
ANALOG_ON; |
} |
void SucheLuftruckOffset(void) |
{ |
unsigned int off; |
off = eeprom_read_byte(&EEPromArray[EEPROM_ADR_LAST_OFFSET]); |
if(off > 20) off -= 10; |
OCR0A = off; |
ExpandBaro = 0; |
Delay_ms_Mess(100); |
if(MessLuftdruck < 850) off = 0; |
for(; off < 250;off++) |
{ |
OCR0A = off; |
Delay_ms_Mess(50); |
printf("."); |
if(MessLuftdruck < 850) break; |
} |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_LAST_OFFSET], off); |
DruckOffsetSetting = off; |
Delay_ms_Mess(300); |
} |
void SucheGyroOffset(void) |
{ |
unsigned char i, ready = 0; |
int timeout; |
GyroDefektN = 0; GyroDefektR = 0; GyroDefektG = 0; |
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++; |
twi_state = 8; |
i2c_start(); |
if(AnalogOffsetNick < 10) { GyroDefektN = 1; AnalogOffsetNick = 10;}; if(AnalogOffsetNick > 245) { GyroDefektN = 1; AnalogOffsetNick = 245;}; |
if(AnalogOffsetRoll < 10) { GyroDefektR = 1; AnalogOffsetRoll = 10;}; if(AnalogOffsetRoll > 245) { GyroDefektR = 1; AnalogOffsetRoll = 245;}; |
if(AnalogOffsetGier < 10) { GyroDefektG = 1; AnalogOffsetGier = 10;}; if(AnalogOffsetGier > 245) { GyroDefektG = 1; AnalogOffsetGier = 245;}; |
while(twi_state) if(CheckDelay(timeout)) {printf("\n\r DAC or I2C ERROR! Check I2C, 3Vref, DAC and BL-Ctrl"); break;} |
messanzahl_Druck = 0; |
ANALOG_ON; |
while(messanzahl_Druck == 0); |
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 |
*/ |
//####################################################################################### |
// |
SIGNAL(SIG_ADC) |
//####################################################################################### |
{ |
static unsigned char kanal=0,state = 0; |
static signed int gier1, roll1, nick1, nick_filter, roll_filter; |
static signed int accy, accx; |
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) |
{ |
NeutralAccZ += 0.02; |
if(modell_fliegt < 500) NeutralAccZ += 0.1; |
} |
} |
else if(AdWertAccHoch < -1) |
{ |
if(NeutralAccZ > 550) |
{ |
NeutralAccZ-= 0.02; |
if(modell_fliegt < 500) NeutralAccZ -= 0.1; |
} |
} |
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 8:" 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: |
tmpLuftdruck += ADC; |
if(++messanzahl_Druck >= 5) |
{ |
tmpLuftdruck /= 2; |
MessLuftdruck = ADC; |
messanzahl_Druck = 0; |
HoeheD = (31 * HoeheD + (int) Parameter_Luftdruck_D * (int)(255 * ExpandBaro + StartLuftdruck - tmpLuftdruck - HoehenWert))/32; // D-Anteil = neuerWert - AlterWert |
Luftdruck = (tmpLuftdruck + 7 * Luftdruck + 4) / 8; |
HoehenWert = 255 * ExpandBaro + StartLuftdruck - Luftdruck; |
tmpLuftdruck /= 2; |
} |
kanal = AD_NICK; |
break; |
default: |
kanal = 0; state = 0; kanal = AD_NICK; |
break; |
} |
ADMUX = kanal; |
if(state != 0) ANALOG_ON; |
} |
/* |
//####################################################################################### |
// |
SIGNAL(SIG_ADC) |
//####################################################################################### |
{ |
static unsigned char kanal=0,state = 0; |
static signed int gier1, roll1, nick1; |
static signed long nick_filter, roll_filter; |
static signed int accy, accx; |
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_NICK; |
break; |
case 4: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 5: |
roll1 += ADC; |
kanal = AD_ACC_Z; |
break; |
case 6: |
AdWertAccHoch = (signed int) ADC - NeutralAccZ; |
if(AdWertAccHoch > 1) |
{ |
if(NeutralAccZ < 750) |
{ |
NeutralAccZ += 0.02; |
if(modell_fliegt < 500) NeutralAccZ += 0.1; |
} |
} |
else if(AdWertAccHoch < -1) |
{ |
if(NeutralAccZ > 550) |
{ |
NeutralAccZ-= 0.02; |
if(modell_fliegt < 500) NeutralAccZ -= 0.1; |
} |
} |
messanzahl_AccHoch = 1; |
Aktuell_az = ADC; |
Mess_Integral_Hoch += AdWertAccHoch; // Integrieren |
Mess_Integral_Hoch -= Mess_Integral_Hoch / 1024; // dämfen |
kanal = AD_NICK; |
break; |
case 7: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 8: |
roll1 += ADC; |
kanal = AD_ACC_X; |
break; |
case 9: |
Aktuell_ax = ADC - NeutralAccX; |
accx = Aktuell_ax; |
kanal = AD_GIER; |
break; |
case 10: |
gier1 += ADC; |
kanal = AD_NICK; |
break; |
case 11: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 12: |
roll1 += ADC; |
kanal = AD_UBAT; |
break; |
case 13: |
UBat = (3 * UBat + ADC / 3) / 4;//(UBat + ((ADC * 39) / 256) + 19) / 2; |
kanal = AD_ACC_Y; |
break; |
case 14: |
Aktuell_ay = NeutralAccY - ADC; |
accy += Aktuell_ay; |
kanal = AD_NICK; |
break; |
case 15: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 16: |
roll1 += ADC; |
kanal = AD_ACC_X; |
break; |
case 17: |
Aktuell_ax = ADC - NeutralAccX; |
accx += Aktuell_ax; |
kanal = AD_NICK; |
break; |
case 18: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 19: |
roll1 += ADC; |
kanal = AD_GIER; |
break; |
case 20: |
gier1 += ADC; |
kanal = AD_ACC_Y; |
break; |
case 21: |
Aktuell_ay = NeutralAccY - ADC; |
accy += Aktuell_ay; |
kanal = AD_NICK; |
break; |
case 22: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 23: |
roll1 += ADC; |
kanal = AD_DRUCK; |
break; |
case 24: |
tmpLuftdruck += ADC; |
if(++messanzahl_Druck >= 5) |
{ |
MessLuftdruck = ADC; |
messanzahl_Druck = 0; |
HoeheD = (7 * HoeheD + (int) Parameter_Luftdruck_D * (int)(255 * ExpandBaro + StartLuftdruck - tmpLuftdruck - HoehenWert)) / 8; // D-Anteil = neuerWert - AlterWert |
Luftdruck = (tmpLuftdruck + 3 * Luftdruck) / 4; |
HoehenWert = 255 * ExpandBaro + StartLuftdruck - Luftdruck; |
tmpLuftdruck = 0; |
} |
kanal = AD_NICK; |
break; |
case 25: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 26: |
roll1 += ADC; |
kanal = AD_ACC_X; |
break; |
case 27: |
Aktuell_ax = ADC - NeutralAccX; |
accx += Aktuell_ax; |
kanal = AD_GIER; |
break; |
case 28: |
if(PlatinenVersion == 10) AdWertGier = (ADC + gier1 + 2) / 4; |
else |
if(PlatinenVersion == 20) AdWertGier = 2047 - (ADC + gier1 + 1) / 2; |
else AdWertGier = (ADC + gier1 + 1) / 2; |
kanal = AD_NICK; |
break; |
case 29: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 30: |
roll1 += ADC; |
kanal = AD_ACC_Y; |
break; |
case 31: |
Aktuell_ay = NeutralAccY - ADC; |
AdWertAccRoll = (Aktuell_ay + accy); |
kanal = AD_NICK; |
break; |
case 32: |
AdWertNick = (ADC + nick1 + 3) / 5; |
nick_filter = (long) (1 * (long) nick_filter + 4 * (long)(ADC + nick1) + 1) / 2; |
if(PlatinenVersion == 10) { AdWertNick /= 2;nick_filter /=2;} |
HiResNick = nick_filter - 20 * AdNeutralNick; |
AdWertNickFilter = (long)(3L * (long)AdWertNickFilter + HiResNick + 2) / 4; |
DebugOut.Analog[21] = AdWertNickFilter / 4; |
kanal = AD_ROLL; |
break; |
case 33: |
AdWertRoll = (ADC + roll1 + 3) / 5; |
roll_filter = (long)(1 * (long)roll_filter + 4 * (long)(ADC + roll1) + 1) / 2; |
if(PlatinenVersion == 10) { AdWertRoll /= 2;roll_filter /=2;} |
HiResRoll = roll_filter - 20 * AdNeutralRoll; |
AdWertRollFilter = (long)(3L * (long)AdWertRollFilter + HiResRoll + 2) / 4; |
DebugOut.Analog[22] = AdWertRollFilter / 4; |
kanal = AD_ACC_X; |
break; |
case 34: |
Aktuell_ax = ADC - NeutralAccX; |
AdWertAccNick = (Aktuell_ax + accx); |
kanal = AD_NICK; |
state = 0; |
AdReady = 1; |
ZaehlMessungen++; |
break; |
default: |
kanal = 0; |
state = 0; |
break; |
} |
ADMUX = kanal; |
if(state != 0) ANALOG_ON; |
} |
*/ |
/branches/thjac/V1_12/analog.h |
---|
0,0 → 1,48 |
#ifndef _ANALOG_H |
#define _ANALOG_H |
/*####################################################################################### |
#######################################################################################*/ |
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 char messanzahl_Druck; |
extern volatile unsigned int ZaehlMessungen; |
extern unsigned char DruckOffsetSetting; |
extern signed char ExpandBaro; |
extern volatile int HoeheD; |
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 analog_airPressure() HoehenWert |
#define analog_airPressureDiff() HoeheD |
#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/thjac/V1_12/eeprom.c |
---|
0,0 → 1,236 |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Konstanten |
// + 0-250 -> normale Werte |
// + 251 -> Poti1 |
// + 252 -> Poti2 |
// + 253 -> Poti3 |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
void DefaultStickMapping(void) |
{ |
EE_Parameter.Kanalbelegung[K_NICK] = 1; |
EE_Parameter.Kanalbelegung[K_ROLL] = 2; |
EE_Parameter.Kanalbelegung[K_GAS] = 3; |
EE_Parameter.Kanalbelegung[K_GIER] = 4; |
EE_Parameter.Kanalbelegung[K_POTI1] = 5; |
EE_Parameter.Kanalbelegung[K_POTI2] = 6; |
EE_Parameter.Kanalbelegung[K_POTI3] = 7; |
EE_Parameter.Kanalbelegung[K_POTI4] = 8; |
} |
void DefaultKonstanten1(void) |
{ |
EE_Parameter.GlobalConfig = CFG_ACHSENKOPPLUNG_AKTIV | CFG_KOMPASS_AKTIV | CFG_GPS_AKTIV;//CFG_HOEHEN_SCHALTER |
EE_Parameter.Hoehe_MinGas = 30; |
EE_Parameter.MaxHoehe = 251; // Wert : 0-250 251 -> Poti1 |
EE_Parameter.Hoehe_P = 10; // Wert : 0-32 |
EE_Parameter.Luftdruck_D = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_ACC_Wirkung = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_Verstaerkung = 4; // Wert : 0-50 |
EE_Parameter.Stick_P = 15; // Wert : 1-6 |
EE_Parameter.Stick_D = 30; // Wert : 0-64 |
EE_Parameter.Gier_P = 12; // Wert : 1-20 |
EE_Parameter.Gas_Min = 8; // Wert : 0-32 |
EE_Parameter.Gas_Max = 230; // Wert : 33-250 |
EE_Parameter.GyroAccFaktor = 30; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
EE_Parameter.Gyro_P = 80; // Wert : 0-250 |
EE_Parameter.Gyro_I = 150; // Wert : 0-250 |
EE_Parameter.Gyro_D = 3; // Wert : 0-250 |
EE_Parameter.UnterspannungsWarnung = 94; // Wert : 0-250 |
EE_Parameter.NotGas = 35; // Wert : 0-250 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 30; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
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-250 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoNickCompInvert = 0; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 50; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickMax = 150; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickRefresh = 5; |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.BitConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
EE_Parameter.AchsKopplung1 = 90; |
EE_Parameter.AchsKopplung2 = 67; |
EE_Parameter.CouplingYawCorrection = 0; |
EE_Parameter.WinkelUmschlagNick = 85; |
EE_Parameter.WinkelUmschlagRoll = 85; |
EE_Parameter.GyroAccAbgleich = 16; // 1/k |
EE_Parameter.Driftkomp = 32; |
EE_Parameter.DynamicStability = 100; |
EE_Parameter.J16Bitmask = 95; |
EE_Parameter.J17Bitmask = 243; |
EE_Parameter.J16Timing = 15; |
EE_Parameter.J17Timing = 15; |
EE_Parameter.NaviGpsModeControl = 253; |
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 = 4; |
memcpy(EE_Parameter.Name, "Sport\0", 12); |
} |
void DefaultKonstanten2(void) |
{ |
EE_Parameter.GlobalConfig = CFG_ACHSENKOPPLUNG_AKTIV | CFG_KOMPASS_AKTIV | CFG_GPS_AKTIV;///*CFG_HOEHEN_SCHALTER |*/ CFG_KOMPASS_AKTIV;//0x01; |
EE_Parameter.Hoehe_MinGas = 30; |
EE_Parameter.MaxHoehe = 251; // Wert : 0-250 251 -> Poti1 |
EE_Parameter.Hoehe_P = 10; // Wert : 0-32 |
EE_Parameter.Luftdruck_D = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_ACC_Wirkung = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_Verstaerkung = 3; // Wert : 0-50 |
EE_Parameter.Stick_P = 12; // Wert : 1-6 |
EE_Parameter.Stick_D = 16; // Wert : 0-64 |
EE_Parameter.Gier_P = 6; // Wert : 1-20 |
EE_Parameter.Gas_Min = 8; // Wert : 0-32 |
EE_Parameter.Gas_Max = 230; // Wert : 33-250 |
EE_Parameter.GyroAccFaktor = 30; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
EE_Parameter.Gyro_P = 80; // Wert : 0-250 |
EE_Parameter.Gyro_I = 120; // Wert : 0-250 |
EE_Parameter.Gyro_D = 3; // Wert : 0-250 |
EE_Parameter.UnterspannungsWarnung = 94; // Wert : 0-250 |
EE_Parameter.NotGas = 35; // Wert : 0-250 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 30; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
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-250 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoNickCompInvert = 0; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 50; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickMax = 150; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickRefresh = 5; |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.BitConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts |
EE_Parameter.AchsKopplung1 = 90; |
EE_Parameter.AchsKopplung2 = 67; |
EE_Parameter.CouplingYawCorrection = 60; |
EE_Parameter.WinkelUmschlagNick = 85; |
EE_Parameter.WinkelUmschlagRoll = 85; |
EE_Parameter.GyroAccAbgleich = 32; // 1/k |
EE_Parameter.Driftkomp = 32; |
EE_Parameter.DynamicStability = 75; |
EE_Parameter.J16Bitmask = 95; |
EE_Parameter.J17Bitmask = 243; |
EE_Parameter.J16Timing = 20; |
EE_Parameter.J17Timing = 20; |
EE_Parameter.NaviGpsModeControl = 253; |
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 = 4; |
memcpy(EE_Parameter.Name, "Normal\0", 12); |
} |
void DefaultKonstanten3(void) |
{ |
EE_Parameter.GlobalConfig = CFG_DREHRATEN_BEGRENZER | CFG_ACHSENKOPPLUNG_AKTIV | CFG_KOMPASS_AKTIV | CFG_GPS_AKTIV;///*CFG_HOEHEN_SCHALTER |*/ CFG_KOMPASS_AKTIV;//0x01; |
EE_Parameter.Hoehe_MinGas = 30; |
EE_Parameter.MaxHoehe = 251; // Wert : 0-250 251 -> Poti1 |
EE_Parameter.Hoehe_P = 10; // Wert : 0-32 |
EE_Parameter.Luftdruck_D = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_ACC_Wirkung = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_Verstaerkung = 3; // Wert : 0-50 |
EE_Parameter.Stick_P = 8; // Wert : 1-6 |
EE_Parameter.Stick_D = 16; // Wert : 0-64 |
EE_Parameter.Gier_P = 6; // Wert : 1-20 |
EE_Parameter.Gas_Min = 8; // Wert : 0-32 |
EE_Parameter.Gas_Max = 230; // Wert : 33-250 |
EE_Parameter.GyroAccFaktor = 30; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
EE_Parameter.Gyro_P = 100; // Wert : 0-250 |
EE_Parameter.Gyro_I = 120; // Wert : 0-250 |
EE_Parameter.Gyro_D = 3; // Wert : 0-250 |
EE_Parameter.UnterspannungsWarnung = 94; // Wert : 0-250 |
EE_Parameter.NotGas = 35; // Wert : 0-250 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 20; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
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-250 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoNickCompInvert = 0; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 50; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickMax = 150; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickRefresh = 5; |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.BitConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts |
EE_Parameter.AchsKopplung1 = 90; |
EE_Parameter.AchsKopplung2 = 67; |
EE_Parameter.CouplingYawCorrection = 70; |
EE_Parameter.WinkelUmschlagNick = 85; |
EE_Parameter.WinkelUmschlagRoll = 85; |
EE_Parameter.GyroAccAbgleich = 32; // 1/k |
EE_Parameter.Driftkomp = 32; |
EE_Parameter.DynamicStability = 50; |
EE_Parameter.J16Bitmask = 95; |
EE_Parameter.J17Bitmask = 243; |
EE_Parameter.J16Timing = 30; |
EE_Parameter.J17Timing = 30; |
EE_Parameter.NaviGpsModeControl = 253; |
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 = 4; |
memcpy(EE_Parameter.Name, "Beginner\0", 12); |
} |
/branches/thjac/V1_12/fc.c |
---|
0,0 → 1,1485 |
/*####################################################################################### |
Flight Control |
#######################################################################################*/ |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + Nur für den privaten Gebrauch |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-commercial use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be |
// + clearly linked as origin |
// + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
#include "parameter.h" |
#include "pitch.h" |
#include "altcon.h" |
#include "eeprom.c" |
unsigned char h,m,s; |
volatile unsigned int I2CTimeout = 100; |
int MesswertNick,MesswertRoll,MesswertGier,MesswertGierBias, RohMesswertNick,RohMesswertRoll; |
int TrimNick, TrimRoll; |
int AdNeutralGierBias; |
int AdNeutralNick = 0,AdNeutralRoll = 0,AdNeutralGier = 0,StartNeutralRoll = 0,StartNeutralNick = 0; |
int Mittelwert_AccNick, Mittelwert_AccRoll,Mittelwert_AccHoch, NeutralAccX=0, NeutralAccY=0; |
int NaviAccNick, NaviAccRoll,NaviCntAcc = 0; |
volatile float NeutralAccZ = 0; |
unsigned char CosinusNickWinkel = 0, CosinusRollWinkel = 0; |
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; |
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 Notlandung = 0; |
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; |
volatile unsigned char SenderOkay = 0; |
int StickNick = 0,StickRoll = 0,StickGier = 0,StickGas = 0; |
char MotorenEin = 0; |
int HoehenWert = 0; |
int SollHoehe = 0; |
int LageKorrekturRoll = 0,LageKorrekturNick = 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_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_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_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_J16Brightness; // for the J16 Output |
unsigned char Parameter_J17Bitmask; // for the J17 Output |
unsigned char Parameter_J17Timing; // for the J17 Output |
unsigned char Parameter_J17Brightness; // 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; |
struct mk_param_struct EE_Parameter; |
signed int ExternStickNick = 0,ExternStickRoll = 0,ExternStickGier = 0, ExternHoehenValue = -20; |
int MaxStickNick = 0,MaxStickRoll = 0; |
unsigned int modell_fliegt = 0; |
volatile unsigned char MikroKopterFlags = 0; |
long GIER_GRAD_FAKTOR = 1291; |
signed int KopplungsteilNickRoll,KopplungsteilRollNick; |
unsigned char RequiredMotors = 4; |
unsigned char Motor[MAX_MOTORS]; |
signed int tmp_motorwert[MAX_MOTORS]; |
int MotorSmoothing(int neu, int alt) |
{ |
int motor; |
if(neu > alt) motor = (1*(int)alt + neu) / 2; |
else motor = neu - (alt - neu)*1; |
//if(Poti2 < 20) return(neu); |
return(motor); |
} |
void Piep(unsigned char Anzahl) |
{ |
while(Anzahl--) |
{ |
if(MotorenEin) return; //auf keinen Fall im Flug! |
beeptime = 100; |
Delay_ms(250); |
} |
} |
//############################################################################ |
// Nullwerte ermitteln |
void SetNeutral(void) |
//############################################################################ |
{ |
unsigned char i; |
unsigned int gier_neutral=0, nick_neutral=0, roll_neutral=0; |
ServoActive = 0; HEF4017R_ON; |
NeutralAccX = 0; |
NeutralAccY = 0; |
NeutralAccZ = 0; |
AdNeutralNick = 0; |
AdNeutralRoll = 0; |
AdNeutralGier = 0; |
AdNeutralGierBias = 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); |
AdNeutralGierBias = AdNeutralGier; |
StartNeutralRoll = AdNeutralRoll; |
StartNeutralNick = AdNeutralNick; |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) > 4) |
{ |
NeutralAccY = abs(Mittelwert_AccRoll) / (2*ACC_AMPLIFY); |
NeutralAccX = abs(Mittelwert_AccNick) / (2*ACC_AMPLIFY); |
NeutralAccZ = Aktuell_az; |
} |
else |
{ |
NeutralAccX = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK+1]); |
NeutralAccY = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL+1]); |
NeutralAccZ = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_Z]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_Z+1]); |
} |
MesswertNick = 0; |
MesswertRoll = 0; |
MesswertGier = 0; |
Delay_ms_Mess(100); |
Mittelwert_AccNick = ACC_AMPLIFY * (long)AdWertAccNick; |
Mittelwert_AccRoll = ACC_AMPLIFY * (long)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; |
HoeheD = 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(); |
MikroKopterFlags |= FLAG_CALIBRATE; |
FromNaviCtrl_Value.Kalman_K = -1; |
FromNaviCtrl_Value.Kalman_MaxDrift = 0; |
FromNaviCtrl_Value.Kalman_MaxFusion = 32; |
Poti1 = PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110; |
Poti2 = PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110; |
Poti3 = PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110; |
Poti4 = PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110; |
ServoActive = 1; |
SenderOkay = 100; |
} |
//############################################################################ |
// 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; |
MesswertGier = (signed int) AdNeutralGier - AdWertGier; |
// MesswertGierBias = (signed int) AdNeutralGierBias - AdWertGier; |
MesswertNick = (signed int) AdWertNickFilter / 8; |
MesswertRoll = (signed int) AdWertRollFilter / 8; |
RohMesswertNick = MesswertNick; |
RohMesswertRoll = MesswertRoll; |
//DebugOut.Analog[21] = MesswertNick; |
//DebugOut.Analog[22] = MesswertRoll; |
//DebugOut.Analog[22] = Mess_Integral_Gier; |
//DebugOut.Analog[21] = MesswertNick; |
//DebugOut.Analog[22] = MesswertRoll; |
// Beschleunigungssensor ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mittelwert_AccNick = ((long)Mittelwert_AccNick * 3 + ((ACC_AMPLIFY * (long)AdWertAccNick))) / 4L; |
Mittelwert_AccRoll = ((long)Mittelwert_AccRoll * 3 + ((ACC_AMPLIFY * (long)AdWertAccRoll))) / 4L; |
Mittelwert_AccHoch = ((long)Mittelwert_AccHoch * 3 + ((long)AdWertAccHoch)) / 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); |
} |
if(Poti1 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110) Poti1++; else if(Poti1 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110 && Poti1) Poti1--; |
if(Poti2 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110) Poti2++; else if(Poti2 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110 && Poti2) Poti2--; |
if(Poti3 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110) Poti3++; else if(Poti3 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110 && Poti3) Poti3--; |
if(Poti4 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110) Poti4++; else if(Poti4 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110 && Poti4) Poti4--; |
if(Poti1 < 0) Poti1 = 0; else if(Poti1 > 255) Poti1 = 255; |
if(Poti2 < 0) Poti2 = 0; else if(Poti2 > 255) Poti2 = 255; |
if(Poti3 < 0) Poti3 = 0; else if(Poti3 > 255) Poti3 = 255; |
if(Poti4 < 0) Poti4 = 0; else if(Poti4 > 255) Poti4 = 255; |
} |
//############################################################################ |
// Messwerte beim Ermitteln der Nullage |
void CalibrierMittelwert(void) |
//############################################################################ |
{ |
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 * (long)AdWertAccNick; |
Mittelwert_AccRoll = ACC_AMPLIFY * (long)AdWertAccRoll; |
Mittelwert_AccHoch = (long)AdWertAccHoch; |
// ADC einschalten |
ANALOG_ON; |
if(Poti1 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110) Poti1++; else if(Poti1 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110 && Poti1) Poti1--; |
if(Poti2 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110) Poti2++; else if(Poti2 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110 && Poti2) Poti2--; |
if(Poti3 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110) Poti3++; else if(Poti3 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110 && Poti3) Poti3--; |
if(Poti4 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110) Poti4++; else if(Poti4 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110 && Poti4) Poti4--; |
if(Poti1 < 0) Poti1 = 0; else if(Poti1 > 255) Poti1 = 255; |
if(Poti2 < 0) Poti2 = 0; else if(Poti2 > 255) Poti2 = 255; |
if(Poti3 < 0) Poti3 = 0; else if(Poti3 > 255) Poti3 = 255; |
if(Poti4 < 0) Poti4 = 0; else if(Poti4 > 255) Poti4 = 255; |
Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L; |
Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagRoll * 2500L; |
} |
//############################################################################ |
// Senden der Motorwerte per I2C-Bus |
void SendMotorData(void) |
//############################################################################ |
{ |
unsigned char i; |
DebugOut.Analog[12] = Motor[0]; |
DebugOut.Analog[13] = Motor[1]; |
DebugOut.Analog[14] = Motor[3]; |
DebugOut.Analog[15] = Motor[2]; |
if (!(MotorenEin && PARAM_ENGINE_ENABLED)) { |
MikroKopterFlags &= ~(FLAG_MOTOR_RUN | FLAG_FLY); |
for(i=0;i<MAX_MOTORS;i++) |
{ |
if(!PC_MotortestActive) MotorTest[i] = 0; |
Motor[i] = MotorTest[i]; |
} |
if(PC_MotortestActive) PC_MotortestActive--; |
} |
else MikroKopterFlags |= FLAG_MOTOR_RUN; |
//Start I2C Interrupt Mode |
twi_state = 0; |
motor = 0; |
i2c_start(); |
} |
//############################################################################ |
// Trägt ggf. das Poti als Parameter ein |
void ParameterZuordnung(void) |
//############################################################################ |
{ |
#define CHK_POTI_MM(b,a,min,max) { if(a > 250) { if(a == 251) b = Poti1; else if(a == 252) b = Poti2; else if(a == 253) b = Poti3; else if(a == 254) b = Poti4;} else b = a; if(b <= min) b = min; else if(b >= max) b = max;} |
#define CHK_POTI(b,a,min,max) { if(a > 250) { if(a == 251) b = Poti1; else if(a == 252) b = Poti2; else if(a == 253) b = Poti3; else if(a == 254) b = Poti4;} else b = a; } |
CHK_POTI(Parameter_MaxHoehe,EE_Parameter.MaxHoehe,0,255); |
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(Parameter_Hoehe_ACC_Wirkung,EE_Parameter.Hoehe_ACC_Wirkung,0,255); |
CHK_POTI(Parameter_KompassWirkung,EE_Parameter.KompassWirkung,0,255); |
CHK_POTI_MM(Parameter_Gyro_P,EE_Parameter.Gyro_P,10,255); |
CHK_POTI(Parameter_Gyro_I,EE_Parameter.Gyro_I,0,255); |
CHK_POTI(Parameter_Gyro_D,EE_Parameter.Gyro_D,0,255); |
CHK_POTI(Parameter_I_Faktor,EE_Parameter.I_Faktor,0,255); |
CHK_POTI(Parameter_UserParam1,EE_Parameter.UserParam1,0,255); |
CHK_POTI(Parameter_UserParam2,EE_Parameter.UserParam2,0,255); |
CHK_POTI(Parameter_UserParam3,EE_Parameter.UserParam3,0,255); |
CHK_POTI(Parameter_UserParam4,EE_Parameter.UserParam4,0,255); |
CHK_POTI(Parameter_UserParam5,EE_Parameter.UserParam5,0,255); |
CHK_POTI(Parameter_UserParam6,EE_Parameter.UserParam6,0,255); |
CHK_POTI(Parameter_UserParam7,EE_Parameter.UserParam7,0,255); |
CHK_POTI(Parameter_UserParam8,EE_Parameter.UserParam8,0,255); |
CHK_POTI(Parameter_ServoNickControl,EE_Parameter.ServoNickControl,0,255); |
CHK_POTI(Parameter_LoopGasLimit,EE_Parameter.LoopGasLimit,0,255); |
CHK_POTI(Parameter_AchsKopplung1, EE_Parameter.AchsKopplung1,0,255); |
CHK_POTI(Parameter_AchsKopplung2, EE_Parameter.AchsKopplung2,0,255); |
CHK_POTI(Parameter_CouplingYawCorrection,EE_Parameter.CouplingYawCorrection,0,255); |
// CHK_POTI(Parameter_AchsGegenKopplung1,EE_Parameter.AchsGegenKopplung1,0,255); |
CHK_POTI(Parameter_DynamicStability,EE_Parameter.DynamicStability,0,255); |
CHK_POTI_MM(Parameter_J16Timing, EE_Parameter.J16Timing, 1, 255); |
CHK_POTI_MM(Parameter_J16Brightness, PARAM_LED_BRIGHTNESS_J16, 0, 250); |
CHK_POTI_MM(Parameter_J17Timing, EE_Parameter.J17Timing, 1, 255); |
CHK_POTI_MM(Parameter_J17Brightness, PARAM_LED_BRIGHTNESS_J17, 0, 250); |
CHK_POTI(Parameter_ExternalControl,EE_Parameter.ExternalControl,0,255); |
Ki = 10300 / (Parameter_I_Faktor + 1); |
MAX_GAS = EE_Parameter.Gas_Max; |
MIN_GAS = EE_Parameter.Gas_Min; |
} |
//############################################################################ |
// |
void MotorRegler(void) |
//############################################################################ |
{ |
int pd_ergebnis_nick,pd_ergebnis_roll,tmp_int; |
int GierMischanteil,GasMischanteil; |
static long SummeNick=0,SummeRoll=0; |
static long sollGier = 0,tmp_long,tmp_long2; |
static long IntegralFehlerNick = 0; |
static long IntegralFehlerRoll = 0; |
static unsigned int RcLostTimer; |
static unsigned char delay_neutral = 0; |
static unsigned char delay_einschalten = 0,delay_ausschalten = 0; |
static char TimerWerteausgabe = 0; |
static char NeueKompassRichtungMerken = 0; |
static long ausgleichNick, ausgleichRoll; |
int IntegralNickMalFaktor,IntegralRollMalFaktor; |
unsigned char i; |
Mittelwert(); |
GRN_ON; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gaswert ermitteln |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
GasMischanteil = StickGas; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Empfang schlecht |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(SenderOkay < 100) |
{ |
if(!PcZugriff) |
{ |
if(BeepMuster == 0xffff) |
{ |
beeptime = 15000; |
BeepMuster = 0x0c00; |
} |
} |
if(RcLostTimer) RcLostTimer--; |
else |
{ |
MotorenEin = 0; |
Notlandung = 0; |
} |
ROT_ON; |
if(modell_fliegt > 1000) // wahrscheinlich in der Luft --> langsam absenken |
{ |
GasMischanteil = EE_Parameter.NotGas; |
Notlandung = 1; |
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) |
{ |
Notlandung = 0; |
RcLostTimer = EE_Parameter.NotGasZeit * 50; |
if(GasMischanteil > 40 && MotorenEin) |
{ |
if(modell_fliegt < 0xffff) modell_fliegt++; |
} |
if((modell_fliegt < 256)) |
{ |
SummeNick = 0; |
SummeRoll = 0; |
if(modell_fliegt == 250) |
{ |
NeueKompassRichtungMerken = 1; |
sollGier = 0; |
Mess_Integral_Gier = 0; |
// Mess_Integral_Gier2 = 0; |
} |
} else MikroKopterFlags |= FLAG_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; |
SetActiveParamSetNumber(setting); // aktiven Datensatz merken |
} |
// else |
if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) < 30 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < -70) |
{ |
WinkelOut.CalcState = 1; |
beeptime = 1000; |
} |
else |
{ |
ReadParameterSet(GetActiveParamSetNumber(), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
{ |
if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
} |
SetNeutral(); |
init(); |
Piep(GetActiveParamSetNumber()); |
} |
} |
} |
else |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] < -75) // ACC Neutralwerte speichern |
{ |
if(++delay_neutral > 200) // nicht sofort |
{ |
GRN_OFF; |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_NICK],0xff); // Werte löschen |
MotorenEin = 0; |
delay_neutral = 0; |
modell_fliegt = 0; |
SetNeutral(); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_NICK],NeutralAccX / 256); // ACC-NeutralWerte speichern |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_NICK+1],NeutralAccX % 256); // ACC-NeutralWerte speichern |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL],NeutralAccY / 256); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL+1],NeutralAccY % 256); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_Z],(int)NeutralAccZ / 256); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_Z+1],(int)NeutralAccZ % 256); |
Piep(GetActiveParamSetNumber()); |
} |
} |
else delay_neutral = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gas ist unten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] < 35-120) |
{ |
// Starten |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] < -75) |
{ |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Einschalten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(++delay_einschalten > 200) |
{ |
delay_einschalten = 200; |
modell_fliegt = 1; |
MotorenEin = 1; |
sollGier = 0; |
Mess_Integral_Gier = 0; |
Mess_Integral_Gier2 = 0; |
Mess_IntegralNick = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccNick; |
Mess_IntegralRoll = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccRoll; |
Mess_IntegralNick2 = IntegralNick; |
Mess_IntegralRoll2 = IntegralRoll; |
SummeNick = 0; |
SummeRoll = 0; |
MikroKopterFlags |= FLAG_START; |
// Beim Einschalten automatisch kalibrieren |
if (PARAM_CAL_ON_START) { |
if ((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) { |
if ((MessLuftdruck > 950) || (MessLuftdruck < 750)) { |
SucheLuftruckOffset(); |
} |
} |
SetNeutral(); |
} |
} |
} else delay_einschalten = 0; |
//Auf Neutralwerte setzen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Auschalten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] > 75) |
{ |
if(++delay_ausschalten > 200) // nicht sofort |
{ |
MotorenEin = 0; |
delay_ausschalten = 200; |
modell_fliegt = 0; |
} |
} |
else delay_ausschalten = 0; |
} |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// neue Werte von der Funke |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!NewPpmData-- || Notlandung) { |
static int chanNickPrev = 0; |
static int chanRollPrev = 0; |
static int stick_nick,stick_roll; |
ParameterZuordnung(); |
#define MAX_CHAN_VAL 125L |
#define COS45 7071L // cos( -45 ) * 10000 |
long chanNick = PPM_in[EE_Parameter.Kanalbelegung[K_NICK]]; |
long chanRoll = PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]; |
int chanNickDiff; |
int chanRollDiff; |
/* Über Parameter läßt sich zwischen "+" und "X" - Formations |
* umschalten (sh. parameter.h) |
*/ |
if (PARAM_X_FORMATION) { |
chanRoll = -chanRoll; |
// Stick-Koordinatensystem um -45° (rechts) drehen |
chanNick *= COS45; |
chanRoll *= COS45; |
int chanNickTemp = (chanNick - chanRoll) / 10000L; |
int chanRollTemp = (chanRoll + chanNick) / 10000L; |
chanNick = chanNickTemp; |
chanRoll = -chanRollTemp; |
if (chanNick > MAX_CHAN_VAL) |
chanNick = MAX_CHAN_VAL; |
if (chanNick < -MAX_CHAN_VAL) |
chanNick = -MAX_CHAN_VAL; |
if (chanRoll > MAX_CHAN_VAL) |
chanRoll = MAX_CHAN_VAL; |
if (chanRoll < -MAX_CHAN_VAL) |
chanRoll = -MAX_CHAN_VAL; |
} |
chanNickDiff = ((chanNick - chanNickPrev) / 3) * 3; |
chanRollDiff = ((chanRoll - chanRollPrev) / 3) * 3; |
chanNickPrev = chanNick; |
chanRollPrev = chanRoll; |
stick_nick = (stick_nick * 3 + ((int) chanNick) * EE_Parameter.Stick_P) / 4; |
stick_nick += chanNickDiff * EE_Parameter.Stick_D; |
StickNick = stick_nick - GPS_Nick; |
stick_roll = (stick_roll * 3 + ((int) chanRoll) * EE_Parameter.Stick_P) / 4; |
stick_roll += chanRollDiff * EE_Parameter.Stick_D; |
StickRoll = stick_roll - GPS_Roll; |
StickGier = -PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]; |
if(StickGier > 2) StickGier -= 2; else |
if(StickGier < -2) StickGier += 2; else StickGier = 0; |
// Gaswert übernehmen |
// StickGas = pitchValueFP(); |
StickGas = pitch_value(); |
GyroFaktor = (Parameter_Gyro_P + 10.0); |
IntegralFaktor = Parameter_Gyro_I; |
GyroFaktorGier = (Parameter_Gyro_P + 10.0); |
IntegralFaktorGier = Parameter_Gyro_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(GyroFaktor < 0) GyroFaktor = 0; |
if(IntegralFaktor < 0) 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(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(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; |
} |
//if(Poti2 > 20) { tmp_long = 0; tmp_long2 = 0;} |
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//(Poti2/10) |
// 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; |
//DebugOut.Analog[25] = MittelIntegralRoll2 / 26; |
IntegralFehlerNick = tmp_long; |
IntegralFehlerRoll = tmp_long2; |
Mess_IntegralNick2 -= IntegralFehlerNick; |
Mess_IntegralRoll2 -= IntegralFehlerRoll; |
// IntegralFehlerNick = (IntegralFehlerNick * 1 + tmp_long) / 2; |
// IntegralFehlerRoll = (IntegralFehlerRoll * 1 + tmp_long2) / 2; |
if(EE_Parameter.Driftkomp) |
{ |
if(GierGyroFehler > ABGLEICH_ANZAHL/2) { AdNeutralGier++; AdNeutralGierBias++; } |
if(GierGyroFehler <-ABGLEICH_ANZAHL/2) { AdNeutralGier--; AdNeutralGierBias--; } |
} |
//DebugOut.Analog[22] = MittelIntegralRoll / 26; |
//DebugOut.Analog[24] = GierGyroFehler; |
GierGyroFehler = 0; |
/*DebugOut.Analog[17] = IntegralAccNick / 26; |
DebugOut.Analog[18] = IntegralAccRoll / 26; |
DebugOut.Analog[19] = IntegralFehlerNick;// / 26; |
DebugOut.Analog[20] = IntegralFehlerRoll;// / 26; |
*/ |
//DebugOut.Analog[21] = MittelIntegralNick / 26; |
//MittelIntegralRoll = MittelIntegralRoll; |
//DebugOut.Analog[28] = ausgleichNick; |
/* |
DebugOut.Analog[29] = ausgleichRoll; |
DebugOut.Analog[30] = LageKorrekturRoll * 10; |
*/ |
#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(IntegralFehlerNick) / 4096; |
if(labs(IntegralFehlerRoll) > FEHLER_LIMIT1) cnt = 4; |
ausgleichRoll = 0; |
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(GasMischanteil < 35) { if(StickGier > 10) StickGier = 10; else if(StickGier < -10) StickGier = -10;}; |
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 |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//DebugOut.Analog[16] = KompassSignalSchlecht; |
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 + 1; |
fehler = ((540 + KompassValue - (ErsatzKompass/GIER_GRAD_FAKTOR)) % 360) - 180; |
if(abs(MesswertGier) > 128) |
{ |
fehler = 0; |
} |
if(!KompassSignalSchlecht && w < 25) |
{ |
GierGyroFehler += fehler; |
if(NeueKompassRichtungMerken) |
{ |
beeptime = 200; |
// KompassStartwert = KompassValue; |
ErsatzKompass = KompassValue * GIER_GRAD_FAKTOR; |
KompassStartwert = (ErsatzKompass/GIER_GRAD_FAKTOR); |
NeueKompassRichtungMerken = 0; |
} |
} |
ErsatzKompass += (fehler * 8) / 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; |
// r = KompassRichtung; |
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 |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Debugwerte zuordnen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!TimerWerteausgabe--) |
{ |
TimerWerteausgabe = 24; |
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] = MesswertGier; |
DebugOut.Analog[5] = HoehenWert; |
DebugOut.Analog[6] = Aktuell_az;//(Mess_Integral_Hoch / 512);//Aktuell_az; |
DebugOut.Analog[8] = KompassValue; |
DebugOut.Analog[9] = UBat; |
DebugOut.Analog[11] = ErsatzKompass / GIER_GRAD_FAKTOR; |
DebugOut.Analog[10] = SenderOkay; |
//DebugOut.Analog[16] = Mittelwert_AccHoch; |
//DebugOut.Analog[17] = FromNaviCtrl_Value.Distance; |
//DebugOut.Analog[18] = (int)FromNaviCtrl_Value.OsdBar; |
DebugOut.Analog[19] = WinkelOut.CalcState; |
DebugOut.Analog[20] = ServoValue; |
// DebugOut.Analog[24] = MesswertNick/2; |
// DebugOut.Analog[25] = MesswertRoll/2; |
DebugOut.Analog[27] = (int)FromNaviCtrl_Value.Kalman_MaxDrift; |
// DebugOut.Analog[28] = (int)FromNaviCtrl_Value.Kalman_MaxFusion; |
// DebugOut.Analog[29] = (int)FromNaviCtrl_Value.Kalman_K; |
DebugOut.Analog[29] = FromNaviCtrl_Value.SerialDataOkay; |
DebugOut.Analog[30] = GPS_Nick; |
DebugOut.Analog[31] = GPS_Roll; |
// DebugOut.Analog[19] -= DebugOut.Analog[19]/128; |
// if(DebugOut.Analog[19] > 0) DebugOut.Analog[19]--; else DebugOut.Analog[19]++; |
/* DebugOut.Analog[16] = motor_rx[0]; |
DebugOut.Analog[17] = motor_rx[1]; |
DebugOut.Analog[18] = motor_rx[2]; |
DebugOut.Analog[19] = motor_rx[3]; |
DebugOut.Analog[20] = motor_rx[0] + motor_rx[1] + motor_rx[2] + motor_rx[3]; |
DebugOut.Analog[20] /= 14; |
DebugOut.Analog[21] = motor_rx[4]; |
DebugOut.Analog[22] = motor_rx[5]; |
DebugOut.Analog[23] = motor_rx[6]; |
DebugOut.Analog[24] = motor_rx[7]; |
DebugOut.Analog[25] = motor_rx[4] + motor_rx[5] + motor_rx[6] + motor_rx[7]; |
*/ |
// DebugOut.Analog[9] = MesswertNick; |
// DebugOut.Analog[9] = SollHoehe; |
// DebugOut.Analog[10] = Mess_Integral_Gier / 128; |
// DebugOut.Analog[11] = KompassStartwert; |
// DebugOut.Analog[10] = Parameter_Gyro_I; |
// DebugOut.Analog[10] = EE_Parameter.Gyro_I; |
// DebugOut.Analog[9] = KompassRichtung; |
// DebugOut.Analog[10] = GasMischanteil; |
// DebugOut.Analog[3] = HoeheD * 32; |
// DebugOut.Analog[4] = hoehenregler; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Drehgeschwindigkeit und -winkel zu einem Istwert zusammenfassen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(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*4) |
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; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// all BL-Ctrl connected? |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(MissingMotor) if(modell_fliegt > 1 && modell_fliegt < 50 && GasMischanteil > 0) |
{ |
modell_fliegt = 1; |
GasMischanteil = MIN_GAS; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Höhenregelung |
// Die Höhenregelung schwächt lediglich das Gas ab, erhöht es allerdings nicht |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
GasMischanteil *= STICK_GAIN; |
/* |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung |
{ |
int tmp_int; |
static char delay = 100; |
if(EE_Parameter.GlobalConfig & CFG_HOEHEN_SCHALTER) // Regler wird über Schalter gesteuert |
{ |
if(Parameter_MaxHoehe < 50) |
{ |
if(!delay--) |
{ |
if((MessLuftdruck > 1000) && OCR0A < 254) |
{ |
if(OCR0A < 244) |
{ |
ExpandBaro -= 10; |
OCR0A = DruckOffsetSetting - ExpandBaro; |
} |
else OCR0A = 254; |
beeptime = 300; |
delay = 250; |
} |
else |
if((MessLuftdruck < 100) && OCR0A > 1) |
{ |
if(OCR0A > 10) |
{ |
ExpandBaro += 10; |
OCR0A = DruckOffsetSetting - ExpandBaro; |
} |
else OCR0A = 1; |
beeptime = 300; |
delay = 250; |
} |
else |
{ |
SollHoehe = HoehenWert - 20; // Parameter_MaxHoehe ist der PPM-Wert des Schalters |
HoehenReglerAktiv = 0; |
delay = 1; |
} |
} |
} |
else |
{ |
HoehenReglerAktiv = 1; |
delay = 200; |
} |
} |
else |
{ |
SollHoehe = ((int) ExternHoehenValue + (int) Parameter_MaxHoehe) * (int)EE_Parameter.Hoehe_Verstaerkung - 20; |
HoehenReglerAktiv = 1; |
} |
if(Notlandung) SollHoehe = 0; |
h = HoehenWert; |
if((h > SollHoehe) && HoehenReglerAktiv) // zu hoch --> drosseln |
{ |
h = ((h - SollHoehe) * (int) Parameter_Hoehe_P) / (16 / STICK_GAIN); // Differenz bestimmen --> P-Anteil |
h = GasMischanteil - h; // vom Gas abziehen |
h -= (HoeheD)/(8/STICK_GAIN); // D-Anteil |
tmp_int = ((Mess_Integral_Hoch / 128) * (signed long) Parameter_Hoehe_ACC_Wirkung) / (128 / STICK_GAIN); |
if(tmp_int > 70*STICK_GAIN) tmp_int = 70*STICK_GAIN; |
else if(tmp_int < -(70*STICK_GAIN)) tmp_int = -(70*STICK_GAIN); |
h -= tmp_int; |
hoehenregler = (hoehenregler*15 + h) / 16; |
if(hoehenregler < EE_Parameter.Hoehe_MinGas * STICK_GAIN) // nicht unter MIN |
{ |
if(GasMischanteil >= EE_Parameter.Hoehe_MinGas * STICK_GAIN) hoehenregler = EE_Parameter.Hoehe_MinGas * STICK_GAIN; |
if(GasMischanteil < EE_Parameter.Hoehe_MinGas * STICK_GAIN) hoehenregler = GasMischanteil; |
} |
if(hoehenregler > GasMischanteil) hoehenregler = GasMischanteil; // nicht mehr als Gas |
GasMischanteil = hoehenregler; |
} |
} |
*/ |
// Fehlerwert der Höhenregelung einmischen |
GasMischanteil -= altcon_error(); |
if(GasMischanteil > (MAX_GAS - 20) * STICK_GAIN) GasMischanteil = (MAX_GAS - 20) * STICK_GAIN; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Mischer und PI-Regler |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DebugOut.Analog[7] = GasMischanteil; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gier-Anteil |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define MUL_G 1.0 |
GierMischanteil = MesswertGier - sollGier * STICK_GAIN; // Regler für Gier |
// GierMischanteil = 0; |
#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 = DiffNick + 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 = DiffRoll + 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) |
{ |
tmp_int = ((long)GasMischanteil * Mixer.Motor[i][0]) / 64L; |
tmp_int += ((long)pd_ergebnis_nick * Mixer.Motor[i][1]) / 64L; |
tmp_int += ((long)pd_ergebnis_roll * Mixer.Motor[i][2]) / 64L; |
tmp_int += ((long)GierMischanteil * Mixer.Motor[i][3]) / 64L; |
tmp_motorwert[i] = MotorSmoothing(tmp_int,tmp_motorwert[i]); // Filter |
tmp_int = tmp_motorwert[i] / STICK_GAIN; |
CHECK_MIN_MAX(tmp_int,MIN_GAS,MAX_GAS); |
Motor[i] = tmp_int; |
} |
else Motor[i] = 0; |
} |
/* |
if(Poti1 > 20) Motor1 = 0; |
if(Poti1 > 90) Motor6 = 0; |
if(Poti1 > 140) Motor2 = 0; |
//if(Poti1 > 200) Motor7 = 0; |
*/ |
} |
/branches/thjac/V1_12/fc.h |
---|
0,0 → 1,184 |
/*####################################################################################### |
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 FLAG_MOTOR_RUN 1 |
#define FLAG_FLY 2 |
#define FLAG_CALIBRATE 4 |
#define FLAG_START 8 |
#define MAX_MOTORS 12 |
#define CHECK_MIN_MAX(wert,min,max) {if(wert < min) wert = min; else if(wert > max) wert = max;} |
extern volatile unsigned char MikroKopterFlags; |
extern volatile unsigned int I2CTimeout; |
extern unsigned char Sekunde,Minute; |
extern long IntegralNick,IntegralNick2; |
extern long IntegralRoll,IntegralRoll2; |
//extern int IntegralNick,IntegralNick2; |
//extern int IntegralRoll,IntegralRoll2; |
extern long Mess_IntegralNick,Mess_IntegralNick2; |
extern long Mess_IntegralRoll,Mess_IntegralRoll2; |
extern long IntegralAccNick,IntegralAccRoll; |
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 int TrimNick, TrimRoll; |
extern long ErsatzKompass; |
extern int ErsatzKompassInGrad; // Kompasswert in Grad |
extern int HoehenWert; |
extern int SollHoehe; |
extern int MesswertNick,MesswertRoll,MesswertGier; |
extern int AdNeutralNick,AdNeutralRoll,AdNeutralGier, Mittelwert_AccNick, Mittelwert_AccRoll; |
extern int NeutralAccX, NeutralAccY,Mittelwert_AccHoch; |
extern unsigned char HoehenReglerAktiv; |
extern volatile float 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; |
void MotorRegler(void); |
void SendMotorData(void); |
void CalibrierMittelwert(void); |
void Mittelwert(void); |
void SetNeutral(void); |
void Piep(unsigned char Anzahl); |
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 unsigned char RequiredMotors; |
extern int StickNick,StickRoll,StickGier; |
extern char MotorenEin; |
extern void DefaultKonstanten1(void); |
extern void DefaultKonstanten2(void); |
extern void DefaultKonstanten3(void); |
extern void DefaultStickMapping(void); |
#define STRUCT_PARAM_LAENGE sizeof(EE_Parameter) |
struct mk_param_struct |
{ |
unsigned char Kanalbelegung[8]; // GAS[0], GIER[1],NICK[2], ROLL[3], POTI1, POTI2, POTI3 |
unsigned char GlobalConfig; // 0x01=Höhenregler aktiv,0x02=Kompass aktiv, 0x04=GPS aktiv, 0x08=Heading Hold aktiv |
unsigned char Hoehe_MinGas; // Wert : 0-100 |
unsigned char Luftdruck_D; // Wert : 0-250 |
unsigned char MaxHoehe; // Wert : 0-32 |
unsigned char Hoehe_P; // Wert : 0-32 |
unsigned char Hoehe_Verstaerkung; // Wert : 0-50 |
unsigned char Hoehe_ACC_Wirkung; // Wert : 0-250 |
unsigned char Stick_P; // Wert : 1-6 |
unsigned char Stick_D; // Wert : 0-64 |
unsigned char Gier_P; // Wert : 1-20 |
unsigned char Gas_Min; // Wert : 0-32 |
unsigned char Gas_Max; // Wert : 33-250 |
unsigned char GyroAccFaktor; // Wert : 1-64 |
unsigned char KompassWirkung; // Wert : 0-32 |
unsigned char Gyro_P; // Wert : 10-250 |
unsigned char Gyro_I; // Wert : 0-250 |
unsigned char Gyro_D; // Wert : 0-250 |
unsigned char UnterspannungsWarnung; // Wert : 0-250 |
unsigned char NotGas; // Wert : 0-250 //Gaswert bei Empängsverlust |
unsigned char NotGasZeit; // Wert : 0-250 // Zeitbis auf NotGas geschaltet wird, wg. Rx-Problemen |
unsigned char UfoAusrichtung; // X oder + Formation |
unsigned char I_Faktor; // Wert : 0-250 |
unsigned char UserParam1; // Wert : 0-250 |
unsigned char UserParam2; // Wert : 0-250 |
unsigned char UserParam3; // Wert : 0-250 |
unsigned char UserParam4; // Wert : 0-250 |
unsigned char ServoNickControl; // Wert : 0-250 // Stellung des Servos |
unsigned char ServoNickComp; // Wert : 0-250 // Einfluss Gyro/Servo |
unsigned char ServoNickMin; // Wert : 0-250 // Anschlag |
unsigned char ServoNickMax; // Wert : 0-250 // Anschlag |
unsigned char ServoNickRefresh; // |
unsigned char LoopGasLimit; // Wert: 0-250 max. Gas während Looping |
unsigned char LoopThreshold; // Wert: 0-250 Schwelle für Stickausschlag |
unsigned char LoopHysterese; // Wert: 0-250 Hysterese für Stickausschlag |
unsigned char AchsKopplung1; // Wert: 0-250 Faktor, mit dem Gier die Achsen Roll und Nick koppelt (NickRollMitkopplung) |
unsigned char 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 |
//---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 |
//------------------------------------------------ |
unsigned char BitConfig; // (war Loop-Cfg) Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
unsigned char ServoNickCompInvert; // Wert : 0-250 0 oder 1 // WICHTIG!!! am Ende lassen |
unsigned char Reserved[4]; |
char Name[12]; |
}; |
struct |
{ |
char Revision; |
char Name[12]; |
signed char Motor[16][4]; |
} Mixer; |
extern struct mk_param_struct EE_Parameter; |
extern unsigned char Parameter_Luftdruck_D; |
extern unsigned char Parameter_MaxHoehe; |
extern unsigned char Parameter_Hoehe_P; |
extern unsigned char Parameter_Hoehe_ACC_Wirkung; |
extern unsigned char Parameter_KompassWirkung; |
extern unsigned char Parameter_Gyro_P; |
extern unsigned char Parameter_Gyro_I; |
extern unsigned char Parameter_Gier_P; |
extern unsigned char Parameter_ServoNickControl; |
extern unsigned char Parameter_AchsKopplung1; |
extern unsigned char Parameter_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_J16Brightness; // for the J16 Output |
extern unsigned char Parameter_J17Bitmask; // for the J17 Output |
extern unsigned char Parameter_J17Timing; // for the J17 Output |
extern unsigned char Parameter_J17Brightness; // for the J17 Output |
extern signed char MixerTable[MAX_MOTORS][4]; |
extern unsigned char Motor[MAX_MOTORS]; |
#endif //_FC_H |
/branches/thjac/V1_12/flight.pnproj |
---|
0,0 → 1,0 |
<Project name="Flight-Ctrl"><File path="uart.h"></File><File path="main.c"></File><File path="main.h"></File><File path="makefile"></File><File path="uart.c"></File><File path="printf_P.h"></File><File path="printf_P.c"></File><File path="timer0.c"></File><File path="timer0.h"></File><File path="old_macros.h"></File><File path="twimaster.c"></File><File path="version.txt"></File><File path="twimaster.h"></File><File path="rc.c"></File><File path="rc.h"></File><File path="fc.h"></File><File path="menu.h"></File><File path="menu.c"></File><File path="_Settings.h"></File><File path="analog.c"></File><File path="analog.h"></File><File path="GPS.c"></File><File path="gps.h"></File><File path="License.txt"></File><File path="eeprom.c"></File><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="Spectrum.c"></File><File path="Spectrum.h"></File><File path="altcon.c"></File><File path="altcon.h"></File><File path="parameter.h"></File><File path="pitch.c"></File><File path="pitch.h"></File><File path="pitch_md.c"></File><File path="pitch_md.h"></File></Project> |
/branches/thjac/V1_12/flight.pnps |
---|
0,0 → 1,0 |
<pd><ViewState><e p="Flight-Ctrl" x="true"></e></ViewState></pd> |
/branches/thjac/V1_12/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/thjac/V1_12/led.c |
---|
0,0 → 1,117 |
#include <inttypes.h> |
#include "main.h" |
#include "parameter.h" |
unsigned char J16Blinkcount = 0, J16Mask = 1, J16Brightness = 0, J16 = 0; |
unsigned char J17Blinkcount = 0, J17Mask = 1, J17Brightness = 0, J17 = 0; |
unsigned char lightsEnabled = 0, lightsOn = 0; |
extern char MotorenEin; |
void setJ16(char enabled) { |
if ((enabled && lightsOn) ^ LED_NEGATE_J16) |
J16_ON; |
else |
J16_OFF; |
} |
void setJ17(char enabled) { |
if ((enabled && lightsOn) ^ LED_NEGATE_J17) |
J17_ON; |
else |
J17_OFF; |
} |
// 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); |
lightsOn = lightsEnabled = 0; |
setJ16(0); |
setJ17(0); |
J16Blinkcount = 0; |
J16Mask = 128; |
J17Blinkcount = 0; |
J17Mask = 128; |
} |
static inline void checkLightsEnabled(void) { |
// Die LED's können mit den Motoren ein- ausgeschaltet werden |
if (PARAM_LED_ENGINE_ENABLED) |
lightsEnabled = MotorenEin; |
// Die LED's können mit den Motoren ein- ausgeschaltet werden |
else if (PARAM_LED_STICK_ENABLED) { |
if (!MotorenEin) { |
if (PPM_in[ EE_Parameter.Kanalbelegung[ K_GAS ] ] > 35 - 120 |
&& PPM_in[ EE_Parameter.Kanalbelegung[ K_GAS ] ] < 120 - 35) { |
if (PPM_in[ EE_Parameter.Kanalbelegung[ K_GIER ] ] < -75) |
lightsEnabled = 1; |
if (PPM_in[ EE_Parameter.Kanalbelegung[ K_GIER ] ] > 75) |
lightsEnabled = 0; |
} |
} |
} else |
lightsEnabled = 1; |
lightsOn = lightsEnabled; |
} |
// called in UpdateMotors() every 2ms |
void LED_Update(void) { |
static char delay = 0; |
if (!delay--) { |
delay = 9; // 20ms Intervall |
checkLightsEnabled(); |
// Soll die Unterspannungswarnung zu einem schnelleren Blinken führen? |
// Grenze für Unterspannungswarnung erreicht? |
if (PARAM_LED_WARNING_SPEEDUP && UBat < EE_Parameter.UnterspannungsWarnung) { |
if (PARAM_LED_FORCE_WARNING_ENABLED) // Erzwingt die Aktivierung der Ausgänge |
lightsOn = 1; |
delay /= PARAM_LED_WARNING_SPEEDUP + 1; |
} |
// J16 |
if (EE_Parameter.J16Timing > 250 && Parameter_J16Timing > 230) |
J16 = EE_Parameter.J16Bitmask & 128; |
else if (EE_Parameter.J16Timing > 250 && Parameter_J16Timing < 10) |
J16 = !(EE_Parameter.J16Bitmask & 128); |
else if (!J16Blinkcount--) { |
J16Blinkcount = Parameter_J16Timing - 1; |
J16Mask = (J16Mask == 1 ? 0x80 : J16Mask >> 1); |
J16 = EE_Parameter.J16Bitmask & J16Mask; |
} |
J16Brightness = EE_Parameter.J16Bitmask & J16Mask ? Parameter_J16Brightness / 23 : 0; |
// J17 |
if (EE_Parameter.J17Timing > 250 && Parameter_J17Timing > 230) |
J17 = EE_Parameter.J17Bitmask & 128; |
else if (EE_Parameter.J17Timing > 250 && Parameter_J17Timing < 10) |
J17 = !(EE_Parameter.J17Bitmask & 128); |
else if (!J17Blinkcount--) { |
J17Blinkcount = Parameter_J17Timing - 1; |
J17Mask = (J17Mask == 1 ? 0x80 : J17Mask >> 1); |
J17 = EE_Parameter.J17Bitmask & J17Mask; |
} |
J17Brightness = EE_Parameter.J17Bitmask & J17Mask ? Parameter_J17Brightness / 23 : 0; |
} |
// delay: 0...9 - BRIGHTNESS/23: 0-Aus...10-Max - Bei Unterspannung volle Leuchtkraft |
setJ16(J16 && (delay < J16Brightness || UBat < EE_Parameter.UnterspannungsWarnung)); |
setJ17(J17 && (delay < J17Brightness || UBat < EE_Parameter.UnterspannungsWarnung)); |
} |
/branches/thjac/V1_12/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/thjac/V1_12/main.c |
---|
0,0 → 1,378 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + Nur für den privaten Gebrauch |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten und nicht-kommerziellen Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt und genannt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-commercial use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be |
// + clearly linked as origin |
// + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
#include "altcon.h" |
#include "pitch.h" |
#include "led.h" |
unsigned char EEPromArray[E2END+1] EEMEM; |
unsigned char PlatinenVersion = 10; |
unsigned char SendVersionToNavi = 1; |
// -- Parametersatz aus EEPROM lesen --- |
// number [1..5] |
void init( void ) { |
LED_Init(); |
altcon_init(); |
pitch_init(); |
} |
void ReadParameterSet(unsigned char number, unsigned char *buffer, unsigned char length) { |
if ((number > 5) || (number < 1)) number = 3; |
eeprom_read_block(buffer, &EEPromArray[EEPROM_ADR_PARAM_BEGIN + length * (number - 1)], length); |
} |
// -- Parametersatz ins EEPROM schreiben --- |
// number [1..5] |
void WriteParameterSet(unsigned char number, unsigned char *buffer, unsigned char length) |
{ |
if(number > 5) number = 5; |
if(number < 1) return; |
eeprom_write_block(buffer, &EEPromArray[EEPROM_ADR_PARAM_BEGIN + length * (number - 1)], length); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_PARAM_LENGTH], length); // Länge der Datensätze merken |
eeprom_write_block(buffer, &EEPromArray[EEPROM_ADR_CHANNELS], 8); // 8 Kanäle merken |
SetActiveParamSetNumber(number); |
LED_Init(); |
} |
unsigned char GetActiveParamSetNumber(void) |
{ |
unsigned char set; |
set = eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET]); |
if((set > 5) || (set < 1)) |
{ |
set = 3; |
SetActiveParamSetNumber(set); // diesen Parametersatz als aktuell merken |
} |
return(set); |
} |
void SetActiveParamSetNumber(unsigned char number) |
{ |
if(number > 5) number = 5; |
if(number < 1) return; |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], number); // diesen Parametersatz als aktuell merken |
} |
void CalMk3Mag(void) |
{ |
static unsigned char stick = 1; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > -20) stick = 0; |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < -70) && !stick) |
{ |
stick = 1; |
WinkelOut.CalcState++; |
if(WinkelOut.CalcState > 4) |
{ |
// WinkelOut.CalcState = 0; // in Uart.c |
beeptime = 1000; |
} |
else Piep(WinkelOut.CalcState); |
} |
DebugOut.Analog[19] = WinkelOut.CalcState; |
} |
//############################################################################ |
//Hauptprogramm |
int main (void) |
//############################################################################ |
{ |
unsigned int timer,i; |
DDRB = 0x00; |
PORTB = 0x00; |
for(timer = 0; timer < 1000; timer++); // verzögern |
if(PINB & 0x01) |
{ |
if(PINB & 0x02) PlatinenVersion = 13; |
else PlatinenVersion = 11; |
} |
else |
{ |
if(PINB & 0x02) PlatinenVersion = 20; |
else PlatinenVersion = 10; |
} |
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 |
DDRD |=0x80; // J7 -> Servo signal |
PORTD = 0x47; // LED |
HEF4017R_ON; |
MCUSR &=~(1<<WDRF); |
WDTCSR |= (1<<WDCE)|(1<<WDE); |
WDTCSR = 0; |
beeptime = 2000; |
StickGier = 0; PPM_in[K_GAS] = 0;StickRoll = 0; StickNick = 0; |
if(PlatinenVersion >= 20) GIER_GRAD_FAKTOR = 1160; 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(); |
sei(); |
printf("\n\r==================================="); |
printf("\n\rFlightControl\n\rHardware:%d.%d\n\rSoftware:V%d.%d%c ",PlatinenVersion/10,PlatinenVersion%10, VERSION_MAJOR, VERSION_MINOR,VERSION_PATCH + 'a'); |
if(UCSR1A == 0x20 && UCSR1C == 0x06) // initial Values for 644P |
{ |
Uart1Init(); |
} |
GRN_ON; |
ReadParameterSet(3, (unsigned char *) &EE_Parameter.Kanalbelegung[0], 9); // read only the first bytes |
if((eeprom_read_byte(&EEPromArray[EEPROM_ADR_MIXER_TABLE]) == MIXER_REVISION) && // Check Revision in the first Byte |
(eeprom_read_byte(&EEPromArray[EEPROM_ADR_VALID]) != 0xff)) // Settings reset via Koptertool |
{ |
unsigned char i; |
RequiredMotors = 0; |
eeprom_read_block(&Mixer, &EEPromArray[EEPROM_ADR_MIXER_TABLE], sizeof(Mixer)); |
for(i=0; i<16;i++) { if(Mixer.Motor[i][0] > 0) RequiredMotors++;} |
} |
else // default |
{ |
unsigned char i; |
printf("\n\rGenerating default Mixer Table"); |
for(i=0; i<16;i++) { Mixer.Motor[i][0] = 0;Mixer.Motor[i][1] = 0;Mixer.Motor[i][2] = 0;Mixer.Motor[i][3] = 0;}; |
// default = Quadro |
Mixer.Motor[0][0] = 64; Mixer.Motor[0][1] = +64; Mixer.Motor[0][2] = 0; Mixer.Motor[0][3] = +64; |
Mixer.Motor[1][0] = 64; Mixer.Motor[1][1] = -64; Mixer.Motor[1][2] = 0; Mixer.Motor[1][3] = +64; |
Mixer.Motor[2][0] = 64; Mixer.Motor[2][1] = 0; Mixer.Motor[2][2] = -64; Mixer.Motor[2][3] = -64; |
Mixer.Motor[3][0] = 64; Mixer.Motor[3][1] = 0; Mixer.Motor[3][2] = +64; Mixer.Motor[3][3] = -64; |
Mixer.Revision = MIXER_REVISION; |
memcpy(Mixer.Name, "Quadro\0", 11); |
eeprom_write_block(&Mixer, &EEPromArray[EEPROM_ADR_MIXER_TABLE], sizeof(Mixer)); |
} |
printf("\n\rMixer-Config: '%s' (%u Motors)",Mixer.Name,RequiredMotors); |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Check connected BL-Ctrls |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
printf("\n\rFound BL-Ctrl: "); |
motorread = 0; UpdateMotor = 0; SendMotorData(); while(!UpdateMotor); motorread = 0; // read the first I2C-Data |
for(i=0; i < MAX_MOTORS; i++) |
{ |
UpdateMotor = 0; |
SendMotorData(); |
while(!UpdateMotor); |
if(MotorPresent[i]) printf("%d ",i+1); |
} |
for(i=0; i < MAX_MOTORS; i++) |
{ |
if(!MotorPresent[i] && Mixer.Motor[i][0] > 0) printf("\n\r\n\r!! MISSING BL-CTRL: %d !!",i+1); |
MotorError[i] = 0; |
} |
printf("\n\r==================================="); |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Check Settings |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_VALID]) != EE_DATENREVISION) |
{ |
DefaultKonstanten1(); |
printf("\n\rInit. EEPROM"); |
for (unsigned char i=1;i<6;i++) |
{ |
if(i==2) DefaultKonstanten2(); // Kamera |
if(i==3) DefaultKonstanten3(); // Beginner |
if(i>3) DefaultKonstanten2(); // Kamera |
if(PlatinenVersion >= 20) |
{ |
EE_Parameter.Gyro_D = 5; |
EE_Parameter.Driftkomp = 0; |
EE_Parameter.GyroAccFaktor = 27; |
EE_Parameter.WinkelUmschlagNick = 78; |
EE_Parameter.WinkelUmschlagRoll = 78; |
} |
// valid Stick-Settings? |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS]) < 12 && eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+1]) < 12 && eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+2]) < 12 && eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+3]) < 12) |
{ |
EE_Parameter.Kanalbelegung[0] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+0]); |
EE_Parameter.Kanalbelegung[1] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+1]); |
EE_Parameter.Kanalbelegung[2] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+2]); |
EE_Parameter.Kanalbelegung[3] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+3]); |
EE_Parameter.Kanalbelegung[4] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+4]); |
EE_Parameter.Kanalbelegung[5] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+5]); |
EE_Parameter.Kanalbelegung[6] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+6]); |
EE_Parameter.Kanalbelegung[7] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+7]); |
if(i==1) printf(": Generating Default-Parameter using old Stick Settings"); |
} else DefaultStickMapping(); |
WriteParameterSet(i, (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
} |
SetActiveParamSetNumber(3); // default-Setting |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_VALID], EE_DATENREVISION); |
} |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) > 4) |
{ |
printf("\n\rACC not calibrated !"); |
} |
ReadParameterSet(GetActiveParamSetNumber(), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
printf("\n\rUsing parameterset %d", GetActiveParamSetNumber()); |
if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
printf("\n\rCalibrating pressure sensor.."); |
timer = SetDelay(1000); |
SucheLuftruckOffset(); |
while (!CheckDelay(timer)); |
printf("OK\n\r"); |
} |
SetNeutral(); |
ROT_OFF; |
beeptime = 2000; |
ExternControl.Digital[0] = 0x55; |
printf("\n\rControl: "); |
if (EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) printf("HeadingHold"); |
else printf("Normal (ACC-Mode)"); |
printf("\n\r===================================\n\r"); |
// Initialisierung muß nach Einlesen der Konfiguration erfolgen |
init(); |
LcdClear(); |
I2CTimeout = 5000; |
WinkelOut.Orientation = 1; |
while (1) |
{ |
if(UpdateMotor && AdReady) // ReglerIntervall |
{ |
UpdateMotor=0; |
if(WinkelOut.CalcState) CalMk3Mag(); |
else MotorRegler(); |
SendMotorData(); |
ROT_OFF; |
if(PcZugriff) PcZugriff--; |
else |
{ |
ExternControl.Config = 0; |
ExternStickNick = 0; |
ExternStickRoll = 0; |
ExternStickGier = 0; |
} |
if(SenderOkay) SenderOkay--; |
if(NaviDataOkay) |
{ |
if(--NaviDataOkay == 0) |
{ |
GPS_Nick = 0; |
GPS_Roll = 0; |
} |
} |
if(!--I2CTimeout || MissingMotor) |
{ |
if(!I2CTimeout) |
{ |
i2c_reset(); |
I2CTimeout = 5; |
} |
if((BeepMuster == 0xffff) && MotorenEin) |
{ |
beeptime = 10000; |
BeepMuster = 0x0080; |
} |
} |
else |
{ |
ROT_OFF; |
} |
if(SIO_DEBUG && (!UpdateMotor || !MotorenEin)) |
{ |
DatenUebertragung(); |
BearbeiteRxDaten(); |
} |
else BearbeiteRxDaten(); |
if(CheckDelay(timer)) |
{ |
if(UBat < EE_Parameter.UnterspannungsWarnung) |
{ |
if(BeepMuster == 0xffff) |
{ |
beeptime = 6000; |
BeepMuster = 0x0300; |
} |
} |
SPI_StartTransmitPacket(); |
SendSPI = 4; |
timer = SetDelay(20); |
} |
LED_Update(); |
} |
if(!SendSPI) { SPI_TransmitByte(); } |
} |
return (1); |
} |
//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; |
/branches/thjac/V1_12/main.h |
---|
0,0 → 1,174 |
#ifndef _MAIN_H |
#define _MAIN_H |
#define QUADRO |
//#define OCTO // 2 Arms in Front |
//#define OCTO2 // 1 Arm in front |
//#define OCTO3 // 1 Arm with two Motors in front or Coax |
//+++++++++++ |
// 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 |
//Hier die Quarz Frequenz einstellen |
#if defined (__AVR_ATmega32__) |
#define SYSCLK 20000000L //Quarz Frequenz in Hz |
#endif |
#if defined (__AVR_ATmega644__) |
#define SYSCLK 20000000L //Quarz Frequenz in Hz |
#endif |
#if defined (__AVR_ATmega644P__) |
#define SYSCLK 20000000L //Quarz Frequenz in Hz |
#endif |
// 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 F_CPU SYSCLK |
//#ifndef F_CPU |
//#error ################## F_CPU nicht definiert oder ungültig ############# |
//#endif |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define EE_DATENREVISION 75 // wird angepasst, wenn sich die EEPROM-Daten geändert haben |
#define MIXER_REVISION 1 // wird angepasst, wenn sich die Mixer-Daten geändert haben |
#define EEPROM_ADR_VALID 1 |
#define EEPROM_ADR_ACTIVE_SET 2 |
#define EEPROM_ADR_LAST_OFFSET 3 |
#define EEPROM_ADR_ACC_NICK 4 |
#define EEPROM_ADR_ACC_ROLL 6 |
#define EEPROM_ADR_ACC_Z 8 |
#define EEPROM_ADR_PITCH_MD_HOVER 10 |
#define EEPROM_ADR_PITCH_NEUTRAL_DIFF 12 |
#define EEPROM_ADR_CHANNELS 80 |
#define EEPROM_ADR_PARAM_LENGTH 98 |
#define EEPROM_ADR_PARAM_BEGIN 100 |
#define EEPROM_ADR_MIXER_TABLE 1000 // 1001 - 1100 |
#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_RES1 0x10 |
#define CFG_RES2 0x20 |
#define CFG_RES3 0x40 |
#define CFG_RES4 0x80 |
#define J3High PORTD |= 0x20 |
#define J3Low PORTD &= ~0x20 |
#define J4High PORTD |= 0x10 |
#define J4Low PORTD &= ~0x10 |
#define J5High PORTD |= 0x08 |
#define J5Low PORTD &= ~0x08 |
//#define SYSCLK |
//extern unsigned long SYSCLK; |
extern volatile unsigned char SenderOkay; |
extern unsigned char CosinusNickWinkel, CosinusRollWinkel; |
extern unsigned char PlatinenVersion; |
extern unsigned char SendVersionToNavi; |
void ReadParameterSet (unsigned char number, unsigned char *buffer, unsigned char length); |
void WriteParameterSet(unsigned char number, unsigned char *buffer, unsigned char length); |
extern unsigned char GetActiveParamSetNumber(void); |
void SetActiveParamSetNumber(unsigned char number); |
extern unsigned char EEPromArray[]; |
extern void init( void ); |
#include <stdlib.h> |
#include <string.h> |
#include <avr/io.h> |
#include <avr/pgmspace.h> |
#include <avr/interrupt.h> |
#include <avr/eeprom.h> |
#include <avr/boot.h> |
#include <avr/wdt.h> |
#include "old_macros.h" |
#include "_Settings.h" |
#include "printf_P.h" |
#include "timer0.h" |
#include "uart.h" |
#include "analog.h" |
#include "twimaster.h" |
#include "menu.h" |
#include "rc.h" |
#include "fc.h" |
#include "gps.h" |
#include "spi.h" |
#include "led.h" |
#define DIV_4 2 |
#define DIV_128 7 |
#define MUL_4 2 |
#ifndef EEMEM |
#define EEMEM __attribute__ ((section (".eeprom"))) |
#endif |
#define DEBUG_DISPLAY_INTERVALL 123 // in ms |
#define DELAY_US(x) ((unsigned int)( (x) * 1e-6 * F_CPU )) |
#endif //_MAIN_H |
/branches/thjac/V1_12/makefile |
---|
0,0 → 1,449 |
#-------------------------------------------------------------------- |
# MCU name |
MCU = atmega644p |
F_CPU = 20000000 |
#------------------------------------------------------------------- |
VERSION_MAJOR = 1 |
VERSION_MINOR = 12 |
VERSION_PATCH = 0 |
VERSION_SERIAL_MAJOR = 10 # Serial Protocol |
VERSION_SERIAL_MINOR = 1 # Serial Protocol |
NC_SPI_COMPATIBLE = 6 # Navi-Kompatibilität |
#------------------------------------------------------------------- |
ifeq ($(MCU), atmega32) |
# FUSE_SETTINGS= -u -U lfuse:w:0xff:m -U hfuse:w:0xcf:m |
HEX_NAME = MEGA32 |
endif |
ifeq ($(MCU), atmega644) |
FUSE_SETTINGS = -u -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
#FUSE_SETTINGS = -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
# -u bei neuen Controllern wieder einspielen |
HEX_NAME = MEGA644 |
endif |
ifeq ($(MCU), atmega644p) |
FUSE_SETTINGS = -u -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
HEX_NAME = MEGA644 |
endif |
ifeq ($(F_CPU), 16000000) |
QUARZ = 16MHZ |
endif |
ifeq ($(F_CPU), 20000000) |
QUARZ = 20MHZ |
endif |
# Output format. (can be srec, ihex, binary) |
FORMAT = ihex |
# Target file name (without extension). |
ifeq ($(VERSION_PATCH), 0) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)a |
endif |
ifeq ($(VERSION_PATCH), 1) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)b |
endif |
ifeq ($(VERSION_PATCH), 2) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)c |
endif |
ifeq ($(VERSION_PATCH), 3) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)d |
endif |
ifeq ($(VERSION_PATCH), 4) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)e |
endif |
ifeq ($(VERSION_PATCH), 5) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)f |
endif |
ifeq ($(VERSION_PATCH), 6) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)g |
endif |
ifeq ($(VERSION_PATCH), 7) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)h |
endif |
ifeq ($(VERSION_PATCH), 8) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)i |
endif |
ifeq ($(VERSION_PATCH), 9) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)j |
endif |
ifeq ($(VERSION_PATCH), 10) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)k |
endif |
ifeq ($(VERSION_PATCH), 11) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)L |
endif |
ifeq ($(VERSION_PATCH), 12) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)m |
endif |
ifeq ($(VERSION_PATCH), 13) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)n |
endif |
ifeq ($(VERSION_PATCH), 14) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)o |
endif |
ifeq ($(VERSION_PATCH), 15) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)p |
endif |
ifeq ($(VERSION_PATCH), 16) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)q |
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 = 2 |
########################################################################################################## |
# List C source files here. (C dependencies are automatically generated.) |
SRC = main.c uart.c printf_P.c timer0.c analog.c menu.c |
SRC += twimaster.c rc.c fc.c GPS.c spi.c led.c Spectrum.c |
SRC += altcon.c pitch.c pitch_md.c |
########################################################################################################## |
# List Assembler source files here. |
# Make them always end in a capital .S. Files ending in a lowercase .s |
# will not be considered source files but generated files (assembler |
# output from the compiler), and will be deleted upon "make clean"! |
# Even though the DOS/Win* filesystem matches both .s and .S the same, |
# it will preserve the spelling of the filenames, and gcc itself does |
# care about how the name is spelled on its command-line. |
ASRC = |
# List any extra directories to look for include files here. |
# Each directory must be seperated by a space. |
EXTRAINCDIRS = |
# Optional compiler flags. |
# -g: generate debugging information (for GDB, or for COFF conversion) |
# -O*: optimization level |
# -f...: tuning, see gcc manual and avr-libc documentation |
# -Wall...: warning level |
# -Wa,...: tell GCC to pass this to the assembler. |
# -ahlms: create assembler listing |
CFLAGS = -O$(OPT) \ |
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \ |
-Wall -Wstrict-prototypes \ |
-Wa,-adhlns=$(<:.c=.lst) \ |
$(patsubst %,-I%,$(EXTRAINCDIRS)) |
# Set a "language standard" compiler flag. |
# Unremark just one line below to set the language standard to use. |
# gnu99 = C99 + GNU extensions. See GCC manual for more information. |
#CFLAGS += -std=c89 |
#CFLAGS += -std=gnu89 |
#CFLAGS += -std=c99 |
CFLAGS += -std=gnu99 |
CFLAGS += -DVERSION_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 += -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) -A $(TARGET).elf |
# Define Messages |
# English |
MSG_ERRORS_NONE = Errors: none |
MSG_BEGIN = -------- begin -------- |
MSG_END = -------- end -------- |
MSG_SIZE_BEFORE = Size before: |
MSG_SIZE_AFTER = Size after: |
MSG_COFF = Converting to AVR COFF: |
MSG_EXTENDED_COFF = Converting to AVR Extended COFF: |
MSG_FLASH = Creating load file for Flash: |
MSG_EEPROM = Creating load file for EEPROM: |
MSG_EXTENDED_LISTING = Creating Extended Listing: |
MSG_SYMBOL_TABLE = Creating Symbol Table: |
MSG_LINKING = Linking: |
MSG_COMPILING = Compiling: |
MSG_ASSEMBLING = Assembling: |
MSG_CLEANING = Cleaning project: |
# Define all object files. |
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) |
# Define all listing files. |
LST = $(ASRC:.S=.lst) $(SRC:.c=.lst) |
# Combine all necessary flags and optional flags. |
# Add target processor to flags. |
#ALL_CFLAGS = -mmcu=$(MCU) -DF_CPU=$(F_CPU) -I. $(CFLAGS) |
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) |
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) |
# Default target. |
all: begin gccversion sizebefore $(TARGET).elf $(TARGET).hex $(TARGET).eep \ |
$(TARGET).lss $(TARGET).sym sizeafter finished end |
# Eye candy. |
# AVR Studio 3.x does not check make's exit code but relies on |
# the following magic strings to be generated by the compile job. |
begin: |
@echo |
@echo $(MSG_BEGIN) |
finished: |
@echo $(MSG_ERRORS_NONE) |
end: |
@echo $(MSG_END) |
@echo |
# Display size of file. |
# Display size of file. |
sizebefore: |
@if [ -f $(TARGET).elf ]; then echo Size before:; $(ELFSIZE); $(HEXSIZE); echo; fi |
sizeafter: |
@if [ -f $(TARGET).elf ]; then echo Size after:; $(ELFSIZE); $(HEXSIZE); echo; fi |
# Display compiler version information. |
gccversion : |
@$(CC) --version |
# Convert ELF to COFF for use in debugging / simulating in |
# AVR Studio or VMLAB. |
COFFCONVERT=$(OBJCOPY) --debugging \ |
--change-section-address .data-0x800000 \ |
--change-section-address .bss-0x800000 \ |
--change-section-address .noinit-0x800000 \ |
--change-section-address .eeprom-0x810000 |
coff: $(TARGET).elf |
@echo |
@echo $(MSG_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof |
extcoff: $(TARGET).elf |
@echo |
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof |
# Program the device. |
program: $(TARGET).hex $(TARGET).eep |
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) |
# Create final output files (.hex, .eep) from ELF output file. |
%.hex: %.elf |
@echo |
@echo $(MSG_FLASH) $@ |
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ |
%.eep: %.elf |
@echo |
@echo $(MSG_EEPROM) $@ |
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ |
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@ |
# Create extended listing file from ELF output file. |
%.lss: %.elf |
@echo |
@echo $(MSG_EXTENDED_LISTING) $@ |
$(OBJDUMP) -h -S $< > $@ |
# Create a symbol table from ELF output file. |
%.sym: %.elf |
@echo |
@echo $(MSG_SYMBOL_TABLE) $@ |
avr-nm -n $< > $@ |
# Link: create ELF output file from object files. |
.SECONDARY : $(TARGET).elf |
.PRECIOUS : $(OBJ) |
%.elf: $(OBJ) |
@echo |
@echo $(MSG_LINKING) $@ |
$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) |
# Compile: create object files from C source files. |
%.o : %.c |
@echo |
@echo $(MSG_COMPILING) $< |
$(CC) -c $(ALL_CFLAGS) $< -o $@ |
# Compile: create assembler files from C source files. |
%.s : %.c |
$(CC) -S $(ALL_CFLAGS) $< -o $@ |
# Assemble: create object files from assembler source files. |
%.o : %.S |
@echo |
@echo $(MSG_ASSEMBLING) $< |
$(CC) -c $(ALL_ASFLAGS) $< -o $@ |
# Target: clean project. |
clean: begin clean_list finished end |
clean_list : |
@echo |
@echo $(MSG_CLEANING) |
# $(REMOVE) $(TARGET).hex |
$(REMOVE) $(TARGET).eep |
$(REMOVE) $(TARGET).obj |
$(REMOVE) $(TARGET).cof |
$(REMOVE) $(TARGET).elf |
$(REMOVE) $(TARGET).map |
$(REMOVE) $(TARGET).obj |
$(REMOVE) $(TARGET).a90 |
$(REMOVE) $(TARGET).sym |
$(REMOVE) $(TARGET).lnk |
$(REMOVE) $(TARGET).lss |
$(REMOVE) $(OBJ) |
$(REMOVE) $(LST) |
$(REMOVE) $(SRC:.c=.s) |
$(REMOVE) $(SRC:.c=.d) |
# Automatically generate C source code dependencies. |
# (Code originally taken from the GNU make user manual and modified |
# (See README.txt Credits).) |
# |
# Note that this will work with sh (bash) and sed that is shipped with WinAVR |
# (see the SHELL variable defined above). |
# This may not work with other shells or other seds. |
# |
%.d: %.c |
set -e; $(CC) -MM $(ALL_CFLAGS) $< \ |
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > $@; \ |
[ -s $@ ] || rm -f $@ |
# Remove the '-' if you want to see the dependency files generated. |
-include $(SRC:.c=.d) |
# Listing of phony targets. |
.PHONY : all begin finish end sizebefore sizeafter gccversion coff extcoff \ |
clean clean_list program |
/branches/thjac/V1_12/menu.c |
---|
0,0 → 1,185 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
#include "altcon.h" |
#include "pitch.h" |
#include "pitch_md.h" |
#include "parameter.h" |
#include "fc.h" |
unsigned int TestInt = 0; |
#define ARRAYGROESSE 10 |
unsigned char Array[ARRAYGROESSE] = {1,2,3,4,5,6,7,8,9,10}; |
char DisplayBuff[80] = "Hallo Welt"; |
unsigned char DispPtr = 0; |
unsigned char MaxMenue = 14; |
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(void) |
{ |
if(MenuePunkt > MaxMenue) MenuePunkt = MaxMenue; |
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",GetActiveParamSetNumber(),Mixer.Name); |
if(I2CTimeout < 6) LCD_printfxy(0,3,"I2C ERROR!!!") |
else |
if(MissingMotor) LCD_printfxy(0,3,"Missing BL-Ctrl:%d!!",MissingMotor) |
else LCD_printfxy(0,3,"(c) Holger Buss"); |
// if(RemoteTasten & KEY3) TestInt--; |
// if(RemoteTasten & KEY4) TestInt++; |
break; |
case 1: |
if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
LCD_printfxy(0,0,"Hoehe: %5i",HoehenWert); |
LCD_printfxy(0,1,"SollHoehe: %5i",SollHoehe); |
LCD_printfxy(0,2,"Luftdruck: %5i",MessLuftdruck); |
LCD_printfxy(0,3,"Off : %5i",DruckOffsetSetting); |
} |
else |
{ |
LCD_printfxy(0,1,"Keine "); |
LCD_printfxy(0,2,"Höhenregelung"); |
} |
break; |
case 2: |
LCD_printfxy(0,0,"akt. Lage"); |
LCD_printfxy(0,1,"Nick: %5i",IntegralNick/1024); |
LCD_printfxy(0,2,"Roll: %5i",IntegralRoll/1024); |
LCD_printfxy(0,3,"Kompass: %5i",KompassValue); |
break; |
case 3: |
LCD_printfxy(0,0,"K1:%4i K2:%4i ",PPM_in[1],PPM_in[2]); |
LCD_printfxy(0,1,"K3:%4i K4:%4i ",PPM_in[3],PPM_in[4]); |
LCD_printfxy(0,2,"K5:%4i K6:%4i ",PPM_in[5],PPM_in[6]); |
LCD_printfxy(0,3,"K7:%4i K8:%4i ",PPM_in[7],PPM_in[8]); |
break; |
case 4: |
LCD_printfxy(0,0,"Ni:%4i Ro:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_NICK]],PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]); |
LCD_printfxy(0,1,"Gs:%4i Gi:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_GAS]],PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]); |
LCD_printfxy(0,2,"P1:%4i P2:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]],PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]]); |
LCD_printfxy(0,3,"P3:%4i P4:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]],PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]]); |
break; |
case 5: |
LCD_printfxy(0,0,"Gyro - Sensor"); |
if(PlatinenVersion == 10) |
{ |
LCD_printfxy(0,1,"Nick %4i (%3i.%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,"Gier %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,"Gier %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,"Hoch %4i (%3i)",Mittelwert_AccHoch/*accumulate_AccHoch / messanzahl_AccHoch*/,(int)NeutralAccZ); |
break; |
case 7: |
LCD_printfxy(0,1,"Spannung: %5i",UBat); |
LCD_printfxy(0,2,"Empf.Pegel:%5i",SenderOkay); |
break; |
case 8: |
LCD_printfxy(0,0,"Kompass "); |
LCD_printfxy(0,1,"Richtung: %5i",KompassRichtung); |
LCD_printfxy(0,2,"Messwert: %5i",KompassValue); |
LCD_printfxy(0,3,"Start: %5i",KompassStartwert); |
break; |
case 9: |
LCD_printfxy(0,0,"Poti1: %3i",Poti1); |
LCD_printfxy(0,1,"Poti2: %3i",Poti2); |
LCD_printfxy(0,2,"Poti3: %3i",Poti3); |
LCD_printfxy(0,3,"Poti4: %3i",Poti4); |
break; |
case 10: |
LCD_printfxy(0,0,"Servo " ); |
LCD_printfxy(0,1,"Setpoint %3i",Parameter_ServoNickControl); |
LCD_printfxy(0,2,"Stellung: %3i",ServoValue); |
LCD_printfxy(0,3,"Range:%3i-%3i",EE_Parameter.ServoNickMin,EE_Parameter.ServoNickMax); |
break; |
case 11: |
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 12: |
LCD_printfxy(0,0,"BL-Ctrl Errors " ); |
LCD_printfxy(0,1," %3d %3d %3d %3d ",MotorError[0],MotorError[1],MotorError[2],MotorError[3]); |
LCD_printfxy(0,2," %3d %3d %3d %3d ",MotorError[4],MotorError[5],MotorError[6],MotorError[7]); |
LCD_printfxy(0,3," %3d %3d %3d %3d ",MotorError[8],MotorError[9],MotorError[10],MotorError[11]); |
break; |
case 13: |
LCD_printfxy(0,0,"BL-Ctrl found " ); |
LCD_printfxy(0,1," %c %c %c %c ",MotorPresent[0] + '-',MotorPresent[1] + '-',MotorPresent[2] + '-',MotorPresent[3] + '-'); |
LCD_printfxy(0,2," %c %c %c %c ",MotorPresent[4] + '-',MotorPresent[5] + '-',MotorPresent[6] + '-',MotorPresent[7] + '-'); |
LCD_printfxy(0,3," %c - - -",MotorPresent[8] + '-'); |
if(MotorPresent[9]) LCD_printfxy(4,3,"10"); |
if(MotorPresent[10]) LCD_printfxy(8,3,"11"); |
if(MotorPresent[11]) LCD_printfxy(12,3,"12"); |
break; |
case 14: |
LCD_printfxy( 0, 0, "PitchSteuerung " ); |
LCD_printfxy( 0, 1, "Modus: %8s", pitchModeStrings[ pitch_currentMode() ] ); |
// MD-Modus |
switch( pitch_currentMode() ) { |
case PARAM_PITCH_MODE_MD: |
LCD_printfxy( 0, 2, "StickDelta: %3i", pitch_neutralDiffMD() ) |
LCD_printfxy( 0, 3, "Standgas : %3i", pitch_hoverValue() ); |
break; |
} |
break; |
default: MaxMenue = MenuePunkt - 1; |
MenuePunkt = 0; |
break; |
} |
RemoteKeys = 0; |
} |
/branches/thjac/V1_12/menu.h |
---|
0,0 → 1,9 |
extern void Menu(void); |
extern void LcdClear(void); |
extern char DisplayBuff[80]; |
extern unsigned char DispPtr; |
extern unsigned char MaxMenue; |
extern unsigned char MenuePunkt; |
extern unsigned char RemoteKeys; |
/branches/thjac/V1_12/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/thjac/V1_12/parameter.h |
---|
0,0 → 1,107 |
/* parameter.h |
*/ |
#ifndef PARAMETER_H |
#define PARAMETER_H |
#define PARAM_TIMER_2S 100 // 2 Sekunden |
#define PITCH_NEUTRAL_TIMER 25 |
#define PITCH_MIN2_TIMER 100 |
#define PARAM_ALT_P Parameter_Hoehe_P |
#define PARAM_ALT_D Parameter_Luftdruck_D |
#define PARAM_ALT_ACC Parameter_Hoehe_ACC_Wirkung |
#define PARAM_ALT_GAIN EE_Parameter.Hoehe_Verstaerkung |
#define PARAM_ALT_MAX EE_Parameter.MaxHoehe |
/****************************************************************************************** |
* Allgemeine Pitch-Steuerungsparameter |
*/ |
#define PARAM_PITCH_STICK_THRESHOLD 5 |
/****************************************************************************************** |
* Parameter für MD-Pitch-Steuerung |
*/ |
#define PARAM_PITCH_MD_DELAY0 2 // Begrenzung der Pitch-Beschleunigung am Boden |
#define PARAM_PITCH_MD_DELAY1 ( EE_Parameter.UserParam2 ) // Begrenzung der Pitch-Beschleunigung nach Start |
#define PARAM_PITCH_MD_DELAY2 20 // Begrenzung der Pitch-Beschleunigung im Flug |
/****************************************************************************************** |
* Parameter für Höhenregelung |
*/ |
// #define PARAM_ALT_EXP_SMOOTHING_FACTOR EE_Parameter.UserParam4 // Faktor für exp. Glättung |
/****************************************************************************************** |
* Parameter für LED-Ansteuerung |
*/ |
/* Helligkeit J16 |
*/ |
#define PARAM_LED_BRIGHTNESS_J16 ( EE_Parameter.UserParam5 ) // 0-250, 25x=PotiX, Wert wird durch 23 geteilt |
/* Helligkeit J17 |
*/ |
#define PARAM_LED_BRIGHTNESS_J17 ( EE_Parameter.UserParam6 ) // 0-250, 25x=PotiX, Wert wird durch 23 geteilt |
/* Die Ausgänge J16/J17 lassen sich wahlweise bei stehenden Motoren üner den Gierstick schalten. |
*/ |
#define PARAM_LED_STICK_ENABLED ( EE_Parameter.UserParam7 & 0x01 ) // 0=deaktiviert 1=aktiviert, wird durch Motorkopplung übersteuert |
/* Die Ausgänge J16/J17 lassen sich wahlweise über die Motoren koppeln, so daß |
* die Ausgänge bei ausgeschalteten Motoren unabhängig vom eingestellten Blink-Muster |
* deaktiviert sind. |
*/ |
#define PARAM_LED_ENGINE_ENABLED ( EE_Parameter.UserParam7 & 0x02 ) // 0=deaktiviert 1=an Motoren gekoppelt |
/* Wenn die Unterspannungswarnung aktiv wird, kann mit diesem Parameter eingestellt |
* werden, daß sich die Blinkfrequenz der LED's verdoppelt. |
*/ |
#define PARAM_LED_WARNING_SPEEDUP ( EE_Parameter.UserParam7 & 0x04 ) // 0=deaktiviert >0=Blinkenbeschleunigung |
/* Erzwingt die Aktivierung der LED-Ausgänge im Fall einer |
* Unterspannungswarnung. |
*/ |
#define PARAM_LED_FORCE_WARNING_ENABLED ( EE_Parameter.UserParam7 & 0x08 ) // 0=deaktiviert 1=aktiviert |
/* Wenn gesetzt, wird der Pegel des Ausgangs J16 vertauscht. |
*/ |
#define PARAM_LED_NEGATE_J16 ( EE_Parameter.UserParam7 & 0x10 ) // 0=normal 1=invertiert |
#define LED_NEGATE_J16 ( PARAM_LED_NEGATE_J16 >> 3 ) |
/* Wenn gesetzt, wird der Pegel des Ausgangs J17 vertauscht. |
*/ |
#define PARAM_LED_NEGATE_J17 ( EE_Parameter.UserParam7 & 0x20 ) // 0=normal 1=invertiert |
#define LED_NEGATE_J17 ( PARAM_LED_NEGATE_J17 >> 4 ) |
/****************************************************************************************** |
* Konfiguration |
*/ |
/* Die Motoren können über diesen Parameter deaktiviert werden. Ein Wert von 1 |
* deaktiviert die Motoren und kann zum Testen verwendet werden. |
*/ |
#define PARAM_ENGINE_ENABLED ( !( EE_Parameter.UserParam1 & 0x01 ) ) // 1=deaktiviert 0=aktiviert |
/* Dieser Parameter legt fest, ob in '+'-Formation (normal) oder 'X'-Formation |
* geflogen werden soll. Zur Umschaltung reicht das Setzen des Parameters. Ein |
* Umbau der FC oder Einstellungen am Sender sind nicht notwendig. |
*/ |
#define PARAM_X_FORMATION ( EE_Parameter.UserParam8 & 0x01 ) // 0=+, 1=X |
/* Steuert, ob beim bzw. vor dem Start der Motoren eine Kalibrierung erfolgen |
* soll. |
*/ |
#define PARAM_CAL_ON_START ( EE_Parameter.UserParam8 & 0x02 ) // 0=deaktiviert 1=aktiviert |
/* Erlaubt das erstmalige Aktivieren der Höhenregelung nach Start ohne Schnippenlassen des Sticks. |
*/ |
#define PARAM_PITCH_SOFT_ACTIVATING ( EE_Parameter.UserParam8 & 0x04 ) |
#endif // PARAMETER_H |
/branches/thjac/V1_12/pitch.c |
---|
0,0 → 1,108 |
/* pitch.c |
* |
* Copyright 2009 Thomas Jachmann |
* |
* Pitch-Steuerung |
*/ |
#include "main.h" |
#include "parameter.h" |
#include "pitch_md.h" |
#include "pitch.h" |
#define UNDEFINED 255 |
int pitchInitialStickValue = UNDEFINED; |
unsigned char pitchMode = PARAM_PITCH_MODE_MK; |
char *pitchModeStrings[] = { |
"MK ", |
"MD ", |
"Invalid " |
}; |
// Prototypen |
int pitch_mk_value( void ); |
/* |
* Führt die Initialisierung der Pitch-Steuerung durch. Diese Funktion |
* wird nach jeder Setting-Auswahl sowie nach jeder Setting-Änderung |
* aufgerufen. |
*/ |
void pitch_init( void ) { |
// Der Schalter Höhenregelung bestimmt den Pitch-Modus |
if( EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG ) { |
pitchMode = PARAM_PITCH_MODE_MD; |
} else { |
pitchMode = PARAM_PITCH_MODE_MK; |
} |
// Nur beim Einschalten ermitteln, da beim Setting-Wechsel ungültig |
if( pitchInitialStickValue == UNDEFINED ) { |
// Warten, bis ein gültiger Wert von der Fernsteuerung anliegt |
unsigned int timer = SetDelay( 500 ); |
while( !CheckDelay( timer ) ); |
pitchInitialStickValue = PPM_in[ EE_Parameter.Kanalbelegung[ K_GAS ] ]; |
} |
/* Die Stick-Position beim Einschalten muß mit dem im Setting eingestellten |
* Pitch-Modus übereinstimmen. Sonst wird die Pitch-Steuerung aus Sicherheits- |
* gründen deaktiviert. Selbiges gilt, wenn die Höhenregelung deaktiviert wurde. |
*/ |
switch( pitchMode ) { |
// Pitch-Modus mit 0-Gas |
case PARAM_PITCH_MODE_MK: |
if( pitchInitialStickValue > 35 - 120 ) { |
pitchMode = PARAM_PITCH_MODE_INVALID; |
} |
break; |
// Pitch-Modus mit neutralisiertem Gas und Standgas |
case PARAM_PITCH_MODE_MD: |
if( abs( pitchInitialStickValue ) > PARAM_PITCH_STICK_THRESHOLD ) { |
pitchMode = PARAM_PITCH_MODE_INVALID; |
} else { |
pitch_md_init(); |
} |
break; |
} |
} |
int pitch_value( void ) { |
switch( pitchMode ) { |
// Pitch-Modus mit 0-Gas |
case PARAM_PITCH_MODE_MK: |
return pitch_mk_value(); |
// Pitch-Modus mit neutralisiertem Gas und Standgas |
case PARAM_PITCH_MODE_MD: |
return pitch_md_value(); |
default: |
return 0; |
} |
} |
/* |
* Führt eine Pitch-Berechnung aus, die der Original-SW entspricht. |
*/ |
int pitch_mk_value( void ) { |
register int stickValue = PPM_in[ EE_Parameter.Kanalbelegung[ K_GAS ] ]; |
register int pitchCount = stickValue + 120; |
DebugOut.Analog[26] = stickValue; |
return pitchCount; |
} |
/branches/thjac/V1_12/pitch.h |
---|
0,0 → 1,25 |
/* pitch.h |
* |
* copyright 2009 Thoams Jachmann |
*/ |
#ifndef _PITCH_H |
#define _PITCH_H |
#define PARAM_PITCH_MODE_MK 0x00 |
#define PARAM_PITCH_MODE_MD 0x01 |
#define PARAM_PITCH_MODE_INVALID 0x02 |
#define pitch_initialStickValue() pitchInitialStickValue |
#define pitch_currentMode() ( pitchMode ) |
#define pitch_currentModeString() ( pitchModeStrings[ pitchMode ] ) |
extern void pitch_init( void ); |
extern int pitch_value( void ); |
extern int pitchInitialStickValue; |
extern unsigned char pitchMode; |
extern char *pitchModeStrings[]; |
#endif // PITCH_H |
/branches/thjac/V1_12/pitch_md.c |
---|
0,0 → 1,472 |
/* pitch_md.c |
* |
* Copyright 2009 Thomas Jachmann |
* |
* Die in dieser Quelldatei enthaltenen Algorithmen ermöglichen eine MD-ähnliche Pitch-Steuerung |
* für den MK. |
*/ |
#include "main.h" |
#include "parameter.h" |
#include "fc.h" |
#include "pitch.h" |
#include "altcon.h" |
#define STATE_INITIALIZE 0x01 // Anfangszustand nach Einschalten der Motoren |
#define STATE_SETUP 0x02 // Ermittlung von PARAM_PITCH_MD_HOVER |
#define STATE_SETUP_HOVER 0x03 // Konfiguration pitchHover |
#define STATE_SETUP_STICK_DELTA 0x04 // Konfiguration pitchNeutralDiff |
#define STATE_SETUP_STICK_DELTA1 0x05 |
#define STATE_BEGIN 0x06 // Anfangszustand für Flugbetrieb |
#define STATE_BEGIN1 0x07 // Anfangszustand für Flugbetrieb |
#define STATE_READY0 0x08 // Manuelle Kontrolle |
#define STATE_READY 0x09 // Manuelle Kontrolle |
#define STATE_READY1 0x0a |
#define STATE_WAIT 0x0b // Warten auf Einschalten der Höhenregelung |
#define STATE_ACTIVATING 0x0c // Aktivierung der Höhenregelung |
#define STATE_ACTIVE 0x0d // Höhenregelung ist aktiv |
#define STATE_RESTART 0x0e // Neustart |
static int stickValue = 0; // Aktueller Stick-Wert |
static int lastStickValue = 0; // Vorheriger Stick-Wert |
static int actualPitchCount = 0; // Soll-Pitch-Wert |
static int targetPitchCount = 0; // Ist-Pitch-Wert |
static int pitchOffset; // Aktueller Grundgaswert in Neutralstellung |
static char state; // Zustand |
static int timer; |
static int delay = 0; |
static int delayCounter = 0; |
static int peakPitchCount; |
unsigned char pitchHover = 0; // Standgaswert |
unsigned char pitchNeutralDiffMD = 0; // Suffix MD später entfernen |
void pitch_md_init( void ) { |
pitchHover = eeprom_read_byte( &EEPromArray[ EEPROM_ADR_PITCH_MD_HOVER ] ); |
pitchNeutralDiffMD = eeprom_read_byte( &EEPromArray[ EEPROM_ADR_PITCH_NEUTRAL_DIFF ] ); |
} |
/* |
* Berechnet den aktuellen Pitch-Wert für die Regelung |
* |
* Funktionsweise: |
* |
* 1. Einmalig muß man das Standgas kalibrieren. Standgas ist ein neuer Parameter. |
* Dies tut man durch Betätigen des Roll-Sticks nach links (Vollausschlag) und |
* Starten der Motoren. Nun gibt man soviel Gas (in der oberen Hälfte des Stick-Bereichs) wie |
* der MK gerade noch stabil auf dem Boden steht. Man hält diese Stick-Position solange, bis ein |
* Signal ertönt. Damit wurde der Gaswert als Standgasparameter übernommen und im EEProm dauerhaft gespeichert. |
* Diese Kalibrierung muß mit vollem Akku und nach jeder Gewichtsänderung des MK einmal durchgeführt werden. |
* |
* 2. Für den Flug startet man die Motoren und läßt den Stick los. Die Motoren laufen im Leerlaufgas. |
* |
* 3. Nun schaltet man auf Standgas durch kurzes Antippen des Sticks nach oben. Die Motoren beschleunigen langsam |
* bis zum Erreichen des zuvor kalibriertes Standgaswertes. |
* |
* 4. Nun hebt man wie gewohnt ab. Hierzu hat man den oberen Stick-Bereich zur Verfügung. Da der Grundgaswert |
* bei Mittelstellung jetzt knapp unterhalb des Schwebegaswertes liegt, kann man im Flug einfach die Höhe halten, |
* indem man den Stick in Mittelstellung bewegt. Nach kurzer Zeit (quittiert mit einem Piep) wird die automatische |
* Höhenregelung aktiviert und solange gehalten, bis man den Stick wieder bewegt. |
* |
* 5. Nach der Landung drückt man den Stick ganz nach unten, bis ein Signal ertönt. Jetzt laufen die Motoren |
* wieder im Leerlaufgas. Man kann nun neu Starten (ab Punkt 3) oder die Motoren ausschalten. |
*/ |
int pitch_md_value( void ) { |
int register rawStickValue = PPM_in[ EE_Parameter.Kanalbelegung[ K_GAS ] ] - pitch_initialStickValue(); |
// Sind die Motoren eingeschaltet? |
if( MotorenEin ) { |
// Vorigen Stick-Wert merken |
lastStickValue = stickValue; |
/* StickValue exponentiell angleichen, da ausgehend von der Neutralstellung |
* nur jeweils die halbe Auflösung nach oben und unten zur Verfügung steht. Bei einer |
* Multiplikation mit 2 ließe sich das Gas im Schwebebereich nicht fein genug einstellen. */ |
if( rawStickValue > 0 ) { |
stickValue = rawStickValue + ( ( (long) rawStickValue * (long) rawStickValue ) / 150L ); |
} else { |
stickValue = rawStickValue - ( ( (long) rawStickValue * (long) rawStickValue ) / 150L ); |
} |
/* Aktuellen Pitch-Wert berechnen. Der Wert ergibt sich aus dem Pitch-Offset |
* zuzüglich dem Stick-Wert. */ |
targetPitchCount = stickValue + pitchOffset; |
switch( state ) { |
/* Entscheidet über Flugbetrieb oder Setup-Betrieb. Für den Setup-Betrieb |
* muß beim Einschalten der Motoren gleichzeitig der Roll-Stick ganz |
* betätigt werden. Es gilt: |
* |
* Roll-Stick links: Einstellen des Gas-Stick-Deltas |
* Roll-Stick rechts: Einstellen des Schwebegases |
*/ |
case STATE_INITIALIZE: |
if( PPM_in[ EE_Parameter.Kanalbelegung[ K_ROLL ] ] > 70 ) { |
state = STATE_SETUP_HOVER; |
// Signalisieren |
beeptime = 500; |
} else if( PPM_in[ EE_Parameter.Kanalbelegung[ K_ROLL ] ] < -70 ) { |
state = STATE_SETUP_STICK_DELTA; |
// Signalisieren |
beeptime = 500; |
} else { |
state = STATE_RESTART; |
} |
break; |
/* Erlaubt die Ermittlung des Parameters pitchHover. Hierzu wird soviel Gas |
* gegeben, bis der MK kurz vor dem Abheben ist, jedoch noch stabil steht. Um den |
* Gaswert dauerhaft zu speichern, muß der Stick an der Position verweilen, bis |
* der Summer die Übernahme akustisch quittiert. Dann müssen die Motoren wieder |
* ausgeschaltet werden, da dieser Modus nicht für den Flug vorgesehen ist. |
*/ |
case STATE_SETUP_HOVER: |
// Im Setup-Modus soll das Gas nicht träge reagieren |
actualPitchCount = targetPitchCount; |
if( rawStickValue < 10 || abs( stickValue - lastStickValue ) > 1 ) { |
timer = PARAM_TIMER_2S; |
} |
/* Der Stick befindet sich eindeutig in der oberen Hälfte und wurde |
* seit dem letzten Zyklus nicht bewegt. */ |
else { |
timer--; |
/* Die Verweilzeit ist abgelaufen und der aktuelle Pitch-Wert |
* entspricht nicht dem bereits gespeicherten Wert. */ |
if( !timer && ( pitchHover != actualPitchCount ) ) { |
// Aktuellen Pitch-Wert in Konfiguration übernehmen |
pitchHover = actualPitchCount; |
// Konfiguration dauerhaft speichern |
eeprom_write_byte( &EEPromArray[ EEPROM_ADR_PITCH_MD_HOVER ], pitchHover ); |
// Signalisieren |
beeptime = 500; |
} |
} |
break; |
/* Der Stick-Deltawert kann hier konfiguriert werden. Ein Betätigen des Roll-Sticks nach links |
* erhöht den Deltawert um 1, ein Betätigen nach rechts veringert den Wert um 1. Der eingestellte |
* Wert kann mit dem Gas-Stick getestet werden, indem dieser in den oberen Bereich bewegt und dann |
* losgelassen wird. Ertönt dabei ein Signal, wurde die Bewegung erkannt. Es ist dann der richtige |
* Wert gefunden, wenn das Signal beim Loslassen des Gas-Sticks ertönt, beim gesteuerten Bewegen nach |
* unten jedoch nicht. Durch Ausschalten der Motoren (diese laufen während der Konfiguration nicht |
* wirklich) wird der Konfigurationsmodus beendet. |
*/ |
case STATE_SETUP_STICK_DELTA: |
if( stickValue < PARAM_PITCH_STICK_THRESHOLD && |
abs( PPM_in[ EE_Parameter.Kanalbelegung[ K_ROLL ] ] ) < PARAM_PITCH_STICK_THRESHOLD ) { |
state = STATE_SETUP_STICK_DELTA1; |
} |
// Im Setup immer mit Leerlaufgas |
targetPitchCount = 0; |
break; |
case STATE_SETUP_STICK_DELTA1: |
// Roll-Stick nach links erhöht den Deltawert |
if( PPM_in[ EE_Parameter.Kanalbelegung[ K_ROLL ] ] < -20 ) { |
if( pitchNeutralDiffMD < 20 ) { |
pitchNeutralDiffMD++; |
// Konfiguration dauerhaft speichern |
eeprom_write_byte( &EEPromArray[ EEPROM_ADR_PITCH_NEUTRAL_DIFF ], pitchNeutralDiffMD ); |
// Signalisieren |
beeptime = 500; |
state = STATE_SETUP_STICK_DELTA; |
} |
} |
// Roll-Stick nach rechts verringert den Deltawert |
if( PPM_in[ EE_Parameter.Kanalbelegung[ K_ROLL ] ] > 20 ) { |
if( pitchNeutralDiffMD > 0 ) { |
pitchNeutralDiffMD--; |
// Konfiguration dauerhaft speichern |
eeprom_write_byte( &EEPromArray[ EEPROM_ADR_PITCH_NEUTRAL_DIFF ], pitchNeutralDiffMD ); |
// Signalisieren |
beeptime = 500; |
state = STATE_SETUP_STICK_DELTA; |
} |
} |
if( ( lastStickValue > PARAM_PITCH_STICK_THRESHOLD ) && |
( lastStickValue - stickValue >= pitchNeutralDiffMD ) ) { |
state = STATE_SETUP_STICK_DELTA; |
// Signalisieren |
beeptime = 500; |
} |
// Im Setup immer mit Leerlaufgas |
targetPitchCount = 0; |
break; |
/* In diesem Zustand steht der MK am Boden und die Motoren laufen auf Leerlaufgas. Ein |
* kurzes Auslenken des Sticks nach oben schaltet in das Standgas über. |
*/ |
case STATE_BEGIN: |
// Stick ist oberhalb der Neutralstellung |
if( rawStickValue > PARAM_PITCH_STICK_THRESHOLD ) { |
pitchOffset = pitchHover; |
/* In diesem Zustand darf Schwebegas nicht überschritten werden, damit |
* der MK nicht aus diesem Status heraus abhebt. |
*/ |
if( targetPitchCount > pitchHover ) { |
targetPitchCount = pitchHover; |
} |
// Erst im Status weitergehen, wenn Stick nicht mehr oberhalb der Neutralstellung |
} else if( pitchOffset == pitchHover ) { |
state = STATE_BEGIN1; |
} |
break; |
// MK soll erst abheben, weil sonst die Höhenregelung am Boden schon greift |
case STATE_BEGIN1: |
// Jetzt kann abgehoben werden |
if( rawStickValue > PARAM_PITCH_STICK_THRESHOLD ) { |
// Begrenzung der Pitch-Beschleunigung nach dem Start |
delay = PARAM_PITCH_MD_DELAY1; |
state = STATE_READY0; |
// Knüppel unterhalb der Neutralstellung bewirkt einen sofortigen Neustart |
} else if( rawStickValue < -PARAM_PITCH_STICK_THRESHOLD ) { |
state = STATE_RESTART; |
} |
break; |
/* Die Motoren laufen jetzt mindestens mit Standgas. Der MK ist bereit zum Abheben. |
*/ |
case STATE_READY0: |
/* Wenn der Gashebel ganz unten steht, Timer für Restart der Pitch-Regelung |
* starten. Hierfür wird die Variable pitchNeutralTimer verwendet. */ |
if( PPM_in[ EE_Parameter.Kanalbelegung[ K_GAS ] ] > 35 - 120 ) { |
timer = PITCH_MIN2_TIMER; |
} else { |
timer--; |
/* Gashebel steht seit PITCH_MIN2_TIMER ganz unten; jetzt erfolgt die Initialisierung. */ |
if( !timer ) { |
state = STATE_RESTART; |
} |
} |
/* Übergang in den höhengeregelten Flug durch: |
* 1. Schnelles Bewegen des Sticks in Richtung Mittelstellung |
* oder |
* 2. langsames Bewegen des Sticks in Mittelstellung */ |
if( ( ( lastStickValue > PARAM_PITCH_STICK_THRESHOLD ) && |
( lastStickValue - stickValue >= pitchNeutralDiffMD ) ) || |
( ( lastStickValue < PARAM_PITCH_STICK_THRESHOLD ) && |
PARAM_PITCH_SOFT_ACTIVATING ) ) { |
// Aktuelle Höhe festhalten (aktiviert noch nicht den Regler) |
altcon_lock(); |
// Höhe vorübergehend merken und beibehalten |
peakPitchCount = lastStickValue; |
state = STATE_READY1; |
timer = PITCH_NEUTRAL_TIMER; |
delay = PARAM_PITCH_MD_DELAY2; |
} |
break; |
case STATE_READY: |
/* Wenn der Gashebel ganz unten steht, Timer für Restart der Pitch-Regelung |
* starten. Hierfür wird die Variable pitchNeutralTimer verwendet. */ |
if( PPM_in[ EE_Parameter.Kanalbelegung[ K_GAS ] ] > 35 - 120 ) { |
timer = PITCH_MIN2_TIMER; |
} else { |
timer--; |
/* Gashebel steht seit PITCH_MIN2_TIMER ganz unten; jetzt erfolgt die Initialisierung. */ |
if( !timer ) { |
state = STATE_RESTART; |
} |
} |
// Stick ist innerhalb der Neutralstellung |
if( abs( rawStickValue ) < PARAM_PITCH_STICK_THRESHOLD ) { |
// Aktuelle Höhe festhalten (aktiviert noch nicht den Regler) |
altcon_lock(); |
// Timer neu setzen |
timer = PITCH_NEUTRAL_TIMER; |
state = STATE_WAIT; |
} |
break; |
/* Hier wird die Zeit gemessen, in der der Stick nach dem Loslassen |
* bis zur Neutralstellung benötigt. Bei Überschreiten der Zeit |
* wird die Höhenregelung nicht aktiviert. |
*/ |
case STATE_READY1: |
// Gas wird konstant gehalten |
targetPitchCount = peakPitchCount + pitchOffset; |
timer--; |
/* Läuft der Timer ab, bevor der Stick die Neutralstellung erreicht, |
* wird die Aktion nicht als "schnelles Bewegen in Neutralstellung" |
* gedeutet. */ |
if( !timer ) { |
state = STATE_READY0; |
} |
// Ist die Neutralstellung erreicht? |
if( rawStickValue < PARAM_PITCH_STICK_THRESHOLD ) { |
pitchOffset = targetPitchCount; |
// Aktivierung des Höhenreglers mit der zuvor gemerkten Sollhöhe |
altcon_start(); |
state = STATE_ACTIVE; |
} |
break; |
/* Der Stick ist in den für die Neutralstellung gültigen Wertebereich |
* gelangt. Nun darf innerhalb einer bestimmten Zeit keine Stick-Bewegung |
* erfolgen, um die automatische Höhenregelung zu aktivieren. */ |
case STATE_WAIT: |
/* Stick ist innerhalb der Neutralstellung und |
Stick-Differenzial ist < 2 */ |
if( abs( rawStickValue ) < PARAM_PITCH_STICK_THRESHOLD && |
abs( stickValue - lastStickValue ) < 2 ) { |
timer--; |
if( !timer ) { |
state = STATE_ACTIVATING; |
} |
// Aktivierungskriterium nicht erfüllt, zurück in INACTIVE |
} else { |
state = STATE_READY; |
} |
break; |
/* Die automatische Höhenregelung wird jetzt aktiviert. |
*/ |
case STATE_ACTIVATING: |
/* Nach Aktivierung der Höhenregelung soll sich der Gaswert nicht mehr |
* ändern. */ |
actualPitchCount = targetPitchCount; |
pitchOffset = targetPitchCount; |
// Aktivierung des Höhenreglers mit der zuvor gemerkten Sollhöhe |
altcon_start(); |
state = STATE_ACTIVE; |
break; |
/* Die automatische Höhenregelung ist aktiv. */ |
case STATE_ACTIVE: |
targetPitchCount = pitchOffset; |
// Stick ist außerhalb der Neutralstellung |
if( abs( rawStickValue ) > PARAM_PITCH_STICK_THRESHOLD ) { |
// Höhenregler deaktivieren |
altcon_stop(); |
pitchOffset -= altcon_avgerror() / 4; |
targetPitchCount = stickValue + pitchOffset; |
state = STATE_READY; |
} |
break; |
/* Neustart nach dem Flug oder vor Start. */ |
case STATE_RESTART: |
// Begrenzung der Pitch-Beschleunigung am Boden |
delay = PARAM_PITCH_MD_DELAY0; |
pitchOffset = 0; |
targetPitchCount = 0; |
// Folgezustand |
state = STATE_BEGIN; |
break; |
} |
// Motoren sind aus |
} else { |
/* Nach dem Einschalten der Motoren wird pitchOffset auf PARAM_PITCH_OVER gesetzt. |
*/ |
actualPitchCount = 0; |
targetPitchCount = 0; |
pitchOffset = 0; |
stickValue = 0; |
state = STATE_INITIALIZE; |
} |
/* Durch die Sollwertvorgabe kann hier eine einstellbare Trägheit auf dem Pitch-Wert |
* abgebildet werden. */ |
int pitchDelta = targetPitchCount - actualPitchCount; |
if( pitchDelta > delay ) |
pitchDelta = delay; |
if( pitchDelta < -delay ) |
pitchDelta = -delay; |
if( !delayCounter ) { |
actualPitchCount += pitchDelta; |
delayCounter = 5; |
} |
delayCounter--; |
if( actualPitchCount < 0 ) |
actualPitchCount = 0; |
DebugOut.Analog[25] = pitchOffset; |
DebugOut.Analog[26] = stickValue; |
return actualPitchCount; |
} |
/branches/thjac/V1_12/pitch_md.h |
---|
0,0 → 1,18 |
/* pitch_md.h |
* |
* Copyright 2009 Thoams Jachmann |
*/ |
#ifndef PITCH_MD_H |
#define PITCH_MD_H |
#define pitch_hoverValue() pitchHover |
#define pitch_neutralDiffMD() pitchNeutralDiffMD |
extern void pitch_md_init( void ); |
extern int pitch_md_value( void ); |
extern char pitchHover; |
extern char pitchNeutralDiffMD; |
#endif // PITCH_MD_H |
/branches/thjac/V1_12/printf_P.c |
---|
0,0 → 1,480 |
// Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist nicht von der Lizenz für den MikroKopter-Teil unterstellt |
/* |
Copyright (C) 1993 Free Software Foundation |
This file is part of the GNU IO Library. This library is free |
software; you can redistribute it and/or modify it under the |
terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) |
any later version. |
This library is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this library; see the file COPYING. If not, write to the Free |
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
As a special exception, if you link this library with files |
compiled with a GNU compiler to produce an executable, this does not cause |
the resulting executable to be covered by the GNU General Public License. |
This exception does not however invalidate any other reasons why |
the executable file might be covered by the GNU General Public License. */ |
/* |
* Copyright (c) 1990 Regents of the University of California. |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. [rescinded 22 July 1999] |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
/****************************************************************************** |
This file is a patched version of printf called _printf_P |
It is made to work with avr-gcc for Atmel AVR MCUs. |
There are some differences from standard printf: |
1. There is no floating point support (with fp the code is about 8K!) |
2. Return type is void |
3. Format string must be in program memory (by using macro printf this is |
done automaticaly) |
4. %n is not implemented (just remove the comment around it if you need it) |
5. If LIGHTPRINTF is defined, the code is about 550 bytes smaller and the |
folowing specifiers are disabled : |
space # * . - + p s o O |
6. A function void uart_sendchar(char c) is used for output. The UART must |
be initialized before using printf. |
Alexander Popov |
sasho@vip.orbitel.bg |
******************************************************************************/ |
/* |
* Actual printf innards. |
* |
* This code is large and complicated... |
*/ |
#include <string.h> |
#ifdef __STDC__ |
#include <stdarg.h> |
#else |
#include <varargs.h> |
#endif |
#include "main.h" |
//#define LIGHTPRINTF |
char PrintZiel; |
char Putchar(char zeichen) |
{ |
if(PrintZiel == OUT_LCD) { DisplayBuff[DispPtr++] = zeichen; return(1);} |
else return(uart_putchar(zeichen)); |
} |
void PRINT(const char * ptr, unsigned int len) |
{ |
for(;len;len--) Putchar(*ptr++); |
} |
void PRINTP(const char * ptr, unsigned int len) |
{ |
for(;len;len--) Putchar(pgm_read_byte(ptr++)); |
} |
void PAD_SP(signed char howmany) |
{ |
for(;howmany>0;howmany--) Putchar(' '); |
} |
void PAD_0(signed char howmany) |
{ |
for(;howmany>0;howmany--) Putchar('0'); |
} |
#define BUF 40 |
/* |
* Macros for converting digits to letters and vice versa |
*/ |
#define to_digit(c) ((c) - '0') |
#define is_digit(c) ((c)<='9' && (c)>='0') |
#define to_char(n) ((n) + '0') |
/* |
* Flags used during conversion. |
*/ |
#define LONGINT 0x01 /* long integer */ |
#define LONGDBL 0x02 /* long double; unimplemented */ |
#define SHORTINT 0x04 /* short integer */ |
#define ALT 0x08 /* alternate form */ |
#define LADJUST 0x10 /* left adjustment */ |
#define ZEROPAD 0x20 /* zero (as opposed to blank) pad */ |
#define HEXPREFIX 0x40 /* add 0x or 0X prefix */ |
void _printf_P (char ziel,char const *fmt0, ...) /* Works with string from FLASH */ |
{ |
va_list ap; |
register const char *fmt; /* format string */ |
register char ch; /* character from fmt */ |
register int n; /* handy integer (short term usage) */ |
register char *cp; /* handy char pointer (short term usage) */ |
const char *fmark; /* for remembering a place in fmt */ |
register unsigned char flags; /* flags as above */ |
signed char width; /* width from format (%8d), or 0 */ |
signed char prec; /* precision from format (%.3d), or -1 */ |
char sign; /* sign prefix (' ', '+', '-', or \0) */ |
unsigned long _ulong=0; /* integer arguments %[diouxX] */ |
#define OCT 8 |
#define DEC 10 |
#define HEX 16 |
unsigned char base; /* base for [diouxX] conversion */ |
signed char dprec; /* a copy of prec if [diouxX], 0 otherwise */ |
signed char dpad; /* extra 0 padding needed for integers */ |
signed char fieldsz; /* field size expanded by sign, dpad etc */ |
/* The initialization of 'size' is to suppress a warning that |
'size' might be used unitialized. It seems gcc can't |
quite grok this spaghetti code ... */ |
signed char size = 0; /* size of converted field or string */ |
char buf[BUF]; /* space for %c, %[diouxX], %[eEfgG] */ |
char ox[2]; /* space for 0x hex-prefix */ |
PrintZiel = ziel; // bestimmt, LCD oder UART |
va_start(ap, fmt0); |
fmt = fmt0; |
/* |
* Scan the format for conversions (`%' character). |
*/ |
for (;;) { |
for (fmark = fmt; (ch = pgm_read_byte(fmt)) != '\0' && ch != '%'; fmt++) |
/* void */; |
if ((n = fmt - fmark) != 0) { |
PRINTP(fmark, n); |
} |
if (ch == '\0') |
goto done; |
fmt++; /* skip over '%' */ |
flags = 0; |
dprec = 0; |
width = 0; |
prec = -1; |
sign = '\0'; |
rflag: ch = PRG_RDB(fmt++); |
reswitch: |
#ifdef LIGHTPRINTF |
if (ch=='o' || ch=='u' || (ch|0x20)=='x') { |
#else |
if (ch=='u' || (ch|0x20)=='x') { |
#endif |
if (flags&LONGINT) { |
_ulong=va_arg(ap, unsigned long); |
} else { |
register unsigned int _d; |
_d=va_arg(ap, unsigned int); |
_ulong = flags&SHORTINT ? (unsigned long)(unsigned short)_d : (unsigned long)_d; |
} |
} |
#ifndef LIGHTPRINTF |
if(ch==' ') { |
/* |
* ``If the space and + flags both appear, the space |
* flag will be ignored.'' |
* -- ANSI X3J11 |
*/ |
if (!sign) |
sign = ' '; |
goto rflag; |
} else if (ch=='#') { |
flags |= ALT; |
goto rflag; |
} else if (ch=='*'||ch=='-') { |
if (ch=='*') { |
/* |
* ``A negative field width argument is taken as a |
* - flag followed by a positive field width.'' |
* -- ANSI X3J11 |
* They don't exclude field widths read from args. |
*/ |
if ((width = va_arg(ap, int)) >= 0) |
goto rflag; |
width = -width; |
} |
flags |= LADJUST; |
flags &= ~ZEROPAD; /* '-' disables '0' */ |
goto rflag; |
} else if (ch=='+') { |
sign = '+'; |
goto rflag; |
} else if (ch=='.') { |
if ((ch = PRG_RDB(fmt++)) == '*') { |
n = va_arg(ap, int); |
prec = n < 0 ? -1 : n; |
goto rflag; |
} |
n = 0; |
while (is_digit(ch)) { |
n = n*10 + to_digit(ch); |
ch = PRG_RDB(fmt++); |
} |
prec = n < 0 ? -1 : n; |
goto reswitch; |
} else |
#endif /* LIGHTPRINTF */ |
if (ch=='0') { |
/* |
* ``Note that 0 is taken as a flag, not as the |
* beginning of a field width.'' |
* -- ANSI X3J11 |
*/ |
if (!(flags & LADJUST)) |
flags |= ZEROPAD; /* '-' disables '0' */ |
goto rflag; |
} else if (ch>='1' && ch<='9') { |
n = 0; |
do { |
n = 10 * n + to_digit(ch); |
ch = PRG_RDB(fmt++); |
} while (is_digit(ch)); |
width = n; |
goto reswitch; |
} else if (ch=='h') { |
flags |= SHORTINT; |
goto rflag; |
} else if (ch=='l') { |
flags |= LONGINT; |
goto rflag; |
} else if (ch=='c') { |
*(cp = buf) = va_arg(ap, int); |
size = 1; |
sign = '\0'; |
} else if (ch=='D'||ch=='d'||ch=='i') { |
if(ch=='D') |
flags |= LONGINT; |
if (flags&LONGINT) { |
_ulong=va_arg(ap, long); |
} else { |
register int _d; |
_d=va_arg(ap, int); |
_ulong = flags&SHORTINT ? (long)(short)_d : (long)_d; |
} |
if ((long)_ulong < 0) { |
_ulong = -_ulong; |
sign = '-'; |
} |
base = DEC; |
goto number; |
} else |
/* |
if (ch=='n') { |
if (flags & LONGINT) |
*va_arg(ap, long *) = ret; |
else if (flags & SHORTINT) |
*va_arg(ap, short *) = ret; |
else |
*va_arg(ap, int *) = ret; |
continue; // no output |
} else |
*/ |
#ifndef LIGHTPRINTF |
if (ch=='O'||ch=='o') { |
if (ch=='O') |
flags |= LONGINT; |
base = OCT; |
goto nosign; |
} else if (ch=='p') { |
/* |
* ``The argument shall be a pointer to void. The |
* value of the pointer is converted to a sequence |
* of printable characters, in an implementation- |
* defined manner.'' |
* -- ANSI X3J11 |
*/ |
/* NOSTRICT */ |
_ulong = (unsigned int)va_arg(ap, void *); |
base = HEX; |
flags |= HEXPREFIX; |
ch = 'x'; |
goto nosign; |
} else if (ch=='s') { // print a string from RAM |
if ((cp = va_arg(ap, char *)) == NULL) { |
cp=buf; |
cp[0] = '('; |
cp[1] = 'n'; |
cp[2] = 'u'; |
cp[4] = cp[3] = 'l'; |
cp[5] = ')'; |
cp[6] = '\0'; |
} |
if (prec >= 0) { |
/* |
* can't use strlen; can only look for the |
* NUL in the first `prec' characters, and |
* strlen() will go further. |
*/ |
char *p = (char*)memchr(cp, 0, prec); |
if (p != NULL) { |
size = p - cp; |
if (size > prec) |
size = prec; |
} else |
size = prec; |
} else |
size = strlen(cp); |
sign = '\0'; |
} else |
#endif /* LIGHTPRINTF */ |
if(ch=='U'||ch=='u') { |
if (ch=='U') |
flags |= LONGINT; |
base = DEC; |
goto nosign; |
} else if (ch=='X'||ch=='x') { |
base = HEX; |
/* leading 0x/X only if non-zero */ |
if (flags & ALT && _ulong != 0) |
flags |= HEXPREFIX; |
/* unsigned conversions */ |
nosign: sign = '\0'; |
/* |
* ``... diouXx conversions ... if a precision is |
* specified, the 0 flag will be ignored.'' |
* -- ANSI X3J11 |
*/ |
number: if ((dprec = prec) >= 0) |
flags &= ~ZEROPAD; |
/* |
* ``The result of converting a zero value with an |
* explicit precision of zero is no characters.'' |
* -- ANSI X3J11 |
*/ |
cp = buf + BUF; |
if (_ulong != 0 || prec != 0) { |
register unsigned char _d,notlastdigit; |
do { |
notlastdigit=(_ulong>=base); |
_d = _ulong % base; |
if (_d<10) { |
_d+='0'; |
} else { |
_d+='a'-10; |
if (ch=='X') _d&=~0x20; |
} |
*--cp=_d; |
_ulong /= base; |
} while (notlastdigit); |
#ifndef LIGHTPRINTF |
// handle octal leading 0 |
if (base==OCT && flags & ALT && *cp != '0') |
*--cp = '0'; |
#endif |
} |
size = buf + BUF - cp; |
} else { //default |
/* "%?" prints ?, unless ? is NUL */ |
if (ch == '\0') |
goto done; |
/* pretend it was %c with argument ch */ |
cp = buf; |
*cp = ch; |
size = 1; |
sign = '\0'; |
} |
/* |
* All reasonable formats wind up here. At this point, |
* `cp' points to a string which (if not flags&LADJUST) |
* should be padded out to `width' places. If |
* flags&ZEROPAD, it should first be prefixed by any |
* sign or other prefix; otherwise, it should be blank |
* padded before the prefix is emitted. After any |
* left-hand padding and prefixing, emit zeroes |
* required by a decimal [diouxX] precision, then print |
* the string proper, then emit zeroes required by any |
* leftover floating precision; finally, if LADJUST, |
* pad with blanks. |
*/ |
/* |
* compute actual size, so we know how much to pad. |
*/ |
fieldsz = size; |
dpad = dprec - size; |
if (dpad < 0) |
dpad = 0; |
if (sign) |
fieldsz++; |
else if (flags & HEXPREFIX) |
fieldsz += 2; |
fieldsz += dpad; |
/* right-adjusting blank padding */ |
if ((flags & (LADJUST|ZEROPAD)) == 0) |
PAD_SP(width - fieldsz); |
/* prefix */ |
if (sign) { |
PRINT(&sign, 1); |
} else if (flags & HEXPREFIX) { |
ox[0] = '0'; |
ox[1] = ch; |
PRINT(ox, 2); |
} |
/* right-adjusting zero padding */ |
if ((flags & (LADJUST|ZEROPAD)) == ZEROPAD) |
PAD_0(width - fieldsz); |
/* leading zeroes from decimal precision */ |
PAD_0(dpad); |
/* the string or number proper */ |
PRINT(cp, size); |
/* left-adjusting padding (always blank) */ |
if (flags & LADJUST) |
PAD_SP(width - fieldsz); |
} |
done: |
va_end(ap); |
} |
/branches/thjac/V1_12/printf_P.h |
---|
0,0 → 1,19 |
#ifndef _PRINTF_P_H_ |
#define _PRINTF_P_H_ |
#include <avr/pgmspace.h> |
#define OUT_V24 0 |
#define OUT_LCD 1 |
void _printf_P (char, char const *fmt0, ...); |
extern char PrintZiel; |
#define printf_P(format, args...) _printf_P(OUT_V24,format , ## args) |
#define printf(format, args...) _printf_P(OUT_V24,PSTR(format) , ## args) |
#define LCD_printfxy(x,y,format, args...) { DispPtr = y * 20 + x; _printf_P(OUT_LCD,PSTR(format) , ## args);} |
#define LCD_printf(format, args...) { _printf_P(OUT_LCD,PSTR(format) , ## args);} |
#endif |
/branches/thjac/V1_12/rc.c |
---|
0,0 → 1,122 |
/*####################################################################################### |
Decodieren eines RC Summen Signals |
#######################################################################################*/ |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "rc.h" |
#include "main.h" |
volatile int PPM_in[11]; |
volatile int PPM_diff[11]; // das diffenzierte Stick-Signal |
volatile unsigned char NewPpmData = 1; |
//############################################################################ |
//zum decodieren des PPM-Signals wird Timer1 mit seiner Input |
//Capture Funktion benutzt: |
void rc_sum_init (void) |
//############################################################################ |
{ |
TCCR1B=(1<<CS11)|(1<<CS10)|(1<<ICES1)|(1<<ICNC1);//|(1 << WGM12); //timer1 prescale 64 |
// TCCR1B=(1<<CS11)|(0<<CS10)|(1<<ICES1)|(1<<ICNC1); //timer1 prescale 64 |
TIMSK1 |= _BV(ICIE1); |
AdNeutralGier = 0; |
AdNeutralRoll = 0; |
AdNeutralNick = 0; |
return; |
} |
//############################################################################ |
//Diese Routine startet und inizialisiert den Timer für RC |
SIGNAL(SIG_INPUT_CAPTURE1) |
//############################################################################ |
{ |
static unsigned int AltICR=0; |
signed int signal = 0,tmp; |
static int index; |
signal = (unsigned int) ICR1 - AltICR; |
AltICR = ICR1; |
//Syncronisationspause? |
if((signal > 1100) && (signal < 8000)) |
{ |
if(index >= 4) NewPpmData = 0; // Null bedeutet: Neue Daten |
index = 1; |
} |
else |
{ |
if(index < 10) |
{ |
if((signal > 250) && (signal < 687)) |
{ |
signal -= 466; |
// Stabiles Signal |
if(abs(signal - PPM_in[index]) < 6) { if(SenderOkay < 200) SenderOkay += 10; 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(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 |
} |
} |
} |
/* |
//############################################################################ |
//Diese Routine startet und inizialisiert den Timer für RC |
SIGNAL(SIG_INPUT_CAPTURE1) |
//############################################################################ |
{ |
static unsigned int AltICR=0; |
signed int signal = 0,tmp; |
static int index; |
signal = (unsigned int) ICR1 - AltICR; |
DebugOut.Analog[16] = signal; |
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 < 10) |
{ |
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++; |
if(index == 5) J3High; else J3Low; // Servosignal an J3 anlegen |
if(index == 2) J4High; else J4Low; // Servosignal an J4 anlegen |
if(index == 7) J5High; else J5Low; // Servosignal an J5 anlegen |
} |
} |
} |
*/ |
/branches/thjac/V1_12/rc.h |
---|
0,0 → 1,30 |
/*####################################################################################### |
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[11]; |
extern volatile int PPM_diff[11]; // das diffenzierte Stick-Signal |
extern volatile unsigned char NewPpmData; |
#endif //_RC_H |
/branches/thjac/V1_12/spi.c |
---|
0,0 → 1,281 |
// ######################## SPI - FlightCtrl ################### |
#include "main.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 SPI_VersionInfo; |
unsigned char SPI_BufferIndex; |
unsigned char SPI_RxBufferIndex; |
volatile unsigned char SPI_Buffer[sizeof(FromNaviCtrl)]; |
unsigned char *SPI_TX_Buffer; |
unsigned char SPITransferCompleted, SPI_ChkSum; |
unsigned char SPI_RxDataValid,NaviDataOkay = 0; |
unsigned char SPI_CommandSequence[] = { SPI_CMD_USER, SPI_CMD_STICK, SPI_CMD_PARAMETER1, SPI_CMD_STICK, SPI_CMD_MISC, SPI_CMD_VERSION }; |
unsigned char SPI_CommandCounter = 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_CMD_USER; |
ToNaviCtrl.IntegralNick = 0; |
ToNaviCtrl.IntegralRoll = 0; |
FromNaviCtrl_Value.SerialDataOkay = 0; |
SPI_RxDataValid = 0; |
SPI_VersionInfo.Major = VERSION_MAJOR; |
SPI_VersionInfo.Minor = VERSION_MINOR; |
SPI_VersionInfo.Patch = VERSION_PATCH; |
SPI_VersionInfo.Compatible = NC_SPI_COMPATIBLE; |
} |
//------------------------------------------------------ |
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; |
//DebugOut.Analog[17]++; |
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; |
//DebugOut.Analog[18]++; |
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; |
cli(); |
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.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_CMD_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) MikroKopterFlags; |
MikroKopterFlags &= ~(FLAG_CALIBRATE | FLAG_START); |
ToNaviCtrl.Param.Byte[9] = (unsigned char) UBat; |
ToNaviCtrl.Param.Byte[10] =(unsigned char) EE_Parameter.UnterspannungsWarnung; |
ToNaviCtrl.Param.Byte[11] =(unsigned char) eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET]); |
break; |
case SPI_CMD_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_CMD_STICK: |
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; |
ToNaviCtrl.Param.Byte[3] = (char) tmp; |
ToNaviCtrl.Param.Byte[4] = (unsigned char) Poti1; |
ToNaviCtrl.Param.Byte[5] = (unsigned char) Poti2; |
ToNaviCtrl.Param.Byte[6] = (unsigned char) Poti3; |
ToNaviCtrl.Param.Byte[7] = (unsigned char) Poti4; |
ToNaviCtrl.Param.Byte[8] = (unsigned char) SenderOkay; |
break; |
case SPI_CMD_MISC: |
if(WinkelOut.CalcState > 5) |
{ |
WinkelOut.CalcState = 0; |
ToNaviCtrl.Param.Byte[0] = 5; |
} |
else ToNaviCtrl.Param.Byte[0] = WinkelOut.CalcState; |
ToNaviCtrl.Param.Int[1] = HoehenWert; |
ToNaviCtrl.Param.Byte[1] = EE_Parameter.NaviPH_LoginTime; |
ToNaviCtrl.Param.Byte[4] = EE_Parameter.NaviGpsPLimit; |
ToNaviCtrl.Param.Byte[5] = EE_Parameter.NaviGpsILimit; |
ToNaviCtrl.Param.Byte[6] = EE_Parameter.NaviGpsDLimit; |
break; |
case SPI_CMD_VERSION: |
ToNaviCtrl.Param.Byte[0] = SPI_VersionInfo.Major; |
ToNaviCtrl.Param.Byte[1] = SPI_VersionInfo.Minor; |
ToNaviCtrl.Param.Byte[2] = SPI_VersionInfo.Patch; |
ToNaviCtrl.Param.Byte[3] = SPI_VersionInfo.Compatible; |
ToNaviCtrl.Param.Byte[4] = PlatinenVersion; |
break; |
} |
sei(); |
if(SPI_RxDataValid) |
{ |
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; |
NaviDataOkay = 250; |
} |
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_KALMAN: |
FromNaviCtrl_Value.Kalman_K = FromNaviCtrl.Param.Byte[0]; |
FromNaviCtrl_Value.Kalman_MaxFusion = FromNaviCtrl.Param.Byte[1]; |
FromNaviCtrl_Value.Kalman_MaxDrift = FromNaviCtrl.Param.Byte[2]; |
FromNaviCtrl_Value.SerialDataOkay = FromNaviCtrl.Param.Byte[3]; |
break; |
default: |
break; |
} |
} |
else |
{ |
// KompassValue = 0; |
// KompassRichtung = 0; |
GPS_Nick = 0; |
GPS_Roll = 0; |
} |
} |
#endif |
/branches/thjac/V1_12/spi.h |
---|
0,0 → 1,140 |
// ######################## SPI - FlightCtrl ################### |
#ifndef _SPI_H |
#define _SPI_H |
#include <util/delay.h> |
#define USE_SPI_COMMUNICATION |
#define SPI_PROTOCOL_COMP 1 |
//----------------------------------------- |
#define DDR_SPI DDRB |
#define DD_SS PB4 |
#define DD_SCK PB7 |
#define DD_MOSI PB5 |
#define DD_MISO PB6 |
// 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 SLAVE_SELECT_DDR_PORT DDRC |
#define SLAVE_SELECT_PORT PORTC |
#define SPI_SLAVE_SELECT PC5 |
#define SPI_CMD_USER 10 |
#define SPI_CMD_STICK 11 |
#define SPI_CMD_MISC 12 |
#define SPI_CMD_PARAMETER1 13 |
#define SPI_CMD_VERSION 14 |
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 |
{ char Byte[12]; |
int Int[6]; |
long Long[3]; |
float Float[3]; |
} Param; |
unsigned char Chksum; |
}; |
#define SPI_KALMAN 103 |
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 |
{ char Byte[12]; |
int Int[6]; |
long Long[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; |
}; |
struct str_SPI_VersionInfo |
{ |
unsigned char Major; |
unsigned char Minor; |
unsigned char Patch; |
unsigned char Compatible; |
}; |
#ifdef USE_SPI_COMMUNICATION |
extern struct str_FromNaviCtrl_Value FromNaviCtrl_Value; |
extern struct str_ToNaviCtrl ToNaviCtrl; |
extern struct str_FromNaviCtrl FromNaviCtrl; |
extern unsigned char SPI_CommandCounter,NaviDataOkay; |
//#define SPI_CMD_VALUE 0x03 |
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/thjac/V1_12/timer0.c |
---|
0,0 → 1,441 |
#include "main.h" |
#include "parameter.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; |
int ServoValue = 0; |
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 |
}; |
SIGNAL (SIG_OVERFLOW0) // 8kHz |
{ |
static unsigned char cnt_1ms = 1,cnt = 0; |
unsigned char pieper_ein = 0; |
// TCNT0 -= 250;//TIMER_RELOAD_VALUE; |
if(SendSPI) SendSPI--; |
if(!cnt--) |
{ |
cnt = 9; |
cnt_1ms++; |
cnt_1ms %= 2; |
if(!cnt_1ms) UpdateMotor = 1; |
CountMilliseconds++; |
} |
if(beeptime > 1) |
{ |
beeptime--; |
if(beeptime & BeepMuster) |
{ |
pieper_ein = 1; |
} |
else pieper_ein = 0; |
} |
else |
{ |
pieper_ein = 0; |
BeepMuster = 0xffff; |
} |
if(pieper_ein) |
{ |
if(PlatinenVersion == 10) PORTD |= (1<<2); // Speaker an PORTD.2 |
else PORTC |= (1<<7); // Speaker an PORTC.7 |
} |
else |
{ |
if(PlatinenVersion == 10) PORTD &= ~(1<<2); |
else PORTC &= ~(1<<7); |
} |
if(EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV) |
{ |
if(PINC & 0x10) |
{ |
cntKompass++; |
} |
else |
{ |
if((cntKompass) && (cntKompass < 362)) |
{ |
cntKompass += cntKompass / 41; |
if(cntKompass > 10) KompassValue = cntKompass - 10; else KompassValue = 0; |
} |
// if(cntKompass < 10) cntKompass = 10; |
// KompassValue = (unsigned long)((unsigned long)(cntKompass-10)*720L + 1L) / 703L; |
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(); |
// set PD7 as output of the PWM for nick servo |
DDRD |= (1<<DDD7); |
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 = 120; |
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.ServoNickCompInvert & 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; |
DebugOut.Analog[20] = ServoNickValue; |
// 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 |
{ |
long integral; |
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) |
/* Über Parameter läßt sich zwischen "+" und "X" - Formations |
* umschalten (sh. parameter.h) |
*/ |
if (PARAM_X_FORMATION) |
integral = IntegralNick - IntegralRoll; |
else |
integral = IntegralNick; |
if(EE_Parameter.ServoNickCompInvert & 0x01) |
{ // inverting movement of servo |
ServoNickValue += (int16_t)( ( (int32_t)EE_Parameter.ServoNickComp * MULTIPLYER * (integral / 128L ) ) / (256L) ); |
} |
else |
{ // non inverting movement of servo |
ServoNickValue -= (int16_t)( ( (int32_t)EE_Parameter.ServoNickComp * MULTIPLYER * (integral / 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; |
DebugOut.Analog[20] = ServoNickValue; |
break; |
case 2: // Roll Compensation Servo |
ServoRollOffset = (ServoRollOffset * 3 + (int16_t) 80 * MULTIPLYER) / 4; // lowpass offset |
ServoRollValue = ServoRollOffset; // offset (Range from 0 to 255 * 3 = 765) |
//if(EE_Parameter.ServoRollCompInvert & 0x01) |
{ // inverting movement of servo |
ServoRollValue += (int16_t)( ( (int32_t) 50 * MULTIPLYER * (IntegralRoll / 128L ) ) / (256L) ); |
} |
/* else |
{ // non inverting movement of servo |
ServoRollValue -= (int16_t)( ( (int32_t) 40 * MULTIPLYER * (IntegralRoll / 128L ) ) / (256L) ); |
} |
*/ // limit servo value to its parameter range definition |
if(ServoRollValue < ((int16_t)EE_Parameter.ServoNickMin * MULTIPLYER) ) |
{ |
ServoRollValue = (int16_t)EE_Parameter.ServoNickMin * MULTIPLYER; |
} |
else |
if(ServoRollValue > ((int16_t)EE_Parameter.ServoNickMax * MULTIPLYER) ) |
{ |
ServoRollValue = (int16_t)EE_Parameter.ServoNickMax * MULTIPLYER; |
} |
RemainingPulse += ServoRollValue - (256 / 2) * MULTIPLYER; // shift ServoNickValue to center position |
ServoRollValue /= MULTIPLYER; |
//DebugOut.Analog[20] = ServoRollValue; |
/* ServoRollOffset = (ServoRollOffset * 3 + (int16_t)Parameter_ServoRollControl * MULTIPLYER) / 4; // lowpass offset |
ServoRollValue = ServoRollOffset; // offset (Range from 0 to 255 * 3 = 765) |
if(EE_Parameter.ServoRollCompInvert & 0x01) |
{ // inverting movement of servo |
ServoRollValue += (int16_t)( ( (int32_t)EE_Parameter.ServoNickComp * MULTIPLYER * (IntegralNick / 128L ) ) / (256L) ); |
} |
else |
{ // non inverting movement of servo |
ServoRollValue -= (int16_t)( ( (int32_t)EE_Parameter.ServoNickComp * MULTIPLYER * (IntegralNick / 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; |
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) HEF4017R_OFF; // disable HEF4017 reset |
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/thjac/V1_12/timer0.h |
---|
0,0 → 1,20 |
#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 int ServoValue; |
extern unsigned int BeepMuster; |
extern volatile unsigned char SendSPI, ServoActive; |
/branches/thjac/V1_12/twimaster.c |
---|
0,0 → 1,216 |
/*############################################################################ |
############################################################################*/ |
#include "main.h" |
volatile unsigned char twi_state = 0; |
unsigned char motor = 0; |
unsigned char motorread = 0,MissingMotor = 0; |
unsigned char motor_rx[16],motor_rx2[16]; |
unsigned char MotorPresent[MAX_MOTORS]; |
unsigned char MotorError[MAX_MOTORS]; |
//############################################################################ |
//Initzialisieren der I2C (TWI) Schnittstelle |
void i2c_init(void) |
//############################################################################ |
{ |
TWSR = 0; |
TWBR = ((SYSCLK/SCL_CLOCK)-16)/2; |
} |
//############################################################################ |
//Start I2C |
void i2c_start(void) |
//############################################################################ |
{ |
TWCR = (1<<TWSTA) | (1<<TWEN) | (1<<TWINT) | (1<<TWIE); |
} |
//############################################################################ |
void i2c_stop(void) |
//############################################################################ |
{ |
TWCR = (1<<TWEN) | (1<<TWSTO) | (1<<TWINT); |
} |
void i2c_reset(void) |
//############################################################################ |
{ |
i2c_stop(); |
twi_state = 0; |
motor = TWDR; |
motor = 0; |
TWCR = 0x80; |
TWAMR = 0; |
TWAR = 0; |
TWDR = 0; |
TWSR = 0; |
TWBR = 0; |
i2c_init(); |
i2c_start(); |
i2c_write_byte(0); |
} |
//############################################################################ |
void i2c_write_byte(char byte) |
//############################################################################ |
{ |
TWSR = 0x00; |
TWDR = byte; |
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE); |
} |
/****************************************/ |
/* Write to I2C */ |
/****************************************/ |
void I2C_WriteByte(int8_t byte) |
{ |
// move byte to send into TWI Data Register |
TWDR = byte; |
// clear interrupt flag (TWINT = 1) |
// enable i2c bus (TWEN = 1) |
// enable interrupt (TWIE = 1) |
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE); |
} |
/****************************************/ |
/* Receive byte and send ACK */ |
/****************************************/ |
void I2C_ReceiveByte(void) |
{ |
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE) | (1<<TWEA); |
} |
/****************************************/ |
/* I2C receive last byte and send no ACK*/ |
/****************************************/ |
void I2C_ReceiveLastByte(void) |
{ |
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE); |
} |
//############################################################################ |
SIGNAL (TWI_vect) |
//############################################################################ |
{ |
static unsigned char missing_motor; |
switch(twi_state++) |
{ |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Writing the Data |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
case 0: |
while(Mixer.Motor[motor][0] <= 0 && motor < MAX_MOTORS) motor++; // skip if not used |
if(motor == MAX_MOTORS) // writing finished -> now read |
{ |
motor = 0; |
twi_state = 3; |
i2c_write_byte(0x53+(motorread*2)); |
} |
else i2c_write_byte(0x52+(motor*2)); |
break; |
case 1: |
i2c_write_byte(Motor[motor++]); |
break; |
case 2: |
if(TWSR == 0x30) { if(!missing_motor) missing_motor = motor; if(++MotorError[motor-1] == 0) MotorError[motor-1] = 255;} |
i2c_stop(); |
I2CTimeout = 10; |
twi_state = 0; |
i2c_start(); |
break; |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Reading Data |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
case 3: |
//Transmit 1st byte for reading |
if(TWSR != 0x40) // Error? |
{ |
MotorPresent[motorread] = 0; |
motorread++; |
if(motorread >= MAX_MOTORS) motorread = 0; |
i2c_stop(); |
twi_state = 0; |
} |
else |
{ |
MotorPresent[motorread] = ('1' - '-') + motorread; |
I2C_ReceiveByte(); |
} |
MissingMotor = missing_motor; |
missing_motor = 0; |
break; |
case 4: //Read 1st byte and transmit 2nd Byte |
motor_rx[motorread] = TWDR; |
I2C_ReceiveLastByte(); //nack |
break; |
case 5: |
//Read 2nd byte |
motor_rx2[motorread++] = TWDR; |
if(motorread >= MAX_MOTORS) motorread = 0; |
i2c_stop(); |
twi_state = 0; |
break; |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// writing Gyro-Offset |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
case 8: |
i2c_write_byte(0x98); // Address of the DAC |
break; |
case 9: |
i2c_write_byte(0x10); // Update Channel A |
break; |
case 10: |
i2c_write_byte(AnalogOffsetNick); // Value |
break; |
case 11: |
i2c_write_byte(0x80); // Value |
break; |
case 12: |
i2c_stop(); |
I2CTimeout = 10; |
i2c_start(); |
break; |
case 13: |
i2c_write_byte(0x98); // Address of the DAC |
break; |
case 14: |
i2c_write_byte(0x12); // Update Channel B |
break; |
case 15: |
i2c_write_byte(AnalogOffsetRoll); // Value |
break; |
case 16: |
i2c_write_byte(0x80); // Value |
break; |
case 17: |
i2c_stop(); |
I2CTimeout = 10; |
i2c_start(); |
break; |
case 18: |
i2c_write_byte(0x98); // Address of the DAC |
break; |
case 19: |
i2c_write_byte(0x14); // Update Channel C |
break; |
case 20: |
i2c_write_byte(AnalogOffsetGier); // Value |
break; |
case 21: |
i2c_write_byte(0x80); // Value |
break; |
case 22: |
i2c_stop(); |
I2CTimeout = 10; |
twi_state = 0; |
break; |
default: twi_state = 0; |
break; |
} |
TWCR |= 0x80; |
} |
/branches/thjac/V1_12/twimaster.h |
---|
0,0 → 1,35 |
/*############################################################################ |
############################################################################*/ |
#ifndef _I2C_MASTER_H |
#define _I2C_MASTER_H |
//############################################################################ |
// I2C Konstanten |
#define SCL_CLOCK 200000L |
#define I2C_TIMEOUT 30000 |
#define I2C_START 0x08 |
#define I2C_REPEATED_START 0x10 |
#define I2C_TX_SLA_ACK 0x18 |
#define I2C_TX_DATA_ACK 0x28 |
#define I2C_RX_SLA_ACK 0x40 |
#define I2C_RX_DATA_ACK 0x50 |
//############################################################################ |
extern volatile unsigned char twi_state; |
extern unsigned char motor,MissingMotor; |
extern unsigned char motorread; |
extern unsigned char motor_rx[]; |
extern unsigned char MotorPresent[]; |
extern unsigned char MotorError[]; |
void i2c_reset(void); |
extern void i2c_init (void); // I2C initialisieren |
extern void i2c_start (void); // Start I2C |
extern void i2c_stop (void); // Stop I2C |
extern void i2c_write_byte (char byte); // 1 Byte schreiben |
extern void i2c_reset(void); |
#endif |
/branches/thjac/V1_12/uart.c |
---|
0,0 → 1,565 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include <stdarg.h> |
#include <string.h> |
#include "main.h" |
#include "uart.h" |
#define FC_ADDRESS 1 |
#define NC_ADDRESS 2 |
#define MK3MAG_ADDRESS 3 |
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 SendeBuffer[MAX_SENDE_BUFF]; |
unsigned volatile char RxdBuffer[MAX_EMPFANGS_BUFF]; |
unsigned volatile char NMEABuffer[MAX_EMPFANGS_BUFF]; |
unsigned volatile char NeuerDatensatzEmpfangen = 0; |
unsigned volatile char NeueKoordinateEmpfangen = 0; |
unsigned volatile char UebertragungAbgeschlossen = 1; |
unsigned volatile char CntCrcError = 0; |
unsigned volatile char AnzahlEmpfangsBytes = 0; |
unsigned 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 Debug_Timer,Kompass_Timer,Timer3D; |
unsigned int DebugDataIntervall = 200, Intervall3D = 0; |
const unsigned char ANALOG_TEXT[32][16] = |
{ |
//1234567890123456 |
"AngleNick ", //0 |
"AngleRoll ", |
"AccNick ", |
"AccRoll ", |
"GyroGier ", |
"Hight Value ", //5 |
"AccZ ", |
"Gas ", |
"Compass Value ", |
"Voltage ", |
"Empfang ", //10 |
"Gyro Kompass ", |
"Motor Front ", |
"Motor Rear ", |
"Motor Left ", |
"Motor Right ", //15 |
" ", |
" ", |
" ", |
"MK3Mag CalState ", |
"Servo ", //20 |
" ", |
" ", |
" ", |
" ", |
"PitchOffset ", //25 |
"StickValue ", |
"Kalman_MaxDrift ", |
" ", |
"Navi Serial Data", |
"GPS_Nick ", //30 |
"GPS_Roll " |
}; |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ Sende-Part der Datenübertragung |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
SIGNAL(INT_VEC_TX) |
{ |
static unsigned int ptr = 0; |
unsigned char tmp_tx; |
if(!UebertragungAbgeschlossen) |
{ |
ptr++; // die [0] wurde schon gesendet |
tmp_tx = SendeBuffer[ptr]; |
if((tmp_tx == '\r') || (ptr == MAX_SENDE_BUFF)) |
{ |
ptr = 0; |
UebertragungAbgeschlossen = 1; |
} |
UDR = tmp_tx; |
} |
else ptr = 0; |
} |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ Empfangs-Part der Datenübertragung, incl. CRC-Auswertung |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
SIGNAL(INT_VEC_RX) |
{ |
static unsigned int crc; |
static unsigned char crc1,crc2,buf_ptr; |
static unsigned char UartState = 0; |
unsigned char CrcOkay = 0; |
SioTmp = UDR; |
if(buf_ptr >= MAX_EMPFANGS_BUFF) UartState = 0; |
if(SioTmp == '\r' && UartState == 2) |
{ |
UartState = 0; |
crc -= RxdBuffer[buf_ptr-2]; |
crc -= RxdBuffer[buf_ptr-1]; |
crc %= 4096; |
crc1 = '=' + crc / 64; |
crc2 = '=' + crc % 64; |
CrcOkay = 0; |
if((crc1 == RxdBuffer[buf_ptr-2]) && (crc2 == RxdBuffer[buf_ptr-1])) CrcOkay = 1; else { CrcOkay = 0; CntCrcError++;}; |
if(!NeuerDatensatzEmpfangen && CrcOkay) // Datensatz schon verarbeitet |
{ |
NeuerDatensatzEmpfangen = 1; |
AnzahlEmpfangsBytes = buf_ptr + 1; |
RxdBuffer[buf_ptr] = '\r'; |
if(RxdBuffer[2] == 'R') wdt_enable(WDTO_250MS); // Reset-Commando |
} |
} |
else |
switch(UartState) |
{ |
case 0: |
if(SioTmp == '#' && !NeuerDatensatzEmpfangen) UartState = 1; // Startzeichen und Daten schon verarbeitet |
buf_ptr = 0; |
RxdBuffer[buf_ptr++] = SioTmp; |
crc = SioTmp; |
break; |
case 1: // Adresse auswerten |
UartState++; |
RxdBuffer[buf_ptr++] = SioTmp; |
crc += SioTmp; |
break; |
case 2: // Eingangsdaten sammeln |
RxdBuffer[buf_ptr] = SioTmp; |
if(buf_ptr < MAX_EMPFANGS_BUFF) buf_ptr++; |
else UartState = 0; |
crc += SioTmp; |
break; |
default: |
UartState = 0; |
break; |
} |
} |
// -------------------------------------------------------------------------- |
void AddCRC(unsigned int wieviele) |
{ |
unsigned int tmpCRC = 0,i; |
for(i = 0; i < wieviele;i++) |
{ |
tmpCRC += SendeBuffer[i]; |
} |
tmpCRC %= 4096; |
SendeBuffer[i++] = '=' + tmpCRC / 64; |
SendeBuffer[i++] = '=' + tmpCRC % 64; |
SendeBuffer[i++] = '\r'; |
UebertragungAbgeschlossen = 0; |
UDR = SendeBuffer[0]; |
} |
// -------------------------------------------------------------------------- |
void SendOutData(unsigned char cmd,unsigned char 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; |
SendeBuffer[pt++] = '#'; // Startzeichen |
SendeBuffer[pt++] = 'a' + address; // Adresse (a=0; b=1,...) |
SendeBuffer[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; |
SendeBuffer[pt++] = '=' + (a >> 2); |
SendeBuffer[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4)); |
SendeBuffer[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6)); |
SendeBuffer[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)); |
break; |
case 'm':// "Write Mixer |
while(!UebertragungAbgeschlossen); |
if(pRxData[0] == MIXER_REVISION) |
{ |
memcpy(&Mixer, (unsigned char *)pRxData, sizeof(Mixer)); |
eeprom_write_block(&Mixer, &EEPromArray[EEPROM_ADR_MIXER_TABLE], sizeof(Mixer)); |
tempchar1 = 1; |
} |
else tempchar1 = 0; |
SendOutData('M', FC_ADDRESS, 1, &tempchar1, sizeof(tempchar1)); |
break; |
case 'p': // get PPM Channels |
GetPPMChannelAnforderung = 1; |
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] = GetActiveParamSetNumber(); |
} |
// 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 |
ReadParameterSet(pRxData[0], (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
while(!UebertragungAbgeschlossen); |
tempchar1 = pRxData[0]; |
tempchar2 = EE_DATENREVISION; |
SendOutData('Q', FC_ADDRESS, 3, &tempchar1, sizeof(tempchar1), &tempchar2, sizeof(tempchar2), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
break; |
case 's': // Parametersatz speichern |
if((1 <= pRxData[0]) && (pRxData[0] <= 5) && (pRxData[1] == EE_DATENREVISION)) // check for setting to be in range |
{ |
memcpy((unsigned char *) &EE_Parameter.Kanalbelegung[0], (unsigned char *)&pRxData[2], STRUCT_PARAM_LAENGE); |
WriteParameterSet(pRxData[0], (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L; |
Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagRoll * 2500L; |
SetActiveParamSetNumber(pRxData[0]); |
tempchar1 = GetActiveParamSetNumber(); |
init(); |
Piep(tempchar1); |
} |
else |
{ |
tempchar1 = 0; // mark in response an invlid setting |
} |
while(!UebertragungAbgeschlossen); |
SendOutData('S', FC_ADDRESS, 1, &tempchar1, sizeof(tempchar1)); |
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 > 20) 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; |
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; |
break; |
case 'd': // Poll the debug data |
DebugDataIntervall = pRxData[0] * 10; |
if(DebugDataIntervall > 0) DebugDataAnforderung = 1; |
break; |
case 'h':// x-1 Displayzeilen |
PcZugriff = 255; |
RemoteKeys |= pRxData[0]; |
if(RemoteKeys) DisplayLine = 0; |
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; |
} |
break; // default: |
} |
NeuerDatensatzEmpfangen = 0; |
pRxData = 0; |
RxDataLen = 0; |
} |
//############################################################################ |
//Routine für die Serielle Ausgabe |
int uart_putchar (char c) |
//############################################################################ |
{ |
if (c == '\n') |
uart_putchar('\r'); |
//Warten solange bis Zeichen gesendet wurde |
loop_until_bit_is_set(USR, UDRE); |
//Ausgabe des Zeichens |
UDR = c; |
return (0); |
} |
// -------------------------------------------------------------------------- |
void WriteProgramData(unsigned int pos, unsigned char wert) |
{ |
//if (ProgramLocation == IN_RAM) Buffer[pos] = wert; |
// else eeprom_write_byte(&EE_Buffer[pos], wert); |
// Buffer[pos] = wert; |
} |
//############################################################################ |
//INstallation der Seriellen Schnittstelle |
void UART_Init (void) |
//############################################################################ |
{ |
//Enable TXEN im Register UCR TX-Data Enable & RX Enable |
UCR=(1 << TXEN) | (1 << RXEN); |
// UART Double Speed (U2X) |
USR |= (1<<U2X); |
// RX-Interrupt Freigabe |
UCSRB |= (1<<RXCIE); |
// TX-Interrupt Freigabe |
UCSRB |= (1<<TXCIE); |
//Teiler wird gesetzt |
UBRR=(SYSCLK / (BAUD_RATE * 8L) - 1); |
//UBRR = 33; |
//öffnet einen Kanal für printf (STDOUT) |
//fdevopen (uart_putchar, 0); |
//sbi(PORTD,4); |
Debug_Timer = SetDelay(DebugDataIntervall); |
Kompass_Timer = SetDelay(220); |
VersionInfo.SWMajor = 0; |
VersionInfo.SWMinor = 74; |
VersionInfo.SWPatch = 4; |
VersionInfo.ProtoMajor = VERSION_SERIAL_MAJOR; |
VersionInfo.ProtoMinor = VERSION_SERIAL_MINOR; |
pRxData = 0; |
RxDataLen = 0; |
} |
//--------------------------------------------------------------------------------------------- |
void DatenUebertragung(void) |
{ |
if(!UebertragungAbgeschlossen) return; |
if(DebugDisplayAnforderung && UebertragungAbgeschlossen) |
{ |
Menu(); |
SendOutData('H', FC_ADDRESS, 2, &DisplayLine, sizeof(DisplayLine), &DisplayBuff[DisplayLine * 20], 20); |
DisplayLine++; |
if(DisplayLine >= 4) DisplayLine = 0; |
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; |
} |
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('w', 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) |
{ |
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); |
SendOutData('C', FC_ADDRESS, 1, (unsigned char *) &Data3D,sizeof(Data3D)); |
Timer3D = SetDelay(Intervall3D); |
} |
if(DebugTextAnforderung != 255) // Texte für die Analogdaten |
{ |
SendOutData('A', FC_ADDRESS, 2, (unsigned char *)&DebugTextAnforderung, sizeof(DebugTextAnforderung),(unsigned char *) ANALOG_TEXT[DebugTextAnforderung], 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; |
} |
} |
/branches/thjac/V1_12/uart.h |
---|
0,0 → 1,136 |
#ifndef _UART_H |
#define _UART_H |
#define MAX_SENDE_BUFF 150 |
#define MAX_EMPFANGS_BUFF 150 |
void BearbeiteRxDaten(void); |
extern unsigned char DebugGetAnforderung; |
extern unsigned volatile char SendeBuffer[MAX_SENDE_BUFF]; |
extern unsigned volatile char RxdBuffer[MAX_EMPFANGS_BUFF]; |
extern unsigned volatile char UebertragungAbgeschlossen; |
extern unsigned volatile char PC_DebugTimeout; |
extern unsigned volatile char NeueKoordinateEmpfangen; |
extern unsigned 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 int 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 Digital[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 reserve[8]; |
}; |
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 Reserved[5]; |
}; |
extern struct str_VersionInfo VersionInfo; |
//Die Baud_Rate der Seriellen Schnittstelle ist 9600 Baud |
//#define BAUD_RATE 9600 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 14400 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 28800 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 38400 //Baud Rate für die Serielle Schnittstelle |
#define BAUD_RATE 57600 //Baud Rate für die Serielle Schnittstelle |
//Anpassen der seriellen Schnittstellen Register wenn ein ATMega128 benutzt wird |
#if defined (__AVR_ATmega128__) |
# define USR UCSR0A |
# define UCR UCSR0B |
# define UDR UDR0 |
# define UBRR UBRR0L |
# define EICR EICRB |
#endif |
#if defined (__AVR_ATmega32__) |
# define USR UCSRA |
# define UCR UCSRB |
# define UBRR UBRRL |
# define EICR EICRB |
# define INT_VEC_RX SIG_UART_RECV |
# define INT_VEC_TX SIG_UART_TRANS |
#endif |
#if defined (__AVR_ATmega644__) |
# define USR UCSR0A |
# define UCR UCSR0B |
# define UDR UDR0 |
# define UBRR UBRR0L |
# define EICR EICR0B |
# define TXEN TXEN0 |
# define RXEN RXEN0 |
# define RXCIE RXCIE0 |
# define TXCIE TXCIE0 |
# define U2X U2X0 |
# define UCSRB UCSR0B |
# define UDRE UDRE0 |
# define INT_VEC_RX SIG_USART_RECV |
# define INT_VEC_TX SIG_USART_TRANS |
#endif |
#if defined (__AVR_ATmega644P__) |
# define USR UCSR0A |
# define UCR UCSR0B |
# define UDR UDR0 |
# define UBRR UBRR0L |
# define EICR EICR0B |
# define TXEN TXEN0 |
# define RXEN RXEN0 |
# define RXCIE RXCIE0 |
# define TXCIE TXCIE0 |
# define U2X U2X0 |
# define UCSRB UCSR0B |
# define UDRE UDRE0 |
# define INT_VEC_RX SIG_USART_RECV |
# define INT_VEC_TX SIG_USART_TRANS |
#endif |
#endif //_UART_H |
/branches/thjac/V1_12/version.txt |
---|
0,0 → 1,246 |
------- |
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 |
Baseline V0.71h |
V1_10a T. Jachmann |
- Neutralstellung des Gasknüppels mit autom. Aktivierung der Höhenregelung in Neutralstellung |
- Automatische Kalibrierung (Ermittlung der Neutralstellung) des Gas-Sticks beim Einschalten der FC |
- Bleibt der Knüppel für ca. 0,5 in Neutralstellung, wird die autom. Höhenregelung aktiviert |
- UserParam1 regelt die Empfindlichkeit der initialen 'Loslasserkennung' des Gasknüppels (Achtung: Wert mittels 'MK in der Hand' ermitteln!!!) |
- Höhenbegrenzung entfernt und neue Höhenregelung implementiert |
- MaxHoehe dient jetzt der Begrenzung des Fehlerwertes des Reglers |
- Looping-Funktion entfernt |
- Rotation des Nick/Roll-Sticks um 45°, um ohne Hardware-Anpassung in X-Formation zu fliegen |
- Anpassung der Servo-Nick-Kompensation auf X-Formation |
- Einschalten der LED-Ausgänge beim Starten der Motoren |
- Einführung eines zweiten MinGas-Parameters für Leerlaufgas nach Einschalten der Motoren |
V1_10b T. Jachmann |
- MK wird bei eingeschalteten Motoren mit Stick rechts unten nicht kalibriert |
- Die J16/J17-Frequenz kann bei Unterspannungswarnung erhöht werden |
- Die Pegel von J16/J17 lassen sich invertieren |
- Auch bei ausgeschalteten LED's können diese im Unterspannungsfall zwanghaft aktiviert werden |
V1_10c K. Rheinwald |
- User Parameter Defaults werden gem. Doku gesetzt |
- Die Pegel von J16/J17 werden auch im 'Aus'-Zustand invertiert |
- J16/J17 können getrennt voneinander invertiert werden |
- Einfache PWM auf J16/17 (0,20,40,60,80,100%, getrennt voneinander einstellbar) |
V1_10d K. Rheinwald |
- PWM feiner abgestuft (0-100% in 10% Schritten, getrennt voneinander einstellbar) |
- Timing von J16/17 von 10 auf 20ms verdoppelt -> Timings im MK-Tool müssen halbiert werden |
- PWM funktioniert auch für Timing über PotiX |
- Reihenfolge der User Parameters and Bitfields aufgeräumt - Settings checken! |
- User Parameter Defaults werden bei Initialisierung auf 0 gesetzt |
- Einige Warnings bereinigt |
--- |
V1_11a K. Rheinwald |
- Poti-Offset auf +-125 korrigiert |
- Einige Module gePrettyPrinted |
- Gas Modus wird wirklich automatisch geprüft und nicht forciert. |
- Merge with altcon.c added by T. Jachmann |
- picth_XX ausgelagert |
V1_11b T. Jachmann |
- Neuer MD-ähnlicher Pitch-Modus |
- Kalibrierungsfunktion für Standgas |
- Standgas wird im EEProm abgespeichert |
- Neue Display-Seite für Pitch-Steuerung |
- Fehler in Höhenregelung korrigiert |
- Integralanteil in Höhenregelung vorerst stillgelegt |
V1_11c T. Jachmann |
- Setup-Modus für Pitch-Steuerung "neutral" |
- Parameter für "Loslasserkennung" der Pitch-Steuerung "neutral" liegt jetzt im EEProm (Setting-unabhängig) |
- Erweiterung der Display-Seite für Pitch-Steuerung |
- Sicherung des Pitch-Modus über die Einschalt-Gas-Stick-Position und die Höhenregelung im Setting |
V1-12a T. Jachmann |
- Mit Originalversion 0.74d integriert |