/branches/V0.76g-acid/FlightCtrl.aps |
---|
0,0 → 1,0 |
<AVRStudio><MANAGEMENT><ProjectName>FlightCtrl</ProjectName><Created>15-May-2007 11:20:41</Created><LastEdit>11-Oct-2007 22:58:54</LastEdit><ICON>241</ICON><ProjectType>0</ProjectType><Created>15-May-2007 11:20:41</Created><Version>4</Version><Build>4, 13, 0, 528</Build><ProjectTypeName>AVR GCC</ProjectTypeName></MANAGEMENT><CODE_CREATION><ObjectFile>default\Flight-Ctrl.elf</ObjectFile><EntryFile></EntryFile><SaveFolder>F:\SVN\MikroKopter\FlightCtrl\branches\V0.64_ZeroWarnings\</SaveFolder></CODE_CREATION><DEBUG_TARGET><CURRENT_TARGET>AVR Simulator</CURRENT_TARGET><CURRENT_PART>ATmega644.xml</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND><HIDE>false</HIDE></IO_EXPAND><REGISTERNAMES><Register>R00</Register><Register>R01</Register><Register>R02</Register><Register>R03</Register><Register>R04</Register><Register>R05</Register><Register>R06</Register><Register>R07</Register><Register>R08</Register><Register>R09</Register><Register>R10</Register><Register>R11</Register><Register>R12</Register><Register>R13</Register><Register>R14</Register><Register>R15</Register><Register>R16</Register><Register>R17</Register><Register>R18</Register><Register>R19</Register><Register>R20</Register><Register>R21</Register><Register>R22</Register><Register>R23</Register><Register>R24</Register><Register>R25</Register><Register>R26</Register><Register>R27</Register><Register>R28</Register><Register>R29</Register><Register>R30</Register><Register>R31</Register></REGISTERNAMES><COM>Auto</COM><COMType>0</COMType><WATCHNUM>0</WATCHNUM><WATCHNAMES><Pane0></Pane0><Pane1></Pane1><Pane2></Pane2><Pane3></Pane3></WATCHNAMES><BreakOnTrcaeFull>0</BreakOnTrcaeFull></DEBUG_TARGET><Debugger><Triggers></Triggers></Debugger><AVRGCCPLUGIN><FILES><SOURCEFILE>uart.c</SOURCEFILE><SOURCEFILE>analog.c</SOURCEFILE><SOURCEFILE>eeprom.c</SOURCEFILE><SOURCEFILE>fc.c</SOURCEFILE><SOURCEFILE>GPS.c</SOURCEFILE><SOURCEFILE>main.c</SOURCEFILE><SOURCEFILE>menu.c</SOURCEFILE><SOURCEFILE>printf_P.c</SOURCEFILE><SOURCEFILE>rc.c</SOURCEFILE><SOURCEFILE>timer0.c</SOURCEFILE><SOURCEFILE>twimaster.c</SOURCEFILE><HEADERFILE>uart.h</HEADERFILE><HEADERFILE>_Settings.h</HEADERFILE><HEADERFILE>analog.h</HEADERFILE><HEADERFILE>fc.h</HEADERFILE><HEADERFILE>gps.h</HEADERFILE><HEADERFILE>main.h</HEADERFILE><HEADERFILE>menu.h</HEADERFILE><HEADERFILE>old_macros.h</HEADERFILE><HEADERFILE>printf_P.h</HEADERFILE><HEADERFILE>rc.h</HEADERFILE><HEADERFILE>Settings.h</HEADERFILE><HEADERFILE>timer0.h</HEADERFILE><HEADERFILE>twimaster.h</HEADERFILE></FILES><CONFIGS><CONFIG><NAME>default</NAME><USESEXTERNALMAKEFILE>NO</USESEXTERNALMAKEFILE><EXTERNALMAKEFILE></EXTERNALMAKEFILE><PART>atmega644</PART><HEX>1</HEX><LIST>1</LIST><MAP>1</MAP><OUTPUTFILENAME>Flight-Ctrl.elf</OUTPUTFILENAME><OUTPUTDIR>default\</OUTPUTDIR><ISDIRTY>1</ISDIRTY><OPTIONS><OPTION><FILE>GPS.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>analog.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>eeprom.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>fc.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>main.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>menu.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>printf_P.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>rc.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>timer0.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>twimaster.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>uart.c</FILE><OPTIONLIST></OPTIONLIST></OPTION></OPTIONS><INCDIRS/><LIBDIRS/><LIBS><LIB>libc.a</LIB><LIB>libm.a</LIB></LIBS><LINKOBJECTS/><OPTIONSFORALL>-Wall -gdwarf-2 -Wstrict-prototypes -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -DVERSION_HAUPTVERSION=0 -DVERSION_NEBENVERSION=64 -DVERSION_KOMPATIBEL=5</OPTIONSFORALL><LINKEROPTIONS></LINKEROPTIONS><SEGMENTS/></CONFIG></CONFIGS><LASTCONFIG>default</LASTCONFIG><USES_WINAVR>1</USES_WINAVR><GCC_LOC>C:\Program Files\WinAVR\bin\avr-gcc.exe</GCC_LOC><MAKE_LOC>C:\Program Files\WinAVR\utils\bin\make.exe</MAKE_LOC></AVRGCCPLUGIN><IOView><usergroups/></IOView><Files><File00000><FileId>00000</FileId><FileName>main.c</FileName><Status>1</Status></File00000><File00001><FileId>00001</FileId><FileName>uart.c</FileName><Status>1</Status></File00001><File00002><FileId>00002</FileId><FileName>menu.c</FileName><Status>1</Status></File00002><File00003><FileId>00003</FileId><FileName>timer0.c</FileName><Status>1</Status></File00003><File00004><FileId>00004</FileId><FileName>fc.c</FileName><Status>1</Status></File00004><File00005><FileId>00005</FileId><FileName>fc.h</FileName><Status>1</Status></File00005><File00006><FileId>00006</FileId><FileName>menu.h</FileName><Status>1</Status></File00006><File00007><FileId>00007</FileId><FileName>TWIMASTER.C</FileName><Status>1</Status></File00007><File00008><FileId>00008</FileId><FileName>twimaster.h</FileName><Status>1</Status></File00008><File00009><FileId>00009</FileId><FileName>uart.h</FileName><Status>1</Status></File00009><File00010><FileId>00010</FileId><FileName>_Settings.h</FileName><Status>1</Status></File00010><File00011><FileId>00011</FileId><FileName>analog.h</FileName><Status>1</Status></File00011><File00012><FileId>00012</FileId><FileName>gps.h</FileName><Status>1</Status></File00012><File00013><FileId>00013</FileId><FileName>main.h</FileName><Status>1</Status></File00013><File00014><FileId>00014</FileId><FileName>old_macros.h</FileName><Status>1</Status></File00014><File00015><FileId>00015</FileId><FileName>printf_P.h</FileName><Status>1</Status></File00015><File00016><FileId>00016</FileId><FileName>rc.h</FileName><Status>1</Status></File00016><File00017><FileId>00017</FileId><FileName>Settings.h</FileName><Status>1</Status></File00017><File00018><FileId>00018</FileId><FileName>timer0.h</FileName><Status>1</Status></File00018></Files><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio> |
/branches/V0.76g-acid/GPS.c |
---|
0,0 → 1,32 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) Holger Buss, Ingo Busker |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
signed int GPS_Nick = 0; |
signed int GPS_Roll = 0; |
signed int GPS_Nick2 = 0; |
signed int GPS_Roll2 = 0; |
long GpsAktuell_X = 0; |
long GpsAktuell_Y = 0; |
long GpsZiel_X = 0; |
long GpsZiel_Y = 0; |
void GPS_Neutral(void) |
{ |
GpsZiel_X = GpsAktuell_X; |
GpsZiel_Y = GpsAktuell_Y; |
} |
void GPS_BerechneZielrichtung(void) |
{ |
GPS_Nick = 0; |
GPS_Roll = 0; |
} |
/branches/V0.76g-acid/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/V0.76g-acid/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/V0.76g-acid/Hex-Files/Flight-Ctrl_MEGA644_V0_76g.hex |
---|
0,0 → 1,3546 |
:100000000C943B050C9456050C9456050C9456051F |
:100010000C9456050C9456050C9456050C945605F4 |
:100020000C9456050C9472180C9456050C945605B5 |
:100030000C94562C0C9456050C9456050C945605AD |
:100040000C9456050C9456050C9406170C94560502 |
:100050000C940A0C0C9456050C94D10B0C94560578 |
:100060000C94861D0C9456050C94112B0C9456057B |
:100070000C949B680C9456050C945605341E271E50 |
:100080001B1E011EE71DC31DD51D38216C206920D4 |
:10009000C31D56203C201C20FC1FAA1F581F401EB9 |
:1000A000862B792BC62BAA2B9E2B372B482B482B24 |
:1000B0004F2B6B2B662B4B2B532B4F2B622B6F2B0A |
:1000C0004B2B532B4F2B5E2B742B4B2BD82B0A0D0A |
:1000D000426174743A0020332043656C6C732020B5 |
:1000E0000020342043656C6C73202000204C6F7717 |
:1000F000207761726E696E67206C6576656C3A2058 |
:1001000025642E2564000A0D3D3D3D3D3D3D3D3DB0 |
:100110003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D0F |
:100120003D3D3D3D3D3D3D3D3D3D3D000A0D466C67 |
:1001300069676874436F6E74726F6C0A0D48617200 |
:1001400064776172653A25642E25640A0D536F66E3 |
:1001500074776172653A5625642E25642563200004 |
:100160000A0D74686520757365206F662074686970 |
:100170007320736F667477617265206973206F6E88 |
:100180006C79207065726D6974746564200A0D6FF6 |
:100190006E206F726967696E616C204D696B726F5A |
:1001A0004B6F707465722D4861726477617265007F |
:1001B0000A0D7777772E4D696B726F4B6F70746590 |
:1001C000722E646520286329204869537973746509 |
:1001D0006D7320476D6248000A0D3D3D3D3D3D3D3C |
:1001E0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3F |
:1001F0003D3D3D3D3D3D3D3D3D3D3D3D3D000A0DCF |
:1002000047656E65726174696E67206465666175C5 |
:100210006C74204D69786572205461626C65000AC7 |
:100220000D4D697865722D436F6E6669673A2027B8 |
:1002300025732720282575204D6F746F7273290050 |
:100240000A0D466F756E6420424C2D4374726C3AF1 |
:100250002000256420000A0D0A0D2121204D49535C |
:1002600053494E4720424C2D4354524C3A2025646A |
:10027000202121000A0D3D3D3D3D3D3D3D3D3D3DA3 |
:100280003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D9E |
:100290003D3D3D3D3D3D3D3D3D000A0D496E69748E |
:1002A0002E20454550524F4D003A2047656E6572ED |
:1002B0006174696E672044656661756C742D506168 |
:1002C00072616D65746572207573696E67206F6CFD |
:1002D0006420537469636B2053657474696E67732B |
:1002E000000A0D466C696768742D74696D65202578 |
:1002F00075206D696E2020546F74616C3A257520ED |
:100300006D696E000A0D414343206E6F7420636176 |
:100310006C696272617465642021000A0D5573690D |
:100320006E6720706172616D6574657273657420AB |
:100330002564000A0D43616C6962726174696E67BD |
:100340002070726573737572652073656E736F725A |
:100350002E2E004F4B0A0D000A0D436F6E74726F04 |
:100360006C3A200048656164696E67486F6C640090 |
:100370004E6F726D616C20284143432D4D6F646553 |
:1003800029000A0D3D3D3D3D3D3D3D3D3D3D3D3D51 |
:100390003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D8D |
:1003A0003D3D3D3D3D3D3D0A0D002E000A0D2044E2 |
:1003B0004143206F7220493243204552524F52210F |
:1003C00020436865636B204932432C2033567265A5 |
:1003D000662C2044414320616E6420424C2D4374BE |
:1003E000726C005B25695D005B25695D002B204D0B |
:1003F000696B726F4B6F70746572202B0048573AAF |
:100400005625642E25642053573A25642E256425ED |
:10041000630053657474696E673A25642025730020 |
:10042000493243204552524F52212121004D6973D8 |
:1004300073696E6720424C2D4374726C3A256421B7 |
:10044000210028632920486F6C676572204275730C |
:100450007300486F6568653A2020202020253569A3 |
:1004600000536F6C6C486F6568653A2025356900EC |
:100470004C756674647275636B3A20253569004F5C |
:1004800066662020202020203A20253569004B6513 |
:10049000696E65200048F668656E726567656C7503 |
:1004A0006E6700616B742E204C616765004E696356 |
:1004B0006B3A20202020202025356900526F6C6C7B |
:1004C0003A202020202020253569004B6F6D706177 |
:1004D00073733A202020253569004B313A25346961 |
:1004E00020204B323A25346920004B333A253469B9 |
:1004F00020204B343A25346920004B353A253469A5 |
:1005000020204B363A25346920004B373A25346990 |
:1005100020204B383A25346920004E693A25346949 |
:100520002020526F3A253469200047733A253469F8 |
:10053000202047693A253469200050313A25346932 |
:10054000202050323A253469200050333A2534694E |
:10055000202050343A25346920004779726F202DCD |
:100560002053656E736F72004E69636B202534698A |
:1005700020282533692E25692900526F6C6C2025AF |
:10058000346920282533692E256929004769657259 |
:1005900020253469202825336929004E69636B20A2 |
:1005A00025346920282533692E25782900526F6C5F |
:1005B0006C2025346920282533692E2578290047A9 |
:1005C00069657220253469202825336929004E6920 |
:1005D000636B202534692028253369292825336950 |
:1005E0002900526F6C6C2025346920282533692935 |
:1005F0002825336929004769657220253469202838 |
:1006000025336929282533692900414343202D20BA |
:1006100053656E736F72004E69636B2025346920D9 |
:10062000282533692900526F6C6C202534692028F5 |
:100630002533692900486F636820253469202825FF |
:1006400033692900566F6C746167653A2020202554 |
:1006500035690052432D4C6576656C3A202025356E |
:10066000690052432D4368616E6E656C733A2534A0 |
:1006700069004B6F6D706173732020202020202053 |
:10068000005269636874756E673A202025356900E9 |
:100690004D657373776572743A2020253569005370 |
:1006A000746172743A202020202025356900506F33 |
:1006B0007469313A202025336900506F7469323AE9 |
:1006C000202025336900506F7469333A2020253388 |
:1006D0006900506F7469343A2020253369005365EE |
:1006E00072766F202000536574706F696E742020DD |
:1006F000253369005374656C6C756E673A20253339 |
:10070000690052616E67653A2533692D25336900AA |
:1007100045787465726E436F6E74726F6C20200042 |
:100720004E693A2534692020526F3A2534692000F9 |
:1007300047733A253469202047693A2534692000F7 |
:1007400048693A253469202043663A2534692000F7 |
:10075000424C2D4374726C204572726F727320008C |
:100760002025336420202533642020253364202075 |
:100770002533642000202533642020253364202085 |
:100780002533642020253364200020253364202075 |
:100790002533642020253364202025336420004243 |
:1007A0004C2D4374726C20666F756E64200020259A |
:1007B000632020202563202020256320202025631E |
:1007C0002000202563202020256320202025632071 |
:1007D0002020256320002025632020202D2020209C |
:1007E0002D2020202D0031300031310031320046E3 |
:1007F0006C696768742D54696D6520200020202085 |
:100800002020202535756D696E00546F74616C3A37 |
:100810002535756D696E0028726573657429000A47 |
:100820000D506C6561736520636F6E6E6563742037 |
:100830005370656B7472756D20726563656976655A |
:100840007220666F722062696E64696E67204E4F17 |
:10085000572E2E2E006F6B2E0A0D0054696D656F9A |
:1008600075742E0A0D000001020304040506070832 |
:10087000090A0B0B0C0D0E0F101111121314151584 |
:1008800016171818191A1B1B1C1D1D1E1F1F2021AF |
:100890002122232324242525262727282829292AFD |
:1008A0002A2B2B2C2C2D2D2D2E2E2F2F303030316E |
:1008B00031323232333333343434353535363636FB |
:1008C00037373737383838393939393A3A3A3A3B9D |
:1008D0003B3B3B3C3C3C3C3C3D3D3D3D3E3E3E3E4F |
:1008E0003E3F3F3F3F3F3F4040404040404141410D |
:1008F00041414142424242424242434343434343D5 |
:1009000043444444444444444445454545454545A1 |
:100910004545464646464646464646474747474774 |
:10092000474747474747484848484848484848484D |
:100930004849494949494949494949494949494A27 |
:100940004A4A4A4A4A4A4A4A4A4A4A4A4A4B4B4B04 |
:100950004B4B4B4B4B4B4B4B4B4B4B4B4B4B4C4CE5 |
:100960004C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4CC7 |
:100970004C4D4D4D4D4D4D4D4D4D4D4D4D4D4D4DA8 |
:100980004D4D4D4D4D4D4D4E4E4E4E4E4E4E4E4E8E |
:100990004E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E77 |
:1009A0004E4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F58 |
:1009B0004F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F47 |
:1009C00000008F001E01AD013B02CA025803E6037E |
:1009D000740402058F051B06A7063307BE074808E7 |
:1009E000D2085B09E3096B0AF20A780BFD0B810C54 |
:1009F000040D860D070E870E060F840F00107B1066 |
:100A0000F5106E11E5115B12CF124213B3132314CC |
:100A10009214FE146A15D3153B16A1160517671715 |
:100A2000C81727188318DE1837198E19E319361AD4 |
:100A3000871AD61A231B6E1BB61BFD1B411C831C79 |
:100A4000C31C001D3C1D751DAB1DE01D121E421E6A |
:100A50006F1E9A1EC31EE91E0D1F2E1F4D1F691FFC |
:100A6000841F9B1FB01FC31FD31FE11FEC1FF51F67 |
:100A7000FB1FFF1F002011241FBECFEFD0E1DEBF00 |
:100A8000CDBF13E0A0E0B1E0ECEAFAED02C00590C2 |
:100A90000D92A63DB107D9F71AE0A6EDB3E001C06B |
:100AA0001D92AB31B107E1F70C9487060C9400005E |
:100AB000282FFB018150853008F023E0842F9927EF |
:100AC000332721503040829FD001839FB00D929FE9 |
:100AD000B00D1124AC59BF4F019724F00E94386D1E |
:100AE0000192FACF0E94F3660895863038F085E0CF |
:100AF000A2E0B0E0082E0E94456D08958823C1F75A |
:100B00000895582F863048F155E0842F9927252FD6 |
:100B1000332721503040829FD001839FB00D929F98 |
:100B2000B00D1124AC59BF4FFB01019724F0019087 |
:100B30000E94456DFACFA2E6B0E0042E0E94456DFA |
:100B4000A0E5B0E088E0FB01182E0E94516D852FD2 |
:100B50000E9475050E94F36608958823B1F60895F2 |
:100B6000CF93A2E0B0E00E94386D802DC82F815055 |
:100B7000853020F0C3E08C2F0E9475058C2F9927BB |
:100B8000CF9108958091E308E82FFF27EE0FFF1F14 |
:100B9000EF54F74F808191818D5E9F4F14F010923A |
:100BA0000301808191818A5B9F4F24F4809103012E |
:100BB000882319F02091800717C081E080930301FA |
:100BC00020918007280F20938007253038F088EE89 |
:100BD00093E09093FC038093FB0306C066E970E00A |
:100BE000822F0E945B31E6CF822F992790934E0887 |
:100BF00080934D0808951F93CF93DF93182F882378 |
:100C000051F4809101098233A0F0809300011123F7 |
:100C100009F479C038C08EEC90E09F938F931F92B7 |
:100C20000E9471140F900F900F90809101098233F0 |
:100C300060F784EF91E00E94F017EC01112309F0B6 |
:100C400042C08091270390912803823891050CF0CF |
:100C500046C08091010923E0829FC0011124809346 |
:100C600000011123A1F268EC70E0822F0E945B3139 |
:100C700086ED90E09F938F931F920E9471140F90C6 |
:100C80000F900F90C4CF809100016AE00E94C86C61 |
:100C9000892F99279F938F93809100010E94C86CA0 |
:100CA00099279F938F938CEE90E09F938F931F9241 |
:100CB0000E9471148DB79EB707960FB6F8949EBF29 |
:100CC0000FBE8DBF20C0CE010E94F917882309F006 |
:100CD000B8CFCE010E94F9178823A9F3B2CF809133 |
:100CE00001099927880F991F880F991F8093000188 |
:100CF000112309F48CCF68EC70E084E00E945B3132 |
:100D000081EE90E0B7CFDF91CF911F910895CFEFA3 |
:100D1000D0E1DEBFCDBFEE24FF2414B815B8C7EE76 |
:100D2000D3E0E297D7FFFDCF189B6FC1199B78C125 |
:100D30002DE02093020181E887B93E9A8FEF88B9B0 |
:100D40008BE184B981E085B98EE38AB987E48BB9F8 |
:100D5000469A84B7877F84BF8091600088618093C2 |
:100D600060001092600080ED97E09093FC03809308 |
:100D7000FB031092D8041092D7041092B608109278 |
:100D8000B5081092DA041092D9041092DC04109283 |
:100D9000DB04243108F43FC188E894E0A0E0B0E02F |
:100DA0008093860390938703A0938803B09389036D |
:100DB0002A3009F465C1243109F462C1289A0E94DD |
:100DC0005B180E942C180E9446110E94412C0E9420 |
:100DD000541C0E94D02A0E942863789486E091E0F7 |
:100DE0009F938F931F920E9471140F900F900F90FA |
:100DF00087E690E09F938F938CE490E09F938F938E |
:100E00001F921F92809102016AE00E94C86C892F94 |
:100E100099279F938F93809102010E94C86C992714 |
:100E20009F938F938CE291E09F938F931F920E94E8 |
:100E300071148DB79EB70D960FB6F8949EBF0FBE76 |
:100E40008DBF80E691E09F938F931F920E94711453 |
:100E50000F900F900F9080EB91E09F938F931F92D4 |
:100E60000E9471140F900F900F9088ED91E09F9366 |
:100E70008F931F920E9471148091C8000F900F9061 |
:100E80000F90803209F4F4C0809102018C3008F098 |
:100E9000C0C0299A49E063EE78E083E00E945805DB |
:100EA000C8EED3E0DE010E94386D802D813009F458 |
:100EB000B9C08EEF91E09F938F931F920E9471149F |
:100EC0000F900F900F9025ED35E0F9018FE015861A |
:100ED00016861786108A8150349687FFF8CF80E4F3 |
:100EE0008093E2058093E3051092E4058093E50585 |
:100EF0008093E60590EC9093E7051092E8058093C7 |
:100F0000E9058093EA051092EB059093EC05909328 |
:100F1000ED058093EE051092EF058093F005909318 |
:100F2000F10581E08093D50546ED55E08BE0E4E0E6 |
:100F3000F1E0DA0101900D928A95E1F78DE4DE018E |
:100F4000F901182E0E94516D8091850399279F9376 |
:100F50008F935F934F938FE192E09F938F931F92B4 |
:100F60000E9471148DB79EB707960FB6F8949EBF76 |
:100F70000FBE8DBF80E492E09F938F931F920E94DB |
:100F80007114109247041092FF030E944C3F0F907F |
:100F90000F900F908091FF038823E1F31092470494 |
:100FA00080ED97E00E94F017EC01CC24DD2472E57F |
:100FB000A72E72E0B72E1092FF030E944C3F809143 |
:100FC000FF038823E1F3F601EE0FFF1FEE0FFF1F73 |
:100FD000EB52FA4F858518160CF054C086010C555B |
:100FE000174FCE010E94F917882309F04EC0D8018F |
:100FF0008C91882309F049C08093FF030E944C3FE5 |
:101000008091FF038823E1F3ECCF199B2FC024E1EB |
:1010100090CE29983FCF8BE095E0A0E0B0E0C0CE25 |
:101020002BE087CEA1E0B0E00E94386D802D8F3F8D |
:1010300009F43FCF1092850325ED35E08DE4DE0104 |
:10104000F901182E0E94406D90918503F9013D969B |
:101050002FE08081349618160CF49F5F215027FFF3 |
:10106000F8CF9093850346ED55E06ECF2AE061CE30 |
:101070008091CA00863009F007CF0E94A26704CF92 |
:1010800028989DCE86010C55174FF8018081882342 |
:1010900009F03FC086010F5F1F4F68010C3011053A |
:1010A00008F489CFCC24DD2456E5A52E52E0B52ED8 |
:1010B000C1E025C0F601EE0FFF1FEE0FFF1FEB5240 |
:1010C000FA4F858518160CF586010F5F1F4F1F9389 |
:1010D0000F93BF92AF929F930E947114C093F90334 |
:1010E0000F900F900F900F900F9088E898E0C80E27 |
:1010F000D91ED6011C9268010C301105D0F4F601FE |
:10110000EC55F74F90819923A9F286010F5F1F4F8D |
:10111000ECCF86010F5F1F4F1F930F93BF92AF92CB |
:101120001F920E9471140F900F900F900F900F90CC |
:10113000B4CF84E792E09F938F931F920E94711423 |
:101140000E944C3F0F900F900F90A1E0B0E00E94E2 |
:10115000386D802D803509F029C20EE010E0D801ED |
:101160000E94386D802D9927582F442748010894F4 |
:10117000811C911CD4010E94386D802D480F511D97 |
:10118000ECEFAE2EEFEFBE2EA00EB11ED5010E94E9 |
:10119000386D802D9927382F22276DEFC62E6FEFDF |
:1011A000D62EC00ED11ED6010E94386D802D280F7C |
:1011B000311DEFEF2F3F3E0709F4B9C2FFEF4F3F5C |
:1011C0005F0709F4B4C23093D7032093D60350933A |
:1011D000D9034093D8038091D6039091D7039F936E |
:1011E0008F938091D8039091D9039F938F9381EE31 |
:1011F00092E09F938F931F920E9471148DB79EB7B8 |
:1012000007960FB6F8949EBF0FBE8DBFA4E0B0E066 |
:101210000E94386D802D853008F0B8C20E94B0055C |
:1012200045E663EE78E00E9458050E94B0059927D4 |
:101230009F938F938BE193E09F938F931F920E94D4 |
:1012400071148091EB080F900F900F900F900F90FA |
:1012500080FD7BC20E94A23C809102018A3009F489 |
:1012600072C2843109F46FC2289A80ED97E090939E |
:10127000FC038093FB0385E58093820788E593E078 |
:101280009F938F931F920E9471148091EB080F908F |
:101290000F900F9082FF54C284E693E09F938F9348 |
:1012A0001F920E9471140F900F900F900E941B22AA |
:1012B00088E893E19093AD038093AC0381E0809341 |
:1012C00081070E94FB0582E893E09F938F931F9212 |
:1012D0000E94711480ED97E00E94F017EC010F90CE |
:1012E0000F900F908091FF03882309F4A1C0809193 |
:1012F0001903882309F49CC01092FF038091800792 |
:10130000882309F4D0C00E94C2050E944C3F20915E |
:1013100002012A3009F4D0C0243109F4CDC0289A42 |
:101320008091DE04882309F4CDC08091DE048150D1 |
:101330008093DE048091C405882369F081508093F6 |
:10134000C405882341F41092C2051092C105109281 |
:10135000C0051092BF058091AC039091AD03019739 |
:101360009093AD038093AC038091AC039091AD0357 |
:10137000892B29F080914604882309F4D7C08091F5 |
:10138000AC039091AD03892B09F4D6C08091120370 |
:10139000909113038F5F9F4F09F4E7C08091FF0383 |
:1013A000882321F08091D404882311F40E948211B3 |
:1013B0000E946B0ECE010E94F9178823B9F1649642 |
:1013C00080910F03882309F489C0815080930F0313 |
:1013D00080910001282F33278091270390912803C3 |
:1013E000821793070CF074C08091AD0480628093E3 |
:1013F000AD0480911203909113038F5F9F4F09F406 |
:10140000C8C00E941A6684E08093FA038091D404D5 |
:10141000882321F45AEAE52E55E0F52E0894E11CC4 |
:10142000F11CF2E7EF16FBE0FF0651F00E940267A5 |
:101430008091FA03882309F055CF0E945E6652CF4F |
:10144000EE24FF242091D8033091D9032F5F3F4F22 |
:101450003093D9032093D8038091D6039091D7037A |
:1014600001969093D7038093D603832F9927D801B1 |
:10147000082E0E94456D8091D803D401082E0E9449 |
:10148000456D8091D703D501082E0E94456D80914E |
:10149000D603D601082E0E94456D84E190E00E949B |
:1014A000F017EC01C3CF0E9465430E944C3F20918E |
:1014B00002012A3009F030CF28988091DE04882379 |
:1014C00009F033CF80916F00806280936F0032CF3C |
:1014D0008091AD048F7D8093AD0493CF80938C0772 |
:1014E0001092B9041092B8041092B7041092B60486 |
:1014F0001092B5041092B4048091120390911303DA |
:101500008F5F9F4F09F064CF8091DE04882309F03C |
:101510005FCF88E99AE39093FC038093FB0380E01C |
:101520009CE0909313038093120352CF2A3079F1F9 |
:10153000243169F1289A32CF0E94E62A85E090E0B2 |
:101540009093AD038093AC0380915F089091600805 |
:1015500001969093600880935F08809112039091A8 |
:1015600013038F5F9F4F09F019CF8091D404882314 |
:1015700009F414CF80E197E29093FC038093FB037E |
:1015800080E890E0909313038093120307CF28988C |
:1015900005CF80E797E19093FC038093FB0380E005 |
:1015A00093E090931303809312032BCF0E94E22EBB |
:1015B0008AE992E09F938F931F920E94711431E009 |
:1015C000932E0F900F900F90C0E5D0E08E010F5F2B |
:1015D0001F4F22E0C22ED12CCC0EDD1E93E0A92E8F |
:1015E000B12CAC0EBD1E84E0682E712C6C0E7D1EDD |
:1015F000B5E04B2E512C4C0E5D1EA6E02A2E312C50 |
:101600002C0E3D1EE2E09E1609F48BC0F3E09F16FF |
:1016100009F48AC023E0291508F483C080910201EF |
:10162000843168F085E08093FE0810921C098BE1FC |
:101630008093FA088EE48093190980931A09DE01D9 |
:101640000E94386D802D8C3008F068C0D8010E944F |
:10165000386D802D8C3008F061C0D6010E94386D45 |
:10166000802D8C3008F05AC0D5010E94386D802D35 |
:101670008C3008F053C0DE010E94386D802D8093BD |
:10168000E308D8010E94386D802D8093E408D601CC |
:101690000E94386D802D8093E508D5010E94386D39 |
:1016A000802D8093E608D3010E94386D802D8093B1 |
:1016B000E708D2010E94386D802D8093E808D1019F |
:1016C0000E94386D802D8093E908A7E5B0E00E9464 |
:1016D000386D802D8093EA0881E0981651F4A9EACC |
:1016E000B2E0BF93AF931F920E9471140F900F90BE |
:1016F0000F9045E663EE78E0892D0E948105939472 |
:10170000B5E0B91508F07ECF83E00E94750580E54D |
:10171000A1E0B0E0082E0E94456D1FCD0E94C92EA9 |
:10172000E8CF0E94AF2F7ACF0E947A3077CF109205 |
:10173000D9031092D8031092D7031092D6034BCD41 |
:1017400080E793E0ABCD289890CD83E393E09F931F |
:101750008F931F920E94711488EE93E00E94F017FD |
:10176000EC010E945A1C0F900F900F90CE010E9426 |
:10177000F9178823D9F383E593E09F938F931F9202 |
:101780000E9471140F900F900F9064CD84E093E04D |
:101790009F938F931F920E9471140F900F900F9040 |
:1017A0003DCD1F920F920FB60F9211248F939F93EE |
:1017B000EF93FF93809111038823A9F48091ED03A7 |
:1017C0009091EE030196FC01EE5CF94FE081ED3063 |
:1017D00079F08639910561F09093EE038093ED03E3 |
:1017E000E093C6000EC01092EE031092ED0309C004 |
:1017F0001092EE031092ED0381E080931103E093C9 |
:10180000C600FF91EF919F918F910F900FBE0F90A7 |
:101810001F9018951F920F920FB60F9211242F93BD |
:101820003F934F935F938F939F93AF93BF93EF93A8 |
:10183000FF9390E08091C6008093E5035091F303FD |
:10184000563910F09093F4038091E5038D3091F0B8 |
:101850002091F403822F99278130910509F46CC0FF |
:10186000823091050CF48EC0029709F47FC010926B |
:10187000F403A8C02091F403223061F79093F4039D |
:10188000852F99278157984FFC01329740812091ED |
:10189000EF033091F003241B3109DC0111978C9187 |
:1018A000281B3109C9019F709093F0038093EF03C7 |
:1018B0000024880F991F001C880F991F001C892F76 |
:1018C000902D982F935C9093F1032F733070235CCD |
:1018D0002093F2038081891709F46EC090E0809113 |
:1018E000E2038F5F8093E2033091E403332309F036 |
:1018F00069C0992309F466C081E08093E403580F1E |
:101900005093E1035150E52FFF27E157F84F8DE049 |
:10191000808380919107823509F054C088E190E07E |
:101920002CE00FB6F894A895809360000FBE20932A |
:1019300060003093F90346C02F5F2093F403E52F36 |
:10194000FF27E157F84F8091E50380835F5F509355 |
:10195000F3032091E5038091EF039091F003820F50 |
:10196000911D9093F0038093EF032CC0E52FFF2788 |
:10197000E157F84F8091E5038083563938F3109290 |
:10198000F403E7CF892B09F072CF8091E50383320E |
:1019900059F08091E50380938F0781E08093F303F2 |
:1019A0008091E5039927DDCF8091E403882389F7AF |
:1019B00081E08093F403EDCF8C91821709F08ECFF4 |
:1019C00091E092CFFF91EF91BF91AF919F918F9155 |
:1019D0005F914F913F912F910F900FBE0F901F90ED |
:1019E0001895AC01A0E0B0E09D01A817B90748F434 |
:1019F000E2E3F6E08191280F311D1196A417B50797 |
:101A0000C8F33F70FD01EE5CF94FC9010024880F57 |
:101A1000991F001C880F991F001C892F902D835C33 |
:101A200080831196FD01EE5CF94F2F733070822F89 |
:101A3000835C8083AD5CB94F8DE08C931092110371 |
:101A4000809132068093C6000895BF92CF92DF92B4 |
:101A5000EF92FF920F931F93CF93DF93CDB7DEB733 |
:101A60002C859D857E85BB2483E2809332069F5919 |
:101A7000909333062093340603E010E0772309F4B3 |
:101A8000ADC0CF84D88843E1E42EF12CEC0EFD1ECE |
:101A9000A989BA897150109709F4A0C0109709F468 |
:101AA0003CC0F601EB0DF11DB3949081119789F4C0 |
:101AB0007723A1F1F70122E030E0E20EF31ED70117 |
:101AC000C080D180E20EF31E0D90BC91A02DBB24EE |
:101AD0007150109719F1F601EB0DF11DB39440818F |
:101AE000119709F466C01097D1F0F601EB0DF11DC6 |
:101AF000B39460811197A1F4772391F0F7013296A6 |
:101B0000D701CD90DC9032E0E32EF12CEE0EFF1EDB |
:101B1000A081B181BB24715003C090E040E060E03F |
:101B2000F801EE5CF94F892F86958695835C80835A |
:101B30000F5F1F4FF801EE5CF94F892F99278370D3 |
:101B4000907082959295907F9827807F982755274F |
:101B50009A01329522952F7023273F702327822BDD |
:101B6000835C80830F5F1F4FF801EE5CF94F4F706D |
:101B70005070440F551F440F551F862F992700247E |
:101B8000880F991F001C880F991F001C892F902D0A |
:101B9000842B835C80830F5F1F4FF801EE5CF94F4D |
:101BA0006F73635C60830F5F1F4F109709F076CFF0 |
:101BB00015C0772309F4B3CFF701A2E0B0E0EA0E35 |
:101BC000FB1ED701C080D18022E030E0E20EF31E80 |
:101BD0000D90BC91A02DBB24715085CFC8010E94EF |
:101BE000F10CDF91CF911F910F91FF90EF90DF905B |
:101BF000CF90BF900895A3E07A2F4091E103465023 |
:101C000009F45FC0E72FFF27E157F84F80818D531C |
:101C10007F5FE72FFF27E157F84F20812D537F5F2C |
:101C2000E72FFF27E157F84F30813D537F5FE72FC4 |
:101C3000FF27E157F84F60816D537F5F9927880F29 |
:101C4000991F880F991F522F52955F70582B822F22 |
:101C500099278F70907082959295907F9827807FBA |
:101C60009827232F26952695282B832F9927837035 |
:101C7000907000249695879507949695879507947C |
:101C8000982F802D682B41504F3FD9F0EA2FFF2726 |
:101C9000E157F84F5083AF5F41504F3F91F0EA2F2B |
:101CA000FF27E157F84F2083AF5F41504F3F49F086 |
:101CB000EA2FFF27E157F84F6083AF5F442309F015 |
:101CC000A1CF82E997E09093E0038093DF03A350D4 |
:101CD000A093DE030895CF93DF93CDB7DEB72297AD |
:101CE0000FB6F894DEBF0FBECDBF8091E40388230A |
:101CF00009F4AFC20E94FB0D80919007823609F46F |
:101D000071C08091910799278436910509F457C0D5 |
:101D10008536910584F58136910509F44EC18236E8 |
:101D200091050CF4C2C08236910509F49AC183363C |
:101D30009105C1F48091DA039091DB03892B09F0BE |
:101D40004FC2A091DF03B091E0039C91992309F069 |
:101D50003DC29C918AE0989FC00111249093DB03BF |
:101D60008093DA031092E4031092E0031092DF03F1 |
:101D70001092DE036EC28C36910509F410C18D36C7 |
:101D800091050CF0B3C08736910509F42BC1883654 |
:101D9000910541F78FEF80930F03E091DF03F091FE |
:101DA000E003808190913F04892B80933F04882336 |
:101DB00011F01092E60381E08093EA03D3CFE09123 |
:101DC000DF03F091E00390818AE0989FC001112425 |
:101DD00090930D0380930C03892B21F281E0809373 |
:101DE000E903C0CF8091910799278037910509F4C5 |
:101DF000F2C0813791050CF485C08337910509F451 |
:101E00005BC1843791050CF03CC18137910509F025 |
:101E100078CFA091DF03B091E0038C918F3F09F45C |
:101E20000CC28C91882309F003C281E08C93A091AD |
:101E3000DF03B091E00345E663EE78E08C910E9409 |
:101E40005805809111038823E1F3E091DF03F091BD |
:101E5000E0038081898380E58A8385E690E09F9313 |
:101E60008F9383EE98E09F938F9321E030E03F9330 |
:101E70002F93CE0102969F938F933F932F93CE0182 |
:101E8000820F931F9F938F9383E08F9381E08F93B3 |
:101E900081E58F930E94250DADB7BEB71F960FB693 |
:101EA000F894BEBF0FBEADBF2CCF8B34910509F0A7 |
:101EB00059CFE091DF03F091E0038081918190930D |
:101EC000F2048093F1042091EF043091F004821B1E |
:101ED000930B845E9D4F68E671E00E94E86C845B22 |
:101EE00090409093EC048093EB043CCF84379105B1 |
:101EF00009F47CC08637910509F034CF81E08093E6 |
:101F0000E80330CF8D36910529F18E3691050CF01E |
:101F100093C08B34910509F0F4CEA091DF03B0910A |
:101F2000E0038D919C919093F2048093F1042091B1 |
:101F3000EF043091F004821B930B845E9D4F68E6A2 |
:101F400071E00E94E86C845B90409093EC04809375 |
:101F5000EB04D7CE809111038823E1F3A091DF0336 |
:101F6000B091E0039C91913009F43FC1198281E066 |
:101F700090E09F938F93CE0101969F938F9381E082 |
:101F80008F938F938DE48F930E94250D8DB79EB70D |
:101F900007960FB6F8949EBF0FBE8DBFB2CE8FEFDF |
:101FA00080930F03E091DF03F091E0038081809341 |
:101FB000400481E08093EB03D5CEE091DF03F09104 |
:101FC000E003E081E03258F08FE1809310038FEF5F |
:101FD00080930F03C7CE81E08093E70392CEE09316 |
:101FE0001003F5CF81E08093EC03BCCE8091E10338 |
:101FF000853108F4DAC0E091DF03F091E00380E17D |
:10200000AAE6B7E001900D928A95E1F7809111035D |
:102010008823E1F31F9280910E038F9384E58F93C1 |
:102020000E94250D8AEF8093DC038FEF80930F03CE |
:102030000F900F900F9096CE8E36910509F061CEDD |
:10204000809111038823E1F38DE490E09F938F93B7 |
:1020500085ED95E09F938F9381E08F938F938EE42E |
:1020600092CFA091DF03B091E0038BE0E2E8F7E0CC |
:102070000D9001928A95E1F780918B078093670814 |
:10208000A6CF8437910509F03CCE8091E1038531DC |
:1020900008F4BCC0A091DF03B091E00380E1EAE660 |
:1020A000F7E00D9001928A95E1F780EF8093DC03D1 |
:1020B0008FEF80930F0325CE2091DF033091E00353 |
:1020C000F90180818150853018F481818035E9F0F3 |
:1020D0001982809111038823E1F381E090E09F93BE |
:1020E0008F93CE0101969F938F9381E08F938F936F |
:1020F00083E58F930E94250DEDB7FEB737960FB697 |
:10210000F894FEBF0FBEEDBFFCCD63EE78E085E630 |
:102110002E5F3F4FDB01F901982F01900D929A95A8 |
:10212000E1F722503040482FD9018C910E9481055F |
:10213000809119099927AA27BB27BC01CD0124EC5E |
:1021400039E040E050E00E94A96CDC01CB018093B3 |
:10215000A6039093A703A093A803B093A90380912B |
:102160001A099927AA27BB27BC01CD010E94A96C97 |
:10217000DC01CB018093A2039093A303A093A4035B |
:10218000B093A503E091DF03F091E00380810E940A |
:1021900075050E94B005898380E00E94FB056EE60C |
:1021A00070E089810E945B3194CFE091DF03F09170 |
:1021B000E00380819181A281B38180936A0790932B |
:1021C0006B07A0936C07B0936D0720CF8AE0989FB0 |
:1021D000C00111240E94F0179093310680933006BD |
:1021E000A091DF03B091E003B4CD45ED55E08DE45F |
:1021F000FA01282F0D9001922A95E1F7A8EEB3E09D |
:10220000FA01182E0E94516D9983B1CEA091DF037F |
:10221000B091E0038D919D910D90BC91A02D809384 |
:102220006A0790936B07A0936C07B0936D073DCF3F |
:10223000863008F400CE85E0F9CD0E94B005E0912B |
:10224000DF03F091E0038083A091DF03B091E0030E |
:10225000E8CD22960FB6F894DEBF0FBECDBFDF915A |
:10226000CF910895CF93C82F8A3029F08091C00074 |
:1022700085FFFCCF04C08DE00E943211F7CFC093E0 |
:10228000C60080E090E0CF910895089588E18093A2 |
:10229000C1008091C00082608093C0008091C10025 |
:1022A00080688093C1008091C10080648093C100E8 |
:1022B0008AE28093C40080910C0390910D030E94E8 |
:1022C000F01790935F0780935E078CED90E00E947B |
:1022D000F01790938E0780938D07109260078CE41F |
:1022E0008093610786E0809364078AE080936207A9 |
:1022F00081E0809363071092E0031092DF03109255 |
:10230000DE030895EF92FF920F931F9380911103C4 |
:10231000882309F478C28091EA03882309F082C0F7 |
:102320008091EB03882329F080911103882309F021 |
:102330007FC18091E803882329F0809111038823CD |
:1023400009F05BC18091EC03882329F0809111038F |
:10235000882309F036C180918D0790918E070E94E5 |
:10236000F917882329F080911103882309F0C8C048 |
:1023700080910C0390910D03892B09F084C1809109 |
:10238000E903882329F080911103882309F00FC203 |
:102390008091DA039091DB03892B09F07EC12091B3 |
:1023A00010032F3F59F180E190E09F938F93822F8C |
:1023B000992782959295907F9827807F9827845FB0 |
:1023C0009E4F9F938F9381E090E09F938F9380E146 |
:1023D00093E09F938F9382E08F9381E08F9381E4CA |
:1023E0008F930E94250D8FEF809310038DB79EB7BA |
:1023F0000B960FB6F8949EBF0FBE8DBF80916708F5 |
:10240000882329F080911103882309F05EC0809110 |
:10241000E703882309F4F7C180911103882309F4A5 |
:10242000F2C139C080911103882309F479CF0E9449 |
:10243000242284E190E09F938F939091E60384E1BE |
:10244000989FC0011124865D9C4F9F938F9381E0DC |
:1024500090E09F938F9386EE93E09F938F9382E01B |
:102460008F9381E08F9388E48F930E94250D809154 |
:10247000E6038F5F2DB73EB7255F3F4F0FB6F89449 |
:102480003EBF0FBE2DBF843008F4B8C11092E603E2 |
:102490001092EA0345CF86E190E09F938F9381EB02 |
:1024A00098E09F938F9381E08F938F9380E58F9334 |
:1024B0000E94250D1092E7038DB79EB707960FB6C1 |
:1024C000F8949EBF0FBE8DBF9EC181E090E09F93A8 |
:1024D0008F9387E698E09F938F9381E08F938F93FC |
:1024E00082E48F930E94250D109267082DB73EB7A6 |
:1024F000295F3F4F0FB6F8943EBF0FBE2DBF87CF69 |
:102500008091FA089927880F991F880F991F7C01DD |
:102510000027F7FC0095102F80912B0590912C053A |
:10252000A0912D05B0912E05BC01CD01A801970108 |
:102530000E941D6D30937B0720937A0780912305BD |
:1025400090912405A0912505B0912605BC01CD01EF |
:10255000A80197010E941D6D30937D0720937C0791 |
:102560008091C10480937E078091C00480937F078F |
:1025700088E090E09F938F938AE797E09F938F93F3 |
:1025800081E08F9383E08F9387E78F930E94250DDF |
:10259000809180072DB73EB7295F3F4F0FB6F89463 |
:1025A0003EBF0FBE2DBF853018F086E080938007B8 |
:1025B00083E690E00E94F01790938E0780938D073A |
:1025C000D7CE8BE090E09F938F9382E897E09F9324 |
:1025D0008F9381E08F9380910E038F9387E48F9385 |
:1025E0000E94250D1092EC038DB79EB707960FB68B |
:1025F000F8949EBF0FBE8DBFAECE8AE090E09F9351 |
:102600008F9380E697E09F938F9381E08F938F93D2 |
:1026100086E58F930E94250D1092E8032DB73EB7F3 |
:10262000295F3F4F0FB6F8943EBF0FBE2DBF8ACE35 |
:102630000E94242280E590E09F938F938AE293E0AA |
:102640009F938F9321E030E03F932F9389E293E0B3 |
:102650009F938F933F932F9380E494E09F938F9366 |
:1026600083E08F9381E08F938CE48F930E94250DFC |
:102670001092EB038DB79EB70F960FB6F8949EBFDE |
:102680000FBE8DBF56CE80915E0790915F070E946E |
:10269000F917882309F077CE72CE80913006909199 |
:1026A00031060E94F917882309F479CE809111032D |
:1026B000882309F474CE8091FA089927880F991F0E |
:1026C000880F991F7C010027F7FC0095102F80913F |
:1026D0002B0590912C05A0912D05B0912E05BC01E4 |
:1026E000CD01A80197010E941D6D30932306209310 |
:1026F00022068091230590912405A0912505B09193 |
:102700002605BC01CD01A80197010E941D6D3093E3 |
:102710002506209324062091AD093091AE09409101 |
:10272000AF095091B009DA01C90103E0880F991F80 |
:10273000AA1FBB1F0A95D1F7820F931FA41FB51FB5 |
:10274000820F931FA41FB51F20918603309187032A |
:102750004091880350918903BC01CD010E941D6DF9 |
:1027600030932706209326068EE090E09F938F9368 |
:1027700082E296E09F938F9381E08F938F9383E41F |
:102780008F930E94250D8091DA039091DB030E94C4 |
:10279000F01790933106809330062DB73EB7295F2E |
:1027A0003F4F0FB6F8943EBF0FBE2DBFF8CD82E469 |
:1027B00090E09F938F9385E298E09F938F9381E0C1 |
:1027C0008F938F9384E48F930E94250D1092E903D9 |
:1027D0008DB79EB707960FB6F8949EBF0FBE8DBFFC |
:1027E00080910C0390910D03009709F4D1CD0E94C4 |
:1027F000F01790935F0780935E07CACD8093E6033E |
:102800001092EA038DCD1F910F91FF90EF900895E4 |
:10281000982F80916808813031F0892F0E94321101 |
:10282000282F33270CC080914104E82FFF27E65D55 |
:10283000FC4F90838F5F8093410421E030E0C90119 |
:1028400008950F931F93CF93DF938C01EB01672BB8 |
:1028500071F0F80181918F010E940814219739F0DD |
:10286000F80181918F010E940814219791F7DF915F |
:10287000CF911F910F9108950F931F93CF93DF93E3 |
:102880008C01EB01672B81F0F8010F5F1F4F8491E2 |
:102890000E940814219741F0F8010F5F1F4F8491A7 |
:1028A0000E940814219781F7DF91CF911F910F911A |
:1028B0000895CF93C82F181634F480E20E940814AC |
:1028C000C1501C16D4F3CF910895CF93C82F18167A |
:1028D00034F480E30E940814C1501C16D4F3CF9145 |
:1028E00008952F923F924F925F926F927F928F92B4 |
:1028F0009F92AF92BF92CF92DF92EF92FF920F938F |
:102900001F93CF93DF93CDB7DEB7E0970FB6F89460 |
:10291000DEBF0FBECDBF26968FAD26972896EEADB3 |
:10292000FFAD28978824992454018093680848E4CF |
:10293000C42ED12CCC0EDD1E7F01C701F7011491EE |
:10294000112331F0153221F00894E11CF11CF6CF6F |
:10295000B701681B790B09F095C0112309F43DC23A |
:102960000894E11CF11C1FA63FA4232C0FEF39A6ED |
:10297000F7010894E11CF11C14911537C9F1812F5E |
:1029800080628837A9F1103209F440C0133209F48B |
:102990008DC01A3209F479C01D3209F476C01B3299 |
:1029A000C9F11E32C9F1103309F48AC0812F815355 |
:1029B000893008F07EC060E070E0CB01880F991F7D |
:1029C000880F991F880F991F860F971F680F791F0F |
:1029D000610F711D60537040F7010894E11CF11CF8 |
:1029E0001491812F80538A3040F3262E153739F603 |
:1029F00030FE3DC0F60184E090E0C80ED91E808014 |
:102A00009180A280B380103209F0C0CF89A58823BD |
:102A100009F0AECF19A7ACCFF7010894E11CF11C67 |
:102A200014911A3209F451C060E070E014C0CB0177 |
:102A3000880F991F880F991F880F991F860F971F5E |
:102A4000680F791F610F711D60537040F701089482 |
:102A5000E11CF11C1491812F80538A3040F3EFEF79 |
:102A60006F3F7E0714F46FEF7FEF062F86CFF601DE |
:102A700082E090E0C80ED91E808191814C01AA2489 |
:102A8000BB2481CF0E943C1468CF1A3251F4F60166 |
:102A900082E090E0C80ED91E208022200CF068CF82 |
:102AA000219490E1392AEFED3E2262CF98E0392A55 |
:102AB0005FCF1836C9F01C36D1F481E0382A58CFE0 |
:102AC00034FC56CFF0E23F2A53CFF60182E090E08B |
:102AD000C80ED91E608171819FEF6F3F790714F492 |
:102AE0006FEF7FEF062F44CF24E0322A41CF133619 |
:102AF00009F44DC1143409F41FC1143609F41CC182 |
:102B0000193609F419C11F3409F40FC11F3609F42D |
:102B10000CC1103709F4F9C0133709F4B2C01535E8 |
:102B200009F4ECC0153709F4E9C0183509F444C0BC |
:102B3000183709F441C0112309F44FC1CE010196A1 |
:102B40009DA78CA7198381E0482E19A6632C7724B2 |
:102B5000042D5FA4541857FC2DC029A5222331F160 |
:102B60000F5F050DC30180739070892B09F42FC18D |
:102B7000222309F027C166FC1BC1C301807390703A |
:102B8000809709F410C1852D0E946514842D992722 |
:102B900087FD9095BC018CA59DA50E94211464FE23 |
:102BA000CCCE822D801B0E945914C7CE66FED9CF91 |
:102BB0000E5FD7CF5524D1CFE0E1EEA733FE07C09B |
:102BC00081149104A104B10411F0F0E43F2A19A684 |
:102BD0000FA707FD02C02FED3222CE0189969DA7D7 |
:102BE0008CA781149104A104B10419F49FA5992321 |
:102BF00061F1EEA54E2E55246624772418AA84147C |
:102C00009504A604B70410F0F1E0F8ABC501B401D7 |
:102C1000A30192010E94FB6CDC01CB01082F8A30DA |
:102C2000F0F4005DECA5FDA50293FDA7ECA7C5019E |
:102C3000B401A30192010E94FB6C49015A01F8A959 |
:102C4000FF23E1F62EA5283079F0632C7724CE01FE |
:102C50000196482EFCA54F1A28E2420E79CF095A58 |
:102C6000183501F70F7DDECF632C772463FEEFCF9D |
:102C7000003369F380E3ECA5FDA58293FDA7ECA7E3 |
:102C8000E6CFF60182E090E0C80ED91E0190F081F7 |
:102C9000E02DFDA7ECA7EF2B81F4FE013196FDA7F7 |
:102CA000ECA788E289838EE6818385E78B838CE6B7 |
:102CB0008C838D8389E28E831F8207FD15C0802F50 |
:102CC000992787FD9095AC0160E070E08CA59DA5EB |
:102CD0000E94C26B009731F0482EFCA54F1A0415D4 |
:102CE0000CF033CF402E31CFECA5FDA50190002094 |
:102CF000E9F731974E2E2CA5421A27CF153511F43E |
:102D000081E0382A9AE09EA762CFF60182E090E047 |
:102D1000C80ED91E808191814C01AA24BB2490E168 |
:102D20009EA7E0E43E2A18E752CF1F3411F4E1E0F9 |
:102D30003E2AF8E0FEA74BCF143411F491E0392A73 |
:102D400030FE18C0F60184E090E0C80ED91E8080E5 |
:102D50009180A280B380B7FE0AC0B094A0949094F2 |
:102D60008094811C911CA11CB11C8DE289A79AE062 |
:102D70009EA72ECFF60182E090E0C80ED91E80817A |
:102D800091814C01AA2497FCA094BA2CE4CFFE01B7 |
:102D90003196FDA7ECA7F60182E090E0C80ED91E9F |
:102DA00080818983D0CE822D801B0E946514EBCE5A |
:102DB00080E38AA71BA762E070E0CE018A960E949A |
:102DC0002114DBCE61E070E0CE018996F8CF822D30 |
:102DD000801B0E94591429A5CBCEE0960FB6F8941B |
:102DE000DEBF0FBECDBFDF91CF911F910F91FF903E |
:102DF000EF90DF90CF90BF90AF909F908F907F909B |
:102E00006F905F904F903F902F9008951F920F9278 |
:102E10000FB60F9211242F933F935F936F937F937D |
:102E20008F939F93AF93BF93EF93FF938091FA0398 |
:102E3000882329F08091FA0381508093FA038091CE |
:102E4000D005882319F081508093D0058091020429 |
:102E500081508F3F09F493C0809302048091FB035B |
:102E60009091FC03892B01F18091FB039091FC036D |
:102E700001979093FC038093FB038091FB03909157 |
:102E8000FC03209112033091130382239323892B97 |
:102E900089F0809102018A3009F48BC0479A8091B1 |
:102EA000EB0883FF8DC010C08FEF9FEF909313034B |
:102EB00080931203809102018A3009F478C0479808 |
:102EC0008091EB0883FF7CC086B19927FC01E071FB |
:102ED000F07084FF0AC08091FD039091FE0301967B |
:102EE0009093FE038093FD036BC08091FD0390914E |
:102EF000FE03892B49F18091FD039091FE038A56D0 |
:102F0000914010F58091FD039091FE0369E270E01D |
:102F10000E94D46C8091FD039091FE03860F971F51 |
:102F20009093FE038093FD038091FD039091FE0337 |
:102F30000B9708F440C08091FD039091FE030A971F |
:102F40009093F2048093F1048091F1049091F20443 |
:102F50002091EF043091F004821B930B845E9D4F0F |
:102F600068E671E00E94E86C845B90409093EC040A |
:102F70008093EB041092FE031092FD0321C089E0C0 |
:102F800080930204809114038F5F817080931403F7 |
:102F9000882319F481E08093FF03809100049091CD |
:102FA00001040196909301048093000457CF5A982E |
:102FB00087CF5A9A85CFF093F204E093F104C4CFFF |
:102FC000FF91EF91BF91AF919F918F917F916F9101 |
:102FD0005F913F912F910F900FBE0F901F9018950A |
:102FE0002091000430910104280F391FC901019676 |
:102FF00008952091000430910104821B930B892FC6 |
:1030000099278695807490700895CF93DF930E94DE |
:10301000F017EC01CE010E94F9178823D9F3DF9154 |
:10302000CF9108951F93CF93DF930E94F017EC0187 |
:103030001FEC08C080911903882321F09093190395 |
:1030400010937A00CE010E94F917982F882391F3EC |
:10305000DF91CF911F9108959FB7F8945F983E9AA2 |
:10306000469A8091B0008F708093B0008091B0003C |
:1030700083608093B0008091B1008B738093B10026 |
:103080008091B1008B608093B1001092B2008FEFFD |
:103090008093B3008091B00080688093B0008091ED |
:1030A00070008A7F809370008091700082608093AE |
:1030B00070009FBF08958AE090E00E94F0179093FF |
:1030C0000A048093090482E085BD83EA84BD17BCAD |
:1030D00088E788BD86E086BD80916E008160809320 |
:1030E0006E0008951F920F920FB60F9211242F9326 |
:1030F0003F934F935F936F937F938F939F93AF9380 |
:10310000BF93EF93FF93809102018431C0F48091CB |
:103110000304882309F446C0209104043091050477 |
:1031200041E02F37340708F49CC08FEF8093B30041 |
:103130002F5F30403093050420930404A4C3809192 |
:103140000304882349F78091B00086FFADC08091C9 |
:10315000B0008F7B8093B000E0910804EE2309F06B |
:10316000EFC080911209282F33278DED96E0289F1C |
:10317000A001299F500D389F500D1124CA012091A4 |
:10318000060430910704821B930B909305048093EF |
:1031900004041092070410920604469A81E080937A |
:1031A0000304BACF8091B00086FFA8C08091B00020 |
:1031B0008F7B8093B00089EA93E09093050480931D |
:1031C000040480911503909116039C01220F331F74 |
:1031D000280F391F809192039927880F991F880F14 |
:1031E000991F280F391F37FD25C2C901959587956D |
:1031F0009595879590931603809315039093F80304 |
:103200008093F70380913A0980FFDDC080910B091C |
:10321000682F77278827992720912B0530912C0537 |
:1032200040912D0550912E0557FDE9C1A7E0559518 |
:10323000479537952795AA95D1F70E94A96C9B01D0 |
:10324000AC0197FDFAC1F6E055954795379527955E |
:10325000FA95D1F78091F7039091F803820F931FAD |
:10326000DCC02F3F310569F060F0A9014F5F50408D |
:103270004F37510588F480E88093B30020583040E0 |
:1032800059CF809104048093B300109205041092EA |
:10329000040410920304F7C28FEF8093B30050939D |
:1032A000050440930404EFC28091B00080648093D1 |
:1032B000B0008CEB90E0909305048093040480911F |
:1032C00006049091070484549F4F909307048093C1 |
:1032D00006048091F903882329F08091DE04853B60 |
:1032E00008F0F2C0469A909108049F5F80911209FD |
:1032F000891708F0E6C01092080450CF8091B00002 |
:1033000080648093B00080911209282F33278DEDBF |
:1033100096E0289FA001299F500D389F500D112441 |
:10332000CA012091060430910704821B930B9093ED |
:103330000504809304049C0181E080930304F0CE93 |
:1033400089EA93E090930504809304048E2F9927D3 |
:103350008130910509F4BAC0029709F478C1FF27BA |
:10336000EE0FFF1FEF54F74F80819181880F991F57 |
:103370002091040430910504820F931F909305045B |
:1033800080930404209104043091050455E02D3D00 |
:10339000350708F440C18CED95E0909305048093C7 |
:1033A00004049C012C5B30403093050420930404FA |
:1033B0008091060490910704820F931F9093070455 |
:1033C00080930604EBCE80910B09682F772788271E |
:1033D000992720912B0530912C0540912D05509176 |
:1033E0002E0557FD07C1E7E0559547953795279579 |
:1033F000EA95D1F70E94A96C9B01AC0197FD22C10F |
:1034000076E055954795379527957A95D1F7809130 |
:10341000F7039091F803821B930B9093F80380932A |
:10342000F70380910C09282F3327220F331F220F17 |
:10343000331F8091F7039091F803821793077CF074 |
:1034400080910D09282F3327220F331F220F331F9E |
:103450008091F7039091F8032817390724F43093EB |
:10346000F8032093F7032091F7033091F80380913C |
:10347000040490910504280F391F20503240809198 |
:10348000F7039091F80397FDD3C09595879595958F |
:1034900087959093F8038093F70345E02D3D34071B |
:1034A00008F4B2C08CED95E0909305048093040479 |
:1034B00020910404309105043093070420930604FE |
:1034C0003BCF909308046ACE46980DCF80911503A8 |
:1034D000909116039C01220F331F280F391F8091F2 |
:1034E00092039927880F991F880F991F280F391F5A |
:1034F00037FD99C1C90195958795959587959093C5 |
:103500001603809315039093F8038093F70380913B |
:103510003A0980FF30C180910B09682F77278827EF |
:10352000992720912B0530912C0540912D05509124 |
:103530002E0557FD85C1E7E05595479537952795A9 |
:10354000EA95D1F70E94A96C9B01AC0197FD73C16C |
:10355000B6E05595479537952795BA95D1F780915F |
:10356000F7039091F803820F931F9093F8038093D1 |
:10357000F70380910C09282F3327220F331F220FC6 |
:10358000331F8091F7039091F803821793077CF023 |
:1035900080910D09282F3327220F331F220F331F4D |
:1035A0008091F7039091F8032817390724F430939A |
:1035B000F8032093F7038091F7039091F80320918B |
:1035C000040430910504820F931F80509240909321 |
:1035D0000504809304048091F7039091F80397FD0C |
:1035E00020C195958795959587959093F80380933D |
:1035F000F703C8CE21583F4F4F4F5F4FF4CE2158AD |
:103600003F4F4F4F5F4F12CE51E02737350758F4E9 |
:1036100087E791E049CF81E02737380708F0C2CE2D |
:1036200087E791E0BACE309305042093040440CF9D |
:1036300003962BCF2D5F3F4FD8CD215C3F4F4F4F8F |
:103640005F4F01CE215C3F4F4F4F5F4FD9CE8091EE |
:103650001703909118039C01220F331F280F391F65 |
:10366000809191039927880F991F880F991F280F20 |
:10367000391F37FDDBC0C9019595879595958795CD |
:1036800090931803809317039093F6038093F503A8 |
:1036900080913A0981FF9AC080910F09682F77279E |
:1036A00088279927209123053091240540912505ED |
:1036B0005091260557FDE2C0A7E0559547953795EF |
:1036C0002795AA95D1F70E94A96C9B01AC0197FDA3 |
:1036D000D0C0F6E05595479537952795FA95D1F7DF |
:1036E0008091F5039091F603820F931F9093F60358 |
:1036F0008093F50380911009282F3327220F331F61 |
:10370000220F331F8091F5039091F60382179307E0 |
:103710007CF080911109282F3327220F331F220FAD |
:10372000331F8091F5039091F6032817390724F48D |
:103730003093F6032093F5038091F5039091F603FF |
:103740002091040430910504820F931F8050924011 |
:1037500090930504809304048091F5039091F603FF |
:1037600097FD67C095958795959587959093F603F6 |
:103770008093F50307CE80910B09682F7727882760 |
:10378000992720912B0530912C0540912D055091C2 |
:103790002E0557FD5FC0A7E05595479537952795AE |
:1037A000AA95D1F70E94A96C9B01AC0197FD4DC071 |
:1037B000F6E05595479537952795FA95D1F780917D |
:1037C000F7039091F803821B930BCFCE80910F09E2 |
:1037D000682F772788279927209123053091240582 |
:1037E000409125055091260557FD3EC0E7E05595CF |
:1037F000479537952795EA95D1F70E94A96C9B01CB |
:10380000AC0197FD2CC066E05595479537952795F7 |
:103810006A95D1F78091F5039091F603821B930B83 |
:1038200065CF0396DECE2D5F3F4F64CE2D5F3F4FB9 |
:1038300022CF039697CF215C3F4F4F4F5F4F88CEEB |
:1038400021583F4F4F4F5F4F76CE215C3F4F4F4F38 |
:103850005F4FAECF21583F4F4F4F5F4F9CCF215C02 |
:103860003F4F4F4F5F4FCFCF21583F4F4F4F5F4F8D |
:10387000BDCF215C3F4F4F4F5F4F2BCF21583F4F64 |
:103880004F4F5F4F19CFFF91EF91BF91AF919F9134 |
:103890008F917F916F915F914F913F912F910F90F9 |
:1038A0000FBE0F901F90189510927C008FEC8093A4 |
:1038B0007A000895EF92FF920F931F93CF93DF93B7 |
:1038C00003E010E0D8010E94386D802DC82FDD275D |
:1038D000C531D10508F02A97C7BD1092120484E6BD |
:1038E00090E00E94121880911D0390911E03805257 |
:1038F000934010F4C0E0D0E0CA3FD105E0F48AEA7A |
:10390000E82E83E0F82EC7BD82E390E00E941218F3 |
:10391000FF92EF921F920E94711480911D0390916B |
:103920001E030F900F900F908052934020F021962D |
:10393000CA3FD10540F3D8010C2E0E94456DC093BB |
:1039400075088CE291E00E941218DF91CF911F91CF |
:103950000F91FF90EF900895EF92FF920F931F93B6 |
:10396000CF93DF9300E000930D0400930C040093C9 |
:103970000B0480ED97E00E94F017EC011CE821E0B9 |
:10398000F22E95EFE92E033009F4ABC000E08091F0 |
:103990002204909123048C5F93400CF091C080919D |
:1039A0001C03815080931C0380912004909121047A |
:1039B0008C5F93400CF079C080911B038150809301 |
:1039C0001B0380911E0490911F048C5F93400CF0A8 |
:1039D0004AC080911A03815080931A0388E0809333 |
:1039E00049040E94D62A80911C038A3008F055C0F1 |
:1039F000F0920D048AE080931C0380911B038A30AF |
:103A000008F043C0F0920C048AE080931B0380917D |
:103A10001A038A3098F5F0920B048AE080931A0317 |
:103A200080914904882379F0CE010E94F9178823F8 |
:103A3000B9F38CEA93E09F938F931F920E947114C5 |
:103A40000F900F900F90109219038FEC80937A00D3 |
:103A5000809119038823E1F31A3008F447C011500C |
:103A600009F091CF48C080911E0490911F048750A7 |
:103A700094408CF180911A038F5FAECF863F80F225 |
:103A8000F0920B04E0921A03CBCF863F08F4BFCF2D |
:103A9000F0920C04E0921B03BACF863F08F4ADCF3E |
:103AA000F0920D04E0921C03A8CF80912004909125 |
:103AB0002104875094408CF080911B038F5F7FCF4F |
:103AC00080912204909123048750944044F0809187 |
:103AD0001C038F5F67CF0F5F81CF0F5F72CF01E055 |
:103AE00063CF1B3008F452CF19E050CF8AE090E04A |
:103AF0000E941218B4CF86E490E00E941218DF9161 |
:103B0000CF911F910F91FF90EF9008951F920F9208 |
:103B10000FB60F921124AF92BF92CF92DF92EF9225 |
:103B2000FF920F931F932F933F934F935F936F9346 |
:103B30007F938F939F93AF93BF93EF93FF932091C6 |
:103B40002B04822F9927AA27BB272F5FFC014297BE |
:103B500040F4E25CFF4FEE0FFF1F0590F491E02D63 |
:103B6000099410922B0482E080932A0480912A0405 |
:103B700080937C0080912B04882309F443C48FEC4C |
:103B800080937A003FC420932B0480917800909119 |
:103B900079002091300430913104820F931F90936B |
:103BA00031048093300481E0DFCF20932B04809197 |
:103BB00078009091790020912E0430912F04820F8B |
:103BC000931F90932F0480932E0484E0CDCF2093F5 |
:103BD0002B048091780090917900209139053091E3 |
:103BE0003A05821B930B909374088093730880911D |
:103BF000730890917408909339048093380482E09C |
:103C0000B3CF20932B0480913705909138052091F4 |
:103C1000780030917900821B930B90936A0880930F |
:103C200069088091690890916A089093370480939D |
:103C3000360487E099CF20932B04809178009091EF |
:103C4000790090932D0480932C0486E08DCF2093EF |
:103C50002B04209178003091790030932F04209329 |
:103C60002E0410922A0482CF20932B0420917800F6 |
:103C700030917900309331042093300481E074CF87 |
:103C800010922B0481E08093190380910E0490918F |
:103C90000F04019690930F0480930E048091780096 |
:103CA0009091790090931E0380931D0380911D03D2 |
:103CB00090911E035C01CC24DD2480913A04909104 |
:103CC0003B04A0913C04B0913D04A80EB91ECA1E4D |
:103CD000DB1E80913E048F5F823108F4E8C2809140 |
:103CE0001F0390912003A0912103B09122037C0136 |
:103CF0008D0123E0EE0CFF1C001F111F2A95D1F748 |
:103D0000E81AF90A0A0B1B0BEA0CFB1C0C1D1D1D03 |
:103D100080911204992787FD9095A92FB92FBC0196 |
:103D2000CD0126EC34E240E050E00E94A96CDC01B9 |
:103D3000CB01E81AF90A0A0B1B0BD801C70104963C |
:103D4000A11DB11DB7FD23C313E0B595A7959795A8 |
:103D500087951A95D1F780931F0390932003A09322 |
:103D60002103B093220380916D0890916E087C012D |
:103D70000027F7FC0095102F80911F0390912003DE |
:103D8000A0912103B0912203E81AF90A0A0B1B0B38 |
:103D9000E092D004F092D1040093D2041093D304A3 |
:103DA000209113043091140440911504509116048D |
:103DB00057FDFDC2A4E05595479537952795AA95DF |
:103DC000D1F78091130490911404A0911504B0913F |
:103DD0001604821B930BA40BB50B809313049093D2 |
:103DE0001404A0931504B0931604809113049091C9 |
:103DF0001404A0911504B09116048E0D9F1DA01FF0 |
:103E0000B11F8093130490931404A0931504B093EE |
:103E100016048091100490911104BC016295729572 |
:103E2000707F7627607F7627681B790B20911304BB |
:103E300030911404409115045091160457FDB2C2FC |
:103E4000E4E05595479537952795EA95D1F7809108 |
:103E5000D0049091D104821B930B880F991F880F77 |
:103E6000991F880F991F860F971F97FDA9C29595D7 |
:103E70008795959587959595879595958795909331 |
:103E8000110480931004D601C501D7FC95C2B595E5 |
:103E9000A7959795879580933A0490933B04A093B8 |
:103EA0003C04B0933D0489E080933E0482E05CCE04 |
:103EB00020932B04209178003091790080912E047A |
:103EC00090912F04280F391F809102018A3009F444 |
:103ED00048C2220F331F220F331F30932F04209329 |
:103EE0002E04C90137FD73C29595879595958795E1 |
:103EF00095958795909321048093200480913404B4 |
:103F000090913504820F931F97FD66C29595879512 |
:103F100090933504809334042091410530914205FB |
:103F2000821B930B909324038093230320912604F8 |
:103F3000309127048091230390912403280F391F87 |
:103F400037FD47C2359527953093270420932604E3 |
:103F500083E00ACE20932B042091780030917900E1 |
:103F60008091300490913104280F391F8091020113 |
:103F70008A3009F407C2220F331F220F331F3093F8 |
:103F8000310420933004C90137FDFFC19595879511 |
:103F90009595879595958795909323048093220412 |
:103FA0008091320490913304820F931F97FD0DC2CC |
:103FB000959587959093330480933204209143051F |
:103FC00030914405821B930B909326038093250325 |
:103FD0002091280430912904809125039091260393 |
:103FE000280F391F37FDEEC13595279530932904E9 |
:103FF0002093280481E0B8CD20932B048091780091 |
:10400000909179002091390530913A05821B930BEC |
:10401000909374088093730880917308909174084A |
:104020002091380430913904820F931F90931B0420 |
:1040300080931A0482E098CD20932B048091370559 |
:10404000909138052091780030917900821B930B74 |
:1040500090936A08809369088091690890916A0832 |
:104060002091360430913704820F931F90931D04E2 |
:1040700080931C0487E078CD20932B04809102016B |
:104080008A3009F471C1843109F4A8C180917800A3 |
:104090009091790020912C0430912D04820F931F70 |
:1040A00090931F0480931E0486E05ECD20932B0422 |
:1040B000809178009091790020912E0430912F0406 |
:1040C000820F931F90932F0480932E0410922A0442 |
:1040D0004DCD20932B04E2CD20932B0480917800CA |
:1040E00090917900AA2797FDA095BA2FBC01CD0128 |
:1040F0000E942F6C7B018C018091310590913205DB |
:10410000A0913305B09134059C01AD01C801B70100 |
:104110000E94CF6BDC01CB01BC01CD010E94126C6F |
:10412000DC01CB019093190480931804809118044A |
:104130009091190402970CF4C6C0809131059091BA |
:104140003205A0913305B091340520E030E84BE30F |
:1041500054E4BC01CD010E94396C8823DCF58091C8 |
:10416000310590913205A0913305B09134052AE0D4 |
:1041700037ED43EA5CE3BC01CD010E94D06BDC016A |
:10418000CB018093310590933205A0933305B09312 |
:1041900034058091AE049091AF04845F9140D0F4D7 |
:1041A0008091310590913205A0913305B09134058D |
:1041B0002DEC3CEC4CEC5DE3BC01CD010E94D06BDE |
:1041C000DC01CB018093310590933205A093330538 |
:1041D000B093340581E0809317048091780090912A |
:1041E000790090936C0880936B08809118049091EB |
:1041F0001904AA2797FDA095BA2F2091F3043091B6 |
:10420000F4044091F5045091F604820F931FA41F0B |
:10421000B51F8093F3049093F404A093F504B09336 |
:10422000F6042091F3043091F4044091F504509188 |
:10423000F60457FDB2C00AE0559547953795279586 |
:104240000A95D1F78091F3049091F404A091F504BC |
:10425000B091F604821B930BA40BB50B8093F3046F |
:104260009093F404A093F504B093F60483E07CCC1F |
:1042700020932B0480912703909128039C01220F07 |
:10428000331F280F391F809178009091790063E0E7 |
:1042900070E00E94D46C260F371F3695279536950F |
:1042A0002795309328032093270385E05DCC8093E6 |
:1042B0003E04A0923A04B0923B04C0923C04D092D7 |
:1042C0003D0482E051CC80911804909119048F5FD5 |
:1042D0009F4F0CF07FCF8091310590913205A091D6 |
:1042E0003305B091340520E030E849E054E4BC01E6 |
:1042F000CD010E943C6C18160CF06CCF80913105FA |
:1043000090913205A0913305B09134052AE037ED44 |
:1043100043EA5CE3BC01CD010E94CF6BDC01CB0121 |
:104320008093310590933205A0933305B093340503 |
:104330008091AE049091AF04845F914008F04ACF21 |
:104340008091310590913205A0913305B0913405EB |
:104350002DEC3CEC4CEC5DE3BC01CD010E94CF6B3D |
:104360002FCF220F331FB9CD809178009091790023 |
:1043700020912C0430912D04820F931F0196969565 |
:1043800087958ECE220F331FFACD0796FFCDD80129 |
:10439000C7010B96A11DB11DD7CC21503C4F4F4FEB |
:1043A0005F4F49CF215F3F4F4F4F5F4F49CD215F57 |
:1043B0003F4F4F4F5F4FFECC0196A11DB11D67CD02 |
:1043C0000F9655CD2F5F3F4F0FCE0196F1CD07963B |
:1043D0008BCD2F5F3F4FB6CD019698CD8091780061 |
:1043E0009091790020912C0430912D04820F931F1D |
:1043F0002FEF37E0281B390B30931F0420931E0446 |
:1044000086E0B2CBFF91EF91BF91AF919F918F91D9 |
:104410007F916F915F914F913F912F911F910F91DC |
:10442000FF90EF90DF90CF90BF90AF900F900FBEB6 |
:104430000F901F90189590E2EAE2F3E08FE49193D9 |
:10444000815087FFFCCF08951F93CF93DF93809116 |
:10445000400420912903281710F4209340049091E0 |
:104460003F0490FF08C080914004882309F41EC1D6 |
:1044700081508093400491FF08C0809140048217CE |
:1044800009F4E4C18F5F80934004892F992780FF4E |
:1044900002C081FD08C10E941B22909140049A3005 |
:1044A00008F0A2C081E180934104892F99279F934E |
:1044B0008F9383EE93E09F938F9381E08F930E947D |
:1044C00071140F900F900F900F900F9080914004F7 |
:1044D000C82FDD27C730D10509F4BBC1C830D105CD |
:1044E0000CF08CC0C330D10509F455C2C430D105DD |
:1044F0000CF0DFC0C130D10509F4BBC2C230D10518 |
:104500000CF438C31092410483EA94E09F938F9394 |
:10451000C1E0CF930E94711484E1809341040F9015 |
:104520000F900F9080912B0590912C05A0912D0557 |
:10453000B0912E05B7FD58C63AE0B595A795979569 |
:1045400087953A95D1F7BF93AF939F938F938DEA59 |
:1045500094E09F938F93CF930E94711488E280938D |
:1045600041048DB79EB707960FB6F8949EBF0FBE55 |
:104570008DBF8091230590912405A0912505B091D0 |
:104580002605B7FD2CC62AE0B595A7959795879582 |
:104590002A95D1F7BF93AF939F938F938CEB94E0C1 |
:1045A0009F938F93CF930E9471148CE38093410467 |
:1045B0002DB73EB7295F3F4F0FB6F8943EBF0FBEF1 |
:1045C0002DBF8091F1049091F2049F938F938BEC17 |
:1045D00094E09F938F93CF930E9471140F900F904C |
:1045E0000F900F900F90D6C780E180934104892FE0 |
:1045F00099279F938F9388EE93E05DCFCB30D105C1 |
:1046000009F45DC1CC30D1050CF00FC1C930D10522 |
:1046100009F40BC52A970CF01CC31092410482E7E1 |
:1046200096E09F938F9311E01F930E94711484E191 |
:10463000809341040F900F900F908091EB04909124 |
:10464000EC049F938F9381E896E09F938F931F9341 |
:104650000E94711488E2809341040F900F900F9094 |
:104660000F900F908091F1049091F2049F938F939B |
:1046700080E996E09F938F931F930E9471148CE3BF |
:10468000809341040F900F900F900F900F908091A6 |
:10469000EF049091F0049F938F938FE996E09F939E |
:1046A0008F931F9399CF10924004F5CE209340042E |
:1046B000E2CEC530D10509F403C426970CF08CC3B3 |
:1046C000109241048091E408E82FFF27EE0FFF1FAE |
:1046D000EF54F74F808191819F938F938091E308EE |
:1046E000E82FFF27EE0FFF1FEF54F74F80819181D6 |
:1046F0009F938F938AE195E09F938F9311E01F938F |
:104700000E94711484E1809341048DB79EB707968F |
:104710000FB6F8949EBF0FBE8DBF8091E608E82FBC |
:10472000FF27EE0FFF1FEF54F74F808191819F937A |
:104730008F938091E508E82FFF27EE0FFF1FEF54BE |
:10474000F74F8081918188589F4F9F938F938AE282 |
:1047500095E09F938F931F930E94711488E280933A |
:1047600041042DB73EB7295F3F4F0FB6F8943EBFC7 |
:104770000FBE2DBF8091E808E82FFF27EE0FFF1F27 |
:10478000EF54F74F8081918182599F4F9F938F9370 |
:104790008091E708E82FFF27EE0FFF1FEF54F74F38 |
:1047A0008081918182599F4F9F938F938AE395E0F7 |
:1047B0009F938F931F930E9471148CE38093410405 |
:1047C0006DB77EB7695F7F4F0FB6F8947EBF0FBE9F |
:1047D0006DBF8091EA08E82FFF27EE0FFF1FEF540F |
:1047E000F74F8081918182599F4F9F938F93809142 |
:1047F000E908E82FFF27EE0FFF1FEF54F74F8081E6 |
:10480000918182599F4F9F938F938AE495E09F9364 |
:104810008F931F930E9471148DB79EB707960FB6A2 |
:10482000F8949EBF0FBE8DBFB5C6CD30D10509F43B |
:1048300047C4CD30D1050CF452C22E9709F4D9C427 |
:1048400081508093290310924004A4C61092400422 |
:104850001CCE84E18093410480912703909128032A |
:104860009F938F9384E496E09F938F9311E01F931F |
:104870000E94711488E2809341040F900F900F9072 |
:104880000F900F908091DE0499279F938F9383E57B |
:1048900096E09F938F931F930E9471148CE38093F3 |
:1048A00041040F900F900F900F900F908091B008DF |
:1048B000992701979F938F9382E696E0F0CE10920E |
:1048C000410480E197E09F938F9311E01F930E9432 |
:1048D000711484E1809341040F900F900F908091A8 |
:1048E0008607992787FD90959F938F9380918507E1 |
:1048F000992787FD90959F938F9380E297E09F93F0 |
:104900008F931F930E94711488E2809341048DB7A6 |
:104910009EB707960FB6F8949EBF0FBE8DBF8091CD |
:104920008707992787FD90959F938F93809188079C |
:1049300099279F938F9380E397E09F938F931F9383 |
:104940000E9471148CE3809341042DB73EB7295F18 |
:104950003F4F0FB6F8943EBF0FBE2DBF80918C071E |
:1049600099279F938F9380918907992787FD909529 |
:104970009F938F9380E497E09F938F931F930E9460 |
:1049800071146DB77EB7695F7F4F0FB6F8947EBF25 |
:104990000FBE6DBFFFC5109241048091B508909184 |
:1049A000B6089F938F938091B3089091B4089F931A |
:1049B0008F938AED94E09F938F9311E01F930E9451 |
:1049C000711484E1809341046DB77EB7695F7F4FB6 |
:1049D0000FB6F8947EBF0FBE6DBF8091B90890915D |
:1049E000BA089F938F938091B7089091B8089F93CE |
:1049F0008F938AEE94E09F938F931F930E9471147C |
:104A000088E2809341048DB79EB707960FB6F8945D |
:104A10009EBF0FBE8DBF8091BD089091BE089F9331 |
:104A20008F938091BB089091BC089F938F938AEFDE |
:104A300094E09F938F931F930E9471148CE3809353 |
:104A400041042DB73EB7295F3F4F0FB6F8943EBFE4 |
:104A50000FBE2DBF8091C1089091C2089F938F9384 |
:104A60008091BF089091C0089F938F938AE095E052 |
:104A700083CF8091EB0880FD1CC084E180934104CA |
:104A80008EE894E09F938F9311E01F930E9471141E |
:104A900088E2809341040F900F900F9085E994E095 |
:104AA0009F938F931F930E9471140F900F900F90FC |
:104AB00071C5109241048091D0049091D104A091CD |
:104AC000D204B091D304BC01CD0125E030E040E038 |
:104AD00050E00E941D6D3F932F9382E594E09F93D9 |
:104AE0008F9311E01F930E94711484E1809341041D |
:104AF0000F900F900F900F900F908091CC04909199 |
:104B0000CD04A091CE04B091CF04BC01CD0125E02D |
:104B100030E040E050E00E941D6D3F932F9381E60E |
:104B200094E09F938F931F930E94711488E2809367 |
:104B300041040F900F900F900F900F9080911D03E4 |
:104B400090911E039F938F9380E794E09F938F93A0 |
:104B50001F930E9471148CE3809341040F900F9077 |
:104B60000F900F900F9087B599279F938F938FE7A2 |
:104B700094E095CD209709F063CE109241048DEE1C |
:104B800093E09F938F9311E01F930E94711484E12F |
:104B9000809341040F900F900F9087E690E09F93D1 |
:104BA0008F938CE490E09F938F93DF93CF938091CA |
:104BB00002016AE00E94C86C892F99279F938F9306 |
:104BC000809102010E94C86C99279F938F938DEF6B |
:104BD00093E09F938F931F930E94711488E28093B8 |
:104BE00041042DB73EB7235F3F4F0FB6F8943EBF49 |
:104BF0000FBE2DBF86ED95E09F938F930E94B00569 |
:104C000099279F938F9382E194E09F938F931F93B3 |
:104C10000E9471148091AC039091AD036DB77EB783 |
:104C2000695F7F4F0FB6F8947EBF0FBE6DBF0697CA |
:104C300008F488C490914604992309F47DC48CE358 |
:104C400080934104892F99279F938F938DE294E05D |
:104C500026CD109241048EED96E09F938F9311E044 |
:104C60001F930E94711484E1809341040F900F9070 |
:104C70000F908091920399279F938F9386EE96E0F1 |
:104C80009F938F931F930E94711488E28093410435 |
:104C90000F900F900F900F900F908091F7039091CD |
:104CA000F8039F938F9384EF96E09F938F931F93C6 |
:104CB0000E9471148CE3809341040F900F900F9029 |
:104CC0000F900F9080910D0999279F938F9380915A |
:104CD0000C0999279F938F9382E097E04DCE109215 |
:104CE000410480E597E09F938F9311E01F930E940A |
:104CF000711484E1809341040F900F900F90809184 |
:104D00008B0899279F938F9380918A0899279F9367 |
:104D10008F938091890899279F938F93809188081A |
:104D200099279F938F9380E697E09F938F931F938C |
:104D30000E94711488E2809341048DB79EB70B9650 |
:104D40000FB6F8949EBF0FBE8DBF80918F08992734 |
:104D50009F938F9380918E0899279F938F93809133 |
:104D60008D0899279F938F9380918C0899279F9303 |
:104D70008F9385E797E09F938F931F930E94711401 |
:104D80008CE3809341042DB73EB7255F3F4F0FB6AC |
:104D9000F8943EBF0FBE2DBF8091930899279F9333 |
:104DA0008F938091920899279F938F938091910878 |
:104DB00099279F938F938091900899279F938F9322 |
:104DC0008AE897E09F938F931F930E9471146DB7A9 |
:104DD0007EB7655F7F4FD9CD109241048AE096E09F |
:104DE0009F938F9311E01F930E94711484E180932D |
:104DF00041040F900F900F908091390590913A05E2 |
:104E00009F938F9380911A0490911B049F938F938B |
:104E100087E196E09F938F931F930E94711488E21D |
:104E2000809341046DB77EB7695F7F4F0FB6F894EA |
:104E30007EBF0FBE6DBF80913705909138059F935F |
:104E40008F9380911C0490911D049F938F9386E211 |
:104E500096E09F938F931F930E9471148CE380932D |
:104E600041048DB79EB707960FB6F8949EBF0FBE4C |
:104E70008DBF8091310590913205A0913305B0919D |
:104E80003405BC01CD010E94126CDC01CB019F9363 |
:104E90008F9380916409909165099F938F9385E327 |
:104EA00096E09F938F931F930E9471142DB73EB786 |
:104EB000295F3F4F0FB6F8943EBF0FBE2DBF6AC3A8 |
:104EC000109241048AE595E09F938F93C1E0CF93C0 |
:104ED0000E947114809102010F900F900F908A3000 |
:104EE00009F4A5C28B3009F4DEC1843109F4DBC1B9 |
:104EF0008D3009F04FC384E18093410480911C03FD |
:104F000099279F938F934091430550914405CA017F |
:104F100057FD39C39595879595958795959587956F |
:104F2000959587959F938F939A0157FD29C3359542 |
:104F30002795359527953595279580912204909151 |
:104F40002304821B930B9F938F938EEC95E09F938A |
:104F50008F93CF930E94711488E2809341046DB7C0 |
:104F60007EB7675F7F4F0FB6F8947EBF0FBE6DBFF1 |
:104F700080911B0399279F938F93409141055091F6 |
:104F80004205CA0157FD04C3959587959595879568 |
:104F900095958795959587959F938F939A0157FD42 |
:104FA000F4C23595279535952795359527958091A8 |
:104FB000200490912104821B930B9F938F9382EE88 |
:104FC00095E09F938F93CF930E9471148CE380930D |
:104FD00041048DB79EB709960FB6F8949EBF0FBED9 |
:104FE0008DBF80911A0399279F938F9320913F053E |
:104FF00030914005C90137FDC1C2959587959F93B2 |
:105000008F9380911E0490911F04281B390B3F93AE |
:105010002F9386EF95E09F938F93CF930E94711407 |
:105020002DB73EB7275F3F4F45CF10924104809187 |
:10503000E5049091E6049F938F938EEA96E09F9308 |
:105040008F9311E01F930E94711484E180934104B7 |
:105050000F900F900F900F900F908091E30490911C |
:10506000E4049F938F938AEB96E09F938F931F9313 |
:105070000E94711488E2809341040F900F900F906A |
:105080000F900F908091E1049091E2049F938F9391 |
:1050900086EC96E09F938F931F930E9471148CE38C |
:1050A000809341040F900F900F900F900F9080917C |
:1050B000DF049091E0049F938F9382ED96E0EFCA16 |
:1050C000109241048FE997E09F938F93C1E0CF93B3 |
:1050D0000E94711484E1809341040F900F900F900F |
:1050E0008091A70899278D969F938F938091A6080A |
:1050F00099278D969F938F938091A50899278D96D8 |
:105100009F938F938091A40899278D969F938F9357 |
:105110008EEA97E09F938F93CF930E94711488E259 |
:10512000809341048DB79EB70B960FB6F8949EBF3F |
:105130000FBE8DBF8091AB0899278D969F938F935B |
:105140008091AA0899278D969F938F938091A908A3 |
:1051500099278D969F938F938091A80899278D9674 |
:105160009F938F9382EC97E09F938F93CF930E94AE |
:1051700071148CE3809341042DB73EB7255F3F4FF8 |
:105180000FB6F8943EBF0FBE2DBF8091AC08992793 |
:105190008D969F938F9386ED97E09F938F93CF93F8 |
:1051A0000E9471140F900F900F900F900F908091AC |
:1051B000AD08882309F02DC18091AE08882309F03D |
:1051C0001AC18091AF08882309F4E4C188E4809370 |
:1051D00041048CEE97E09F938F93CF9364CC8150E2 |
:1051E0009C4FAF4FBF4FCFC981509C4FAF4FBF4F68 |
:1051F000A3C9109241048FEE97E09F938F9311E023 |
:105200001F930E94711484E1809341040F900F90CA |
:105210000F908091D8039091D9039F938F938DEF36 |
:1052200097E09F938F931F930E94711488E280935D |
:1052300041040F900F900F900F900F908091D60324 |
:105240009091D7039F938F938AE098E09F938F93D9 |
:105250001F930E94711489E4809341040F900F9072 |
:105260000F900F900F9087E198E09F938F931F937B |
:105270000E94711480913F040F900F900F9083FF54 |
:1052800089C11092D9031092D803AEE0B0E080E05B |
:10529000082E0E94456DAFE0B0E08091D803082E43 |
:1052A0000E94456D77C184E180934104409143059C |
:1052B00050914405CA0157FD57C19C01359527956A |
:1052C000359527953595279535952795C90182956B |
:1052D0009295907F9827807F9827BA01681B790B59 |
:1052E000CB0177FD3FC1959587959F938F933F9312 |
:1052F0002F939A0157FD33C13595279535952795FD |
:10530000359527958091220490912304821B930B5D |
:105310009F938F938BE995E09F938F93CF930E94F8 |
:10532000711488E2809341048DB79EB709960FB639 |
:10533000F8949EBF0FBE8DBF40914105509142052C |
:10534000CA0157FD0AC19C013595279535952795CA |
:105350003595279535952795C90182959295907F2A |
:105360009827807F9827BA01681B790BCB0177FDBE |
:10537000F2C0959587959F938F933F932F939A01B2 |
:1053800057FDE6C035952795359527953595279591 |
:105390008091200490912104821B930B9F938F9303 |
:1053A0008DEA95E09F938F93CF930E9471148CE3C5 |
:1053B000809341048DB79EB709960FB6F8949EBFAF |
:1053C0000FBE8DBF20913F0530914005C90137FDCB |
:1053D000CDC0959587959F938F9380911E04909152 |
:1053E0001F04281B390B3F932F938FEB95E09F935E |
:1053F0008F93CF9359CD84E48093410489EE97E055 |
:105400009F938F93CF930E9471140F900F900F90E2 |
:10541000D8CE80E48093410486EE97E09F938F93EB |
:10542000CF930E9471140F900F900F90C5CE84E11E |
:105430008093410440914305509144059A0157FDE2 |
:105440009AC0359527953595279535952795C901A6 |
:10545000880F991F880F991F880F991F481B590B98 |
:105460005F934F933F932F93809122049091230455 |
:10547000821B930B9F938F9388E695E09F938F9366 |
:10548000CF930E94711488E2809341042DB73EB7F8 |
:10549000275F3F4F0FB6F8943EBF0FBE2DBF409120 |
:1054A0004105509142059A0157FD62C035952795F7 |
:1054B0003595279535952795C901880F991F880F30 |
:1054C000991F880F991F481B590B5F934F933F9368 |
:1054D0002F938091200490912104821B930B9F9322 |
:1054E0008F938AE795E09F938F93CF930E947114D7 |
:1054F0008CE3809341046DB77EB7675F7F4F0FB633 |
:10550000F8947EBF0FBE6DBF80913F05909140051E |
:105510009F938F9380913F059091400520911E04A9 |
:1055200030911F04821B930B9F938F938CE895E01F |
:105530009F938F93CF936EC98CE38093410482E451 |
:1055400094E0AECA8CE38093410480E294E0A8CA60 |
:10555000295F3F4F17CF01960CCF0F96F4CE295FEE |
:105560003F4FCACE0196BFCE0F96A7CE019631CF40 |
:10557000295F3F4F9BCF295F3F4F63CF01963DCDC2 |
:10558000295F3F4FD4CC0F96C5CC295F3F4F09CD43 |
:105590000F96FACC10923F04DF91CF911F9108959E |
:1055A0001092B9008AE28093B800089585EA80934A |
:1055B000BC00089584E98093BC0008951092B9005E |
:1055C0008093BB0085E88093BC0008950E94DA2A8E |
:1055D000109249048091BB001092480480E88093A7 |
:1055E000BC001092BD001092BA001092BB00109245 |
:1055F000B9001092B8000E94D02A0E94D62A80E0FA |
:105600000E94DE2A08958093BB0085E88093BC0049 |
:10561000089585EC8093BC00089585E88093BC00D4 |
:1056200008951F920F920FB60F9211242F933F935C |
:105630004F935F936F937F938F939F93AF93BF939A |
:10564000EF93FF9380914904282F33274427552750 |
:105650008F5F80934904F90127313105C8F4E05B7D |
:10566000FF4FEE0FFF1F0590F491E02D09948091FC |
:105670004704E82FFF27E858F74F9091BB0090832D |
:105680008F5F8C3008F49DC0109247040E94DA2A84 |
:1056900010924904E0C080E80E94DE2ADCC088E95C |
:1056A0000E94DE2AD8C00E94DA2A8AE090E0909315 |
:1056B000AD038093AC030E94D62ACDC084E10E9442 |
:1056C000DE2AC9C082E10E94DE2AC5C080911C0387 |
:1056D0000E94DE2AC0C080E10E94DE2ABCC0809108 |
:1056E0001B030E94DE2AB7C080911A030E94DE2AA3 |
:1056F000B2C080914804E82FFF27E856F64F8F5F2D |
:105700008093480480810E94DE2AA5C090914804BD |
:10571000292FE92FFF27EE0FFF1FEE0FFF1FEB5280 |
:10572000FA4F858518160CF054C09C3009F467C0F8 |
:10573000990F892F8E5A0E94DE2A8DC080914704CE |
:10574000E82FFF27EC56F74F8091BB0080830E9423 |
:105750000D2B81C08091B900803409F46EC0809116 |
:105760004704E82FFF27EC55F74F10828F5F8C30EE |
:1057700068F1109247040E94DA2A1092490480913D |
:105780004A048093460410924A0465C08091B9008F |
:10579000803309F440C00E94DA2A8AE090E09093B6 |
:1057A000AD038093AC03109249040E94D62A53C0E3 |
:1057B0000E94DA2A8AE090E09093AD038093AC03D4 |
:1057C00067CF809347040E94DA2A62CF8093470410 |
:1057D000D2CF9C3008F0A9CF922F9F5FE92FFF27EF |
:1057E000EE0FFF1FEE0FFF1FEB52FA4F85851816C5 |
:1057F0001CF0292F9C3080F39093480496CF109290 |
:10580000480483E08093490480914704880F8D5AAF |
:105810000E94DE2A20C080914A048823C9F4909116 |
:10582000480490934A04E92FFF27E957F74F8081F6 |
:105830008F5F09F48FEF8083AECF80914704E82F0C |
:10584000FF27EC55F74F8C5F80830E94092B97CF81 |
:1058500090914804E8CF8091BC0080688093BC00A0 |
:10586000FF91EF91BF91AF919F918F917F916F9138 |
:105870005F914F913F912F910F900FBE0F901F900E |
:10588000189583EC8093810080916F0080628093F3 |
:105890006F001092400510923F0510924205109241 |
:1058A0004105109244051092430508951F920F92EE |
:1058B0000FB60F921124EF92FF920F931F932F9325 |
:1058C0003F934F935F936F937F938F939F93AF9388 |
:1058D000BF93CF93DF93EF93FF9380913B0982FDBA |
:1058E0002CC0209186003091870080914C049091CB |
:1058F0004D04281B390B809186009091870090936E |
:105900004D0480934C04C9018D549440835F9A41A7 |
:1059100008F0B5C080914E048093B00880914E0489 |
:1059200090914F04049714F010928403C1E0D0E0EA |
:10593000D0934F04C0934E0415C2409186005091FD |
:1059400087008091500490915104481B590B80911D |
:105950008600909187009093510480935004CA016F |
:105960008D549440835F9A4138F58091AA048093C6 |
:105970004B0480914B04843008F00EC18091AB043D |
:10598000853608F47BC18AE08093AB0480910201E4 |
:105990008A3009F476C1843109F473C1289881E012 |
:1059A0008093AA048091D404882309F0DBC18091FC |
:1059B0004B048093B008D6C10091AA040A3008F0C5 |
:1059C000E4C0CA018B5F9040845B914008F05BC1EA |
:1059D000425D5140E02FFF27EE0FFF1FEE5AFB4FB5 |
:1059E00080819181FA01E81BF90BCF0105960B9795 |
:1059F00008F45CC1E02FFF27EE0FFF1FEE5AFB4FAC |
:105A0000808191819C01220F331F280F391F240FA1 |
:105A1000351F37FDA4C1E901D595C795D595C79523 |
:105A2000CA0101968C179D070CF071C121978091D6 |
:105A3000DE048E3B08F462C1E02FFF27EE0FFF1F4C |
:105A4000DF01AE5ABB4F8D919C919E01281B390BF3 |
:105A5000C90163E070E00E94E86CCB01880F991FD8 |
:105A6000860F971FE859FB4F91838083E02FFF2714 |
:105A7000EE0FFF1FEE5AFB4FD183C0830BC1C091C5 |
:105A80004E04D0914F04CA30D1050CF06BC1C9014E |
:105A90008B5F9040845B914008F060C0225D314094 |
:105AA000FE01EC0FFD1FEF54F74F80819181D9016A |
:105AB000A81BB90BCD01B7FD0EC1069754F4809118 |
:105AC000DE04883C08F046C18091DE04865F809346 |
:105AD000DE04FE01EC0FFD1FEF54F74F8081918132 |
:105AE000AC01440F551F480F591F420F531F57FD5C |
:105AF00033C17A01F594E794F594E794C9010196CE |
:105B00008E159F050CF013C10894E108F1088091EF |
:105B1000DE04833C08F403C18E010C0F1D1FF80145 |
:105B2000EF54F74F80819181F701E81BF90BCF010A |
:105B300063E070E00E94E86CCB01880F991F860F2C |
:105B4000971F0953174FD80111969C938E93FE010E |
:105B5000EC0FFD1FEF54F74FF182E082FE0131960A |
:105B6000F0934F04E0934E04E530F10509F4B9C019 |
:105B70005D98E630F10509F4BFC05C98379709F4E9 |
:105B8000B9C05B98EFC05C9A5B98043108F054C0D0 |
:105B90000F5F0093AA04E6C09091B00880914B0477 |
:105BA000981709F0EBCE4091AB044B3008F49BC042 |
:105BB000109284031092AA043AC00091AA04E02F24 |
:105BC000FF27EE0FFF1F9F0122583B4FDF01AF540D |
:105BD000B74F8D919C91D9018D939C93DF01A9536F |
:105BE000B74F8D919C91EC56FB4F91838083E02FB2 |
:105BF000FF27EE0FFF1F9F012F54374FDF01AE5AD3 |
:105C0000BB4F8D919C91D90111969C938E93DF018E |
:105C1000A859BB4F8D919C91E953F74F9183808395 |
:105C2000E02FEF5FEB3008F05EC0E093AA044F3145 |
:105C300020F60091AA04DBCF043109F093C08091D3 |
:105C400002018A3009F47DC0843109F47AC02898B1 |
:105C50008EE18093AA042AE0C7ECD8E0AEE7B4E076 |
:105C6000E1EBF8E08D919D919183808332961982CA |
:105C700018822296215027FFF5CF74C01092AB04F2 |
:105C800085CE289A8CCE809102018A3011F1843120 |
:105C900001F12898053019F15D98063009F473CFA9 |
:105CA0005C98073009F070CF5B9A72CF8091AB049B |
:105CB0008A3108F448C08091DE04865F8093DE0458 |
:105CC0008091DE04893C08F495CE88EC8093DE0454 |
:105CD00091CE289ADFCF909581959F4FEECE5D9A19 |
:105CE000DFCF5D9A46CF4F3F09F459CE4F5F4093C7 |
:105CF000AB0455CE5B9A36C05C9A40CFE02FFF27AD |
:105D0000EE0FFF1FE859FB4F11821082AFCE4150BA |
:105D10005040C417D5070CF08ACE219688CEFE01DC |
:105D2000EC0FFD1FE953F74F1182108210CF215065 |
:105D30003040E216F3060CF0EACE0894E11CF11CA8 |
:105D4000E6CE289A85CF8B3008F4BACF8091DE0456 |
:105D50008E5FB4CF88ECBBCE4D5F5F4FCACE2D5F58 |
:105D60003F4F59CEFF91EF91DF91CF91BF91AF910E |
:105D70009F918F917F916F915F914F913F912F9163 |
:105D80001F910F91FF90EF900F900FBE0F901F90FB |
:105D9000189581E08093E50882E08093E40883E031 |
:105DA0008093E30884E08093E60885E08093E70829 |
:105DB00086E08093E80887E08093E90888E0809394 |
:105DC000EA0808951F938AE68093EB0851E0509308 |
:105DD0003B094EE14093EC088BEF8093EE088AE09C |
:105DE0008093EF084093ED084093F10885E080939D |
:105DF000F20880E48093F3081092F40884E1809321 |
:105E0000F0088EE08093F508E0E1E093F6081CE0EE |
:105E10001093F708F8E0F093F80886EE8093F908FD |
:105E20004093FA0880E88093FB0830E53093FC0843 |
:105E300096E99093FD0883E08093FE083093FF0875 |
:105E40009093000981E28093010983E28093020923 |
:105E5000409303091092040960E2609305091092CF |
:105E60000609109207091092080910920909109268 |
:105E70001E0910921F09109220091092210924E690 |
:105E800020930A0998E290930B0950933A091092D3 |
:105E90000C098AEF80930D0976E070931209209324 |
:105EA0000E0990930F09109210098093110982E353 |
:105EB000809313099AE59093140980931509109221 |
:105EC000390990931609309317095093180985E5FD |
:105ED0008093190980931A09E0931B0960931C09A8 |
:105EE00020931D098FE58093220983EF8093240975 |
:105EF0008AEA80932609809327098FE080932309FB |
:105F0000809325098CEF8093280920932909909389 |
:105F10002A0990932B0990932C098BE480932D09E7 |
:105F200080932E0980932F091092300970933109C4 |
:105F3000F093320990933309409334092093350943 |
:105F40002093360984E080933709AEEAB3E0ECE3AE |
:105F5000F9E00D9001921A95E1F71F9108958AE6F4 |
:105F60008093EB0871E070933B095EE15093EC087D |
:105F70008BEF8093EE089AE09093EF085093ED0832 |
:105F80005093F10885E08093F20880E48093F30851 |
:105F90001092F4088FE08093F0089093F50880E168 |
:105FA0008093F60866E06093F708E8E0E093F8086D |
:105FB00086EE8093F9085093FA0880E88093FB08F6 |
:105FC0002AE52093FC0898E79093FD0883E08093EE |
:105FD000FE082093FF089093000981E28093010955 |
:105FE00083E280930209509303091092040940E26E |
:105FF00040930509109206091092070910920809AA |
:106000001092090910921E0910921F09109220097E |
:106010001092210934E630930A0998E290930B0913 |
:1060200070933A0910920C098AEF80930D096093DE |
:10603000120930930E0990930F0910921009809362 |
:10604000110982E3809313092093140980931509A1 |
:10605000109239092093160980E5809317098CE383 |
:106060008093180985E58093190980931A09409354 |
:106070001B0940931C099BE490931D098FE58093B5 |
:10608000220983EF809324098AEA8093260980936A |
:10609000270984E180932309809325098CEF80935D |
:1060A00028093093290920932A0920932B0920934A |
:1060B0002C0990932D0990932E0990932F091092FB |
:1060C000300960933109E0933209209333095093EA |
:1060D0003409309335093093360984E080933709C9 |
:1060E0008CE0A5EBB3E0ECE3F9E00D9001928A952A |
:1060F000E1F708958AE68093EB0871E070933B091D |
:106100004EE14093EC088BEF8093EE088AE0809399 |
:10611000EF084093ED084093F10885E08093F20882 |
:1061200080E48093F3081092F4088FE08093F008E5 |
:1061300068E06093F50820E12093F60856E050935C |
:10614000F7086093F80886EE8093F9084093FA0800 |
:1061500080E88093FB0834E63093FC0898E790933E |
:10616000FD0883E08093FE083093FF0890930009B8 |
:1061700081E28093010983E28093020984E18093A4 |
:106180000309109204092093050910920609109240 |
:106190000709109208091092090910921E0910921D |
:1061A0001F09109220091092210930930A0998E2E0 |
:1061B00090930B0970933A0910920C098AEF80931F |
:1061C0000D095093120930930E0990930F09109204 |
:1061D00010098093110992E3909313092AE5209303 |
:1061E000140990931509109239092093160980E536 |
:1061F0008093170986E48093180985E5809319092F |
:1062000080931A0980E280931B0980931C09909364 |
:106210001D098FE58093220983EF809324098AEA80 |
:1062200080932609809327094093230940932509E9 |
:106230008CEF809328093093290920932A09209311 |
:106240002B0920932C098BE480932D0980932E0930 |
:1062500080932F09109230095093310960933209CD |
:10626000209333094093340930933509309336092C |
:1062700084E0809337098CE0ADEBB3E0ECE3F9E028 |
:106280000D9001928A95E1F708956817790744F413 |
:10629000680F791F77FD09C0CB0195958795089503 |
:1062A000681B790B861B970B08956F5F7F4FCB019F |
:1062B000959587950895EF92FF920F931F93CF9333 |
:1062C000C82F8B018091D4048823A9F4C150CF3FFB |
:1062D00091F07B01E60EF71E1093FC030093FB0385 |
:1062E0008091FB039091FC03892BD1F7C7010E9499 |
:1062F0000518C15088F7CF911F910F91FF90EF9033 |
:1063000008952F923F924F925F926F927F928F9259 |
:106310009F92AF92BF92CF92DF92EF92FF920F9334 |
:106320001F93CF93DF93CDB7DEB7ED970FB6F894F9 |
:10633000DEBF0FBECDBF20913F053091400580915B |
:106340001E0490911F04281B390B3A87298730932C |
:10635000A7092093A609209128043091290437FD2C |
:10636000D4C73595279535952795359527953AA71F |
:1063700029A73C872B877901209126043091270497 |
:1063800037FDC0C7359527953595279535952795C0 |
:106390003CA72BA73E872D87F0926709E0926609FC |
:1063A00030935D0920935C0980919509909196093D |
:1063B000AA2797FDA095BA2F7C018D01EE0CFF1C3A |
:1063C000001F111FE80EF91E0A1F1B1F80911A04DF |
:1063D00090911B049C01442737FD4095542FDA010E |
:1063E000C901880F991FAA1FBB1F880F991FAA1FD9 |
:1063F000BB1F820F931FA41FB51F820F931FA41FE3 |
:10640000B51FE80EF91E0A1F1B1F17FD9CC7159527 |
:106410000795F794E79415950795F794E794F0920C |
:106420009609E09295098091B1099091B209AA2745 |
:1064300097FDA095BA2F7C018D01EE0CFF1C001F6B |
:10644000111FE80EF91E0A1F1B1F80911C0490915A |
:106450001D049C01442737FD4095542FDA01C901E2 |
:10646000880F991FAA1FBB1F880F991FAA1FBB1F48 |
:10647000820F931FA41FB51F820F931FA41FB51F68 |
:10648000E80EF91E0A1F1B1F17FD54C71595079527 |
:10649000F794E79415950795F794E794F092B2096D |
:1064A000E092B1098091640990916509AA2797FD4E |
:1064B000A095BA2F9C01AD01220F331F441F551F19 |
:1064C000280F391F4A1F5B1F8091180490911904EF |
:1064D000AA2797FDA095BA2F280F391F4A1F5B1FC7 |
:1064E00057FD16C755954795379527955595479567 |
:1064F00037952795309365092093640920911A04F4 |
:1065000030911B04C901880F991F880F991F820FB2 |
:10651000931F820F931FAA2797FDA095BA2F209152 |
:106520001B0530911C0540911D0550911E05820FE1 |
:10653000931FA41FB51F80931B0590931C05A09368 |
:106540001D05B0931E0520911C0430911D04C90146 |
:10655000880F991F880F991F820F931F820F931F17 |
:10656000AA2797FDA095BA2F2091170530911805FD |
:106570004091190550911A05820F931FA41FB51F52 |
:106580008093170590931805A0931905B0931A05E9 |
:1065900080916F099091700920911A0430911B0429 |
:1065A000820F931F9093700980936F098091A909BE |
:1065B0009091AA0920911C0430911D04820F931F11 |
:1065C0009093AA098093A909809135059091360589 |
:1065D000019690933605809335058091130590912F |
:1065E0001405A0911505B0911605BC01CD010E94BE |
:1065F0002F6C5B016C0180916B0890916C08AA274D |
:1066000097FDA095BA2FBC01CD010E942F6C7B0194 |
:106610008C018091310590913205A0913305B091A4 |
:1066200034059C01AD01C801B7010E94CF6BDC01AC |
:10663000CB019C01AD01C601B5010E94D06BDC010C |
:10664000CB01BC01CD010E94126CDC01CB01809317 |
:10665000130590931405A0931505B09316058FECC0 |
:1066600080937A001092190320900305309004055E |
:10667000409005055090060539E423163BE63306A5 |
:1066800031E0430630E053060CF414C188E49BE685 |
:10669000A1E0B0E08D839E83AF83B88760900B0547 |
:1066A00070900C0580900D0590900E0539E46316EE |
:1066B0003BE6730631E0830630E093060CF4DCC45D |
:1066C00088E49BE6A1E0B0E089839A83AB83BC8336 |
:1066D00049855A85CA01AA2797FDA095BA2F20910E |
:1066E000FB043091FC044091FD045091FE04280FFE |
:1066F000391F4A1F5B1F2DA33EA34FA358A7A0908D |
:10670000AD09B090AE09C090AF09D090B009A80E05 |
:10671000B91ECA1EDB1E860175013091C7043BA35A |
:10672000332309F0DAC08091C604882309F0C2C47B |
:106730004091EB084CA346FF13C6EBA5FCA5CF0187 |
:10674000AA2797FDA095BA2FBC01CD0129813A81D6 |
:106750004B815C810E94A96C9B01AC0197FD2CC709 |
:10676000BBE05595479537952795BA95D1F7809118 |
:106770008E03E82EFF2400271127C801B7010E94CD |
:10678000A96C97FD14C7ACE09595879577956795AB |
:10679000AA95D1F76F87788B898B9A8B60934F0579 |
:1067A00070935005809351059093520529A53AA501 |
:1067B000C901AA2797FDA095BA2FBC01CD012D8153 |
:1067C0003E814F8158850E94A96C9B01AC0197FDC9 |
:1067D00001C7FBE05595479537952795FA95D1F771 |
:1067E000C801B7010E94A96C97FDEFC6DC01CB017F |
:1067F000ECE0B595A79597958795EA95D1F78093A5 |
:10680000530590935405A0935505B09356052091D8 |
:106810004F05309150053093DE082093DD0820911C |
:106820005305309154053093E2082093E1082F85F9 |
:10683000388949895A89821B930BA40BB50B8AAFFF |
:106840009BAFACAFBDAF8093530590935405A0931D |
:106850005505B0935605A80EB91ECA1EDB1E86014B |
:10686000750130918D033DA7332309F0A3C58EA791 |
:106870009FA7A8ABB9ABB7FD61C62EA53FA548A998 |
:1068800059A955954795379527958DA19EA1AFA1FB |
:10689000B8A5821B930BA40BB50B8DA39EA3AFA32E |
:1068A000B8A78093FB049093FC04A093FD04B093DD |
:1068B000FE048CC598EB291694E939069EEF49062B |
:1068C0009FEF59060CF0F1C328EB34E94EEF5FEF70 |
:1068D0002D833E834F835887E1CE2DA13EA14FA14A |
:1068E00058A52093FB043093FC044093FD0450937F |
:1068F000FE043091EB083CA31092E2081092E108EC |
:106900001092DE081092DD0810924B0510924C0593 |
:1069100010924D0510924E051092470510924805B1 |
:106920001092490510924A0530918D033DA7809140 |
:106930004B0590914C05A0914D05B0914E05BC01C1 |
:10694000CD0124E630E040E050E00E941D6DDA0108 |
:10695000C9014091470550914805481B590B58A360 |
:106960004F8F8091470590914805A0914905B091BE |
:106970004A05BC01CD0124E630E040E050E00E9431 |
:106980001D6DDA01C90120914B0530914C05821B28 |
:10699000930B9AA389A38091860390918703A0917A |
:1069A0008803B0918903BC01CD0128E631E040E0C5 |
:1069B00050E00E94A96CE616F7060807190744F094 |
:1069C00057016801A61AB70AC80AD90A86017501D3 |
:1069D00017FDA3C4A092AD09B092AE09C092AF0951 |
:1069E000D092B0092BA53CA58F8D98A1280F391FF7 |
:1069F00079010027F7FC0095102F8091FF049091FA |
:106A00000005A0910105B0910205E80EF91E0A1FCC |
:106A10001B1F570168018091CA049091CB04281B69 |
:106A2000390BC901AA2797FDA095BA2F280E391E48 |
:106A30004A1E5B1E2091A2033091A3034091A40340 |
:106A40005091A503221533054405550574F4A8EAB1 |
:106A5000EA2EA1E6FA2E012D112DE21AF30A040BFB |
:106A6000150B170128015701680188279927DC01B8 |
:106A7000821B930BA40BB50B281639064A065B063E |
:106A80000CF0E9C2F8E52F2EFEE93F2EFFEF4F2E66 |
:106A9000FFEF5F2E220E331E441E551E209203056B |
:106AA000309204054092050550920605820171015D |
:106AB0002092FF0430920005409201055092020599 |
:106AC00029A53AA5A9A1BAA12A0F3B1FA9016627AA |
:106AD00057FD6095762F8091070590910805A0914C |
:106AE0000905B0910A05480F591F6A1F7B1F5A01FB |
:106AF0006B018091C8049091C904281B390BC9010E |
:106B0000AA2797FDA095BA2F680E791E8A1E9B1E94 |
:106B10008091A6039091A703A091A803B091A90327 |
:106B20008EAB9FABA8AFB9AF86159705A805B90581 |
:106B300064F448EA51E660E070E0481B590B6A0BC8 |
:106B40007B0B3A014B015A016B018EA99FA9A8AD9D |
:106B5000B9ADB095A095909581959F4FAF4FBF4F20 |
:106B6000681679068A069B060CF064C2E8E56E2E6C |
:106B7000EEE97E2EEFEF8E2EEFEF9E2E2EA93FA98F |
:106B800048AD59AD620E731E841E951E60920B05B2 |
:106B900070920C0580920D0590920E05B401A30130 |
:106BA00060920705709208058092090590920A0587 |
:106BB0008DA19EA1AFA1B8A580930F05909310055C |
:106BC000A0931105B093120560922B0570922C05CD |
:106BD00080922D0590922E05209223053092240557 |
:106BE000409225055092260540932705509328058D |
:106BF0006093290570932A05E0921F05F092200505 |
:106C0000009321051093220580912503909126037E |
:106C100097FDA4C37C01F594E794F594E794F5946B |
:106C2000E794FAA6E9A6809123039091240397FDA7 |
:106C300093C38C011595079515950795159507959F |
:106C40001CA70BA780912204909123040F9734F482 |
:106C500058E1E52E5CEFF52EFAA6E9A68091220414 |
:106C600090912304079734F440E3E42E48EFF42E88 |
:106C7000FAA6E9A6209102012A3009F46BC280919C |
:106C8000220490912304815D97400CF007C280910B |
:106C9000220490912304805E974034F080EDE82E2A |
:106CA00087E0F82EFAA6E9A68091200490912104AD |
:106CB0000F9724F408E11CEF1CA70BA78091200478 |
:106CC00090912104079724F400E318EF1CA70BA769 |
:106CD0002A3009F455C28091200490912104815DED |
:106CE000974024F008EE13E01CA70BA78091200426 |
:106CF00090912104805E974024F000ED17E01CA7DE |
:106D00000BA7A0919903AA2309F497C060912503CA |
:106D1000709126038091570590915805681B790B57 |
:106D20002091250330912603280F391F37FD3FC3DB |
:106D3000359527953093580520935705613871058F |
:106D40000CF43AC260E870E070935E0560935D05F4 |
:106D50008A2F9927869FF001879FF00D969FF00D4F |
:106D60001124CF01F7FD21C37C01F594E794F5943C |
:106D7000E794F594E794F594E79429A53AA5E20EF3 |
:106D8000F31EFAA6E9A640912303509124038091B3 |
:106D9000590590915A05481B590B209123033091B6 |
:106DA0002403280F391F37FDFDC2359527953093F1 |
:106DB0005A0520935905413851050CF4F5C140E8B6 |
:106DC00050E050935C0540935B058A2F9927849F80 |
:106DD000D001859FB00D949FB00D1124AD019D0190 |
:106DE000B7FDDDC289011595079515950795159590 |
:106DF000079515950795EBA5FCA50E0F1F1F1CA762 |
:106E00000BA7869F9001879F300D969F300D112410 |
:106E1000C9012091250330912603820F931F90937F |
:106E20002603809325038091230390912403480F28 |
:106E3000591F50932403409323034D855E851416F8 |
:106E400015060CF0C1C18091DD089091DE0897FD18 |
:106E5000A2C2AA2797FDA095BA2F6DA5262F33278A |
:106E600044275527BC01CD010E94A96C97FD8EC215 |
:106E7000E6E09595879577956795EA95D1F7AF8D7B |
:106E8000B8A1A60FB71FB0935809A09357094B8517 |
:106E90005C85141615060CF0C1C18091E108909133 |
:106EA000E20897FD6FC2AA2797FDA095BA2F6DA59E |
:106EB000262F332744275527BC01CD010E94A96CFA |
:106EC00097FD5BC246E095958795779567954A95BE |
:106ED000D1F7A9A1BAA1A60FB71FB0934D09A093EE |
:106EE0004C093CA137FDC1C110934B0900934A09DD |
:106EF000F0925A09E09259098091E708E82FFF279C |
:106F0000EE0FFF1FEF54F74F8081918182599F4F01 |
:106F1000A091E504B091E604A817B9070CF0EEC003 |
:106F2000CD0101969093E6048093E504DC01809105 |
:106F3000E808E82FFF27EE0FFF1FEF54F74F80817F |
:106F4000918182599F4F6091E3047091E404681726 |
:106F500079070CF0C4C0CB0101969093E4048093B0 |
:106F6000E304BC018091E908E82FFF27EE0FFF1F23 |
:106F7000EF54F74F8081918182599F4F4091E104F6 |
:106F80005091E204481759070CF0D5C0CA01019688 |
:106F90009093E2048093E104AC018091EA08E82F29 |
:106FA000FF27EE0FFF1FEF54F74F80819181825929 |
:106FB0009F4F2091DF043091E004281739070CF02F |
:106FC000ABC0C90101969093E0048093DF049C015B |
:106FD000B7FD93C1AF3FB10539F034F08FEF90E0CA |
:106FE0009093E6048093E50477FD76C16F3F7105C9 |
:106FF00039F034F08FEF90E09093E4048093E30451 |
:1070000057FD70C14F3F510539F034F08FEF90E0DC |
:107010009093E2048093E10437FD6AC12F3F31056C |
:1070200009F00CF4EEC28FEF90E09093E0048093AF |
:10703000DF04E7C260920B0570920C0580920D058B |
:1070400090920E05A0920705B0920805C09209051E |
:10705000D0920A05ADCD20920305309204054092EE |
:10706000050550920605A092FF04B0920005C0925B |
:107070000105D092020524CD98EB691694E97906B2 |
:107080009EEF89069FEF99062CF528EB34E94EEF29 |
:107090005FEF29833A834B835C831ACB98EEE92E0A |
:1070A00093E0F92EFAA6E9A6F2CD2D823E824F8218 |
:1070B0005886F4CA8DA19EA1AFA1B8A58093FB0408 |
:1070C0009093FC04A093FD04B093FE049091EB0810 |
:1070D0009CA312CC69827A828B829C82F9CA8081BD |
:1070E000918182599F4F861797070CF03BCF61150E |
:1070F000710509F437CFCB0101972FCF80819181A2 |
:1071000082599F4F8A179B070CF011CF109709F4F3 |
:107110000ECFCD01019706CF8081918182599F4F7B |
:10712000821793070CF054CF2115310509F450CF85 |
:10713000C901019748CF8081918182599F4F84175F |
:1071400095070CF02ACF4115510509F426CFCA0145 |
:1071500001971ECF8091220490912304835F934076 |
:1071600034F038EEE32E33E0F32EFAA6E9A6809150 |
:107170002204909123048A5F93400CF495CD8ECD28 |
:107180008091200490912104835F934024F008EEC5 |
:1071900013E01CA70BA780912004909121048A5F23 |
:1071A00093400CF4AECDA9CD3FEF403853070CF01F |
:1071B00008CE40E85FEF05CE8FEF603878070CF01F |
:1071C000C3CD60E87FEFC0CD8091DD089091DE08EF |
:1071D00097FD9BC1AA2797FDA095BA2FEDA52E2F4D |
:1071E000332744275527BC01CD010E94A96C97FD88 |
:1071F000ADC156E095958795779567955A95D1F7E6 |
:107200002F8D38A1261B370B30935809209357092F |
:107210004B855C85141615060CF43FCE8091E10871 |
:107220009091E20897FD6DC1AA2797FDA095BA2F0E |
:10723000EDA52E2F332744275527BC01CD010E94F1 |
:10724000A96C97FD88C136E09595879577956795E8 |
:107250003A95D1F729A13AA1261B370B30934D0956 |
:1072600020934C093CA137FF3FCE4BA1442309F0AA |
:107270003BCE8091C604882309F036CE8B859C8551 |
:10728000A1E081309A070CF044C12B853C854FEF7B |
:10729000203034070CF0A3C189A59AA5280F391F07 |
:1072A0003C872B8720503F4F30935A092093590930 |
:1072B000AD85BE85E1E0A130BE070CF465C12BA50C |
:1072C0003CA5A20FB31FBE87AD87A050B140B093BD |
:1072D0004B09A0934A0910CE1092E4041092E304E3 |
:1072E00057FF90CE1092E2041092E10437FF96CE41 |
:1072F0001092E0041092DF0484C11092E604109210 |
:10730000E50472CE295F3F4F3DC8295F3F4F29C832 |
:107310002D5F3F4F4F4F5F4FE5C8E60EF71E081F2A |
:10732000191FE092AD09F092AE090093AF091093D6 |
:10733000B00958CB23E030E040E050E0E20EF31E0D |
:10734000041F151FA3C883E090E0A0E0B0E0E80EA2 |
:10735000F91E0A1F1B1F5BC807966BCC07965ACCF9 |
:107360002DA13EA14FA158A52093FB043093FC040E |
:107370004093FD045093FE04BFCA615C7F4F8F4F62 |
:107380009F4FA0CD909581959F4F8DCD615C7F4F94 |
:107390008F4F9F4F6DCD909581959F4F5ACD215F17 |
:1073A0003F4F20CD2F5F3F4F00CD0F96DDCC2F5F9D |
:1073B0003F4FBECC2DA13EA14FA158A52093FB0469 |
:1073C0003093FC044093FD045093FE0489859A8514 |
:1073D000AA2797FDA095BA2F2AAD3BAD4CAD5DAD68 |
:1073E000820F931FA41FB51F8B8B9C8BAD8BBE8B05 |
:1073F000BC01CD0129813A814B815C810E94A96C3D |
:107400009B01AC0197FDBBC06BE055954795379547 |
:1074100027956A95D1F760918F03862F9927AA2720 |
:10742000BB278F8B988FA98FBA8FBC01CD010E948B |
:10743000A96C97FD9FC02CE09595879577956795EA |
:107440002A95D1F76B8F7C8F8D8F9E8F6093470528 |
:10745000709348058093490590934A056B897C8910 |
:107460008D899E892D813E814F8158850E94A96C0E |
:107470009B01AC0197FD79C08BE0559547953795F9 |
:1074800027958A95D1F76F89788D898D9A8D0E947D |
:10749000A96C97FD65C0BCE0959587957795679534 |
:1074A000BA95D1F76AAB7BAB8CAB9DAB60934B05C8 |
:1074B00070934C0580934D0590934E0529853A8530 |
:1074C00037FD7FC0213431050CF431CA6B8D7C8DC2 |
:1074D0008D8D9E8D97FD2AC06138710581059105BE |
:1074E00064F46AA97BA98CA99DA997FD82C0613823 |
:1074F0007105810591050CF41ACA81E08093E904B5 |
:1075000016CA909581959F4F8FCE909581959F4FEC |
:1075100061CEE9A5FAA58E0F9F1F9C878B878050AF |
:10752000914090935A0980935909C2CE90958095C5 |
:10753000709561957F4F8F4F9F4FCECF0196A11DC4 |
:10754000B11D8EA79FA7A8ABB9AB97C9615C7F4F50 |
:107550008F4F9F4F4ECE615C7F4F8F4F9F4F73CEAB |
:107560006150704F8F4F9F4F96CF2150384F4F4FE4 |
:107570005F4F82CF6150704F8F4F9F4F5CCF215034 |
:10758000384F4F4F5F4F40CF4D855E856FEF403096 |
:10759000560754F58BA59CA5480F591F5E874D874C |
:1075A00040505F4F50934B0940934A09A5CC61501E |
:1075B000704F8F4F9F4FE7C82150384F4F4F5F4F4D |
:1075C000CFC8309521953F4F7DCF6150704F8F4F81 |
:1075D0009F4F0CC92150384F4F4F5F4FFAC8F09260 |
:1075E0005A09E092590964CE10934B0900934A0955 |
:1075F00083CC90958095709561957F4F8F4F9F4F6D |
:1076000076CFED960FB6F894DEBF0FBECDBFDF91FB |
:10761000CF911F910F91FF90EF90DF90CF90BF908F |
:10762000AF909F908F907F906F905F904F903F9022 |
:107630002F900895809102018D3009F455C1109268 |
:107640007A00809122049091230490935A098093A8 |
:107650005909809120049091210490934B098093C3 |
:107660004A0980911E0490911F049093A70980936A |
:10767000A60980911A0490911B049C01442737FDB0 |
:107680004095542FDA01C901880F991FAA1FBB1F0B |
:10769000880F991FAA1FBB1F820F931FA41FB51F1E |
:1076A000820F931FA41FB51F90939609809395098D |
:1076B00080911C0490911D049C01442737FD409546 |
:1076C000542FDA01C901880F991FAA1FBB1F880F09 |
:1076D000991FAA1FBB1F820F931FA41FB51F820FE4 |
:1076E000931FA41FB51F9093B2098093B109809195 |
:1076F00018049091190490936509809364098FECA4 |
:1077000080937A008091E708E82FFF27EE0FFF1F94 |
:10771000EF54F74F8081918182599F4FA091E504EA |
:10772000B091E604A817B9070CF085C0CD01019609 |
:107730009093E6048093E504DC018091E808E82F4B |
:10774000FF27EE0FFF1FEF54F74F80819181825981 |
:107750009F4F6091E3047091E404681779070CF07F |
:1077600096C0CB0101969093E4048093E304BC019E |
:107770008091E908E82FFF27EE0FFF1FEF54F74F26 |
:107780008081918182599F4F4091E1045091E204A0 |
:10779000481759070CF06CC0CA0101969093E20497 |
:1077A0008093E104AC018091EA08E82FFF27EE0FF7 |
:1077B000FF1FEF54F74F8081918182599F4F209195 |
:1077C000DF043091E004281739070CF042C0C901EA |
:1077D00001969093E0048093DF049C01B7FD7FC085 |
:1077E000AF3FB10511F00CF061C077FD67C06F3F8E |
:1077F000710539F034F08FEF90E09093E4048093BA |
:10780000E30457FD61C04F3F510539F034F08FEF6D |
:1078100090E09093E2048093E10437FD5BC02F3F3A |
:10782000310509F00CF463C08FEF90E09093E00411 |
:107830008093DF045CC08081918182599F4F8A17B9 |
:107840009B070CF07ACF109709F477CFCD01019701 |
:107850006FCF8081918182599F4F821793070CF0DF |
:10786000BDCF2115310509F4B9CFC9010197B1CFB9 |
:107870008081918182599F4F841795070CF093CF97 |
:107880004115510509F48FCFCA01019787CF808137 |
:10789000918182599F4F861797070CF069CF611528 |
:1078A000710509F465CFCB0101975DCF8FEF90E0B3 |
:1078B0009093E6048093E50477FF99CF1092E40457 |
:1078C0001092E30457FF9FCF1092E2041092E1045C |
:1078D00037FFA5CF1092E0041092DF0408C0109289 |
:1078E000E6041092E50481CF0E94AC1CA8CE8091E2 |
:1078F00019099927AA27BB27BC01CD0124EC39E03F |
:1079000040E050E00E94A96CDC01CB018093A6030B |
:107910009093A703A093A803B093A90380911A0999 |
:107920009927AA27BB27BC01CD010E94A96CDC01C5 |
:10793000CB018093A2039093A303A093A403B093DD |
:10794000A50308956F927F928F929F92AF92BF92FC |
:10795000CF92DF92EF92FF920F931F93CF9300E0AD |
:1079600010E078016801469A10933A0500933905B2 |
:10797000109338050093370580E090E0A0E0B0E078 |
:107980008093310590933205A0933305B09334056D |
:10799000109344050093430510934205009341055D |
:1079A0001093400500933F051093770900937609E3 |
:1079B00010928F0310928E03109212040E941A3BB1 |
:1079C00084E690E00E9412180E941A3B8091EB0816 |
:1079D00080FF10C080911D0390911E03875B934030 |
:1079E00008F0FFC180911D0390911E038E5E9240AE |
:1079F00008F4F7C1CFE18AE090E00E94121880916C |
:107A00001E0490911F04080F191F80912204909169 |
:107A10002304E80EF91E8091200490912104C80EE1 |
:107A2000D91EC150C7FFE7CFA701405F5F4F5695F2 |
:107A300047955695479550934405409343059601C5 |
:107A4000205F3F4F36952795369527953093420511 |
:107A500020934105C8014096969587959295829509 |
:107A60008F7089279F7089279093400580933F05E9 |
:107A7000909377098093760930933E0520933D05D6 |
:107A800050933C0540933B0544E050E0DA010E94EE |
:107A9000386D802D853008F4A7C18091B10990918F |
:107AA000B20997FDD6C16CE070E00E94E86C70935B |
:107AB000380560933705809195099091960997FD57 |
:107AC000D9C16CE070E00E94E86C70933A05609355 |
:107AD000390580916B0890916C08AA2797FDA095B5 |
:107AE000BA2FBC01CD010E942F6CDC01CB01809329 |
:107AF000310590933205A0933305B093340510926D |
:107B00005A091092590910924B0910924A09109281 |
:107B1000A7091092A60984E690E00E9412188091AD |
:107B20001A0490911B04AA2797FDA095BA2F9C01D7 |
:107B3000AD01220F331F441F551F220F331F441F57 |
:107B4000551F280F391F4A1F5B1F280F391F4A1F57 |
:107B50005B1F309396092093950980911C049091A6 |
:107B60001D04AA2797FDA095BA2F7C018D01EE0C6C |
:107B7000FF1C001F111FEE0CFF1C001F111FE80E41 |
:107B8000F91E0A1F1B1FE80EF91E0A1F1B1FF09289 |
:107B9000B209E092B1098091FA08682E772488240E |
:107BA0009924C9019C01442737FD4095542FC401F5 |
:107BB000B3010E94A96C5B016C0160932B0570936B |
:107BC0002C0580932D0590932E059701442737FDB2 |
:107BD0004095542FC401B3010E94A96CDC01CB0174 |
:107BE0008093230590932405A0932505B093260543 |
:107BF000A0920705B0920805C0920905D0920A0527 |
:107C00008093FF0490930005A0930105B0930205B3 |
:107C10001092FB041092FC041092FD041092FE04DA |
:107C200080911F0390912003A0912103B091220322 |
:107C300090936E0880936D081092110410921004B6 |
:107C40001092F3041092F4041092F5041092F604CA |
:107C50008091F1049091F2049093F0048093EF04EA |
:107C60009093EE048093ED040E94FE6282E390E024 |
:107C70009093FC038093FB03809119099927AA270D |
:107C8000BB27BC01CD0124EC39E040E050E00E946C |
:107C9000A96CDC01CB018856954CAF4FBF4F809348 |
:107CA000A6039093A703A093A803B093A903809180 |
:107CB0001A099927AA27BB27BC01CD010E94A96CEC |
:107CC000DC01CB018856954CAF4FBF4F8093A20388 |
:107CD0009093A303A093A403B093A50310928B03E6 |
:107CE00010928A038091F1049091F204AA2797FDE3 |
:107CF000A095BA2F20918603309187034091880385 |
:107D000050918903BC01CD010E94A96CDC01CB011B |
:107D10008093AD099093AE09A093AF09B093B009D9 |
:107D20001092E8041092E70481E0809301010E9420 |
:107D3000F3668091AD0484608093AD048FEF8093EF |
:107D4000160A1092170A80E28093180A8091E708B9 |
:107D5000E82FFF27EE0FFF1FEF54F74F808191812F |
:107D600082599F4F9093E6048093E5048091E80840 |
:107D7000E82FFF27EE0FFF1FEF54F74F808191810F |
:107D800082599F4F9093E4048093E3048091E90823 |
:107D9000E82FFF27EE0FFF1FEF54F74F80819181EF |
:107DA00082599F4F9093E2048093E1048091EA0806 |
:107DB000E82FFF27EE0FFF1FEF54F74F80819181CF |
:107DC00082599F4F9093E0048093DF0484E6809370 |
:107DD000DE048091F903882309F450C0469A579A2B |
:107DE0004DC00E945A1C06CEDA010E94386D802DCB |
:107DF0009927982F8827DA0111960E94386D202D37 |
:107E0000820F911D90933A0580933905DA011296FD |
:107E10000E94386D802D9927982F8827DA011396B4 |
:107E20000E94386D202D820F911D9093380580930C |
:107E30003705DA0114960E94386D802D9927982F06 |
:107E40008827DA0115960E94386D202D820F911D2A |
:107E500044CE909581959F4F6CE070E00E94E86C55 |
:107E60007093380560933705809195099091960934 |
:107E700097FF27CE909581959F4F23CECF911F914D |
:107E80000F91FF90EF90DF90CF90BF90AF909F90B9 |
:107E90008F907F906F9008959091D404992381F5ED |
:107EA0008091AD048C7F8093AD0410C0A92FBB27B7 |
:107EB000FD01E659F84F8083FD01E659F84F8081B6 |
:107EC000A856B64F8C939F5F9C3080F48091DC0362 |
:107ED000882361F3A92FBB27FD01E659F84F808164 |
:107EE000A856B64F8C939F5F9C3080F38091DC0343 |
:107EF000882359F08091DC0381508093DC0305C016 |
:107F00008091AD0481608093AD0480919809992798 |
:107F10009093400880933F08809199099927909306 |
:107F200042088093410880919B09992790934408C7 |
:107F30008093430880919A099927909346088093EB |
:107F4000450810924904109248040E94D62A0895C8 |
:107F50008091EE088B3F68F08B3F09F4D5C28C3FCF |
:107F600009F474C38D3F09F4F6C28E3F21F4809169 |
:107F7000DF0480939E038091ED088B3F08F439C2A3 |
:107F80008B3F09F434C28C3F09F448C38D3F09F498 |
:107F9000D9C28E3F09F478C380919F03882309F0EA |
:107FA0002DC280939F038091EF088B3F08F42DC270 |
:107FB0008B3F09F428C28C3F09F442C38D3F09F47A |
:107FC000C4C28E3F09F45AC380919D03882309F0EF |
:107FD00021C280939D038091F1088B3F68F08B3F15 |
:107FE00009F495C28C3F09F42EC38D3F09F4B0C249 |
:107FF0008E3F21F48091DF0480939C038091F308ED |
:108000008B3F68F08B3F09F479C28C3F09F4E2C2E0 |
:108010008D3F09F4BEC28E3F21F48091DF0480932E |
:108020009A038091FB088B3F68F08B3F09F469C28B |
:108030008C3F09F4FCC28D3F09F490C28E3F21F4BD |
:108040008091DF0480939B038091FC088B3F08F4B0 |
:10805000E8C18B3F09F4E3C18C3F09F4EEC28D3FC8 |
:1080600009F494C28E3F09F412C3809198038B30B7 |
:1080700008F4DCC18F3F11F4809398038091FD08D0 |
:108080008B3F68F08B3F09F427C28C3F09F4D2C2C2 |
:108090008D3F09F466C28E3F21F48091DF04809306 |
:1080A00097038091FE088B3F68F08B3F09F417C25D |
:1080B0008C3F09F489C28D3F09F46EC28E3F21F4D2 |
:1080C0008091DF04809399038091FF088B3F68F0D3 |
:1080D0008B3F09F407C28C3F09F479C28D3F09F444 |
:1080E00052C28E3F21F48091DF04809396038091E9 |
:1080F00000098B3F68F08B3F09F4F7C18C3F09F40E |
:10810000ABC28D3F09F43CC28E3F21F48091DF0465 |
:1081100080939503209105092B3F08F48BC12B3FD9 |
:1081200009F486C12C3F09F47CC22D3F09F404C236 |
:108130002E3F09F4A6C220919303809106098B3F3C |
:1081400008F07FC18093C104809107098B3F68F0DC |
:108150008B3F09F4D0C18C3F09F466C28D3F09F40E |
:10816000EEC18E3F21F48091DF048093C0048091A2 |
:1081700008098B3F68F08B3F09F484C18C3F09F4F8 |
:1081800071C28D3F09F4D2C18E3F21F48091DF048A |
:108190008093BF04809109098B3F68F08B3F09F4FD |
:1081A00074C18C3F09F461C28D3F09F4C2C18E3F96 |
:1081B00021F48091DF048093BE0480911E098B3FDF |
:1081C00068F08B3F09F464C18C3F09F454C28D3FC1 |
:1081D00009F4A3C18E3F21F48091DF048093BD0494 |
:1081E00080911F098B3F68F08B3F09F454C18C3F8D |
:1081F00009F42FC28D3F09F493C18E3F21F4809181 |
:10820000DF048093BC04809120098B3F68F08B3F92 |
:1082100009F444C18C3F09F4ECC18D3F09F4C5C198 |
:108220008E3F21F48091DF048093BB04809121096B |
:108230008B3F68F08B3F09F434C18C3F09F4DCC1FB |
:108240008D3F09F4B5C18E3F21F48091DF04809306 |
:10825000BA0480910A098B3F68F08B3F09F424C16E |
:108260008C3F09F4CFC18D3F09F484C18E3F21F4C6 |
:108270008091DF048093920380910E098B3F68F018 |
:108280008B3F09F414C18C3F09F4BFC18D3F09F441 |
:1082900074C18E3F21F48091DF048093910380911B |
:1082A00013098B3F68F08B3F09F404C18C3F09F43C |
:1082B000AFC18D3F09F458C18E3F21F48091DF0496 |
:1082C00080939003809116098B3F68F08B3F09F4EF |
:1082D000F4C08C3F09F49FC18D3F09F448C18E3F23 |
:1082E00021F48091DF0480938F03809117098B3FE5 |
:1082F00068F08B3F09F4E4C08C3F09F46EC18D3FF8 |
:1083000009F44DC18E3F21F48091DF0480938E03E8 |
:10831000809118098B3F68F08B3F09F4D4C08C3FE3 |
:1083200009F464C18D3F09F43DC18E3F21F4809171 |
:10833000DF0480938D0380911D098B3F68F08B3F94 |
:1083400009F4C4C08C3F09F45AC18D3F09F433C10C |
:108350008E3F21F48091DF0480938C038091230968 |
:108360008B3F08F47FC08B3F09F47AC08C3F09F43F |
:1083700037C18D3F09F422C18E3F09F48BC1809132 |
:108380007109823008F473C08F3F11F48093710932 |
:10839000809125098B3F08F46EC08B3F09F469C0BA |
:1083A0008C3F09F420C18D3F09F40BC18E3F09F4C5 |
:1083B00074C18091A409823008F462C08F3F11F427 |
:1083C0008093A409809138098B3F70F08B3F09F4AA |
:1083D00080C08C3F09F44CC18D3F09F49BC08E3F97 |
:1083E00009F05EC18091DF048093B40959C1809186 |
:1083F000E50480939F03882309F4D3CD843608F4E1 |
:10840000D2CD84E6CECD8091E50480939D03882370 |
:1084100009F4DFCD843608F4DECD84E6DACD809130 |
:10842000E504809398038B3008F024CE8AE024CEB4 |
:108430002091E50420939303809106098B3F08F473 |
:1084400081CE8B3F09F454C08C3F09F408C18D3FA5 |
:1084500009F469C08E3F09F077CE8091DF0472CEB7 |
:108460008091E50480937109823008F08DCF81E01E |
:108470008DCF8091E5048093A409823008F09ECFCF |
:1084800081E09ECF8091E50483CE8091E50493CE78 |
:108490008091E504A3CE8091E504B3CE8091E504FC |
:1084A000C3CE8091E504D3CE8091E504E3CE8091E4 |
:1084B000E504F3CE8091E50403CF8091E50413CF6A |
:1084C0008091E50423CF8091E50433CF8091E504CA |
:1084D00043CF8091E50488CF8091E504E0CD809181 |
:1084E000E504F0CD8091E50400CE8091E50410CE46 |
:1084F0008091E50427CE8091E50437CE8091E50494 |
:108500008ECD8091E5049ECD8091E50432CD8091A1 |
:10851000E50472CD8091E10467CF8091E1045ECEE5 |
:108520008091E1046ECE8091E1040CCE8091E10453 |
:108530002FCE8091E1043FCE2091E1047BCF80914A |
:10854000E10413CE8091E10454CF8091E1045DCF2A |
:108550008091E10451CD8091E1040BCD8091E10443 |
:1085600071CD8091E1049BCD8091E104A9CE8091F1 |
:10857000E104B9CE8091E1047DCE8091E1048DCEFD |
:108580008091E104C5CD8091E104AFCD8091E104FB |
:1085900048CF8091E10443CD8091E10493CD809157 |
:1085A000E104B4CE8091E104C4CE8091E1043CCEDC |
:1085B0008091E1044CCE8091E104CECE8091E10423 |
:1085C00051CF8091E10457CF8091E3047BCD80911E |
:1085D000E3048BCD8091E30422CD8091E30496CE19 |
:1085E0008091E3043FCF8091E30445CF8091E30481 |
:1085F000A0CE8091E30418CE8091E30428CE809130 |
:10860000E304AACE8091E30435CE8091E30445CE05 |
:108610008091E30455CE8091E30465CE8091E3041C |
:10862000E8CE2091E30406CF8091E3049ECD8091B3 |
:10863000E30408CD8091E30432CD8091E304F1CED0 |
:108640008091E304E2CE8091E304D6CC8091E304F0 |
:1086500090CC8091E304D5CD8091E30459CD8091F5 |
:10866000E30470CD8091E30493CD8091E304A3CD26 |
:108670008091E304B9CE8091E304B0CD8091DF0412 |
:10868000C4CE2091DF04D6CE8091DF04B2CE80919B |
:10869000DF04C7CE8091DF04E5CE8091DF04EBCE0E |
:1086A00033272F5F3F4F8CE398E2B9010E94E86CBB |
:1086B0007093A1036093A0038091F9088093A509AA |
:1086C0008091F80880935E0908952F923F924F920F |
:1086D0005F926F927F928F929F92AF92BF92CF9252 |
:1086E000DF92EF92FF920F931F93CF93DF93CDB75B |
:1086F000DEB7ED970FB6F894DEBF0FBECDBF809109 |
:10870000AC04815009F485E08093AC040E9481316F |
:10871000209102012C3008F079C3299AA090D50449 |
:10872000B090D604BA82A98280915E0999270A96F0 |
:10873000A816B90614F49A8389838091DE048436DE |
:1087400008F066C380917B0590917C05009709F045 |
:1087500048C51092D4048091AD048F7E8093AD04FF |
:108760002A3009F446C5243109F443C5289880917C |
:10877000AE049091AF04895E934008F443C58091A4 |
:108780000209282F33273A8329838091AD04806121 |
:108790008093AD048091E308A82FBB27AA0FBB1FCD |
:1087A000FD01E953F74F118210828091E408282FD0 |
:1087B0003327220F331FC9018953974FFC011182C0 |
:1087C0001082AF54B74F11961C921E922F54374F00 |
:1087D000D90111961C921E928091E608E82FFF277E |
:1087E000EE0FFF1FEF54F74F118210828091840328 |
:1087F000815080938403809184038F3F21F0809186 |
:10880000AD0484FF02C50E94A83F8091F508482E60 |
:1088100055248091F608A82EBB248091BA048823A1 |
:1088200011F40C94E94F8E3F11F40C94225A8138C4 |
:1088300010F00C9419518091AD099091AE09A0915E |
:10884000AF09B091B0092091860330918703409120 |
:10885000880350918903BC01CD010E941D6D6901FF |
:108860008091ED049091EE048C199D0988599E4FDA |
:1088700068E671E00E94E86C6C010E943E6A7C012F |
:108880000027F7FC0095102F8091E308E82FFF27C1 |
:10889000EE0FFF1FEF54F74F808191819C01442719 |
:1088A00037FD4095542FC801B7010E94A96C97FF6E |
:1088B00002C00C944E5D1DE0959587957795679560 |
:1088C0001A95D1F71B01C6010E94F1697C010027AE |
:1088D000F7FC0095102F8091E408E82FFF27EE0F9A |
:1088E000FF1FEF54F74F808191819C01442737FD92 |
:1088F0004095542FC801B7010E94A96C97FF02C090 |
:108900000C94485DBDE09595879577956795BA95E8 |
:10891000D1F74B01820C931C3B0162187308C6010E |
:108920000E943E6A7C010027F7FC0095102F809181 |
:10893000E308E82FFF27EE0FFF1FE953F74F808171 |
:1089400091819C01442737FD4095542FC801B70100 |
:108950000E94A96C97FF02C00C94425DADE0959512 |
:10896000879577956795AA95D1F71B01C6010E9457 |
:10897000F1697C010027F7FC0095102FD090E408E6 |
:10898000ED2DFF27EE0FFF1FE953F74F80819181F7 |
:108990009C01442737FD4095542FC801B7010E9420 |
:1089A000A96C97FF02C00C943C5DFDE095958795FE |
:1089B00077956795FA95D1F78B01020D131D7B0111 |
:1089C000E218F3088091BA048F3F11F40C94285AEE |
:1089D000C090E3083090E60880918A0590918B055D |
:1089E000AC01440F551F480F591F849CC001859C42 |
:1089F000900D949C900D1124480F591F57FF02C0F1 |
:108A00000C94535955954795559547950A9D900156 |
:108A10000B9D300D1A9D300D1124240F351F3093FE |
:108A20008B0520938A058091C1059091C2054091E4 |
:108A3000BD055091BE05840F951F281B390B30933F |
:108A4000DC042093DB0480918C0590918D05AC01B2 |
:108A5000440F551F480F591F649CC001659C900D21 |
:108A6000749C900D1124480F591F57FF02C00C949D |
:108A70004F595595479555954795EA9C9001EB9C24 |
:108A8000300DFA9C300D1124240F351F30938D05C5 |
:108A900020938C058091BF059091C0054091BB0546 |
:108AA0005091BC05840F951F281B390B3093DA04B5 |
:108AB0002093D904E32DFF27EE0FFF1FEF54F74F4C |
:108AC00080819181909581959F4F8330910514F419 |
:108AD0000C940B5002979093D8048093D704809104 |
:108AE000E508E82FFF27EE0FFF1FEF54F74FE08058 |
:108AF000F180E8E7F0E0EE0EFF1E809198039927E1 |
:108B0000AA2797FDA095BA2FBC01CD010E942F6C1A |
:108B1000DC01CB0120E030E040E251E4BC01CD01BA |
:108B20000E94D06BDC01CB01BC01CD010E94126C14 |
:108B3000DC01CB018093AB091091970380919603E0 |
:108B40009927AA2797FDA095BA2FBC01CD010E94B5 |
:108B50002F6CDC01CB0120E030E040E251E4BC01AD |
:108B6000CD010E94D06BDC01CB01BC01CD010E9484 |
:108B7000126CDC01CB0180935109F0919503F093C5 |
:108B8000680980918C0780FF06C08091B409813804 |
:108B900010F00C948C50F092D604E092D5048091A1 |
:108BA000D5049091D60497FF02C00C944959509176 |
:108BB000EB085FA352FD02C00C9455501092780947 |
:108BC0004091DB045091DC04CA0157FF02C00C94B1 |
:108BD0006050959587959595879597FF02C00C9461 |
:108BE00069502091B2043091B3042817390714F06A |
:108BF0000C941350CA0157FF02C00C94345D97FFC8 |
:108C000002C00C94315DBC017595679575956795AB |
:108C10006536710514F40C94165064E670E04091CA |
:108C2000D9045091DA04CA0157FD02C00C941F50B8 |
:108C30000396959587959595879597FD02C00C9419 |
:108C40002750909581959F4F2091B0043091B104A9 |
:108C50002817390714F40C9430502150304080917B |
:108C6000AD0484FD02C00C944B501092B3041092DA |
:108C7000B2041092B1041092B004ED2DFF27EE0F54 |
:108C8000FF1FEF54F74F40911409242F33278081A1 |
:108C900091812817390734F48091390982FF02C085 |
:108CA0000C948750ED2DFF27EE0FFF1FEF54F74F69 |
:108CB000842F992720911509821B910920813181E8 |
:108CC0002817390714F41092C504ED2DFF27EE0F75 |
:108CD000FF1FEF54F74F842F992722273327281B94 |
:108CE000390B808191818217930734F4809139097F |
:108CF00083FF02C00C9482508091C404882391F0B9 |
:108D0000ED2DFF27EE0FFF1FEF54F74F8091150950 |
:108D10009927841B9109208131818217930714F4CC |
:108D20000C941551EC2DFF27EE0FFF1FEF54F74F5A |
:108D3000242F3327808191812817390734F48091BB |
:108D4000390980FF02C00C947C505091C204552315 |
:108D500099F0EC2DFF27EE0FFF1FEF54F74F842FF4 |
:108D6000992720911509821B9109208131812817AB |
:108D7000390714F40C941051EC2DFF27EE0FFF1F50 |
:108D8000EF54F74F842F992722273327281B390BBD |
:108D9000808191818217930734F48091390981FF92 |
:108DA00002C00C9477508091C304882391F0EC2D7D |
:108DB000FF27EE0FFF1FEF54F74F809115099927FA |
:108DC000841B9109208131818217930714F40C943C |
:108DD0000C518091C504882331F48091C404882308 |
:108DE00011F40C94745091E0552331F48091C30434 |
:108DF000882311F40C94EF5081E08093C704109203 |
:108E0000C6041092C5041092C40402C2299886CCEC |
:108E10008091DE048D3808F4E9CC8091AD048F7E1A |
:108E20008093AD049091030982E3989FC0011124BF |
:108E300090937C0580937B05E981FA81B99714F0C2 |
:108E40000C94F5508091AE049091AF048F3F910542 |
:108E500019F010F00C94425910925F0510926005C1 |
:108E600010926105109262051092630510926405DC |
:108E700010926505109266058A3F910511F40C94D5 |
:108E8000BC5E3091E508E32FFF27EE0FFF1FEF5484 |
:108E9000F74F80819181813591050CF4E9C04091B3 |
:108EA000D404442309F0E4C08091E608E82FFF27AA |
:108EB000EE0FFF1FEF54F74F808191818C349105A5 |
:108EC00014F40C94EB5D80917D058F5F893C10F468 |
:108ED0000C94FB5E2C3010F00C949B60299810923F |
:108EE000D40410927D051092AF041092AE04C0908D |
:108EF000E308EC2DFF27EE0FFF1FEF54F74F8081A3 |
:108F000091818734910514F00C94AE5FD090E40801 |
:108F1000ED2DFF27EE0FFF1FEF54F74F808191815A |
:108F20000190F081E02DF7FF02C00C947562E734E8 |
:108F3000F1050CF470C021E0AD2DBB27AA0FBB1FBB |
:108F4000AF54B74F8D919C9111978734910544F0A0 |
:108F5000EC2DFF27EE0FFF1FEF54F74F808191811B |
:108F60008D919C918734910564F0EC2DFF27EE0FD5 |
:108F7000FF1FEF54F74F80819181873491050CF0EA |
:108F800022E0ED2DFF27EE0FFF1FEF54F74F8081FA |
:108F900091818634910564F4EC2DFF27EE0FFF1FBD |
:108FA000EF54F74F80819181873491050CF023E0D5 |
:108FB000ED2DFF27EE0FFF1FEF54F74F80819181BA |
:108FC0008A5B9F4F64F4EC2DFF27EE0FFF1FEF54D9 |
:108FD000F74F80819181873491050CF024E0ED2DCD |
:108FE000FF27EE0FFF1FEF54F74F808191818A5BBF |
:108FF0009F4F64F4EC2DFF27EE0FFF1FEF54F74F48 |
:1090000080819181863491050CF425E0822F0E94A5 |
:109010007505D090E408ED2DFF27EE0FFF1FEF54EC |
:10902000F74F808191810190F081E02DF7FF02C020 |
:109030000C9452617E9714F00C946D5F8091E3085C |
:10904000E82FFF27EE0FFF1FEF54F74F808191812C |
:109050008A5B9F4F14F00C946D5F81E080938007D2 |
:1090600088EE93E09093FC038093FB033091E50836 |
:10907000E32FFF27EE0FFF1FEF54F74F8081918101 |
:109080008B5A9F4F0CF0B2CB3090E608E32DFF27B0 |
:10909000EE0FFF1FEF54F74F80819181855B9F4F4B |
:1090A00014F00C947D5A80917E058F5F893C10F4FA |
:1090B0000C94CF5D88EC80937E0581E090E09093E6 |
:1090C000AF048093AE0481E08093D40410926705CE |
:1090D000109268051092690510926A051092FB04BF |
:1090E0001092FC041092FD041092FE041092F704FA |
:1090F0001092F8041092F9041092FA048091FA0880 |
:10910000E82EFF2400271127809195099091960958 |
:109110009C01442737FD4095542FC801B7010E9498 |
:10912000A96CDC01CB0180930B0590930C05A093F7 |
:109130000D05B0930E058091B1099091B2099C0183 |
:10914000442737FD4095542FC801B7010E94A96CF0 |
:10915000DC01CB018093030590930405A0930505E2 |
:10916000B093060580912B0590912C05A0912D05BB |
:10917000B0912E058093070590930805A0930905EB |
:10918000B0930A058091230590912405A0912505AF |
:10919000B09126058093FF0490930005A0930105EC |
:1091A000B093020510925F05109260051092610560 |
:1091B0001092620510926305109264051092650585 |
:1091C000109266058091AD0488608093AD04809113 |
:1091D000F1049091F2049093EE048093ED040C94CA |
:1091E0007F5A019790937C0580937B052A3009F084 |
:1091F000BACA289A8091AE049091AF04895E9340D8 |
:1092000008F0BDCA1092D404F1CA6091EB086FA3B4 |
:109210007091C6047E8B772321F48091C704882344 |
:1092200069F0809113099927A981BA818A179B0750 |
:1092300014F49A83898381E08093E9048091AD04DA |
:1092400084FFC3C61092D8041092D7041092DC0495 |
:109250001092DB041092DA041092D9049AE59093EC |
:10926000AB0988E7809378099093510989A380938B |
:1092700068091092C6041092C7041E8A20916B09D7 |
:1092800030916C0940916D0950916E09A0902B05A9 |
:10929000B0902C05C0902D05D0902E05A8A6B9A69B |
:1092A000CAA6DBA62A0D3B1D4C1D5D1D80917209CF |
:1092B00090917309A0917409B0917509C09023052C |
:1092C000D0902405E0902505F0902605CC8EDD8E0B |
:1092D000EE8EFF8E8C0D9D1DAE1DBF1DE0906009B2 |
:1092E000F09061090091620910916309A09027052F |
:1092F000B0902805C0902905D0902A05ABA2BCA249 |
:10930000CDA2DEA2EA0CFB1C0C1D1D1DE8AAF9AAC9 |
:109310000AAB1BABC0905209D0905309E09054099E |
:10932000F0905509CCA6DDA6EEA6FFA6E0901F059D |
:10933000F09020050091210510912205E98AFA8A12 |
:109340000B8B1C8BACA4BDA4CEA4DFA4AE0CBF1CA5 |
:10935000C01ED11EACA6BDA6CEA6DFA6B090C70487 |
:10936000B8A2BB2009F0D0C50E89002309F0CCC5F6 |
:109370008093720990937309A0937409B09375094F |
:1093800020936B0930936C0940936D0950936E09DB |
:1093900080916B0890916C08815092400CF07EC4D3 |
:1093A0008091D404882309F079C480910E049091AF |
:1093B0000F048F3F910509F008F47FC5B8A1BB23C6 |
:1093C00009F042C7EE89EE2309F03EC7F091E904A7 |
:1093D000FAA3FF2309F038C7A0901C09AD8AAA2080 |
:1093E00009F432C7C8A8D9A8EAA8FBA8C0926009A6 |
:1093F000D0926109E0926209F0926309ECA4FDA4A5 |
:109400000EA51FA5E0925209F0925309009354094A |
:109410001093550980916B0990916C09A0916D0989 |
:10942000B0916E09B7FF02C00C940561292E3A2E47 |
:109430004B2E552447FC5A9420926B0930926C09AC |
:1094400040926D0950926E09809172099091730952 |
:10945000A0917409B0917509B7FF02C00C94FF6028 |
:10946000892F9A2FAB2FBB27A7FDBA958D839E839B |
:10947000AF83B8878093720990937309A09374099E |
:10948000B09375098091FA08E82EFF240027112770 |
:1094900020911B0530911C0540911D0550911E0522 |
:1094A000C801B7010E94A96C97FF02C00C941D610E |
:1094B000672E782E892E992487FC9A94209117057F |
:1094C000309118054091190550911A05C801B7014E |
:1094D0000E94A96C97FF02C00C941761A72EB82EAA |
:1094E000C92EDD24C7FCDA94D201C101861997097F |
:1094F000A809B90920911B09E22EFF240027112792 |
:10950000BC01CD01A80197010E941D6D39014A01DE |
:1095100019012A018D819E81AF81B8858A199B0925 |
:10952000AC09BD09BC01CD01A80197010E941D6DC8 |
:10953000D401C30197FE02C00C941161892F9A2FA8 |
:10954000AB2FBB27A7FDBA95BC01DA01C90157FFB4 |
:1095500002C00C940B61892F9A2FAB2FBB27A7FD5C |
:10956000BA956C018091B2049091B3048134910555 |
:10957000D4F48091B0049091B104813491059CF4AD |
:109580008091E608E82FFF27EE0FFF1FEF54F74FFB |
:10959000808191810190F081E02DF7FF02C00C9451 |
:1095A00024627A9734F08091160A8F3F11F40C945C |
:1095B0009E600BA11CA12DA13EA188A599A5AAA5DD |
:1095C000BBA5081B190B2A0B3B0B0AAF1BAF2CAF1B |
:1095D0003DAF00936B0510936C0520936D053093A0 |
:1095E0006E05E988FA880B891C892C8D3D8D4E8D7E |
:1095F0005F8DE21AF30A040B150BE986FA860B87D6 |
:109600001C87E0926F05F09270050093710510932E |
:1096100072058AAD9BADACADBDAD809373059093E3 |
:109620007405A0937505B0937605E0927705F092E6 |
:1096300078050093790510937A058091070590913C |
:109640000805A0910905B0910A05EAACFBAC0CAD88 |
:109650001DAD8E199F09A00BB10B80930705909348 |
:109660000805A0930905B0930A058091FF04909125 |
:109670000005A0910105B091020509851A852B8589 |
:109680003C85801B910BA20BB30B8093FF0490933E |
:109690000005A0930105B09302051D89112371F106 |
:1096A0002091E7043091E8042138310594F080914D |
:1096B0003F059091400501969093400580933F05AA |
:1096C000809176099091770901969093770980931C |
:1096D000760920583F4F94F480913F0590914005C2 |
:1096E00001979093400580933F0580917609909172 |
:1096F0007709019790937709809376091092E8048F |
:109700001092E70401E0A02EB12C8AAD9BADACAD68 |
:10971000BDADB7FF02C00C94CA6081509240A0401A |
:10972000B0401CF014E0A12EB12C809194059091D2 |
:109730009505A0919605B0919705E0906B09F09082 |
:109740006C0900916D0910916E098E199F09A00B8B |
:10975000B10B815E914BAF4FBF4F8F539C49A040DF |
:10976000B04010F40C94FF5EF091170AFF8BF931B2 |
:1097700014F40C94B460B0928F05A0928E058AAD5B |
:109780009BADACADBDAD81509041A040B04014F454 |
:109790000C94455F80919005882311F40C9423610B |
:1097A0007093C9046093C8048AAD9BADACADBDADE8 |
:1097B000B7FF02C00C9454629C01AD01B7FF02C018 |
:1097C0000C946362B9E05595479537952795BA95FE |
:1097D000D1F780918E0590918F05820F931F909302 |
:1097E0008F0580938E052AAD3BAD4CAD5DAD57FF27 |
:1097F00002C00C945D6239014A01A3E095948794FC |
:1098000077946794AA95D1F713012401F9E86F16AC |
:10981000F3E17F06F0E08F06F0E09F0644F0F8E801 |
:109820006F2EF3E17F2E812C912C13012401D401A2 |
:10983000C30197FE02C00C946F62892F9A2FAB2F41 |
:10984000BB27A7FDBA95680F791F2AAD3BAD4CAD7C |
:109850005DAD203080EF38078FEF48078FEF580756 |
:1098600014F00C94395F80919105882311F40C94C5 |
:10987000F2607093C9046093C804DA01C90157FF0C |
:1098800002C00C944B629C01AD01B7FF02C00C9466 |
:10989000986269E055954795379527956A95D1F770 |
:1098A00080918E0590918F05820F931F90938F0565 |
:1098B00080938E052AAD3BAD4CAD5DAD57FF02C028 |
:1098C0000C94926239014A0143E09594879477940D |
:1098D00067944A95D1F798E769169CEE79069FEF51 |
:1098E00089069FEF990644F438E7632E3CEE732E09 |
:1098F0003FEF832E3FEF932E609282057092830597 |
:109900008092840590928505D401C30197FE02C020 |
:109910000C944162892F9A2FAB2FBB27A7FDBA95D4 |
:109920006091C8047091C904680F791FAD892A2F0E |
:10993000332780918E0590918F052817390724F4DD |
:1099400030938F0520938E05BF89BB2379F02B2F91 |
:10995000332727FD309580918E0590918F0528172C |
:10996000390724F430938F0520938E052AAD3BAD43 |
:109970004CAD5DAD213831054105510574F0809144 |
:1099800043059091440520918E0530918F05820FFB |
:10999000931F90934405809343058AAD9BADACAD76 |
:1099A000BDAD80589F4FAF4FBF4F74F480914305BA |
:1099B0009091440520918E0530918F05821B930B69 |
:1099C0009093440580934305B1E0AB2EB12C89857B |
:1099D0009A85AB85BC85B7FF02C00C94E4608150CA |
:1099E0009240A040B0401CF0A4E0AA2EB12C20E090 |
:1099F00030E040E050E08091980590919905A09169 |
:109A00009A05B0919B0560907209709073098090DF |
:109A100074099090750986199709A809B909815E9A |
:109A2000914BAF4FBF4F8F539C49A040B04028F09F |
:109A3000FF89F93114F40C94945FB0928F05A092D1 |
:109A40008E0589859A85AB85BC8581509041A04063 |
:109A5000B04014F40C942D5F80919205882311F48A |
:109A60000C94D760D092CB04C092CA0489859A85A1 |
:109A7000AB85BC85B7FF02C00C943262B7FF02C051 |
:109A80000C948C62F9E0B595A79597958795FA9512 |
:109A9000D1F7A80EB91EB0928F05A0928E05298528 |
:109AA0003A854B855C8557FF02C00C948662E3E0E3 |
:109AB0005595479537952795EA95D1F72938F3E1DC |
:109AC0003F07F0E04F07F0E05F0714F40C94D0611B |
:109AD00088E893E1A0E0B0E0809386059093870545 |
:109AE000A0938805B093890580918605909187059C |
:109AF000A0918805B0918905B7FF02C00C943B6224 |
:109B0000892F9A2FAB2FBB27A7FDBA95C090CA0407 |
:109B1000D090CB04C80ED91E29853A854B855C852B |
:109B2000203080EF38078FEF48078FEF580714F089 |
:109B30000C94495F80919305882311F40C94ED6097 |
:109B4000D092CB04C092CA04DA01C90157FF02C007 |
:109B50000C94A4629C01AD01B7FF02C00C949E62FC |
:109B6000B9E05595479537952795BA95D1F78091E6 |
:109B70008E0590918F05820F931F90938F05809390 |
:109B80008E0529853A854B855C8557FF02C00C946C |
:109B90006962A3E05595479537952795AA95D1F722 |
:109BA00028379CEE39079FEF49079FEF590714F0BC |
:109BB0000C94DA6188E79CEEAFEFBFEF80938605E7 |
:109BC00090938705A0938805B093890580918605B9 |
:109BD00090918705A0918805B0918905B7FF02C0D3 |
:109BE0000C947A62892F9A2FAB2FBB27A7FDBA95C9 |
:109BF000C090CA04D090CB04C80ED91EAD892A2FBC |
:109C0000332780918E0590918F052817390724F40A |
:109C100030938F0520938E05BF89BB2379F02B2FBE |
:109C2000332727FD309580918E0590918F05281759 |
:109C3000390724F430938F0520938E0529853A85C2 |
:109C40004B855C85213831054105510574F08091C3 |
:109C500041059091420520918E0530918F05820F2C |
:109C6000931F909342058093410589859A85AB8522 |
:109C7000BC8580589F4FAF4FBF4F0CF0FBC2809107 |
:109C800041059091420520918E0530918F05821BF0 |
:109C9000930B9093420580934105ECC29090160A75 |
:109CA0006FEF961611F40C9459598091FA08A82E6A |
:109CB000BB24CC24DD2468A579A58AA59BA5A60193 |
:109CC00095010E941D6D79018A01809195099091FD |
:109CD0009609AA2797FDA095BA2FE81AF90A0A0B48 |
:109CE0001B0B6C8D7D8D8E8D9F8DA60195010E9425 |
:109CF0001D6D59016A018091B1099091B209AA279D |
:109D000097FDA095BA2FA81AB90ACA0ADB0A292C0E |
:109D1000332427FC3094432C532CC201B101A801F9 |
:109D200097010E94A96C97FD8AC23B014C01F9E0A2 |
:109D30009594879477946794FA95D1F7C201B1010D |
:109D4000A60195010E94A96C97FF02C00C94865D44 |
:109D50005B016C01E9E0D594C794B794A794EA95A8 |
:109D6000D1F78091B2049091B304813491053CF411 |
:109D70008091B0049091B10481349105C4F0D40174 |
:109D8000C30197FE02C00C94B75E3C014D0195944F |
:109D9000879477946794D601C501D7FE02C00C94CE |
:109DA000B25E5C016D01D594C794B794A79480917D |
:109DB000E608E82FFF27EE0FFF1FEF54F74F8081D3 |
:109DC00091810190F081E02DF7FF02C00C94815D3C |
:109DD0007A97A4F0C401B30123E030E040E050E002 |
:109DE0000E941D6D39014A01C601B50123E030E032 |
:109DF00040E050E00E941D6D59016A018091180AEF |
:109E0000282F332727FD3095432F532F261537054D |
:109E10004805590514F439014A01992787FD9095A1 |
:109E2000909581959F4FAA2797FDA095BA2F681608 |
:109E300079068A069B0614F43C014D012A153B0560 |
:109E40004C055D0514F459016A01A816B906CA0645 |
:109E5000DB0614F45C016D0180910B0590910C05FB |
:109E6000A0910D05B0910E0586199709A809B909A9 |
:109E700080930B0590930C05A0930D05B0930E05F0 |
:109E80008091030590910405A0910505B091060508 |
:109E90008A199B09AC09BD098093030590930405B9 |
:109EA000A0930505B093060580910E0490910F04D0 |
:109EB0008F3F910511F008F081CAA8A8B9A8CAA8D7 |
:109EC000DBA8A0926009B0926109C0926209D092A9 |
:109ED0006309CCA4DDA4EEA4FFA4C0925209D092E1 |
:109EE0005309E0925409F09255090091E9040AA33C |
:109EF000A090D704B090D804C501B7FE1BC2882734 |
:109F000099278A199B0916C210921B0510921C05ED |
:109F100010921D0510921E0510921705109218053B |
:109F20001092190510921A0510926B0910926C0983 |
:109F300010926D0910926E091092720910927309B5 |
:109F400010927409109275091CA61DA61EA61FA6C4 |
:109F500020E030E040E050E028AB39AB4AAB5BABEF |
:109F600080910B0590910C05A0910D05B0910E0507 |
:109F70008093070590930805A0930905B0930A05FF |
:109F80008091030590910405A0910505B091060507 |
:109F90008093FF0490930005A0930105B093020500 |
:109FA00010920F0410920E041092C9041092C8046B |
:109FB0001092CB041092CA0438A1332309F0F5C9DA |
:109FC0004E89442309F0F1C9E3C9B0916809B9A3E6 |
:109FD00055C9C090E308AC2DBB27AA0FBB1FFD01DC |
:109FE000EF54F74F80809180D090E4084D2D552795 |
:109FF000440F551FCA018F54974FFC016080718038 |
:10A00000A953B74F0D911C914953574FDA01ED9069 |
:10A01000FC900C94EA44BFEF8E3F9B070CF05EC0AF |
:10A0200002960C946B45B901615070404091D9047F |
:10A030005091DA04CA0157FF02C00C941846959556 |
:10A0400087959595879597FF02C00C94214620919E |
:10A05000B0043091B1042817390714F00C942D4640 |
:10A06000CA0157FF02C00C942C5D97FF02C00C94EC |
:10A07000395D9C0135952795359527952536310510 |
:10A0800014F40C942F4624E630E08091AD0484FF54 |
:10A0900002C00C9435463093B1042093B004709301 |
:10A0A000B3046093B2040C943D4610937809409138 |
:10A0B000DB045091DC04CA0157FD02C00C94E94551 |
:10A0C0000396959587959595879597FD02C00C9475 |
:10A0D000F145909581959F4F0C94F1451092D804CD |
:10A0E0001092D7040C946F45982F0C94F44681E09D |
:10A0F0008093C3040C94E94681E08093C204582FF6 |
:10A100000C94BC4681E08093C4040C94924681E098 |
:10A110008093C5040C94654680918507282F3327CA |
:10A1200027FD30958091F508482F5527249FC001C1 |
:10A13000259F900D349F900D11242091DB043091C8 |
:10A14000DC04820F931F9093DC048093DB048091E6 |
:10A150008607992787FD9095849F5001859FB00CB5 |
:10A16000949FB00C1124C5012091D9043091DA04D8 |
:10A17000820F931F9093DA048093D904809187070C |
:10A18000992787FD90952091D7043091D804820FAC |
:10A19000931F9093D8048093D70480918907282F28 |
:10A1A000332727FD30958091F0089927289FA0013B |
:10A1B000299F500D389F500D112450938B034093CD |
:10A1C0008A038091880799278E159F0514F00C94B7 |
:10A1D000CB459093D6048093D5040C94CF459093AF |
:10A1E000C6048093C7040C9408498091D404882342 |
:10A1F00011F40C9422478091AE049091AF04FFEFCC |
:10A200008F3F9F0711F40C94264701969093AF045B |
:10A210008093AE040C9426471092C3040C94E94634 |
:10A220001092C20450E00C94BC461092C4040C94EA |
:10A230009246C090F104D090F2040C9430446150E6 |
:10A240007E4F8F4F9F4F71CD60E070E06B01109299 |
:10A25000E9041AA2E0906B09F0906C0900916D0975 |
:10A2600010916E0960907209709073098090740962 |
:10A270009090750980917809882309F0B6C71092EB |
:10A28000CB041092CA041092C9041092C804E09240 |
:10A290009405F092950500939605109397056092AA |
:10A2A00098057092990580929A0590929B0510925C |
:10A2B0001B0510921C0510921D0510921E05109290 |
:10A2C0001705109218051092190510921A05109290 |
:10A2D0001305109214051092150510921605109290 |
:10A2E0006B0910926C0910926D0910926E09109210 |
:10A2F00072091092730910927409109275091092E4 |
:10A30000600910926109109262091092630910921B |
:10A310005209109253091092540910925509109243 |
:10A320000F0410920E04A090D704B090D804C50179 |
:10A33000B7FCE5CD409774F068EE262E63E0362E2C |
:10A340003092AB032092AA031FA114FD03C081E049 |
:10A3500080938105D090F708ED2CFF24002711276A |
:10A36000B501882777FD8095982F9501B7FC85C7A3 |
:10A37000442737FD4095542F0E94A96C9B01AC01E6 |
:10A38000C801B7010E94A96C97FD72C759E0959565 |
:10A390008795779567955A95D1F79B018D2D9927CC |
:10A3A0008A9DA0018B9D500D9A9D500D1124CA01CC |
:10A3B00057FD52C79595879595958795280F391F15 |
:10A3C000C901AA2797FDA095BA2F8093670590939E |
:10A3D0006805A0936905B0936A05E090FB04F090CE |
:10A3E000FC040091FD041091FE04E81AF90A0A0B1E |
:10A3F0001B0B51E5E51653ECF50650E0050750E060 |
:10A4000015070CF4E9C680E593ECA0E0B0E080937A |
:10A41000FB049093FC04A093FD04B093FE04809190 |
:10A42000FB049091FC04A091FD04B091FE04805BBC |
:10A430009C43AF4FBF4F64F480EB9CE3AFEFBFEFA3 |
:10A440008093FB049093FC04A093FD04B093FE045E |
:10A45000C090F104D090F204C114D10409F4B5C540 |
:10A460007FA173FFB2C588A599A5AAA5BBA5B7FF13 |
:10A4700002C00C94545D09E0B595A7959795879512 |
:10A480000A95D1F79BAF8AAF97FF02C00C947A5D13 |
:10A490008C8D9D8DAE8DBF8DB7FF02C00C94745D09 |
:10A4A00019E0B595A795979587951A95D1F7BC01B1 |
:10A4B00097FF02C00C946F5DAAADBBADA617B7079E |
:10A4C00014F47BAF6AAF6AAD7BAD77FF02C00C942A |
:10A4D0006B5D2B015594479455944794559447943C |
:10A4E0000894411C511CECE1F2E0CE0EDF1E760117 |
:10A4F0000027F7FC0095102FA4EEAA2EADEFBA2E80 |
:10A50000CA0CDB1C6090AD097090AE098090AF0959 |
:10A510009090B00920918603309187034091880381 |
:10A5200050918903288F398F4A8F5B8FC401B30103 |
:10A530000E941D6DE21AF30A040B150BC801B70146 |
:10A5400028E631E040E050E00E941D6DDC01CB01C7 |
:10A550008C01045B1040A090A609B090A709C5012A |
:10A56000B7FE02C00C94655D8138910514F000E0DF |
:10A5700010E02090AA033090AB0321143104A9F419 |
:10A580004AAD5BAD4931510584F48091E704909167 |
:10A59000E804800F911F9093E8048093E704809172 |
:10A5A0008105882311F00C94D25DC801880F991F92 |
:10A5B000880F991F880F991FB2010E94E86C9B01B8 |
:10A5C000442737FD4095542F260D371D481D591D32 |
:10A5D0002093AD093093AE094093AF095093B00971 |
:10A5E000F0909B036F2D7727AAADBBAD6A9FC0018A |
:10A5F0006B9F900D7A9F900D112497FF02C00C94D1 |
:10A60000625D95958795959587959595879595958F |
:10A61000879595958795681B790B7BAF6AAF77FF18 |
:10A6200002C00C945A5D2114310411F00C94995D10 |
:10A630000091B2041091B3048091B0049091B104E0 |
:10A64000080F191F17FF02C00C94E25E15950795BD |
:10A650001595079515950795005C1F4FCA01B9011F |
:10A66000288D398D4A8D5B8D0E941D6DDA01C901DF |
:10A670002091EF043091F004442737FD4095542F8A |
:10A68000821B930BA40BB50B845E9D4FAF4FBF4F46 |
:10A69000BC01CD0128E631E040E050E00E941D6D94 |
:10A6A000DC01CB01845B90402AAD3BAD829FF00181 |
:10A6B000839FF00D929FF00D1124CF01B8010E94ED |
:10A6C000E86C83E0F89EA00111245BAF4AAF461707 |
:10A6D000570714F00C948C5DBA01CB01AA2797FDA3 |
:10A6E000A095BA2F2091FB043091FC044091FD0409 |
:10A6F0005091FE04820F931FA41FB51F8093FB048B |
:10A700009093FC04A093FD04B093FE048091800517 |
:10A7100081508F3F09F462C4809380055AA155236C |
:10A7200081F01092630510926405109265051092F5 |
:10A73000660510925F0510926005109261051092F7 |
:10A74000620568A1662309F044C5809178099927BC |
:10A75000AA27BB27BC01CD0128A539A54AA55BA521 |
:10A760000E94A96CDC01CB01BC01CD0128EF3AE2CB |
:10A7700040E050E00E941D6D19017E89772309F0A9 |
:10A7800025C5809178099927AA27BB27BC01CD014F |
:10A790002C8D3D8D4E8D5F8D0E94A96CDC01CB010F |
:10A7A000BC01CD0128EF3AE240E050E00E941D6D6F |
:10A7B0003C832B8380904C0990904D0989EC88163E |
:10A7C00091040CF4F8C4B8EC8B2E912C90924D09A6 |
:10A7D00080924C090091570910915809093C1105C4 |
:10A7E0000CF4E1C408EC10E01093580900935709E9 |
:10A7F0008091590990915A09AA2797FDA095BA2FDF |
:10A800002091AB09C22EDD24EE24FF24BC01CD0132 |
:10A81000A70196010E94A96C9B01AC01C401AA2763 |
:10A8200097FDA095BA2FF7E0880F991FAA1FBB1FAD |
:10A83000FA95D1F7280F391F4A1F5B1F57FD13C523 |
:10A84000E6E05595479537952795EA95D1F741016B |
:10A85000820E931E240180914A0990914B09AA27E8 |
:10A8600097FDA095BA2FBC01CD01A70196010E94CA |
:10A87000A96C9B01AC01C801AA2797FDA095BA2F2E |
:10A8800077E0880F991FAA1FBB1F7A95D1F7280F71 |
:10A89000391F4A1F5B1F57FDE1C466E05595479578 |
:10A8A000379527956A95D1F76B807C80620E731E71 |
:10A8B0006301AA0CBB1CC501AA2797FDA095BA2F5E |
:10A8C00020915109332744275527BC01CD010E940F |
:10A8D000A96C7B018C0197FD91C456E015950795F5 |
:10A8E000F794E7945A95D1F739A1832F9927AA278E |
:10A8F000BB2720910F053091100540911105509113 |
:10A900001205BC01CD010E94A96CDC01CB01BC0188 |
:10A91000CD0120EF35E540E050E00E941D6D57016C |
:10A92000A20EB31EC50141E0841640E4940624F053 |
:10A93000812C40E4942E240150E0851650EC9506BD |
:10A940000CF02CC4812C30EC932E90925A098092FA |
:10A95000590961E0661660E4760624F0612C20E473 |
:10A96000722E630170E0671670EC77060CF011C46C |
:10A97000612C00EC702E70924B0960924A09A1E0A4 |
:10A98000AA16A0E4BA0624F0A12C10E4B12EC50149 |
:10A99000B0E0AB16B0ECBB060CF0F6C3A12CB0ECEB |
:10A9A000BB2EB092A709A092A60980910001482F62 |
:10A9B000552780912703909128034817590794F44D |
:10A9C0002091270330912803E981FA814E9FC0012D |
:10A9D0004F9F900D5E9F900D1124B9010E94D46C81 |
:10A9E0007A836983C980DA80CC0CDD1CCC0CDD1C39 |
:10A9F000DA82C982DFA0D0FE51C00E89002309F09F |
:10AA00004DC018A1112309F049C08091A005909173 |
:10AA1000A105909352088093510880911004909161 |
:10AA2000110490934C0880934B0820914505309178 |
:10AA300046052115310509F02EC580911D03909121 |
:10AA40001E038959934010F00C94755E80911D038C |
:10AA500090911E038436910510F00C94F15E87B539 |
:10AA60008B3010F40C94AA5F809112048F5F809356 |
:10AA700012049AE089029001112480917508821BCA |
:10AA800087BD8CE291E09093FC038093FB038EE5FD |
:10AA900091E090934605809345051EC55090A50909 |
:10AAA00040905E09242D3327C901880F991F880F14 |
:10AAB000991F8896E981FA81E817F90714F49A83B7 |
:10AAC0008983852D9927880F991F880F991F805595 |
:10AAD0009040C980DA808C159D0514F49A8389838F |
:10AAE000809146048823A1F08091AE049091AF0438 |
:10AAF0000297C09768F4E980FA801E141F0444F49A |
:10AB000081E090E09093AF048093AE043A83298370 |
:10AB100009811A81109336080093350880916705E2 |
:10AB200090916805A0916905B0916A05880F991FF9 |
:10AB3000AA1FBB1F880F991FAA1FBB1FA81AB90AFB |
:10AB4000B9AEA8AE013A11050CF40AC3C80117FD4D |
:10AB5000AEC39595879528AD39AD8217930714F448 |
:10AB600099AF88AF909581959F4F48AD59AD4817E3 |
:10AB7000590714F499AF88AF252D3327220F331FBF |
:10AB8000220F331FC90149815A81841B950B68AD7F |
:10AB900079AD8617970714F499AF88AF89819A81A8 |
:10ABA000821B930BA8ADB9ADA817B90714F499AFE0 |
:10ABB00088AF8091DB049091DC048401081B190BA1 |
:10ABC00010936A0900936909A0907809AA2009F4F2 |
:10ABD000C1C2281A390AC101AA2797FDA095BA2F28 |
:10ABE00020915F05309160054091610550916205AB |
:10ABF000820F931FA41FB51F80935F05909360057C |
:10AC0000A0936105B093620560915F057091600546 |
:10AC100080916105909162056130BAEF7B07B0E0E9 |
:10AC20008B07B0E09B0774F080E09AEFA0E0B0E003 |
:10AC300080935F0590936005A0936105B0936205D2 |
:10AC4000BC01CD016030E6E07E07EFEF8E07EFEF4D |
:10AC50009E0774F480E096E0AFEFBFEF80935F054E |
:10AC600090936005A0936105B0936205BC01CD018E |
:10AC7000E090A003F090A1039701442737FD409591 |
:10AC8000542F0E941D6D6801C20ED31EB0908C031C |
:10AC90006B2D77278827992728AD39AD37FDD8C286 |
:10ACA00037FDD3C23595279509811A81200F311FB1 |
:10ACB000442737FD4095542F0E94A96C97FDA7C2E9 |
:10ACC00026E095958795779567952A95D1F79B010D |
:10ACD0006C157D050CF46B01309521953F4FC21624 |
:10ACE000D3060CF469018091D9049091DA048301B0 |
:10ACF000081B190B1093490900934809AA2009F46D |
:10AD000023C22B813C81281B390BC901AA2797FD3F |
:10AD1000A095BA2F20916305309164054091650597 |
:10AD200050916605820F931FA41FB51F8093630582 |
:10AD300090936405A0936505B093660560916305E3 |
:10AD400070916405809165059091660561303AEFD8 |
:10AD5000730730E0830730E0930774F080E09AEFE8 |
:10AD6000A0E0B0E08093630590936405A09365052F |
:10AD7000B0936605BC01CD01603046E074074FEF2B |
:10AD800084074FEF940774F480E096E0AFEFBFEFD5 |
:10AD90008093630590936405A0936505B093660561 |
:10ADA000BC01CD019701442737FD4095542F0E94E7 |
:10ADB0001D6D7801E20EF31E6B2D772788279927EA |
:10ADC00028AD39AD37FD3DC237FD26C235952795F3 |
:10ADD000A981BA812A0F3B1F442737FD4095542F84 |
:10ADE0000E94A96C97FD28C216E0959587957795E6 |
:10ADF00067951A95D1F79B016E157F050CF47B01C1 |
:10AE0000309521953F4FE216F3060CF47901860147 |
:10AE1000222717FD2095322F0D871E872F87388B0D |
:10AE2000242D33273DAB2CAB452D55275FAB4EABC7 |
:10AE3000B8E9CB2EB9E0DB2E05ED15E0270166243D |
:10AE400057FC6094762C68AD79AD4B01AA2497FC31 |
:10AE5000A094BA2CABE03A2EF9E7EF2EF9E0FF2EE2 |
:10AE600007C0FBAFEAAFEAADD601EC930C94D76212 |
:10AE7000F801258512160CF08FC049815A81CA014C |
:10AE8000AA2797FDA095BA2F332727FD3095432F8A |
:10AE9000532FBC01CD010E94A96C97FD8FC0E6E045 |
:10AEA0009595879577956795EA95D1F77BAF6AAFCA |
:10AEB000F8018685282F332727FD3095432F532F00 |
:10AEC0006D857E858F8598890E94A96C97FD71C0DC |
:10AED00056E095958795779567955A95D1F72AAD60 |
:10AEE0003BAD260F371F3BAF2AAFF8018785282FD0 |
:10AEF000332727FD3095432F532FC301B2010E9402 |
:10AF0000A96C97FD51C046E0959587957795679513 |
:10AF10004A95D1F72AAD3BAD260F371F3BAF2AAF7D |
:10AF2000F8018089282F332727FD3095432F532F91 |
:10AF3000C501B4010E94A96CDC01CB01B7FD30C092 |
:10AF400036E0B595A795979587953A95D1F7F7018E |
:10AF5000608171812AAD3BAD820F931F0E94453104 |
:10AF6000D7018D939C9397FD2EC0959587959595C8 |
:10AF700087959BAF8AAFECA9FDA98E179F070CF4AC |
:10AF800070CF2EA93FA94AAD5BAD241735070CF051 |
:10AF90006ACF3BAF2AAF67CFD6011C920C94D76221 |
:10AFA000CF96A11DB11DCCCF615C7F4F8F4F9F4FBE |
:10AFB000AACF615C7F4F8F4F9F4F8ACF615C7F4FDD |
:10AFC0008F4F9F4F6CCF0396D0CFA090A609B09023 |
:10AFD000A70980918005815008F09ECB88E180937D |
:10AFE00080058091FA089927880F991F880F991F6B |
:10AFF0007C010027F7FC0095102F68A579A58AA58C |
:10B000009BA5A80197010E941D6D309328082093ED |
:10B0100027086C8D7D8D8E8D9F8DA80197010E94D4 |
:10B020001D6D30932A0820932908809195099091ED |
:10B03000960997FD0FC5959587959595879590935A |
:10B040002C0880932B088091B1099091B20997FD4B |
:10B05000FFC4959587959595879590932E08809335 |
:10B060002D08B0923008A0922F088091D0049091C2 |
:10B07000D104A091D204B091D304BC01CD0125E04C |
:10B0800030E040E050E00E941D6D30933208209384 |
:10B09000310880916B0890916C08909334088093EC |
:10B0A0003308D0923808C0923708809127039091D6 |
:10B0B000280390933A08809339088091DE049927F9 |
:10B0C00090933C0880933B088091AD099091AE0924 |
:10B0D000A091AF09B091B009209186033091870308 |
:10B0E0004091880350918903BC01CD010E941D6DE0 |
:10B0F00030933E0820933D088091100490911104F4 |
:10B1000090934C0880934B088091800799279093E7 |
:10B110004E0880934D088091F7039091F803909327 |
:10B12000500880934F088091C1059091C20590937B |
:10B130006408809363088091BF059091C005909347 |
:10B14000660880936508EACAC801AA2797FDA095FA |
:10B15000BA2FE0CDC801AA2797FDA095BA2F40CD00 |
:10B1600068AD79AD6135710524F080E590E099AF67 |
:10B1700088AFA8ADB9ADA05BBF4F0CF0FDCC00EB24 |
:10B180001FEF19AF08AFF8CC9093A7098093A609D9 |
:10B190000CCCD0924B09C0924A09F1CB50925A097B |
:10B1A00040925909D6CBAFEF08331A070CF020CBE9 |
:10B1B00008E31FEF19CB98E389169FEF99060CF06F |
:10B1C00009CBA8E38A2EAFEF9A2E00CB1C821B82FC |
:10B1D000F1CA22243324D1CAE092FB04F092FC0489 |
:10B1E0000093FD041093FE041AC9D092CB04C092C0 |
:10B1F000CA047093C9046093C80449C82FE330E0BF |
:10B2000040E050E0E20EF31E041F151F66CB615CA8 |
:10B210007F4F8F4F9F4F54CD2F5F3F4F35952795D1 |
:10B22000A981BA812A0F3B1F442737FD4095542F2F |
:10B230000E94A96C97FFD8CD615C7F4F8F4F9F4FC5 |
:10B24000D3CD309521953F4FBFCD2F5F3F4F2ACDB6 |
:10B25000309521953F4F24CD0396ACC8215C3F4FDC |
:10B260004F4F5F4F1ACB215C3F4F4F4F5F4FE8CAA4 |
:10B2700061507E4F8F4F9F4F89C8222733272A194D |
:10B280003B0976C88091AD0482608093AD040C9434 |
:10B2900041471092D6041092D5040C94D7454D5FC7 |
:10B2A0005F4F0C9439454D5F5F4F0C9402450196FA |
:10B2B00050CC8091FA08E82EFF240027112768A5BA |
:10B2C00079A58AA59BA5A80197010E941D6D39014A |
:10B2D0004A018091950990919609AA2797FDA0951A |
:10B2E000BA2F681A790A8A0A9B0A6C8D7D8D8E8D19 |
:10B2F0009F8DA80197010E941D6D59016A018091DF |
:10B30000B1099091B209AA2797FDA095BA2FA81A62 |
:10B31000B90ACA0ADB0AD401C30197FC4FC53C0134 |
:10B320004D0154E095948794779467945A95D1F79A |
:10B33000D601C501D7FC3EC55C016D0144E0D59442 |
:10B34000C794B794A7944A95D1F78091B20490918D |
:10B35000B304813491050CF4F5C3C401B30123E0B7 |
:10B3600030E040E050E00E941D6D39014A01C60105 |
:10B37000B50123E030E040E050E00E941D6D59012E |
:10B380006A018091E608E82FFF27EE0FFF1FEF54B8 |
:10B39000F74F808191810190F081E02DF7FD06C586 |
:10B3A0007A97A4F0C401B30123E030E040E050E01C |
:10B3B0000E941D6D39014A01C601B50123E030E04C |
:10B3C00040E050E00E941D6D59016A0171E267166C |
:10B3D0007104810491042CF030E2632E712C812CD5 |
:10B3E000912C80EE68168FEF78068FEF88068FEF2E |
:10B3F000980644F420EE622E2FEF722E2FEF822E4D |
:10B400002FEF922E91E2A916B104C104D1042CF0C1 |
:10B4100090E2A92EB12CC12CD12CA0EEAA16AFEF30 |
:10B42000BA06AFEFCA06AFEFDA0614F00C942C4F51 |
:10B4300080EEA82E8FEFB82E8FEFC82E8FEFD82E6C |
:10B440000C942C4F03EDC02E0FEFD02E0C943044F3 |
:10B450003090E608E32DFF27EE0FFF1FEF54F74F64 |
:10B46000808191810190F081E02DF7FDB6C4E53631 |
:10B47000F1050CF08DC3F39734F0C501B7FC08C794 |
:10B480005C01B594A7941A141B040CF042C4C0903C |
:10B49000E3080C94EC448091D0049091D104A091E5 |
:10B4A000D204B091D304F4E0880F991FAA1FBB1FE8 |
:10B4B000FA95D1F78093130490931404A093150484 |
:10B4C000B0931604109211041092100421503040D1 |
:10B4D00030934605209345054FA141FF2DC0809133 |
:10B4E0009E03823308F00AC48091CB0381508F3FC2 |
:10B4F00009F416C48093CB0341C010927E05E32D5E |
:10B50000FF27EE0FFF1FEF54F74F808191818C349E |
:10B5100091050CF499C280917F058F5F893C08F4F6 |
:10B52000F4C31092D40488EC80937F051092AF048A |
:10B530001092AE040C94F64320919E0380918A03EE |
:10B5400090918B03820F911D2091F0083327829FE9 |
:10B55000B001839F700D929F700D1124CB01AA271B |
:10B5600097FDA095BA2F8093CC049093CD04A0931F |
:10B57000CE04B093CF0481E08093EA04E090860388 |
:10B58000F0908703009188031091890368A579A53D |
:10B590008AA59BA5A80197010E941D6D59016A010A |
:10B5A0006C8D7D8D8E8D9F8DA80197010E941D6DE4 |
:10B5B000B901C5010E94986B6C01CD971CF0ECE3BA |
:10B5C000CE2ED12CC6010E943E6A6C018091EA0405 |
:10B5D000882309F469C18091AD0499279C012071E9 |
:10B5E000307084FD61C1B0903B09B0FC04C0809113 |
:10B5F000EB0881FDDFC409811A8130939D052093FA |
:10B600009C056090D0047090D1048090D2049090FA |
:10B61000D3048091CC049091CD04A091CE04B0913C |
:10B62000CF0486159705A805B90514F0B0FC52C1E2 |
:10B63000E090D004F090D1048091CC049091CD049E |
:10B64000E81AF90A80919D0399278E9D90018F9D9C |
:10B65000300D9E9D300D1124C90137FD12C6959500 |
:10B660008795959587959595879595958795081BC9 |
:10B67000190B209110043091110437FDFFC5359549 |
:10B6800027953595279535952795293031050CF463 |
:10B690000CC428E030E0229FA001239F500D329F70 |
:10B6A000500D11249A0157FDE6C53595279535951E |
:10B6B00027958091100490911104280F391F8091D3 |
:10B6C0009F039927AA27BB27442737FD4095542F6E |
:10B6D000BC01CD010E94A96C97FDBAC5B7E0959554 |
:10B6E000879577956795BA95D1F79B015FEF61389C |
:10B6F00075070CF0D2C321E83FEF021B130B6090DB |
:10B70000F3047090F4048090F5049090F60497FC94 |
:10B71000A9C5A7E09594879477946794AA95D1F7E3 |
:10B7200080919C03282F332744275527C401B30158 |
:10B730000E94A96C97FD91C5F5E095958795779541 |
:10B740006795FA95D1F79B017FEF213837070CF009 |
:10B750007CC321E83FEF021B130B85E990E0E80E64 |
:10B76000F91E9BE2E91691E0F906E8F480919C0548 |
:10B7700090919D05892BB9F48091A0059091A10528 |
:10B780001816190684F48091A2059091A305081754 |
:10B7900019070CF4DBC28091C9039091CA0380178A |
:10B7A00091070CF4D3C28091450590914605892BF1 |
:10B7B00021F00091A0051091A10580919A0399278D |
:10B7C000AA27BB2720911A0A332727FD3095432F3C |
:10B7D000532FBC01CD010E94A96C97FD54C5E7E031 |
:10B7E0009595879577956795EA95D1F79B01AFEF8A |
:10B7F00061387A070CF021C321E83FEF021B130BDD |
:10B80000C801AA2797FDA095BA2F5DE0880F991F60 |
:10B81000AA1FBB1F5A95D1F79601442737FD4095C3 |
:10B82000542FBC01CD010E941D6D20936F053093F4 |
:10B830007005409371055093720500916F0510914A |
:10B84000700580919E0590919F059C01220F331FEA |
:10B85000280F391F200F311F37FD1CC5A901559531 |
:10B86000479555954795BA018091EC08282F3327C5 |
:10B87000220F331F220F331F421753070CF0CCC285 |
:10B88000A901B9015090A509B0FEA0C2E981FA81D1 |
:10B89000E417F5070CF09AC2AF01F0939F05E0930F |
:10B8A0009E055A83498318C06091F408662309F401 |
:10B8B00052C17727663471050CF04AC226E430E0A5 |
:10B8C0003093C8032093C703E980FA80F0929F0564 |
:10B8D000E0929E055090A5098091AD0481FFA7C01C |
:10B8E0008091AD0484FDA3C0E090A405F090A5056F |
:10B8F0000091A6051091A705E114F10401051105B9 |
:10B90000B1F429813A8179010027F7FC0095102FC5 |
:10B91000ECE0EE0CFF1C001F111FEA95D1F7E0923E |
:10B92000A405F092A5050093A6051093A7058091A4 |
:10B93000100490911104809110049091110497FDCE |
:10B9400032C4843691050CF072C069817A819B0102 |
:10B95000442737FD4095542FC601AA2797FDA0958F |
:10B96000BA2FBC01CD010E94A96C97FDB8C49B0100 |
:10B97000AC017DE055954795379527957A95D1F798 |
:10B9800020936F05309370054093710550937205B5 |
:10B990008091AE049091AF0477E0803D970708F066 |
:10B9A000ECC2D801C70169E0B695A7959795879530 |
:10B9B0006A95D1F7E81AF90A0A0B1B0BDA01C901DB |
:10B9C00023E0880F991FAA1FBB1F2A95D1F7E80E05 |
:10B9D000F91E0A1F1B1FE092A405F092A505009313 |
:10B9E000A6051093A705D801C7011CE0B695A79539 |
:10B9F000979587951A95D1F79093A1058093A00507 |
:10BA00004091F208442309F4ADC255279C01BA01C4 |
:10BA10000E94E86CC901861B970B9093A305809345 |
:10BA2000A205260F371F3093CA032093C903A090A5 |
:10BA3000A609B090A7098090590990905A09609082 |
:10BA40004A0970904B092CC810927F050C94F6435C |
:10BA50000396FFCA0396EFCA909581959F4F0C9469 |
:10BA6000355003960C940346909581959F4F0C9406 |
:10BA7000FF4503960C9439506150704E8F4F9F4F85 |
:10BA80000C94D5446150704E8F4F9F4F0C94AE4430 |
:10BA90006150704E8F4F9F4F0C9482446150704E96 |
:10BAA0008F4F9F4F0C945B4481509E4FAF4FBF4FC1 |
:10BAB0000C943B5284EF91E09093AB038093AA03E4 |
:10BAC0000C9486534F960C940153882799278A1912 |
:10BAD0009B090C94B452695F7F4F0C946952709526 |
:10BAE00061957F4F0C945C5281509E4FAF4FBF4F7A |
:10BAF0000C945052909581959F4F9BAF8AAF0C94B8 |
:10BB00004852F095E195FF4F0C94E84E61507E4FFE |
:10BB10008F4F9F4F0C94A84E8AAD9BAD9095819509 |
:10BB20009F4F6817790714F00C946D53BC010C9467 |
:10BB30006D530894210831083092AB032092AA0378 |
:10BB40000C9486538091B0049091B1048134910596 |
:10BB50000CF417CC02CC4091A0055091A10557FDE3 |
:10BB6000E0C155954795559547958091270390914C |
:10BB70002803209100013327489F5001499FB00CB2 |
:10BB8000589FB00C1124C501B9010E94E86C92CEF7 |
:10BB9000C50163E070E00E94E86C5B0174CC8093A7 |
:10BBA0007E05ADCCC601AA2797FDA095BA2FBC0192 |
:10BBB000CD01288D398D4A8D5B8D0E94A96C3B018A |
:10BBC0004C010E941D6D3093F0042093EF041092FD |
:10BBD00081050C94D55280819181855B9F4F0CF03B |
:10BBE00017C180917D058F5F80937D05893C10F49E |
:10BBF0000C9438482C3008F077C32998A4E0B0E0C2 |
:10BC00008FEF082E0E94456D1092D40410927D058E |
:10BC10001092AF041092AE040E94A23CA4E0B0E0E7 |
:10BC20008091390590913A0597FD6DC4892F990F40 |
:10BC3000990B082E0E94456DA5E0B0E08091390572 |
:10BC400090913A05082E0E94456DA6E0B0E08091E3 |
:10BC500037059091380597FD53C4892F990F990B9B |
:10BC6000082E0E94456DA7E0B0E0809137059091C5 |
:10BC70003805082E0E94456D08E010E080913105DE |
:10BC800090913205A0913305B0913405BC01CD01EE |
:10BC90000E94126CDC01CB019C0197FDD2C3832F63 |
:10BCA000992787FD9A95D801082E0E94456D09E0D5 |
:10BCB00010E08091310590913205A0913305B0914B |
:10BCC0003405BC01CD010E94126CDC01CB01D8010E |
:10BCD000082E0E94456D0E94B00568E770E00E9442 |
:10BCE0005B313091E5080C94384887B5853F08F002 |
:10BCF0007EC08091120481500C94375581E080936E |
:10BD0000EA0488EC8093CB0339CC80937F050C94B4 |
:10BD1000F64371E0A72EB12CC090E3080C94EC44DC |
:10BD20001092EA048091D0049091D104A091D204A1 |
:10BD3000B091D3048093CC049093CD04A093CE040F |
:10BD4000B093CF0481E08093CB0318CC8C012BCD32 |
:10BD50006739710534F186E990E09093C8038093C8 |
:10BD6000C703B2CD0196A11DB11D0C94D14E019611 |
:10BD7000A11DB11D0C94C54E81E0809381051092E8 |
:10BD80006705109268051092690510926A05109275 |
:10BD9000FB041092FC041092FD041092FE040C941B |
:10BDA00041477093C8036093C7038ECDF095E1952A |
:10BDB000FF4FF6CA0F96A11DB11DBECA0F96A11D59 |
:10BDC000B11DADCA095F1F4F0C94265370939F0598 |
:10BDD00060939E055A8349837FCDF095E195FF4F8F |
:10BDE00046CB38A13093A8053093A90575CB81E0E7 |
:10BDF0008093A90571CB80937D050C943848B0924F |
:10BE00008F05A0928E052091170A2F8B0C94BF4BA3 |
:10BE100040937D050C9438485090A509252D332773 |
:10BE2000220F331F220F331F2055304024173507B0 |
:10BE30000CF02ACDA901B90127CD6F3F710509F09A |
:10BE40000CF4DCCC2FEF30E0D9CC2F3F310509F0DA |
:10BE50000CF481CC2FEF30E07ECC2093860530931C |
:10BE600087054093880550938905109292050C949C |
:10BE70008C4D209282053092830540928405509229 |
:10BE80008505109291050C94964C109290050C9497 |
:10BE9000254C109293050C94FE4D6F3F710509F0EF |
:10BEA0000CF42BCC2FEF30E028CC121613060CF438 |
:10BEB000F2CB229FC001239F900D329F900D112441 |
:10BEC00097FD6AC395958795959587952091100460 |
:10BED00030911104281B390BF2CB0E94B00545E6C6 |
:10BEE00063EE78E00E9458058091EB0880FF10C057 |
:10BEF00080911D0390911E03875B934038F48091DD |
:10BF00001D0390911E038E5E924010F40E945A1CF5 |
:10BF10001092F9030E94A23C81E08093F903579AA2 |
:10BF2000DACE4D5F5F4F1DCE209386053093870597 |
:10BF3000409388055093890510928F0510928E05C5 |
:10BF4000E8EE2E2EE3E03E2E3092AB032092AA03C1 |
:10BF50000C94FE4D81E08093A805BECAD090E40801 |
:10BF60000C949B471092A3051092A2058FEF93E0CB |
:10BF70009093CA038093C9035ACDAFE0803A9A07E1 |
:10BF800008F095C1D801C701FAE0B695A795979535 |
:10BF90008795FA95D1F7E81AF90A0A0B1B0BDA0113 |
:10BFA000C901880F991FAA1FBB1F880F991FAA1FBD |
:10BFB000BB1F0DCD8091AD0481FF98C12091C703B7 |
:10BFC0003091C803C9010F964091D5045091D60411 |
:10BFD000841795070CF0AFC18091A805882309F05C |
:10BFE000AAC18091AA0581FFD9C28D7F6090D0043B |
:10BFF0007090D1048090D2049090D3046092CC04CD |
:10C000007092CD048092CE049092CF048160809390 |
:10C01000AA05421B530B9A012F50304037FD9DC299 |
:10C0200080919C0590919D05280F391F30939D05A7 |
:10C0300020939C0520919C0530919D05C90137FFF7 |
:10C0400004C088279927821B930B815092400CF4DF |
:10C0500024C18091F0089927829FF001839FF00D01 |
:10C06000929FF00D1124CF0160E075E00E94E86C12 |
:10C07000CB01AA2797FDA095BA2F2091CC0430912F |
:10C08000CD044091CE045091CF04820F931FA41F82 |
:10C09000B51F8093CC049093CD04A093CE04B093AD |
:10C0A000CF0410929D0510929C05B1FE06C08BE452 |
:10C0B00090E09093FC038093FB038091F408882325 |
:10C0C00009F0EBC00091A0051091A105A80117FD92 |
:10C0D0004EC2559547955595479580912703909168 |
:10C0E0002803209100013327489F7001499FF00CDD |
:10C0F000589FF00C1124C701B9010E94E86C663406 |
:10C1000071050CF02EC226E430E03093C803209372 |
:10C11000C7038091450590914605892B09F479CA9A |
:10C12000D401C3016092CC047092CD048092CE04FD |
:10C130009092CF0476CA299A0C946F477093C904E1 |
:10C140006093C804D092CB04C092CA04CB0177FD9F |
:10C15000A0C1BC0175956795C601D7FC98C16C015B |
:10C16000D594C7940C94D94A609282057092830545 |
:10C17000809284059092850510928F0510928E050D |
:10C1800088EE282E83E0382E3092AB032092AA034B |
:10C190000C94964CB095A095909581959F4FAF4F7C |
:10C1A000BF4F0C948D4B909581959F4FCACB209398 |
:10C1B000860530938705409388055093890581E073 |
:10C1C000809392050C948C4DB095A0959095819597 |
:10C1D0009F4FAF4FBF4F0C94EF4C81E0809393057E |
:10C1E0000C94FE4D20928205309283054092840586 |
:10C1F0005092850581E0809391050C94964C815076 |
:10C200009F4FAF4FBF4F0C94304A81509F4FAF4F5D |
:10C21000BF4F0C94164A81509F4FAF4FBF4F0C94A5 |
:10C22000AB4A81509F4FAF4FBF4F0C949E4A615015 |
:10C230007F4F8F4F9F4F0C946E4A61507F4F8F4FAF |
:10C240009F4F0C94584A81E0809390050C94254CA4 |
:10C2500061587F4F8F4F9F4F41CA615E7F4F8F4F15 |
:10C260009F4F6ACA6FE770E080E090E0660E771E2D |
:10C27000881E991E4ECA2D5F3F4F17CA295F3F4F38 |
:10C28000FEC90F96ECC961587F4F8F4F9F4FA7CAC9 |
:10C290000196F6C82D5F3F4FE1CA0091A0051091AD |
:10C2A000A10537CFF095E195FF4F0C941A488054C3 |
:10C2B0009F4108F08CC0D801C7017BE0B695A795D7 |
:10C2C000979587957A95D1F7E81AF90A0A0B1B0B0F |
:10C2D000DA01C901820F931FA41FB51F78CB6150EB |
:10C2E000704E8F4F9F4F43CB299A88CC6090D004DB |
:10C2F0007090D1048090D2049090D304D401C301F3 |
:10C3000080599140A040B0408093CC049093CD04DC |
:10C31000A093CE04B093CF042091F408222309F413 |
:10C3200053C033273093C8032093C7030091A0055F |
:10C330001091A10576C9C9010F97481759070CF04C |
:10C3400058C08091A905882309F053C08091AA059F |
:10C3500080FF15C18E7F6090D0047090D1048090D2 |
:10C36000D2049090D3046092CC047092CD04809259 |
:10C37000CE049092CF0482608093AA05421B530B97 |
:10C380009A01215F3F4F37FD03C180919C05909139 |
:10C390009D05821B930B90939D0580939C054ACE2F |
:10C3A000209386053093870540938805509389052F |
:10C3B0000C94744D2093860530938705409388052F |
:10C3C000509389050C94E64D28E730E0ABCFD801B7 |
:10C3D000C7016CE0B695A795979587956A95D1F7B3 |
:10C3E000E81AF90A0A0B1B0BE20EF31E041F151FB5 |
:10C3F000F2CA2091AA05822F992783709070892B09 |
:10C4000041F12C7F2093AA0510929D0510929C0566 |
:10C410006090D0047090D1048090D2049090D304A6 |
:10C420006092CC047092CD048092CE049092CF049E |
:10C43000B1FE00CE84EF91E09093FC038093FB0368 |
:10C44000F9CD21503F4F2BCCF095E195FF4F0C9447 |
:10C45000D14A6090D0047090D1048090D204909022 |
:10C46000D304E8CDB095A095909581959F4FAF4F9F |
:10C47000BF4F0C943E4D81509F4FAF4FBF4F0C9418 |
:10C48000804D81509F4FAF4FBF4F0C948A4C019607 |
:10C4900066CE01965ECEB095A095909581959F4F02 |
:10C4A000AF4FBF4F0C94434CB095A095909581959C |
:10C4B0009F4FAF4FBF4F0C94DC4B295F3F4F4F4F07 |
:10C4C0005F4F0C94FB4B21503E4F4F4F5F4F0C94EE |
:10C4D000E24B295F3F4F4F4F5F4F0C94C94D815046 |
:10C4E0009F4FAF4FBF4F0C941D4CF095E195FF4F00 |
:10C4F0000C94974781509F4FAF4FBF4F0C94F24D14 |
:10C5000081509F4FAACB81509F4F90CB295F3F4FC7 |
:10C510004F4F5F4F0C94574D81509E4FAF4FBF4FC1 |
:10C520000C94424D295F3F4F4F4F5F4F0C94624C2C |
:10C5300021503E4F4F4F5F4F0C94494C21503E4F7E |
:10C540004F4F5F4F0C94B04DB095A095909581954D |
:10C550009F4FAF4FBF4F0C94AA4D309521953F4F41 |
:10C560005FCD6739710534F026E930E0CECD4D5FFF |
:10C570005F4FAFCD7093C8036093C703CACD60907F |
:10C58000D0047090D1048090D2049090D304F3CE64 |
:10C59000309521953F4FF9CE039694CC6090D0040E |
:10C5A0007090D1048090D2049090D3042FCD3A940F |
:10C5B000E2E0F0E0EE0EFF1E0C5F1F4F0894C11C7E |
:10C5C000D11C37FC02C00C943857ED960FB6F89486 |
:10C5D000DEBF0FBECDBFDF91CF911F910F91FF90B6 |
:10C5E000EF90DF90CF90BF90AF909F908F907F9013 |
:10C5F0006F905F904F903F902F9008958091B70576 |
:10C600009091B805A091B905B091BA058093AF0596 |
:10C610009093B005A093B105B093B2058091B30596 |
:10C620009091B405A091B505B091B6058093AB0586 |
:10C630009093AC05A093AD05B093AE05089510920C |
:10C64000C2051092C1051092C0051092BF05089551 |
:10C6500084B1806A84B93D9A82E58CBD1DBC459A3F |
:10C6600081E08093B7098AEA8093BB0983E88093CD |
:10C67000BC099AE09093BD091092BF091092BE09BF |
:10C680001092C1091092C0091092190A1092DD0986 |
:10C690001092DE098CE48093DF0986E08093E00944 |
:10C6A0009093E1090895EF92FF920F931F93809169 |
:10C6B000FA089927880F991F880F991F7C01002776 |
:10C6C000F7FC0095102F80912B0590912C05A091DF |
:10C6D0002D05B0912E05BC01CD01A80197010E9446 |
:10C6E0001D6D3093BF092093BE0980912305909161 |
:10C6F0002405A0912505B0912605BC01CD01A80116 |
:10C7000097010E941D6D3093C1092093C0092091AB |
:10C71000AD093091AE094091AF095091B009DA01ED |
:10C72000C901E3E0880F991FAA1FBB1FEA95D1F743 |
:10C73000820F931FA41FB51F820F931FA41FB51F45 |
:10C74000209186033091870340918803509189039B |
:10C75000BC01CD010E941D6D3093C7092093C6090D |
:10C76000E0913505F091360580916F09909170093F |
:10C77000BF010E94E86CCB019B01220F331F220FE7 |
:10C78000331F280F391F280F391F37FD1CC135955E |
:10C790002795359527953093C3092093C209809139 |
:10C7A000A9099091AA09BF010E94E86C9B01220F80 |
:10C7B000331F220F331F260F371F260F371F37FD5A |
:10C7C000FFC035952795359527953093C50920935A |
:10C7D000C409109236051092350510927009109216 |
:10C7E0006F091092AA091092A9098091BD09992791 |
:10C7F0008C30910509F4A1C08D3091050CF069C011 |
:10C800008A30910509F4A4C10B9709F410C18091F5 |
:10C81000DD09882309F4CBC02091E3093091E409B4 |
:10C82000C90181509E4F8F5F9340C8F44091E50944 |
:10C830005091E609CA0181509E4F8F5F934078F472 |
:10C840008091EB0885FF0BC03093C2052093C10592 |
:10C850005093C0054093BF058AEF8093C405809133 |
:10C86000E9099091EA0921E0893692070CF056C156 |
:10C870009C019093F2048093F1048091EF049091D5 |
:10C88000F004281B390BC901845E9D4F68E671E0F6 |
:10C890000E94E86C845B90409093EC048093EB04DE |
:10C8A0002091ED093091EE098091FB039091FC03FA |
:10C8B0008217930740F480918007882321F43093F6 |
:10C8C000FC032093FB038091E209873609F0ADC198 |
:10C8D0002AC18E30910509F476C18E3091050CF491 |
:10C8E00075C00F9709F093CF809112098093CE09FC |
:10C8F00080913A098093CF09809192038093D00967 |
:10C9000080910B098093D10980910C098093D20901 |
:10C9100080910D098093D309809191038093D4096C |
:10C9200080910F098093D509809110098093D609D1 |
:10C93000809111098093D7096ACF80918007863052 |
:10C9400018F01092800785E08093CE098091370916 |
:10C950008093CF0980913108909132089093D1094A |
:10C960008093D0098091CC049091CD04A091CE0405 |
:10C97000B091CF04BC01CD0125E030E040E050E0B3 |
:10C980000E941D6D3093D3092093D20980912D0907 |
:10C990008093D40980912E098093D50980912F0925 |
:10C9A0008093D6098091DD09882309F035CF109254 |
:10C9B000C2051092C1051092C0051092BF0535C185 |
:10C9C0002D5F3F4FFECE2D5F3F4FE1CE8091280976 |
:10C9D0008093CE09809129098093CF0980912A09FB |
:10C9E0008093D00980912B098093D10980912C09E3 |
:10C9F0008093D209809130098093D30980913109C5 |
:10CA00008093D409809132098093D50980913509AA |
:10CA10008093D609809133098093D7098091340996 |
:10CA20008093D809809136098093D909F0CEF89483 |
:10CA30008091E508E82FFF27EE0FFF1FEF54F74F17 |
:10CA40000190F081E02DE038F1050CF0D1C02FEF1E |
:10CA5000E138F20714F4E1E8FFEFE093CE098091AA |
:10CA6000E608E82FFF27EE0FFF1FEF54F74F019066 |
:10CA7000F081E02DE038F1050CF4CDC0EFE7F0E0F7 |
:10CA8000E093CF098091E408E82FFF27EE0FFF1F06 |
:10CA9000EF54F74F0190F081E02DE038F1050CF4F0 |
:10CAA000B2C0EFE7F0E0E093D0098091E308E82F0F |
:10CAB000FF27EE0FFF1FEF54F74F0190F081E02D9D |
:10CAC000E038F1050CF497C0EFE7F0E07894E093DC |
:10CAD000D1098091E5048093D2098091E304809389 |
:10CAE000D3098091E1048093D4098091DF0480937D |
:10CAF000D5098091DE048093D6098091DD0480936E |
:10CB0000D709809135089091360897FD8CC095958E |
:10CB10008795959587958093D80979CE2091F104D2 |
:10CB20003091F204AACE8091EF098093160A809189 |
:10CB3000F0098093180A8091F1098093170A809177 |
:10CB4000F2098093190A8091F30980931A0A6DC043 |
:10CB50008091C1048093CE098091C0048093CF0955 |
:10CB60008091BF048093D0098091BE048093D10945 |
:10CB70008091BD048093D2098091BC048093D30935 |
:10CB80008091BB048093D4098091BA048093D50925 |
:10CB90008091AD048093D6098091AD04837F80930A |
:10CBA000AD0480912703909128038093D709809149 |
:10CBB00000018093D809A2E0B0E00E94386D802D7A |
:10CBC0008093D90924CE8091DE098093CE0980918B |
:10CBD000DF098093CF098091E0098093D00980918B |
:10CBE000E1098093D109809102018093D2090FCE8F |
:10CBF000EFE7F0E032CF8FEFE138F8070CF066CFC7 |
:10CC0000E1E8FFEF63CF6FEFE138F6070CF04BCFB1 |
:10CC1000E1E8FFEF48CF4FEFE138F4070CF030CFF9 |
:10CC2000E1E8FFEF2DCF039672CF1F910F91FF9098 |
:10CC3000EF9008958091B709882309F43BC0459887 |
:10CC40008BEB99E09093B9098093B8098091C30563 |
:10CC5000E82FFF27E453FC4F982F9F5F808180933C |
:10CC6000BD09973008F027C09093C3051092B7090B |
:10CC70000E94536381E08093BA0900000000000025 |
:10CC800000000000000000000000000000000000A4 |
:10CC90000000000000000000000000000000000094 |
:10CCA000000000000000000000008091BB0980939C |
:10CCB000DA098EBD08951092C305D8CF2091B70927 |
:10CCC000222309F045C00DB407FE42C084E08093E2 |
:10CCD000FA03459A3EB58091C505992781309105A3 |
:10CCE00009F437C0823091050CF451C0029709F461 |
:10CCF00039C02091BA09203208F030C045980000B0 |
:10CD00000000000000000000000000000000000023 |
:10CD10000000000000000000000000000000000013 |
:10CD20000000000000000000000000000000E09192 |
:10CD3000B809F091B909E20FF11D80818EBD809193 |
:10CD4000DA099081890F8093DA092F5F2093BA095D |
:10CD50000895353551F12093C505CBCF81E08093FF |
:10CD6000B709F3CF8091DC09E82FFF27E450F64F95 |
:10CD700030838F5F8093DC098A3100F18091C60592 |
:10CD8000381711F12093DD091092C505B2CF892B18 |
:10CD900009F0AFCF2093DC093093C605313809F094 |
:10CDA000A8CF81E08093C505A4CF8091C605830FED |
:10CDB0008093C60582E08093C5059BCF8091C60510 |
:10CDC000830F8093C60595CF8AE1ECEFF9E0A2EEE0 |
:10CDD000B9E001900D928A95E1F781E08093DD0939 |
:10CDE0001092C50586CF87B18C6087B94298439869 |
:10CDF0001092C80580E88093D4031092C7058093F1 |
:10CE0000D30308958091CD0581508F3F19F0809311 |
:10CE1000CD05089584E08093CD058091AD0485FF14 |
:10CE200016C0409126094093CE0560912709609372 |
:10CE3000CF0550913909252F332724FF13C0809146 |
:10CE4000D404882379F425FF17C0429A33C0809117 |
:10CE5000DE04882334F7409122094093CE05609187 |
:10CE60002409E5CF909123099B3FB8F08091710987 |
:10CE70008D3D98F047FDE9CF4298252F332724FDBB |
:10CE80001DC0909125099B3F08F18091A409873E20 |
:10CE9000E8F067FD19C0439808959B3F20F080910A |
:10CEA00071098A3008F18091C80581508F3F21F1C6 |
:10CEB0008093C805252F332724FFE3CF8091D40426 |
:10CEC0008823F9F626FFE7CF439A08959B3F20F089 |
:10CED0008091A4098A3060F08091C70581508F3F0E |
:10CEE000E1F08093C705089547FDC6CF429AE2CF8F |
:10CEF00067FDD1CF439A0895809171098150809345 |
:10CF0000C8058091D4038130C9F086958093D403FD |
:10CF1000842309F4B1CF429ACDCF8091A4098150E6 |
:10CF20008093C7058091D303813051F0869580931B |
:10CF3000D303862309F4AFCF439A089580E8E6CF60 |
:10CF400080E8F5CF8091C9008F778093C9008091E8 |
:10CF5000C9008F7B8093C9008091C9008F7D809329 |
:10CF6000C9005A9A52981092CD0084E190E08093C3 |
:10CF7000CC008091C80082608093C80080E18093DB |
:10CF8000C9008091CA008F778093CA008091CA003F |
:10CF90008F7B8093CA008091CA008F7D8093CA00E6 |
:10CFA0008091CA008F7E8093CA008091CA00877FDB |
:10CFB0008093CA008091C9008B7F8093C9008091C3 |
:10CFC000CA0084608093CA008091CA008260809306 |
:10CFD000CA008091C80087FF0CC08091CE0080916C |
:10CFE000C800882334F48091CE008091C800882343 |
:10CFF000A4F38091C90080688093C90008951F93AD |
:10D00000CF93DF9380E197E20E94F017EC0110E0EC |
:10D010008091C9008F778093C9008091C9008F7E6D |
:10D020008093C9005A988FE198E09F938F931F9344 |
:10D030000E9471140F900F900F90CE010E94F9176B |
:10D04000882309F066C04A9BF8CF8AE590E00E94E9 |
:10D05000F017EC0185E598E09F938F931F920E9453 |
:10D060007114529A0F900F900F90CE010E94F917F1 |
:10D070008823D9F383E690E05A9A019797FFFCCF73 |
:10D080008FE891E05A98019797FFFCCF89E090E0F4 |
:10D090005A9A019797FFFCCF89E090E05A98019740 |
:10D0A00097FFFCCF8FE891E05A9A019797FFFCCF4A |
:10D0B0008FE891E05A98019797FFFCCF89E090E0C4 |
:10D0C0005A9A019797FFFCCF89E090E05A98019710 |
:10D0D00097FFFCCF8FE891E05A9A019797FFFCCF1A |
:10D0E0008FE891E05A98019797FFFCCF89E090E094 |
:10D0F0005A9A019797FFFCCF89E090E05A980197E0 |
:10D1000097FFFCCF8FE891E05A9A019797FFFCCFE9 |
:10D110000AC08BE598E09F938F931F930E94711430 |
:10D120000F900F900F9052985A980E94A267DF912B |
:10D13000CF911F9108951F920F920FB60F92112455 |
:10D14000EF92FF920F931F932F933F934F935F9311 |
:10D150006F937F938F939F93AF93BF93CF93DF93FF |
:10D16000EF93FF932091CE008091D503813009F495 |
:10D170004BC08091D0058823C9F040E050E08091F9 |
:10D18000D1058823C9F4452B09F44AC081E0809376 |
:10D19000D1058091D2058F5F8093D20543E08091C5 |
:10D1A000D2058031E8F44093D00504C141E050E05D |
:10D1B0008091D105882339F3813009F44AC0823047 |
:10D1C000B9F1833009F44AC081E08093D50310920D |
:10D1D000D2051092D40544E48091D205803118F331 |
:10D1E0008091D405882331F48091D503882311F4EC |
:10D1F000809384031092D2051092D4051092D10529 |
:10D2000084E48093D005D6C01092D50384E4809343 |
:10D21000D0051092D2051092D1051092D305CAC044 |
:10D2200044E48093D2058093D1058093D305D4CF75 |
:10D23000452B51F643E02093D3059091D2059230CF |
:10D2400009F492C083E08093D1059F5F9093D2054B |
:10D25000C3CF452B09F0B8CF82E099CF452B09F019 |
:10D26000B3CF482F82E08093D1058091D2058F5FA4 |
:10D270008093D2059091D305892F86958695E82FC6 |
:10D28000FF27EF70F0703196892F9927982F882704 |
:10D290003327822B932B93708050924063E070E091 |
:10D2A0000E94E86CEB30F10508F057C07F01EE0EEC |
:10D2B000FF1EF701EF54F74F808191819B01281BDE |
:10D2C000390BC90137FD6EC0069754F48091DE0416 |
:10D2D000883C08F05BC08091DE04865F8093DE04AA |
:10D2E000F701EF54F74F808191819C01220F331F8A |
:10D2F000280F391F260F371F37FD51C0E901D5957B |
:10D30000C795D595C795CB0101968C179D07BCF5A0 |
:10D3100021978091DE04843B60F187010953174F08 |
:10D32000F701EF54F74F80819181FE01E81BF90B63 |
:10D33000CF0163E070E00E94E86CCB01880F991F79 |
:10D34000860F971FF8019183808321EB38E0E20E6E |
:10D35000F31EF701D183C0833FCF729708F43CCF0F |
:10D3600081E08093D50338CF27FD20C01092D405EB |
:10D3700069CFF701E953F74F11821082E6CF615070 |
:10D380007040C617D7072CF62196C3CF88EC809340 |
:10D39000DE0480916F008F7D80936F00A1CF2D5FA1 |
:10D3A0003F4FACCF909581959F4F8ECF81E080937A |
:10D3B000D40548CFFF91EF91DF91CF91BF91AF910D |
:10D3C0009F918F917F916F915F914F913F912F919D |
:10D3D0001F910F91FF90EF900F900FBE0F901F9035 |
:10D3E0001895CF93FC0197FD21C0C1E028E631E0FC |
:10D3F000CF01B9010E94E86CFC018B35910554F016 |
:10D400008B5590408A35910538F484EB90E08E1B63 |
:10D410009F0BFC0141E013C0CF01855B90408A3532 |
:10D42000910548F4E45BF0404FEF09C0CFEFF09571 |
:10D43000E195FF4FDBCF2E1B3F0BF9014FEFEE0FB6 |
:10D44000FF1FE054F64F259134918C2F992787FDCB |
:10D450009095829FB001839F700D929F700D112453 |
:10D46000842F992787FD9095689FA001699F500D93 |
:10D47000789F500D1124CA01CF9108952AE530E01C |
:10D48000281B390BC9010E94F16908951F93CF939E |
:10D49000DF93EB016115710519F4009709F494C04D |
:10D4A00097FD3EC011E0209729F48AE51802B001EB |
:10D4B00011248AC0AA2797FDA095BA2F26E0880FCD |
:10D4C000991FAA1FBB1F2A95D1F79E01442737FD3C |
:10D4D0004095542FBC01CD010E941D6DF90137FD0F |
:10D4E0002CC081E0EA35F807ACF08CE1E73AF807A8 |
:10D4F000CCF02AE530E01C161D061CF5812F99277B |
:10D5000087FD9095829FB001839F700D929F700D53 |
:10D5100011245AC0EA59F74F8491282F3327EBCFB3 |
:10D520001FEFC1CF89E0ED38F8078CF485E0EA3BC6 |
:10D53000F80784F028E530E0DECFF095E195FF4F65 |
:10D54000D0CFD7FD0EC0B901645B70403DC029E566 |
:10D5500030E0D1CF84E0E731F80754F027E530E040 |
:10D56000CACF111684F764EB70E0621B730B2CC0FA |
:10D5700083E0EE32F8071CF026E530E0BCCF82E015 |
:10D58000E939F8071CF025E530E0B5CF82E0E23359 |
:10D59000F8071CF024E530E0AECF81E0E73EF80765 |
:10D5A0001CF023E530E0A7CF81E0ED3AF8071CF04E |
:10D5B00022E530E0A0CFEF57F1401CF021E530E04C |
:10D5C0009ACF20E530E097CFCB01DF91CF911F912B |
:10D5D0000895EF92FF920F931F93CF93DF937B01F8 |
:10D5E0008C0120E030E040E050E0FA01E9016FE01A |
:10D5F0000BC0C21BD30BE40BF50B2F5F3F4F4F4FFC |
:10D600005F4F615067FD31C0220F331F441F551F0C |
:10D61000CC0FDD1FEE1FFF1FCC0FDD1FEE1FFF1F06 |
:10D62000D801C7017EE1B695A795979587957A951C |
:10D63000D1F7C80FD91FEA1FFB1FEE0CFF1C001FFC |
:10D64000111FEE0CFF1C001F111F2F5F3F4F4F4F8C |
:10D650005F4FC217D307E407F50758F62150304053 |
:10D6600040405040615067FFCFCF56954795379562 |
:10D670002795CA01B901DF91CF911F910F91FF90BA |
:10D68000EF900895002422273327442751E0BB2739 |
:10D69000EE27FF27A0E1660F771F881F991F001C48 |
:10D6A000221F331F441F660F771F881F991F001CFE |
:10D6B000221F331F441F2AF4050E2B1F3E1F4F1F2E |
:10D6C00004C0051A2B0B3E0B4F0B550FBB1FEE1F53 |
:10D6D000587F556047FD5250AA95E9F6E695B795F3 |
:10D6E0005795E695B7955795852F9B2F0895222737 |
:10D6F000332741E0552768E0880F991F221F331F09 |
:10D70000880F991F221F331F1AF4240F351F02C0E0 |
:10D71000241B350B440F551F487F456037FD425091 |
:10D720006A9551F75695479556954795842F0895D4 |
:10D73000AA2797FF04C0809590958A1F9A1F77FFAC |
:10D7400004C0609570956A1F7A1F669F9001779F4D |
:10D75000A001679F300D411D5A1F300D411D5A1FFA |
:10D76000889FF001999F2E0F3F1F401D511D899FDB |
:10D77000300D411D5A1F300D411D5A1FCA01B901FC |
:10D78000112480CFFC014150504030F0019006162A |
:10D79000D1F73197CF0108958827992708955058D8 |
:10D7A000192EA6D001D08CC0BA1762077307840760 |
:10D7B0009507B1F188F40EF410940B2EBA2FA02D1A |
:10D7C000062E622F202D072E732F302D082E842F2A |
:10D7D000402D092E952F502DFF275523B9F0591BA9 |
:10D7E00049F0573E98F0469537952795A795F04014 |
:10D7F0005395C9F776F0BA0F621F731F841F30F478 |
:10D80000879577956795B795F040939517FA0F2E02 |
:10D810000895BF1BBB27BA0B620B730B840BF6CFAB |
:10D82000DEF692C097FB70D09F3738F0FEE9F91B07 |
:10D83000982F872F762F6B2F05C083C096958795DD |
:10D8400077956795F150D0F73EF490958095709557 |
:10D8500061957F4F8F4F9F4F0895E89403C097FBCA |
:10D860000EF4F3DFB62F672F782F892F9EE900245F |
:10D8700027C00ED05EF004C00BD026F001C008D047 |
:10D8800019F020F48FEF089580E0089581E0089565 |
:10D8900097FB092E052600F868942DD0E89407FC24 |
:10D8A00007C0621773078407950721F008F40094F6 |
:10D8B0000794989408959A95BB0F661F771F881F49 |
:10D8C00011249923A1F08823B2F79F3F59F0BB0F91 |
:10D8D00048F421F4002011F460FF04C06F5F7F4F13 |
:10D8E0008F4F9F4F881F9795879597F9089529C067 |
:10D8F000052E092607FA440F551F5F3F79F0AA2726 |
:10D90000A51708F051E04795880F991F9F3F31F008 |
:10D91000BB27B91708F091E0879508959F919F91D3 |
:10D92000112414C097FB880F991F9F3F31F0BB272C |
:10D93000B91708F091E0879508959F919F91112460 |
:10D9400005C0662777278827992708959FEF80ECE1 |
:10D950000895629FD001739FF001829FE00DF11D39 |
:10D96000649FE00DF11D929FF00D839FF00D749F59 |
:10D97000F00D659FF00D9927729FB00DE11DF91F05 |
:10D98000639FB00DE11DF91FBD01CF011124089562 |
:10D99000991B79E004C0991F961708F0961B881F01 |
:10D9A0007A95C9F780950895AA1BBB1B51E107C062 |
:10D9B000AA1FBB1FA617B70710F0A61BB70B881F1F |
:10D9C000991F5A95A9F780959095BC01CD010895AE |
:10D9D00097FB092E07260AD077FD04D0E5DF06D095 |
:10D9E00000201AF4709561957F4F0895F6F7909591 |
:10D9F00081959F4F0895A1E21A2EAA1BBB1BFD0122 |
:10DA00000DC0AA1FBB1FEE1FFF1FA217B307E4071D |
:10DA1000F50720F0A21BB30BE40BF50B661F771F75 |
:10DA2000881F991F1A9469F7609570958095909555 |
:10DA30009B01AC01BD01CF01089597FB092E05267E |
:10DA40000ED057FD04D0D7DF0AD0001C38F4509513 |
:10DA50004095309521953F4F4F4F5F4F0895F6F712 |
:10DA600090958095709561957F4F8F4F9F4F08954A |
:10DA7000F999FECFB2BDA1BDF89A119600B40895F0 |
:10DA8000F7DF01921A94E1F70895F999FECFB2BD3C |
:10DA9000A1BD00BC11960FB6F894FA9AF99A0FBE80 |
:0CDAA00008950190F2DF1A94E1F7089558 |
:10DAAC005E010A0151756164726F0000416E676C12 |
:10DABC00654E69636B20202020202020416E676C0E |
:10DACC0065526F6C6C202020202020204163634E17 |
:10DADC0069636B202020202020202020416363528A |
:10DAEC006F6C6C2020202020202020204779726F22 |
:10DAFC004769657220202020202020204869676813 |
:10DB0C00742056616C756520202020204163635A77 |
:10DB1C00202020202020202020202020476173203E |
:10DB2C00202020202020202020202020436F6D70DA |
:10DB3C006173732056616C7565202020566F6C7470 |
:10DB4C00616765202020202020202020456D7066F4 |
:10DB5C00616E672020202020202020204779726FC2 |
:10DB6C00204B6F6D70617373202020204D6F746F8C |
:10DB7C00722046726F6E7420202020204D6F746FBF |
:10DB8C007220526561722020202020204D6F746F0E |
:10DB9C0072204C6566742020202020204D6F746FFD |
:10DBAC0072205269676874202020202020202020B9 |
:10DBBC002020202020202020202020202020202059 |
:10DBCC002020202020202020202020205661726937 |
:10DBDC006F4D657465722020202020204D4B334DF5 |
:10DBEC0061672043616C5374617465205365727670 |
:10DBFC006F2020202020202020202020486F6F76AE |
:10DC0C006572676173202020202020202020202096 |
:10DC1C0020202020202020202020202020202020F8 |
:10DC2C0020202020202020202020202020202020E8 |
:10DC3C0020202020202020202020202020202020D8 |
:10DC4C0020202020202020202020202020202020C8 |
:10DC5C0020202020202020202020202020202020B8 |
:10DC6C002020202020202020202020204932432D3D |
:10DC7C004572726F7220202020202020202020202E |
:10DC8C002020202020202020202020204750535FBF |
:10DC9C004E69636B20202020202020204750535FAA |
:10DCAC00526F6C6C2020202020202020C8000164A2 |
:10DCBC00FF01FFFF01FC01FC0101737373FF030003 |
:10DCCC007D0000C409C40964000E48616C6C6F20AF |
:10DCDC0057656C740000000000000000000000009C |
:10DCEC000000000000000000000000000000000028 |
:10DCFC000000000000000000000000000000000018 |
:10DD0C000000000000000000000000000000000007 |
:10DD1C0000000000000000000000010203040506E2 |
:10DD2C000708090A01040B050000ECFF6440415A86 |
:10DD3C004664640A02969696960840403A10FB3068 |
:10DD4C00380190D0030090D00300F40164005370AC |
:10DD5C006F727400004E6F726D616C0000426567EB |
:10DD6C00696E6E657200007800FF03640A0B0D0B80 |
:06DD7C000C0E0F01010175 |
:00000001FF |
/branches/V0.76g-acid/Hex-Files/WasIstWas.txt |
---|
0,0 → 1,51 |
+++++++++++++++++++++++++ |
+ Flight-Ctrl: |
+++++++++++++++++++++++++ |
BootLoader_MEGA644_20MHZ_V0_1.hex |
Der Bootloader wird per ISP eingespielt |
Der Bootloader nur dann eingespielt werden, wenn noch nie ein Bootloader eingespielt wurde! |
Danach können Softwareupdates seriell eingespielt werden. |
Flight-Ctrl_MEGA644_Vx_yy.hex |
Aktuelle Firmware |
Wird per serielle Schnittstelle (durch den Bootloader) eingespielt |
//+++++++++++ |
// Quadro: |
// 1 |
// 4 3 |
// 2 |
//+++++++++++ |
// Reverse Props on 1 2 |
//+++++++++++ |
// Octo: |
// 1 2 |
// 8 3 |
// 7 4 |
// 6 5 |
//+++++++++++ |
//+++++++++++ |
// Octo2: |
// 1 |
// 8 2 |
// 7 3 |
// 6 4 |
// 5 |
//+++++++++++ |
//+++++++++++ |
// Octo3: |
// 1 |
// 2 |
// 8 7 3 4 |
// 5 |
// 6 |
//+++++++++++ |
// Reverse Props on octo: 1 3 5 7 |
/branches/V0.76g-acid/License.txt |
---|
0,0 → 1,52 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) Holger Buss, Ingo Busker |
// + Nur für den privaten Gebrauch / NON-COMMERCIAL USE ONLY |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten und nichtkommerziellen Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt und genannt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung oder Nutzung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-profit use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet, our webpage (http://www.MikroKopter.de) must be |
// + clearly linked and named as origin |
// + * porting the sources to other systems or using the software on other systems (except hardware from www.mikrokopter.de) is not allowed |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
/branches/V0.76g-acid/Settings.h |
---|
--- V0.76g-acid/Spectrum.c (nonexistent) |
+++ V0.76g-acid/Spectrum.c (revision 1400) |
@@ -0,0 +1,321 @@ |
+/*####################################################################################### |
+Decodieren eines RC Summen Signals oder Spektrum Empfänger-Satellit |
+#######################################################################################*/ |
+ |
+#include "Spectrum.h" |
+#include "main.h" |
+unsigned char SpektrumTimer = 0; |
+ |
+//--------------------------------------------------------------// |
+ |
+//--------------------------------------------------------------// |
+void SpektrumBinding(void) |
+{ |
+ unsigned int timerTimeout = SetDelay(10000); // Timeout 10 sec. |
+ unsigned char connected = 0; |
+ unsigned int delaycounter; |
+ |
+ UCSR1B &= ~(1 << RXCIE1); // disable rx-interrupt |
+ UCSR1B &= ~(1<<RXEN1); // disable Uart-Rx |
+ PORTD &= ~(1 << PORTD2); // disable pull-up |
+ |
+ printf("\n\rPlease connect Spektrum receiver for binding NOW..."); |
+ |
+ while(!CheckDelay(timerTimeout)) |
+ { |
+ if (PIND & (1 << PORTD2)) { timerTimeout = SetDelay(90); connected = 1; break; } |
+ } |
+ |
+ if (connected) |
+ { |
+ |
+ printf("ok.\n\r"); |
+ DDRD |= (1 << DDD2); // Rx as output |
+ |
+ while(!CheckDelay(timerTimeout)); // delay after startup of RX |
+ for (delaycounter = 0; delaycounter < 100; delaycounter++) PORTD |= (1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 400; delaycounter++) PORTD &= ~(1 << PORTD2); |
+ |
+ for (delaycounter = 0; delaycounter < 10; delaycounter++) PORTD |= (1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 10; delaycounter++) PORTD &= ~(1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 400; delaycounter++) PORTD |= (1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 400; delaycounter++) PORTD &= ~(1 << PORTD2); |
+ |
+ for (delaycounter = 0; delaycounter < 10; delaycounter++) PORTD |= (1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 10; delaycounter++) PORTD &= ~(1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 400; delaycounter++) PORTD |= (1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 400; delaycounter++) PORTD &= ~(1 << PORTD2); |
+ |
+ for (delaycounter = 0; delaycounter < 10; delaycounter++) PORTD |= (1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 10; delaycounter++) PORTD &= ~(1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 400; delaycounter++) PORTD |= (1 << PORTD2); |
+ |
+ } |
+ else |
+ { printf("Timeout.\n\r"); |
+ |
+ |
+ } |
+ |
+ DDRD &= ~(1 << DDD2); // RX as input |
+ PORTD &= ~(1 << PORTD2); |
+ |
+ Uart1Init(); // init Uart again |
+} |
+ |
+//############################################################################ |
+// zum Decodieren des Spektrum Satelliten wird USART1 benutzt. |
+// USART1 initialisation from killagreg |
+void Uart1Init(void) |
+//############################################################################ |
+ { |
+ // -- Start of USART1 initialisation for Spekturm seriell-mode |
+ // USART1 Control and Status Register A, B, C and baud rate register |
+ uint16_t ubrr = (uint16_t) ((uint32_t) SYSCLK/(8 * 115200) - 1); |
+ // disable RX-Interrupt |
+ UCSR1B &= ~(1 << RXCIE1); |
+ // disable TX-Interrupt |
+ UCSR1B &= ~(1 << TXCIE1); |
+ // disable DRE-Interrupt |
+ UCSR1B &= ~(1 << UDRIE1); |
+ // set direction of RXD1 and TXD1 pins |
+ // set RXD1 (PD2) as an input pin |
+ PORTD |= (1 << PORTD2); |
+ DDRD &= ~(1 << DDD2); |
+ // USART0 Baud Rate Register |
+ // set clock divider |
+ |
+ UBRR1H = (uint8_t)(ubrr>>8); |
+ UBRR1L = (uint8_t)ubrr; |
+ // enable double speed operation |
+ UCSR1A |= (1 << U2X1); |
+ // enable receiver and transmitter |
+ //UCSR1B = (1<<RXEN1)|(1<<TXEN1); |
+ |
+ UCSR1B = (1<<RXEN1); |
+ // set asynchronous mode |
+ UCSR1C &= ~(1 << UMSEL11); |
+ UCSR1C &= ~(1 << UMSEL10); |
+ // no parity |
+ UCSR1C &= ~(1 << UPM11); |
+ UCSR1C &= ~(1 << UPM10); |
+ // 1 stop bit |
+ UCSR1C &= ~(1 << USBS1); |
+ // 8-bit |
+ UCSR1B &= ~(1 << UCSZ12); |
+ UCSR1C |= (1 << UCSZ11); |
+ UCSR1C |= (1 << UCSZ10); |
+ // flush receive buffer explicit |
+ while(UCSR1A & (1<<RXC1)) UDR1; |
+ // enable RX-interrupts at the end |
+ UCSR1B |= (1 << RXCIE1); |
+ // -- End of USART1 initialisation |
+ return; |
+ } |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// + Copyright (c) Rainer Walther |
+// + RC-routines from original MK rc.c (c) H&I |
+// + Useful infos from Walter: http://www.rcgroups.com/forums/showthread.php?t=714299&page=2 |
+// + only for non-profit use |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// |
+// 20080808 rw Modified for Spektrum AR6100 (PPM) |
+// 20080823 rw Add Spektrum satellite receiver on USART1 (644P only) |
+// 20081213 rw Add support for Spektrum DS9 Air-Tx-Module (9 channels) |
+// Replace AR6100-coding with original composit-signal routines |
+// |
+// --- |
+// Entweder Summensignal ODER Spektrum-Receiver anschließen. Nicht beides gleichzeitig betreiben! |
+// Binding is not implemented. Bind with external Receiver. |
+// Servo output J3, J4, J5 not serviced |
+// |
+// Anschuß Spektrum Receiver |
+// Orange: 3V von der FC (keinesfalls an 5V anschließen!) |
+// Schwarz: GND |
+// Grau: RXD1 (Pin 3) auf 10-Pol FC-Stecker |
+// |
+// --- |
+// Satellite-Reciever connected on USART1: |
+// |
+// DX7/DX6i: One data-frame at 115200 baud every 22ms. |
+// DX7se: One data-frame at 115200 baud every 11ms. |
+// byte1: unknown |
+// byte2: unknown |
+// byte3: and byte4: channel data (FLT-Mode) |
+// byte5: and byte6: channel data (Roll) |
+// byte7: and byte8: channel data (Nick) |
+// byte9: and byte10: channel data (Gier) |
+// byte11: and byte12: channel data (Gear Switch) |
+// byte13: and byte14: channel data (Gas) |
+// byte15: and byte16: channel data (AUX2) |
+// |
+// DS9 (9 Channel): One data-frame at 115200 baud every 11ms, alternating frame 1/2 for CH1-7 / CH8-9 |
+// 1st Frame: |
+// byte1: unknown |
+// byte2: unknown |
+// byte3: and byte4: channel data |
+// byte5: and byte6: channel data |
+// byte7: and byte8: channel data |
+// byte9: and byte10: channel data |
+// byte11: and byte12: channel data |
+// byte13: and byte14: channel data |
+// byte15: and byte16: channel data |
+// 2nd Frame: |
+// byte1: unknown |
+// byte2: unknown |
+// byte3: and byte4: channel data |
+// byte5: and byte6: channel data |
+// byte7: and byte8: 0xffff |
+// byte9: and byte10: 0xffff |
+// byte11: and byte12: 0xffff |
+// byte13: and byte14: 0xffff |
+// byte15: and byte16: 0xffff |
+// |
+// Each channel data (16 bit= 2byte, first msb, second lsb) is arranged as: |
+// |
+// Bits: F 0 C3 C2 C1 C0 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 |
+// |
+// 0 means a '0' bit |
+// F: 1 = indicates beginning of 2nd frame for CH8-9 (DS9 only) |
+// C3 to C0 is the channel number. 0 to 9 (4 bit, as assigned in the transmitter) |
+// D9 to D0 is the channel data (10 bit) 0xaa..0x200..0x356 for 100% transmitter-travel |
+// |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ |
+#define MIN_FRAMEGAP 68 // 7ms |
+#define MAX_BYTEGAP 3 // 310us |
+ |
+//############################################################################ |
+//Diese Routine startet und inizialisiert den USART1 für seriellen Spektrum satellite reciever |
+SIGNAL(USART1_RX_vect) |
+//############################################################################ |
+{ |
+ static unsigned char Sync=0, FrameCnt=0, ByteHigh=0, ReSync=1, Frame2=0; |
+ unsigned int Channel, index; |
+ signed int signal, tmp; |
+ int bCheckDelay; |
+ uint8_t c; |
+ c = UDR1; // get data byte |
+ if(ReSync == 1) |
+ { |
+ // wait for beginning of new frame |
+ ReSync = 0; |
+ 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 ++; |
+ index = (ByteHigh >> 2) & 0x0f; |
+ index++; |
+ Channel = ((unsigned int)ByteHigh << 8) | c; |
+ signal = Channel & 0x3ff; |
+ signal -= 0x200; // Offset, range 0x000..0x3ff? |
+ signal = signal/3; // scaling to fit PPM resolution |
+ |
+ if(index >= 0 && index <= 10) |
+ { |
+ // Stabiles Signal |
+ if(abs(signal - PPM_in[index]) < 6) |
+ { |
+ if(SenderOkay < 200) SenderOkay += 10; |
+ else |
+ { |
+ SenderOkay = 200; |
+ TIMSK1 &= ~_BV(ICIE1); // disable PPM-Input |
+ } |
+ } |
+ tmp = (3 * (PPM_in[index]) + signal) / 4; |
+ if(tmp > signal+1) tmp--; else |
+ if(tmp < signal-1) tmp++; |
+ if(SenderOkay >= 180) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; |
+ else PPM_diff[index] = 0; |
+ PPM_in[index] = tmp; |
+ } |
+ else if(index > 17) ReSync = 1; // hier stimmt was nicht: neu synchronisieren |
+ } |
+ else |
+ { |
+ // hier stimmt was nicht: neu synchronisieren |
+ ReSync = 1; |
+ FrameCnt = 0; |
+ Frame2 = 0; |
+ // new frame next, nach fruehestens 7ms erwartet |
+ SpektrumTimer = MIN_FRAMEGAP; |
+ } |
+ |
+ // 16 Bytes eingetroffen -> Komplett |
+ if(FrameCnt >= 16) |
+ { |
+ // Frame complete |
+ if(Frame2 == 0) |
+ { |
+ // Null bedeutet: Neue Daten |
+ // nur beim ersten Frame (CH 0-7) setzen |
+ if(!ReSync) NewPpmData = 0; |
+ } |
+ FrameCnt = 0; |
+ Frame2 = 0; |
+ Sync = 0; |
+ SpektrumTimer = MIN_FRAMEGAP; |
+ } |
+ } |
+} |
+ |
+ |
/branches/V0.76g-acid/Spectrum.h |
---|
0,0 → 1,10 |
/*####################################################################################### |
Dekodieren eines Spectrum Signals |
#######################################################################################*/ |
#ifndef _SPECTRUM_H |
#define _SPECTRUM_H |
void Uart1Init(void); |
void SpektrumBinding(void); |
extern unsigned char SpektrumTimer; |
#endif //_RC_H |
/branches/V0.76g-acid/_Settings.h |
---|
0,0 → 1,43 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Abstimmung |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define ACC_AMPLIFY 6 |
#define FAKTOR_P 1 |
#define FAKTOR_I 0.0001 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Debug-Interface |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define SIO_DEBUG 1 // Soll der Debugger aktiviert sein? |
#define MIN_DEBUG_INTERVALL 250 // in diesem Intervall werden Degugdaten ohne Aufforderung gesendet |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Sender |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define K_NICK 0 |
#define K_ROLL 1 |
#define K_GAS 2 |
#define K_GIER 3 |
#define K_POTI1 4 |
#define K_POTI2 5 |
#define K_POTI3 6 |
#define K_POTI4 7 |
// +++++++++++++++++++++++++++++++ |
// + Getestete Settings: |
// +++++++++++++++++++++++++++++++ |
// Setting: Kamera |
// Stick_P:3 |
// Stick_D:0 |
// Gyro_P: 175 |
// Gyro_I: 175 |
// Ki_Anteil: 10 |
// +++++++++++++++++++++++++++++++ |
// + Getestete Settings: |
// +++++++++++++++++++++++++++++++ |
// Setting: Normal |
// Stick_P:2 |
// Stick_D:8 |
// Gyro_P: 80 |
// Gyro_I: 150 |
// Ki_Anteil: 5 |
/branches/V0.76g-acid/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 |
*/ |
//####################################################################################### |
// |
SIGNAL(SIG_ADC) |
//####################################################################################### |
{ |
static unsigned char kanal=0,state = 0; |
static signed int gier1, roll1, nick1, nick_filter, roll_filter; |
static signed int accy, accx; |
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/V0.76g-acid/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/V0.76g-acid/eeprom.c |
---|
0,0 → 1,272 |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Konstanten |
// + 0-250 -> normale Werte |
// + 251 -> Poti1 |
// + 252 -> Poti2 |
// + 253 -> Poti3 |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
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; |
} |
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 = 251; // Wert : 0-250 251 -> Poti1 |
EE_Parameter.Hoehe_P = 10; // Wert : 0-32 |
EE_Parameter.Luftdruck_D = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_ACC_Wirkung = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_HoverBand = 5; // Wert : 0-250 |
EE_Parameter.Hoehe_GPS_Z = 64; // Wert : 0-250 |
EE_Parameter.Hoehe_StickNeutralPoint = 0; // Wert : 0-250 (0 = Hoover-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-250 |
EE_Parameter.GyroAccFaktor = 30; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
EE_Parameter.Gyro_P = 80; // Wert : 0-250 |
EE_Parameter.Gyro_I = 150; // Wert : 0-250 |
EE_Parameter.Gyro_D = 3; // Wert : 0-250 |
EE_Parameter.Gyro_Gier_P = 80; // Wert : 0-250 |
EE_Parameter.Gyro_Gier_I = 150; // Wert : 0-250 |
EE_Parameter.UnterspannungsWarnung = 33; // Wert : 0-250 ( Automatische Zellenerkennung bei < 50) |
EE_Parameter.NotGas = 35; // Wert : 0-250 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 30; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
EE_Parameter.I_Faktor = 32; |
EE_Parameter.UserParam1 = 0; // zur freien Verwendung |
EE_Parameter.UserParam2 = 0; // zur freien Verwendung |
EE_Parameter.UserParam3 = 0; // zur freien Verwendung |
EE_Parameter.UserParam4 = 0; // zur freien Verwendung |
EE_Parameter.UserParam5 = 0; // zur freien Verwendung |
EE_Parameter.UserParam6 = 0; // zur freien Verwendung |
EE_Parameter.UserParam7 = 0; // zur freien Verwendung |
EE_Parameter.UserParam8 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoCompInvert = 1; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 0; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickMax = 250; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickRefresh = 6; |
EE_Parameter.ServoRollControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoRollComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoRollMin = 0; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoRollMax = 250; // Wert : 0-250 // Anschlag |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.BitConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
EE_Parameter.AchsKopplung1 = 90; |
EE_Parameter.AchsKopplung2 = 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 = 252; |
EE_Parameter.NaviGpsGain = 100; |
EE_Parameter.NaviGpsP = 90; |
EE_Parameter.NaviGpsI = 90; |
EE_Parameter.NaviGpsD = 90; |
EE_Parameter.NaviGpsPLimit = 75; |
EE_Parameter.NaviGpsILimit = 75; |
EE_Parameter.NaviGpsDLimit = 75; |
EE_Parameter.NaviGpsACC = 0; |
EE_Parameter.NaviGpsMinSat = 6; |
EE_Parameter.NaviStickThreshold = 8; |
EE_Parameter.NaviWindCorrection = 90; |
EE_Parameter.NaviSpeedCompensation = 30; |
EE_Parameter.NaviOperatingRadius = 100; |
EE_Parameter.NaviAngleLimitation = 100; |
EE_Parameter.NaviPH_LoginTime = 4; |
memcpy(EE_Parameter.Name, "Sport\0", 12); |
} |
void DefaultKonstanten2(void) |
{ |
EE_Parameter.GlobalConfig = CFG_ACHSENKOPPLUNG_AKTIV | CFG_KOMPASS_AKTIV | CFG_GPS_AKTIV | CFG_HOEHEN_SCHALTER; |
EE_Parameter.ExtraConfig = CFG2_HEIGHT_LIMIT;// | CFG2_VARIO_BEEP | CFG_SENSITIVE_RC |
EE_Parameter.Hoehe_MinGas = 30; |
EE_Parameter.MaxHoehe = 251; // Wert : 0-250 251 -> Poti1 |
EE_Parameter.Hoehe_P = 10; // Wert : 0-32 |
EE_Parameter.Luftdruck_D = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_ACC_Wirkung = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_HoverBand = 5; // Wert : 0-250 |
EE_Parameter.Hoehe_GPS_Z = 64; // Wert : 0-250 |
EE_Parameter.Hoehe_StickNeutralPoint = 0; // Wert : 0-250 (0 = Hoover-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-250 |
EE_Parameter.GyroAccFaktor = 30; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
EE_Parameter.Gyro_P = 90; // Wert : 0-250 |
EE_Parameter.Gyro_I = 120; // Wert : 0-250 |
EE_Parameter.Gyro_D = 3; // Wert : 0-250 |
EE_Parameter.Gyro_Gier_P = 90; // Wert : 0-250 |
EE_Parameter.Gyro_Gier_I = 120; // Wert : 0-250 |
EE_Parameter.UnterspannungsWarnung = 33; // Wert : 0-250 ( Automatische Zellenerkennung bei < 50) |
EE_Parameter.NotGas = 35; // Wert : 0-250 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 30; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
EE_Parameter.I_Faktor = 32; |
EE_Parameter.UserParam1 = 0; // zur freien Verwendung |
EE_Parameter.UserParam2 = 0; // zur freien Verwendung |
EE_Parameter.UserParam3 = 0; // zur freien Verwendung |
EE_Parameter.UserParam4 = 0; // zur freien Verwendung |
EE_Parameter.UserParam5 = 0; // zur freien Verwendung |
EE_Parameter.UserParam6 = 0; // zur freien Verwendung |
EE_Parameter.UserParam7 = 0; // zur freien Verwendung |
EE_Parameter.UserParam8 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoCompInvert = 1; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 0; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickMax = 250; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickRefresh = 6; |
EE_Parameter.ServoRollControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoRollComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoRollMin = 0; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoRollMax = 250; // Wert : 0-250 // Anschlag |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.BitConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts |
EE_Parameter.AchsKopplung1 = 90; |
EE_Parameter.AchsKopplung2 = 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 = 252; |
EE_Parameter.NaviGpsGain = 100; |
EE_Parameter.NaviGpsP = 90; |
EE_Parameter.NaviGpsI = 90; |
EE_Parameter.NaviGpsD = 90; |
EE_Parameter.NaviGpsPLimit = 75; |
EE_Parameter.NaviGpsILimit = 75; |
EE_Parameter.NaviGpsDLimit = 75; |
EE_Parameter.NaviGpsACC = 0; |
EE_Parameter.NaviGpsMinSat = 6; |
EE_Parameter.NaviStickThreshold = 8; |
EE_Parameter.NaviWindCorrection = 90; |
EE_Parameter.NaviSpeedCompensation = 30; |
EE_Parameter.NaviOperatingRadius = 100; |
EE_Parameter.NaviAngleLimitation = 100; |
EE_Parameter.NaviPH_LoginTime = 4; |
memcpy(EE_Parameter.Name, "Normal\0", 12); |
} |
void DefaultKonstanten3(void) |
{ |
EE_Parameter.GlobalConfig = /*CFG_DREHRATEN_BEGRENZER |*/ CFG_ACHSENKOPPLUNG_AKTIV | CFG_KOMPASS_AKTIV | CFG_GPS_AKTIV | CFG_HOEHEN_SCHALTER; |
EE_Parameter.ExtraConfig = CFG2_HEIGHT_LIMIT;// | CFG2_VARIO_BEEP | CFG_SENSITIVE_RC |
EE_Parameter.Hoehe_MinGas = 30; |
EE_Parameter.MaxHoehe = 251; // Wert : 0-250 251 -> Poti1 |
EE_Parameter.Hoehe_P = 10; // Wert : 0-32 |
EE_Parameter.Luftdruck_D = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_ACC_Wirkung = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_HoverBand = 5; // Wert : 0-250 |
EE_Parameter.Hoehe_GPS_Z = 64; // Wert : 0-250 |
EE_Parameter.Hoehe_StickNeutralPoint = 0; // Wert : 0-250 (0 = Hoover-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-250 |
EE_Parameter.GyroAccFaktor = 30; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
EE_Parameter.Gyro_P = 100; // Wert : 0-250 |
EE_Parameter.Gyro_I = 120; // Wert : 0-250 |
EE_Parameter.Gyro_D = 3; // Wert : 0-250 |
EE_Parameter.Gyro_Gier_P = 100; // Wert : 0-250 |
EE_Parameter.Gyro_Gier_I = 120; // Wert : 0-250 |
EE_Parameter.UnterspannungsWarnung = 33; // Wert : 0-250 ( Automatische Zellenerkennung bei < 50) |
EE_Parameter.NotGas = 35; // Wert : 0-250 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 20; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
EE_Parameter.I_Faktor = 16; |
EE_Parameter.UserParam1 = 0; // zur freien Verwendung |
EE_Parameter.UserParam2 = 0; // zur freien Verwendung |
EE_Parameter.UserParam3 = 0; // zur freien Verwendung |
EE_Parameter.UserParam4 = 0; // zur freien Verwendung |
EE_Parameter.UserParam5 = 0; // zur freien Verwendung |
EE_Parameter.UserParam6 = 0; // zur freien Verwendung |
EE_Parameter.UserParam7 = 0; // zur freien Verwendung |
EE_Parameter.UserParam8 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoCompInvert = 1; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 0; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickMax = 250; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickRefresh = 6; |
EE_Parameter.ServoRollControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoRollComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoRollMin = 0; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoRollMax = 250; // Wert : 0-250 // Anschlag |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.BitConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts |
EE_Parameter.AchsKopplung1 = 90; |
EE_Parameter.AchsKopplung2 = 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 = 252; |
EE_Parameter.NaviGpsGain = 100; |
EE_Parameter.NaviGpsP = 90; |
EE_Parameter.NaviGpsI = 90; |
EE_Parameter.NaviGpsD = 90; |
EE_Parameter.NaviGpsPLimit = 75; |
EE_Parameter.NaviGpsILimit = 75; |
EE_Parameter.NaviGpsDLimit = 75; |
EE_Parameter.NaviGpsACC = 0; |
EE_Parameter.NaviGpsMinSat = 6; |
EE_Parameter.NaviStickThreshold = 8; |
EE_Parameter.NaviWindCorrection = 90; |
EE_Parameter.NaviSpeedCompensation = 30; |
EE_Parameter.NaviOperatingRadius = 100; |
EE_Parameter.NaviAngleLimitation = 100; |
EE_Parameter.NaviPH_LoginTime = 4; |
memcpy(EE_Parameter.Name, "Beginner\0", 12); |
} |
/branches/V0.76g-acid/fc.c |
---|
0,0 → 1,1672 |
/*####################################################################################### |
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 KompassEinschaltStartwert = 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; |
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; |
struct mk_param_struct EE_Parameter; |
signed int ExternStickNick = 0,ExternStickRoll = 0,ExternStickGier = 0, ExternHoehenValue = -20; |
int MaxStickNick = 0,MaxStickRoll = 0; |
unsigned int modell_fliegt = 0; |
volatile unsigned char MikroKopterFlags = 0; |
long GIER_GRAD_FAKTOR = 1291; |
signed int KopplungsteilNickRoll,KopplungsteilRollNick; |
unsigned char RequiredMotors = 4; |
unsigned char Motor[MAX_MOTORS]; |
signed int tmp_motorwert[MAX_MOTORS]; |
unsigned char LoadHandler = 0; |
#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; |
KompassEinschaltStartwert = KompassValue; |
GPS_Neutral(); |
beeptime = 50; |
Umschlag180Nick = ((long) EE_Parameter.WinkelUmschlagNick * 2500L) + 15000L; |
Umschlag180Roll = ((long) EE_Parameter.WinkelUmschlagRoll * 2500L) + 15000L; |
ExternHoehenValue = 0; |
ErsatzKompass = KompassValue * GIER_GRAD_FAKTOR; |
GierGyroFehler = 0; |
SendVersionToNavi = 1; |
LED_Init(); |
MikroKopterFlags |= FLAG_CALIBRATE; |
FromNaviCtrl_Value.Kalman_K = -1; |
FromNaviCtrl_Value.Kalman_MaxDrift = 0; |
FromNaviCtrl_Value.Kalman_MaxFusion = 32; |
Poti1 = PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110; |
Poti2 = PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110; |
Poti3 = PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110; |
Poti4 = PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110; |
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; |
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); |
} |
if(Poti1 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110) Poti1++; else if(Poti1 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110 && Poti1) Poti1--; |
if(Poti2 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110) Poti2++; else if(Poti2 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110 && Poti2) Poti2--; |
if(Poti3 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110) Poti3++; else if(Poti3 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110 && Poti3) Poti3--; |
if(Poti4 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110) Poti4++; else if(Poti4 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110 && Poti4) Poti4--; |
if(Poti1 < 0) Poti1 = 0; else if(Poti1 > 255) Poti1 = 255; |
if(Poti2 < 0) Poti2 = 0; else if(Poti2 > 255) Poti2 = 255; |
if(Poti3 < 0) Poti3 = 0; else if(Poti3 > 255) Poti3 = 255; |
if(Poti4 < 0) Poti4 = 0; else if(Poti4 > 255) Poti4 = 255; |
} |
//############################################################################ |
// Messwerte beim Ermitteln der Nullage |
void CalibrierMittelwert(void) |
//############################################################################ |
{ |
if(PlatinenVersion == 13) SucheGyroOffset(); |
// ADC auschalten, damit die Werte sich nicht während der Berechnung ändern |
ANALOG_OFF; |
MesswertNick = AdWertNick; |
MesswertRoll = AdWertRoll; |
MesswertGier = AdWertGier; |
Mittelwert_AccNick = ACC_AMPLIFY * (long)AdWertAccNick; |
Mittelwert_AccRoll = ACC_AMPLIFY * (long)AdWertAccRoll; |
Mittelwert_AccHoch = (long)AdWertAccHoch; |
// ADC einschalten |
ANALOG_ON; |
if(Poti1 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110) Poti1++; else if(Poti1 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110 && Poti1) Poti1--; |
if(Poti2 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110) Poti2++; else if(Poti2 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110 && Poti2) Poti2--; |
if(Poti3 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110) Poti3++; else if(Poti3 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110 && Poti3) Poti3--; |
if(Poti4 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110) Poti4++; else if(Poti4 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110 && Poti4) Poti4--; |
if(Poti1 < 0) Poti1 = 0; else if(Poti1 > 255) Poti1 = 255; |
if(Poti2 < 0) Poti2 = 0; else if(Poti2 > 255) Poti2 = 255; |
if(Poti3 < 0) Poti3 = 0; else if(Poti3 > 255) Poti3 = 255; |
if(Poti4 < 0) Poti4 = 0; else if(Poti4 > 255) Poti4 = 255; |
Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L; |
Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagRoll * 2500L; |
} |
//############################################################################ |
// Senden der Motorwerte per I2C-Bus |
void SendMotorData(void) |
//############################################################################ |
{ |
unsigned char i; |
if(!MotorenEin) |
{ |
MikroKopterFlags &= ~(FLAG_MOTOR_RUN | FLAG_FLY); |
for(i=0;i<MAX_MOTORS;i++) |
{ |
if(!PC_MotortestActive) MotorTest[i] = 0; |
Motor[i] = MotorTest[i]; |
} |
if(PC_MotortestActive) PC_MotortestActive--; |
} |
else MikroKopterFlags |= FLAG_MOTOR_RUN; |
DebugOut.Analog[12] = Motor[0]; |
DebugOut.Analog[13] = Motor[1]; |
DebugOut.Analog[14] = Motor[3]; |
DebugOut.Analog[15] = Motor[2]; |
//Start I2C Interrupt Mode |
twi_state = 0; |
motor = 0; |
i2c_start(); |
} |
//############################################################################ |
// Trägt ggf. das Poti als Parameter ein |
void ParameterZuordnung(void) |
//############################################################################ |
{ |
#define CHK_POTI_MM(b,a,min,max) { if(a > 250) { if(a == 251) b = Poti1; else if(a == 252) b = Poti2; else if(a == 253) b = Poti3; else if(a == 254) b = Poti4;} else b = a; if(b <= min) b = min; else if(b >= max) b = max;} |
#define CHK_POTI(b,a,min,max) { if(a > 250) { if(a == 251) b = Poti1; else if(a == 252) b = Poti2; else if(a == 253) b = Poti3; else if(a == 254) b = Poti4;} else b = a; } |
CHK_POTI(Parameter_MaxHoehe,EE_Parameter.MaxHoehe,0,255); |
CHK_POTI_MM(Parameter_Luftdruck_D,EE_Parameter.Luftdruck_D,0,100); |
CHK_POTI_MM(Parameter_Hoehe_P,EE_Parameter.Hoehe_P,0,100); |
CHK_POTI(Parameter_Hoehe_ACC_Wirkung,EE_Parameter.Hoehe_ACC_Wirkung,0,255); |
CHK_POTI(Parameter_Hoehe_GPS_Z,EE_Parameter.Hoehe_GPS_Z,0,255); |
CHK_POTI(Parameter_KompassWirkung,EE_Parameter.KompassWirkung,0,255); |
CHK_POTI_MM(Parameter_Gyro_P,EE_Parameter.Gyro_P,10,255); |
CHK_POTI(Parameter_Gyro_I,EE_Parameter.Gyro_I,0,255); |
CHK_POTI(Parameter_Gyro_D,EE_Parameter.Gyro_D,0,255); |
CHK_POTI(Parameter_Gyro_Gier_P,EE_Parameter.Gyro_Gier_P,10,255); |
CHK_POTI(Parameter_Gyro_Gier_I,EE_Parameter.Gyro_Gier_I,0,255); |
CHK_POTI(Parameter_I_Faktor,EE_Parameter.I_Faktor,0,255); |
CHK_POTI(Parameter_UserParam1,EE_Parameter.UserParam1,0,255); |
CHK_POTI(Parameter_UserParam2,EE_Parameter.UserParam2,0,255); |
CHK_POTI(Parameter_UserParam3,EE_Parameter.UserParam3,0,255); |
CHK_POTI(Parameter_UserParam4,EE_Parameter.UserParam4,0,255); |
CHK_POTI(Parameter_UserParam5,EE_Parameter.UserParam5,0,255); |
CHK_POTI(Parameter_UserParam6,EE_Parameter.UserParam6,0,255); |
CHK_POTI(Parameter_UserParam7,EE_Parameter.UserParam7,0,255); |
CHK_POTI(Parameter_UserParam8,EE_Parameter.UserParam8,0,255); |
CHK_POTI(Parameter_ServoNickControl,EE_Parameter.ServoNickControl,0,255); |
CHK_POTI(Parameter_ServoRollControl,EE_Parameter.ServoRollControl,0,255); |
CHK_POTI(Parameter_LoopGasLimit,EE_Parameter.LoopGasLimit,0,255); |
CHK_POTI(Parameter_AchsKopplung1, EE_Parameter.AchsKopplung1,0,255); |
CHK_POTI(Parameter_AchsKopplung2, EE_Parameter.AchsKopplung2,0,255); |
CHK_POTI(Parameter_CouplingYawCorrection,EE_Parameter.CouplingYawCorrection,0,255); |
// CHK_POTI(Parameter_AchsGegenKopplung1,EE_Parameter.AchsGegenKopplung1,0,255); |
CHK_POTI(Parameter_DynamicStability,EE_Parameter.DynamicStability,0,255); |
CHK_POTI_MM(Parameter_J16Timing,EE_Parameter.J16Timing,1,255); |
CHK_POTI_MM(Parameter_J17Timing,EE_Parameter.J17Timing,1,255); |
CHK_POTI(Parameter_ExternalControl,EE_Parameter.ExternalControl,0,255); |
Ki = 10300 / (Parameter_I_Faktor + 1); |
MAX_GAS = EE_Parameter.Gas_Max; |
MIN_GAS = EE_Parameter.Gas_Min; |
} |
//############################################################################ |
// |
void MotorRegler(void) |
//############################################################################ |
{ |
int pd_ergebnis_nick,pd_ergebnis_roll,tmp_int, 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; |
if(--LoadHandler == 0) LoadHandler = 5; // verteilt die Prozessorlast |
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; |
MikroKopterFlags &= ~FLAG_NOTLANDUNG; |
} |
ROT_ON; |
if(modell_fliegt > 1000) // wahrscheinlich in der Luft --> langsam absenken |
{ |
GasMischanteil = EE_Parameter.NotGas; |
MikroKopterFlags |= FLAG_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) |
{ |
MikroKopterFlags &= ~FLAG_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 MikroKopterFlags |= FLAG_FLY; |
if((PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] > 80) && MotorenEin == 0) |
{ |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// auf Nullwerte kalibrieren |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] > 75) // Neutralwerte |
{ |
if(++delay_neutral > 200) // nicht sofort |
{ |
GRN_OFF; |
MotorenEin = 0; |
delay_neutral = 0; |
modell_fliegt = 0; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70 || abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) > 70) |
{ |
unsigned char setting=1; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < 70) setting = 1; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 2; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 3; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] <-70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 4; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] <-70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < 70) setting = 5; |
SetActiveParamSetNumber(setting); // aktiven Datensatz merken |
} |
// else |
if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) < 30 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < -70) |
{ |
WinkelOut.CalcState = 1; |
beeptime = 1000; |
} |
else |
{ |
ReadParameterSet(GetActiveParamSetNumber(), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
{ |
if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
} |
ServoActive = 0; |
SetNeutral(); |
ServoActive = 1; |
DDRD |=0x80; // enable J7 -> Servo signal |
Piep(GetActiveParamSetNumber(),120); |
} |
} |
} |
else |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] < -75) // ACC Neutralwerte speichern |
{ |
if(++delay_neutral > 200) // nicht sofort |
{ |
GRN_OFF; |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_NICK],0xff); // Werte löschen |
MotorenEin = 0; |
delay_neutral = 0; |
modell_fliegt = 0; |
SetNeutral(); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_NICK],NeutralAccX / 256); // ACC-NeutralWerte speichern |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_NICK+1],NeutralAccX % 256); // ACC-NeutralWerte speichern |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL],NeutralAccY / 256); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL+1],NeutralAccY % 256); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_Z],(int)NeutralAccZ / 256); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_Z+1],(int)NeutralAccZ % 256); |
Piep(GetActiveParamSetNumber(),120); |
} |
} |
else delay_neutral = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gas ist unten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] < 35-120) |
{ |
// Starten |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] < -75) |
{ |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Einschalten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(++delay_einschalten > 200) |
{ |
delay_einschalten = 200; |
modell_fliegt = 1; |
MotorenEin = 1; |
sollGier = 0; |
Mess_Integral_Gier = 0; |
Mess_Integral_Gier2 = 0; |
Mess_IntegralNick = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccNick; |
Mess_IntegralRoll = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccRoll; |
Mess_IntegralNick2 = IntegralNick; |
Mess_IntegralRoll2 = IntegralRoll; |
SummeNick = 0; |
SummeRoll = 0; |
MikroKopterFlags |= FLAG_START; |
KompassEinschaltStartwert = KompassValue; |
} |
} |
else delay_einschalten = 0; |
//Auf Neutralwerte setzen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Auschalten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] > 75) |
{ |
if(++delay_ausschalten > 200) // nicht sofort |
{ |
MotorenEin = 0; |
delay_ausschalten = 200; |
modell_fliegt = 0; |
} |
} |
else delay_ausschalten = 0; |
} |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// neue Werte von der Funke |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!NewPpmData-- || (MikroKopterFlags & FLAG_NOTLANDUNG)) |
{ |
static int stick_nick,stick_roll; |
int e_stick_nick, e_stick_nick_diff, e_stick_roll, e_stick_roll_diff; |
int stick_p, stick_d; |
ParameterZuordnung(); |
stick_p = EE_Parameter.Stick_P; |
stick_d = EE_Parameter.Stick_D; |
if (Parameter_UserParam8) { |
int angle, stick_nick_tmp, stick_roll_tmp; |
if (Parameter_UserParam8 == 254) { |
angle = -45; |
} else if (Parameter_UserParam8 > 128) { |
angle = KompassValue; |
} else { |
angle = (ErsatzKompass / GIER_GRAD_FAKTOR); |
} |
angle = ((KompassEinschaltStartwert - angle + 360) % 360); |
stick_nick_tmp = (long)c_cos_8192(angle) * (long)PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] / 8192L; |
stick_roll_tmp = (long)c_sin_8192(angle) * (long)PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] / 8192L; |
e_stick_nick = stick_roll_tmp + stick_nick_tmp; |
e_stick_roll = stick_roll_tmp - stick_nick_tmp; |
stick_nick_tmp = (long)c_cos_8192(angle) * (long)PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] / 8192L; |
stick_roll_tmp = (long)c_sin_8192(angle) * (long)PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] / 8192L; |
e_stick_nick_diff = stick_roll_tmp + stick_nick_tmp; |
e_stick_roll_diff = stick_roll_tmp - stick_nick_tmp; |
if (Parameter_UserParam8 == 255) { |
int gier = abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]); |
if (gier > 100) { |
stick_d /= 3; |
} else if (gier > 50) { |
stick_d /= 2; |
} |
if (stick_d < 1) { |
stick_d = 1; |
} |
} |
/* |
DebugOut.Analog[12] = PPM_in[EE_Parameter.Kanalbelegung[K_NICK]]; |
DebugOut.Analog[13] = e_stick_nick; |
DebugOut.Analog[14] = PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]; |
DebugOut.Analog[15] = e_stick_roll; |
*/ |
} else { |
e_stick_nick = PPM_in[EE_Parameter.Kanalbelegung[K_NICK]]; |
e_stick_roll = PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]; |
e_stick_nick_diff = PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]]; |
e_stick_roll_diff = PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]]; |
} |
stick_nick = (stick_nick * 3 + e_stick_nick * stick_p) / 4; |
stick_nick += e_stick_nick_diff * stick_d; |
StickNick = stick_nick - (GPS_Nick + GPS_Nick2); |
stick_roll = (stick_roll * 3 + e_stick_roll * stick_p) / 4; |
stick_roll += e_stick_roll_diff * 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(MikroKopterFlags & FLAG_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(MikroKopterFlags & FLAG_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] = 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 HOOVER_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; |
static int HeightTrimming = 0; // rate for change of height setpoint |
static int FilterHCGas = 0; |
static int StickGasHoover = 120, HooverGas = 0, HooverGasMin = 0, HooverGasMax = 1023; |
static unsigned long HooverGasFilter = 0; |
static unsigned char delay = 100, BaroAtUpperLimit = 0, BaroAtLowerLimit = 0; |
int CosAttitude; // for projection of hoover gas |
// get the current hooverpoint |
// if(LoadHandler == 1) |
{ |
DebugOut.Analog[21] = HooverGas; |
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 |
if(HoehenReglerAktiv && !(MikroKopterFlags & FLAG_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(MikroKopterFlags & FLAG_FLY) // trim setpoint only when flying |
{ // gas stick is above hoover point |
if(StickGas > (StickGasHoover + 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 - (StickGasHoover + HEIGHT_CONTROL_STICKTHRESHOLD)); |
} // gas stick is below hoover point |
else if(StickGas < (StickGasHoover - 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 - (StickGasHoover - HEIGHT_CONTROL_STICKTHRESHOLD)); |
} |
else // Gas Stick in Hoover 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; |
} |
} |
// Trim height set point |
if(abs(HeightTrimming) > 512) |
{ |
SollHoehe += (HeightTrimming * EE_Parameter.Hoehe_Verstaerkung)/(5 * 512 / 2); // move setpoint |
HeightTrimming = 0; |
if(EE_Parameter.ExtraConfig & CFG2_VARIO_BEEP) beeptime = 75; |
//update hoover gas stick value when setpoint is shifted |
if(!EE_Parameter.Hoehe_StickNeutralPoint) |
{ |
StickGasHoover = HooverGas/STICK_GAIN; //rescale back to stick value |
StickGasHoover = (StickGasHoover * UBat) / BattLowVoltageWarning; |
if(StickGasHoover < 70) StickGasHoover = 70; |
else if(StickGasHoover > 150) StickGasHoover = 150; |
} |
} |
if(BaroExpandActive) SollHoehe = HoehenWert; // update setpoint to current altitude if Expanding is active |
} //if MikroKopterFlags & MKFLAG_FLY |
else |
{ |
SollHoehe = HoehenWert - 400; |
if(EE_Parameter.Hoehe_StickNeutralPoint) StickGasHoover = EE_Parameter.Hoehe_StickNeutralPoint; |
else StickGasHoover = 120; |
} |
HCGas = HooverGas; // take hoover gas (neutral point) |
} |
if(HoehenWert > SollHoehe || !(EE_Parameter.ExtraConfig & CFG2_HEIGHT_LIMIT)) |
{ |
// ------------------------- P-Part ---------------------------- |
HeightDeviation = (int)(HoehenWert - SollHoehe); // positive when too high |
tmp_int = (HeightDeviation * (int)Parameter_Hoehe_P) / 16; // p-part |
HCGas -= tmp_int; |
// ------------------------- D-Part 1: Vario Meter ---------------------------- |
tmp_int = VarioMeter / 8; |
if(tmp_int > 8) tmp_int = 8; // limit quadratic part on upward movement to avoid to much gas reduction |
if(tmp_int > 0) tmp_int = VarioMeter + (tmp_int * tmp_int) / 4; |
else tmp_int = VarioMeter - (tmp_int * tmp_int) / 4; |
tmp_int = (Parameter_Luftdruck_D * (long)(tmp_int)) / 128L; // scale to d-gain parameter |
LIMIT_MIN_MAX(tmp_int, -127, 255); |
HCGas -= tmp_int; |
// ------------------------ D-Part 2: ACC-Z Integral ------------------------ |
tmp_int = ((Mess_Integral_Hoch / 128) * (long) Parameter_Hoehe_ACC_Wirkung) / (128 / STICK_GAIN); |
LIMIT_MIN_MAX(tmp_int, -127, 255); |
HCGas -= tmp_int; |
// limit deviation from hoover point within the target region |
if( (abs(HeightDeviation) < 150) && (!HeightTrimming) && (HooverGas > 0)) // height setpoint is not changed and hoover gas not zero |
{ |
LIMIT_MIN_MAX(HCGas, HooverGasMin, HooverGasMax); // limit gas around the hoover point |
} |
if(BaroExpandActive) HCGas = HooverGas; |
// ------------------------ D-Part 3: GpsZ ---------------------------------- |
tmp_int = (Parameter_Hoehe_GPS_Z * (long)FromNaviCtrl_Value.GpsZ)/128L; |
LIMIT_MIN_MAX(tmp_int, -127, 255); |
HCGas -= tmp_int; |
// 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 |
if(FilterHCGas > GasMischanteil) 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) |
{ |
StickGasHoover = HooverGas/STICK_GAIN; // rescale back to stick value |
StickGasHoover = (StickGasHoover * UBat) / BattLowVoltageWarning; |
} |
else StickGasHoover = EE_Parameter.Hoehe_StickNeutralPoint; |
if(StickGasHoover < 70) StickGasHoover = 70; |
else if(StickGasHoover > 150) StickGasHoover = 150; |
FilterHCGas = GasMischanteil; |
} |
// Hoover 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((MikroKopterFlags & FLAG_FLY) && !(MikroKopterFlags & FLAG_NOTLANDUNG)) |
{ |
if(HooverGasFilter == 0) HooverGasFilter = HOOVER_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 |
HooverGasFilter -= HooverGasFilter/(HOOVER_GAS_AVERAGE/8L); |
HooverGasFilter += 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 |
HooverGasFilter -= HooverGasFilter/(HOOVER_GAS_AVERAGE/4L); |
HooverGasFilter += 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 |
HooverGasFilter -= HooverGasFilter/(HOOVER_GAS_AVERAGE/2L); |
HooverGasFilter += 2L * tmp_long2; |
} |
else //later |
{ |
HooverGasFilter -= HooverGasFilter/HOOVER_GAS_AVERAGE; |
HooverGasFilter += tmp_long2; |
} |
HooverGas = (int16_t)(HooverGasFilter/HOOVER_GAS_AVERAGE); |
if(EE_Parameter.Hoehe_HoverBand) |
{ |
int16_t band; |
band = HooverGas / EE_Parameter.Hoehe_HoverBand; // the higher the parameter the smaller the range |
HooverGasMin = HooverGas - band; |
HooverGasMax = HooverGas + band; |
} |
else |
{ // no limit |
HooverGasMin = 0; |
HooverGasMax = 1023; |
} |
} |
} |
} |
//DebugOut.Analog[26] = HooverGasMax; |
}// 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] = tmp_int; |
} |
else Motor[i] = 0; |
} |
/* |
if(Poti1 > 20) Motor1 = 0; |
if(Poti1 > 90) Motor6 = 0; |
if(Poti1 > 140) Motor2 = 0; |
//if(Poti1 > 200) Motor7 = 0; |
*/ |
} |
/branches/V0.76g-acid/fc.h |
---|
0,0 → 1,201 |
/*####################################################################################### |
Flight Control |
#######################################################################################*/ |
#ifndef _FC_H |
#define _FC_H |
//#define GIER_GRAD_FAKTOR 1291L // Abhängigkeit zwischen GyroIntegral und Winkel |
//#define GIER_GRAD_FAKTOR 1160L |
extern long GIER_GRAD_FAKTOR; // Abhängigkeit zwischen GyroIntegral und Winkel |
#define STICK_GAIN 4 |
#define FLAG_MOTOR_RUN 1 |
#define FLAG_FLY 2 |
#define FLAG_CALIBRATE 4 |
#define FLAG_START 8 |
#define FLAG_NOTLANDUNG 16 |
#define FLAG_LOWBAT 32 |
#define MAX_MOTORS 12 |
#define CHECK_MIN_MAX(wert,min,max) {if(wert < min) wert = min; else if(wert > max) wert = max;} |
extern volatile unsigned char MikroKopterFlags; |
extern volatile unsigned int I2CTimeout; |
extern unsigned char Sekunde,Minute; |
extern unsigned int BaroExpandActive; |
extern long IntegralNick,IntegralNick2; |
extern long IntegralRoll,IntegralRoll2; |
//extern int IntegralNick,IntegralNick2; |
//extern int IntegralRoll,IntegralRoll2; |
extern long Mess_IntegralNick,Mess_IntegralNick2; |
extern long Mess_IntegralRoll,Mess_IntegralRoll2; |
extern long IntegralAccNick,IntegralAccRoll; |
extern volatile long Mess_Integral_Hoch; |
extern long Integral_Gier,Mess_Integral_Gier,Mess_Integral_Gier2; |
extern int KompassValue; |
extern int KompassStartwert; |
extern int KompassRichtung; |
extern int TrimNick, TrimRoll; |
extern long ErsatzKompass; |
extern int ErsatzKompassInGrad; // Kompasswert in Grad |
extern 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 unsigned char RequiredMotors; |
extern int StickNick,StickRoll,StickGier; |
extern char MotorenEin; |
extern void DefaultKonstanten1(void); |
extern void DefaultKonstanten2(void); |
extern void DefaultKonstanten3(void); |
extern void DefaultStickMapping(void); |
#define STRUCT_PARAM_LAENGE sizeof(EE_Parameter) |
struct mk_param_struct |
{ |
unsigned char Kanalbelegung[8]; // GAS[0], GIER[1],NICK[2], ROLL[3], POTI1, POTI2, POTI3 |
unsigned char GlobalConfig; // 0x01=Höhenregler aktiv,0x02=Kompass aktiv, 0x04=GPS aktiv, 0x08=Heading Hold aktiv |
unsigned char Hoehe_MinGas; // Wert : 0-100 |
unsigned char Luftdruck_D; // Wert : 0-250 |
unsigned char MaxHoehe; // Wert : 0-32 |
unsigned char Hoehe_P; // Wert : 0-32 |
unsigned char Hoehe_Verstaerkung; // Wert : 0-50 |
unsigned char Hoehe_ACC_Wirkung; // Wert : 0-250 |
unsigned char 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 UfoAusrichtung; // X oder + Formation |
unsigned char I_Faktor; // Wert : 0-250 |
unsigned char UserParam1; // Wert : 0-250 |
unsigned char UserParam2; // Wert : 0-250 |
unsigned char UserParam3; // Wert : 0-250 |
unsigned char UserParam4; // Wert : 0-250 |
unsigned char ServoNickControl; // Wert : 0-250 // Stellung des Servos |
unsigned char ServoNickComp; // Wert : 0-250 // Einfluss Gyro/Servo |
unsigned char ServoNickMin; // Wert : 0-250 // Anschlag |
unsigned char ServoNickMax; // Wert : 0-250 // Anschlag |
//--- 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; // |
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]; |
extern unsigned char Motor[MAX_MOTORS]; |
#endif //_FC_H |
/branches/V0.76g-acid/flight.pnproj |
---|
0,0 → 1,0 |
<Project name="Flight-Ctrl"><File path="uart.h"></File><File path="main.c"></File><File path="main.h"></File><File path="makefile"></File><File path="uart.c"></File><File path="printf_P.h"></File><File path="printf_P.c"></File><File path="timer0.c"></File><File path="timer0.h"></File><File path="old_macros.h"></File><File path="twimaster.c"></File><File path="version.txt"></File><File path="twimaster.h"></File><File path="rc.c"></File><File path="rc.h"></File><File path="fc.h"></File><File path="menu.h"></File><File path="menu.c"></File><File path="_Settings.h"></File><File path="analog.c"></File><File path="analog.h"></File><File path="GPS.c"></File><File path="gps.h"></File><File path="License.txt"></File><File path="eeprom.c"></File><File path="spi.h"></File><File path="spi.c"></File><File path="led.h"></File><File path="led.c"></File><File path="fc.c"></File><File path="Spectrum.c"></File><File path="Spectrum.h"></File><File path="mymath.c"></File><File path="mymath.h"></File><File path="isqrt.S"></File></Project> |
/branches/V0.76g-acid/flight.pnps |
---|
0,0 → 1,0 |
<pd><ViewState><e p="Flight-Ctrl" x="true"></e></ViewState></pd> |
/branches/V0.76g-acid/gps.h |
---|
0,0 → 1,7 |
extern signed int GPS_Nick; |
extern signed int GPS_Roll; |
extern signed int GPS_Nick2; |
extern signed int GPS_Roll2; |
void GPS_Neutral(void); |
void GPS_BerechneZielrichtung(void); |
/branches/V0.76g-acid/isqrt.S |
---|
0,0 → 1,203 |
;-----------------------------------------------------------------------------; |
; Fast integer squareroot routines for avr-gcc project (C)ChaN, 2008 |
; http://elm-chan.org/docs/avrlib/sqrt32.S |
;-----------------------------------------------------------------------------; |
; uint16_t isqrt32 (uint32_t n); |
; uint8_t isqrt16 (uint16_t n); |
; uint16_t ihypot (int16_t x, int16_t y); |
;-----------------------------------------------------------------------------: |
; 32bit integer squareroot |
;-----------------------------------------------------------------------------; |
; uint16_t isqrt32 ( |
; uint32_t n |
; ); |
; |
; Return Value: |
; Squareroot of n. |
; |
; Size = 53 words |
; Clock = 532..548 cycles |
; Stack = 0 byte |
.global isqrt32 |
.func isqrt32 |
isqrt32: |
clr r0 |
clr r18 |
clr r19 |
clr r20 |
ldi r21, 1 |
clr r27 |
clr r30 |
clr r31 |
ldi r26, 16 |
1: lsl r22 |
rol r23 |
rol r24 |
rol r25 |
rol r0 |
rol r18 |
rol r19 |
rol r20 |
lsl r22 |
rol r23 |
rol r24 |
rol r25 |
rol r0 |
rol r18 |
rol r19 |
rol r20 |
brpl 2f |
add r0, r21 |
adc r18, r27 |
adc r19, r30 |
adc r20, r31 |
rjmp 3f |
2: sub r0, r21 |
sbc r18, r27 |
sbc r19, r30 |
sbc r20, r31 |
3: lsl r21 |
rol r27 |
rol r30 |
andi r21, 0b11111000 |
ori r21, 0b00000101 |
sbrc r20, 7 |
subi r21, 2 |
dec r26 |
brne 1b |
lsr r30 |
ror r27 |
ror r21 |
lsr r30 |
ror r27 |
ror r21 |
mov r24, r21 |
mov r25, r27 |
ret |
.endfunc |
;-----------------------------------------------------------------------------: |
; 16bit integer squareroot |
;-----------------------------------------------------------------------------; |
; uint8_t isqrt16 ( |
; uint16_t n |
; ); |
; |
; Return Value: |
; Squareroot of n. |
; |
; Size = 33 words |
; Clock = 181..189 cycles |
; Stack = 0 byte |
.global isqrt16 |
.func isqrt16 |
isqrt16: |
clr r18 |
clr r19 |
ldi r20, 1 |
clr r21 |
ldi r22, 8 |
1: lsl r24 |
rol r25 |
rol r18 |
rol r19 |
lsl r24 |
rol r25 |
rol r18 |
rol r19 |
brpl 2f |
add r18, r20 |
adc r19, r21 |
rjmp 3f |
2: sub r18, r20 |
sbc r19, r21 |
3: lsl r20 |
rol r21 |
andi r20, 0b11111000 |
ori r20, 0b00000101 |
sbrc r19, 7 |
subi r20, 2 |
dec r22 |
brne 1b |
lsr r21 |
ror r20 |
lsr r21 |
ror r20 |
mov r24, r20 |
ret |
.endfunc |
;-----------------------------------------------------------------------------: |
; 16bit integer hypot (megaAVR is required) |
;-----------------------------------------------------------------------------; |
; uint16_t ihypot ( |
; int16_t x, |
; int16_t y |
; ); |
; |
; Return Value: |
; Squareroot of (x*x + y*y) |
; |
; Size = 42 words |
; Clock = 581..597 cycles |
; Stack = 0 byte |
.global ihypot |
.func ihypot |
ihypot: |
clr r26 |
sbrs r25, 7 |
rjmp 1f |
com r24 |
com r25 |
adc r24, r26 |
adc r25, r26 |
1: sbrs r23, 7 |
rjmp 2f |
com r22 |
com r23 |
adc r22, r26 |
adc r23, r26 |
2: mul r22, r22 |
movw r18, r0 |
mul r23, r23 |
movw r20, r0 |
mul r22, r23 |
add r19, r0 |
adc r20, r1 |
adc r21, r26 |
add r19, r0 |
adc r20, r1 |
adc r21, r26 |
mul r24, r24 |
movw r30, r0 |
mul r25, r25 |
add r18, r30 |
adc r19, r31 |
adc r20, r0 |
adc r21, r1 |
mul r24, r25 |
add r19, r0 |
adc r20, r1 |
adc r21, r26 |
add r19, r0 |
adc r20, r1 |
adc r21, r26 |
movw r24, r20 |
movw r22, r18 |
clr r1 |
rjmp isqrt32 |
.endfunc |
/branches/V0.76g-acid/isqrt.h |
---|
0,0 → 1,11 |
#ifndef _ISQRT_H |
#define _ISQRT_H |
#include <inttypes.h> |
// coded in assembler file |
extern uint16_t isqrt32(uint32_t n); |
extern uint8_t isqrt16(uint16_t n); |
extern uint16_t ihypot(int16_t x, int16_t y); |
#endif // _ISQRT_H |
/branches/V0.76g-acid/led.c |
---|
0,0 → 1,67 |
#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; |
if(!delay--) // 10ms Intervall |
{ |
delay = 4; |
if(MikroKopterFlags & FLAG_LOWBAT || SenderOkay < 128) |
{ |
J16Bitmask = EE_Parameter.WARN_J16_Bitmask; |
J17Bitmask = EE_Parameter.WARN_J17_Bitmask; |
} |
else |
{ |
J16Bitmask = EE_Parameter.J16Bitmask; |
J17Bitmask = EE_Parameter.J17Bitmask; |
} |
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 > 250) && (Parameter_J16Timing > 220)) {if(J16Bitmask & 128) J16_ON; else J16_OFF;} |
else |
if((EE_Parameter.J16Timing > 250) && (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; |
} |
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 > 250) && (Parameter_J17Timing > 230)) {if(J17Bitmask & 128) J17_ON; else J17_OFF;} |
else |
if((EE_Parameter.J17Timing > 250) && (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; |
} |
} |
} |
/branches/V0.76g-acid/led.h |
---|
0,0 → 1,11 |
#include <avr/io.h> |
#define J16_ON PORTC |= (1<<PORTC2) |
#define J16_OFF PORTC &= ~(1<<PORTC2) |
#define J16_TOGGLE PORTC ^= (1<<PORTC2) |
#define J17_ON PORTC |= (1<<PORTC3) |
#define J17_OFF PORTC &= ~(1<<PORTC3) |
#define J17_TOGGLE PORTC ^= (1<<PORTC3) |
extern void LED_Init(void); |
extern void LED_Update(void); |
/branches/V0.76g-acid/main.c |
---|
0,0 → 1,445 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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; |
// -- 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], 8); // 8 Kanäle merken |
SetActiveParamSetNumber(number); |
LED_Init(); |
} |
unsigned char GetActiveParamSetNumber(void) |
{ |
unsigned char set; |
set = eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET]); |
if((set > 5) || (set < 1)) |
{ |
set = 3; |
SetActiveParamSetNumber(set); // diesen Parametersatz als aktuell merken |
} |
return(set); |
} |
void SetActiveParamSetNumber(unsigned char number) |
{ |
if(number > 5) number = 5; |
if(number < 1) return; |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], number); // diesen Parametersatz als aktuell merken |
} |
void CalMk3Mag(void) |
{ |
static unsigned char stick = 1; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > -20) stick = 0; |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < -70) && !stick) |
{ |
stick = 1; |
WinkelOut.CalcState++; |
if(WinkelOut.CalcState > 4) |
{ |
// WinkelOut.CalcState = 0; // in Uart.c |
beeptime = 1000; |
} |
else Piep(WinkelOut.CalcState,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; |
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(); |
sei(); |
printf("\n\r==================================="); |
printf("\n\rFlightControl\n\rHardware:%d.%d\n\rSoftware:V%d.%d%c ",PlatinenVersion/10,PlatinenVersion%10, VERSION_MAJOR, VERSION_MINOR,VERSION_PATCH + 'a'); |
printf("\n\rthe use of this software is only permitted \n\ron original MikroKopter-Hardware"); |
printf("\n\rwww.MikroKopter.de (c) HiSystems GmbH"); |
printf("\n\r==================================="); |
if(UCSR1A == 0x20 && UCSR1C == 0x06) // initial Values for 644P |
{ |
Uart1Init(); |
} |
GRN_ON; |
ReadParameterSet(3, (unsigned char *) &EE_Parameter.Kanalbelegung[0], 9); // read only the first bytes |
if((eeprom_read_byte(&EEPromArray[EEPROM_ADR_MIXER_TABLE]) == MIXER_REVISION) && // Check Revision in the first Byte |
(eeprom_read_byte(&EEPromArray[EEPROM_ADR_VALID]) != 0xff)) // Settings reset via Koptertool |
{ |
unsigned char i; |
RequiredMotors = 0; |
eeprom_read_block(&Mixer, &EEPromArray[EEPROM_ADR_MIXER_TABLE], sizeof(Mixer)); |
for(i=0; i<16;i++) { if(Mixer.Motor[i][0] > 0) RequiredMotors++;} |
} |
else // default |
{ |
unsigned char i; |
printf("\n\rGenerating default Mixer Table"); |
for(i=0; i<16;i++) { Mixer.Motor[i][0] = 0;Mixer.Motor[i][1] = 0;Mixer.Motor[i][2] = 0;Mixer.Motor[i][3] = 0;}; |
// default = Quadro |
Mixer.Motor[0][0] = 64; Mixer.Motor[0][1] = +64; Mixer.Motor[0][2] = 0; Mixer.Motor[0][3] = +64; |
Mixer.Motor[1][0] = 64; Mixer.Motor[1][1] = -64; Mixer.Motor[1][2] = 0; Mixer.Motor[1][3] = +64; |
Mixer.Motor[2][0] = 64; Mixer.Motor[2][1] = 0; Mixer.Motor[2][2] = -64; Mixer.Motor[2][3] = -64; |
Mixer.Motor[3][0] = 64; Mixer.Motor[3][1] = 0; Mixer.Motor[3][2] = +64; Mixer.Motor[3][3] = -64; |
Mixer.Revision = MIXER_REVISION; |
memcpy(Mixer.Name, "Quadro\0", 11); |
eeprom_write_block(&Mixer, &EEPromArray[EEPROM_ADR_MIXER_TABLE], sizeof(Mixer)); |
} |
printf("\n\rMixer-Config: '%s' (%u Motors)",Mixer.Name,RequiredMotors); |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Check connected BL-Ctrls |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
printf("\n\rFound BL-Ctrl: "); |
motorread = 0; UpdateMotor = 0; SendMotorData(); while(!UpdateMotor); motorread = 0; // read the first I2C-Data |
timer = SetDelay(2000); |
for(i=0; i < MAX_MOTORS; i++) |
{ |
UpdateMotor = 0; |
SendMotorData(); |
while(!UpdateMotor); |
if(Mixer.Motor[i][0] > 0) // wait max 2 sec for the BL-Ctrls to wake up |
{ |
while(!CheckDelay(timer) && !MotorPresent[i]) {UpdateMotor = 0; SendMotorData(); while(!UpdateMotor);}; |
} |
if(MotorPresent[i]) printf("%d ",i+1); |
} |
for(i=0; i < MAX_MOTORS; i++) |
{ |
if(!MotorPresent[i] && Mixer.Motor[i][0] > 0) |
{ |
printf("\n\r\n\r!! MISSING BL-CTRL: %d !!",i+1); |
ServoActive = 1; // just in case the FC would be used as camera-stabilizer |
} |
MotorError[i] = 0; |
} |
printf("\n\r==================================="); |
SendMotorData(); |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Check Settings |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_VALID]) != EE_DATENREVISION) |
{ |
DefaultKonstanten1(); |
printf("\n\rInit. EEPROM"); |
for (unsigned char i=1;i<6;i++) |
{ |
if(i==2) DefaultKonstanten2(); // Kamera |
if(i==3) DefaultKonstanten3(); // Beginner |
if(i>3) DefaultKonstanten2(); // Kamera |
if(PlatinenVersion >= 20) |
{ |
EE_Parameter.Gyro_D = 5; |
EE_Parameter.Driftkomp = 0; |
EE_Parameter.GyroAccFaktor = 27; |
EE_Parameter.WinkelUmschlagNick = 78; |
EE_Parameter.WinkelUmschlagRoll = 78; |
} |
// valid Stick-Settings? |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS]) < 12 && eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+1]) < 12 && eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+2]) < 12 && eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+3]) < 12) |
{ |
EE_Parameter.Kanalbelegung[0] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+0]); |
EE_Parameter.Kanalbelegung[1] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+1]); |
EE_Parameter.Kanalbelegung[2] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+2]); |
EE_Parameter.Kanalbelegung[3] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+3]); |
EE_Parameter.Kanalbelegung[4] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+4]); |
EE_Parameter.Kanalbelegung[5] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+5]); |
EE_Parameter.Kanalbelegung[6] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+6]); |
EE_Parameter.Kanalbelegung[7] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+7]); |
if(i==1) printf(": Generating Default-Parameter using old Stick Settings"); |
} else DefaultStickMapping(); |
WriteParameterSet(i, (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
} |
SetActiveParamSetNumber(3); // default-Setting |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_VALID], EE_DATENREVISION); |
} |
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); |
printf("\n\r===================================\n\r"); |
//SpektrumBinding(); |
timer = SetDelay(2000); |
while (1) |
{ |
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(NaviDataOkay) |
{ |
if(--NaviDataOkay == 0) |
{ |
GPS_Nick = 0; |
GPS_Roll = 0; |
} |
} |
if(!--I2CTimeout || MissingMotor) |
{ |
if(!I2CTimeout) |
{ |
i2c_reset(); |
I2CTimeout = 5; |
DebugOut.Analog[28]++; // I2C-Error |
} |
if((BeepMuster == 0xffff) && MotorenEin) |
{ |
beeptime = 10000; |
BeepMuster = 0x0080; |
} |
} |
else |
{ |
ROT_OFF; |
} |
if(SIO_DEBUG && (!UpdateMotor || !MotorenEin)) |
{ |
DatenUebertragung(); |
BearbeiteRxDaten(); |
} |
else BearbeiteRxDaten(); |
if(CheckDelay(timer)) |
{ |
timer += 20; |
if(PcZugriff) PcZugriff--; |
else |
{ |
ExternControl.Config = 0; |
ExternStickNick = 0; |
ExternStickRoll = 0; |
ExternStickGier = 0; |
if(BeepMuster == 0xffff && SenderOkay == 0) |
{ |
beeptime = 15000; |
BeepMuster = 0x0c00; |
} |
} |
if(UBat < BattLowVoltageWarning) |
{ |
MikroKopterFlags |= FLAG_LOWBAT; |
if(BeepMuster == 0xffff) |
{ |
beeptime = 6000; |
BeepMuster = 0x0300; |
} |
} |
else MikroKopterFlags &= ~FLAG_LOWBAT; |
SPI_StartTransmitPacket(); |
SendSPI = 4; |
if(!MotorenEin) timer2 = 1450; // 0,5 Minuten aufrunden |
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(); |
} |
if(!SendSPI) { SPI_TransmitByte(); } |
} |
return (1); |
} |
/branches/V0.76g-acid/main.h |
---|
0,0 → 1,136 |
#ifndef _MAIN_H |
#define _MAIN_H |
#define QUADRO |
//Hier die Quarz Frequenz einstellen |
#if defined (__AVR_ATmega32__) |
#define SYSCLK 20000000L //Quarz Frequenz in Hz |
#endif |
#if defined (__AVR_ATmega644__) |
#define SYSCLK 20000000L //Quarz Frequenz in Hz |
#endif |
#if defined (__AVR_ATmega644P__) |
#define SYSCLK 20000000L //Quarz Frequenz in Hz |
#endif |
// neue Hardware |
#define ROT_OFF {if((PlatinenVersion == 10)||(PlatinenVersion == 20)) PORTB &=~0x01; else PORTB |= 0x01;} |
#define ROT_ON {if((PlatinenVersion == 10)||(PlatinenVersion == 20)) PORTB |= 0x01; else PORTB &=~0x01;} |
#define ROT_FLASH PORTB ^= 0x01 |
#define GRN_OFF {if((PlatinenVersion < 12)) PORTB &=~0x02; else PORTB |= 0x02;} |
#define GRN_ON {if((PlatinenVersion < 12)) PORTB |= 0x02; else PORTB &=~0x02;} |
#define GRN_FLASH PORTB ^= 0x02 |
#define F_CPU SYSCLK |
//#ifndef F_CPU |
//#error ################## F_CPU nicht definiert oder ungültig ############# |
//#endif |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define EE_DATENREVISION 80 // 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 J3High PORTD |= 0x20 |
#define J3Low PORTD &= ~0x20 |
#define J4High PORTD |= 0x10 |
#define J4Low PORTD &= ~0x10 |
#define J5High PORTD |= 0x08 |
#define J5Low PORTD &= ~0x08 |
//#define SYSCLK |
//extern unsigned long SYSCLK; |
extern volatile unsigned char SenderOkay; |
extern unsigned char 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; |
#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" |
#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/V0.76g-acid/makefile |
---|
0,0 → 1,450 |
#-------------------------------------------------------------------- |
# MCU name |
MCU = atmega644p |
F_CPU = 20000000 |
#------------------------------------------------------------------- |
VERSION_MAJOR = 0 |
VERSION_MINOR = 76 |
VERSION_PATCH = 6 |
VERSION_SERIAL_MAJOR = 10 # Serial Protocol |
VERSION_SERIAL_MINOR = 1 # Serial Protocol |
NC_SPI_COMPATIBLE = 10 # Navi-Kompatibilität |
#------------------------------------------------------------------- |
ifeq ($(MCU), atmega32) |
# FUSE_SETTINGS= -u -U lfuse:w:0xff:m -U hfuse:w:0xcf:m |
HEX_NAME = MEGA32 |
endif |
ifeq ($(MCU), atmega644) |
FUSE_SETTINGS = -u -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
#FUSE_SETTINGS = -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
# -u bei neuen Controllern wieder einspielen |
HEX_NAME = MEGA644 |
endif |
ifeq ($(MCU), atmega644p) |
FUSE_SETTINGS = -u -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
HEX_NAME = MEGA644 |
endif |
ifeq ($(F_CPU), 16000000) |
QUARZ = 16MHZ |
endif |
ifeq ($(F_CPU), 20000000) |
QUARZ = 20MHZ |
endif |
# Output format. (can be srec, ihex, binary) |
FORMAT = ihex |
# Target file name (without extension). |
ifeq ($(VERSION_PATCH), 0) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)a |
endif |
ifeq ($(VERSION_PATCH), 1) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)b |
endif |
ifeq ($(VERSION_PATCH), 2) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)c |
endif |
ifeq ($(VERSION_PATCH), 3) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)d |
endif |
ifeq ($(VERSION_PATCH), 4) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)e |
endif |
ifeq ($(VERSION_PATCH), 5) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)f |
endif |
ifeq ($(VERSION_PATCH), 6) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)g |
endif |
ifeq ($(VERSION_PATCH), 7) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)h |
endif |
ifeq ($(VERSION_PATCH), 8) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)i |
endif |
ifeq ($(VERSION_PATCH), 9) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)j |
endif |
ifeq ($(VERSION_PATCH), 10) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)k |
endif |
ifeq ($(VERSION_PATCH), 11) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)L |
endif |
ifeq ($(VERSION_PATCH), 12) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)m |
endif |
ifeq ($(VERSION_PATCH), 13) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)n |
endif |
ifeq ($(VERSION_PATCH), 14) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)o |
endif |
ifeq ($(VERSION_PATCH), 15) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)p |
endif |
ifeq ($(VERSION_PATCH), 16) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)q |
endif |
# Optimization level, can be [0, 1, 2, 3, s]. 0 turns off optimization. |
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) |
OPT = 2 |
########################################################################################################## |
# List C source files here. (C dependencies are automatically generated.) |
SRC = main.c uart.c printf_P.c timer0.c analog.c menu.c |
SRC += twimaster.c rc.c fc.c GPS.c spi.c led.c Spectrum.c |
SRC += mymath.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 |
CFLAGS += -DVERSION_MAJOR=$(VERSION_MAJOR) -DVERSION_MINOR=$(VERSION_MINOR) -DVERSION_PATCH=$(VERSION_PATCH) -DVERSION_SERIAL_MAJOR=$(VERSION_SERIAL_MAJOR) -DVERSION_SERIAL_MINOR=$(VERSION_SERIAL_MINOR) -DNC_SPI_COMPATIBLE=$(NC_SPI_COMPATIBLE) |
# Optional assembler flags. |
# -Wa,...: tell GCC to pass this to the assembler. |
# -ahlms: create listing |
# -gstabs: have the assembler create line number information; note that |
# for use in COFF files, additional information about filenames |
# and function names needs to be present in the assembler source |
# files -- see avr-libc docs [FIXME: not yet described there] |
ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs |
# Optional linker flags. |
# -Wl,...: tell GCC to pass this to linker. |
# -Map: create map file |
# --cref: add cross reference to map file |
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref |
# Additional libraries |
# Minimalistic printf version |
#LDFLAGS += -Wl,-u,vfprintf -lprintf_min |
# Floating point printf version (requires -lm below) |
#LDFLAGS += -Wl,-u,vfprintf -lprintf_flt |
# -lm = math library |
LDFLAGS += -lm |
##LDFLAGS += -T./linkerfile/avr5.x |
# Programming support using avrdude. Settings and variables. |
# Programming hardware: alf avr910 avrisp bascom bsd |
# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500 |
# |
# Type: avrdude -c ? |
# to get a full listing. |
# |
#AVRDUDE_PROGRAMMER = dt006 |
#AVRDUDE_PROGRAMMER = stk200 |
#AVRDUDE_PROGRAMMER = ponyser |
AVRDUDE_PROGRAMMER = avrispv2 |
#falls Ponyser ausgewählt wird, muss sich unsere avrdude-Configdatei im Bin-Verzeichnis des Compilers befinden |
#AVRDUDE_PORT = com1 # programmer connected to serial device |
#AVRDUDE_PORT = lpt1 # programmer connected to parallel port |
AVRDUDE_PORT = usb # programmer connected to USB |
#AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex |
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex $(FUSE_SETTINGS) |
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep |
#avrdude -c avrispv2 -P usb -p m32 -U flash:w:blink.hex |
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) |
# Uncomment the following if you want avrdude's erase cycle counter. |
# Note that this counter needs to be initialized first using -Yn, |
# see avrdude manual. |
#AVRDUDE_ERASE += -y |
# Uncomment the following if you do /not/ wish a verification to be |
# performed after programming the device. |
AVRDUDE_FLAGS += -V |
# Increase verbosity level. Please use this when submitting bug |
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude> |
# to submit bug reports. |
#AVRDUDE_FLAGS += -v -v |
# --------------------------------------------------------------------------- |
# Define directories, if needed. |
DIRAVR = c:/winavr |
DIRAVRBIN = $(DIRAVR)/bin |
DIRAVRUTILS = $(DIRAVR)/utils/bin |
DIRINC = . |
DIRLIB = $(DIRAVR)/avr/lib |
# Define programs and commands. |
SHELL = sh |
CC = avr-gcc |
OBJCOPY = avr-objcopy |
OBJDUMP = avr-objdump |
SIZE = avr-size |
# Programming support using avrdude. |
AVRDUDE = avrdude |
REMOVE = rm -f |
COPY = cp |
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex |
ELFSIZE = $(SIZE) -A $(TARGET).elf |
# Define Messages |
# English |
MSG_ERRORS_NONE = Errors: none |
MSG_BEGIN = -------- begin -------- |
MSG_END = -------- end -------- |
MSG_SIZE_BEFORE = Size before: |
MSG_SIZE_AFTER = Size after: |
MSG_COFF = Converting to AVR COFF: |
MSG_EXTENDED_COFF = Converting to AVR Extended COFF: |
MSG_FLASH = Creating load file for Flash: |
MSG_EEPROM = Creating load file for EEPROM: |
MSG_EXTENDED_LISTING = Creating Extended Listing: |
MSG_SYMBOL_TABLE = Creating Symbol Table: |
MSG_LINKING = Linking: |
MSG_COMPILING = Compiling: |
MSG_ASSEMBLING = Assembling: |
MSG_CLEANING = Cleaning project: |
# Define all object files. |
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) |
# Define all listing files. |
LST = $(ASRC:.S=.lst) $(SRC:.c=.lst) |
# Combine all necessary flags and optional flags. |
# Add target processor to flags. |
#ALL_CFLAGS = -mmcu=$(MCU) -DF_CPU=$(F_CPU) -I. $(CFLAGS) |
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) |
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) |
# Default target. |
all: begin gccversion sizebefore $(TARGET).elf $(TARGET).hex $(TARGET).eep \ |
$(TARGET).lss $(TARGET).sym sizeafter finished end |
# Eye candy. |
# AVR Studio 3.x does not check make's exit code but relies on |
# the following magic strings to be generated by the compile job. |
begin: |
@echo |
@echo $(MSG_BEGIN) |
finished: |
@echo $(MSG_ERRORS_NONE) |
end: |
@echo $(MSG_END) |
@echo |
# Display size of file. |
# Display size of file. |
sizebefore: |
@if [ -f $(TARGET).elf ]; then echo Size before:; $(ELFSIZE); $(HEXSIZE); echo; fi |
sizeafter: |
@if [ -f $(TARGET).elf ]; then echo Size after:; $(ELFSIZE); $(HEXSIZE); echo; fi |
# Display compiler version information. |
gccversion : |
@$(CC) --version |
# Convert ELF to COFF for use in debugging / simulating in |
# AVR Studio or VMLAB. |
COFFCONVERT=$(OBJCOPY) --debugging \ |
--change-section-address .data-0x800000 \ |
--change-section-address .bss-0x800000 \ |
--change-section-address .noinit-0x800000 \ |
--change-section-address .eeprom-0x810000 |
coff: $(TARGET).elf |
@echo |
@echo $(MSG_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof |
extcoff: $(TARGET).elf |
@echo |
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof |
# Program the device. |
program: $(TARGET).hex $(TARGET).eep |
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) |
# Create final output files (.hex, .eep) from ELF output file. |
%.hex: %.elf |
@echo |
@echo $(MSG_FLASH) $@ |
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ |
%.eep: %.elf |
@echo |
@echo $(MSG_EEPROM) $@ |
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ |
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@ |
# Create extended listing file from ELF output file. |
%.lss: %.elf |
@echo |
@echo $(MSG_EXTENDED_LISTING) $@ |
$(OBJDUMP) -h -S $< > $@ |
# Create a symbol table from ELF output file. |
%.sym: %.elf |
@echo |
@echo $(MSG_SYMBOL_TABLE) $@ |
avr-nm -n $< > $@ |
# Link: create ELF output file from object files. |
.SECONDARY : $(TARGET).elf |
.PRECIOUS : $(OBJ) |
%.elf: $(OBJ) |
@echo |
@echo $(MSG_LINKING) $@ |
$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) |
# Compile: create object files from C source files. |
%.o : %.c |
@echo |
@echo $(MSG_COMPILING) $< |
$(CC) -c $(ALL_CFLAGS) $< -o $@ |
# Compile: create assembler files from C source files. |
%.s : %.c |
$(CC) -S $(ALL_CFLAGS) $< -o $@ |
# Assemble: create object files from assembler source files. |
%.o : %.S |
@echo |
@echo $(MSG_ASSEMBLING) $< |
$(CC) -c $(ALL_ASFLAGS) $< -o $@ |
# Target: clean project. |
clean: begin clean_list finished end |
clean_list : |
@echo |
@echo $(MSG_CLEANING) |
# $(REMOVE) $(TARGET).hex |
$(REMOVE) $(TARGET).eep |
$(REMOVE) $(TARGET).obj |
$(REMOVE) $(TARGET).cof |
$(REMOVE) $(TARGET).elf |
$(REMOVE) $(TARGET).map |
$(REMOVE) $(TARGET).obj |
$(REMOVE) $(TARGET).a90 |
$(REMOVE) $(TARGET).sym |
$(REMOVE) $(TARGET).lnk |
$(REMOVE) $(TARGET).lss |
$(REMOVE) $(OBJ) |
$(REMOVE) $(LST) |
$(REMOVE) $(SRC:.c=.s) |
$(REMOVE) $(SRC:.c=.d) |
# Automatically generate C source code dependencies. |
# (Code originally taken from the GNU make user manual and modified |
# (See README.txt Credits).) |
# |
# Note that this will work with sh (bash) and sed that is shipped with WinAVR |
# (see the SHELL variable defined above). |
# This may not work with other shells or other seds. |
# |
%.d: %.c |
set -e; $(CC) -MM $(ALL_CFLAGS) $< \ |
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > $@; \ |
[ -s $@ ] || rm -f $@ |
# Remove the '-' if you want to see the dependency files generated. |
-include $(SRC:.c=.d) |
# Listing of phony targets. |
.PHONY : all begin finish end sizebefore sizeafter gccversion coff extcoff \ |
clean clean_list program |
/branches/V0.76g-acid/menu.c |
---|
0,0 → 1,187 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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" |
unsigned int TestInt = 0; |
#define ARRAYGROESSE 10 |
unsigned char Array[ARRAYGROESSE] = {1,2,3,4,5,6,7,8,9,10}; |
char DisplayBuff[80] = "Hallo Welt"; |
unsigned char DispPtr = 0; |
unsigned char MaxMenue = 14; |
unsigned char MenuePunkt = 0; |
unsigned char RemoteKeys = 0; |
#define KEY1 0x01 |
#define KEY2 0x02 |
#define KEY3 0x04 |
#define KEY4 0x08 |
#define KEY5 0x10 |
void LcdClear(void) |
{ |
unsigned char i; |
for(i=0;i<80;i++) DisplayBuff[i] = ' '; |
} |
void Menu(void) |
{ |
if(MenuePunkt > MaxMenue) MenuePunkt = MaxMenue; |
if(RemoteKeys & KEY1) { if(MenuePunkt) MenuePunkt--; else MenuePunkt = MaxMenue;} |
if(RemoteKeys & KEY2) { if(MenuePunkt == MaxMenue) MenuePunkt = 0; else MenuePunkt++;} |
if((RemoteKeys & KEY1) && (RemoteKeys & KEY2)) MenuePunkt = 0; |
LcdClear(); |
if(MenuePunkt < 10) {LCD_printfxy(17,0,"[%i]",MenuePunkt);} |
else {LCD_printfxy(16,0,"[%i]",MenuePunkt);}; |
switch(MenuePunkt) |
{ |
case 0: |
LCD_printfxy(0,0,"+ MikroKopter +"); |
LCD_printfxy(0,1,"HW:V%d.%d SW:%d.%d%c",PlatinenVersion/10,PlatinenVersion%10, VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH +'a'); |
LCD_printfxy(0,2,"Setting:%d %s",GetActiveParamSetNumber(),Mixer.Name); |
if(I2CTimeout < 6) LCD_printfxy(0,3,"I2C ERROR!!!") |
else |
if(MissingMotor) LCD_printfxy(0,3,"Missing BL-Ctrl:%d!!",MissingMotor) |
else LCD_printfxy(0,3,"(c) Holger Buss"); |
// if(RemoteTasten & KEY3) TestInt--; |
// if(RemoteTasten & KEY4) TestInt++; |
break; |
case 1: |
if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
LCD_printfxy(0,0,"Hoehe: %5i",(int)(HoehenWert/5)); |
LCD_printfxy(0,1,"SollHoehe: %5i",(int)(SollHoehe/5)); |
LCD_printfxy(0,2,"Luftdruck: %5i",MessLuftdruck); |
LCD_printfxy(0,3,"Off : %5i",OCR0A); |
} |
else |
{ |
LCD_printfxy(0,1,"Keine "); |
LCD_printfxy(0,2,"Höhenregelung"); |
} |
break; |
case 2: |
LCD_printfxy(0,0,"akt. Lage"); |
LCD_printfxy(0,1,"Nick: %5i",IntegralNick/1024); |
LCD_printfxy(0,2,"Roll: %5i",IntegralRoll/1024); |
LCD_printfxy(0,3,"Kompass: %5i",KompassValue); |
break; |
case 3: |
LCD_printfxy(0,0,"K1:%4i K2:%4i ",PPM_in[1],PPM_in[2]); |
LCD_printfxy(0,1,"K3:%4i K4:%4i ",PPM_in[3],PPM_in[4]); |
LCD_printfxy(0,2,"K5:%4i K6:%4i ",PPM_in[5],PPM_in[6]); |
LCD_printfxy(0,3,"K7:%4i K8:%4i ",PPM_in[7],PPM_in[8]); |
break; |
case 4: |
LCD_printfxy(0,0,"Ni:%4i Ro:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_NICK]],PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]); |
LCD_printfxy(0,1,"Gs:%4i Gi:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_GAS]]+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,"Gier %4i (%3i)",AdNeutralGier - AdWertGier, AdNeutralGier/2); |
} |
else |
if(PlatinenVersion == 13) |
{ |
LCD_printfxy(0,1,"Nick %4i (%3i)(%3i)",AdWertNick - AdNeutralNick/8, AdNeutralNick/16,AnalogOffsetNick); |
LCD_printfxy(0,2,"Roll %4i (%3i)(%3i)",AdWertRoll - AdNeutralRoll/8, AdNeutralRoll/16,AnalogOffsetRoll); |
LCD_printfxy(0,3,"Gier %4i (%3i)(%3i)",AdNeutralGier - AdWertGier, AdNeutralGier/2,AnalogOffsetGier); |
} |
break; |
case 6: |
LCD_printfxy(0,0,"ACC - Sensor"); |
LCD_printfxy(0,1,"Nick %4i (%3i)",AdWertAccNick,NeutralAccX); |
LCD_printfxy(0,2,"Roll %4i (%3i)",AdWertAccRoll,NeutralAccY); |
LCD_printfxy(0,3,"Hoch %4i (%3i)",Mittelwert_AccHoch/*accumulate_AccHoch / messanzahl_AccHoch*/,(int)NeutralAccZ); |
break; |
case 7: |
LCD_printfxy(0,1,"Voltage: %5i",UBat); |
LCD_printfxy(0,2,"RC-Level: %5i",SenderOkay); |
LCD_printfxy(0,3,"RC-Channels:%4i",Channels-1); |
break; |
case 8: |
LCD_printfxy(0,0,"Kompass "); |
LCD_printfxy(0,1,"Richtung: %5i",KompassRichtung); |
LCD_printfxy(0,2,"Messwert: %5i",KompassValue); |
LCD_printfxy(0,3,"Start: %5i",KompassStartwert); |
break; |
case 9: |
LCD_printfxy(0,0,"Poti1: %3i",Poti1); |
LCD_printfxy(0,1,"Poti2: %3i",Poti2); |
LCD_printfxy(0,2,"Poti3: %3i",Poti3); |
LCD_printfxy(0,3,"Poti4: %3i",Poti4); |
break; |
case 10: |
LCD_printfxy(0,0,"Servo " ); |
LCD_printfxy(0,1,"Setpoint %3i",Parameter_ServoNickControl); |
LCD_printfxy(0,2,"Stellung: %3i",ServoNickValue); |
LCD_printfxy(0,3,"Range:%3i-%3i",EE_Parameter.ServoNickMin,EE_Parameter.ServoNickMax); |
break; |
case 11: |
LCD_printfxy(0,0,"ExternControl " ); |
LCD_printfxy(0,1,"Ni:%4i Ro:%4i ",ExternControl.Nick,ExternControl.Roll); |
LCD_printfxy(0,2,"Gs:%4i Gi:%4i ",ExternControl.Gas,ExternControl.Gier); |
LCD_printfxy(0,3,"Hi:%4i Cf:%4i ",ExternControl.Hight,ExternControl.Config); |
break; |
case 12: |
LCD_printfxy(0,0,"BL-Ctrl Errors " ); |
LCD_printfxy(0,1," %3d %3d %3d %3d ",MotorError[0],MotorError[1],MotorError[2],MotorError[3]); |
LCD_printfxy(0,2," %3d %3d %3d %3d ",MotorError[4],MotorError[5],MotorError[6],MotorError[7]); |
LCD_printfxy(0,3," %3d %3d %3d %3d ",MotorError[8],MotorError[9],MotorError[10],MotorError[11]); |
break; |
case 13: |
LCD_printfxy(0,0,"BL-Ctrl found " ); |
LCD_printfxy(0,1," %c %c %c %c ",MotorPresent[0] + '-',MotorPresent[1] + '-',MotorPresent[2] + '-',MotorPresent[3] + '-'); |
LCD_printfxy(0,2," %c %c %c %c ",MotorPresent[4] + '-',MotorPresent[5] + '-',MotorPresent[6] + '-',MotorPresent[7] + '-'); |
LCD_printfxy(0,3," %c - - -",MotorPresent[8] + '-'); |
if(MotorPresent[9]) LCD_printfxy(4,3,"10"); |
if(MotorPresent[10]) LCD_printfxy(8,3,"11"); |
if(MotorPresent[11]) LCD_printfxy(12,3,"12"); |
break; |
case 14: |
LCD_printfxy(0,0,"Flight-Time " ); |
LCD_printfxy(0,1," %5umin",FlugMinuten); |
LCD_printfxy(0,2,"Total:%5umin",FlugMinutenGesamt); |
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); |
} |
/* if(RemoteKeys & KEY3 && FlugMinuten == 0) |
{ |
FlugMinutenGesamt = 0; |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_MINUTES],FlugMinutenGesamt / 256); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_MINUTES+1],FlugMinutenGesamt % 256); |
} */ |
break; |
default: MaxMenue = MenuePunkt - 1; |
MenuePunkt = 0; |
break; |
} |
RemoteKeys = 0; |
} |
/branches/V0.76g-acid/menu.h |
---|
0,0 → 1,9 |
extern void Menu(void); |
extern void LcdClear(void); |
extern char DisplayBuff[80]; |
extern unsigned char DispPtr; |
extern unsigned char MaxMenue; |
extern unsigned char MenuePunkt; |
extern unsigned char RemoteKeys; |
/branches/V0.76g-acid/mymath.c |
---|
0,0 → 1,106 |
#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)); |
} |
// Arcustangens returns degree in a range of +/. 180 deg |
const uint8_t pgm_atanlookup[346] PROGMEM = {0,1,2,3,4,4,5,6,7,8,9,10,11,11,12,13,14,15,16,17,17,18,19,20,21,21,22,23,24,24,25,26,27,27,28,29,29,30,31,31,32,33,33,34,35,35,36,36,37,37,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,45,46,46,47,47,48,48,48,49,49,50,50,50,51,51,51,52,52,52,53,53,53,54,54,54,55,55,55,55,56,56,56,57,57,57,57,58,58,58,58,59,59,59,59,60,60,60,60,60,61,61,61,61,62,62,62,62,62,63,63,63,63,63,63,64,64,64,64,64,64,65,65,65,65,65,65,66,66,66,66,66,66,66,67,67,67,67,67,67,67,68,68,68,68,68,68,68,68,69,69,69,69,69,69,69,69,69,70,70,70,70,70,70,70,70,70,71,71,71,71,71,71,71,71,71,71,71,72,72,72,72,72,72,72,72,72,72,72,73,73,73,73,73,73,73,73,73,73,73,73,73,73,74,74,74,74,74,74,74,74,74,74,74,74,74,74,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79}; |
int16_t c_atan2(int16_t y, int16_t x) |
{ |
int16_t index, angle; |
int8_t m; |
if (!x && !y) return 0; //atan2(0, 0) is undefined |
if (y < 0) m = -1; |
else m = 1; |
if (!x) return (90 * m); // atan2(y,0) = +/- 90 deg |
index = (int16_t)(((int32_t)y * 64) / x);// calculate index for lookup table |
if (index < 0) index = -index; |
if (index < 346) angle = pgm_read_byte(&pgm_atanlookup[index]); // lookup for 0 deg to 79 deg |
else if (index > 7334) angle = 90; // limit is 90 deg |
else if (index > 2444) angle = 89; // 89 deg to 80 deg is mapped via intervalls |
else if (index > 1465) angle = 88; |
else if (index > 1046) angle = 87; |
else if (index > 813) angle = 86; |
else if (index > 664) angle = 85; |
else if (index > 561) angle = 84; |
else if (index > 486) angle = 83; |
else if (index > 428) angle = 82; |
else if (index > 382) angle = 81; |
else angle = 80; // (index>345) |
if (x > 0) return (angle * m); // 1st and 4th quadrant |
else if ((x < 0) && (m > 0)) return (180 - angle); // 2nd quadrant |
else return (angle - 180); // ( (x < 0) && (y < 0)) 3rd quadrant |
} |
// Integer square root |
// For details of the algorithm see the article http://www.embedded.com/98/9802fe2.htm |
uint32_t c_sqrt(uint32_t a) |
{ |
uint32_t rem = 0; |
uint32_t root = 0; |
uint8_t i; |
for(i = 0; i < 16; i++) |
{ |
root <<= 1; |
rem = ((rem << 2) + (a >> 30)); |
a <<= 2; |
root++; |
if(root <= rem) |
{ |
rem -= root; |
root++; |
} |
else root--; |
} |
return (root >> 1); |
} |
/branches/V0.76g-acid/mymath.h |
---|
0,0 → 1,10 |
#ifndef _MYMATH_H |
#define _MYMATH_H |
#include <inttypes.h> |
extern int16_t c_sin_8192(int16_t angle); |
extern int16_t c_cos_8192(int16_t angle); |
extern int16_t c_atan2(int16_t y, int16_t x); |
extern uint32_t c_sqrt(uint32_t a); |
#endif // _MYMATH_H |
/branches/V0.76g-acid/old_macros.h |
---|
0,0 → 1,47 |
/* |
For backwards compatibility only. |
Ingo Busker ingo@mikrocontroller.com |
*/ |
#ifndef cbi |
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) |
#endif |
#ifndef sbi |
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) |
#endif |
#ifndef inb |
#define inb(sfr) _SFR_BYTE(sfr) |
#endif |
#ifndef outb |
#define outb(sfr, val) (_SFR_BYTE(sfr) = (val)) |
#endif |
#ifndef inw |
#define inw(sfr) _SFR_WORD(sfr) |
#endif |
#ifndef outw |
#define outw(sfr, val) (_SFR_WORD(sfr) = (val)) |
#endif |
#ifndef outp |
#define outp(val, sfr) outb(sfr, val) |
#endif |
#ifndef inp |
#define inp(sfr) inb(sfr) |
#endif |
#ifndef BV |
#define BV(bit) _BV(bit) |
#endif |
#ifndef PRG_RDB |
#define PRG_RDB pgm_read_byte |
#endif |
/branches/V0.76g-acid/printf_P.c |
---|
0,0 → 1,480 |
// Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist nicht von der Lizenz für den MikroKopter-Teil unterstellt |
/* |
Copyright (C) 1993 Free Software Foundation |
This file is part of the GNU IO Library. This library is free |
software; you can redistribute it and/or modify it under the |
terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) |
any later version. |
This library is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this library; see the file COPYING. If not, write to the Free |
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
As a special exception, if you link this library with files |
compiled with a GNU compiler to produce an executable, this does not cause |
the resulting executable to be covered by the GNU General Public License. |
This exception does not however invalidate any other reasons why |
the executable file might be covered by the GNU General Public License. */ |
/* |
* Copyright (c) 1990 Regents of the University of California. |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. [rescinded 22 July 1999] |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
/****************************************************************************** |
This file is a patched version of printf called _printf_P |
It is made to work with avr-gcc for Atmel AVR MCUs. |
There are some differences from standard printf: |
1. There is no floating point support (with fp the code is about 8K!) |
2. Return type is void |
3. Format string must be in program memory (by using macro printf this is |
done automaticaly) |
4. %n is not implemented (just remove the comment around it if you need it) |
5. If LIGHTPRINTF is defined, the code is about 550 bytes smaller and the |
folowing specifiers are disabled : |
space # * . - + p s o O |
6. A function void uart_sendchar(char c) is used for output. The UART must |
be initialized before using printf. |
Alexander Popov |
sasho@vip.orbitel.bg |
******************************************************************************/ |
/* |
* Actual printf innards. |
* |
* This code is large and complicated... |
*/ |
#include <string.h> |
#ifdef __STDC__ |
#include <stdarg.h> |
#else |
#include <varargs.h> |
#endif |
#include "main.h" |
//#define LIGHTPRINTF |
char PrintZiel; |
char Putchar(char zeichen) |
{ |
if(PrintZiel == OUT_LCD) { DisplayBuff[DispPtr++] = zeichen; return(1);} |
else return(uart_putchar(zeichen)); |
} |
void PRINT(const char * ptr, unsigned int len) |
{ |
for(;len;len--) Putchar(*ptr++); |
} |
void PRINTP(const char * ptr, unsigned int len) |
{ |
for(;len;len--) Putchar(pgm_read_byte(ptr++)); |
} |
void PAD_SP(signed char howmany) |
{ |
for(;howmany>0;howmany--) Putchar(' '); |
} |
void PAD_0(signed char howmany) |
{ |
for(;howmany>0;howmany--) Putchar('0'); |
} |
#define BUF 40 |
/* |
* Macros for converting digits to letters and vice versa |
*/ |
#define to_digit(c) ((c) - '0') |
#define is_digit(c) ((c)<='9' && (c)>='0') |
#define to_char(n) ((n) + '0') |
/* |
* Flags used during conversion. |
*/ |
#define LONGINT 0x01 /* long integer */ |
#define LONGDBL 0x02 /* long double; unimplemented */ |
#define SHORTINT 0x04 /* short integer */ |
#define ALT 0x08 /* alternate form */ |
#define LADJUST 0x10 /* left adjustment */ |
#define ZEROPAD 0x20 /* zero (as opposed to blank) pad */ |
#define HEXPREFIX 0x40 /* add 0x or 0X prefix */ |
void _printf_P (char ziel,char const *fmt0, ...) /* Works with string from FLASH */ |
{ |
va_list ap; |
register const char *fmt; /* format string */ |
register char ch; /* character from fmt */ |
register int n; /* handy integer (short term usage) */ |
register char *cp; /* handy char pointer (short term usage) */ |
const char *fmark; /* for remembering a place in fmt */ |
register unsigned char flags; /* flags as above */ |
signed char width; /* width from format (%8d), or 0 */ |
signed char prec; /* precision from format (%.3d), or -1 */ |
char sign; /* sign prefix (' ', '+', '-', or \0) */ |
unsigned long _ulong=0; /* integer arguments %[diouxX] */ |
#define OCT 8 |
#define DEC 10 |
#define HEX 16 |
unsigned char base; /* base for [diouxX] conversion */ |
signed char dprec; /* a copy of prec if [diouxX], 0 otherwise */ |
signed char dpad; /* extra 0 padding needed for integers */ |
signed char fieldsz; /* field size expanded by sign, dpad etc */ |
/* The initialization of 'size' is to suppress a warning that |
'size' might be used unitialized. It seems gcc can't |
quite grok this spaghetti code ... */ |
signed char size = 0; /* size of converted field or string */ |
char buf[BUF]; /* space for %c, %[diouxX], %[eEfgG] */ |
char ox[2]; /* space for 0x hex-prefix */ |
PrintZiel = ziel; // bestimmt, LCD oder UART |
va_start(ap, fmt0); |
fmt = fmt0; |
/* |
* Scan the format for conversions (`%' character). |
*/ |
for (;;) { |
for (fmark = fmt; (ch = pgm_read_byte(fmt)) != '\0' && ch != '%'; fmt++) |
/* void */; |
if ((n = fmt - fmark) != 0) { |
PRINTP(fmark, n); |
} |
if (ch == '\0') |
goto done; |
fmt++; /* skip over '%' */ |
flags = 0; |
dprec = 0; |
width = 0; |
prec = -1; |
sign = '\0'; |
rflag: ch = PRG_RDB(fmt++); |
reswitch: |
#ifdef LIGHTPRINTF |
if (ch=='o' || ch=='u' || (ch|0x20)=='x') { |
#else |
if (ch=='u' || (ch|0x20)=='x') { |
#endif |
if (flags&LONGINT) { |
_ulong=va_arg(ap, unsigned long); |
} else { |
register unsigned int _d; |
_d=va_arg(ap, unsigned int); |
_ulong = flags&SHORTINT ? (unsigned long)(unsigned short)_d : (unsigned long)_d; |
} |
} |
#ifndef LIGHTPRINTF |
if(ch==' ') { |
/* |
* ``If the space and + flags both appear, the space |
* flag will be ignored.'' |
* -- ANSI X3J11 |
*/ |
if (!sign) |
sign = ' '; |
goto rflag; |
} else if (ch=='#') { |
flags |= ALT; |
goto rflag; |
} else if (ch=='*'||ch=='-') { |
if (ch=='*') { |
/* |
* ``A negative field width argument is taken as a |
* - flag followed by a positive field width.'' |
* -- ANSI X3J11 |
* They don't exclude field widths read from args. |
*/ |
if ((width = va_arg(ap, int)) >= 0) |
goto rflag; |
width = -width; |
} |
flags |= LADJUST; |
flags &= ~ZEROPAD; /* '-' disables '0' */ |
goto rflag; |
} else if (ch=='+') { |
sign = '+'; |
goto rflag; |
} else if (ch=='.') { |
if ((ch = PRG_RDB(fmt++)) == '*') { |
n = va_arg(ap, int); |
prec = n < 0 ? -1 : n; |
goto rflag; |
} |
n = 0; |
while (is_digit(ch)) { |
n = n*10 + to_digit(ch); |
ch = PRG_RDB(fmt++); |
} |
prec = n < 0 ? -1 : n; |
goto reswitch; |
} else |
#endif /* LIGHTPRINTF */ |
if (ch=='0') { |
/* |
* ``Note that 0 is taken as a flag, not as the |
* beginning of a field width.'' |
* -- ANSI X3J11 |
*/ |
if (!(flags & LADJUST)) |
flags |= ZEROPAD; /* '-' disables '0' */ |
goto rflag; |
} else if (ch>='1' && ch<='9') { |
n = 0; |
do { |
n = 10 * n + to_digit(ch); |
ch = PRG_RDB(fmt++); |
} while (is_digit(ch)); |
width = n; |
goto reswitch; |
} else if (ch=='h') { |
flags |= SHORTINT; |
goto rflag; |
} else if (ch=='l') { |
flags |= LONGINT; |
goto rflag; |
} else if (ch=='c') { |
*(cp = buf) = va_arg(ap, int); |
size = 1; |
sign = '\0'; |
} else if (ch=='D'||ch=='d'||ch=='i') { |
if(ch=='D') |
flags |= LONGINT; |
if (flags&LONGINT) { |
_ulong=va_arg(ap, long); |
} else { |
register int _d; |
_d=va_arg(ap, int); |
_ulong = flags&SHORTINT ? (long)(short)_d : (long)_d; |
} |
if ((long)_ulong < 0) { |
_ulong = -_ulong; |
sign = '-'; |
} |
base = DEC; |
goto number; |
} else |
/* |
if (ch=='n') { |
if (flags & LONGINT) |
*va_arg(ap, long *) = ret; |
else if (flags & SHORTINT) |
*va_arg(ap, short *) = ret; |
else |
*va_arg(ap, int *) = ret; |
continue; // no output |
} else |
*/ |
#ifndef LIGHTPRINTF |
if (ch=='O'||ch=='o') { |
if (ch=='O') |
flags |= LONGINT; |
base = OCT; |
goto nosign; |
} else if (ch=='p') { |
/* |
* ``The argument shall be a pointer to void. The |
* value of the pointer is converted to a sequence |
* of printable characters, in an implementation- |
* defined manner.'' |
* -- ANSI X3J11 |
*/ |
/* NOSTRICT */ |
_ulong = (unsigned int)va_arg(ap, void *); |
base = HEX; |
flags |= HEXPREFIX; |
ch = 'x'; |
goto nosign; |
} else if (ch=='s') { // print a string from RAM |
if ((cp = va_arg(ap, char *)) == NULL) { |
cp=buf; |
cp[0] = '('; |
cp[1] = 'n'; |
cp[2] = 'u'; |
cp[4] = cp[3] = 'l'; |
cp[5] = ')'; |
cp[6] = '\0'; |
} |
if (prec >= 0) { |
/* |
* can't use strlen; can only look for the |
* NUL in the first `prec' characters, and |
* strlen() will go further. |
*/ |
char *p = (char*)memchr(cp, 0, prec); |
if (p != NULL) { |
size = p - cp; |
if (size > prec) |
size = prec; |
} else |
size = prec; |
} else |
size = strlen(cp); |
sign = '\0'; |
} else |
#endif /* LIGHTPRINTF */ |
if(ch=='U'||ch=='u') { |
if (ch=='U') |
flags |= LONGINT; |
base = DEC; |
goto nosign; |
} else if (ch=='X'||ch=='x') { |
base = HEX; |
/* leading 0x/X only if non-zero */ |
if (flags & ALT && _ulong != 0) |
flags |= HEXPREFIX; |
/* unsigned conversions */ |
nosign: sign = '\0'; |
/* |
* ``... diouXx conversions ... if a precision is |
* specified, the 0 flag will be ignored.'' |
* -- ANSI X3J11 |
*/ |
number: if ((dprec = prec) >= 0) |
flags &= ~ZEROPAD; |
/* |
* ``The result of converting a zero value with an |
* explicit precision of zero is no characters.'' |
* -- ANSI X3J11 |
*/ |
cp = buf + BUF; |
if (_ulong != 0 || prec != 0) { |
register unsigned char _d,notlastdigit; |
do { |
notlastdigit=(_ulong>=base); |
_d = _ulong % base; |
if (_d<10) { |
_d+='0'; |
} else { |
_d+='a'-10; |
if (ch=='X') _d&=~0x20; |
} |
*--cp=_d; |
_ulong /= base; |
} while (notlastdigit); |
#ifndef LIGHTPRINTF |
// handle octal leading 0 |
if (base==OCT && flags & ALT && *cp != '0') |
*--cp = '0'; |
#endif |
} |
size = buf + BUF - cp; |
} else { //default |
/* "%?" prints ?, unless ? is NUL */ |
if (ch == '\0') |
goto done; |
/* pretend it was %c with argument ch */ |
cp = buf; |
*cp = ch; |
size = 1; |
sign = '\0'; |
} |
/* |
* All reasonable formats wind up here. At this point, |
* `cp' points to a string which (if not flags&LADJUST) |
* should be padded out to `width' places. If |
* flags&ZEROPAD, it should first be prefixed by any |
* sign or other prefix; otherwise, it should be blank |
* padded before the prefix is emitted. After any |
* left-hand padding and prefixing, emit zeroes |
* required by a decimal [diouxX] precision, then print |
* the string proper, then emit zeroes required by any |
* leftover floating precision; finally, if LADJUST, |
* pad with blanks. |
*/ |
/* |
* compute actual size, so we know how much to pad. |
*/ |
fieldsz = size; |
dpad = dprec - size; |
if (dpad < 0) |
dpad = 0; |
if (sign) |
fieldsz++; |
else if (flags & HEXPREFIX) |
fieldsz += 2; |
fieldsz += dpad; |
/* right-adjusting blank padding */ |
if ((flags & (LADJUST|ZEROPAD)) == 0) |
PAD_SP(width - fieldsz); |
/* prefix */ |
if (sign) { |
PRINT(&sign, 1); |
} else if (flags & HEXPREFIX) { |
ox[0] = '0'; |
ox[1] = ch; |
PRINT(ox, 2); |
} |
/* right-adjusting zero padding */ |
if ((flags & (LADJUST|ZEROPAD)) == ZEROPAD) |
PAD_0(width - fieldsz); |
/* leading zeroes from decimal precision */ |
PAD_0(dpad); |
/* the string or number proper */ |
PRINT(cp, size); |
/* left-adjusting padding (always blank) */ |
if (flags & LADJUST) |
PAD_SP(width - fieldsz); |
} |
done: |
va_end(ap); |
} |
/branches/V0.76g-acid/printf_P.h |
---|
0,0 → 1,19 |
#ifndef _PRINTF_P_H_ |
#define _PRINTF_P_H_ |
#include <avr/pgmspace.h> |
#define OUT_V24 0 |
#define OUT_LCD 1 |
void _printf_P (char, char const *fmt0, ...); |
extern char PrintZiel; |
#define printf_P(format, args...) _printf_P(OUT_V24,format , ## args) |
#define printf(format, args...) _printf_P(OUT_V24,PSTR(format) , ## args) |
#define LCD_printfxy(x,y,format, args...) { DispPtr = y * 20 + x; _printf_P(OUT_LCD,PSTR(format) , ## args);} |
#define LCD_printf(format, args...) { _printf_P(OUT_LCD,PSTR(format) , ## args);} |
#endif |
/branches/V0.76g-acid/rc.c |
---|
0,0 → 1,212 |
/*####################################################################################### |
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 |
volatile int PPM_in[11]; |
volatile int PPM_diff[11]; // 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) |
//############################################################################ |
{ |
#ifndef ACT_S3D_SUMMENSIGNAL |
TCCR1B=(1<<CS11)|(1<<CS10)|(1<<ICES1)|(1<<ICNC1);//|(1 << WGM12); //timer1 prescale 64 |
#else |
TCCR1B=(1<<CS11)|(0<<CS10)|(1<<ICES1)|(1<<ICNC1); //timer1 prescale 64 |
#endif |
TIMSK1 |= _BV(ICIE1); |
AdNeutralGier = 0; |
AdNeutralRoll = 0; |
AdNeutralNick = 0; |
return; |
} |
#ifndef ACT_S3D_SUMMENSIGNAL |
//############################################################################ |
//Diese Routine startet und inizialisiert den Timer für RC |
SIGNAL(SIG_INPUT_CAPTURE1) |
//############################################################################ |
{ |
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 < 10) |
{ |
if((signal > 250) && (signal < 687)) |
{ |
signal -= 466; |
// Stabiles Signal |
if(abs(signal - PPM_in[index]) < 6) { if(SenderOkay < 200) SenderOkay += 10; else SenderOkay = 200;} |
tmp = (3 * (PPM_in[index]) + signal) / 4; |
if(tmp > signal+1) tmp--; else |
if(tmp < signal-1) tmp++; |
if(SenderOkay >= 195) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; |
else PPM_diff[index] = 0; |
PPM_in[index] = tmp; |
} |
index++; |
if(index == 5) J3High; else J3Low; // Servosignal an J3 anlegen |
if(index == 6) J4High; else J4Low; // Servosignal an J4 anlegen |
if(index == 7) J5High; else J5Low; // Servosignal an J5 anlegen |
} |
} |
} |
else |
{ |
static unsigned int AltICR=0; |
static int ppm_in[11]; |
static int ppm_diff[11]; |
static int old_ppm_in[11]; |
static int old_ppm_diff[11]; |
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 < 11; 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 < 10) |
{ |
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<11;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 |
SIGNAL(SIG_INPUT_CAPTURE1) |
//############################################################################ |
{ |
static unsigned int AltICR=0; |
signed int signal = 0,tmp; |
static int index; |
signal = (unsigned int) ICR1 - AltICR; |
DebugOut.Analog[16] = signal; |
signal /= 2; |
AltICR = ICR1; |
//Syncronisationspause? |
if((signal > 1100*2) && (signal < 8000*2)) |
{ |
if(index >= 4) NewPpmData = 0; // Null bedeutet: Neue Daten |
index = 1; |
} |
else |
{ |
if(index < 10) |
{ |
if((signal > 250) && (signal < 687*2)) |
{ |
signal -= 962; |
// Stabiles Signal |
if(abs(signal - PPM_in[index]) < 6) { if(SenderOkay < 200) SenderOkay += 10;} |
tmp = (3 * (PPM_in[index]) + signal) / 4; |
if(tmp > signal+1) tmp--; else |
if(tmp < signal-1) tmp++; |
if(SenderOkay >= 195) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; |
else PPM_diff[index] = 0; |
PPM_in[index] = tmp; |
} |
index++; |
} |
} |
} |
#endif |
/branches/V0.76g-acid/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[11]; |
extern volatile int PPM_diff[11]; // das diffenzierte Stick-Signal |
extern volatile unsigned char NewPpmData; |
extern volatile char Channels,tmpChannels; |
#endif //_RC_H |
/branches/V0.76g-acid/spi.c |
---|
0,0 → 1,297 |
// ######################## SPI - FlightCtrl ################### |
#include "main.h" |
//struct str_ToNaviCtrl_Version ToNaviCtrl_Version; |
//struct str_FromNaviCtrl_Version FromNaviCtrl_Version; |
struct str_ToNaviCtrl ToNaviCtrl; |
struct str_FromNaviCtrl FromNaviCtrl; |
struct str_FromNaviCtrl_Value FromNaviCtrl_Value; |
struct str_SPI_VersionInfo SPI_VersionInfo; |
unsigned char SPI_BufferIndex; |
unsigned char SPI_RxBufferIndex; |
volatile unsigned char SPI_Buffer[sizeof(FromNaviCtrl)]; |
unsigned char *SPI_TX_Buffer; |
unsigned char SPITransferCompleted, SPI_ChkSum; |
unsigned char SPI_RxDataValid,NaviDataOkay = 0; |
unsigned char SPI_CommandSequence[] = { SPI_CMD_USER, SPI_CMD_STICK, SPI_CMD_PARAMETER1, SPI_CMD_STICK, SPI_CMD_MISC, SPI_CMD_VERSION, SPI_CMD_SERVOS }; |
unsigned char SPI_CommandCounter = 0; |
#ifdef USE_SPI_COMMUNICATION |
//------------------------------------------------------ |
void SPI_MasterInit(void) |
{ |
DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK); // Set MOSI and SCK output, all others input |
SLAVE_SELECT_DDR_PORT |= (1 << SPI_SLAVE_SELECT); |
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(0<<SPR0)|(0<<SPIE); // Enable SPI, Master, set clock rate fck/64 |
SPSR = 0;//(1<<SPI2X); |
SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); |
SPITransferCompleted = 1; |
//SPDR = 0x00; // dummy write |
ToNaviCtrl.Sync1 = 0xAA; |
ToNaviCtrl.Sync2 = 0x83; |
ToNaviCtrl.Command = SPI_CMD_USER; |
ToNaviCtrl.IntegralNick = 0; |
ToNaviCtrl.IntegralRoll = 0; |
FromNaviCtrl_Value.SerialDataOkay = 0; |
SPI_RxDataValid = 0; |
SPI_VersionInfo.Major = VERSION_MAJOR; |
SPI_VersionInfo.Minor = VERSION_MINOR; |
SPI_VersionInfo.Patch = VERSION_PATCH; |
SPI_VersionInfo.Compatible = NC_SPI_COMPATIBLE; |
} |
//------------------------------------------------------ |
void SPI_StartTransmitPacket(void) |
{ |
//if ((SLAVE_SELECT_PORT & (1 << SPI_SLAVE_SELECT)) == 0) return; // transfer of prev. packet not completed |
if (!SPITransferCompleted) return; |
// _delay_us(30); |
SLAVE_SELECT_PORT &= ~(1 << SPI_SLAVE_SELECT); // SelectSlave |
SPI_TX_Buffer = (unsigned char *) &ToNaviCtrl; |
ToNaviCtrl.Command = SPI_CommandSequence[SPI_CommandCounter++]; |
if (SPI_CommandCounter >= sizeof(SPI_CommandSequence)) SPI_CommandCounter = 0; |
SPITransferCompleted = 0; |
UpdateSPI_Buffer(); // update buffer |
SPI_BufferIndex = 1; |
//ebugOut.Analog[16]++; |
// -- Debug-Output --- |
//---- |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
ToNaviCtrl.Chksum = ToNaviCtrl.Sync1; |
SPDR = ToNaviCtrl.Sync1; // Start transmission |
// SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
} |
//------------------------------------------------------ |
//SIGNAL(SIG_SPI) |
void SPI_TransmitByte(void) |
{ |
static unsigned char SPI_RXState = 0; |
unsigned char rxdata; |
static unsigned char rxchksum; |
if (SPITransferCompleted) return; |
if (!(SPSR & (1 << SPIF))) return; |
SendSPI = 4; |
// _delay_us(30); |
SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
rxdata = SPDR; |
switch ( SPI_RXState) |
{ |
case 0: |
SPI_RxBufferIndex = 0; |
//DebugOut.Analog[17]++; |
rxchksum = rxdata; |
if (rxdata == 0x81 ) { SPI_RXState = 1; } // 1. Syncbyte ok |
break; |
case 1: |
if (rxdata == 0x55) { rxchksum += rxdata; SPI_RXState = 2; } // 2. Syncbyte ok |
else SPI_RXState = 0; |
//DebugOut.Analog[18]++; |
break; |
case 2: |
SPI_Buffer[SPI_RxBufferIndex++]= rxdata; // get data |
//DebugOut.Analog[19]++; |
if (SPI_RxBufferIndex >= sizeof(FromNaviCtrl)) |
{ |
if (rxdata == rxchksum) |
{ |
unsigned char *ptr = (unsigned char *)&FromNaviCtrl; |
memcpy(ptr, (unsigned char *) SPI_Buffer, sizeof(SPI_Buffer)); |
SPI_RxDataValid = 1; |
} |
else SPI_RxDataValid = 0; |
SPI_RXState = 0; |
} |
else rxchksum += rxdata; |
break; |
} |
if (SPI_BufferIndex < sizeof(ToNaviCtrl)) |
{ |
SLAVE_SELECT_PORT &= ~(1 << SPI_SLAVE_SELECT); // SelectSlave |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
SPDR = SPI_TX_Buffer[SPI_BufferIndex]; |
ToNaviCtrl.Chksum += SPI_TX_Buffer[SPI_BufferIndex]; |
// SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
} |
else SPITransferCompleted = 1; |
SPI_BufferIndex++; |
} |
//------------------------------------------------------ |
void UpdateSPI_Buffer(void) |
{ |
signed int tmp; |
ToNaviCtrl.IntegralNick = (int) (IntegralNick / (long)(EE_Parameter.GyroAccFaktor * 4)); |
ToNaviCtrl.IntegralRoll = (int) (IntegralRoll / (long)(EE_Parameter.GyroAccFaktor * 4)); |
ToNaviCtrl.GyroCompass = (10 * ErsatzKompass) / GIER_GRAD_FAKTOR; |
ToNaviCtrl.AccNick = ((int) ACC_AMPLIFY * (NaviAccNick / NaviCntAcc))/4; |
ToNaviCtrl.AccRoll = ((int) ACC_AMPLIFY * (NaviAccRoll / NaviCntAcc))/4; |
NaviCntAcc = 0; NaviAccNick = 0; NaviAccRoll = 0; |
// ToNaviCtrl.User8 = Parameter_UserParam8; |
// ToNaviCtrl.CalState = WinkelOut.CalcState; |
switch(ToNaviCtrl.Command) // |
{ |
case SPI_CMD_USER: |
ToNaviCtrl.Param.Byte[0] = Parameter_UserParam1; |
ToNaviCtrl.Param.Byte[1] = Parameter_UserParam2; |
ToNaviCtrl.Param.Byte[2] = Parameter_UserParam3; |
ToNaviCtrl.Param.Byte[3] = Parameter_UserParam4; |
ToNaviCtrl.Param.Byte[4] = Parameter_UserParam5; |
ToNaviCtrl.Param.Byte[5] = Parameter_UserParam6; |
ToNaviCtrl.Param.Byte[6] = Parameter_UserParam7; |
ToNaviCtrl.Param.Byte[7] = Parameter_UserParam8; |
ToNaviCtrl.Param.Byte[8] = (unsigned char) MikroKopterFlags; |
MikroKopterFlags &= ~(FLAG_CALIBRATE | FLAG_START); |
ToNaviCtrl.Param.Byte[9] = (unsigned char) UBat; |
ToNaviCtrl.Param.Byte[10] =(unsigned char) BattLowVoltageWarning; |
ToNaviCtrl.Param.Byte[11] =(unsigned char) eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET]); |
break; |
case SPI_CMD_PARAMETER1: |
ToNaviCtrl.Param.Byte[0] = EE_Parameter.NaviGpsModeControl; // Parameters for the Naviboard |
ToNaviCtrl.Param.Byte[1] = EE_Parameter.NaviGpsGain; |
ToNaviCtrl.Param.Byte[2] = EE_Parameter.NaviGpsP; |
ToNaviCtrl.Param.Byte[3] = EE_Parameter.NaviGpsI; |
ToNaviCtrl.Param.Byte[4] = EE_Parameter.NaviGpsD; |
ToNaviCtrl.Param.Byte[5] = EE_Parameter.NaviGpsACC; |
ToNaviCtrl.Param.Byte[6] = EE_Parameter.NaviGpsMinSat; |
ToNaviCtrl.Param.Byte[7] = EE_Parameter.NaviStickThreshold; |
ToNaviCtrl.Param.Byte[8] = EE_Parameter.NaviOperatingRadius; |
ToNaviCtrl.Param.Byte[9] = EE_Parameter.NaviWindCorrection; |
ToNaviCtrl.Param.Byte[10] = EE_Parameter.NaviSpeedCompensation; |
ToNaviCtrl.Param.Byte[11] = EE_Parameter.NaviAngleLimitation; |
break; |
case SPI_CMD_STICK: |
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) Poti1; |
ToNaviCtrl.Param.Byte[5] = (unsigned char) Poti2; |
ToNaviCtrl.Param.Byte[6] = (unsigned char) Poti3; |
ToNaviCtrl.Param.Byte[7] = (unsigned char) Poti4; |
ToNaviCtrl.Param.Byte[8] = (unsigned char) SenderOkay; |
ToNaviCtrl.Param.Byte[9] = (unsigned char) SenderRSSI; |
ToNaviCtrl.Param.Byte[10] = DebugOut.Analog[7] / 4; //GasMischanteil |
break; |
case SPI_CMD_MISC: |
if(WinkelOut.CalcState > 5) |
{ |
WinkelOut.CalcState = 0; |
ToNaviCtrl.Param.Byte[0] = 5; |
} |
else ToNaviCtrl.Param.Byte[0] = WinkelOut.CalcState; |
ToNaviCtrl.Param.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; |
break; |
case SPI_CMD_VERSION: |
ToNaviCtrl.Param.Byte[0] = SPI_VersionInfo.Major; |
ToNaviCtrl.Param.Byte[1] = SPI_VersionInfo.Minor; |
ToNaviCtrl.Param.Byte[2] = SPI_VersionInfo.Patch; |
ToNaviCtrl.Param.Byte[3] = SPI_VersionInfo.Compatible; |
ToNaviCtrl.Param.Byte[4] = PlatinenVersion; |
break; |
case SPI_CMD_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) |
{ |
if(abs(FromNaviCtrl.GPS_Nick) < 512 && abs(FromNaviCtrl.GPS_Roll) < 512 && (EE_Parameter.GlobalConfig & CFG_GPS_AKTIV)) |
{ |
GPS_Nick = FromNaviCtrl.GPS_Nick; |
GPS_Roll = FromNaviCtrl.GPS_Roll; |
NaviDataOkay = 250; |
} |
if(FromNaviCtrl.CompassValue <= 360) KompassValue = FromNaviCtrl.CompassValue; |
KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180; |
if(FromNaviCtrl.BeepTime > beeptime && !WinkelOut.CalcState) beeptime = FromNaviCtrl.BeepTime; |
switch (FromNaviCtrl.Command) |
{ |
case SPI_KALMAN: |
FromNaviCtrl_Value.Kalman_K = FromNaviCtrl.Param.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; |
default: |
break; |
} |
} |
else |
{ |
// KompassValue = 0; |
// KompassRichtung = 0; |
GPS_Nick = 0; |
GPS_Roll = 0; |
} |
} |
#endif |
/branches/V0.76g-acid/spi.h |
---|
0,0 → 1,144 |
// ######################## SPI - FlightCtrl ################### |
#ifndef _SPI_H |
#define _SPI_H |
#include <util/delay.h> |
#define USE_SPI_COMMUNICATION |
//----------------------------------------- |
#define DDR_SPI DDRB |
#define DD_SS PB4 |
#define DD_SCK PB7 |
#define DD_MOSI PB5 |
#define DD_MISO PB6 |
// for compatibility reasons gcc3.x <-> gcc4.x |
#ifndef SPCR |
#define SPCR SPCR0 |
#endif |
#ifndef SPE |
#define SPE SPE0 |
#endif |
#ifndef MSTR |
#define MSTR MSTR0 |
#endif |
#ifndef SPR1 |
#define SPR1 SPR01 |
#endif |
#ifndef SPR0 |
#define SPR0 SPR00 |
#endif |
#ifndef SPIE |
#define SPIE SPIE0 |
#endif |
#ifndef SPDR |
#define SPDR SPDR0 |
#endif |
#ifndef SPIF |
#define SPIF SPIF0 |
#endif |
#ifndef SPSR |
#define SPSR SPSR0 |
#endif |
// ------------------------- |
#define SLAVE_SELECT_DDR_PORT DDRC |
#define SLAVE_SELECT_PORT PORTC |
#define SPI_SLAVE_SELECT PC5 |
#define SPI_CMD_USER 10 |
#define SPI_CMD_STICK 11 |
#define SPI_CMD_MISC 12 |
#define SPI_CMD_PARAMETER1 13 |
#define SPI_CMD_VERSION 14 |
#define SPI_CMD_SERVOS 15 |
struct str_ToNaviCtrl |
{ |
unsigned char Sync1, Sync2; |
unsigned char Command; |
signed int IntegralNick; |
signed int IntegralRoll; |
signed int AccNick; |
signed int AccRoll; |
signed int GyroCompass; |
signed int GyroNick; |
signed int GyroRoll; |
signed int GyroGier; |
union |
{ |
char sByte[12]; |
unsigned char Byte[12]; |
int Int[6]; |
long Long[3]; |
float Float[3]; |
} Param; |
unsigned char Chksum; |
}; |
#define SPI_KALMAN 103 |
struct str_FromNaviCtrl |
{ |
unsigned char Command; |
signed int GPS_Nick; |
signed int GPS_Roll; |
signed int GPS_Gier; |
signed int CompassValue; |
signed int Status; |
unsigned int BeepTime; |
union |
{ |
char sByte[12]; |
unsigned char Byte[12]; |
int Int[6]; |
long Long[3]; |
float Float[3]; |
} Param; |
unsigned char Chksum; |
}; |
struct str_FromNaviCtrl_Value |
{ |
signed char Kalman_K; |
signed char Kalman_MaxDrift; |
signed char Kalman_MaxFusion; |
unsigned char SerialDataOkay; |
signed char GpsZ; |
}; |
struct str_SPI_VersionInfo |
{ |
unsigned char Major; |
unsigned char Minor; |
unsigned char Patch; |
unsigned char Compatible; |
}; |
#ifdef USE_SPI_COMMUNICATION |
extern struct str_FromNaviCtrl_Value FromNaviCtrl_Value; |
extern struct str_ToNaviCtrl ToNaviCtrl; |
extern struct str_FromNaviCtrl FromNaviCtrl; |
extern unsigned char SPI_CommandCounter,NaviDataOkay; |
//#define SPI_CMD_VALUE 0x03 |
extern void SPI_MasterInit(void); |
extern void SPI_StartTransmitPacket(void); |
extern void UpdateSPI_Buffer(void); |
extern void SPI_TransmitByte(void); |
#else |
// -------------------------------- Dummy ----------------------------------------- |
#define SPI_MasterInit() ; |
#define SPI_StartTransmitPacket() ; |
#define UpdateSPI_Buffer() ; |
#define SPI_TransmitByte() ; |
#endif |
#endif |
/branches/V0.76g-acid/timer0.c |
---|
0,0 → 1,402 |
#include "main.h" |
#include "spectrum.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 |
}; |
SIGNAL (SIG_OVERFLOW0) // 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(EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV) |
{ |
if(PINC & 0x10) |
{ |
cntKompass++; |
} |
else |
{ |
if((cntKompass) && (cntKompass < 362)) |
{ |
cntKompass += cntKompass / 41; |
if(cntKompass > 10) KompassValue = cntKompass - 10; else KompassValue = 0; |
} |
// if(cntKompass < 10) cntKompass =r 10; |
// KompassValue = (unsigned long)((unsigned long)(cntKompass-10)*720L + 1L) / 703L; |
KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180; |
cntKompass = 0; |
} |
} |
} |
// ----------------------------------------------------------------------- |
unsigned int SetDelay (unsigned int t) |
{ |
// TIMSK0 &= ~_BV(TOIE0); |
return(CountMilliseconds + t + 1); |
// TIMSK0 |= _BV(TOIE0); |
} |
// ----------------------------------------------------------------------- |
char CheckDelay(unsigned int t) |
{ |
// TIMSK0 &= ~_BV(TOIE0); |
return(((t - CountMilliseconds) & 0x8000) >> 9); |
// TIMSK0 |= _BV(TOIE0); |
} |
// ----------------------------------------------------------------------- |
void Delay_ms(unsigned int w) |
{ |
unsigned int akt; |
akt = SetDelay(w); |
while (!CheckDelay(akt)); |
} |
void Delay_ms_Mess(unsigned int w) |
{ |
unsigned int akt; |
akt = SetDelay(w); |
while (!CheckDelay(akt)) if(AdReady) {AdReady = 0; ANALOG_ON;} |
} |
/*****************************************************/ |
/* Initialize Timer 2 */ |
/*****************************************************/ |
// The timer 2 is used to generate the PWM at PD7 (J7) |
// to control a camera servo for nick compensation. |
void TIMER2_Init(void) |
{ |
uint8_t sreg = SREG; |
// disable all interrupts before reconfiguration |
cli(); |
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; |
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/V0.76g-acid/timer0.h |
---|
0,0 → 1,21 |
#define TIMER_TEILER CK8 |
#define TIMER_RELOAD_VALUE 250 |
#define HEF4017R_ON PORTC |= (1<<PORTC6) |
#define HEF4017R_OFF PORTC &= ~(1<<PORTC6) |
void Timer_Init(void); |
void TIMER2_Init(void); |
void Delay_ms(unsigned int); |
void Delay_ms_Mess(unsigned int); |
unsigned int SetDelay (unsigned int t); |
char CheckDelay (unsigned int t); |
extern volatile unsigned int CountMilliseconds; |
extern volatile unsigned char UpdateMotor; |
extern volatile unsigned int beeptime; |
extern volatile unsigned int cntKompass; |
extern unsigned int BeepMuster; |
extern volatile unsigned char SendSPI, ServoActive; |
extern volatile int16_t ServoNickValue; |
extern volatile int16_t ServoRollValue; |
/branches/V0.76g-acid/twimaster.c |
---|
0,0 → 1,221 |
/*############################################################################ |
############################################################################*/ |
#include "main.h" |
volatile unsigned char twi_state = 0; |
unsigned char motor = 0; |
unsigned char motorread = 0,MissingMotor = 0; |
unsigned char motor_rx[16],motor_rx2[16]; |
unsigned char MotorPresent[MAX_MOTORS]; |
unsigned char MotorError[MAX_MOTORS]; |
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++]); |
break; |
case 2: |
if(TWSR == 0x30) |
{ |
if(!missing_motor) missing_motor = motor; |
if(++MotorError[motor-1] == 0) MotorError[motor-1] = 255; |
} |
i2c_stop(); |
I2CTimeout = 10; |
twi_state = 0; |
i2c_start(); |
break; |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Reading Data |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
case 3: |
//Transmit 1st byte for reading |
if(TWSR != 0x40) // Error? |
{ |
MotorPresent[motorread] = 0; |
motorread++; |
if(motorread >= MAX_MOTORS) motorread = 0; |
i2c_stop(); |
twi_state = 0; |
} |
else |
{ |
MotorPresent[motorread] = ('1' - '-') + motorread; |
I2C_ReceiveByte(); |
} |
MissingMotor = missing_motor; |
missing_motor = 0; |
break; |
case 4: //Read 1st byte and transmit 2nd Byte |
motor_rx[motorread] = TWDR; |
I2C_ReceiveLastByte(); //nack |
break; |
case 5: |
//Read 2nd byte |
motor_rx2[motorread++] = TWDR; |
if(motorread >= MAX_MOTORS) motorread = 0; |
i2c_stop(); |
twi_state = 0; |
break; |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// writing Gyro-Offset |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
case 8: |
i2c_write_byte(0x98); // Address of the DAC |
break; |
case 9: |
i2c_write_byte(0x10); // Update Channel A |
break; |
case 10: |
i2c_write_byte(AnalogOffsetNick); // Value |
break; |
case 11: |
i2c_write_byte(0x80); // Value |
break; |
case 12: |
i2c_stop(); |
I2CTimeout = 10; |
i2c_start(); |
break; |
case 13: |
i2c_write_byte(0x98); // Address of the DAC |
break; |
case 14: |
i2c_write_byte(0x12); // Update Channel B |
break; |
case 15: |
i2c_write_byte(AnalogOffsetRoll); // Value |
break; |
case 16: |
i2c_write_byte(0x80); // Value |
break; |
case 17: |
i2c_stop(); |
I2CTimeout = 10; |
i2c_start(); |
break; |
case 18: |
i2c_write_byte(0x98); // Address of the DAC |
break; |
case 19: |
i2c_write_byte(0x14); // Update Channel C |
break; |
case 20: |
i2c_write_byte(AnalogOffsetGier); // Value |
break; |
case 21: |
i2c_write_byte(0x80); // Value |
break; |
case 22: |
i2c_stop(); |
I2CTimeout = 10; |
twi_state = 0; |
break; |
default: twi_state = 0; |
break; |
} |
TWCR |= 0x80; |
} |
/branches/V0.76g-acid/twimaster.h |
---|
0,0 → 1,35 |
/*############################################################################ |
############################################################################*/ |
#ifndef _I2C_MASTER_H |
#define _I2C_MASTER_H |
//############################################################################ |
// I2C Konstanten |
#define SCL_CLOCK 200000L |
#define I2C_TIMEOUT 30000 |
#define I2C_START 0x08 |
#define I2C_REPEATED_START 0x10 |
#define I2C_TX_SLA_ACK 0x18 |
#define I2C_TX_DATA_ACK 0x28 |
#define I2C_RX_SLA_ACK 0x40 |
#define I2C_RX_DATA_ACK 0x50 |
//############################################################################ |
extern volatile unsigned char twi_state; |
extern unsigned char motor,MissingMotor; |
extern unsigned char motorread; |
extern unsigned char motor_rx[]; |
extern unsigned char MotorPresent[]; |
extern unsigned char MotorError[]; |
void i2c_reset(void); |
extern void i2c_init (void); // I2C initialisieren |
extern void i2c_start (void); // Start I2C |
extern void i2c_stop (void); // Stop I2C |
extern void i2c_write_byte (char byte); // 1 Byte schreiben |
extern void i2c_reset(void); |
#endif |
/branches/V0.76g-acid/uart.c |
---|
0,0 → 1,570 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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 "main.h" |
#include "uart.h" |
#define FC_ADDRESS 1 |
#define NC_ADDRESS 2 |
#define MK3MAG_ADDRESS 3 |
unsigned char GetExternalControl = 0,DebugDisplayAnforderung1 = 0, DebugDisplayAnforderung = 0,DebugDataAnforderung = 0,GetVersionAnforderung = 0, GetPPMChannelAnforderung = 0; |
unsigned char DisplayLine = 0; |
unsigned volatile char SioTmp = 0; |
unsigned volatile char SendeBuffer[MAX_SENDE_BUFF]; |
unsigned volatile char RxdBuffer[MAX_EMPFANGS_BUFF]; |
unsigned volatile char NMEABuffer[MAX_EMPFANGS_BUFF]; |
unsigned volatile char NeuerDatensatzEmpfangen = 0; |
unsigned volatile char NeueKoordinateEmpfangen = 0; |
unsigned volatile char UebertragungAbgeschlossen = 1; |
unsigned volatile char CntCrcError = 0; |
unsigned volatile char AnzahlEmpfangsBytes = 0; |
unsigned char *pRxData = 0; |
unsigned char RxDataLen = 0; |
unsigned volatile char PC_DebugTimeout = 0; |
unsigned volatile char PC_MotortestActive = 0; |
unsigned char DebugTextAnforderung = 255; |
unsigned char PcZugriff = 100; |
unsigned char MotorTest[16]; |
unsigned char MeineSlaveAdresse = 1; // Flight-Ctrl |
unsigned char ConfirmFrame; |
struct str_DebugOut DebugOut; |
struct str_ExternControl ExternControl; |
struct str_VersionInfo VersionInfo; |
struct str_WinkelOut WinkelOut; |
struct str_Data3D Data3D; |
int Debug_Timer,Kompass_Timer,Timer3D; |
unsigned int DebugDataIntervall = 200, Intervall3D = 0; |
const unsigned char ANALOG_TEXT[32][16] = |
{ |
//1234567890123456 |
"AngleNick ", //0 |
"AngleRoll ", |
"AccNick ", |
"AccRoll ", |
"GyroGier ", |
"Hight Value ", //5 |
"AccZ ", |
"Gas ", |
"Compass Value ", |
"Voltage ", |
"Empfang ", //10 |
"Gyro Kompass ", |
"Motor Front ", |
"Motor Rear ", |
"Motor Left ", |
"Motor Right ", //15 |
" ", |
" ", |
"VarioMeter ", |
"MK3Mag CalState ", |
"Servo ", //20 |
"Hoovergas ", |
" ", |
" ", |
" ", |
" ", //25 |
" ", |
" ", |
"I2C-Error ", |
" ",// "Navi Serial Data", |
"GPS_Nick ", //30 |
"GPS_Roll " |
}; |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ Sende-Part der Datenübertragung |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
SIGNAL(INT_VEC_TX) |
{ |
static unsigned int ptr = 0; |
unsigned char tmp_tx; |
if(!UebertragungAbgeschlossen) |
{ |
ptr++; // die [0] wurde schon gesendet |
tmp_tx = SendeBuffer[ptr]; |
if((tmp_tx == '\r') || (ptr == MAX_SENDE_BUFF)) |
{ |
ptr = 0; |
UebertragungAbgeschlossen = 1; |
} |
UDR = tmp_tx; |
} |
else ptr = 0; |
} |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ Empfangs-Part der Datenübertragung, incl. CRC-Auswertung |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
SIGNAL(INT_VEC_RX) |
{ |
static unsigned int crc; |
static unsigned char crc1,crc2,buf_ptr; |
static unsigned char UartState = 0; |
unsigned char CrcOkay = 0; |
SioTmp = UDR; |
if(buf_ptr >= MAX_EMPFANGS_BUFF) UartState = 0; |
if(SioTmp == '\r' && UartState == 2) |
{ |
UartState = 0; |
crc -= RxdBuffer[buf_ptr-2]; |
crc -= RxdBuffer[buf_ptr-1]; |
crc %= 4096; |
crc1 = '=' + crc / 64; |
crc2 = '=' + crc % 64; |
CrcOkay = 0; |
if((crc1 == RxdBuffer[buf_ptr-2]) && (crc2 == RxdBuffer[buf_ptr-1])) CrcOkay = 1; else { CrcOkay = 0; CntCrcError++;}; |
if(!NeuerDatensatzEmpfangen && CrcOkay) // Datensatz schon verarbeitet |
{ |
NeuerDatensatzEmpfangen = 1; |
AnzahlEmpfangsBytes = buf_ptr + 1; |
RxdBuffer[buf_ptr] = '\r'; |
if(RxdBuffer[2] == 'R') |
{ |
wdt_enable(WDTO_250MS); // Reset-Commando |
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 += SendeBuffer[i]; |
} |
tmpCRC %= 4096; |
SendeBuffer[i++] = '=' + tmpCRC / 64; |
SendeBuffer[i++] = '=' + tmpCRC % 64; |
SendeBuffer[i++] = '\r'; |
UebertragungAbgeschlossen = 0; |
UDR = SendeBuffer[0]; |
} |
// -------------------------------------------------------------------------- |
void SendOutData(unsigned char cmd,unsigned char address, unsigned char BufferAnzahl, ...) //unsigned char *snd, unsigned char len) |
{ |
va_list ap; |
unsigned int pt = 0; |
unsigned char a,b,c; |
unsigned char ptr = 0; |
unsigned char *snd = 0; |
int len = 0; |
SendeBuffer[pt++] = '#'; // Startzeichen |
SendeBuffer[pt++] = 'a' + address; // Adresse (a=0; b=1,...) |
SendeBuffer[pt++] = cmd; // Commando |
va_start(ap, BufferAnzahl); |
if(BufferAnzahl) |
{ |
snd = va_arg(ap, unsigned char*); |
len = va_arg(ap, int); |
ptr = 0; |
BufferAnzahl--; |
} |
while(len) |
{ |
if(len) |
{ |
a = snd[ptr++]; |
len--; |
if((!len) && BufferAnzahl) |
{ |
snd = va_arg(ap, unsigned char*); |
len = va_arg(ap, int); |
ptr = 0; |
BufferAnzahl--; |
} |
} |
else a = 0; |
if(len) |
{ |
b = snd[ptr++]; |
len--; |
if((!len) && BufferAnzahl) |
{ |
snd = va_arg(ap, unsigned char*); |
len = va_arg(ap, int); |
ptr = 0; |
BufferAnzahl--; |
} |
} |
else b = 0; |
if(len) |
{ |
c = snd[ptr++]; |
len--; |
if((!len) && BufferAnzahl) |
{ |
snd = va_arg(ap, unsigned char*); |
len = va_arg(ap, int); |
ptr = 0; |
BufferAnzahl--; |
} |
} |
else c = 0; |
SendeBuffer[pt++] = '=' + (a >> 2); |
SendeBuffer[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4)); |
SendeBuffer[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6)); |
SendeBuffer[pt++] = '=' + ( c & 0x3f); |
} |
va_end(ap); |
AddCRC(pt); |
} |
// -------------------------------------------------------------------------- |
void Decode64(void) // die daten werden im rx buffer dekodiert, das geht nur, weil aus 4 byte immer 3 gemacht werden. |
{ |
unsigned char a,b,c,d; |
unsigned char x,y,z; |
unsigned char ptrIn = 3; // start at begin of data block |
unsigned char ptrOut = 3; |
unsigned char len = AnzahlEmpfangsBytes - 6; // von der Gesamtbytezahl eines Frames gehen 3 Bytes des Headers ('#',Addr, Cmd) und 3 Bytes des Footers (CRC1, CRC2, '\r') ab. |
while(len) |
{ |
a = RxdBuffer[ptrIn++] - '='; |
b = RxdBuffer[ptrIn++] - '='; |
c = RxdBuffer[ptrIn++] - '='; |
d = RxdBuffer[ptrIn++] - '='; |
x = (a << 2) | (b >> 4); |
y = ((b & 0x0f) << 4) | (c >> 2); |
z = ((c & 0x03) << 6) | d; |
if(len--) RxdBuffer[ptrOut++] = x; else break; |
if(len--) RxdBuffer[ptrOut++] = y; else break; |
if(len--) RxdBuffer[ptrOut++] = z; else break; |
} |
pRxData = (unsigned char*)&RxdBuffer[3]; // decodierte Daten beginnen beim 4. Byte |
RxDataLen = ptrOut - 3; // wie viele Bytes wurden dekodiert? |
} |
// -------------------------------------------------------------------------- |
void BearbeiteRxDaten(void) |
{ |
if(!NeuerDatensatzEmpfangen) return; |
unsigned char tempchar1, tempchar2; |
Decode64(); // dekodiere datenblock im Empfangsbuffer |
switch(RxdBuffer[1]-'a') // check for Slave Address |
{ |
case FC_ADDRESS: // FC special commands |
switch(RxdBuffer[2]) |
{ |
case 'K':// Kompasswert |
memcpy((unsigned char *)&KompassValue , (unsigned char *)pRxData, sizeof(KompassValue)); |
KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180; |
break; |
case 't':// Motortest |
if(AnzahlEmpfangsBytes > 20) memcpy(&MotorTest[0], (unsigned char *)pRxData, sizeof(MotorTest)); |
else memcpy(&MotorTest[0], (unsigned char *)pRxData, 4); |
PC_MotortestActive = 240; |
//while(!UebertragungAbgeschlossen); |
//SendOutData('T', MeineSlaveAdresse, 0); |
PcZugriff = 255; |
break; |
case 'n':// "Get Mixer |
while(!UebertragungAbgeschlossen); |
SendOutData('N', FC_ADDRESS, 1, (unsigned char *) &Mixer,sizeof(Mixer)); |
break; |
case 'm':// "Write Mixer |
while(!UebertragungAbgeschlossen); |
if(pRxData[0] == MIXER_REVISION) |
{ |
memcpy(&Mixer, (unsigned char *)pRxData, sizeof(Mixer)); |
eeprom_write_block(&Mixer, &EEPromArray[EEPROM_ADR_MIXER_TABLE], sizeof(Mixer)); |
tempchar1 = 1; |
} |
else tempchar1 = 0; |
SendOutData('M', FC_ADDRESS, 1, &tempchar1, sizeof(tempchar1)); |
break; |
case 'p': // get PPM Channels |
GetPPMChannelAnforderung = 1; |
break; |
case 'q':// "Get"-Anforderung für Settings |
// Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
if(pRxData[0] == 0xFF) |
{ |
pRxData[0] = GetActiveParamSetNumber(); |
} |
// limit settings range |
if(pRxData[0] < 1) pRxData[0] = 1; // limit to 5 |
else if(pRxData[0] > 5) pRxData[0] = 5; // limit to 5 |
// load requested parameter set |
ReadParameterSet(pRxData[0], (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
while(!UebertragungAbgeschlossen); |
tempchar1 = pRxData[0]; |
tempchar2 = EE_DATENREVISION; |
SendOutData('Q', FC_ADDRESS, 3, &tempchar1, sizeof(tempchar1), &tempchar2, sizeof(tempchar2), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
break; |
case 's': // Parametersatz speichern |
if((1 <= pRxData[0]) && (pRxData[0] <= 5) && (pRxData[1] == EE_DATENREVISION)) // check for setting to be in range |
{ |
memcpy((unsigned char *) &EE_Parameter.Kanalbelegung[0], (unsigned char *)&pRxData[2], STRUCT_PARAM_LAENGE); |
WriteParameterSet(pRxData[0], (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L; |
Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagRoll * 2500L; |
SetActiveParamSetNumber(pRxData[0]); |
tempchar1 = GetActiveParamSetNumber(); |
LipoDetection(0); |
Piep(tempchar1,110); |
} |
else |
{ |
tempchar1 = 0; // mark in response an invlid setting |
} |
while(!UebertragungAbgeschlossen); |
SendOutData('S', FC_ADDRESS, 1, &tempchar1, sizeof(tempchar1)); |
break; |
} // case FC_ADDRESS: |
default: // any Slave Address |
switch(RxdBuffer[2]) |
{ |
// 't' comand placed here only for compatibility to BL |
case 't':// Motortest |
if(AnzahlEmpfangsBytes > 20) memcpy(&MotorTest[0], (unsigned char *)pRxData, sizeof(MotorTest)); |
else memcpy(&MotorTest[0], (unsigned char *)pRxData, 4); |
while(!UebertragungAbgeschlossen); |
SendOutData('T', MeineSlaveAdresse, 0); |
PC_MotortestActive = 250; |
PcZugriff = 255; |
break; |
// 'K' comand placed here only for compatibility to old MK3MAG software, that does not send the right Slave Address |
case 'K':// Kompasswert |
memcpy((unsigned char *)&KompassValue , (unsigned char *)pRxData, sizeof(KompassValue)); |
KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180; |
break; |
case 'a':// Texte der Analogwerte |
DebugTextAnforderung = pRxData[0]; |
if (DebugTextAnforderung > 31) DebugTextAnforderung = 31; |
PcZugriff = 255; |
break; |
case 'b': |
memcpy((unsigned char *)&ExternControl, (unsigned char *)pRxData, sizeof(ExternControl)); |
ConfirmFrame = ExternControl.Frame; |
PcZugriff = 255; |
break; |
case 'c': // Poll the 3D-Data |
if(!Intervall3D) { if(pRxData[0]) Timer3D = SetDelay(pRxData[0] * 10);} |
Intervall3D = pRxData[0] * 10; |
break; |
case 'd': // Poll the debug data |
DebugDataIntervall = pRxData[0] * 10; |
if(DebugDataIntervall > 0) DebugDataAnforderung = 1; |
break; |
case 'h':// x-1 Displayzeilen |
PcZugriff = 255; |
RemoteKeys |= pRxData[0]; |
if(RemoteKeys) DisplayLine = 0; |
DebugDisplayAnforderung = 1; |
break; |
case 'l':// x-1 Displayzeilen |
PcZugriff = 255; |
MenuePunkt = pRxData[0]; |
DebugDisplayAnforderung1 = 1; |
break; |
case 'v': // Version-Anforderung und Ausbaustufe |
GetVersionAnforderung = 1; |
break; |
case 'g':// |
GetExternalControl = 1; |
break; |
} |
break; // default: |
} |
NeuerDatensatzEmpfangen = 0; |
pRxData = 0; |
RxDataLen = 0; |
} |
//############################################################################ |
//Routine für die Serielle Ausgabe |
int uart_putchar (char c) |
//############################################################################ |
{ |
if (c == '\n') |
uart_putchar('\r'); |
//Warten solange bis Zeichen gesendet wurde |
loop_until_bit_is_set(USR, UDRE); |
//Ausgabe des Zeichens |
UDR = c; |
return (0); |
} |
// -------------------------------------------------------------------------- |
void WriteProgramData(unsigned int pos, unsigned char wert) |
{ |
//if (ProgramLocation == IN_RAM) Buffer[pos] = wert; |
// else eeprom_write_byte(&EE_Buffer[pos], wert); |
// Buffer[pos] = wert; |
} |
//############################################################################ |
//INstallation der Seriellen Schnittstelle |
void UART_Init (void) |
//############################################################################ |
{ |
//Enable TXEN im Register UCR TX-Data Enable & RX Enable |
UCR=(1 << TXEN) | (1 << RXEN); |
// UART Double Speed (U2X) |
USR |= (1<<U2X); |
// RX-Interrupt Freigabe |
UCSRB |= (1<<RXCIE); |
// TX-Interrupt Freigabe |
UCSRB |= (1<<TXCIE); |
//Teiler wird gesetzt |
UBRR=(SYSCLK / (BAUD_RATE * 8L) - 1); |
//UBRR = 33; |
//öffnet einen Kanal für printf (STDOUT) |
//fdevopen (uart_putchar, 0); |
//sbi(PORTD,4); |
Debug_Timer = SetDelay(DebugDataIntervall); |
Kompass_Timer = SetDelay(220); |
VersionInfo.SWMajor = VERSION_MAJOR; |
VersionInfo.SWMinor = VERSION_MINOR; |
VersionInfo.SWPatch = VERSION_PATCH; |
VersionInfo.ProtoMajor = VERSION_SERIAL_MAJOR; |
VersionInfo.ProtoMinor = VERSION_SERIAL_MINOR; |
pRxData = 0; |
RxDataLen = 0; |
} |
//--------------------------------------------------------------------------------------------- |
void DatenUebertragung(void) |
{ |
if(!UebertragungAbgeschlossen) return; |
if(DebugDisplayAnforderung && UebertragungAbgeschlossen) |
{ |
Menu(); |
SendOutData('H', FC_ADDRESS, 2, &DisplayLine, sizeof(DisplayLine), &DisplayBuff[DisplayLine * 20], 20); |
DisplayLine++; |
if(DisplayLine >= 4) DisplayLine = 0; |
DebugDisplayAnforderung = 0; |
} |
if(DebugDisplayAnforderung1 && UebertragungAbgeschlossen) |
{ |
Menu(); |
SendOutData('L', FC_ADDRESS, 3, &MenuePunkt, sizeof(MenuePunkt), &MaxMenue, sizeof(MaxMenue), DisplayBuff, sizeof(DisplayBuff)); |
DebugDisplayAnforderung1 = 0; |
} |
if(GetVersionAnforderung && UebertragungAbgeschlossen) |
{ |
SendOutData('V', FC_ADDRESS, 1, (unsigned char *) &VersionInfo, sizeof(VersionInfo)); |
GetVersionAnforderung = 0; |
} |
if(GetExternalControl && UebertragungAbgeschlossen) // Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
{ |
SendOutData('G',MeineSlaveAdresse, 1, (unsigned char *) &ExternControl, sizeof(ExternControl)); |
GetExternalControl = 0; |
} |
if((CheckDelay(Kompass_Timer)) && UebertragungAbgeschlossen) |
{ |
WinkelOut.Winkel[0] = (int) (IntegralNick / (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 |
{ |
SendOutData('A', FC_ADDRESS, 2, (unsigned char *)&DebugTextAnforderung, sizeof(DebugTextAnforderung),(unsigned char *) ANALOG_TEXT[DebugTextAnforderung], 16); |
DebugTextAnforderung = 255; |
} |
if(ConfirmFrame && UebertragungAbgeschlossen) // Datensatz bestätigen |
{ |
SendOutData('B', FC_ADDRESS, 1, (uint8_t*)&ConfirmFrame, sizeof(ConfirmFrame)); |
ConfirmFrame = 0; |
} |
if(GetPPMChannelAnforderung && UebertragungAbgeschlossen) |
{ |
SendOutData('P', FC_ADDRESS, 1, (unsigned char *) &PPM_in, sizeof(PPM_in)); |
GetPPMChannelAnforderung = 0; |
} |
} |
/branches/V0.76g-acid/uart.h |
---|
0,0 → 1,136 |
#ifndef _UART_H |
#define _UART_H |
#define MAX_SENDE_BUFF 150 |
#define MAX_EMPFANGS_BUFF 150 |
void BearbeiteRxDaten(void); |
extern unsigned char DebugGetAnforderung; |
extern unsigned volatile char SendeBuffer[MAX_SENDE_BUFF]; |
extern unsigned volatile char RxdBuffer[MAX_EMPFANGS_BUFF]; |
extern unsigned volatile char UebertragungAbgeschlossen; |
extern unsigned volatile char PC_DebugTimeout; |
extern unsigned volatile char NeueKoordinateEmpfangen; |
extern unsigned volatile char PC_MotortestActive; |
extern unsigned char MeineSlaveAdresse; |
extern unsigned char PcZugriff; |
extern unsigned char RemotePollDisplayLine; |
extern int Debug_Timer,Kompass_Timer; |
extern void UART_Init (void); |
extern int uart_putchar (char c); |
extern void boot_program_page (uint32_t page, uint8_t *buf); |
extern void DatenUebertragung(void); |
extern void Uart1Init(void); |
extern void BearbeiteRxDaten(void); |
extern unsigned char MotorTest[16]; |
struct str_DebugOut |
{ |
unsigned char Digital[2]; |
signed int Analog[32]; // Debugwerte |
}; |
extern struct str_DebugOut DebugOut; |
struct str_WinkelOut |
{ |
signed int Winkel[2]; |
unsigned char UserParameter[2]; |
unsigned char CalcState; |
unsigned char Orientation; |
}; |
extern struct str_WinkelOut WinkelOut; |
struct str_Data3D |
{ |
signed int Winkel[3]; // nick, roll, compass in 0,1° |
signed char reserve[8]; |
}; |
extern struct str_Data3D Data3D; |
struct str_ExternControl |
{ |
unsigned char Digital[2]; |
unsigned char RemoteTasten; |
signed char Nick; |
signed char Roll; |
signed char Gier; |
unsigned char Gas; |
signed char Hight; |
unsigned char free; |
unsigned char Frame; |
unsigned char Config; |
}; |
extern struct str_ExternControl ExternControl; |
struct str_VersionInfo |
{ |
unsigned char SWMajor; |
unsigned char SWMinor; |
unsigned char ProtoMajor; |
unsigned char ProtoMinor; |
unsigned char SWPatch; |
unsigned char Reserved[5]; |
}; |
extern struct str_VersionInfo VersionInfo; |
//Die Baud_Rate der Seriellen Schnittstelle ist 9600 Baud |
//#define BAUD_RATE 9600 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 14400 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 28800 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 38400 //Baud Rate für die Serielle Schnittstelle |
#define BAUD_RATE 57600 //Baud Rate für die Serielle Schnittstelle |
//Anpassen der seriellen Schnittstellen Register wenn ein ATMega128 benutzt wird |
#if defined (__AVR_ATmega128__) |
# define USR UCSR0A |
# define UCR UCSR0B |
# define UDR UDR0 |
# define UBRR UBRR0L |
# define EICR EICRB |
#endif |
#if defined (__AVR_ATmega32__) |
# define USR UCSRA |
# define UCR UCSRB |
# define UBRR UBRRL |
# define EICR EICRB |
# define INT_VEC_RX SIG_UART_RECV |
# define INT_VEC_TX SIG_UART_TRANS |
#endif |
#if defined (__AVR_ATmega644__) |
# define USR UCSR0A |
# define UCR UCSR0B |
# define UDR UDR0 |
# define UBRR UBRR0L |
# define EICR EICR0B |
# define TXEN TXEN0 |
# define RXEN RXEN0 |
# define RXCIE RXCIE0 |
# define TXCIE TXCIE0 |
# define U2X U2X0 |
# define UCSRB UCSR0B |
# define UDRE UDRE0 |
# define INT_VEC_RX SIG_USART_RECV |
# define INT_VEC_TX SIG_USART_TRANS |
#endif |
#if defined (__AVR_ATmega644P__) |
# define USR UCSR0A |
# define UCR UCSR0B |
# define UDR UDR0 |
# define UBRR UBRR0L |
# define EICR EICR0B |
# define TXEN TXEN0 |
# define RXEN RXEN0 |
# define RXCIE RXCIE0 |
# define TXCIE TXCIE0 |
# define U2X U2X0 |
# define UCSRB UCSR0B |
# define UDRE UDRE0 |
# define INT_VEC_RX SIG_USART_RECV |
# define INT_VEC_TX SIG_USART_TRANS |
#endif |
#endif //_UART_H |
/branches/V0.76g-acid/version.txt |
---|
0,0 → 1,360 |
------- |
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 |
carefree MOD |
voraussetzungen: |
FC ME oder FC 1.x + MK3MAG |
mit user parameter 8 stellt man ein, welche funktion aktiv ist. |
0 die funktion ist deaktiviert |
1-128 verwende gier gyro fuer die umrechnung (nur fuer ME zu empfehlen) |
>128 verwende MK3MAG. dabei ist zu beachten, dass kompass an und kompassrichtung fest aus ist |
255 ist fuer sportliche flieger und entschaerft stick D beim gieren. |
die startrichtung wird beim einschalten der motoren festgelegt. |