/branches/Znib/V0.78f/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/Znib/V0.78f/GPS.c |
---|
0,0 → 1,32 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) Holger Buss, Ingo Busker |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
signed int GPS_Nick = 0; |
signed int GPS_Roll = 0; |
signed int GPS_Nick2 = 0; |
signed int GPS_Roll2 = 0; |
long GpsAktuell_X = 0; |
long GpsAktuell_Y = 0; |
long GpsZiel_X = 0; |
long GpsZiel_Y = 0; |
void GPS_Neutral(void) |
{ |
GpsZiel_X = GpsAktuell_X; |
GpsZiel_Y = GpsAktuell_Y; |
} |
void GPS_BerechneZielrichtung(void) |
{ |
GPS_Nick = 0; |
GPS_Roll = 0; |
} |
/branches/Znib/V0.78f/Hex-Files/BootLoader_MEGA644P_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/Znib/V0.78f/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/Znib/V0.78f/Hex-Files/Flight-Ctrl_MEGA644_V0_78f.hex |
---|
0,0 → 1,3719 |
:100000000C94A1060C94E7060C94E7060C94E70602 |
:100010000C94E7060C94E7060C94E7060C94E706AC |
:100020000C94E7060C9462180C94E7060C94E7060F |
:100030000C947B2D0C94E7060C94E7060C94E706D1 |
:100040000C94E7060C94E7060C94F7160C94E7065C |
:100050000C94660E0C94E7060C94300E0C94E70694 |
:100060000C946E1D0C94E7060C94362C0C94E70649 |
:100070000C948E700C94E7060C94836B991D9E1D56 |
:10008000A31DAC1DC31DDA1DEA1DFA1D171E71202C |
:10009000DA1D331F441F731F911FAE1F08206320FA |
:1000A0004122BA227623ED235624F92404276B2714 |
:1000B000E5272F287A28C72814296E29DB29752AD5 |
:1000C0006F2B592C8B2C9A2CC52CF72C072D472DD8 |
:1000D000472D342D1F2D212D3B2D292D342D242D41 |
:1000E000262D3B2D292D342D362D382D3B2D3F2D02 |
:1000F0000A0D426174743A0020332043656C6C73BE |
:1001000020200020342043656C6C73202000204C9C |
:100110006F77207761726E696E67206C6576656CAB |
:100120003A2025642E2564000A0D47656E657261CC |
:1001300074696E672064656661756C74204D6978BA |
:100140006572205461626C65000A0D4D69786572B4 |
:100150002D436F6E6669673A20272573272028256F |
:1001600075204D6F746F727329000A0D466F756E9E |
:100170006420424C2D4374726C3A200025642000A8 |
:100180000A0D0A0D2121204D495353494E47204263 |
:100190004C2D4354524C3A202564202121000A0D55 |
:1001A0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D7F |
:1001B0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D6F |
:1001C0003D3D3D000A0D496E69742E204545505253 |
:1001D0004F4D003A2047656E65726174696E672005 |
:1001E00044656661756C742D506172616D657465EE |
:1001F00072207573696E67206F6C64205374696335 |
:100200006B2053657474696E6773000A0D466C69E0 |
:100210006768742D74696D65202575206D696E2081 |
:1002200020546F74616C3A2575206D696E000A0D5B |
:10023000414343206E6F742063616C696272617424 |
:1002400065642021000A0D5573696E672070617224 |
:10025000616D65746572736574202564000A0D43D1 |
:10026000616C6962726174696E6720707265737324 |
:100270007572652073656E736F722E2E004F4B0A78 |
:100280000D000A0D436F6E74726F6C3A2000486562 |
:100290006164696E67486F6C64004E6F726D616C6B |
:1002A00020284143432D4D6F646529000A0D3D3DD3 |
:1002B0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D6E |
:1002C0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D5E |
:1002D0003D0A0D00416E676C654E69636B202020FE |
:1002E00020202020416E676C65526F6C6C202020AE |
:1002F000202020204163634E69636B202020202052 |
:1003000020202020416363526F6C6C20202020202D |
:10031000202020205961774779726F2020202020EB |
:10032000202020204865696768742056616C7565D7 |
:10033000202020204163635A2020202020202020DC |
:1003400020202020476173202020202020202020F2 |
:1003500020202020436F6D706173732056616C758F |
:1003600065202020566F6C74616765205B302E31EC |
:10037000565D20205265636569766572204C65760E |
:10038000656C20204779726F20436F6D70617373C5 |
:10039000202020204D6F746F7220312020202020DB |
:1003A000202020204D6F746F7220322020202020CA |
:1003B000202020204D6F746F7220332020202020B9 |
:1003C000202020204D6F746F7220342020202020A8 |
:1003D000202020202020202020202020202020201D |
:1003E000202020202020202020202020202020200D |
:1003F00020202020566172696F4D6574657220203F |
:10040000202020204D4B334D61672043616C537495 |
:1004100061746520536572766F2020202020202093 |
:1004200020202020486F766572676173202020208D |
:100430002020202043757272656E74205B302E314F |
:10044000415D20204361706163697479205B6D4177 |
:10045000685D202020202020202020202020202017 |
:10046000202020202020202020202020202020208C |
:10047000202020202020202020202020202020207C |
:10048000202020202020202020202020202020206C |
:10049000202020204932432D4572726F7220202087 |
:1004A000202020202020202020202020202020204C |
:1004B000202020204750535F4E69636B202020206E |
:1004C000202020204750535F526F6C6C202020204A |
:1004D0002020202021212120494E434F4D504154BE |
:1004E00049424C4520212121002E000A0D20444183 |
:1004F00043206F7220493243204552524F522120EF |
:10050000436865636B204932432C2033567265661D |
:100510002C2044414320616E6420424C2D43747270 |
:100520006C005B25695D005B25695D002B204D69D2 |
:100530006B726F4B6F70746572202B0048573A5680 |
:1005400025642E25642053573A25642E256425639F |
:100550000053657474696E673A25642025730049F9 |
:100560003243204552524F52212121004D6973736D |
:10057000696E6720424C2D4374726C3A25642121C8 |
:10058000004865696768743A20202535690053651D |
:1005900074706F696E743A253569005072657373B3 |
:1005A0007572653A253569004F66667365743A2041 |
:1005B000202535690048656967687420636F6E742B |
:1005C000726F6C0044495341424C45440048656990 |
:1005D00067687420636F6E74726F6C004449534196 |
:1005E000424C4544006163742E2062656172696EFD |
:1005F00067004E69636B3A20202020202025356952 |
:1006000000526F6C6C3A2020202020202535690094 |
:10061000436F6D706173733A202020253569004B5C |
:10062000313A25346920204B323A25346920004B79 |
:10063000333A25346920204B343A25346920004B65 |
:10064000353A25346920204B363A25346920004B51 |
:10065000373A25346920204B383A25346920004E3A |
:10066000693A2534692020526F3A253469200047C1 |
:10067000733A253469202047693A253469200050AF |
:10068000313A253469202050323A2534692000500F |
:10069000333A253469202050343A25346920004704 |
:1006A00079726F202D2053656E736F72004E6963EF |
:1006B0006B25346920282533692E25692900526F5E |
:1006C0006C6C25346920282533692E25692900475B |
:1006D000696572253469202825336929004E6963CC |
:1006E0006B2025346920282533692E25782900526E |
:1006F0006F6C6C2025346920282533692E257829D4 |
:100700000059617720202534692028253369290084 |
:100710004E69636B202534692028253369292825F3 |
:1007200033692900526F6C6C2025346920282533E9 |
:1007300069292825336929005961772020253469E2 |
:10074000202825336929282533692900414343207E |
:100750002D2053656E736F72004E69636B202534D4 |
:100760006920282533692900526F6C6C2025346973 |
:10077000202825336929005A20202020253469208B |
:10078000282533692900566F6C746167653A20200B |
:10079000202533692E253169560043757272656EC6 |
:1007A000743A2020202533692E2531694100506F8D |
:1007B0007765723A2020202020253469570044694B |
:1007C000736368617267653A202535696D41680019 |
:1007D00052656365697665720052432D52535349E1 |
:1007E0003A202020202534690052432D5175616C38 |
:1007F0006974793A202534690052432D4368616E4B |
:100800006E656C733A25346900436F6D7061737364 |
:100810000048656164696E673A2020253569005695 |
:10082000616C75653A20202020253569005374617C |
:1008300072743A2020202025356900506F74693188 |
:100840003A202025336900506F7469323A20202500 |
:10085000336900506F7469333A20202533690050A2 |
:100860006F7469343A202025336900506F746935FC |
:100870003A202025336900506F7469363A202025CC |
:10088000336900506F7469373A202025336900506E |
:100890006F7469383A202025336900536572766F8A |
:1008A000202000536574706F696E742020253369B1 |
:1008B00000506F736974696F6E3A20253369005276 |
:1008C000616E67653A2533692D2533690045787473 |
:1008D00065726E436F6E74726F6C2020004E693AC1 |
:1008E0002534692020526F3A253469200047733A35 |
:1008F000253469202047693A253469200048693A3F |
:10090000253469202043663A2534692000424C2D65 |
:100910004374726C204572726F72732000253364C9 |
:1009200020253364202533642025336420002533BB |
:10093000642025336420253364202533642000257A |
:10094000336420253364202533642025336420005C |
:10095000424C2D4374726C20666F756E64200020CB |
:1009600025632020202563202020256320202025AA |
:10097000632000202563202020256320202025637C |
:10098000202020256320002025632020202D2020EA |
:10099000202D2020202D2000313000313100313237 |
:1009A00000466C696768742D54696D652020005499 |
:1009B0006F74616C3A2535756D696E004163743AE8 |
:1009C00020202535756D696E002872657365742960 |
:1009D000000A0D506C6561736520636F6E6E656310 |
:1009E00074205370656B7472756D207265636569F0 |
:1009F00076657220666F722062696E64696E672028 |
:100A00004E4F572E2E2E006F6B2E0A0D0054696D1F |
:100A1000656F75742E0A0D0000008F001E01AD0178 |
:100A20003B02CA025803E603740402058F051B0645 |
:100A3000A7063307BE074808D2085B09E3096B0A1B |
:100A4000F20A780BFD0B810C040D860D070E870E44 |
:100A5000060F840F00107B10F5106E11E5115B126C |
:100A6000CF124213B31323149214FE146A15D31534 |
:100A70003B16A11605176717C81727188318DE1825 |
:100A800037198E19E319361A871AD61A231B6E1BCB |
:100A9000B61BFD1B411C831CC31C001D3C1D751D8A |
:100AA000AB1DE01D121E421E6F1E9A1EC31EE91EC4 |
:100AB0000D1F2E1F4D1F691F841F9B1FB01FC31FBB |
:100AC000D31FE11FEC1FF51FFB1FFF1F00200301B9 |
:100AD00000009F6500020101646601030202D36603 |
:100AE0000200030330672532692E2531695600253F |
:100AF0003033646D20253033642563005374617492 |
:100B0000757300253469202532693A253032690031 |
:100B10002534696D2563004E69636B20526F6C6CE0 |
:100B20002020596177002534692025346920253437 |
:100B300069002532692E2531695620202533692E1A |
:100B4000253169410025346957202536696D416892 |
:100B5000005361743A25303264004E6F4669780064 |
:100B60003244466978003344466978003F3F46691D |
:100B700078002F4447505300486F6D653A25303355 |
:100B8000646D20253033642563004E6F204E6176FE |
:100B9000694374726C21000A0D7777772E4D696B6B |
:100BA000726F4B6F707465722E6465202863292004 |
:100BB000486953797374656D7320476D6248000A04 |
:100BC0000D74686520757365206F6620746869739D |
:100BD00020736F667477617265206973206F6E6C25 |
:100BE00079207065726D6974746564200A0D6F6E8A |
:100BF000206F726967696E616C204D696B726F4B13 |
:100C00006F707465722D486172647761726500411E |
:100C100043542044534C004A6574692073617465E1 |
:100C20006C6C6974005370656B7472756D207361C0 |
:100C300074656C6C697420284C6F77207265736FD3 |
:100C40006C7574696F6E29005370656B7472756D85 |
:100C500020736174656C6C697420283230343829D3 |
:100C6000005370656B7472756D20736174656C6C84 |
:100C70006974004D756C74697369676E616C20509E |
:100C8000504D000A0D52656365697665723A200021 |
:100C9000756E6B6E6F776E2E205573696E67205080 |
:100CA000504D2E2E2E006E6F7420737570706F7203 |
:100CB000746564206279206861726477617265216D |
:100CC000000A0D3D3D3D3D3D3D3D3D3D3D3D3D3DF4 |
:100CD0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D44 |
:100CE0003D3D3D3D3D3D000A0D466C6967687443DE |
:100CF0006F6E74726F6C0A0D486172647761726511 |
:100D00003A25642E25640A0D536F66747761726507 |
:100D10003A5625642E2564256320000A0D3D3D3D8D |
:100D20003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3DF3 |
:100D30003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3DE3 |
:100D4000000011241FBECFEFD0E1DEBFCDBF11E008 |
:100D5000A0E0B1E0E2E8F7EE02C005900D92A03D00 |
:100D6000B107D9F718E0A0EDB1E001C01D92A233A0 |
:100D7000B107E1F76AEAE2E0F0E081E28093570030 |
:100D80007491AE014F5F5F4F20EF3FEFDA019FE0BC |
:100D9000F9012F5F3F4F84918D93915097FFF8CFCA |
:100DA000773911F40000FECFFA019EE081916827A7 |
:100DB0006095915097FFFACF8889681721F07739AD |
:100DC00011F40000FECF0E9447080C94C0730C94ED |
:100DD0000000F999FECF92BD81BDF89A80B59927A0 |
:100DE0000895F999FECF1FBA92BD81BD60BD0FB6BF |
:100DF000F894FA9AF99A0FBE0895282FFB018150B2 |
:100E0000853008F023E0842F992733272150304084 |
:100E1000829FB001839F700D929F700D11246C59B9 |
:100E20007F4F29EE36E0AC01CF010E945D710E9438 |
:100E3000E9610895282F863010F025E002C088234C |
:100E400069F0F999FECF1FBA82E090E092BD81BDB2 |
:100E500020BD0FB6F894FA9AF99A0FBE0895FF9242 |
:100E60000F931F93CF93C82F8B01F42E863010F071 |
:100E7000C5E002C0882389F18F2D99272C2F3327B5 |
:100E800021503040829FF001839FF00D929FF00D22 |
:100E9000112421EF36E0AC01B801CF018C599F4FEE |
:100EA0000E948271F999FECF1FBA82E690E092BD4E |
:100EB00081BDF0BC0FB6F894FA9AF99A0FBE21EFF3 |
:100EC00036E04CE050E0B80180E590E00E9482718D |
:100ED0008C2F0E941A070E94E961CF911F910F91F8 |
:100EE000FF900895CF93F999FECF82E090E092BDF4 |
:100EF00081BDF89A80B5C82F8150853020F0C3E0BD |
:100F00008C2F0E941A078C2F9927CF9108958091DA |
:100F1000C206E82FFF27EE0FFF1FED5AF94F808121 |
:100F200091818D5E9F4F14F0109203018081918119 |
:100F30008A5B9F4FCCF4809103018823A9F481E060 |
:100F40008093030180917F048F5F80937F048530BD |
:100F500038F088EE93E09093FF018093FE0104C087 |
:100F600066E970E00E947F3280917F049927909318 |
:100F7000F9058093F80508951F93CF93DF93182FF9 |
:100F8000882389F080EF90E09F938F9380E194E134 |
:100F90009F938F93E091FE03F091FF0309950F90CB |
:100FA0000F900F900F908091E406823308F046C0B6 |
:100FB00084EF91E00E94E217EC01112329F0CE01A9 |
:100FC0000E94EB178823D9F3809125019091260187 |
:100FD0002091E4068238910584F433E0239FC00118 |
:100FE000112480930001112359F168EC70E0832FE4 |
:100FF0000E947F3288EF90E011C0822F9927880FDE |
:10100000991F880F991F809300011123C9F068EC84 |
:1010100070E084E00E947F3283E091E09F938F93A1 |
:1010200080E194E19F938F93E091FE03F091FF03A1 |
:1010300009950F900F900F900F9002C080930001C0 |
:10104000112309F1809100016AE00E941373892F36 |
:1010500099279F938F93809100010E941373992782 |
:101060009F938F938EE091E09F938F9380E194E123 |
:101070009F938F93E091FE03F091FF0309958DB745 |
:101080009EB708968DBFDF91CF911F910895CFEF46 |
:10109000D0E1DEBFCDBF88249924C0E0C4B9C5B972 |
:1010A000A7EECA2EA3E0DA2E8EEC9FEFC80ED91E53 |
:1010B000D7FEFACF189B06C0199B02C08DE007C06F |
:1010C0008BE005C0199B02C084E101C08AE08093D7 |
:1010D000020181E887B93E9A8FEF88B98BE184B924 |
:1010E00081E085B98EE38AB987E48BB9469A84B7E3 |
:1010F000877F84BF80916000886180936000109238 |
:10110000600080ED97E09093FF018093FE011092C4 |
:10111000E8021092E70210925806109257061092B9 |
:10112000EA021092E9021092EC021092EB02209176 |
:101130000201243128F088E894E0A0E0B0E004C087 |
:101140008BE095E0A0E0B0E080937A0190937B0182 |
:10115000A0937C01B0937D012A3011F0243111F469 |
:10116000289801C0289A0E944B180E941C180E94BF |
:1011700018140E945F2D0E942C1C0E94F52B0E94C7 |
:10118000F15D0E9437680E94C16F809102018C302E |
:1011900010F4299A01C0299878944DE062EC76E029 |
:1011A00083E00E94FD06F999FECF88EE93E092BDA0 |
:1011B00081BDF89A80B5813001F5F999FECF81E0C3 |
:1011C00090E092BD81BDF89A80B58F3FB1F029EED5 |
:1011D00036E04DE450E068EE73E080E094E00E9479 |
:1011E0005D71EDE0F4E09FE08081349618160CF418 |
:1011F000CF5F915097FFF8CF56C088E291E09F9360 |
:101200008F9380E194E19F938F93E091FE03F0919F |
:10121000FF0309950F900F900F900F90E0E0F4E01E |
:101220008FE0158616861786108A8150349687FFC0 |
:10123000F8CF80E480930D0480930E0410920F0485 |
:10124000809310048093110490EC909312041092F8 |
:101250001304809314048093150410921604909341 |
:101260001704909318048093190410921A04809321 |
:101270001B0490931C0481E08093000461E074E0FF |
:101280008BE024E031E0DB01F90101900D928A95B9 |
:10129000E1F721EF36E04DE450E06150704088EE18 |
:1012A00093E00E9482718C2F99279F938F9381E006 |
:1012B00094E09F938F9389E491E09F938F93F0E163 |
:1012C000AF2EF4E1BF2EBF92AF92E091FE03F091FA |
:1012D000FF03099510924802109202020E94543EA8 |
:1012E0008DB79EB708968DBF809102028823E1F3E7 |
:1012F000109248028AE691E09F938F93BF92AF923B |
:10130000E091FE03F091FF03099580EA9FE00E94BF |
:10131000E2176C01C0E0D0E00F900F900F900F909B |
:10132000E3E2EE2EE6E0FE2E8E01109202020E9413 |
:10133000543E809102028823E1F3F801E050FC4F13 |
:1013400085851816ACF408C0909302020E94543EA2 |
:10135000809102028823E1F3C6010E94EB17982FC7 |
:10136000882331F4F801EE5DF94F8181882364F719 |
:10137000D7018C9187FF13C02196DF93CF932197DC |
:101380008CE791E09F938F93BF92AF92E091FE0321 |
:10139000F091FF030995EDB7FEB73696EDBF2196A4 |
:1013A0000C5F1F4F84E090E0E80EF91ECC30D105B1 |
:1013B00008F4BBCFC0E0D0E002E216E07DE0E72E0B |
:1013C00074E0F72EF801818187FD1CC0D7018C9154 |
:1013D0001816C4F42196DF93CF93219780E891E00B |
:1013E0009F938F9380E194E19F938F93E091FE030D |
:1013F000F091FF03099581E08093FC01EDB7FEB702 |
:101400003696EDBFF801818180788183219684E052 |
:1014100090E0E80EF91E080F191FCC30D10590F2AC |
:101420008EE991E09F938F9300E114E11F930F9356 |
:10143000E091FE03F091FF0309950E94543E0F9046 |
:101440000F900F900F90F999FECF81E090E092BD40 |
:1014500081BDF89A80B5823509F417C10E94F52F35 |
:1014600084EC91E09F938F931F930F93E091FE0381 |
:10147000F091FF030995C1E00F900F900F900F902E |
:10148000C23039F0C33019F40E949B3104C0C4301B |
:1014900010F00E94C93080910201843168F085E02B |
:1014A0008093E106109202078BE18093DD068EE4C3 |
:1014B0008093FF0680930007F999FECF80E590E0C6 |
:1014C00092BD81BDF89A80B58C3008F0C1C0F99901 |
:1014D000FECF81E590E092BD81BDF89A80B58C3059 |
:1014E00008F0B6C0F999FECF82E590E092BD81BDCB |
:1014F000F89A80B58C3008F0ABC0F999FECF83E53F |
:1015000090E092BD81BDF89A80B58C3008F0A0C003 |
:10151000F999FECF80E590E092BD81BDF89A80B543 |
:101520008093C206F999FECF81E590E092BD81BD1E |
:10153000F89A80B58093C306F999FECF82E590E0D2 |
:1015400092BD81BDF89A80B58093C406F999FECF0B |
:1015500083E590E092BD81BDF89A80B58093C50681 |
:10156000F999FECF84E590E092BD81BDF89A80B5EF |
:101570008093C606F999FECF85E590E092BD81BDC6 |
:10158000F89A80B58093C706F999FECF86E590E07A |
:1015900092BD81BDF89A80B58093C806F999FECFB7 |
:1015A00087E590E092BD81BDF89A80B58093C90629 |
:1015B000F999FECF88E590E092BD81BDF89A80B59B |
:1015C0008F3F09F427C0F999FECF88E590E092BDDE |
:1015D00081BDF89A80B58093CA06F999FECF89E556 |
:1015E00090E092BD81BDF89A80B58093CB06F999C1 |
:1015F000FECF8AE590E092BD81BDF89A80B58093D8 |
:10160000CC06F999FECF8BE590E092BD81BDF89AAA |
:1016100080B50AC089E08093CA068AE08093CB0631 |
:101620008BE08093CC068CE08093CD06C13091F4A2 |
:1016300083ED91E09F938F931F930F93E091FE03AF |
:10164000F091FF0309950F900F900F900F9002C03B |
:101650000E94D02F4CE662EC76E08C2F0E942F0780 |
:10166000CF5FC63008F40CCF83E00E941A07F999C7 |
:10167000FECF1FBA81E090E092BD81BD82E580BDC2 |
:101680000FB6F894FA9AF99A0FBEF999FECF8EE048 |
:1016900090E092BD81BDF89A80B59927382F222716 |
:1016A000F999FECF8FE090E092BD81BDF89A80B5A8 |
:1016B000280F311D3093D5012093D401F999FECF25 |
:1016C0008AE090E092BD81BDF89A80B59927582FA5 |
:1016D00044278FB399279C012270307081FDF9CF88 |
:1016E0008BE090E092BD81BDF89A80B5480F511D06 |
:1016F0005093D3014093D2014F5F5F4F39F08091F7 |
:10170000D4019091D5018F5F9F4F41F43093D50163 |
:101710002093D4013093D3012093D2018091D20140 |
:101720009091D3019F938F938091D4019091D50193 |
:101730009F938F938BE092E09F938F93C0E1D4E1CE |
:10174000DF93CF93E091FE03F091FF030995EDB78E |
:10175000FEB73896EDBFF999FECF84E090E092BDD8 |
:1017600081BDF89A80B5853078F08EE292E09F9343 |
:101770008F93DF93CF93E091FE03F091FF030995E0 |
:101780000F900F900F900F900E9472074CE662EC42 |
:1017900076E00E94FD060E94720799279F938F931F |
:1017A00085E492E09F938F93C0E1D4E1DF93CF93E0 |
:1017B000E091FE03F091FF0309958DB79EB7069661 |
:1017C0008DBF8DE592E09F938F93DF93CF93E09150 |
:1017D000FE03F091FF03099588EE93E00E94E21763 |
:1017E0006C010E94321C0F900F900F900F90C60159 |
:1017F0000E94EB178823D9F38DE792E09F938F9394 |
:10180000DF93CF93E091FE03F091FF0309950E94CF |
:10181000EB3B809102010F900F900F900F908A3058 |
:1018200011F0843111F4289801C0289A80ED97E0D6 |
:101830009093FF018093FE0185E58093810482E807 |
:1018400092E09F938F93DF93CF93E091FE03F0910B |
:10185000FF0309958091CE060F900F900F900F9087 |
:10186000E091FE03F091FF0382FF07C08EE892E053 |
:101870009F938F93DF93CF9308C08AE992E09F9361 |
:101880008F9380E194E19F938F9309950F900F9030 |
:101890000F900F900E94B82188E893E19093A101E6 |
:1018A0008093A00181E0809380040E94BC070E9485 |
:1018B000206F8CEA92E09F938F93DF93CF93E09118 |
:1018C000FE03F091FF03099580ED97E00E94E21777 |
:1018D0006C018AEF90E00E94E217EC010F900F90EC |
:1018E0000F900F90CE010E94EB17882339F084E609 |
:1018F00090E00E94E217EC010E947D70809102024C |
:10190000882309F499C180911701882309F494C1AF |
:101910001092020280917F04882319F00E948707A9 |
:1019200002C00E94A5400E94543E209102012A302C |
:1019300011F0243111F4289801C0289A8091EE0208 |
:10194000882331F08091EE0281508093EE0205C031 |
:1019500080916F00806280936F008091A0019091D0 |
:10196000A10101979093A1018093A0018091A00112 |
:101970009091A101892B21F0809147028823A1F148 |
:101980008091A0019091A101892BB1F40E940B2CB0 |
:1019900085E090E09093A1018093A00180910A06D8 |
:1019A00090910B06019690930B0680930A06809106 |
:1019B000BD0280688093BD02809110019091110159 |
:1019C0008F5F9F4F19F58091E4028823F9F080E141 |
:1019D00097E29093FF018093FE0180E890E090935E |
:1019E00011018093100112C02A3011F0243111F43A |
:1019F000289801C0289A8091FE019091FF01892BBF |
:101A000029F48091BD028F778093BD0280910202FC |
:101A1000882321F08091E402882311F40E945C1451 |
:101A20000E94A410C6010E94EB17882309F400C18C |
:101A3000E4E1F0E0CE0EDF1E80910D01882321F05D |
:101A4000815080930D0125C080938B041092C902B0 |
:101A50001092C8021092C7021092C6021092C502DC |
:101A60001092C40280911001909111018F5F9F4FDD |
:101A700081F48091EE02882361F488E99AE39093DF |
:101A8000FF018093FE0180E09CE090931101809320 |
:101A900010018091D303882339F081508093D303C0 |
:101AA0008091BD028F7B11C01092D1031092D003A0 |
:101AB0001092CF031092CE038091FE019091FF010E |
:101AC000892B29F48091BD0280648093BD028091AE |
:101AD0000001282F3327809125019091260182173C |
:101AE0009307CCF48091BD0280628093BD02809107 |
:101AF0001001909111018F5F9F4FC1F480E797E132 |
:101B00009093FF018093FE0180E093E09093110198 |
:101B1000809310010BC08091FE019091FF01892BF1 |
:101B200029F48091BD028F7D8093BD020E941D61CA |
:101B300084E08093FD018091E402882329F44AEA3D |
:101B4000842E45E0942E12C08091D6018F5F809341 |
:101B5000D601813359F41092D6018091D001909131 |
:101B6000D10101969093D1018093D0010894811CFA |
:101B7000911C42E784164BE0940609F059C0882472 |
:101B800099248091D4019091D50101969093D5012B |
:101B90008093D4012091D2013091D3012F5F3F4F28 |
:101BA0003093D3012093D201892F9927282FF999B7 |
:101BB000FECF1FBA8EE090E092BD81BD20BD0FB672 |
:101BC000F894FA9AF99A0FBE2091D401F999FECFB0 |
:101BD0001FBA8FE090E092BD81BD20BD0FB6F89492 |
:101BE000FA9AF99A0FBE2091D2013091D301409117 |
:101BF000D301F999FECF1FBA8AE090E092BD81BD72 |
:101C000040BD0FB6F894FA9AF99A0FBEF999FECF33 |
:101C10001FBA8BE090E092BD81BD20BD0FB6F89455 |
:101C2000FA9AF99A0FBE84E190E00E94E2176C01E3 |
:101C30000E94F8610E944C688091FD01882309F0A0 |
:101C400051CE0E945E614ECEF999FECF1FBA92BD71 |
:101C500081BD60BD0FB6F894FA9AF99A0FBE089547 |
:101C60001F920F920FB60F9211248F939F93EF93B1 |
:101C7000FF9380910F018823E1F48091F00190910E |
:101C8000F10101969093F1018093F001FC01E05D78 |
:101C9000FA4FE081ED3019F0803A910539F4109255 |
:101CA000F1011092F00181E080930F01E093C600F2 |
:101CB00004C01092F1011092F001FF91EF919F91F9 |
:101CC0008F910F900FBE0F901F9018951F920F923B |
:101CD0000FB60F9211242F933F934F935F936F93FF |
:101CE0007F938F939F93AF93BF93CF93EF93FF9384 |
:101CF00090E08091C6008093E8015091F601503A3F |
:101D000010F09093F7018091E8018D3009F065C0E3 |
:101D10008091F701823009F060C09093F701852F20 |
:101D2000992782579B4FFC01329740812091F20105 |
:101D30003091F301241B3109DC0111978C91281B90 |
:101D40003109C9019F709093F3018093F20146E03D |
:101D5000969587954A95E1F7982F935C9093F401B7 |
:101D60002F733070235C2093F5018081981729F43C |
:101D70008C91281711F491E006C090E08091E50164 |
:101D80008F5F8093E501C091E701CC2309F074C017 |
:101D9000992309F471C081E08093E701580F5093B3 |
:101DA000E4015150E52FFF27E257FB4F8DE0808380 |
:101DB00080919004823509F05FC00E94B82188E1CB |
:101DC00090E02CE00FB6F894A895809360000FBEC9 |
:101DD00020936000C093FC014FC02091F701822F37 |
:101DE000992781309105F9F0823091051CF4892BF7 |
:101DF00021F040C0029711F13DC08091E80183328B |
:101E000039F48091E701882319F481E08093F70188 |
:101E10008091E80180938E0481E08093F6018091A7 |
:101E2000E801992722C02F5F2093F701E52FFF27B4 |
:101E3000E257FB4F8091E801808309C0E52FFF271F |
:101E4000E257FB4F8091E8018083503A20F45F5FB6 |
:101E50005093F60102C01092F7012091E8018091A1 |
:101E6000F2019091F301820F911D9093F301809301 |
:101E7000F20102C01092F701FF91EF91CF91BF9153 |
:101E8000AF919F918F917F916F915F914F913F9112 |
:101E90002F910F900FBE0F901F901895AC01A0E0EE |
:101EA000B0E09D01A817B90748F4E0E3F5E081919F |
:101EB000280F311D1196A417B507C8F33F70FD0117 |
:101EC000E05DFA4FC90156E0969587955A95E1F77E |
:101ED000835C80831196FD01E05DFA4F2F733070B3 |
:101EE000822F835C8083AF5CBA4F8DE08C9310921D |
:101EF0000F01809130058093C6000895A0E0B0E006 |
:101F0000E4E8FFE00C948C732C859D850E85BB2442 |
:101F100083E2809330059F599093310520933205D9 |
:101F200033E0E32EF12C002309F49EC0CF84D8883F |
:101F3000BE016D5E7F4FA989BA890150109709F4DF |
:101F400093C01097B9F0F601EB0DF11DB394908199 |
:101F5000119791F4002349F1FB016E5F7F4FDB0184 |
:101F6000C080D1806E5F7F4F0D90BC91A02DBB24AF |
:101F7000015002C090E019C01097B9F0F601EB0DC6 |
:101F8000F11DB3944081119791F4002341F1FB01BD |
:101F90006E5F7F4FDB01C080D1806E5F7F4F0D9001 |
:101FA000BC91A02DBB24015002C040E018C0109786 |
:101FB000B1F0F601EB0DF11DB3941081119781F48E |
:101FC000002371F0FB013296DB01CD90DC90BF0164 |
:101FD0006E5F7F4FA081B181BB24015001C010E032 |
:101FE000F701E05DFA4F892F86958695835C8083A3 |
:101FF0000894E11CF11CF701E05DFA4F892F992745 |
:102000008370907024E0880F991F2A95E1F7552777 |
:102010009A0194E0369527959A95E1F7822B835C97 |
:1020200080830894E11CF11CF701E05DFA4F4F70CA |
:102030005070440F551F440F551F812F992726E0DC |
:10204000969587952A95E1F7842B835C8083089485 |
:10205000E11CF11CF701E05DFA4F1F73135C108364 |
:102060000894E11CF11C6ACFC7010E944E0FE9E001 |
:102070000C94A873A3E07A2F4091E40146504423C6 |
:1020800009F458C0E72FFF27E257FB4F80818D539B |
:102090007F5FE72FFF27E257FB4F20812D537F5FA4 |
:1020A000E72FFF27E257FB4F30813D537F5FE72F3C |
:1020B000FF27E257FB4F60816D537F5F9927880FA1 |
:1020C000991F880F991F522F52955F70582B822F9E |
:1020D00099278F709070F4E0880F991FFA95E1F7B7 |
:1020E000232F26952695282B832F99278370907070 |
:1020F000E6E0880F991FEA95E1F7682B41504F3FC2 |
:10210000C9F0EA2FFF27E257FB4F5083AF5F4150E2 |
:102110004F3F81F0EA2FFF27E257FB4F2083AF5F4D |
:1021200041504F3F39F0EA2FFF27E257FB4F6083C2 |
:10213000AF5FA5CF81E994E09093E3018093E20142 |
:10214000A350A093E1010895A2E0B0E0EAEAF0E133 |
:102150000C9492738091E701882309F45DC30E9477 |
:102160003A1080918F04823609F01FC2809190044A |
:1021700099278037910509F4ACC081379105A4F403 |
:102180008636910509F470C18736910524F48B34A5 |
:102190009105F1F00AC28D36910509F468C08E36BA |
:1021A000910509F453C001C28337910509F4EDC0CC |
:1021B000843791052CF48137910509F491C0F5C15C |
:1021C0008437910511F18937910509F48AC1EDC170 |
:1021D000E091E201F091E30180819181909301030C |
:1021E000809300032091FE023091FF02821B930B2B |
:1021F000845E9D4F68E671E00E943373845B90407B |
:102200009093FD028093FC02D0C18091E401A091E3 |
:10221000E201B091E301853140F080E1E9E6F4E0CC |
:102220000D9001928A95E1F70DC08D919D910D90D1 |
:10223000BC91A02D8093690490936A04A0936B04D1 |
:10224000B0936C0480EF8093DF0146C080910F0152 |
:102250008823E1F38DE490E09F938F9380E094E0F6 |
:102260009F938F9381E08F938F938EE42AC0809108 |
:102270000F018823E1F3A091E201B091E3011C91E9 |
:10228000113091F460E074E08DE4FB010D90019257 |
:102290008A95E1F724E23EE04DE450E088EE93E0D9 |
:1022A0000E948271198301C0198281E090E09F939E |
:1022B0008F93CE0101969F938F9381E08F938F939D |
:1022C0008DE48F930E947E0F8DB79EB707968DBFCA |
:1022D0006CC181E08093EA018FEF80930D0165C1AD |
:1022E000E091E201F091E30180818F3F39F40E9497 |
:1022F0007207E091E201F091E3018083E091E20155 |
:10230000F091E3018081882311F481E003C08630DD |
:1023100010F085E08083E091E201F091E3014CE66A |
:1023200062EC76E080810E94FD0680910F01882397 |
:10233000E1F3E091E201F091E3018081898382E59C |
:102340008A838CE690E09F938F9382EC96E09F9334 |
:102350008F9321E030E03F932F93CE0102969F931D |
:102360008F933F932F93CE01820F931F9F938F9351 |
:1023700083E08F9381E08F9381E58F930E947E0F9E |
:10238000ADB7BEB71F96ADBF10C12091E20130912D |
:10239000E301F90180818150853008F04CC08181D2 |
:1023A000823509F048C062EC76E08CE62E5F3F4F44 |
:1023B000DB01F901982F01900D929A95E1F72250D7 |
:1023C0003040482FD9018C910E942F078091FF0641 |
:1023D0009927AA27BB27BC01CD0124EC39E040E0B6 |
:1023E00050E00E94F472DC01CB0180939A0190933B |
:1023F0009B01A0939C01B0939D01809100079927B8 |
:10240000AA27BB27BC01CD010E94F472DC01CB01DD |
:102410008093960190939701A0939801B0939901AE |
:10242000E091E201F091E30180810E941A070E948D |
:102430007207898301C0198280910F018823E1F31B |
:1024400081E090E09F938F93CE0101969F938F93AD |
:1024500081E08F938F9383E58F930E947E0FEDB77A |
:10246000FEB73796EDBF2EC0E091E201F091E30197 |
:10247000E0818E2F8150853018F48E2F0E941A072C |
:10248000E091E201F091E301808189834CE662EC06 |
:1024900076E00E94FD0680910F018823E1F381E040 |
:1024A00090E09F938F93CE0101969F938F9381E04D |
:1024B0008F938F9386E48F930E947E0F8DB79EB784 |
:1024C00007968DBF8091E402882329F46EE670E0C0 |
:1024D00089810E947F3280E00E94BC070E94206FA9 |
:1024E00064C0E091E201F091E3018081992787FDCA |
:1024F000909590936E0680936D068181992787FD54 |
:1025000090959093700680936F068281992787FD3E |
:10251000909590937206809371068381992787FD29 |
:10252000909590937406809373068481992787FD14 |
:10253000909590937606809375068581992787FDFF |
:10254000909590937806809377068681992787FDEA |
:10255000909590937A06809379068781992787FDD5 |
:10256000909590937C0680937B068085992787FDC4 |
:10257000909590937E0680937D068185992787FDAF |
:1025800090959093800680937F068285992787FD9A |
:10259000909590938206809381068385992787FD85 |
:1025A0009095909384068093830680919004992758 |
:1025B0008436910509F4C5C085369105ACF48136A1 |
:1025C000910509F479C0823691052CF48B3491057C |
:1025D00009F455C019C18236910509F47AC08336D1 |
:1025E000910509F489C010C18C36910509F4F7C032 |
:1025F0008D3691054CF48736910509F402C1883671 |
:10260000910509F4BCC000C18437910529F08637D3 |
:10261000910509F4F2C0F8C08091E401A091E201B3 |
:10262000B091E301853140F080E1E9E6F4E00D90FE |
:1026300001928A95E1F70DC08D919D910D90BC910D |
:10264000A02D8093690490936A04A0936B04B093C7 |
:102650006C0480910F018823E1F31F9280910C019B |
:102660008F9384E58F930E947E0F8AEF8093DF0122 |
:102670008FEF80930D010F900F900F90C5C0E091E8 |
:10268000E201F091E30180819181909301038093B5 |
:1026900000032091FE023091FF02821B930B845EA7 |
:1026A0009D4F68E671E00E943373845B9040909385 |
:1026B000FD028093FC02A8C0E091E201F091E301E9 |
:1026C000808180930E01803298F08FE180930E011B |
:1026D0000FC0A091E201B091E3018BE0E1E8F4E0EA |
:1026E0000D9001928A95E1F780918A0480931206F9 |
:1026F0008FEF80930D0188C08091DB019091DC0108 |
:10270000892B89F4E091E201F091E301E081EE236D |
:1027100051F08AE0E89FC00111240E94E2179093D3 |
:102720005C0480935B04E091E201F091E30190810D |
:102730008AE0989FC00111249093DC018093DB0113 |
:1027400015C08FEF80930D01E091E201F091E3015C |
:1027500090818AE0989FC00111249093DE018093BC |
:10276000DD01892B19F081E08093EC0180EA9FE084 |
:102770000E94E2179093D8018093D70145C08FEF54 |
:1027800080930D01E091E201F091E301908197FDCA |
:1027900008C082E08093E9011092DA011092D90119 |
:1027A0001AC0909580914202892B809342029181B8 |
:1027B0008AE0989FC00111249093DA018093D90197 |
:1027C00084E08093E90180EA9FE00E94E217909301 |
:1027D000D8018093D70181E08093ED0115C08FEF80 |
:1027E00080930D01E091E201F091E30180818093FB |
:1027F000430281E08093EE0107C081E08093EB010A |
:1028000003C081E08093EF011092E7011092E30191 |
:102810001092E2011092E101E3E0CE5F0C94AE73FE |
:10282000982F8091C00085FFFCCF9093C60008953B |
:102830000F931F9388E18093C1008091C000826054 |
:102840008093C0008091C10080688093C100809116 |
:10285000C10080648093C10000E010E00093C500D7 |
:102860008AE290E08093C4008091DD019091DE01C6 |
:102870000E94E21790935E0480935D048CED90E0DB |
:102880000E94E21790938D0480938C0410925F0451 |
:102890008EE48093600485E0809363048BE08093F2 |
:1028A0006104109262041093E3010093E20110921C |
:1028B000E1011F910F910895A0E1B0E0E2E6F4E19B |
:1028C0000C948F7380910F01882309F48CC280913E |
:1028D000D7019091D8010E94EB17882361F01092E4 |
:1028E000DA011092D9011092DE011092DD011092EE |
:1028F000DC011092DB018091D9019091DA01892BE2 |
:1029000041F080912E0590912F050E94EB178823AE |
:1029100029F48091ED01882309F460C080910F01B2 |
:10292000882309F45BC08091E90108E211E084305A |
:10293000A8F00E94CC2180E590E09F938F931F9395 |
:102940000F9381E08F938F9388E48F930E947E0F83 |
:102950002DB73EB7295F3F4F2DBF34C010924402C0 |
:1029600084ED94E09F938F9381EC91E29F938F93FA |
:10297000E091FE03F091FF03099584E190E09F93BD |
:102980008F931F930F9381E090E09F938F9389EE35 |
:1029900091E09F938F9382E08F9381E08F9388E4FF |
:1029A0008F930E947E0F8091E901982F8F5F809313 |
:1029B000E9012DB73EB7215F3F4F2DBF943010F096 |
:1029C0001092E9018091D9019091DA010E94E217F9 |
:1029D00090932F0580932E051092ED018091EE01CA |
:1029E000882351F180910F01882331F10E94CC217D |
:1029F00080E590E09F938F9388E291E09F938F937F |
:102A000021E030E03F932F9387E291E09F938F93F3 |
:102A10003F932F9383E492E09F938F9383E08F9370 |
:102A200081E08F938CE48F930E947E0F1092EE01D1 |
:102A30008DB79EB70F968DBF8091EB018823D1F0A3 |
:102A400080910F018823B1F08AE090E09F938F93EB |
:102A50008FE594E09F938F9381E08F938F9386E52A |
:102A60008F930E947E0F1092EB012DB73EB7295F26 |
:102A70003F4F2DBF8091EF018823D9F080910F0146 |
:102A80008823B9F08BE090E09F938F9381E894E0E6 |
:102A90009F938F9381E08F9380910C018F9387E4B4 |
:102AA0008F930E947E0F1092EF018DB79EB707960D |
:102AB0008DBF80918C0490918D040E94EB17882328 |
:102AC00009F461C080910F01882309F45CC08091F2 |
:102AD000DD069927880F991F880F991F7C01002711 |
:102AE000F7FC0095102F80913A0390913B03A09141 |
:102AF0003C03B0913D03BC01CD01A80197010E94A8 |
:102B0000687330937A042093790480913203909112 |
:102B10003303A0913403B0913503BC01CD01A8016A |
:102B200097010E94687330937C0420937B0480910A |
:102B3000D10280937D048091D00280937E0488E04E |
:102B400090E09F938F9389E794E09F938F9381E028 |
:102B50008F9383E08F9387E78F930E947E0F8091FE |
:102B60007F042DB73EB7295F3F4F2DBF853018F04A |
:102B700086E080937F0483E690E00E94E2179093C2 |
:102B80008D0480938C048091DD019091DE01892B6E |
:102B900041F080915D0490915E040E94EB178823C0 |
:102BA00021F48091EC01882329F180910F01882381 |
:102BB00009F182E490E09F938F9380ED95E09F93DD |
:102BC0008F9381E08F938F9384E48F930E947E0F85 |
:102BD0001092EC018DB79EB707968DBF8091DD01F5 |
:102BE0009091DE01009731F00E94E21790935E040D |
:102BF00080935D048091DB019091DC01892B09F4C5 |
:102C000085C080915B0490915C040E94EB1788233F |
:102C100009F47CC080910F01882309F477C080916A |
:102C2000DD069927880F991F880F991F7C010027BF |
:102C3000F7FC0095102F80913A0390913B03A091EF |
:102C40003C03B0913D03BC01CD01A80197010E9456 |
:102C5000687330934E0420934D0480913203909119 |
:102C60003303A0913403B0913503BC01CD01A80119 |
:102C700097010E9468733093500420934F04209171 |
:102C8000890730918A0740918B0750918C07DA01B0 |
:102C9000C90103E0880F991FAA1FBB1F0A95D1F72E |
:102CA000820F931FA41FB51F820F931FA41FB51F70 |
:102CB00020917A0130917B0140917C0150917D01FE |
:102CC000BC01CD010E9468733093520420935104DB |
:102CD0008EE090E09F938F938DE494E09F938F9389 |
:102CE00081E08F938F9383E48F930E947E0F809176 |
:102CF000DB019091DC010E94E21790935C048093C9 |
:102D00005B042DB73EB7295F3F4F2DBF80910E0169 |
:102D10008F3F71F1992714E0880F991F1A95E1F7F9 |
:102D20008C529D4F40E150E0BC01CE0101960E94C3 |
:102D3000477180E190E09F938F93CE0101969F931E |
:102D40008F9381E090E09F938F938EE091E09F932B |
:102D50008F9382E08F9381E08F9381E48F930E9421 |
:102D60007E0F8FEF80930E018DB79EB70B968DBFB0 |
:102D7000809112068823D1F080910F018823B1F051 |
:102D800081E090E09F938F9382E196E09F938F93F1 |
:102D900081E08F938F9382E48F930E947E0F109235 |
:102DA00012062DB73EB7295F3F4F2DBF8091EA0134 |
:102DB0008823C9F080910F018823A9F084E390E073 |
:102DC0009F938F9383E596E09F938F9381E08F93FA |
:102DD0008F9380E58F930E947E0F1092EA018DB74A |
:102DE0009EB707968DBFE6E0C05F0C94AB731F9251 |
:102DF0000F920FB60F9211242F933F935F936F930F |
:102E00007F938F939F93AF93BF93EF93FF938091A3 |
:102E1000FD01882329F08091FD0181508093FD01FF |
:102E20008091E103882319F081508093E103809120 |
:102E300005028150809305028F3FB9F489E08093A9 |
:102E40000502809112018F5F8170809312018823A7 |
:102E500019F481E0809302028091030290910402B0 |
:102E6000019690930402809303028091FE01909159 |
:102E7000FF01892BC9F08091FE019091FF0101971C |
:102E80009093FF018093FE018091FE019091FF01DC |
:102E9000209110013091110182239323892B11F08D |
:102EA00021E009C020E007C020E08FEF9FEF909362 |
:102EB00011018093100180910201222331F08A30A8 |
:102EC00011F45A9A07C0479A05C08A3011F45A98EB |
:102ED00001C047988091D303882309F063C0809193 |
:102EE000CE0683FF5FC086B19927FC01E071F070C8 |
:102EF00084FF0AC080910002909101020196909394 |
:102F00000102809300024EC0809100029091010264 |
:102F1000892B09F443C080910002909101028A56E6 |
:102F20009140E0F5809100029091010269E270E029 |
:102F30000E941F738091000290910102860F971FDB |
:102F4000909301028093000280910002909101020F |
:102F50000B9750F080910002909101020A97909394 |
:102F600001038093000304C0F0930103E093000386 |
:102F700080910003909101032091FE023091FF02A5 |
:102F8000821B930B845E9D4F68E671E00E94337351 |
:102F9000845B90409093FD028093FC0210920102AA |
:102FA00010920002FF91EF91BF91AF919F918F918D |
:102FB0007F916F915F913F912F910F900FBE0F9076 |
:102FC0001F9018952091030230910402280F391F99 |
:102FD000C901019608952091030230910402821BD9 |
:102FE000930B892F99278695807490700895CF93BD |
:102FF000DF930E94E217EC01CE010E94EB178823B9 |
:10300000D9F3DF91CF910895CF93DF930E94E21718 |
:10301000EC0109C080911701882329F090931701D2 |
:103020008FEC80937A00CE010E94EB17982F8823B3 |
:1030300089F3DF91CF9108959FB7F8945F983E9AF6 |
:10304000469A8091B0008F708093B0008091B0005C |
:1030500083608093B0008091B1008B738093B10046 |
:103060008091B1008B608093B1001092B2008FEF1D |
:103070008093B3008091B00080688093B00080910D |
:1030800070008A7F809370008091700082608093CE |
:1030900070009FBF08958AE090E00E94E21790932D |
:1030A0000D0280930C0282E085BD83EA84BD17BCCB |
:1030B00088E788BD86E086BD80916E008160809340 |
:1030C0006E0008951F920F920FB60F9211242F9346 |
:1030D0003F934F935F936F937F938F939F93AF93A0 |
:1030E000BF93CF93DF93EF93FF9380910201909171 |
:1030F0000602843108F011C1992309F066C380915A |
:10310000B00086FFECC08091B0008F7B8093B00050 |
:1031100089EA93E09093080280930702809113015B |
:10312000909114019C01220F331F280F391F8091A9 |
:1031300086019927880F991F880F991F280F391F1B |
:1031400037FF02C02D5F3F4FC90195958795959533 |
:10315000879590931401809313019093FB018093C2 |
:10316000FA01809120076091EE0620913A03309198 |
:103170003B0340913C0350913D0380FF2CC07727D7 |
:1031800088279927EA01D90157FF04C0A158BF4FEA |
:10319000CF4FDF4FE7E0D595C795B795A795EA954F |
:1031A000D1F79D01AE010E94F4729B01AC0197FF23 |
:1031B00004C0215C3F4F4F4F5F4F66E055954795E8 |
:1031C000379527956A95D1F78091FA019091FB0187 |
:1031D000820F931F2BC0772788279927EA01D901EF |
:1031E00057FF04C0A158BF4FCF4FDF4F27E0D59501 |
:1031F000C795B795A7952A95D1F79D01AE010E9475 |
:10320000F4729B01AC0197FF04C0215C3F4F4F4F0C |
:103210005F4FF6E05595479537952795FA95D1F785 |
:103220008091FA019091FB01821B930B9093FB011B |
:103230008093FA018091EF06282F3327220F331F46 |
:10324000220F331F8091FA019091FB01821793079F |
:103250007CF08091F006282F3327220F331F220F96 |
:10326000331F8091FA019091FB012817390724F44C |
:103270003093FB012093FA0120910702309108025C |
:103280008091FA019091FB01280F391F20503240A4 |
:1032900030930802209307028091FA019091FB017C |
:1032A00097FD039695958795959587959093FB0146 |
:1032B0008093FA0145E02D3D340718F08CED95E040 |
:1032C00005C02757314030F487E791E0909308021A |
:1032D00080930702809107029091080243C2809177 |
:1032E000B00080648093B0008091F506282F3327CA |
:1032F0008DED96E0289FA001299F500D389F500D1D |
:103300001124CA012091090230910A02821B930BF9 |
:10331000909308028093070255C2992309F055C281 |
:103320008091B00086FF23C28091B0008F7B809394 |
:10333000B000E0910B02EE23F1F48091F506282F06 |
:1033400033278DED96E0289FA001299F500D389FCF |
:10335000500D1124CA012091090230910A02821BEA |
:10336000930B909308028093070210920A02109226 |
:103370000902469A27C289EA93E090930802809353 |
:1033800007028E2F99278330910509F4A4C1843058 |
:1033900091053CF48130910561F0029709F4D2C0A7 |
:1033A000AAC18430910509F499C1059709F4A0C117 |
:1033B000A2C180911301909114019C01220F331F2F |
:1033C000280F391F809186019927880F991F880F30 |
:1033D000991F280F391F37FF02C02D5F3F4FC901CA |
:1033E00095958795959587959093140180931301F2 |
:1033F0009093FB018093FA01809120076091EE0683 |
:1034000020913A0330913B0340913C0350913D039E |
:1034100080FF2CC0772788279927EA01D90157FF19 |
:1034200004C0A158BF4FCF4FDF4F27E0D595C795B8 |
:10343000B795A7952A95D1F79D01AE010E94F47228 |
:103440009B01AC0197FF04C0215C3F4F4F4F5F4F82 |
:10345000A6E05595479537952795AA95D1F7809180 |
:10346000FA019091FB01820F931F27C077278827CD |
:10347000992757FF04C021583F4F4F4F5F4FF7E048 |
:103480005595479537952795FA95D1F70E94F4728F |
:103490009B01AC0197FF04C0215C3F4F4F4F5F4F32 |
:1034A000E6E05595479537952795EA95D1F78091B0 |
:1034B000FA019091FB01821B930B9093FB01809387 |
:1034C000FA018091EF06282F3327220F331F220F96 |
:1034D000331F8091FA019091FB01821793077CF0D2 |
:1034E0008091F006282F3327220F331F220F331F1E |
:1034F0008091FA019091FB012817390724F4309349 |
:10350000FB012093FA01809107029091080220911B |
:10351000FA013091FB01820F931F805092409093EB |
:103520000802809307028091FA019091FB0197FDB8 |
:10353000039695958795959587959093FB01809334 |
:10354000FA01ECC080911501909116019C01220FA7 |
:10355000331F280F391F809185019927880F991FE4 |
:10356000880F991F280F391F37FF02C02D5F3F4F6B |
:10357000C9019595879595958795909316018093A8 |
:1035800015019093F9018093F801809120076091D3 |
:10359000F206A0913203B0913303C0913403D0916D |
:1035A000350381FF2AC07727882799279D01AE011F |
:1035B000D7FF04C021583F4F4F4F5F4FA7E05595AD |
:1035C000479537952795AA95D1F70E94F4729B01EC |
:1035D000AC0197FF04C0215C3F4F4F4F5F4FF6E0B7 |
:1035E0005595479537952795FA95D1F78091F8012C |
:1035F0009091F901820F931F29C077278827992777 |
:103600009D01AE01D7FF04C021583F4F4F4F5F4F80 |
:10361000E7E05595479537952795EA95D1F70E94AC |
:10362000F4729B01AC0197FF04C0215C3F4F4F4FE8 |
:103630005F4F76E055954795379527957A95D1F761 |
:103640008091F8019091F901821B930B9093F901FD |
:103650008093F8018091F306282F3327220F331F20 |
:10366000220F331F8091F8019091F901821793077F |
:103670007CF08091F406282F3327220F331F220F6E |
:10368000331F8091F8019091F9012817390724F42C |
:103690003093F9012093F80180910702909108027C |
:1036A0002091F8013091F901820F931F80509240D0 |
:1036B00090930802809307028091F8019091F9019C |
:1036C00097FD039695958795959587959093F90124 |
:1036D0008093F80123C08091550702C08091C106F4 |
:1036E0009927880F991F880F991F87559E4F12C0E1 |
:1036F00080915F07F5CFFF27EE0FFF1FED5AF94FBF |
:1037000020813181220F331F80910702909108029E |
:10371000820F931F90930802809307028091070203 |
:103720009091080255E08D3D950718F08CED95E0DD |
:1037300005C08757914030F487E791E090930802E5 |
:103740008093070220910702309108022C5B3040E1 |
:1037500030930802209307028091090290910A0297 |
:10376000820F931F90930A02809309022BC08091CD |
:10377000B00080648093B0008CEB90E090930802DE |
:10378000809307028091090290910A0284549F4F0E |
:1037900090930A02809309028091FC01882331F002 |
:1037A0008091EE02853B10F0469801C0469A8091C8 |
:1037B0000B028F5F80930B029091F506981710F41F |
:1037C00010920B0281E08093060220910702309153 |
:1037D000080241E02F37340730F08FEF8093B300B9 |
:1037E0002F5F30400FC02F3F3105C9F0C0F0A90155 |
:1037F0004F5F50404F37510550F480E88093B3003D |
:1038000020583040309308022093070212C08FEFF7 |
:103810008093B30050930802409307020AC080913E |
:1038200007028093B30010920802109207021092D0 |
:103830000602FF91EF91DF91CF91BF91AF919F91E0 |
:103840008F917F916F915F914F913F912F910F9049 |
:103850000FBE0F901F90189510927C008FEC8093F4 |
:103860007A0008950F931F93CF93DF938FB3992717 |
:103870008C010270107081FDF9CF83E090E092BD61 |
:1038800081BDF89A80B5C82FDD27C531D10508F074 |
:103890002A97C7BD1092150284E690E00E94041892 |
:1038A00080911B0190911C018052934008F4E80123 |
:1038B000CA3FD105F8F4C7BD82E390E00E94041826 |
:1038C00089EE94E09F938F9380E194E19F938F938F |
:1038D000E091FE03F091FF03099580911B01909107 |
:1038E0001C010F900F900F900F908052934010F09A |
:1038F0002196DECF2C2FF999FECF1FBA83E090E0FE |
:1039000092BD81BD20BD0FB6F894FA9AF99A0FBE08 |
:10391000C0931F068CE291E00E940418DF91CF91C2 |
:103920001F910F910895EF92FF921F93CF93C0E0E4 |
:10393000C0931002C0930F02C0930E0280ED97E077 |
:103940000E94E2177C011CE8C33019F41B3008F018 |
:1039500019E0C0E080912502909126028C5F93408F |
:1039600024F480911A0181500AC08091250290911F |
:1039700026028750944034F080911A018F5F809323 |
:103980001A0101C0C1E080912302909124028C5F52 |
:10399000934024F48091190181500AC08091230240 |
:1039A000909124028750944034F0809119018F5FE8 |
:1039B0008093190101C0CF5F809121029091220272 |
:1039C0008C5F934024F48091180181500AC080914B |
:1039D00021029091220287509440C4F080911801F6 |
:1039E0008F5F8093180113C08BEE94E09F938F93A9 |
:1039F00080E194E19F938F93E091FE03F091FF03A8 |
:103A000009950F900F900F900F904DC0CF5F88E0F9 |
:103A100080934A020E94FB2B80911A018A3030F475 |
:103A200081E0809310028AE080931A0180911A014C |
:103A3000863F30F081E08093100285EF80931A0179 |
:103A4000809119018A3030F481E080930F028AE07E |
:103A50008093190180911901863F30F081E08093B5 |
:103A60000F0285EF80931901809118018A3030F49C |
:103A700081E080930E028AE0809318018091180102 |
:103A8000863F30F081E080930E0285EF809318012D |
:103A900080914A02882339F0C7010E94EB178823DE |
:103AA00009F0A2CFF5CF109217018FEC80937A0026 |
:103AB000809117018823E1F31A3020F48AE090E026 |
:103AC0000E940418115009F03FCF86E490E00E9454 |
:103AD0000418CF911F91FF90EF9008951F920F92BD |
:103AE0000FB60F921124AF92BF92CF92DF92EF9256 |
:103AF000FF920F931F932F933F934F935F936F9377 |
:103B00007F938F939F93AF93BF93EF93FF93809196 |
:103B10002E02282F3327442755278F5F80932E02AC |
:103B2000F9012231310508F0FAC3E25CFF4F0C9431 |
:103B3000BA73809178009091790046C080917800A6 |
:103B4000909179009AC1809178009091790090933A |
:103B5000300280932F02C5C18091460390914703A4 |
:103B60002091780030917900821B930B909314067A |
:103B700080931306809113069091140690933A0255 |
:103B800080933902CCC18091780090917900209186 |
:103B9000480330914903821B930B90931E06809338 |
:103BA0001D0680911D0690911E0690933C02809305 |
:103BB0003B02B7C380913302909134022091780088 |
:103BC00030917900820F931F9093340280933302D7 |
:103BD00081E0A8C380913102909132022091780057 |
:103BE00030917900820F931F9093320280933102BB |
:103BF00084E098C380912501909126019C01220FB9 |
:103C0000331F280F391F809178009091790063E06D |
:103C100070E00E941F73260F371F36952795369543 |
:103C20002795309326012093250185E07BC3809161 |
:103C3000780090917900AA2797FDA095BA2FBC0132 |
:103C4000CD010E9440727B018C01809140039091D4 |
:103C50004103A0914203B09143039C01AD01C8010F |
:103C6000B7010E94A471DC01CB01BC01CD010E940F |
:103C70000D72DC01CB0190931C0280931B0280919A |
:103C80001B0290911C0202970CF446C080914003E5 |
:103C900090914103A0914203B091430320E030E8AA |
:103CA0004BE354E4BC01CD010E94097288230CF05F |
:103CB00088C08091400390914103A0914203B0914C |
:103CC00043032AE037ED43EA5CE3BC01CD010E94E7 |
:103CD000A571DC01CB018093400390934103A09335 |
:103CE0004203B09343038091BE029091BF02845F70 |
:103CF000914008F066C08091400390914103A091EB |
:103D00004203B09143032DEC3CEC4CEC5DE3BC0171 |
:103D1000CD010E94A5714BC080911B0290911C02A5 |
:103D20008F5F9F4F0CF04DC08091400390914103F5 |
:103D3000A0914203B091430320E030E849E054E40D |
:103D4000BC01CD010E94F0721816DCF58091400391 |
:103D500090914103A0914203B09143032AE037EDD3 |
:103D600043EA5CE3BC01CD010E94A471DC01CB01FC |
:103D70008093400390934103A0934203B093430385 |
:103D80008091BE029091BF02845F9140D0F48091F7 |
:103D9000400390914103A0914203B09143032DEC65 |
:103DA0003CEC4CEC5DE3BC01CD010E94A471DC0154 |
:103DB000CB018093400390934103A0934203B093BF |
:103DC000430381E080931A028091780090917900FA |
:103DD000909316068093150680911B0290911C0209 |
:103DE0009C01442737FD4095542F80910203909108 |
:103DF0000303A0910403B0910503820F931FA41F36 |
:103E0000B51F8093020390930303A0930403B09320 |
:103E10000503209102033091030340910403509164 |
:103E2000050357FF04C021503C4F4F4F5F4F0AE03E |
:103E300055954795379527950A95D1F780910203B7 |
:103E400090910303A0910403B0910503821B930B8F |
:103E5000A40BB50B8093020390930303A093040378 |
:103E6000B09305032EC180913102909132022091CE |
:103E7000780030917900820F931F909332028093E3 |
:103E8000310210922D0250C2809102018A3071F4E9 |
:103E9000809178009091790020912F02309130022A |
:103EA000820F931F01969695879517C040912F0218 |
:103EB00050913002843159F420917800309179008A |
:103EC000240F351F8FEF97E0821B930B06C0809164 |
:103ED000780090917900840F951F9093220280932F |
:103EE000210286E01FC280914603909147032091F2 |
:103EF000780030917900821B930B90931406809385 |
:103F00001306809113069091140620913902309186 |
:103F10003A02820F931F9093200280931F0287E042 |
:103F200001C28091780090917900209148033091EE |
:103F30004903821B930B90931E0680931D0680916C |
:103F40001D0690911E0620913B0230913C02820F8B |
:103F5000931F90931E0280931D02E3C120913302B0 |
:103F6000309134028091780090917900280F391FA8 |
:103F70003093340220933302809102018A3019F485 |
:103F8000220F331F04C0220F331F220F331F309321 |
:103F90003402209333022091330230913402C9015C |
:103FA00037FD0796A3E095958795AA95E1F790933D |
:103FB0002602809325028091350290913602820F6D |
:103FC000931F97FD01969595879590933602809360 |
:103FD00035022091520330915303821B930B90932F |
:103FE00024018093230120912B0230912C02809197 |
:103FF000230190912401280F391F37FF02C02F5F42 |
:104000003F4F3595279530932C0220932B02E0CD1E |
:1040100020913102309132028091780090917900A4 |
:10402000280F391F30933202209331028091020110 |
:104030008A3019F4220F331F04C0220F331F220FBE |
:10404000331F30933202209331022091310230919C |
:104050003202C90137FD079663E0959587956A9509 |
:10406000E1F790932402809323028091370290918C |
:104070003802820F931F97FD01969595879590932F |
:104080003802809337022091500330915103821BF4 |
:10409000930B90932201809321012091290230916A |
:1040A0002A028091210190912201280F391F37FFA8 |
:1040B00002C02F5F3F4F3595279530932A022093FA |
:1040C000290283E02FC110922E0281E08093170114 |
:1040D00080911102909112020196909312028093A6 |
:1040E0001102809178009091790090931C01809347 |
:1040F0001B0180911B0190911C01AA27BB27A09056 |
:104100003D02B0903E02C0903F02D0904002A80E07 |
:10411000B91ECA1EDB1EA0923D02B0923E02C092A2 |
:104120003F02D0924002809141028F5F8093410212 |
:10413000823108F4F6C080911D0190911E01A0917A |
:104140001F01B09120017C018D0123E0EE0CFF1CCA |
:10415000001F111F2A95D1F7E81AF90A0A0B1B0B49 |
:10416000EA0CFB1C0C1D1D1D80911502992787FD73 |
:104170009095A92FB92FBC01CD0126EC34E240E087 |
:1041800050E00E94F472DC01CB01E81AF90A0A0B34 |
:104190001B0BD801C7010496A11DB11DB7FF05C0B7 |
:1041A000D801C7010B96A11DB11D13E0B595A795C8 |
:1041B000979587951A95D1F780931D0190931E01CD |
:1041C000A0931F01B09320018091170690911806CB |
:1041D0007C010027F7FC0095102F80911D01909124 |
:1041E0001E01A0911F01B0912001E81AF90A0A0BE3 |
:1041F0001B0BE092E002F092E1020093E2021093C6 |
:10420000E30220911602309117024091180250915A |
:10421000190257FF04C0215F3F4F4F4F5F4FF4E03B |
:104220005595479537952795FA95D1F780911602C0 |
:1042300090911702A0911802B0911902821B930B62 |
:10424000A40BB50B8093160290931702A09318024B |
:10425000B09319028091160290911702A091180252 |
:10426000B09119028E0D9F1DA01FB11F80931602E1 |
:1042700090931702A0931802B09319028091130231 |
:1042800090911402AC01E4E0440F551FEA95E1F768 |
:10429000481B590B8091160290911702A0911802A9 |
:1042A000B0911902B7FF03C00F96A11DB11D74E0B4 |
:1042B000B595A795979587957A95D1F72091E002C6 |
:1042C0003091E102281B390B63E0220F331F6A95FE |
:1042D000E1F7240F351F37FF02C0215F3F4F44E055 |
:1042E000359527954A95E1F73093140220931302F0 |
:1042F000D601C501D7FE03C00196A11DB11DB5951C |
:10430000A7959795879580933D0290933E02A09341 |
:104310003F02B093400289E08093410202C01092B4 |
:104320002E0282E080932D0280912D0280937C00EA |
:1043300080912E02882319F08FEC80937A00FF91F0 |
:10434000EF91BF91AF919F918F917F916F915F910D |
:104350004F913F912F911F910F91FF90EF90DF9020 |
:10436000CF90BF90AF900F900FBE0F901F901895F9 |
:1043700090E2E8E2F1E08FE49193815087FFFCCF77 |
:10438000089590914402E8E2F1E0E90FF11D808385 |
:104390009F5F909344020895EF92FF920F931F93B3 |
:1043A000CF93DF932091420220FF0AC08091430205 |
:1043B000882311F0815002C080912701809343022D |
:1043C00021FF0CC09091430280912701981719F4A6 |
:1043D0001092430203C09F5F90934302822F99275C |
:1043E00080FF04C081FF02C0109243020E94B821E6 |
:1043F00080914302282F3327C1ECEC2EC1E2FC2E22 |
:10440000C091FE03D091FF038A3098F481E180933C |
:1044100044023F932F9382E295E09F938F93FF9204 |
:10442000EF92FE0109952DB73EB72A5F3F4F2DBF92 |
:1044300011C080E1809344023F932F9387E295E07F |
:104440009F938F93FF92EF92FE0109958DB79EB7D0 |
:1044500006968DBF20914302822F9927AA27BB275A |
:10446000FC01419710F00C94E52BE05BFF4FB1ECA1 |
:10447000EB2EB1E2FB2EC091FE03D091FF030C9412 |
:10448000BA73109244028CE295E09F938F93FF924F |
:10449000EF92FE01099584E1809344020F900F9002 |
:1044A0000F900F9086E690E09F938F938EE490E0BC |
:1044B0009F938F931F921F92809102016AE00E9446 |
:1044C0001373892F99279F938F93809102010E94E4 |
:1044D000137399279F938F938CE395E09F938F930A |
:1044E000FF92EF92E091FE03F091FF03099588E2BD |
:1044F000809344022DB73EB7225F3F4F2DBF81E02E |
:1045000094E09F938F930E94720799279F938F93B4 |
:1045100081E595E09F938F93FF92EF92E091FE03E8 |
:10452000F091FF0309958091A0019091A1012DB711 |
:104530003EB7285F3F4F2DBF069730F48CE3809342 |
:1045400044028FE595E0CDC090914702992311F484 |
:104550000C94EE2B8CE380934402892F99279F9330 |
:104560008F938CE695E09F938F9381EC91E29F93DC |
:104570008F9377C08091CE06A1ECEA2EA1E2FA2EAD |
:10458000C091FE03D091FF0380FF74C010924402DB |
:104590008091E0029091E102A091E202B091E302E9 |
:1045A000BC01CD0125E030E040E050E00E9468739E |
:1045B0003F932F9381E895E09F938F93FF92EF9223 |
:1045C000FE01099584E1809344022DB73EB72A5F2E |
:1045D0003F4F2DBF8091DC029091DD02A091DE0261 |
:1045E000B091DF02BC01CD0125E030E040E050E0B9 |
:1045F0000E9468733F932F938EE895E09F938F936B |
:10460000FF92EF92E091FE03F091FF03099588E29B |
:10461000809344028DB79EB706968DBF80911B0193 |
:1046200090911C019F938F938BE995E09F938F93BB |
:10463000FF92EF92E091FE03F091FF0309958CE366 |
:10464000809344022DB73EB72A5F3F4F2DBF87B5F9 |
:1046500099279F938F9388EA95E09F938F93FF927A |
:10466000EF92E091FE03F091FF0309958DB79EB79D |
:10467000069639C71092440285EB95E09F938F937D |
:10468000FF92EF92FE01099584E1809344020F901E |
:104690000F900F900F9084EC95E09F938F93FF9273 |
:1046A000EF92E091FE03F091FF03099588E2809379 |
:1046B00044020F900F900F900F908DEC95E09F9318 |
:1046C0008F93FF92EF92E091FE03F091FF03099523 |
:1046D0008CE3809344020F900F900F900F908CED1D |
:1046E00095E09F938F93FF92EF92EFC71092440251 |
:1046F00085EE95E09F938F9301EC11E2FF92EF928C |
:10470000FE01099584E1809344020F900F900F9071 |
:104710000F9080913A0390913B03A0913C03B0919C |
:104720003D03B7FF04C081509C4FAF4FBF4FFAE02D |
:10473000B595A79597958795FA95D1F7BF93AF93C0 |
:104740009F938F9382EF95E09F938F931F930F9387 |
:10475000E091FE03F091FF03099588E28093440203 |
:104760002DB73EB7285F3F4F2DBF80913203909108 |
:104770003303A0913403B0913503B7FF04C08150D7 |
:104780009C4FAF4FBF4FEAE0B595A795979587959A |
:10479000EA95D1F7BF93AF939F938F9381E096E013 |
:1047A0009F938F931F930F93E091FE03F091FF036C |
:1047B00009958CE3809344028DB79EB708968DBF10 |
:1047C00080910003909101039F938F9380E196E085 |
:1047D0009F938F931F930F93EEC310924402809187 |
:1047E0005706909158069F938F938091550690910C |
:1047F00056069F938F938FE196E09F938F93FF923E |
:10480000EF92FE01099584E1809344028DB79EB733 |
:1048100008968DBF80915B0690915C069F938F9365 |
:104820008091590690915A069F938F938FE296E05C |
:104830009F938F93FF92EF92E091FE03F091FF031D |
:10484000099588E2809344022DB73EB7285F3F4F19 |
:104850002DBF80915F06909160069F938F9380910A |
:104860005D0690915E069F938F938FE396E09F93F2 |
:104870008F93FF92EF92E091FE03F091FF03099571 |
:104880008CE3809344028DB79EB708968DBF8091CC |
:104890006306909164069F938F9380916106909137 |
:1048A00062069F938F938FE496E076C51092440240 |
:1048B0008091C306E82FFF27EE0FFF1FED5AF94F37 |
:1048C000808191819F938F938091C206E82FFF276B |
:1048D000EE0FFF1FED5AF94F808191819F938F93C7 |
:1048E0008FE596E09F938F93FF92EF92FE010995DB |
:1048F00084E1809344028DB79EB708968DBF809166 |
:10490000C506E82FFF27EE0FFF1FED5AF94F8081F4 |
:1049100091819F938F938091C406E82FFF27EE0F1C |
:10492000FF1FED5AF94F8081918188589F4F9F93C7 |
:104930008F938FE696E09F938F93FF92EF92E09193 |
:10494000FE03F091FF03099588E2809344022DB79E |
:104950003EB7285F3F4F2DBF8091C706E82FFF2746 |
:10496000EE0FFF1FED5AF94F8081918182599F4FC1 |
:104970009F938F938091C606E82FFF27EE0FFF1FAE |
:10498000ED5AF94F8081918182599F4F9F938F9368 |
:104990008FE796E09F938F93FF92EF92E091FE0353 |
:1049A000F091FF0309958CE3809344028DB79EB785 |
:1049B00008968DBF8091C906E82FFF27EE0FFF1FD5 |
:1049C000ED5AF94F8081918182599F4F9F938F9328 |
:1049D0008091C806E82FFF27EE0FFF1FED5AF94F11 |
:1049E0008081918182599F4F9F938F938FE896E0AA |
:1049F000D3C4109244028FE996E09F938F9301EC09 |
:104A000011E2FF92EF92FE010995809102010F9051 |
:104A10000F900F900F908A3009F0A1C084E180932D |
:104A2000440280915203909153039C0197FF02C06E |
:104A3000295F3F4F287F821B930B9F938F93809119 |
:104A400052039091530397FD079673E095958795D0 |
:104A50007A95E1F79F938F932091520330915303FE |
:104A600037FF02C0295F3F4F63E0359527956A9570 |
:104A7000E1F78091250290912602821B930B9F9370 |
:104A80008F938DEA96E09F938F931F930F93E091FE |
:104A9000FE03F091FF03099588E2809344028DB7ED |
:104AA0009EB70A968DBF80915003909151039C014F |
:104AB00097FF02C0295F3F4F287F821B930B9F9374 |
:104AC0008F93809150039091510397FD079653E087 |
:104AD000959587955A95E1F79F938F932091500371 |
:104AE0003091510337FF02C0295F3F4F43E03595B6 |
:104AF00027954A95E1F78091230290912402821B29 |
:104B0000930B9F938F938EEB96E09F938F931F93BE |
:104B10000F93E091FE03F091FF0309958CE38093DE |
:104B200044022DB73EB7265F3F4F2DBF80914E0305 |
:104B300090914F039F938F9380914E0390914F03D9 |
:104B40002091210230912202821B930B9F938F931D |
:104B50008FEC96E09F938F931F930F93B6C38B3088 |
:104B600019F0843109F0ADC084E180934402809152 |
:104B70005203909153039C0197FF02C0215F3F4F66 |
:104B8000207F821B930B97FD0196959587959F93A8 |
:104B90008F93809152039091530397FD0F9624E0D9 |
:104BA000959587952A95E1F79F938F9320915203CE |
:104BB0003091530337FF02C0295F3F4F83E03595A3 |
:104BC00027958A95E1F78091250290912602821B14 |
:104BD000930B9F938F938DED96E09F938F931F93ED |
:104BE0000F93E091FE03F091FF03099588E2809313 |
:104BF00044022DB73EB7265F3F4F2DBF8091500333 |
:104C0000909151039C0197FF02C0215F3F4F207F8D |
:104C1000821B930B97FD0196959587959F938F9394 |
:104C2000809150039091510397FD0F96B4E09595B4 |
:104C30008795BA95E1F79F938F9320915003309118 |
:104C4000510337FF02C0295F3F4FA3E035952795F9 |
:104C5000AA95E1F78091230290912402821B930B85 |
:104C60009F938F938FEE96E09F938F931F930F9355 |
:104C7000E091FE03F091FF0309958CE380934402D9 |
:104C80008DB79EB70A968DBF80914E0390914F03CA |
:104C900097FD0196959587959F938F9380914E03ED |
:104CA00090914F032091210230912202821B930B9D |
:104CB0009F938F9381E097E09F938F931F930F9320 |
:104CC0006FC38D3009F08AC584E1809344028091DE |
:104CD0001A0199279F938F938091520390915303C8 |
:104CE00097FD0F96E4E095958795EA95E1F79F93F8 |
:104CF0008F93209152033091530337FF02C0295FF5 |
:104D00003F4F73E0359527957A95E1F7809125021D |
:104D100090912602821B930B9F938F9380E197E0E3 |
:104D20009F938F931F930F93E091FE03F091FF03E6 |
:104D3000099588E2809344028DB79EB70A968DBF8D |
:104D40008091190199279F938F938091500390919F |
:104D5000510397FD0F9664E0959587956A95E1F765 |
:104D60009F938F93209150033091510337FF02C0DE |
:104D7000295F3F4F53E0359527955A95E1F780918C |
:104D8000230290912402821B930B9F938F9384E2C2 |
:104D900097E09F938F931F930F93E091FE03F09101 |
:104DA000FF0309958CE3809344022DB73EB7265F3D |
:104DB0003F4F2DBF8091180199279F938F9380912A |
:104DC0004E0390914F0397FD0196959587959F937C |
:104DD0008F9380914E0390914F0320912102309147 |
:104DE0002202821B930B9F938F9388E397E09F93FC |
:104DF0008F931F930F93E091FE03F091FF030995AA |
:104E00008DB79EB70A966FC3109244028CE497E068 |
:104E10009F938F93FF92EF92FE01099584E1809317 |
:104E200044020F900F900F900F9080914803909143 |
:104E300049039F938F9380911D0290911E029F932F |
:104E40008F9389E597E09F938F93FF92EF92E09184 |
:104E5000FE03F091FF03099588E2809344022DB789 |
:104E60003EB7285F3F4F2DBF809146039091470387 |
:104E70009F938F9380911F02909120029F938F9315 |
:104E800088E697E09F938F93FF92EF92E091FE0365 |
:104E9000F091FF0309958CE3809344028DB79EB790 |
:104EA00008968DBF8091400390914103A0914203E9 |
:104EB000B0914303BC01CD010E940D72DC01CB0116 |
:104EC0009F938F9380914A0790914B079F938F9365 |
:104ED00087E797E061C2109244028091250190918A |
:104EE00026016AE070E00E9433739F938F93809154 |
:104EF0002501909126016AE070E00E9433737F9350 |
:104F00006F9386E897E09F938F93FF92EF92FE0155 |
:104F1000099584E1809344028DB79EB708968DBFB2 |
:104F20008091FF07909100086AE070E00E941F7373 |
:104F30009F938F938091FF07909100086AE070E043 |
:104F40000E941F737F936F938AE997E09F938F93DB |
:104F5000FF92EF92E091FE03F091FF03099588E242 |
:104F6000809344022DB73EB7285F3F4F2DBF8091FD |
:104F70000108909102089F938F938EEA97E09F9388 |
:104F80008F93FF92EF92E091FE03F091FF0309955A |
:104F90008CE3809344028DB79EB706968DBF8091B7 |
:104FA0000308909104089F938F938EEB97E09F9353 |
:104FB0008F93FF92EF92E091FE03F091FF0309952A |
:104FC0002DB73EB72A5F3F4FF4C11092440280EDE7 |
:104FD00097E09F938F93FF92EF92FE01099584E1F2 |
:104FE000809344020F900F900F900F908091530682 |
:104FF000909154069F938F9389ED97E09F938F93A1 |
:10500000FF92EF92E091FE03F091FF03099588E291 |
:10501000809344028DB79EB706968DBF8091EE02B5 |
:1050200099279F938F9389EE97E09F938F93FF9299 |
:10503000EF92E091FE03F091FF0309958CE38093DA |
:1050400044022DB73EB72A5F3F4F2DBF80915206D5 |
:10505000992701979F938F9389EF97E0FECA10924B |
:10506000440289E098E09F938F93FF92EF92FE01B4 |
:10507000099584E1809344020F900F900F900F9058 |
:105080008091FC029091FD029F938F9381E198E0C3 |
:105090009F938F93FF92EF92E091FE03F091FF03B5 |
:1050A000099588E2809344022DB73EB72A5F3F4FAF |
:1050B0002DBF80910003909101039F938F938FE107 |
:1050C00098E09F938F93FF92EF92E091FE03F0910F |
:1050D000FF0309958CE3809344028DB79EB7069633 |
:1050E0008DBF8091FE029091FF029F938F938DE27E |
:1050F00098E05DCF109244028091EF0299279F9330 |
:105100008F938BE398E09F938F93FF92EF92FE0132 |
:10511000099584E1809344028DB79EB706968DBFB2 |
:105120008091F00299279F938F9387E498E09F9353 |
:105130008F93FF92EF92E091FE03F091FF030995A8 |
:1051400088E2809344022DB73EB72A5F3F4F2DBFC0 |
:105150008091F10299279F938F9383E598E09F9325 |
:105160008F93FF92EF92E091FE03F091FF03099578 |
:105170008CE3809344028DB79EB706968DBF8091D5 |
:10518000F20299279F938F938FE598E010CF1092AA |
:1051900044028091F30299279F938F938BE698E0C6 |
:1051A0009F938F93FF92EF92FE01099584E1809384 |
:1051B00044028DB79EB706968DBF8091F402992761 |
:1051C0009F938F9387E798E09F938F93FF92EF923F |
:1051D000E091FE03F091FF03099588E28093440279 |
:1051E0002DB73EB72A5F3F4F2DBF8091F50299271B |
:1051F0009F938F9383E898E09F938F93FF92EF9212 |
:10520000E091FE03F091FF0309958CE38093440243 |
:105210008DB79EB706968DBF8091F60299279F9312 |
:105220008F938FE898E0C3CE109244028BE998E008 |
:105230009F938F93FF92EF92FE01099584E18093F3 |
:1052400044020F900F900F900F9080918601992744 |
:105250009F938F9383EA98E09F938F93FF92EF92AF |
:10526000E091FE03F091FF03099588E280934402E8 |
:105270008DB79EB706968DBF8091FA019091FB0184 |
:105280009F938F9381EB98E09F938F93FF92EF9280 |
:10529000E091FE03F091FF0309958CE380934402B3 |
:1052A0002DB73EB72A5F3F4F2DBF8091F00699275B |
:1052B0009F938F938091EF0699279F938F938FEB06 |
:1052C00098E09F938F93FF92EF92E091FE03F0910D |
:1052D000FF0309958DB79EB7089605C11092440249 |
:1052E0008DEC98E09F938F93FF92EF92FE010995CA |
:1052F00084E1809344020F900F900F900F90809163 |
:105300008504992787FD90959F938F9380918404BE |
:10531000992787FD90959F938F938DED98E09F93AC |
:105320008F93FF92EF92E091FE03F091FF030995B6 |
:1053300088E2809344022DB73EB7285F3F4F2DBFD0 |
:1053400080918604992787FD90959F938F938091F4 |
:10535000870499279F938F938DEE98E09F938F9367 |
:10536000FF92EF92E091FE03F091FF0309958CE329 |
:10537000809344028DB79EB708968DBF80918B04B1 |
:1053800099279F938F9380918804992787FD909503 |
:105390009F938F938DEF98E09F938F93FF92EF925F |
:1053A000E091FE03F091FF0309952DB73EB7285F0A |
:1053B0003F4F2DBF13C2109244028DE099E09F939E |
:1053C0008F93FF92EF92FE01099584E1809344024E |
:1053D0000F900F900F900F9080912F0699278F7745 |
:1053E00090709F938F9380912B0699278F77907061 |
:1053F0009F938F938091270699278F7790709F9323 |
:105400008F938091230699278F7790709F938F9326 |
:105410008DE199E09F938F93FF92EF92E091FE03CD |
:10542000F091FF03099588E2809344028DB79EB7FF |
:105430000C968DBF80913F0699278F7790709F9330 |
:105440008F9380913B0699278F7790709F938F93CE |
:105450008091370699278F7790709F938F938091D3 |
:10546000330699278F7790709F938F938EE299E000 |
:105470009F938F93FF92EF92E091FE03F091FF03D1 |
:1054800009958CE3809344022DB73EB7245F3F4FCC |
:105490002DBF80914F0699278F7790709F938F93A0 |
:1054A00080914B0699278F7790709F938F9380916F |
:1054B000470699278F7790709F938F93809143062B |
:1054C00099278F7790709F938F938FE399E09F93A5 |
:1054D0008F93FF92EF92E091FE03F091FF03099505 |
:1054E0008DB79EB70C968DBF79C11092440280E5AE |
:1054F00099E09F938F9301EC11E2FF92EF92FE01EE |
:10550000099584E1809344020F900F900F900F90C3 |
:1055100080912F06881F8827881F97E0899FC001E8 |
:1055200011248D969F938F9380912B06881F882737 |
:10553000881F96E0899FC00111248D969F938F93B9 |
:1055400080912706881F8827881F95E0899FC001C2 |
:1055500011248D969F938F9380912306881F88270F |
:10556000881F9927880F991F880F991F8D969F93E1 |
:105570008F938FE599E09F938F93FF92EF92E09145 |
:10558000FE03F091FF03099588E2809344022DB752 |
:105590003EB7245F3F4F2DBF80913F06881F88276D |
:1055A000881F9BE0899FC00111248D969F938F9344 |
:1055B00080913B06881F8827881F9AE0899FC00139 |
:1055C00011248D969F938F9380913706881F88278B |
:1055D000881F99E0899FC00111248D969F938F9316 |
:1055E00080913306881F8827881F992723E0880F1A |
:1055F000991F2A95E1F78D969F938F9383E799E002 |
:105600009F938F93FF92EF92E091FE03F091FF033F |
:1056100009958CE3809344028DB79EB70C968DBF9D |
:1056200080914306881F8827881F9CE0899FC001BE |
:1056300011248D969F938F9387E899E09F938F9382 |
:10564000FF92EF92E091FE03F091FF0309958091A4 |
:1056500047062DB73EB72A5F3F4F2DBF87FF12C0C9 |
:1056600080E48093440288E999E09F938F93FF92AE |
:10567000EF92E091FE03F091FF0309950F900F90D8 |
:105680000F900F9080914B0687FF12C084E48093A7 |
:1056900044028BE999E09F938F931F930F93E091BE |
:1056A000FE03F091FF0309950F900F900F900F905C |
:1056B00080914F0687FF92C088E4809344028EE970 |
:1056C00099E09F938F931F930F93E091FE03F091C6 |
:1056D000FF0309950F900F900F900F907FC01092CD |
:1056E000440281EA99E09F938F93FF92EF92FE012B |
:1056F000099584E1809344020F900F900F900F90D2 |
:105700008091D2019091D3019F938F938FEA99E07A |
:105710009F938F93FF92EF92E091FE03F091FF032E |
:10572000099588E2809344028DB79EB706968DBF97 |
:105730008091D4019091D5019F938F938CEB99E048 |
:105740009F938F93FF92EF92E091FE03F091FF03FE |
:10575000099589E4809344022DB73EB72A5F3F4FF5 |
:105760002DBF89EC99E09F938F93FF92EF92E09188 |
:10577000FE03F091FF030995809142020F900F9074 |
:105780000F900F9083FF2AC01092D5011092D40180 |
:10579000F999FECF1FBA8EE090E092BD81BD10BC9A |
:1057A0000FB6F894FA9AF99A0FBE2091D401F9999C |
:1057B000FECF1FBA8FE090E092BD81BD20BD0FB635 |
:1057C000F894FA9AF99A0FBE09C080912701281718 |
:1057D00019F42150209327011092430210924202A3 |
:1057E000E6E0CDB7DEB70C94AB731092B9008AE255 |
:1057F0008093B800089585EA8093BC00089584E9F9 |
:105800008093BC0008951092B9008093BB0085E896 |
:105810008093BC0008950E94FF2B10924A02809151 |
:10582000BB001092490280E88093BC001092BD003A |
:105830001092BA001092BB001092B9001092B800FA |
:105840000E94F52B0E94FB2B80E00E94032C089500 |
:105850008093BB0085E88093BC00089585EC80931D |
:10586000BC00089585E88093BC0008951F920F92B4 |
:105870000FB60F9211242F933F934F935F936F9323 |
:105880007F938F939F93AF93BF93EF93FF938091F9 |
:105890004A02282F3327442755278F5F80934A02D7 |
:1058A000F9012731310508F0F2C0EF59FF4F0C9490 |
:1058B000BA7320914902E22FFF27EE0FFF1FEE0F70 |
:1058C000FF1FE050FC4F85851816A4F02C3090F493 |
:1058D000922F9F5FE92FFF27EE0FFF1FEE0FFF1F95 |
:1058E000E050FC4F858518161CF0292F9C3080F362 |
:1058F00090934902809149028C3051F410924902F0 |
:1059000083E080934A0280914802880F8D5AB4C088 |
:10591000880F8E5AB1C080914902E82FFF27EE0F01 |
:10592000FF1FEE0FFF1FEE5DF94F8F5F809349025F |
:105930008081A2C08091B9008033E1F480914B0254 |
:10594000882321F48091490280934B02809149027F |
:10595000E82FFF27EE0FFF1FEE0FFF1FE15EF94F4D |
:105960002081822F99278F7790708F37910514F4BB |
:105970002F5F20830E94FF2B8AE090E09093A1018B |
:105980008093A00110924A026CC08091B90090915E |
:1059900048028034C1F0E92FFF27EE0FFF1FEE0F02 |
:1059A000FF1FEE5DF94F81818F778183892F8F5F94 |
:1059B000809348028C3010F0109248020E94FF2B16 |
:1059C00010924A020DC0E92FFF27EE0FFF1FEE0FC6 |
:1059D000FF1FEE5DF94F8181806881830E942E2C2C |
:1059E00080914B028093470210924B0252C08091EB |
:1059F0004802E82FFF27EE0FFF1FEE0FFF1FEE5D9F |
:105A0000F94F8091BB0082830E94322C42C090915A |
:105A10004802E92FFF27EE0FFF1FEE0FFF1FEE5D7D |
:105A2000F94F8091BB008383892F8F5F8093480259 |
:105A30008C3010F0109248020E94FF2B28C080E1A9 |
:105A40001BC080911A0118C082E116C08091190113 |
:105A500013C00E94FF2B8AE090E09093A1018093F5 |
:105A6000A0010E94FB2B15C088E906C084E104C098 |
:105A70008091180101C080E80E94032C0AC00E9496 |
:105A8000FF2B8AE090E09093A1018093A0011092F7 |
:105A90004A028091BC0080688093BC00FF91EF9126 |
:105AA000BF91AF919F918F917F916F915F914F9136 |
:105AB0003F912F910F900FBE0F901F90189589E185 |
:105AC000A7E8B6E0E3E5F6E011821082329611967F |
:105AD0001C921E921296815087FFF6CF10924F03B0 |
:105AE00010924E03109251031092500310925303E0 |
:105AF0001092520308951F920F920FB60F92112425 |
:105B00000F931F932F933F934F935F936F937F93C5 |
:105B10008F939F93AF93BF93CF93DF93EF93FF93B5 |
:105B20008091210782FDC8C0409186005091870076 |
:105B300080914D0290914E02481B590B8091860036 |
:105B40009091870090934E0280934D02CA018D542C |
:105B50009440A0914F02B0915002835F9A4178F433 |
:105B600080914F0280935206149714F0109278019E |
:105B700081E090E09093500280934F02FCC1AD30E1 |
:105B8000B1050CF0F8C1CA018B5F9040845B914075 |
:105B900008F074C0425D5140FD01EA0FFB1FED5A51 |
:105BA000F94F80819181FA01E81BF90BCF01F7FFD2 |
:105BB00003C0909581959F4F06975CF48091EE020B |
:105BC000883C20F48091EE02865F01C088EC8093CF |
:105BD000EE02FD01EA0FFB1FED5AF94F8081918122 |
:105BE0009C01220F331F280F391F240F351F37FF49 |
:105BF00002C02D5F3F4FE901D595C795D595C79553 |
:105C0000CA0101968C179D0714F4219706C04150D4 |
:105C10005040C417D5070CF421968091EE02833CC6 |
:105C2000E0F08D010A0F1B1FF801ED5AF94F80813A |
:105C300091819E01281B390BC90163E070E00E942D |
:105C40003373CB01880F991F860F971F0957194F80 |
:105C5000D80111969C938E9307C0AA0FBB1FA9571A |
:105C6000B94F11961C921E92E0914F02F091500292 |
:105C7000EE0FFF1FED5AF94FD183C08380914F0281 |
:105C80009091500201969093500280934F02059795 |
:105C900011F45D9A01C05D9880914F02909150027D |
:105CA0008630910511F45C9A01C05C98079711F455 |
:105CB0005B9A61C15B985FC14091860050918700FB |
:105CC0008091510290915202481B590B809186009D |
:105CD000909187009093520280935102CA018D5493 |
:105CE00094406091BB02835F9A4108F07AC0609350 |
:105CF0004C0280914C02843008F453C090915206BB |
:105D000080914C02981709F04CC05091BC025B3056 |
:105D100008F43FC0109278011092BB0240E05F315E |
:105D2000C0F0E42FFF27EE0FFF1F9F0129573D4FC3 |
:105D3000DF01AD5AB94F8D919C91D9018D939C9300 |
:105D4000DF01A957B94F8D919C91EF55FD4F91837C |
:105D50008083E42FFF27EE0FFF1F9F012D5A394F3D |
:105D6000DF01AD5ABD4F8D919C91D90111969C9345 |
:105D70008E93DF01A359BD4F8D919C91E957F94F47 |
:105D800091838083842F8F5F482F8D3040F28093E2 |
:105D9000BB028091BC028F3FB9F08F5F8093BC0241 |
:105DA00013C08091BC02853620F08AE08093BC024B |
:105DB00002C01092BC02809102018A3011F084313D |
:105DC00011F4289A01C0289881E08093BB02809149 |
:105DD000E402882309F0CFC080914C0280935206E0 |
:105DE000CAC06D3008F09FC0CA018B5F9040845BD1 |
:105DF000914008F07EC0425D5140E62FFF27EE0F34 |
:105E0000FF1FED5AFD4F80819181FA01E81BF90BCC |
:105E1000CF0105960B97B0F48091BC028A3120F037 |
:105E20008091EE02865F05C08B3028F08091EE02F3 |
:105E30008E5F8093EE028091EE02893C18F088EC30 |
:105E40008093EE02E62FFF27EE0FFF1FED5AFD4F66 |
:105E5000808191819C01220F331F280F391F240F4D |
:105E6000351F37FF02C02D5F3F4FE901D595C7951C |
:105E7000D595C795CA0101968C179D0714F42197F3 |
:105E800006C041505040C417D5070CF421968091AC |
:105E9000EE028E3BD8F0E62FFF27EE0FFF1FDF014B |
:105EA000AD5ABD4F8D919C919E01281B390BC901A4 |
:105EB00063E070E00E943373CB01880F991F860F57 |
:105EC000971FE359FD4F9183808308C0E62FFF277A |
:105ED000EE0FFF1FE359FD4F118210828091BB022C |
:105EE000E82FFF27EE0FFF1FED5AFD4FD183C08330 |
:105EF00009C0809102018A3011F0843111F4289A8E |
:105F000001C028988091BB02853011F45D9A05C0CC |
:105F10005D98863011F45C9A05C05C98873011F466 |
:105F20005B9A01C05B988091BB02843120F48F5F43 |
:105F30008093BB0220C08431F1F4809102018A3049 |
:105F400011F0843111F4289A01C028988EE18093D1 |
:105F5000BB022CE0C7E8D6E0A7E8B2E0E3E5F6E054 |
:105F60008D919D9191838083329619821882229619 |
:105F7000215027FFF5CFFF91EF91DF91CF91BF9196 |
:105F8000AF919F918F917F916F915F914F913F91D1 |
:105F90002F911F910F910F900FBE0F901F9018958A |
:105FA00081E08093C40682E08093C30683E08093FF |
:105FB000C20684E08093C50685E08093C60686E02D |
:105FC0008093C70687E08093C80688E08093C9065F |
:105FD00089E08093CA068AE08093CB068BE08093A9 |
:105FE000CC068CE08093CD0608951F938AE68093BB |
:105FF000CE0661E0609321075EE15093CF068FEFFC |
:106000008093D1068AE08093D2065093D0065093B5 |
:10601000D40685E08093D50680E48093D60610925E |
:10602000D70684E18093D3068EE08093D806F0E112 |
:10603000F093D9061CE01093DA06A8E0A093DB06E3 |
:1060400086EE8093DC065093DD0680E88093DE06C2 |
:1060500040E54093DF0696E99093E00683E0809365 |
:10606000E1064093E2069093E30681E28093E40622 |
:1060700083E28093E5065093E60670E27093E806AB |
:106080001092E9061092EA061092EB061092EC06C6 |
:106090001092040710920507109206071092070746 |
:1060A00024E62093ED0638E23093EE066093200755 |
:1060B0001092EF0697EF9093F006E6E0E093F50676 |
:1060C0008DE78093F6068093F7068093F806209379 |
:1060D000F1063093F2061092F3069093F40682E3F1 |
:1060E0008093F9069AE59093FA068093FB06109246 |
:1060F0001F079093FC064093FD066093FE0685E51E |
:106100008093FF0680930007F093010770930207C6 |
:10611000209303078FE58093080783EF80930A0796 |
:106120008AEA80930C0780930D078FE0809309071C |
:1061300080930B078EEF80930E0720930F079093A9 |
:10614000100790931107909312078BE48093130725 |
:10615000809314078093150710921607E093170792 |
:10616000A09318079093190750931A0720931B07C1 |
:1061700020931C0784E080931D076093E706A2EA42 |
:10618000B1E0E2E2F7E00D9001921A95E1F71F917C |
:1061900008958AE68093CE06E1E0E09321076EE160 |
:1061A0006093CF068FEF8093D1069AE09093D2064A |
:1061B0006093D0066093D40685E08093D50680E492 |
:1061C0008093D6061092D7068FE08093D3069093E3 |
:1061D000D80680E18093D90676E07093DA06F8E07D |
:1061E000F093DB0686EE8093DC066093DD0680E8A4 |
:1061F0008093DE062AE52093DF0698E79093E00679 |
:1062000083E08093E1062093E2069093E30681E227 |
:106210008093E40683E28093E5066093E60650E20D |
:106220005093E8061092E9061092EA061092EB06E7 |
:106230001092EC06109204071092050710920607C0 |
:106240001092070744E64093ED0638E23093EE06DD |
:10625000E09320071092EF0697EF9093F00670936B |
:10626000F5068DE78093F6068093F7068093F8068F |
:106270004093F1063093F2061092F3069093F406E1 |
:1062800082E38093F9062093FA068093FB0610922E |
:106290001F072093FC0680E58093FD068CE3809326 |
:1062A000FE0685E58093FF06809300075093010763 |
:1062B000509302079BE4909303078FE580930807B0 |
:1062C00083EF80930A078AEA80930C0780930D0777 |
:1062D00084E18093090780930B078EEF80930E076C |
:1062E00040930F0720931007209311072093120764 |
:1062F0009093130790931407909315071092160725 |
:1063000070931707F09318072093190760931A07E3 |
:1063100040931B0740931C0784E080931D07E09384 |
:10632000E7068CE0A9EAB1E0E2E2F7E00D90019225 |
:106330008A95E1F708958AE68093CE0671E070931E |
:1063400021074EE14093CF068FEF8093D1068AE07C |
:106350008093D2064093D0064093D40685E0809384 |
:10636000D50680E48093D6061092D7068FE08093FE |
:10637000D30668E06093D80620E12093D90656E062 |
:106380005093DA066093DB0686EE8093DC0640933A |
:10639000DD0680E88093DE0634E63093DF0698E77A |
:1063A0009093E00683E08093E1063093E2069093B9 |
:1063B000E30681E28093E40683E28093E50684E1CC |
:1063C0008093E6062093E8061092E9061092EA060A |
:1063D0001092EB061092EC0610920407109205073B |
:1063E00010920607109207073093ED0628E22093DB |
:1063F000EE06709320071092EF0697EF9093F00649 |
:106400005093F5068DE78093F6068093F706809308 |
:10641000F8063093F1062093F2061092F30690935B |
:10642000F40692E39093F9062AE52093FA069093F6 |
:10643000FB0610921F072093FC0680E58093FD0663 |
:1064400086E48093FE0685E58093FF06809300072F |
:1064500080E28093010780930207909303078FE502 |
:106460008093080783EF80930A078AEA80930C07DA |
:1064700080930D074093090740930B078EEF80939D |
:106480000E0730930F0720931007209311072093D6 |
:1064900012078BE4809313078093140780931507EA |
:1064A0001092160750931707609318072093190747 |
:1064B00040931A0730931B0730931C0784E08093A6 |
:1064C0001D077093E7068CE0A1EBB1E0E2E2F7E094 |
:1064D0000D9001928A95E1F708956817790754F4B1 |
:1064E000680F791F77FF02C06F5F7F4FCB019595D3 |
:1064F00087950895681B790B861B970B08951F934A |
:10650000CF93DF93182FEB018091E4028823A1F44D |
:1065100011501F3F89F0D093FF01C093FE0180917D |
:10652000FE019091FF01892BD1F7CE018C0F9D1FA9 |
:106530000E94F717115078F7DF91CF911F910895BE |
:10654000A3E1B0E0E6EAF2E30C94837380914E039A |
:1065500090914F032091210230912202821B930BD4 |
:10656000909383078093820780912B0290912C0255 |
:1065700097FD07969C0153E0359527955A95E1F7CD |
:106580003093400720933F078091290290912A027F |
:1065900097FD079643E0959587954A95E1F7909387 |
:1065A00031078093300730934D0720934C07909329 |
:1065B00043078093420780917D0790917E07AA2729 |
:1065C00097FDA095BA2F7C018D01EE0CFF1C001FDA |
:1065D000111FE80EF91E0A1F1B1F80911D029091CA |
:1065E0001E029C01442737FD4095542FDA01C90152 |
:1065F000F2E0880F991FAA1FBB1FFA95D1F7820FEF |
:10660000931FA41FB51F820F931FA41FB51FE80E71 |
:10661000F91E0A1F1B1F17FF08C023E030E040E0EF |
:1066200050E0E20EF31E041F151FE2E015950795DA |
:10663000F794E794EA95D1F7F0927E07E0927D0710 |
:1066400080918D0790918E07AA2797FDA095BA2F6C |
:106650007C018D01EE0CFF1C001F111FE80EF91EBE |
:106660000A1F1B1F80911F02909120029C0144274A |
:1066700037FD4095542FDA01C90162E0880F991F58 |
:10668000AA1FBB1F6A95D1F7820F931FA41FB51FC6 |
:10669000820F931FA41FB51FE80EF91E0A1F1B1FB0 |
:1066A00017FF08C083E090E0A0E0B0E0E80EF91E1C |
:1066B0000A1F1B1F82E015950795F794E7948A95AA |
:1066C000D1F7F0928E07E0928D0780914A07909162 |
:1066D0004B07AA2797FDA095BA2F9C01AD01220F69 |
:1066E000331F441F551F280F391F4A1F5B1F8091FE |
:1066F0001B0290911C02AA2797FDA095BA2F280F84 |
:10670000391F4A1F5B1F57FF04C02D5F3F4F4F4F7C |
:106710005F4FF2E05595479537952795FA95D1F754 |
:1067200030934B0720934A0720911D0230911E029F |
:10673000C901880F991F880F991F820F931F820F1D |
:10674000931F9C01442737FD4095542F80912A03C5 |
:1067500090912B03A0912C03B0912D03820F931FD6 |
:10676000A41FB51F80932A0390932B03A0932C039F |
:10677000B0932D0320911F0230912002C901880F90 |
:10678000991F880F991F820F931F820F931F9C01DF |
:10679000442737FD4095542F80912603909127037D |
:1067A000A0912803B0912903820F931FA41FB51F46 |
:1067B0008093260390932703A0932803B093290383 |
:1067C000809156079091570720911D0230911E022B |
:1067D000820F931F909357078093560780918507E8 |
:1067E0009091860720911F0230912002820F931F03 |
:1067F0009093860780938507809144039091450389 |
:1068000001969093450380934403809122039091D5 |
:106810002303A0912403B0912503BC01CD010E9464 |
:1068200040725B016C018091150690911606AA27B3 |
:1068300097FDA095BA2FBC01CD010E9440727B014B |
:106840008C018091400390914103A0914203B0914B |
:1068500043039C01AD01C801B7010E94A471DC0192 |
:10686000CB019C01AD01C601B5010E94A571DC01FF |
:10687000CB01BC01CD010E940D72DC01CB018093E4 |
:10688000220390932303A0932403B09325038FEC5A |
:1068900080937A0010921701209112033091130314 |
:1068A000409114035091150329873A874B875C87E1 |
:1068B00029543B46414050402CF028E43BE641E05F |
:1068C00050E00DC089859A85AB85BC85885B94496D |
:1068D000AE4FBF4F4CF428EB34E94EEF5FEF2D8302 |
:1068E0003E834F83588708C089859A85AB85BC85D0 |
:1068F0008D839E83AF83B88720911A0330911B0349 |
:1069000040911C0350911D032D873E874F87588B64 |
:1069100029543B46414050402CF028E43BE641E0FE |
:1069200050E00DC08D859E85AF85B889885B944900 |
:10693000AE4FBF4F4CF428EB34E94EEF5FEF2983A5 |
:106940003A834B835C8308C08D859E85AF85B8896B |
:1069500089839A83AB83BC83A0918207B09183071C |
:10696000BA8BA98BFD01CF01AA2797FDA095BA2F5D |
:10697000A0900A03B0900B03C0900C03D0900D03BD |
:10698000A80EB91ECA1EDB1EA0920A03B0920B030A |
:10699000C0920C03D0920D03E0908907F0908A0713 |
:1069A00000918B0710918C07E80EF91E0A1F1B1F20 |
:1069B000E0928907F0928A0700938B0710938C0767 |
:1069C000F091D702FB8BFF2309F098C18091D6028A |
:1069D000882309F093C18091CE0686FF8FC18091F4 |
:1069E000300790913107AA2797FDA095BA2FBC01D7 |
:1069F000CD0129813A814B815C810E94F4729B0117 |
:106A0000AC0197FF04C02150384F4F4F5F4F6BE0F0 |
:106A100055954795379527956A95D1F780918201CD |
:106A2000682E772488249924CA01B901A40193010E |
:106A30000E94F472DC01CB0180935E0390935F03AC |
:106A4000A0936003B0936103B7FF04C08150904FDF |
:106A5000AF4FBF4F1C012D013CE055944794379434 |
:106A600027943A95D1F720925E0330925F034092CB |
:106A700060035092610380913F0790914007AA27DD |
:106A800097FDA095BA2FBC01CD012D813E814F818C |
:106A900058850E94F47297FF04C06150784F8F4F61 |
:106AA0009F4F2BE095958795779567952A95D1F718 |
:106AB000A40193010E94F472DC01CB018093620374 |
:106AC00090936303A0936403B0936503B7FF04C07E |
:106AD0008150904FAF4FBF4F9C01AD018CE0559559 |
:106AE0004795379527958A95D1F720936203309380 |
:106AF0006303409364035093650380915E03909118 |
:106B00005F039093BC068093BB06809162039091D3 |
:106B100063039093C0068093BF062219330944098A |
:106B200055092093620330936303409364035093A9 |
:106B30006503E20EF31E041F151FE0928907F09211 |
:106B40008A0700938B0710938C078091810188231B |
:106B5000B1F457FF04C02F5F3F4F4F4F5F4F559524 |
:106B6000479537952795A21AB30AC40AD50AA09269 |
:106B70000A03B0920B03C0920C03D0920D03298933 |
:106B80003A8979010027F7FC0095102F8091620364 |
:106B900090916303A0916403B0916503E80EF91E20 |
:106BA0000A1F1B1FC801B70129813A814B815C81F3 |
:106BB0000E94F4729B01AC0197FF04C02150384F32 |
:106BC0004F4F5F4FBBE05595479537952795BA9541 |
:106BD000D1F780918301A82EBB24CC24DD24CA01E7 |
:106BE000B901A60195010E94F472DC01CB018093EA |
:106BF000560390935703A0935803B0935903B7FFDC |
:106C000004C08150904FAF4FBF4F3C014D01ACE0ED |
:106C10009594879477946794AA95D1F760925603D8 |
:106C2000709257038092580390925903C801B7019C |
:106C30002D813E814F8158850E94F47297FF04C0D8 |
:106C40006150784F8F4F9F4FFBE0959587957795D3 |
:106C50006795FA95D1F7A60195010E94F472DC01BF |
:106C6000CB0180935A0390935B03A0935C03B09392 |
:106C70005D03B7FF04C08150904FAF4FBF4FAC01D1 |
:106C8000BD01ECE07595679557954795EA95D1F765 |
:106C900040935A0350935B0360935C0370935D03CE |
:106CA00029893A8937FF03C0309521953F4F213418 |
:106CB0003105E4F1D401C30197FE07C0B095A0955A |
:106CC000909581959F4FAF4FBF4F81389105A1059A |
:106CD000B10584F4DB01CA0177FF07C0B095A09528 |
:106CE000909581959F4FAF4FBF4F81389105A1057A |
:106CF000B105E4F081E08093FA0218C01092C0065A |
:106D00001092BF061092BC061092BB0610925A0356 |
:106D100010925B0310925C0310925D031092560375 |
:106D200010925703109258031092590380915A03FE |
:106D300090915B03A0915C03B0915D03BC01CD0118 |
:106D400024E630E040E050E00E946873E090560393 |
:106D5000F0905703E21AF30AF0923E07E0923D07E3 |
:106D60008091560390915703A0915803B091590315 |
:106D7000BC01CD0124E630E040E050E00E946873A1 |
:106D8000DA01C90120915A0330915B038C01021B87 |
:106D9000130B109333070093320780917A0190917F |
:106DA0007B01A0917C01B0917D01BC01CD0128E661 |
:106DB00031E040E050E00E94F47220918907309168 |
:106DC0008A0740918B0750918C0726173707480791 |
:106DD000590764F0261B370B480B590B2093890782 |
:106DE00030938A0740938B0750938C072091890733 |
:106DF00030918A0740918B0750918C0757FF0CC048 |
:106E0000260F371F481F591F2093890730938A0781 |
:106E100040938B0750938C07609130077091310736 |
:106E20006E0D7F1D9B01442737FD4095542F8091A7 |
:106E30000E0390910F03A0911003B0911103820FE4 |
:106E4000931FA41FB51F80930E0390930F03A0936D |
:106E50001003B09311038091DA029091DB02681B5A |
:106E6000790BCB01AA2797FDA095BA2F29853A85E2 |
:106E70004B855C85820F931FA41FB51F809312035F |
:106E800090931303A0931403B0931503C09096013D |
:106E9000D0909701E0909801F0909901C816D9061A |
:106EA000EA06FB06C4F488EA91E6A0E0B0E08C199B |
:106EB0009D09AE09BF098093120390931303A09319 |
:106EC0001403B093150380930E0390930F03A093C4 |
:106ED0001003B093110322273327A9012C193D0970 |
:106EE0004E095F098091120390911303A09114033E |
:106EF000B091150382179307A407B507B4F4D7011F |
:106F0000C601885A9146A040B040809312039093E6 |
:106F10001303A0931403B093150380930E0390936F |
:106F20000F03A0931003B093110360913F0770917A |
:106F30004007600F711F9B01442737FD4095542F78 |
:106F40008091160390911703A0911803B091190333 |
:106F5000820F931FA41FB51F8093160390931703EE |
:106F6000A0931803B09319038091D8029091D9028D |
:106F7000681B790BCB01AA2797FDA095BA2F2D8509 |
:106F80003E854F855889820F931FA41FB51F80939C |
:106F90001A0390931B03A0931C03B0931D03E0906E |
:106FA0009A01F0909B0100919C0110919D01E816BF |
:106FB000F9060A071B07C4F488EA91E6A0E0B0E0EE |
:106FC0008E199F09A00BB10B80931A0390931B039A |
:106FD000A0931C03B0931D03809316039093170393 |
:106FE000A0931803B093190322273327A9012E1960 |
:106FF0003F09400B510B80911A0390911B03A09104 |
:107000001C03B0911D0382179307A407B507B4F4BE |
:10701000D801C701885A9146A040B04080931A0316 |
:1070200090931B03A0931C03B0931D03809316033E |
:1070300090931703A0931803B093190380910A0348 |
:1070400090910B03A0910C03B0910D0380931E034C |
:1070500090931F03A0932003B093210380911A0300 |
:1070600090911B03A0911C03B0911D0380933A03E0 |
:1070700090933B03A0933C03B0933D038091120394 |
:1070800090911303A0911403B091150380933203E0 |
:1070900090933303A0933403B09335038091160388 |
:1070A00090911703A0911803B091190380933603B0 |
:1070B00090933703A0933803B093390380910E0364 |
:1070C00090910F03A0911003B091110380932E03B0 |
:1070D00090932F03A0933003B09331038091230149 |
:1070E0009091240197FD079633E0959587953A9501 |
:1070F000E1F79093400780933F07809121019091A1 |
:10710000220197FD079623E0959587952A95E1F74B |
:107110009093310780933007809125029091260249 |
:107120000F9734F488E19CEF9093400780933F07DA |
:107130008091250290912602079734F480E398EF1E |
:107140009093400780933F07209102012A30A9F4D1 |
:107150008091250290912602835F934034F088EE5F |
:1071600093E09093400780933F0780912502909190 |
:1071700026028A5F9340DCF014C080912502909132 |
:107180002602815D974034F088EE93E090934007AB |
:1071900080933F078091250290912602805E974060 |
:1071A00034F080ED97E09093400780933F07809103 |
:1071B0002302909124020F9734F488E19CEF90937E |
:1071C0003107809330078091230290912402079722 |
:1071D00034F480E398EF90933107809330072A309E |
:1071E000A9F48091230290912402835F934034F0AC |
:1071F00088EE93E0909331078093300780912302CB |
:10720000909124028A5F9340DCF014C080912302A5 |
:1072100090912402815D974034F088EE93E0909342 |
:107220003107809330078091230290912402805E81 |
:10723000974034F080ED97E09093310780933007CA |
:10724000E0918D01EE2309F4B7C0409123015091E4 |
:1072500024018091660390916703481B590B50935A |
:107260006D0340936C032091230130912401280F7A |
:10727000391F37FF02C02F5F3F4F35952795309359 |
:10728000670320936603413851051CF080E890E0C5 |
:1072900005C040585F4F34F480E89FEF90936D0332 |
:1072A00080936C038E2F9927A0916C03B0916D038E |
:1072B000A89FA001A99F500DB89F500D112457FF02 |
:1072C00002C0415F5F4F84E0559547958A95E1F78D |
:1072D00080913F0790914007840F951F909340073E |
:1072E00080933F0760912101709122018091680392 |
:1072F00090916903681B790B70936B0360936A0329 |
:107300004091210150912201480F591F57FF02C09F |
:107310004F5F5F4F559547955093690340936803BE |
:10732000613871051CF080E890E005C060587F4F1F |
:1073300034F480E89FEF90936B0380936A032E2FC1 |
:10734000332780916A0390916B03829FB001839FE2 |
:10735000700D929F700D1124AB0177FF02C0415F49 |
:107360005F4F14E0559547951A95E1F780913007E6 |
:1073700090913107840F951F9093310780933007C8 |
:10738000A29FC001A39F900DB29F900D11249C015C |
:107390008091230190912401820F931F90932401E7 |
:1073A000809323018091210190912201860F971FE4 |
:1073B000909322018093210100914207109143078D |
:1073C0008091BB069091BC06101611065CF59C01DD |
:1073D00097FF04C022273327281B390BC901AA278E |
:1073E00097FDA095BA2F2091810133274427552777 |
:1073F000BC01CD010E94F4729B01AC0197FF04C057 |
:10740000215C3F4F4F4F5F4FF6E0559547953795BD |
:107410002795FA95D1F780913D0790913E07820F0D |
:10742000931F27C097FF03C0909581959F4FAA2770 |
:1074300097FDA095BA2F2091810133274427552726 |
:10744000BC01CD010E94F4729B01AC0197FF04C006 |
:10745000215C3F4F4F4F5F4FE6E05595479537957D |
:107460002795EA95D1F780913D0790913E07821BC1 |
:10747000930B90933E0780933D07E0904C07F0906C |
:107480004D078091BF069091C0061E141F045CF545 |
:107490009C0197FF04C022273327281B390BC90101 |
:1074A000AA2797FDA095BA2F209181013327442761 |
:1074B0005527BC01CD010E94F4729B01AC0197FFDE |
:1074C00004C0215C3F4F4F4F5F4F76E05595479585 |
:1074D000379527957A95D1F78091320790913307A8 |
:1074E000820F931F27C097FF03C0909581959F4FF0 |
:1074F000AA2797FDA095BA2F209181013327442711 |
:107500005527BC01CD010E94F4729B01AC0197FF8D |
:1075100004C0215C3F4F4F4F5F4F66E05595479544 |
:10752000379527956A95D1F7809132079091330767 |
:10753000821B930B90933307809332078091CE0682 |
:1075400087FF44C09B89992309F040C08091D602EF |
:107550008823E1F5A1E0EA16A1E0FA064CF080915B |
:107560003F07909140078E0D9F1D805091400DC0A8 |
:10757000B0E0EB16BFEFFB0664F480913F079091FB |
:1075800040078E0D9F1D80509F4F90934007809322 |
:107590003F07E1E001301E074CF0809130079091E9 |
:1075A0003107800F911F805091400CC0FFEF0030D9 |
:1075B0001F0764F48091300790913107800F911F6D |
:1075C00080509F4F9093310780933007AFEEB2E029 |
:1075D00066EC76E057E0FB018191BF01E82FFF27C1 |
:1075E000EE0FFF1FED5AF94F0190F081E02DE259A7 |
:1075F000FF4FEF3FF10521F01CF0EFEFF0E004C08A |
:10760000F7FF02C0E0E0F0E04C91242F3327E217AF |
:10761000F307B1F0CF01821B930B97FD079633E080 |
:10762000959587953A95E1F7242F280F2C93822F73 |
:107630009927E817F90714F4215001C02F5F2C9304 |
:107640005150119657FFC7CFE2E1CD5E0C949F7366 |
:10765000CF93DF93809102018D3011F40E94931C2F |
:1076600010927A0080912502909126029093400713 |
:1076700080933F07809123029091240290933107D9 |
:10768000809330078091210290912202909383078A |
:107690008093820780911D0290911E029C014427D5 |
:1076A00037FD4095542FDA01C90172E0880F991F08 |
:1076B000AA1FBB1F7A95D1F7820F931FA41FB51F76 |
:1076C000820F931FA41FB51F90937E0780937D07A1 |
:1076D00080911F02909120029C01442737FD409524 |
:1076E000542FDA01C90162E0880F991FAA1FBB1F3E |
:1076F0006A95D1F7820F931FA41FB51F820F931FA6 |
:10770000A41FB51F90938E0780938D0780911B0255 |
:1077100090911C0290934B0780934A078FEC8093C3 |
:107720007A00AFEEB2E0C6ECD6E097E08991E82FA0 |
:10773000FF27EE0FFF1FED5AF94F0190F081E02D6A |
:10774000E259FF4F1E161F061CF0E0E0F0E005C0F6 |
:10775000EF3FF10514F0EFEFF0E08C91282F332785 |
:10776000E217F30714F4815004C02E173F0714F4F6 |
:107770008F5F8C939150119697FFD8CF8091FF0621 |
:107780009927AA27BB27BC01CD0124EC39E040E0B2 |
:1077900050E00E94F472DC01CB0180939A01909337 |
:1077A0009B01A0939C01B0939D01809100079927B4 |
:1077B000AA27BB27BC01CD010E94F472DC01CB01DA |
:1077C0008093960190939701A0939801B0939901AB |
:1077D000DF91CF910895A0E0B0E0E1EFFBE30C94DE |
:1077E0008773C0E0D0E07E016E01469AD0934903D2 |
:1077F000C0934803D0934703C093460380E090E0D2 |
:10780000A0E0B0E08093400390934103A093420333 |
:10781000B0934303D0935303C0935203D0935103C7 |
:10782000C0935003D0934F03C0934E03D0935E0791 |
:10783000C0935D071092830110928201109215028D |
:107840000E94283B84E690E00E9404180E94283B96 |
:107850008091CE0680FF10C080911B0190911C0189 |
:10786000875B934038F480911B0190911C018E5EE0 |
:10787000924010F40E94321C1FE18AE090E00E94C6 |
:1078800004188091210290912202C80FD91F809183 |
:10789000250290912602E80EF91E80912302909114 |
:1078A0002402C80ED91E115017FFE7CFA701405F71 |
:1078B0005F4F569547955695479550935303409380 |
:1078C00052039601205F3F4F3695279536952795B1 |
:1078D0003093510320935003CE01409615E09695C6 |
:1078E00087951A95E1F790934F0380934E039093F9 |
:1078F0005E0780935D0730934D0320934C035093B4 |
:107900004B0340934A03F999FECF84E090E092BD87 |
:1079100081BDF89A80B5853058F180918D0790919E |
:107920008E0797FF03C0909581959F4F6CE070E0A4 |
:107930000E943373709347036093460380917D07E1 |
:1079400090917E0797FF03C0909581959F4F6CE0C3 |
:1079500070E00E94337370934903609348038091F1 |
:10796000150690911606AA2797FDA095BA2F4CC030 |
:10797000F999FECF84E090E092BD81BDF89A80B580 |
:107980009927382F2227F999FECF85E090E092BD04 |
:1079900081BDF89A80B5280F311D3093490320939B |
:1079A0004803F999FECF86E090E092BD81BDF89A38 |
:1079B00080B59927382F2227F999FECF87E090E0EC |
:1079C00092BD81BDF89A80B5280F311D30934703D1 |
:1079D00020934603F999FECF88E090E092BD81BDE7 |
:1079E000F89A80B59927382F2227F999FECF89E098 |
:1079F00090E092BD81BDF89A80B5280F311DC90174 |
:107A0000AA2797FDA095BA2FBC01CD010E94407214 |
:107A1000DC01CB018093400390934103A093420388 |
:107A2000B09343031092400710923F071092310722 |
:107A300010923007109283071092820784E690E03C |
:107A40000E94041880911D0290911E02AA2797FDA2 |
:107A5000A095BA2F9C01AD01F2E0220F331F441F05 |
:107A6000551FFA95D1F7280F391F4A1F5B1F280FA2 |
:107A7000391F4A1F5B1F30937E0720937D0780913B |
:107A80001F0290912002AA2797FDA095BA2F7C0192 |
:107A90008D01E2E0EE0CFF1C001F111FEA95D1F7EB |
:107AA000E80EF91E0A1F1B1FE80EF91E0A1F1B1FF6 |
:107AB000F0928E07E0928D078091DD06682E772484 |
:107AC00088249924C9019C01442737FD4095542FEF |
:107AD000C401B3010E94F4725B016C0160933A032C |
:107AE00070933B0380933C0390933D03970144279D |
:107AF00037FD4095542FC401B3010E94F472DC019C |
:107B0000CB018093320390933303A0933403B0935B |
:107B10003503A0921603B0921703C0921803D092B7 |
:107B2000190380930E0390930F03A0931003B09357 |
:107B3000110310920A0310920B0310920C0310927F |
:107B40000D0380911D0190911E01A0911F01B09124 |
:107B50002001909318068093170610921402109239 |
:107B60001302109202031092030310920403109266 |
:107B7000050380910003909101039093FF0280938D |
:107B8000FE020E94C75D82E390E09093FF01809324 |
:107B9000FE018091FF069927AA27BB27BC01CD01D2 |
:107BA00024EC39E040E050E00E94F472DC01CB01AB |
:107BB0008856954CAF4FBF4F80939A0190939B018D |
:107BC000A0939C01B0939D01809100079927AA275B |
:107BD000BB27BC01CD010E94F472DC01CB018856A9 |
:107BE000954CAF4FBF4F8093960190939701A09310 |
:107BF0009801B093990110927F0110927E018091BB |
:107C0000000390910103AA2797FDA095BA2F209118 |
:107C10007A0130917B0140917C0150917D01BC0142 |
:107C2000CD010E94F472DC01CB018093890790930F |
:107C30008A07A0938B07B0938C071092F9021092D9 |
:107C4000F80281E0809301010E94E9618091BD0208 |
:107C500084608093BD028FEF8093FA071092FB0738 |
:107C600080E28093FC07CFEED2E0A6ECB6E017E00E |
:107C70008D91E82FFF27EE0FFF1FED5AF94F8081FE |
:107C8000918182598993115017FFF2CF84E6809336 |
:107C9000EE028091FC01882311F0469A579AEEE09B |
:107CA000CDB7DEB70C94A3738091E4028823F9F476 |
:107CB0008091BD028C7F8093BD02A2E2B6E0E9E62E |
:107CC000F4E09BE08091DF01882309F480838191B7 |
:107CD0008C931496915097FFF5CF8091DF01882304 |
:107CE00059F08091DF0181508093DF0105C08091C0 |
:107CF000BD0281608093BD028091220699279093F6 |
:107D0000EB058093EA058091260699279093ED056F |
:107D10008093EC0580912A0699279093EF05809334 |
:107D2000EE0580912E0699279093F1058093F0053A |
:107D300010924A02109249020E94FB2B08958091F2 |
:107D4000D006883F38F0EFEFF0E0E81BF109E15191 |
:107D5000FD4F80818093930180919301882329F0C6 |
:107D6000843618F084E6809393018091D206883F90 |
:107D700038F0EFEFF0E0E81BF109E151FD4F8081B1 |
:107D80008093910180919101882329F0843618F025 |
:107D900084E6809391018091DF06883F38F0EFEF11 |
:107DA000F0E0E81BF109E151FD4F808180938C01E7 |
:107DB00080918C018B3010F48AE002C08F3F11F467 |
:107DC00080938C0180910907883F38F0EFEFF0E055 |
:107DD000E81BF109E151FD4F8081809358078091A4 |
:107DE0005807823010F481E002C08F3F11F4809375 |
:107DF000580780910B07883F38F0EFEFF0E0E81B61 |
:107E0000F109E151FD4F80818093800780918007C7 |
:107E1000823010F481E002C08F3F11F4809380071C |
:107E20008091F606883F38F0EFEFF0E0E81BF109AB |
:107E3000E151FD4F8081809355078091F706883F7F |
:107E400038F0EFEFF0E0E81BF109E151FD4F8081E0 |
:107E50008093C1068091F806883F38F0EFEFF0E09C |
:107E6000E81BF109E151FD4F808180935F079091FC |
:107E7000D106983F18F49093920109C0EFEFF0E01B |
:107E8000E91BF109E151FD4F808180939201983FF8 |
:107E900018F49093920109C0EFEFF0E0E91BF109AB |
:107EA000E151FD4F8081809392018091D406883FFB |
:107EB00038F0EFEFF0E0E81BF109E151FD4F808170 |
:107EC000809390018091D606883F38F0EFEFF0E084 |
:107ED000E81BF109E151FD4F808180938E01809173 |
:107EE000DE06883F38F0EFEFF0E0E81BF109E151E2 |
:107EF000FD4F808180938F018091E006883F38F0AC |
:107F0000EFEFF0E0E81BF109E151FD4F8081809334 |
:107F10008B018091E106883F38F0EFEFF0E0E81B3D |
:107F2000F109E151FD4F808180938D018091E2063E |
:107F3000883F38F0EFEFF0E0E81BF109E151FD4F29 |
:107F4000808180938A018091E306883F38F0EFEFCB |
:107F5000F0E0E81BF109E151FD4F80818093890138 |
:107F60008091E806883F38F0EFEFF0E0E81BF10978 |
:107F7000E151FD4F8081809387018091E906883F20 |
:107F800038F0EFEFF0E0E81BF109E151FD4F80819F |
:107F90008093D1028091EA06883F38F0EFEFF0E05D |
:107FA000E81BF109E151FD4F80818093D00280915F |
:107FB000EB06883F38F0EFEFF0E0E81BF109E15104 |
:107FC000FD4F80818093CF028091EC06883F38F08E |
:107FD000EFEFF0E0E81BF109E151FD4F8081809364 |
:107FE000CE0280910407883F38F0EFEFF0E0E81B05 |
:107FF000F109E151FD4F80818093CD028091050709 |
:10800000883F38F0EFEFF0E0E81BF109E151FD4F58 |
:1080100080818093CC0280910607883F38F0EFEF93 |
:10802000F0E0E81BF109E151FD4F80818093CB0224 |
:1080300080910707883F38F0EFEFF0E0E81BF10987 |
:10804000E151FD4F80818093CA028091ED06883F07 |
:1080500038F0EFEFF0E0E81BF109E151FD4F8081CE |
:10806000809386018091F106883F38F0EFEFF0E0D1 |
:10807000E81BF109E151FD4F8081809385018091DA |
:10808000F906883F38F0EFEFF0E0E81BF109E15125 |
:10809000FD4F8081809384018091FC06883F38F0F9 |
:1080A000EFEFF0E0E81BF109E151FD4F8081809393 |
:1080B00083018091FD06883F38F0EFEFF0E0E81B88 |
:1080C000F109E151FD4F8081809382018091FE068C |
:1080D000883F38F0EFEFF0E0E81BF109E151FD4F88 |
:1080E00080818093810180910307883F38F0EFEF12 |
:1080F000F0E0E81BF109E151FD4F808180938001A0 |
:1081000080911E07883F38F0EFEFF0E0E81BF1099F |
:10811000E151FD4F80818093900780918701282F46 |
:1081200033272F5F3F4F8CE398E2B9010E943373EE |
:1081300070939501609394018091DC068093810790 |
:108140008091DB06809344070895A4E1B0E0EBEA58 |
:10815000F0E40C9483730E94A032309102013C3011 |
:1081600010F4299A01C02998E090E502F090E60207 |
:10817000FA82E9828091440799270A96E816F9065F |
:1081800014F49A8389838091EE02843608F05CC0EF |
:1081900080918A0390918B03009731F0019790931F |
:1081A0008B0380938A0307C01092E4028091BD0282 |
:1081B0008F7E8093BD023A3011F0343111F4289A49 |
:1081C00001C028988091BE029091BF02895E9340C1 |
:1081D000C0F18091E506282F33273A8329838091C7 |
:1081E000BD0280618093BD028091C206A82FBB278B |
:1081F000AA0FBB1FFD01E957F94F11821082809130 |
:10820000C306282F3327220F331FC9018957994FDF |
:10821000FC0111821082AD5AB94F11961C921E9228 |
:108220002D5A394FD90111961C921E928091C50684 |
:10823000E82FFF27EE0FFF1FED5AF94F1182108232 |
:1082400021C31092E4021EC38091EE028D3808F41F |
:1082500019C38091BD028F7E8093BD029091E60686 |
:1082600082E3989FC001112490938B0380938A032B |
:10827000E981FA81B9978CF08091E402882369F052 |
:108280008091BE029091BF02FFEF8F3F9F0729F0C0 |
:1082900001969093BF028093BE028091BE0290919E |
:1082A000BF028F3F910509F038F510926E031092CE |
:1082B0006F03109270031092710310927203109268 |
:1082C000730310927403109275038A3F9105C9F4E9 |
:1082D00081E08093900310927603109277031092BE |
:1082E00078031092790310920A0310920B031092F4 |
:1082F0000C0310920D0305C08091BD028260809333 |
:10830000BD028091C406E82FFF27EE0FFF1FED5A34 |
:10831000F94F80819181813591050CF4DFC1209165 |
:10832000E402222309F0DAC18091C506E82FFF2775 |
:10833000EE0FFF1FED5AF94F808191818C3491052A |
:108340000CF404C180918C038F5F80938C03893C73 |
:1083500008F4C4C13C3010F4299801C0299A109245 |
:10836000E40210928C031092BF021092BE02309170 |
:10837000C206E32FFF27EE0FFF1FED5AF94F808152 |
:10838000918187349105B4F48091C306E82FFF27CB |
:10839000EE0FFF1FED5AF94F808191810190F0811E |
:1083A000E02DF7FF03C0F095E195FF4FE734F105AD |
:1083B0000CF478C041E02091C306A22FBB27AA0F7E |
:1083C000BB1FAD5AB94F8D919C9111978734910580 |
:1083D00044F0E32FFF27EE0FFF1FED5AF94F808186 |
:1083E00091818D919C918734910574F08091C206A2 |
:1083F000E82FFF27EE0FFF1FED5AF94F8081918183 |
:10840000873491050CF042E0E22FFF27EE0FFF1FAB |
:10841000ED5AF94F808191818634910574F48091F1 |
:10842000C206E82FFF27EE0FFF1FED5AF94F80819C |
:108430009181873491050CF043E0E22FFF27EE0F86 |
:10844000FF1FED5AF94F808191818A5B9F4F74F431 |
:108450008091C206E82FFF27EE0FFF1FED5AF94F5C |
:1084600080819181873491050CF044E0E22FFF2751 |
:10847000EE0FFF1FED5AF94F808191818A5B9F4F6C |
:1084800074F48091C206E82FFF27EE0FFF1FED5A0C |
:10849000F94F80819181863491050CF445E0842F59 |
:1084A0000E941A078091C306E82FFF27EE0FFF1FD7 |
:1084B000ED5AF94F808191810190F081E02DF7FF15 |
:1084C00003C0F095E195FF4F7E97BCF48091C20602 |
:1084D000E82FFF27EE0FFF1FED5AF94F80819181A2 |
:1084E0008A5B9F4F54F481E080937F0488EE93E091 |
:1084F0009093FF018093FE01F1C00E9472074CE649 |
:1085000062EC76E00E94FD0680E00E94BC070E94BB |
:10851000206F8091CE0680FF10C080911B0190914A |
:108520001C01875B934038F480911B0190911C01E2 |
:108530008E5E924010F40E94321C1092FC010E9448 |
:10854000EB3B81E08093FC01579ABFC08081918111 |
:10855000855B9F4F0CF0C0C080918C038F5F809330 |
:108560008C03893C08F4BAC03C3010F4299801C04F |
:10857000299A8FB399279C012270307081FDF9CF21 |
:108580001FBA84E090E092BD81BD8FEF80BD0FB631 |
:10859000F894FA9AF99A0FBE1092E40210928C03A2 |
:1085A0003093BF022093BE020E94EB3B2091480310 |
:1085B00030914903C90137FF02C081509F4F892F75 |
:1085C000990F990B482FF999FECF1FBA84E090E0DC |
:1085D00092BD81BD40BD0FB6F894FA9AF99A0FBECC |
:1085E000F999FECF1FBA85E090E092BD81BD20BD14 |
:1085F0000FB6F894FA9AF99A0FBE2091460330917B |
:108600004703C90137FF02C081509F4F892F990F3F |
:10861000990B482FF999FECF1FBA86E090E092BDE2 |
:1086200081BD40BD0FB6F894FA9AF99A0FBEF99938 |
:10863000FECF1FBA87E090E092BD81BD20BD0FB68E |
:10864000F894FA9AF99A0FBE8091400390914103F1 |
:10865000A0914203B0914303BC01CD010E940D7271 |
:10866000DC01CB019C0197FF02C021503F4F832FBB |
:10867000992787FD9A95282FF999FECF1FBA88E090 |
:1086800090E092BD81BD20BD0FB6F894FA9AF99A98 |
:108690000FBE8091400390914103A0914203B0919D |
:1086A0004303BC01CD010E940D72DC01CB01282FD8 |
:1086B000F999FECF1FBA89E090E092BD81BD20BD3F |
:1086C0000FB6F894FA9AF99A0FBE0E94720768E7FB |
:1086D00070E00E947F3202C020938C038091C40618 |
:1086E000E82FFF27EE0FFF1FED5AF94F8081918190 |
:1086F0008B5A9F4F0CF0C6C02091E402E091C50652 |
:10870000222309F0A3C0FF27EE0FFF1FED5AF94FF8 |
:1087100080819181855B9F4F0CF095C080918D0386 |
:108720008F5F80938D03893C08F4ACC020938D0348 |
:1087300081E090E09093BF028093BE0281E080933D |
:10874000E40210927603109277031092780310924D |
:10875000790310920A0310920B0310920C031092EB |
:108760000D03109206031092070310920803109253 |
:1087700009038091DD06E82EFF2400271127809150 |
:108780007D0790917E079C01442737FD4095542F2B |
:10879000C801B7010E94F472DC01CB0180931A0377 |
:1087A00090931B03A0931C03B0931D0380918D072E |
:1087B00090918E079C01442737FD4095542FC801A6 |
:1087C000B7010E94F472DC01CB01809312039093F5 |
:1087D0001303A0931403B093150380913A0390916F |
:1087E0003B03A0913C03B0913D038093160390930B |
:1087F0001703A0931803B09319038091320390914B |
:108800003303A0913403B091350380930E0390930A |
:108810000F03A0931003B093110310926E031092F4 |
:108820006F031092700310927103109272031092F2 |
:10883000730310927403109275038091BD028860D7 |
:108840008093BD021FC020938D031CC0FF27EE0F35 |
:10885000FF1FED5AF94F808191818C34910584F08E |
:1088600080918E038F5F80938E03893C58F0109225 |
:10887000E40210928E031092BF021092BE0202C058 |
:1088800010928E03809178018150809378018091BD |
:1088900078018F3F21F08091BD0284FFD5C20E94F4 |
:1088A0009F3E8091990390919A03AC01440F551F0C |
:1088B000480F591F0091C206A02FBB27AA0FBB1F4C |
:1088C000FD01ED5AF94FF090D806CF2CDD248081C0 |
:1088D00091818C9DF0018D9DF00D9C9DF00D1124DA |
:1088E0004E0F5F1F57FF02C04D5F5F4F5595479575 |
:1088F00055954795A957B94F8091D906682F772785 |
:108900008D919C91869F9001879F300D969F300D91 |
:108910001124420F531F50939A034093990380915F |
:10892000D0039091D1032091CC033091CD03820FDD |
:10893000931F481B590B5093EC024093EB0280911C |
:108940009B0390919C03AC01440F551F480F591F86 |
:108950001091C306A12FBB27AA0FBB1FFD01ED5A23 |
:10896000F94F808191818C9DF0018D9DF00D9C9D32 |
:10897000F00D11244E0F5F1F57FF02C04D5F5F4F78 |
:108980005595479555954795A957B94F8D919C9108 |
:10899000869F9001879F300D969F300D1124420FC6 |
:1089A000531F50939C0340939B038091CE0390915F |
:1089B000CF032091CA033091CB03820F931F481B32 |
:1089C000590B5093EA024093E9028091C506E82FC3 |
:1089D000FF27EE0FFF1FED5AF94F8081918190958F |
:1089E00081959F4F9093E8028093E7028330910531 |
:1089F00014F0029705C03FEF8E3F930734F40296C0 |
:108A00009093E8028093E70204C01092E80210926B |
:108A1000E7028091C406E82FFF27EE0FFF1FED5AF3 |
:108A2000F94FC080D18048E750E0C40ED51ED092E7 |
:108A3000E602C092E50280918C019927AA2797FD52 |
:108A4000A095BA2FBC01CD010E944072DC01CB0180 |
:108A500020E030E040E251E4BC01CD010E94A5716C |
:108A6000DC01CB01BC01CD010E941272DC01CB0103 |
:108A70008093870780918B018093600780918A01A2 |
:108A80009927AA2797FDA095BA2FBC01CD010E9476 |
:108A90004072DC01CB0120E030E040E251E4BC0157 |
:108AA000CD010E94A571DC01CB01BC01CD010E946A |
:108AB0001272DC01CB01809337078091890180938A |
:108AC0004E0780918B0480FF61C0809190078138B0 |
:108AD00008F45CC080918404992787FD90954F2D00 |
:108AE0005527849F9001859F300D949F300D112450 |
:108AF0008091EB029091EC02820F931F9093EC0215 |
:108B00008093EB0280918504992787FD9095849F3F |
:108B10009001859F300D949F300D11248091E902C2 |
:108B20009091EA02820F931F9093EA028093E902E8 |
:108B300080918604282F332727FD30958091E70206 |
:108B40009091E802820F931F9093E8028093E702CE |
:108B500080918804282F332727FD30958091D306F4 |
:108B60009927289FB001299F700D389F700D1124FF |
:108B700070937F0160937E018091870499278C1503 |
:108B80009D0524F49093E6028093E5028091E5022E |
:108B90009091E60297FF04C01092E6021092E5025F |
:108BA0008091CE0682FF02C0109260074091EB02D6 |
:108BB0005091EC02CA0157FD03969C01359527950B |
:108BC0003595279537FF03C0309521953F4F80910C |
:108BD000C2029091C30282179307B4F4CA0157FFEF |
:108BE00003C0909581959F4F97FD03969595879526 |
:108BF000959587959093C3028093C202853691051F |
:108C000044F084E690E001C001979093C302809302 |
:108C1000C2024091E9025091EA02CA0157FD03964F |
:108C20009C01359527953595279537FF03C03095DD |
:108C300021953F4F8091C0029091C1028217930706 |
:108C4000B4F4CA0157FF03C0909581959F4F97FDDB |
:108C5000039695958795959587959093C1028093F6 |
:108C6000C0028536910544F084E690E001C001978A |
:108C70009093C1028093C0028091BD0284FF08C01E |
:108C80001092C3021092C2021092C1021092C0024E |
:108C9000E12FFF27EE0FFF1FED5AF94F4091FA0623 |
:108CA000242F3327808191812817390744F480913C |
:108CB0001F0782FF04C081E08093D50213C0E12F1B |
:108CC000FF27EE0FFF1FED5AF94F842F99272091B0 |
:108CD000FB06821B9109208131812817390714F482 |
:108CE0001092D5024091C306E42FFF27EE0FFF1F1D |
:108CF000ED5AF94F5091FA06852F992722273327ED |
:108D0000281B390B808191818217930744F480914D |
:108D10001F0783FF04C081E08093D40216C08091B6 |
:108D2000D402882391F0E42FFF27EE0FFF1FED5AA6 |
:108D3000F94F8091FB069927851B9109208131818C |
:108D40008217930714F41092D402E02FFF27EE0F3E |
:108D5000FF1FED5AF94F4091FA06242F33278081E7 |
:108D600091812817390744F480911F0780FF04C0C0 |
:108D700081E08093D20217C08091D202882399F0BB |
:108D8000E02FFF27EE0FFF1FED5AF94F842F992791 |
:108D90002091FB06821B9109208131812817390718 |
:108DA00014F41092D2024091C206E42FFF27EE0F76 |
:108DB000FF1FED5AF94F5091FA06852F9927222768 |
:108DC0003327281B390B808191818217930744F444 |
:108DD00080911F0781FF04C081E08093D30216C0F9 |
:108DE0008091D302882391F0E42FFF27EE0FFF1F1D |
:108DF000ED5AF94F8091FB069927851B9109208137 |
:108E000031818217930714F41092D3028091D50216 |
:108E1000882319F48091D402811181E08093D602D5 |
:108E20008091D202882321F48091D302882351F0CB |
:108E300081E08093D7021092D6021092D502109250 |
:108E4000D40202C08093D7028091D602882321F4F5 |
:108E50008091D702882369F08091F9069927A9812A |
:108E6000BA818A179B0714F49A83898381E08093DF |
:108E7000FA028091BD0284FF1AC01092E80210929B |
:108E8000E7021092EC021092EB021092EA021092AA |
:108E9000E9029AE59093870788E7809360079093AB |
:108EA000370780934E071092D6021092D702809116 |
:108EB000510790915207A0915307B0915407209108 |
:108EC0003A0330913B0340913C0350913D03820FA4 |
:108ED000931FA41FB51F8093510790935207A0932F |
:108EE0005307B09354078091590790915A07A09166 |
:108EF0005B07B0915C0720903203309033034090C1 |
:108F0000340350903503820D931DA41DB51D80932D |
:108F1000590790935A07A0935B07B0935C07809121 |
:108F2000460790914707A0914807B0914907E09004 |
:108F30003603F09037030091380310913903EB8228 |
:108F4000FC820D831E838E0D9F1DA01FB11F809379 |
:108F5000460790934707A0934807B093490780912D |
:108F6000380790913907A0913A07B0913B07E090FC |
:108F70002E03F0902F030091300310913103EF8204 |
:108F8000F88609871A878E0D9F1DA01FB11F809339 |
:108F9000380790933907A0933A07B0933B07F090B6 |
:108FA000D702FB86FF2029F48091D602882309F49A |
:108FB00060C010922A0310922B0310922C0310927F |
:108FC0002D0310922603109227031092280310926B |
:108FD00029031092510710925207109253071092D2 |
:108FE00054071092590710925A0710925B0710927B |
:108FF0005C0710924607109247071092480710929C |
:109000004907109238071092390710923A071092C8 |
:109010003B0780911A0390911B03A0911C03B09110 |
:109020001D038093160390931703A0931803B09326 |
:1090300019038091120390911303A0911403B0912E |
:10904000150380930E0390930F03A0931003B09326 |
:10905000110310921202109211021092D902109272 |
:10906000D8021092DB021092DA020B85002309F07D |
:10907000F2C18091D602882309F0EDC180911506D6 |
:1090800090911606815092402CF48091E40288233E |
:1090900009F4E1C19090FA07A090DD0660917D0788 |
:1090A00070917E077C8B6B8B80918D0790918E07E2 |
:1090B0009A8B898B9FEF991609F4D9C0BB24CC24D5 |
:1090C000DD24CA01B901A60195010E9468737901E6 |
:1090D0008A01EB89FC89CF01AA2797FDA095BA2FB9 |
:1090E000E81AF90A0A0B1B0BC201B101A60195018E |
:1090F0000E94687359016A0129893A89C901AA271E |
:1091000097FDA095BA2FA81AB90ACA0ADB0A292C1A |
:10911000332427FC3094432C532CC801B701A201FF |
:1091200091010E94F47297FF04C061507E4F8F4FEF |
:109130009F4F3B014C0129E0959487947794679465 |
:109140002A95D1F7C601B501A20191010E94F472DE |
:1091500097FF04C061507E4F8F4F9F4F5B016C01A2 |
:1091600099E0D594C794B794A7949A95D1F7809134 |
:10917000C2029091C302813491053CF48091C002F7 |
:109180009091C10281349105D4F0D401C30197FEBE |
:1091900003C00196A11DB11D3C014D01959487941A |
:1091A00077946794D601C501D7FE03C00196A11D2F |
:1091B000B11D5C016D01D594C794B794A7948091BB |
:1091C000C506E82FFF27EE0FFF1FED5AF94F8081EC |
:1091D00091810190F081E02DF7FF03C0F095E195BA |
:1091E000FF4F7A97A4F0C401B30123E030E040E0E0 |
:1091F00050E00E94687339014A01C601B50123E0BD |
:1092000030E040E050E00E94687359016A018091AB |
:10921000FC07282F332727FD3095432F532F261582 |
:1092200037054805590514F439014A01992787FD86 |
:109230009095909581959F4FAA2797FDA095BA2F5D |
:10924000681679068A069B0614F43C014D012A151E |
:109250003B054C055D0514F459016A01A816B906D1 |
:10926000CA06DB060CF0CFC05C016D01CCC0EA2C55 |
:10927000FF2400271127CA01B901A80197010E9404 |
:10928000687339014A014B895C89CA01AA2797FD95 |
:10929000A095BA2F681A790A8A0A9B0AC201B101FD |
:1092A000A80197010E94687359016A0169897A8946 |
:1092B000CB01AA2797FDA095BA2FA81AB90ACA0A06 |
:1092C000DB0AD401C30197FE03C00F96A11DB11D97 |
:1092D0003C014D0114E095948794779467941A9516 |
:1092E000D1F7D601C501D7FE03C00F96A11DB11D50 |
:1092F0005C016D01B4E0D594C794B794A794BA9576 |
:10930000D1F78091C2029091C302813491053CF45F |
:109310008091C0029091C10281349105A4F0C401F2 |
:10932000B30123E030E040E050E00E94687339016F |
:109330004A01C601B50123E030E040E050E00E9460 |
:10934000687359016A018091C506E82FFF27EE0F67 |
:10935000FF1FED5AF94F808191810190F081E02D3E |
:10936000F7FF03C0F095E195FF4F7A97A4F0C40191 |
:10937000B30123E030E040E050E00E94687339011F |
:109380004A01C601B50123E030E040E050E00E9410 |
:10939000687359016A0171E26716710481049104CE |
:1093A0002CF0A0E26A2E712C812C912C80EE681694 |
:1093B0008FEF78068FEF88068FEF980644F4F0EE73 |
:1093C0006F2EFFEF7F2EFFEF8F2EFFEF9F2E91E28C |
:1093D000A916B104C104D1042CF0E0E2AE2EB12CE8 |
:1093E000C12CD12CA0EEAA16AFEFBA06AFEFCA0679 |
:1093F000AFEFDA0644F470EEA72E7FEFB72E7FEFC3 |
:10940000C72E7FEFD72E80911A0390911B03A09156 |
:109410001C03B0911D0386199709A809B909809307 |
:109420001A0390931B03A0931C03B0931D03809118 |
:10943000120390911303A0911403B09115038A199C |
:109440009B09AC09BD098093120390931303A09369 |
:109450001403B093150380911102909112028F3F73 |
:10946000910509F008F4DEC5BB85BB2309F068C58A |
:109470008091D602882309F063C58091FA0288237F |
:1094800009F05EC5E0910207EC87EE2309F458C5A8 |
:109490008091510790915207A0915307B0915407C2 |
:1094A000B7FF04C081509F4FAF4FBF4FE92EFA2E38 |
:1094B0000B2F112707FD1A95E0925107F0925207E2 |
:1094C00000935307109354078091590790915A07BE |
:1094D000A0915B07B0915C07B7FF04C081509F4F1C |
:1094E000AF4FBF4F892F9A2FAB2FBB27A7FDBA9540 |
:1094F0008D879E87AF87B88B8093590790935A07C3 |
:10950000A0935B07B0935C078091DD06A82EBB2477 |
:10951000CC24DD2420912A0330912B0340912C038D |
:1095200050912D03C601B5010E94F47297FF04C04B |
:1095300061507F4F8F4F9F4F672E782E892E992431 |
:1095400087FC9A9460922A0370922B0380922C03DA |
:1095500090922D03209126033091270340912803F8 |
:1095600050912903C601B5010E94F47297FF04C00F |
:1095700061507F4F8F4F9F4F272E382E492E5524F5 |
:1095800047FC5A94209226033092270340922803E6 |
:10959000509229038091220390912303A0912403E8 |
:1095A000B0912503B7FF04C081509F4FAF4FBF4F0D |
:1095B000892F9A2FAB2FBB27A7FDBA958093220343 |
:1095C00090932303A0932403B0932503D801C701EC |
:1095D00086199709A809B909809382039093830398 |
:1095E000A0938403B093850320910107E22EFF240A |
:1095F00000271127BC01CD01A80197010E946873C3 |
:1096000059016A012093910330939203409393038D |
:10961000509394038D859E85AF85B88982199309EF |
:10962000A409B5098093860390938703A0938803C8 |
:10963000B0938903BC01CD01A80197010E94687312 |
:109640002093950330939603409397035093980388 |
:10965000D601C501D7FE04C081509F4FAF4FBF4F09 |
:10966000892F9A2FAB2FBB27A7FDBA959093D902CC |
:109670008093D80257FF04C021503F4F4F4F5F4F98 |
:10968000BB2757FDBA95A52F942F832F9093DB020C |
:109690008093DA028091C2029091C30281349105D5 |
:1096A000DCF48091C0029091C10281349105A4F450 |
:1096B0008091C506E82FFF27EE0FFF1FED5AF94FE7 |
:1096C000808191810190F081E02DF7FF03C0F0953A |
:1096D000E195FF4F7A97E4F08091FA078F3FC1F44C |
:1096E0008091D8029091D90297FD01969595879522 |
:1096F0009093D9028093D8028091DA029091DB0294 |
:1097000097FD0196959587959093DB028093DA02F9 |
:109710008091460790914707A0914807B09149076B |
:10972000B7FF04C081509F4FAF4FBF4F892F9A2F73 |
:10973000AB2FBB27A7FDBA958093460790934707A9 |
:10974000A0934807B0934907809138079091390753 |
:10975000A0913A07B0913B07B7FF04C081509F4FDB |
:10976000AF4FBF4F892F9A2FAB2FBB27A7FDBA95BD |
:109770008093380790933907A0933A07B0933B073B |
:1097800080913A0390913B03A0913C03B0913D033B |
:109790002B813C814D815E81281B390B4A0B5B0B71 |
:1097A00020937A0330937B0340937C0350937D0393 |
:1097B0008091320390913303A0913403B09135032B |
:1097C000EF80F88409851A85E81AF90A0A0B1B0B41 |
:1097D000E0927E03F0927F03009380031093810355 |
:1097E0002093820330938303409384035093850333 |
:1097F000E0928603F0928703009388031093890315 |
:109800008091160390911703A0911803B09119034A |
:10981000821B930BA40BB50B809316039093170335 |
:10982000A0931803B093190380910E0390910F0336 |
:10983000A0911003B09111038E199F09A00BB10BD9 |
:1098400080930E0390930F03A0931003B093110322 |
:10985000FC85FF2371F12091F8023091F902213843 |
:10986000310594F080914E0390914F0301969093AF |
:109870004F0380934E0380915D0790915E070196A0 |
:1098800090935E0780935D0720583F4F94F480913A |
:109890004E0390914F03019790934F0380934E0393 |
:1098A00080915D0790915E07019790935E0780938A |
:1098B0005D071092F9021092F80281E090E0909317 |
:1098C0009E0380939D03E0908203F09083030091B8 |
:1098D000840310918503D801C70117FF07C08827AB |
:1098E0009927DC018E199F09A00BB10B8150924082 |
:1098F000A040B04034F084E090E090939E038093C9 |
:109900009D038091A3039091A403A091A503B0911E |
:10991000A60320915107309152074091530750916F |
:109920005407821B930BA40BB50B815E914BAF4F79 |
:10993000BF4F8F539C49A040B04028F08091FB0757 |
:1099400089310CF4FFC041E0E41640E1F40640E048 |
:10995000040740E014070CF473C080919F03882330 |
:1099600009F46AC0D801C70117FF07C088279927E3 |
:10997000DC018E199F09A00BB10B9C01AD01B7FF53 |
:1099800004C021503E4F4F4F5F4F69E055954795BA |
:10999000379527956A95D1F780919D0390919E0305 |
:1099A000820F931F90939E0380939D03D801C7015C |
:1099B00017FF03C00796A11DB11D23E0B595A7951C |
:1099C000979587952A95D1F7809391039093920369 |
:1099D000A0939303B093940389589341A040B0405F |
:1099E00064F088E893E1A0E0B0E080939103909365 |
:1099F0009203A0939303B093940320919103309129 |
:109A00009203409193035091940357FF04C0215057 |
:109A10003F4F4F4F5F4F232F342F452F552747FD83 |
:109A20005A958091D8029091D902820F931F9093FA |
:109A3000D9028093D80206C081E080939F0302C0C0 |
:109A400010929F0360E0E61660EFF6066FEF0607E0 |
:109A50006FEF16070CF073C08091A003882309F400 |
:109A60006AC0D801C70117FF07C088279927DC0102 |
:109A70008E199F09A00BB10B9C01AD01B7FF04C06B |
:109A800021503E4F4F4F5F4FF9E055954795379521 |
:109A90002795FA95D1F780919D0390919E03820FAF |
:109AA000931F90939E0380939D03D801C70117FFD6 |
:109AB00003C00796A11DB11DE3E0B595A795979545 |
:109AC0008795EA95D1F78093910390939203A093A1 |
:109AD0009303B093940388579C4EAF4FBF4F64F4E9 |
:109AE00088E79CEEAFEFBFEF8093910390939203D2 |
:109AF000A0939303B0939403209191033091920328 |
:109B0000409193035091940357FF04C021503F4F5D |
:109B10004F4F5F4F232F342F452F552747FD5A9521 |
:109B20008091D8029091D902820F931F9093D9020D |
:109B30008093D80211C081E08093A0030DC01092E1 |
:109B4000A0030AC010929E0310929D0388EE93E03A |
:109B500090939F0180939E018C85282F33278091BD |
:109B60009D0390919E032817390724F430939E0398 |
:109B700020939D031091FB07112379F0212F3327A8 |
:109B800027FD309580919D0390919E0328173907FA |
:109B900024F430939E0320939D03409182035091BF |
:109BA00083036091840370918503413851056105F9 |
:109BB000710574F0809152039091530320919D039D |
:109BC00030919E03820F931F90935303809352030F |
:109BD00040585F4F6F4F7F4F74F4809152039091C4 |
:109BE000530320919D0330919E03821B930B90930E |
:109BF00053038093520381E090E090939E038093FF |
:109C00009D03C0908603D0908703E0908803F09076 |
:109C10008903D701C601F7FE07C088279927DC0111 |
:109C20008C199D09AE09BF0981509240A040B040F7 |
:109C300034F084E090E090939E0380939D03109213 |
:109C400095031092960310929703109298038091B7 |
:109C5000A7039091A803A091A903B091AA03209112 |
:109C6000590730915A0740915B0750915C07821B5E |
:109C7000930BA40BB50B815E914BAF4FBF4F8F532E |
:109C80009C49A040B04018F019310CF4FFC001E02D |
:109C9000C01600E1D00600E0E00600E0F0060CF49B |
:109CA00073C08091A103882309F46AC0D701C6015B |
:109CB000F7FE07C088279927DC018C199D09AE099A |
:109CC000BF099C01AD01B7FF04C021503E4F4F4F6B |
:109CD0005F4F69E055954795379527956A95D1F778 |
:109CE00080919D0390919E03820F931F90939E03FA |
:109CF00080939D03D701C601F7FE03C00796A11DFF |
:109D0000B11D23E0B595A795979587952A95D1F72D |
:109D10008093950390939603A0939703B093980331 |
:109D200089589341A040B04064F088E893E1A0E0F6 |
:109D3000B0E08093950390939603A0939703B0931C |
:109D40009803209195033091960340919703509189 |
:109D5000980357FF04C021503F4F4F4F5F4F232FB1 |
:109D6000342F452F552747FD5A958091DA0290915F |
:109D7000DB02820F931F9093DB028093DA0206C00E |
:109D800081E08093A10302C01092A10320E0C216DB |
:109D900020EFD2062FEFE2062FEFF2060CF073C091 |
:109DA0008091A203882309F46AC0D701C601F7FE97 |
:109DB00007C088279927DC018C199D09AE09BF09C6 |
:109DC0009C01AD01B7FF04C021503E4F4F4F5F4F84 |
:109DD00009E055954795379527950A95D1F78091D4 |
:109DE0009D0390919E03820F931F90939E038093F7 |
:109DF0009D03D701C601F7FE03C00796A11DB11D43 |
:109E000013E0B595A795979587951A95D1F7809307 |
:109E1000950390939603A0939703B0939803885764 |
:109E20009C4EAF4FBF4F64F488E79CEEAFEFBFEF9F |
:109E30008093950390939603A0939703B093980310 |
:109E40002091950330919603409197035091980388 |
:109E500057FF04C021503F4F4F4F5F4F232F342FE8 |
:109E6000452F552747FD5A958091DA029091DB02E4 |
:109E7000820F931F9093DB028093DA0211C081E07E |
:109E80008093A2030DC01092A2030AC010929E03F9 |
:109E900010929D0388EE93E090939F0180939E0122 |
:109EA0004C85242F332780919D0390919E03281782 |
:109EB000390724F430939E0320939D038091FB0780 |
:109EC000882379F0282F332727FD309580919D0333 |
:109ED00090919E032817390724F430939E03209312 |
:109EE0009D03409186035091870360918803709190 |
:109EF0008903413851056105710574F08091500363 |
:109F00009091510320919D0330919E03820F931FE6 |
:109F1000909351038093500340585F4F6F4F7F4F92 |
:109F2000CCF4809150039091510320919D03309186 |
:109F30009E03821B930B90935103809350030AC09E |
:109F40001092DB021092DA021092D9021092D8021B |
:109F50001092FA0280916007882341F41092DB028C |
:109F60001092DA021092D9021092D8028091510711 |
:109F700090915207A0915307B09154078093A30387 |
:109F80009093A403A093A503B093A60380915907CF |
:109F900090915A07A0915B07B0915C078093A7034B |
:109FA0009093A803A093A903B093AA0310922A0345 |
:109FB00010922B0310922C0310922D031092260363 |
:109FC0001092270310922803109229031092220363 |
:109FD000109223031092240310922503109251072C |
:109FE000109252071092530710925407109259077B |
:109FF00010925A0710925B0710925C071092460766 |
:10A00000109247071092480710924907109238079C |
:10A010001092390710923A0710923B0710921202E1 |
:10A0200010921102E090E702F090E802C701F7FEFB |
:10A0300004C0882799278E199F0940976CF088EEF5 |
:10A0400093E090939F0180939E018091CE0684FDC2 |
:10A0500003C081E0809390031091DA06A12EBB2407 |
:10A06000CC24DD24B701882777FD8095982F9701B0 |
:10A07000F7FE04C0222733272E193F09442737FD56 |
:10A080004095542F0E94F4729B01AC01C601B501AA |
:10A090000E94F47297FF04C061507E4F8F4F9F4F14 |
:10A0A000E9E09595879577956795EA95D1F79B01B6 |
:10A0B000812F99278E9DD0018F9DB00D9E9DB00D53 |
:10A0C0001124CD01B7FD03969595879595958795B4 |
:10A0D000280F391F442737FD4095542F20937603CE |
:10A0E00030937703409378035093790380910A0368 |
:10A0F00090910B03A0910C03B0910D03821B930B65 |
:10A10000A40BB50B80930A0390930B03A0930C034D |
:10A11000B0930D038155934CA040B04064F080E5AE |
:10A1200093ECA0E0B0E080930A0390930B03A0931C |
:10A130000C03B0930D0380910A0390910B03A0913F |
:10A140000C03B0910D03805B9C43AF4FBF4F64F491 |
:10A1500080EB9CE3AFEFBFEF80930A0390930B0378 |
:10A16000A0930C03B0930D034090000350900103A3 |
:10A170004114510409F488C18091CE0683FF84C143 |
:10A1800080913A0390913B03A0913C03B0913D0331 |
:10A19000B7FF04C081509E4FAF4FBF4F69E0B595E8 |
:10A1A000A795979587956A95D1F76C0197FF04C09D |
:10A1B000D094C194D108D394809132039091330309 |
:10A1C000A0913403B0913503B7FF04C081509E4F76 |
:10A1D000AF4FBF4F59E0B595A795979587955A957D |
:10A1E000D1F7BC0197FF03C0709561957F4FC616EC |
:10A1F000D7060CF46B01B601D7FE02C0695F7F4F32 |
:10A200003B0143E0759467944A95E1F70894611C1B |
:10A21000711C3CE1E32E32E0F32E4E0C5F1C720108 |
:10A220000027F7FC0095102F24EE3DEF420E531E41 |
:10A230008091890790918A07A0918B07B0918C0734 |
:10A2400080907A0190907B01A0907C01B0907D017C |
:10A25000BC01CD01A50194010E946873E21AF30AC2 |
:10A26000040B150BC801B70128E631E040E050E0CF |
:10A270000E946873DC01CB018C01045B104080916B |
:10A2800082079091830797FF03C0909581959F4F18 |
:10A290008138910514F000E010E0E0909E01F0900C |
:10A2A0009F01E114F10489F539E1C316D1046CF57D |
:10A2B0008091F8029091F902800F911F9093F9021A |
:10A2C0008093F802809190038823F9F0C201AA27B5 |
:10A2D00097FDA095BA2FBC01CD01A50194010E9464 |
:10A2E000F472DC01CB018093890790938A07A093D5 |
:10A2F0008B07B0938C07BC01CD010E94687330932B |
:10A30000FF022093FE0210929003C80123E0880F01 |
:10A31000991F2A95E1F7B3010E943373CB01AA2755 |
:10A3200097FDA095BA2F2091890730918A07409117 |
:10A330008B0750918C07280F391F4A1F5B1F2093F2 |
:10A34000890730938A0740938B0750938C071091AD |
:10A350008F01612F7727C69EC001C79E900DD69EA4 |
:10A36000900D112497FD4F966C0185E0D594C7940C |
:10A370008A95E1F76C197D096B0177FD7FC0E114C7 |
:10A38000F10409F073C0E090C202F090C302809122 |
:10A39000C0029091C102E80EF91EF7FE04C067E00A |
:10A3A00070E0E60EF71E03E0F594E7940A95E1F7F6 |
:10A3B00080E490E0E80EF91ECA01B901A5019401FC |
:10A3C0000E946873DA01C9012091FE023091FF02F8 |
:10A3D000442737FD4095542F821B930BA40BB50BDC |
:10A3E000845E9D4FAF4FBF4FBC01CD0128E631E0E9 |
:10A3F00040E050E00E946873DC01CB01845B904038 |
:10A400008C9DD0018D9DB00D9C9DB00D1124CD0172 |
:10A41000B7010E94337383E0189F60011124C616B0 |
:10A42000D70614F4B60108C0882799278C199D090E |
:10A43000681779070CF4BC019B01442737FD409550 |
:10A44000542F80910A0390910B03A0910C03B091BB |
:10A450000D03820F931FA41FB51F80930A039093CF |
:10A460000B03A0930C03B0930D030EC00894E108F6 |
:10A47000F108F0929F01E0929E0106C084EF91E006 |
:10A4800090939F0180939E0180918F0381508093D0 |
:10A490008F038F3F09F0DCC088E180938F038091A8 |
:10A4A000DD069927880F991F880F991F7C010027C7 |
:10A4B000F7FC0095102F80913A0390913B03A091F7 |
:10A4C0003C03B0913D03BC01CD01A80197010E945E |
:10A4D00068733093D3052093D20580913203909115 |
:10A4E0003303A0913403B0913503BC01CD01A80121 |
:10A4F00097010E9468733093D5052093D40580910D |
:10A500007D0790917E0797FD039695958795959584 |
:10A5100087959093D7058093D60580918D0790916C |
:10A520008E0797FD039695958795959587959093BA |
:10A53000D9058093D80580918207909183079093E5 |
:10A54000DB058093DA058091E0029091E102A09111 |
:10A55000E202B091E302BC01CD0125E030E040E031 |
:10A5600050E00E9468733093DD052093DC058091F4 |
:10A570001506909116069093DF058093DE055092A4 |
:10A58000E3054092E2058091250190912601909388 |
:10A59000E5058093E4058091EE0299279093E70505 |
:10A5A0008093E6058091890790918A07A0918B0797 |
:10A5B000B0918C0720917A0130917B0140917C0110 |
:10A5C00050917D01BC01CD010E9468733093E90573 |
:10A5D0002093E80580911302909114029093F7055F |
:10A5E0008093F60580917F0499279093F9058093D5 |
:10A5F000F8058091FA019091FB019093FB058093FF |
:10A60000FA058091FF07909100089093FF058093D1 |
:10A61000FE058091030890910408909301068093B1 |
:10A6200000068091FD07992790930D0680930C06F4 |
:10A630008091D0039091D10390930F0680930E06E2 |
:10A640008091CE039091CF039093110680931006D2 |
:10A650008091FA02882381F01092720310927303A2 |
:10A66000109274031092750310926E0310926F0390 |
:10A670001092700310927103F090D702FF20F1F452 |
:10A6800080916007282F33274427552780913A036C |
:10A6900090913B03A0913C03B0913D03BC01CD01DF |
:10A6A0000E94F472DC01CB01BC01CD0128EF3AE23B |
:10A6B00040E050E00E946873490102C08824992458 |
:10A6C000E090D602EE20F1F480916007282F332726 |
:10A6D000442755278091320390913303A09134038E |
:10A6E000B0913503BC01CD010E94F472DC01CB01B5 |
:10A6F000BC01CD0128EF3AE240E050E00E946873CF |
:10A70000390102C066247724809132079091330783 |
:10A71000893C91051CF088EC90E005C088539F4F60 |
:10A7200034F488E39FEF909333078093320780914E |
:10A730003D0790913E07893C91051CF088EC90E024 |
:10A7400005C088539F4F34F488E39FEF90933E07F2 |
:10A7500080933D0780913F0790914007AA2797FD7E |
:10A76000A095BA2F20918707A22EBB24CC24DD24EC |
:10A77000BC01CD01A60195010E94F4729B01AC01C0 |
:10A780008091320790913307AA2797FDA095BA2FA1 |
:10A79000E7E0880F991FAA1FBB1FEA95D1F7280F82 |
:10A7A000391F4A1F5B1F57FF04C0215C3F4F4F4FAB |
:10A7B0005F4F76E055954795379527957A95D1F770 |
:10A7C0008401020F131F1093400700933F078091ED |
:10A7D000300790913107AA2797FDA095BA2FBC01A9 |
:10A7E000CD01A60195010E94F4729B01AC018091FC |
:10A7F0003D0790913E07AA2797FDA095BA2F67E0E5 |
:10A80000880F991FAA1FBB1F6A95D1F7280F391F00 |
:10A810004A1F5B1F57FF04C0215C3F4F4F4F5F4FE4 |
:10A8200096E055954795379527959A95D1F7230149 |
:10A83000420E531E5092310740923007809182079A |
:10A8400090918307880F991FAA2797FDA095BA2F8B |
:10A8500020913707332744275527BC01CD010E949B |
:10A86000F4725B016C0197FF08C02FE330E040E019 |
:10A8700050E0A20EB31EC41ED51E86E0D594C79428 |
:10A88000B794A7948A95D1F780914E07282F332744 |
:10A890004427552780911E0390911F03A091200308 |
:10A8A000B0912103BC01CD010E94F472DC01CB0107 |
:10A8B000BC01CD0120EF35E540E050E00E94687317 |
:10A8C000B501620F731F7093830760938207015075 |
:10A8D000104434F080E090E49093400780933F0769 |
:10A8E00080913F07909140078050904C34F480E075 |
:10A8F00090EC9093400780933F0751E0451650E459 |
:10A90000550634F080E090E490933107809330074F |
:10A9100080913007909131078050904C34F480E062 |
:10A9200090EC90933107809330076150704434F07D |
:10A9300080E090E490938307809382078091820760 |
:10A94000909183078050904C34F480E090EC909389 |
:10A9500083078093820780910001482F55278091BB |
:10A960002501909126014817590794F4209125015B |
:10A970003091260109811A81049FC001059F900D25 |
:10A98000149F900D1124B9010E941F737A8369836B |
:10A9900029813A81220F331F220F331F3A832983E3 |
:10A9A0004091CE0640FF33C6EE2009F030C6FF20AE |
:10A9B00009F02DC6AA24BB248091AF039091B00367 |
:10A9C0009093FD058093FC058091130290911402F1 |
:10A9D0009093F7058093F605209154033091550329 |
:10A9E0002115310509F03FC080911B0190911C0198 |
:10A9F0008959934058F087B5853F20F4809115021E |
:10AA0000815011C081E08093B8034EC080911B013A |
:10AA100090911C018436910508F587B58B30D0F0F4 |
:10AA2000809115028F5F809315029AE08902900150 |
:10AA3000112480911F06821B87BD8CE291E09093C8 |
:10AA4000FF018093FE018EE591E090935503809382 |
:10AA500054032AC081E08093B70326C0F092B70365 |
:10AA6000F092B80321C08091E0029091E102A091A0 |
:10AA7000E202B091E30214E0880F991FAA1FBB1FE6 |
:10AA80001A95D1F78093160290931702A09318029B |
:10AA9000B0931902B0921402A092130221503040D8 |
:10AAA00030935503209354032091920141FF24C019 |
:10AAB0002233D8F48091BF0181508093BF018F3F32 |
:10AAC000D9F51092FB028091E0029091E102A091F1 |
:10AAD000E202B091E3028093DC029093DD02A09346 |
:10AAE000DE02B093DF0281E004C081E08093FB02CC |
:10AAF00088EC8093BF0120C080917E0190917F01FE |
:10AB0000820F911D2091D3063327829FA001839F3E |
:10AB1000500D929F500D1124CA01AA2797FDA095B0 |
:10AB2000BA2F8093DC029093DD02A093DE02B093F3 |
:10AB3000DF0281E08093FB0280913A0390913B0316 |
:10AB4000A0913C03B0913D03E0907A01F0907B012D |
:10AB500000917C0110917D01BC01CD01A8019701FC |
:10AB60000E94687359016A01809132039091330306 |
:10AB7000A0913403B0913503BC01CD01A801970128 |
:10AB80000E946873B901C5010E941D718C01CC97A8 |
:10AB900014F00CE310E0C8010E9497658C0180E27C |
:10ABA000809379018091FB02882309F4BCC38091D2 |
:10ABB000BD0299279C012071307084FDB4C360915F |
:10ABC000210760FD04C08091CE0681FD07C0C980C9 |
:10ABD000DA803093AC032093AB0385C18091BD0232 |
:10ABE00081FF5DC14091BB015091BC01CA010F962C |
:10ABF0002091E5023091E60282179307ACF580912F |
:10AC0000B703882389F58091B90381FF13C08D7F35 |
:10AC10008093B9038091E0029091E102A091E20259 |
:10AC2000B091E3028093DC029093DD02A093DE02F8 |
:10AC3000B093DF028091B90381608093B903241B34 |
:10AC4000350B2F50304037FF03C0309521953F4FD3 |
:10AC50008091AB039091AC03820F931F9093AC0350 |
:10AC60008093AB038BE262C0CA010F9728173907A4 |
:10AC7000ACF58091B803882389F58091B90380FFF2 |
:10AC800013C08E7F8093B9038091E0029091E1021E |
:10AC9000A091E202B091E3028093DC029093DD0286 |
:10ACA000A093DE02B093DF028091B90382608093AB |
:10ACB000B903241B350B215F3F4F37FF03C030958D |
:10ACC00021953F4F8091AB039091AC03821B930B76 |
:10ACD0009093AC038093AB038DE228C02091B9031D |
:10ACE000822F992783709070892BF9F02C7F209305 |
:10ACF000B9031092AC031092AB038091E0029091E3 |
:10AD0000E102A091E202B091E3028093DC02909311 |
:10AD1000DD02A093DE02B093DF0261FF06C084EF84 |
:10AD200091E09093FF018093FE018DE38093790180 |
:10AD30002091AB033091AC03C90137FF04C08827D1 |
:10AD40009927821B930B815092400CF491C0809103 |
:10AD5000D3069927289FB001299F700D389F700D49 |
:10AD60001124CB0160E075E00E943373CB01AA2768 |
:10AD700097FDA095BA2F2091DC023091DD02409121 |
:10AD8000DE025091DF02280F391F4A1F5B1F2093FC |
:10AD9000DC023093DD024093DE025093DF0210921A |
:10ADA000AC031092AB03C090E002D090E102E090BF |
:10ADB000E202F090E302D701C60180509440A04027 |
:10ADC000B04082179307A407B5075CF4D701C6010A |
:10ADD00080509C4FAF4FBF4F281739074A075B077A |
:10ADE00044F08093DC029093DD02A093DE02B093E6 |
:10ADF000DF028091210781FF06C08BE490E09093F1 |
:10AE0000FF018093FE018091D706882389F5409148 |
:10AE1000AF035091B00357FF02C04D5F5F4F559590 |
:10AE20004795559547958091250190912601209150 |
:10AE300000013327489FD001499FB00D589FB00DA6 |
:10AE40001124CD01B9010E9433737093BC0160934A |
:10AE5000BB01663471051CF486E490E005C06739D7 |
:10AE6000710534F086E990E09093BC018093BB01BA |
:10AE70008091540390915503892B89F18091E002D0 |
:10AE80009091E102A091E202B091E3028093DC0292 |
:10AE90009093DD02A093DE02B093DF0220C0809188 |
:10AEA000E0029091E102A091E202B091E3028059A8 |
:10AEB0009140A040B0408093DC029093DD02A093CB |
:10AEC000DE02B093DF028091D706882311F0992724 |
:10AED00002C088E790E09093BC018093BB01C090D2 |
:10AEE000AF03D090B0032090E0023090E102409098 |
:10AEF000E2025090E3022091DC023091DD024091A9 |
:10AF0000DE025091DF02221533054405550524F079 |
:10AF10008091210780FD49C280915403909155038F |
:10AF2000892B39F0C090AF03D090B003AA24BB2482 |
:10AF3000E2C0D201C101821B930BA40BB50B80931D |
:10AF40007A0390937B03A0937C03B0937D038230BC |
:10AF5000E0E89E07EFEFAE07EFEFBE072CF481E0CD |
:10AF600090E8AFEFBFEF09C08F5F9F47A040B040B0 |
:10AF700064F08FEF9FE7A0E0B0E080937A039093B6 |
:10AF80007B03A0937C03B0937D03A0907A03B090E1 |
:10AF90007B0380919101282F3327442755278091E7 |
:10AFA0007A0390917B03A0917C03B0917D03BC0157 |
:10AFB000CD010E94F47297FF04C0615F7F4F8F4FF5 |
:10AFC0009F4FE4E09595879577956795EA95D1F73A |
:10AFD00060937A0370937B0380937C0390937D034B |
:10AFE00065302CEF72072FEF82072FEF92072CF4BA |
:10AFF00084E09CEFAFEFBFEF09C06C5F734080400F |
:10B00000904064F08CEF93E0A0E0B0E080937A038E |
:10B0100090937B03A0937C03B0937D0380917A038C |
:10B0200090917B03C81AD90A20911302309114021F |
:10B0300037FF02C0295F3F4F53E0359527955A955A |
:10B04000E1F74FEF2C3434071CF42BE43FEF05C03D |
:10B05000253B310514F025EB30E0C90128303105DE |
:10B0600014F088E090E0889FA001899F500D989F80 |
:10B07000500D11241816190654F4CA0157FD0396F1 |
:10B080009595879595958795280F391F09C0CA0111 |
:10B0900057FD03969595879595958795281B390BB0 |
:10B0A000C901AA2797FDA095BA2F209193013327B4 |
:10B0B00044275527BC01CD010E94F47297FF04C0BC |
:10B0C00061587F4F8F4F9F4FA7E095958795779554 |
:10B0D0006795AA95D1F79B015FEF613875071CF45E |
:10B0E00020E83FEF06C06F3F710519F014F020E033 |
:10B0F00031E0C21AD30A209002033090030340903B |
:10B1000004035090050357FE08C06FE770E080E02D |
:10B1100090E0260E371E481E591EF7E055944794BE |
:10B1200037942794FA95D1F780919001282F3327EF |
:10B1300044275527C201B1010E94F47297FF04C051 |
:10B14000615E7F4F8F4F9F4FE5E09595879577958F |
:10B150006795EA95D1F760937A0370937B038093A8 |
:10B160007C0390937D036138AFEF7A07AFEF8A07D6 |
:10B17000AFEF9A072CF480E89FEFAFEFBFEF0AC064 |
:10B180006F3F71058105910569F064F080E091E001 |
:10B19000A0E0B0E080937A0390937B03A0937C03BC |
:10B1A000B0937D0380917A0390917B03C81AD90AEA |
:10B1B00080918E01282F33278091FE07992787FDE4 |
:10B1C0009095289FF001299FF00D389FF00D1124D4 |
:10B1D0009F01F7FF02C021583F4F220F232F221F4C |
:10B1E000330BFFEF21383F071CF420E83FEF06C088 |
:10B1F0002F3F310519F014F020E031E0C21AD30AD4 |
:10B2000065E9E62EF12CAE0CBF1C2BE2A21621E064 |
:10B21000B206E0F48091AB039091AC03892BB1F4BA |
:10B220008091AF039091B003181619067CF48091B9 |
:10B23000B1039091B2038C159D053CF48091BD0142 |
:10B240009091BE01C816D9060CF06C01C601AA2760 |
:10B2500097FDA095BA2F5DE0880F991FAA1FBB1F0D |
:10B260005A95D1F79801442737FD4095542FBC01DA |
:10B27000CD010E94687320937E0330937F03409337 |
:10B28000800350938103C0907E03D0907F03809110 |
:10B29000AD039091AE039C01220F331F280F391F7D |
:10B2A0002C0D3D1D37FF02C02D5F3F4FA901559565 |
:10B2B0004795559547955093AE034093AD038091C4 |
:10B2C000CF06282F3327220F331F220F331F2417B7 |
:10B2D00035076CF480918107282F3327220F331F05 |
:10B2E000220F331F205530404217530724F030936C |
:10B2F000AE032093AD038091210780FF0DC08091A4 |
:10B30000AD039091AE0349815A818417950724F0CB |
:10B310005093AE034093AD036091AD037091AE03C3 |
:10B320007A83698342C08091D706882301F56091B2 |
:10B33000AF037091B00377FF02C06D5F7F4F7595CB |
:10B3400067957595679540912501509126018091EB |
:10B350000001282F3327649FC001659F900D749FC3 |
:10B36000900D1124B9010E943373CB0101C09927BC |
:10B370009093BC018093BB018091BB019091BC0173 |
:10B38000873491051CF486E490E005C08639910568 |
:10B3900034F086E990E09093BC018093BB018981F1 |
:10B3A0009A819093AE038093AD038091BD0281FF9B |
:10B3B0002EC18091BD0284FD2AC18091B30390917A |
:10B3C000B403A091B503B091B6030097A105B105F0 |
:10B3D000B1F4E981FA81CF01AA2797FDA095BA2F90 |
:10B3E000ECE0880F991FAA1FBB1FEA95D1F7809345 |
:10B3F000B3039093B403A093B503B093B6038091C5 |
:10B40000130290911402809113029091140297FFFD |
:10B4100003C0909581959F4F843691050CF0F7C03D |
:10B42000E980FA80C701AA2797FDA095BA2F980155 |
:10B43000442737FD4095542FBC01CD010E94F47282 |
:10B44000DC01CB0180937E0390937F03A093800364 |
:10B45000B0938103B7FF04C08150904EAF4FBF4FF0 |
:10B460007C018D017DE015950795F794E7947A9519 |
:10B47000D1F7E0927E03F0927F0300938003109354 |
:10B4800081038091BE029091BF0227E0803D920728 |
:10B49000F8F48091B3039091B403A091B503B091F7 |
:10B4A000B6039C01AD0169E0569547953795279500 |
:10B4B0006A95D1F7821B930BA40BB50BA8019701DA |
:10B4C00013E0220F331F441F551F1A95D1F722C0D6 |
:10B4D0003FE0803A930758F58091B3039091B4030D |
:10B4E000A091B503B091B6039C01AD01FAE0569569 |
:10B4F000479537952795FA95D1F7821B930BA40BA7 |
:10B50000B50BA8019701E2E0220F331F441F551F1E |
:10B51000EA95D1F7820F931FA41FB51F8093B30341 |
:10B520009093B403A093B503B093B6033CC02091AD |
:10B53000B3033091B4034091B5035091B6038054E6 |
:10B540009F41C0F4DA01C9017BE0B695A7959795B4 |
:10B5500087957A95D1F7281B390B4A0B5B0BD801DD |
:10B56000C7018E0D9F1DA01FB11F280F391F4A1F35 |
:10B570005B1F11C0DA01C9016CE0B695A7959795DC |
:10B5800087956A95D1F7281B390B4A0B5B0B2E0D5B |
:10B590003F1D401F511F2093B3033093B4034093CA |
:10B5A000B5035093B6038091B3039091B403A09177 |
:10B5B000B503B091B6035CE0B695A79597958795CE |
:10B5C0005A95D1F79093B0038093AF034091D5067D |
:10B5D000442399F055279C01BA010E943373C90195 |
:10B5E000861B970B9093B2038093B103260F371FEE |
:10B5F0003093BE012093BD010AC01092B203109295 |
:10B60000B1038FEF93E09093BE018093BD01309022 |
:10B610004407232D3327C901880F991F880F991FCD |
:10B620008896A981BA818A179B0714F09A83898327 |
:10B6300040908107842D9927880F991F880F991FA3 |
:10B6400080559040E981FA818E179F0714F49A8300 |
:10B650008983809147028823A1F08091BE02909156 |
:10B66000BF020297C09768F4E980FA801E141F0495 |
:10B6700044F481E090E09093BF028093BE023A834D |
:10B68000298309811A811093E1050093E0058091D7 |
:10B69000760390917703A0917803B091790312E03B |
:10B6A000880F991FAA1FBB1F1A95D1F70091820717 |
:10B6B00010918307081B190B29813A81213A310522 |
:10B6C0008CF0C90137FD01969595879580179107F4 |
:10B6D0000CF48C01909581959F4F081719076CF415 |
:10B6E0008C010BC00135110514F000E510E03FEFAF |
:10B6F000003B130714F400EB1FEF242D3327220F18 |
:10B70000331F220F331FC90149815A81841B950BB6 |
:10B71000801791070CF48C0169817A81621B730B8D |
:10B72000061717070CF48B0180913F079091400793 |
:10B730006091EB027091EC02861B970B909350077F |
:10B7400080934F07D090600720916E0330916F0374 |
:10B750004091700350917103DD2041F0861A970AE1 |
:10B76000C401AA2797FDA095BA2F04C0AA2797FD68 |
:10B77000A095BA2F280F391F4A1F5B1F20936E0315 |
:10B7800030936F03409370035093710380916E0365 |
:10B7900090916F03A0917003B091710381509A4F03 |
:10B7A000A040B04064F080E09AEFA0E0B0E0809369 |
:10B7B0006E0390936F03A0937003B0937103809115 |
:10B7C0006E0390916F03A0917003B091710380504C |
:10B7D0009640AF4FBF4F64F480E096E0AFEFBFEF0D |
:10B7E00080936E0390936F03A0937003B0937103E3 |
:10B7F00080909401909095019401442737FD4095E5 |
:10B80000542F80916E0390916F03A0917003B091BB |
:10B810007103BC01CD010E946873E0904F07F09066 |
:10B820005007E20EF31EB09080016B2D772788271A |
:10B830009927980117FF04C022273327201B310BBB |
:10B8400037FF02C02F5F3F4F3595279549815A81B9 |
:10B85000240F351F442737FD4095542F0E94F47262 |
:10B8600097FF04C0615C7F4F8F4F9F4F56E09595C7 |
:10B870008795779567955A95D1F79B016E157F054A |
:10B880000CF47B01309521953F4FE216F3060CF442 |
:10B89000790180913007909131076091E9027091B0 |
:10B8A000EA02861B970B90932F0780932E07209117 |
:10B8B0007203309173034091740350917503DD203E |
:10B8C00041F0661A770AC301AA2797FDA095BA2FFF |
:10B8D00004C0AA2797FDA095BA2F280F391F4A1F29 |
:10B8E0005B1F209372033093730340937403509350 |
:10B8F00075038091720390917303A0917403B091CA |
:10B90000750381509A4FA040B04064F080E09AEFF8 |
:10B91000A0E0B0E08093720390937303A09374034C |
:10B92000B09375038091720390917303A091740397 |
:10B93000B091750380509640AF4FBF4F64F480E0E4 |
:10B9400096E0AFEFBFEF8093720390937303A093E1 |
:10B950007403B09375039401442737FD4095542F29 |
:10B960008091720390917303A0917403B091750359 |
:10B97000BC01CD010E946873C0902E07D0902F07A4 |
:10B98000C20ED31E6B2D772788279927980117FFA2 |
:10B9900004C022273327201B310B37FF02C02F5F43 |
:10B9A0003F4F35952795A981BA812A0F3B1F442720 |
:10B9B00037FD4095542F0E94F47297FF04C0615CDC |
:10B9C0007F4F8F4F9F4F26E0959587957795679589 |
:10B9D0002A95D1F79B016C157D050CF46B01309510 |
:10B9E00021953F4FC216D3060CF4690182E2682EFE |
:10B9F00086E0782EB0E0AB2EB4E0BB2EABE05A2E42 |
:10BA0000F1E68F2EF7E09F2EF501258512160CF03A |
:10BA1000ABC049815A81CA01AA2797FDA095BA2FC8 |
:10BA2000332727FD3095432F532FBC01CD010E94B2 |
:10BA3000F47297FF04C0615C7F4F8F4F9F4FE6E029 |
:10BA40009595879577956795EA95D1F77C8B6B8B64 |
:10BA5000C701AA2797FDA095BA2FF50126853327A0 |
:10BA600027FD3095432F532FBC01CD010E94F47266 |
:10BA700097FF04C0615C7F4F8F4F9F4F56E09595B5 |
:10BA80008795779567955A95D1F72B893C89260F2D |
:10BA9000371F3C8B2B8BC601AA2797FDA095BA2F89 |
:10BAA000F5012785332727FD3095432F532FBC0100 |
:10BAB000CD010E94F47297FF04C0615C7F4F8F4FED |
:10BAC0009F4F46E095958795779567954A95D1F76D |
:10BAD0002B893C89260F371F3C8B2B8BC801AA274B |
:10BAE00097FDA095BA2FF5012089332727FD3095C2 |
:10BAF000432F532FBC01CD010E94F472DC01CB0116 |
:10BB0000B7FF03C0CF96A11DB11D36E0B595A7952F |
:10BB1000979587953A95D1F7F401608171812B89CA |
:10BB20003C89820F931F0E946D32D4018D939C93A8 |
:10BB300097FD039695958795959587959C8B8B8B0F |
:10BB4000832D9927EB89FC89E817F9073CF0842DB0 |
:10BB500099272B893C898217930714F49C8B8B8B34 |
:10BB6000EB89D301EC9302C0D3011C925A94E2E01A |
:10BB7000F0E08E0E9F1E24E030E0A20EB31E620E97 |
:10BB8000731E57FE41CFE2E1CC5E0C949F7380910F |
:10BB9000C6039091C703A091C803B091C9038093D5 |
:10BBA000BE039093BF03A093C003B093C1038091E1 |
:10BBB000C2039091C303A091C403B091C5038093C5 |
:10BBC000BA039093BB03A093BC03B093BD03089545 |
:10BBD0001092D1031092D0031092CF031092CE0393 |
:10BBE000089584B1806A84B93D9A82E58CBD1DBCFC |
:10BBF000459A81E0809393078AEA8093A30783E8BC |
:10BC00008093A4078AE08093A5071092A70710925B |
:10BC1000A6071092A9071092A8071092FD0710928C |
:10BC2000C5070895EF92FF920F931F938091DD0651 |
:10BC30009927880F991F880F991F7C010027F7FC0F |
:10BC40000095102F80913A0390913B03A0913C0303 |
:10BC5000B0913D03BC01CD01A80197010E9468731A |
:10BC60003093A7072093A607809132039091330366 |
:10BC7000A0913403B0913503BC01CD01A801970117 |
:10BC80000E9468733093A9072093A8072091890721 |
:10BC900030918A0740918B0750918C07DA01C901D6 |
:10BCA000E3E0880F991FAA1FBB1FEA95D1F7820F07 |
:10BCB000931FA41FB51F820F931FA41FB51F2091B0 |
:10BCC0007A0130917B0140917C0150917D01BC0152 |
:10BCD000CD010E9468733093AF072093AE07E091C7 |
:10BCE0004403F09145038091560790915707BF0197 |
:10BCF0000E943373CB019B01220F331F220F331F8E |
:10BD0000280F391F280F391F37FF02C02D5F3F4F03 |
:10BD100035952795359527953093AB072093AA073E |
:10BD20008091850790918607BF010E9433739B0124 |
:10BD3000220F331F220F331F260F371F260F371FE7 |
:10BD400037FF02C02D5F3F4F3595279535952795D5 |
:10BD50003093AD072093AC07109245031092440333 |
:10BD60001092570710925607109286071092850777 |
:10BD70008091A50799278D30910509F466C08E3012 |
:10BD800091055CF48B30910509F48EC08C309105DF |
:10BD90000CF00FC10A9761F08EC18F30910509F444 |
:10BDA00062C18F3091050CF44EC1409799F183C167 |
:10BDB0008091D1028093B6078091D0028093B7071B |
:10BDC0008091CF028093B8078091CE028093B9070B |
:10BDD0008091CD028093BA078091CC028093BB07FB |
:10BDE0008091CB028093BC078091CA028093BD07EB |
:10BDF0008091BD028093BE078091BD02837F8093B6 |
:10BE0000BD02F999FECF82E090E092BD81BDF89A23 |
:10BE100080B54FC18091FF07909100089093B707BC |
:10BE20008093B60780910308909104089093B90716 |
:10BE30008093B80780912501909126018093BA07DD |
:10BE4000809100018093BB0736C180910E078093DB |
:10BE5000B60780910F078093B707809110078093F2 |
:10BE6000B807809111078093B907809112078093DA |
:10BE7000BA07809116078093BB07809117078093BC |
:10BE8000BC07809118078093BD0780911B078093A2 |
:10BE9000BE07809119078093BF0780911A0780938E |
:10BEA000C00780911C07CCC0F8948091C406E82F8D |
:10BEB000FF27EE0FFF1FED5AF94F0190F081E02DA3 |
:10BEC000E038F1051CF0EFE7F0E006C02FEFE138B5 |
:10BED000F20714F4E1E8FFEFE093B6078091C5069E |
:10BEE000E82FFF27EE0FFF1FED5AF94F0190F08169 |
:10BEF000E02DE038F1051CF0EFE7F0E006C06FEF51 |
:10BF0000E138F60714F4E1E8FFEFE093B70780911A |
:10BF1000C306E82FFF27EE0FFF1FED5AF94F0190E0 |
:10BF2000F081E02DE038F1051CF0EFE7F0E006C00D |
:10BF30008FEFE138F80714F4E1E8FFEFE093B8077A |
:10BF40008091C206E82FFF27EE0FFF1FED5AF94F31 |
:10BF50000190F081E02DE038F1051CF0EFE7F0E012 |
:10BF600006C02FEFE138F20714F4E1E8FFEF789410 |
:10BF7000E093B9078091EF028093BA078091F002B5 |
:10BF80008093BB078091F1028093BC078091F202FD |
:10BF90008093BD078091F3028093BE078091F402E5 |
:10BFA0008093BF078091F5028093C0078091F602CD |
:10BFB00047C080917F04863018F010927F0485E09E |
:10BFC0008093B60780911D078093B7078091DC05A9 |
:10BFD0009091DD059093B9078093B8078091DC02BA |
:10BFE0009091DD02A091DE02B091DF02BC01CD0193 |
:10BFF00025E030E040E050E00E9468733093BB07DA |
:10C000002093BA07809113078093BC07809114078F |
:10C010008093BD07809115078093BE078091EE0243 |
:10C020008093BF078091ED028093C0078091E00567 |
:10C030009091E10597FD0396959587959595879540 |
:10C040008093C10738C01092B6078EE48093B7077B |
:10C0500085E08093B8078CE08093B9078091020156 |
:10C060008093BA0728C08091F5068093B607809127 |
:10C0700020078093B707809186018093B80780914D |
:10C08000EE068093B9078091EF068093BA078091FE |
:10C09000F0068093BB07809185018093BC07809157 |
:10C0A000F2068093BD078091F3068093BE078091CE |
:10C0B000F4068093BF078091C507882309F4B0C0B8 |
:10C0C0008AEF8093D3034091C7075091C807CA01F4 |
:10C0D00081509E4F8F5F9340B0F42091C9073091FB |
:10C0E000CA07C90181509E4F8F5F934060F48091D1 |
:10C0F000CE0685FF08C05093D1034093D003309300 |
:10C10000CF032093CE038091CD079091CE0721E0FD |
:10C110008936920724F49093010380930003809161 |
:10C120000003909101032091FE023091FF02821BD7 |
:10C13000930B845E9D4F68E671E00E943373845BCD |
:10C1400090409093FD028093FC022091D1073091A2 |
:10C15000D2078091FE019091FF018217930740F46E |
:10C1600080917F04882321F43093FF012093FE0106 |
:10C170008091C60799278836910501F18936910586 |
:10C1800024F48736910529F053C08936910559F179 |
:10C190004FC08091D3078093FA078091D407809392 |
:10C1A000FC078091D5078093FB078091D607809389 |
:10C1B000FD078091D7078093FE073AC08091D3078F |
:10C1C00080939D078091D40780939E078091D50727 |
:10C1D00080939F078091D6078093A0078091D7070F |
:10C1E0008093A10725C08091D30780939407809105 |
:10C1F000D407809395078091D50780939607809107 |
:10C20000D7079091D80790939807809397078091CC |
:10C21000D9079091DA0790939A078093990708C0FD |
:10C220001092D1031092D0031092CF031092CE033C |
:10C230001F910F91FF90EF900895809193078823AD |
:10C2400009F43BC0459883EA97E090939C0780935C |
:10C250009B079091D203E92FFF27E054FE4F9F5F89 |
:10C260009093D20380818093A507993010F01092AB |
:10C27000D203109293070E94125E81E08093A2077E |
:10C2800000000000000000000000000000000000AE |
:10C29000000000000000000000000000000000009E |
:10C2A000000000000000000000000000000000008E |
:10C2B0008091A3078093C2078EBD089530919307A4 |
:10C2C000332309F085C00DB407FE82C084E080935B |
:10C2D000FD01459A2EB58091D403992781309105AF |
:10C2E00089F0823091051CF4892B21F03EC0029721 |
:10C2F000B9F03BC03093C4072093D5032138A9F58A |
:10C3000081E008C0253549F48091D503820F8093E0 |
:10C31000D50382E08093D40328C03093D40325C092 |
:10C320008091C407E82FFF27E052F84F20838F5FEA |
:10C330008093C4079091D5038A31A0F0291769F43E |
:10C340008AE1A0EEB7E0E6ECF7E00D9001928A9565 |
:10C35000E1F781E08093C50702C03093C5071092D2 |
:10C36000D40303C0920F9093D5032091A2072032EB |
:10C3700008F028C045980000000000000000000000 |
:10C3800000000000000000000000000000000000AD |
:10C39000000000000000000000000000000000009D |
:10C3A000000000000000E0919B07F0919C07E20F65 |
:10C3B000F11D80818EBD8091C2079081890F80938D |
:10C3C000C20703C081E0809393072F5F2093A207E9 |
:10C3D000089587B18C6087B9429843981092D7032B |
:10C3E00080E88093CA011092D6038093C901089512 |
:10C3F0008091DC0381508093DC038F3F09F0F4C00F |
:10C4000094E09093DC038091BD02807BE1F0809109 |
:10C410000C07882349F08091DF03882311F490935F |
:10C42000D70381E08093DF0380910D078823B9F063 |
:10C430008091E003882319F484E08093D60381E09F |
:10C440008093E0030CC08093DF038093E00380912E |
:10C4500008078093DD0380910A078093DE038091B3 |
:10C46000DF03882309F040C080911F07282F33275E |
:10C4700024FF07C08091E402882319F425FD4DC0F4 |
:10C480004EC090910907983F50F0809158078D3D1C |
:10C4900030F08091DD0388230CF43FC040C0983F0A |
:10C4A00048F0809158078A3028F48091DD03882372 |
:10C4B000B4F133C08091D70381508093D7038F3F6D |
:10C4C00079F58091580781508093D7038091CA01F4 |
:10C4D000813011F480E801C086958093CA01809173 |
:10C4E000CA019091DD0317C08091D70381508093DA |
:10C4F000D7038F3FA9F489E08093D7038091CA01C5 |
:10C50000813011F480E801C086958093CA01809142 |
:10C51000CA0190910C07892311F0429A01C04298F8 |
:10C520008091E003882309F043C080911F07282FE2 |
:10C53000332724FF07C08091E402882319F426FDE5 |
:10C5400050C034C090910B07983F50F08091800705 |
:10C550008D3D30F08091DE0388230CF442C026C06C |
:10C56000983F48F0809180078A3028F48091DE035C |
:10C570008823E4F036C08091D60381508093D6039F |
:10C580008F3F91F58091800781508093D6038091F1 |
:10C59000C901813011F480E801C086958093C901FA |
:10C5A0008091C9019091DE038923D9F443980895BD |
:10C5B0008091D60381508093D6038F3FA9F489E000 |
:10C5C0008093D6038091C901813011F480E801C0C5 |
:10C5D00086958093C9018091C90190910D078923A7 |
:10C5E00011F0439A0895439808954FB724E130E03D |
:10C5F000F8948091C9008F778093C9008091C90019 |
:10C600008F7B8093C9008091C9008F7D8093C90082 |
:10C610005A9A52985B9A539A832F99278093CD0008 |
:10C620002093CC008091C80082608093C80080E194 |
:10C630008093C9008091CA008F778093CA0080914F |
:10C64000CA008F7B8093CA008091CA008F7D80933F |
:10C65000CA008091CA008F7E8093CA008091CA0070 |
:10C66000877F8093CA008091C9008B7F8093C90027 |
:10C670008091CA0084608093CA008091CA00826061 |
:10C680008093CA008091C80087FF03C08091CE00CC |
:10C69000F9CF8091C90080688093C9004FBF089589 |
:10C6A000FF920F931F93CF93DF9380E197E20E9455 |
:10C6B000E217EC01FF248091C9008F778093C900B5 |
:10C6C0008091C9008F7E8093C9005A9881ED99E0CE |
:10C6D0009F938F9300E114E11F930F93E091FE036A |
:10C6E000F091FF0309950F900F900F900F9002C0EB |
:10C6F0004A996CC0CE010E94EB178823C9F3E091E0 |
:10C70000FE03F091FF03FF2009F468C087E09AE080 |
:10C710009F938F931F930F930995529A0F900F90A9 |
:10C720000F900F90CE010E94EB178823D9F383E678 |
:10C7300090E05A9A019797FFFCCF8FE891E05A98C2 |
:10C74000019797FFFCCF89E090E05A9A019797FFF5 |
:10C75000FCCF89E090E05A98019797FFFCCF8FE8D3 |
:10C7600091E05A9A019797FFFCCF8FE891E05A9891 |
:10C77000019797FFFCCF89E090E05A9A019797FFC5 |
:10C78000FCCF89E090E05A98019797FFFCCF8FE8A3 |
:10C7900091E05A9A019797FFFCCF8FE891E05A9861 |
:10C7A000019797FFFCCF89E090E05A9A019797FF95 |
:10C7B000FCCF89E090E05A98019797FFFCCF8FE873 |
:10C7C00091E05A9A019797FFFCCF13C08AE590E059 |
:10C7D0000E94E217EC0191E0F92E91CF8DE09AE0F2 |
:10C7E0009F938F931F930F9309950F900F900F9026 |
:10C7F0000F9052985A980E94F562E5E0CDB7DEB7E7 |
:10C800000C94AC73EF92FF920F931F93CF93DF932F |
:10C81000482F00E010E08091CB01813061F410924C |
:10C82000CB0184E48093E1031092E3031092E203CE |
:10C830001092E4032BC18091E103882319F421E0D5 |
:10C8400030E001C098019091E203992371F4232B09 |
:10C8500011F081E010C084E48093E1039093E3033E |
:10C860009093E2039093E403FAC0913069F4232B90 |
:10C8700009F0EBC082E08093E2038091E3038F5FD5 |
:10C880008093E30383E0E9C09230D1F4232B09F0D5 |
:10C89000DCC083E08093E1034093E4039091E303E1 |
:10C8A000923039F41092E50347FF03C081E0809392 |
:10C8B000E50383E08093E2039F5F9093E303CFC09F |
:10C8C000933009F0C2C0232B09F0BFC09093E1035D |
:10C8D00082E08093E2038091E3038F5F8093E30320 |
:10C8E0002091E403822F9927782F6627842F992798 |
:10C8F000682B792B8091E706813049F47370CB0166 |
:10C900008050924063E070E00E94337317C0823021 |
:10C9100061F47770CB018050944066E070E00E9433 |
:10C9200033732695269526950BC073706856714013 |
:10C93000CB0177FD0196BC017595679526952695E7 |
:10C94000022F11270F7010700F5F1F4F0D30110550 |
:10C9500008F074C07801E00EF11EF701ED5AF94FAE |
:10C96000808191819B01281B390BC90137FF03C0CE |
:10C97000909581959F4F069794F48091EE02883CA4 |
:10C9800030F48091EE02865F8093EE0208C088EC5E |
:10C990008093EE0280916F008F7D80936F00F7018E |
:10C9A000ED5AF94F808191819C01220F331F280F8E |
:10C9B000391F260F371F37FF02C02D5F3F4FE90198 |
:10C9C000D595C795D595C795CB0101968C179D0731 |
:10C9D00014F4219706C061507040C617D7070CF4B5 |
:10C9E00021968091EE02843BD0F0F701ED5AF94F89 |
:10C9F00080819181FE01E81BF90BCF0163E070E0BB |
:10CA00000E943373CB01880F991F860F971F27E869 |
:10CA100036E0E20EF31EF7019183808307C027E81A |
:10CA200036E0E20EF31EF70111821082000F111F93 |
:10CA30000D5A194FF801D183C08311C0023111057D |
:10CA400070F081E08093CB010AC081E08093CB013C |
:10CA50001092E3031092E50384E48093E103809154 |
:10CA6000E303803198F08091E503882331F48091CD |
:10CA7000CB01882311F4809378011092E303109284 |
:10CA8000E5031092E20384E48093E103E6E0CDB78E |
:10CA9000DEB70C94AB73CF93FC0197FF05C0CFEFCB |
:10CAA000F095E195FF4F01C0C1E028E631E0CF01EC |
:10CAB000B9010E943373FC018B35910554F08B55FD |
:10CAC00090408A35910538F484EB90E08E1B9F0BE3 |
:10CAD000FC0141E00DC0CF01855B90408A35910596 |
:10CAE00018F4E45BF04003C02E1B3F0BF9014FEF3D |
:10CAF000EE0FFF1FE85EF54F259134918C2F99279B |
:10CB000087FD9095289FB001299F700D389F700D6B |
:10CB10001124842F992787FD9095689FA001699F14 |
:10CB2000500D789F500D1124CA01CF9108952AE528 |
:10CB300030E0281B390BC9010E944B650895CF9343 |
:10CB4000DF9380E00E94BC6A8091250190912601CC |
:10CB50006AE070E00E9433739F938F938091250168 |
:10CB6000909126016AE070E00E9433737F936F9387 |
:10CB700086EE9AE09F938F93CFEADAE6DF93CF9326 |
:10CB8000E091FE03F091FF0309952DB73EB7285FB2 |
:10CB90003F4F2DBF8091D303882339F186E00E9457 |
:10CBA000BC6A8FED90E09F938F938091990790914D |
:10CBB0009A079F938F9380919707909198076AE0C7 |
:10CBC00070E00E941F737F936F938FEE9AE09F93A4 |
:10CBD0008F93DF93CF93E091FE03F091FF030995CC |
:10CBE0008DB79EB70A968DBF12C086E00E94BC6AC0 |
:10CBF0008CEF9AE09F938F93DF93CF93E091FE03A6 |
:10CC0000F091FF0309950F900F900F900F9080E126 |
:10CC10000E94BC6A8091D0019091D1016CE370E0D8 |
:10CC20000E941F739F938F938091D0019091D101A7 |
:10CC30006CE370E00E941F737F936F9380910308F1 |
:10CC4000909104089F938F9383E09BE09F938F9331 |
:10CC5000DF93CF93E091FE03F091FF03099580915C |
:10CC6000CE062DB73EB7265F3F4F2DBF80FF29C0B0 |
:10CC70008AE10E94BC6A8091790199279F938F93E2 |
:10CC80008091E0029091E102A091E202B091E30272 |
:10CC9000BC01CD0124E630E040E050E00E94687322 |
:10CCA0003F932F9380E19BE09F938F93DF93CF93EC |
:10CCB000E091FE03F091FF0309958DB79EB70896AA |
:10CCC0008DBFDF91CF910895CF93DF9380E00E94D5 |
:10CCD000BC6A87E19BE09F938F93CFEADAE6DF930C |
:10CCE000CF93E091FE03F091FF03099580E10E944C |
:10CCF000BC6A0F900F900F900F90809189079091D0 |
:10CD00008A07A0918B07B0918C0720917A0130910E |
:10CD10007B0140917C0150917D01BC01CD010E94BD |
:10CD200068733F932F938091320390913303A091C6 |
:10CD30003403B0913503B7FF04C081509C4FAF4F0F |
:10CD4000BF4F3AE0B595A795979587953A95D1F756 |
:10CD50009F938F9380913A0390913B03A0913C0362 |
:10CD6000B0913D03B7FF04C081509C4FAF4FBF4F00 |
:10CD70002AE0B595A795979587952A95D1F79F9322 |
:10CD80008F9386E29BE09F938F93DF93CF93E09105 |
:10CD9000FE03F091FF0309958DB79EB70A968DBFEC |
:10CDA000DF91CF9108950F931F9380E00E94BC6A9A |
:10CDB0002AE030E08091FF0790910008B9010E94BD |
:10CDC0001F739F938F938091FF0790910008B90183 |
:10CDD0000E941F737F936F9380912501909126018C |
:10CDE000B9010E9433739F938F9380912501909195 |
:10CDF0002601B9010E9433737F936F9382E39BE016 |
:10CE00009F938F930FEA1AE61F930F93E091FE030F |
:10CE1000F091FF03099580E10E94BC6A8DB79EB72F |
:10CE20000C968DBF80910308909104089F938F9377 |
:10CE300080910108909102089F938F9385E49BE075 |
:10CE40009F938F931F930F93E091FE03F091FF0345 |
:10CE500009958DB79EB708968DBF1F910F910895C4 |
:10CE60000F931F93CF93DF938091D303CFEADAE63A |
:10CE7000882309F490C080E00E94BC6A80919507E5 |
:10CE800099279F938F9381E59BE09F938F938E01CA |
:10CE9000DF93CF93E091FE03F091FF0309958DB7E7 |
:10CEA0009EB706968DBF809196079927823091058F |
:10CEB00079F0833091051CF4892B21F019C0039778 |
:10CEC00089F016C087E00E94BC6A8AE59BE005C035 |
:10CED00087E00E94BC6A80E69BE09F938F93DF937C |
:10CEE000CF930FC087E00E94BC6A86E69BE0F5CF37 |
:10CEF00087E00E94BC6A8CE69BE09F938F931F9310 |
:10CF00000F93E091FE03F091FF0309950F900F90AE |
:10CF10000F900F908091940781FF14C089E00E94C8 |
:10CF2000BC6A82E79BE09F938F938FEA9AE69F9378 |
:10CF30008F93E091FE03F091FF0309950F900F90FE |
:10CF40000F900F9080E10E94BC6A8FED90E09F935C |
:10CF50008F938091990790919A079F938F938091D7 |
:10CF60009707909198076AE070E00E941F737F9383 |
:10CF70006F9388E79BE09F938F938FEA9AE69F9346 |
:10CF80008F93E091FE03F091FF0309958DB79EB753 |
:10CF90000A968DBF12C082E00E94BC6A8AE89BE0BC |
:10CFA0009F938F93DF93CF93E091FE03F091FF0364 |
:10CFB00009950F900F900F900F90DF91CF911F91D7 |
:10CFC0000F910895CF93C82F2091E6032093E70394 |
:10CFD00099278F32910509F1803391051CF44F9701 |
:10CFE000A1F02CC08F34910501F18F38910531F5F6 |
:10CFF000222319F481E090E038C086E0289FF001F8 |
:10D000001124E253F54F849117C086E0289FF00168 |
:10D010001124E153F54F84910FC086E0289FF00161 |
:10D020001124E053F54F849107C086E0289FF0015A |
:10D030001124EF52F54F84918093E6039091E6031B |
:10D040008091E7039813C0E00E94C26A9091E603C2 |
:10D0500086E0989FF0011124EE52F54F259134910E |
:10D060008C2FF901099580E090E0CF9108951092FE |
:10D0700000081092FF071092040810920308109203 |
:10D080000208109201088AE090E00E94E217909353 |
:10D09000E9038093E8030895CF93DF938091E80339 |
:10D0A0009091E9030E94EB17882309F4A8C08091AE |
:10D0B000E8039091E9030A969093E9038093E803CB |
:10D0C000E0E0F0E09F0190E0A2E2B6E04BE0ED018D |
:10D0D000898187FF07C09F5F8A81E80FF11D8C91CE |
:10D0E000280F311D4150149647FFF1CF232B41F5F6 |
:10D0F0002091EE033091EF034091F0035091F10342 |
:10D10000BB27A52F942F832F9093ED038093EC03DF |
:10D11000AA27BB27281B390B4A0B5B0BCF01AA2779 |
:10D12000BB27280F391F4A1F5B1F2093EE03309344 |
:10D13000EF034093F0035093F103E5E0F0E013C0F8 |
:10D140002091EC033091ED032E173F0718F4E21BFA |
:10D15000F30B02C0E0E0F0E0892F9927880F991FB8 |
:10D16000E80FF91F3596F0930008E093FF07EF3FB3 |
:10D17000F10578F480912501909126018E9F900110 |
:10D180008F9F300D9E9F300D1124C90164E670E021 |
:10D1900013C0CF0196958795969587952091250187 |
:10D1A00030912601289FA001299F500D389F500DD6 |
:10D1B0001124CA0169E170E00E941F737093020894 |
:10D1C000609301082091EA033091EB032E0F3F1F7B |
:10D1D0003093EB032093EA035EE02131350778F0CA |
:10D1E000809103089091040801969093040880931D |
:10D1F000030820513E403093EB032093EA03DF9174 |
:10D20000CF9108954FB720E430E0F8948091C900A1 |
:10D210008F778093C9008091C9008F7B8093C9006C |
:10D220008091C9008F7D8093C9005A9A52985B9A69 |
:10D23000539A832F99278093CD002093CC0080911F |
:10D24000C80082608093C80088E18093C900809103 |
:10D25000CA008F778093CA008091CA008F7B809329 |
:10D26000CA008091CA008F7D8093CA008091CA0055 |
:10D270008F7E8093CA008091CA00877F8093CA0006 |
:10D280008091C9008B7F8093C9008091CA0084601F |
:10D290008093CA008091CA0082608093CA00809106 |
:10D2A000C80087FF03C08091CE00F9CF8091C900EC |
:10D2B00080688093C9004FBF08950F931F93CF9349 |
:10D2C000DF93482F4F5F893108F089C08091520663 |
:10D2D000841710F440935206CB0183539B4268E1BC |
:10D2E00070E00E943373A42FBB27FD01EA0FFB1FE0 |
:10D2F000ED5AF94F808191819B01281B390BC9019F |
:10D3000037FF03C0909581959F4F069794F48091C5 |
:10D31000EE02883C30F48091EE02865F8093EE024C |
:10D3200008C088EC8093EE0280916F008F7D80931F |
:10D330006F00FD01EA0FFB1FED5AF94F80819181CB |
:10D340009C01220F331F280F391F260F371F37FF6D |
:10D3500002C02D5F3F4FE901D595C795D595C7957B |
:10D36000CB0101968C179D0714F4219706C06150DC |
:10D370007040C617D7070CF421968091EE02843BCB |
:10D38000D8F08D010A0F1B1FF801ED5AF94F80816B |
:10D390009181FE01E81BF90BCF0163E070E00E9470 |
:10D3A0003373CB01880F991F860F971F0957194FA9 |
:10D3B000F8019183808307C0AA0FBB1FA957B94FFB |
:10D3C00011961C921E92E42FFF27EE0FFF1FED5ABD |
:10D3D000F94FD183C083443011F410927801DF916A |
:10D3E000CF911F910F910895CF93DF93209105085E |
:10D3F000822F9927807F9070409709F06CC02F3161 |
:10D4000009F046C0809106088093F6032091080831 |
:10D410002093F803809109088093F703822F9927BE |
:10D420009093540680935306222309F054C08091B0 |
:10D43000C206282F3327220F331FF901E957F94F6E |
:10D44000118210828091C306A82FBB27AA0FBB1F91 |
:10D45000FD01E957F94F118210828091C506E82F2E |
:10D46000FF27EE0FFF1FCF018957994FEC0119825B |
:10D4700018822D5A394FE90119821882AD5AB94FD5 |
:10D4800011961C921E92ED5AF94F1182108223C000 |
:10D49000C22FCF70CA30F8F48091060880932F080D |
:10D4A0008091070880932E088091080880933108A6 |
:10D4B000809109088093300860912E0870912F08A0 |
:10D4C0008C2F0E945D6960913008709131088C2F1B |
:10D4D0008F5F0E945D69DF91CF910895CF93C82F30 |
:10D4E0008F3F49F48091F9038F3F29F41092FB0399 |
:10D4F0001092FA0332C02091FB03222339F4CF317A |
:10D5000011F485E001C084E08093FC038091FC036A |
:10D510009091FA038217A0F4892F80958093FA03E3 |
:10D520008F3F19F48EEF8093FA038091FA03C817A6 |
:10D5300011F40E94F4691092FB031092FA030BC0DD |
:10D54000E22FFF27EB5FF74FC0832F5F2093FB0392 |
:10D550009C0F9093FA03C093F903CF910895909193 |
:10D56000F503933240F4E92FFF27E55FF74F8083FF |
:10D570009F5F9093F5030895833218F48D5F809335 |
:10D58000F503089590E2EEE0F8E08FE19193815089 |
:10D5900087FFFCCF0895CF93CFB723E031E0F89415 |
:10D5A0008091C9008F778093C9008091C9008F7BDB |
:10D5B0008093C9008091C9008F7D8093C9005A9AD9 |
:10D5C00052985B9A539A832F99278093CD0020938A |
:10D5D000CC008091C80082608093C80088E180936D |
:10D5E000C9008091CA008F778093CA008091CA00D9 |
:10D5F0008F7B8093CA008091CA0080628093CA00AA |
:10D600008091CA0080618093CA008091CA008860BE |
:10D610008093CA008091C90084608093C900809182 |
:10D62000CA0084608093CA008091CA00826080939F |
:10D63000CA008091C80087FF03C08091CE00F9CF57 |
:10D640008091C90080688093C9008091C90080647E |
:10D650008093C9000E94C26ACFBFCF910895282F3E |
:10D6600099278F709070892B31F420958091F40365 |
:10D67000822B8093F40308958091CD01882309F4CF |
:10D6800041C08091BD0285FF0AC082E980930B08EA |
:10D6900083E280930C0885E580930D0802C0109208 |
:10D6A0000B088091CE018F3071F48091F4030E94B9 |
:10D6B000E267882341F081E980930B0880930C088E |
:10D6C00081E380930D081092CD018091C80085FF01 |
:10D6D000FCCF8091C9008F7E8093C9008091C900E2 |
:10D6E0008E7F8093C90080910B08882311F48EEF00 |
:10D6F00001C08EE78093CE008091F4038093CE0129 |
:10D700001092F40308951F920F920FB60F921124F6 |
:10D710008F939F93EF93FF939091CD01992309F0FD |
:10D7200040C08091FD03882361F480910B08882319 |
:10D7300011F483E003C0813999F481E08093FD0303 |
:10D740000FC0833099F480910B08882349F090939F |
:10D750000B088091C9008E7F8093C9008EEF1EC098 |
:10D760008091C90081608093C9000EC0833261F44A |
:10D770008091C9008E7F8093C9008FEF8093CE0087 |
:10D7800081E08093CD0114C08091FD03E82FFF2735 |
:10D79000E55FF74F8F5F8093FD0380818093CE001C |
:10D7A00007C01092FD038091C90080618093C90079 |
:10D7B000FF91EF919F918F910F900FBE0F901F904F |
:10D7C0001895EF92FF920F931F93CF93DF937C01F5 |
:10D7D0008B01EA01452B39F0F80181918F01F701A6 |
:10D7E00009952197C9F7E6E0CDB7DEB70C94AB7386 |
:10D7F000EF92FF920F931F93CF93DF937C018B01E6 |
:10D80000EA01452B41F0F8010F5F1F4F8491F701AA |
:10D8100009952197C1F7E6E0CDB7DEB70C94AB735D |
:10D820000F931F93CF938C01C62F161634F480E20A |
:10D83000F8010995C1501C16D4F3CF911F910F9197 |
:10D8400008950F931F93CF938C01C62F161634F4AF |
:10D8500080E3F8010995C1501C16D4F3CF911F91B4 |
:10D860000F910895A5E3B0E0E8E3FCE60C94837320 |
:10D870002E96EEADFFAD2E97882499245401809109 |
:10D88000F303882321F42C961FAE1EAE2C975EE482 |
:10D89000452E512C4C0E5D1E6F01B60105C0153290 |
:10D8A00039F00894C11CD11CF60114911123B9F769 |
:10D8B000A601461B570B31F02C968EAD9FAD2C97D1 |
:10D8C0000E94F86B112309F46AC20894C11CD11C90 |
:10D8D000FF24FDA6FCA64FEFE42EF9A6F60108945E |
:10D8E000C11CD11C1491153721F0812F806288371B |
:10D8F000B1F4F0FE0AC0F20124E030E0420E531E03 |
:10D9000080809180A280B3800AC0F20142E050E0A2 |
:10D91000440E551E808191814C01AA24BB241032F3 |
:10D9200021F489A58823D1F61DC0133219F458E0DB |
:10D93000F52AD4CF1A3211F01D3291F41A3259F46B |
:10D94000F20182E090E0480E591EE081ECA7EE2340 |
:10D950002CF6E195ECA790E1F92AAFEDFA22BECFC3 |
:10D960001B3211F419A7BACF1E32C1F5F601089483 |
:10D97000C11CD11C14911A3279F4F20122E030E07A |
:10D98000420E531E408151813FEF4F3F530714F425 |
:10D990004FEF5FEFE42EA2CF40E050E0812F8053A5 |
:10D9A0008A30A0F4CA0133E0880F991F3A95E1F755 |
:10D9B000840F951F480F591F410F511D4053504070 |
:10D9C000F6010894C11CD11C1491E8CF8FEF4F3F92 |
:10D9D000580714F44FEF5FEFE42E85CF103329F48E |
:10D9E000F4FC7CCF90E2F92A79CF812F81538930E2 |
:10D9F000D8F440E050E0CA0123E0880F991F2A952F |
:10DA0000E1F7840F951F480F591F410F511D4053D7 |
:10DA10005040F6010894C11CD11C1491812F8053F1 |
:10DA20008A3048F34CA75FCF183619F4A4E0FA2ADD |
:10DA300055CF1C3619F4B1E0FB2A50CF133661F4F0 |
:10DA40003E010894611C711CF20122E030E0420E9C |
:10DA5000531E808189833CC1143421F0143611F0A7 |
:10DA6000193651F5143411F431E0F32AF0FE0AC0EE |
:10DA7000F20144E050E0440E551E80809180A28067 |
:10DA8000B3800CC0F20182E090E0480E591E808104 |
:10DA900091814C01AA2497FCA094BA2CB7FE0AC02D |
:10DAA000B094A09490948094811C911CA11CB11CF2 |
:10DAB0008DE289A70AE06FC01F3411F01F3631F4E0 |
:10DAC0001F3411F491E0F92A08E064C0103779F4AA |
:10DAD000F201A2E0B0E04A0E5B1E808191814C0110 |
:10DAE000AA24BB2400E1B0E4FB2A18E753C0133793 |
:10DAF000C1F5F20122E030E0420E531E60807180D9 |
:10DB00006114710489F43E010894611C711C88E25F |
:10DB100089838EE6F301818385E78B838CE68C8392 |
:10DB20008D8389E28E831F82E7FC13C08E2D992797 |
:10DB300087FD9095AC0160E070E0C3010E945071D8 |
:10DB4000009729F0382E3618E3140CF0C3C03E2C91 |
:10DB5000C1C0F30101900020E9F731973E2E36183D |
:10DB6000B9C0153511F0153731F4153511F4F1E060 |
:10DB7000FF2A0AE00FC0183519F0183709F0A0C0C5 |
:10DB800000E1F3FE07C081149104A104B10411F077 |
:10DB900020E4F22A19A6EDA6E7FC02C03FEDF3222D |
:10DBA00089E2682E712C6C0E7D1E81149104A104F3 |
:10DBB000B10421F44DA5442309F47BC0802F99279B |
:10DBC000AA27BB278EA79FA7A8ABB9AB202E3324CB |
:10DBD00090E0891690E0990691E0A90690E0B906D8 |
:10DBE00048F0C501B4012EA53FA548A959A90E9436 |
:10DBF000467317C0AFEF8A169104A104B10449F02F |
:10DC000040F0C401B1010E941F739B0144275527B6 |
:10DC100008C0882D602F0E941373282F33274427B4 |
:10DC200055272AAB3BAB4CAB5DAB0A3059F48AA904 |
:10DC3000880F880F880F9AA9990F890F382D381BE4 |
:10DC4000832F10C0003139F48AA98295807F482D36 |
:10DC5000481B842F07C08AA9880F880F880F582D6A |
:10DC6000581B852F90E02EA53FA548A959A98216DB |
:10DC70009306A406B50608F091E08AA89BA8ACA874 |
:10DC8000BDA88A3010F4805D04C0895A183509F4A3 |
:10DC90008F7DD3018E933D01992309F099CF0830F0 |
:10DCA00041F4F3FE06C0803321F080E3FD0182934E |
:10DCB0003F01CE010196382E3618F8E23F0E0BC018 |
:10DCC000112309F46CC03E010894611C711C198376 |
:10DCD000B1E03B2E19A6032D2DA4231827FC2224E6 |
:10DCE00089A5882311F00F5F02C0F6FC0E5F020DBC |
:10DCF000EF2CFF24C70180739070892B49F48CA509 |
:10DD0000801B682F2C968EAD9FAD2C970E94106CB7 |
:10DD100089A5882331F041E050E0BE01675D7F4F67 |
:10DD20000AC0E6FE0EC080E38AA71BA742E050E0CF |
:10DD3000BE01665D7F4F2C968EAD9FAD2C970E94E5 |
:10DD4000E16BC70180739070809749F48CA5801BAC |
:10DD5000682F2C968EAD9FAD2C970E94216C622D62 |
:10DD60002C968EAD9FAD2C970E94216C832D992708 |
:10DD700087FD9095AC01B3012C968EAD9FAD2C978D |
:10DD80000E94E16BE4FE89CD2CA5201B2CA7622FFD |
:10DD90002C968EAD9FAD2C970E94106C7ECDE2E14B |
:10DDA000CB5C0C949F732FB740E0F894E0E0F0E078 |
:10DDB00081E2809357009491E2E0F0E08093570075 |
:10DDC0003491E4E0F0E08093570084912FBF9E31BE |
:10DDD00099F4363941F4893011F441E00DC08A30AC |
:10DDE00059F442E009C0373939F4863011F443E080 |
:10DDF00003C0853009F444E0842F992708959FB724 |
:10DE0000F8948091C900877F8093C9008091C900F0 |
:10DE10008F7E8093C9008091C9008F778093C9005D |
:10DE20008091C9008F7B8093C9008091C9008F7D4C |
:10DE30008093C90052985A9A53985B9A9FBF08954D |
:10DE4000CF93DF938091F303882309F497C09091D7 |
:10DE5000E7068091CF01981709F490C08091F203F2 |
:10DE6000882321F40E94D36E8093F20383E89CE020 |
:10DE70009F938F93C0E1D4E1DF93CF93E091FE03B2 |
:10DE8000F091FF0309950F900F900F900F908091E4 |
:10DE9000E70699278230910501F1833091052CF432 |
:10DEA000009761F0019769F024C084309105D9F0A2 |
:10DEB00084309105ACF00597C9F01BC083E79CE066 |
:10DEC00002C081E69CE09F938F93DF93CF93E09114 |
:10DED000FE03F091FF03099519C088E49CE0F3CF9D |
:10DEE00085E29CE0F0CF87E19CE0EDCF8FE09CE005 |
:10DEF000EACF80E99CE09F938F93DF93CF93E091EB |
:10DF0000FE03F091FF0309951092E7060F900F9022 |
:10DF10000F900F908091F203843011F08230A9F4B9 |
:10DF20000E94FF6E9091E706892F8150833018F48C |
:10DF30000E94F5621FC0943019F40E94CB6A1AC087 |
:10DF40009530C1F40E94026915C08091E7068823CC |
:10DF500089F086EA9CE09F938F9380E194E19F9300 |
:10DF60008F93E091FE03F091FF0309950F900F90BE |
:10DF70000F900F908091E7068093CF01DF91CF91B2 |
:10DF800008950F931F9381E08093F3034091CC0198 |
:10DF9000EFEBFBE020E030E05FE4849199272F5F16 |
:10DFA0003F4F829FB001839F700D929F700D11248F |
:10DFB00046275150319657FFF0CF4093CC01E7E907 |
:10DFC000FBE020E030E057E2849199272F5F3F4F3C |
:10DFD000829FB001839F700D929F700D1124462780 |
:10DFE0005150319657FFF0CF4093CC018091F2030E |
:10DFF000882321F40E94D36E8093F2038091CC0198 |
:10E00000833459F088E190E029E20FB6F894A8959E |
:10E01000809360000FBE2093600082E39CE69093A3 |
:10E02000FF038093FE0381EC9CE09F938F9300E1BC |
:10E0300014E11F930F93E091FE03F091FF03099504 |
:10E040000F900F900F900F9086E690E09F938F9324 |
:10E050008EE490E09F938F931F921F928091020114 |
:10E060006AE00E941373892F99279F938F93809161 |
:10E0700002010E94137399279F938F9387EE9CE070 |
:10E080009F938F931F930F93E091FE03F091FF03F3 |
:10E0900009958FEB9BE09F938F931F930F93E091D4 |
:10E0A000FE03F091FF03099587E99BE09F938F930F |
:10E0B0001F930F93E091FE03F091FF0309958DB735 |
:10E0C0009EB746968DBF8BE19DE09F938F931F93E4 |
:10E0D0000F93E091FE03F091FF03099583EC809389 |
:10E0E000810080916F00806280936F000F900F908D |
:10E0F0000F900F901F910F9108958091F303882343 |
:10E1000061F08091E706843011F40E943C6B8091AD |
:10E11000CC01833411F01092F30308951F920F92F3 |
:10E120000FB60F9211242F933F934F935F936F93EA |
:10E130007F938F939F93AF93BF93EF93FF93209120 |
:10E14000CE009091E706892F8150833020F4822FF2 |
:10E150000E9402640BC0943021F4822F0E942F6B26 |
:10E1600005C0953019F4822F0E946E6AFF91EF91DD |
:10E17000BF91AF919F918F917F916F915F914F91DF |
:10E180003F912F910F900FBE0F901F901895002474 |
:10E1900022273327442751E0BB27EE27FF27A0E1A2 |
:10E1A000660F771F881F991F001C221F331F441FF3 |
:10E1B000660F771F881F991F001C221F331F441FE3 |
:10E1C0002AF4050E2B1F3E1F4F1F04C0051A2B0BF0 |
:10E1D0003E0B4F0B550FBB1FEE1F587F556047FD81 |
:10E1E0005250AA95E9F6E695B7955795E695B795F5 |
:10E1F0005795852F9B2F08952227332741E05527D8 |
:10E2000068E0880F991F221F331F880F991F221F54 |
:10E21000331F1AF4240F351F02C0241B350B440F83 |
:10E22000551F487F456037FD42506A9551F7569516 |
:10E23000479556954795842F0895AA2797FF04C0C0 |
:10E24000809590958A1F9A1F77FF04C060957095FE |
:10E250006A1F7A1F669F9001779FA001679F300D0C |
:10E26000411D5A1F300D411D5A1F889FF001999F73 |
:10E270002E0F3F1F401D511D899F300D411D5A1FFC |
:10E28000300D411D5A1FCA01B901112480CFFB0175 |
:10E29000DC0102C005900D9241505040D8F708951E |
:10E2A000FC014150504030F001900616D1F73197F3 |
:10E2B000CF010895882799270895A0E0B0E0E3E60C |
:10E2C000F1E70C948B736C017B01EA0159012197F2 |
:10E2D0008FEFCF3FD80789F086010894C11CD11C6D |
:10E2E000C7010894E11CF11CF5010995F801808330 |
:10E2F0002197FFEFCF3FDF0779F7EAE0CDB7DEB731 |
:10E300000C94A773A0E0B0E0E8E8F1E70C948D73FB |
:10E310008C017B01EA01690121978FEFCF3FD8077C |
:10E3200071F0F70121917F01C8010F5F1F4F622F2C |
:10E33000F60109952197FFEFCF3FDF0791F7E8E05E |
:10E34000CDB7DEB70C94A9735058BB27AA270ED0BF |
:10E350000DC1FED030F003D120F031F49F3F11F415 |
:10E360001EF4F3C00EF4E095E7FBE9C0E92F0FD1EE |
:10E3700080F3BA17620773078407950718F071F4E2 |
:10E380009EF527C10EF4E0950B2EBA2FA02D0B01A0 |
:10E39000B90190010C01CA01A0011124FF27591BEA |
:10E3A00099F0593F50F4503E68F11A16F040A22FF0 |
:10E3B000232F342F4427585FF3CF46953795279561 |
:10E3C000A795F0405395C9F77EF41F16BA0B620B60 |
:10E3D000730B840BBAF09150A1F0FF0FBB1F661FA7 |
:10E3E000771F881FC2F70EC0BA0F621F731F841FEA |
:10E3F00048F4879577956795B795F7959E3F08F010 |
:10E40000B3CF9395880F08F09927EE0F97958795CE |
:10E41000089571D008F481E0089504D06894B11192 |
:10E42000D9C00895BCD088F09F5790F0B92F992794 |
:10E43000B751A0F0D1F0660F771F881F991F1AF00F |
:10E44000BA95C9F712C0B13081F0C3D0B1E00895D8 |
:10E45000C0C0672F782F8827B85F39F0B93FCCF359 |
:10E46000869577956795B395D9F73EF49095809505 |
:10E47000709561957F4F8F4F9F4F0895E89409C025 |
:10E4800097FB3EF490958095709561957F4F8F4FE7 |
:10E490009F4F9923A9F0F92F96E9BB279395F695FD |
:10E4A000879577956795B795F111F8CFFAF4BB0F7B |
:10E4B00011F460FF1BC06F5F7F4F8F4F9F4F16C0DF |
:10E4C000882311F096E911C0772321F09EE8872F69 |
:10E4D000762F05C0662371F096E8862F70E060E025 |
:10E4E0002AF09A95660F771F881FDAF7880F96959E |
:10E4F000879597F90895990F0008550FAA0BE0E842 |
:10E50000FEEF16161706E807F907C0F012161306F5 |
:10E51000E407F50798F0621B730B840B950B39F435 |
:10E520000A2661F0232B242B252B21F408950A269B |
:10E5300009F4A140A6958FEF811D811D089597F9DB |
:10E540009F6780E870E060E008959FEF80EC089599 |
:10E5500000240A94161617061806090608950024C2 |
:10E560000A9412161306140605060895092E03943C |
:10E57000000C11F4882352F0BB0F40F4BF2B11F4B0 |
:10E5800060FF04C06F5F7F4F8F4F9F4F089557FD0F |
:10E590009058440F551F59F05F3F71F04795880F11 |
:10E5A00097FB991F61F09F3F79F0879508951216A8 |
:10E5B00013061406551FF2CF4695F1DF08C0161654 |
:10E5C00017061806991FF1CF869571056105089405 |
:10E5D0000895E894BB2766277727CB0197F908951C |
:10E5E0008ADF08F48FEF0895629FD001739FF001D6 |
:10E5F000829FE00DF11D649FE00DF11D929FF00DD3 |
:10E60000839FF00D749FF00D659FF00D9927729F09 |
:10E61000B00DE11DF91F639FB00DE11DF91FBD0194 |
:10E62000CF0111240895991B79E004C0991F961712 |
:10E6300008F0961B881F7A95C9F780950895AA1B44 |
:10E64000BB1B51E107C0AA1FBB1FA617B70710F0DD |
:10E65000A61BB70B881F991F5A95A9F7809590950F |
:10E66000BC01CD01089597FB092E07260AD077FD3E |
:10E6700004D0E5DF06D000201AF4709561957F4F35 |
:10E680000895F6F7909581959F4F0895A1E21A2E6F |
:10E69000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1F46 |
:10E6A000A217B307E407F50720F0A21BB30BE40B96 |
:10E6B000F50B661F771F881F991F1A9469F76095DD |
:10E6C0007095809590959B01AC01BD01CF01089597 |
:10E6D00097FB092E05260ED057FD04D0D7DF0AD0B0 |
:10E6E000001C38F450954095309521953F4F4F4F81 |
:10E6F0005F4F0895F6F790958095709561957F4FDF |
:10E700008F4F9F4F08952F923F924F925F926F923B |
:10E710007F928F929F92AF92BF92CF92DF92EF92B1 |
:10E72000FF920F931F93CF93DF93CDB7DEB7CA1B32 |
:10E73000DB0B0FB6F894DEBF0FBECDBF09942A885D |
:10E74000398848885F846E847D848C849B84AA8405 |
:10E75000B984C884DF80EE80FD800C811B81AA8192 |
:10E76000B981CE0FD11D0FB6F894DEBF0FBECDBF5D |
:10E77000ED010895EE0FFF1F0590F491E02D09942F |
:02E78000FFCFC9 |
:10E782005E010A0151756164726F00000164FF014C |
:10E79200FFFF01FC01FC0101737373FF03007D00A5 |
:10E7A20000C409C40964001048616C6C6F2057658D |
:10E7B2006C74000000000000000000000000000077 |
:10E7C2000000000000000000000000000000000047 |
:10E7D2000000000000000000000000000000000037 |
:10E7E2000000000000000000000000000000000027 |
:10E7F200000000000000000001200B050000ECFFFB |
:10E802006440415A4664640A0296969696084040CD |
:10E812003A10FB30380190D0030090D00300F4018D |
:10E82200640053706F727400004E6F726D616C0001 |
:10E8320000426567696E6E657200007800FF0364CE |
:10E842000B0A0D0B0C0E0B0F1001010170010FFFD3 |
:00000001FF |
/branches/Znib/V0.78f/Hex-Files/WasIstWas.txt |
---|
0,0 → 1,51 |
+++++++++++++++++++++++++ |
+ Flight-Ctrl: |
+++++++++++++++++++++++++ |
BootLoader_MEGA644_20MHZ_V0_1.hex |
Der Bootloader wird per ISP eingespielt |
Der Bootloader nur dann eingespielt werden, wenn noch nie ein Bootloader eingespielt wurde! |
Danach können Softwareupdates seriell eingespielt werden. |
Flight-Ctrl_MEGA644_Vx_yy.hex |
Aktuelle Firmware |
Wird per serielle Schnittstelle (durch den Bootloader) eingespielt |
//+++++++++++ |
// Quadro: |
// 1 |
// 4 3 |
// 2 |
//+++++++++++ |
// Reverse Props on 1 2 |
//+++++++++++ |
// Octo: |
// 1 2 |
// 8 3 |
// 7 4 |
// 6 5 |
//+++++++++++ |
//+++++++++++ |
// Octo2: |
// 1 |
// 8 2 |
// 7 3 |
// 6 4 |
// 5 |
//+++++++++++ |
//+++++++++++ |
// Octo3: |
// 1 |
// 2 |
// 8 7 3 4 |
// 5 |
// 6 |
//+++++++++++ |
// Reverse Props on octo: 1 3 5 7 |
/branches/Znib/V0.78f/License.txt |
---|
0,0 → 1,52 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) Holger Buss, Ingo Busker |
// + Nur für den privaten Gebrauch / NON-COMMERCIAL USE ONLY |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten und nichtkommerziellen Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt und genannt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung oder Nutzung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-profit use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet, our webpage (http://www.MikroKopter.de) must be |
// + clearly linked and named as origin |
// + * porting the sources to other systems or using the software on other systems (except hardware from www.mikrokopter.de) is not allowed |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
/branches/Znib/V0.78f/Settings.h |
---|
--- Spektrum.c (nonexistent) |
+++ Spektrum.c (revision 1630) |
@@ -0,0 +1,407 @@ |
+/*####################################################################################### |
+Decodieren eines RC Summen Signals oder Spektrum Empfänger-Satellit |
+#######################################################################################*/ |
+ |
+#include "Spektrum.h" |
+#include "main.h" |
+//#define RECEIVER_SPEKTRUM_EXP |
+ |
+unsigned char SpektrumTimer = 0; |
+ |
+#ifdef RECEIVER_SPEKTRUM_EXP |
+unsigned char sexcnt; // Counter for Spektrum-Expander |
+unsigned char sexparity; // Parity Bit for Spektrum-Expander |
+signed char sexdata[7]; // Data for Spektrum-Expander |
+#endif |
+//--------------------------------------------------------------// |
+//--------------------------------------------------------------// |
+void SpektrumBinding(void) |
+{ |
+ unsigned int timerTimeout = SetDelay(10000); // Timeout 10 sec. |
+ unsigned char connected = 0; |
+ unsigned int delaycounter; |
+ |
+ UCSR1B &= ~(1 << RXCIE1); // disable rx-interrupt |
+ UCSR1B &= ~(1<<RXEN1); // disable Uart-Rx |
+ PORTD &= ~(1 << PORTD2); // disable pull-up |
+ |
+ printf("\n\rPlease connect Spektrum receiver for binding NOW..."); |
+ |
+ while(!CheckDelay(timerTimeout)) |
+ { |
+ if (PIND & (1 << PORTD2)) { timerTimeout = SetDelay(90); connected = 1; break; } |
+ } |
+ |
+ if (connected) |
+ { |
+ |
+ printf("ok.\n\r"); |
+ DDRD |= (1 << DDD2); // Rx as output |
+ |
+ while(!CheckDelay(timerTimeout)); // delay after startup of RX |
+ for (delaycounter = 0; delaycounter < 100; delaycounter++) PORTD |= (1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 400; delaycounter++) PORTD &= ~(1 << PORTD2); |
+ |
+ for (delaycounter = 0; delaycounter < 10; delaycounter++) PORTD |= (1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 10; delaycounter++) PORTD &= ~(1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 400; delaycounter++) PORTD |= (1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 400; delaycounter++) PORTD &= ~(1 << PORTD2); |
+ |
+ for (delaycounter = 0; delaycounter < 10; delaycounter++) PORTD |= (1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 10; delaycounter++) PORTD &= ~(1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 400; delaycounter++) PORTD |= (1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 400; delaycounter++) PORTD &= ~(1 << PORTD2); |
+ |
+ for (delaycounter = 0; delaycounter < 10; delaycounter++) PORTD |= (1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 10; delaycounter++) PORTD &= ~(1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 400; delaycounter++) PORTD |= (1 << PORTD2); |
+ |
+ } |
+ else |
+ { printf("Timeout.\n\r"); |
+ |
+ |
+ } |
+ |
+ DDRD &= ~(1 << DDD2); // RX as input |
+ PORTD &= ~(1 << PORTD2); |
+ |
+ SpektrumUartInit(); // init Uart again |
+} |
+ |
+//############################################################################ |
+// USART1 initialisation from killagreg |
+void SpektrumUartInit(void) |
+//############################################################################ |
+ { |
+ // -- Start of USART1 initialisation for Spekturm seriell-mode |
+ // USART1 Control and Status Register A, B, C and baud rate register |
+ uint8_t sreg = SREG; |
+ |
+ uint16_t ubrr = (uint16_t) ((uint32_t) SYSCLK/(8 * 115200) - 1); |
+ |
+ // disable all interrupts before reconfiguration |
+ cli(); |
+ // disable RX-Interrupt |
+ UCSR1B &= ~(1 << RXCIE1); |
+ // disable TX-Interrupt |
+ UCSR1B &= ~(1 << TXCIE1); |
+ // disable DRE-Interrupt |
+ UCSR1B &= ~(1 << UDRIE1); |
+ // set direction of RXD1 and TXD1 pins |
+ // set RXD1 (PD2) as an input pin |
+ PORTD |= (1 << PORTD2); |
+ DDRD &= ~(1 << DDD2); |
+ |
+ // set TXD1 (PD3) as an output pin |
+ PORTD |= (1 << PORTD3); |
+ DDRD |= (1 << DDD3); |
+ |
+ // USART0 Baud Rate Register |
+ // set clock divider |
+ UBRR1H = (uint8_t)(ubrr>>8); |
+ UBRR1L = (uint8_t)ubrr; |
+ // enable double speed operation |
+ UCSR1A |= (1 << U2X1); |
+ // enable receiver and transmitter |
+ //UCSR1B = (1<<RXEN1)|(1<<TXEN1); |
+ |
+ UCSR1B = (1<<RXEN1); |
+ // set asynchronous mode |
+ UCSR1C &= ~(1 << UMSEL11); |
+ UCSR1C &= ~(1 << UMSEL10); |
+ // no parity |
+ UCSR1C &= ~(1 << UPM11); |
+ UCSR1C &= ~(1 << UPM10); |
+ // 1 stop bit |
+ UCSR1C &= ~(1 << USBS1); |
+ // 8-bit |
+ UCSR1B &= ~(1 << UCSZ12); |
+ UCSR1C |= (1 << UCSZ11); |
+ UCSR1C |= (1 << UCSZ10); |
+ // flush receive buffer explicit |
+ while(UCSR1A & (1<<RXC1)) UDR1; |
+ // enable RX-interrupts at the end |
+ UCSR1B |= (1 << RXCIE1); |
+ // -- End of USART1 initialisation |
+ // restore global interrupt flags |
+ |
+ SREG = sreg; |
+ return; |
+ } |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// + Copyright (c) Rainer Walther |
+// + RC-routines from original MK rc.c (c) H&I |
+// + Useful infos from Walter: http://www.rcgroups.com/forums/showthread.php?t=714299&page=2 |
+// + only for non-profit use |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// |
+// 20080808 rw Modified for Spektrum AR6100 (PPM) |
+// 20080823 rw Add Spektrum satellite receiver on USART1 (644P only) |
+// 20081213 rw Add support for Spektrum DS9 Air-Tx-Module (9 channels) |
+// Replace AR6100-coding with original composit-signal routines |
+// |
+// --- |
+// Entweder Summensignal ODER Spektrum-Receiver anschließen. Nicht beides gleichzeitig betreiben! |
+// Binding is not implemented. Bind with external Receiver. |
+// Servo output J3, J4, J5 not serviced |
+// |
+// Anschuß Spektrum Receiver |
+// Orange: 3V von der FC (keinesfalls an 5V anschließen!) |
+// Schwarz: GND |
+// Grau: RXD1 (Pin 3) auf 10-Pol FC-Stecker |
+// |
+// --- |
+// Satellite-Reciever connected on USART1: |
+// |
+// DX7/DX6i: One data-frame at 115200 baud every 22ms. |
+// DX7se: One data-frame at 115200 baud every 11ms. |
+// byte1: unknown |
+// byte2: unknown |
+// byte3: and byte4: channel data (FLT-Mode) |
+// byte5: and byte6: channel data (Roll) |
+// byte7: and byte8: channel data (Nick) |
+// byte9: and byte10: channel data (Gier) |
+// byte11: and byte12: channel data (Gear Switch) |
+// byte13: and byte14: channel data (Gas) |
+// byte15: and byte16: channel data (AUX2) |
+// |
+// DS9 (9 Channel): One data-frame at 115200 baud every 11ms, alternating frame 1/2 for CH1-7 / CH8-9 |
+// 1st Frame: |
+// byte1: unknown |
+// byte2: unknown |
+// byte3: and byte4: channel data |
+// byte5: and byte6: channel data |
+// byte7: and byte8: channel data |
+// byte9: and byte10: channel data |
+// byte11: and byte12: channel data |
+// byte13: and byte14: channel data |
+// byte15: and byte16: channel data |
+// 2nd Frame: |
+// byte1: unknown |
+// byte2: unknown |
+// byte3: and byte4: channel data |
+// byte5: and byte6: channel data |
+// byte7: and byte8: 0xffff |
+// byte9: and byte10: 0xffff |
+// byte11: and byte12: 0xffff |
+// byte13: and byte14: 0xffff |
+// byte15: and byte16: 0xffff |
+// |
+// Each channel data (16 bit= 2byte, first msb, second lsb) is arranged as: |
+// |
+// Bits: F 0 C3 C2 C1 C0 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 |
+// |
+// 0 means a '0' bit |
+// F: 1 = indicates beginning of 2nd frame for CH8-9 (DS9 only) |
+// C3 to C0 is the channel number. 0 to 9 (4 bit, as assigned in the transmitter) |
+// D9 to D0 is the channel data (10 bit) 0xaa..0x200..0x356 for 100% transmitter-travel |
+// |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ |
+#define MIN_FRAMEGAP 68 // 7ms |
+#define MAX_BYTEGAP 3 // 310us |
+ |
+ |
+//############################################################################ |
+// Wird im UART-Interrupt aufgerufen |
+//############################################################################ |
+void SpektrumParser(unsigned char c) |
+{ |
+ static unsigned char Sync=0, FrameCnt=0, ByteHigh=0, ReSync=1, Frame2=0; |
+ unsigned int Channel, index = 0; |
+ signed int signal = 0, tmp; |
+ int bCheckDelay; |
+// c = UDR1; // get data byte |
+ if(ReSync == 1) |
+ { |
+ // wait for beginning of new frame |
+ ReSync = 0; |
+ SpektrumTimer = MIN_FRAMEGAP; |
+ FrameCnt = 0; |
+ Sync = 0; |
+ ByteHigh = 0; |
+ } |
+ else |
+ { |
+ if(!SpektrumTimer) bCheckDelay = 1; else bCheckDelay = 0;//CheckDelay(FrameTimer); |
+ if ( Sync == 0 ) |
+ { |
+ if(bCheckDelay) |
+ { |
+ // nach einer Pause von mind. 7ms erstes Sync-Character gefunden |
+ // Zeichen ignorieren, da Bedeutung unbekannt |
+ Sync = 1; |
+ FrameCnt ++; |
+ SpektrumTimer = MAX_BYTEGAP; |
+ } |
+ else |
+ { |
+ // Zeichen kam vor Ablauf der 7ms Sync-Pause |
+ // warten auf erstes Sync-Zeichen |
+ SpektrumTimer = MIN_FRAMEGAP; |
+ FrameCnt = 0; |
+ Sync = 0; |
+ ByteHigh = 0; |
+ } |
+ } |
+ else if((Sync == 1) && !bCheckDelay) |
+ { |
+ // zweites Sync-Character ignorieren, Bedeutung unbekannt |
+ Sync = 2; |
+ FrameCnt ++; |
+ SpektrumTimer = MAX_BYTEGAP; |
+ } |
+ else if((Sync == 2) && !bCheckDelay) |
+ { |
+ SpektrumTimer = MAX_BYTEGAP; |
+ // Datenbyte high |
+ ByteHigh = c; |
+ if (FrameCnt == 2) |
+ { |
+ // is 1st Byte of Channel-data |
+ // Frame 1 with Channel 1-7 comming next |
+ Frame2 = 0; |
+ if(ByteHigh & 0x80) |
+ { |
+ // DS9: Frame 2 with Channel 8-9 comming next |
+ Frame2 = 1; |
+ } |
+ } |
+ Sync = 3; |
+ FrameCnt ++; |
+ } |
+ else if((Sync == 3) && !bCheckDelay) |
+ { |
+ // Datenbyte low |
+ // High-Byte for next channel comes next |
+ SpektrumTimer = MAX_BYTEGAP; |
+ Sync = 2; |
+ FrameCnt ++; |
+ Channel = ((unsigned int)ByteHigh << 8) | c; |
+ if(EE_Parameter.Receiver == RECEIVER_SPEKTRUM) |
+ { |
+ signal = Channel & 0x3ff; |
+ signal -= 0x200; // Offset, range 0x000..0x3ff? |
+ signal = signal/3; // scaling to fit PPM resolution |
+ index = (ByteHigh >> 2) & 0x0f; |
+ } |
+ else |
+ if(EE_Parameter.Receiver == RECEIVER_SPEKTRUM_HI_RES) |
+ { |
+ signal = Channel & 0x7ff; |
+ signal -= 0x400; // Offset, range 0x000..0x7ff? |
+ signal = signal/6; // scaling to fit PPM resolution |
+ index = (ByteHigh >> 3) & 0x0f; |
+ } |
+ else |
+ //if(EE_Parameter.Receiver == RECEIVER_SPEKTRUM_LOW_RES) |
+ { |
+ signal = Channel & 0x3ff; |
+ signal -= 360; // Offset, range 0x000..0x3ff? |
+ signal = signal/2; // scaling to fit PPM resolution |
+ index = (ByteHigh >> 2) & 0x0f; |
+ } |
+ |
+ index++; |
+ if(index < 13) |
+ { |
+ // Stabiles Signal |
+#ifdef RECEIVER_SPEKTRUM_EXP |
+ if (index == 2) index = 4; // Analog channel reassigment (2 <-> 4) for logical numbering (1,2,3,4) |
+ else if (index == 4) index = 2; |
+#endif |
+ if(abs(signal - PPM_in[index]) < 6) |
+ { |
+ if(SenderOkay < 200) SenderOkay += 10; |
+ else |
+ { |
+ SenderOkay = 200; |
+ TIMSK1 &= ~_BV(ICIE1); // disable PPM-Input |
+ } |
+ } |
+ tmp = (3 * (PPM_in[index]) + signal) / 4; |
+ if(tmp > signal+1) tmp--; else |
+ if(tmp < signal-1) tmp++; |
+ |
+#ifdef RECEIVER_SPEKTRUM_EXP |
+ if(index == 6) // FLIGHT-MODE - The channel used for our data uplink |
+ { |
+ if (signal > 100) // SYNC received |
+ { |
+ sexcnt = 0; // Reset bitcounter |
+ sexparity = 0; // Reset parity bit |
+ } |
+ |
+ if (signal < 10) |
+ { |
+ sexcnt++; // Increase counter only for non-sync bits |
+ sexdata[sexcnt] = -113; // Bit = 0 -> value = -113 (min) |
+ } |
+ |
+ if (sexcnt == 7) sexcnt = 0; // Overflow protection |
+ |
+ if (signal < -100) |
+ { |
+ sexdata[sexcnt] = 114; // Bit = 1 -> value = 114 (max) |
+ if (sexcnt < 6) sexparity = ~sexparity; // Bit = 1 -> Invert parity bit (without itself) |
+ } |
+ |
+ if (sexcnt == 6) // Wait for complete frame |
+ { |
+ if ((sexparity != 0 && sexdata[6] == -113) || (sexparity == 0 && sexdata[6] == 114)) // Parity check |
+ { |
+ if (sexdata[1] == 114 && sexdata[2] == -113) PPM_in[5] = -113;// Reconstruct tripole Flight-Mode value (CH5) |
+ if (sexdata[1] == -113 && sexdata[2] == -113) PPM_in[5] = 0; // Reconstruct tripole Flight-Mode value (CH5) |
+ if (sexdata[1] == -113 && sexdata[2] == 114) PPM_in[5] = 114; // Reconstruct tripole Flight-Mode value (CH5) |
+ PPM_in[6] = sexdata[3]; // Elevator (CH6) |
+ PPM_in[9] = sexdata[4]; // Aileron (CH9) |
+ PPM_in[10] = sexdata[5]; // Rudder (CH10) |
+ } |
+ } |
+ } |
+#endif |
+ if(SenderOkay >= 180) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; |
+ |
+ else PPM_diff[index] = 0; |
+ |
+#ifdef RECEIVER_SPEKTRUM_EXP |
+ if (index < 5 ) PPM_in[index] = tmp; // Update normal potis (CH1-4) |
+ if (index == 5) PPM_in[7] = signal; // Gear (CH7) |
+ if (index == 7) PPM_in[8] = signal; // AUX2 (CH8) |
+#else |
+ PPM_in[index] = tmp; |
+#endif |
+ } |
+ else if(index > 17) ReSync = 1; // hier stimmt was nicht: neu synchronisieren |
+ } |
+ else |
+ { |
+ // hier stimmt was nicht: neu synchronisieren |
+ ReSync = 1; |
+ FrameCnt = 0; |
+ Frame2 = 0; |
+ // new frame next, nach fruehestens 7ms erwartet |
+ SpektrumTimer = MIN_FRAMEGAP; |
+ } |
+ |
+ // 16 Bytes eingetroffen -> Komplett |
+ if(FrameCnt >= 16) |
+ { |
+ // Frame complete |
+ if(Frame2 == 0) |
+ { |
+ // Null bedeutet: Neue Daten |
+ // nur beim ersten Frame (CH 0-7) setzen |
+ if(!ReSync) NewPpmData = 0; |
+ } |
+ FrameCnt = 0; |
+ Frame2 = 0; |
+ Sync = 0; |
+ SpektrumTimer = MIN_FRAMEGAP; |
+ } |
+ } |
+} |
+ |
+ |
/branches/Znib/V0.78f/Spektrum.h |
---|
0,0 → 1,12 |
/*####################################################################################### |
Dekodieren eines Spektrum Signals |
#######################################################################################*/ |
#ifndef _SPEKTRUM_H |
#define _SPEKTRUM_H |
void SpektrumUartInit(void); |
void SpektrumBinding(void); |
extern unsigned char SpektrumTimer; |
extern void SpektrumParser(unsigned char c); |
#endif //_RC_H |
/branches/Znib/V0.78f/_Settings.h |
---|
0,0 → 1,29 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Abstimmung |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define ACC_AMPLIFY 6 |
#define FAKTOR_P 1 |
#define FAKTOR_I 0.0001 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Debug-Interface |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define SIO_DEBUG 1 // Soll der Debugger aktiviert sein? |
#define MIN_DEBUG_INTERVALL 250 // in diesem Intervall werden Degugdaten ohne Aufforderung gesendet |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Sender |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define K_NICK 0 |
#define K_ROLL 1 |
#define K_GAS 2 |
#define K_GIER 3 |
#define K_POTI1 4 |
#define K_POTI2 5 |
#define K_POTI3 6 |
#define K_POTI4 7 |
#define K_POTI5 8 |
#define K_POTI6 9 |
#define K_POTI7 10 |
#define K_POTI8 11 |
/branches/Znib/V0.78f/analog.c |
---|
0,0 → 1,466 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) Holger Buss, Ingo Busker |
// + only for non-profit use |
// + www.MikroKopter.com |
// + porting the sources to other systems or using the software on other systems (except hardware from www.mikrokopter.de) is not allowed |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_ax, Aktuell_ay,Aktuell_az, UBat = 100; |
volatile int AdWertNickFilter = 0, AdWertRollFilter = 0, AdWertGierFilter = 0; |
volatile int HiResNick = 2500, HiResRoll = 2500; |
volatile int AdWertNick = 0, AdWertRoll = 0, AdWertGier = 0; |
volatile int AdWertAccRoll = 0,AdWertAccNick = 0,AdWertAccHoch = 0; |
volatile char messanzahl_AccHoch = 0; |
volatile long Luftdruck = 32000; |
volatile long SummenHoehe = 0; |
volatile int StartLuftdruck; |
volatile unsigned int MessLuftdruck = 1023; |
unsigned char DruckOffsetSetting; |
signed char ExpandBaro = 0; |
volatile int VarioMeter = 0; |
volatile unsigned int ZaehlMessungen = 0; |
unsigned char AnalogOffsetNick = 115,AnalogOffsetRoll = 115,AnalogOffsetGier = 115; |
unsigned char GyroDefektN = 0,GyroDefektR = 0,GyroDefektG = 0; |
volatile unsigned char AdReady = 1; |
//####################################################################################### |
// |
void ADC_Init(void) |
//####################################################################################### |
{ |
ADMUX = 0;//Referenz ist extern |
ANALOG_ON; |
} |
#define DESIRED_H_ADC 800 |
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 < DESIRED_H_ADC) off = 0; |
for(; off < 250;off++) |
{ |
OCR0A = off; |
Delay_ms_Mess(50); |
printf("."); |
if(MessLuftdruck < DESIRED_H_ADC) break; |
} |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_LAST_OFFSET], off); |
DruckOffsetSetting = off; |
Delay_ms_Mess(300); |
} |
void SucheGyroOffset(void) |
{ |
unsigned char i, ready = 0; |
int timeout; |
GyroDefektN = 0; GyroDefektR = 0; GyroDefektG = 0; |
timeout = SetDelay(2000); |
for(i=140; i != 0; i--) |
{ |
if(ready == 3 && i > 10) i = 9; |
ready = 0; |
if(AdWertNick < 1020) AnalogOffsetNick--; else if(AdWertNick > 1030) AnalogOffsetNick++; else ready++; |
if(AdWertRoll < 1020) AnalogOffsetRoll--; else if(AdWertRoll > 1030) AnalogOffsetRoll++; else ready++; |
if(AdWertGier < 1020) AnalogOffsetGier--; else if(AdWertGier > 1030) AnalogOffsetGier++; else ready++; |
twi_state = 8; |
i2c_start(); |
if(AnalogOffsetNick < 10) { GyroDefektN = 1; AnalogOffsetNick = 10;}; if(AnalogOffsetNick > 245) { GyroDefektN = 1; AnalogOffsetNick = 245;}; |
if(AnalogOffsetRoll < 10) { GyroDefektR = 1; AnalogOffsetRoll = 10;}; if(AnalogOffsetRoll > 245) { GyroDefektR = 1; AnalogOffsetRoll = 245;}; |
if(AnalogOffsetGier < 10) { GyroDefektG = 1; AnalogOffsetGier = 10;}; if(AnalogOffsetGier > 245) { GyroDefektG = 1; AnalogOffsetGier = 245;}; |
while(twi_state) if(CheckDelay(timeout)) {printf("\n\r DAC or I2C ERROR! Check I2C, 3Vref, DAC and BL-Ctrl"); break;} |
AdReady = 0; |
ANALOG_ON; |
while(!AdReady); |
if(i<10) Delay_ms_Mess(10); |
} |
Delay_ms_Mess(70); |
} |
/* |
0 n |
1 r |
2 g |
3 y |
4 x |
5 n |
6 r |
7 u |
8 z |
9 L |
10 n |
11 r |
12 g |
13 y |
14 x |
15 n |
16 r |
17 L |
*/ |
//####################################################################################### |
// |
ISR(ADC_vect) |
//####################################################################################### |
{ |
static unsigned char kanal=0,state = 0; |
static signed int gier1, roll1, nick1, nick_filter, roll_filter; |
static signed int accy, accx; |
static long tmpLuftdruck = 0; |
static char messanzahl_Druck = 0; |
switch(state++) |
{ |
case 0: |
nick1 = ADC; |
kanal = AD_ROLL; |
break; |
case 1: |
roll1 = ADC; |
kanal = AD_GIER; |
break; |
case 2: |
gier1 = ADC; |
kanal = AD_ACC_Y; |
break; |
case 3: |
Aktuell_ay = NeutralAccY - ADC; |
accy = Aktuell_ay; |
kanal = AD_ACC_X; |
break; |
case 4: |
Aktuell_ax = ADC - NeutralAccX; |
accx = Aktuell_ax; |
kanal = AD_NICK; |
break; |
case 5: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 6: |
roll1 += ADC; |
kanal = AD_UBAT; |
break; |
case 7: |
UBat = (3 * UBat + ADC / 3) / 4; |
kanal = AD_ACC_Z; |
break; |
case 8: |
AdWertAccHoch = (signed int) ADC - NeutralAccZ; |
if(AdWertAccHoch > 1) |
{ |
if(NeutralAccZ < 750) |
{ |
NeutralAccZ += 0.02; |
if(modell_fliegt < 500) NeutralAccZ += 0.1; |
} |
} |
else if(AdWertAccHoch < -1) |
{ |
if(NeutralAccZ > 550) |
{ |
NeutralAccZ-= 0.02; |
if(modell_fliegt < 500) NeutralAccZ -= 0.1; |
} |
} |
messanzahl_AccHoch = 1; |
Aktuell_az = ADC; |
Mess_Integral_Hoch += AdWertAccHoch; // Integrieren |
Mess_Integral_Hoch -= Mess_Integral_Hoch / 1024; // dämfen |
kanal = AD_DRUCK; |
break; |
// "case 8:" fehlt hier absichtlich |
case 10: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 11: |
roll1 += ADC; |
kanal = AD_GIER; |
break; |
case 12: |
if(PlatinenVersion == 10) AdWertGier = (ADC + gier1 + 1) / 2; |
else |
if(PlatinenVersion == 20) AdWertGier = 2047 - (ADC + gier1); |
else AdWertGier = (ADC + gier1); |
kanal = AD_ACC_Y; |
break; |
case 13: |
Aktuell_ay = NeutralAccY - ADC; |
AdWertAccRoll = (Aktuell_ay + accy); |
kanal = AD_ACC_X; |
break; |
case 14: |
Aktuell_ax = ADC - NeutralAccX; |
AdWertAccNick = (Aktuell_ax + accx); |
kanal = AD_NICK; |
break; |
case 15: |
nick1 += ADC; |
if(PlatinenVersion == 10) nick1 *= 2; else nick1 *= 4; |
AdWertNick = nick1 / 8; |
nick_filter = (nick_filter + nick1) / 2; |
HiResNick = nick_filter - AdNeutralNick; |
AdWertNickFilter = (AdWertNickFilter + HiResNick) / 2; |
kanal = AD_ROLL; |
break; |
case 16: |
roll1 += ADC; |
if(PlatinenVersion == 10) roll1 *= 2; else roll1 *= 4; |
AdWertRoll = roll1 / 8; |
roll_filter = (roll_filter + roll1) / 2; |
HiResRoll = roll_filter - AdNeutralRoll; |
AdWertRollFilter = (AdWertRollFilter + HiResRoll) / 2; |
kanal = AD_DRUCK; |
break; |
case 17: |
state = 0; |
AdReady = 1; |
ZaehlMessungen++; |
// "break" fehlt hier absichtlich |
case 9: |
MessLuftdruck = ADC; |
tmpLuftdruck += MessLuftdruck; |
if(++messanzahl_Druck >= 18) |
{ |
Luftdruck = (7 * Luftdruck + tmpLuftdruck - (18 * 523) * (long)ExpandBaro + 4) / 8; // -523.19 counts per 10 counts offset step |
HoehenWert = StartLuftdruck - Luftdruck; |
SummenHoehe -= SummenHoehe/SM_FILTER; |
SummenHoehe += HoehenWert; |
VarioMeter = (15 * VarioMeter + 8 * (int)(HoehenWert - SummenHoehe/SM_FILTER))/16; |
tmpLuftdruck /= 2; |
messanzahl_Druck = 18/2; |
} |
kanal = AD_NICK; |
break; |
default: |
kanal = 0; state = 0; kanal = AD_NICK; |
break; |
} |
ADMUX = kanal; |
if(state != 0) ANALOG_ON; |
} |
/* |
//####################################################################################### |
// |
SIGNAL(SIG_ADC) |
//####################################################################################### |
{ |
static unsigned char kanal=0,state = 0; |
static signed int gier1, roll1, nick1; |
static signed long nick_filter, roll_filter; |
static signed int accy, accx; |
switch(state++) |
{ |
case 0: |
nick1 = ADC; |
kanal = AD_ROLL; |
break; |
case 1: |
roll1 = ADC; |
kanal = AD_GIER; |
break; |
case 2: |
gier1 = ADC; |
kanal = AD_ACC_Y; |
break; |
case 3: |
Aktuell_ay = NeutralAccY - ADC; |
accy = Aktuell_ay; |
kanal = AD_NICK; |
break; |
case 4: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 5: |
roll1 += ADC; |
kanal = AD_ACC_Z; |
break; |
case 6: |
AdWertAccHoch = (signed int) ADC - NeutralAccZ; |
if(AdWertAccHoch > 1) |
{ |
if(NeutralAccZ < 750) |
{ |
NeutralAccZ += 0.02; |
if(modell_fliegt < 500) NeutralAccZ += 0.1; |
} |
} |
else if(AdWertAccHoch < -1) |
{ |
if(NeutralAccZ > 550) |
{ |
NeutralAccZ-= 0.02; |
if(modell_fliegt < 500) NeutralAccZ -= 0.1; |
} |
} |
messanzahl_AccHoch = 1; |
Aktuell_az = ADC; |
Mess_Integral_Hoch += AdWertAccHoch; // Integrieren |
Mess_Integral_Hoch -= Mess_Integral_Hoch / 1024; // dämfen |
kanal = AD_NICK; |
break; |
case 7: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 8: |
roll1 += ADC; |
kanal = AD_ACC_X; |
break; |
case 9: |
Aktuell_ax = ADC - NeutralAccX; |
accx = Aktuell_ax; |
kanal = AD_GIER; |
break; |
case 10: |
gier1 += ADC; |
kanal = AD_NICK; |
break; |
case 11: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 12: |
roll1 += ADC; |
kanal = AD_UBAT; |
break; |
case 13: |
UBat = (3 * UBat + ADC / 3) / 4;//(UBat + ((ADC * 39) / 256) + 19) / 2; |
kanal = AD_ACC_Y; |
break; |
case 14: |
Aktuell_ay = NeutralAccY - ADC; |
accy += Aktuell_ay; |
kanal = AD_NICK; |
break; |
case 15: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 16: |
roll1 += ADC; |
kanal = AD_ACC_X; |
break; |
case 17: |
Aktuell_ax = ADC - NeutralAccX; |
accx += Aktuell_ax; |
kanal = AD_NICK; |
break; |
case 18: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 19: |
roll1 += ADC; |
kanal = AD_GIER; |
break; |
case 20: |
gier1 += ADC; |
kanal = AD_ACC_Y; |
break; |
case 21: |
Aktuell_ay = NeutralAccY - ADC; |
accy += Aktuell_ay; |
kanal = AD_NICK; |
break; |
case 22: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 23: |
roll1 += ADC; |
kanal = AD_DRUCK; |
break; |
case 24: |
tmpLuftdruck += ADC; |
if(++messanzahl_Druck >= 5) |
{ |
MessLuftdruck = ADC; |
messanzahl_Druck = 0; |
HoeheD = (7 * HoeheD + (int) Parameter_Luftdruck_D * (int)(255 * ExpandBaro + StartLuftdruck - tmpLuftdruck - HoehenWert)) / 8; // D-Anteil = neuerWert - AlterWert |
Luftdruck = (tmpLuftdruck + 3 * Luftdruck) / 4; |
HoehenWert = 255 * ExpandBaro + StartLuftdruck - Luftdruck; |
tmpLuftdruck = 0; |
} |
kanal = AD_NICK; |
break; |
case 25: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 26: |
roll1 += ADC; |
kanal = AD_ACC_X; |
break; |
case 27: |
Aktuell_ax = ADC - NeutralAccX; |
accx += Aktuell_ax; |
kanal = AD_GIER; |
break; |
case 28: |
if(PlatinenVersion == 10) AdWertGier = (ADC + gier1 + 2) / 4; |
else |
if(PlatinenVersion == 20) AdWertGier = 2047 - (ADC + gier1 + 1) / 2; |
else AdWertGier = (ADC + gier1 + 1) / 2; |
kanal = AD_NICK; |
break; |
case 29: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 30: |
roll1 += ADC; |
kanal = AD_ACC_Y; |
break; |
case 31: |
Aktuell_ay = NeutralAccY - ADC; |
AdWertAccRoll = (Aktuell_ay + accy); |
kanal = AD_NICK; |
break; |
case 32: |
AdWertNick = (ADC + nick1 + 3) / 5; |
nick_filter = (long) (1 * (long) nick_filter + 4 * (long)(ADC + nick1) + 1) / 2; |
if(PlatinenVersion == 10) { AdWertNick /= 2;nick_filter /=2;} |
HiResNick = nick_filter - 20 * AdNeutralNick; |
AdWertNickFilter = (long)(3L * (long)AdWertNickFilter + HiResNick + 2) / 4; |
DebugOut.Analog[21] = AdWertNickFilter / 4; |
kanal = AD_ROLL; |
break; |
case 33: |
AdWertRoll = (ADC + roll1 + 3) / 5; |
roll_filter = (long)(1 * (long)roll_filter + 4 * (long)(ADC + roll1) + 1) / 2; |
if(PlatinenVersion == 10) { AdWertRoll /= 2;roll_filter /=2;} |
HiResRoll = roll_filter - 20 * AdNeutralRoll; |
AdWertRollFilter = (long)(3L * (long)AdWertRollFilter + HiResRoll + 2) / 4; |
DebugOut.Analog[22] = AdWertRollFilter / 4; |
kanal = AD_ACC_X; |
break; |
case 34: |
Aktuell_ax = ADC - NeutralAccX; |
AdWertAccNick = (Aktuell_ax + accx); |
kanal = AD_NICK; |
state = 0; |
AdReady = 1; |
ZaehlMessungen++; |
break; |
default: |
kanal = 0; |
state = 0; |
break; |
} |
ADMUX = kanal; |
if(state != 0) ANALOG_ON; |
} |
*/ |
/branches/Znib/V0.78f/analog.h |
---|
0,0 → 1,48 |
#ifndef _ANALOG_H |
#define _ANALOG_H |
/*####################################################################################### |
#######################################################################################*/ |
#define SM_FILTER 16 |
extern volatile int UBat; |
extern volatile int AdWertNick, AdWertRoll, AdWertGier; |
extern volatile int AdWertAccRoll,AdWertAccNick,AdWertAccHoch; |
extern volatile int HiResNick, HiResRoll; |
extern volatile int AdWertNickFilter, AdWertRollFilter, AdWertGierFilter; |
extern volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_ax, Aktuell_ay,Aktuell_az; |
extern volatile long Luftdruck; |
extern volatile long SummenHoehe; |
extern volatile char messanzahl_Druck; |
extern volatile unsigned int ZaehlMessungen; |
extern unsigned char DruckOffsetSetting; |
extern signed char ExpandBaro; |
extern volatile int VarioMeter; |
extern volatile unsigned int MessLuftdruck; |
extern volatile int StartLuftdruck; |
extern volatile char MessanzahlNick; |
extern unsigned char AnalogOffsetNick,AnalogOffsetRoll,AnalogOffsetGier; |
extern volatile unsigned char AdReady; |
unsigned int ReadADC(unsigned char adc_input); |
void ADC_Init(void); |
void SucheLuftruckOffset(void); |
void SucheGyroOffset(void); |
#define AD_GIER 0 |
#define AD_ROLL 1 |
#define AD_NICK 2 |
#define AD_DRUCK 3 |
#define AD_UBAT 4 |
#define AD_ACC_Z 5 |
#define AD_ACC_Y 6 |
#define AD_ACC_X 7 |
#define ANALOG_OFF ADCSRA=0 |
#define ANALOG_ON ADCSRA=(1<<ADEN)|(1<<ADSC)|(0<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADIE) |
//Signle trigger Mode, Interrupt on |
#endif //_ANALOG_H |
/branches/Znib/V0.78f/capacity.c |
---|
0,0 → 1,139 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) Holger Buss, Ingo Busker |
// + Thanks to Marcel Haller (Lion) for the nice idea and first implementation |
// + Nur für den privaten Gebrauch |
// + www.MikroKopter.com |
// + porting the sources to other systems or using the software on other systems (except hardware from www.mikrokopter.de) is not allowed |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-commercial use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be |
// + clearly linked as origin |
// + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "capacity.h" |
#include "twimaster.h" |
#include "main.h" |
#include "timer0.h" |
#include "analog.h" |
#define CAPACITY_UPDATE_INTERVAL 10 // 10 ms |
#define FC_OFFSET_CURRENT 5 // calculate with a current of 0.5A |
#define BL_OFFSET_CURRENT 2 // calculate with a current of 0.2A |
// global varialbles |
unsigned short update_timer = 0; |
Capacity_t Capacity; |
// initialize capacity calculation |
void Capacity_Init(void) |
{ |
Capacity.ActualCurrent = 0; |
Capacity.UsedCapacity = 0; |
Capacity.ActualPower = 0; |
update_timer = SetDelay(CAPACITY_UPDATE_INTERVAL); |
} |
// called in main loop at a regular interval |
void Capacity_Update(void) |
{ |
unsigned short Current, SetSum; // max value will be 255 * 12 = 3060 |
static unsigned short SubCounter = 0; |
static unsigned short CurrentOffset = 0; |
static unsigned long SumCurrentOffset = 0; |
unsigned char i, NumOfMotors; |
if(CheckDelay(update_timer)) |
{ |
update_timer += CAPACITY_UPDATE_INTERVAL; // do not use SetDelay to avoid timing leaks |
// determine sum of all present BL currents and setpoints |
Current = 0; |
SetSum = 0; |
NumOfMotors = 0; |
for(i = 0; i < MAX_MOTORS; i++) |
{ |
if(Motor[i].State & MOTOR_STATE_PRESENT_MASK) |
{ |
NumOfMotors++; |
Current += (unsigned int)(Motor[i].Current); |
SetSum += (unsigned int)(Motor[i].SetPoint); |
} |
} |
if(SetSum == 0) // if all setpoints are 0 |
{ // determine offsets of motor currents |
#define CURRENT_AVERAGE 8 // 8bit = 256 * 10 ms = 2.56s average time |
CurrentOffset = (unsigned int)(SumCurrentOffset>>CURRENT_AVERAGE); |
SumCurrentOffset -= CurrentOffset; |
SumCurrentOffset += Current; |
// after averaging set current to static offset |
Current = FC_OFFSET_CURRENT; |
} |
else // some motors are running, includes also motor test condition, where "MotorRunning" is false |
{ // subtract offset |
if(Current > CurrentOffset) Current -= CurrentOffset; |
else Current = 0; |
// add the FC and BL Offsets |
Current += FC_OFFSET_CURRENT + NumOfMotors * BL_OFFSET_CURRENT; |
} |
// update actual Current |
Capacity.ActualCurrent = Current; |
// update actual Power |
if(Current < 255) Capacity.ActualPower = (UBat * Current) / 100; // in W higher resolution |
else Capacity.ActualPower = (UBat * (Current/4)) / 25; // in W |
// update used capacity |
SubCounter += Current; |
// 100mA * 1ms * CAPACITY_UPDATE_INTERVAL = 1 mA * 100 ms * CAPACITY_UPDATE_INTERVAL |
// = 1mA * 0.1s * CAPACITY_UPDATE_INTERVAL = 1mA * 1min / (600 / CAPACITY_UPDATE_INTERVAL) |
// = 1mAh / (36000 / CAPACITY_UPDATE_INTERVAL) |
#define SUB_COUNTER_LIMIT (36000 / CAPACITY_UPDATE_INTERVAL) |
if(SubCounter > SUB_COUNTER_LIMIT) |
{ |
Capacity.UsedCapacity++; // we have one mAh more |
SubCounter -= SUB_COUNTER_LIMIT; // keep the remaining sub part |
} |
} // EOF check delay update timer |
} |
/branches/Znib/V0.78f/capacity.h |
---|
0,0 → 1,17 |
#ifndef _CAPACITY_H |
#define _CAPACITY_H |
typedef struct |
{ |
unsigned short ActualCurrent; // in 0.1A Steps |
unsigned short ActualPower; // in 0.1W |
unsigned short UsedCapacity; // in mAh |
} __attribute__((packed)) Capacity_t; |
extern Capacity_t Capacity; |
void Capacity_Init(void); |
void Capacity_Update(void); |
#endif //_CAPACITY_H |
/branches/Znib/V0.78f/eeprom.c |
---|
0,0 → 1,290 |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Konstanten |
// + 0-247 -> normale Werte |
// + 255 -> Poti1 |
// + 254 -> Poti2 |
// + 253 -> Poti3 |
// + 252 -> Poti4 |
// + 251 -> Poti5 |
// + 247 -> Poti6 |
// + 249 -> Poti7 |
// + 248 -> Poti8 |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
void DefaultStickMapping(void) // mode 2 |
{ |
EE_Parameter.Kanalbelegung[K_GAS] = 1; |
EE_Parameter.Kanalbelegung[K_ROLL] = 2; |
EE_Parameter.Kanalbelegung[K_NICK] = 3; |
EE_Parameter.Kanalbelegung[K_GIER] = 4; |
EE_Parameter.Kanalbelegung[K_POTI1] = 5; |
EE_Parameter.Kanalbelegung[K_POTI2] = 6; |
EE_Parameter.Kanalbelegung[K_POTI3] = 7; |
EE_Parameter.Kanalbelegung[K_POTI4] = 8; |
EE_Parameter.Kanalbelegung[K_POTI5] = 9; |
EE_Parameter.Kanalbelegung[K_POTI6] = 10; |
EE_Parameter.Kanalbelegung[K_POTI7] = 11; |
EE_Parameter.Kanalbelegung[K_POTI8] = 12; |
} |
void DefaultKonstanten1(void) |
{ |
EE_Parameter.GlobalConfig = CFG_ACHSENKOPPLUNG_AKTIV | CFG_KOMPASS_AKTIV | CFG_GPS_AKTIV | CFG_HOEHEN_SCHALTER; |
EE_Parameter.ExtraConfig = CFG2_HEIGHT_LIMIT;// | CFG2_VARIO_BEEP | CFG_SENSITIVE_RC |
EE_Parameter.Hoehe_MinGas = 30; |
EE_Parameter.MaxHoehe = 255; // Wert : 0-247 255 -> Poti1 |
EE_Parameter.Hoehe_P = 10; // Wert : 0-32 |
EE_Parameter.Luftdruck_D = 30; // Wert : 0-247 |
EE_Parameter.Hoehe_ACC_Wirkung = 30; // Wert : 0-247 |
EE_Parameter.Hoehe_HoverBand = 5; // Wert : 0-247 |
EE_Parameter.Hoehe_GPS_Z = 64; // Wert : 0-247 |
EE_Parameter.Hoehe_StickNeutralPoint = 0; // Wert : 0-247 (0 = Hover-Estimation) |
EE_Parameter.Hoehe_Verstaerkung = 20; // Wert : 0-50 |
EE_Parameter.Stick_P = 14; // Wert : 1-6 |
EE_Parameter.Stick_D = 16; // 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-247 |
EE_Parameter.GyroAccFaktor = 30; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-247 |
EE_Parameter.Gyro_P = 80; // Wert : 0-247 |
EE_Parameter.Gyro_I = 150; // Wert : 0-247 |
EE_Parameter.Gyro_D = 3; // Wert : 0-247 |
EE_Parameter.Gyro_Gier_P = 80; // Wert : 0-247 |
EE_Parameter.Gyro_Gier_I = 150; // Wert : 0-247 |
EE_Parameter.UnterspannungsWarnung = 33; // Wert : 0-247 ( Automatische Zellenerkennung bei < 50) |
EE_Parameter.NotGas = 35; // Wert : 0-247 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 30; // Wert : 0-247 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.I_Faktor = 32; |
EE_Parameter.UserParam1 = 0; // zur freien Verwendung |
EE_Parameter.UserParam2 = 0; // zur freien Verwendung |
EE_Parameter.UserParam3 = 0; // zur freien Verwendung |
EE_Parameter.UserParam4 = 0; // zur freien Verwendung |
EE_Parameter.UserParam5 = 0; // zur freien Verwendung |
EE_Parameter.UserParam6 = 0; // zur freien Verwendung |
EE_Parameter.UserParam7 = 0; // zur freien Verwendung |
EE_Parameter.UserParam8 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-247 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-247 // Einfluss Gyro/Servo |
EE_Parameter.ServoCompInvert = 1; // Wert : 0-247 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 0; // Wert : 0-247 // Anschlag |
EE_Parameter.ServoNickMax = 247; // Wert : 0-247 // Anschlag |
EE_Parameter.ServoNickRefresh = 6; |
EE_Parameter.Servo3 = 125; |
EE_Parameter.Servo4 = 125; |
EE_Parameter.Servo5 = 125; |
EE_Parameter.ServoRollControl = 100; // Wert : 0-247 // Stellung des Servos |
EE_Parameter.ServoRollComp = 40; // Wert : 0-247 // Einfluss Gyro/Servo |
EE_Parameter.ServoRollMin = 0; // Wert : 0-247 // Anschlag |
EE_Parameter.ServoRollMax = 247; // Wert : 0-247 // Anschlag |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-247 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.BitConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
EE_Parameter.AchsKopplung1 = 90; |
EE_Parameter.AchsKopplung2 = 80; |
EE_Parameter.CouplingYawCorrection = 1; |
EE_Parameter.WinkelUmschlagNick = 85; |
EE_Parameter.WinkelUmschlagRoll = 85; |
EE_Parameter.GyroAccAbgleich = 16; // 1/k |
EE_Parameter.Driftkomp = 32; |
EE_Parameter.DynamicStability = 100; |
EE_Parameter.J16Bitmask = 95; |
EE_Parameter.J17Bitmask = 243; |
EE_Parameter.WARN_J16_Bitmask = 0xAA; |
EE_Parameter.WARN_J17_Bitmask = 0xAA; |
EE_Parameter.J16Timing = 15; |
EE_Parameter.J17Timing = 15; |
EE_Parameter.NaviGpsModeControl = 254; // 254 -> Poti 2 |
EE_Parameter.NaviGpsGain = 100; |
EE_Parameter.NaviGpsP = 90; |
EE_Parameter.NaviGpsI = 90; |
EE_Parameter.NaviGpsD = 90; |
EE_Parameter.NaviGpsPLimit = 75; |
EE_Parameter.NaviGpsILimit = 75; |
EE_Parameter.NaviGpsDLimit = 75; |
EE_Parameter.NaviGpsACC = 0; |
EE_Parameter.NaviGpsMinSat = 6; |
EE_Parameter.NaviStickThreshold = 8; |
EE_Parameter.NaviWindCorrection = 90; |
EE_Parameter.NaviSpeedCompensation = 30; |
EE_Parameter.NaviOperatingRadius = 100; |
EE_Parameter.NaviAngleLimitation = 100; |
EE_Parameter.NaviPH_LoginTime = 4; |
EE_Parameter.Receiver = RECEIVER_SPEKTRUM; |
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; |
EE_Parameter.ExtraConfig = CFG2_HEIGHT_LIMIT;// | CFG2_VARIO_BEEP | CFG_SENSITIVE_RC |
EE_Parameter.Hoehe_MinGas = 30; |
EE_Parameter.MaxHoehe = 255; // Wert : 0-247 255 -> Poti1 |
EE_Parameter.Hoehe_P = 10; // Wert : 0-32 |
EE_Parameter.Luftdruck_D = 30; // Wert : 0-247 |
EE_Parameter.Hoehe_ACC_Wirkung = 30; // Wert : 0-247 |
EE_Parameter.Hoehe_HoverBand = 5; // Wert : 0-247 |
EE_Parameter.Hoehe_GPS_Z = 64; // Wert : 0-247 |
EE_Parameter.Hoehe_StickNeutralPoint = 0;// Wert : 0-247 (0 = Hover-Estimation) |
EE_Parameter.Hoehe_Verstaerkung = 15; // Wert : 0-50 |
EE_Parameter.Stick_P = 10; // Wert : 1-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-247 |
EE_Parameter.GyroAccFaktor = 30; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-247 |
EE_Parameter.Gyro_P = 90; // Wert : 0-247 |
EE_Parameter.Gyro_I = 120; // Wert : 0-247 |
EE_Parameter.Gyro_D = 3; // Wert : 0-247 |
EE_Parameter.Gyro_Gier_P = 90; // Wert : 0-247 |
EE_Parameter.Gyro_Gier_I = 120; // Wert : 0-247 |
EE_Parameter.UnterspannungsWarnung = 33; // Wert : 0-247 ( Automatische Zellenerkennung bei < 50) |
EE_Parameter.NotGas = 35; // Wert : 0-247 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 30; // Wert : 0-247 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.I_Faktor = 32; |
EE_Parameter.UserParam1 = 0; // zur freien Verwendung |
EE_Parameter.UserParam2 = 0; // zur freien Verwendung |
EE_Parameter.UserParam3 = 0; // zur freien Verwendung |
EE_Parameter.UserParam4 = 0; // zur freien Verwendung |
EE_Parameter.UserParam5 = 0; // zur freien Verwendung |
EE_Parameter.UserParam6 = 0; // zur freien Verwendung |
EE_Parameter.UserParam7 = 0; // zur freien Verwendung |
EE_Parameter.UserParam8 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-247 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-247 // Einfluss Gyro/Servo |
EE_Parameter.ServoCompInvert = 1; // Wert : 0-247 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 0; // Wert : 0-247 // Anschlag |
EE_Parameter.ServoNickMax = 247; // Wert : 0-247 // Anschlag |
EE_Parameter.ServoNickRefresh = 6; |
EE_Parameter.Servo3 = 125; |
EE_Parameter.Servo4 = 125; |
EE_Parameter.Servo5 = 125; |
EE_Parameter.ServoRollControl = 100; // Wert : 0-247 // Stellung des Servos |
EE_Parameter.ServoRollComp = 40; // Wert : 0-247 // Einfluss Gyro/Servo |
EE_Parameter.ServoRollMin = 0; // Wert : 0-247 // Anschlag |
EE_Parameter.ServoRollMax = 247; // Wert : 0-247 // Anschlag |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-247 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.BitConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts |
EE_Parameter.AchsKopplung1 = 90; |
EE_Parameter.AchsKopplung2 = 80; |
EE_Parameter.CouplingYawCorrection = 60; |
EE_Parameter.WinkelUmschlagNick = 85; |
EE_Parameter.WinkelUmschlagRoll = 85; |
EE_Parameter.GyroAccAbgleich = 32; // 1/k |
EE_Parameter.Driftkomp = 32; |
EE_Parameter.DynamicStability = 75; |
EE_Parameter.J16Bitmask = 95; |
EE_Parameter.J17Bitmask = 243; |
EE_Parameter.WARN_J16_Bitmask = 0xAA; |
EE_Parameter.WARN_J17_Bitmask = 0xAA; |
EE_Parameter.J16Timing = 20; |
EE_Parameter.J17Timing = 20; |
EE_Parameter.NaviGpsModeControl = 254; // 254 -> Poti 2 |
EE_Parameter.NaviGpsGain = 100; |
EE_Parameter.NaviGpsP = 90; |
EE_Parameter.NaviGpsI = 90; |
EE_Parameter.NaviGpsD = 90; |
EE_Parameter.NaviGpsPLimit = 75; |
EE_Parameter.NaviGpsILimit = 75; |
EE_Parameter.NaviGpsDLimit = 75; |
EE_Parameter.NaviGpsACC = 0; |
EE_Parameter.NaviGpsMinSat = 6; |
EE_Parameter.NaviStickThreshold = 8; |
EE_Parameter.NaviWindCorrection = 90; |
EE_Parameter.NaviSpeedCompensation = 30; |
EE_Parameter.NaviOperatingRadius = 100; |
EE_Parameter.NaviAngleLimitation = 100; |
EE_Parameter.NaviPH_LoginTime = 4; |
EE_Parameter.Receiver = RECEIVER_SPEKTRUM; |
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; |
EE_Parameter.ExtraConfig = CFG2_HEIGHT_LIMIT;// | CFG2_VARIO_BEEP | CFG_SENSITIVE_RC |
EE_Parameter.Hoehe_MinGas = 30; |
EE_Parameter.MaxHoehe = 255; // Wert : 0-247 255 -> Poti1 |
EE_Parameter.Hoehe_P = 10; // Wert : 0-32 |
EE_Parameter.Luftdruck_D = 30; // Wert : 0-247 |
EE_Parameter.Hoehe_ACC_Wirkung = 30; // Wert : 0-247 |
EE_Parameter.Hoehe_HoverBand = 5; // Wert : 0-247 |
EE_Parameter.Hoehe_GPS_Z = 64; // Wert : 0-247 |
EE_Parameter.Hoehe_StickNeutralPoint = 0;// Wert : 0-247 (0 = Hover-Estimation) |
EE_Parameter.Hoehe_Verstaerkung = 15; // Wert : 0-50 |
EE_Parameter.Stick_P = 8; // Wert : 1-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-247 |
EE_Parameter.GyroAccFaktor = 30; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-247 |
EE_Parameter.Gyro_P = 100; // Wert : 0-247 |
EE_Parameter.Gyro_I = 120; // Wert : 0-247 |
EE_Parameter.Gyro_D = 3; // Wert : 0-247 |
EE_Parameter.Gyro_Gier_P = 100; // Wert : 0-247 |
EE_Parameter.Gyro_Gier_I = 120; // Wert : 0-247 |
EE_Parameter.UnterspannungsWarnung = 33; // Wert : 0-247 ( Automatische Zellenerkennung bei < 50) |
EE_Parameter.NotGas = 35; // Wert : 0-247 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 20; // Wert : 0-247 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.I_Faktor = 16; |
EE_Parameter.UserParam1 = 0; // zur freien Verwendung |
EE_Parameter.UserParam2 = 0; // zur freien Verwendung |
EE_Parameter.UserParam3 = 0; // zur freien Verwendung |
EE_Parameter.UserParam4 = 0; // zur freien Verwendung |
EE_Parameter.UserParam5 = 0; // zur freien Verwendung |
EE_Parameter.UserParam6 = 0; // zur freien Verwendung |
EE_Parameter.UserParam7 = 0; // zur freien Verwendung |
EE_Parameter.UserParam8 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-247 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-247 // Einfluss Gyro/Servo |
EE_Parameter.ServoCompInvert = 1; // Wert : 0-247 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 0; // Wert : 0-247 // Anschlag |
EE_Parameter.ServoNickMax = 247; // Wert : 0-247 // Anschlag |
EE_Parameter.ServoNickRefresh = 6; |
EE_Parameter.Servo3 = 125; |
EE_Parameter.Servo4 = 125; |
EE_Parameter.Servo5 = 125; |
EE_Parameter.ServoRollControl = 100; // Wert : 0-247 // Stellung des Servos |
EE_Parameter.ServoRollComp = 40; // Wert : 0-247 // Einfluss Gyro/Servo |
EE_Parameter.ServoRollMin = 0; // Wert : 0-247 // Anschlag |
EE_Parameter.ServoRollMax = 247; // Wert : 0-247 // Anschlag |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-247 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.BitConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts |
EE_Parameter.AchsKopplung1 = 90; |
EE_Parameter.AchsKopplung2 = 80; |
EE_Parameter.CouplingYawCorrection = 70; |
EE_Parameter.WinkelUmschlagNick = 85; |
EE_Parameter.WinkelUmschlagRoll = 85; |
EE_Parameter.GyroAccAbgleich = 32; // 1/k |
EE_Parameter.Driftkomp = 32; |
EE_Parameter.DynamicStability = 50; |
EE_Parameter.J16Bitmask = 95; |
EE_Parameter.J17Bitmask = 243; |
EE_Parameter.WARN_J16_Bitmask = 0xAA; |
EE_Parameter.WARN_J17_Bitmask = 0xAA; |
EE_Parameter.J16Timing = 30; |
EE_Parameter.J17Timing = 30; |
EE_Parameter.NaviGpsModeControl = 254; // 254 -> Poti 2 |
EE_Parameter.NaviGpsGain = 100; |
EE_Parameter.NaviGpsP = 90; |
EE_Parameter.NaviGpsI = 90; |
EE_Parameter.NaviGpsD = 90; |
EE_Parameter.NaviGpsPLimit = 75; |
EE_Parameter.NaviGpsILimit = 75; |
EE_Parameter.NaviGpsDLimit = 75; |
EE_Parameter.NaviGpsACC = 0; |
EE_Parameter.NaviGpsMinSat = 6; |
EE_Parameter.NaviStickThreshold = 8; |
EE_Parameter.NaviWindCorrection = 90; |
EE_Parameter.NaviSpeedCompensation = 30; |
EE_Parameter.NaviOperatingRadius = 100; |
EE_Parameter.NaviAngleLimitation = 100; |
EE_Parameter.NaviPH_LoginTime = 4; |
EE_Parameter.Receiver = RECEIVER_SPEKTRUM; |
memcpy(EE_Parameter.Name, "Beginner\0", 12); |
} |
/branches/Znib/V0.78f/fc.c |
---|
0,0 → 1,1643 |
/*####################################################################################### |
Flight Control |
#######################################################################################*/ |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) Holger Buss, Ingo Busker |
// + Nur für den privaten Gebrauch / NON-COMMERCIAL USE ONLY |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung oder Nutzung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-commercial use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be |
// + clearly linked as origin |
// + * porting the sources to other systems or using the software on other systems (except hardware from www.mikrokopter.de) is not allowed |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
#include "eeprom.c" |
#include "mymath.h" |
#include "isqrt.h" |
unsigned char h,m,s; |
unsigned int BaroExpandActive = 0; |
volatile unsigned int I2CTimeout = 100; |
int MesswertNick,MesswertRoll,MesswertGier,MesswertGierBias, RohMesswertNick,RohMesswertRoll; |
int TrimNick, TrimRoll; |
int AdNeutralGierBias; |
int AdNeutralNick = 0,AdNeutralRoll = 0,AdNeutralGier = 0,StartNeutralRoll = 0,StartNeutralNick = 0; |
int Mittelwert_AccNick, Mittelwert_AccRoll,Mittelwert_AccHoch, NeutralAccX=0, NeutralAccY=0; |
int NaviAccNick, NaviAccRoll,NaviCntAcc = 0; |
volatile float NeutralAccZ = 0; |
unsigned char CosinusNickWinkel = 0, CosinusRollWinkel = 0; |
long IntegralNick = 0,IntegralNick2 = 0; |
long IntegralRoll = 0,IntegralRoll2 = 0; |
long IntegralAccNick = 0,IntegralAccRoll = 0,IntegralAccZ = 0; |
long Integral_Gier = 0; |
long Mess_IntegralNick = 0,Mess_IntegralNick2 = 0; |
long Mess_IntegralRoll = 0,Mess_IntegralRoll2 = 0; |
long Mess_Integral_Gier = 0,Mess_Integral_Gier2 = 0; |
long MittelIntegralNick,MittelIntegralRoll,MittelIntegralNick2,MittelIntegralRoll2; |
volatile long Mess_Integral_Hoch = 0; |
int KompassValue = 0; |
int KompassStartwert = 0; |
int KompassRichtung = 0; |
unsigned int KompassSignalSchlecht = 500; |
unsigned char MAX_GAS,MIN_GAS; |
unsigned char HoehenReglerAktiv = 0; |
unsigned char TrichterFlug = 0; |
long Umschlag180Nick = 250000L, Umschlag180Roll = 250000L; |
long ErsatzKompass; |
int ErsatzKompassInGrad; // Kompasswert in Grad |
int GierGyroFehler = 0; |
char GyroFaktor,GyroFaktorGier; |
char IntegralFaktor,IntegralFaktorGier; |
int DiffNick,DiffRoll; |
//int Poti1 = 0, Poti2 = 0, Poti3 = 0, Poti4 = 0, Poti5 = 0, Poti6 = 0, Poti7 = 0, Poti8 = 0; |
unsigned char Poti[9] = {0,0,0,0,0,0,0,0}; |
volatile unsigned char SenderOkay = 0; |
volatile unsigned char SenderRSSI = 0; |
int StickNick = 0,StickRoll = 0,StickGier = 0,StickGas = 0; |
char MotorenEin = 0; |
long HoehenWert = 0; |
long SollHoehe = 0; |
int LageKorrekturRoll = 0,LageKorrekturNick = 0; |
//float Ki = FAKTOR_I; |
int Ki = 10300 / 33; |
unsigned char Looping_Nick = 0,Looping_Roll = 0; |
unsigned char Looping_Links = 0, Looping_Rechts = 0, Looping_Unten = 0, Looping_Oben = 0; |
unsigned char Parameter_Luftdruck_D = 48; // Wert : 0-250 |
unsigned char Parameter_MaxHoehe = 251; // Wert : 0-250 |
unsigned char Parameter_Hoehe_P = 16; // Wert : 0-32 |
unsigned char Parameter_Hoehe_ACC_Wirkung = 58; // Wert : 0-250 |
unsigned char Parameter_KompassWirkung = 64; // Wert : 0-250 |
unsigned char Parameter_Hoehe_GPS_Z = 64; // Wert : 0-250 |
unsigned char Parameter_Gyro_D = 8; // Wert : 0-250 |
unsigned char Parameter_Gyro_P = 150; // Wert : 10-250 |
unsigned char Parameter_Gyro_I = 150; // Wert : 0-250 |
unsigned char Parameter_Gyro_Gier_P = 150; // Wert : 10-250 |
unsigned char Parameter_Gyro_Gier_I = 150; // Wert : 10-250 |
unsigned char Parameter_Gier_P = 2; // Wert : 1-20 |
unsigned char Parameter_I_Faktor = 10; // Wert : 1-20 |
unsigned char Parameter_UserParam1 = 0; |
unsigned char Parameter_UserParam2 = 0; |
unsigned char Parameter_UserParam3 = 0; |
unsigned char Parameter_UserParam4 = 0; |
unsigned char Parameter_UserParam5 = 0; |
unsigned char Parameter_UserParam6 = 0; |
unsigned char Parameter_UserParam7 = 0; |
unsigned char Parameter_UserParam8 = 0; |
unsigned char Parameter_ServoNickControl = 100; |
unsigned char Parameter_ServoRollControl = 100; |
unsigned char Parameter_LoopGasLimit = 70; |
unsigned char Parameter_AchsKopplung1 = 90; |
unsigned char Parameter_AchsKopplung2 = 65; |
unsigned char Parameter_CouplingYawCorrection = 64; |
//unsigned char Parameter_AchsGegenKopplung1 = 0; |
unsigned char Parameter_DynamicStability = 100; |
unsigned char Parameter_J16Bitmask; // for the J16 Output |
unsigned char Parameter_J16Timing; // for the J16 Output |
unsigned char Parameter_J17Bitmask; // for the J17 Output |
unsigned char Parameter_J17Timing; // for the J17 Output |
unsigned char Parameter_NaviGpsModeControl; // Parameters for the Naviboard |
unsigned char Parameter_NaviGpsGain; |
unsigned char Parameter_NaviGpsP; |
unsigned char Parameter_NaviGpsI; |
unsigned char Parameter_NaviGpsD; |
unsigned char Parameter_NaviGpsACC; |
unsigned char Parameter_NaviOperatingRadius; |
unsigned char Parameter_NaviWindCorrection; |
unsigned char Parameter_NaviSpeedCompensation; |
unsigned char Parameter_ExternalControl; |
unsigned char Parameter_Servo3,Parameter_Servo4,Parameter_Servo5; |
struct mk_param_struct EE_Parameter; |
signed int ExternStickNick = 0,ExternStickRoll = 0,ExternStickGier = 0, ExternHoehenValue = -20; |
int MaxStickNick = 0,MaxStickRoll = 0; |
unsigned int modell_fliegt = 0; |
volatile unsigned char FCFlags = 0; |
long GIER_GRAD_FAKTOR = 1291; |
signed int KopplungsteilNickRoll,KopplungsteilRollNick; |
signed int tmp_motorwert[MAX_MOTORS]; |
char VarioCharacter = ' '; |
int isCalibrated = 0; // by Znib |
int horizontalGas = K_GIER, horizontalNick = K_ROLL; // by Znib |
#define LIMIT_MIN(value, min) {if(value <= min) value = min;} |
#define LIMIT_MAX(value, max) {if(value >= max) value = max;} |
#define LIMIT_MIN_MAX(value, min, max) {if(value <= min) value = min; else if(value >= max) value = max;} |
int MotorSmoothing(int neu, int alt) |
{ |
int motor; |
if(neu > alt) motor = (1*(int)alt + neu) / 2; |
else motor = neu - (alt - neu)*1; |
//if(Poti2 < 20) return(neu); |
return(motor); |
} |
void Piep(unsigned char Anzahl, unsigned int dauer) |
{ |
if(MotorenEin) return; //auf keinen Fall im Flug! |
while(Anzahl--) |
{ |
beeptime = dauer; |
while(beeptime); |
Delay_ms(dauer * 2); |
} |
} |
//############################################################################ |
// Nullwerte ermitteln |
void SetNeutral(void) |
//############################################################################ |
{ |
unsigned char i; |
unsigned int gier_neutral=0, nick_neutral=0, roll_neutral=0; |
HEF4017R_ON; |
NeutralAccX = 0; |
NeutralAccY = 0; |
NeutralAccZ = 0; |
AdNeutralNick = 0; |
AdNeutralRoll = 0; |
AdNeutralGier = 0; |
AdNeutralGierBias = 0; |
Parameter_AchsKopplung1 = 0; |
Parameter_AchsKopplung2 = 0; |
ExpandBaro = 0; |
CalibrierMittelwert(); |
Delay_ms_Mess(100); |
CalibrierMittelwert(); |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
{ |
if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
} |
#define NEUTRAL_FILTER 32 |
for(i=0; i<NEUTRAL_FILTER; i++) |
{ |
Delay_ms_Mess(10); |
gier_neutral += AdWertGier; |
nick_neutral += AdWertNick; |
roll_neutral += AdWertRoll; |
} |
AdNeutralNick= (nick_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER / 8); |
AdNeutralRoll= (roll_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER / 8); |
AdNeutralGier= (gier_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER); |
AdNeutralGierBias = AdNeutralGier; |
StartNeutralRoll = AdNeutralRoll; |
StartNeutralNick = AdNeutralNick; |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) > 4) |
{ |
NeutralAccY = abs(Mittelwert_AccRoll) / (2*ACC_AMPLIFY); |
NeutralAccX = abs(Mittelwert_AccNick) / (2*ACC_AMPLIFY); |
NeutralAccZ = Aktuell_az; |
} |
else |
{ |
NeutralAccX = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK+1]); |
NeutralAccY = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL+1]); |
NeutralAccZ = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_Z]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_Z+1]); |
} |
MesswertNick = 0; |
MesswertRoll = 0; |
MesswertGier = 0; |
Delay_ms_Mess(100); |
Mittelwert_AccNick = ACC_AMPLIFY * (long)AdWertAccNick; |
Mittelwert_AccRoll = ACC_AMPLIFY * (long)AdWertAccRoll; |
IntegralNick = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccNick; |
IntegralRoll = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccRoll; |
Mess_IntegralNick2 = IntegralNick; |
Mess_IntegralRoll2 = IntegralRoll; |
Mess_Integral_Gier = 0; |
StartLuftdruck = Luftdruck; |
VarioMeter = 0; |
Mess_Integral_Hoch = 0; |
KompassStartwert = KompassValue; |
GPS_Neutral(); |
beeptime = 50; |
Umschlag180Nick = ((long) EE_Parameter.WinkelUmschlagNick * 2500L) + 15000L; |
Umschlag180Roll = ((long) EE_Parameter.WinkelUmschlagRoll * 2500L) + 15000L; |
ExternHoehenValue = 0; |
ErsatzKompass = KompassValue * GIER_GRAD_FAKTOR; |
GierGyroFehler = 0; |
SendVersionToNavi = 1; |
LED_Init(); |
FCFlags |= FCFLAG_CALIBRATE; |
FromNaviCtrl_Value.Kalman_K = -1; |
FromNaviCtrl_Value.Kalman_MaxDrift = 0; |
FromNaviCtrl_Value.Kalman_MaxFusion = 32; |
for(i=0;i<8;i++) |
{ |
Poti[i] = PPM_in[EE_Parameter.Kanalbelegung[K_POTI1 + i]] + 110; |
} |
SenderOkay = 100; |
if(ServoActive) |
{ |
HEF4017R_ON; |
DDRD |=0x80; // enable J7 -> Servo signal |
} |
} |
//############################################################################ |
// Bearbeitet die Messwerte |
void Mittelwert(void) |
//############################################################################ |
{ |
static signed long tmpl,tmpl2,tmpl3,tmpl4; |
static signed int oldNick, oldRoll, d2Roll, d2Nick; |
signed long winkel_nick, winkel_roll; |
unsigned char i; |
MesswertGier = (signed int) AdNeutralGier - AdWertGier; |
// MesswertGierBias = (signed int) AdNeutralGierBias - AdWertGier; |
MesswertNick = (signed int) AdWertNickFilter / 8; |
MesswertRoll = (signed int) AdWertRollFilter / 8; |
RohMesswertNick = MesswertNick; |
RohMesswertRoll = MesswertRoll; |
// Beschleunigungssensor ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mittelwert_AccNick = ((long)Mittelwert_AccNick * 3 + ((ACC_AMPLIFY * (long)AdWertAccNick))) / 4L; |
Mittelwert_AccRoll = ((long)Mittelwert_AccRoll * 3 + ((ACC_AMPLIFY * (long)AdWertAccRoll))) / 4L; |
Mittelwert_AccHoch = ((long)Mittelwert_AccHoch * 3 + ((long)AdWertAccHoch)) / 4L; |
IntegralAccNick += ACC_AMPLIFY * AdWertAccNick; |
IntegralAccRoll += ACC_AMPLIFY * AdWertAccRoll; |
NaviAccNick += AdWertAccNick; |
NaviAccRoll += AdWertAccRoll; |
NaviCntAcc++; |
IntegralAccZ += Aktuell_az - NeutralAccZ; |
//++++++++++++++++++++++++++++++++++++++++++++++++ |
// ADC einschalten |
ANALOG_ON; |
AdReady = 0; |
//++++++++++++++++++++++++++++++++++++++++++++++++ |
if(Mess_IntegralRoll > 93000L) winkel_roll = 93000L; |
else if(Mess_IntegralRoll <-93000L) winkel_roll = -93000L; |
else winkel_roll = Mess_IntegralRoll; |
if(Mess_IntegralNick > 93000L) winkel_nick = 93000L; |
else if(Mess_IntegralNick <-93000L) winkel_nick = -93000L; |
else winkel_nick = Mess_IntegralNick; |
// Gier ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mess_Integral_Gier += MesswertGier; |
ErsatzKompass += MesswertGier; |
// Kopplungsanteil +++++++++++++++++++++++++++++++++++++ |
if(!Looping_Nick && !Looping_Roll && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV)) |
{ |
tmpl3 = (MesswertRoll * winkel_nick) / 2048L; |
tmpl3 *= Parameter_AchsKopplung2; //65 |
tmpl3 /= 4096L; |
tmpl4 = (MesswertNick * winkel_roll) / 2048L; |
tmpl4 *= Parameter_AchsKopplung2; //65 |
tmpl4 /= 4096L; |
KopplungsteilNickRoll = tmpl3; |
KopplungsteilRollNick = tmpl4; |
tmpl4 -= tmpl3; |
ErsatzKompass += tmpl4; |
if(!Parameter_CouplingYawCorrection) Mess_Integral_Gier -= tmpl4/2; // Gier nachhelfen |
tmpl = ((MesswertGier + tmpl4) * winkel_nick) / 2048L; |
tmpl *= Parameter_AchsKopplung1; // 90 |
tmpl /= 4096L; |
tmpl2 = ((MesswertGier + tmpl4) * winkel_roll) / 2048L; |
tmpl2 *= Parameter_AchsKopplung1; |
tmpl2 /= 4096L; |
if(abs(MesswertGier) > 64) if(labs(tmpl) > 128 || labs(tmpl2) > 128) TrichterFlug = 1; |
//MesswertGier += (Parameter_CouplingYawCorrection * tmpl4) / 256; |
} |
else tmpl = tmpl2 = KopplungsteilNickRoll = KopplungsteilRollNick = 0; |
TrimRoll = tmpl - tmpl2 / 100L; |
TrimNick = -tmpl2 + tmpl / 100L; |
// Kompasswert begrenzen ++++++++++++++++++++++++++++++++++++++++++++++++ |
if(ErsatzKompass >= (360L * GIER_GRAD_FAKTOR)) ErsatzKompass -= 360L * GIER_GRAD_FAKTOR; // 360° Umschlag |
if(ErsatzKompass < 0) ErsatzKompass += 360L * GIER_GRAD_FAKTOR; |
// Roll ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mess_IntegralRoll2 += MesswertRoll + TrimRoll; |
Mess_IntegralRoll += MesswertRoll + TrimRoll - LageKorrekturRoll; |
if(Mess_IntegralRoll > Umschlag180Roll) |
{ |
Mess_IntegralRoll = -(Umschlag180Roll - 25000L); |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
} |
if(Mess_IntegralRoll <-Umschlag180Roll) |
{ |
Mess_IntegralRoll = (Umschlag180Roll - 25000L); |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
} |
// Nick ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mess_IntegralNick2 += MesswertNick + TrimNick; |
Mess_IntegralNick += MesswertNick + TrimNick - LageKorrekturNick; |
if(Mess_IntegralNick > Umschlag180Nick) |
{ |
Mess_IntegralNick = -(Umschlag180Nick - 25000L); |
Mess_IntegralNick2 = Mess_IntegralNick; |
} |
if(Mess_IntegralNick <-Umschlag180Nick) |
{ |
Mess_IntegralNick = (Umschlag180Nick - 25000L); |
Mess_IntegralNick2 = Mess_IntegralNick; |
} |
Integral_Gier = Mess_Integral_Gier; |
IntegralNick = Mess_IntegralNick; |
IntegralRoll = Mess_IntegralRoll; |
IntegralNick2 = Mess_IntegralNick2; |
IntegralRoll2 = Mess_IntegralRoll2; |
#define D_LIMIT 128 |
MesswertNick = HiResNick / 8; |
MesswertRoll = HiResRoll / 8; |
if(AdWertNick < 15) MesswertNick = -1000; if(AdWertNick < 7) MesswertNick = -2000; |
if(PlatinenVersion == 10) { if(AdWertNick > 1010) MesswertNick = +1000; if(AdWertNick > 1017) MesswertNick = +2000; } |
else { if(AdWertNick > 2000) MesswertNick = +1000; if(AdWertNick > 2015) MesswertNick = +2000; } |
if(AdWertRoll < 15) MesswertRoll = -1000; if(AdWertRoll < 7) MesswertRoll = -2000; |
if(PlatinenVersion == 10) { if(AdWertRoll > 1010) MesswertRoll = +1000; if(AdWertRoll > 1017) MesswertRoll = +2000; } |
else { if(AdWertRoll > 2000) MesswertRoll = +1000; if(AdWertRoll > 2015) MesswertRoll = +2000; } |
if(Parameter_Gyro_D) |
{ |
d2Nick = HiResNick - oldNick; |
oldNick = (oldNick + HiResNick)/2; |
if(d2Nick > D_LIMIT) d2Nick = D_LIMIT; |
else if(d2Nick < -D_LIMIT) d2Nick = -D_LIMIT; |
MesswertNick += (d2Nick * (signed int) Parameter_Gyro_D) / 16; |
d2Roll = HiResRoll - oldRoll; |
oldRoll = (oldRoll + HiResRoll)/2; |
if(d2Roll > D_LIMIT) d2Roll = D_LIMIT; |
else if(d2Roll < -D_LIMIT) d2Roll = -D_LIMIT; |
MesswertRoll += (d2Roll * (signed int) Parameter_Gyro_D) / 16; |
HiResNick += (d2Nick * (signed int) Parameter_Gyro_D); |
HiResRoll += (d2Roll * (signed int) Parameter_Gyro_D); |
} |
if(RohMesswertRoll > 0) TrimRoll += ((long) abs(KopplungsteilNickRoll) * Parameter_CouplingYawCorrection) / 64L; |
else TrimRoll -= ((long) abs(KopplungsteilNickRoll) * Parameter_CouplingYawCorrection) / 64L; |
if(RohMesswertNick > 0) TrimNick += ((long) abs(KopplungsteilRollNick) * Parameter_CouplingYawCorrection) / 64L; |
else TrimNick -= ((long) abs(KopplungsteilRollNick) * Parameter_CouplingYawCorrection) / 64L; |
if(EE_Parameter.GlobalConfig & CFG_DREHRATEN_BEGRENZER && !Looping_Nick && !Looping_Roll) |
{ |
if(RohMesswertNick > 256) MesswertNick += 1 * (RohMesswertNick - 256); |
else if(RohMesswertNick < -256) MesswertNick += 1 * (RohMesswertNick + 256); |
if(RohMesswertRoll > 256) MesswertRoll += 1 * (RohMesswertRoll - 256); |
else if(RohMesswertRoll < -256) MesswertRoll += 1 * (RohMesswertRoll + 256); |
} |
for(i=0;i<8;i++) |
{ |
int tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_POTI1 + i]] + 110; |
if(tmp > 255) tmp = 255; else if(tmp < 0) tmp = 0; |
if(tmp != Poti[i]) |
{ |
Poti[i] += (tmp - Poti[i]) / 8; |
if(Poti[i] > tmp) Poti[i]--; |
else Poti[i]++; |
} |
} |
} |
//############################################################################ |
// Messwerte beim Ermitteln der Nullage |
void CalibrierMittelwert(void) |
//############################################################################ |
{ |
unsigned char i; |
if(PlatinenVersion == 13) SucheGyroOffset(); |
// ADC auschalten, damit die Werte sich nicht während der Berechnung ändern |
ANALOG_OFF; |
MesswertNick = AdWertNick; |
MesswertRoll = AdWertRoll; |
MesswertGier = AdWertGier; |
Mittelwert_AccNick = ACC_AMPLIFY * (long)AdWertAccNick; |
Mittelwert_AccRoll = ACC_AMPLIFY * (long)AdWertAccRoll; |
Mittelwert_AccHoch = (long)AdWertAccHoch; |
// ADC einschalten |
ANALOG_ON; |
for(i=0;i<8;i++) |
{ |
int tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_POTI1 + i]] + 110; |
LIMIT_MIN_MAX(tmp, 0, 255); |
if(Poti[i] > tmp) Poti[i]--; else if(Poti[i] < tmp) Poti[i]++; |
} |
Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L; |
Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagRoll * 2500L; |
} |
//############################################################################ |
// Senden der Motorwerte per I2C-Bus |
void SendMotorData(void) |
//############################################################################ |
{ |
unsigned char i; |
if(!MotorenEin) |
{ |
FCFlags &= ~(FCFLAG_MOTOR_RUN | FCFLAG_FLY); |
for(i=0;i<MAX_MOTORS;i++) |
{ |
if(!PC_MotortestActive) MotorTest[i] = 0; |
Motor[i].SetPoint = MotorTest[i]; |
} |
if(PC_MotortestActive) PC_MotortestActive--; |
} |
else FCFlags |= FCFLAG_MOTOR_RUN; |
DebugOut.Analog[12] = Motor[0].SetPoint; |
DebugOut.Analog[13] = Motor[1].SetPoint; |
DebugOut.Analog[14] = Motor[2].SetPoint; |
DebugOut.Analog[15] = Motor[3].SetPoint; |
//Start I2C Interrupt Mode |
twi_state = 0; |
motor = 0; |
i2c_start(); |
} |
//############################################################################ |
// Trägt ggf. das Poti als Parameter ein |
void ParameterZuordnung(void) |
//############################################################################ |
{ |
#define CHK_POTI(b,a) {if(a < 248) b = a; else b = Poti[255 - a];} |
#define CHK_POTI_MM(b,a,min,max) {CHK_POTI(b,a); LIMIT_MIN_MAX(b, min, max);} |
CHK_POTI_MM(Parameter_Luftdruck_D,EE_Parameter.Luftdruck_D,0,100); |
CHK_POTI_MM(Parameter_Hoehe_P,EE_Parameter.Hoehe_P,0,100); |
CHK_POTI_MM(Parameter_Gyro_P,EE_Parameter.Gyro_P,10,255); |
CHK_POTI_MM(Parameter_J16Timing,EE_Parameter.J16Timing,1,255); |
CHK_POTI_MM(Parameter_J17Timing,EE_Parameter.J17Timing,1,255); |
CHK_POTI(Parameter_Servo3,EE_Parameter.Servo3); |
CHK_POTI(Parameter_Servo4,EE_Parameter.Servo4); |
CHK_POTI(Parameter_Servo5,EE_Parameter.Servo5); |
CHK_POTI(Parameter_MaxHoehe,EE_Parameter.MaxHoehe); |
CHK_POTI(Parameter_MaxHoehe,EE_Parameter.MaxHoehe); |
CHK_POTI(Parameter_Hoehe_ACC_Wirkung,EE_Parameter.Hoehe_ACC_Wirkung); |
CHK_POTI(Parameter_Hoehe_GPS_Z,EE_Parameter.Hoehe_GPS_Z); |
CHK_POTI(Parameter_KompassWirkung,EE_Parameter.KompassWirkung); |
CHK_POTI(Parameter_Gyro_I,EE_Parameter.Gyro_I); |
CHK_POTI(Parameter_Gyro_D,EE_Parameter.Gyro_D); |
CHK_POTI(Parameter_Gyro_Gier_P,EE_Parameter.Gyro_Gier_P); |
CHK_POTI(Parameter_Gyro_Gier_I,EE_Parameter.Gyro_Gier_I); |
CHK_POTI(Parameter_I_Faktor,EE_Parameter.I_Faktor); |
CHK_POTI(Parameter_UserParam1,EE_Parameter.UserParam1); |
CHK_POTI(Parameter_UserParam2,EE_Parameter.UserParam2); |
CHK_POTI(Parameter_UserParam3,EE_Parameter.UserParam3); |
CHK_POTI(Parameter_UserParam4,EE_Parameter.UserParam4); |
CHK_POTI(Parameter_UserParam5,EE_Parameter.UserParam5); |
CHK_POTI(Parameter_UserParam6,EE_Parameter.UserParam6); |
CHK_POTI(Parameter_UserParam7,EE_Parameter.UserParam7); |
CHK_POTI(Parameter_UserParam8,EE_Parameter.UserParam8); |
CHK_POTI(Parameter_ServoNickControl,EE_Parameter.ServoNickControl); |
CHK_POTI(Parameter_ServoRollControl,EE_Parameter.ServoRollControl); |
CHK_POTI(Parameter_LoopGasLimit,EE_Parameter.LoopGasLimit); |
CHK_POTI(Parameter_AchsKopplung1, EE_Parameter.AchsKopplung1); |
CHK_POTI(Parameter_AchsKopplung2, EE_Parameter.AchsKopplung2); |
CHK_POTI(Parameter_CouplingYawCorrection,EE_Parameter.CouplingYawCorrection); |
// CHK_POTI(Parameter_AchsGegenKopplung1,EE_Parameter.AchsGegenKopplung1,0,255); |
CHK_POTI(Parameter_DynamicStability,EE_Parameter.DynamicStability); |
CHK_POTI(Parameter_ExternalControl,EE_Parameter.ExternalControl); |
Ki = 10300 / (Parameter_I_Faktor + 1); |
MAX_GAS = EE_Parameter.Gas_Max; |
MIN_GAS = EE_Parameter.Gas_Min; |
// by Znib |
if (Parameter_UserParam1 == 1 || Parameter_UserParam1 == 4) |
{ |
// mode 1 oder 4 |
horizontalGas = K_ROLL; |
horizontalNick = K_GIER; |
} |
else |
{ |
horizontalGas = K_GIER; |
horizontalNick = K_ROLL; |
} |
} |
//############################################################################ |
// |
void MotorRegler(void) |
//############################################################################ |
{ |
int pd_ergebnis_nick,pd_ergebnis_roll,tmp_int, tmp_int2; |
int GierMischanteil,GasMischanteil; |
static long SummeNick=0,SummeRoll=0; |
static long sollGier = 0,tmp_long,tmp_long2; |
static long IntegralFehlerNick = 0; |
static long IntegralFehlerRoll = 0; |
static unsigned int RcLostTimer; |
static unsigned char delay_neutral = 0; |
static unsigned char delay_einschalten = 0,delay_ausschalten = 0; |
static char TimerWerteausgabe = 0; |
static char NeueKompassRichtungMerken = 0; |
static long ausgleichNick, ausgleichRoll; |
int IntegralNickMalFaktor,IntegralRollMalFaktor; |
unsigned char i; |
Mittelwert(); |
GRN_ON; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gaswert ermitteln |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
GasMischanteil = StickGas; |
if(GasMischanteil < MIN_GAS + 10) GasMischanteil = MIN_GAS + 10; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Empfang schlecht |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(SenderOkay < 100) |
{ |
if(RcLostTimer) RcLostTimer--; |
else |
{ |
MotorenEin = 0; |
FCFlags &= ~FCFLAG_NOTLANDUNG; |
} |
ROT_ON; |
if(modell_fliegt > 1000) // wahrscheinlich in der Luft --> langsam absenken |
{ |
GasMischanteil = EE_Parameter.NotGas; |
FCFlags |= FCFLAG_NOTLANDUNG; |
PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] = 0; |
PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] = 0; |
PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] = 0; |
PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] = 0; |
PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] = 0; |
} |
else MotorenEin = 0; |
} |
else |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Emfang gut |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(SenderOkay > 140) |
{ |
FCFlags &= ~FCFLAG_NOTLANDUNG; |
RcLostTimer = EE_Parameter.NotGasZeit * 50; |
if(GasMischanteil > 40 && MotorenEin) |
{ |
if(modell_fliegt < 0xffff) modell_fliegt++; |
} |
if((modell_fliegt < 256)) |
{ |
SummeNick = 0; |
SummeRoll = 0; |
if(modell_fliegt == 250) |
{ |
NeueKompassRichtungMerken = 1; |
sollGier = 0; |
Mess_Integral_Gier = 0; |
// Mess_Integral_Gier2 = 0; |
} |
} else FCFlags |= FCFLAG_FLY; |
if((PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] > 80) && MotorenEin == 0) |
{ |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// auf Nullwerte kalibrieren |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(PPM_in[EE_Parameter.Kanalbelegung[horizontalGas]] > 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[horizontalNick]]) > 70) |
{ |
unsigned char setting=1; |
if(PPM_in[EE_Parameter.Kanalbelegung[horizontalNick]] > 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < 70) setting = 1; |
if(PPM_in[EE_Parameter.Kanalbelegung[horizontalNick]] > 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 2; |
if(PPM_in[EE_Parameter.Kanalbelegung[horizontalNick]] < 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 3; |
if(PPM_in[EE_Parameter.Kanalbelegung[horizontalNick]] <-70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 4; |
if(PPM_in[EE_Parameter.Kanalbelegung[horizontalNick]] <-70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < 70) setting = 5; |
SetActiveParamSetNumber(setting); // aktiven Datensatz merken |
} |
// else |
if(abs(PPM_in[EE_Parameter.Kanalbelegung[horizontalNick]]) < 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); |
LipoDetection(0); |
LIBFC_ReceiverInit(); |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
{ |
if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
} |
ServoActive = 0; |
SetNeutral(); |
ServoActive = 1; |
isCalibrated = 1; // by Znib |
DDRD |=0x80; // enable J7 -> Servo signal |
Piep(GetActiveParamSetNumber(),120); |
} |
} |
} |
else |
if(PPM_in[EE_Parameter.Kanalbelegung[horizontalGas]] < -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(),120); |
} |
} |
else delay_neutral = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gas ist unten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] < 35-120) |
{ |
// Motoren Starten |
if(!MotorenEin) |
{ |
if(PPM_in[EE_Parameter.Kanalbelegung[horizontalGas]] < -75 && |
(Parameter_UserParam2 == 0 || isCalibrated == 1)) |
{ |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Einschalten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(++delay_einschalten > 200) |
{ |
delay_einschalten = 0; |
modell_fliegt = 1; |
MotorenEin = 1; |
sollGier = 0; |
Mess_Integral_Gier = 0; |
Mess_Integral_Gier2 = 0; |
Mess_IntegralNick = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccNick; |
Mess_IntegralRoll = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccRoll; |
Mess_IntegralNick2 = IntegralNick; |
Mess_IntegralRoll2 = IntegralRoll; |
SummeNick = 0; |
SummeRoll = 0; |
FCFlags |= FCFLAG_START; |
} |
} |
else delay_einschalten = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Auschalten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
else // only if motors are running |
{ |
if(PPM_in[EE_Parameter.Kanalbelegung[horizontalGas]] > 75) |
{ |
if(++delay_ausschalten > 200) // nicht sofort |
{ |
MotorenEin = 0; |
delay_ausschalten = 0; |
modell_fliegt = 0; |
} |
} |
else delay_ausschalten = 0; |
} |
} |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// neue Werte von der Funke |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!NewPpmData-- || (FCFlags & FCFLAG_NOTLANDUNG)) |
{ |
static int stick_nick,stick_roll; |
ParameterZuordnung(); |
stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4; |
stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; |
StickNick = stick_nick - (GPS_Nick + GPS_Nick2); |
stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4; |
stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; |
StickRoll = stick_roll - (GPS_Roll + GPS_Roll2); |
StickGier = -PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]; |
if(StickGier > 2) StickGier -= 2; else |
if(StickGier < -2) StickGier += 2; else StickGier = 0; |
StickGas = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] + 120; |
GyroFaktor = (Parameter_Gyro_P + 10.0); |
IntegralFaktor = Parameter_Gyro_I; |
GyroFaktorGier = (Parameter_Gyro_Gier_P + 10.0); |
IntegralFaktorGier = Parameter_Gyro_Gier_I; |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//+ Analoge Steuerung per Seriell |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(ExternControl.Config & 0x01 && Parameter_ExternalControl > 128) |
{ |
StickNick += (int) ExternControl.Nick * (int) EE_Parameter.Stick_P; |
StickRoll += (int) ExternControl.Roll * (int) EE_Parameter.Stick_P; |
StickGier += ExternControl.Gier; |
ExternHoehenValue = (int) ExternControl.Hight * (int)EE_Parameter.Hoehe_Verstaerkung; |
if(ExternControl.Gas < StickGas) StickGas = ExternControl.Gas; |
} |
if(StickGas < 0) StickGas = 0; |
if(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) IntegralFaktor = 0; |
//if(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(FCFlags & FCFLAG_NOTLANDUNG) {MaxStickNick = 0; MaxStickRoll = 0;} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Looping? |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > EE_Parameter.LoopThreshold) && EE_Parameter.BitConfig & CFG_LOOP_LINKS) Looping_Links = 1; |
else |
{ |
{ |
if((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < (EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese))) Looping_Links = 0; |
} |
} |
if((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < -EE_Parameter.LoopThreshold) && EE_Parameter.BitConfig & CFG_LOOP_RECHTS) Looping_Rechts = 1; |
else |
{ |
if(Looping_Rechts) // Hysterese |
{ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > -(EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese)) Looping_Rechts = 0; |
} |
} |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > EE_Parameter.LoopThreshold) && EE_Parameter.BitConfig & CFG_LOOP_OBEN) Looping_Oben = 1; |
else |
{ |
if(Looping_Oben) // Hysterese |
{ |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < (EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese))) Looping_Oben = 0; |
} |
} |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < -EE_Parameter.LoopThreshold) && EE_Parameter.BitConfig & CFG_LOOP_UNTEN) Looping_Unten = 1; |
else |
{ |
if(Looping_Unten) // Hysterese |
{ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > -(EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese)) Looping_Unten = 0; |
} |
} |
if(Looping_Links || Looping_Rechts) Looping_Roll = 1; else Looping_Roll = 0; |
if(Looping_Oben || Looping_Unten) { Looping_Nick = 1; Looping_Roll = 0; Looping_Links = 0; Looping_Rechts = 0;} else Looping_Nick = 0; |
} // Ende neue Funken-Werte |
if(Looping_Roll || Looping_Nick) |
{ |
if(GasMischanteil > EE_Parameter.LoopGasLimit) GasMischanteil = EE_Parameter.LoopGasLimit; |
TrichterFlug = 1; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Bei Empfangsausfall im Flug |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(FCFlags & FCFLAG_NOTLANDUNG) |
{ |
StickGier = 0; |
StickNick = 0; |
StickRoll = 0; |
GyroFaktor = 90; |
IntegralFaktor = 120; |
GyroFaktorGier = 90; |
IntegralFaktorGier = 120; |
Looping_Roll = 0; |
Looping_Nick = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Integrale auf ACC-Signal abgleichen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define ABGLEICH_ANZAHL 256L |
MittelIntegralNick += IntegralNick; // Für die Mittelwertbildung aufsummieren |
MittelIntegralRoll += IntegralRoll; |
MittelIntegralNick2 += IntegralNick2; |
MittelIntegralRoll2 += IntegralRoll2; |
if(Looping_Nick || Looping_Roll) |
{ |
IntegralAccNick = 0; |
IntegralAccRoll = 0; |
MittelIntegralNick = 0; |
MittelIntegralRoll = 0; |
MittelIntegralNick2 = 0; |
MittelIntegralRoll2 = 0; |
Mess_IntegralNick2 = Mess_IntegralNick; |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
ZaehlMessungen = 0; |
LageKorrekturNick = 0; |
LageKorrekturRoll = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!Looping_Nick && !Looping_Roll && (Aktuell_az > 512 || MotorenEin)) |
{ |
long tmp_long, tmp_long2; |
if(FromNaviCtrl_Value.Kalman_K != -1 /*&& !TrichterFlug*/) |
{ |
tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick); |
tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll); |
tmp_long = (tmp_long * FromNaviCtrl_Value.Kalman_K) / (32 * 16); |
tmp_long2 = (tmp_long2 * FromNaviCtrl_Value.Kalman_K) / (32 * 16); |
if((MaxStickNick > 64) || (MaxStickRoll > 64)) |
{ |
tmp_long /= 2; |
tmp_long2 /= 2; |
} |
if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25) |
{ |
tmp_long /= 3; |
tmp_long2 /= 3; |
} |
if(tmp_long > (long) FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long = (long) FromNaviCtrl_Value.Kalman_MaxFusion; |
if(tmp_long < (long)-FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long = (long)-FromNaviCtrl_Value.Kalman_MaxFusion; |
if(tmp_long2 > (long) FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long2 = (long) FromNaviCtrl_Value.Kalman_MaxFusion; |
if(tmp_long2 < (long)-FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long2 = (long)-FromNaviCtrl_Value.Kalman_MaxFusion; |
} |
else |
{ |
tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick); |
tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll); |
tmp_long /= 16; |
tmp_long2 /= 16; |
if((MaxStickNick > 64) || (MaxStickRoll > 64)) |
{ |
tmp_long /= 3; |
tmp_long2 /= 3; |
} |
if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25) |
{ |
tmp_long /= 3; |
tmp_long2 /= 3; |
} |
#define AUSGLEICH 32 |
if(tmp_long > AUSGLEICH) tmp_long = AUSGLEICH; |
if(tmp_long < -AUSGLEICH) tmp_long =-AUSGLEICH; |
if(tmp_long2 > AUSGLEICH) tmp_long2 = AUSGLEICH; |
if(tmp_long2 <-AUSGLEICH) tmp_long2 =-AUSGLEICH; |
} |
//if(Poti2 > 20) { tmp_long = 0; tmp_long2 = 0;} |
Mess_IntegralNick -= tmp_long; |
Mess_IntegralRoll -= tmp_long2; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(ZaehlMessungen >= ABGLEICH_ANZAHL) |
{ |
static int cnt = 0; |
static char last_n_p,last_n_n,last_r_p,last_r_n; |
static long MittelIntegralNick_Alt,MittelIntegralRoll_Alt; |
if(!Looping_Nick && !Looping_Roll && !TrichterFlug && EE_Parameter.Driftkomp) |
{ |
MittelIntegralNick /= ABGLEICH_ANZAHL; |
MittelIntegralRoll /= ABGLEICH_ANZAHL; |
IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL; |
IntegralAccRoll = (EE_Parameter.GyroAccFaktor * IntegralAccRoll) / ABGLEICH_ANZAHL; |
IntegralAccZ = IntegralAccZ / ABGLEICH_ANZAHL; |
#define MAX_I 0//(Poti2/10) |
// Nick ++++++++++++++++++++++++++++++++++++++++++++++++ |
IntegralFehlerNick = (long)(MittelIntegralNick - (long)IntegralAccNick); |
ausgleichNick = IntegralFehlerNick / EE_Parameter.GyroAccAbgleich; |
// Roll ++++++++++++++++++++++++++++++++++++++++++++++++ |
IntegralFehlerRoll = (long)(MittelIntegralRoll - (long)IntegralAccRoll); |
ausgleichRoll = IntegralFehlerRoll / EE_Parameter.GyroAccAbgleich; |
LageKorrekturNick = ausgleichNick / ABGLEICH_ANZAHL; |
LageKorrekturRoll = ausgleichRoll / ABGLEICH_ANZAHL; |
if(((MaxStickNick > 64) || (MaxStickRoll > 64) || (abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25)) && (FromNaviCtrl_Value.Kalman_K == -1)) |
{ |
LageKorrekturNick /= 2; |
LageKorrekturRoll /= 2; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gyro-Drift ermitteln |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
MittelIntegralNick2 /= ABGLEICH_ANZAHL; |
MittelIntegralRoll2 /= ABGLEICH_ANZAHL; |
tmp_long = IntegralNick2 - IntegralNick; |
tmp_long2 = IntegralRoll2 - IntegralRoll; |
//DebugOut.Analog[25] = MittelIntegralRoll2 / 26; |
IntegralFehlerNick = tmp_long; |
IntegralFehlerRoll = tmp_long2; |
Mess_IntegralNick2 -= IntegralFehlerNick; |
Mess_IntegralRoll2 -= IntegralFehlerRoll; |
if(EE_Parameter.Driftkomp) |
{ |
if(GierGyroFehler > ABGLEICH_ANZAHL/2) { AdNeutralGier++; AdNeutralGierBias++; } |
if(GierGyroFehler <-ABGLEICH_ANZAHL/2) { AdNeutralGier--; AdNeutralGierBias--; } |
} |
GierGyroFehler = 0; |
#define FEHLER_LIMIT (ABGLEICH_ANZAHL / 2) |
#define FEHLER_LIMIT1 (ABGLEICH_ANZAHL * 2) //4 |
#define FEHLER_LIMIT2 (ABGLEICH_ANZAHL * 16) //16 |
#define BEWEGUNGS_LIMIT 20000 |
// Nick +++++++++++++++++++++++++++++++++++++++++++++++++ |
cnt = 1;// + labs(IntegralFehlerNick) / 4096; |
if(labs(IntegralFehlerNick) > FEHLER_LIMIT1) cnt = 4; |
if(labs(MittelIntegralNick_Alt - MittelIntegralNick) < BEWEGUNGS_LIMIT || (FromNaviCtrl_Value.Kalman_MaxDrift > 3*8)) |
{ |
if(IntegralFehlerNick > FEHLER_LIMIT2) |
{ |
if(last_n_p) |
{ |
cnt += labs(IntegralFehlerNick) / (FEHLER_LIMIT2 / 8); |
ausgleichNick = IntegralFehlerNick / 8; |
if(ausgleichNick > 5000) ausgleichNick = 5000; |
LageKorrekturNick += ausgleichNick / ABGLEICH_ANZAHL; |
} |
else last_n_p = 1; |
} else last_n_p = 0; |
if(IntegralFehlerNick < -FEHLER_LIMIT2) |
{ |
if(last_n_n) |
{ |
cnt += labs(IntegralFehlerNick) / (FEHLER_LIMIT2 / 8); |
ausgleichNick = IntegralFehlerNick / 8; |
if(ausgleichNick < -5000) ausgleichNick = -5000; |
LageKorrekturNick += ausgleichNick / ABGLEICH_ANZAHL; |
} |
else last_n_n = 1; |
} else last_n_n = 0; |
} |
else |
{ |
cnt = 0; |
KompassSignalSchlecht = 1000; |
} |
if(cnt > EE_Parameter.Driftkomp) cnt = EE_Parameter.Driftkomp; |
if(FromNaviCtrl_Value.Kalman_MaxDrift) if(cnt > FromNaviCtrl_Value.Kalman_MaxDrift) cnt = FromNaviCtrl_Value.Kalman_MaxDrift; |
if(IntegralFehlerNick > FEHLER_LIMIT) AdNeutralNick += cnt; |
if(IntegralFehlerNick < -FEHLER_LIMIT) AdNeutralNick -= cnt; |
// Roll +++++++++++++++++++++++++++++++++++++++++++++++++ |
cnt = 1;// + labs(IntegralFehlerNick) / 4096; |
if(labs(IntegralFehlerRoll) > FEHLER_LIMIT1) cnt = 4; |
ausgleichRoll = 0; |
if(labs(MittelIntegralRoll_Alt - MittelIntegralRoll) < BEWEGUNGS_LIMIT || (FromNaviCtrl_Value.Kalman_MaxDrift > 3*8)) |
{ |
if(IntegralFehlerRoll > FEHLER_LIMIT2) |
{ |
if(last_r_p) |
{ |
cnt += labs(IntegralFehlerRoll) / (FEHLER_LIMIT2 / 8); |
ausgleichRoll = IntegralFehlerRoll / 8; |
if(ausgleichRoll > 5000) ausgleichRoll = 5000; |
LageKorrekturRoll += ausgleichRoll / ABGLEICH_ANZAHL; |
} |
else last_r_p = 1; |
} else last_r_p = 0; |
if(IntegralFehlerRoll < -FEHLER_LIMIT2) |
{ |
if(last_r_n) |
{ |
cnt += labs(IntegralFehlerRoll) / (FEHLER_LIMIT2 / 8); |
ausgleichRoll = IntegralFehlerRoll / 8; |
if(ausgleichRoll < -5000) ausgleichRoll = -5000; |
LageKorrekturRoll += ausgleichRoll / ABGLEICH_ANZAHL; |
} |
else last_r_n = 1; |
} else last_r_n = 0; |
} else |
{ |
cnt = 0; |
KompassSignalSchlecht = 1000; |
} |
if(cnt > EE_Parameter.Driftkomp) cnt = EE_Parameter.Driftkomp; |
if(FromNaviCtrl_Value.Kalman_MaxDrift) if(cnt > FromNaviCtrl_Value.Kalman_MaxDrift) cnt = FromNaviCtrl_Value.Kalman_MaxDrift; |
if(IntegralFehlerRoll > FEHLER_LIMIT) AdNeutralRoll += cnt; |
if(IntegralFehlerRoll < -FEHLER_LIMIT) AdNeutralRoll -= cnt; |
} |
else |
{ |
LageKorrekturRoll = 0; |
LageKorrekturNick = 0; |
TrichterFlug = 0; |
} |
if(!IntegralFaktor) { LageKorrekturRoll = 0; LageKorrekturNick = 0;} // z.B. bei HH |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++ |
MittelIntegralNick_Alt = MittelIntegralNick; |
MittelIntegralRoll_Alt = MittelIntegralRoll; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++ |
IntegralAccNick = 0; |
IntegralAccRoll = 0; |
IntegralAccZ = 0; |
MittelIntegralNick = 0; |
MittelIntegralRoll = 0; |
MittelIntegralNick2 = 0; |
MittelIntegralRoll2 = 0; |
ZaehlMessungen = 0; |
} // ZaehlMessungen >= ABGLEICH_ANZAHL |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gieren |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// if(GasMischanteil < 35) { if(StickGier > 10) StickGier = 10; else if(StickGier < -10) StickGier = -10;}; |
if(abs(StickGier) > 15) // war 35 |
{ |
KompassSignalSchlecht = 1000; |
if(!(EE_Parameter.GlobalConfig & CFG_KOMPASS_FIX)) |
{ |
NeueKompassRichtungMerken = 1; |
}; |
} |
tmp_int = (long) EE_Parameter.Gier_P * ((long)StickGier * abs(StickGier)) / 512L; // expo y = ax + bx² |
tmp_int += (EE_Parameter.Gier_P * StickGier) / 4; |
sollGier = tmp_int; |
Mess_Integral_Gier -= tmp_int; |
if(Mess_Integral_Gier > 50000) Mess_Integral_Gier = 50000; // begrenzen |
if(Mess_Integral_Gier <-50000) Mess_Integral_Gier =-50000; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Kompass |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//DebugOut.Analog[16] = KompassSignalSchlecht; |
if(KompassValue && (EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV)) |
{ |
int w,v,r,fehler,korrektur; |
w = abs(IntegralNick /512); // mit zunehmender Neigung den Einfluss drosseln |
v = abs(IntegralRoll /512); |
if(v > w) w = v; // grösste Neigung ermitteln |
korrektur = w / 8 + 1; |
fehler = ((540 + KompassValue - (ErsatzKompass/GIER_GRAD_FAKTOR)) % 360) - 180; |
if(abs(MesswertGier) > 128) |
{ |
fehler = 0; |
} |
if(!KompassSignalSchlecht && w < 25) |
{ |
GierGyroFehler += fehler; |
if(NeueKompassRichtungMerken) |
{ |
// beeptime = 200; |
// KompassStartwert = KompassValue; |
ErsatzKompass = KompassValue * GIER_GRAD_FAKTOR; |
KompassStartwert = (ErsatzKompass/GIER_GRAD_FAKTOR); |
NeueKompassRichtungMerken = 0; |
} |
} |
ErsatzKompass += (fehler * 8) / korrektur; |
w = (w * Parameter_KompassWirkung) / 32; // auf die Wirkung normieren |
w = Parameter_KompassWirkung - w; // Wirkung ggf drosseln |
if(w >= 0) |
{ |
if(!KompassSignalSchlecht) |
{ |
v = 64 + ((MaxStickNick + MaxStickRoll)) / 8; |
r = ((540 + (ErsatzKompass/GIER_GRAD_FAKTOR) - KompassStartwert) % 360) - 180; |
// r = KompassRichtung; |
v = (r * w) / v; // nach Kompass ausrichten |
w = 3 * Parameter_KompassWirkung; |
if(v > w) v = w; // Begrenzen |
else |
if(v < -w) v = -w; |
Mess_Integral_Gier += v; |
} |
if(KompassSignalSchlecht) KompassSignalSchlecht--; |
} |
else KompassSignalSchlecht = 500; // so lange das Signal taub stellen --> ca. 1 sek |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Debugwerte zuordnen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!TimerWerteausgabe--) |
{ |
TimerWerteausgabe = 24; |
DebugOut.Analog[0] = IntegralNick / (EE_Parameter.GyroAccFaktor * 4); |
DebugOut.Analog[1] = IntegralRoll / (EE_Parameter.GyroAccFaktor * 4); |
DebugOut.Analog[2] = Mittelwert_AccNick / 4; |
DebugOut.Analog[3] = Mittelwert_AccRoll / 4; |
DebugOut.Analog[4] = MesswertGier; |
DebugOut.Analog[5] = HoehenWert/5; |
DebugOut.Analog[6] = Aktuell_az;//(Mess_Integral_Hoch / 512);//Aktuell_az; |
DebugOut.Analog[8] = KompassValue; |
DebugOut.Analog[9] = UBat; |
DebugOut.Analog[10] = SenderOkay; |
DebugOut.Analog[11] = ErsatzKompass / GIER_GRAD_FAKTOR; |
//DebugOut.Analog[16] = Mittelwert_AccHoch; |
//DebugOut.Analog[17] = FromNaviCtrl_Value.Distance; |
DebugOut.Analog[18] = VarioMeter; |
DebugOut.Analog[19] = WinkelOut.CalcState; |
DebugOut.Analog[20] = ServoNickValue; |
DebugOut.Analog[22] = Capacity.ActualCurrent; |
DebugOut.Analog[23] = Capacity.UsedCapacity; |
// DebugOut.Analog[22] = FromNaviCtrl_Value.GpsZ; |
// DebugOut.Analog[24] = MesswertNick/2; |
// DebugOut.Analog[25] = MesswertRoll/2; |
// DebugOut.Analog[27] = (int)FromNaviCtrl_Value.Kalman_MaxDrift; |
// DebugOut.Analog[28] = (int)FromNaviCtrl_Value.Kalman_MaxFusion; |
// DebugOut.Analog[29] = (int)FromNaviCtrl_Value.Kalman_K; |
//DebugOut.Analog[28] = I2CError; |
DebugOut.Analog[29] = FromNaviCtrl_Value.SerialDataOkay; |
DebugOut.Analog[30] = GPS_Nick; |
DebugOut.Analog[31] = GPS_Roll; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Drehgeschwindigkeit und -winkel zu einem Istwert zusammenfassen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(TrichterFlug) { SummeRoll = 0; SummeNick = 0;}; |
if(!Looping_Nick) IntegralNickMalFaktor = (IntegralNick * IntegralFaktor) / (44000 / STICK_GAIN); else IntegralNickMalFaktor = 0; |
if(!Looping_Roll) IntegralRollMalFaktor = (IntegralRoll * IntegralFaktor) / (44000 / STICK_GAIN); else IntegralRollMalFaktor = 0; |
#define TRIM_MAX 200 |
if(TrimNick > TRIM_MAX) TrimNick = TRIM_MAX; else if(TrimNick <-TRIM_MAX) TrimNick =-TRIM_MAX; |
if(TrimRoll > TRIM_MAX) TrimRoll = TRIM_MAX; else if(TrimRoll <-TRIM_MAX) TrimRoll =-TRIM_MAX; |
MesswertNick = IntegralNickMalFaktor + (long)((long)MesswertNick * GyroFaktor + (long)TrimNick * 128L) / (256L / STICK_GAIN); |
MesswertRoll = IntegralRollMalFaktor + (long)((long)MesswertRoll * GyroFaktor + (long)TrimRoll * 128L) / (256L / STICK_GAIN); |
MesswertGier = (long)(MesswertGier * 2 * (long)GyroFaktorGier) / (256L / STICK_GAIN) + (long)(Integral_Gier * IntegralFaktorGier) / (2 * (44000 / STICK_GAIN)); |
// Maximalwerte abfangen |
// #define MAX_SENSOR (4096*STICK_GAIN) |
#define MAX_SENSOR (4096*4) |
if(MesswertNick > MAX_SENSOR) MesswertNick = MAX_SENSOR; |
if(MesswertNick < -MAX_SENSOR) MesswertNick = -MAX_SENSOR; |
if(MesswertRoll > MAX_SENSOR) MesswertRoll = MAX_SENSOR; |
if(MesswertRoll < -MAX_SENSOR) MesswertRoll = -MAX_SENSOR; |
if(MesswertGier > MAX_SENSOR) MesswertGier = MAX_SENSOR; |
if(MesswertGier < -MAX_SENSOR) MesswertGier = -MAX_SENSOR; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Höhenregelung |
// Die Höhenregelung schwächt lediglich das Gas ab, erhöht es allerdings nicht |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(UBat > BattLowVoltageWarning) GasMischanteil = ((unsigned int)GasMischanteil * BattLowVoltageWarning) / UBat; // Gas auf das aktuelle Spannungvieveau beziehen |
GasMischanteil *= STICK_GAIN; |
// if height control is activated |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) && !(Looping_Roll || Looping_Nick)) // Höhenregelung |
{ |
#define HOVER_GAS_AVERAGE 4096L // 4096 * 2ms = 8.2s averaging |
#define HC_GAS_AVERAGE 4 // 4 * 2ms= 8ms averaging |
#define OPA_OFFSET_STEP 10 |
int HCGas, HeightDeviation = 0; |
static int HeightTrimming = 0; // rate for change of height setpoint |
static int FilterHCGas = 0; |
static int StickGasHover = 120, HoverGas = 0, HoverGasMin = 0, HoverGasMax = 1023; |
static unsigned long HoverGasFilter = 0; |
static unsigned char delay = 100, BaroAtUpperLimit = 0, BaroAtLowerLimit = 0; |
int CosAttitude; // for projection of hoover gas |
// get the current hooverpoint |
DebugOut.Analog[21] = HoverGas; |
DebugOut.Analog[18] = VarioMeter; |
// Expand the measurement |
// measurement of air pressure close to upper limit and no overflow in correction of the new OCR0A value occurs |
if(!BaroExpandActive) |
{ |
if(MessLuftdruck > 920) |
{ // increase offset |
if(OCR0A < (255 - OPA_OFFSET_STEP)) |
{ |
ExpandBaro -= 1; |
OCR0A = DruckOffsetSetting - OPA_OFFSET_STEP * ExpandBaro; // increase offset to shift ADC down |
beeptime = 300; |
BaroExpandActive = 350; |
} |
else |
{ |
BaroAtLowerLimit = 1; |
} |
} |
// measurement of air pressure close to lower limit and |
else |
if(MessLuftdruck < 100) |
{ // decrease offset |
if(OCR0A > OPA_OFFSET_STEP) |
{ |
ExpandBaro += 1; |
OCR0A = DruckOffsetSetting - OPA_OFFSET_STEP * ExpandBaro; // decrease offset to shift ADC up |
beeptime = 300; |
BaroExpandActive = 350; |
} |
else |
{ |
BaroAtUpperLimit = 1; |
} |
} |
else |
{ |
BaroAtUpperLimit = 0; |
BaroAtLowerLimit = 0; |
} |
} |
else // delay, because of expanding the Baro-Range |
{ |
// now clear the D-values |
SummenHoehe = HoehenWert * SM_FILTER; |
VarioMeter = 0; |
BaroExpandActive--; |
} |
// if height control is activated by an rc channel |
if(EE_Parameter.GlobalConfig & CFG_HOEHEN_SCHALTER) // Regler wird über Schalter gesteuert |
{ // check if parameter is less than activation threshold |
if(Parameter_MaxHoehe < 50) // for 3 or 2-state switch height control is disabled in lowest position |
{ //height control not active |
if(!delay--) |
{ |
HoehenReglerAktiv = 0; // disable height control |
SollHoehe = HoehenWert; // update SetPoint with current reading |
delay = 1; |
} |
} |
else |
{ //height control is activated |
HoehenReglerAktiv = 1; // enable height control |
delay = 200; |
} |
} |
else // no switchable height control |
{ |
SollHoehe = ((int16_t) ExternHoehenValue + (int16_t) Parameter_MaxHoehe) * (int)EE_Parameter.Hoehe_Verstaerkung; |
HoehenReglerAktiv = 1; |
} |
// calculate cos of nick and roll angle used for projection of the vertical hoover gas |
tmp_int = (int)(IntegralNick/GIER_GRAD_FAKTOR); // nick angle in deg |
tmp_int2 = (int)(IntegralRoll/GIER_GRAD_FAKTOR); // roll angle in deg |
CosAttitude = (int16_t)ihypot(tmp_int, tmp_int2); // phytagoras gives effective attitude angle in deg |
LIMIT_MAX(CosAttitude, 60); // limit effective attitude angle |
CosAttitude = c_cos_8192(CosAttitude); // cos of actual attitude |
VarioCharacter = ' '; |
if(HoehenReglerAktiv && !(FCFlags & FCFLAG_NOTLANDUNG)) |
{ |
#define HEIGHT_TRIM_UP 0x01 |
#define HEIGHT_TRIM_DOWN 0x02 |
static unsigned char HeightTrimmingFlag = 0x00; |
#define HEIGHT_CONTROL_STICKTHRESHOLD 15 |
// Holger original version |
// start of height control algorithm |
// the height control is only an attenuation of the actual gas stick. |
// I.e. it will work only if the gas stick is higher than the hover gas |
// and the hover height will be allways larger than height setpoint. |
if((EE_Parameter.ExtraConfig & CFG2_HEIGHT_LIMIT) || !(EE_Parameter.GlobalConfig & CFG_HOEHEN_SCHALTER)) // Regler wird über Schalter gesteuert) |
{ // old version |
HCGas = GasMischanteil; // take current stick gas as neutral point for the height control |
HeightTrimming = 0; |
} |
else |
{ |
// alternative height control |
// PD-Control with respect to hoover point |
// the thrust loss out of horizontal attitude is compensated |
// the setpoint will be fine adjusted with the gas stick position |
if(FCFlags & FCFLAG_FLY) // trim setpoint only when flying |
{ // gas stick is above hoover point |
if(StickGas > (StickGasHover + HEIGHT_CONTROL_STICKTHRESHOLD) && !BaroAtUpperLimit) |
{ |
if(HeightTrimmingFlag & HEIGHT_TRIM_DOWN) |
{ |
HeightTrimmingFlag &= ~HEIGHT_TRIM_DOWN; |
SollHoehe = HoehenWert; // update setpoint to current heigth |
} |
HeightTrimmingFlag |= HEIGHT_TRIM_UP; |
HeightTrimming += abs(StickGas - (StickGasHover + HEIGHT_CONTROL_STICKTHRESHOLD)); |
VarioCharacter = '+'; |
} // gas stick is below hoover point |
else if(StickGas < (StickGasHover - HEIGHT_CONTROL_STICKTHRESHOLD) && !BaroAtLowerLimit ) |
{ |
if(HeightTrimmingFlag & HEIGHT_TRIM_UP) |
{ |
HeightTrimmingFlag &= ~HEIGHT_TRIM_UP; |
SollHoehe = HoehenWert; // update setpoint to current heigth |
} |
HeightTrimmingFlag |= HEIGHT_TRIM_DOWN; |
HeightTrimming -= abs(StickGas - (StickGasHover - HEIGHT_CONTROL_STICKTHRESHOLD)); |
VarioCharacter = '-'; |
} |
else // Gas Stick in Hover Range |
{ |
if(HeightTrimmingFlag & (HEIGHT_TRIM_UP | HEIGHT_TRIM_DOWN)) |
{ |
HeightTrimmingFlag &= ~(HEIGHT_TRIM_UP | HEIGHT_TRIM_DOWN); |
HeightTrimming = 0; |
SollHoehe = HoehenWert; // update setpoint to current height |
if(EE_Parameter.ExtraConfig & CFG2_VARIO_BEEP) beeptime = 500; |
} |
VarioCharacter = '='; |
} |
// Trim height set point |
if(abs(HeightTrimming) > 512) |
{ |
SollHoehe += (HeightTrimming * EE_Parameter.Hoehe_Verstaerkung)/(5 * 512 / 2); // move setpoint |
HeightTrimming = 0; |
LIMIT_MIN_MAX(SollHoehe, (HoehenWert-1024), (HoehenWert+1024)); // max. 10m Unterschied |
if(EE_Parameter.ExtraConfig & CFG2_VARIO_BEEP) beeptime = 75; |
//update hoover gas stick value when setpoint is shifted |
if(!EE_Parameter.Hoehe_StickNeutralPoint) |
{ |
StickGasHover = HoverGas/STICK_GAIN; //rescale back to stick value |
StickGasHover = (StickGasHover * UBat) / BattLowVoltageWarning; |
if(StickGasHover < 70) StickGasHover = 70; |
else if(StickGasHover > 150) StickGasHover = 150; |
} |
} |
if(BaroExpandActive) SollHoehe = HoehenWert; // update setpoint to current altitude if Expanding is active |
} //if FCFlags & MKFCFLAG_FLY |
else |
{ |
SollHoehe = HoehenWert - 400; |
if(EE_Parameter.Hoehe_StickNeutralPoint) StickGasHover = EE_Parameter.Hoehe_StickNeutralPoint; |
else StickGasHover = 120; |
} |
HCGas = HoverGas; // take hover gas (neutral point) |
} |
if(HoehenWert > SollHoehe || !(EE_Parameter.ExtraConfig & CFG2_HEIGHT_LIMIT)) |
{ |
// from this point the Heigth Control Algorithm is identical for both versions |
if(BaroExpandActive) // baro range expanding active |
{ |
HCGas = HoverGas; // hover while expanding baro adc range |
HeightDeviation = 0; |
} // EOF // baro range expanding active |
else // valid data from air pressure sensor |
{ |
// ------------------------- P-Part ---------------------------- |
tmp_long = (HoehenWert - SollHoehe); // positive when too high |
LIMIT_MIN_MAX(tmp_long, -32767L, 32767L); // avoid overflov when casting to int16_t |
HeightDeviation = (int)(tmp_long); // positive when too high |
tmp_long = (tmp_long * (long)Parameter_Hoehe_P) / 16L; // p-part |
LIMIT_MIN_MAX(tmp_long, -255 * STICK_GAIN, 255 * STICK_GAIN); // more than 2 times the full range makes no sense |
HCGas -= tmp_long; |
// ------------------------- D-Part 1: Vario Meter ---------------------------- |
tmp_int = VarioMeter / 8; |
LIMIT_MIN_MAX(tmp_int, -181, 181); // avoid overflow when squared (181^2 = 32761) |
tmp_int2 = tmp_int; |
LIMIT_MAX(tmp_int2, 8); // limit quadratic part on upward movement to avoid to much gas reduction |
if(tmp_int2 > 0) tmp_int = tmp_int + (tmp_int2 * tmp_int2) / 4; |
else tmp_int = tmp_int - (tmp_int2 * tmp_int2) / 4; |
tmp_int = (tmp_int * (long)Parameter_Luftdruck_D) / 128L; // scale to d-gain parameter |
LIMIT_MIN_MAX(tmp_int,-32 * STICK_GAIN, 64 * STICK_GAIN); |
HCGas -= tmp_int; |
} // EOF no baro range expanding |
// ------------------------ D-Part 2: ACC-Z Integral ------------------------ |
tmp_long = ((Mess_Integral_Hoch / 128L) * (int32_t) Parameter_Hoehe_ACC_Wirkung) / (128L / STICK_GAIN); |
LIMIT_MIN_MAX(tmp_long, -32 * STICK_GAIN, 64 * STICK_GAIN); |
HCGas -= tmp_long; |
// ------------------------ D-Part 3: GpsZ ---------------------------------- |
tmp_int = (Parameter_Hoehe_GPS_Z * (int)FromNaviCtrl_Value.GpsZ)/128L; |
LIMIT_MIN_MAX(tmp_int, -32 * STICK_GAIN, 64 * STICK_GAIN); |
HCGas -= tmp_int; |
// limit deviation from hoover point within the target region |
if( (abs(HeightDeviation) < 150) && (!HeightTrimming) && (HoverGas > 0)) // height setpoint is not changed and hoover gas not zero |
{ |
LIMIT_MIN_MAX(HCGas, HoverGasMin, HoverGasMax); // limit gas around the hoover point |
} |
// strech control output by inverse attitude projection 1/cos |
// + 1/cos(angle) ++++++++++++++++++++++++++ |
tmp_long2 = (int32_t)HCGas; |
tmp_long2 *= 8192L; |
tmp_long2 /= CosAttitude; |
HCGas = (int16_t)tmp_long2; |
// update height control gas averaging |
FilterHCGas = (FilterHCGas * (HC_GAS_AVERAGE - 1) + HCGas) / HC_GAS_AVERAGE; |
// limit height control gas pd-control output |
LIMIT_MIN_MAX(FilterHCGas, EE_Parameter.Hoehe_MinGas * STICK_GAIN, (MAX_GAS - 20) * STICK_GAIN); |
// set GasMischanteil to HeightControlGasFilter |
if(EE_Parameter.ExtraConfig & CFG2_HEIGHT_LIMIT) |
{ // old version |
LIMIT_MAX(FilterHCGas, GasMischanteil); // nicht mehr als Gas |
} |
GasMischanteil = FilterHCGas; |
} |
}// EOF height control active |
else // HC not active |
{ |
//update hoover gas stick value when HC is not active |
if(!EE_Parameter.Hoehe_StickNeutralPoint) |
{ |
StickGasHover = HoverGas/STICK_GAIN; // rescale back to stick value |
StickGasHover = (StickGasHover * UBat) / BattLowVoltageWarning; |
} |
else StickGasHover = EE_Parameter.Hoehe_StickNeutralPoint; |
LIMIT_MIN_MAX(StickGasHover, 70, 150); // reserve some range for trim up and down |
FilterHCGas = GasMischanteil; |
} |
// Hover gas estimation by averaging gas control output on small z-velocities |
// this is done only if height contol option is selected in global config and aircraft is flying |
if((FCFlags & FCFLAG_FLY) && !(FCFlags & FCFLAG_NOTLANDUNG)) |
{ |
if(HoverGasFilter == 0) HoverGasFilter = HOVER_GAS_AVERAGE * (unsigned long)(GasMischanteil); // init estimation |
if(abs(VarioMeter) < 100) // only on small vertical speed |
{ |
tmp_long2 = (int32_t)GasMischanteil; // take current thrust |
tmp_long2 *= CosAttitude; // apply attitude projection |
tmp_long2 /= 8192; |
// average vertical projected thrust |
if(modell_fliegt < 2000) // the first 4 seconds |
{ // reduce the time constant of averaging by factor of 8 to get much faster a stable value |
HoverGasFilter -= HoverGasFilter/(HOVER_GAS_AVERAGE/8L); |
HoverGasFilter += 8L * tmp_long2; |
} |
else if(modell_fliegt < 4000) // the first 8 seconds |
{ // reduce the time constant of averaging by factor of 4 to get much faster a stable value |
HoverGasFilter -= HoverGasFilter/(HOVER_GAS_AVERAGE/4L); |
HoverGasFilter += 4L * tmp_long2; |
} |
else if(modell_fliegt < 8000) // the first 16 seconds |
{ // reduce the time constant of averaging by factor of 2 to get much faster a stable value |
HoverGasFilter -= HoverGasFilter/(HOVER_GAS_AVERAGE/2L); |
HoverGasFilter += 2L * tmp_long2; |
} |
else //later |
{ |
HoverGasFilter -= HoverGasFilter/HOVER_GAS_AVERAGE; |
HoverGasFilter += tmp_long2; |
} |
HoverGas = (int16_t)(HoverGasFilter/HOVER_GAS_AVERAGE); |
if(EE_Parameter.Hoehe_HoverBand) |
{ |
int16_t band; |
band = HoverGas / EE_Parameter.Hoehe_HoverBand; // the higher the parameter the smaller the range |
HoverGasMin = HoverGas - band; |
HoverGasMax = HoverGas + band; |
} |
else |
{ // no limit |
HoverGasMin = 0; |
HoverGasMax = 1023; |
} |
} |
} |
}// EOF ParamSet.GlobalConfig & CFG_HEIGHT_CONTROL |
// limit gas to parameter setting |
LIMIT_MIN(GasMischanteil, (MIN_GAS + 10) * STICK_GAIN); |
if(GasMischanteil > (MAX_GAS - 20) * STICK_GAIN) GasMischanteil = (MAX_GAS - 20) * STICK_GAIN; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// all BL-Ctrl connected? |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(MissingMotor) |
if(modell_fliegt > 1 && modell_fliegt < 50 && GasMischanteil > 0) |
{ |
modell_fliegt = 1; |
GasMischanteil = MIN_GAS; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Mischer und PI-Regler |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DebugOut.Analog[7] = GasMischanteil; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gier-Anteil |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
GierMischanteil = MesswertGier - sollGier * STICK_GAIN; // Regler für Gier |
#define MIN_GIERGAS (40*STICK_GAIN) // unter diesem Gaswert trotzdem Gieren |
if(GasMischanteil > MIN_GIERGAS) |
{ |
if(GierMischanteil > (GasMischanteil / 2)) GierMischanteil = GasMischanteil / 2; |
if(GierMischanteil < -(GasMischanteil / 2)) GierMischanteil = -(GasMischanteil / 2); |
} |
else |
{ |
if(GierMischanteil > (MIN_GIERGAS / 2)) GierMischanteil = MIN_GIERGAS / 2; |
if(GierMischanteil < -(MIN_GIERGAS / 2)) GierMischanteil = -(MIN_GIERGAS / 2); |
} |
tmp_int = MAX_GAS*STICK_GAIN; |
if(GierMischanteil > ((tmp_int - GasMischanteil))) GierMischanteil = ((tmp_int - GasMischanteil)); |
if(GierMischanteil < -((tmp_int - GasMischanteil))) GierMischanteil = -((tmp_int - GasMischanteil)); |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Nick-Achse |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DiffNick = MesswertNick - StickNick; // Differenz bestimmen |
if(IntegralFaktor) SummeNick += IntegralNickMalFaktor - StickNick; // I-Anteil bei Winkelregelung |
else SummeNick += DiffNick; // I-Anteil bei HH |
if(SummeNick > (STICK_GAIN * 16000L)) SummeNick = (STICK_GAIN * 16000L); |
if(SummeNick < -(16000L * STICK_GAIN)) SummeNick = -(16000L * STICK_GAIN); |
pd_ergebnis_nick = DiffNick + SummeNick / Ki; // PI-Regler für Nick |
// Motor Vorn |
tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
if(pd_ergebnis_nick > tmp_int) pd_ergebnis_nick = tmp_int; |
if(pd_ergebnis_nick < -tmp_int) pd_ergebnis_nick = -tmp_int; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Roll-Achse |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DiffRoll = MesswertRoll - StickRoll; // Differenz bestimmen |
if(IntegralFaktor) SummeRoll += IntegralRollMalFaktor - StickRoll;// I-Anteil bei Winkelregelung |
else SummeRoll += DiffRoll; // I-Anteil bei HH |
if(SummeRoll > (STICK_GAIN * 16000L)) SummeRoll = (STICK_GAIN * 16000L); |
if(SummeRoll < -(16000L * STICK_GAIN)) SummeRoll = -(16000L * STICK_GAIN); |
pd_ergebnis_roll = DiffRoll + SummeRoll / Ki; // PI-Regler für Roll |
tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
if(pd_ergebnis_roll > tmp_int) pd_ergebnis_roll = tmp_int; |
if(pd_ergebnis_roll < -tmp_int) pd_ergebnis_roll = -tmp_int; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Universal Mixer |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
for(i=0; i<MAX_MOTORS; i++) |
{ |
signed int tmp_int; |
if(Mixer.Motor[i][0] > 0) |
{ |
tmp_int = ((long)GasMischanteil * Mixer.Motor[i][0]) / 64L; |
tmp_int += ((long)pd_ergebnis_nick * Mixer.Motor[i][1]) / 64L; |
tmp_int += ((long)pd_ergebnis_roll * Mixer.Motor[i][2]) / 64L; |
tmp_int += ((long)GierMischanteil * Mixer.Motor[i][3]) / 64L; |
tmp_motorwert[i] = MotorSmoothing(tmp_int,tmp_motorwert[i]); // Filter |
tmp_int = tmp_motorwert[i] / STICK_GAIN; |
CHECK_MIN_MAX(tmp_int,MIN_GAS,MAX_GAS); |
Motor[i].SetPoint = tmp_int; |
} |
else Motor[i].SetPoint = 0; |
} |
} |
/branches/Znib/V0.78f/fc.h |
---|
0,0 → 1,215 |
/*####################################################################################### |
Flight Control |
#######################################################################################*/ |
#ifndef _FC_H |
#define _FC_H |
//#define GIER_GRAD_FAKTOR 1291L // Abhängigkeit zwischen GyroIntegral und Winkel |
//#define GIER_GRAD_FAKTOR 1160L |
extern long GIER_GRAD_FAKTOR; // Abhängigkeit zwischen GyroIntegral und Winkel |
#define STICK_GAIN 4 |
#define FCFLAG_MOTOR_RUN 0x01 |
#define FCFLAG_FLY 0x02 |
#define FCFLAG_CALIBRATE 0x04 |
#define FCFLAG_START 0x08 |
#define FCFLAG_NOTLANDUNG 0x10 |
#define FCFLAG_LOWBAT 0x20 |
#define FCFLAG_SPI_RX_ERR 0x40 |
#define FCFLAG_I2CERR 0x80 |
#define Poti1 Poti[0] |
#define Poti2 Poti[1] |
#define Poti3 Poti[2] |
#define Poti4 Poti[3] |
#define Poti5 Poti[4] |
#define Poti6 Poti[5] |
#define Poti7 Poti[6] |
#define Poti8 Poti[7] |
#define CHECK_MIN_MAX(wert,min,max) {if(wert < min) wert = min; else if(wert > max) wert = max;} |
extern volatile unsigned char FCFlags; |
extern volatile unsigned int I2CTimeout; |
extern unsigned char Sekunde,Minute; |
extern unsigned int BaroExpandActive; |
extern long IntegralNick,IntegralNick2; |
extern long IntegralRoll,IntegralRoll2; |
//extern int IntegralNick,IntegralNick2; |
//extern int IntegralRoll,IntegralRoll2; |
extern unsigned char Poti[9]; |
extern long Mess_IntegralNick,Mess_IntegralNick2; |
extern long Mess_IntegralRoll,Mess_IntegralRoll2; |
extern long IntegralAccNick,IntegralAccRoll; |
extern volatile long Mess_Integral_Hoch; |
extern long Integral_Gier,Mess_Integral_Gier,Mess_Integral_Gier2; |
extern int KompassValue; |
extern int KompassStartwert; |
extern int KompassRichtung; |
extern int TrimNick, TrimRoll; |
extern long ErsatzKompass; |
extern int ErsatzKompassInGrad; // Kompasswert in Grad |
extern long HoehenWert; |
extern long SollHoehe; |
extern int MesswertNick,MesswertRoll,MesswertGier; |
extern int AdNeutralNick,AdNeutralRoll,AdNeutralGier, Mittelwert_AccNick, Mittelwert_AccRoll; |
extern int NeutralAccX, NeutralAccY,Mittelwert_AccHoch; |
extern unsigned char HoehenReglerAktiv; |
extern volatile float NeutralAccZ; |
extern long Umschlag180Nick, Umschlag180Roll; |
extern signed int ExternStickNick,ExternStickRoll,ExternStickGier; |
extern unsigned char Parameter_UserParam1,Parameter_UserParam2,Parameter_UserParam3,Parameter_UserParam4,Parameter_UserParam5,Parameter_UserParam6,Parameter_UserParam7,Parameter_UserParam8; |
extern int NaviAccNick,NaviAccRoll,NaviCntAcc; |
extern unsigned int modell_fliegt; |
void MotorRegler(void); |
void SendMotorData(void); |
void CalibrierMittelwert(void); |
void Mittelwert(void); |
void SetNeutral(void); |
void Piep(unsigned char Anzahl, unsigned int dauer); |
extern unsigned char h,m,s; |
extern volatile unsigned char Timeout ; |
extern unsigned char CosinusNickWinkel, CosinusRollWinkel; |
extern int DiffNick,DiffRoll; |
//extern int Poti1, Poti2, Poti3, Poti4; |
extern volatile unsigned char SenderOkay; |
extern volatile unsigned char SenderRSSI; |
extern int StickNick,StickRoll,StickGier; |
extern char MotorenEin; |
extern void DefaultKonstanten1(void); |
extern void DefaultKonstanten2(void); |
extern void DefaultKonstanten3(void); |
extern void DefaultStickMapping(void); |
extern unsigned char Parameter_Servo3,Parameter_Servo4,Parameter_Servo5; |
extern char VarioCharacter; |
#define STRUCT_PARAM_LAENGE sizeof(EE_Parameter) |
struct mk_param_struct |
{ |
unsigned char Kanalbelegung[12]; // GAS[0], GIER[1],NICK[2], ROLL[3], POTI1, POTI2, POTI3 |
unsigned char GlobalConfig; // 0x01=Höhenregler aktiv,0x02=Kompass aktiv, 0x04=GPS aktiv, 0x08=Heading Hold aktiv |
unsigned char Hoehe_MinGas; // Wert : 0-100 |
unsigned char Luftdruck_D; // Wert : 0-250 |
unsigned char MaxHoehe; // Wert : 0-32 |
unsigned char Hoehe_P; // Wert : 0-32 |
unsigned char Hoehe_Verstaerkung; // Wert : 0-50 |
unsigned char Hoehe_ACC_Wirkung; // Wert : 0-250 |
unsigned char Hoehe_HoverBand; // Wert : 0-250 |
unsigned char Hoehe_GPS_Z; // Wert : 0-250 |
unsigned char Hoehe_StickNeutralPoint;// Wert : 0-250 |
unsigned char Stick_P; // Wert : 1-6 |
unsigned char Stick_D; // Wert : 0-64 |
unsigned char Gier_P; // Wert : 1-20 |
unsigned char Gas_Min; // Wert : 0-32 |
unsigned char Gas_Max; // Wert : 33-250 |
unsigned char GyroAccFaktor; // Wert : 1-64 |
unsigned char KompassWirkung; // Wert : 0-32 |
unsigned char Gyro_P; // Wert : 10-250 |
unsigned char Gyro_I; // Wert : 0-250 |
unsigned char Gyro_D; // Wert : 0-250 |
unsigned char Gyro_Gier_P; // Wert : 10-250 |
unsigned char Gyro_Gier_I; // Wert : 0-250 |
unsigned char UnterspannungsWarnung; // Wert : 0-250 |
unsigned char NotGas; // Wert : 0-250 //Gaswert bei Empängsverlust |
unsigned char NotGasZeit; // Wert : 0-250 // Zeitbis auf NotGas geschaltet wird, wg. Rx-Problemen |
unsigned char Receiver; // 0= Summensignal, 1= Spektrum, 2 =Jeti, 3=ACT DSL, 4=ACT S3D |
unsigned char I_Faktor; // Wert : 0-250 |
unsigned char UserParam1; // Wert : 0-250 |
unsigned char UserParam2; // Wert : 0-250 |
unsigned char UserParam3; // Wert : 0-250 |
unsigned char UserParam4; // Wert : 0-250 |
unsigned char ServoNickControl; // Wert : 0-250 // Stellung des Servos |
unsigned char ServoNickComp; // Wert : 0-250 // Einfluss Gyro/Servo |
unsigned char ServoNickMin; // Wert : 0-250 // Anschlag |
unsigned char ServoNickMax; // Wert : 0-250 // Anschlag |
//--- Seit V0.75 |
unsigned char ServoRollControl; // Wert : 0-250 // Stellung des Servos |
unsigned char ServoRollComp; // Wert : 0-250 |
unsigned char ServoRollMin; // Wert : 0-250 |
unsigned char ServoRollMax; // Wert : 0-250 |
//--- |
unsigned char ServoNickRefresh; // Speed of the Servo |
unsigned char Servo3; // Value or mapping of the Servo Output |
unsigned char Servo4; // Value or mapping of the Servo Output |
unsigned char Servo5; // Value or mapping of the Servo Output |
unsigned char LoopGasLimit; // Wert: 0-250 max. Gas während Looping |
unsigned char LoopThreshold; // Wert: 0-250 Schwelle für Stickausschlag |
unsigned char LoopHysterese; // Wert: 0-250 Hysterese für Stickausschlag |
unsigned char AchsKopplung1; // Wert: 0-250 Faktor, mit dem Gier die Achsen Roll und Nick koppelt (NickRollMitkopplung) |
unsigned char AchsKopplung2; // Wert: 0-250 Faktor, mit dem Nick und Roll verkoppelt werden |
unsigned char CouplingYawCorrection; // Wert: 0-250 Faktor, mit dem Nick und Roll verkoppelt werden |
unsigned char WinkelUmschlagNick; // Wert: 0-250 180°-Punkt |
unsigned char WinkelUmschlagRoll; // Wert: 0-250 180°-Punkt |
unsigned char GyroAccAbgleich; // 1/k (Koppel_ACC_Wirkung) |
unsigned char Driftkomp; |
unsigned char DynamicStability; |
unsigned char UserParam5; // Wert : 0-250 |
unsigned char UserParam6; // Wert : 0-250 |
unsigned char UserParam7; // Wert : 0-250 |
unsigned char UserParam8; // Wert : 0-250 |
//---Output --------------------------------------------- |
unsigned char J16Bitmask; // for the J16 Output |
unsigned char J16Timing; // for the J16 Output |
unsigned char J17Bitmask; // for the J17 Output |
unsigned char J17Timing; // for the J17 Output |
// seit version V0.75c |
unsigned char WARN_J16_Bitmask; // for the J16 Output |
unsigned char WARN_J17_Bitmask; // for the J17 Output |
//---NaviCtrl--------------------------------------------- |
unsigned char NaviGpsModeControl; // Parameters for the Naviboard |
unsigned char NaviGpsGain; |
unsigned char NaviGpsP; |
unsigned char NaviGpsI; |
unsigned char NaviGpsD; |
unsigned char NaviGpsPLimit; |
unsigned char NaviGpsILimit; |
unsigned char NaviGpsDLimit; |
unsigned char NaviGpsACC; |
unsigned char NaviGpsMinSat; |
unsigned char NaviStickThreshold; |
unsigned char NaviWindCorrection; |
unsigned char NaviSpeedCompensation; |
unsigned char NaviOperatingRadius; |
unsigned char NaviAngleLimitation; |
unsigned char NaviPH_LoginTime; |
//---Ext.Ctrl--------------------------------------------- |
unsigned char ExternalControl; // for serial Control |
//------------------------------------------------ |
unsigned char BitConfig; // (war Loop-Cfg) Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
unsigned char ServoCompInvert; // // 0x01 = Nick, 0x02 = Roll 0 oder 1 // WICHTIG!!! am Ende lassen |
unsigned char ExtraConfig; // bitcodiert |
char Name[12]; |
}; |
struct |
{ |
char Revision; |
char Name[12]; |
signed char Motor[16][4]; |
} Mixer; |
extern struct mk_param_struct EE_Parameter; |
extern unsigned char Parameter_Luftdruck_D; |
extern unsigned char Parameter_MaxHoehe; |
extern unsigned char Parameter_Hoehe_P; |
extern unsigned char Parameter_Hoehe_ACC_Wirkung; |
extern unsigned char Parameter_KompassWirkung; |
extern unsigned char Parameter_Gyro_P; |
extern unsigned char Parameter_Gyro_I; |
extern unsigned char Parameter_Gier_P; |
extern unsigned char Parameter_ServoNickControl; |
extern unsigned char Parameter_ServoRollControl; |
extern unsigned char Parameter_AchsKopplung1; |
extern unsigned char Parameter_AchsKopplung2; |
//extern unsigned char Parameter_AchsGegenKopplung1; |
extern unsigned char Parameter_J16Bitmask; // for the J16 Output |
extern unsigned char Parameter_J16Timing; // for the J16 Output |
extern unsigned char Parameter_J17Bitmask; // for the J17 Output |
extern unsigned char Parameter_J17Timing; // for the J17 Output |
extern signed char MixerTable[MAX_MOTORS][4]; |
#endif //_FC_H |
/branches/Znib/V0.78f/flight.pnproj |
---|
0,0 → 1,0 |
<Project name="Flight-Ctrl"><File path="uart.h"></File><File path="jeti.h"></File><File path="main.c"></File><File path="main.h"></File><File path="makefile"></File><File path="uart.c"></File><File path="printf_P.h"></File><File path="timer0.c"></File><File path="timer0.h"></File><File path="old_macros.h"></File><File path="twimaster.c"></File><File path="version.txt"></File><File path="twimaster.h"></File><File path="rc.c"></File><File path="rc.h"></File><File path="fc.h"></File><File path="menu.h"></File><File path="menu.c"></File><File path="_Settings.h"></File><File path="analog.c"></File><File path="analog.h"></File><File path="GPS.c"></File><File path="gps.h"></File><File path="License.txt"></File><File path="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="mymath.c"></File><File path="mymath.h"></File><File path="isqrt.S"></File><File path="Spektrum.c"></File><File path="Spektrum.h"></File></Project> |
/branches/Znib/V0.78f/flight.pnps |
---|
0,0 → 1,0 |
<pd><ViewState><e p="Flight-Ctrl" x="true"></e></ViewState></pd> |
/branches/Znib/V0.78f/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/Znib/V0.78f/isqrt.S |
---|
0,0 → 1,203 |
;-----------------------------------------------------------------------------; |
; Fast integer squareroot routines for avr-gcc project (C)ChaN, 2008 |
; http://elm-chan.org/docs/avrlib/sqrt32.S |
;-----------------------------------------------------------------------------; |
; uint16_t isqrt32 (uint32_t n); |
; uint8_t isqrt16 (uint16_t n); |
; uint16_t ihypot (int16_t x, int16_t y); |
;-----------------------------------------------------------------------------: |
; 32bit integer squareroot |
;-----------------------------------------------------------------------------; |
; uint16_t isqrt32 ( |
; uint32_t n |
; ); |
; |
; Return Value: |
; Squareroot of n. |
; |
; Size = 53 words |
; Clock = 532..548 cycles |
; Stack = 0 byte |
.global isqrt32 |
.func isqrt32 |
isqrt32: |
clr r0 |
clr r18 |
clr r19 |
clr r20 |
ldi r21, 1 |
clr r27 |
clr r30 |
clr r31 |
ldi r26, 16 |
1: lsl r22 |
rol r23 |
rol r24 |
rol r25 |
rol r0 |
rol r18 |
rol r19 |
rol r20 |
lsl r22 |
rol r23 |
rol r24 |
rol r25 |
rol r0 |
rol r18 |
rol r19 |
rol r20 |
brpl 2f |
add r0, r21 |
adc r18, r27 |
adc r19, r30 |
adc r20, r31 |
rjmp 3f |
2: sub r0, r21 |
sbc r18, r27 |
sbc r19, r30 |
sbc r20, r31 |
3: lsl r21 |
rol r27 |
rol r30 |
andi r21, 0b11111000 |
ori r21, 0b00000101 |
sbrc r20, 7 |
subi r21, 2 |
dec r26 |
brne 1b |
lsr r30 |
ror r27 |
ror r21 |
lsr r30 |
ror r27 |
ror r21 |
mov r24, r21 |
mov r25, r27 |
ret |
.endfunc |
;-----------------------------------------------------------------------------: |
; 16bit integer squareroot |
;-----------------------------------------------------------------------------; |
; uint8_t isqrt16 ( |
; uint16_t n |
; ); |
; |
; Return Value: |
; Squareroot of n. |
; |
; Size = 33 words |
; Clock = 181..189 cycles |
; Stack = 0 byte |
.global isqrt16 |
.func isqrt16 |
isqrt16: |
clr r18 |
clr r19 |
ldi r20, 1 |
clr r21 |
ldi r22, 8 |
1: lsl r24 |
rol r25 |
rol r18 |
rol r19 |
lsl r24 |
rol r25 |
rol r18 |
rol r19 |
brpl 2f |
add r18, r20 |
adc r19, r21 |
rjmp 3f |
2: sub r18, r20 |
sbc r19, r21 |
3: lsl r20 |
rol r21 |
andi r20, 0b11111000 |
ori r20, 0b00000101 |
sbrc r19, 7 |
subi r20, 2 |
dec r22 |
brne 1b |
lsr r21 |
ror r20 |
lsr r21 |
ror r20 |
mov r24, r20 |
ret |
.endfunc |
;-----------------------------------------------------------------------------: |
; 16bit integer hypot (megaAVR is required) |
;-----------------------------------------------------------------------------; |
; uint16_t ihypot ( |
; int16_t x, |
; int16_t y |
; ); |
; |
; Return Value: |
; Squareroot of (x*x + y*y) |
; |
; Size = 42 words |
; Clock = 581..597 cycles |
; Stack = 0 byte |
.global ihypot |
.func ihypot |
ihypot: |
clr r26 |
sbrs r25, 7 |
rjmp 1f |
com r24 |
com r25 |
adc r24, r26 |
adc r25, r26 |
1: sbrs r23, 7 |
rjmp 2f |
com r22 |
com r23 |
adc r22, r26 |
adc r23, r26 |
2: mul r22, r22 |
movw r18, r0 |
mul r23, r23 |
movw r20, r0 |
mul r22, r23 |
add r19, r0 |
adc r20, r1 |
adc r21, r26 |
add r19, r0 |
adc r20, r1 |
adc r21, r26 |
mul r24, r24 |
movw r30, r0 |
mul r25, r25 |
add r18, r30 |
adc r19, r31 |
adc r20, r0 |
adc r21, r1 |
mul r24, r25 |
add r19, r0 |
adc r20, r1 |
adc r21, r26 |
add r19, r0 |
adc r20, r1 |
adc r21, r26 |
movw r24, r20 |
movw r22, r18 |
clr r1 |
rjmp isqrt32 |
.endfunc |
/branches/Znib/V0.78f/isqrt.h |
---|
0,0 → 1,11 |
#ifndef _ISQRT_H |
#define _ISQRT_H |
#include <inttypes.h> |
// coded in assembler file |
extern uint16_t isqrt32(uint32_t n); |
extern uint8_t isqrt16(uint16_t n); |
extern uint16_t ihypot(int16_t x, int16_t y); |
#endif // _ISQRT_H |
/branches/Znib/V0.78f/jetimenu.c |
---|
0,0 → 1,151 |
#include "jetimenu.h" |
#include "libfc.h" |
#include "printf_P.h" |
#include "main.h" |
#include "spi.h" |
#include "capacity.h" |
#define JETIBOX_KEY_RIGHT 0x1F |
#define JETIBOX_KEY_UP 0x2F |
#define JETIBOX_KEY_DOWN 0x4F |
#define JETIBOX_KEY_LEFT 0x8F |
#define JETIBOX_KEY_NONE 0x0F |
#define JETIBOX_KEY_UNDEF 0x00 |
#define JetiBox_printfxy(x,y,format, args...) { LIBFC_JetiBox_SetPos(y * 16 + x); _printf_P(&LIBFC_JetiBox_Putchar, PSTR(format) , ## args);} |
#define JetiBox_printf(format, args...) { _printf_P(&LIBFC_JetiBox_Putchar, PSTR(format) , ## args);} |
// ----------------------------------------------------------- |
// the menu functions |
// ----------------------------------------------------------- |
void Menu_Status(uint8_t key) |
{ //0123456789ABCDEF |
JetiBox_printfxy(0,0,"%2i.%1iV",UBat/10, UBat%10); |
if(NaviDataOkay) |
{ |
JetiBox_printfxy(6,0,"%03dm %03d%c", GPSInfo.HomeDistance/10,GPSInfo.HomeBearing, 0xDF); |
} |
else |
{ |
JetiBox_printfxy(6,0,"Status"); |
} |
JetiBox_printfxy(0,1,"%4i %2i:%02i",Capacity.UsedCapacity,FlugSekunden/60,FlugSekunden%60); |
if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
JetiBox_printfxy(10,1,"%4im%c", (int16_t)(HoehenWert/100),VarioCharacter); |
} |
} |
void Menu_Attitude(uint8_t key) |
{ //0123456789ABCDEF |
JetiBox_printfxy(0,0,"Nick Roll Yaw"); |
JetiBox_printfxy(0,1,"%4i %4i %4i", (int16_t)(IntegralNick/1024), (int16_t)(IntegralRoll/1024), (int16_t)(ErsatzKompass / GIER_GRAD_FAKTOR)); |
} |
void Menu_Battery(uint8_t key) |
{ //0123456789ABCDEF |
JetiBox_printfxy(0,0,"%2i.%1iV %3i.%1iA", UBat/10, UBat%10, Capacity.ActualCurrent/10, Capacity.ActualCurrent%10); |
JetiBox_printfxy(0,1,"%4iW %6imAh",Capacity.ActualPower, Capacity.UsedCapacity); |
} |
void Menu_PosInfo(uint8_t key) |
{ |
if(NaviDataOkay) |
{ |
JetiBox_printfxy(0,0,"Sat:%02d", GPSInfo.NumOfSats); |
switch (GPSInfo.SatFix) |
{ |
case SATFIX_NONE: |
JetiBox_printfxy(7,0,"NoFix"); |
break; |
case SATFIX_2D: |
JetiBox_printfxy(7,0,"2DFix"); |
break; |
case SATFIX_3D: |
JetiBox_printfxy(7,0,"3DFix"); |
break; |
default: |
JetiBox_printfxy(7,0,"??Fix"); |
break; |
} |
if(GPSInfo.Flags & FLAG_DIFFSOLN) |
{ |
JetiBox_printfxy(9,0,"/DGPS"); |
} |
JetiBox_printfxy(0,1,"Home:%03dm %03d%c", GPSInfo.HomeDistance/10, GPSInfo.HomeBearing, 0xDF); |
} |
else |
{ //0123456789ABCDEF |
JetiBox_printfxy(2,0,"No NaviCtrl!"); |
} |
} |
// ----------------------------------------------------------- |
// the menu topology |
// ----------------------------------------------------------- |
typedef void (*pFctMenu) (uint8_t); // the menu item handler function pointer |
typedef struct{ |
int8_t left; |
int8_t right; |
int8_t up; |
int8_t down; |
pFctMenu pHandler; |
} MENU_ENTRY; |
// the menu navigation structure |
/* | |
3 - 0 - 1 - 2 - 3 - 0 |
*/ |
const MENU_ENTRY JetiBox_Menu[] PROGMEM= |
{ // l r u d pHandler |
{3, 1, 0, 0, &Menu_Status }, // 0 |
{0, 2, 1, 1, &Menu_Attitude }, // 1 |
{1, 3, 2, 2, &Menu_Battery }, // 2 |
{2, 0, 3, 3, &Menu_PosInfo }, // 3 |
}; |
// ----------------------------------------------------------- |
// Update display buffer |
// ----------------------------------------------------------- |
unsigned char JetiBox_Update(unsigned char key) |
{ |
static uint8_t item = 0, last_item = 0; // the menu item |
// navigate within the menu by key action |
last_item = item; |
switch(key) |
{ |
case JETIBOX_KEY_LEFT: |
if (item == 0) return (1); // switch back to jeti expander menu |
else item = pgm_read_byte(&JetiBox_Menu[item].left); //trigger to left menu item |
break; |
case JETIBOX_KEY_RIGHT: |
item = pgm_read_byte(&JetiBox_Menu[item].right); //trigger to right menu item |
break; |
case JETIBOX_KEY_UP: |
item = pgm_read_byte(&JetiBox_Menu[item].up); //trigger to up menu item |
break; |
case JETIBOX_KEY_DOWN: |
item = pgm_read_byte(&JetiBox_Menu[item].down); //trigger to down menu item |
break; |
default: |
break; |
} |
// if the menu item has been changed, do not pass the key to the item handler |
// to avoid jumping over to items |
if(item != last_item) key = JETIBOX_KEY_UNDEF; |
LIBFC_JetiBox_Clear(); |
//execute menu item handler |
((pFctMenu)(pgm_read_word(&(JetiBox_Menu[item].pHandler))))(key); |
return (0); |
} |
/branches/Znib/V0.78f/jetimenu.h |
---|
0,0 → 1,6 |
#ifndef _JETIMENU_H |
#define _JETIMENU_H |
extern unsigned char JetiBox_Update(unsigned char key); |
#endif //_JETIMENU_H |
/branches/Znib/V0.78f/led.c |
---|
0,0 → 1,99 |
#include <inttypes.h> |
#include "main.h" |
uint16_t LED1_Timing = 0; |
uint16_t LED2_Timing = 0; |
unsigned char J16Blinkcount = 0, J16Mask = 1; |
unsigned char J17Blinkcount = 0, J17Mask = 1; |
// initializes the LED control outputs J16, J17 |
void LED_Init(void) |
{ |
// set PC2 & PC3 as output (control of J16 & J17) |
DDRC |= (1<<DDC2)|(1<<DDC3); |
J16_OFF; |
J17_OFF; |
J16Blinkcount = 0; J16Mask = 128; |
J17Blinkcount = 0; J17Mask = 128; |
} |
// called in UpdateMotors() every 2ms |
void LED_Update(void) |
{ |
static char delay = 0; |
static unsigned char J16Bitmask = 0; |
static unsigned char J17Bitmask = 0; |
static unsigned char J16Warn = 0, J17Warn = 0; |
if(!delay--) // 10ms Intervall |
{ |
delay = 4; |
if(FCFlags & (FCFLAG_LOWBAT | FCFLAG_NOTLANDUNG | FCFLAG_I2CERR)) |
{ |
if(EE_Parameter.WARN_J16_Bitmask) |
{ |
if(!J16Warn) J16Blinkcount = 4; |
J16Warn = 1; |
} |
if(EE_Parameter.WARN_J17_Bitmask) |
{ |
if(!J17Warn) J17Blinkcount = 4; |
J17Warn = 1; |
} |
} |
else |
{ |
J16Warn = 0; |
J17Warn = 0; |
J16Bitmask = EE_Parameter.J16Bitmask; |
J17Bitmask = EE_Parameter.J17Bitmask; |
} |
if(!J16Warn) |
{ |
if((EE_Parameter.BitConfig & CFG_MOTOR_BLINK) && !MotorenEin) {if(EE_Parameter.BitConfig & CFG_MOTOR_OFF_LED1) J16_ON; else J16_OFF;} |
else |
if((EE_Parameter.J16Timing > 247) && (Parameter_J16Timing > 220)) {if(J16Bitmask & 128) J16_ON; else J16_OFF;} |
else |
if((EE_Parameter.J16Timing > 247) && (Parameter_J16Timing < 10)) {if(J16Bitmask & 128) J16_OFF; else J16_ON;} |
else |
if(!J16Blinkcount--) |
{ |
J16Blinkcount = Parameter_J16Timing-1; |
if(J16Mask == 1) J16Mask = 128; else J16Mask /= 2; |
if(J16Mask & J16Bitmask) J16_ON; else J16_OFF; |
} |
} |
else |
if(!J16Blinkcount--) |
{ |
J16Blinkcount = 10-1; |
if(J16Mask == 1) J16Mask = 128; else J16Mask /= 2; |
if(J16Mask & EE_Parameter.WARN_J16_Bitmask) J16_ON; else J16_OFF; |
} |
if(!J17Warn) |
{ |
if((EE_Parameter.BitConfig & CFG_MOTOR_BLINK) && !MotorenEin) {if(EE_Parameter.BitConfig & CFG_MOTOR_OFF_LED2) J17_ON; else J17_OFF;} |
else |
if((EE_Parameter.J17Timing > 247) && (Parameter_J17Timing > 220)) {if(J17Bitmask & 128) J17_ON; else J17_OFF;} |
else |
if((EE_Parameter.J17Timing > 247) && (Parameter_J17Timing < 10)) {if(J17Bitmask & 128) J17_OFF; else J17_ON;} |
else |
if(!J17Blinkcount--) |
{ |
J17Blinkcount = Parameter_J17Timing-1; |
if(J17Mask == 1) J17Mask = 128; else J17Mask /= 2; |
if(J17Mask & J17Bitmask) J17_ON; else J17_OFF; |
} |
} |
else |
if(!J17Blinkcount--) |
{ |
J17Blinkcount = 10-1; |
if(J17Mask == 1) J17Mask = 128; else J17Mask /= 2; |
if(J17Mask & EE_Parameter.WARN_J17_Bitmask) J17_ON; else J17_OFF; |
} |
} |
} |
/branches/Znib/V0.78f/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/Znib/V0.78f/libfc.h |
---|
0,0 → 1,20 |
#ifndef _LIBFC_H |
#define _LIBFC_H |
#define CPU_UNKNOWN 0 |
#define CPU_ATMEGA644 1 |
#define CPU_ATMEGA644P 2 |
#define CPU_ATMEGA1284 3 |
#define CPU_ATMEGA1284P 4 |
extern void LIBFC_Init(void); |
extern void LIBFC_Polling(void); |
extern void LIBFC_ReceiverInit(void); |
extern void LIBFC_JetiBox_Putchar(char c); |
extern void LIBFC_JetiBox_SetPos(unsigned char index); |
extern void LIBFC_JetiBox_Clear(void); |
extern unsigned char LIBFC_GetCPUType(void); |
#endif //_LIBFC_H |
/branches/Znib/V0.78f/libfc1284.a |
---|
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/Znib/V0.78f/libfc644.a |
---|
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/Znib/V0.78f/main.c |
---|
0,0 → 1,489 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) Holger Buss, Ingo Busker |
// + Nur für den privaten Gebrauch / NON-COMMERCIAL USE ONLY |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten und nicht-kommerziellen Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt und genannt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung oder Nutzung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-commercial use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be |
// + clearly linked as origin |
// + * porting the sources to other systems or using the software on other systems (except hardware from www.mikrokopter.de) is not allowed |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
unsigned char EEPromArray[E2END+1] EEMEM; |
unsigned char PlatinenVersion = 10; |
unsigned char SendVersionToNavi = 1; |
unsigned char BattLowVoltageWarning = 94; |
unsigned int FlugMinuten = 0,FlugMinutenGesamt = 0; |
unsigned int FlugSekunden = 0; |
pVoidFnct_pVoidFnctChar_const_fmt _printf_P; |
// -- 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); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_PARAM_LENGTH], length); // Länge der Datensätze merken |
eeprom_write_block(buffer, &EEPromArray[EEPROM_ADR_CHANNELS], 12); // 12 Kanäle merken |
SetActiveParamSetNumber(number); |
LED_Init(); |
} |
unsigned char GetActiveParamSetNumber(void) |
{ |
unsigned char set; |
set = eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET]); |
if((set > 5) || (set < 1)) |
{ |
set = 3; |
SetActiveParamSetNumber(set); // diesen Parametersatz als aktuell merken |
} |
return(set); |
} |
void SetActiveParamSetNumber(unsigned char number) |
{ |
if(number > 5) number = 5; |
if(number < 1) return; |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], number); // diesen Parametersatz als aktuell merken |
} |
void CalMk3Mag(void) |
{ |
static unsigned char stick = 1; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > -20) stick = 0; |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < -70) && !stick) |
{ |
stick = 1; |
WinkelOut.CalcState++; |
if(WinkelOut.CalcState > 4) |
{ |
// WinkelOut.CalcState = 0; // in Uart.c |
beeptime = 1000; |
} |
else Piep(WinkelOut.CalcState,150); |
} |
DebugOut.Analog[19] = WinkelOut.CalcState; |
} |
void LipoDetection(unsigned char print) |
{ |
unsigned int timer; |
if(print) printf("\n\rBatt:"); |
if(EE_Parameter.UnterspannungsWarnung < 50) // automatische Zellenerkennung |
{ |
timer = SetDelay(500); |
if(print) while (!CheckDelay(timer)); |
if(UBat < 130) |
{ |
BattLowVoltageWarning = 3 * EE_Parameter.UnterspannungsWarnung; |
if(print) |
{ |
Piep(3,200); |
printf(" 3 Cells "); |
} |
} |
else |
{ |
BattLowVoltageWarning = 4 * EE_Parameter.UnterspannungsWarnung; |
if(print) |
{ |
Piep(4,200); |
printf(" 4 Cells "); |
} |
} |
} |
else BattLowVoltageWarning = EE_Parameter.UnterspannungsWarnung; |
// if(BattLowVoltageWarning < 93) BattLowVoltageWarning = 93; |
if(print) printf(" Low warning level: %d.%d",BattLowVoltageWarning/10,BattLowVoltageWarning%10); |
} |
//############################################################################ |
//Hauptprogramm |
int main (void) |
//############################################################################ |
{ |
unsigned int timer,i,timer2 = 0, timerPolling; |
unsigned char RequiredMotors = 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 |
PORTD = 0x47; // LED |
HEF4017R_ON; |
MCUSR &=~(1<<WDRF); |
WDTCSR |= (1<<WDCE)|(1<<WDE); |
WDTCSR = 0; |
beeptime = 2000; |
StickGier = 0; PPM_in[K_GAS] = 0;StickRoll = 0; StickNick = 0; |
if(PlatinenVersion >= 20) GIER_GRAD_FAKTOR = 1160; else GIER_GRAD_FAKTOR = 1291; // unterschiedlich für ME und ENC |
ROT_OFF; |
Timer_Init(); |
TIMER2_Init(); |
UART_Init(); |
rc_sum_init(); |
ADC_Init(); |
i2c_init(); |
SPI_MasterInit(); |
Capacity_Init(); |
LIBFC_Init(); |
GRN_ON; |
sei(); |
ReadParameterSet(3, (unsigned char *) &EE_Parameter.Kanalbelegung[0], 13); // read only the first bytes |
if((eeprom_read_byte(&EEPromArray[EEPROM_ADR_MIXER_TABLE]) == MIXER_REVISION) && // Check Revision in the first Byte |
(eeprom_read_byte(&EEPromArray[EEPROM_ADR_VALID]) != 0xff)) // Settings reset via Koptertool |
{ |
unsigned char i; |
eeprom_read_block(&Mixer, &EEPromArray[EEPROM_ADR_MIXER_TABLE], sizeof(Mixer)); |
for(i=0; i<16;i++) { if(Mixer.Motor[i][0] > 0) RequiredMotors++;} |
} |
else // default |
{ |
unsigned char i; |
printf("\n\rGenerating default Mixer Table"); |
for(i=0; i<16;i++) { Mixer.Motor[i][0] = 0;Mixer.Motor[i][1] = 0;Mixer.Motor[i][2] = 0;Mixer.Motor[i][3] = 0;}; |
// default = Quadro |
Mixer.Motor[0][0] = 64; Mixer.Motor[0][1] = +64; Mixer.Motor[0][2] = 0; Mixer.Motor[0][3] = +64; |
Mixer.Motor[1][0] = 64; Mixer.Motor[1][1] = -64; Mixer.Motor[1][2] = 0; Mixer.Motor[1][3] = +64; |
Mixer.Motor[2][0] = 64; Mixer.Motor[2][1] = 0; Mixer.Motor[2][2] = -64; Mixer.Motor[2][3] = -64; |
Mixer.Motor[3][0] = 64; Mixer.Motor[3][1] = 0; Mixer.Motor[3][2] = +64; Mixer.Motor[3][3] = -64; |
Mixer.Revision = MIXER_REVISION; |
memcpy(Mixer.Name, "Quadro\0", 11); |
eeprom_write_block(&Mixer, &EEPromArray[EEPROM_ADR_MIXER_TABLE], sizeof(Mixer)); |
} |
printf("\n\rMixer-Config: '%s' (%u Motors)",Mixer.Name,RequiredMotors); |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Check connected BL-Ctrls |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
motorread = 0; UpdateMotor = 0; SendMotorData(); while(!UpdateMotor); motorread = 0; // read the first I2C-Data |
printf("\n\rFound BL-Ctrl: "); |
timer = SetDelay(4000); |
for(i=0; i < MAX_MOTORS; i++) |
{ |
UpdateMotor = 0; |
SendMotorData(); |
while(!UpdateMotor); |
if(Mixer.Motor[i][0] > 0) // wait max 4 sec for the BL-Ctrls to wake up |
{ |
while(!CheckDelay(timer) && !(Motor[i].State & MOTOR_STATE_PRESENT_MASK) ) {UpdateMotor = 0; SendMotorData(); while(!UpdateMotor);}; |
} |
if(Motor[i].State & MOTOR_STATE_PRESENT_MASK) printf("%d ",i+1); |
} |
for(i=0; i < MAX_MOTORS; i++) |
{ |
if(!(Motor[i].State & MOTOR_STATE_PRESENT_MASK) && Mixer.Motor[i][0] > 0) |
{ |
printf("\n\r\n\r!! MISSING BL-CTRL: %d !!",i+1); |
ServoActive = 1; // just in case the FC would be used as camera-stabilizer |
} |
Motor[i].State &= ~MOTOR_STATE_ERROR_MASK; // clear error counter |
} |
printf("\n\r==================================="); |
SendMotorData(); |
//printf("\n size: %u",STRUCT_PARAM_LAENGE); |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Check Settings |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_VALID]) != EE_DATENREVISION) |
{ |
DefaultKonstanten1(); |
printf("\n\rInit. EEPROM"); |
for (unsigned char i=1;i<6;i++) |
{ |
if(i==2) DefaultKonstanten2(); // Kamera |
if(i==3) DefaultKonstanten3(); // Beginner |
if(i>3) DefaultKonstanten2(); // Kamera |
if(PlatinenVersion >= 20) |
{ |
EE_Parameter.Gyro_D = 5; |
EE_Parameter.Driftkomp = 0; |
EE_Parameter.GyroAccFaktor = 27; |
EE_Parameter.WinkelUmschlagNick = 78; |
EE_Parameter.WinkelUmschlagRoll = 78; |
} |
// valid Stick-Settings? |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS]) < 12 && eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+1]) < 12 && eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+2]) < 12 && eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+3]) < 12) |
{ |
EE_Parameter.Kanalbelegung[0] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+0]); |
EE_Parameter.Kanalbelegung[1] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+1]); |
EE_Parameter.Kanalbelegung[2] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+2]); |
EE_Parameter.Kanalbelegung[3] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+3]); |
EE_Parameter.Kanalbelegung[4] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+4]); |
EE_Parameter.Kanalbelegung[5] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+5]); |
EE_Parameter.Kanalbelegung[6] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+6]); |
EE_Parameter.Kanalbelegung[7] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+7]); |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+8]) < 255) |
{ |
EE_Parameter.Kanalbelegung[K_POTI5] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+8]); |
EE_Parameter.Kanalbelegung[K_POTI6] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+9]); |
EE_Parameter.Kanalbelegung[K_POTI7] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+10]); |
EE_Parameter.Kanalbelegung[K_POTI8] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+11]); |
} |
else |
{ |
EE_Parameter.Kanalbelegung[K_POTI5] = 9; |
EE_Parameter.Kanalbelegung[K_POTI6] = 10; |
EE_Parameter.Kanalbelegung[K_POTI7] = 11; |
EE_Parameter.Kanalbelegung[K_POTI8] = 12; |
} |
if(i==1) printf(": Generating Default-Parameter using old Stick Settings"); |
} else DefaultStickMapping(); |
WriteParameterSet(i, (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
} |
SetActiveParamSetNumber(3); // default-Setting |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_VALID], EE_DATENREVISION); |
} |
FlugMinuten = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_MINUTES2]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_MINUTES2+1]); |
FlugMinutenGesamt = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_MINUTES]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_MINUTES+1]); |
if(FlugMinutenGesamt == 0xffff || FlugMinuten == 0xffff) |
{ |
FlugMinuten = 0; |
FlugMinutenGesamt = 0; |
} |
printf("\n\rFlight-time %u min Total:%u min" ,FlugMinuten,FlugMinutenGesamt); |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) > 4) |
{ |
printf("\n\rACC not calibrated !"); |
} |
ReadParameterSet(GetActiveParamSetNumber(), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
printf("\n\rUsing parameterset %d", GetActiveParamSetNumber()); |
//if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
printf("\n\rCalibrating pressure sensor.."); |
timer = SetDelay(1000); |
SucheLuftruckOffset(); |
while (!CheckDelay(timer)); |
printf("OK\n\r"); |
} |
SetNeutral(); |
ROT_OFF; |
beeptime = 2000; |
ExternControl.Digital[0] = 0x55; |
printf("\n\rControl: "); |
if (EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) printf("HeadingHold"); |
else printf("Normal (ACC-Mode)"); |
LcdClear(); |
I2CTimeout = 5000; |
WinkelOut.Orientation = 1; |
LipoDetection(1); |
LIBFC_ReceiverInit(); |
printf("\n\r===================================\n\r"); |
//SpektrumBinding(); |
timer = SetDelay(2000); |
timerPolling = SetDelay(250); |
while (1) |
{ |
if(CheckDelay(timerPolling)) |
{ |
timerPolling = SetDelay(100); |
LIBFC_Polling(); |
} |
if(UpdateMotor && AdReady) // ReglerIntervall |
{ |
UpdateMotor=0; |
if(WinkelOut.CalcState) CalMk3Mag(); |
else MotorRegler(); |
SendMotorData(); |
ROT_OFF; |
if(SenderOkay) SenderOkay--; |
else TIMSK1 |= _BV(ICIE1); // enable PPM-Input |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//if(HoehenReglerAktiv && NaviDataOkay && SenderOkay < 160 && SenderOkay > 10 && FromNaviCtrl_Value.SerialDataOkay > 220) SenderOkay = 160; |
//if(HoehenReglerAktiv && NaviDataOkay && SenderOkay < 101 && SenderOkay > 10 && FromNaviCtrl_Value.SerialDataOkay > 1) SenderOkay = 101; |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!--I2CTimeout || MissingMotor) |
{ |
if(!I2CTimeout) |
{ |
i2c_reset(); |
I2CTimeout = 5; |
DebugOut.Analog[28]++; // I2C-Error |
FCFlags |= FCFLAG_I2CERR; |
} |
if((BeepMuster == 0xffff) && MotorenEin) |
{ |
beeptime = 10000; |
BeepMuster = 0x0080; |
} |
} |
else |
{ |
ROT_OFF; |
if(!beeptime) FCFlags &= ~FCFLAG_I2CERR; |
} |
if(SIO_DEBUG && (!UpdateMotor || !MotorenEin)) |
{ |
DatenUebertragung(); |
BearbeiteRxDaten(); |
} |
else BearbeiteRxDaten(); |
if(CheckDelay(timer)) |
{ |
static unsigned char second; |
timer += 20; // 20 ms interval |
if(PcZugriff) PcZugriff--; |
else |
{ |
ExternControl.Config = 0; |
ExternStickNick = 0; |
ExternStickRoll = 0; |
ExternStickGier = 0; |
if(BeepMuster == 0xffff && SenderOkay == 0) |
{ |
beeptime = 15000; |
BeepMuster = 0x0c00; |
} |
} |
if(NaviDataOkay) |
{ |
NaviDataOkay--; |
FCFlags &= ~FCFLAG_SPI_RX_ERR; |
} |
else |
{ |
GPS_Nick = 0; |
GPS_Roll = 0; |
if(!beeptime) FCFlags |= FCFLAG_SPI_RX_ERR; |
} |
if(UBat < BattLowVoltageWarning) |
{ |
FCFlags |= FCFLAG_LOWBAT; |
if(BeepMuster == 0xffff) |
{ |
beeptime = 6000; |
BeepMuster = 0x0300; |
} |
} |
else if(!beeptime) FCFlags &= ~FCFLAG_LOWBAT; |
SPI_StartTransmitPacket(); |
SendSPI = 4; |
if(!MotorenEin) timer2 = 1450; // 0,5 Minuten aufrunden |
else |
if(++second == 49) |
{ |
second = 0; |
FlugSekunden++; |
} |
if(++timer2 == 2930) // eine Minute |
{ |
timer2 = 0; |
FlugMinuten++; |
FlugMinutenGesamt++; |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_MINUTES2],FlugMinuten / 256); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_MINUTES2+1],FlugMinuten % 256); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_MINUTES],FlugMinutenGesamt / 256); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_MINUTES+1],FlugMinutenGesamt % 256); |
timer = SetDelay(20); // falls "timer += 20;" mal nicht geht |
} |
} |
LED_Update(); |
Capacity_Update(); |
} |
if(!SendSPI) { SPI_TransmitByte(); } |
} |
return (1); |
} |
/branches/Znib/V0.78f/main.h |
---|
0,0 → 1,134 |
#ifndef _MAIN_H |
#define _MAIN_H |
#define QUADRO |
//#define ACT_S3D_SUMMENSIGNAL |
// neue Hardware |
#define ROT_OFF {if((PlatinenVersion == 10)||(PlatinenVersion == 20)) PORTB &=~0x01; else PORTB |= 0x01;} |
#define ROT_ON {if((PlatinenVersion == 10)||(PlatinenVersion == 20)) PORTB |= 0x01; else PORTB &=~0x01;} |
#define ROT_FLASH PORTB ^= 0x01 |
#define GRN_OFF {if((PlatinenVersion < 12)) PORTB &=~0x02; else PORTB |= 0x02;} |
#define GRN_ON {if((PlatinenVersion < 12)) PORTB |= 0x02; else PORTB &=~0x02;} |
#define GRN_FLASH PORTB ^= 0x02 |
#define SYSCLK F_CPU |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define EE_DATENREVISION 82 // Parameter fürs Koptertool; wird angepasst, wenn sich die EEPROM-Daten geändert haben |
#define MIXER_REVISION 1 // wird angepasst, wenn sich die Mixer-Daten geändert haben |
#define EEPROM_ADR_VALID 1 |
#define EEPROM_ADR_ACTIVE_SET 2 |
#define EEPROM_ADR_LAST_OFFSET 3 |
#define EEPROM_ADR_ACC_NICK 4 |
#define EEPROM_ADR_ACC_ROLL 6 |
#define EEPROM_ADR_ACC_Z 8 |
#define EEPROM_ADR_MINUTES 10 |
#define EEPROM_ADR_MINUTES2 14 |
#define EEPROM_ADR_CHANNELS 80 |
#define EEPROM_ADR_PARAM_LENGTH 98 |
#define EEPROM_ADR_PARAM_BEGIN 100 |
#define EEPROM_ADR_MIXER_TABLE 1000 // 1001 - 1100 |
#define CFG_HOEHENREGELUNG 0x01 |
#define CFG_HOEHEN_SCHALTER 0x02 |
#define CFG_HEADING_HOLD 0x04 |
#define CFG_KOMPASS_AKTIV 0x08 |
#define CFG_KOMPASS_FIX 0x10 |
#define CFG_GPS_AKTIV 0x20 |
#define CFG_ACHSENKOPPLUNG_AKTIV 0x40 |
#define CFG_DREHRATEN_BEGRENZER 0x80 |
#define CFG_LOOP_OBEN 0x01 |
#define CFG_LOOP_UNTEN 0x02 |
#define CFG_LOOP_LINKS 0x04 |
#define CFG_LOOP_RECHTS 0x08 |
#define CFG_MOTOR_BLINK 0x10 |
#define CFG_MOTOR_OFF_LED1 0x20 |
#define CFG_MOTOR_OFF_LED2 0x40 |
#define CFG_RES4 0x80 |
#define CFG2_HEIGHT_LIMIT 0x01 |
#define CFG2_VARIO_BEEP 0x02 |
#define CFG_SENSITIVE_RC 0x04 |
#define RECEIVER_PPM 0 |
#define RECEIVER_SPEKTRUM 1 |
#define RECEIVER_SPEKTRUM_HI_RES 2 |
#define RECEIVER_SPEKTRUM_LOW_RES 3 |
#define RECEIVER_JETI 4 |
#define RECEIVER_ACT_DSL 5 |
#define RECEIVER_UNKNOWN 0xFF |
#define J3High PORTD |= 0x20 |
#define J3Low PORTD &= ~0x20 |
#define J4High PORTD |= 0x10 |
#define J4Low PORTD &= ~0x10 |
#define J5High PORTD |= 0x08 |
#define J5Low PORTD &= ~0x08 |
extern volatile unsigned char SenderOkay; |
extern unsigned char BattLowVoltageWarning; |
extern unsigned char CosinusNickWinkel, CosinusRollWinkel; |
extern unsigned char PlatinenVersion; |
extern unsigned char SendVersionToNavi; |
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); |
void LipoDetection(unsigned char print); |
extern unsigned char EEPromArray[]; |
extern unsigned int FlugMinuten,FlugMinutenGesamt,FlugSekunden; |
#include <stdlib.h> |
#include <string.h> |
#include <avr/io.h> |
#include <avr/pgmspace.h> |
#include <avr/interrupt.h> |
#include <avr/eeprom.h> |
#include <avr/boot.h> |
#include <avr/wdt.h> |
#include "old_macros.h" |
#include "_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" |
#include "spektrum.h" |
#include "capacity.h" |
#include "libfc.h" |
#ifndef EEMEM |
#define EEMEM __attribute__ ((section (".eeprom"))) |
#endif |
#define DEBUG_DISPLAY_INTERVALL 123 // in ms |
#define DELAY_US(x) ((unsigned int)( (x) * 1e-6 * F_CPU )) |
#endif //_MAIN_H |
/branches/Znib/V0.78f/makefile |
---|
0,0 → 1,454 |
#-------------------------------------------------------------------- |
# MCU name |
#MCU = atmega1284p |
MCU = atmega644p |
F_CPU = 20000000 |
#------------------------------------------------------------------- |
VERSION_MAJOR = 0 |
VERSION_MINOR = 78 |
VERSION_PATCH = 5 |
VERSION_SERIAL_MAJOR = 11 # Serial Protocol |
VERSION_SERIAL_MINOR = 0 # Serial Protocol |
NC_SPI_COMPATIBLE = 12 # Navi-Kompatibilität |
#------------------------------------------------------------------- |
# get SVN revision |
REV := $(shell sh -c "cat .svn/entries | sed -n '4p'") |
ifeq ($(MCU), atmega1284p) |
FUSE_SETTINGS = -u -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
HEX_NAME = MEGA1284P |
LIBFC_EXT = 1284 |
endif |
ifeq ($(MCU), atmega644p) |
FUSE_SETTINGS = -u -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
HEX_NAME = MEGA644 |
LIBFC_EXT = 644 |
endif |
ifeq ($(F_CPU), 16000000) |
QUARZ = 16MHZ |
endif |
ifeq ($(F_CPU), 20000000) |
QUARZ = 20MHZ |
endif |
# Output format. (can be srec, ihex, binary) |
FORMAT = ihex |
# Target file name (without extension). |
ifeq ($(VERSION_PATCH), 0) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)a_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 1) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)b_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 2) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)c_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 3) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)d_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 4) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)e_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 5) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)f_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 6) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)g_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 7) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)h_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 8) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)i_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 9) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)j_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 10) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)k_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 11) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)L_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 12) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)m_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 13) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)n_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 14) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)o_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 15) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)p_SVN$(REV) |
endif |
ifeq ($(VERSION_PATCH), 16) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)q_SVN$(REV) |
endif |
# 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.) |
# znib: war auf OPT=s |
#OPT = s |
OPT = 2 |
########################################################################################################## |
# List C source files here. (C dependencies are automatically generated.) |
SRC = main.c uart.c timer0.c analog.c menu.c |
SRC += twimaster.c rc.c fc.c GPS.c spi.c led.c Spektrum.c |
SRC += mymath.c jetimenu.c capacity.c |
########################################################################################################## |
# List Assembler source files here. |
# Make them always end in a capital .S. Files ending in a lowercase .s |
# will not be considered source files but generated files (assembler |
# output from the compiler), and will be deleted upon "make clean"! |
# Even though the DOS/Win* filesystem matches both .s and .S the same, |
# it will preserve the spelling of the filenames, and gcc itself does |
# care about how the name is spelled on its command-line. |
ASRC = isqrt.S |
# List any extra directories to look for include files here. |
# Each directory must be seperated by a space. |
EXTRAINCDIRS = |
# Optional compiler flags. |
# -g: generate debugging information (for GDB, or for COFF conversion) |
# -O*: optimization level |
# -f...: tuning, see gcc manual and avr-libc documentation |
# -Wall...: warning level |
# -Wa,...: tell GCC to pass this to the assembler. |
# -ahlms: create assembler listing |
CFLAGS = -O$(OPT) -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=$(<:%.c=%.lst) $(patsubst %,-I%,$(EXTRAINCDIRS)) |
# Set a "language standard" compiler flag. |
# Unremark just one line below to set the language standard to use. |
# gnu99 = C99 + GNU extensions. See GCC manual for more information. |
#CFLAGS += -std=c89 |
#CFLAGS += -std=gnu89 |
#CFLAGS += -std=c99 |
CFLAGS += -std=gnu99 |
# shrink code size |
CFLAGS += -mtiny-stack |
#CFLAGS += -fno-inline-functions |
CFLAGS += -mcall-prologues |
CFLAGS += -DF_CPU=$(F_CPU) -DVERSION_MAJOR=$(VERSION_MAJOR) -DVERSION_MINOR=$(VERSION_MINOR) -DVERSION_PATCH=$(VERSION_PATCH) -DVERSION_SERIAL_MAJOR=$(VERSION_SERIAL_MAJOR) -DVERSION_SERIAL_MINOR=$(VERSION_SERIAL_MINOR) -DNC_SPI_COMPATIBLE=$(NC_SPI_COMPATIBLE) |
# Optional assembler flags. |
# -Wa,...: tell GCC to pass this to the assembler. |
# -ahlms: create listing |
# -gstabs: have the assembler create line number information; note that |
# for use in COFF files, additional information about filenames |
# and function names needs to be present in the assembler source |
# files -- see avr-libc docs [FIXME: not yet described there] |
ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs |
# Optional linker flags. |
# -Wl,...: tell GCC to pass this to linker. |
# -Map: create map file |
# --cref: add cross reference to map file |
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref |
# Additional libraries |
# Minimalistic printf version |
#LDFLAGS += -Wl,-u,vfprintf -lprintf_min |
# Floating point printf version (requires -lm below) |
#LDFLAGS += -Wl,-u,vfprintf -lprintf_flt |
# -lm = math library |
LDFLAGS += -lm |
LDFLAGS += libfc$(LIBFC_EXT).a |
##LDFLAGS += -T./linkerfile/avr5.x |
# Programming support using avrdude. Settings and variables. |
# Programming hardware: alf avr910 avrisp bascom bsd |
# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500 |
# |
# Type: avrdude -c ? |
# to get a full listing. |
# |
#AVRDUDE_PROGRAMMER = dt006 |
#AVRDUDE_PROGRAMMER = stk200 |
#AVRDUDE_PROGRAMMER = ponyser |
AVRDUDE_PROGRAMMER = avrispv2 |
#falls Ponyser ausgewählt wird, muss sich unsere avrdude-Configdatei im Bin-Verzeichnis des Compilers befinden |
#AVRDUDE_PORT = com1 # programmer connected to serial device |
#AVRDUDE_PORT = lpt1 # programmer connected to parallel port |
AVRDUDE_PORT = usb # programmer connected to USB |
#AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex |
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex $(FUSE_SETTINGS) |
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep |
#avrdude -c avrispv2 -P usb -p m32 -U flash:w:blink.hex |
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) |
# Uncomment the following if you want avrdude's erase cycle counter. |
# Note that this counter needs to be initialized first using -Yn, |
# see avrdude manual. |
#AVRDUDE_ERASE += -y |
# Uncomment the following if you do /not/ wish a verification to be |
# performed after programming the device. |
AVRDUDE_FLAGS += -V |
# Increase verbosity level. Please use this when submitting bug |
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude> |
# to submit bug reports. |
#AVRDUDE_FLAGS += -v -v |
# --------------------------------------------------------------------------- |
# Define directories, if needed. |
DIRAVR = c:/winavr |
DIRAVRBIN = $(DIRAVR)/bin |
DIRAVRUTILS = $(DIRAVR)/utils/bin |
DIRINC = . |
DIRLIB = $(DIRAVR)/avr/lib |
# Define programs and commands. |
SHELL = sh |
CC = avr-gcc |
OBJCOPY = avr-objcopy |
OBJDUMP = avr-objdump |
SIZE = avr-size |
# Programming support using avrdude. |
AVRDUDE = avrdude |
REMOVE = rm -f |
COPY = cp |
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex |
ELFSIZE = $(SIZE) -A $(TARGET).elf |
LIMITS = $(SIZE) --mcu=$(MCU) -C $(TARGET).elf |
# Define Messages |
# English |
MSG_ERRORS_NONE = Errors: none |
MSG_BEGIN = -------- begin -------- |
MSG_END = -------- end -------- |
MSG_SIZE_BEFORE = Size before: |
MSG_SIZE_AFTER = Size after: |
MSG_COFF = Converting to AVR COFF: |
MSG_EXTENDED_COFF = Converting to AVR Extended COFF: |
MSG_FLASH = Creating load file for Flash: |
MSG_EEPROM = Creating load file for EEPROM: |
MSG_EXTENDED_LISTING = Creating Extended Listing: |
MSG_SYMBOL_TABLE = Creating Symbol Table: |
MSG_LINKING = Linking: |
MSG_COMPILING = Compiling: |
MSG_ASSEMBLING = Assembling: |
MSG_CLEANING = Cleaning project: |
# Define all object files. |
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) |
# Define all listing files. |
LST = $(ASRC:.S=.lst) $(SRC:.c=.lst) |
# Combine all necessary flags and optional flags. |
# Add target processor to flags. |
#ALL_CFLAGS = -mmcu=$(MCU) -DF_CPU=$(F_CPU) -I. $(CFLAGS) |
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) |
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) |
# Default target. |
all: begin gccversion sizebefore $(TARGET).elf $(TARGET).hex sizeafter finished end |
# Eye candy. |
# AVR Studio 3.x does not check make's exit code but relies on |
# the following magic strings to be generated by the compile job. |
begin: |
@echo |
@echo $(MSG_BEGIN) |
finished: |
@echo $(MSG_ERRORS_NONE) |
end: |
@echo $(MSG_END) |
@echo |
# Display size of file. |
sizebefore: |
@if [ -f $(TARGET).elf ]; then echo Size before:; $(ELFSIZE); $(HEXSIZE); $(LIMITS); echo; fi |
sizeafter: |
@if [ -f $(TARGET).elf ]; then echo Size after:; $(ELFSIZE); $(HEXSIZE); $(LIMITS); echo; fi |
# Display compiler version information. |
gccversion : |
@$(CC) --version |
# Convert ELF to COFF for use in debugging / simulating in |
# AVR Studio or VMLAB. |
COFFCONVERT=$(OBJCOPY) --debugging \ |
--change-section-address .data-0x800000 \ |
--change-section-address .bss-0x800000 \ |
--change-section-address .noinit-0x800000 \ |
--change-section-address .eeprom-0x810000 |
coff: $(TARGET).elf |
@echo |
@echo $(MSG_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof |
extcoff: $(TARGET).elf |
@echo |
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof |
# Program the device. |
program: $(TARGET).hex $(TARGET).eep |
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) |
# Create final output files (.hex, .eep) from ELF output file. |
%.hex: %.elf |
@echo |
@echo $(MSG_FLASH) $@ |
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ |
%.eep: %.elf |
@echo |
@echo $(MSG_EEPROM) $@ |
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ |
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@ |
# Create extended listing file from ELF output file. |
%.lss: %.elf |
@echo |
@echo $(MSG_EXTENDED_LISTING) $@ |
$(OBJDUMP) -h -S $< > $@ |
# Create a symbol table from ELF output file. |
%.sym: %.elf |
@echo |
@echo $(MSG_SYMBOL_TABLE) $@ |
avr-nm -n $< > $@ |
# Link: create ELF output file from object files. |
.SECONDARY : $(TARGET).elf |
.PRECIOUS : $(OBJ) |
%.elf: $(OBJ) |
@echo |
@echo $(MSG_LINKING) $@ |
$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) |
# Compile: create object files from C source files. |
%.o : %.c |
@echo |
@echo $(MSG_COMPILING) $< |
$(CC) -c $(ALL_CFLAGS) $< -o $@ |
# Compile: create assembler files from C source files. |
%.s : %.c |
$(CC) -S $(ALL_CFLAGS) $< -o $@ |
# Assemble: create object files from assembler source files. |
%.o : %.S |
@echo |
@echo $(MSG_ASSEMBLING) $< |
$(CC) -c $(ALL_ASFLAGS) $< -o $@ |
# Target: clean project. |
clean: begin clean_list finished end |
clean_list : |
@echo |
@echo $(MSG_CLEANING) |
$(REMOVE) Flight-Ctrl_*.hex |
$(REMOVE) Flight-Ctrl_*.eep |
$(REMOVE) $(TARGET).obj |
$(REMOVE) $(TARGET).cof |
$(REMOVE) Flight-Ctrl_*.elf |
$(REMOVE) Flight-Ctrl_*.map |
$(REMOVE) $(TARGET).obj |
$(REMOVE) $(TARGET).a90 |
$(REMOVE) Flight-Ctrl_*.sym |
$(REMOVE) $(TARGET).lnk |
$(REMOVE) $(TARGET).lss |
$(REMOVE) $(OBJ) |
$(REMOVE) $(LST) |
$(REMOVE) $(SRC:.c=.s) |
$(REMOVE) $(SRC:.c=.d) |
$(REMOVE) $(SRC:.c=.o) |
# Automatically generate C source code dependencies. |
# (Code originally taken from the GNU make user manual and modified |
# (See README.txt Credits).) |
# |
# Note that this will work with sh (bash) and sed that is shipped with WinAVR |
# (see the SHELL variable defined above). |
# This may not work with other shells or other seds. |
# |
%.d: %.c |
set -e; $(CC) -MM $(ALL_CFLAGS) $< \ |
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > $@; \ |
[ -s $@ ] || rm -f $@ |
# Remove the '-' if you want to see the dependency files generated. |
-include $(SRC:%.c=%.d) |
# Listing of phony targets. |
.PHONY : all begin finish end sizebefore sizeafter gccversion coff extcoff \ |
clean clean_list program |
/branches/Znib/V0.78f/menu.c |
---|
0,0 → 1,192 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) Holger Buss, Ingo Busker |
// + only for non-profit use |
// + www.MikroKopter.com |
// + porting the sources to other systems or using the software on other systems (except hardware from www.mikrokopter.de) is not allowed |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
char DisplayBuff[80] = "Hallo Welt"; |
unsigned char DispPtr = 0; |
unsigned char MaxMenue = 16; |
unsigned char MenuePunkt = 0; |
unsigned char RemoteKeys = 0; |
#define KEY1 0x01 |
#define KEY2 0x02 |
#define KEY3 0x04 |
#define KEY4 0x08 |
#define KEY5 0x10 |
void LcdClear(void) |
{ |
unsigned char i; |
for(i=0;i<80;i++) DisplayBuff[i] = ' '; |
} |
void Menu_Putchar(char c) |
{ |
DisplayBuff[DispPtr++] = c; |
} |
void Menu(void) |
{ |
if(RemoteKeys & KEY1) { if(MenuePunkt) MenuePunkt--; else MenuePunkt = MaxMenue;} |
if(RemoteKeys & KEY2) { if(MenuePunkt == MaxMenue) MenuePunkt = 0; else MenuePunkt++;} |
if((RemoteKeys & KEY1) && (RemoteKeys & KEY2)) MenuePunkt = 0; |
LcdClear(); |
if(MenuePunkt < 10) {LCD_printfxy(17,0,"[%i]",MenuePunkt);} |
else {LCD_printfxy(16,0,"[%i]",MenuePunkt);}; |
switch(MenuePunkt) |
{ |
case 0: |
LCD_printfxy(0,0,"+ MikroKopter +"); |
LCD_printfxy(0,1,"HW:V%d.%d SW:%d.%d%c",PlatinenVersion/10,PlatinenVersion%10, VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH +'a'); |
LCD_printfxy(0,2,"Setting:%d %s",GetActiveParamSetNumber(),Mixer.Name); |
if(I2CTimeout < 6) LCD_printfxy(0,3,"I2C ERROR!!!") |
else |
if(MissingMotor) LCD_printfxy(0,3,"Missing BL-Ctrl:%d!!",MissingMotor) |
break; |
case 1: |
if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
LCD_printfxy(0,0,"Height: %5i",(int)(HoehenWert/5)); |
LCD_printfxy(0,1,"Setpoint:%5i",(int)(SollHoehe/5)); |
LCD_printfxy(0,2,"Pressure:%5i",MessLuftdruck); |
LCD_printfxy(0,3,"Offset: %5i",OCR0A); |
} |
else |
{ |
LCD_printfxy(0,0,"Height control"); |
LCD_printfxy(0,1,"DISABLED"); |
LCD_printfxy(0,2,"Height control"); |
LCD_printfxy(0,3,"DISABLED"); |
} |
break; |
case 2: |
LCD_printfxy(0,0,"act. bearing"); |
LCD_printfxy(0,1,"Nick: %5i",IntegralNick/1024); |
LCD_printfxy(0,2,"Roll: %5i",IntegralRoll/1024); |
LCD_printfxy(0,3,"Compass: %5i",KompassValue); |
break; |
case 3: |
LCD_printfxy(0,0,"K1:%4i K2:%4i ",PPM_in[1],PPM_in[2]); |
LCD_printfxy(0,1,"K3:%4i K4:%4i ",PPM_in[3],PPM_in[4]); |
LCD_printfxy(0,2,"K5:%4i K6:%4i ",PPM_in[5],PPM_in[6]); |
LCD_printfxy(0,3,"K7:%4i K8:%4i ",PPM_in[7],PPM_in[8]); |
break; |
case 4: |
LCD_printfxy(0,0,"Ni:%4i Ro:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_NICK]],PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]); |
LCD_printfxy(0,1,"Gs:%4i Gi:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_GAS]]+120,PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]); |
LCD_printfxy(0,2,"P1:%4i P2:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]]+110,PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]]+110); |
LCD_printfxy(0,3,"P3:%4i P4:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]]+110,PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]]+110); |
break; |
case 5: |
LCD_printfxy(0,0,"Gyro - Sensor"); |
if(PlatinenVersion == 10) |
{ |
LCD_printfxy(0,1,"Nick%4i (%3i.%i)",AdWertNick - AdNeutralNick/8, AdNeutralNick/8, AdNeutralNick%8); |
LCD_printfxy(0,2,"Roll%4i (%3i.%i)",AdWertRoll - AdNeutralRoll/8, AdNeutralRoll/8, AdNeutralRoll%8); |
LCD_printfxy(0,3,"Gier%4i (%3i)",AdNeutralGier - AdWertGier, AdNeutralGier); |
} |
else |
if((PlatinenVersion == 11) || (PlatinenVersion == 20)) |
{ |
LCD_printfxy(0,1,"Nick %4i (%3i.%x)",AdWertNick - AdNeutralNick/8, AdNeutralNick/16, (AdNeutralNick%16)/2); |
LCD_printfxy(0,2,"Roll %4i (%3i.%x)",AdWertRoll - AdNeutralRoll/8, AdNeutralRoll/16, (AdNeutralRoll%16)/2); |
LCD_printfxy(0,3,"Yaw %4i (%3i)",AdNeutralGier - AdWertGier, AdNeutralGier/2); |
} |
else |
if(PlatinenVersion == 13) |
{ |
LCD_printfxy(0,1,"Nick %4i (%3i)(%3i)",AdWertNick - AdNeutralNick/8, AdNeutralNick/16,AnalogOffsetNick); |
LCD_printfxy(0,2,"Roll %4i (%3i)(%3i)",AdWertRoll - AdNeutralRoll/8, AdNeutralRoll/16,AnalogOffsetRoll); |
LCD_printfxy(0,3,"Yaw %4i (%3i)(%3i)",AdNeutralGier - AdWertGier, AdNeutralGier/2,AnalogOffsetGier); |
} |
break; |
case 6: |
LCD_printfxy(0,0,"ACC - Sensor"); |
LCD_printfxy(0,1,"Nick %4i (%3i)",AdWertAccNick,NeutralAccX); |
LCD_printfxy(0,2,"Roll %4i (%3i)",AdWertAccRoll,NeutralAccY); |
LCD_printfxy(0,3,"Z %4i (%3i)",Mittelwert_AccHoch/*accumulate_AccHoch / messanzahl_AccHoch*/,(int)NeutralAccZ); |
break; |
case 7: |
LCD_printfxy(0,0,"Voltage: %3i.%1iV",UBat/10, UBat%10); |
LCD_printfxy(0,1,"Current: %3i.%1iA",Capacity.ActualCurrent/10, Capacity.ActualCurrent%10); |
LCD_printfxy(0,2,"Power: %4iW",Capacity.ActualPower); |
LCD_printfxy(0,3,"Discharge: %5imAh", Capacity.UsedCapacity); |
break; |
case 8: |
LCD_printfxy(0,0,"Receiver"); |
LCD_printfxy(0,1,"RC-RSSI: %4i", PPM_in[0]); |
LCD_printfxy(0,2,"RC-Quality: %4i", SenderOkay); |
LCD_printfxy(0,3,"RC-Channels:%4i", Channels-1); |
break; |
case 9: |
LCD_printfxy(0,0,"Compass"); |
LCD_printfxy(0,1,"Heading: %5i",KompassRichtung); |
LCD_printfxy(0,2,"Value: %5i",KompassValue); |
LCD_printfxy(0,3,"Start: %5i",KompassStartwert); |
break; |
case 10: |
LCD_printfxy(0,0,"Poti1: %3i",Poti[0]); |
LCD_printfxy(0,1,"Poti2: %3i",Poti[1]); |
LCD_printfxy(0,2,"Poti3: %3i",Poti[2]); |
LCD_printfxy(0,3,"Poti4: %3i",Poti[3]); |
break; |
case 11: |
LCD_printfxy(0,0,"Poti5: %3i",Poti[4]); |
LCD_printfxy(0,1,"Poti6: %3i",Poti[5]); |
LCD_printfxy(0,2,"Poti7: %3i",Poti[6]); |
LCD_printfxy(0,3,"Poti8: %3i",Poti[7]); |
break; |
case 12: |
LCD_printfxy(0,0,"Servo " ); |
LCD_printfxy(0,1,"Setpoint %3i",Parameter_ServoNickControl); |
LCD_printfxy(0,2,"Position: %3i",ServoNickValue); |
LCD_printfxy(0,3,"Range:%3i-%3i",EE_Parameter.ServoNickMin,EE_Parameter.ServoNickMax); |
break; |
case 13: |
LCD_printfxy(0,0,"ExternControl " ); |
LCD_printfxy(0,1,"Ni:%4i Ro:%4i ",ExternControl.Nick,ExternControl.Roll); |
LCD_printfxy(0,2,"Gs:%4i Gi:%4i ",ExternControl.Gas,ExternControl.Gier); |
LCD_printfxy(0,3,"Hi:%4i Cf:%4i ",ExternControl.Hight,ExternControl.Config); |
break; |
case 14: |
LCD_printfxy(0,0,"BL-Ctrl Errors " ); |
LCD_printfxy(0,1,"%3d %3d %3d %3d ",Motor[0].State & MOTOR_STATE_ERROR_MASK,Motor[1].State & MOTOR_STATE_ERROR_MASK,Motor[2].State & MOTOR_STATE_ERROR_MASK,Motor[3].State & MOTOR_STATE_ERROR_MASK); |
LCD_printfxy(0,2,"%3d %3d %3d %3d ",Motor[4].State & MOTOR_STATE_ERROR_MASK,Motor[5].State & MOTOR_STATE_ERROR_MASK,Motor[6].State & MOTOR_STATE_ERROR_MASK,Motor[7].State & MOTOR_STATE_ERROR_MASK); |
LCD_printfxy(0,3,"%3d %3d %3d %3d ",Motor[8].State & MOTOR_STATE_ERROR_MASK,Motor[9].State & MOTOR_STATE_ERROR_MASK,Motor[10].State & MOTOR_STATE_ERROR_MASK,Motor[11].State & MOTOR_STATE_ERROR_MASK); |
break; |
case 15: |
LCD_printfxy(0,0,"BL-Ctrl found " ); |
LCD_printfxy(0,1," %c %c %c %c ",'-' + 4 * (Motor[0].State>>7),'-' + 5 * (Motor[1].State>>7),'-' + 6 * (Motor[2].State>>7),'-' + 7 * (Motor[3].State>>7)); |
LCD_printfxy(0,2," %c %c %c %c ",'-' + 8 * (Motor[4].State>>7),'-' + 9 * (Motor[5].State>>7),'-' + 10 * (Motor[6].State>>7),'-' + 11 * (Motor[7].State>>7)); |
LCD_printfxy(0,3," %c - - - ",'-' + 12 * (Motor[8].State>>7)); |
if(Motor[9].State>>7) LCD_printfxy(4,3,"10"); |
if(Motor[10].State>>7) LCD_printfxy(8,3,"11"); |
if(Motor[11].State>>7) LCD_printfxy(12,3,"12"); |
break; |
case 16: |
LCD_printfxy(0,0,"Flight-Time " ); |
LCD_printfxy(0,1,"Total:%5umin",FlugMinutenGesamt); |
LCD_printfxy(0,2,"Act: %5umin",FlugMinuten); |
LCD_printfxy(13,3,"(reset)"); |
if(RemoteKeys & KEY4) |
{ |
FlugMinuten = 0; |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_MINUTES2],FlugMinuten / 256); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_MINUTES2+1],FlugMinuten % 256); |
} |
break; |
default: |
if(MenuePunkt == MaxMenue) MaxMenue--; |
MenuePunkt = 0; |
break; |
} |
RemoteKeys = 0; |
} |
/branches/Znib/V0.78f/menu.h |
---|
0,0 → 1,17 |
#ifndef _MENU_H |
#define _MENU_H |
extern void Menu(void); |
extern void LcdClear(void); |
extern void Menu_Putchar(char c); |
extern char DisplayBuff[80]; |
extern unsigned char DispPtr; |
extern unsigned char MaxMenue; |
extern unsigned char MenuePunkt; |
extern unsigned char RemoteKeys; |
#define LCD_printfxy(x,y,format, args...) { DispPtr = y * 20 + x; _printf_P(&Menu_Putchar,PSTR(format) , ## args);} |
#define LCD_printf(format, args...) { _printf_P(&Menu_Putchar, PSTR(format) , ## args);} |
#endif //_MENU_H |
/branches/Znib/V0.78f/mymath.c |
---|
0,0 → 1,41 |
#include <stdlib.h> |
#include <avr/pgmspace.h> |
#include "mymath.h" |
// discrete mathematics |
// Sinus with argument in degree at an angular resolution of 1 degree and a discretisation of 13 bit. |
const uint16_t pgm_sinlookup[91] PROGMEM = {0, 143, 286, 429, 571, 714, 856, 998, 1140, 1282, 1423, 1563, 1703, 1843, 1982, 2120, 2258, 2395, 2531, 2667, 2802, 2936, 3069, 3201, 3332, 3462, 3591, 3719, 3846, 3972, 4096, 4219, 4341, 4462, 4581, 4699, 4815, 4930, 5043, 5155, 5266, 5374, 5482, 5587, 5691, 5793, 5893, 5991, 6088, 6183, 6275, 6366, 6455, 6542, 6627, 6710, 6791, 6870, 6947, 7022, 7094, 7165, 7233, 7299, 7363, 7424, 7484, 7541, 7595, 7648, 7698, 7746, 7791, 7834, 7875, 7913, 7949, 7982, 8013, 8041, 8068, 8091, 8112, 8131, 8147, 8161, 8172, 8181, 8187, 8191, 8192}; |
int16_t c_sin_8192(int16_t angle) |
{ |
int8_t m,n; |
int16_t sinus; |
// avoid negative angles |
if (angle < 0) |
{ |
m = -1; |
angle = abs(angle); |
} |
else m = +1; |
// fold angle to intervall 0 to 359 |
angle %= 360; |
// check quadrant |
if (angle <= 90) n=1; // first quadrant |
else if ((angle > 90) && (angle <= 180)) {angle = 180 - angle; n = 1;} // second quadrant |
else if ((angle > 180) && (angle <= 270)) {angle = angle - 180; n = -1;} // third quadrant |
else {angle = 360 - angle; n = -1;} //fourth quadrant |
// get lookup value |
sinus = pgm_read_word(&pgm_sinlookup[angle]); |
// calculate sinus value |
return (sinus * m * n); |
} |
// Cosinus with argument in degree at an angular resolution of 1 degree and a discretisation of 13 bit. |
int16_t c_cos_8192(int16_t angle) |
{ |
return (c_sin_8192(90 - angle)); |
} |
/branches/Znib/V0.78f/mymath.h |
---|
0,0 → 1,10 |
#ifndef _MYMATH_H |
#define _MYMATH_H |
#include <inttypes.h> |
extern int16_t c_sin_8192(int16_t angle); |
extern int16_t c_cos_8192(int16_t angle); |
extern int16_t c_atan2(int16_t y, int16_t x); |
extern uint32_t c_sqrt(uint32_t a); |
#endif // _MYMATH_H |
/branches/Znib/V0.78f/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/Znib/V0.78f/printf_P.h |
---|
0,0 → 1,69 |
// Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist nicht von der Lizenz für den MikroKopter-Teil unterstellt |
/* |
Copyright (C) 1993 Free Software Foundation |
This file is part of the GNU IO Library. This library is free |
software; you can redistribute it and/or modify it under the |
terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) |
any later version. |
This library is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this library; see the file COPYING. If not, write to the Free |
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
As a special exception, if you link this library with files |
compiled with a GNU compiler to produce an executable, this does not cause |
the resulting executable to be covered by the GNU General Public License. |
This exception does not however invalidate any other reasons why |
the executable file might be covered by the GNU General Public License. */ |
/* |
* Copyright (c) 1990 Regents of the University of California. |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. [rescinded 22 July 1999] |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
/******************************************************************************/ |
#ifndef _PRINTF_P_H_ |
#define _PRINTF_P_H_ |
#include <avr/pgmspace.h> |
// function pointer to external callback function |
typedef void (*pVoidFnctChar) (char ); |
typedef void (*pVoidFnct_pVoidFnctChar_const_fmt) (pVoidFnctChar, char const *fmt0, ...); |
extern pVoidFnct_pVoidFnctChar_const_fmt _printf_P; |
#endif //_PRINTF_P_H_ |
/branches/Znib/V0.78f/rc.c |
---|
0,0 → 1,213 |
/*####################################################################################### |
Decodieren eines RC Summen Signals |
#######################################################################################*/ |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) Holger Buss, Ingo Busker |
// + only for non-profit use |
// + www.MikroKopter.com |
// + porting the sources to other systems or using the software on other systems (except hardware from www.mikrokopter.de) is not allowed |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "rc.h" |
#include "main.h" |
//#define ACT_S3D_SUMMENSIGNAL znib: ist eigentlich schon in main.h und auskommentiert.... |
volatile int PPM_in[26]; |
volatile int PPM_diff[26]; // das diffenzierte Stick-Signal |
volatile char Channels,tmpChannels = 0; |
volatile unsigned char NewPpmData = 1; |
//############################################################################ |
//zum decodieren des PPM-Signals wird Timer1 mit seiner Input |
//Capture Funktion benutzt: |
void rc_sum_init (void) |
//############################################################################ |
{ |
unsigned char i; |
for(i=0;i<26;i++) |
{ |
PPM_in[i] = 0; |
PPM_diff[i] = 0; |
} |
AdNeutralGier = 0; |
AdNeutralRoll = 0; |
AdNeutralNick = 0; |
return; |
} |
#ifndef ACT_S3D_SUMMENSIGNAL |
//############################################################################ |
//Diese Routine startet und inizialisiert den Timer für RC |
ISR(TIMER1_CAPT_vect) |
//############################################################################ |
{ |
if(!(EE_Parameter.ExtraConfig & CFG_SENSITIVE_RC)) |
{ |
static unsigned int AltICR=0; |
signed int signal = 0,tmp; |
static int index; |
signal = (unsigned int) ICR1 - AltICR; |
AltICR = ICR1; |
//Syncronisationspause? (3.52 ms < signal < 25.6 ms) |
if((signal > 1100) && (signal < 8000)) |
{ |
Channels = index; |
if(index >= 4) NewPpmData = 0; // Null bedeutet: Neue Daten |
index = 1; |
} |
else |
{ |
if(index < 13) |
{ |
if((signal > 250) && (signal < 687)) |
{ |
signal -= 466; |
// Stabiles Signal |
if(abs(signal - PPM_in[index]) < 6) { if(SenderOkay < 200) SenderOkay += 10; else SenderOkay = 200;} |
tmp = (3 * (PPM_in[index]) + signal) / 4; |
if(tmp > signal+1) tmp--; else |
if(tmp < signal-1) tmp++; |
if(SenderOkay >= 195) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; |
else PPM_diff[index] = 0; |
PPM_in[index] = tmp; |
} |
index++; |
if(index == 5) J3High; else J3Low; // Servosignal an J3 anlegen |
if(index == 6) J4High; else J4Low; // Servosignal an J4 anlegen |
if(index == 7) J5High; else J5Low; // Servosignal an J5 anlegen |
} |
} |
} |
else |
{ |
static unsigned int AltICR=0; |
static int ppm_in[13]; |
static int ppm_diff[13]; |
static int old_ppm_in[13]; |
static int old_ppm_diff[13]; |
signed int signal = 0,tmp; |
static unsigned char index, okay_cnt = 0; |
signal = (unsigned int) ICR1 - AltICR; |
AltICR = ICR1; |
//Syncronisationspause? (3.52 ms < signal < 25.6 ms) |
if((signal > 1100) && (signal < 8000)) |
{ |
tmpChannels = index; |
if(tmpChannels >= 4 && Channels == tmpChannels) |
{ |
if(okay_cnt > 10) |
{ |
NewPpmData = 0; // Null bedeutet: Neue Daten |
for(index = 0; index < 13; index++) |
{ |
if(okay_cnt > 30) |
{ |
old_ppm_in[index] = PPM_in[index]; |
old_ppm_diff[index] = PPM_diff[index]; |
} |
PPM_in[index] = ppm_in[index]; |
PPM_diff[index] = ppm_diff[index]; |
} |
} |
if(okay_cnt < 255) okay_cnt++; |
} |
else |
{ |
if(okay_cnt > 100) okay_cnt = 10; else okay_cnt = 0; |
ROT_ON; |
} |
index = 1; |
if(!MotorenEin) Channels = tmpChannels; |
} |
else |
{ |
if(index < 13) |
{ |
if((signal > 250) && (signal < 687)) |
{ |
signal -= 466; |
// Stabiles Signal |
if((abs(signal - ppm_in[index]) < 6)) |
{ |
if(okay_cnt > 25) SenderOkay += 10; |
else |
if(okay_cnt > 10) SenderOkay += 2; |
if(SenderOkay > 200) SenderOkay = 200; |
} |
tmp = (3 * (ppm_in[index]) + signal) / 4; |
if(tmp > signal+1) tmp--; else |
if(tmp < signal-1) tmp++; |
if(SenderOkay >= 190) ppm_diff[index] = ((tmp - ppm_in[index]) / 3) * 3; |
else ppm_diff[index] = 0; |
ppm_in[index] = tmp; |
} |
else ROT_ON; |
if(index == 5) J3High; else J3Low; // Servosignal an J3 anlegen |
if(index == 6) J4High; else J4Low; // Servosignal an J4 anlegen |
if(index == 7) J5High; else J5Low; // Servosignal an J5 anlegen |
} |
if(index < 20) index++; |
else |
if(index == 20) |
{ |
unsigned char i; |
ROT_ON; |
index = 30; |
for(i=0;i<13;i++) // restore from older data |
{ |
PPM_in[i] = old_ppm_in[i]; |
PPM_diff[i] = 0; |
// okay_cnt /= 2; |
} |
} |
} |
} |
} |
#else |
//############################################################################ |
//Diese Routine startet und inizialisiert den Timer für RC |
ISR(TIMER1_CAPT_vect) |
//############################################################################ |
{ |
static unsigned int AltICR=0; |
signed int signal = 0,tmp; |
static int index; |
signal = (unsigned int) ICR1 - AltICR; |
//DebugOut.Analog[16] = signal; |
signal /= 2; |
AltICR = ICR1; |
//Syncronisationspause? |
if((signal > 1100*2) && (signal < 8000*2)) |
{ |
if(index >= 4) NewPpmData = 0; // Null bedeutet: Neue Daten |
index = 1; |
} |
else |
{ |
if(index < 13) |
{ |
if((signal > 250) && (signal < 687*2)) |
{ |
signal -= 962; |
// Stabiles Signal |
if(abs(signal - PPM_in[index]) < 6) { if(SenderOkay < 200) SenderOkay += 10;} |
tmp = (3 * (PPM_in[index]) + signal) / 4; |
if(tmp > signal+1) tmp--; else |
if(tmp < signal-1) tmp++; |
if(SenderOkay >= 195) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; |
else PPM_diff[index] = 0; |
PPM_in[index] = tmp; |
} |
index++; |
} |
} |
} |
#endif |
/branches/Znib/V0.78f/rc.h |
---|
0,0 → 1,31 |
/*####################################################################################### |
Derkodieren eines RC Summen Signals |
#######################################################################################*/ |
#ifndef _RC_H |
#define _RC_H |
#if defined (__AVR_ATmega32__) |
#define TIMER_TEILER CK64 |
#define TIMER_RELOAD_VALUE 250 |
#endif |
#if defined (__AVR_ATmega644__) |
#define TIMER_RELOAD_VALUE 250 |
#endif |
#if defined (__AVR_ATmega644P__) |
#define TIMER_RELOAD_VALUE 250 |
#endif |
#define GAS PPM_in[2] |
extern void rc_sum_init (void); |
extern volatile int PPM_in[26]; |
extern volatile int PPM_diff[26]; // das diffenzierte Stick-Signal |
extern volatile unsigned char NewPpmData; |
extern volatile char Channels,tmpChannels; |
#endif //_RC_H |
/branches/Znib/V0.78f/spi.c |
---|
0,0 → 1,318 |
// ######################## 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 NC_Version; |
struct str_GPSInfo GPSInfo; |
unsigned char SPI_BufferIndex; |
unsigned char SPI_RxBufferIndex; |
volatile unsigned char SPI_Buffer[sizeof(FromNaviCtrl)]; |
unsigned char *SPI_TX_Buffer; |
unsigned char SPITransferCompleted, SPI_ChkSum; |
unsigned char SPI_RxDataValid,NaviDataOkay = 0; |
unsigned char SPI_CommandSequence[] = {SPI_FCCMD_STICK, SPI_FCCMD_USER, SPI_FCCMD_PARAMETER1, SPI_FCCMD_STICK, SPI_FCCMD_MISC, SPI_FCCMD_VERSION, SPI_FCCMD_STICK, SPI_FCCMD_SERVOS, SPI_FCCMD_ACCU}; |
unsigned char SPI_CommandCounter = 0; |
#ifdef USE_SPI_COMMUNICATION |
//------------------------------------------------------ |
void SPI_MasterInit(void) |
{ |
DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK); // Set MOSI and SCK output, all others input |
SLAVE_SELECT_DDR_PORT |= (1 << SPI_SLAVE_SELECT); |
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(0<<SPR0)|(0<<SPIE); // Enable SPI, Master, set clock rate fck/64 |
SPSR = 0;//(1<<SPI2X); |
SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); |
SPITransferCompleted = 1; |
//SPDR = 0x00; // dummy write |
ToNaviCtrl.Sync1 = 0xAA; |
ToNaviCtrl.Sync2 = 0x83; |
ToNaviCtrl.Command = SPI_FCCMD_USER; |
ToNaviCtrl.IntegralNick = 0; |
ToNaviCtrl.IntegralRoll = 0; |
FromNaviCtrl_Value.SerialDataOkay = 0; |
SPI_RxDataValid = 0; |
} |
//------------------------------------------------------ |
void SPI_StartTransmitPacket(void) |
{ |
//if ((SLAVE_SELECT_PORT & (1 << SPI_SLAVE_SELECT)) == 0) return; // transfer of prev. packet not completed |
if (!SPITransferCompleted) return; |
// _delay_us(30); |
SLAVE_SELECT_PORT &= ~(1 << SPI_SLAVE_SELECT); // SelectSlave |
SPI_TX_Buffer = (unsigned char *) &ToNaviCtrl; |
ToNaviCtrl.Command = SPI_CommandSequence[SPI_CommandCounter++]; |
if (SPI_CommandCounter >= sizeof(SPI_CommandSequence)) SPI_CommandCounter = 0; |
SPITransferCompleted = 0; |
UpdateSPI_Buffer(); // update buffer |
SPI_BufferIndex = 1; |
//ebugOut.Analog[16]++; |
// -- Debug-Output --- |
//---- |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
ToNaviCtrl.Chksum = ToNaviCtrl.Sync1; |
SPDR = ToNaviCtrl.Sync1; // Start transmission |
// SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
} |
//------------------------------------------------------ |
//SIGNAL(SIG_SPI) |
void SPI_TransmitByte(void) |
{ |
static unsigned char SPI_RXState = 0; |
unsigned char rxdata; |
static unsigned char rxchksum; |
if (SPITransferCompleted) return; |
if (!(SPSR & (1 << SPIF))) return; |
SendSPI = 4; |
// _delay_us(30); |
SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
rxdata = SPDR; |
switch ( SPI_RXState) |
{ |
case 0: |
SPI_RxBufferIndex = 0; |
//DebugOut.Analog[17]++; |
rxchksum = rxdata; |
if (rxdata == 0x81 ) { SPI_RXState = 1; } // 1. Syncbyte ok |
break; |
case 1: |
if (rxdata == 0x55) { rxchksum += rxdata; SPI_RXState = 2; } // 2. Syncbyte ok |
else SPI_RXState = 0; |
//DebugOut.Analog[18]++; |
break; |
case 2: |
SPI_Buffer[SPI_RxBufferIndex++]= rxdata; // get data |
//DebugOut.Analog[19]++; |
if (SPI_RxBufferIndex >= sizeof(FromNaviCtrl)) |
{ |
if (rxdata == rxchksum) |
{ |
unsigned char *ptr = (unsigned char *)&FromNaviCtrl; |
memcpy(ptr, (unsigned char *) SPI_Buffer, sizeof(SPI_Buffer)); |
SPI_RxDataValid = 1; |
} |
else SPI_RxDataValid = 0; |
SPI_RXState = 0; |
} |
else rxchksum += rxdata; |
break; |
} |
if (SPI_BufferIndex < sizeof(ToNaviCtrl)) |
{ |
SLAVE_SELECT_PORT &= ~(1 << SPI_SLAVE_SELECT); // SelectSlave |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
SPDR = SPI_TX_Buffer[SPI_BufferIndex]; |
ToNaviCtrl.Chksum += SPI_TX_Buffer[SPI_BufferIndex]; |
// SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
} |
else SPITransferCompleted = 1; |
SPI_BufferIndex++; |
} |
//------------------------------------------------------ |
void UpdateSPI_Buffer(void) |
{ |
signed int tmp; |
ToNaviCtrl.IntegralNick = (int) (IntegralNick / (long)(EE_Parameter.GyroAccFaktor * 4)); |
ToNaviCtrl.IntegralRoll = (int) (IntegralRoll / (long)(EE_Parameter.GyroAccFaktor * 4)); |
ToNaviCtrl.GyroCompass = (10 * ErsatzKompass) / GIER_GRAD_FAKTOR; |
ToNaviCtrl.AccNick = ((int) ACC_AMPLIFY * (NaviAccNick / NaviCntAcc))/4; |
ToNaviCtrl.AccRoll = ((int) ACC_AMPLIFY * (NaviAccRoll / NaviCntAcc))/4; |
NaviCntAcc = 0; NaviAccNick = 0; NaviAccRoll = 0; |
// ToNaviCtrl.User8 = Parameter_UserParam8; |
// ToNaviCtrl.CalState = WinkelOut.CalcState; |
switch(ToNaviCtrl.Command) // |
{ |
case SPI_FCCMD_USER: |
ToNaviCtrl.Param.Byte[0] = Parameter_UserParam1; |
ToNaviCtrl.Param.Byte[1] = Parameter_UserParam2; |
ToNaviCtrl.Param.Byte[2] = Parameter_UserParam3; |
ToNaviCtrl.Param.Byte[3] = Parameter_UserParam4; |
ToNaviCtrl.Param.Byte[4] = Parameter_UserParam5; |
ToNaviCtrl.Param.Byte[5] = Parameter_UserParam6; |
ToNaviCtrl.Param.Byte[6] = Parameter_UserParam7; |
ToNaviCtrl.Param.Byte[7] = Parameter_UserParam8; |
ToNaviCtrl.Param.Byte[8] = (unsigned char) FCFlags; |
FCFlags &= ~(FCFLAG_CALIBRATE | FCFLAG_START); |
ToNaviCtrl.Param.Byte[9] =(unsigned char) eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET]); |
break; |
case SPI_FCCMD_ACCU: |
ToNaviCtrl.Param.Int[0] = Capacity.ActualCurrent; // 0.1A |
ToNaviCtrl.Param.Int[1] = Capacity.UsedCapacity; // mAh |
ToNaviCtrl.Param.Byte[4] = (unsigned char) UBat; // 0.1V |
ToNaviCtrl.Param.Byte[5] = (unsigned char) BattLowVoltageWarning; //0.1V |
break; |
case SPI_FCCMD_PARAMETER1: |
ToNaviCtrl.Param.Byte[0] = EE_Parameter.NaviGpsModeControl; // Parameters for the Naviboard |
ToNaviCtrl.Param.Byte[1] = EE_Parameter.NaviGpsGain; |
ToNaviCtrl.Param.Byte[2] = EE_Parameter.NaviGpsP; |
ToNaviCtrl.Param.Byte[3] = EE_Parameter.NaviGpsI; |
ToNaviCtrl.Param.Byte[4] = EE_Parameter.NaviGpsD; |
ToNaviCtrl.Param.Byte[5] = EE_Parameter.NaviGpsACC; |
ToNaviCtrl.Param.Byte[6] = EE_Parameter.NaviGpsMinSat; |
ToNaviCtrl.Param.Byte[7] = EE_Parameter.NaviStickThreshold; |
ToNaviCtrl.Param.Byte[8] = EE_Parameter.NaviOperatingRadius; |
ToNaviCtrl.Param.Byte[9] = EE_Parameter.NaviWindCorrection; |
ToNaviCtrl.Param.Byte[10] = EE_Parameter.NaviSpeedCompensation; |
ToNaviCtrl.Param.Byte[11] = EE_Parameter.NaviAngleLimitation; |
break; |
case SPI_FCCMD_STICK: |
cli(); |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[0] = (char) tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[1] = (char) tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[2] = (char) tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_NICK]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
sei(); |
ToNaviCtrl.Param.Byte[3] = (char) tmp; |
ToNaviCtrl.Param.Byte[4] = (unsigned char) Poti[0]; |
ToNaviCtrl.Param.Byte[5] = (unsigned char) Poti[1]; |
ToNaviCtrl.Param.Byte[6] = (unsigned char) Poti[2]; |
ToNaviCtrl.Param.Byte[7] = (unsigned char) Poti[3]; |
ToNaviCtrl.Param.Byte[8] = (unsigned char) Poti[4]; |
ToNaviCtrl.Param.Byte[9] = (unsigned char) Poti[5]; |
ToNaviCtrl.Param.Byte[10] = (unsigned char) Poti[6]; |
ToNaviCtrl.Param.Byte[11] = (unsigned char) Poti[7]; |
break; |
case SPI_FCCMD_MISC: |
if(WinkelOut.CalcState > 5) |
{ |
WinkelOut.CalcState = 0; |
ToNaviCtrl.Param.Byte[0] = 5; |
} |
else ToNaviCtrl.Param.Byte[0] = WinkelOut.CalcState; |
ToNaviCtrl.Param.Byte[1] = EE_Parameter.NaviPH_LoginTime; |
ToNaviCtrl.Param.Int[1] = DebugOut.Analog[5];// = HoehenWert/5; |
ToNaviCtrl.Param.Int[2] = (int)(SollHoehe/5); |
ToNaviCtrl.Param.Byte[6] = EE_Parameter.NaviGpsPLimit; |
ToNaviCtrl.Param.Byte[7] = EE_Parameter.NaviGpsILimit; |
ToNaviCtrl.Param.Byte[8] = EE_Parameter.NaviGpsDLimit; |
ToNaviCtrl.Param.Byte[9] = (unsigned char) SenderOkay; |
ToNaviCtrl.Param.Byte[10] = (unsigned char) SenderRSSI; |
ToNaviCtrl.Param.Byte[11] = DebugOut.Analog[7] / 4; //GasMischanteil |
break; |
case SPI_FCCMD_VERSION: |
ToNaviCtrl.Param.Byte[0] = VERSION_MAJOR; |
ToNaviCtrl.Param.Byte[1] = VERSION_MINOR; |
ToNaviCtrl.Param.Byte[2] = VERSION_PATCH; |
ToNaviCtrl.Param.Byte[3] = NC_SPI_COMPATIBLE; |
ToNaviCtrl.Param.Byte[4] = PlatinenVersion; |
break; |
case SPI_FCCMD_SERVOS: |
ToNaviCtrl.Param.Byte[0] = EE_Parameter.ServoNickRefresh; // Parameters for the Servo Control |
ToNaviCtrl.Param.Byte[1] = EE_Parameter.ServoCompInvert; |
ToNaviCtrl.Param.Byte[2] = Parameter_ServoNickControl; |
ToNaviCtrl.Param.Byte[3] = EE_Parameter.ServoNickComp; |
ToNaviCtrl.Param.Byte[4] = EE_Parameter.ServoNickMin; |
ToNaviCtrl.Param.Byte[5] = EE_Parameter.ServoNickMax; |
ToNaviCtrl.Param.Byte[6] = Parameter_ServoRollControl; |
ToNaviCtrl.Param.Byte[7] = EE_Parameter.ServoRollComp; |
ToNaviCtrl.Param.Byte[8] = EE_Parameter.ServoRollMin; |
ToNaviCtrl.Param.Byte[9] = EE_Parameter.ServoRollMax; |
break; |
} |
if(SPI_RxDataValid) |
{ |
NaviDataOkay = 250; |
if(abs(FromNaviCtrl.GPS_Nick) < 512 && abs(FromNaviCtrl.GPS_Roll) < 512 && (EE_Parameter.GlobalConfig & CFG_GPS_AKTIV)) |
{ |
GPS_Nick = FromNaviCtrl.GPS_Nick; |
GPS_Roll = FromNaviCtrl.GPS_Roll; |
} |
if(FromNaviCtrl.CompassValue <= 360) KompassValue = FromNaviCtrl.CompassValue; |
KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180; |
if(FromNaviCtrl.BeepTime > beeptime && !WinkelOut.CalcState) beeptime = FromNaviCtrl.BeepTime; |
switch (FromNaviCtrl.Command) |
{ |
case SPI_NCCMD_KALMAN: |
FromNaviCtrl_Value.Kalman_K = FromNaviCtrl.Param.sByte[0]; |
FromNaviCtrl_Value.Kalman_MaxFusion = FromNaviCtrl.Param.sByte[1]; |
FromNaviCtrl_Value.Kalman_MaxDrift = FromNaviCtrl.Param.sByte[2]; |
FromNaviCtrl_Value.SerialDataOkay = FromNaviCtrl.Param.Byte[3]; |
FromNaviCtrl_Value.GpsZ = FromNaviCtrl.Param.Byte[4]; |
break; |
case SPI_NCCMD_VERSION: |
NC_Version.Major = FromNaviCtrl.Param.Byte[0]; |
NC_Version.Minor = FromNaviCtrl.Param.Byte[1]; |
NC_Version.Patch = FromNaviCtrl.Param.Byte[2]; |
NC_Version.Compatible = FromNaviCtrl.Param.Byte[3]; |
NC_Version.Hardware = FromNaviCtrl.Param.Byte[4]; |
break; |
case SPI_NCCMD_GPSINFO: |
GPSInfo.Flags = FromNaviCtrl.Param.Byte[0]; |
GPSInfo.NumOfSats = FromNaviCtrl.Param.Byte[1]; |
GPSInfo.SatFix = FromNaviCtrl.Param.Byte[2]; |
GPSInfo.HomeDistance = FromNaviCtrl.Param.Int[2]; |
GPSInfo.HomeBearing = FromNaviCtrl.Param.sInt[3]; |
break; |
default: |
break; |
} |
} |
else |
{ |
// KompassValue = 0; |
// KompassRichtung = 0; |
GPS_Nick = 0; |
GPS_Roll = 0; |
} |
} |
#endif |
/branches/Znib/V0.78f/spi.h |
---|
0,0 → 1,182 |
// ######################## SPI - FlightCtrl ################### |
#ifndef _SPI_H |
#define _SPI_H |
#include <util/delay.h> |
#define USE_SPI_COMMUNICATION |
//----------------------------------------- |
#define DDR_SPI DDRB |
#define SLAVE_SELECT_DDR_PORT DDRC |
#define SLAVE_SELECT_PORT PORTC |
#if defined(__AVR_ATmega1284P__) |
#define DD_SS PORTB4 |
#define DD_SCK PORTB7 |
#define DD_MOSI PORTB5 |
#define DD_MISO PORTB6 |
#define SPI_SLAVE_SELECT PORTC5 |
#else |
#define DD_SS PB4 |
#define DD_SCK PB7 |
#define DD_MOSI PB5 |
#define DD_MISO PB6 |
#define SPI_SLAVE_SELECT PC5 |
#endif |
// for compatibility reasons gcc3.x <-> gcc4.x |
#ifndef SPCR |
#define SPCR SPCR0 |
#endif |
#ifndef SPE |
#define SPE SPE0 |
#endif |
#ifndef MSTR |
#define MSTR MSTR0 |
#endif |
#ifndef SPR1 |
#define SPR1 SPR01 |
#endif |
#ifndef SPR0 |
#define SPR0 SPR00 |
#endif |
#ifndef SPIE |
#define SPIE SPIE0 |
#endif |
#ifndef SPDR |
#define SPDR SPDR0 |
#endif |
#ifndef SPIF |
#define SPIF SPIF0 |
#endif |
#ifndef SPSR |
#define SPSR SPSR0 |
#endif |
// ------------------------- |
#define SPI_FCCMD_USER 10 |
#define SPI_FCCMD_STICK 11 |
#define SPI_FCCMD_MISC 12 |
#define SPI_FCCMD_PARAMETER1 13 |
#define SPI_FCCMD_VERSION 14 |
#define SPI_FCCMD_SERVOS 15 |
#define SPI_FCCMD_ACCU 16 |
struct str_ToNaviCtrl |
{ |
unsigned char Sync1, Sync2; |
unsigned char Command; |
signed int IntegralNick; |
signed int IntegralRoll; |
signed int AccNick; |
signed int AccRoll; |
signed int GyroCompass; |
signed int GyroNick; |
signed int GyroRoll; |
signed int GyroGier; |
union |
{ |
unsigned char Byte[12]; |
char sByte[12]; |
unsigned int Int[6]; |
int sInt[6]; |
unsigned long Long[3]; |
long sLong[3]; |
float Float[3]; |
} Param; |
unsigned char Chksum; |
}; |
#define SPI_NCCMD_KALMAN 103 |
#define SPI_NCCMD_VERSION 104 |
#define SPI_NCCMD_GPSINFO 105 |
struct str_FromNaviCtrl |
{ |
unsigned char Command; |
signed int GPS_Nick; |
signed int GPS_Roll; |
signed int GPS_Gier; |
signed int CompassValue; |
signed int Status; |
unsigned int BeepTime; |
union |
{ |
unsigned char Byte[12]; |
char sByte[12]; |
unsigned int Int[6]; |
int sInt[6]; |
unsigned long Long[3]; |
long sLong[3]; |
float Float[3]; |
} Param; |
unsigned char Chksum; |
}; |
struct str_FromNaviCtrl_Value |
{ |
signed char Kalman_K; |
signed char Kalman_MaxDrift; |
signed char Kalman_MaxFusion; |
unsigned char SerialDataOkay; |
signed char GpsZ; |
}; |
struct str_SPI_VersionInfo |
{ |
unsigned char Major; |
unsigned char Minor; |
unsigned char Patch; |
unsigned char Compatible; |
unsigned char Hardware; |
}; |
// Satfix types for GPSData.SatFix |
#define SATFIX_NONE 0x00 |
#define SATFIX_DEADRECKOING 0x01 |
#define SATFIX_2D 0x02 |
#define SATFIX_3D 0x03 |
#define SATFIX_GPS_DEADRECKOING 0x04 |
#define SATFIX_TIMEONLY 0x05 |
// Flags for interpretation of the GPSData.Flags |
#define FLAG_GPSFIXOK 0x01 // (i.e. within DOP & ACC Masks) |
#define FLAG_DIFFSOLN 0x02 // (is DGPS used) |
#define FLAG_WKNSET 0x04 // (is Week Number valid) |
#define FLAG_TOWSET 0x08 // (is Time of Week valid) |
struct str_GPSInfo |
{ |
unsigned char Flags; // Status Flags |
unsigned char NumOfSats; // number of satelites |
unsigned char SatFix; // type of satfix |
unsigned int HomeDistance; // distance to Home in dm |
int HomeBearing; // bearing to home in deg |
}; |
#ifdef USE_SPI_COMMUNICATION |
extern struct str_GPSInfo GPSInfo; |
extern struct str_SPI_VersionInfo NC_Version; |
extern struct str_FromNaviCtrl_Value FromNaviCtrl_Value; |
extern struct str_ToNaviCtrl ToNaviCtrl; |
extern struct str_FromNaviCtrl FromNaviCtrl; |
extern unsigned char SPI_CommandCounter,NaviDataOkay; |
extern 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/Znib/V0.78f/timer0.c |
---|
0,0 → 1,406 |
#include "main.h" |
volatile unsigned int CountMilliseconds = 0; |
volatile static unsigned int tim_main; |
volatile unsigned char UpdateMotor = 0; |
volatile unsigned int cntKompass = 0; |
volatile unsigned int beeptime = 0; |
volatile unsigned char SendSPI = 0, ServoActive = 0; |
unsigned int BeepMuster = 0xffff; |
volatile int16_t ServoNickValue = 0; |
volatile int16_t ServoRollValue = 0; |
enum { |
STOP = 0, |
CK = 1, |
CK8 = 2, |
CK64 = 3, |
CK256 = 4, |
CK1024 = 5, |
T0_FALLING_EDGE = 6, |
T0_RISING_EDGE = 7 |
}; |
ISR(TIMER0_OVF_vect) // 9,7kHz |
{ |
static unsigned char cnt_1ms = 1,cnt = 0; |
unsigned char pieper_ein = 0; |
if(SendSPI) SendSPI--; |
if(SpektrumTimer) SpektrumTimer--; |
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(!NaviDataOkay && 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; |
KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180; |
} |
cntKompass = 0; |
} |
} |
} |
// ----------------------------------------------------------------------- |
unsigned int SetDelay (unsigned int t) |
{ |
// TIMSK0 &= ~_BV(TOIE0); |
return(CountMilliseconds + t + 1); |
// TIMSK0 |= _BV(TOIE0); |
} |
// ----------------------------------------------------------------------- |
char CheckDelay(unsigned int t) |
{ |
// TIMSK0 &= ~_BV(TOIE0); |
return(((t - CountMilliseconds) & 0x8000) >> 9); |
// TIMSK0 |= _BV(TOIE0); |
} |
// ----------------------------------------------------------------------- |
void Delay_ms(unsigned int w) |
{ |
unsigned int akt; |
akt = SetDelay(w); |
while (!CheckDelay(akt)); |
} |
void Delay_ms_Mess(unsigned int w) |
{ |
unsigned int akt; |
akt = SetDelay(w); |
while (!CheckDelay(akt)) if(AdReady) {AdReady = 0; ANALOG_ON;} |
} |
/*****************************************************/ |
/* Initialize Timer 2 */ |
/*****************************************************/ |
// The timer 2 is used to generate the PWM at PD7 (J7) |
// to control a camera servo for nick compensation. |
void TIMER2_Init(void) |
{ |
uint8_t sreg = SREG; |
// disable all interrupts before reconfiguration |
cli(); |
PORTD &= ~(1<<PORTD7); // set PD7 to low |
DDRC |= (1<<DDC6); // set PC6 as output (Reset for HEF4017) |
HEF4017R_ON; |
// Timer/Counter 2 Control Register A |
// Timer Mode is FastPWM with timer reload at OCR2A (Bits: WGM22 = 1, WGM21 = 1, WGM20 = 1) |
// PD7: Normal port operation, OC2A disconnected, (Bits: COM2A1 = 0, COM2A0 = 0) |
// PD6: Normal port operation, OC2B disconnected, (Bits: COM2B1 = 0, COM2B0 = 0) |
TCCR2A &= ~((1<<COM2A1)|(1<<COM2A0)|(1<<COM2B1)|(1<<COM2B0)); |
TCCR2A |= (1<<WGM21)|(1<<WGM20); |
// Timer/Counter 2 Control Register B |
// Set clock divider for timer 2 to SYSKLOCK/32 = 20MHz / 32 = 625 kHz |
// The timer increments from 0x00 to 0xFF with an update rate of 625 kHz or 1.6 us |
// hence the timer overflow interrupt frequency is 625 kHz / 256 = 2.44 kHz or 0.4096 ms |
// divider 32 (Bits: CS022 = 0, CS21 = 1, CS20 = 1) |
TCCR2B &= ~((1<<FOC2A)|(1<<FOC2B)|(1<<CS22)); |
TCCR2B |= (1<<CS21)|(1<<CS20)|(1<<WGM22); |
// Initialize the Timer/Counter 2 Register |
TCNT2 = 0; |
// Initialize the Output Compare Register A used for PWM generation on port PD7. |
OCR2A = 255; |
TCCR2A |= (1<<COM2A1); // set or clear at compare match depends on value of COM2A0 |
// Timer/Counter 2 Interrupt Mask Register |
// Enable timer output compare match A Interrupt only |
TIMSK2 &= ~((1<<OCIE2B)|(1<<TOIE2)); |
TIMSK2 |= (1<<OCIE2A); |
SREG = sreg; |
} |
//---------------------------- |
void Timer_Init(void) |
{ |
tim_main = SetDelay(10); |
TCCR0B = CK8; |
TCCR0A = (1<<COM0A1)|(1<<COM0B1)|3;//fast PWM |
OCR0A = 0; |
OCR0B = 120; |
TCNT0 = (unsigned char)-TIMER_RELOAD_VALUE; // reload |
//OCR1 = 0x00; |
TIMSK0 |= _BV(TOIE0); |
} |
/*****************************************************/ |
/* Control Servo Position */ |
/*****************************************************/ |
ISR(TIMER2_COMPA_vect) |
{ |
// frame len 22.5 ms = 14063 * 1.6 us |
// stop pulse: 0.3 ms = 188 * 1.6 us |
// min servo pulse: 0.6 ms = 375 * 1.6 us |
// max servo pulse: 2.4 ms = 1500 * 1.6 us |
// resolution: 1500 - 375 = 1125 steps |
#define IRS_RUNTIME 127 |
#define PPM_STOPPULSE 188 |
// #define PPM_FRAMELEN (14063 |
#define PPM_FRAMELEN (1757 * EE_Parameter.ServoNickRefresh) |
#define MINSERVOPULSE 375 |
#define MAXSERVOPULSE 1500 |
#define SERVORANGE (MAXSERVOPULSE - MINSERVOPULSE) |
static uint8_t PulseOutput = 0; |
static uint16_t RemainingPulse = 0; |
static uint16_t ServoFrameTime = 0; |
static uint8_t ServoIndex = 0; |
#define MULTIPLYER 4 |
static int16_t ServoNickOffset = (255 / 2) * MULTIPLYER; // initial value near center positon |
static int16_t ServoRollOffset = (255 / 2) * MULTIPLYER; // initial value near center positon |
if(PlatinenVersion < 20) |
{ |
//--------------------------- |
// Nick servo state machine |
//--------------------------- |
if(!PulseOutput) // pulse output complete |
{ |
if(TCCR2A & (1<<COM2A0)) // we had a low pulse |
{ |
TCCR2A &= ~(1<<COM2A0);// make a high pulse |
RemainingPulse = MINSERVOPULSE + SERVORANGE/2; // center position ~ 1.5ms |
ServoNickOffset = (ServoNickOffset * 3 + (int16_t)Parameter_ServoNickControl * MULTIPLYER) / 4; // lowpass offset |
ServoNickValue = ServoNickOffset; // offset (Range from 0 to 255 * 3 = 765) |
if(EE_Parameter.ServoCompInvert & 0x01) |
{ // inverting movement of servo |
ServoNickValue += (int16_t)( ( (int32_t)EE_Parameter.ServoNickComp * MULTIPLYER * (IntegralNick / 128L ) ) / (256L) ); |
} |
else |
{ // non inverting movement of servo |
ServoNickValue -= (int16_t)( ( (int32_t)EE_Parameter.ServoNickComp * MULTIPLYER * (IntegralNick / 128L ) ) / (256L) ); |
} |
// limit servo value to its parameter range definition |
if(ServoNickValue < ((int16_t)EE_Parameter.ServoNickMin * MULTIPLYER) ) |
{ |
ServoNickValue = (int16_t)EE_Parameter.ServoNickMin * MULTIPLYER; |
} |
else |
if(ServoNickValue > ((int16_t)EE_Parameter.ServoNickMax * MULTIPLYER) ) |
{ |
ServoNickValue = (int16_t)EE_Parameter.ServoNickMax * MULTIPLYER; |
} |
RemainingPulse += ServoNickValue - (256 / 2) * MULTIPLYER; // shift ServoNickValue to center position |
ServoNickValue /= MULTIPLYER; |
// range servo pulse width |
if(RemainingPulse > MAXSERVOPULSE ) RemainingPulse = MAXSERVOPULSE; // upper servo pulse limit |
else if(RemainingPulse < MINSERVOPULSE ) RemainingPulse = MINSERVOPULSE; // lower servo pulse limit |
// accumulate time for correct update rate |
ServoFrameTime = RemainingPulse; |
} |
else // we had a high pulse |
{ |
TCCR2A |= (1<<COM2A0); // make a low pulse |
RemainingPulse = PPM_FRAMELEN - ServoFrameTime; |
} |
// set pulse output active |
PulseOutput = 1; |
} |
} // EOF Nick servo state machine |
else |
{ |
//----------------------------------------------------- |
// PPM state machine, onboard demultiplexed by HEF4017 |
//----------------------------------------------------- |
if(!PulseOutput) // pulse output complete |
{ |
if(TCCR2A & (1<<COM2A0)) // we had a low pulse |
{ |
TCCR2A &= ~(1<<COM2A0);// make a high pulse |
if(ServoIndex == 0) // if we are at the sync gap |
{ |
RemainingPulse = PPM_FRAMELEN - ServoFrameTime; // generate sync gap by filling time to full frame time |
ServoFrameTime = 0; // reset servo frame time |
HEF4017R_ON; // enable HEF4017 reset |
} |
else // servo channels |
{ |
RemainingPulse = MINSERVOPULSE + SERVORANGE/2; // center position ~ 1.5ms |
switch(ServoIndex) // map servo channels |
{ |
case 1: // Nick Compensation Servo |
ServoNickOffset = (ServoNickOffset * 3 + (int16_t)Parameter_ServoNickControl * MULTIPLYER) / 4; // lowpass offset |
ServoNickValue = ServoNickOffset; // offset (Range from 0 to 255 * 3 = 765) |
if(EE_Parameter.ServoCompInvert & 0x01) |
{ // inverting movement of servo |
ServoNickValue += (int16_t)( ( (int32_t)EE_Parameter.ServoNickComp * MULTIPLYER * (IntegralNick / 128L ) ) / (256L) ); |
} |
else |
{ // non inverting movement of servo |
ServoNickValue -= (int16_t)( ( (int32_t)EE_Parameter.ServoNickComp * MULTIPLYER * (IntegralNick / 128L ) ) / (256L) ); |
} |
// limit servo value to its parameter range definition |
if(ServoNickValue < ((int16_t)EE_Parameter.ServoNickMin * MULTIPLYER) ) |
{ |
ServoNickValue = (int16_t)EE_Parameter.ServoNickMin * MULTIPLYER; |
} |
else |
if(ServoNickValue > ((int16_t)EE_Parameter.ServoNickMax * MULTIPLYER) ) |
{ |
ServoNickValue = (int16_t)EE_Parameter.ServoNickMax * MULTIPLYER; |
} |
RemainingPulse += ServoNickValue - (256 / 2) * MULTIPLYER; // shift ServoNickValue to center position |
ServoNickValue /= MULTIPLYER; |
break; |
case 2: // Roll Compensation Servo |
ServoRollOffset = (ServoRollOffset * 3 + (int16_t) Parameter_ServoRollControl * MULTIPLYER) / 4; // lowpass offset |
ServoRollValue = ServoRollOffset; // offset (Range from 0 to 255 * 3 = 765) |
if(EE_Parameter.ServoCompInvert & 0x02) |
{ // inverting movement of servo |
ServoRollValue += (int16_t)( ( (int32_t) EE_Parameter.ServoRollComp * MULTIPLYER * (IntegralRoll / 128L ) ) / (256L) ); |
} |
else |
{ // non inverting movement of servo |
ServoRollValue -= (int16_t)( ( (int32_t) EE_Parameter.ServoRollComp * MULTIPLYER * (IntegralRoll / 128L ) ) / (256L) ); |
} |
// limit servo value to its parameter range definition |
if(ServoRollValue < ((int16_t)EE_Parameter.ServoRollMin * MULTIPLYER) ) |
{ |
ServoRollValue = (int16_t)EE_Parameter.ServoRollMin * MULTIPLYER; |
} |
else |
if(ServoRollValue > ((int16_t)EE_Parameter.ServoRollMax * MULTIPLYER) ) |
{ |
ServoRollValue = (int16_t)EE_Parameter.ServoRollMax * MULTIPLYER; |
} |
RemainingPulse += ServoRollValue - (256 / 2) * MULTIPLYER; // shift ServoNickValue to center position |
ServoRollValue /= MULTIPLYER; |
//DebugOut.Analog[20] = ServoRollValue; |
break; |
case 3: |
RemainingPulse += ((int16_t)Parameter_Servo3 * MULTIPLYER) - (256 / 2) * MULTIPLYER; |
break; |
case 4: |
RemainingPulse += ((int16_t)Parameter_Servo4 * MULTIPLYER) - (256 / 2) * MULTIPLYER; |
break; |
case 5: |
RemainingPulse += ((int16_t)Parameter_Servo5 * MULTIPLYER) - (256 / 2) * MULTIPLYER; |
break; |
default: // other servo channels |
RemainingPulse += 2 * PPM_in[ServoIndex]; // add channel value, factor of 2 because timer 1 increments 3.2µs |
break; |
} |
// range servo pulse width |
if(RemainingPulse > MAXSERVOPULSE ) RemainingPulse = MAXSERVOPULSE; // upper servo pulse limit |
else if(RemainingPulse < MINSERVOPULSE ) RemainingPulse = MINSERVOPULSE; // lower servo pulse limit |
// substract stop pulse width |
RemainingPulse -= PPM_STOPPULSE; |
// accumulate time for correct sync gap |
ServoFrameTime += RemainingPulse; |
} |
} |
else // we had a high pulse |
{ |
TCCR2A |= (1<<COM2A0); // make a low pulse |
// set pulsewidth to stop pulse width |
RemainingPulse = PPM_STOPPULSE; |
// accumulate time for correct sync gap |
ServoFrameTime += RemainingPulse; |
if(ServoActive && SenderOkay > 180) HEF4017R_OFF; // disable HEF4017 reset |
else HEF4017R_ON; |
ServoIndex++; // change to next servo channel |
if(ServoIndex > EE_Parameter.ServoNickRefresh) ServoIndex = 0; // reset to the sync gap |
} |
// set pulse output active |
PulseOutput = 1; |
} |
} // EOF PPM state machine |
// General pulse output generator |
if(RemainingPulse > (255 + IRS_RUNTIME)) |
{ |
OCR2A = 255; |
RemainingPulse -= 255; |
} |
else |
{ |
if(RemainingPulse > 255) // this is the 2nd last part |
{ |
if((RemainingPulse - 255) < IRS_RUNTIME) |
{ |
OCR2A = 255 - IRS_RUNTIME; |
RemainingPulse -= 255 - IRS_RUNTIME; |
} |
else // last part > ISR_RUNTIME |
{ |
OCR2A = 255; |
RemainingPulse -= 255; |
} |
} |
else // this is the last part |
{ |
OCR2A = RemainingPulse; |
RemainingPulse = 0; |
PulseOutput = 0; // trigger to stop pulse |
} |
} // EOF general pulse output generator |
} |
/branches/Znib/V0.78f/timer0.h |
---|
0,0 → 1,21 |
#define TIMER_TEILER CK8 |
#define TIMER_RELOAD_VALUE 250 |
#define HEF4017R_ON PORTC |= (1<<PORTC6) |
#define HEF4017R_OFF PORTC &= ~(1<<PORTC6) |
void Timer_Init(void); |
void TIMER2_Init(void); |
void Delay_ms(unsigned int); |
void Delay_ms_Mess(unsigned int); |
unsigned int SetDelay (unsigned int t); |
char CheckDelay (unsigned int t); |
extern volatile unsigned int CountMilliseconds; |
extern volatile unsigned char UpdateMotor; |
extern volatile unsigned int beeptime; |
extern volatile unsigned int cntKompass; |
extern unsigned int BeepMuster; |
extern volatile unsigned char SendSPI, ServoActive; |
extern volatile int16_t ServoNickValue; |
extern volatile int16_t ServoRollValue; |
/branches/Znib/V0.78f/twimaster.c |
---|
0,0 → 1,222 |
/*############################################################################ |
############################################################################*/ |
#include "main.h" |
volatile unsigned char twi_state = 0; |
unsigned char motor = 0; |
unsigned char motorread = 0,MissingMotor = 0; |
MotorData_t Motor[MAX_MOTORS]; |
unsigned int I2CError = 0; |
//############################################################################ |
//Initzialisieren der I2C (TWI) Schnittstelle |
void i2c_init(void) |
//############################################################################ |
{ |
TWSR = 0; |
TWBR = ((SYSCLK/SCL_CLOCK)-16)/2; |
} |
//############################################################################ |
//Start I2C |
void i2c_start(void) |
//############################################################################ |
{ |
TWCR = (1<<TWSTA) | (1<<TWEN) | (1<<TWINT) | (1<<TWIE); |
} |
//############################################################################ |
void i2c_stop(void) |
//############################################################################ |
{ |
TWCR = (1<<TWEN) | (1<<TWSTO) | (1<<TWINT); |
} |
void i2c_reset(void) |
//############################################################################ |
{ |
i2c_stop(); |
twi_state = 0; |
motor = TWDR; |
motor = 0; |
TWCR = 0x80; |
TWAMR = 0; |
TWAR = 0; |
TWDR = 0; |
TWSR = 0; |
TWBR = 0; |
i2c_init(); |
i2c_start(); |
i2c_write_byte(0); |
} |
//############################################################################ |
void i2c_write_byte(char byte) |
//############################################################################ |
{ |
TWSR = 0x00; |
TWDR = byte; |
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE); |
} |
/****************************************/ |
/* Write to I2C */ |
/****************************************/ |
void I2C_WriteByte(int8_t byte) |
{ |
// move byte to send into TWI Data Register |
TWDR = byte; |
// clear interrupt flag (TWINT = 1) |
// enable i2c bus (TWEN = 1) |
// enable interrupt (TWIE = 1) |
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE); |
} |
/****************************************/ |
/* Receive byte and send ACK */ |
/****************************************/ |
void I2C_ReceiveByte(void) |
{ |
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE) | (1<<TWEA); |
} |
/****************************************/ |
/* I2C receive last byte and send no ACK*/ |
/****************************************/ |
void I2C_ReceiveLastByte(void) |
{ |
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE); |
} |
//############################################################################ |
SIGNAL (TWI_vect) |
//############################################################################ |
{ |
static unsigned char missing_motor; |
switch(twi_state++) |
{ |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Writing the Data |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
case 0: |
while(Mixer.Motor[motor][0] <= 0 && motor < MAX_MOTORS) motor++; // skip if not used |
if(motor == MAX_MOTORS) // writing finished -> now read |
{ |
motor = 0; |
twi_state = 3; |
i2c_write_byte(0x53+(motorread*2)); |
} |
else i2c_write_byte(0x52+(motor*2)); |
break; |
case 1: |
i2c_write_byte(Motor[motor++].SetPoint); |
break; |
case 2: |
if(TWSR == 0x30) |
{ |
if(!missing_motor) missing_motor = motor; |
if((Motor[motor-1].State & MOTOR_STATE_ERROR_MASK) < MOTOR_STATE_ERROR_MASK) Motor[motor-1].State++; // increment error counter and handle overflow |
} |
i2c_stop(); |
I2CTimeout = 10; |
twi_state = 0; |
i2c_start(); |
break; |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Reading Data |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
case 3: |
//Transmit 1st byte for reading |
if(TWSR != 0x40) // Error? |
{ |
Motor[motorread].State &= ~MOTOR_STATE_PRESENT_MASK; // clear present bit |
motorread++; |
if(motorread >= MAX_MOTORS) motorread = 0; |
i2c_stop(); |
twi_state = 0; |
} |
else |
{ |
Motor[motorread].State |= MOTOR_STATE_PRESENT_MASK; // set present bit |
I2C_ReceiveByte(); |
} |
MissingMotor = missing_motor; |
missing_motor = 0; |
break; |
case 4: //Read 1st byte and transmit 2nd Byte |
Motor[motorread].Current = TWDR; |
I2C_ReceiveLastByte(); //nack |
break; |
case 5: |
//Read 2nd byte |
Motor[motorread].MaxPWM = TWDR; |
motorread++; // next motor |
if(motorread >= MAX_MOTORS) motorread = 0; |
i2c_stop(); |
twi_state = 0; |
break; |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// writing Gyro-Offset |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
case 8: |
i2c_write_byte(0x98); // Address of the DAC |
break; |
case 9: |
i2c_write_byte(0x10); // Update Channel A |
break; |
case 10: |
i2c_write_byte(AnalogOffsetNick); // Value |
break; |
case 11: |
i2c_write_byte(0x80); // Value |
break; |
case 12: |
i2c_stop(); |
I2CTimeout = 10; |
i2c_start(); |
break; |
case 13: |
i2c_write_byte(0x98); // Address of the DAC |
break; |
case 14: |
i2c_write_byte(0x12); // Update Channel B |
break; |
case 15: |
i2c_write_byte(AnalogOffsetRoll); // Value |
break; |
case 16: |
i2c_write_byte(0x80); // Value |
break; |
case 17: |
i2c_stop(); |
I2CTimeout = 10; |
i2c_start(); |
break; |
case 18: |
i2c_write_byte(0x98); // Address of the DAC |
break; |
case 19: |
i2c_write_byte(0x14); // Update Channel C |
break; |
case 20: |
i2c_write_byte(AnalogOffsetGier); // Value |
break; |
case 21: |
i2c_write_byte(0x80); // Value |
break; |
case 22: |
i2c_stop(); |
I2CTimeout = 10; |
twi_state = 0; |
break; |
default: twi_state = 0; |
break; |
} |
TWCR |= 0x80; |
} |
/branches/Znib/V0.78f/twimaster.h |
---|
0,0 → 1,46 |
/*############################################################################ |
############################################################################*/ |
#ifndef _I2C_MASTER_H |
#define _I2C_MASTER_H |
//############################################################################ |
// I2C Konstanten |
#define SCL_CLOCK 200000L |
#define I2C_TIMEOUT 30000 |
#define I2C_START 0x08 |
#define I2C_REPEATED_START 0x10 |
#define I2C_TX_SLA_ACK 0x18 |
#define I2C_TX_DATA_ACK 0x28 |
#define I2C_RX_SLA_ACK 0x40 |
#define I2C_RX_DATA_ACK 0x50 |
//############################################################################ |
extern volatile unsigned char twi_state; |
extern unsigned char motor,MissingMotor; |
extern unsigned char motorread; |
#define MAX_MOTORS 12 |
#define MOTOR_STATE_PRESENT_MASK 0x80 |
#define MOTOR_STATE_ERROR_MASK 0x7F |
typedef struct |
{ |
unsigned char SetPoint; // written by attitude controller |
unsigned char State; // 7 bit for I2C error counter, highest bit indicates if motor is present |
unsigned char Current; // in 0.1 A steps, read back from BL |
unsigned char MaxPWM; // read back from BL is less than 255 if BL is in current limit |
} __attribute__((packed)) MotorData_t; |
extern MotorData_t Motor[MAX_MOTORS]; |
void i2c_reset(void); |
extern void i2c_init (void); // I2C initialisieren |
extern void i2c_start (void); // Start I2C |
extern void i2c_stop (void); // Stop I2C |
extern void i2c_write_byte (char byte); // 1 Byte schreiben |
extern void i2c_reset(void); |
#endif |
/branches/Znib/V0.78f/uart.c |
---|
0,0 → 1,610 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) Holger Buss, Ingo Busker |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include <stdarg.h> |
#include <string.h> |
#include <avr/pgmspace.h> |
#include "main.h" |
#include "uart.h" |
#include "libfc.h" |
#define FC_ADDRESS 1 |
#define NC_ADDRESS 2 |
#define MK3MAG_ADDRESS 3 |
#define ABO_TIMEOUT 4000 // disable abo after 4 seconds |
#define MAX_SENDE_BUFF 160 |
#define MAX_EMPFANGS_BUFF 160 |
unsigned char GetExternalControl = 0,DebugDisplayAnforderung1 = 0, DebugDisplayAnforderung = 0,DebugDataAnforderung = 0,GetVersionAnforderung = 0, GetPPMChannelAnforderung = 0; |
unsigned char DisplayLine = 0; |
unsigned volatile char SioTmp = 0; |
unsigned volatile char NeuerDatensatzEmpfangen = 0; |
unsigned volatile char NeueKoordinateEmpfangen = 0; |
unsigned volatile char UebertragungAbgeschlossen = 1; |
unsigned volatile char CntCrcError = 0; |
unsigned volatile char AnzahlEmpfangsBytes = 0; |
unsigned volatile char TxdBuffer[MAX_SENDE_BUFF]; |
unsigned volatile char RxdBuffer[MAX_EMPFANGS_BUFF]; |
unsigned char *pRxData = 0; |
unsigned char RxDataLen = 0; |
unsigned volatile char PC_DebugTimeout = 0; |
unsigned volatile char PC_MotortestActive = 0; |
unsigned char DebugTextAnforderung = 255; |
unsigned char PcZugriff = 100; |
unsigned char MotorTest[16]; |
unsigned char MeineSlaveAdresse = 1; // Flight-Ctrl |
unsigned char ConfirmFrame; |
struct str_DebugOut DebugOut; |
struct str_ExternControl ExternControl; |
struct str_VersionInfo VersionInfo; |
struct str_WinkelOut WinkelOut; |
struct str_Data3D Data3D; |
int Display_Timer, Debug_Timer,Kompass_Timer,Timer3D; |
unsigned int DebugDataIntervall = 0, Intervall3D = 0, Display_Interval = 0; |
unsigned int AboTimeOut = 0; |
const unsigned char ANALOG_TEXT[32][16] PROGMEM = |
{ |
//1234567890123456 |
"AngleNick ", //0 |
"AngleRoll ", |
"AccNick ", |
"AccRoll ", |
"YawGyro ", |
"Height Value ", //5 |
"AccZ ", |
"Gas ", |
"Compass Value ", |
"Voltage [0.1V] ", |
"Receiver Level ", //10 |
"Gyro Compass ", |
"Motor 1 ", |
"Motor 2 ", |
"Motor 3 ", |
"Motor 4 ", //15 |
" ", |
" ", |
"VarioMeter ", |
"MK3Mag CalState ", |
"Servo ", //20 |
"Hovergas ", |
"Current [0.1A] ", |
"Capacity [mAh] ", |
" ", |
" ", //25 |
" ", |
" ", |
"I2C-Error ", |
" ", // "Navi Serial Data", |
"GPS_Nick ", //30 |
"GPS_Roll " |
}; |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ Sende-Part der Datenübertragung |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
ISR(USART0_TX_vect) |
{ |
static unsigned int ptr = 0; |
unsigned char tmp_tx; |
if(!UebertragungAbgeschlossen) |
{ |
ptr++; // die [0] wurde schon gesendet |
tmp_tx = TxdBuffer[ptr]; |
if((tmp_tx == '\r') || (ptr == MAX_SENDE_BUFF)) |
{ |
ptr = 0; |
UebertragungAbgeschlossen = 1; |
} |
UDR0 = tmp_tx; |
} |
else ptr = 0; |
} |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ Empfangs-Part der Datenübertragung, incl. CRC-Auswertung |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
ISR(USART0_RX_vect) |
{ |
static unsigned int crc; |
static unsigned char crc1,crc2,buf_ptr; |
static unsigned char UartState = 0; |
unsigned char CrcOkay = 0; |
SioTmp = UDR0; |
if(buf_ptr >= MAX_SENDE_BUFF) UartState = 0; |
if(SioTmp == '\r' && UartState == 2) |
{ |
UartState = 0; |
crc -= RxdBuffer[buf_ptr-2]; |
crc -= RxdBuffer[buf_ptr-1]; |
crc %= 4096; |
crc1 = '=' + crc / 64; |
crc2 = '=' + crc % 64; |
CrcOkay = 0; |
if((crc1 == RxdBuffer[buf_ptr-2]) && (crc2 == RxdBuffer[buf_ptr-1])) CrcOkay = 1; else { CrcOkay = 0; CntCrcError++;}; |
if(!NeuerDatensatzEmpfangen && CrcOkay) // Datensatz schon verarbeitet |
{ |
NeuerDatensatzEmpfangen = 1; |
AnzahlEmpfangsBytes = buf_ptr + 1; |
RxdBuffer[buf_ptr] = '\r'; |
if(RxdBuffer[2] == 'R') |
{ |
LcdClear(); |
wdt_enable(WDTO_250MS); // Reset-Commando |
ServoActive = 0; |
} |
} |
} |
else |
switch(UartState) |
{ |
case 0: |
if(SioTmp == '#' && !NeuerDatensatzEmpfangen) UartState = 1; // Startzeichen und Daten schon verarbeitet |
buf_ptr = 0; |
RxdBuffer[buf_ptr++] = SioTmp; |
crc = SioTmp; |
break; |
case 1: // Adresse auswerten |
UartState++; |
RxdBuffer[buf_ptr++] = SioTmp; |
crc += SioTmp; |
break; |
case 2: // Eingangsdaten sammeln |
RxdBuffer[buf_ptr] = SioTmp; |
if(buf_ptr < MAX_EMPFANGS_BUFF) buf_ptr++; |
else UartState = 0; |
crc += SioTmp; |
break; |
default: |
UartState = 0; |
break; |
} |
} |
// -------------------------------------------------------------------------- |
void AddCRC(unsigned int wieviele) |
{ |
unsigned int tmpCRC = 0,i; |
for(i = 0; i < wieviele;i++) |
{ |
tmpCRC += TxdBuffer[i]; |
} |
tmpCRC %= 4096; |
TxdBuffer[i++] = '=' + tmpCRC / 64; |
TxdBuffer[i++] = '=' + tmpCRC % 64; |
TxdBuffer[i++] = '\r'; |
UebertragungAbgeschlossen = 0; |
UDR0 = TxdBuffer[0]; |
} |
// -------------------------------------------------------------------------- |
void SendOutData(unsigned char cmd,unsigned char address, unsigned char BufferAnzahl, ...) //unsigned char *snd, unsigned char len) |
{ |
va_list ap; |
unsigned int pt = 0; |
unsigned char a,b,c; |
unsigned char ptr = 0; |
unsigned char *snd = 0; |
int len = 0; |
TxdBuffer[pt++] = '#'; // Startzeichen |
TxdBuffer[pt++] = 'a' + address; // Adresse (a=0; b=1,...) |
TxdBuffer[pt++] = cmd; // Commando |
va_start(ap, BufferAnzahl); |
if(BufferAnzahl) |
{ |
snd = va_arg(ap, unsigned char*); |
len = va_arg(ap, int); |
ptr = 0; |
BufferAnzahl--; |
} |
while(len) |
{ |
if(len) |
{ |
a = snd[ptr++]; |
len--; |
if((!len) && BufferAnzahl) |
{ |
snd = va_arg(ap, unsigned char*); |
len = va_arg(ap, int); |
ptr = 0; |
BufferAnzahl--; |
} |
} |
else a = 0; |
if(len) |
{ |
b = snd[ptr++]; |
len--; |
if((!len) && BufferAnzahl) |
{ |
snd = va_arg(ap, unsigned char*); |
len = va_arg(ap, int); |
ptr = 0; |
BufferAnzahl--; |
} |
} |
else b = 0; |
if(len) |
{ |
c = snd[ptr++]; |
len--; |
if((!len) && BufferAnzahl) |
{ |
snd = va_arg(ap, unsigned char*); |
len = va_arg(ap, int); |
ptr = 0; |
BufferAnzahl--; |
} |
} |
else c = 0; |
TxdBuffer[pt++] = '=' + (a >> 2); |
TxdBuffer[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4)); |
TxdBuffer[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6)); |
TxdBuffer[pt++] = '=' + ( c & 0x3f); |
} |
va_end(ap); |
AddCRC(pt); |
} |
// -------------------------------------------------------------------------- |
void Decode64(void) // die daten werden im rx buffer dekodiert, das geht nur, weil aus 4 byte immer 3 gemacht werden. |
{ |
unsigned char a,b,c,d; |
unsigned char x,y,z; |
unsigned char ptrIn = 3; // start at begin of data block |
unsigned char ptrOut = 3; |
unsigned char len = AnzahlEmpfangsBytes - 6; // von der Gesamtbytezahl eines Frames gehen 3 Bytes des Headers ('#',Addr, Cmd) und 3 Bytes des Footers (CRC1, CRC2, '\r') ab. |
while(len) |
{ |
a = RxdBuffer[ptrIn++] - '='; |
b = RxdBuffer[ptrIn++] - '='; |
c = RxdBuffer[ptrIn++] - '='; |
d = RxdBuffer[ptrIn++] - '='; |
x = (a << 2) | (b >> 4); |
y = ((b & 0x0f) << 4) | (c >> 2); |
z = ((c & 0x03) << 6) | d; |
if(len--) RxdBuffer[ptrOut++] = x; else break; |
if(len--) RxdBuffer[ptrOut++] = y; else break; |
if(len--) RxdBuffer[ptrOut++] = z; else break; |
} |
pRxData = (unsigned char*)&RxdBuffer[3]; // decodierte Daten beginnen beim 4. Byte |
RxDataLen = ptrOut - 3; // wie viele Bytes wurden dekodiert? |
} |
// -------------------------------------------------------------------------- |
void BearbeiteRxDaten(void) |
{ |
if(!NeuerDatensatzEmpfangen) return; |
unsigned char tempchar1, tempchar2; |
Decode64(); // dekodiere datenblock im Empfangsbuffer |
switch(RxdBuffer[1]-'a') // check for Slave Address |
{ |
case FC_ADDRESS: // FC special commands |
switch(RxdBuffer[2]) |
{ |
case 'K':// Kompasswert |
memcpy((unsigned char *)&KompassValue , (unsigned char *)pRxData, sizeof(KompassValue)); |
KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180; |
break; |
case 't':// Motortest |
if(AnzahlEmpfangsBytes > 20) memcpy(&MotorTest[0], (unsigned char *)pRxData, sizeof(MotorTest)); |
else memcpy(&MotorTest[0], (unsigned char *)pRxData, 4); |
PC_MotortestActive = 240; |
//while(!UebertragungAbgeschlossen); |
//SendOutData('T', MeineSlaveAdresse, 0); |
PcZugriff = 255; |
break; |
case 'n':// "Get Mixer |
while(!UebertragungAbgeschlossen); |
SendOutData('N', FC_ADDRESS, 1, (unsigned char *) &Mixer,sizeof(Mixer)); |
break; |
case 'm':// "Write Mixer |
while(!UebertragungAbgeschlossen); |
if(pRxData[0] == MIXER_REVISION) |
{ |
memcpy(&Mixer, (unsigned char *)pRxData, sizeof(Mixer)); |
eeprom_write_block(&Mixer, &EEPromArray[EEPROM_ADR_MIXER_TABLE], sizeof(Mixer)); |
tempchar1 = 1; |
} |
else tempchar1 = 0; |
SendOutData('M', FC_ADDRESS, 1, &tempchar1, sizeof(tempchar1)); |
break; |
case 'p': // get PPM Channels |
GetPPMChannelAnforderung = 1; |
PcZugriff = 255; |
break; |
case 'q':// "Get"-Anforderung für Settings |
// Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
if(pRxData[0] == 0xFF) |
{ |
pRxData[0] = 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(); |
} |
else |
{ |
tempchar1 = 0; // mark in response an invlid setting |
} |
while(!UebertragungAbgeschlossen); |
SendOutData('S', FC_ADDRESS, 1, &tempchar1, sizeof(tempchar1)); |
if(!MotorenEin) Piep(tempchar1,110); |
LipoDetection(0); |
LIBFC_ReceiverInit(); |
break; |
case 'f': // auf anderen Parametersatz umschalten |
if((1 <= pRxData[0]) && (pRxData[0] <= 5)) SetActiveParamSetNumber(pRxData[0]); |
tempchar1 = pRxData[0]; |
ReadParameterSet(tempchar1, (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
while(!UebertragungAbgeschlossen); |
SendOutData('F', FC_ADDRESS, 1, &tempchar1, sizeof(tempchar1)); |
if(!MotorenEin) Piep(tempchar1,110); |
LipoDetection(0); |
LIBFC_ReceiverInit(); |
break; |
case 'y':// serial Potis |
PPM_in[13] = (signed char) pRxData[0]; PPM_in[14] = (signed char) pRxData[1]; PPM_in[15] = (signed char) pRxData[2]; PPM_in[16] = (signed char) pRxData[3]; |
PPM_in[17] = (signed char) pRxData[4]; PPM_in[18] = (signed char) pRxData[5]; PPM_in[19] = (signed char) pRxData[6]; PPM_in[20] = (signed char) pRxData[7]; |
PPM_in[21] = (signed char) pRxData[8]; PPM_in[22] = (signed char) pRxData[9]; PPM_in[23] = (signed char) pRxData[10]; PPM_in[24] = (signed char) pRxData[11]; |
break; |
} // case FC_ADDRESS: |
default: // any Slave Address |
switch(RxdBuffer[2]) |
{ |
// 't' comand placed here only for compatibility to BL |
case 't':// Motortest |
if(AnzahlEmpfangsBytes > 20) memcpy(&MotorTest[0], (unsigned char *)pRxData, sizeof(MotorTest)); |
else memcpy(&MotorTest[0], (unsigned char *)pRxData, 4); |
while(!UebertragungAbgeschlossen); |
SendOutData('T', MeineSlaveAdresse, 0); |
PC_MotortestActive = 250; |
PcZugriff = 255; |
break; |
// 'K' comand placed here only for compatibility to old MK3MAG software, that does not send the right Slave Address |
case 'K':// Kompasswert |
memcpy((unsigned char *)&KompassValue , (unsigned char *)pRxData, sizeof(KompassValue)); |
KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180; |
break; |
case 'a':// Texte der Analogwerte |
DebugTextAnforderung = pRxData[0]; |
if (DebugTextAnforderung > 31) DebugTextAnforderung = 31; |
PcZugriff = 255; |
break; |
case 'b': |
memcpy((unsigned char *)&ExternControl, (unsigned char *)pRxData, sizeof(ExternControl)); |
ConfirmFrame = ExternControl.Frame; |
PcZugriff = 255; |
break; |
case 'c': // Poll the 3D-Data |
if(!Intervall3D) { if(pRxData[0]) Timer3D = SetDelay(pRxData[0] * 10);} |
Intervall3D = pRxData[0] * 10; |
AboTimeOut = SetDelay(ABO_TIMEOUT); |
break; |
case 'd': // Poll the debug data |
PcZugriff = 255; |
DebugDataIntervall = (unsigned int)pRxData[0] * 10; |
if(DebugDataIntervall > 0) DebugDataAnforderung = 1; |
AboTimeOut = SetDelay(ABO_TIMEOUT); |
break; |
case 'h':// x-1 Displayzeilen |
PcZugriff = 255; |
if((pRxData[0] & 0x80) == 0x00) // old format |
{ |
DisplayLine = 2; |
Display_Interval = 0; |
} |
else // new format |
{ |
RemoteKeys |= ~pRxData[0]; |
Display_Interval = (unsigned int)pRxData[1] * 10; |
DisplayLine = 4; |
AboTimeOut = SetDelay(ABO_TIMEOUT); |
} |
DebugDisplayAnforderung = 1; |
break; |
case 'l':// x-1 Displayzeilen |
PcZugriff = 255; |
MenuePunkt = pRxData[0]; |
DebugDisplayAnforderung1 = 1; |
break; |
case 'v': // Version-Anforderung und Ausbaustufe |
GetVersionAnforderung = 1; |
break; |
case 'g':// |
GetExternalControl = 1; |
break; |
} |
break; // default: |
} |
NeuerDatensatzEmpfangen = 0; |
pRxData = 0; |
RxDataLen = 0; |
} |
//############################################################################ |
//Routine für die Serielle Ausgabe |
void uart_putchar (char c) |
//############################################################################ |
{ |
//Warten solange bis Zeichen gesendet wurde |
loop_until_bit_is_set(UCSR0A, UDRE0); |
//Ausgabe des Zeichens |
UDR0 = c; |
} |
//############################################################################ |
//INstallation der Seriellen Schnittstelle |
void UART_Init (void) |
//############################################################################ |
{ |
unsigned int ubrr = (unsigned int) ((unsigned long) F_CPU/(8 * USART0_BAUD) - 1); |
//Enable TXEN im Register UCR TX-Data Enable & RX Enable |
UCSR0B = (1 << TXEN0) | (1 << RXEN0); |
// UART Double Speed (U2X) |
UCSR0A |= (1 << U2X0); |
// RX-Interrupt Freigabe |
UCSR0B |= (1 << RXCIE0); |
// TX-Interrupt Freigabe |
UCSR0B |= (1 << TXCIE0); |
// USART0 Baud Rate Register |
// set clock divider |
UBRR0H = (uint8_t)(ubrr >> 8); |
UBRR0L = (uint8_t)ubrr; |
Debug_Timer = SetDelay(DebugDataIntervall); |
Kompass_Timer = SetDelay(220); |
VersionInfo.SWMajor = VERSION_MAJOR; |
VersionInfo.SWMinor = VERSION_MINOR; |
VersionInfo.SWPatch = VERSION_PATCH; |
VersionInfo.ProtoMajor = VERSION_SERIAL_MAJOR; |
VersionInfo.ProtoMinor = VERSION_SERIAL_MINOR; |
pRxData = 0; |
RxDataLen = 0; |
} |
//--------------------------------------------------------------------------------------------- |
void DatenUebertragung(void) |
{ |
if(!UebertragungAbgeschlossen) return; |
if(CheckDelay(AboTimeOut)) |
{ |
Display_Interval = 0; |
DebugDataIntervall = 0; |
Intervall3D = 0; |
} |
if(((Display_Interval>0 && CheckDelay(Display_Timer)) || DebugDisplayAnforderung) && UebertragungAbgeschlossen) |
{ |
if(DisplayLine > 3)// new format |
{ |
Menu(); |
SendOutData('H', FC_ADDRESS, 1, (uint8_t *)DisplayBuff, 80); |
} |
else // old format |
{ |
LCD_printfxy(0,0,"!!! INCOMPATIBLE !!!"); |
SendOutData('H', FC_ADDRESS, 2, &DisplayLine, sizeof(DisplayLine), (uint8_t *)DisplayBuff, 20); |
if(DisplayLine++ > 3) DisplayLine = 0; |
} |
Display_Timer = SetDelay(Display_Interval); |
DebugDisplayAnforderung = 0; |
} |
if(DebugDisplayAnforderung1 && UebertragungAbgeschlossen) |
{ |
Menu(); |
SendOutData('L', FC_ADDRESS, 3, &MenuePunkt, sizeof(MenuePunkt), &MaxMenue, sizeof(MaxMenue), DisplayBuff, sizeof(DisplayBuff)); |
DebugDisplayAnforderung1 = 0; |
} |
if(GetVersionAnforderung && UebertragungAbgeschlossen) |
{ |
SendOutData('V', FC_ADDRESS, 1, (unsigned char *) &VersionInfo, sizeof(VersionInfo)); |
GetVersionAnforderung = 0; |
} |
if(GetExternalControl && UebertragungAbgeschlossen) // Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
{ |
SendOutData('G',MeineSlaveAdresse, 1, (unsigned char *) &ExternControl, sizeof(ExternControl)); |
GetExternalControl = 0; |
} |
if((CheckDelay(Kompass_Timer)) && UebertragungAbgeschlossen) |
{ |
WinkelOut.Winkel[0] = (int) (IntegralNick / (EE_Parameter.GyroAccFaktor * 4)); // etwa in 0.1 Grad |
WinkelOut.Winkel[1] = (int) (IntegralRoll / (EE_Parameter.GyroAccFaktor * 4)); // etwa in 0.1 Grad |
WinkelOut.UserParameter[0] = Parameter_UserParam1; |
WinkelOut.UserParameter[1] = Parameter_UserParam2; |
SendOutData('w', MK3MAG_ADDRESS, 1, (unsigned char *) &WinkelOut,sizeof(WinkelOut)); |
if(WinkelOut.CalcState > 4) WinkelOut.CalcState = 6; // wird dann in SPI auf Null gesetzt |
Kompass_Timer = SetDelay(99); |
} |
if(((DebugDataIntervall>0 && CheckDelay(Debug_Timer)) || DebugDataAnforderung) && UebertragungAbgeschlossen) |
{ |
//if(Poti3 > 64) |
SendOutData('D', FC_ADDRESS, 1, (unsigned char *) &DebugOut,sizeof(DebugOut)); |
DebugDataAnforderung = 0; |
if(DebugDataIntervall>0) Debug_Timer = SetDelay(DebugDataIntervall); |
} |
if(Intervall3D > 0 && CheckDelay(Timer3D) && UebertragungAbgeschlossen) |
{ |
Data3D.Winkel[0] = (int) (IntegralNick / (EE_Parameter.GyroAccFaktor * 4)); // etwa in 0.1 Grad |
Data3D.Winkel[1] = (int) (IntegralRoll / (EE_Parameter.GyroAccFaktor * 4)); // etwa in 0.1 Grad |
Data3D.Winkel[2] = (int) ((10 * ErsatzKompass) / GIER_GRAD_FAKTOR); |
SendOutData('C', FC_ADDRESS, 1, (unsigned char *) &Data3D,sizeof(Data3D)); |
Timer3D = SetDelay(Intervall3D); |
} |
if(DebugTextAnforderung != 255) // Texte für die Analogdaten |
{ |
unsigned char label[16]; // local sram buffer |
memcpy_P(label, ANALOG_TEXT[DebugTextAnforderung], 16); // read lable from flash to sra |
SendOutData('A', FC_ADDRESS, 2, (unsigned char *)&DebugTextAnforderung, sizeof(DebugTextAnforderung),label, 16); |
DebugTextAnforderung = 255; |
} |
if(ConfirmFrame && UebertragungAbgeschlossen) // Datensatz bestätigen |
{ |
SendOutData('B', FC_ADDRESS, 1, (uint8_t*)&ConfirmFrame, sizeof(ConfirmFrame)); |
ConfirmFrame = 0; |
} |
if(GetPPMChannelAnforderung && UebertragungAbgeschlossen) |
{ |
SendOutData('P', FC_ADDRESS, 1, (unsigned char *) &PPM_in, sizeof(PPM_in)); |
GetPPMChannelAnforderung = 0; |
} |
} |
/branches/Znib/V0.78f/uart.h |
---|
0,0 → 1,83 |
#ifndef _UART_H |
#define _UART_H |
#define printf_P(format, args...) _printf_P(&uart_putchar, format , ## args) |
#define printf(format, args...) _printf_P(&uart_putchar, PSTR(format) , ## args) |
void BearbeiteRxDaten(void); |
extern unsigned char DebugGetAnforderung; |
extern unsigned volatile char UebertragungAbgeschlossen; |
extern unsigned volatile char PC_DebugTimeout; |
extern unsigned volatile char NeueKoordinateEmpfangen; |
extern unsigned volatile char PC_MotortestActive; |
extern unsigned char MeineSlaveAdresse; |
extern unsigned char PcZugriff; |
extern unsigned char RemotePollDisplayLine; |
extern int Debug_Timer,Kompass_Timer; |
extern void UART_Init (void); |
extern void uart_putchar (char c); |
extern void boot_program_page (uint32_t page, uint8_t *buf); |
extern void DatenUebertragung(void); |
extern void Uart1Init(void); |
extern void BearbeiteRxDaten(void); |
extern unsigned char MotorTest[16]; |
struct str_DebugOut |
{ |
unsigned char Digital[2]; |
signed int Analog[32]; // Debugwerte |
}; |
extern struct str_DebugOut DebugOut; |
struct str_WinkelOut |
{ |
signed int Winkel[2]; |
unsigned char UserParameter[2]; |
unsigned char CalcState; |
unsigned char Orientation; |
}; |
extern struct str_WinkelOut WinkelOut; |
struct str_Data3D |
{ |
signed int Winkel[3]; // nick, roll, compass in 0,1° |
signed char reserve[8]; |
}; |
extern struct str_Data3D Data3D; |
struct str_ExternControl |
{ |
unsigned char Digital[2]; |
unsigned char RemoteTasten; |
signed char Nick; |
signed char Roll; |
signed char Gier; |
unsigned char Gas; |
signed char Hight; |
unsigned char free; |
unsigned char Frame; |
unsigned char Config; |
}; |
extern struct str_ExternControl ExternControl; |
struct str_VersionInfo |
{ |
unsigned char SWMajor; |
unsigned char SWMinor; |
unsigned char ProtoMajor; |
unsigned char ProtoMinor; |
unsigned char SWPatch; |
unsigned char Reserved[5]; |
}; |
extern struct str_VersionInfo VersionInfo; |
//#define USART0_BAUD 9600 |
//#define USART0_BAUD 14400 |
//#define USART0_BAUD 28800 |
//#define USART0_BAUD 38400 |
#define USART0_BAUD 57600 |
#endif //_UART_H |
/branches/Znib/V0.78f/version.txt |
---|
0,0 → 1,397 |
------- |
V0.53 27.04.2007 H.Buss |
- erste öffentliche Version |
V0.53b 29.04.2007 H.Buss |
- der FAKTOR_I war versehentlich auf Null, dann liegt der MikroKopter nicht so hart in der Luft |
V0.53c 29.04.2007 H.Buss |
- es gib ein Menü, in dem die Werte der Kanäle nach Nick, Roll, Gas,... sortiert sind. |
Die angezeigten Werte waren nicht die Werte der Funke |
V0.54 01.05.2007 H.Buss |
- die Paramtersätze können jetzt vor dem Start ausgewählt werden |
Dazu wird beim Kalibrieren der Messwerte (Gashebel oben links) der Nick-Rollhebel abgefragt: |
2 3 4 |
1 x 5 |
- - - |
Bedeutet: Nick-Rollhebel Links Mitte = Setting:1 Links Oben = Setting:2 usw. |
- der Faktor_I für den Hauptregler ist hinzugekommen. Im Heading-Hold-Modus sollte er vergössert werden, was Stabilität bringt |
V0.55 14.05.2007 H.Buss |
- es können nun Servos an J3,J4,J5 mit den Kanälen 5-7 gesteuert werden |
V0.56 14.05.2007 H.Buss |
- es gab Probleme mit Funken, die mehr als 8 Kanäle haben, wenn mehrere Kanäle dann auf Null waren |
- Funken, die nicht bis +-120 aussteuern können, sollten jetzt auch gehen |
V0.57 24.05.2007 H.Buss |
- Der Höhenregler kann nun auch mittels Schalter bedient werden |
- Bug im Gier-Algorithmus behoben; Schnelles Gieren fürhrte dazu, dass der MK zu weit gedreht hat |
- Kompass-Einfluss dämpfen bei Neigung |
- Man kann zwischen Kompass FIX (Richtung beim Kalibrieren) und Variabel (einstellbar per Gier) wählen |
- Der Motortest vom Kopter-Tool geht jetzt |
- Man kann den Parametersätzen einen Namen geben |
- Das Kamerasetting ist unter Setting 2 defaultmässig integriert |
V0.58 30.05.2007 H.Buss |
- Der Höhenregler-Algorithmus wird nun umgangen, wenn der Höhenreglerschalter aus ist |
V0.60 17.08.2007 H.Buss |
- "Schwindel-Bug" behoben |
- Die Poti-Werte werden jetzt auf Unterlauf (<0) überprüft |
- Poti4 zugefügt |
- Es werden jetzt 8 Kanäle ausgewertet |
- Kamera-Servo (an J7) |
- Die Settings müssen überschrieben werden |
V0.61 - V0.63 H.Buss 27.09.2007 |
- Poti 4 und Kanal 8 werden im Menü angezeigt |
- ein paar Kleinigkeiten bei den DefaultKonstanten2 bereinigt |
- Analog.c: Aktuell_ax korrigiert |
- auf 32 Debug-Kanäle erweitert |
- Loopings sind jetzt möglich und einzeln im KopterTool freischaltbar |
- leichte Anpassungen im Gier - Geschwindigkeit und Drift |
- die Hardwareversion V1.1 wird erkannt und das Programm stellt sich auf die geänderte Gyroverstärkung und die geänderten Portpins ein |
- die Software startet nach dem Einschalten schneller, weil der Luftdruckoffset schneller gefunden wird |
- die PPM-Ausgänge liegen wieder an den Pins an |
- Details an der Sensordatenverarbeitung -> es fliegt sich geringfügig anders |
- der MK ist bei wenig Gas nicht mehr so giftig -> soll das Landen vereinfachen |
- I2C-Bus läuft jetzt sicher nach einer Störung wieder an |
- Sticksignale werden präziser ausgewertet |
- Stick-Kanäle werden ans Kopter-Tool übertragen |
- Es muss die Version V1.47 des Kopter-Tool verwendet werden |
- Die Settings werden auf Default zurückgesetzt |
- am Piepen kann man die Fehlerart unterscheiden |
1. einzelnes Piepen beim Einschalten und Kalibrieren |
2. langsames Intervall mindestens 1 Sek -> Empfangsausfall |
3. schnelleres Intervall mindestens 1 Sek -> Akku |
4. sehr schnelles Intervall mindestens 1 Sek -> Kommunikation zu den Reglern gestört |
V0.64 H.Buss 30.09.2007 |
- beim Gieren wurden die Achsen nicht hart genug geregelt |
V0.65a H.Buss 15.10.2007 |
- Integral im Mischer wieder integriert |
- Feinabstimmung im ACC/Gyro Abgleich -> 1/32 & 100 |
- ACC/Gyro Abgleich auch bei HH |
V0.66a H.Buss 3.11.2007 |
- Messwertverarbeitung aus dem Analog-Interrupt entfernt |
- Analogmessung hängt jetzt am FC-Timing |
- Looping-Stick-Hysterese eingebaut |
- Looping-180°-Umschlag einstellbar |
- Achsenkopplung: Gierbewegung verkoppelt Nick und Roll |
- Lageregelung nach ACC-Sensor verbessert |
- zusätzlicher I-Anteil in der Lageregelung verbessert die Neutrallage |
- Gyrodriftkompensation überarbeitet |
- Bug in der Gier-Stick-Berechnung behoben |
- Gyro-Messung auf 1kHz beschleunigt |
V0.67a H.Buss 16.11.2007 |
- der Hauptregler-I-Anteil wirkt jetzt nur noch auf den Winkel (ausser im HH-Mode) |
- Gyro-Acc-Abgleich jetzt wieder in jedem Zyklus |
- Feinabstimmung |
- Beim HH-Modus gab es noch Bugs |
V0.67e H.Buss 29.11.2007 |
- Parameter: Dynamic Stability und Driftfaktor eingeführt |
- Die Namen der Analogwerte werden jetzt zum Koptertool übertragen |
- Kompatibilität zum Koptertool erhöht |
V0.67f H.Buss 04.12.2007 |
- Das Integral des Hauptreglers wird jetzt linear entladen und nicht mehr proportional |
- Schub für Gier wird jetzt auf den Gaswert begrenzt, dadurch steigt der MK nicht mehr beim Gieren. Gier ist allerdings nicht mehr so agressiv |
- Die ACC-Nullwerte können jetzt dauerhaft im EEPROM gespeichert werden (Stick:Vollgas und Gier rechts) |
V0.68a I.Busker 28.12.2007 |
- SPI.c & SPI.h ins Projekt aufgenommen |
SPI-Kommuikation kann in SPI.h aktiviert/deaktivert werden |
V0.68c H.Buss 05.01.2008 |
- Stickauswertung verbessert -> träger und präziser |
- Alle Settings angepasst |
V0.69e H.Buss 05.05.2008 |
- kleinere Bugs beseitigt |
- Schneller Sinkflug jetzt möglich |
- Min- und Maxgas in den Settings geändert |
- Lagewinkel wird jetzt in 0,1 Grad an Kompass und Navi gesendet |
- Kalibrierung für MK3Mag -> Nick unten beim Kalibrieren |
- Kompassroutine um den Ersatzkompass (Gyro unterstützt Kompasswert) erweitert |
V0.69h H.Buss 21.05.2008 |
- STICK_GAIN = 4 eingeführt. Das erhöht die Auflösung der Sollwerte. Stick_P und Stick_I müssen nun um Faktor 4 erhöht werden |
- SenderOkay auch an das Naviboard übertragen |
- Bessere Parameter bei Senderausfall |
V0.69j H.Buss 30.05.2008 |
- Höhere Präzision der Achsenkopplung |
V0.69k H.Buss 31.05.2008 |
- Bug in SPI.C behoben |
- in 0.69h war ein Bug, der zu ungewollten Loopings führen konnte |
V0.69L H.Buss 14.06.2008 |
- feinere Cam-Servo-Auflösung |
V0.70a H.Buss 01.07.2008 |
- Unterstützung der V1.3-Hardware mit automatischem Hardware-Gyro-Abgleich |
V0.70b H.Buss 14.07.2008 |
- flexible Einstellungsmöglichkeit von J16 und J17 (Transistorausgänge) |
- eigene Parameter für GPS-Naviboard |
- eigener Parameter für ExternalControl (war vorher UserParameter1 bzw. 8) |
- neue Parameter im EEPROM-Datensatz: J16Bitmask, J16Timing, ExternalControl, Navi... |
- MikroKopterFlags eingeführt, damit das Navi den Status des MKs kennt |
- KopterTool-Kompatibilität auf 8 erhöht |
V0.70c H.Buss 30.07.2008 |
- Parameter der Datenfusion leicht modifiziert |
- EEPROM-Parameter für Looping-Umschlag angepasst (von 100 auf 85) |
- MaxStick wird auf 100 begrenzt |
V0.70d H.Buss 02.08.2008 |
- Transistorausgänge: das oberste Bit der Blinkmaske (im KopterTool linkes Bit) gibt nun den Zustand des Ausgangs im Schalterbetrieb an |
0.71b: H.Buss 19.10.2008 |
Kommunikation zum Navi erweitert: |
- Beeptime jetzt 32Bit |
- Datenfusion und Driftkopensation wird durch NaviBoard unterstützt |
0.71c: H.Buss 20.10.2008 |
- LoopConfig heisst jetzt BitConfig |
- 3-Fach-Schalter für Höhensteuerung möglich -> kann man mit GPS-Schalter zusammenlegen |
- bei den Settings wurde Setting[0] mit abgespeichert, welches es nicht gab. |
- in Zukunft werden bei neuen EEPROM-Settings die Kanäle von Setting 1 übernommen |
- Variablen NaviWindCorrection, NaviSpeedCompensation, NaviOperatingRadius eingeführt |
0.71f: H.Buss 15.11.2008 |
- Ausschalten der Höhenregelung per Schalter um 0,3 sek verzögert |
- bei der seriellen Übertragung hat die FC jetzt als SlaveAdresse die 1 |
- VersionInfo.NaviKompatibel eingeführt |
- wenn manuell gegiert wird, wird der GyroKompass-Wert auf den Kompasswert gesetzt |
- Luftdruckwert wird an das Navi übertragen |
- Der Baro-Offset wird jetzt nachgeführt, um den Messbereich zu erweitern. Geht nur bei Höhenregler mit Schalter |
- Debugdaten können jetzt mit 'f' gepollt werden |
0.71g: Gregor 09.12.2008 |
- Kommunikation überarbeitet |
Infos hier: http://www.mikrokopter.de/ucwiki/en/SerialCommands |
0.71h: H.Buss 15.12.2008 |
- Freigegebene Version |
- NaviAngleLimitation als Parameter zum Navi implementiert |
- Antwort auf CMD: 't' entfernt |
0.72d: H.Buss 22.01.2009 |
- OCTO als Compilerschalter |
- Unterstützung der FC 2.0 (ME) |
- GYRO_D eingeführt |
- Achsenkopplung jetzt auch auf Nick/Roll-Bewegung |
0.72e: H.Buss 27.01.2009 |
- die 0.72d hatte kein Integral im Gier |
- Parameter eingeführt: |
EE_Parameter.NaviGpsPLimit |
EE_Parameter.NaviGpsILimit |
EE_Parameter.NaviGpsDLimit |
EE_Parameter.NaviPH_LoginTime |
EE_Parameter.AchsKopplung2 |
EE_Parameter.CouplingYawCorrection |
0.72f: H.Buss 28.01.2009 |
- Bug im Ersatzkompass entfernt |
0.72h: H.Buss 05.02.2009 |
- Algorithmen beschleunigt -> Floats durch Fixkomma ersetzt |
- Achsentkopplung weiter verbessert |
- Nick- und Roll im Octo-Mischer auf jeweils vier Motoren aufgeteilt |
0.72i: H.Buss 07.02.2009 |
- Abtastrate von 1kHz auf 2kHz erhöht |
0.72j: H.Buss 09.02.2009 |
- neue Implementierung der Servoausgänge |
0.72k: H.Buss 10.02.2009 |
- Abtastrate auf 5kHz erhöht |
0.72L: H.Buss 13.02.2009 |
- Signalfilterung überarbeitet |
- OCTO2 implementiert |
0.72M: H.Buss 13.02.2009 |
- Code Cleanup |
0.72o: H.Buss 24.02.2009 |
- Abtastrate auf 2kHz |
- HW-Version an Navi |
- neuer Datensatz 'c' -> Lagedaten für 3D-Grafik |
- Auswerteroutine für Spectrum-Satteliten implementiert |
- Kanalsettings werden beim Parameterreset nicht mehr gelöscht |
- die Driftkompensation wird jetzt feiner aufgelöst --> EE_Parameter.Driftkomp muss mal 8 genommen werden |
- die Integrale und ACC-Werte werden jetzt im Scope in ca. 0,1° angezeigt (wie beim NaviBrd) |
0.72p: H.Buss 01.03.2009 |
- Octo3 erstellt |
- Analogwerte umbenannt |
0.73a-d: H.Buss 05.04.2009 |
- MixerTabelle implementiert |
- I2C-Bus auf bis zu 12 Motoren erweitert |
- die Busfehler der BL-Regler werden im Menü angezeigt |
- Revision der MixerTabelle eingeführt |
- MixerTabelle wird bei Parameterreset neu initialisiert |
- Motortest auf [12] erweitert |
- Motorschalter nicht mehr 3-Stufig |
0.74a |
- Datenfusion im Flug auch, wenn ACC-Z < 512 |
- Wert für die Luftdruck-Messbereichserweiterung abgefangen |
0.74d |
- Die Driftkompensation ist jetzt dreistufig -> 0,5% pro sekunde zusätzlich eingeführts |
0.75a G.Stobrawa 22.5.2009 |
- Extern Control also received from NC via SPI |
0.75b H.Buss 27.05.2009 |
- Spektrum-Singale schalten den PPM-Eingang aus |
- max. 2 Sekunden nach dem Start auf die BL-Regler warten |
- Automatische Zellenerkennung, wenn Spannungswarnung < 5,0V |
- Bei automatischer Zellenerkennung piept es je nach Zellenzahl |
- EE_DATENREVISION auf 76 erhöht |
- Servo: |
- Roll-Servo für FC ME implementiert |
- Update-Cmd stoppt Servos |
- Servos werden erst nach dem ersten Kalibrieren aktiviert |
0.75c G.Stobrawa 25.7.2009 |
- Übertragung der Servo-Settings zur NC |
- RSSI wird an NC gesendet, derzeit wird der Wert nicht gesetzt |
- Bugfix Messbereichsumschaltung des Luftdrucksensors springt |
- Auflösung des Luftdrucks nun bis auf 1 cm (5mal feiner) zur genaueren Berechnung des D-Anteils |
- Unterstützung von Warnings-Bitmasks für die J16, J17-Outputs bei Unterspannung |
- Unterspannung für einzelne Zelle´n von 3.2V auf 3.3V angehoben (9.6V --> 9.9V für 3S) |
0.75d H.Buss 13.8.2009 |
- RC-Routine: Empfangsausfall soll sicherer erkannt werden |
- Zellenerkennung nun auch beim Speichern der Settings |
- Warnungs-Blinkmaske auch bei Empfangsausfall |
0.75e H.Buss 18.8.2009 |
- LED-Blinken kann an die Motoren gekoppelt werden |
- Feinabstimmung des Höhenreglers |
0.75f H.Buss 27.8.2009 |
- D-Anteil des Höhenreglers jetzt mit Quadratischer Komponente |
- Lagewinkel wirkt jetzt mit 1/Cos(x) mit in den Höhenregler |
- leichte Modifikation der RC-Empfangroutine |
0.75g H.Buss 31.08.2009 |
- die Akkuspannung geht jetzt antiproportional ins Gas ein |
0.75h H.Buss 3.09.2009 |
- im Höhenregler werden jetzt die Stellwerte begrenzt --> max +- 16% vom geschätzten Schwebegas |
0.75i H.Buss 7.09.2009 |
- GpsZ vom Navi zur FC für den Höhenregler |
- "hoovergas-Variation" als Parameter |
- Kompatibilität zu NC und PC erhöht |
0.75j H.Buss 17.09.2009 |
- Laufzeitzähler eingebaut |
0.75k H.Buss 22.09.2009 |
- zweite Variante (Gregor) der Höhenregelung implementiert |
- umschaltbare RC-Routine |
0.75L H.Buss 23.09.2009 |
- SollHoehe und Gas geht nun auch an die NC |
0.75M H.Buss 29.09.2009 |
- Spektrum-Timing wird nun überwacht |
- die FC kann nun stand-Alone als Kamera-Stabilizer eingesetzt werden, weil die Servos aktiviert werden, wenn I2C fehlt |
0.75N H.Buss 29.09.2009 |
- Hoover-Stickpunkt wird bei aktivem Höhenregler nicht nachgeführt |
- Hoover-Stickpunkt kann per Parameter fest eingestellt werden |
- Baro-Messbereichserweiterung auch bei aktiviertem Höhenregler |
- Gyro_Gier_P und Gyro_Gier_I eingeführt |
- I2C_fehler-Zähler jetzt in den Analogdaten |
0.75o H.Buss 01.10.2009 |
- der Höhenregler wird jetzt nur alle 10ms bearbeitet |
- Baro-Messbereichserweiterung auch bei Poti als Sollwert |
0.76d H.Buss 10.10.2009 |
- bei aktiver Messbereichserweiterung wird die aktuelle Höhe übernommen |
0.76e H.Buss 27.10.2009 |
- es werden beim Start einmal alle BL-Regler angesprochen, damit BL-Regler#8 auch einen Selbsttest macht |
- S3D-ACT-Summensignal als Compilerschalter |
0.76f H.Buss 05.11.2009 |
- untere Spannungsgrenze der Unterspannungswarnung (9,3V) entfernt |
0.76g H.Buss 10.11.2009 |
- Casting-Fehler in der Gas-Berechnung |
0.77a H.Buss 11.11.2009 |
- Erweiterung auf 12 Kanäle |
- Bei Koptertool-Kanalabfrage kein Empfangsausfall-Piepsen |
- serielle Kanalerweiterung eingebaut -> PPM_in auf 25 erweitert |
- Servos3-5 einstellbar |
- neues Kommando "f" -> schaltet auf anderen Parametersatz um |
0.77b H.Buss 09.12.2009 |
- JetiBox: Menü wird übertragen |
- neu: FCFlags |= FCFLAG_I2CERR; |
- LED-Warn-Blinken nun mit festem Timing und abschaltbar |
0.77c H.Buss 07.01.2010 |
- zwei weitere Spektrum-Varianten implementiert |
0.77d H.Buss 25.01.2010 |
- Strom-Messung eingebaut |
0.78a H.Buss 03.02.2010 |
- Bugfix: Settingsumschaltung im Flug |
0.78b H.Buss |
- veröffentlichte Version |
0.78c H.Buss + G.Stobrawa 22.2.2010 |
- Bewegungsbegrenzung an Servo 3 to 5 der FC 2.0 |
- Theoretischer Variablenüberlauf bei Vario-Höhenregler |
- Anzeige des "SPI RX communication error" wenn GPS Option nicht aktiv |
- LED-Schwellwerte fürs Blinken waren unterschiedlich |
0.78c H.Buss + G.Stobrawa 04.3.2010 |
- Code cosmetics |
0.78f H.Buss + I.Busker 23.3.2010 |
- Unterstützung für Jeti-Expander |
- Begrenzung des Vario-Höhenreglers auf ein 10m-Fenster um Überläufe zu verhindern |
- Einführung eines Vario-Zeichens (+/-/ ) auf der Jetibox |
- BL-Timeout beim Start erhöht |
0.78f_Znib |
- Optimierung für Mode 1 und 4: |
Wird beim "User Parameter 1" eine 1 oder eine 4 eingetragen werden zum kalibrieren, |
Motoren starten und auswahl der Settings Gier und Roll vertauscht. Dadurch ist es |
auch für Mode 1 und 4 flieger möglich die z.B. die Motoren zu starten in dem man den |
Gasknüppel nach unten rechts zieht, anstatt den Gasknüppel nach unten und den anderen |
nach rechts zu ziehen. |
- Motoren starten ohne zu kalibrieren verhindern: |
Wird beim "User Parameter 2" etwas anderes als 0 eingetragen muss man nach dem anstecken |
des Akkus mindestens ein mal die Gyros kalibrieren (Gasknüppel nach oben links), sonst |
lassen sich die Motoren nicht starten. |
Dies soll verhindern, dass man versehentlich mit unkalibrierten Gyros davon fliegt. |
/branches/Znib/V0.78f/. |
---|
Property changes: |
Added: tsvn:logminsize |
+8 |
\ No newline at end of property |