/branches/thjac/V1_10/Dokumentation/Anleitung_V1_10a.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_10/Dokumentation/Anleitung_V1_10a.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_10/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_10/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_10/Hex-Files/Flight-Ctrl_MEGA644_V1_10a.hex |
---|
0,0 → 1,2485 |
:100000000C948D020C94AA020C94AA020C94AA02DD |
:100010000C94AA020C94AA020C94AA020C94AA02B0 |
:100020000C94AA020C94F70F0C94AA020C94D80F0B |
:100030000C94751B0C94AA020C94AA020C94AA02AC |
:100040000C94AA020C94AA020C94ED0E0C94AA0231 |
:100050000C94AE050C94AA020C9478050C94AA0298 |
:100060000C9487110C94AA020C94861A0C94AA0280 |
:10007000A31AA81ABC1AC91AD61ACE1AD61AE81A7E |
:10008000121BF91AFD1A1D1B071B121B001B041B58 |
:100090001D1B071B121B161B1A1B1D1B211B0A0AEB |
:1000A0000D004E65757472616C0048656164696E1F |
:1000B00067486F6C64000A0D537465756572756EE0 |
:1000C000673A20004F4B0A0D000A0D4162676C65CC |
:1000D000696368204C756674647275636B73656ED2 |
:1000E000736F722E2E000A0D42656E75747A65204C |
:1000F000506172616D657465727361747A202564F4 |
:10010000000A0D414343206E696368742061626791 |
:1001100065676C696368656E21000A0D496E6974D4 |
:100120002E20454550524F4D3A2047656E6572610D |
:1001300074696E672044656661756C742D506172D8 |
:10014000616D65746572207573696E67206F6C648C |
:1001500020537469636B2053657474696E67730010 |
:100160000A0D496E69742E20454550524F4D3A2074 |
:1001700047656E65726174696E6720446566617576 |
:100180006C742D506172616D6574657220616E646E |
:1001900020537469636B2D53657474696E67732E95 |
:1001A0002E2E000A0D3D3D3D3D3D3D3D3D3D3D3D3D |
:1001B0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D6F |
:1001C0003D3D3D000A0D466C69676874436F6E746F |
:1001D000726F6C0A0D48617264776172653A2564CA |
:1001E0002E25640A0D536F6674776172653A562541 |
:1001F000642E2564256320002E0048693A25346961 |
:10020000202043663A253469200047733A25346933 |
:10021000202047693A25346920004E693A2534691F |
:100220002020526F3A253469200045787465726E3B |
:10023000436F6E74726F6C20200052616E67653A76 |
:100240002533692D253369005374656C6C756E67B1 |
:100250003A2025336900536574706F696E742020ED |
:1002600025336900536572766F202000506F7469E2 |
:10027000343A202025336900506F7469333A2020C6 |
:1002800025336900506F7469323A202025336900A4 |
:10029000506F7469313A20202533690053746172BC |
:1002A000743A2020202020253569004D657373772E |
:1002B0006572743A20202535690052696368747547 |
:1002C0006E673A2020253569004B6F6D706173733E |
:1002D0002020202020202000456D70662E5065676C |
:1002E000656C3A253569005370616E6E756E673ABC |
:1002F000202025356900486F63682025346920284F |
:100300002533692900526F6C6C202534692028251B |
:10031000336929004E69636B202534692028253311 |
:10032000692900414343202D2053656E736F72008D |
:1003300047696572202534692028253369292825D5 |
:1003400033692900526F6C6C2025346920282533CD |
:1003500069292825336929004E69636B2025346992 |
:1003600020282533692928253369290047696572C2 |
:100370002025346920282533692900526F6C6C20B0 |
:10038000253469202825336929004E69636B2025AF |
:10039000346920282533692900476965722025348E |
:1003A0006920282533692900526F6C6C2025346937 |
:1003B000202825336929004E69636B202534692084 |
:1003C0002825336929004779726F202D2053656EE7 |
:1003D000736F720050333A253469202050343A2527 |
:1003E0003469200050313A253469202050323A25B2 |
:1003F0003469200047733A253469202047693A253B |
:10040000346920004E693A2534692020526F3A251C |
:10041000346920004B373A25346920204B383A257F |
:10042000346920004B353A25346920204B363A2573 |
:10043000346920004B333A25346920204B343A2567 |
:10044000346920004B313A25346920204B323A255B |
:10045000346920004B6F6D706173733A2020202542 |
:10046000356900526F6C6C3A202020202020253501 |
:1004700069004E69636B3A202020202020253569D1 |
:1004800000616B742E204C6167650048F668656EEC |
:10049000726567656C756E67004B65696E652000F7 |
:1004A0004F66662020202020203A20253569004C08 |
:1004B000756674647275636B3A2025356900526500 |
:1004C000674F66667365743A20253569002863298D |
:1004D00020486F6C676572204275737300536574B2 |
:1004E00074696E673A202564200048573A5625649F |
:1004F0002E25642053573A25642E25642563002B4E |
:10050000204D696B726F4B6F70746572202B005BAE |
:1005100025695D005B25695D000011241FBECFEFDA |
:10052000D0E1DEBFCDBF14E0A0E0B1E0EAE7F7E93B |
:1005300002C005900D92AC3BB107D9F719E0ACEBC6 |
:10054000B4E001C01D92A63AB107E1F70E943B0357 |
:100550000C94BC4B0C940000863010F085E002C077 |
:10056000882329F0A2E0B0E0082E0E94B04B089545 |
:10057000A2E0B0E00E94A84B902D892F81508530D9 |
:1005800020F083E00E94AC0293E0892F90E0089570 |
:1005900080919B08E82FF0E0EE0FFF1FE359F74F23 |
:1005A000808191818D5E9F4F14F0109202018081B5 |
:1005B00091818A5B9F4FBCF480910201882399F45A |
:1005C00081E08093020180916A078F5F80936A07C0 |
:1005D000853038F088EE93E09093DE048093DD045C |
:1005E00002C00E94912880916A0790E09093380899 |
:1005F000809337080895582FFB01863010F055E09E |
:1006000002C08823D1F0252F30E021503040842FC4 |
:1006100090E0289FD001299FB00D389FB00D112484 |
:10062000AC59BF4F019724F001900E94B04BFACF14 |
:10063000852F0E94AC020E94FE420895282FFB01E4 |
:100640008150853008F023E030E021503040842F85 |
:1006500090E0289FD001299FB00D389FB00D112444 |
:10066000AC59BF4F019724F00E94A84B0192FACFDA |
:100670000E94FE4208951F93CF93DF9314B815B8DC |
:10068000189B06C0199B02C08DE007C08BE005C017 |
:10069000199B02C084E101C08AE08093000181E8D7 |
:1006A00087B93E9A8FEF88B98BE184B981E085B92B |
:1006B0008EE38AB9579A87E78BB984B7877F84BF5F |
:1006C000809160008861809360001092600080EDEE |
:1006D00097E09093DE048093DD04109280051092E1 |
:1006E0007F05109272081092710810927E05109288 |
:1006F0007D0510927C0510927B05809100018A3067 |
:1007000011F0843111F4289801C0289A0E94231115 |
:100710000E941D070E94601B0E9481110E946C1A9A |
:100720000E940F40789420910001822F6AE00E947D |
:10073000014B492F50E0822F0E94014B90E021E6AF |
:1007400030E03F932F932AE030E03F932F9321E056 |
:1007500030E03F932F935F934F939F938F9384EC5D |
:1007600091E09F938F931F920E94490C83EA91E03E |
:100770009F938F931F920E94490C8DB79EB740960E |
:100780000FB6F8949EBF0FBE8DBF809100018C30D4 |
:1007900010F4299A01C0299849E06BE978E083E0D8 |
:1007A0000E941E0321E030E0D9010E94A84B802D59 |
:1007B0008F3FB1F0D9010E94A84B802D893480F081 |
:1007C00080919B088A3060F480919C088A3040F4C4 |
:1007D00080919D088A3020F480919E088A3050F0E4 |
:1007E00080E691E09F938F931F920E94490C0E9494 |
:1007F000511C0DC0D9010E94A84B802D893451F0A5 |
:100800008AE191E09F938F931F920E94490C0F9071 |
:100810000F900F90A1E0B0E00E94A84B802D89348A |
:1008200009F10E94EC2911E0CBE9D8E0123039F04F |
:10083000133019F40E94A62804C0143010F00E944E |
:10084000482946E5BE01812F0E94FB021F5F16303A |
:1008500069F783E00E94AC0289E4A1E0B0E0082ED1 |
:100860000E94B04BA4E0B0E00E94A84B802D8530E0 |
:1008700050F081E091E09F938F931F920E94490C6A |
:100880000F900F900F900E94B80246E56BE978E058 |
:100890000E941E030E94B80290E09F938F9386EE01 |
:1008A00090E09F938F931F920E94490C8091A30820 |
:1008B0000F900F900F900F900F9080FD03C0C8EE27 |
:1008C000D3E020C089EC90E09F938F931F920E9409 |
:1008D000490C88EE93E00E94C30FEC010E94EC14D7 |
:1008E0000F900F900F90CE010E94CC0F8823D9F368 |
:1008F00084EC90E09F938F931F920E94490C0F907D |
:100900000F900F900E94EA26809100018A3011F02A |
:10091000843111F4289801C0289A80ED97E09093D3 |
:10092000DE048093DD0485E580936C0786EB90E020 |
:100930009F938F931F920E94490C8091A3080F9060 |
:100940000F900F9082FF03C08AEA90E002C082EA13 |
:1009500090E09F938F931F920E94490C0F900F90ED |
:100960000F908EE990E09F938F931F920E94490C05 |
:100970000E94371588E893E1909392038093910346 |
:1009800081E080936B070F900F900F908091DA04B5 |
:10099000882309F4A5C01092DA0480916A0788239D |
:1009A00019F00E94C80202C00E948E2A0E943C25B3 |
:1009B000209100012A3011F0243111F4289801C04F |
:1009C000289A80910501882321F0815080930501A8 |
:1009D0000EC01092760710929D0510929C05109201 |
:1009E0009F0510929E051092A1051092A00580917E |
:1009F0007A05882329F080917A05815080937A05C1 |
:100A00008091910390919203892B01F585E090E00C |
:100A100090939203809391030E943A1B80910B0361 |
:100A200090910C038F5F9F4F09F580918305882378 |
:100A3000E9F080E197E29093DE048093DD0480E8A2 |
:100A400090E090930C0380930B0310C0809191036E |
:100A500090919203019790939203809391032A308F |
:100A600011F0243111F4289801C0289A8091DA04F9 |
:100A7000882321F080918305882311F40E942A089D |
:100A80000E94F109CE010E94CC0F882339F12091F8 |
:100A90001103309112038091B30890E028173907B1 |
:100AA0009CF480910B0390910C038F5F9F4F61F436 |
:100AB00080E797E19093DE048093DD0480E093E08B |
:100AC00090930C0380930B030E943B4284E080933D |
:100AD000DF0484E190E00E94C30FEC010E940D430B |
:100AE0008091DF04882309F051CF0E947C424ECFD1 |
:100AF0001F920F920FB60F9211248F939F93EF9333 |
:100B0000FF93809103018823E1F48091D6049091B2 |
:100B1000D70401969093D7048093D604FC01E45D3A |
:100B2000F94FE081ED3019F08639910539F41092D2 |
:100B3000D7041092D60481E080930301E093C600AD |
:100B400004C01092D7041092D604FF91EF919F91A8 |
:100B50008F910F900FBE0F901F9018951F920F92BC |
:100B60000FB60F9211242F933F934F938F939F9320 |
:100B7000AF93BF93CF93DF93EF93FF938091C60022 |
:100B80008093C3044091D104463910F01092D004F0 |
:100B90008091C3048D3009F05DC08091D004823013 |
:100BA00009F058C01092D004A42FB0E0FD01E9581C |
:100BB000F84F3081ED01C858D84F28818091D40476 |
:100BC0009091D504831B9109821B91099F7090938A |
:100BD000D5048093D4049C0196E0369527959A9588 |
:100BE000E1F7235C2093D304982F9F73935C909339 |
:100BF000D2048081281729F48881981711F491E094 |
:100C000006C08091C6048F5F8093C60490E08091F7 |
:100C1000C404882309F066C0992309F463C081E005 |
:100C20008093C4044F5F4093C704A758B84F8DE02A |
:100C30008C9380917B07823509F054C088E190E065 |
:100C40002CE00FB6F894A895809360000FBE209317 |
:100C5000600048C08091D0048130D9F0813018F014 |
:100C60008230F1F521C08091C304833239F4809140 |
:100C7000C404882319F481E08093D0048091C304D4 |
:100C80008093790781E08093D1048091C30490E040 |
:100C900022C082E08093D004E42FF0E08091C3046E |
:100CA000E758F84F808309C0E42FF0E08091C30437 |
:100CB000E758F84F8083463920F44F5F4093D104C2 |
:100CC00002C01092D0042091C3048091D40490916A |
:100CD000D504820F911D9093D5048093D40402C053 |
:100CE0001092D004FF91EF91DF91CF91BF91AF911E |
:100CF0009F918F914F913F912F910F900FBE0F9029 |
:100D00001F901895DC0120E030E040E050E008C082 |
:100D1000FA01E45DF94F8081280F311D4F5F5F4F6D |
:100D20004A175B07A9F73F70C90136E0969587958A |
:100D30003A95E1F7835CFD01E45DF94F80831196FC |
:100D40002F73235CFD01E45DF94F2083A35DB94F50 |
:100D50008DE08C931092030180912C068093C60045 |
:100D600008953091C704365043E063E046C0E42F55 |
:100D7000F0E0E758F84F80814F5FE42FF0E0E7584C |
:100D8000F84F20814F5FE42FF0E0E758F84F708173 |
:100D90004F5FE42FF0E04350E758F84F50812D5358 |
:100DA000E62FF0E0922F92959F708D53880F880F59 |
:100DB000892BE758F84F8083E62FEF5F313009F138 |
:100DC000972F9D53F0E02295207F892F8695869559 |
:100DD000282BE758F84F2083E62FEE5F33503F3F34 |
:100DE00081F04C5FF0E09295990F990F907C5D53E4 |
:100DF000952BE758F84F90836D5F332309F0B7CFF9 |
:100E0000E62F8CE797E09093C9048093C804E350E1 |
:100E1000E093CA0408951F93182F8A3019F48DE0C7 |
:100E20000E940B078091C00085FFFCCF1093C60085 |
:100E300080E090E01F9108950895E1ECF0E088E1F2 |
:100E40008083A0ECB0E08C9182608C93808180687C |
:100E500080838081806480838AE28093C400809153 |
:100E60000701909108010E94C30F90935907809346 |
:100E700058078CED90E00E94C30F90937807809301 |
:100E8000770781E080935A078AE080935B0710928E |
:100E90005E0780935C0710925D071092C904109260 |
:100EA000C8041092CA040895DF92EF92FF920F9344 |
:100EB0001F93CF93DF93CDB7DEB722970FB6F89489 |
:100EC000DEBF0FBECDBF9D85AE8583E280932C062D |
:100ED0009F5990932D068C8580932E06CE010F96F8 |
:100EE0009A838983AA2341F4EE24FF2460E070E012 |
:100EF00003E010E0B0E094C0EF84F888CE014396A0 |
:100F00009A83898369897A89A150F2CFF701EB0F1F |
:100F1000F11D9081BF5F6150704011F09B0113C0C3 |
:100F2000AA2309F483C0E981FA81E080F180349634 |
:100F3000FA83E983349722813381A1502115310549 |
:100F400009F473C0B0E0F701EB0FF11D4081BF5F02 |
:100F5000B90161507040A9F4AA2311F4DD2427C01F |
:100F6000E981FA81E080F1803496FA83E98334974D |
:100F700062817381A1506115710511F4DD2416C0E1 |
:100F8000B0E0F701EB0FF11DD080BF5F6150704002 |
:100F900071F4AA2361F0E981FA81E080F18034964E |
:100FA000FA83E983349762817381A150B0E0892F7D |
:100FB00086958695835CF801E45DF94F808350E067 |
:100FC0009A0184E0369527958A95E1F7892F90E07C |
:100FD00083709070F4E0880F991FFA95E1F7282B41 |
:100FE000235CF801E35DF94F20838D2D8295869572 |
:100FF000869583704F705070440F551F440F551FD6 |
:10100000842B835CF801E25DF94F80838FE3D82263 |
:101010008DE3D80EF801E15DF94FD0820C5F1F4FD0 |
:101020006115710509F072CF04C0B0E0DD2440E025 |
:10103000BECFC8010E94820622960FB6F894DEBF8A |
:101040000FBECDBFDF91CF911F910F91FF90EF9019 |
:10105000DF90089580910301882309F4C1C1809134 |
:10106000BE048823C1F1809103018823A1F10E946D |
:1010700040158091C20424E1829FC00111248A5D41 |
:101080009C4F24E130E03F932F939F938F9381E017 |
:1010900090E09F938F9382EC94E09F938F9382E0F4 |
:1010A0008F9381E08F9388E48F930E9454078091FF |
:1010B000C2048F5F8093C2042DB73EB7255F3F4FB8 |
:1010C0000FB6F8943EBF0FBE2DBF843010F01092C3 |
:1010D000C2041092BE048091BD04882371F18091F6 |
:1010E0000301882351F10E94401580E590E09F9311 |
:1010F0008F9386E293E09F938F9321E030E03F93BC |
:101100002F9386E793E09F938F933F932F938CE0E9 |
:1011100095E09F938F9383E08F9381E08F938CE48E |
:101120008F930E9454071092BD048DB79EB70F96FF |
:101130000FB6F8949EBF0FBE8DBF8091C004882368 |
:10114000F1F0809103018823D1F08AE090E09F9331 |
:101150008F938AE597E09F938F9381E08F938F938E |
:1011600086E58F930E9454071092C0042DB73EB7B6 |
:10117000295F3F4F0FB6F8943EBF0FBE2DBF809141 |
:10118000BC048823F9F0809103018823D9F02091D1 |
:1011900006018BE090E09F938F938CE697E09F93FE |
:1011A0008F9381E08F932F9387E48F930E9454074E |
:1011B0001092BC048DB79EB707960FB6F8949EBFE9 |
:1011C0000FBE8DBF80917707909178070E94CC0F5A |
:1011D000882309F459C080910301882309F454C07D |
:1011E00060912B0570912C0580912D0590912E0515 |
:1011F0002CE630E040E050E00E94564B309365070B |
:101200002093640760913305709134058091350512 |
:10121000909136052CE630E040E050E00E94564BBD |
:101220003093670720936607809192058093680743 |
:10123000809193058093690788E090E09F938F9356 |
:1012400084E697E09F938F9381E08F9383E08F9361 |
:1012500087E78F930E9454072DB73EB7295F3F4F12 |
:101260000FB6F8943EBF0FBE2DBF80916A07853040 |
:1012700018F086E080936A0783E690E00E94C30F2F |
:1012800090937807809377078091070190910801E8 |
:10129000892B41F080915807909159070E94CC0FFB |
:1012A000882321F48091BF04882351F180910301A8 |
:1012B000882331F182E490E09F938F938FE098E050 |
:1012C0009F938F9381E08F938F9384E48F930E94F9 |
:1012D00054071092BF0480910701909108012DB727 |
:1012E0003EB7295F3F4F0FB6F8943EBF0FBE2DBFEC |
:1012F000009731F00E94C30F9093590780935807CD |
:10130000809104018F3F49F190E024E0880F991FFC |
:101310002A95E1F7875F9E4F20E130E03F932F93BE |
:101320009F938F9381E090E09F938F9384E091E06F |
:101330009F938F9382E08F9381E08F9381E48F93CB |
:101340000E9454078FEF809304018DB79EB70B96D0 |
:101350000FB6F8949EBF0FBE8DBF809151088823B1 |
:10136000F1F0809103018823D1F081E090E09F9318 |
:101370008F9381E598E09F938F9381E08F938F9374 |
:1013800082E48F930E945407109251082DB73EB704 |
:10139000295F3F4F0FB6F8943EBF0FBE2DBF80911F |
:1013A000C1048823E9F0809103018823C9F086E114 |
:1013B00090E09F938F938DE698E09F938F9381E0C9 |
:1013C0008F938F9380E58F930E9454071092C104EE |
:1013D0008DB79EB707960FB6F8949EBF0FBE8DBF10 |
:1013E00008950F931F93CF93DF93CDB7DEB7229766 |
:1013F0000FB6F894DEBF0FBECDBF8091C404882322 |
:1014000009F4E3C10E94B10680917A07823609F09F |
:101410000DC180917B07813709F448C0823730F4D1 |
:101420008B3459F0803709F001C13CC0833709F48F |
:1014300093C0843709F0FAC021C0E091C804F0914C |
:10144000C90480819181909368058093670580919C |
:101450006705909168052091690530916A05845E61 |
:101460009D4F821B930B68E671E00E94214B845BC9 |
:10147000904090936C0580936B05D8C0E091C804B0 |
:10148000F091C90480819181A281B3818093CC04C1 |
:101490009093CD04A093CE04B093CF048FEF8093AC |
:1014A0000501C4C081E08093C104C0C00091C8049C |
:1014B0001091C904F80180818F3F21F40E94B80285 |
:1014C000F8018083E091C804F091C90480818823E9 |
:1014D00011F481E003C0863010F085E08083E09154 |
:1014E000C804F091C90446E56BE978E080810E9468 |
:1014F0001E03809103018823E1F3E091C804F09179 |
:10150000C9048081898389E48A8386E590E09F937A |
:101510008F938BE998E09F938F9321E030E03F9386 |
:101520002F93CE0102969F938F933F932F93CE01DB |
:1015300001969F938F9383E08F9381E08F9381E552 |
:101540008F930E9454078DB79EB70F960FB6F894ED |
:101550009EBF0FBE8DBF6AC0E091C804F091C90460 |
:1015600080818150853008F045C08181893409F03F |
:1015700041C0ABE9B8E0329686E501900D9281500A |
:10158000E1F7E091C804F091C90446E56BE978E021 |
:1015900080810E94FB026091C60870E080E090E0CC |
:1015A00024EC39E040E050E00E94E24A6093950369 |
:1015B0007093960380939703909398036091C70864 |
:1015C00070E080E090E00E94E24A6093990370939B |
:1015D0009A0380939B0390939C03E091C804F0913D |
:1015E000C90480810E94AC020E94B80289830E94D3 |
:1015F000912801C01982809103018823E1F381E0E1 |
:1016000090E09F938F93CE0101969F938F9381E0FB |
:101610008F938F9383E58F930E945407EDB7FEB7A6 |
:1016200037960FB6F894FEBF0FBEEDBF80917B07D3 |
:10163000873609F4BFC0883680F4813609F460C06B |
:10164000823620F48B3409F0B8C039C0823609F4F0 |
:1016500064C0843609F0B1C073C08C3609F498C0F8 |
:101660008D3620F4883609F0A8C07DC0843721F07B |
:10167000863709F0A2C09AC0E091C804F091C9046D |
:1016800080819181A281B3818093CC049093CD0419 |
:10169000A093CE04B093CF04809103018823E1F39B |
:1016A000809106011F928F9384E58F930E945407C7 |
:1016B0008FEF809305010F900F900F907EC0E09107 |
:1016C000C804F091C904808191819093680580934A |
:1016D00067058091670590916805209169053091B3 |
:1016E0006A05845E9D4F821B930B68E671E00E9441 |
:1016F000214B845B904090936C0580936B055DC09B |
:10170000E091C804F091C904808180930401803283 |
:1017100098F08FE1809304010FC0ACE6B7E0E09150 |
:10172000C804F091C9048BE001900D928150E1F75B |
:1017300080917507809351088FEF809305013DC01C |
:10174000E091C804F091C90480812AE0829FC00121 |
:1017500011249093080180930701892B71F181E096 |
:101760008093BF042AC08FEF80930501E091C804E5 |
:10177000F091C904808190910D05892B80930D050E |
:10178000882311F01092C20481E08093BE0415C03A |
:101790008FEF80930501E091C804F091C904808126 |
:1017A00080930C0581E08093BD0407C081E08093A5 |
:1017B000C00403C081E08093BC041092C404109262 |
:1017C000C9041092C8041092CA0422960FB6F89465 |
:1017D000DEBF0FBECDBFDF91CF911F910F91089556 |
:1017E000982F80915208813069F480910B05E82F81 |
:1017F000F0E0EA5DFC4F90838F5F80930B0521E062 |
:1018000030E005C0892F0E940B07282F30E0C90166 |
:1018100008951F93182F04C080E30E94F00B11500D |
:101820001116D4F31F9108951F93182F04C080E25E |
:101830000E94F00B11501116D4F31F9108950F93CD |
:101840001F93CF93DF938C01EB0108C0F8010F5F6A |
:101850001F4FE4918E2F0E94F00B21972097B1F734 |
:10186000DF91CF911F910F9108950F931F93CF9305 |
:10187000DF938C01EB0106C0F80181918F010E947A |
:10188000F00B21972097C1F7DF91CF911F910F9116 |
:1018900008952F923F924F925F926F927F928F9214 |
:1018A0009F92AF92BF92CF92DF92EF92FF920F93EF |
:1018B0001F93CF93DF93CDB7DEB7E5970FB6F894BC |
:1018C000DEBF0FBECDBF2B968FAD2B9780935208F6 |
:1018D000CE01835B9F4F9B838A832D964EAC5FAC7A |
:1018E0002D971EA61FA618AA19AA9E01225D3F4F7A |
:1018F0003DAB2CAB820102C00F5F1F4FF801F4908B |
:10190000FF2019F0F5E2FF16B9F7B801641975095F |
:1019100019F0C2010E941F0CFF2009F445C22801E2 |
:101920000894411C511C1982AA81BB8133241BAA33 |
:101930002FEF2AABF2010894411C511CB490632D87 |
:1019400070E06170707035E7B31621F08B2D806206 |
:101950008837C9F46115710559F02D913D914D916C |
:101960005C9113972EA73FA748AB59AB14960BC0B9 |
:101970008D919C9111979C0140E050E02EA73FA7CC |
:1019800048AB59AB129630E2B31621F48981882313 |
:1019900089F61CC043E2B41611F458E055C08AE23F |
:1019A000B81621F09DE2B91671F408C0FD01129637 |
:1019B000E081EBABE7FFBECFE195EBABE0E13E2A88 |
:1019C000FFED3F22B7CF2BE2B21611F4B982B2CFAE |
:1019D0003EE2B31699F5F2010894411C511C849122 |
:1019E0008A3221F0B82E20E030E01DC0FD011296B1 |
:1019F0004081518157FF02C04FEF5FEF4AAB9ACF52 |
:101A0000C90153E0880F991F5A95E1F7220F331F40 |
:101A1000280F391F2B0D311D20533040F20108943F |
:101A2000411C511CB4908B2D80538A3048F3A9017E |
:101A300037FF02C04FEF5FEF4AAB85CF40E3B416EC |
:101A400029F434FC77CF50E2352A74CF8B2D8153A3 |
:101A50008930D8F420E030E0C90103E0880F991FF5 |
:101A60000A95E1F7220F331F280F391F2B0D311D67 |
:101A700020533040F2010894411C511CB4908B2D2E |
:101A800080538A3048F32BAB5ECF88E6B81619F442 |
:101A900094E0392A4FCFECE6BE1619F4F1E03F2A64 |
:101AA00049CFBB83AA8323E6B21639F41296BB83CF |
:101AB000AA8312978C918E8322C134E4B31639F035 |
:101AC00044E6B41631F059E6B516A9F502C081E036 |
:101AD000382A30FE08C01496BB83AA835E914E91CB |
:101AE0003E912E910AC01296BB83AA839E918E913D |
:101AF0009C01442737FD4095542F2EA73FA748ABA4 |
:101B000059AB8EA59FA5A8A9B9A9BB238CF42EA576 |
:101B10003FA548A959A950954095309521953F4F2B |
:101B20004F4F5F4F2EA73FA748AB59AB8DE289833C |
:101B3000BAE02B2E80C03FE4B31621F04FE6B41676 |
:101B400031F402C051E0352AA8E02A2E73C080E7A4 |
:101B5000B81689F41296BB83AA839E918E919C013C |
:101B600040E050E02EA73FA748AB59AB30E4332A02 |
:101B7000F8E7BF2E5DC043E7B416D1F51296BB83DC |
:101B8000AA83DE90CE90C114D10489F488E28E83BA |
:101B90008EE68F8385E788878CE689878A8789E246 |
:101BA0008B871C86E6E0CE2ED12CCC0EDD1E5AA9EA |
:101BB00057FD14C0452F552747FD509560E070E054 |
:101BC000C6010E94BA48009711F4FAA80EC0F82E78 |
:101BD000FC188AA98F154CF4F82E07C0F601019065 |
:101BE0000020E9F73197FE2EFC18198240E090C0E2 |
:101BF00095E5B91621F0A5E7BA1631F402C0B1E0B7 |
:101C00003B2A7AE0272E16C0E8E5BE1621F0F8E759 |
:101C1000BF1609F070C033FE0BC02EA53FA548A922 |
:101C200059A9211531054105510511F030E4332A38 |
:101C300060E1262E19824AA947FD02C05FED3522D8 |
:101C40008EA59FA5A8A9B9A90097A105B10549F43A |
:101C50009AA9992331F45EE2C52ED12CCC0EDD1E5B |
:101C600046C06EA47FA488A899A84EE2C42ED12CA9 |
:101C7000CC0EDD1EE22CFF2400E010E06EA57FA557 |
:101C800088A999A9A80197010E94344B6A3020F4D1 |
:101C900030E3A32EA60E08C027E5A22EA60EA8E5C7 |
:101CA000BA1611F4BFEDAB22F601A2926F016EA538 |
:101CB0007FA588A999A9A80197010E94344B2EA756 |
:101CC0003FA748AB59AB6E147F048006910618F00D |
:101CD00039014A01D3CFF8E02F1649F433FE07C08B |
:101CE00020E3A21621F080E3D6018E936D01FCA8BB |
:101CF000FC184AA90DC0BB2009F456C0BE82198247 |
:101D000096E0C92ED12CCC0EDD1E40E0FF24F394CA |
:101D1000E42EEF18E7FCEE248981882319F08F2D3B |
:101D20008F5F06C036FC02C08F2D02C08F2D8E5FE4 |
:101D3000A82EAE0C032D10E080E3882E912C80227B |
:101D400091228114910421F48BA98A190E94140C08 |
:101D50008981882329F061E070E0CE01019609C0F5 |
:101D600006FF09C080E38C83BD8262E070E0CE0193 |
:101D700004960E94350CB0E28B16910421F48BA9D5 |
:101D80008A190E94090C8E2D0E94090C6F2D77274D |
:101D900067FD7095C6010E94350C04FFABCD8BA981 |
:101DA0008A190E94140CA6CDE5960FB6F894DEBFF2 |
:101DB0000FBECDBFDF91CF911F910F91FF90EF909C |
:101DC000DF90CF90BF90AF909F908F907F906F905B |
:101DD0005F904F903F902F9008951F920F920FB6F3 |
:101DE0000F9211242F933F935F936F937F938F9361 |
:101DF0009F93AF93BF938091DF04882329F0809154 |
:101E0000DF0481508093DF048091E204815080934D |
:101E1000E2048F3FB9F489E08093E20480911003DB |
:101E20008F5F817080931003882319F481E0809381 |
:101E3000DA048091D8049091D90401969093D90442 |
:101E40008093D8048091DD049091DE040297B8F06D |
:101E50008091DD049091DE0401979093DE048093DD |
:101E6000DD048091DD049091DE0420910B0330911C |
:101E70000C0382239323892B09F071C006C08FEFD6 |
:101E80009FEF90930C0380930B03809100018A30A5 |
:101E900039F404C05A9A05C0479A03C05A9801C041 |
:101EA00047988091A30883FF60C0349B0AC080914B |
:101EB000DB049091DC0401969093DC048093DB04B6 |
:101EC00054C08091DB049091DC04892B69F18091EE |
:101ED000DB049091DC048A56914030F52091DB04BC |
:101EE0003091DC048091DB049091DC0469E270E0C5 |
:101EF0000E940D4B260F371F3093DC042093DB0428 |
:101F00008091DB049091DC040B9750F08091DB040E |
:101F10009091DC040A97909368058093670504C04C |
:101F20001092680510926705809167059091680589 |
:101F30002091690530916A05845E9D4F821B930B49 |
:101F400068E671E00E94214B845B904090936C05A1 |
:101F500080936B051092DC041092DB0406C0809124 |
:101F600000018A3009F098CF95CFBF91AF919F9132 |
:101F70008F917F916F915F913F912F910F900FBE45 |
:101F80000F901F9018952091D8043091D9042F5F9D |
:101F90003F4F820F931F08952091D8043091D904A8 |
:101FA000821B930B892F99278695807490E0089562 |
:101FB0001F920F920FB60F9211248F939F938091CF |
:101FC000090390910A03892B11F05F9A01C05F9871 |
:101FD00083E08093B000809170008E7F80937000CA |
:101FE0009F918F910F900FBE0F901F9018951F9289 |
:101FF0000F920FB60F921124EF92FF920F931F933F |
:102000002F933F934F935F936F937F938F939F9300 |
:10201000AF93BF93CF93DF93EF93FF938091090327 |
:1020200090910A03049709F0ACC02091AA0330E014 |
:10203000220F331F40910D0350910E03CA01880FE8 |
:10204000991F840F951F280F391F359527953595B2 |
:10205000279530930E0320930D03205D3F4F30935F |
:10206000E1042093E0048091BE0843E0849FC00116 |
:1020700011242817390740F08091BF08849FC001C0 |
:1020800011248217930720F49093E1048093E004D5 |
:102090008091CE0820912B0530912C0540912D0583 |
:1020A00050912E0580FF0FC080913305909134052B |
:1020B000A0913505B091360579018A01E81AF90A2F |
:1020C0000A0B1B0B02C079018A018091E108209163 |
:1020D000BD08C091E004D091E10480FF17C030E05A |
:1020E00040E050E0C801B7010E94E24A57E09595F0 |
:1020F0008795779567955A95D1F720E830E040E0CD |
:1021000050E00E94564BC20FD31F16C030E040E093 |
:1021100050E0C801B7010E94E24A47E095958795D3 |
:10212000779567954A95D1F720E830E040E050E098 |
:102130000E94564BC21BD30BD093E104C093E00422 |
:102140002091E0043091E10430933A08209339085B |
:10215000C9016FEF70E00E940D4B8D9740F4235B37 |
:102160003F4F3093E1042093E00483E101C080E617 |
:1021700080930F038091E00480958093B30083ECFB |
:1021800040C08091090390910A03892B39F1809115 |
:10219000090390910A03049708F52091E004309117 |
:1021A000E1042F3F310561F058F05F9A83E080939E |
:1021B000B0002F5F30403093E1042093E00423C04F |
:1021C00083E88093B00080910F038093B30081E097 |
:1021D00090E090930A038093090315C0809109034E |
:1021E00090910A03892B79F48091C00890E0880FC0 |
:1021F000991F880F991F90930A03809309035F9892 |
:1022000083E08093B0008091090390910A030197C5 |
:1022100090930A0380930903FF91EF91DF91CF918F |
:10222000BF91AF919F918F917F916F915F914F91EE |
:102230003F912F911F910F91FF90EF900F900FBE44 |
:102240000F901F9018958091D8049091D9040B9607 |
:102250009093E4048093E30482E085BD83EA84BD27 |
:1022600017BC88E788BD86E086BD83EC8093B0000C |
:1022700084E08093B100E0E7F0E0808182608083B9 |
:10228000EEE6F0E08081816080838AE08093B30095 |
:102290001092B2000895AC012091D8043091D90475 |
:1022A0002F5F3F4F03C08FEE80937A008091D80458 |
:1022B0009091D904B901681B790BCB01840F951F4C |
:1022C00080709078892F99278695882361F30895E7 |
:1022D000AC012091D8043091D9042F5F3F4F8091F9 |
:1022E000D8049091D904B901681B790BCB01840FF4 |
:1022F000951F80709078892F99278695882379F388 |
:10230000089510927C008FEE80937A0008951F92BA |
:102310000F920FB60F921124EF92FF920F931F931B |
:102320002F933F934F935F936F937F938F939F93DD |
:10233000AF93BF93EF93FF9310927A0080910705BC |
:102340008F5F809307058150853009F486C0863001 |
:1023500090F4823009F440C0833030F48823F1F0E7 |
:10236000813009F05CC22FC0833009F441C0843051 |
:1023700009F055C25AC0883009F4D5C0893038F404 |
:10238000863009F483C0873009F049C2AFC0893074 |
:1023900009F4E6C08A3009F042C2D9C180917800C0 |
:1023A00090917900909306058093050581E08093D4 |
:1023B00008058091FA049091FB0401969093FB0428 |
:1023C0008093FA0430C280917800909179009093C4 |
:1023D000040580930305A5C0809178009091790051 |
:1023E000909302058093010584E0809308051BC249 |
:1023F00040911103509112038091780090917900DF |
:102400009A01220F331F240F351F63E070E00E94F2 |
:102410000D4B260F371F3695279536952795309308 |
:1024200012032093110386E0E0CF209178003091D1 |
:1024300079008091210590912205821B930B909346 |
:1024400054088093530880915308909154089093B6 |
:10245000EC048093EB0487E0C8CF809178009091E2 |
:10246000790020911F0530912005821B930B9093DA |
:102470005F0880935E0880915E0890915F0890935A |
:10248000EE048093ED0410920805CDC18091000107 |
:102490008A3069F480917800909179002091050547 |
:1024A00030910605820F931F9695879519C040912C |
:1024B000050550910605843169F42091780030912A |
:1024C000790088279927841B950B821B930B8150D9 |
:1024D0009C4F06C08091780090917900840F951FE1 |
:1024E0009093EA048093E90481E07FCF809100011A |
:1024F00020910305309104058A3049F480917800D9 |
:1025000090917900820F931F9695879506C08091D0 |
:10251000780090917900820F931F9093E804809344 |
:10252000E70482E062CF80910001209101053091A3 |
:1025300002058A3049F48091780090917900820FE9 |
:10254000931F9695879506C08091780090917900A9 |
:10255000820F931F9093E6048093E50485E045CFB6 |
:102560006091780070917900E0902505F090260543 |
:102570000091270510912805882777FD8095982FD1 |
:102580000E94C749A80197010E94C7480E94944928 |
:102590007093F0046093EF048091EF049091F00445 |
:1025A00002970CF43EC0609125057091260580913C |
:1025B00027059091280520E030E84BE354E40E9481 |
:1025C000024A88230CF078C0609125057091260599 |
:1025D00080912705909128052AE037ED43EA5CE3D6 |
:1025E0000E94C848609325057093260580932705AF |
:1025F000909328058091A6059091A705845F91404E |
:1026000008F05AC060912505709126058091270534 |
:10261000909128052DEC3CEC4CEC5DE30E94C84801 |
:1026200043C08091EF049091F0048F5F9F4F0CF0B6 |
:1026300043C06091250570912605809127059091F2 |
:10264000280520E030E849E054E40E94064A1816C4 |
:102650009CF5609125057091260580912705909144 |
:1026600028052AE037ED43EA5CE30E94C7486093FF |
:102670002505709326058093270590932805809162 |
:10268000A6059091A705845F9140B0F4609125055F |
:102690007091260580912705909128052DEC3CEC42 |
:1026A0004CEC5DE30E94C7486093250570932605B6 |
:1026B000809327059093280581E08093F60480910C |
:1026C0007800909179009093560880935508209156 |
:1026D00063053091640540916505509166058091D0 |
:1026E000EF049091F004AA2797FDA095BA2F820FCE |
:1026F000931FA41FB51F8093630590936405A09357 |
:102700006505B0936605E0906305F090640500915F |
:10271000650510916605609163057091640580916F |
:1027200065059091660520E034E040E050E00E94AD |
:10273000564BE21AF30A040B150BE0926305F09274 |
:102740006405009365051093660583E04ECE809185 |
:102750006308909164082091780030917900820F8D |
:10276000931F909364088093630880915B088F5F48 |
:1027700080935B0880915B08853008F450C080919D |
:10278000780090917900909318038093170310922A |
:102790005B082091630830916408E0901303F09087 |
:1027A00014030091150310911603C801B701660FB9 |
:1027B000771F881F991F6E0D7F1D801F911F442753 |
:1027C00037FD4095542F620F731F841F951F24E01F |
:1027D00030E040E050E00E94564B209313033093CA |
:1027E000140340931503509316032091570830911A |
:1027F00058088091130390911403A0911503B09190 |
:102800001603281B390B309300052093FF04109208 |
:1028100064081092630830931C0820931B081092E0 |
:102820000805109207058091080580937C0080912F |
:102830000705882319F08FEE80937A00FF91EF91BE |
:10284000BF91AF919F918F917F916F915F914F91C8 |
:102850003F912F911F910F91FF90EF900F900FBE1E |
:102860000F901F9018950F931F931092FC041092D5 |
:10287000FD041092FE040CE810E0133019F40B3044 |
:1028800008F009E08091E5049091E6048C5F9340A4 |
:1028900024F48091190381500CC08091E50490913B |
:1028A000E6048750944014F411E006C080911903A7 |
:1028B0008F5F8093190310E08091E7049091E80402 |
:1028C0008C5F934024F480911A0381500AC0809158 |
:1028D000E7049091E8048750944034F080911A0303 |
:1028E0008F5F80931A0301C01F5F8091E90490916C |
:1028F000EA048C5F934024F480911B0381500AC04A |
:102900008091E9049091EA048750944034F08091DA |
:102910001B038F5F80931B0301C01F5F88E08093C0 |
:102920000E050E94721A809119038A3030F481E0FA |
:102930008093FC048AE08093190380911903863FF9 |
:1029400030F081E08093FC0485EF8093190380913F |
:102950001A038A3030F481E08093FD048AE080938A |
:102960001A0380911A03863F30F081E08093FD04C2 |
:1029700085EF80931A0380911B038A3030F481E045 |
:102980008093FE048AE080931B0380911B03863FA3 |
:1029900030F081E08093FE0485EF80931B038091EB |
:1029A0000E058823E1F710925B088FEE80937A0082 |
:1029B00080915B088823E1F30A3020F48AE090E0FC |
:1029C0000E944B11015009F058CF86E490E00E941C |
:1029D0004B111F910F9108950F931F93CF93DF9386 |
:1029E000A3E0B0E00E94A84B802DC82FD0E0C531F5 |
:1029F000D10508F02A97C7BD1092F70484E690E04D |
:102A00000E944B11809117039091180382559340B7 |
:102A1000C8F4C0E0D0E016C0C7BD82E390E00E94D9 |
:102A20004B111F930F931F920E94490C8091170323 |
:102A3000909118030F900F900F908255934038F0AB |
:102A4000219602C008EF11E0CA3FD10528F3A3E0A8 |
:102A5000B0E00C2E0E94B04BC09360088CE291E075 |
:102A60000E944B11DF91CF911F910F910895E6E2E3 |
:102A7000F3E080E2819383E0E637F807D1F7089529 |
:102A80001F934091760380910C05481710F44093F2 |
:102A90000C0580910D05282F30E0C90181709070E0 |
:102AA000582F882351F080910C05882321F0815004 |
:102AB00080930C0502C040930C05B90162707070E0 |
:102AC00021FF0AC080910C05841719F410920C059F |
:102AD00003C08F5F80930C05552321F0672B11F005 |
:102AE00010920C05E6E2F3E080E2819343E0E637E2 |
:102AF000F407D1F780910C05282F30E08A3040F49C |
:102B000081E180930B053F932F9384E195E007C00B |
:102B100080E180930B053F932F938FE095E09F9387 |
:102B20008F9381E08F930E94490C0F900F900F902C |
:102B30000F900F9010910C05153009F405C2163056 |
:102B400090F4123009F4C3C0133030F4112309F1AA |
:102B5000113009F0B8C467C0133009F414C114303F |
:102B600009F0B1C46CC1183009F496C3193038F4B7 |
:102B7000163009F416C3173009F0A5C469C31A301A |
:102B800009F40DC41A3008F4C6C31B3009F09BC405 |
:102B900048C410920B058FEF94E09F938F9311E040 |
:102BA0001F930E94490C84E180930B052091000142 |
:102BB000822F6AE00E94014B492F50E0822F0E9431 |
:102BC000014B90E021E630E03F932F932AE030E084 |
:102BD0003F932F9321E030E03F932F935F934F93E8 |
:102BE0009F938F938AEE94E09F938F931F930E94FD |
:102BF000490C88E280930B050E94B80290E09F93F5 |
:102C00008F938DED94E09F938F931F930E94490CB7 |
:102C10008CE380930B058DEC94E09F938F931F932F |
:102C20000E94490C4CC48091A30880FF33C01092CD |
:102C30000B0580910606909107069F938F938EEB6C |
:102C400094E09F938F931F930E94490C84E180939B |
:102C50000B058091FF04909100059F938F938FEA5D |
:102C600094E09F938F931F930E94490C88E2809376 |
:102C70000B058091600890E09F938F9380EA94E029 |
:102C80009F938F931F930E94490C4DB75EB7415F8E |
:102C90005F4F73C084E180930B0589E994E09F93B3 |
:102CA0008F931F930E94490C88E280930B058BE859 |
:102CB00094E09F938F931F930E94490C8DB79EB70A |
:102CC00006960FB6F8949EBF0FBE8DBF01C410923A |
:102CD0000B0581E894E09F938F9311E01F930E946E |
:102CE000490C84E180930B0560912B0570912C05B4 |
:102CF00080912D0590912E0520E034E040E050E0D9 |
:102D00000E94564B5F934F933F932F9382E794E03B |
:102D10009F938F931F930E94490C88E280930B0529 |
:102D20006091330570913405809135059091360599 |
:102D300020E034E040E050E00E94564B5F934F9318 |
:102D40003F932F9383E694E09F938F931F930E946A |
:102D5000490C8CE380930B05809167059091680581 |
:102D60009F938F9384E594E09F938F931F930E948A |
:102D7000490C4DB75EB74A5E5F4F0FB6F8945EBF21 |
:102D80000FBE4DBFA5C310920B05809171089091A5 |
:102D9000720820916F08309170089F938F933F9332 |
:102DA0002F9384E494E09F938F9311E01F930E94EC |
:102DB000490C84E180930B05809175089091760809 |
:102DC00020917308309174089F938F933F932F93B2 |
:102DD00084E394E09F938F931F930E94490C88E2B1 |
:102DE00080930B058091790890917A08209177085B |
:102DF000309178089F938F933F932F9384E294E0D0 |
:102E00009F938F931F930E94490C8CE380930B0533 |
:102E100080917D0890917E0820917B0830917C08FC |
:102E20009F938F933F932F9384E194E09F938F938D |
:102E30001F930E94490C8DB79EB74C9642CF1092BB |
:102E40000B05E0919C08F0E0EE0FFF1FE359F74FF0 |
:102E500020813181E0919B08F0E0EE0FFF1FE359E4 |
:102E6000F74F808191813F932F939F938F9384E0BD |
:102E700094E09F938F9311E01F930E94490C84E18B |
:102E800080930B05E0919E08F0E0EE0FFF1FE359E1 |
:102E9000F74F20813181E0919D08F0E0EE0FFF1F98 |
:102EA000E359F74F808191813F932F939F938F93A5 |
:102EB00084EF93E09F938F931F930E94490C88E2C5 |
:102EC00080930B05E091A008F0E0EE0FFF1FE3599F |
:102ED000F74F20813181E0919F08F0E0EE0FFF1F56 |
:102EE000E359F74F808191813F932F939F938F9365 |
:102EF00084EE93E09F938F931F930E94490C8CE381 |
:102F000080930B05E091A208F0E0EE0FFF1FE3595C |
:102F1000F74F20813181E091A108F0E0EE0FFF1F13 |
:102F2000E359F74F808191813F932F939F938F9324 |
:102F300084ED93E09F938F931F930E94490C4DB7AC |
:102F40005EB7445E5F4F19CF10920B0586EC93E09D |
:102F50009F938F9311E01F930E94490C8091000171 |
:102F60000F900F900F908A3009F04DC084E180934C |
:102F70000B0520911505309116058091E50490917F |
:102F8000E604821B930B3F932F939F938F9387EBC2 |
:102F900093E09F938F931F930E94490C88E2809344 |
:102FA0000B0520911705309118058091E704909149 |
:102FB000E804821B930B3F932F939F938F9388EA90 |
:102FC00093E09F938F931F930E94490C8CE380930F |
:102FD0000B052091190530911A058091E904909113 |
:102FE000EA04A901481B590B3F932F935F934F931A |
:102FF00089E993E09F938F931F930E94490C8DB7AB |
:103000009EB745965ECE8B3019F0843109F05CC0D6 |
:1030100084E180930B052091150530911605C901B7 |
:1030200062E070E00E94214B8091E5049091E604FB |
:10303000821B930B7F936F939F938F938AE893E008 |
:103040009F938F931F930E94490C88E280930B05F6 |
:103050002091170530911805C90162E070E00E94C7 |
:10306000214B8091E7049091E804821B930B7F939E |
:103070006F939F938F938BE793E09F938F931F930F |
:103080000E94490C8CE380930B0520911905309127 |
:103090001A05C90162E070E00E94214B8091E904A9 |
:1030A0009091EA04281B390B7F936F933F932F93E2 |
:1030B0008CE693E09F938F931F930E94490C4DB72A |
:1030C0005EB74B5E5F4F59CE8D3009F001C284E18F |
:1030D00080930B052091190330E0E0911505F091E4 |
:1030E0001605CF0162E070E00E94214B8091E5045B |
:1030F0009091E6048E1B9F0B3F932F937F936F93CA |
:103100009F938F9388E593E09F938F931F930E94E3 |
:10311000490C88E280930B0520911A0330E0E0917E |
:103120001705F0911805CF0162E070E00E94214B75 |
:103130008091E7049091E8048E1B9F0B3F932F939F |
:103140007F936F939F938F9384E493E09F938F93E8 |
:103150001F930E94490C8CE380930B05E0911B03A5 |
:10316000F0E02091190530911A05C90162E070E084 |
:103170000E94214B8091E9049091EA04281B390BAD |
:10318000FF93EF937F936F933F932F9380E393E0AD |
:103190009F938F931F930E94490C8DB79EB74B96B8 |
:1031A00090CD10920B0583E293E09F938F9311E0F3 |
:1031B0001F930E94490C84E180930B0580911F05A9 |
:1031C000909120052091ED043091EE049F938F9310 |
:1031D0003F932F9384E193E09F938F931F930E94DB |
:1031E000490C88E280930B0580912105909122057E |
:1031F0002091EB043091EC049F938F933F932F9396 |
:1032000085E093E09F938F931F930E94490C8CE37A |
:1032100080930B0560912505709126058091270507 |
:10322000909128050E9494492091090930910A093A |
:103230007F936F933F932F9386EF92E09F938F93AB |
:103240001F930E94490C4DB75EB7485E5F4F95CD06 |
:1032500084E180930B0580911103909112039F9359 |
:103260008F9387EE92E09F938F9311E01F930E94BC |
:10327000490C88E280930B0580917A0590E09F933A |
:103280008F9388ED92E09F938F931F930E94490C38 |
:103290008DB79EB70A9615CD10920B0589EC92E07A |
:1032A0009F938F9311E01F930E94490C84E18093B8 |
:1032B0000B0580916B0590916C059F938F938AEB22 |
:1032C00092E09F938F931F930E94490C88E2809312 |
:1032D0000B0580916705909168059F938F938BEA0A |
:1032E00092E09F938F931F930E94490C8CE38093ED |
:1032F0000B058091690590916A059F938F938CE9E6 |
:1033000092E09F938F931F930E94490C4DB75EB735 |
:103310004E5E5F4F32CD10920B05809172059091F9 |
:1033200073059F938F9380E992E09F938F9311E0B1 |
:103330001F930E94490C84E180930B0580917405D2 |
:10334000909175059F938F9384E892E09F938F935C |
:103350001F930E94490C88E280930B0580917605AB |
:10336000909177059F938F9388E792E09F938F9337 |
:103370001F930E94490C8CE380930B058091780584 |
:10338000909179059F938F938CE692E09F938F9312 |
:103390001F930E94490C8DB79EB7449692CC109211 |
:1033A0000B0584E692E09F938F9311E01F930E9498 |
:1033B000490C84E180930B058091AA0390E09F93D0 |
:1033C0008F9386E592E09F938F931F930E94490C01 |
:1033D00088E280930B058091E0049091E1049F9333 |
:1033E0008F9388E492E09F938F931F930E94490CE0 |
:1033F0008CE380930B052091BF0830E08091BE08DC |
:1034000090E03F932F939F938F938AE392E09F9353 |
:103410008F931F930E94490C4DB75EB74C5E5F4F70 |
:10342000ACCC10920B058AE292E09F938F9311E04F |
:103430001F930E94490C84E180930B052091700733 |
:10344000332727FD309580916F07992787FD909549 |
:103450003F932F939F938F938AE192E09F938F9353 |
:103460001F930E94490C88E280930B0520917107FD |
:10347000332727FD30958091720790E03F932F937B |
:103480009F938F938AE092E09F938F931F930E9464 |
:10349000490C8CE380930B052091760730E08091F6 |
:1034A0007307992787FD90953F932F939F938F9351 |
:1034B0008AEF91E09F938F931F930E94490C8DB7E1 |
:1034C0009EB74896FECB11501093760310920C05D0 |
:1034D00010920D051F9108951092B9008AE2809311 |
:1034E000B800089585EA8093BC0080E090E00895DC |
:1034F00084E98093BC0008951092B9008093BB00CA |
:1035000085E88093BC0080E090E008951F920F92C0 |
:103510000FB60F9211248F939F93EF93FF93809197 |
:103520000E058F5F80930E058150E82FF0E0E731A4 |
:10353000F10508F091C0E85CFF4FEE0FFF1F05900A |
:10354000F491E02D099480910F05880F8E5A0CC0DC |
:1035500080910F058F5F80930F05815029C08330C4 |
:1035600009F07AC0809121091092B9008093BB00C4 |
:1035700085E88093BC0070C084E98093BC00809192 |
:103580000F05843018F410920E054AC010920F05F2 |
:1035900047C080911005880F8D5AE6CF8091BB00FF |
:1035A000E0911005F0E0EB59F74F80838091100512 |
:1035B000813041F0813018F0823039F0D0CF8091E5 |
:1035C000F608D2CF8091FF08CFCF80911E09CCCFD3 |
:1035D000809110059091BB00E82FF0E0EB59F74F78 |
:1035E00094838F5F80931005843058F110921005FA |
:1035F00028C01092B90080E1B9CF80911903B4CFEF |
:103600001092B90082E1B2CF80911A03ADCF84E964 |
:103610008093BC008AE090E09093920380939103A2 |
:1036200085EAA7CF1092B90088E9A0CF1092B9001F |
:1036300084E19CCF80911B0397CF1092B90080E862 |
:1036400095CF84E98093BC008AE090E09093920348 |
:103650008093910310920E058091BC008068809346 |
:10366000BC00FF91EF919F918F910F900FBE0F9033 |
:103670001F9018954CEB50E084E9DA018C9310927E |
:103680000E052BEB30E0F901808110920F0580E8E8 |
:103690008C931092BD001092BA001082E9EBF0E01A |
:1036A0001082A8EBB0E01C9210828AE28C9385EA2B |
:1036B000DA018C931082F901108285E88C930895C9 |
:1036C00083EC80938100EFE6F0E08081806280836C |
:1036D00010921A05109219051092180510921705EC |
:1036E000109216051092150508951F920F920FB6AD |
:1036F0000F9211240F931F932F933F934F935F9338 |
:103700006F937F938F939F93AF93BF93CF93DF93E9 |
:10371000EF93FF93209186003091870080911305ED |
:1037200090911405281B390B809186009091870099 |
:103730009093140580931305C9018D549440009112 |
:10374000110510911205835F9A4160F40430110550 |
:1037500014F01092770381E090E09093120580932B |
:1037600011058AC00A3011050CF086C0C9018B5FB3 |
:103770009040845B914008F068C0E901C25DD1408F |
:10378000F801EE0FFF1FE359F74F808191819E01F1 |
:10379000281B390BC90137FF03C0909581959F4FB6 |
:1037A00006974CF480917A05883C28F480917A053C |
:1037B000865F80937A05F801EE0FFF1FE359F74FFC |
:1037C00020813181C901880F991F820F931F8C0FAF |
:1037D0009D1F64E070E00E94214B9B01CE01019689 |
:1037E000861797071CF42150304006C021976C17AC |
:1037F0007D0714F42F5F3F4F80917A05E801CC0FCD |
:10380000DD1F833CB8F0FE01E359F74F80819181C1 |
:10381000A901481B590BCA0163E070E00E94214BCB |
:10382000CB01880F991F860F971FCD57D74F9983CC |
:10383000888304C0CD57D74F19821882F801EE0F44 |
:10384000FF1FE359F74F31832083F8013196F0933E |
:103850001205E0931105E530F10511F45D9A06C0FB |
:103860005D98E630F10511F45C9A05C05C983797D5 |
:1038700011F45B9A01C05B98FF91EF91DF91CF91BA |
:10388000BF91AF919F918F917F916F915F914F9178 |
:103890003F912F911F910F910F900FBE0F901F908E |
:1038A000189581E080939B0882E080939C0883E0D8 |
:1038B00080939D0884E080939E0885E080939F0814 |
:1038C00086E08093A00887E08093A10888E0809339 |
:1038D000A20808952F923F924F925F926F927F922B |
:1038E0008F929F92AF92BF92CF92DF92EF92FF9210 |
:1038F0000F931F93CF93DF93CDB7DEB726970FB605 |
:10390000F894DEBF0FBECDBF2091E9043091EA04E8 |
:103910008091190590911A05821B930B90932B09A6 |
:1039200080932A092091E9043091EA0480911809D2 |
:1039300090911909821B930B90939A088093990890 |
:103940008091E7049091E8042091170530911805C3 |
:10395000821B930B9093F5088093F4088091E50403 |
:103960009091E6042091150530911605821B930B6A |
:1039700090930109809300096091ED047091EE0429 |
:10398000882777FD8095982F2CE030E040E050E0CC |
:103990000E94E24A9B01AC016091250970912609C1 |
:1039A000882777FD8095982F620F731F841F951FBE |
:1039B00022E030E040E050E00E94564B3093260970 |
:1039C000209325096091EB047091EC04882777FD22 |
:1039D0008095982F2CE030E040E050E00E94E24AD1 |
:1039E0009B01AC016091380970913909882777FDF6 |
:1039F0008095982F620F731F841F951F22E030E07F |
:103A000040E050E00E94564B30933909209338092A |
:103A10006091EF047091F004882777FD8095982FCE |
:103A20002091090930910A09442737FD4095542F08 |
:103A3000620F731F841F951F22E030E040E050E0CA |
:103A40000E94564B30930A09209309092091ED04F6 |
:103A50003091EE04C901880F991F820F931F880FC0 |
:103A6000991F880F991FAA2797FDA095BA2F20911B |
:103A70003B0530913C0540913D0550913E05280F96 |
:103A8000391F4A1F5B1F20933B0530933C05409331 |
:103A90003D0550933E052091EB043091EC04C901A3 |
:103AA000880F991F820F931F880F991F880F991FE6 |
:103AB000AA2797FDA095BA2F20913F053091400588 |
:103AC0004091410550914205280F391F4A1F5B1F45 |
:103AD00020933F05309340054093410550934205A4 |
:103AE0002091ED043091EE0480911109909112091A |
:103AF000820F931F90931209809311092091EB0478 |
:103B00003091EC0480912D0990912E09820F931F22 |
:103B100090932E0980932D0980912305909124057F |
:103B200001969093240580932305E0905508F0902A |
:103B30005608A0902505B0902605C0902705D09086 |
:103B40002805609143057091440580914505909149 |
:103B500046050E94C7493B014C010027F7FC009530 |
:103B6000102FC801B7010E94C749A60195010E9404 |
:103B7000C7489B01AC01C401B3010E94C8480E9420 |
:103B80009449609343057093440580934505909351 |
:103B9000460580912A0990912B099C01442737FD05 |
:103BA0004095542F8091340990913509A0913609A0 |
:103BB000B0913709280F391F4A1F5B1F2093340922 |
:103BC00030933509409336095093370980912A097B |
:103BD00090912B093C01882477FC8094982C80914B |
:103BE0005B0590915C05A0915D05B0915E05680E46 |
:103BF000791E8A1E9B1E60925B0570925C05809206 |
:103C00005D0590925E05283787E1380787E0480711 |
:103C100080E0580764F028573741474050402093D0 |
:103C20003409309335094093360950933709809110 |
:103C3000340990913509A0913609B0913709B7FF41 |
:103C40000CC08858984EA84FBF4F8093340990936A |
:103C50003509A0933609B0933709E0918C05EE83BE |
:103C6000EE2309F08AC080918D05882309F085C074 |
:103C70008091A30886FF81C06091990870919A088D |
:103C8000E0909A05FF2400E010E0882777FD8095FA |
:103C9000982F20914B0530914C0540914D05509146 |
:103CA0004E050E94E24A20E038E040E050E00E94E9 |
:103CB000564BCA01B901A80197010E94E24A20E0CF |
:103CC00030E140E050E00E94564B59016A012093D8 |
:103CD000EE053093EF054093F0055093F1056091A8 |
:103CE000990870919A08882777FD8095982F2091E0 |
:103CF00053053091540540915505509156050E9449 |
:103D0000E24A20E038E040E050E00E94564BCA0111 |
:103D1000B901A80197010E94E24A20E030E140E0A9 |
:103D200050E00E94564B2093EA053093EB054093F8 |
:103D3000EC055093ED05D601C501D7FE07C0B0953F |
:103D4000A095909581959F4FAF4FBF4F81389105BA |
:103D5000A105B10574F457FF07C050954095309503 |
:103D600021953F4F4F4F5F4F213831054105510598 |
:103D7000A4F081E080936F0510C01092EA051092C4 |
:103D8000EB051092EC051092ED051092EE051092E5 |
:103D9000EF051092F0051092F1058091F4089091D2 |
:103DA000F5082091EE053091EF054091F005509116 |
:103DB000F1052A833B834C835D83820F931F90938D |
:103DC000F5088093F4080091F4081091F508A0908C |
:103DD000EA05B090EB05C090EC05D090ED05809120 |
:103DE0009B05282E332444245524C201B101A60189 |
:103DF00095010E94E24A20E032E040E050E00E945B |
:103E0000564B020F131F1093F5080093F4082091EE |
:103E1000F4083091F508442737FD4095542F8091E0 |
:103E2000570590915805A0915905B0915A05820FF8 |
:103E3000931FA41FB51F8093570590935805A09317 |
:103E40005905B0935A058091F4089091F508209196 |
:103E5000880530918905821B930BAA2797FDA095B1 |
:103E6000BA2F20915305309154054091550550913A |
:103E70005605820F931FA41FB51F8093530590937F |
:103E80005405A0935505B0935605E0909903F09022 |
:103E90009A0300919B0310919C03E816F9060A0708 |
:103EA0001B07C4F488EA91E6A0E0B0E08E199F09F0 |
:103EB000A00BB10B8093530590935405A093550527 |
:103EC000B09356058093570590935805A0935905D4 |
:103ED000B0935A0522273327A9012E193F09400B19 |
:103EE000510B8091530590915405A0915505B091C7 |
:103EF000560582179307A407B507B4F4D801C70184 |
:103F0000885A9146A040B040809353059093540541 |
:103F1000A0935505B0935605809357059093580587 |
:103F2000A0935905B0935A058091E7049091E80455 |
:103F30000F9734F488E19CEF9093F5088093F40890 |
:103F40008091E7049091E804079734F480E398EFB8 |
:103F50009093F5088093F4083091000139833A304A |
:103F6000A9F48091E7049091E804835F934034F0D2 |
:103F700088EE93E09093F5088093F4088091E7042D |
:103F80009091E8048A5F9340DCF014C08091E704CC |
:103F90009091E804855E974034F088EE93E090932A |
:103FA000F5088093F4088091E7049091E804835F1A |
:103FB000974034F080ED97E09093F5088093F408F3 |
:103FC00080910009909101098A199B099093010938 |
:103FD000809300090091000910910109C201B1010B |
:103FE0002A813B814C815D810E94E24A20E032E0DF |
:103FF00040E050E00E94564B021B130B1093010946 |
:10400000009300092091000930910109442737FDF0 |
:104010004095542F80914F0590915005A0915105E6 |
:10402000B0915205820F931FA41FB51F80934F05B7 |
:1040300090935005A0935105B093520580910009CB |
:104040009091010920918A0530918B05821B930B79 |
:10405000AA2797FDA095BA2F20914B0530914C05CA |
:1040600040914D0550914E05820F931FA41FB51F1F |
:1040700080934B0590934C05A0934D05B0934E054E |
:10408000E0909503F09096030091970310919803A8 |
:10409000E816F9060A071B07C4F488EA91E6A0E0CF |
:1040A000B0E08E199F09A00BB10B80934B05909344 |
:1040B0004C05A0934D05B0934E0580934F0590930A |
:1040C0005005A0935105B093520522273327A9012B |
:1040D0002E193F09400B510B80914B0590914C05D7 |
:1040E000A0914D05B0914E0582179307A407B5071F |
:1040F000B4F4D801C701885A9146A040B0408093DB |
:104100004B0590934C05A0934D05B0934E058093BD |
:104110004F0590935005A0935105B093520580919F |
:10412000E5049091E6040F9734F488E19CEF9093B6 |
:104130000109809300098091E5049091E6040797B6 |
:1041400034F480E398EF909301098093000929816A |
:104150002A30A9F48091E5049091E604835F9340AE |
:1041600034F088EE93E090930109809300098091E8 |
:10417000E5049091E6048A5F9340DCF014C08091DE |
:10418000E5049091E604855E974034F088EE93E074 |
:1041900090930109809300098091E5049091E604D1 |
:1041A000835F974034F080ED97E09093010980930E |
:1041B00000098FEE80937A0060924705709248055F |
:1041C0008092490590924A0580914B0590914C054B |
:1041D000A0914D05B0914E0580932B0590932C0531 |
:1041E000A0932D05B0932E05809153059091540511 |
:1041F000A0915505B09156058093330590933405F1 |
:10420000A0933505B093360580914F0590915005E8 |
:10421000A0915105B091520580932F0590933005E0 |
:10422000A0933105B09332058091570590915805C0 |
:10423000A0915905B0915A058093370590933805A0 |
:10424000A0933905B0933A058091A30887FF63C016 |
:10425000FE81FF2309F05FC080918D05882309F05E |
:104260005AC08091000990910109893C91055CF048 |
:104270002091000930910109809100099091010974 |
:104280002052334011C08091000990910109885358 |
:104290009F4FA4F4209100093091010980910009F9 |
:1042A00090910109205E3C4F880F991F880F991F3C |
:1042B000280F391F30930109209300098091F408D9 |
:1042C0009091F508893C91055CF02091F4083091BB |
:1042D000F5088091F4089091F5082052334011C000 |
:1042E0008091F4089091F50888539F4FA4F4209191 |
:1042F000F4083091F5088091F4089091F508205E5B |
:104300003C4F880F991F880F991F280F391F309332 |
:10431000F5082093F408209172053091730580917F |
:104320009F08E82FF0E0EE0FFF1FE359F74F808161 |
:10433000918182599F4F281739071CF42F5F3F4FF7 |
:104340000CC08081918182599F4F821793074CF452 |
:104350002115310531F02150304030937305209301 |
:10436000720520917405309175058091A008E82FA1 |
:10437000F0E0EE0FFF1FE359F74F808191818259E2 |
:104380009F4F281739071CF42F5F3F4F0CC08081C7 |
:10439000918182599F4F821793074CF42115310563 |
:1043A00031F02150304030937505209374052091F1 |
:1043B0007605309177058091A108E82FF0E0EE0FA7 |
:1043C000FF1FE359F74F8081918182599F4F281732 |
:1043D00039071CF42F5F3F4F0CC0808191818259B7 |
:1043E0009F4F821793074CF42115310531F021506E |
:1043F00030403093770520937605209178053091F1 |
:1044000079058091A208E82FF0E0EE0FFF1FE35935 |
:10441000F74F8081918182599F4F281739071CF4EB |
:104420002F5F3F4F0CC08081918182599F4F82172F |
:1044300093074CF42115310531F021503040309371 |
:10444000790520937805809172059091730597FF07 |
:1044500005C010927305109272050AC08F3F910536 |
:1044600039F034F08FEF90E09093730580937205EC |
:10447000809174059091750597FF05C010927505A0 |
:10448000109274050AC08F3F910539F034F08FEF18 |
:1044900090E09093750580937405809176059091D6 |
:1044A000770597FF05C010927705109276050AC030 |
:1044B0008F3F910539F034F08FEF90E090937705BE |
:1044C00080937605809178059091790597FF05C0D6 |
:1044D00010927905109278050AC08F3F910539F046 |
:1044E00034F08FEF90E090937905809378052696CD |
:1044F0000FB6F894DEBF0FBECDBFDF91CF911F91F5 |
:104500000F91FF90EF90DF90CF90BF90AF909F9072 |
:104510008F907F906F905F904F903F902F90089575 |
:104520008091A6088B3F98F08B3F19F4809172051B |
:104530000EC08C3F19F48091740509C08D3F19F4A9 |
:104540008091760504C08E3F21F480917805809398 |
:10455000A2038091A5088B3F98F08B3F19F48091BE |
:1045600072050EC08C3F19F48091740509C08D3F0F |
:1045700019F48091760504C08E3F21F4809178056E |
:104580008093A1038091A103882319F41092A103C1 |
:1045900005C0843618F084E68093A1038091A708B3 |
:1045A0008B3F98F08B3F19F4809172050EC08C3FC1 |
:1045B00019F48091740509C08D3F19F48091760536 |
:1045C00004C08E3F21F4809178058093A3038091ED |
:1045D000A303882319F41092A30305C0843618F0AE |
:1045E00084E68093A3038091A9088B3F98F08B3FCA |
:1045F00019F4809172050EC08C3F19F480917405F6 |
:1046000009C08D3F19F48091760504C08E3F21F4D6 |
:10461000809178058093A4038091B0088B3F98F037 |
:104620008B3F19F4809172050EC08C3F19F4809174 |
:10463000740509C08D3F19F48091760504C08E3F42 |
:1046400021F4809178058093A5038091B1088B3F78 |
:1046500098F08B3F19F4809172050EC08C3F19F4CD |
:104660008091740509C08D3F19F48091760504C0CE |
:104670008E3F21F4809178058093A6038091A60354 |
:104680008B3010F48AE002C08F3F11F48093A603B0 |
:104690008091B2088B3F98F08B3F19F4809172059E |
:1046A0000EC08C3F19F48091740509C08D3F19F438 |
:1046B0008091760504C08E3F21F480917805809327 |
:1046C000A7038091B7088B3F98F08B3F19F4809136 |
:1046D00072050EC08C3F19F48091740509C08D3F9E |
:1046E00019F48091760504C08E3F21F480917805FD |
:1046F0008093A9038091B8088B3F98F08B3F19F401 |
:10470000809172050EC08C3F19F48091740509C028 |
:104710008D3F19F48091760504C08E3F21F480917D |
:104720007805809392058091B9088B3F98F08B3F74 |
:1047300019F4809172050EC08C3F19F480917405B4 |
:1047400009C08D3F19F48091760504C08E3F21F495 |
:1047500080917805809393058091BA088B3F98F0FB |
:104760008B3F19F4809172050EC08C3F19F4809133 |
:10477000740509C08D3F19F48091760504C08E3F01 |
:1047800021F480917805809394058091BB088B3F3C |
:1047900098F08B3F19F4809172050EC08C3F19F48C |
:1047A0008091740509C08D3F19F48091760504C08D |
:1047B0008E3F21F480917805809395058091CB08F8 |
:1047C0008B3F98F08B3F19F4809172050EC08C3F9F |
:1047D00019F48091740509C08D3F19F48091760514 |
:1047E00004C08E3F21F480917805809396058091D6 |
:1047F000CC088B3F98F08B3F19F4809172050EC066 |
:104800008C3F19F48091740509C08D3F19F4809193 |
:10481000760504C08E3F21F480917805809397053A |
:104820008091CD088B3F98F08B3F19F480917205F1 |
:104830000EC08C3F19F48091740509C08D3F19F4A6 |
:104840008091760504C08E3F21F480917805809395 |
:1048500098058091CE088B3F98F08B3F19F480919A |
:1048600072050EC08C3F19F48091740509C08D3F0C |
:1048700019F48091760504C08E3F21F4809178056B |
:10488000809399058091BC088B3F98F08B3F19F479 |
:10489000809172050EC08C3F19F48091740509C097 |
:1048A0008D3F19F48091760504C08E3F21F48091EC |
:1048B00078058093AA038091C1088B3F98F08B3FC5 |
:1048C00019F4809172050EC08C3F19F48091740523 |
:1048D00009C08D3F19F48091760504C08E3F21F404 |
:1048E000809178058093AB038091C4088B3F98F04A |
:1048F0008B3F19F4809172050EC08C3F19F48091A2 |
:10490000740509C08D3F19F48091760504C08E3F6F |
:1049100021F48091780580939A058091C5088B3F9A |
:1049200098F08B3F19F4809172050EC08C3F19F4FA |
:104930008091740509C08D3F19F48091760504C0FB |
:104940008E3F21F48091780580939B058091CA0861 |
:104950008B3F98F08B3F19F4809172050EC08C3F0D |
:1049600019F48091740509C08D3F19F48091760582 |
:1049700004C08E3F21F4809178058093AC03809130 |
:10498000D0088B3F98F08B3F19F4809172050EC0D0 |
:104990008C3F19F48091740509C08D3F19F4809102 |
:1049A000760504C08E3F21F4809178058093130929 |
:1049B00080911309823010F481E002C08F3F11F41E |
:1049C000809313098091D2088B3F98F08B3F19F4A4 |
:1049D000809172050EC08C3F19F48091740509C056 |
:1049E0008D3F19F48091760504C08E3F21F48091AB |
:1049F00078058093280980912809823010F481E09D |
:104A000002C08F3F11F4809328098091DF088B3F0B |
:104A100098F08B3F19F4809172050EC08C3F19F409 |
:104A20008091740509C08D3F19F48091760504C00A |
:104A30008E3F21F48091780580933B096091A90312 |
:104A400070E080E090E00E941A4727E137EB41EDEB |
:104A500058E30E947F4A60939D0370939E03809366 |
:104A60009F039093A0038091AE08809329098091C1 |
:104A7000AD088093030908958091F60890E0909323 |
:104A80002A08809329088091FF0890E090932C08D1 |
:104A900080932B088091210990E090932E088093B9 |
:104AA0002D0880911E0990E09093300880932F0884 |
:104AB00080918305882321F08091CD0880FD24C05A |
:104AC0001092FF081092F60810921E091092210908 |
:104AD0008091CC04882311F08093F6088091CD0456 |
:104AE000882311F08093FF088091CE04882311F071 |
:104AF000809321098091CF04882311F080931E09AF |
:104B00008091A8058C7F03C08091A8058160809367 |
:104B1000A80510920E0510920F050E94721A0895B2 |
:104B2000809100018D3011F40E94331410927A00AC |
:104B30008091E5049091E604909301098093000927 |
:104B40008091E7049091E8049093F5088093F4082D |
:104B50008091E9049091EA0490932B0980932A09AB |
:104B60006091ED047091EE04882777FD8095982F71 |
:104B70002CE030E040E050E00E94E24A70932609C9 |
:104B8000609325096091EB047091EC04882777FD10 |
:104B90008095982F0E94E24A7093390960933809F2 |
:104BA0008091EF049091F00490930A098093090991 |
:104BB0008FEE80937A002091720530917305809179 |
:104BC0009F08E82FF0E0EE0FFF1FE359F74F8081B9 |
:104BD000918182599F4F281739071CF42F5F3F4F4F |
:104BE0000CC08081918182599F4F821793074CF4AA |
:104BF0002115310531F02150304030937305209359 |
:104C0000720520917405309175058091A008E82FF8 |
:104C1000F0E0EE0FFF1FE359F74F80819181825939 |
:104C20009F4F281739071CF42F5F3F4F0CC080811E |
:104C3000918182599F4F821793074CF421153105BA |
:104C400031F0215030403093750520937405209148 |
:104C50007605309177058091A108E82FF0E0EE0FFE |
:104C6000FF1FE359F74F8081918182599F4F281789 |
:104C700039071CF42F5F3F4F0CC08081918182590E |
:104C80009F4F821793074CF42115310531F02150C5 |
:104C90003040309377052093760520917805309148 |
:104CA00079058091A208E82FF0E0EE0FFF1FE3598D |
:104CB000F74F8081918182599F4F281739071CF443 |
:104CC0002F5F3F4F0CC08081918182599F4F821787 |
:104CD00093074CF42115310531F0215030403093C9 |
:104CE000790520937805809172059091730597FF5F |
:104CF00005C010927305109272050AC08F3F91058E |
:104D000039F034F08FEF90E0909373058093720543 |
:104D1000809174059091750597FF05C010927505F7 |
:104D2000109274050AC08F3F910539F034F08FEF6F |
:104D300090E090937505809374058091760590912D |
:104D4000770597FF05C010927705109276050AC087 |
:104D50008F3F910539F034F08FEF90E09093770515 |
:104D600080937605809178059091790597FF05C02D |
:104D700010927905109278050AC08F3F910539F09D |
:104D800034F08FEF90E090937905809378056091EF |
:104D9000C60870E080E090E024EC39E040E050E0AC |
:104DA0000E94E24A60939503709396038093970361 |
:104DB000909398036091C70870E080E090E00E94B3 |
:104DC000E24A6093990370939A0380939B039093B4 |
:104DD0009C0308951092200510921F051092220541 |
:104DE0001092210580E090E0A0E0B0E080932505DE |
:104DF00090932605A0932705B093280510921605D9 |
:104E000010921505109218051092170510921A05A8 |
:104E100010921905109219091092180910929A050A |
:104E200010929B051092F7040E94902584E690E072 |
:104E30000E944B110E9490258091A30880FF10C012 |
:104E40008091170390911803875B934038F4809109 |
:104E50001703909118038E5E924010F40E94EC1498 |
:104E60004091E5045091E6045093160540931505D2 |
:104E70002091E7043091E80430931805209317053A |
:104E80008091E9049091EA0490931A0580931905A2 |
:104E90008091E9049091EA0490931909809318098C |
:104EA00030931C0520931B0550931E0540931D0550 |
:104EB00044E050E0DA010E94A84B802D853038F1A3 |
:104EC000809138099091390997FF03C09095819599 |
:104ED0009F4F6CE070E00E94214B7093220560931D |
:104EE0002105809125099091260997FF03C090958F |
:104EF00081959F4F6CE070E00E94214B70932005DC |
:104F000060931F05609155087091560839C0DA0109 |
:104F10000E94A84B802D4F5F5F4FDA010E94A84B83 |
:104F2000202D90E0982F8827820F911D90932005C7 |
:104F300080931F054F5F5F4FDA010E94A84B802DC1 |
:104F40004F5F5F4FDA010E94A84B202D90E0982F11 |
:104F50008827820F911D90932205809321054F5F32 |
:104F60005F4FDA010E94A84B602D4F5F5F4FDA015F |
:104F70000E94A84B202D70E0762F6627620F711DCE |
:104F8000882777FD8095982F0E94C7496093250553 |
:104F900070932605809327059093280510924B0562 |
:104FA00010924C0510924D0510924E0510924F052F |
:104FB000109250051092510510925205109253050F |
:104FC00010925405109255051092560510925705EF |
:104FD000109258051092590510925A0510925B05CF |
:104FE00010925C0510925D0510925E051092010909 |
:104FF000109200091092F5081092F40810922B09F3 |
:1050000010922A0984E690E00E944B1180911303CC |
:1050100090911403A0911503B09116039093580832 |
:10502000809357081092F9041092F80410926305C7 |
:1050300010926405109265051092660580916705CF |
:105040009091680590936A05809369050E94F046E7 |
:1050500082E390E09093DE048093DD046091C608C3 |
:1050600070E080E090E024EC39E040E050E00E9405 |
:10507000E24A6856754C8F4F9F4F6093950370932B |
:10508000960380939703909398036091C70870E00C |
:1050900080E090E00E94E24A6856754C8F4F9F4F27 |
:1050A0006093990370939A0380939B0390939C035E |
:1050B0001092AE031092AD03609167057091680580 |
:1050C000882777FD8095982F2BE035E040E050E071 |
:1050D0000E94E24A6093340970933509809336093F |
:1050E00090933709109271051092700581E08093BA |
:1050F00001010E94FE428091A80584608093A8056A |
:105100008FEF8093A1098091C90890E064E0880F37 |
:10511000991F6A95E1F78093A20980E28093A30921 |
:1051200008951F93182F0EC080918305882361F482 |
:1051300084E690E09093DE048093DD048AEF90E0B3 |
:105140000E946811115080F71F91089588EE809396 |
:10515000A3083EE13093A40880E58093A6088AE086 |
:105160008093A7083093A5083093A9088093A808D6 |
:1051700058E05093AA0890E19093AB0866E06093E2 |
:10518000AC085093AD0886EE8093AE083093AF081C |
:1051900080E88093B00844E64093B10888E78093A4 |
:1051A000B2088EE58093B30883E28093B40884E16B |
:1051B0008093B5081092B6089093B70887E0809363 |
:1051C000B80882E08093B9081092BA081092BB0820 |
:1051D0001092CB081092CC081092CD081092CE08F5 |
:1051E0004093BC0888E28093BD081092E10892E3E6 |
:1051F0009093BE0886E98093BF0885E08093C0083D |
:105200009093C1082AE52093C2089093C308109296 |
:10521000E0082093C4088093C50885E58093C608FC |
:105220008093C70880E28093C80884E08093C9080F |
:105230009093CA088FE58093CF0883EF8093D108BD |
:105240003093D0083093D2088DEF8093D3084093E9 |
:10525000D4082093D5082093D6082093D70810921D |
:10526000D8086093D9085093DA082093DB0830936C |
:10527000DC084093DD088CE38093DE08A6EEB8E0FE |
:10528000E8E7F3E08CE001900D928150E1F708959A |
:1052900088E68093A3084EE14093A40890E590939C |
:1052A000A6088AE08093A7084093A5084093A90820 |
:1052B0008093A8088CE08093AA0880E18093AB08D3 |
:1052C00076E07093AC0868E06093AD0886EE80935A |
:1052D000AE084093AF0880E88093B0089093B1087F |
:1052E00088E78093B2088EE58093B30883E28093C9 |
:1052F000B4084093B5081092B60850E25093B7082E |
:1053000087E08093B80882E08093B9081092BA08C9 |
:105310001092BB081092CB081092CC081092CD08C6 |
:105320001092CE0834E63093BC0888E28093BD0822 |
:105330001092E10892E39093BE0886E98093BF083B |
:1053400085E08093C0089093C1082AE52093C208A5 |
:105350009093C3081092E0082093C4088093C50876 |
:1053600085E58093C6088093C7085093C80884E0F9 |
:105370008093C9088BE48093CA088FE58093CF0897 |
:1053800083EF8093D10884E18093D0088093D20882 |
:105390008DEF8093D3083093D4082093D5082093C1 |
:1053A000D6082093D7081092D8087093D908609334 |
:1053B000DA082093DB084093DC083093DD088CE3A7 |
:1053C0008093DE08A6EEB8E0E2E8F3E08CE001901E |
:1053D0000D928150E1F7089588E68093A3083EE19D |
:1053E0003093A40890E59093A6088AE08093A708DC |
:1053F0003093A5083093A9088093A8085FE05093E4 |
:10540000AA083093AB088CE08093AC0868E0609306 |
:10541000AD0886EE8093AE083093AF0880E88093A5 |
:10542000B0089093B10896E99093B2088EE5809306 |
:10543000B30883E28093B4083093B5081092B6089D |
:1054400080E28093B70887E08093B80882E0809379 |
:10545000B9081092BA081092BB081092CB081092AB |
:10546000CC081092CD081092CE0844E64093BC08B8 |
:1054700088E28093BD081092E10882E38093BE0821 |
:105480009093BF0825E02093C0088093C1089AE557 |
:105490009093C2088093C3081092E0089093C408C8 |
:1054A0002093C50885E58093C6088093C70880E1EE |
:1054B0008093C80884E08093C9084093CA088FE5A8 |
:1054C0008093CF0883EF8093D1085093D0085093F6 |
:1054D000D2088DEF8093D3084093D4089093D508D9 |
:1054E0009093D6089093D7081092D80886E08093BE |
:1054F000D9086093DA089093DB083093DC08409376 |
:10550000DD088CE38093DE08A6EEB8E0EAE8F3E07D |
:105510008CE001900D928150E1F708952F923F9217 |
:105520004F925F926F927F928F929F92AF92BF92B3 |
:10553000CF92DF92EF92FF920F931F93CF93DF935F |
:10554000CDB7DEB7A5970FB6F894DEBF0FBECDBFBF |
:105550000E946A1C309100013C3010F4299A01C06D |
:10556000299840918105509182055D874C878091F3 |
:105570007A05843608F06CC080910501882399F47F |
:1055800080910B0390910C038F5F9F4F61F488E92A |
:105590009AE39093DE048093DD0480E09CE0909396 |
:1055A0000C0380930B038091CC059091CD0500975F |
:1055B00031F001979093CD058093CC0504C01092F3 |
:1055C000830510926D053A3011F0343111F4289AA8 |
:1055D00001C028988091A6059091A705895E934007 |
:1055E000A0F18091B408A82FB0E0BD87AC8781E01E |
:1055F00080936D05A0919B08B0E0AA0FBB1FFD0131 |
:10560000ED57F74F11821082E0919C082E2F30E069 |
:10561000220F331FC9018D57974FFC011182108251 |
:10562000A359B74F11961C921E922359374FD90197 |
:1056300011961C921E92E0919E08F0E0EE0FFF1F63 |
:10564000E359F74F11821082B6C210928305B3C29C |
:1056500080917A058D3808F4AEC210926D05809164 |
:10566000B50822E3829FC00111249093CD05809359 |
:10567000CC05EC85FD85B9978CF080918305882356 |
:1056800069F08091A6059091A705FFEF8F3F9F07D6 |
:1056900029F001969093A7058093A6058091A60511 |
:1056A0009091A7058F3F910509F038F51092E60516 |
:1056B0001092E7051092E8051092E9051092E205B4 |
:1056C0001092E3051092E4051092E5058A3F9105DA |
:1056D000C9F481E08093C7051092DE051092DF05C2 |
:1056E0001092E0051092E10510925B0510925C05A6 |
:1056F00010925D0510925E0505C08091A80582603C |
:105700008093A805E0919D08F0E0EE0FFF1FE3599C |
:10571000F74F80819181813591050CF485C180918D |
:105720008305882309F080C180919E08E82FF0E06E |
:10573000EE0FFF1FE359F74F808191818C34910563 |
:105740000CF4E5C08091CB058F5F8093CB05893C3D |
:1057500008F46AC13C3010F4299801C0299A1092CB |
:1057600083051092CB051092A7051092A605809193 |
:105770009B08282F30E0F901EE0FFF1FE359F74F88 |
:1057800080819181873491059CF4E0919C08F0E040 |
:10579000EE0FFF1FE359F74F0190F081E02DF7FF67 |
:1057A00003C0F095E195FF4FE734F1050CF46AC0B2 |
:1057B00080919C08682F70E0DB01AA0FBB1FA359E2 |
:1057C000B74F8D919C911197873491053CF0F90169 |
:1057D000EE0FFF1FE359F74F808191818D919C91CE |
:1057E0008734910564F0F901EE0FFF1FE359F74F7D |
:1057F000808191818734910514F042E001C041E03D |
:10580000FB01EE0FFF1FE359F74F80819181863432 |
:1058100091055CF4F901EE0FFF1FE359F74F80810A |
:105820009181873491050CF043E0FB01EE0FFF1FDF |
:10583000E359F74F808191818A5B9F4F5CF4F901B6 |
:10584000EE0FFF1FE359F74F808191818734910557 |
:105850000CF044E0660F771F6359774FDB018D91A1 |
:105860009C918A5B9F4F5CF4220F331F2359374F63 |
:10587000F90180819181863491050CF445E0842FF3 |
:105880000E94AC02E0919C08F0E0EE0FFF1FE3598C |
:10589000F74F0190F081E02DF7FF03C0F095E195FF |
:1058A000FF4F7E97B4F4E0919B08F0E0EE0FFF1FEE |
:1058B000E359F74F808191818A5B9F4F54F481E0D7 |
:1058C00080936A0788EE93E09093DE048093DD0472 |
:1058D000ABC00E94B80246E56BE978E00E941E0367 |
:1058E0008091A30880FF10C0809117039091180346 |
:1058F000875B934038F480911703909118038E5E74 |
:10590000924010F40E94EC140E94EA2686C0808126 |
:105910009181855B9F4F0CF085C08091CB058F5F97 |
:105920008093CB05893C08F47FC03C3010F4299863 |
:1059300001C0299A8FEF04E010E0D801082E0E94E0 |
:10594000B04B109283051092CB051092A7051092D0 |
:10595000A6050E94EA2680911F059091200560E02F |
:1059600071E00E94214BD801062E0E94B04B80911D |
:105970001F059091200560E071E00E94214B0F5FB0 |
:105980001F4FD801082E0E94B04B809121059091A5 |
:10599000220560E071E00E94214B0F5F1F4FD8018C |
:1059A000062E0E94B04B809121059091220560E067 |
:1059B00071E00E94214B0F5F1F4FD801082E0E94FB |
:1059C000B04B609125057091260580912705909137 |
:1059D00028050E949449DC01CB0160E071E00E943F |
:1059E000214B0F5F1F4FD801062E0E94B04B6091D4 |
:1059F00025057091260580912705909128050E9424 |
:105A00009449DC01CB0160E071E00E94214B0F5F03 |
:105A10001F4FD801082E0E94B04B0E94B8020E946E |
:105A2000912802C01092CB05E0919D08F0E0EE0FA6 |
:105A3000FF1FE359F74F808191818B5A9F4F0CF0E4 |
:105A4000BAC0E0919E08F0E0EE0FFF1FE359F74F58 |
:105A500080819181855B9F4F0CF08CC08091CA053D |
:105A60008F5F8093CA05893C08F486C088EC8093D8 |
:105A7000CA0581E090E09093A7058093A60581E098 |
:105A8000809383051092DE051092DF051092E005E9 |
:105A90001092E10510925B0510925C0510925D0575 |
:105AA00010925E0510925F051092600510926105DC |
:105AB0001092620510924B0510924C0510924D0504 |
:105AC00010924E05109253051092540510925505F0 |
:105AD0001092560580912B0590912C05A0912D05D3 |
:105AE000B0912E0580934F0590935005A0935105DA |
:105AF000B09352058091330590913405A0913505FE |
:105B0000B09136058093570590935805A093590599 |
:105B1000B0935A051092E6051092E7051092E80539 |
:105B20001092E9051092E2051092E3051092E40547 |
:105B30001092E5058091A80588608093A805809162 |
:105B4000CE0881FF19C08091A30880FF10C080910A |
:105B5000170390911803875B934038F480911703E3 |
:105B6000909118038E5E924010F40E94EC140E94F3 |
:105B7000EA2602C01092CA05E0919E08F0E0EE0FFE |
:105B8000FF1FE359F74F808191818C3491058CF090 |
:105B90008091C9058F5F8093C905893C60F01092A0 |
:105BA000830588EC8093C9051092A7051092A6057D |
:105BB00002C01092C90580917703815080937703CA |
:105BC000809177038F3F29F080916D05882309F438 |
:105BD00099C30E949022E0919B08F0E0EE0FFF1F16 |
:105BE000E359F74F808191811C01442437FC409494 |
:105BF000542CE0919C08F0E0EE0FFF1FE359F74FA3 |
:105C0000808191813C01882477FC8094982C80913C |
:105C1000CE08482F50E05DA34CA380FF76C0EE2451 |
:105C2000FF248701E618F70808091909C201B10124 |
:105C30002FE93BE140E050E00E94E24A5B016C0149 |
:105C4000C801B7010E94E24A7B018C01C601B5017F |
:105C50006E197F09800B910B20E137E240E050E0A4 |
:105C60000E94564B1901442437FC4094542CEA0CF2 |
:105C7000FB1C0C1D1D1DC801B70120E137E240E0EF |
:105C800050E00E94564B309521953F4F39018824B2 |
:105C900077FC8094982C5EE725163104410451046A |
:105CA00034F04DE7242E312C412C512C11C063E8E7 |
:105CB00026166FEF36066FEF46066FEF560644F472 |
:105CC00033E8232E3FEF332E3FEF432E3FEF532E8B |
:105CD0007EE7671671048104910434F02DE7622E8B |
:105CE000712C812C912C11C083E868168FEF7806F7 |
:105CF0008FEF88068FEF980644F493E8692E9FEFA4 |
:105D0000792E9FEF892E9FEF992E8091BD0590915E |
:105D1000BE05AA2797FDA095BA2FA2019101281BC5 |
:105D2000390B4A0B5B0BCA01B90123E030E040E0BC |
:105D300050E00E94564B79018A01EE0CFF1C001FB7 |
:105D4000111FE20EF31E041F151F8091BB059091D9 |
:105D5000BC05AA2797FDA095BA2FA4019301281B83 |
:105D6000390B4A0B5B0BCA01B90123E030E040E07C |
:105D700050E00E94564B59016A01AA0CBB1CCC1C76 |
:105D8000DD1CA20EB31EC41ED51EC1013092BE057D |
:105D90002092BD0523017092BC056092BB05609006 |
:105DA000AA0877248090AB089924E89CF001E99C2C |
:105DB000F00DF89CF00D1124AC01469DC001479DEB |
:105DC000900D569D900D11244091B9055091BA0542 |
:105DD0009A01220F331F240F351F820F931F64E097 |
:105DE00070E00E94214BE60FF71FF093BA05E09395 |
:105DF000B9058091140690911506E81BF90BF093F4 |
:105E00007C05E0937B05A89CF001A99CF00DB89C53 |
:105E1000F00D1124469CC001479C900D569C900D9E |
:105E200011244091B7055091B8059A01220F331FF4 |
:105E3000240F351F820F931F64E070E00E94214BF6 |
:105E4000E60FF71FF093B805E093B70580911606AB |
:105E500090911706E81BF90BF0937E05E0937D0502 |
:105E6000E0919E08F0E0EE0FFF1FE359F74F8081AD |
:105E70009181909581959F4F9093800580937F05A8 |
:105E80006CA17DA1607270707DA36CA38091BA0338 |
:105E900090E0682B792B672B19F00E94CE430BC042 |
:105EA000E0919D08F0E0EE0FFF1FE359F74F80816E |
:105EB000918188589F4F90938205809381056091CE |
:105EC000A60370E080E090E00E941A4720E030E0F6 |
:105ED00040E251E40E94C84820E030E040E85CE342 |
:105EE0000E947F4A7B018C0160932F0970933009D7 |
:105EF00080933109909332096091A70370E080E0AC |
:105F000090E00E941A4720E030EE4BE256E40E94F7 |
:105F10002C4960931A0970931B0980931C09909374 |
:105F20001D098091760780FF67C080913B09813809 |
:105F300008F462C02091AA0830E080916F07992789 |
:105F400087FD9095289FA001299F500D389F500DE7 |
:105F5000112480917B0590917C05840F951F90936F |
:105F60007C0580937B0580917007992787FD90952C |
:105F7000D9018A9F90018B9F300D9A9F300D11247B |
:105F800080917D0590917E05820F931F90937E05F1 |
:105F900080937D0520917107332727FD30958091EF |
:105FA0007F0590918005820F931F909380058093C9 |
:105FB0007F052091A80830E080917307992787FD1D |
:105FC0009095FC012E9FC0012F9F900D3E9F900D3C |
:105FD00011249093AE038093AD0380917207282F14 |
:105FE00030E080918105909182052817390724F4CB |
:105FF00030938205209381058091810590918205DF |
:1060000097FF04C010928205109281058091A30829 |
:1060100082FF0CC080E090E0A0E0B0E080931A091D |
:1060200090931B09A0931C09B0931D0920E030E058 |
:1060300040E050E0C801B7010E94024A882364F49E |
:1060400080E090E0A0E0B0E080932F0990933009C9 |
:10605000A0933109B093320920E030E040E050E0F5 |
:1060600060911A0970911B0980911C0990911D097A |
:106070000E94024A882364F480E090E0A0E0B0E04F |
:1060800080931A0990931B09A0931C09B0931D09D2 |
:10609000E0917B05F0917C052091A2053091A3054C |
:1060A000CF0164E070E00E94214B77FF03C0709540 |
:1060B00061957F4F26173707C4F4CF01F7FF03C060 |
:1060C000909581959F4F64E070E00E94214B709302 |
:1060D000A3056093A205653671056CF084E690E037 |
:1060E0009093A3058093A20506C0215030403093C1 |
:1060F000A3052093A205E0917D05F0917E052091F6 |
:10610000A4053091A505CF0164E070E00E94214B09 |
:1061100077FF03C0709561957F4F26173707C4F44A |
:10612000CF01F7FF03C0909581959F4F64E070E029 |
:106130000E94214B7093A5056093A40565367105F7 |
:106140006CF084E690E09093A5058093A40506C0CA |
:10615000215030403093A5052093A40580916D0512 |
:10616000882341F01092A3051092A2051092A50574 |
:106170001092A40580919C08A82FB0E0FD01EE0FBD |
:10618000FF1FE359F74F208131818091C208482FCA |
:1061900050E04217530744F48091E00882FF04C0A6 |
:1061A00081E080938E0511C0FD01EE0FFF1FE359C2 |
:1061B000F74F208131818091C308BA01681B7109B2 |
:1061C0002617370714F410928E05FD01EE0FFF1FFE |
:1061D000E359F74F8081918166277727641B750B00 |
:1061E0008617970744F48091E00883FF04C081E09C |
:1061F00080938F0514C080918F05882381F0AA0FAA |
:10620000BB1FA359B74F2D913C918091C30890E0DB |
:10621000841B950B8217930714F410928F058091BD |
:106220009B08A82FB0E0FD01EE0FFF1FE359F74FC9 |
:10623000808191814817590744F48091E00880FFDC |
:1062400004C081E08093910515C080919105882359 |
:1062500089F0FD01EE0FFF1FE359F74F20813181D7 |
:106260008091C308FA01E81BF1092E173F0714F4C7 |
:1062700010929105FD01EE0FFF1FE359F74F80814A |
:1062800091818617970744F48091E00881FF04C04C |
:1062900081E08093900514C080919005882381F05F |
:1062A000AA0FBB1FA359B74F2D913C918091C308F2 |
:1062B00090E0841B950B8217930714F410929005BD |
:1062C00080918E05882321F480918F05882321F009 |
:1062D00081E080938D0502C010928D05809191051B |
:1062E000882321F480919005882351F081E08093E8 |
:1062F0008C0510928D0510928E0510928F0502C0AC |
:1063000010928C0580918D05882321F480918C0555 |
:10631000882351F08091C10890E02C853D8582173B |
:10632000930714F49D878C8780916D05882341F134 |
:106330001092800510927F0510927C0510927B05CB |
:1063400010927E0510927D0580E090E0A8ECBFE3FE |
:1063500080932F0990933009A0933109B0933209AB |
:106360008BE09CEBA2E3BCE380931A0990931B099A |
:10637000A0931C09B0931D0910928D0510928C05F5 |
:1063800040912B0550912C0560912D0570912E05A3 |
:106390004A835B836C837D8380910D0990910E0904 |
:1063A000A0910F09B0911009840F951FA61FB71F68 |
:1063B00080930D0990930E09A0930F09B0931009D3 |
:1063C00060913305709134058091350590913605C3 |
:1063D000688779878A879B8780911409909115092E |
:1063E000A0911609B0911709288539854A855B85E2 |
:1063F000820F931FA41FB51F809314099093150952 |
:10640000A0931609B093170940912F0550913005BC |
:10641000609131057091320548A359A36AA37BA30B |
:106420008091050990910609A0910709B09108098A |
:10643000840F951FA61FB71F809305099093060927 |
:10644000A0930709B093080960913705709138054A |
:106450008091390590913A056C8F7D8F8E8F9F8F3B |
:106460008091FA089091FB08A091FC08B091FD087A |
:106470002C8D3D8D4E8D5F8D820F931FA41FB51FF8 |
:106480008093FA089093FB08A093FC08B093FD0852 |
:1064900030918C053983332329F480918D0588232D |
:1064A00009F460C010923B0510923C0510923D0526 |
:1064B00010923E0510923F05109240051092410542 |
:1064C0001092420510920D0910920E0910920F09B8 |
:1064D00010921009109214091092150910921609C1 |
:1064E00010921709109205091092060910920709D7 |
:1064F000109208091092FA081092FB081092FC08FA |
:106500001092FD0880914B0590914C05A0914D058E |
:10651000B0914E0580934F0590935005A09351057F |
:10652000B09352058091530590915405A091550563 |
:10653000B09156058093570590935805A09359053F |
:10654000B0935A051092FB041092FA0410928B0536 |
:1065500010928A051092890510928805498144237A |
:1065600009F0BAC180918D05882309F0B5C18091E9 |
:10657000A1092090A2053090A305E090AF0880907B |
:1065800025099090260940903809509039098F3F8D |
:1065900009F4BFC0FF2400E010E0A82EBB24A7FC34 |
:1065A000B094CB2CDB2C6A817B818C819D81A801EE |
:1065B00097010E94564BC401AA2797FDA095BA2FB8 |
:1065C000281B390B4A0B5B0BCA01B901A6019501C7 |
:1065D0000E94E24A20E032E040E050E00E94564B48 |
:1065E00039014A01688579858A859B85A8019701CB |
:1065F0000E94564BC201AA2797FDA095BA2F281BCF |
:10660000390B4A0B5B0BCA01B901A60195010E9427 |
:10661000E24A20E032E040E050E00E94564B79012F |
:106620008A0151E4251631043CF48091A40590912F |
:10663000A50581349105A4F0C401B30122E030E046 |
:1066400040E050E00E94564B39014A01C801B701B1 |
:1066500022E030E040E050E00E94564B79018A0190 |
:10666000E0919E08F0E0EE0FFF1FE359F74F019015 |
:10667000F081E02DF7FF03C0F095E195FF4F7A9789 |
:10668000A4F0C401B30123E030E040E050E00E94F8 |
:10669000564B39014A01C801B70123E030E040E020 |
:1066A00050E00E94564B79018A018091A309A82EDF |
:1066B000BB24A7FCB094CB2CDB2CA4019301A61423 |
:1066C000B704C804D90414F4A6019501992787FDDD |
:1066D0009095909581959F4FAA2797FDA095BA2FE9 |
:1066E00039014A01281739074A075B0714F43C01AE |
:1066F0004D01AE14BF04C006D10614F48601750125 |
:10670000E816F9060A071B070CF0BEC07C018D01D4 |
:10671000BBC0FF2400E010E06A817B818C819D81F9 |
:10672000A80197010E94564B59016A01C401AA278A |
:1067300097FDA095BA2FA81AB90ACA0ADB0A68857C |
:1067400079858A859B85A80197010E94564B79011E |
:106750008A01C201AA2797FDA095BA2FE81AF90A63 |
:106760000A0B1B0BC601B50120E130E040E050E010 |
:106770000E94564B39014A01C801B70120E130E0BF |
:1067800040E050E00E94564B79018A0161E42616F0 |
:1067900031043CF48091A4059091A50581349105C4 |
:1067A000A4F0C401B30123E030E040E050E00E94D7 |
:1067B000564B39014A01C801B70123E030E040E0FF |
:1067C00050E00E94564B79018A01E0919E08F0E06A |
:1067D000EE0FFF1FE359F74F0190F081E02DF7FF17 |
:1067E00003C0F095E195FF4F7A97A4F0C401B3017F |
:1067F00023E030E040E050E00E94564B39014A016E |
:10680000C801B70123E030E040E050E00E94564B61 |
:1068100079018A0171E2671671048104910434F0F0 |
:1068200090E2692E712C812C912C11C080EE68169B |
:106830008FEF78068FEF88068FEF980644F480EE8E |
:10684000682E8FEF782E8FEF882E8FEF982E91E2A3 |
:10685000E916F1040105110534F010E2E12EF12CE6 |
:10686000012D112D11C0A0EEEA16AFEFFA06AFEF21 |
:106870000A07AFEF1A0744F4B0EEEB2EBFEFFB2E82 |
:10688000BFEF0B2FBFEF1B2F80914B0590914C0555 |
:10689000A0914D05B0914E0586199709A809B9092F |
:1068A00080934B0590934C05A0934D05B0934E05F6 |
:1068B0008091530590915405A0915505B0915605CE |
:1068C0008E199F09A00BB10B80935305909354052B |
:1068D000A0935505B09356058091FA049091FB045E |
:1068E0008F3F910509F008F4E1C4B981BB2309F099 |
:1068F0005FC480918D05882309F05AC480916F058B |
:10690000882309F055C460910D0970910E0980919A |
:106910000F099091100920E031E040E050E00E9422 |
:10692000564B19012A0120930D0930930E0940930B |
:106930000F09509310096091140970911509809105 |
:1069400016099091170920E031E040E050E00E94E4 |
:10695000564B288F398F4A8F5B8F209314093093C1 |
:1069600015094093160950931709E090AF08FF24CA |
:1069700000E010E020913B0530913C0540913D0541 |
:1069800050913E05C801B7010E94E24A20E031E083 |
:1069900040E050E00E94564B59016A0120933B05AC |
:1069A00030933C0540933D0550933E0520913F05B3 |
:1069B000309140054091410550914205C801B70111 |
:1069C0000E94E24A20E031E040E050E00E94564B55 |
:1069D00039014A0120933F0530934005409341051A |
:1069E000509342056091430570914405809145059F |
:1069F0009091460520E031E040E050E00E94564B87 |
:106A00002093430530934405409345055093460534 |
:106A1000E090C808FF2400E010E0C201B1016A194B |
:106A20007B098C099D09A80197010E94564B209370 |
:106A3000C3053093C4054093C5055093C605CA01EC |
:106A4000B90120E031E040E050E00E94564B69017E |
:106A500030938B0520938A05688D798D8A8D9B8D67 |
:106A60006619770988099909A80197010E94564B70 |
:106A7000CA01B90120E031E040E050E00E94564BED |
:106A8000890130938905209388058091A205909112 |
:106A9000A30581349105C4F48091A4059091A505C6 |
:106AA000813491058CF4E0919E08F0E0EE0FFF1F19 |
:106AB000E359F74F0190F081E02DF7FF03C0F09507 |
:106AC000E195FF4F7A97B4F08091A1098F3F91F43F |
:106AD000C60162E070E00E94214B70938B056093C9 |
:106AE0008A05C80162E070E00E94214B709389051D |
:106AF00060938805609105097091060980910709E6 |
:106B00009091080920E031E040E050E00E94564BAF |
:106B1000209305093093060940930709509308090B |
:106B20006091FA087091FB088091FC089091FD0833 |
:106B300020E031E040E050E00E94564B2093FA08FC |
:106B40003093FB084093FC085093FD08E8A0F9A09F |
:106B50000AA11BA12A813B814C815D81E21AF30AC3 |
:106B6000040B150BE092DA05F092DB050093DC05CF |
:106B70001093DD05AC8CBD8CCE8CDF8C488559859F |
:106B80006A857B85A41AB50AC60AD70AA092D605DB |
:106B9000B092D705C092D805D092D905E092D2051F |
:106BA000F092D3050093D4051093D505A092CE059D |
:106BB000B092CF05C092D005D092D10580914F05FB |
:106BC00090915005A0915105B09152058E199F09E1 |
:106BD000A00BB10B80934F0590935005A0935105E6 |
:106BE000B09352058091570590915805A091590591 |
:106BF000B0915A058A199B09AC09BD0980935705C4 |
:106C000090935805A0935905B0935A0520917005AB |
:106C1000309171052138310594F0809119059091DA |
:106C20001A05019690931A05809319058091180909 |
:106C30009091190901969093190980931809205889 |
:106C40003F4F94F48091190590911A050197909304 |
:106C50001A058093190580911809909119090197D7 |
:106C60009093190980931809688D798D8A8D9B8D71 |
:106C70002AE130E040E050E00E94564B30933E085D |
:106C800020933D08109271051092700581E090E00C |
:106C90009093B6058093B5058091AD059091AE05B2 |
:106CA000A091AF05B091B00582199309A409B50967 |
:106CB000815E914BAF4FBF4F8F539C49A040B04076 |
:106CC00028F08091A20981330CF4C1C071E0E7166D |
:106CD00070E1F70670E0070770E017070CF452C088 |
:106CE0008091B405882309F449C0D801C7017CE02C |
:106CF000B595A795979587957A95D1F70196909335 |
:106D0000B6058093B505D801C70163E0B595A79591 |
:106D1000979587956A95D1F78093C3059093C4059D |
:106D2000A093C505B093C60589589341A040B040D3 |
:106D300064F088E893E1A0E0B0E08093C30590930D |
:106D4000C405A093C505B093C6056091C3057091B5 |
:106D5000C4058091C5059091C60520E031E040E072 |
:106D600050E00E94564B80918A0590918B05820FCE |
:106D7000931F90938B0580938A0566C081E0809372 |
:106D8000B40562C01092B405F0E0EF16F0EFFF0614 |
:106D9000FFEF0F07FFEF1F070CF056C08091B30500 |
:106DA000882309F44DC088279927DC018E199F0993 |
:106DB000A00BB10B5CE0B595A795979587955A9573 |
:106DC000D1F701969093B6058093B505C801B70138 |
:106DD00028E030E040E050E00E94564B2093C3058D |
:106DE0003093C4054093C5055093C60528573C4EC3 |
:106DF0004F4F5F4F64F488E79CEEAFEFBFEF809397 |
:106E0000C3059093C405A093C505B093C6056091D2 |
:106E1000C3057091C4058091C5059091C60520E019 |
:106E200031E040E050E00E94564B80918A059091FD |
:106E30008B05820F931F90938B0580938A0511C059 |
:106E400081E08093B3050DC01092B3050AC0109283 |
:106E5000B6051092B50588EE93E090939403809365 |
:106E600093038091C908482E55248091B5059091CF |
:106E7000B6054816590624F45092B6054092B50559 |
:106E80009090A209692C772467FC70948091B505D5 |
:106E90009091B60544E0880F991F4A95E1F768166E |
:106EA000790674F4892D97FC815F85958595859584 |
:106EB0008595992787FD90959093B6058093B505A4 |
:106EC00071E0E71674E0F70670E0070770E0170757 |
:106ED00074F080911505909116052091B5053091BB |
:106EE000B605820F931F909316058093150580E0D9 |
:106EF000E8168CEFF8068FEF08078FEF180774F489 |
:106F000080911505909116052091B5053091B60533 |
:106F1000821B930B909316058093150581E090E0FA |
:106F20009093B6058093B5051092BF051092C005E9 |
:106F30001092C1051092C2058091A9059091AA05F1 |
:106F4000A091AB05B091AC05288D398D4A8D5B8D34 |
:106F5000821B930BA40BB50B815E914BAF4FBF4FC0 |
:106F60008F539C49A040B04020F040E349150CF0FD |
:106F7000C1C051E0A51650E1B50650E0C50650E08D |
:106F8000D5060CF452C08091B205882309F449C09B |
:106F9000D601C5013CE0B595A795979587953A959B |
:106FA000D1F701969093B6058093B505D601C5013A |
:106FB00023E0B595A795979587952A95D1F7809366 |
:106FC000BF059093C005A093C105B093C205895831 |
:106FD0009341A040B04064F088E893E1A0E0B0E0C5 |
:106FE0008093BF059093C005A093C105B093C205DF |
:106FF0006091BF057091C0058091C1059091C20557 |
:1070000020E031E040E050E00E94564B809188053E |
:1070100090918905820F931F90938905809388052D |
:1070200066C081E08093B20562C01092B20570E044 |
:10703000A71670EFB7067FEFC7067FEFD7060CF0F5 |
:1070400056C08091B105882309F44DC0882799273F |
:10705000DC018A199B09AC09BD090CE0B595A7951F |
:10706000979587950A95D1F701969093B6058093E9 |
:10707000B505C601B50128E030E040E050E00E94CF |
:10708000564B2093BF053093C0054093C1055093E4 |
:10709000C20528573C4E4F4F5F4F64F488E79CEE83 |
:1070A000AFEFBFEF8093BF059093C005A093C105DC |
:1070B000B093C2056091BF057091C0058091C10574 |
:1070C0009091C20520E031E040E050E00E94564B34 |
:1070D0008091880590918905820F931F909389056F |
:1070E0008093880511C081E08093B1050DC0109296 |
:1070F000B1050AC01092B6051092B50588EE93E06E |
:1071000090939403809393038091B5059091B60575 |
:107110004816590624F45092B6054092B505809160 |
:10712000B5059091B60514E0880F991F1A95E1F7FF |
:107130006816790674F4892D97FC815F859585958D |
:1071400085958595992787FD90959093B6058093B1 |
:10715000B50591E0A91694E0B90690E0C90690E063 |
:10716000D90674F080911705909118052091B50506 |
:107170003091B605820F931F9093180580931705E1 |
:10718000A0E0AA16ACEFBA06AFEFCA06AFEFDA0678 |
:10719000CCF480911705909118052091B505309198 |
:1071A000B605821B930B90931805809317050AC0B0 |
:1071B000109289051092880510928B0510928A050D |
:1071C00010926F0520E030E040E050E060911A0935 |
:1071D00070911B0980911C0990911D090E94024A1F |
:1071E000882341F4109289051092880510928B052E |
:1071F00010928A0580910D0990910E09A0910F09B6 |
:10720000B09110098093AD059093AE05A093AF05A2 |
:10721000B093B0058091140990911509A0911609B9 |
:10722000B09117098093A9059093AA05A093AB0587 |
:10723000B093AC0510923B0510923C0510923D05B1 |
:1072400010923E0510923F051092400510924105A4 |
:107250001092420510924305109244051092450584 |
:107260001092460510920D0910920E0910920F0906 |
:107270001092100910921409109215091092160913 |
:107280001092170910920509109206091092070929 |
:10729000109208091092FA081092FB081092FC084C |
:1072A0001092FD081092FB041092FA04C0907F0522 |
:1072B000D09080058601D7FE04C0002711270C1945 |
:1072C0001D09003111056CF088EE93E09093940352 |
:1072D000809393038091A30884FD03C081E0809391 |
:1072E000C705E090AC08B601882777FD8095982FF8 |
:1072F0002E2D30E040E050E00E94E24A9801442701 |
:1073000037FD4095542F0E94E24A20E032E040E0F1 |
:1073100050E00E94564B89019A01FF24EC9CC00169 |
:10732000ED9C900DFC9C900D112464E070E00E9497 |
:10733000214B600F711F882777FD8095982F6093F0 |
:10734000DE057093DF058093E0059093E1052091C1 |
:107350005B0530915C0540915D0550915E05261BF3 |
:10736000370B480B590B20935B0530935C0540931A |
:107370005D0550935E052155334C4040504064F00C |
:1073800080E593ECA0E0B0E080935B0590935C0512 |
:10739000A0935D05B0935E0580915B0590915C05BF |
:1073A000A0915D05B0915E05805B9C43AF4FBF4FE0 |
:1073B00064F480EB9CE3AFEFBFEF80935B059093A9 |
:1073C0005C05A0935D05B0935E0580916705909183 |
:1073D0006805892B09F456C18091A30883FF52C127 |
:1073E0006A817B818C819D8120E032E040E050E029 |
:1073F0000E94564B890137FF03C0109501951F4F1E |
:10740000688579858A859B8520E032E040E050E000 |
:107410000E94564B290137FF04C0509441945108F3 |
:107420005394401651060CF42801209167053091C1 |
:107430006805609134097091350980913609909101 |
:107440003709B090C705BB2001F5245E3D4F790197 |
:107450000027F7FC0095102F2BE035E040E050E0CE |
:107460000E94564BE21AF30A040B150BC801B70130 |
:1074700028E631E040E050E00E94564BBCE4EB2EA1 |
:10748000BFEFFB2EE60EF71E18C0609167057091E6 |
:107490006805882777FD8095982F2BE035E040E040 |
:1074A00050E00E94E24A609334097093350980935A |
:1074B000360990933709EE24FF24C0909303D090AF |
:1074C0009403C114D10451F5F9E14F16510434F578 |
:1074D00080917005909171058E0D9F1D909371059F |
:1074E00080937005BB20D1F088EC90E09093DE048F |
:1074F0008093DD04609134097091350980913609DB |
:10750000909137092BE035E040E050E00E94564B67 |
:1075100030936A05209369051092C70500913409DC |
:10752000109135092091360930913709C20168E080 |
:1075300070E00E94214B6F5F7F4FC701A3E0880F6F |
:10754000991FAA95E1F70E94214B4B01AA2497FCB1 |
:10755000A094BA2C800E911EA21EB31E80923409F4 |
:1075600090923509A0923609B09237098091A5030F |
:10757000682E7724469CC001479C900D569C900D28 |
:10758000112460E270E00E94214B2301461A570A41 |
:1075900057FC72C0C114D10409F01EC58091A40526 |
:1075A0009091A5052091A2053091A305820F931F0C |
:1075B00068E070E00E94214B6B0120E430E0C20ED5 |
:1075C000D31E8091690590916A05AA2797FDA09521 |
:1075D000BA2FFCE1EF2EF2E0FF2E012D112DE81A5B |
:1075E000F90A0A0B1B0BC501B4012BE035E040E0A2 |
:1075F00050E00E94564BE20EF31E041F151FC801F7 |
:10760000B70128E631E040E050E00E94564B645B51 |
:107610007040649DC001659D900D749D900D112476 |
:10762000B6010E94214B9301220F331F260D371DF7 |
:107630002617370734F0309521953F4F62177307AF |
:107640000CF4B9019B01442737FD4095542F8091DC |
:107650005B0590915C05A0915D05B0915E05820F80 |
:10766000931FA41FB51F80935B0590935C05A093A7 |
:107670005D05B0935E0506C084EF91E0909394039E |
:10768000809393038091C80581508093C8058F3FF4 |
:1076900009F09AC088E18093C805E090AF08FF2404 |
:1076A00000E010E06A817B818C819D81A8019701B7 |
:1076B0000E94564B309312082093110868857985F3 |
:1076C0008A859B85A80197010E94564B3093140828 |
:1076D000209313088091250990912609909316080C |
:1076E0008093150880913809909139099093180872 |
:1076F0008093170880912A0990912B0990931A087A |
:1077000080931908809184059091850590931C08B9 |
:1077100080931B08609163057091640580916505F5 |
:107720009091660520E032E040E050E00E94564B28 |
:1077300030931E0820931D0880916705909168057D |
:107740009093220880932108809111039091120355 |
:10775000909324088093230860913409709135092F |
:1077600080913609909137092BE035E040E050E0F8 |
:107770000E94564B309328082093270880917A0561 |
:1077800090E0909326088093250880919F0990911E |
:10779000A009909334088093330880919D099091BB |
:1077A0009E09909336088093350880916A0790E08F |
:1077B00090933808809337088091E0049091E10419 |
:1077C00090933A088093390839813323A9F0609166 |
:1077D000000970910109882777FD8095982F0E94F4 |
:1077E000C74920912F0930913009409131095091BA |
:1077F00032090E947F4A2EC0E0900009F0900109F2 |
:107800006A817B818C819D810E94C74920911A09E0 |
:1078100030911B0940911C0950911D090E947F4A1B |
:107820005B016C010027F7FC0095102FC801B70120 |
:107830000E94C74920912F093091300940913109A8 |
:10784000509132090E947F4A9B01AC01C601B501EB |
:107850000E94C8480E9494497093010960930009EE |
:1078600080918D058823A9F06091F4087091F50846 |
:10787000882777FD8095982F0E94C74920912F096E |
:107880003091300940913109509132090E947F4A6C |
:107890002EC0E090F408F090F508688579858A8517 |
:1078A0009B850E94C74920911A0930911B0940917C |
:1078B0001C0950911D090E947F4A5B016C01002741 |
:1078C000F7FC0095102FC801B7010E94C74920910D |
:1078D0002F093091300940913109509132090E94AD |
:1078E0007F4A9B01AC01C601B5010E94C8480E94B5 |
:1078F00094497093F5086093F40860912A09709197 |
:107900002B09882777FD8095982F0E94C7497B0116 |
:107910008C0160912F09709130098091310990910B |
:1079200032099B01AC010E94C8489B01AC01C8010F |
:10793000B7010E947F4A7B018C01609147057091DD |
:1079400048058091490590914A050E94C7492091B8 |
:107950001A0930911B0940911C0950911D090E9480 |
:107960007F4A20E030E040E05FE30E947F4A9B01D5 |
:10797000AC01C801B7010E94C8480E9494497093A5 |
:107980002B0960932A098091000990910109909335 |
:107990003C0880933B088091F4089091F5089093FF |
:1079A0003E0880933D088091000990910109815023 |
:1079B000904434F080E090E49093010980930009B2 |
:1079C00080910009909101098050904C34F480E03E |
:1079D00090EC90930109809300098091F4089091B4 |
:1079E000F5088150904434F080E090E49093F508DD |
:1079F0008093F4088091F4089091F5088050904CA1 |
:107A000034F480E090EC9093F5088093F408809132 |
:107A10002A0990912B098150904434F080E090E441 |
:107A200090932B0980932A0980912A0990912B0920 |
:107A30008050904C34F480E090EC90932B0980932C |
:107A40002A09EC85FD85EE0FFF1FEE0FFF1FFD8756 |
:107A5000EC870E949D4520910309422F50E05F8BE7 |
:107A60004E8B2C853D85281B390B241735070CF4CC |
:107A70009A0180912909682F70E07D8B6C8B8B01B6 |
:107A8000000F111F000F111FC801805590403DA32A |
:107A90002CA38217930714F49DA38CA38CA19DA102 |
:107AA0009093200880931F0860912A0970912B09F8 |
:107AB0008091DE059091DF05A091E005B091E10590 |
:107AC00022E0880F991FAA1FBB1F2A95D1F7681BB8 |
:107AD000790BACA1BDA1A03AB1055CF4A69FC00191 |
:107AE000A79F900DB69F900D112460EA70E00E9450 |
:107AF000214B8CA19DA195958795861797070CF42E |
:107B0000BC01909581959F4F681779070CF4BC01D3 |
:107B1000C801ECA1FDA18E1B9F0B861797070CF4E3 |
:107B2000BC018CA19DA1801B910B1B0168177907DB |
:107B30000CF41C01809100099091010980907B0553 |
:107B400090907C058819990990930C0980930B09F2 |
:107B500040901A0950901B0960901C0970901D09F3 |
:107B600020E030E040E050E0C301B2010E94024A50 |
:107B70008823D1F16091E6057091E7058091E805D1 |
:107B80009091E9050E94C7495B016C0160912B054A |
:107B900070912C0580912D0590912E050E94C7496A |
:107BA000A30192010E947F4A7B018C01B4018827C6 |
:107BB00077FD8095982F0E94C7499B01AC01C801B1 |
:107BC000B7010E94C7489B01AC01C601B5010E94E4 |
:107BD000C8480E9494496093E6057093E705809336 |
:107BE000E8059093E9051CC020910B0930910C0920 |
:107BF000442737FD4095542F8091E6059091E70585 |
:107C0000A091E805B091E905820F931FA41FB51F4D |
:107C10008093E6059093E705A093E805B093E90506 |
:107C20008091E6059091E705A091E805B091E905FE |
:107C300081509A4FA040B04064F080E09AEFA0E0FD |
:107C4000B0E08093E6059093E705A093E805B09334 |
:107C5000E9058091E6059091E705A091E805B091CE |
:107C6000E90580509640AF4FBF4F64F480E096E046 |
:107C7000AFEFBFEF8093E6059093E705A093E8058B |
:107C8000B093E90560910B0970910C0980919D03F7 |
:107C900090919E03A0919F03B091A003888B998B34 |
:107CA000AA8BBB8B882777FD8095982F0E94C749A8 |
:107CB0007B018C016091E6057091E7058091E805F4 |
:107CC0009091E9050E94C7499B01AC0168897989B7 |
:107CD0008A899B890E947F4A9B01AC01C801B70138 |
:107CE0000E94C8480E9494497B018C016B01C1012C |
:107CF00037FE04C0882799278219930962E070E053 |
:107D00000E94214BACA1BDA16A0F7B1F882777FD84 |
:107D10008095982F2091AC0330E040E050E00E9425 |
:107D2000E24A20E430E040E050E00E94564B3F83BE |
:107D30002E83C216D3060CF497014E815F815095B5 |
:107D400041955F4F5F874E87241735070CF49A01E2 |
:107D50000CA11DA1020D131DC801820F931F64E029 |
:107D600070E00E94214B77FF03C060E070E006C026 |
:107D70008C899D89861797070CF4BC01AE89BF8951 |
:107D80006A177B070CF4BD016093F608C801821BDB |
:107D9000930B64E070E00E94214B77FF03C060E02A |
:107DA00070E006C0EC89FD89E617F7070CF4BF0107 |
:107DB0002E893F89621773070CF4B9016093FF089D |
:107DC0008091F4089091F50880907D0590907E0553 |
:107DD000881999099093F3088093F20820E030E025 |
:107DE00040E050E0C301B2010E94024A8823D1F171 |
:107DF0006091E2057091E3058091E4059091E505BD |
:107E00000E94C7495B016C01609133057091340594 |
:107E100080913505909136050E94C749A3019201D2 |
:107E20000E947F4A7B018C01B401882777FD8095F1 |
:107E3000982F0E94C7499B01AC01C801B7010E945D |
:107E4000C7489B01AC01C601B5010E94C8480E9409 |
:107E500094496093E2057093E3058093E405909361 |
:107E6000E5051CC02091F2083091F308442737FD46 |
:107E70004095542F8091E2059091E305A091E4058F |
:107E8000B091E505820F931FA41FB51F8093E205F3 |
:107E90009093E305A093E405B093E5058091E20596 |
:107EA0009091E305A091E405B091E50581509A4FCA |
:107EB000A040B04064F080E09AEFA0E0B0E0809392 |
:107EC000E2059093E305A093E405B093E505809166 |
:107ED000E2059091E305A091E405B091E50580509D |
:107EE0009640AF4FBF4F64F480E096E0AFEFBFEF36 |
:107EF0008093E2059093E305A093E405B093E50534 |
:107F00006091F2087091F308882777FD8095982F8B |
:107F10000E94C7497B018C016091E2057091E305E5 |
:107F20008091E4059091E5050E94C7499B01AC0151 |
:107F3000688979898A899B890E947F4A9B01AC0163 |
:107F4000C801B7010E94C8480E9494492E813F8110 |
:107F5000621773070CF49B010E851F850217130728 |
:107F60000CF489018CA19DA182199309800F911FA6 |
:107F700064E070E00E94214B77FF03C060E070E096 |
:107F800006C08C899D89861797070CF4BC01AE89C1 |
:107F9000BF896A177B070CF4BD0160932109ECA12E |
:107FA000FDA1E01BF10BCF018219930964E070E0A1 |
:107FB0000E94214B77FF03C060E070E006C02C896F |
:107FC0003D89261737070CF4B9014E895F8964177C |
:107FD000750754F4BA0108C00894C108D108D092BA |
:107FE0009403C09293034ECB60931E09A5960FB6DF |
:107FF000F894DEBF0FBECDBFDF91CF911F910F91DF |
:10800000FF90EF90DF90CF90BF90AF909F908F90B8 |
:108010007F906F905F904F903F902F90089584B124 |
:10802000806A84B93D9A82E58CBD1DBC459A91E079 |
:1080300090933E098AEA8093420983E8809343093A |
:108040008AE08093440910924609109245091092E3 |
:10805000480910924709109264099093650980932A |
:1080600066091092670983E0809368090895F8947F |
:1080700060912B0570912C0580912D0590912E0516 |
:108080002CE630E040E050E00E94564B3093460929 |
:108090002093450960913305709134058091350531 |
:1080A000909136052CE630E040E050E00E94564BBF |
:1080B000309348092093470960913409709135093C |
:1080C00080913609909137092BE035E040E050E08F |
:1080D0000E94564B30934E0920934D092091230561 |
:1080E000309124058091110990911209B9010E94E3 |
:1080F000214BCB01880F991F860F971F880F991F5F |
:10810000880F991F90934A098093490980912D09FE |
:1081100090912E09B9010E94214BCB01880F991F24 |
:10812000860F971F880F991F880F991F90934C09EE |
:1081300080934B0910922405109223051092120986 |
:108140001092110910922E0910922D098091440964 |
:108150008C3009F4E7C08D3030F48A3051F08B3028 |
:1081600009F002C16EC08D30D9F18E3009F0FCC02B |
:10817000EBC080919205809355098091930580937F |
:1081800056098091940580935709809195058093B5 |
:10819000580980919605809359098091970580939D |
:1081A0005A098091980580935B0980919905809385 |
:1081B0005C098091A80580935D09837F8093A80561 |
:1081C000809111039091120380935E098091B3080E |
:1081D00080935F09A2E0B0E00E94A84B802D2EC0E2 |
:1081E0008091D308809355098091D40880935609D3 |
:1081F0008091D508809357098091D60880935809BB |
:108200008091D708809359098091D80880935A09A2 |
:108210008091D90880935B098091DA0880935C098A |
:108220008091DD0880935D098091DB0880935E0971 |
:108230008091DC0880935F098091DE08809360095B |
:1082400093C0E0919D08F0E0EE0FFF1FE359F74F58 |
:108250000190F081E02D2FEFE138F20714F4E1E80E |
:10826000FFEFE038F10514F0EFE7F0E0E093550997 |
:10827000E0919E08F0E0EE0FFF1FE359F74F0190E9 |
:10828000F081E02D6FEFE138F60714F4E1E8FFEF3D |
:10829000E038F10514F0EFE7F0E0E0935609E091E3 |
:1082A0009C08F0E0EE0FFF1FE359F74F0190F081BB |
:1082B000E02D8FEFE138F80714F4E1E8FFEFE03844 |
:1082C000F10514F0EFE7F0E0E0935709E0919B0827 |
:1082D000F0E0EE0FFF1FE359F74F0190F081E02D22 |
:1082E0002FEFE138F20714F4E1E8FFEFE038F10591 |
:1082F00014F0EFE7F0E0E093580980917205809365 |
:1083000059098091740580935A098091760580936C |
:108310005B098091780580935C0980917A05809350 |
:108320005D0922C080916A07863018F010926A07B2 |
:1083300085E08093550980918405909185059093FF |
:1083400058098093570910C0809165098093550999 |
:108350008091660980935609809167098093570937 |
:1083600080916809809358097894809164098823E2 |
:1083700009F478C040916A0950916B09CA01815093 |
:108380009E4F8F5F9340B0F420916C0930916D093E |
:10839000C90181509E4F8F5F934060F48091A30884 |
:1083A00085FF08C0509315064093140630931706B6 |
:1083B00020931606809170099091710921E0893609 |
:1083C000920724F490936805809367058091670570 |
:1083D000909168052091690530916A05845E9D4FF2 |
:1083E000821B930B68E671E00E94214B845B9040F6 |
:1083F00090936C0580936B052091740930917509F9 |
:108400008091DD049091DE048217930740F48091FF |
:108410006A07882321F43093DE042093DD048091E1 |
:108420006909843679F0873629F580917609809339 |
:10843000A109809177098093A3098091780980939D |
:10844000A20908958091760990E090939E09809307 |
:108450009D0980917809909179099093A009809362 |
:108460009F0908951092150610921406109217068F |
:1084700010921606089580913E09882309F43BC0A6 |
:10848000459882E499E09093400980933F09909148 |
:10849000F205E92FF0E0E155FC4F8081809344091B |
:1084A0009F5F9093F205963010F01092F2051092B3 |
:1084B0003E090E94374081E080934109000000009E |
:1084C00000000000000000000000000000000000AC |
:1084D000000000000000000000000000000000009C |
:1084E0000000000000000000000000008091420930 |
:1084F000809361098EBD089580913E09882309F01B |
:108500007CC00DB407FE79C084E08093DF04459AF7 |
:108510002EB58091F405813069F0813018F08230F9 |
:10852000C9F513C0109263092093F305213891F522 |
:1085300081E008C0253541F58091F3058B5A809381 |
:10854000F30582E08093F40525C080916309E82F4C |
:10855000F0E0ED57F64F20838F5F80936309909191 |
:10856000F3058A31A0F0291769F4A9E6B9E0E3E838 |
:10857000F9E08AE101900D928150E1F781E080936A |
:10858000640902C0109264091092F40503C0920FAE |
:108590009093F30520914109203208F028C04598B6 |
:1085A00000000000000000000000000000000000CB |
:1085B00000000000000000000000000000000000BB |
:1085C00000000000000000000000000000000000AB |
:1085D000E0913F09F0914009E20FF11D80818EBDCD |
:1085E000808190916109890F8093610903C081E0C6 |
:1085F00080933E092F5F20934109089587B18C60D5 |
:1086000087B9429843981092F90580E88093B503A2 |
:108610001092FA058093B603089540918305442390 |
:1086200089F58091CE0883FF2AC080919D08E82FAC |
:10863000F0E0EE0FFF1FE359F74F808191818C5AD4 |
:108640009F4F04F18081918180359105DCF4809108 |
:108650009E08E82FF0E0EE0FFF1FE359F74F8081EF |
:108660009181855B9F4F1CF481E08093FB058081A5 |
:1086700091818C34910534F01092FB0503C081E0A8 |
:108680008093FB058091CE08282F82FF02C0409383 |
:10869000FB058091FC0581508093FC058F3F09F01C |
:1086A00076C084E08093FC0524FF0DC02091110367 |
:1086B000309112038091B30890E0281739071CF419 |
:1086C00082E08093FC058091D0088B3F80F0809100 |
:1086D0001309873E28F08091CF0888231CF124C01D |
:1086E0008A3028F48091CF088823F4F01BC0809151 |
:1086F000F90581508093F9058F3FB9F480911309F2 |
:1087000081508093F9058091B503813011F480E8A0 |
:1087100001C086958093B5038091CF089091B503F1 |
:10872000892311F0429A01C042988091D2088B3F70 |
:1087300080F080912809873E28F08091D108882315 |
:108740001CF124C08A3028F48091D1088823F4F0E9 |
:108750001BC08091FA0581508093FA058F3FB9F4D0 |
:108760008091280981508093FA058091B603813069 |
:1087700011F480E801C086958093B6038091D108FA |
:108780009091B603892311F0439A01C043988091D8 |
:10879000FB05882311F4429843980895EF92FF92C5 |
:1087A0000F931F93CF93DF9380918305882309F460 |
:1087B00069C1E090FD05F090FE05F0920006E092A0 |
:1087C000FF0580919D08C82FD0E0FE01EE0FFF1F2E |
:1087D000E359F74F0190F081E02D809101069091CF |
:1087E0000206E81BF90BF093A509E093A409EE9F9C |
:1087F000C001EF9F900DFE9F900D11241E161F06C5 |
:108800003CF466E970E00E94214BE60FF71F06C0BA |
:1088100066E970E00E94214BE61BF70BF093A50977 |
:10882000E093A409C701880F991F2091A4093091F2 |
:10883000A509820F931F63E070E00E94214B9B010A |
:108840007093FE056093FD05E0910306F091040628 |
:108850008B010E0F1F1F80910506853009F45EC045 |
:10886000863048F4833079F1843008F04EC082308D |
:1088700009F038C10AC0873009F4AAC0873008F46B |
:108880008EC0883009F02EC1D3C046E0E416F10452 |
:108890000CF428C1C701861B970B9C018091B80876 |
:1088A00090E0281739070CF41DC1F0920406E092FD |
:1088B000030683E08093050689E190E09093B90375 |
:1088C0008093B8030FC18091B8039091B9030197C9 |
:1088D0009093B9038093B803892B39F4109204065E |
:1088E0001092030682E0809305062B5F3F4F2B30EA |
:1088F000310548F48091A30880FF02C087E001C0E1 |
:1089000084E0809305068F01EDC08091B90890E066 |
:10891000081719070CF0E6C08C01E4C08091CE085E |
:1089200086FF28C0CC0FDD1FC359D74F888199819E |
:108930008C5A9F4F3CF084E690E09093B90380936B |
:10894000B80318C08091B8039091B9030197909330 |
:10895000B9038093B803892B69F482E080930506FC |
:10896000109204061092030684EF91E09093DE04C7 |
:108970008093DD048091B90890E0081719070CF482 |
:108980008C012C5F3F4F2930310508F0ABC089E1E5 |
:1089900090E09093B9038093B80386E016C0CB01B2 |
:1089A0000496099788F4E616F70671F48091B803E7 |
:1089B0009091B90301979093B9038093B803892BE1 |
:1089C00009F090C087E001C085E0809305068AC069 |
:1089D0008091FF049091000590930706809306060E |
:1089E00060916305709164058091650590916605BD |
:1089F00020E830E040E050E00E94564B30930906FA |
:108A00002093080610920B0610920A0610920D068B |
:108A100010920C0610920F0610920E06109210067D |
:108A200010921106109212061092130688E021C0CF |
:108A3000CB0177FF04C088279927861B970B0697E1 |
:108A40000CF450C080910E0690910F0664E070E027 |
:108A50000E94214BCF01861B970B909304068093B5 |
:108A600003068901080F191F10920D0610920C06BB |
:108A700085E08093050684EF91E09093DE04809377 |
:108A8000DD0430C080910506882319F08130E9F4B7 |
:108A900009C08091B70381508093B7038F3F01F5E0 |
:108AA00081E01CC0E0919D08F0E0EE0FFF1FE3594C |
:108AB000F74F808191819093020680930106855B38 |
:108AC0009F4F5CF41092BA0308C0109204061092F3 |
:108AD00003061092FE051092FD0582E080930506C4 |
:108AE00000E010E0809103069091040697FF04C017 |
:108AF0001092040610920306980117FF02C020E0AE |
:108B000030E08091FD059091FE059093460880939A |
:108B1000450830934A0820934908809103069091B4 |
:108B2000040690934C0880934B08C901DF91CF91C4 |
:108B30001F910F91FF90EF9008959F92AF92BF9277 |
:108B4000CF92DF92EF92FF920F931F93CF93DF9319 |
:108B500080910506883009F01EC180916D0588233B |
:108B600009F019C1E090FF04F0900005809106061D |
:108B700090910706E81AF90A0091A3038091BA08B8 |
:108B800090E09C012E9DC0012F9D900D3E9D900D6B |
:108B9000112464E070E00E94214B9B01442737FDC3 |
:108BA0004095542F8091100690911106A0911206C5 |
:108BB000B0911306280F391F4A1F5B1F2093100620 |
:108BC000309311064093120650931306213462E449 |
:108BD00036076FE0460760E056072CF080E492E429 |
:108BE000AFE0B0E009C0205C3D4B404F5F4F64F404 |
:108BF00080EC9DEBA0EFBFEF8093100690931106E1 |
:108C0000A0931206B0931306A0901006B090110620 |
:108C1000C0901206D09013069090A103C0910A064E |
:108C2000D0910B0660916305709164058091650594 |
:108C30009091660520E830E040E050E00E94564BFD |
:108C4000CA01B9012091080630910906442737FD71 |
:108C50004095542F621B730B840B950B2091A4033A |
:108C600030E040E050E00E94E24A20E230E040E0A4 |
:108C700050E00E94564BC9013093A5092093A409E6 |
:108C800021E0893192071CF088E191E005C0885EFF |
:108C90009E4F34F488EE9EEF9093A5098093A4092B |
:108CA000802F90E0AC014E9DC0014F9D900D5E9DC8 |
:108CB000900D112464E070E00E94214B8B01C601ED |
:108CC000B50120EA3FE040E050E00E94564B020F21 |
:108CD000131F97012C1B3D0B892D90E0BC01269F93 |
:108CE000C001279F900D369F900D112462E070E027 |
:108CF0000E94214B8091A4099091A509680F791FCA |
:108D0000600F711F8091A80890E09C01629FC001D4 |
:108D1000639F900D729F900D11246AE070E00E9495 |
:108D2000214B8091A60890E0880F991F880F991F0A |
:108D30008617970714F4EC0109C044275527481BF0 |
:108D4000590BEB01641775070CF4EA01D0930D067B |
:108D5000C0930C06F0920B06E0920A0620910E06D4 |
:108D600030910F06AE01421B530B8091BB0890E07F |
:108D7000BC01469FC001479F900D569F900D112446 |
:108D800064E670E00E94214B260F371F30930F06D8 |
:108D900020930E0602C0C0E0D0E0609110067091F2 |
:108DA0001106809112069091130620EA3FE040E000 |
:108DB00050E00E94564B30934E0820934D08D093BC |
:108DC0004808C0934708CE01DF91CF911F910F91C2 |
:108DD000FF90EF90DF90CF90BF90AF909F9008955D |
:108DE00080911C0690911D06A0911E06B0911F0651 |
:108DF0008093240690932506A0932606B093270619 |
:108E00008091200690912106A0912206B091230620 |
:108E10008093280690932906A0932A06B0932B06E8 |
:108E200008951092150610921406109217061092CB |
:108E300016060895A8E0B0E0E0E2F7E40C947B4B5E |
:108E40007B018C01611571058105910519F482E0A2 |
:108E500089835AC083E089838EE1C82ED12CDC82BD |
:108E6000CB82ED82FE820F831887C801B7010E9472 |
:108E70008D47BC016150704077FF33C0EE27FF275C |
:108E8000E61BF70B20E030E040E050E081E090E0AE |
:108E9000A0E0B0E00E2E04C0880F991FAA1FBB1FD0 |
:108EA0000A94D2F70197A109B1098E219F21A0232D |
:108EB000B1230097A105B10521F021E030E040E0A9 |
:108EC00050E004C016950795F794E794EA95D2F719 |
:108ED0002E293F29402B512B2D833E834F835887CA |
:108EE0000FC06115710581F0062E04C0EE0CFF1C49 |
:108EF000001F111F0A94D2F7ED82FE820F8318879C |
:108F0000C61AD70ADC82CB821A82CE0101960E9451 |
:108F1000DA47E8E028960C94974BEF92FF920F9374 |
:108F20001F939B01AC01203080E0380781E04807A7 |
:108F300080E0580780F42F3F31054105510509F0C5 |
:108F400020F4EE24FF24870119C068E0E62EF12CFE |
:108F5000012D112D13C0203080E0380780E0480734 |
:108F600081E0580730F490E1E92EF12C012D112D0C |
:108F700005C088E1E82EF12C012D112D80E290E052 |
:108F8000A0E0B0E08E199F09A00BB10B04C056956C |
:108F9000479537952795EA94D2F7F901E554FC4FA8 |
:108FA0002081821B9109A109B1091F910F91FF90A6 |
:108FB000EF9008959F92AF92BF92CF92DF92EF927F |
:108FC000FF920F931F93EE24FF248701FC0124815D |
:108FD00035814681578191808081823010F44061D3 |
:108FE000A2C0843009F49BC0823029F420E030E034 |
:108FF00040E050E005C0211531054105510519F447 |
:10900000E0E0F0E092C0828193816FEF82389607B2 |
:109010000CF05AC062E87FEF681B790B6A3171056A |
:109020002CF020E030E040E050E02AC0AA24BB242D |
:10903000650181E090E0A0E0B0E0062E04C0880F5A |
:10904000991FAA1FBB1F0A94D2F70197A109B10962 |
:1090500082239323A423B5230097A105B10529F00A |
:1090600071E0A72EB12CC12CD12C04C05695479588 |
:10907000379527956A95D2F72A293B294C295D29EE |
:10908000DA01C9018F779070A070B07080349105BB |
:10909000A105B10539F427FF09C0205C3F4F4F4FB0 |
:1090A0005F4F04C0215C3F4F4F4F5F4F80E090E027 |
:1090B000203060E0360760E0460760E4560710F0B5 |
:1090C00081E090E0FC0123C08038910544F5FC016B |
:1090D000E158FF4FDA01C9018F779070A070B0702E |
:1090E00080349105A105B10539F427FF09C0205C42 |
:1090F0003F4F4F4F5F4F04C0215C3F4F4F4F5F4F7B |
:1091000057FF05C05695479537952795319687E0C7 |
:1091100056954795379527958A95D1F706C020E053 |
:1091200030E040E050E0EFEFF0E0E22EF32E942F3D |
:109130009F77802F8078892B9E2F979599279795D9 |
:109140008F77082F092B9E2F9695812F8078892B5A |
:109150009794992497948F77182F1929C801B701EC |
:109160001F910F91FF90EF90DF90CF90BF90AF9045 |
:109170009F900895FC014150504030F00190061638 |
:10918000D1F73197CF01089588279927089550582E |
:10919000BB27AA270ED079C16AD130F06FD120F059 |
:1091A00031F49F3F11F41EF45FC10EF4E095E7FB2C |
:1091B00055C1E92F7BD180F3BA1762077307840783 |
:1091C000950718F071F49EF593C10EF4E0950B2EFF |
:1091D000BA2FA02D0B01B90190010C01CA01A00109 |
:1091E0001124FF27591B99F0593F50F4503E68F164 |
:1091F0001A16F040A22F232F342F4427585FF3CFA5 |
:10920000469537952795A795F0405395C9F77EF475 |
:109210001F16BA0B620B730B840BBAF09150A1F0BE |
:10922000FF0FBB1F661F771F881FC2F70EC0BA0F44 |
:10923000621F731F841F48F4879577956795B795CC |
:10924000F7959E3F08F0B3CF9395880F08F09927C4 |
:10925000EE0F9795879508950CD017C10FD140F068 |
:1092600006D130F021F45F3F19F0F8C0511141C12F |
:10927000FBC01CD198F39923C9F35523B1F3951B77 |
:10928000550BBB27AA2762177307840738F09F5F27 |
:109290005F4F220F331F441FAA1FA9F333D00E2E96 |
:1092A0003AF0E0E830D091505040E695001CCAF703 |
:1092B00029D0FE2F27D0660F771F881FBB1F2617C8 |
:1092C00037074807AB07B0E809F0BB0B802DBF019B |
:1092D000FF2793585F4F2AF09E3F510568F0BEC0AC |
:1092E00008C15F3FECF3983EDCF386957795679570 |
:1092F000B795F7959F5FC9F7880F911D969587954C |
:1093000097F90895E1E0660F771F881FBB1F62176A |
:1093100073078407BA0720F0621B730B840BBA0B28 |
:10932000EE1F88F7E095089504D06894B111E1C06C |
:109330000895C4D088F09F5790F0B92F9927B7515E |
:10934000A0F0D1F0660F771F881F991F1AF0BA9509 |
:10935000C9F712C0B13081F0CBD0B1E00895C8C0D8 |
:10936000672F782F8827B85F39F0B93FCCF38695FF |
:1093700077956795B395D9F73EF49095809570955C |
:1093800061957F4F8F4F9F4F0895E89409C097FBD9 |
:109390003EF490958095709561957F4F8F4F9F4FCC |
:1093A0009923A9F0F92F96E9BB279395F695879510 |
:1093B00077956795B795F111F8CFFAF4BB0F11F4D3 |
:1093C00060FF1BC06F5F7F4F8F4F9F4F16C088237A |
:1093D00011F096E911C0772321F09EE8872F762FB0 |
:1093E00005C0662371F096E8862F70E060E02AF0F1 |
:1093F0009A95660F771F881FDAF7880F96958795DD |
:1094000097F9089507D008F481E0089503D008F48F |
:109410008FEF0895990F0008550FAA0BE0E8FEEFB3 |
:1094200016161706E807F907C0F012161306E40728 |
:10943000F50798F0621B730B840B950B39F40A2621 |
:1094400061F0232B242B252B21F408950A2609F4FF |
:10945000A140A6958FEF811D811D089597F99F6703 |
:1094600080E870E060E008959FEF80EC08950024AC |
:109470000A941616170618060906089500240A9479 |
:1094800012161306140605060895092E0394000CFF |
:1094900011F4882352F0BB0F40F4BF2B11F460FF8E |
:1094A00004C06F5F7F4F8F4F9F4F089557FD9058B7 |
:1094B000440F551F59F05F3F71F04795880F97FB98 |
:1094C000991F61F09F3F79F0879508951216130652 |
:1094D0001406551FF2CF4695F1DF08C01616170681 |
:1094E0001806991FF1CF86957105610508940895B6 |
:1094F000E894BB2766277727CB0197F908950BD00F |
:10950000C4CFB5DF28F0BADF18F0952309F0A6CF55 |
:10951000ABCF1124EECFCADFA0F3959FD1F3950F07 |
:1095200050E0551F629FF001729FBB27F00DB11DE7 |
:10953000639FAA27F00DB11DAA1F649F6627B00D77 |
:10954000A11D661F829F2227B00DA11D621F739F60 |
:10955000B00DA11D621F839FA00D611D221F749F6E |
:109560003327A00D611D231F849F600D211D822FB5 |
:10957000762F6A2F11249F5750408AF0E1F08823FC |
:109580004AF0EE0FFF1FBB1F661F771F881F915009 |
:109590005040A9F79E3F510570F060CFAACF5F3FC2 |
:1095A000ECF3983EDCF3869577956795B795F7953C |
:1095B000E7959F5FC1F7FE2B880F911D96958795C4 |
:1095C00097F90895629FD001739FF001829FE00D8B |
:1095D000F11D649FE00DF11D929FF00D839FF00D32 |
:1095E000749FF00D659FF00D9927729FB00DE11DDE |
:1095F000F91F639FB00DE11DF91FBD01CF011124BB |
:109600000895991B79E004C0991F961708F0961BDE |
:10961000881F7A95C9F780950895AA1BBB1B51E155 |
:1096200007C0AA1FBB1FA617B70710F0A61BB70BD2 |
:10963000881F991F5A95A9F780959095BC01CD0177 |
:10964000089597FB092E07260AD077FD04D0E5DFA1 |
:1096500006D000201AF4709561957F4F0895F6F7B3 |
:10966000909581959F4F0895A1E21A2EAA1BBB1BCE |
:10967000FD010DC0AA1FBB1FEE1FFF1FA217B307DE |
:10968000E407F50720F0A21BB30BE40BF50B661FF4 |
:10969000771F881F991F1A9469F7609570958095B8 |
:1096A00090959B01AC01BD01CF01089597FB092E58 |
:1096B00005260ED057FD04D0D7DF0AD0001C38F4A1 |
:1096C00050954095309521953F4F4F4F5F4F0895EE |
:1096D000F6F790958095709561957F4F8F4F9F4FCE |
:1096E00008952F923F924F925F926F927F928F9246 |
:1096F0009F92AF92BF92CF92DF92EF92FF920F9321 |
:109700001F93CF93DF93CDB7DEB7CA1BDB0B0FB62A |
:10971000F894DEBF0FBECDBF09942A8839884888E7 |
:109720005F846E847D848C849B84AA84B984C8847D |
:10973000DF80EE80FD800C811B81AA81B981CE0F74 |
:10974000D11D0FB6F894DEBF0FBECDBFED01089559 |
:10975000F999FECFB2BDA1BDF89A119600B4089553 |
:10976000F999FECFB2BDA1BD00BC11960FB6F89419 |
:0A977000FA9AF99A0FBE0895FFCF90 |
:10977A000A010101FF6401C800496E7465677261DC |
:10978A006C4E69636B20202020496E746567726194 |
:10979A006C526F6C6C202020204163634E69636BAE |
:1097AA00202020202020202020416363526F6C6CEF |
:1097BA002020202020202020204779726F476965C9 |
:1097CA00722020202020202020486F6568656E576F |
:1097DA006572742020202020204163635A202020B3 |
:1097EA0020202020202020202047617320202020B4 |
:1097FA002020202020202020204B6F6D7061737361 |
:10980A0056616C7565202020205370616E6E756EEE |
:10981A00672020202020202020456D7066616E6719 |
:10982A0020202020202020202045727361747A6B2A |
:10983A006F6D706173732020204D6F746F725F5665 |
:10984A006F726E6520202020204D6F746F725F4802 |
:10985A00696E74656E202020204D6F746F725F4CA4 |
:10986A00696E6B7320202020204D6F746F725F52D7 |
:10987A006563687473202020202020202020202067 |
:10988A0020202020202020202044697374616E63E8 |
:10989A006520202020202020204F736442617220FE |
:1098AA002020202020202020204D4B334D6167208E |
:1098BA0043616C537461746520536572766F20201E |
:1098CA002020202020202020204E69636B20202089 |
:1098DA00202020202020202020526F6C6C20202065 |
:1098EA00202020202020202020202020202020206E |
:1098FA00202020202020202020202020202020205E |
:10990A00202020202020202020202020202020204D |
:10991A00202020202020202020537469636B566168 |
:10992A006C7565202020202020416C746974756450 |
:10993A0065204E2020202020205069746368436FE0 |
:10994A00756E7420202020202050697463684F6649 |
:10995A00667365742020202020496E7465677261E1 |
:10996A006C416C7420202020204750535F526F6C4A |
:10997A006C20202020202020202800FFFF64008067 |
:10998A00016400007D0000FF037373730102030486 |
:10999A0005060708090A48616C6C6F2057656C74E4 |
:1099AA0000000000000000000000000000000000AD |
:1099BA00000000000000000000000000000000009D |
:1099CA00000000000000000000000000000000008D |
:1099DA00000000000000000000000000000000007D |
:1099EA000000000000000B01426567696E6E657237 |
:1099FA0000004E6F726D616C000053706F727400DC |
:109A0A00006400F40190D0030090D0030017B7D18E |
:109A1A003830FB103A409696020A644664ECFF0A14 |
:109A2A000B0D0B0C0E0101191900010001020203B2 |
:109A3A0003030304040404040404040505050505DA |
:109A4A0005050505050505050505050606060606B7 |
:109A5A00060606060606060606060606060606069C |
:109A6A000606060606060606060606070707070787 |
:109A7A00070707070707070707070707070707076C |
:109A8A00070707070707070707070707070707075C |
:109A9A00070707070707070707070707070707074C |
:109AAA000707070707070707070707080808080837 |
:109ABA00080808080808080808080808080808081C |
:109ACA00080808080808080808080808080808080C |
:109ADA0008080808080808080808080808080808FC |
:109AEA0008080808080808080808080808080808EC |
:109AFA0008080808080808080808080808080808DC |
:109B0A0008080808080808080808080808080808CB |
:109B1A0008080808080808080808080808080808BB |
:0C9B2A00080808080808080808080800D7 |
:00000001FF |
/branches/thjac/V1_10/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_10/Settings.h |
---|
--- thjac/V1_10/_Settings.h (nonexistent) |
+++ thjac/V1_10/_Settings.h (revision 1112) |
@@ -0,0 +1,44 @@ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Abstimmung |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define ACC_AMPLIFY 12 |
+#define FAKTOR_P 1 |
+#define FAKTOR_I 0.0001 |
+ |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Debug-Interface |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define SIO_DEBUG 1 // Soll der Debugger aktiviert sein? |
+#define MIN_DEBUG_INTERVALL 250 // in diesem Intervall werden 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_10/analog.c |
---|
0,0 → 1,191 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_ax, Aktuell_ay,Aktuell_az, UBat = 100; |
volatile int AdWertNick = 0, AdWertRoll = 0, AdWertGier = 0; |
volatile int AdWertAccRoll = 0,AdWertAccNick = 0,AdWertAccHoch = 0; |
volatile char MessanzahlNick = 0, MessanzahlRoll = 0, MessanzahlGier = 0; |
volatile char messanzahl_AccNick = 0, messanzahl_AccRoll = 0, messanzahl_AccHoch = 0; |
volatile long Luftdruck = 32000; |
volatile int StartLuftdruck; |
volatile unsigned int MessLuftdruck = 1023; |
unsigned char DruckOffsetSetting; |
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; |
int airPressure = 0; |
//####################################################################################### |
// |
void ADC_Init(void) |
//####################################################################################### |
{ |
ADMUX = 0;//Referenz ist extern |
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADIE); |
//Free Running Mode, Division Factor 128, Interrupt on |
} |
void SucheLuftruckOffset(void) |
{ |
unsigned int off; |
off = eeprom_read_byte(&EEPromArray[EEPROM_ADR_LAST_OFFSET]); |
if(off > 20) off -= 10; |
OCR0A = off; |
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; |
GyroDefektN = 0; GyroDefektR = 0; GyroDefektG = 0; |
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); |
messanzahl_Druck = 0; |
ANALOG_ON; |
while(messanzahl_Druck == 0); |
if(i<10) Delay_ms_Mess(10); |
} |
Delay_ms_Mess(70); |
} |
//####################################################################################### |
// |
SIGNAL(SIG_ADC) |
//####################################################################################### |
{ |
static unsigned char kanal=0,state = 0; |
static unsigned int gier1, roll1, nick1; |
ANALOG_OFF; |
switch(state++) |
{ |
case 0: |
gier1 = ADC; |
kanal = 1; |
ZaehlMessungen++; |
break; |
case 1: |
roll1 = ADC; |
kanal = 2; |
break; |
case 2: |
nick1 = ADC; |
kanal = 4; |
break; |
case 3: |
UBat = (3 * UBat + ADC / 3) / 4;//(UBat + ((ADC * 39) / 256) + 19) / 2; |
kanal = 6; |
break; |
case 4: |
Aktuell_ay = NeutralAccY - ADC; |
AdWertAccRoll = Aktuell_ay; |
kanal = 7; |
break; |
case 5: |
Aktuell_ax = ADC - NeutralAccX; |
AdWertAccNick = Aktuell_ax; |
kanal = 0; |
break; |
case 6: |
if(PlatinenVersion == 10) AdWertGier = (ADC + gier1) / 2; |
else |
if(PlatinenVersion == 20) AdWertGier = 1023 - (ADC + gier1); |
else AdWertGier = ADC + gier1; |
kanal = 1; |
break; |
case 7: |
if(PlatinenVersion == 10) AdWertRoll = (ADC + roll1) / 2; |
else AdWertRoll = ADC + roll1; |
kanal = 2; |
break; |
case 8: |
if(PlatinenVersion == 10) AdWertNick = (ADC + nick1) / 2; |
else AdWertNick = ADC + nick1; |
//AdWertNick = 0; |
//AdWertNick += Poti2; |
kanal = 5; |
break; |
case 9: |
AdWertAccHoch = (signed int) ADC - NeutralAccZ; |
// AdWertAccHoch += abs(Aktuell_ay) / 4 + abs(Aktuell_ax) / 4; |
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 = 3; |
break; |
case 10: |
tmpLuftdruck += ADC; |
if(++messanzahl_Druck >= 5) { |
MessLuftdruck = ADC; |
messanzahl_Druck = 0; |
Luftdruck = (tmpLuftdruck + 3 * Luftdruck) / 4; |
airPressure = StartLuftdruck - Luftdruck; |
tmpLuftdruck = 0; |
DebugOut.Analog[5] = airPressure; |
} |
kanal = 0; |
state = 0; |
break; |
default: |
kanal = 0; |
state = 0; |
break; |
} |
ADMUX = kanal; |
if(state != 0) ANALOG_ON; |
} |
/branches/thjac/V1_10/analog.h |
---|
0,0 → 1,29 |
/*####################################################################################### |
#######################################################################################*/ |
extern volatile int UBat; |
extern volatile int AdWertNick, AdWertRoll, AdWertGier; |
extern volatile int AdWertAccRoll,AdWertAccNick,AdWertAccHoch; |
extern volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_ax, Aktuell_ay,Aktuell_az; |
extern volatile long Luftdruck; |
extern volatile char messanzahl_Druck; |
extern volatile unsigned int ZaehlMessungen; |
extern unsigned char DruckOffsetSetting; |
extern 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 int airPressure; |
unsigned int ReadADC(unsigned char adc_input); |
void ADC_Init(void); |
void SucheLuftruckOffset(void); |
void SucheGyroOffset(void); |
#define ANALOG_OFF ADCSRA=0 |
#define ANALOG_ON ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADIE) |
/branches/thjac/V1_10/eeprom.c |
---|
0,0 → 1,218 |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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 = 80; // 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 = 10; // 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.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 = 7; // zur freien Verwendung |
EE_Parameter.UserParam2 = 2; // zur freien Verwendung |
EE_Parameter.UserParam3 = 0; // zur freien Verwendung |
EE_Parameter.UserParam4 = 0; // zur freien Verwendung |
EE_Parameter.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.AchsGegenKopplung1 = 5; |
EE_Parameter.WinkelUmschlagNick = 85; |
EE_Parameter.WinkelUmschlagRoll = 85; |
EE_Parameter.GyroAccAbgleich = 16; // 1/k |
EE_Parameter.Driftkomp = 4; |
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.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 = 60; |
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 = 80; // 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 = 10; // 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.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 = 7; // zur freien Verwendung |
EE_Parameter.UserParam2 = 2; // zur freien Verwendung |
EE_Parameter.UserParam3 = 0; // zur freien Verwendung |
EE_Parameter.UserParam4 = 0; // zur freien Verwendung |
EE_Parameter.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; // Faktor, mit dem Gier die Achsen Roll und Nick verkoppelt |
EE_Parameter.AchsGegenKopplung1 = 5; |
EE_Parameter.WinkelUmschlagNick = 85; |
EE_Parameter.WinkelUmschlagRoll = 85; |
EE_Parameter.GyroAccAbgleich = 32; // 1/k |
EE_Parameter.Driftkomp = 4; |
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.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 = 60; |
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 = 80; // 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 = 10; // 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.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 = 7; // zur freien Verwendung |
EE_Parameter.UserParam2 = 2; // zur freien Verwendung |
EE_Parameter.UserParam3 = 0; // zur freien Verwendung |
EE_Parameter.UserParam4 = 0; // zur freien Verwendung |
EE_Parameter.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; // Faktor, mit dem Gier die Achsen Roll und Nick verkoppelt |
EE_Parameter.AchsGegenKopplung1 = 5; |
EE_Parameter.WinkelUmschlagNick = 85; |
EE_Parameter.WinkelUmschlagRoll = 85; |
EE_Parameter.GyroAccAbgleich = 32; // 1/k |
EE_Parameter.Driftkomp = 4; |
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.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 = 60; |
memcpy(EE_Parameter.Name, "Beginner\0", 12); |
} |
/branches/thjac/V1_10/fc.c |
---|
0,0 → 1,1324 |
/*####################################################################################### |
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 "eeprom.c" |
unsigned char h,m,s; |
volatile unsigned int I2CTimeout = 100; |
volatile int MesswertNick,MesswertRoll,MesswertGier,MesswertGierBias; |
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; |
volatile int KompassValue = 0; |
volatile int KompassStartwert = 0; |
volatile 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; |
float GyroFaktor; |
float IntegralFaktor; |
volatile int DiffNick,DiffRoll; |
int Poti1 = 0, Poti2 = 0, Poti3 = 0, Poti4 = 0; |
volatile unsigned char Motor_Vorne,Motor_Hinten,Motor_Rechts,Motor_Links, Count; |
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; |
unsigned char Looping_Nick = 0,Looping_Roll = 0; |
unsigned char Looping_Links = 0, Looping_Rechts = 0, Looping_Unten = 0, Looping_Oben = 0; |
unsigned char Parameter_Luftdruck_D = 48; // Wert : 0-250 |
unsigned char Parameter_MaxHoehe = 251; // Wert : 0-250 |
unsigned char Parameter_Hoehe_P = 16; // Wert : 0-32 |
unsigned char Parameter_Hoehe_ACC_Wirkung = 58; // Wert : 0-250 |
unsigned char Parameter_KompassWirkung = 64; // Wert : 0-250 |
unsigned char Parameter_Gyro_P = 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 = 0; |
unsigned char Parameter_AchsGegenKopplung1 = 0; |
unsigned char Parameter_DynamicStability = 100; |
unsigned char Parameter_J16Bitmask; // for the J16 Output |
unsigned char Parameter_J16Timing; // for the J16 Output |
unsigned char Parameter_J17Bitmask; // for the J17 Output |
unsigned char Parameter_J17Timing; // for the J17 Output |
unsigned char Parameter_NaviGpsModeControl; // Parameters for the Naviboard |
unsigned char Parameter_NaviGpsGain; |
unsigned char Parameter_NaviGpsP; |
unsigned char Parameter_NaviGpsI; |
unsigned char Parameter_NaviGpsD; |
unsigned char Parameter_NaviGpsACC; |
unsigned char Parameter_NaviOperatingRadius; |
unsigned char Parameter_NaviWindCorrection; |
unsigned char Parameter_NaviSpeedCompensation; |
unsigned char Parameter_ExternalControl; |
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; |
unsigned char MikroKopterFlags = 0; |
void Piep(unsigned char Anzahl) |
{ |
while(Anzahl--) |
{ |
if(MotorenEin) return; //auf keinen Fall im Flug! |
beeptime = 100; |
Delay_ms(250); |
} |
} |
//############################################################################ |
// Nullwerte ermitteln |
void SetNeutral(void) |
//############################################################################ |
{ |
NeutralAccX = 0; |
NeutralAccY = 0; |
NeutralAccZ = 0; |
AdNeutralNick = 0; |
AdNeutralRoll = 0; |
AdNeutralGier = 0; |
AdNeutralGierBias = 0; |
Parameter_AchsKopplung1 = 0; |
Parameter_AchsGegenKopplung1 = 0; |
ExpandBaro = 0; |
CalibrierMittelwert(); |
Delay_ms_Mess(100); |
CalibrierMittelwert(); |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
{ |
if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
} |
AdNeutralNick= AdWertNick; |
AdNeutralRoll= AdWertRoll; |
AdNeutralGier= AdWertGier; |
AdNeutralGierBias = AdWertGier; |
StartNeutralRoll = AdNeutralRoll; |
StartNeutralNick = AdNeutralNick; |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) > 4) |
{ |
NeutralAccY = abs(Mittelwert_AccRoll) / ACC_AMPLIFY; |
NeutralAccX = abs(Mittelwert_AccNick) / 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]); |
} |
Mess_IntegralNick = 0; |
Mess_IntegralNick2 = 0; |
Mess_IntegralRoll = 0; |
Mess_IntegralRoll2 = 0; |
Mess_Integral_Gier = 0; |
MesswertNick = 0; |
MesswertRoll = 0; |
MesswertGier = 0; |
Delay_ms_Mess(100); |
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 = EE_Parameter.Driftkomp * 16; |
FromNaviCtrl_Value.Kalman_MaxFusion = 32; |
} |
//############################################################################ |
// Bearbeitet die Messwerte |
void Mittelwert(void) |
//############################################################################ |
{ |
static signed long tmpl,tmpl2; |
MesswertGier = (signed int) AdNeutralGier - AdWertGier; |
MesswertGierBias = (signed int) AdNeutralGierBias - AdWertGier; |
MesswertRoll = (signed int) AdWertRoll - AdNeutralRoll; |
MesswertNick = (signed int) AdWertNick - AdNeutralNick; |
//DebugOut.Analog[26] = MesswertNick; |
// DebugOut.Analog[28] = MesswertRoll; |
// Beschleunigungssensor ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mittelwert_AccNick = ((long)Mittelwert_AccNick * 1 + ((ACC_AMPLIFY * (long)AdWertAccNick))) / 2L; |
Mittelwert_AccRoll = ((long)Mittelwert_AccRoll * 1 + ((ACC_AMPLIFY * (long)AdWertAccRoll))) / 2L; |
Mittelwert_AccHoch = ((long)Mittelwert_AccHoch * 1 + ((long)AdWertAccHoch)) / 2L; |
IntegralAccNick += ACC_AMPLIFY * AdWertAccNick; |
IntegralAccRoll += ACC_AMPLIFY * AdWertAccRoll; |
NaviAccNick += AdWertAccNick; |
NaviAccRoll += AdWertAccRoll; |
NaviCntAcc++; |
IntegralAccZ += Aktuell_az - NeutralAccZ; |
// Gier ++++++++++++++++++++++++++++++++++++++++++++++++ |
ErsatzKompass += MesswertGier; |
Mess_Integral_Gier += MesswertGier; |
// Mess_Integral_Gier2 += MesswertGier; |
if(ErsatzKompass >= (360L * GIER_GRAD_FAKTOR)) ErsatzKompass -= 360L * GIER_GRAD_FAKTOR; // 360° Umschlag |
if(ErsatzKompass < 0) ErsatzKompass += 360L * GIER_GRAD_FAKTOR; |
// Kopplungsanteil +++++++++++++++++++++++++++++++++++++ |
if(!Looping_Nick && !Looping_Roll && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV)) |
{ |
tmpl = (MesswertGierBias * Mess_IntegralNick) / 2048L; |
tmpl *= Parameter_AchsKopplung1; //125 |
tmpl /= 4096L; |
tmpl2 = (MesswertGierBias * Mess_IntegralRoll) / 2048L; |
tmpl2 *= Parameter_AchsKopplung1; |
tmpl2 /= 4096L; |
if(labs(tmpl) > 128 || labs(tmpl2) > 128) TrichterFlug = 1; |
} |
else tmpl = tmpl2 = 0; |
// Roll ++++++++++++++++++++++++++++++++++++++++++++++++ |
MesswertRoll += tmpl; |
MesswertRoll += (tmpl2*Parameter_AchsGegenKopplung1)/512L; //109 |
Mess_IntegralRoll2 += MesswertRoll; |
Mess_IntegralRoll += MesswertRoll - 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; |
} |
if(AdWertRoll < 15) MesswertRoll = -1000; |
if(AdWertRoll < 7) MesswertRoll = -2000; |
if(PlatinenVersion == 10) |
{ |
if(AdWertRoll > 1010) MesswertRoll = +1000; |
if(AdWertRoll > 1017) MesswertRoll = +2000; |
} |
else |
{ |
if(AdWertRoll > 2020) MesswertRoll = +1000; |
if(AdWertRoll > 2034) MesswertRoll = +2000; |
} |
// Nick ++++++++++++++++++++++++++++++++++++++++++++++++ |
MesswertNick -= tmpl2; |
MesswertNick -= (tmpl*Parameter_AchsGegenKopplung1)/512L; |
Mess_IntegralNick2 += MesswertNick; |
Mess_IntegralNick += MesswertNick - 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; |
} |
if(AdWertNick < 15) MesswertNick = -1000; |
if(AdWertNick < 7) MesswertNick = -2000; |
if(PlatinenVersion == 10) |
{ |
if(AdWertNick > 1010) MesswertNick = +1000; |
if(AdWertNick > 1017) MesswertNick = +2000; |
} |
else |
{ |
if(AdWertNick > 2020) MesswertNick = +1000; |
if(AdWertNick > 2034) MesswertNick = +2000; |
} |
//++++++++++++++++++++++++++++++++++++++++++++++++ |
// ADC einschalten |
ANALOG_ON; |
//++++++++++++++++++++++++++++++++++++++++++++++++ |
Integral_Gier = Mess_Integral_Gier; |
IntegralNick = Mess_IntegralNick; |
IntegralRoll = Mess_IntegralRoll; |
IntegralNick2 = Mess_IntegralNick2; |
IntegralRoll2 = Mess_IntegralRoll2; |
if(EE_Parameter.GlobalConfig & CFG_DREHRATEN_BEGRENZER && !Looping_Nick && !Looping_Roll) |
{ |
if(MesswertNick > 200) MesswertNick += 4 * (MesswertNick - 200); |
else if(MesswertNick < -200) MesswertNick += 4 * (MesswertNick + 200); |
if(MesswertRoll > 200) MesswertRoll += 4 * (MesswertRoll - 200); |
else if(MesswertRoll < -200) MesswertRoll += 4 * (MesswertRoll + 200); |
} |
if(Poti1 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110) Poti1++; else if(Poti1 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110 && Poti1) Poti1--; |
if(Poti2 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110) Poti2++; else if(Poti2 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110 && Poti2) Poti2--; |
if(Poti3 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110) Poti3++; else if(Poti3 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110 && Poti3) Poti3--; |
if(Poti4 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110) Poti4++; else if(Poti4 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110 && Poti4) Poti4--; |
if(Poti1 < 0) Poti1 = 0; else if(Poti1 > 255) Poti1 = 255; |
if(Poti2 < 0) Poti2 = 0; else if(Poti2 > 255) Poti2 = 255; |
if(Poti3 < 0) Poti3 = 0; else if(Poti3 > 255) Poti3 = 255; |
if(Poti4 < 0) Poti4 = 0; else if(Poti4 > 255) Poti4 = 255; |
} |
//############################################################################ |
// Messwerte beim Ermitteln der Nullage |
void CalibrierMittelwert(void) |
//############################################################################ |
{ |
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) |
//############################################################################ |
{ |
DebugOut.Analog[12] = Motor_Vorne; |
DebugOut.Analog[13] = Motor_Hinten; |
DebugOut.Analog[14] = Motor_Links; |
DebugOut.Analog[15] = Motor_Rechts; |
if(!( MotorenEin && PARAM_ENGINE_ENABLED ) ) |
{ |
Motor_Hinten = 0; |
Motor_Vorne = 0; |
Motor_Rechts = 0; |
Motor_Links = 0; |
if(MotorTest[0]) Motor_Vorne = MotorTest[0]; |
if(MotorTest[1]) Motor_Hinten = MotorTest[1]; |
if(MotorTest[2]) Motor_Links = MotorTest[2]; |
if(MotorTest[3]) Motor_Rechts = MotorTest[3]; |
MikroKopterFlags &= ~(FLAG_MOTOR_RUN | FLAG_FLY); |
} 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_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_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_J17Timing,EE_Parameter.J17Timing,1,255); |
// CHK_POTI(Parameter_NaviGpsModeControl,EE_Parameter.NaviGpsModeControl,0,255); |
//CHK_POTI(Parameter_NaviGpsGain,EE_Parameter.NaviGpsGain,0,255); |
// CHK_POTI(Parameter_NaviGpsP,EE_Parameter.NaviGpsP,0,255); |
// CHK_POTI(Parameter_NaviGpsI,EE_Parameter.NaviGpsI,0,255); |
// CHK_POTI(Parameter_NaviGpsD,EE_Parameter.NaviGpsD,0,255); |
// CHK_POTI(Parameter_NaviGpsACC,EE_Parameter.NaviGpsACC,0,255); |
// CHK_POTI_MM(Parameter_NaviOperatingRadius,EE_Parameter.NaviOperatingRadius,10,255); |
// CHK_POTI(Parameter_NaviWindCorrection,EE_Parameter.NaviWindCorrection,0,255); |
// CHK_POTI(Parameter_NaviSpeedCompensation,EE_Parameter.NaviSpeedCompensation,0,255); |
CHK_POTI(Parameter_ExternalControl,EE_Parameter.ExternalControl,0,255); |
Ki = (float) Parameter_I_Faktor * 0.0001; |
MAX_GAS = EE_Parameter.Gas_Max; |
MIN_GAS = EE_Parameter.Gas_Min; |
} |
//############################################################################ |
// |
void MotorRegler(void) |
//############################################################################ |
{ |
int motorwert,pd_ergebnis,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; |
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(); |
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 = 0; |
Mess_IntegralRoll = 0; |
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]]; |
// Gaswert übernehmen |
if( pitchNeutral() ) { |
StickGas = pitch(); |
} else { |
StickGas = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] + 120; |
} |
GyroFaktor = ((float)Parameter_Gyro_P + 10.0) / (256 / STICK_GAIN ); |
IntegralFaktor = ((float) Parameter_Gyro_I) / (44000 / STICK_GAIN ); |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//+ 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; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Bei Empfangsausfall im Flug |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(Notlandung) |
{ |
StickGier = 0; |
StickNick = 0; |
StickRoll = 0; |
GyroFaktor = (float) 100 / (256.0 / STICK_GAIN); |
IntegralFaktor = (float) 120 / (44000 / STICK_GAIN); |
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) |
{ |
long tmp_long, tmp_long2; |
if(FromNaviCtrl_Value.Kalman_K != -1) |
{ |
tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick); |
tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll); |
tmp_long = (tmp_long * FromNaviCtrl_Value.Kalman_K) / (32 * 16); |
tmp_long2 = (tmp_long2 * FromNaviCtrl_Value.Kalman_K) / (32 * 16); |
if((MaxStickNick > 64) || (MaxStickRoll > 64)) |
{ |
tmp_long /= 2; |
tmp_long2 /= 2; |
} |
if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25) |
{ |
tmp_long /= 3; |
tmp_long2 /= 3; |
} |
if(tmp_long > (long) FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long = (long) FromNaviCtrl_Value.Kalman_MaxFusion; |
if(tmp_long < (long)-FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long = (long)-FromNaviCtrl_Value.Kalman_MaxFusion; |
if(tmp_long2 > (long) FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long2 = (long) FromNaviCtrl_Value.Kalman_MaxFusion; |
if(tmp_long2 < (long)-FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long2 = (long)-FromNaviCtrl_Value.Kalman_MaxFusion; |
} |
else |
{ |
tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick); |
tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll); |
tmp_long /= 16; |
tmp_long2 /= 16; |
if((MaxStickNick > 64) || (MaxStickRoll > 64)) |
{ |
tmp_long /= 3; |
tmp_long2 /= 3; |
} |
if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25) |
{ |
tmp_long /= 3; |
tmp_long2 /= 3; |
} |
#define AUSGLEICH 32 |
if(tmp_long > AUSGLEICH) tmp_long = AUSGLEICH; |
if(tmp_long < -AUSGLEICH) tmp_long =-AUSGLEICH; |
if(tmp_long2 > AUSGLEICH) tmp_long2 = AUSGLEICH; |
if(tmp_long2 <-AUSGLEICH) tmp_long2 =-AUSGLEICH; |
} |
Mess_IntegralNick -= tmp_long; |
Mess_IntegralRoll -= tmp_long2; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(ZaehlMessungen >= ABGLEICH_ANZAHL) |
{ |
static int cnt = 0; |
static char last_n_p,last_n_n,last_r_p,last_r_n; |
static long MittelIntegralNick_Alt,MittelIntegralRoll_Alt; |
if(!Looping_Nick && !Looping_Roll && !TrichterFlug) |
{ |
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(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 * 4) |
#define FEHLER_LIMIT2 (ABGLEICH_ANZAHL * 16) |
#define BEWEGUNGS_LIMIT 20000 |
// Nick +++++++++++++++++++++++++++++++++++++++++++++++++ |
cnt = 1;// + labs(IntegralFehlerNick) / 4096; |
if(labs(MittelIntegralNick_Alt - MittelIntegralNick) < BEWEGUNGS_LIMIT || (FromNaviCtrl_Value.Kalman_MaxDrift > 3*16)) |
{ |
if(IntegralFehlerNick > FEHLER_LIMIT2) |
{ |
if(last_n_p) |
{ |
cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2; |
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; |
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(cnt * 16 > FromNaviCtrl_Value.Kalman_MaxDrift) cnt = FromNaviCtrl_Value.Kalman_MaxDrift/16; |
if(IntegralFehlerNick > FEHLER_LIMIT) AdNeutralNick += cnt; |
if(IntegralFehlerNick < -FEHLER_LIMIT) AdNeutralNick -= cnt; |
// Roll +++++++++++++++++++++++++++++++++++++++++++++++++ |
cnt = 1;// + labs(IntegralFehlerNick) / 4096; |
ausgleichRoll = 0; |
if(labs(MittelIntegralRoll_Alt - MittelIntegralRoll) < BEWEGUNGS_LIMIT || (FromNaviCtrl_Value.Kalman_MaxDrift > 3*16)) |
{ |
if(IntegralFehlerRoll > FEHLER_LIMIT2) |
{ |
if(last_r_p) |
{ |
cnt += labs(IntegralFehlerRoll) / FEHLER_LIMIT2; |
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; |
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(cnt * 16 > FromNaviCtrl_Value.Kalman_MaxDrift) cnt = FromNaviCtrl_Value.Kalman_MaxDrift/16; |
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; |
} |
//DebugOut.Analog[31] = StickRoll / (26*IntegralFaktor); |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// 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[29] = (MaxStickNick + MaxStickRoll); |
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(NeueKompassRichtungMerken) |
{ |
fehler = 0; |
ErsatzKompass = KompassValue * GIER_GRAD_FAKTOR; |
} |
if(!KompassSignalSchlecht && w < 25) |
{ |
GierGyroFehler += fehler; |
if(NeueKompassRichtungMerken) |
{ |
beeptime = 200; |
// KompassStartwert = KompassValue; |
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; |
DebugOut.Analog[1] = IntegralRoll / EE_Parameter.GyroAccFaktor; |
DebugOut.Analog[2] = Mittelwert_AccNick; |
DebugOut.Analog[3] = Mittelwert_AccRoll; |
DebugOut.Analog[4] = MesswertGier; |
DebugOut.Analog[5] = HoehenWert; |
DebugOut.Analog[6] = (Mess_Integral_Hoch / 512); |
DebugOut.Analog[8] = KompassValue; |
DebugOut.Analog[9] = 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[27] = (int)FromNaviCtrl_Value.Kalman_MaxDrift; |
// DebugOut.Analog[29] = (int)FromNaviCtrl_Value.Kalman_K; |
// 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(Looping_Nick) MesswertNick = MesswertNick * GyroFaktor; |
else MesswertNick = IntegralNick * IntegralFaktor + MesswertNick * GyroFaktor; |
if(Looping_Roll) MesswertRoll = MesswertRoll * GyroFaktor; |
else MesswertRoll = IntegralRoll * IntegralFaktor + MesswertRoll * GyroFaktor; |
MesswertGier = MesswertGier * (2 * GyroFaktor) + Integral_Gier * IntegralFaktor / 2; |
DebugOut.Analog[21] = MesswertNick; |
DebugOut.Analog[22] = MesswertRoll; |
// Maximalwerte abfangen |
#define MAX_SENSOR (4096*STICK_GAIN) |
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; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gas-Mischanteil |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Zur besseren Auflösung hochskalieren |
GasMischanteil *= STICK_GAIN; |
// Fehlerwert der Höhenregelung einmischen |
GasMischanteil -= altitudeController(); |
// Mindestens auf Minimalgas stellen |
if( GasMischanteil < MIN_GAS ) |
GasMischanteil = MIN_GAS; |
// Begrenzung des Gasmischanteils auf MAX_GAS - 20 (Reserve für Motoren) |
if( GasMischanteil > ( MAX_GAS - 20 ) * STICK_GAIN ) |
GasMischanteil = ( MAX_GAS - 20 ) * STICK_GAIN; |
DebugOut.Analog[7] = GasMischanteil; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gier-Anteil |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
GierMischanteil = MesswertGier - ( sollGier * STICK_GAIN ); // Regler für Gier |
#define MIN_GIERGAS ( 40 * STICK_GAIN ) // unter diesem Gaswert trotzdem Gieren |
// Reduzierten Gieranteil berechnen |
if( GasMischanteil < MIN_GIERGAS ) { |
GierMischanteil = ( GierMischanteil * GasMischanteil ) / MIN_GIERGAS; |
} |
// Gieranteil darf nicht größer als der halbe Gasanteil sein |
if( GierMischanteil > ( GasMischanteil >> 1 ) ) |
GierMischanteil = GasMischanteil >> 1; |
if( GierMischanteil < -( GasMischanteil >> 1 ) ) |
GierMischanteil = -( GasMischanteil >> 1 ); |
tmp_int = MAX_GAS * STICK_GAIN; |
// Gieranteil darf die Gasreserve nicht überschreiten |
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 += IntegralNick * IntegralFaktor - 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 = DiffNick + Ki * SummeNick; // PI-Regler für Nick |
// Motor Vorn |
tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
if(pd_ergebnis > tmp_int) pd_ergebnis = tmp_int; |
if(pd_ergebnis < -tmp_int) pd_ergebnis = -tmp_int; |
motorwert = GasMischanteil + pd_ergebnis + GierMischanteil; // Mischer |
motorwert /= STICK_GAIN; |
if ((motorwert < 0)) motorwert = 0; |
else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
Motor_Vorne = motorwert; |
// Motor Heck |
motorwert = GasMischanteil - pd_ergebnis + GierMischanteil; |
motorwert /= STICK_GAIN; |
if ((motorwert < 0)) motorwert = 0; |
else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
Motor_Hinten = motorwert; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Roll-Achse |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DiffRoll = MesswertRoll - StickRoll; // Differenz bestimmen |
if(IntegralFaktor) SummeRoll += IntegralRoll * IntegralFaktor - 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 = DiffRoll + Ki * SummeRoll; // PI-Regler für Roll |
tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
if(pd_ergebnis > tmp_int) pd_ergebnis = tmp_int; |
if(pd_ergebnis < -tmp_int) pd_ergebnis = -tmp_int; |
// Motor Links |
motorwert = GasMischanteil + pd_ergebnis - GierMischanteil; |
motorwert /= STICK_GAIN; |
if ((motorwert < 0)) motorwert = 0; |
else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
Motor_Links = motorwert; |
// Motor Rechts |
motorwert = GasMischanteil - pd_ergebnis - GierMischanteil; |
motorwert /= STICK_GAIN; |
if ((motorwert < 0)) motorwert = 0; |
else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
Motor_Rechts = motorwert; |
// +++++++++++++++++++++++++++++++++++++++++++++++ |
} |
/branches/thjac/V1_10/fc.h |
---|
0,0 → 1,170 |
/*####################################################################################### |
Flight Control |
#######################################################################################*/ |
#ifndef _FC_H |
#define _FC_H |
//#define GIER_GRAD_FAKTOR 1450L // Abhängigkeit zwischen GyroIntegral und Winkel |
//#define GIER_GRAD_FAKTOR 1550L // Abhängigkeit zwischen GyroIntegral und Winkel |
#define GIER_GRAD_FAKTOR 1291L // 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 |
extern unsigned char MikroKopterFlags; |
extern volatile unsigned int I2CTimeout; |
extern unsigned char Sekunde,Minute; |
extern long IntegralNick,IntegralNick2; |
extern long 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 volatile int KompassValue; |
extern volatile int KompassStartwert; |
extern volatile int KompassRichtung; |
extern long ErsatzKompass; |
extern int ErsatzKompassInGrad; // Kompasswert in Grad |
extern int HoehenWert; |
extern int SollHoehe; |
extern volatile int MesswertNick,MesswertRoll,MesswertGier; |
extern int AdNeutralNick,AdNeutralRoll,AdNeutralGier, Mittelwert_AccNick, Mittelwert_AccRoll; |
extern int NeutralAccX, NeutralAccY,Mittelwert_AccHoch; |
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 void DefaultKonstanten(void); |
void DefaultKonstanten1(void); |
void DefaultKonstanten2(void); |
extern unsigned char h,m,s; |
extern volatile unsigned char Timeout ; |
extern unsigned char CosinusNickWinkel, CosinusRollWinkel; |
extern volatile int DiffNick,DiffRoll; |
extern int Poti1, Poti2, Poti3, Poti4; |
extern volatile unsigned char Motor_Vorne,Motor_Hinten,Motor_Rechts,Motor_Links, Count; |
extern volatile unsigned char SenderOkay; |
extern int StickNick,StickRoll,StickGier; |
extern char MotorenEin; |
extern void DefaultKonstanten1(void); |
extern void DefaultKonstanten2(void); |
#define STRUCT_PARAM_LAENGE 86 |
struct mk_param_struct |
{ |
unsigned char Kanalbelegung[8]; // GAS[0], GIER[1],NICK[2], ROLL[3], POTI1, POTI2, POTI3 |
unsigned char GlobalConfig; // 0x01=Höhenregler aktiv,0x02=Kompass aktiv, 0x04=GPS aktiv, 0x08=Heading Hold aktiv |
unsigned char Hoehe_MinGas; // Wert : 0-100 |
unsigned char Luftdruck_D; // Wert : 0-250 |
unsigned char MaxHoehe; // Wert : 0-32 |
unsigned char Hoehe_P; // Wert : 0-32 |
unsigned char Hoehe_Verstaerkung; // Wert : 0-50 |
unsigned char Hoehe_ACC_Wirkung; // Wert : 0-250 |
unsigned char Stick_P; // Wert : 1-6 |
unsigned char Stick_D; // Wert : 0-64 |
unsigned char Gier_P; // Wert : 1-20 |
unsigned char Gas_Min; // Wert : 0-32 |
unsigned char Gas_Max; // Wert : 33-250 |
unsigned char GyroAccFaktor; // Wert : 1-64 |
unsigned char KompassWirkung; // Wert : 0-32 |
unsigned char Gyro_P; // Wert : 10-250 |
unsigned char Gyro_I; // Wert : 0-250 |
unsigned char UnterspannungsWarnung; // Wert : 0-250 |
unsigned char NotGas; // Wert : 0-250 //Gaswert bei Empängsverlust |
unsigned char NotGasZeit; // Wert : 0-250 // Zeitbis auf NotGas geschaltet wird, wg. Rx-Problemen |
unsigned char UfoAusrichtung; // X oder + Formation |
unsigned char I_Faktor; // Wert : 0-250 |
unsigned char UserParam1; // Wert : 0-250 |
unsigned char UserParam2; // Wert : 0-250 |
unsigned char UserParam3; // Wert : 0-250 |
unsigned char UserParam4; // Wert : 0-250 |
unsigned char ServoNickControl; // Wert : 0-250 // Stellung des Servos |
unsigned char ServoNickComp; // Wert : 0-250 // Einfluss Gyro/Servo |
unsigned char ServoNickMin; // Wert : 0-250 // Anschlag |
unsigned char ServoNickMax; // Wert : 0-250 // Anschlag |
unsigned char ServoNickRefresh; // |
unsigned char LoopGasLimit; // Wert: 0-250 max. Gas während Looping |
unsigned char LoopThreshold; // Wert: 0-250 Schwelle für Stickausschlag |
unsigned char LoopHysterese; // Wert: 0-250 Hysterese für Stickausschlag |
unsigned char AchsKopplung1; // Wert: 0-250 Faktor, mit dem Gier die Achsen Roll und Nick koppelt (NickRollMitkopplung) |
unsigned char AchsGegenKopplung1; // Wert: 0-250 Faktor, mit dem Gier die Achsen Roll und Nick Gegenkoppelt (NickRollGegenkopplung) |
unsigned char WinkelUmschlagNick; // Wert: 0-250 180°-Punkt |
unsigned char WinkelUmschlagRoll; // Wert: 0-250 180°-Punkt |
unsigned char GyroAccAbgleich; // 1/k (Koppel_ACC_Wirkung) |
unsigned char Driftkomp; |
unsigned char 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 NaviGpsACC; |
unsigned char NaviGpsMinSat; |
unsigned char NaviStickThreshold; |
unsigned char NaviWindCorrection; |
unsigned char NaviSpeedCompensation; |
unsigned char NaviOperatingRadius; |
unsigned char NaviAngleLimitation; |
//---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]; |
}; |
extern struct mk_param_struct EE_Parameter; |
extern unsigned char Parameter_Luftdruck_D; |
extern unsigned char Parameter_MaxHoehe; |
extern unsigned char Parameter_Hoehe_P; |
extern unsigned char Parameter_Hoehe_ACC_Wirkung; |
extern unsigned char Parameter_KompassWirkung; |
extern unsigned char Parameter_Gyro_P; |
extern unsigned char Parameter_Gyro_I; |
extern unsigned char Parameter_Gier_P; |
extern unsigned char Parameter_ServoNickControl; |
extern unsigned char Parameter_AchsKopplung1; |
extern unsigned char Parameter_AchsGegenKopplung1; |
extern unsigned char Parameter_J16Bitmask; // for the J16 Output |
extern unsigned char Parameter_J16Timing; // for the J16 Output |
extern unsigned char Parameter_J17Bitmask; // for the J17 Output |
extern unsigned char Parameter_J17Timing; // for the J17 Output |
/* |
extern unsigned char Parameter_NaviGpsModeControl; // Parameters for the Naviboard |
extern unsigned char Parameter_NaviGpsGain; |
extern unsigned char Parameter_NaviGpsP; |
extern unsigned char Parameter_NaviGpsI; |
extern unsigned char Parameter_NaviGpsD; |
extern unsigned char Parameter_NaviGpsACC; |
extern unsigned char Parameter_NaviOperatingRadius; |
extern unsigned char Parameter_NaviWindCorrection; |
extern unsigned char Parameter_NaviSpeedCompensation; |
*/ |
#endif //_FC_H |
/branches/thjac/V1_10/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="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="parameter.h"></File><File path="pitch.c"></File><File path="pitch.h"></File><File path="gps.c"></File><File path="gps.h"></File></Project> |
/branches/thjac/V1_10/flight.pnps |
---|
0,0 → 1,0 |
<pd><ViewState><e p="Flight-Ctrl" x="true"></e></ViewState></pd> |
/branches/thjac/V1_10/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_10/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_10/led.c |
---|
0,0 → 1,130 |
#include <inttypes.h> |
#include "main.h" |
#include "parameter.h" |
uint16_t LED1_Timing = 0; |
uint16_t LED2_Timing = 0; |
unsigned char J16Blinkcount = 0, J16Mask = 1; |
unsigned char J17Blinkcount = 0, J17Mask = 1; |
unsigned char lightsEnabled = 0; |
extern char MotorenEin; |
// initializes the LED control outputs J16, J17 |
void LED_Init( void ) { |
// set PC2 & PC3 as output (control of J16 & J17) |
DDRC |= (1<<DDC2)|(1<<DDC3); |
J16_OFF; |
J17_OFF; |
J16Blinkcount = 0; J16Mask = 128; |
J17Blinkcount = 0; J17Mask = 128; |
} |
// called in UpdateMotors() every 2ms |
void LED_Update( void ) { |
static char delay = 0; |
if( !MotorenEin ) { |
/* Mit dem Gier-Stick links lassen sich die LED's ein- und ausschalten. |
*/ |
if( PARAM_LED_STICK_ENABLED ) { |
if( PPM_in[ EE_Parameter.Kanalbelegung[ K_GAS ] ] > 35-120 && |
PPM_in[ EE_Parameter.Kanalbelegung[ K_GAS ] ] < 80 ) { |
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; |
} |
} |
if( PARAM_LED_ENGINE_ENABLED ) { |
lightsEnabled = MotorenEin; |
} |
if( !delay-- ) { |
delay = 4; // 10ms Intervall |
// Soll die Unterspannungswarnung zu einem schnelleren Blinken führen? |
if( PARAM_LED_WARNING_ENABLED ) { |
// Grenze für Unterspannungswarnung erreicht? |
if( UBat < EE_Parameter.UnterspannungsWarnung ) { |
delay = 2; // 5ms Intervall |
} |
} |
/* J16 |
*/ |
if( ( EE_Parameter.J16Timing > 250 ) && ( Parameter_J16Timing > 230 ) ) { |
if( EE_Parameter.J16Bitmask & 128 ) |
J16_ON; |
else |
J16_OFF; |
} else if( ( EE_Parameter.J16Timing > 250 ) && ( Parameter_J16Timing < 10 ) ) { |
if( EE_Parameter.J16Bitmask & 128 ) |
J16_OFF; |
else |
J16_ON; |
} else if( !J16Blinkcount-- ) { |
J16Blinkcount = Parameter_J16Timing-1; |
if( J16Mask == 1 ) |
J16Mask = 128; |
else |
J16Mask /= 2; |
if( J16Mask & EE_Parameter.J16Bitmask ) |
J16_ON; |
else |
J16_OFF; |
} |
/* J17 |
*/ |
if( ( EE_Parameter.J17Timing > 250 ) && ( Parameter_J17Timing > 230 ) ) { |
if( EE_Parameter.J17Bitmask & 128 ) |
J17_ON; |
else |
J17_OFF; |
} else if( ( EE_Parameter.J17Timing > 250 ) && ( Parameter_J17Timing < 10 ) ) { |
if( EE_Parameter.J17Bitmask & 128 ) |
J17_OFF; |
else |
J17_ON; |
} else if( !J17Blinkcount-- ) { |
J17Blinkcount = Parameter_J17Timing-1; |
if( J17Mask == 1 ) |
J17Mask = 128; |
else |
J17Mask /= 2; |
if( J17Mask & EE_Parameter.J17Bitmask ) |
J17_ON; |
else |
J17_OFF; |
} |
} |
if( !lightsEnabled ) { |
J16_OFF; |
J17_OFF; |
} |
} |
/branches/thjac/V1_10/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_10/main.c |
---|
0,0 → 1,304 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + Nur für den privaten Gebrauch |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten und nicht-kommerziellen Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt und genannt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-commercial use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be |
// + clearly linked as origin |
// + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
unsigned char EEPromArray[E2END+1] EEMEM; |
unsigned char PlatinenVersion = 10; |
unsigned char SendVersionToNavi = 1; |
// -- Parametersatz aus EEPROM lesen --- |
// number [1..5] |
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); |
LED_Init(); |
} |
// -- 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); |
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; |
//unsigned int timer2 = 0; |
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 = 0x77; // LED |
MCUSR &=~(1<<WDRF); |
WDTCSR |= (1<<WDCE)|(1<<WDE); |
WDTCSR = 0; |
beeptime = 2000; |
StickGier = 0; PPM_in[K_GAS] = 0;StickRoll = 0; StickNick = 0; |
ROT_OFF; |
Timer_Init(); |
UART_Init(); |
rc_sum_init(); |
ADC_Init(); |
i2c_init(); |
SPI_MasterInit(); |
sei(); |
printf("\n\rFlightControl\n\rHardware:%d.%d\n\rSoftware:V%d.%d%c ",PlatinenVersion/10,PlatinenVersion%10, VERSION_MAJOR, VERSION_MINOR,VERSION_PATCH + 'a'); |
printf("\n\r=============================="); |
GRN_ON; |
ReadParameterSet(3, (unsigned char *) &EE_Parameter.Kanalbelegung[0], 9); // read only the first bytes |
// valid Stick-Settings? |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_VALID]) == 255 || eeprom_read_byte(&EEPromArray[EEPROM_ADR_VALID]) < EE_DATENREVISION || |
EE_Parameter.Kanalbelegung[0] > 9 || EE_Parameter.Kanalbelegung[1] > 9 || EE_Parameter.Kanalbelegung[2] > 9 || EE_Parameter.Kanalbelegung[3] > 9) |
{ |
printf("\n\rInit. EEPROM: Generating Default-Parameter and Stick-Settings..."); |
DefaultStickMapping(); |
} |
else if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_VALID]) != EE_DATENREVISION) printf("\n\rInit. EEPROM: Generating Default-Parameter using old Stick Settings"); |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_VALID]) != EE_DATENREVISION) |
{ |
DefaultKonstanten1(); |
for (unsigned char i=1;i<6;i++) |
{ |
if(i==2) DefaultKonstanten2(); // Kamera |
if(i==3) DefaultKonstanten3(); // Beginner |
if(i>3) DefaultKonstanten2(); // Kamera |
WriteParameterSet(i, (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
} |
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 nicht abgeglichen!"); |
} |
ReadParameterSet(GetActiveParamSetNumber(), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
printf("\n\rBenutze Parametersatz %d", GetActiveParamSetNumber()); |
if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
printf("\n\rAbgleich Luftdrucksensor.."); |
timer = SetDelay(1000); |
SucheLuftruckOffset(); |
while (!CheckDelay(timer)); |
printf("OK\n\r"); |
} |
SetNeutral(); |
ROT_OFF; |
beeptime = 2000; |
ExternControl.Digital[0] = 0x55; |
printf("\n\rSteuerung: "); |
if (EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) printf("HeadingHold"); |
else printf("Neutral"); |
printf("\n\n\r"); |
LcdClear(); |
I2CTimeout = 5000; |
WinkelOut.Orientation = 1; |
while (1) |
{ |
if(UpdateMotor) // ReglerIntervall |
{ |
UpdateMotor=0; |
//PORTD |= 0x08; |
if(WinkelOut.CalcState) CalMk3Mag(); |
else MotorRegler(); |
//PORTD &= ~0x08; |
SendMotorData(); |
ROT_OFF; |
if(PcZugriff) PcZugriff--; |
else |
{ |
ExternControl.Config = 0; |
ExternStickNick = 0; |
ExternStickRoll = 0; |
ExternStickGier = 0; |
} |
if(SenderOkay) SenderOkay--; |
if(!I2CTimeout) |
{ |
I2CTimeout = 5; |
i2c_reset(); |
if((BeepMuster == 0xffff) && MotorenEin) |
{ |
beeptime = 10000; |
BeepMuster = 0x0080; |
} |
} |
else |
{ |
I2CTimeout--; |
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; |
} |
} |
/* if(SendVersionToNavi) |
{ |
SPI_StartTransmitPacket(SPI_CMD_VERSION);//# |
SendVersionToNavi = 0; |
} |
else SPI_StartTransmitPacket(SPI_CMD_VALUE);//# |
*/ |
SPI_StartTransmitPacket();//# |
SendSPI = 4; |
timer = SetDelay(20); |
} |
//if(UpdateMotor) DebugOut.Analog[26]++; |
LED_Update(); |
} |
if(!SendSPI) { SPI_TransmitByte(); } |
} |
return (1); |
} |
/branches/thjac/V1_10/main.h |
---|
0,0 → 1,111 |
#ifndef _MAIN_H |
#define _MAIN_H |
//Hier die Quarz Frequenz einstellen |
#if defined (__AVR_ATmega32__) |
#define SYSCLK 20000000L //Quarz Frequenz in Hz |
#endif |
#if defined (__AVR_ATmega644__) |
#define SYSCLK 20000000L //Quarz Frequenz in Hz |
//#define SYSCLK 16000000L //Quarz Frequenz in Hz |
#endif |
// neue Hardware |
#define ROT_OFF {if((PlatinenVersion == 10)||(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 73 // wird angepasst, wenn sich die EEPROM-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_PARAM_BEGIN 100 |
#define CFG_HOEHENREGELUNG 0x01 |
#define CFG_HOEHEN_SCHALTER 0x02 |
#define CFG_HEADING_HOLD 0x04 |
#define CFG_KOMPASS_AKTIV 0x08 |
#define CFG_KOMPASS_FIX 0x10 |
#define CFG_GPS_AKTIV 0x20 |
#define CFG_ACHSENKOPPLUNG_AKTIV 0x40 |
#define CFG_DREHRATEN_BEGRENZER 0x80 |
#define CFG_LOOP_OBEN 0x01 |
#define CFG_LOOP_UNTEN 0x02 |
#define CFG_LOOP_LINKS 0x04 |
#define CFG_LOOP_RECHTS 0x08 |
#define CFG_HIGHT_3SWITCH 0x10 |
//#define SYSCLK |
//extern unsigned long SYSCLK; |
extern volatile int i_Nick[20],i_Roll[20],DiffNick,DiffRoll; |
extern volatile unsigned char SenderOkay; |
extern unsigned char CosinusNickWinkel, CosinusRollWinkel; |
extern unsigned char PlatinenVersion; |
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[]; |
#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_10/makefile |
---|
0,0 → 1,434 |
#-------------------------------------------------------------------- |
# MCU name |
MCU = atmega644 |
F_CPU = 20000000 |
#------------------------------------------------------------------- |
VERSION_MAJOR = 1 |
VERSION_MINOR = 10 |
VERSION_PATCH = 0 |
VERSION_SERIAL_MAJOR = 10 # Serial Protocol |
VERSION_SERIAL_MINOR = 0 # Serial Protocol |
NC_SPI_COMPATIBLE = 3 # 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 |
# Optimization level, can be [0, 1, 2, 3, s]. 0 turns off optimization. |
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) |
OPT = s |
########################################################################################################## |
# List C source files here. (C dependencies are automatically generated.) |
SRC = main.c uart.c printf_P.c timer0.c analog.c menu.c |
SRC += twimaster.c rc.c fc.c spi.c led.c pitch.c |
SRC += gps.c |
########################################################################################################## |
# List Assembler source files here. |
# Make them always end in a capital .S. Files ending in a lowercase .s |
# will not be considered source files but generated files (assembler |
# output from the compiler), and will be deleted upon "make clean"! |
# Even though the DOS/Win* filesystem matches both .s and .S the same, |
# it will preserve the spelling of the filenames, and gcc itself does |
# care about how the name is spelled on its command-line. |
ASRC = |
# List any extra directories to look for include files here. |
# Each directory must be seperated by a space. |
EXTRAINCDIRS = |
# Optional compiler flags. |
# -g: generate debugging information (for GDB, or for COFF conversion) |
# -O*: optimization level |
# -f...: tuning, see gcc manual and avr-libc documentation |
# -Wall...: warning level |
# -Wa,...: tell GCC to pass this to the assembler. |
# -ahlms: create assembler listing |
CFLAGS = -O$(OPT) \ |
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \ |
-Wall -Wstrict-prototypes \ |
-Wa,-adhlns=$(<:.c=.lst) \ |
$(patsubst %,-I%,$(EXTRAINCDIRS)) |
# Set a "language standard" compiler flag. |
# Unremark just one line below to set the language standard to use. |
# gnu99 = C99 + GNU extensions. See GCC manual for more information. |
#CFLAGS += -std=c89 |
#CFLAGS += -std=gnu89 |
#CFLAGS += -std=c99 |
CFLAGS += -std=gnu99 |
CFLAGS += -DVERSION_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. |
sizebefore: |
@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi |
sizeafter: |
@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; fi |
# Display compiler version information. |
gccversion : |
@$(CC) --version |
# Convert ELF to COFF for use in debugging / simulating in |
# AVR Studio or VMLAB. |
COFFCONVERT=$(OBJCOPY) --debugging \ |
--change-section-address .data-0x800000 \ |
--change-section-address .bss-0x800000 \ |
--change-section-address .noinit-0x800000 \ |
--change-section-address .eeprom-0x810000 |
coff: $(TARGET).elf |
@echo |
@echo $(MSG_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof |
extcoff: $(TARGET).elf |
@echo |
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof |
# Program the device. |
program: $(TARGET).hex $(TARGET).eep |
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) |
# Create final output files (.hex, .eep) from ELF output file. |
%.hex: %.elf |
@echo |
@echo $(MSG_FLASH) $@ |
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ |
%.eep: %.elf |
@echo |
@echo $(MSG_EEPROM) $@ |
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ |
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@ |
# Create extended listing file from ELF output file. |
%.lss: %.elf |
@echo |
@echo $(MSG_EXTENDED_LISTING) $@ |
$(OBJDUMP) -h -S $< > $@ |
# Create a symbol table from ELF output file. |
%.sym: %.elf |
@echo |
@echo $(MSG_SYMBOL_TABLE) $@ |
avr-nm -n $< > $@ |
# Link: create ELF output file from object files. |
.SECONDARY : $(TARGET).elf |
.PRECIOUS : $(OBJ) |
%.elf: $(OBJ) |
@echo |
@echo $(MSG_LINKING) $@ |
$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) |
# Compile: create object files from C source files. |
%.o : %.c |
@echo |
@echo $(MSG_COMPILING) $< |
$(CC) -c $(ALL_CFLAGS) $< -o $@ |
# Compile: create assembler files from C source files. |
%.s : %.c |
$(CC) -S $(ALL_CFLAGS) $< -o $@ |
# Assemble: create object files from assembler source files. |
%.o : %.S |
@echo |
@echo $(MSG_ASSEMBLING) $< |
$(CC) -c $(ALL_ASFLAGS) $< -o $@ |
# Target: clean project. |
clean: begin clean_list finished end |
clean_list : |
@echo |
@echo $(MSG_CLEANING) |
# $(REMOVE) $(TARGET).hex |
$(REMOVE) $(TARGET).eep |
$(REMOVE) $(TARGET).obj |
$(REMOVE) $(TARGET).cof |
$(REMOVE) $(TARGET).elf |
$(REMOVE) $(TARGET).map |
$(REMOVE) $(TARGET).obj |
$(REMOVE) $(TARGET).a90 |
$(REMOVE) $(TARGET).sym |
$(REMOVE) $(TARGET).lnk |
$(REMOVE) $(TARGET).lss |
$(REMOVE) $(OBJ) |
$(REMOVE) $(LST) |
$(REMOVE) $(SRC:.c=.s) |
$(REMOVE) $(SRC:.c=.d) |
# Automatically generate C source code dependencies. |
# (Code originally taken from the GNU make user manual and modified |
# (See README.txt Credits).) |
# |
# Note that this will work with sh (bash) and sed that is shipped with WinAVR |
# (see the SHELL variable defined above). |
# This may not work with other shells or other seds. |
# |
%.d: %.c |
set -e; $(CC) -MM $(ALL_CFLAGS) $< \ |
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > $@; \ |
[ -s $@ ] || rm -f $@ |
# Remove the '-' if you want to see the dependency files generated. |
-include $(SRC:.c=.d) |
# Listing of phony targets. |
.PHONY : all begin finish end sizebefore sizeafter gccversion coff extcoff \ |
clean clean_list program |
/branches/thjac/V1_10/menu.c |
---|
0,0 → 1,150 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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 "pitch.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 = 11; |
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 ",GetActiveParamSetNumber()); |
LCD_printfxy(0,3,"(c) Holger Buss"); |
// if(RemoteTasten & KEY3) TestInt--; |
// if(RemoteTasten & KEY4) TestInt++; |
break; |
case 1: |
if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
LCD_printfxy(0,0,"RegOffset: %5i", pressureOffset ); |
LCD_printfxy(0,1,"Luftdruck: %5i", airPressure ); |
LCD_printfxy(0,2,"Off : %5i",DruckOffsetSetting); |
} |
else |
{ |
LCD_printfxy(0,1,"Keine "); |
LCD_printfxy(0,2,"Höhenregelung"); |
} |
break; |
case 2: |
LCD_printfxy(0,0,"akt. Lage"); |
LCD_printfxy(0,1,"Nick: %5i",IntegralNick/1024); |
LCD_printfxy(0,2,"Roll: %5i",IntegralRoll/1024); |
LCD_printfxy(0,3,"Kompass: %5i",KompassValue); |
break; |
case 3: |
LCD_printfxy(0,0,"K1:%4i K2:%4i ",PPM_in[1],PPM_in[2]); |
LCD_printfxy(0,1,"K3:%4i K4:%4i ",PPM_in[3],PPM_in[4]); |
LCD_printfxy(0,2,"K5:%4i K6:%4i ",PPM_in[5],PPM_in[6]); |
LCD_printfxy(0,3,"K7:%4i K8:%4i ",PPM_in[7],PPM_in[8]); |
break; |
case 4: |
LCD_printfxy(0,0,"Ni:%4i Ro:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_NICK]],PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]); |
LCD_printfxy(0,1,"Gs:%4i Gi:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_GAS]],PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]); |
LCD_printfxy(0,2,"P1:%4i P2:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]],PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]]); |
LCD_printfxy(0,3,"P3:%4i P4:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]],PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]]); |
break; |
case 5: |
LCD_printfxy(0,0,"Gyro - Sensor"); |
if(PlatinenVersion == 10) |
{ |
LCD_printfxy(0,1,"Nick %4i (%3i)",AdWertNick - AdNeutralNick, AdNeutralNick); |
LCD_printfxy(0,2,"Roll %4i (%3i)",AdWertRoll - AdNeutralRoll, AdNeutralRoll); |
LCD_printfxy(0,3,"Gier %4i (%3i)",AdNeutralGier - AdWertGier, AdNeutralGier); |
} |
else |
if((PlatinenVersion == 11) || (PlatinenVersion == 20)) |
{ |
LCD_printfxy(0,1,"Nick %4i (%3i)",AdWertNick - AdNeutralNick, AdNeutralNick/2); |
LCD_printfxy(0,2,"Roll %4i (%3i)",AdWertRoll - AdNeutralRoll, AdNeutralRoll/2); |
LCD_printfxy(0,3,"Gier %4i (%3i)",AdNeutralGier - AdWertGier, AdNeutralGier/2); |
} |
else |
if(PlatinenVersion == 13) |
{ |
LCD_printfxy(0,1,"Nick %4i (%3i)(%3i)",AdWertNick - AdNeutralNick, AdNeutralNick/2,AnalogOffsetNick); |
LCD_printfxy(0,2,"Roll %4i (%3i)(%3i)",AdWertRoll - AdNeutralRoll, AdNeutralRoll/2,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; |
default: MaxMenue = MenuePunkt - 1; |
MenuePunkt = 0; |
break; |
} |
RemoteKeys = 0; |
} |
/branches/thjac/V1_10/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_10/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_10/parameter.h |
---|
0,0 → 1,72 |
/* parameter.h |
*/ |
#ifndef PARAMETER_H |
#define PARAMETER_H |
#define PITCH_STICK_THRESHOLD 5 |
#define PARAM_PITCH_MIN2 EE_Parameter.UserParam2 // Minimalgas |
#define PITCH_ALT_THRESHOLD PITCH_MIN2 // Schwellwert für Höhenregelung |
#define PITCH_NEUTRAL_TIMER 25 |
#define PITCH_MIN2_TIMER 100 |
#define PITCH_NEUTRAL_DIFF EE_Parameter.UserParam1 |
#define PARAM_ALT_P Parameter_Hoehe_P |
#define PARAM_ALT_I EE_Parameter.UserParam3 |
#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 |
#define PARAM_ALT_INT_MAX 1000000L |
#define PARAM_EXP_SMOOTHING_FACTOR EE_Parameter.UserParam4 // Faktor für exp. Glättung |
/* Die Motoren können über diesen Parameter aktiviert werden. Ein Wert von 0 |
* deaktiviert die Motoren und kann zum Testen verwendet werden. |
*/ |
#define PARAM_ENGINE_ENABLED ( EE_Parameter.UserParam7 & 0x01 ) // 0=deaktiviert 1=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 ) |
/* 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.UserParam8 & 0x04 ) // 0=deaktiviert 1=an Motoren gekoppelt |
/* Die Ausgänge J16/J17 lassen sich mit dem Gear-Stick ein- und ausschalten. |
*/ |
#define PARAM_LED_STICK_ENABLED ( EE_Parameter.UserParam8 & 0x08 ) |
/* Wenn die Unterspannungswarnung aktiv wird, kann mit diesem Parameter eingestellt |
* werden, daß sich die Blinkfrequenz der LED's verdoppelt. |
*/ |
#define PARAM_LED_WARNING_ENABLED ( EE_Parameter.UserParam8 & 0x10 ) // 0=deaktiviert 1=Schnelles Blinken |
/* Wenn gesetzt, dann wird mit neutralisiertem Pitch-Stick und automatisch |
* zugeschalteter Höhenregelung geflogen. Damit bei versehentlich falscher |
* Konfiguration kein Schaden entsteht, muß zusätzlich beim Einschalten |
* der FlightControl der Gas-Stick in Mittelstellung stehen. |
*/ |
#define PARAM_PITCH_NEUTRAL ( EE_Parameter.UserParam8 & 0x20 ) // 0=normal 1=Neutral-Pitch |
/* Wenn gesetzt, wird nach ca. 2s andauernder Stick-Stellung auf Minimum |
* ein Reset der Pitch-Regelung durchgeführt, so daß der MK ohne Aus- und |
* Einschalten der Motoren wieder starten kann. Die Pitch-Regelung |
* schaltet auf Leerlaufgas zurück und der Stick kann losgelassen werden, |
* ohne das Gas gegeben wird. |
*/ |
#define PARAM_PITCH_RESTART_ENABLED ( EE_Parameter.UserParam8 & 0x40 ) // 0=deaktiviert 1=aktiviert |
#endif // PARAMETER_H |
/branches/thjac/V1_10/pitch.c |
---|
0,0 → 1,375 |
/* pitch.c |
* |
* Pitch-Steuerung |
*/ |
#include "main.h" |
#include "parameter.h" |
#include "fc.h" |
#include "pitch.h" |
#define STATE_STARTUP_WAIT 0x00 // Init-Timeout beim Einschalten abwarten |
#define STATE_STARTUP_INIT 0x01 // Initialisierung beim Einschalten |
#define STATE_BEGIN 0x02 // Anfangszustand nach Einschalten der Motoren |
#define STATE_INITIALIZING 0x03 // Initialisierungsphase |
#define STATE_MANUAL 0x04 // Manuelle Kontrolle, Höhenregelung in Konfiguration deaktiviert |
#define STATE_INACTIVE 0x05 // Manuelle Kontrolle |
#define STATE_WAIT 0x06 // Warten auf Einschalten der Höhenregelung |
#define STATE_ACTIVATING 0x07 // Aktivierung der Höhenregelung |
#define STATE_ACTIVE 0x08 // Höhenregelung ist aktiv |
#define PARAM_INIT_TIMEOUT 25 |
char initTimer = PARAM_INIT_TIMEOUT; |
int stickValue = 0; // Aktueller Stick-Wert |
int lastStickValue = 0; // Vorheriger Stick-Wert |
int zeroStickOffset = 0; // Offset für Stick-Kalibrierung |
int pitchOffset = 0; // Aktueller Grundgaswert in Neutralstellung |
char state = STATE_STARTUP_WAIT; // Zustand |
/* Wird verwendet, um das Umschalten auf automatische Höhenregelung |
* nach Erreichen der Neutralstellung zu verzögern. |
*/ |
int pitchNeutralTimer = PITCH_NEUTRAL_TIMER; |
// Variable zur Höhenregelung |
int pressureOffset = 0; |
int accZOffset = 0; |
int lastError = 0; |
int lastN = 0; // Zuletzt errechneter Fehlerwert |
int averageN = 0; |
long altIntegral = 0; |
int temp; // Temporäre Werte; wird mehrfach verwendet |
char pitchNeutralStartup = 1; // 1=Gas-Stick beim Einschalten in Mittelstellung |
extern unsigned char Notlandung; // aus fc.c |
/* |
* Berechnet den aktuellen Pitch-Wert für die Regelung |
* |
* Nach dem Einschalten der FC wird der aktuelle Gas-Stick-Wert gelesen und als Kalibrierungswert |
* für die Neutralstellung gespeichert. Somit spielt die korrekte Trimmung des Sticks auf Senderseite |
* keine Rolle. |
* |
* Nach Einschalten der Motoren geht der Stick in Neutralstellung. Diese Stick-Bewegung wird ignoriert |
* und die Motoren drehen mit dem eingestellten MinGas2. Ausgehend von der Neutralstellung wird nun |
* durch Bewegen des Sticks im oberen Bereich das Gas geregelt. |
* |
* Das erstmalige Aktivieren der automatischen Höhenregelung erfolgt durch Loslassen des Sticks im |
* Schwebeflug. Der zuvor aktuelle Stick-Wert wird als Wert in Neutralstellung übernommen und die |
* automatische Höhenregelung sofort aktiviert. |
* |
* Sobald der Stick die Neutralstellung verläßt, wird die automatische Höhenregelung deaktiviert |
* und der vorige Pitch-Wert als Wert der Neutralstellung übernommen. Der Pitch läßt sich nun |
* über den gesamten Stick-Bereich regeln. |
* |
* Erreicht der Stick ein weiteres Mal die Neutralstellung, wird die automatische Höhenregelung |
* wieder aktiviert, jetzt jedoch immer mit einer zeitlichen Verzögerung. Nur so ist ein |
* ungestörtes manuelles Steuern möglich. |
* |
* Der Pitch-Wert ist innerhalb der Regelung durch ein konfigurierbares Minimalgas nach unten begrenzt. |
* Dieses Minimalgas kann auf einen sehr niedrigen Wert eingestellt sein. Um im Flug nicht unterhalb |
* eines Wertes zu gelangen, der die Lageregelung außer Funktion setzt, wird ein zweiter Wert für |
* Minimalgas konfiguriert, der greift, sobald erstmalig die automatische Höhenregelung aktiviert wurde. |
*/ |
int pitch( void ) { |
int register pitchCount = 0; |
// 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. */ |
temp = PPM_in[ EE_Parameter.Kanalbelegung[ K_GAS ] ] - zeroStickOffset; |
if( temp > 0 ) { |
temp = temp + ( ( temp * temp ) / 150 ); |
} else { |
temp = temp - ( ( temp * temp ) / 150 ); |
} |
// Original-Stick-Wert holen und glätten |
stickValue = ( temp + 2 * lastStickValue ) / 3; |
/* Aktuellen Pitch-Wert berechnen. Der Wert ergibt sich aus dem Pitch-Offset |
* zuzüglich dem Stick-Wert. */ |
pitchCount = stickValue + pitchOffset; |
switch( state ) { |
case STATE_BEGIN: |
// Schnelles Bewegen aus dem oberen Bereich des Sticks in Neutralstellung |
if( ( lastStickValue > PITCH_STICK_THRESHOLD ) && |
( lastStickValue - stickValue >= PITCH_NEUTRAL_DIFF ) ) { |
pitchOffset = lastStickValue; |
state = STATE_INITIALIZING; |
pitchNeutralTimer = PITCH_NEUTRAL_TIMER; |
} |
break; |
case STATE_INITIALIZING: |
// Während der Initialisierung das Gas konstant halten |
pitchCount = pitchOffset; |
pitchNeutralTimer--; |
/* Läuft der Timer ab, bevor der Stick die Neutralstellung erreicht, |
* wird die Aktion nicht als "schnelles Bewegen in Neutralstellung" |
* gedeutet. */ |
if( !pitchNeutralTimer ) { |
pitchOffset = 0; |
state = STATE_BEGIN; |
} |
// Ist die Neutralstellung erreicht? |
if( abs( stickValue ) <= PITCH_STICK_THRESHOLD ) { |
// Ist die Höhenregelung aktiviert? |
if( EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG ) { |
state = STATE_ACTIVATING; |
} else { |
state = STATE_MANUAL; |
} |
} |
break; |
/* Wenn die Höhenregelung per Konfiguration deaktiviert ist, verbleibt |
* die Funktion in diesem Zustand. */ |
case STATE_MANUAL: |
// Min2-Gas einstellen für Lageregelung bei Minimalgas |
if( pitchCount < PARAM_PITCH_MIN2 ) { |
pitchCount = PARAM_PITCH_MIN2; |
} |
break; |
/* Die Höhenregelung ist per Konfiguration aktiviert, jedoch befindet |
* sich der Stick außerhalb des als Neutralstellung anerkannten |
* Wertebereiches. Es wird manuell geregelt. */ |
case STATE_INACTIVE: |
// Ist ein Restart zulässig? |
if( PARAM_PITCH_RESTART_ENABLED ) { |
/* Wenn der Gashebel ganz unten steht, Timer für Reduzierung des Minimalgaswertes |
* starten. Hierfür wird die Variable pitchNeutralTimer verwendet. */ |
if( PPM_in[ EE_Parameter.Kanalbelegung[ K_GAS ] ] > 35 - 120 ) { |
pitchNeutralTimer = PITCH_MIN2_TIMER; |
} else { |
pitchNeutralTimer--; |
/* Gashebel steht seit PITCH_MIN2_TIMER ganz unten; jetzt erfolgt die Initialisierung. */ |
if( !pitchNeutralTimer ) { |
state = STATE_BEGIN; |
pitchOffset = 0; |
// Signalisieren |
beeptime = 500; |
} |
} |
} |
// Min2-Gas einstellen für Lageregelung bei Minimalgas |
if( pitchCount < PARAM_PITCH_MIN2 ) { |
pitchCount = PARAM_PITCH_MIN2; |
} |
// Stick ist innerhalb der Neutralstellung |
if( abs( stickValue ) < PITCH_STICK_THRESHOLD ) { |
// Timer neu setzen |
pitchNeutralTimer = PITCH_NEUTRAL_TIMER; |
state = STATE_WAIT; |
} |
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( stickValue ) < PITCH_STICK_THRESHOLD && |
lastStickValue == stickValue ) { |
pitchNeutralTimer--; |
if( !pitchNeutralTimer ) { |
state = STATE_ACTIVATING; |
} |
// Aktivierungskriterium nicht erfüllt, zurück in INACTIVE |
} else { |
state = STATE_INACTIVE; |
} |
break; |
/* Die automatische Höhenregelung wird jetzt aktiviert. Der aktuelle |
* Luftdruck wird gespeichert und notwendige Werte für den Regler |
* werden initialisiert. */ |
case STATE_ACTIVATING: |
// Die Referenzhöhe soll zu Beginn der Neutralstellung genommen werden |
pressureOffset = airPressure; |
accZOffset = Mess_Integral_Hoch / 128; |
lastError = 0; |
lastN = 0; |
averageN = 0; |
altIntegral = 0L; |
state = STATE_ACTIVE; |
// Einschalten der Höhenregelung signalisieren |
beeptime = 500; |
break; |
/* Die automatische Höhenregelung ist aktiv. */ |
case STATE_ACTIVE: |
// Stick ist außerhalb der Neutralstellung |
if( abs( stickValue ) > PITCH_STICK_THRESHOLD ) { |
pitchOffset -= averageN / 4; |
pitchCount = stickValue + pitchOffset; |
lastN = 0; |
state = STATE_INACTIVE; |
// Abschaltung der Höhenregelung signalisieren |
beeptime = 500; |
} |
break; |
} |
// Motoren sind aus |
} else { |
switch( state ) { |
case STATE_STARTUP_WAIT: |
if( !initTimer-- ) { |
state = STATE_STARTUP_INIT; |
} |
break; |
case STATE_STARTUP_INIT: |
/* Lädt den beim Einschalten der FC anliegenden Stickwert als |
* Offset für die Kalibrierung des Gas-Sticks. */ |
zeroStickOffset = PPM_in[ EE_Parameter.Kanalbelegung[ K_GAS ] ]; |
if( zeroStickOffset < -75 ) |
pitchNeutralStartup = 0; |
// Die Einschaltphase ist jetzt beendet |
state = STATE_BEGIN; |
break; |
default: |
/* Nach dem Einschalten der Motoren darf pitchOffset keinen hohen Wert haben, |
* da der Kopter sonst sofort hochschießen würde. |
*/ |
pitchCount = 0; |
pitchOffset = 0; |
stickValue = 0; |
state = STATE_BEGIN; |
} |
} |
if( pitchOffset < 0 ) |
pitchOffset = 0; |
// Pitch-Wert darf nicht < 0 sein |
if( pitchCount < 0 ) { |
pitchCount = 0; |
} |
// pitchCount als Debug-Wert rausschreiben |
DebugOut.Analog[26] = stickValue; |
DebugOut.Analog[28] = pitchCount; |
DebugOut.Analog[29] = pitchOffset; |
return pitchCount; |
} |
/* |
* Berechnet den Korrekturwert für die Höhenregelung |
*/ |
int altitudeController( void ) { |
int register n = 0; |
int register error; |
if( ( state == STATE_ACTIVE ) && !Notlandung ) { |
// Fehlerwert für Regler ermitteln |
error = airPressure - pressureOffset; |
// Proportionalanteil |
n = ( PARAM_ALT_P * error ) / 4; // dividiert durch ( 16 / STICK_GAIN ) = 16 / 4 = 4 |
// Integralanteil |
altIntegral += ( PARAM_ALT_I * error ) / 4; |
// Integral begrenzen |
if( altIntegral > PARAM_ALT_INT_MAX ) |
altIntegral = PARAM_ALT_INT_MAX; |
else if( altIntegral < -PARAM_ALT_INT_MAX ) |
altIntegral = -PARAM_ALT_INT_MAX; |
n += altIntegral / 4000; |
// Differenzialanteil |
n += ( PARAM_ALT_D * ( error - lastError ) ) / 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 |
if( n > altMax ) |
n = altMax; |
else 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_EXP_SMOOTHING_FACTOR * ( n - averageN ) / 100; |
} |
DebugOut.Analog[30] = altIntegral / 4000; |
DebugOut.Analog[27] = n; |
return n; |
} |
/branches/thjac/V1_10/pitch.h |
---|
0,0 → 1,15 |
/* pitch.h |
*/ |
#ifndef _PITCH_H |
#define _PITCH_H |
extern int pressureOffset; |
extern char pitchNeutralStartup; |
#define pitchNeutral() ( pitchNeutralStartup | PARAM_PITCH_NEUTRAL ) |
int pitch( void ); |
int altitudeController( void ); |
#endif |
/branches/thjac/V1_10/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_10/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_10/rc.c |
---|
0,0 → 1,85 |
/*####################################################################################### |
Decodieren eines RC Summen Signals |
#######################################################################################*/ |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "rc.h" |
#include "main.h" |
volatile int PPM_in[11]; |
volatile int PPM_diff[11]; // das diffenzierte Stick-Signal |
volatile unsigned char NewPpmData = 1; |
//############################################################################ |
//zum decodieren des PPM-Signals wird Timer1 mit seiner Input |
//Capture Funktion benutzt: |
void rc_sum_init (void) |
//############################################################################ |
{ |
TCCR1B=(1<<CS11)|(1<<CS10)|(1<<ICES1)|(1<<ICNC1);//|(1 << WGM12); //timer1 prescale 64 |
// PWM |
//TCCR1A = (1 << COM1B1) | (1 << WGM11) | (1 << WGM10); |
//TCCR1B |= (1 << WGM12); |
//OCR1B = 55; |
TIMSK1 |= _BV(ICIE1); |
AdNeutralGier = 0; |
AdNeutralRoll = 0; |
AdNeutralNick = 0; |
return; |
} |
//############################################################################ |
//Diese Routine startet und inizialisiert den Timer für RC |
SIGNAL(SIG_INPUT_CAPTURE1) |
//############################################################################ |
{ |
static unsigned int AltICR=0; |
signed int signal = 0,tmp; |
static int index; |
signal = (unsigned int) ICR1 - AltICR; |
AltICR = ICR1; |
//Syncronisationspause? |
// if((signal > (int) Parameter_UserParam2 * 10) && (signal < 8000)) |
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;} |
// tmp = (7 * (PPM_in[index]) + signal) / 8; |
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) PORTD |= 0x20; else PORTD &= ~0x20; // Servosignal an J3 anlegen |
if(index == 6) PORTD |= 0x10; else PORTD &= ~0x10; // Servosignal an J4 anlegen |
if(index == 7) PORTD |= 0x08; else PORTD &= ~0x08; // Servosignal an J5 anlegen |
} |
} |
} |
/branches/thjac/V1_10/rc.h |
---|
0,0 → 1,29 |
/*####################################################################################### |
Derkodieren eines RC Summen Signals |
#######################################################################################*/ |
#ifndef _RC_H |
#define _RC_H |
#if defined (__AVR_ATmega32__) |
#define TIMER_TEILER CK64 |
#define TIMER_RELOAD_VALUE 250 |
#endif |
#if defined (__AVR_ATmega644__) |
//#define TIMER_TEILER CK64 |
#define TIMER_RELOAD_VALUE 250 |
//#define TIMER_TEILER CK256 // bei 20MHz |
//#define TIMER_RELOAD_VALUE -78 // bei 20MHz |
#endif |
#define GAS PPM_in[2] |
extern void rc_sum_init (void); |
extern volatile int PPM_in[11]; |
extern volatile int PPM_diff[11]; // das diffenzierte Stick-Signal |
extern volatile unsigned char NewPpmData; |
#endif //_RC_H |
/branches/thjac/V1_10/spi.c |
---|
0,0 → 1,290 |
// ######################## 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; |
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; |
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) |
{ |
static unsigned char i =0; |
signed int tmp; |
cli(); |
ToNaviCtrl.IntegralNick = (int) (IntegralNick / 108); |
ToNaviCtrl.IntegralRoll = (int) (IntegralRoll / 108); |
ToNaviCtrl.GyroCompass = ErsatzKompass / GIER_GRAD_FAKTOR; |
ToNaviCtrl.AccNick = (int) ACC_AMPLIFY * (NaviAccNick / NaviCntAcc); |
ToNaviCtrl.AccRoll = (int) ACC_AMPLIFY * (NaviAccRoll / NaviCntAcc); |
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; |
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; |
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; |
} |
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]; |
break; |
case SPI_CMD_OSD_DATA: |
FromNaviCtrl_Value.OsdBar = FromNaviCtrl.Param.Byte[0]; |
FromNaviCtrl_Value.Distance = FromNaviCtrl.Param.Int[1]; |
break; |
case SPI_CMD_GPS_POS: |
// ToFlightCtrl.Param.Long[0] = GPS_Data.Longitude; |
// ToFlightCtrl.Param.Long[1] = GPS_Data.Latitude; |
break; |
case SPI_CMD_GPS_TARGET: |
// ToFlightCtrl.Param.Long[0] = GPS_Data.TargetLongitude; |
// ToFlightCtrl.Param.Long[1] = GPS_Data.TargetLatitude; |
break; |
default: |
break; |
} |
} |
else |
{ |
// KompassValue = 0; |
// KompassRichtung = 0; |
GPS_Nick = 0; |
GPS_Roll = 0; |
} |
} |
#endif |
/branches/thjac/V1_10/spi.h |
---|
0,0 → 1,144 |
// ######################## 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_CMD_OSD_DATA 100 |
#define SPI_CMD_GPS_POS 101 |
#define SPI_CMD_GPS_TARGET 102 |
#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 int OsdBar; |
signed int Distance; |
signed char Kalman_K; |
signed char Kalman_MaxDrift; |
signed char Kalman_MaxFusion; |
}; |
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; |
//#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_10/timer0.c |
---|
0,0 → 1,225 |
#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; |
volatile unsigned int ServoState = 40; |
unsigned int BeepMuster = 0xffff; |
unsigned int ServoValue = 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; |
} |
} |
} |
//---------------------------- |
void Timer_Init(void) |
{ |
tim_main = SetDelay(10); |
TCCR0B = CK8; |
TCCR0A = (1<<COM0A1)|(1<<COM0B1)|3;//fast PWM |
OCR0A = 0; |
OCR0B = 120; |
TCNT0 = (unsigned char)-TIMER_RELOAD_VALUE; // reload |
//OCR1 = 0x00; |
TCCR2A=(1<<COM2A1)|(1<<COM2A0)|3; |
// TCCR2B=(0<<CS20)|(1<<CS21)|(1<<CS22); // clk/256 |
TCCR2B=(0<<CS20)|(0<<CS21)|(1<<CS22); // clk/64 |
TIMSK2 |= _BV(OCIE2A); |
TIMSK0 |= _BV(TOIE0); |
OCR2A = 10; |
TCNT2 = 0; |
} |
// ----------------------------------------------------------------------- |
unsigned int SetDelay (unsigned int t) |
{ |
// TIMSK0 &= ~_BV(TOIE0); |
return(CountMilliseconds + t + 1); |
// TIMSK0 |= _BV(TOIE0); |
} |
// ----------------------------------------------------------------------- |
char CheckDelay(unsigned int t) |
{ |
// TIMSK0 &= ~_BV(TOIE0); |
return(((t - CountMilliseconds) & 0x8000) >> 9); |
// TIMSK0 |= _BV(TOIE0); |
} |
// ----------------------------------------------------------------------- |
void Delay_ms(unsigned int w) |
{ |
unsigned int akt; |
akt = SetDelay(w); |
while (!CheckDelay(akt)); |
} |
void Delay_ms_Mess(unsigned int w) |
{ |
unsigned int akt; |
akt = SetDelay(w); |
while (!CheckDelay(akt)) ANALOG_ON; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Servo ansteuern |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
SIGNAL(SIG_OVERFLOW2) { |
if (ServoState > 0) |
PORTD |= 0x80; |
else |
PORTD &= ~0x80; |
TCCR2A = 3; |
TIMSK2 &= ~_BV( TOIE2 ); |
} |
SIGNAL(SIG_OUTPUT_COMPARE2A) { |
static unsigned char postPulse = 0x80; |
static int filterServo = 100; |
if( ServoState == 4 ) { |
ServoValue = 0x0030; // Offset Part1 |
filterServo = ( filterServo * 3 + (int) Parameter_ServoNickControl * 2 ) >> DIV_4; |
ServoValue += filterServo; |
// Min und Max vorverlegt, damit sich diese auf ServoNickControl beziehen und ggf. noch Nick-kompensiert werden |
if( ServoValue < ( (int) EE_Parameter.ServoNickMin * 3 ) ) |
ServoValue = (int) EE_Parameter.ServoNickMin * 3; |
else if( ServoValue > ( (int) EE_Parameter.ServoNickMax * 3 ) ) |
ServoValue = (int) EE_Parameter.ServoNickMax * 3; |
long integral; |
/* Ü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 ) |
ServoValue += ( (long) ( (long) EE_Parameter.ServoNickComp * integral ) >> DIV_128 ) / ( 512L >> DIV_4 ); |
else |
ServoValue -= ( (long) ( (long) EE_Parameter.ServoNickComp * integral ) >> DIV_128 ) / ( 512L >> DIV_4 ); |
DebugOut.Analog[20] = ServoValue; |
if ( ( ServoValue % 255 ) < 45 ) { |
ServoValue += 77; |
postPulse = 0x60 - 77; |
} else { |
postPulse = 0x60; |
} |
OCR2A = 255 - ( ServoValue % 256 ); |
TCCR2A = (1 << COM2A1 ) | ( 1 << COM2A0 ) | 3; |
} else if( ( ServoState > 0 ) && ( ServoState < 4 ) ) { |
if( ServoValue > 255 ) { |
PORTD |= 0x80; |
TCCR2A = 3; |
ServoValue -= 255; |
} else { |
TCCR2A = ( 1 << COM2A1 ) | ( 0 << COM2A0 ) | 3; |
OCR2A = postPulse; // Offset Part2 |
ServoState = 1; |
} |
} else if( ServoState == 0 ) { |
ServoState = (int) EE_Parameter.ServoNickRefresh << MUL_4; |
PORTD &= ~0x80; |
TCCR2A = 3; |
} |
ServoState--; |
} |
/branches/thjac/V1_10/timer0.h |
---|
0,0 → 1,17 |
#define TIMER_TEILER CK8 |
#define TIMER_RELOAD_VALUE 250 |
void Timer_Init(void); |
void Delay_ms(unsigned int); |
void Delay_ms_Mess(unsigned int); |
unsigned int SetDelay (unsigned int t); |
char CheckDelay (unsigned int t); |
extern volatile unsigned int CountMilliseconds; |
extern volatile unsigned char UpdateMotor; |
extern volatile unsigned int beeptime; |
extern volatile unsigned int cntKompass; |
extern unsigned int ServoValue; |
extern unsigned int BeepMuster; |
extern volatile unsigned char SendSPI; |
/branches/thjac/V1_10/twimaster.c |
---|
0,0 → 1,204 |
/*############################################################################ |
############################################################################*/ |
#include "main.h" |
volatile unsigned char twi_state = 0; |
unsigned char motor = 0; |
unsigned char motorread = 0; |
unsigned char motor_rx[8]; |
//############################################################################ |
//Initzialisieren der I2C (TWI) Schnittstelle |
void i2c_init(void) |
//############################################################################ |
{ |
TWSR = 0; |
TWBR = ((SYSCLK/SCL_CLOCK)-16)/2; |
} |
//############################################################################ |
//Start I2C |
char i2c_start(void) |
//############################################################################ |
{ |
TWCR = (1<<TWSTA) | (1<<TWEN) | (1<<TWINT) | (1<<TWIE); |
return(0); |
} |
//############################################################################ |
//Start I2C |
void i2c_stop(void) |
//############################################################################ |
{ |
TWCR = (1<<TWEN) | (1<<TWSTO) | (1<<TWINT); |
} |
void i2c_reset(void) |
//############################################################################ |
{ |
i2c_stop(); |
twi_state = 0; |
motor = TWDR; |
motor = 0; |
TWCR = 0x80; |
TWAMR = 0; |
TWAR = 0; |
TWDR = 0; |
TWSR = 0; |
TWBR = 0; |
i2c_init(); |
i2c_start(); |
i2c_write_byte(0); |
} |
//############################################################################ |
//Start I2C |
char i2c_write_byte(char byte) |
//############################################################################ |
{ |
TWSR = 0x00; |
TWDR = byte; |
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE); |
return(0); |
} |
//############################################################################ |
//Start I2C |
SIGNAL (TWI_vect) |
//############################################################################ |
{ |
switch (twi_state++) |
{ |
case 0: |
i2c_write_byte(0x52+(motor*2)); |
break; |
case 1: |
switch(motor++) |
{ |
case 0: |
i2c_write_byte(Motor_Vorne); |
break; |
case 1: |
i2c_write_byte(Motor_Hinten); |
break; |
case 2: |
i2c_write_byte(Motor_Rechts); |
break; |
case 3: |
i2c_write_byte(Motor_Links); |
break; |
} |
break; |
case 2: |
i2c_stop(); |
if (motor<4) twi_state = 0; |
else motor = 0; |
i2c_start(); |
break; |
//Liest Daten von Motor |
case 3: |
i2c_write_byte(0x53+(motorread*2)); |
break; |
case 4: |
switch(motorread) |
{ |
case 0: |
i2c_write_byte(Motor_Vorne); |
break; |
case 1: |
i2c_write_byte(Motor_Hinten); |
break; |
case 2: |
i2c_write_byte(Motor_Rechts); |
break; |
case 3: |
i2c_write_byte(Motor_Links); |
break; |
} |
break; |
case 5: //1 Byte vom Motor lesen |
motor_rx[motorread] = TWDR; |
case 6: |
switch(motorread) |
{ |
case 0: |
i2c_write_byte(Motor_Vorne); |
break; |
case 1: |
i2c_write_byte(Motor_Hinten); |
break; |
case 2: |
i2c_write_byte(Motor_Rechts); |
break; |
case 3: |
i2c_write_byte(Motor_Links); |
break; |
} |
break; |
case 7: //2 Byte vom Motor lesen |
motor_rx[motorread+4] = TWDR; |
motorread++; |
if (motorread>3) motorread=0; |
i2c_stop(); |
I2CTimeout = 10; |
twi_state = 0; |
break; |
case 8: // Gyro-Offset |
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; |
} |
TWCR |= 0x80; |
} |
/branches/thjac/V1_10/twimaster.h |
---|
0,0 → 1,33 |
/*############################################################################ |
############################################################################*/ |
#ifndef _I2C_MASTER_H |
#define _I2C_MASTER_H |
//############################################################################ |
// I2C Konstanten |
#define SCL_CLOCK 200000L |
#define I2C_TIMEOUT 30000 |
#define I2C_START 0x08 |
#define I2C_REPEATED_START 0x10 |
#define I2C_TX_SLA_ACK 0x18 |
#define I2C_TX_DATA_ACK 0x28 |
#define I2C_RX_SLA_ACK 0x40 |
#define I2C_RX_DATA_ACK 0x50 |
//############################################################################ |
extern volatile unsigned char twi_state; |
extern unsigned char motor; |
extern unsigned char motorread; |
extern unsigned char motor_rx[8]; |
void i2c_reset(void); |
extern void i2c_init (void); // I2C initialisieren |
extern char i2c_start (void); // Start I2C |
extern void i2c_stop (void); // Stop I2C |
extern char i2c_write_byte (char byte); // 1 Byte schreiben |
extern void i2c_reset(void); |
#endif |
/branches/thjac/V1_10/uart.c |
---|
0,0 → 1,533 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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 char DebugTextAnforderung = 255; |
unsigned char PcZugriff = 100; |
unsigned char MotorTest[4] = {0,0,0,0}; |
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; |
int Debug_Timer,Kompass_Timer; |
unsigned int DebugDataIntervall = 200; |
const unsigned char ANALOG_TEXT[32][16] = |
{ |
//1234567890123456 |
"IntegralNick ", //0 |
"IntegralRoll ", |
"AccNick ", |
"AccRoll ", |
"GyroGier ", |
"HoehenWert ", //5 |
"AccZ ", |
"Gas ", |
"KompassValue ", |
"Spannung ", |
"Empfang ", //10 |
"Ersatzkompass ", |
"Motor_Vorne ", |
"Motor_Hinten ", |
"Motor_Links ", |
"Motor_Rechts ", //15 |
" ", |
"Distance ", |
"OsdBar ", |
"MK3Mag CalState ", |
"Servo ", //20 |
"Nick ", |
"Roll ", |
" ", |
" ", |
" ", //25 |
"StickValue ", |
"Altitude N ", |
"PitchCount ", |
"PitchOffset ", |
"IntegralAlt ", //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 |
memcpy(&MotorTest[0], (unsigned char *)pRxData, sizeof(MotorTest)); |
//while(!UebertragungAbgeschlossen); |
//SendOutData('T', MeineSlaveAdresse, 0); |
PcZugriff = 255; |
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(); |
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 |
memcpy(&MotorTest[0], (unsigned char *)pRxData, sizeof(MotorTest)); |
while(!UebertragungAbgeschlossen); |
SendOutData('T', MeineSlaveAdresse, 0); |
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 '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 = VERSION_MAJOR; |
VersionInfo.SWMinor = VERSION_MINOR; |
VersionInfo.SWPatch = VERSION_PATCH; |
VersionInfo.ProtoMajor = VERSION_SERIAL_MAJOR; |
VersionInfo.ProtoMinor = VERSION_SERIAL_MINOR; |
pRxData = 0; |
RxDataLen = 0; |
} |
//--------------------------------------------------------------------------------------------- |
void DatenUebertragung(void) |
{ |
if(!UebertragungAbgeschlossen) return; |
if(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 / 108); // etwa in 0,1 Grad |
WinkelOut.Winkel[1] = (int) (IntegralRoll / 108); // 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(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_10/uart.h |
---|
0,0 → 1,112 |
#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 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 DecodeNMEA(void); |
extern void BearbeiteRxDaten(void); |
extern unsigned char MotorTest[4]; |
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_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 |
#endif //_UART_H |
/branches/thjac/V1_10/version.txt |
---|
0,0 → 1,182 |
------- |
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 |
Baseline V0.70d |
V0_10 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_10a T. Jachmann |
- Baseline V0.71h |
- Alle Änderungen gegenüber der Original-SW sind jetzt per UserParameter konfigurierbar |
- Zwei Pitch-Modi; Es kann auch mit der Original-Pitch-Steuerung geflogen werden |
- Automatische Erkennung des Pitch-Modus beim Einschalten der FC oder per Konfiguration |
- Optimierter (weicherer) Übergang von autom. Höhenregelung auf manuelle Steuerung |
- Looping-Funktion wieder drin (jedoch nur für "+"-Formationsflug) |
- Signalisierung der Unterspannungswarnung über LED-Ausgänge |
- Möglichkeit des Schaltens der LED-Ausgänge über den Sender |
- Simulationsmodus: Deaktivieren der Motoren (wird später wieder entfernt!) |