/branches/V0.76g_ACC-HH_MartinR/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_ACC-HH_MartinR/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_ACC-HH_MartinR/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_ACC-HH_MartinR/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_ACC-HH_MartinR/Hex-Files/Flight-Ctrl_MEGA644_V0_76g_ACC-HH_MartinR.hex |
---|
0,0 → 1,3718 |
:100000000C943B050C9456050C9456050C9456051F |
:100010000C9456050C9456050C9456050C945605F4 |
:100020000C9456050C947F180C9456050C945605A8 |
:100030000C94F72C0C9456050C9456050C9456050C |
:100040000C9456050C9456050C9420170C945605E8 |
:100050000C94F00B0C9456050C94BA0B0C945605AA |
:100060000C94C91D0C9456050C948E2B0C945605BB |
:100070000C94056E0C9456050C945605F61D021E44 |
:100080000D1E191E331E4D1E5F1E711E911E8220F5 |
:10009000F61E081F191F581F781F981F062074206E |
:1000A000B52BF32B012C272C532C602CCA2CCA2CDB |
:1000B000762C7A2C7E2C832C872C922C962C9A2CA6 |
:1000C0009F2CA32CAE2CB22CB62CBB2CBF2C0A0D13 |
: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 |
:1008600075742E0A0D0000008F001E01AD013B02C1 |
:10087000CA025803E603740402058F051B06A70687 |
:100880003307BE074808D2085B09E3096B0AF20A7E |
:10089000780BFD0B810C040D860D070E870E060FDD |
:1008A000840F00107B10F5106E11E5115B12CF1252 |
:1008B0004213B31323149214FE146A15D3153B1676 |
:1008C000A11605176717C81727188318DE183719D8 |
:1008D0008E19E319361A871AD61A231B6E1BB61BFC |
:1008E000FD1B411C831CC31C001D3C1D751DAB1D45 |
:1008F000E01D121E421E6F1E9A1EC31EE91E0D1F12 |
:100900002E1F4D1F691F841F9B1FB01FC31FD31FA6 |
:10091000E11FEC1FF51FFB1FFF1F0020000102035A |
:10092000040405060708090A0B0B0C0D0E0F101125 |
:1009300011121314151516171818191A1B1B1C1D44 |
:100940001D1E1F1F20212122232324242525262785 |
:1009500027282829292A2A2B2B2C2C2D2D2D2E2EE9 |
:100960002F2F30303031313232323333333434346C |
:100970003535353636363737373738383839393907 |
:10098000393A3A3A3A3B3B3B3B3C3C3C3C3C3D3DB4 |
:100990003D3D3E3E3E3E3E3F3F3F3F3F3F4040406D |
:1009A0004040404141414141414242424242424233 |
:1009B00043434343434343444444444444444445FD |
:1009C00045454545454545454646464646464646CF |
:1009D00046474747474747474747474748484848A4 |
:1009E000484848484848484949494949494949497E |
:1009F00049494949494A4A4A4A4A4A4A4A4A4A4A5C |
:100A00004A4A4A4B4B4B4B4B4B4B4B4B4B4B4B4B39 |
:100A10004B4B4B4B4C4C4C4C4C4C4C4C4C4C4C4C1A |
:100A20004C4C4C4C4C4C4C4D4D4D4D4D4D4D4D4DFD |
:100A30004D4D4D4D4D4D4D4D4D4D4D4D4D4E4E4EE3 |
:100A40004E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4EC6 |
:100A50004E4E4E4E4E4E4E4F4F4F4F4F4F4F4F4FAD |
:100A60004F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F96 |
:100A70004F4F4F4F4F4F11241FBECFEFD0E1DEBF7E |
:100A8000CDBF13E0A0E0B1E0EEE6F5EE02C00590C8 |
:100A90000D92A83DB107D9F71AE0A8EDB3E001C067 |
:100AA0001D92A532B107E1F70C9494060C94000056 |
:100AB000982F8150853008F093E0FB01A42FBB27CD |
:100AC000892F99270197A89F9001A99F300DB89F62 |
:100AD000300D1124D901AC59BF4F842F99270197AC |
:100AE00024F00E9499720192FACF0E94216C08951D |
:100AF000582F9B01863008F055E0552389F1A42F2B |
:100B0000BB27852F99270197A89FB001A99F700D3A |
:100B1000B89F700D1124DB01AC59BF4F842F99276A |
:100B2000F901019724F001900E94A672FACFA2E683 |
:100B3000B0E0042E0E94A672F901A0E5B0E088E0C2 |
:100B400090E021E08030920719F40E94B27203C055 |
:100B5000182E0E94B272852F0E94C3050E94216C3C |
:100B60000895CF93A2E0B0E00E949972802DC82F23 |
:100B70008150853020F0C3E08C2F0E94C3058C2F5C |
:100B80009927CF910895863008F085E0882329F0D1 |
:100B9000A2E0B0E0082E0E94A67208958091ED08B0 |
:100BA0009927880F991FFC01E554F74F80819181A7 |
:100BB0008D5E9F4F14F0109203018091ED089927EC |
:100BC000880F991FFC01E554F74F808191818A5B62 |
:100BD0009F4FDCF4809103018823B9F481E0809376 |
:100BE000030180918A078F5F80938A07853038F0F0 |
:100BF00088EE93E09093FD038093FC0306C066E9C2 |
:100C000070E080918A070E94383280918A07992784 |
:100C1000909358088093570808951F93CF93DF93BC |
:100C2000182F882351F08EEC90E09F938F931F92A2 |
:100C30000E949B140F900F900F9080910B098233AC |
:100C400008F048C084EF91E00E94FF17EC011123E7 |
:100C500029F0CE010E9407188823D9F38091190347 |
:100C600090911A0382389105D4F480910B0923E006 |
:100C7000829FC001112480930201112379F168EC55 |
:100C800070E0822F0E94383286ED90E09F938F9320 |
:100C90001F920E949B140F900F900F901FC0809185 |
:100CA0000B099927880F991F880F991F80930201BC |
:100CB0001123A1F068EC70E084E00E94383281EEEC |
:100CC00090E09F938F931F920E949B140F900F9020 |
:100CD0000F9004C080910B0980930201112301F150 |
:100CE0002AE080910201622F0E942972892F9927A0 |
:100CF0009F938F93809102010E94297299279F935D |
:100D00008F938CEE90E09F938F931F920E949B1481 |
:100D10008DB79EB707960FB6F8949EBF0FBE8DBFD6 |
:100D2000DF91CF911F910895CFEFD0E1DEBFCDBF0E |
:100D3000EE24FF2414B815B8E701219623E0C83E3D |
:100D4000D207D8F3189B0AC0199B04C08DE080938A |
:100D500000010DC08BE08093000109C0199B04C005 |
:100D600084E18093000103C08AE08093000181E860 |
:100D700087B93E9A8FEF88B98BE184B981E085B954 |
:100D80008EE38AB987E48BB9469A84B7877F84BF9C |
:100D9000809160008861809360001092600080ED17 |
:100DA00097E09093FD038093FC0310921905109235 |
:100DB00018051092C0081092BF08109217051092E3 |
:100DC00016051092150510921405809100018431CA |
:100DD00068F088E894E0A0E0B0E08093C4039093CA |
:100DE000C503A093C603B093C7030CC08BE095E086 |
:100DF000A0E0B0E08093C4039093C503A093C60322 |
:100E0000B093C703809100018A3011F0843111F44E |
:100E1000289801C0289A0E9468180E9439180E94D8 |
:100E200096110E94E22C0E94961C0E944D2B0E945B |
:100E30006A68789486E091E09F938F931F920E9456 |
:100E40009B140F900F900F9087E690E09F938F93E5 |
:100E50008CE490E09F938F931F921F922AE08091E1 |
:100E60000001622F0E942972892F99279F938F93E7 |
:100E7000809100010E94297299279F938F938CE2A1 |
:100E800091E09F938F931F920E949B148DB79EB702 |
:100E90000D960FB6F8949EBF0FBE8DBF80E691E011 |
:100EA0009F938F931F920E949B140F900F900F900F |
:100EB00080EB91E09F938F931F920E949B140F9061 |
:100EC0000F900F9088ED91E09F938F931F920E9457 |
:100ED0009B140F900F900F908091C800803231F4D6 |
:100EE0008091CA00863011F40E94AD6D809100019E |
:100EF0008C3010F4299A01C0299849E06DEE78E011 |
:100F000083E00E945805A8EEB3E00E949972802DFC |
:100F1000813089F5A1E0B0E00E949972802D8F3F69 |
:100F200051F11092C803EFEDF5E0A8EEB3E08DE4C7 |
:100F300090E021E08030920719F40E94A17203C072 |
:100F4000182E0E94A17230E04FED55E02091C803A9 |
:100F5000832F9927880F991F880F991FFC01E40F91 |
:100F6000F51F858518160CF42F5F3F5F303180F335 |
:100F70002093C8035CC08EEF91E09F938F931F92E4 |
:100F80000E949B1420E00F900F900F904FED55E0C2 |
:100F9000822F9927880F991F880F991FFC01E40F52 |
:100FA000F51F158616861786108A2F5F203180F36D |
:100FB00080E48093EC058093ED051092EE0580931C |
:100FC000EF058093F00590EC9093F1051092F205F7 |
:100FD0008093F3058093F4051092F5059093F60540 |
:100FE0009093F7058093F8051092F9058093FA0520 |
:100FF0009093FB052FED35E081E08093DF05D9016B |
:1010000011968BE0E4E0F1E001900D928A95E1F712 |
:10101000F901A8EEB3E08DE490E021E08030920782 |
:1010200019F40E94B27203C0182E0E94B27280910D |
:10103000C80399279F938F9380EE95E09F938F939A |
:101040008FE192E09F938F931F920E949B148DB724 |
:101050009EB707960FB6F8949EBF0FBE8DBF80E473 |
:1010600092E09F938F931F920E949B1410924804CA |
:101070001092F9030E947C410F900F900F90809185 |
:10108000F9038823E1F31092480480ED97E00E9471 |
:10109000FF17EC01CC24DD241092F9030E947C415F |
:1010A0008091F9038823E1F3C601880F991F880F07 |
:1010B000991FFC01E152FA4F85851816ACF48601A0 |
:1010C0000255174F08C01092F9030E947C4180918D |
:1010D000F9038823E1F3CE010E940718882321F445 |
:1010E000F8018081882379F3F601E255F74F80817A |
:1010F000882381F0C60101969F938F9382E592E049 |
:101100009F938F931F920E949B140F900F900F90AC |
:101110000F900F900894C11CD11CFCE0CF16D10495 |
:1011200008F4BACFCC24DD24C6E5D2E011E0F60104 |
:10113000E255F74F20812223D9F4C601880F991F69 |
:10114000880F991FFC01E152FA4F8585181684F427 |
:10115000C60101969F938F93DF93CF932F930E94A5 |
:101160009B141093FF030F900F900F900F900F9010 |
:10117000F601EE56F74F10820894C11CD11C2CE0EA |
:10118000C216D104A0F284E792E09F938F931F923E |
:101190000E949B140E947C410F900F900F90A1E041 |
:1011A000B0E00E949972802D803509F4A4C00E949D |
:1011B000C72F8AE992E09F938F931F920E949B14FE |
:1011C000C1E00F900F900F90C23011F40E94943044 |
:1011D000C33011F40E945F31C43010F00E9494308B |
:1011E00080910001843168F085E0809308091092B5 |
:1011F00026098BE1809304098EE480932309809370 |
:101200002409A0E5B0E00E949972802D8C3008F08E |
:101210005DC0A1E5B0E00E949972802D8C3008F08D |
:1012200055C0A2E5B0E00E949972802D8C3008F084 |
:101230004DC0A3E5B0E00E949972802D8C3008F07B |
:1012400045C0A0E5B0E00E949972802D8093ED0822 |
:10125000A1E5B0E00E949972802D8093EE08A2E58E |
:10126000B0E00E949972802D8093EF08A3E5B0E072 |
:101270000E949972802D8093F008A4E5B0E00E944E |
:101280009972802D8093F108A5E5B0E00E949972D3 |
:10129000802D8093F208A6E5B0E00E949972802D1F |
:1012A0008093F308A7E5B0E00E949972802D8093A7 |
:1012B000F408C13069F489EA92E09F938F931F92FA |
:1012C0000E949B140F900F900F9002C00E94AE2FAF |
:1012D00045E66DEE78E08C2F0E947805CF5FC63032 |
:1012E00008F472CF83E00E94C305A1E0B0E080E57E |
:1012F000082E0E94A672AEE0B0E00E949972802D86 |
:101300009927382F2227AFE0B0E00E949972802DF4 |
:10131000A901480F511D5093D9034093D803AAE067 |
:10132000B0E00E949972802D9927382F2227ABE0D8 |
:10133000B0E00E949972802D280F311D3093DB039D |
:101340002093DA032F5F3F4F19F04F5F5F4F41F457 |
:101350001092D9031092D8031092DB031092DA0393 |
:101360008091DA039091DB039F938F938091D80350 |
:101370009091D9039F938F9381EE92E09F938F93E7 |
:101380001F920E949B148DB79EB707960FB6F894D4 |
:101390009EBF0FBE8DBFA4E0B0E00E949972802D69 |
:1013A000853050F084E093E09F938F931F920E94CA |
:1013B0009B140F900F900F900E94B10545E66DEEC3 |
:1013C00078E00E9458050E94B10599279F938F935A |
:1013D0008BE193E09F938F931F920E949B148091C7 |
:1013E000F5080F900F900F900F900F9080FF20C086 |
:1013F00083E393E09F938F931F920E949B1488EE48 |
:1014000093E00E94FF17EC010E949C1C0F900F902C |
:101410000F90CE010E9407188823D9F383E593E04B |
:101420009F938F931F920E949B140F900F900F9089 |
:101430000E945932809100018A3011F0843111F4F8 |
:10144000289801C0289A80ED97E09093FD0380933F |
:10145000FC0385E580938C0788E593E09F938F9349 |
:101460001F920E949B148091F5080F900F900F908F |
:1014700082FF0BC084E693E09F938F931F920E949C |
:101480009B140F900F900F900AC080E793E09F93FA |
:101490008F931F920E949B140F900F900F900E94A9 |
:1014A000E82188E893E190939F0380939E0381E075 |
:1014B00080938B070E940D0682E893E09F938F93A1 |
:1014C0001F920E949B1480ED97E00E94FF17EC0191 |
:1014D0000F900F900F908091F903882309F442C177 |
:1014E00080912803882309F43DC11092F90380916B |
:1014F0008A07882319F00E94CE0502C00E94264761 |
:101500000E947C41809100018A3011F0843111F4F5 |
:10151000289801C0289A80911205882331F0809183 |
:10152000120581508093120505C080916F00806282 |
:1015300080936F008091CD05882369F0815080935E |
:10154000CD05882341F41092B6051092B50510928E |
:10155000B8051092B70580919E0390919F03019763 |
:1015600090939F0380939E0380919E0390919F038D |
:10157000892B21F080914904882379F180919E0381 |
:1015800090919F03892B89F40E945B2B85E090E06A |
:1015900090939F0380939E038091690890916A08BD |
:1015A000019690936A088093690880911203909144 |
:1015B00013038F5F9F4FD1F480911C058823B1F0F6 |
:1015C00080E197E29093FD038093FC0380E890E034 |
:1015D000909313038093120309C0809100018A3015 |
:1015E00011F0843111F4289801C0289A8091F903F0 |
:1015F000882321F080911C05882329F40E94D211B0 |
:101600000E94980E02C00E94980ECE010E940718F8 |
:10161000882309F4A5C0649680910E01882321F0E7 |
:10162000815080930E0125C01092960710923805C4 |
:101630001092370510923A051092390510923C0528 |
:1016400010923B0580911203909113038F5F9F4F7F |
:1016500081F480911205882361F488E99AE39093DC |
:10166000FD038093FC0380E09CE090931303809340 |
:10167000120380910201282F332780911903909142 |
:101680001A0382179307CCF48091470580628093F8 |
:10169000470580911203909113038F5F9F4F91F440 |
:1016A00080E797E19093FD038093FC0380E093E053 |
:1016B000909313038093120305C0809147058F7D9B |
:1016C000809347050E94956884E08093FE03809193 |
:1016D0001C05882331F40F2EFAEAEF2EF5E0FF2ED9 |
:1016E000F02D0894E11CF11C82E7E8168BE0F80667 |
:1016F000B9F5EE24FF248091D8039091D9039C0181 |
:101700002F5F3F4F3093D9032093D8038091DA03A2 |
:101710009091DB0301969093DB038093DA03AEE0B4 |
:10172000B0E0832F9927082E0E94A672AFE0B0E0A8 |
:101730008091D803082E0E94A672AAE0B0E08091A2 |
:10174000DB03082E0E94A672ABE0B0E08091DA03C2 |
:10175000082E0E94A67284E190E00E94FF17EC011F |
:101760000E94306C8091FE03882309F0B4CE0E9461 |
:10177000D768B1CE1F920F920FB60F9211248F939C |
:101780009F93EF93FF9380910C018823E1F4809164 |
:10179000EF039091F00301969093F0038093EF0391 |
:1017A000FC01E45CF94FE081ED3019F086399105D8 |
:1017B00039F41092F0031092EF0381E080930C0152 |
:1017C000E093C60004C01092F0031092EF03FF9163 |
:1017D000EF919F918F910F900FBE0F901F901895D2 |
:1017E0001F920F920FB60F9211242F933F934F9396 |
:1017F0005F938F939F93AF93BF93EF93FF9390E08B |
:101800008091C6008093E3038091F503863910F040 |
:101810009093F6038091E3038D3009F070C08091BE |
:10182000F603823009F06BC01092F6032091F503A5 |
:1018300089E997E0AC01420F511DFA0132972081EE |
:101840008091F1039091F203821B91099C01DA01CE |
:1018500011978C91281B3109C9019F709093F20355 |
:101860008093F1030024880F991F001C880F991F93 |
:10187000001C892F902D482F435C4093F303C9012E |
:101880008F739070982F935C9093F40380818417EA |
:1018900029F48C91891711F491E006C090E08091B1 |
:1018A000E6038F5F8093E6033091E403332309F06E |
:1018B00090C0992309F48DC081E08093E4032091C6 |
:1018C000F503822F8F5F8093E70389E997E0FC019E |
:1018D000E20FF11D8DE0808380919B07823509F036 |
:1018E00078C088E190E02CE00FB6F894A89580933A |
:1018F00060000FBE209360003093FF036AC08091A8 |
:10190000F60399278130910519F1823091051CF475 |
:10191000892B21F05CC00297D1F159C08091E3037B |
:10192000833239F48091E403882319F481E08093B1 |
:10193000F6038091E3038093990781E08093F50398 |
:101940008091E30399279093F2038093F10341C0C0 |
:101950008091F6038F5F8093F6032091F50389E968 |
:1019600097E0FC01E20FF11D8091E30380832F5F7C |
:101970002093F5032091E3038091F1039091F2030A |
:10198000820F911D9093F2038093F10322C0209166 |
:10199000F50389E997E0FC01E20FF11D8091E30373 |
:1019A0008083263928F4822F8F5F8093F50302C04D |
:1019B0001092F6038091E3032091F1033091F2033A |
:1019C000280F311D3093F2032093F10302C01092CF |
:1019D000F603FF91EF91BF91AF919F918F915F912E |
:1019E0004F913F912F910F900FBE0F901F90189520 |
:1019F0009C0140E050E0BA014817590768F4ACE395 |
:101A0000B6E0FA01EA0FFB1F8081680F711D4F5F7E |
:101A10005F4F42175307A8F37F702CE336E0FA01BB |
:101A2000E20FF31FCB010024880F991F001C880FC1 |
:101A3000991F001C892F902D835C80834F5F5F4F1F |
:101A4000FA01E20FF31FCB018F739070835C8083E8 |
:101A50004F5F5F4FFA01E20FF31F8DE0808310921A |
:101A60000C0180913C068093C60008958F929F924E |
:101A7000BF92CF92DF92EF92FF920F931F93CF937B |
:101A8000DF93CDB7DEB72E859F85B88860E070E024 |
:101A900000E06B01DB0183E280933C06892F8F59C4 |
:101AA00080933D0620933E066D5F7F4F0F2EF1E140 |
:101AB0008F2E9924F02D8C0E9D1EBB2069F0F40111 |
:101AC000C080D180329688249924689481F88E0E43 |
:101AD0009F1EA081B181BA94109709F4A3C00F2E64 |
:101AE000FCE3EF2EF6E0FF2EF02D1097C1F0F6018B |
:101AF000E00FF11D0F5F9081119791F4BB2081F0F1 |
:101B0000F401C080D180329688249924689481F8A9 |
:101B10008E0E9F1EA081B18100E0BA9401C090E0BA |
:101B20001097C1F0F601E00FF11D0F5F4081119792 |
:101B300091F4BB2081F0F401C080D18032968824DA |
:101B40009924689481F88E0E9F1EA081B18100E0D7 |
:101B5000BA9401C040E01097C1F0F601E00FF11D0A |
:101B60000F5F1081119791F4BB2081F0F401C080C8 |
:101B7000D180329688249924689481F88E0E9F1E15 |
:101B8000A081B18100E0BA9401C010E0FB01EE0D2C |
:101B9000FF1D892F86958695835C80836F5F7F4FBD |
:101BA000FB01EE0DFF1D892F9927837090709C011A |
:101BB00022953295307F3227207F32275527CA0160 |
:101BC000929582958F7089279F708927822B835CDD |
:101BD00080836F5F7F4FFB01EE0DFF1DCA018F7089 |
:101BE00090709C01220F331F220F331F812F9927E2 |
:101BF0000024880F991F001C880F991F001C892F33 |
:101C0000902D822B835C80836F5F7F4FFB01EE0DF5 |
:101C1000FF1D812F8F73835C80836F5F7F4F1097D1 |
:101C200009F063CFCB010E94F80CDF91CF911F9197 |
:101C30000F91FF90EF90DF90CF90BF909F908F908B |
:101C400008951F93CF93C3E07C2F8091E703682F03 |
:101C5000665009F460C0A9E9B7E0FD01E70FF11D86 |
:101C60008081982F9D537F5FFD01E70FF11D8081DB |
:101C7000382F3D537F5FFD01E70FF11D8081482F15 |
:101C80004D537F5FFD01E70FF11D8081582F5D539C |
:101C90007F5F892F9927880F991F880F991F232FFE |
:101CA00022952F70122F182B832F99278F709070E9 |
:101CB00082959295907F9827807F9827242F26954C |
:101CC0002695282B842F9927837090700024969551 |
:101CD00087950794969587950794982F802D582B74 |
:101CE00061506F3FC1F0FD01EC0FF11D1083CF5F1C |
:101CF00061506F3F81F0FD01EC0FF11D2083CF5F3C |
:101D000061506F3F41F0FD01EC0FF11D5083CF5F3B |
:101D1000662309F0A2CF8CE997E09093E9038093C2 |
:101D2000E8038C2F83508093EA03CF911F9108958D |
:101D3000EF92FF920F931F93CF93DF93CDB7DEB750 |
:101D400022970FB6F894DEBF0FBECDBF8091E4039B |
:101D5000882309F4CCC20E94210E80919A07823612 |
:101D600009F0ADC180919B0799278037910509F44F |
:101D7000C2C08137910584F48D36910509F47DC088 |
:101D80008E36910524F48B349105B1F098C18E36CE |
:101D9000910509F456C093C18337910509F40EC12A |
:101DA000843791052CF48137910509F4A8C087C1C7 |
:101DB00084379105F9F083C1E091E803F091E903DC |
:101DC0002081318130930105209300058091020527 |
:101DD00090910305281B390BC901845E9D4F68E66D |
:101DE00071E00E944972845B904090930505809356 |
:101DF000040565C18091E703853160F0E091E80357 |
:101E0000F091E90380E1A4E7B7E001900D928A9593 |
:101E1000E1F710C0E091E803F091E903808191813E |
:101E2000A281B3818093740790937507A09376077E |
:101E3000B093770780EF8093EC038FEF80930E01D0 |
:101E40003EC180910C018823E1F38DE490E09F93E3 |
:101E50008F938FED95E09F938F9381E08F938F9376 |
:101E60008EE48F930E94360D8DB79EB707960FB6FE |
:101E7000F8949EBF0FBE8DBF22C180910C018823B4 |
:101E8000E1F3A091E803B091E9038C918130D1F4A2 |
:101E90002FED35E08DE4F9010D9001928A95E1F77F |
:101EA000F901A8EEB3E08DE490E021E080309207E4 |
:101EB00019F40E94B27203C0182E0E94B27281E01F |
:101EC000898301C0198281E090E09F938F93CE01B6 |
:101ED00001969F938F9381E08F938F938DE48F93DF |
:101EE0000E94360D8DB79EB707960FB6F8949EBF29 |
:101EF0000FBE8DBFE4C081E08093E103E0C0E091BC |
:101F0000E803F091E90380818F3F39F40E94B10525 |
:101F1000E091E803F091E9038083E091E803F09118 |
:101F2000E9038081882319F481E0808309C0E0916E |
:101F3000E803F091E9038081863010F085E080832A |
:101F4000E091E803F091E90345E66DEE78E08081E9 |
:101F50000E94580580910C018823E1F3E091E80389 |
:101F6000F091E9038081898380E58A8385E690E0AA |
:101F70009F938F938DEE98E09F938F9321E030E0B5 |
:101F80003F932F93CE0102969F938F933F932F936E |
:101F9000CE01820F931F9F938F9383E08F9381E0F5 |
:101FA0008F9381E58F930E94360DADB7BEB71F9614 |
:101FB0000FB6F894BEBF0FBEADBF81C02091E8033D |
:101FC0003091E903F90180818150853008F05BC0D0 |
:101FD0008181803509F057C06DEE78E085E6A90172 |
:101FE0004E5F5F4FDB01FA01982F01900D929A9599 |
:101FF000E1F7482FD9018C910E947805809123093F |
:102000009927AA27BB270F2EF4ECEF2EF9E0FF2E1D |
:10201000F0E00F2FF0E01F2FF02DBC01CD01A80143 |
:1020200097010E940A72DC01CB018093A203909376 |
:10203000A303A093A403B093A50380912409992737 |
:10204000AA27BB27BC01CD010E940A72DC01CB018B |
:102050008093A6039093A703A093A803B093A9032A |
:10206000E091E803F091E90380810E94C3050E949A |
:10207000B105898380E00E940D066EE670E08981DB |
:102080000E94383201C0198280910C018823E1F34B |
:1020900081E090E09F938F93CE0101969F938F9361 |
:1020A00081E08F938F9383E58F930E94360DEDB778 |
:1020B000FEB737960FB6F894FEBF0FBEEDBF809106 |
:1020C0009B0799278436910509F4CCC08536910584 |
:1020D000ACF48136910509F47DC0823691052CF46B |
:1020E0008B34910509F458C0FAC08236910509F481 |
:1020F00081C08336910509F490C0F1C08C369105FA |
:1021000009F4D8C08D3691054CF48736910509F451 |
:10211000E3C08836910509F4B8C0E1C08437910561 |
:1021200029F08637910509F4D3C0D9C08091E7031F |
:10213000853160F0E091E803F091E90380E1A4E7E4 |
:10214000B7E001900D928A95E1F710C0E091E803A5 |
:10215000F091E90380819181A281B381809374071A |
:1021600090937507A0937607B093770780910C0141 |
:102170008823E1F31F9280910F018F9384E58F9361 |
:102180000E94360D8AEF8093EC038FEF80930E014F |
:102190000F900F900F90A3C0E091E803F091E90336 |
:1021A0002081318130930105209300058091020543 |
:1021B00090910305281B390BC901845E9D4F68E689 |
:1021C00071E00E944972845B904090930505809372 |
:1021D000040585C0E091E803F091E90380818093D4 |
:1021E0000D01803218F08FE180930D018FEF809305 |
:1021F0000E0175C0A091E803B091E9038BE0ECE813 |
:10220000F7E00D9001928A95E1F780919507809310 |
:1022100071088FEF80930E0162C08091ED03909161 |
:10222000EE03892B89F4E091E803F091E903E08162 |
:10223000EE2351F08AE0E89FC00111240E94FF17AD |
:1022400090933B0680933A06E091E803F091E9030E |
:1022500090818AE0989FC00111249093EE038093AF |
:10226000ED033DC0E091E803F091E90390818AE03D |
:10227000989FC00111249093110180931001892B24 |
:1022800071F181E08093DF032AC08FEF80930E010C |
:10229000E091E803F091E903908180914504892B56 |
:1022A00080934504882311F01092E20381E080932B |
:1022B000DE0315C08FEF80930E01E091E803F091EB |
:1022C000E90380818093440481E08093DD0307C0AB |
:1022D00081E08093E00303C081E08093DC031092EF |
:1022E000E4031092E9031092E8031092EA032296A5 |
:1022F0000FB6F894DEBF0FBECDBFDF91CF911F9117 |
:102300000F91FF90EF900895CF93C82F8A3019F462 |
:102310008DE00E9484118091C00085FFFCCFC093A6 |
:10232000C60080E090E0CF910895089588E1809301 |
:10233000C1008091C00082608093C0008091C10084 |
:1023400080688093C1008091C10080648093C10047 |
:102350008AE28093C40080911001909111010E9443 |
:10236000FF1790936907809368078CED90E00E94B7 |
:10237000FF17909398078093970710926A078CE451 |
:1023800080936B0786E080936E078AE080936C07EA |
:1023900081E080936D071092E9031092E803109298 |
:1023A000EA030895EF92FF920F931F9380910C011F |
:1023B000882309F460C28091DE038823C1F18091F3 |
:1023C0000C018823A1F10E94F42184E190E09F9305 |
:1023D0008F939091E20384E1989FC00111248D5C5A |
:1023E0009C4F9F938F9381E090E09F938F9382EE19 |
:1023F00093E09F938F9382E08F9381E08F9388E4A3 |
:102400008F930E94360D8091E2038F5F8093E203E9 |
:102410002DB73EB7255F3F4F0FB6F8943EBF0FBEB6 |
:102420002DBF843010F01092E2031092DE038091F1 |
:10243000DD03882371F180910C01882351F10E9402 |
:10244000F42180E590E09F938F9383E393E09F9343 |
:102450008F9321E030E03F932F9383E893E09F93A5 |
:102460008F933F932F9384E494E09F938F9383E023 |
:102470008F9381E08F938CE48F930E94360D10929E |
:10248000DD038DB79EB70F960FB6F8949EBF0FBEB3 |
:102490008DBF8091E0038823F1F080910C018823A7 |
:1024A000D1F08AE090E09F938F938AE697E09F9324 |
:1024B0008F9381E08F938F9386E58F930E94360DE3 |
:1024C0001092E0032DB73EB7295F3F4F0FB6F89447 |
:1024D0003EBF0FBE2DBF8091DC038823F9F08091B1 |
:1024E0000C018823D9F08BE090E09F938F938CE8C8 |
:1024F00097E09F938F9381E08F9380910F018F934B |
:1025000087E48F930E94360D1092DC038DB79EB73F |
:1025100007960FB6F8949EBF0FBE8DBF80919707A8 |
:10252000909198070E940718882309F465C080914C |
:102530000C01882309F460C0809104099927880F51 |
:10254000991F880F991F7C010027F7FC0095102F19 |
:102550008091C4049091C504A091C604B091C704B1 |
:10256000BC01CD01A80197010E947E7230938507BE |
:10257000209384078091CC049091CD04A091CE0447 |
:10258000B091CF04BC01CD01A80197010E947E72D9 |
:10259000309387072093860780912F0580938807C3 |
:1025A000809130058093890788E090E09F938F9316 |
:1025B00084E897E09F938F9381E08F9383E08F93DC |
:1025C00087E78F930E94360D2DB73EB7295F3F4FA7 |
:1025D0000FB6F8943EBF0FBE2DBF80918A0785309D |
:1025E00018F086E080938A0783E690E00E94FF1748 |
:1025F0009093980780939707809110019091110113 |
:10260000892B41F080916807909169070E94071813 |
:10261000882321F48091DF03882349F180910C0104 |
:10262000882329F182E490E09F938F938FE298E0D2 |
:102630009F938F9381E08F938F9384E48F930E9475 |
:10264000360D1092DF038DB79EB707960FB6F8943C |
:102650009EBF0FBE8DBF8091100190911101009718 |
:1026600031F00E94FF17909369078093680780916B |
:10267000ED039091EE03892B09F48AC080913A060C |
:1026800090913B060E940718882309F481C080912D |
:102690000C01882309F47CC0809104099927880FD4 |
:1026A000991F880F991F7C010027F7FC0095102FB8 |
:1026B0008091C4049091C504A091C604B091C70450 |
:1026C000BC01CD01A80197010E947E7230932D06B6 |
:1026D00020932C068091CC049091CD04A091CE043F |
:1026E000B091CF04BC01CD01A80197010E947E7278 |
:1026F00030932F0620932E062091B7093091B80908 |
:102700004091B9095091BA09DA01C901689412F8E7 |
:10271000880F991FAA1FBB1F1694D1F7820F931F12 |
:10272000A41FB51F820F931FA41FB51F2091C403C0 |
:102730003091C5034091C6035091C703BC01CD0140 |
:102740000E947E7230933106209330068EE090E036 |
:102750009F938F938CE296E09F938F9381E08F936A |
:102760008F9383E48F930E94360D8091ED039091B7 |
:10277000EE030E94FF1790933B0680933A062DB715 |
:102780003EB7295F3F4F0FB6F8943EBF0FBE2DBF37 |
:1027900080910D018F3F61F180E190E09F938F93D5 |
:1027A00080910D01992782959295907F9827807F3F |
:1027B00098278E5E9E4F9F938F9381E090E09F932A |
:1027C0008F938DE091E09F938F9382E08F9381E0D0 |
:1027D0008F9381E48F930E94360D8FEF80930D01CC |
:1027E0008DB79EB70B960FB6F8949EBF0FBE8DBFE8 |
:1027F000809171088823F1F080910C018823D1F039 |
:1028000081E090E09F938F9381E798E09F938F936F |
:1028100081E08F938F9382E48F930E94360D109204 |
:1028200071082DB73EB7295F3F4F0FB6F8943EBFF2 |
:102830000FBE2DBF8091E1038823E9F080910C0148 |
:102840008823C9F086E190E09F938F938BEB98E00B |
:102850009F938F9381E08F938F9380E58F930E9456 |
:10286000360D1092E1038DB79EB707960FB6F89418 |
:102870009EBF0FBE8DBF1F910F91FF90EF900895E7 |
:10288000982F80917208813071F48091430423E382 |
:1028900033E0F901E80FF11D90838F5F80934304CB |
:1028A00021E030E005C0892F0E948411282F3327B2 |
:1028B000C90108950F931F93CF93DF938C01EB0110 |
:1028C000672B39F0F80181918F010E944014219704 |
:1028D000C9F7DF91CF911F910F9108950F931F9327 |
:1028E000CF93DF938C01EB01672B41F0F8010F5F71 |
:1028F0001F4F84910E9440142197C1F7DF91CF911F |
:102900001F910F910895CF93C82F181634F480E2C9 |
:102910000E944014C1501C16D4F3CF910895CF9358 |
:10292000C82F181634F480E30E944014C1501C16BE |
:10293000D4F3CF9108952F923F924F925F926F926E |
:102940007F928F929F92AF92BF92CF92DF92EF923F |
:10295000FF920F931F93CF93DF93CDB7DEB7AF975F |
:102960000FB6F894DEBF0FBECDBF25962FAD2597CD |
:1029700027968EAD9FAD27978824992454012093E4 |
:1029800072080F2EF7E4CF2EDD24F02DCC0EDD1EC5 |
:102990007C01C701F7011491112359F0153249F058 |
:1029A0000894E11CF11CF7011491112311F0153268 |
:1029B000B9F7B701681B790B11F00E946E1411234F |
:1029C00009F425C20894E11CF11C00E00EA70CA735 |
:1029D00077247A9409A7F7010894E11CF11C14915B |
:1029E000153721F0812F80628837D1F400FF0CC0A9 |
:1029F000F601CC24DD246894C2F8CE0EDF1E808060 |
:102A00009180A280B3800CC0F601CC24DD246894B0 |
:102A1000C1F8CE0EDF1E808191814C01AA24BB2417 |
:102A2000103229F489A58823B1F619A7D4CF13321F |
:102A300011F40860D0CF1A3211F01D3299F41A3215 |
:102A400071F4F601CC24DD246894C1F8CE0EDF1EAB |
:102A5000E081ECA7EE230CF0BECFE195ECA700617E |
:102A60000F7DB9CF1B3211F419A7B5CF1E3209F073 |
:102A70003FC0F7010894E11CF11C14911A3289F44B |
:102A8000F601CC24DD246894C1F8CE0EDF1E6081EF |
:102A90007181CB016F5F7F4F14F48FEF9FEF782E22 |
:102AA0009ACF60E070E0812F80538A30C8F4CB0168 |
:102AB000880F991F880F991F880F991F860F971FDE |
:102AC000860F971F810F911DBC0160537040F70165 |
:102AD0000894E11CF11C1491812F80538A3038F343 |
:102AE000CB016F5F7F4F14F48FEF9FEF782E78CF7D |
:102AF000103321F404FD6FCF00626DCF812F81531D |
:102B00008930E8F460E070E0CB01880F991F880FEE |
:102B1000991F880F991F860F971F860F971F810F88 |
:102B2000911DBC0160537040F7010894E11CF11C39 |
:102B30001491812F80538A3038F36CA751CF183607 |
:102B400011F4046048CF1C3611F4016044CF1336F1 |
:102B500089F41E010894211C311CF601CC24DD24CB |
:102B60006894C1F8CE0EDF1E808189836624639449 |
:102B700019A602C1143421F0143611F0193671F57A |
:102B8000143409F4016000FF0CC0F601CC24DD24EC |
:102B90006894C2F8CE0EDF1E80809180A280B38040 |
:102BA0000EC0F601CC24DD246894C1F8CE0EDF1EE1 |
:102BB000808191814C01AA2497FCA094BA2CBB205F |
:102BC00054F4B094A09490948094811C911CA11C06 |
:102BD000B11C8DE289A78AE08DA775C01F3411F062 |
:102BE0001F3631F41F3409F40160E8E0EDA76AC034 |
:102BF000103789F4F601CC24DD246894C1F8CE0E98 |
:102C0000DF1E808191814C01AA24BB24F0E1FDA745 |
:102C1000006418E757C01337E1F5F601CC24DD2432 |
:102C20006894C1F8CE0EDF1E20803180211431045B |
:102C300089F41E010894211C311C88E289838EE6E8 |
:102C4000F101818385E78B838CE68C838D8389E218 |
:102C50008E831F827720A4F0872D992787FD90957A |
:102C6000AC0160E070E0C1010E944571009731F055 |
:102C7000682E621876145CF4672C09C0672C07C0B4 |
:102C8000F10101900020E9F731976E2E621819A624 |
:102C900073C0153511F0153731F4153509F401609D |
:102CA000FAE0FDA70FC0183519F0183709F059C020 |
:102CB00020E12DA703FF06C081149104A104B104F3 |
:102CC00009F0006419A67EA677200CF00F7D0F2E68 |
:102CD000F9E22F2E3324F02D2C0E3D1E8114910489 |
:102CE000A104B10411F47720B9F18DA5482E552423 |
:102CF000662477241FA684149504A604B70410F054 |
:102D0000E1E0EFA7C501B401A30192010E945C724A |
:102D1000DC01CB018A3010F4805D04C0895A18357B |
:102D200009F48F7DF10182931F01C501B401A30154 |
:102D300092010E945C7249015A01FFA5FF23D1F65E |
:102D40002DA5283049F403FF07C0F10180818033AD |
:102D500019F080E382931F016C2E6218F9E26F0E66 |
:102D60000BC0112309F453C01E010894211C311C0F |
:102D700019836624639419A6762C5EA456180AF467 |
:102D8000552489A5882311F0739404C006FF02C05E |
:102D900022E0720E750C802F992780739070892B1A |
:102DA00021F48CA587190E94831489A5882339F002 |
:102DB00061E070E0CE0189960E945A140CC006FFB3 |
:102DC0000AC080E38AA7FE01BA96118362E070E030 |
:102DD000CF010E945A14802F99278073907080979A |
:102DE00021F48CA587190E948F14852D0E948F14C1 |
:102DF000862D992787FD9095BC01C1010E945A1428 |
:102E000004FFC7CD8CA587190E948314C2CDAF964D |
:102E10000FB6F894DEBF0FBECDBFDF91CF911F91EB |
:102E20000F91FF90EF90DF90CF90BF90AF909F9069 |
:102E30008F907F906F905F904F903F902F9008956C |
:102E40001F920F920FB60F9211242F933F935F930F |
:102E50006F937F938F939F93AF93BF938091FE0364 |
:102E6000882329F08091FE0381508093FE03809196 |
:102E7000DA05882319F081508093DA0580910404E3 |
:102E80008150809304048F3FB9F489E08093040457 |
:102E9000809114038F5F817080931403882319F449 |
:102EA00081E08093F9038091F7039091F8030196F4 |
:102EB0009093F8038093F7038091FC039091FD03B6 |
:102EC000892BC9F08091FC039091FD0301979093A9 |
:102ED000FD038093FC032091FC033091FD0380915E |
:102EE00012039091130382239323892B11F021E085 |
:102EF00009C020E007C020E08FEF9FEF90931303FD |
:102F000080931203222341F0809100018A3011F452 |
:102F10005A9A09C0479A07C0809100018A3011F47B |
:102F20005A9801C047988091F50883FF5AC0349B96 |
:102F30000AC08091FA039091FB0301969093FB03E2 |
:102F40008093FA034EC08091FA039091FB03892B82 |
:102F500069F18091FA039091FB038A56914030F514 |
:102F60008091FA039091FB0369E270E00E94357250 |
:102F70008091FA039091FB03860F971F9093FB03B8 |
:102F80008093FA038091FA039091FB030B9750F022 |
:102F90008091FA039091FB030A9790930105809327 |
:102FA000000504C010920105109200052091000553 |
:102FB000309101058091020590910305281B390B82 |
:102FC000C901845E9D4F68E671E00E944972845B8E |
:102FD000904090930505809304051092FB03109296 |
:102FE000FA03BF91AF919F918F917F916F915F9104 |
:102FF0003F912F910F900FBE0F901F901895209129 |
:10300000F7033091F803820F931F019608952091E2 |
:10301000F7033091F803821B930B892F992786952C |
:10302000807490700895CF93DF930E94FF17EC0196 |
:10303000CE010E9407188823D9F3DF91CF9108951C |
:103040001F93CF93DF930E94FF17EC011FEC08C082 |
:1030500080912803882321F01092280310937A008E |
:10306000CE010E940718882399F3DF91CF911F9119 |
:1030700008959FB7F8945F983E9A469A8091B00061 |
:103080008F708093B0008091B00083608093B00017 |
:103090008091B1008B738093B1008091B1008B60FF |
:1030A0008093B1001092B2008FEF8093B3008091B3 |
:1030B000B00080688093B000809170008A7F809318 |
:1030C0007000809170008260809370009FBF0895AF |
:1030D0008AE090E00E94FF1790930C0480930B0409 |
:1030E00082E085BD83EA84BD17BC88E788BD86E0A1 |
:1030F00086BD80916E00816080936E0008951F925E |
:103100000F920FB60F9211242F933F934F935F931B |
:103110006F937F938F939F93AF93BF93EF93FF939F |
:1031200080910001843108F037C180910504882323 |
:1031300009F0A7C38091B00086FF0DC18091B00057 |
:103140008F7B8093B00089EA93E09093070480938B |
:10315000060480911503909116039C01220F331FE2 |
:10316000280F391F8091BB039927880F991F880F5B |
:10317000991F280F391F332314F42D5F3F4FC901C6 |
:10318000959587959595879590931603809315034C |
:1031900090930104809300048091440980FF39C01A |
:1031A00080911509682F7727882799272091C404D3 |
:1031B0003091C5044091C6045091C704552324F4AE |
:1031C00021583F4F4F4F5F4F689416F855954795DC |
:1031D000379527951694D1F70E940A72992324F403 |
:1031E000615C7F4F8F4F9F4FDC01CB01689415F8D6 |
:1031F000B595A795979587951694D1F720910004DA |
:1032000030910104820F931F909301048093000476 |
:1032100038C080911509682F772788279927209132 |
:10322000C4043091C5044091C6045091C70455238D |
:1032300024F421583F4F4F4F5F4F689416F855952F |
:103240004795379527951694D1F70E940A729923CE |
:1032500024F4615C7F4F8F4F9F4FDC01CB0168945A |
:1032600015F8B595A795979587951694D1F7209160 |
:10327000000430910104281B390B30930104209382 |
:1032800000048091160999279C01220F331F220FF9 |
:10329000331F8091000490910104821793072CF44E |
:1032A000309301042093000413C0809117099927DB |
:1032B0009C01220F331F220F331F80910004909135 |
:1032C00001042817390724F43093010420930004E3 |
:1032D000209100043091010480910604909107042C |
:1032E000820F931F805092409093070480930604AE |
:1032F000809100049091010499230CF40396959514 |
:10330000879595958795909301048093000480910B |
:103310000604909107048D5D954038F08CED95E0A2 |
:1033200090930704809306040DC080910604909149 |
:1033300007048757914030F487E791E090930704A2 |
:1033400080930604809106049091070490930904E9 |
:10335000809308041DC08091B00080648093B00009 |
:1033600080911C09282F33278DED96E0289FA0011E |
:10337000299F500D389F500D11249A018091080407 |
:1033800090910904281B390B3093070420930604FD |
:1033900081E08093050475C280910504882309F0BB |
:1033A00070C28091B00086FF3DC28091B0008F7BDB |
:1033B0008093B00080910A048823F1F480911C0965 |
:1033C000282F33278DED96E0289FA001299F500DCF |
:1033D000389F500D11249A0180910804909109049E |
:1033E000281B390B3093070420930604109209041C |
:1033F00010920804469A42C289EA93E09093070427 |
:103400008093060480910A0499278130910521F068 |
:10341000029709F4E0C0BEC1809115039091160394 |
:103420009C01220F331F280F391F8091BB0399275E |
:10343000880F991F880F991F280F391F332314F401 |
:103440002D5F3F4FC90195958795959587959093E9 |
:1034500016038093150390930104809300048091D8 |
:10346000440980FF39C080911509682F7727882784 |
:1034700099272091C4043091C5044091C60450910D |
:10348000C704552324F421583F4F4F4F5F4F689492 |
:1034900016F855954795379527951694D1F70E94BC |
:1034A0000A72992324F4615C7F4F8F4F9F4FDC0198 |
:1034B000CB01689415F8B595A795979587951694BF |
:1034C000D1F72091000430910104820F931F909353 |
:1034D00001048093000438C080911509682F772774 |
:1034E000882799272091C4043091C5044091C604CF |
:1034F0005091C704552324F421583F4F4F4F5F4F3D |
:10350000689416F855954795379527951694D1F7F1 |
:103510000E940A72992324F4615C7F4F8F4F9F4F62 |
:10352000DC01CB01689415F8B595A795979587951B |
:103530001694D1F72091000430910104281B390B17 |
:1035400030930104209300048091160999279C016F |
:10355000220F331F220F331F80910004909101042A |
:10356000821793072CF4309301042093000413C0B6 |
:103570008091170999279C01220F331F220F331FB7 |
:1035800080910004909101042817390724F43093A6 |
:1035900001042093000420910004309101048091E3 |
:1035A000060490910704820F931F805092409093DD |
:1035B00007048093060480910004909101049923EC |
:1035C0000CF40396959587959595879590930104AE |
:1035D00080930004F6C080911703909118039C011A |
:1035E000220F331F280F391F8091BC039927880FA2 |
:1035F000991F880F991F280F391F332314F42D5F4B |
:103600003F4FC90195958795959587959093180398 |
:1036100080931703909303048093020480914409DC |
:1036200081FF39C080911909682F7727882799274A |
:103630002091CC043091CD044091CE045091CF0420 |
:10364000552324F421583F4F4F4F5F4F689416F88D |
:1036500055954795379527951694D1F70E940A728C |
:10366000992324F4615C7F4F8F4F9F4FDC01CB0186 |
:10367000689415F8B595A795979587951694D1F701 |
:103680002091020430910304820F931F909303044E |
:103690008093020438C080911909682F7727882702 |
:1036A00099272091CC043091CD044091CE045091C3 |
:1036B000CF04552324F421583F4F4F4F5F4F689458 |
:1036C00016F855954795379527951694D1F70E948A |
:1036D0000A72992324F4615C7F4F8F4F9F4FDC0166 |
:1036E000CB01689415F8B595A7959795879516948D |
:1036F000D1F72091020430910304281B390B309339 |
:1037000003042093020480911A0999279C01220F37 |
:10371000331F220F331F80910204909103048217FC |
:1037200093072CF4309303042093020413C0809178 |
:103730001B0999279C01220F331F220F331F8091F1 |
:103740000204909103042817390724F430930304EA |
:103750002093020420910204309103048091060416 |
:1037600090910704820F931F80509240909307041A |
:1037700080930604809102049091030499230CF431 |
:1037800003969595879595958795909303048093D7 |
:10379000020417C080910A049927880F991FFC0121 |
:1037A000E554F74F808191819C01280F391F80914A |
:1037B000060490910704820F931F9093070480934F |
:1037C000060480910604909107048D5D954038F0C1 |
:1037D0008CED95E090930704809306040DC08091D2 |
:1037E0000604909107048757914030F487E791E0F1 |
:1037F0009093070480930604809106049091070437 |
:103800009C012C5B30403093070420930604809188 |
:10381000080490910904820F931F909309048093E8 |
:1038200008042CC08091B00080648093B0002CEB21 |
:1038300030E03093070420930604809108049091AF |
:103840000904820F931F90930904809308048091C8 |
:10385000FF03882331F080911205853B10F04698D4 |
:1038600001C0469A80910A04982F9F5F90930A04A2 |
:1038700080911C09891710F410920A0481E080934A |
:103880000504209106043091070441E02F373407E6 |
:1038900058F08FEF8093B300C9018F5F90409093F1 |
:1038A00007048093060431C0209106043091070478 |
:1038B0002F3F310501F1F8F0C9018F5F90408F373C |
:1038C000910558F480E88093B300C9018058904076 |
:1038D000909307048093060418C08FEF8093B30081 |
:1038E00080910604909107048F5F904090930704A5 |
:1038F000809306040AC0809106048093B30010925E |
:1039000007041092060410920504FF91EF91BF91F5 |
:10391000AF919F918F917F916F915F914F913F9167 |
:103920002F910F900FBE0F901F90189510927C0052 |
:103930008FEC80937A0008950F931F93CF93DF93BA |
:10394000A3E0B0E00E949972802DC82FDD27C53119 |
:10395000D10508F02A97C7BD1092240484E690E0B0 |
:103960000E94201880912303909124038052934059 |
:1039700010F4C0E0D0E0CA3FD105D0F40AEA13E069 |
:10398000C7BD82E390E00E9420181F930F931F92FF |
:103990000E949B140F900F900F90809123039091A1 |
:1039A00024038052934020F02196CA3FD10540F372 |
:1039B000A3E0B0E00C2E0E94A672C0937F088CE2B8 |
:1039C00091E00E942018DF91CF911F910F910895EF |
:1039D000DF92EF92FF920F931F93CF93DF93FF2419 |
:1039E000F0922904F0922A04F0922B0480ED97E0E3 |
:1039F0000E94FF17EC011CE801E00F2EFAE0EF2E09 |
:103A0000F02D0F2EF5EFDF2EF02D23E0F21619F436 |
:103A10001B3008F019E0FF248091130490911404E6 |
:103A20008C5F934034F4809125038150809325036B |
:103A30000EC080911304909114048750944034F088 |
:103A4000809125038F5F8093250301C0F3948091BB |
:103A50001504909116048C5F934034F480912603F2 |
:103A60008150809326030EC0809115049091160416 |
:103A70008750944034F0809126038F5F8093260313 |
:103A800001C0F39480911704909118048C5F9340C7 |
:103A900034F48091270381508093270319C08091CB |
:103AA000170490911804875094408CF0809127035C |
:103AB0008F5F809327030CC08CEA93E09F938F93D2 |
:103AC0001F920E949B140F900F900F9044C0F3948C |
:103AD00088E0809346040E94532B809125038A300E |
:103AE00020F400932904E092250380912503863F6A |
:103AF00020F000932904D0922503809126038A3078 |
:103B000020F400932A04E092260380912603863F46 |
:103B100020F000932A04D0922603809127038A3054 |
:103B200020F400932B04E092270380912703863F23 |
:103B300020F000932B04D092270380914604882321 |
:103B400051F0CE010E940718882309F0B5CF80916B |
:103B500046048823B1F7109228038FEC80937A00F3 |
:103B6000809128038823E1F31A3020F48AE090E062 |
:103B70000E942018115009F048CF86E490E00E947E |
:103B80002018DF91CF911F910F91FF90EF90DF9060 |
:103B900008951F920F920FB60F921124EF92FF9289 |
:103BA0000F931F932F933F934F935F936F937F9345 |
:103BB0008F939F93AF93BF93CF93DF93EF93FF9335 |
:103BC00080912D04282F3327442755278F5F80931A |
:103BD0002D04F9012231310508F0D3C3E25CFF4F17 |
:103BE000EE0FFF1F0590F491E02D0994809178006D |
:103BF00090917900909333048093320481E0809314 |
:103C00002C04C4C380917800909179009093310482 |
:103C10008093300410922C04B9C380917800909165 |
:103C2000790090932F0480932E0486E080932C04D7 |
:103C3000ADC32091BC043091BD0480917800909177 |
:103C40007900281B390B30937408209373088091F6 |
:103C5000730890917408909339048093380487E036 |
:103C600080932C0493C32091780030917900809147 |
:103C7000BA049091BB04281B390B30937E08209323 |
:103C80007D0880917D0890917E0890933B048093FD |
:103C90003A0482E080932C0479C32091780030911B |
:103CA00079008091320490913304820F931F909396 |
:103CB00033048093320481E080932C0467C3209105 |
:103CC0007800309179008091300490913104820F16 |
:103CD000931F909331048093300484E080932C04EC |
:103CE00055C38091190390911A039C01220F331F31 |
:103CF000280F391F809178009091790063E070E07F |
:103D00000E943572CB01820F931F969587959695E9 |
:103D1000879590931A038093190385E080932C0470 |
:103D200035C320917800309179008091C004909142 |
:103D3000C104281B390B30931E0420931D0481E01D |
:103D400080931F0480917800909179009093760879 |
:103D50008093750880911D0490911E049C01442756 |
:103D600037FD4095542F8091FC049091FD04A09163 |
:103D7000FE04B091FF04820F931FA41FB51F809310 |
:103D8000FC049093FD04A093FE04B093FF042091E3 |
:103D9000FC043091FD044091FE045091FF04552332 |
:103DA00024F421503C4F4F4F5F4F012E1AE05595A0 |
:103DB0004795379527951A95D1F7102D8091FC04DA |
:103DC0009091FD04A091FE04B091FF04821B930B1F |
:103DD000A40BB50B8093FC049093FD04A093FE0408 |
:103DE000B093FF0483E080932C04D0C2209178002C |
:103DF000309179008091320490913304820F931FA7 |
:103E0000909333048093320481E080932C04BEC2EB |
:103E100080917800909179002091300430913104A4 |
:103E2000820F931F909331048093300410922C04DE |
:103E3000ADC2809100018A3091F4209178003091D8 |
:103E4000790080912E0490912F04820F931F019688 |
:103E500096958795909318048093170425C08091B8 |
:103E60000001843199F4209178003091790080919B |
:103E70002E0490912F04280F391F8FEF97E0821B9B |
:103E8000930B90931804809317040EC080917800D0 |
:103E90009091790020912E0430912F04820F931F6E |
:103EA000909318048093170486E080932C046EC2CC |
:103EB0002091BC043091BD048091780090917900EC |
:103EC000281B390B309374082093730820917308D2 |
:103ED000309174088091380490913904820F931FB7 |
:103EE00090931A048093190487E080932C044EC2A7 |
:103EF00020917800309179008091BA049091BB04B0 |
:103F0000281B390B30937E0820937D0820917D0873 |
:103F100030917E0880913A0490913B04820F931F68 |
:103F200090931C0480931B0482E080932C042EC287 |
:103F3000809178009091790020913204309133047F |
:103F4000280F391F309333042093320480910001ED |
:103F50008A3041F4C901820F931F909333048093F8 |
:103F600032040CC08091320490913304880F991F61 |
:103F7000880F991F90933304809332048091320408 |
:103F80009091330499230CF4079695958795959510 |
:103F900087959595879590931404809313042091A9 |
:103FA0003404309135048091320490913304280F09 |
:103FB000391F332314F42F5F3F4F359527953093E6 |
:103FC0003504209334048091B0049091B104281BEF |
:103FD000390B30931C0320931B0320910D04309167 |
:103FE0000E0480911B0390911C03280F391F33236B |
:103FF00014F42F5F3F4FC9019595879590930E0458 |
:1040000080930D0481E080932C04C0C180917800DE |
:10401000909179002091300430913104280F391F9C |
:104020003093310420933004809100018A3041F4B0 |
:10403000C901820F931F90933104809330040CC008 |
:104040008091300490913104880F991F880F991F37 |
:104050009093310480933004809130049091310426 |
:1040600099230CF407969595879595958795959541 |
:10407000879590931604809315042091360430910F |
:1040800037048091300490913104280F391F332375 |
:1040900014F42F5F3F4F35952795309337042093C5 |
:1040A00036048091B2049091B304281B390B3093ED |
:1040B0001E0320931D0320910F0430911004809162 |
:1040C0001D0390911E03280F391F332314F42F5F13 |
:1040D0003F4FC901959587959093100480930F04E5 |
:1040E00083E080932C0452C110922D0481E08093D0 |
:1040F0002803809127049091280401969093280426 |
:104100008093270480917800909179009093240304 |
:104110008093230380912303909124039C014427DF |
:10412000552780913C0490913D04A0913E04B091AC |
:104130003F04FA01E901C80FD91FEA1FFB1FC09312 |
:104140003C04D0933D04E0933E04F0933F048091FF |
:1041500040048F5F80934004823108F40EC12091A7 |
:104160001F03309120034091210350912203DA0173 |
:10417000C901689412F8880F991FAA1FBB1F1694D3 |
:10418000D1F7821B930BA40BB50B7C018D01EC0EB8 |
:10419000FD1E0E1F1F1F80912404992787FD9095F7 |
:1041A000A92FB92FBC01CD0126EC34E240E050E04C |
:1041B0000E940A72DC01CB01A8019701281B390B70 |
:1041C0004A0B5B0BDA01C9010496A11DB11DBB238B |
:1041D0002CF4DA01C9010B96A11DB11D689412F8E7 |
:1041E000B595A795979587951694D1F780931F035A |
:1041F00090932003A0932103B0932203809177082A |
:10420000909178089C01442737FD4095542F809168 |
:104210001F0390912003A0912103B0912203281B3A |
:10422000390B4A0B5B0B20931D0530931E05409301 |
:104230001F055093200520912004309121044091C6 |
:10424000220450912304552324F4215F3F4F4F4F04 |
:104250005F4F689413F855954795379527951694B1 |
:10426000D1F78091200490912104A0912204B09173 |
:104270002304821B930BA40BB50B80932004909313 |
:104280002104A0932204B0932304209120043091B0 |
:104290002104409122045091230480911D059091A6 |
:1042A0001E05A0911F05B0912005820F931FA41F2A |
:1042B000B51F8093200490932104A0932204B0930F |
:1042C00023048091250490912604AC0142955295D7 |
:1042D000507F5427407F5427481B590B809120045E |
:1042E00090912104A0912204B0912304BB231CF4DB |
:1042F0000F96A11DB11D689413F8B595A7959795D4 |
:1043000087951694D1F720911D0530911E05281B25 |
:10431000390BC901880F991F880F991F880F991FA2 |
:10432000840F951F99230CF40F9695958795959575 |
:104330008795959587959595879590932604809375 |
:10434000250480913C0490913D04A0913E04B091DD |
:104350003F04BB231CF40196A11DB11DB595A79583 |
:104360009795879580933C0490933D04A0933E04D9 |
:10437000B0933F0489E08093400482E080932C0452 |
:1043800005C010922D0482E080932C0480912C04AF |
:1043900080937C0080912D04882319F08FEC80930A |
:1043A0007A00FF91EF91DF91CF91BF91AF919F91F3 |
:1043B0008F917F916F915F914F913F912F911F91BD |
:1043C0000F91FF90EF900F900FBE0F901F901895D8 |
:1043D00080E023E333E090E2F901E80FF11D9083E0 |
:1043E0008F5F8035C8F30895DF92EF92FF920F93AD |
:1043F0001F938091440490918303981710F4909335 |
:1044000044048091450480FF0CC0809144048823BB |
:1044100021F081508093440404C0809183038093F1 |
:1044200044048091450481FF0EC090914404809122 |
:104430008303981719F41092440405C08091440432 |
:104440008F5F8093440480914504992780FF04C0C6 |
:1044500081FF02C0109244040E94E821909144041C |
:104460009A30A8F481E180934304892F99279F9380 |
:104470008F9383EE93E09F938F9381E08F930E94BD |
:104480009B140F900F900F900F900F9015C080E12C |
:10449000809343048091440499279F938F9388EEDF |
:1044A00093E09F938F9381E08F930E949B140F90D2 |
:1044B0000F900F900F900F908091440499278730B0 |
:1044C000910509F4B5C588309105DCF48330910578 |
:1044D00009F4D9C18430910564F48130910509F45F |
:1044E000C1C0823091050CF04FC1892B39F10C9479 |
:1044F0003E2B8530910509F4F5C206970CF030C5C6 |
:104500003BC28B30910509F4C8C68C30910544F448 |
:104510008930910509F419C60A970CF06BC6C8C515 |
:104520008D30910509F4A3C78D3091050CF41FC798 |
:104530000E9711F40C94E42A0C943E2B1092430431 |
:104540008DEE93E09F938F9311E01F930E949B1435 |
:1045500084E1809343040F900F900F9087E690E0E2 |
:104560009F938F938CE490E09F938F931F921F9261 |
:104570002AE080910001622F0E942972892F9927D9 |
:104580009F938F93809100010E94297299279F9396 |
:104590008F938DEF93E09F938F931F930E949B14B3 |
:1045A00088E2809343048DB79EB70D960FB6F894BA |
:1045B0009EBF0FBE8DBF80EE95E09F938F930E94AC |
:1045C000B10599279F938F9382E194E09F938F93F6 |
:1045D0001F930E949B148DB79EB707960FB6F89451 |
:1045E0009EBF0FBE8DBF80919E0390919F03069743 |
:1045F00078F48CE38093430480E294E09F938F935C |
:104600001F930E949B140F900F900F900C94452BBA |
:10461000909149049923B1F08CE380934304892F4E |
:1046200099279F938F938DE294E09F938F9381E0DE |
:104630008F930E949B140F900F900F900F900F90EC |
:104640000C94452B8CE38093430482E494E09F9385 |
:104650008F9381E08F930E949B140F900F900F9087 |
:104660000C94452B8091F50880FF72C01092430492 |
:1046700080911D0590911E05A0911F05B091200508 |
:104680000F2EF5E0EF2EF0E0FF2EF0E00F2FF0E020 |
:104690001F2FF02DBC01CD01A80197010E947E7251 |
:1046A0003F932F9382E594E09F938F93DD24D394DF |
:1046B000DF920E949B1484E1809343040F900F903B |
:1046C0000F900F900F908091210590912205A0915D |
:1046D0002305B0912405BC01CD01A80197010E94DA |
:1046E0007E723F932F9381E694E09F938F93DF92A6 |
:1046F0000E949B1488E2809343040F900F900F90C8 |
:104700000F900F9080912303909124039F938F9398 |
:1047100080E794E09F938F93DF920E949B148CE339 |
:10472000809343040F900F900F900F900F9087B5D8 |
:1047300099279F938F938FE794E09F938F93DF92B6 |
:104740000E949B140F900F900F900F900F909DC799 |
:1047500084E1809343048EE894E09F938F9311E06B |
:104760001F930E949B1488E2809343040F900F9044 |
:104770000F9085E994E09F938F931F930E949B1461 |
:104780000F900F900F9081C71092430483EA94E03A |
:104790009F938F9381E08F930E949B1484E1809379 |
:1047A00043040F900F900F908091C4049091C50422 |
:1047B000A091C604B091C704BB2324F481509C4F40 |
:1047C000AF4FBF4F072E7AE0B595A7959795879580 |
:1047D0007A95D1F7702DBF93AF939F938F938DEA06 |
:1047E00094E09F938F9381E08F930E949B1488E2C3 |
:1047F000809343048DB79EB707960FB6F8949EBF7B |
:104800000FBE8DBF8091CC049091CD04A091CE04B9 |
:10481000B091CF04BB2324F481509C4FAF4FBF4FC6 |
:10482000072E7AE0B595A795979587957A95D1F754 |
:10483000702DBF93AF939F938F938CEB94E09F93D6 |
:104840008F9311E01F930E949B148CE38093430489 |
:104850008DB79EB707960FB6F8949EBF0FBE8DBF5B |
:1048600080910005909101059F938F938BEC94E0CC |
:104870009F938F931F930E949B140F900F900F9004 |
:104880000F900F9002C7109243048091BF0890913F |
:10489000C0089F938F938091BD089091BE089F930D |
:1048A0008F938AED94E09F938F9311E01F930E9462 |
:1048B0009B1484E1809343048DB79EB707960FB68F |
:1048C000F8949EBF0FBE8DBF8091C3089091C4081D |
:1048D0009F938F938091C1089091C2089F938F936B |
:1048E0008AEE94E09F938F931F930E949B1488E21B |
:1048F000809343048DB79EB707960FB6F8949EBF7A |
:104900000FBE8DBF8091C7089091C8089F938F9369 |
:104910008091C5089091C6089F938F938AEF94E089 |
:104920009F938F931F930E949B148CE38093430467 |
:104930008DB79EB707960FB6F8949EBF0FBE8DBF7A |
:104940008091CB089091CC089F938F938091C90858 |
:104950009091CA089F938F938AE095E09F938F93DD |
:104960001F930E949B148DB79EB707960FB6F894BD |
:104970009EBF0FBE8DBF89C6109243048091EE0882 |
:1049800099270BEB18E0880F991FFC01E00FF11F2E |
:10499000808191819F938F938091ED089927880F53 |
:1049A000991FFC01E00FF11F808191819F938F93EC |
:1049B0008AE195E09F938F93FF24F394FF920E94E6 |
:1049C0009B1484E1809343048DB79EB707960FB67E |
:1049D000F8949EBF0FBE8DBF8091F0089927880F75 |
:1049E000991FFC01E00FF11F808191819F938F93AC |
:1049F0008091EF089927880F991FFC01E00FF11FA4 |
:104A00008081918188589F4F9F938F938AE295E090 |
:104A10009F938F93FF920E949B1488E2809343049C |
:104A20008DB79EB707960FB6F8949EBF0FBE8DBF89 |
:104A30008091F2089927880F991FFC01E00FF11F60 |
:104A40008081918182599F4F9F938F938091F1082C |
:104A50009927880F991FFC01E00FF11F8081918138 |
:104A600082599F4F9F938F938AE395E09F938F93F3 |
:104A7000FF920E949B148CE3809343048DB79EB7F2 |
:104A800007960FB6F8949EBF0FBE8DBF8091F408B5 |
:104A90009927880F991FFC01E00FF11F80819181F8 |
:104AA00082599F4F9F938F938091F3089927880F86 |
:104AB000991FFC01E00FF11F8081918182599F4F66 |
:104AC0009F938F938AE495E09F938F93FF920E9428 |
:104AD0009B148DB79EB707960FB6F8949EBF0FBE76 |
:104AE0008DBFD3C5109243048AE595E09F938F93C1 |
:104AF00081E08F930E949B140F900F900F908091F4 |
:104B000000018A3009F0AFC084E180934304209112 |
:104B1000B0043091B104C90133230CF40796887FA7 |
:104B2000281B390B3F932F938091B0049091B104CF |
:104B300099230CF407969595879595958795959566 |
:104B400087959F938F932091B0043091B1043323C4 |
:104B500014F4295F3F4F3595279535952795359561 |
:104B600027958091130490911404821B930B9F93BB |
:104B70008F9388E695E09F938F9381E08F930E94B7 |
:104B80009B1488E2809343048DB79EB709960FB6B5 |
:104B9000F8949EBF0FBE8DBF2091B2043091B30434 |
:104BA000C90133230CF40796887F281B390B3F93E8 |
:104BB0002F938091B2049091B30499230CF407963B |
:104BC0009595879595958795959587959F938F93BF |
:104BD0002091B2043091B304332314F4295F3F4F82 |
:104BE0003595279535952795359527958091150409 |
:104BF00090911604821B930B9F938F938AE795E005 |
:104C00009F938F9311E01F930E949B148CE38093DA |
:104C100043048DB79EB709960FB6F8949EBF0FBE9A |
:104C20008DBF8091B4049091B5049F938F93209190 |
:104C3000B4043091B5048091170490911804281B96 |
:104C4000390B3F932F938CE895E09F938F931F939D |
:104C50000E949B148DB79EB707960FB6F8949EBF1F |
:104C60000FBE8DBF12C5809100018B3019F08431C9 |
:104C700009F0C3C084E1809343042091B0043091D3 |
:104C8000B104C90133230CF40F96807F281B390B24 |
:104C9000C9010AF40196959587959F938F9380910A |
:104CA000B0049091B10499230CF40F9695958795D3 |
:104CB0009595879595958795959587959F938F93CE |
:104CC0002091B0043091B104332314F4295F3F4F95 |
:104CD000359527953595279535952795809113041A |
:104CE00090911404821B930B9F938F938BE995E013 |
:104CF0009F938F9381E08F930E949B1488E280930F |
:104D000043048DB79EB709960FB6F8949EBF0FBEA9 |
:104D10008DBF2091B2043091B304C90133230CF448 |
:104D20000F96807F281B390BC9010AF401969595CF |
:104D300087959F938F938091B2049091B3049923A8 |
:104D40000CF40F96959587959595879595958795EC |
:104D5000959587959F938F932091B2043091B304DA |
:104D6000332314F4295F3F4F3595279535952795C3 |
:104D7000359527958091150490911604821B930B0D |
:104D80009F938F938DEA95E09F938F9381E08F930C |
:104D90000E949B148CE3809343048DB79EB70996C1 |
:104DA0000FB6F8949EBF0FBE8DBF8091B404909152 |
:104DB000B50499230CF40196959587959F938F934D |
:104DC0002091B4043091B504809117049091180497 |
:104DD000281B390B3F932F938FEB95E09F938F9375 |
:104DE00081E08F930E949B148DB79EB707960FB6F4 |
:104DF000F8949EBF0FBE8DBF48C4809100018D30D6 |
:104E000009F043C484E180934304809125039927EA |
:104E10009F938F938091B0049091B10499230CF4E7 |
:104E20000F969595879595958795959587959595E1 |
:104E300087959F938F932091B0043091B1043323D1 |
:104E400014F4295F3F4F359527953595279535956E |
:104E500027958091130490911404821B930B9F93C8 |
:104E60008F938EEC95E09F938F9381E08F930E94B8 |
:104E70009B1488E2809343048DB79EB709960FB6C2 |
:104E8000F8949EBF0FBE8DBF8091260399279F93F4 |
:104E90008F938091B2049091B30499230CF40F96F0 |
:104EA00095958795959587959595879595958795EA |
:104EB0009F938F932091B2043091B304332314F461 |
:104EC000295F3F4F3595279535952795359527953A |
:104ED0008091150490911604821B930B9F938F93DE |
:104EE00082EE95E09F938F9381E08F930E949B14B5 |
:104EF0008CE3809343048DB79EB709960FB6F89460 |
:104F00009EBF0FBE8DBF8091270399279F938F93DC |
:104F10008091B4049091B50499230CF40196959571 |
:104F200087959F938F932091B4043091B50480911D |
:104F3000170490911804281B390B3F932F9386EF89 |
:104F400095E09F938F9381E08F930E949B148DB780 |
:104F50009EB709960FB6F8949EBF0FBE8DBF95C33E |
:104F6000109243048AE096E09F938F9311E01F9381 |
:104F70000E949B1484E1809343040F900F900F9044 |
:104F80008091BA049091BB049F938F9380911B04EE |
:104F900090911C049F938F9387E196E09F938F934A |
:104FA0001F930E949B1488E2809343048DB79EB7A1 |
:104FB00007960FB6F8949EBF0FBE8DBF8091BC04BC |
:104FC0009091BD049F938F938091190490911A043E |
:104FD0009F938F9386E296E09F938F931F930E94F7 |
:104FE0009B148CE3809343048DB79EB707960FB64E |
:104FF000F8949EBF0FBE8DBF8091C0049091C104F4 |
:105000009F938F9380916E0990916F099F938F93D7 |
:1050100085E396E09F938F931F930E949B148DB717 |
:105020009EB707960FB6F8949EBF0FBE8DBF2DC3D7 |
:1050300084E1809343048091190390911A039F9314 |
:105040008F9384E496E09F938F9311E01F930E94C7 |
:105050009B1488E2809343040F900F900F900F9061 |
:105060000F908091120599279F938F9383E596E087 |
:105070009F938F931F930E949B148CE38093430410 |
:105080000F900F900F900F900F908091BA08992772 |
:1050900001979F938F9382E696E09F938F931F9340 |
:1050A0000E949B140F900F900F900F900F90EDC2E5 |
:1050B0001092430482E796E09F938F9311E01F9331 |
:1050C0000E949B1484E1809343040F900F900F90F3 |
:1050D00080910405909105059F938F9381E896E058 |
:1050E0009F938F931F930E949B1488E280934304A5 |
:1050F0000F900F900F900F900F908091000590915E |
:1051000001059F938F9380E996E09F938F931F9360 |
:105110000E949B148CE3809343040F900F900F9098 |
:105120000F900F9080910205909103059F938F93AC |
:105130008FE996E09F938F931F930E949B140F908B |
:105140000F900F900F900F90A0C210924304809187 |
:105150000A0590910B059F938F938EEA96E09F939B |
:105160008F9311E01F930E949B1484E1809343046A |
:105170000F900F900F900F900F9080910C059091D1 |
:105180000D059F938F938AEB96E09F938F931F93C8 |
:105190000E949B1488E2809343040F900F900F901D |
:1051A0000F900F9080910E0590910F059F938F9314 |
:1051B00086EC96E09F938F931F930E949B148CE341 |
:1051C000809343040F900F900F900F900F90809159 |
:1051D0001005909111059F938F9382ED96E09F9318 |
:1051E0008F931F930E949B140F900F900F900F901E |
:1051F0000F904BC2109243048EED96E09F938F93D5 |
:1052000011E01F930E949B1484E1809343040F904C |
:105210000F900F908091BB0399279F938F9386EEF9 |
:1052200096E09F938F931F930E949B1488E2809334 |
:1052300043040F900F900F900F900F9080910004F7 |
:10524000909101049F938F9384EF96E09F938F93A7 |
:105250001F930E949B148CE3809343040F900F9044 |
:105260000F900F900F908091170999279F938F931C |
:105270008091160999279F938F9382E097E09F93DF |
:105280008F931F930E949B148DB79EB707960FB6FE |
:10529000F8949EBF0FBE8DBFF8C11092430480E109 |
:1052A00097E09F938F9311E01F930E949B1484E1DA |
:1052B000809343040F900F900F908091900799274F |
:1052C00087FD90959F938F9380918F07992787FDF6 |
:1052D00090959F938F9380E297E09F938F931F9376 |
:1052E0000E949B1488E2809343048DB79EB7079673 |
:1052F0000FB6F8949EBF0FBE8DBF8091910799277E |
:1053000087FD90959F938F938091920799279F9304 |
:105310008F9380E397E09F938F931F930E949B143A |
:105320008CE3809343048DB79EB707960FB6F8942D |
:105330009EBF0FBE8DBF8091960799279F938F9335 |
:1053400080919307992787FD90959F938F9380E491 |
:1053500097E09F938F931F930E949B148DB79EB7E6 |
:1053600007960FB6F8949EBF0FBE8DBF8EC11092E8 |
:10537000430480E597E09F938F9311E01F930E9471 |
:105380009B1484E1809343040F900F900F908091C1 |
:10539000950899279F938F938091940899279F93BD |
:1053A0008F938091930899279F938F938091920870 |
:1053B00099279F938F9380E697E09F938F931F93F6 |
:1053C0000E949B1488E2809343048DB79EB70B968E |
:1053D0000FB6F8949EBF0FBE8DBF80919908992794 |
:1053E0009F938F938091980899279F938F93809193 |
:1053F000970899279F938F938091960899279F9359 |
:105400008F9385E797E09F938F931F930E949B1440 |
:105410008CE3809343048DB79EB70B960FB6F89438 |
:105420009EBF0FBE8DBF80919D0899279F938F933C |
:1054300080919C0899279F938F9380919B0899272F |
:105440009F938F9380919A0899279F938F938AE8CF |
:1054500097E09F938F931F930E949B148DB79EB7E5 |
:105460000B960FB6F8949EBF0FBE8DBF0EC1109263 |
:1054700043048FE997E09F938F9311E01F930E945D |
:105480009B1484E1809343040F900F900F908091C0 |
:10549000B10899278D969F938F938091B008992793 |
:1054A0008D969F938F938091AF0899278D969F93A8 |
:1054B0008F938091AE0899278D969F938F938EEA54 |
:1054C00097E09F938F931F930E949B1488E2809391 |
:1054D00043048DB79EB70B960FB6F8949EBF0FBED0 |
:1054E0008DBF8091B50899278D969F938F9380915A |
:1054F000B40899278D969F938F938091B30899272D |
:105500008D969F938F938091B20899278D969F9344 |
:105510008F9382EC97E09F938F931F930E949B142D |
:105520008CE3809343048DB79EB70B960FB6F89427 |
:105530009EBF0FBE8DBF8091B60899278D969F9311 |
:105540008F9386ED97E09F938F931F930E949B14F8 |
:105550000F900F900F900F900F908091B7088823B5 |
:1055600069F080E48093430486EE97E09F938F93E5 |
:105570001F930E949B140F900F900F908091B8087A |
:10558000882371F084E48093430489EE97E09F932D |
:105590008F9381E08F930E949B140F900F900F9038 |
:1055A0008091B908882309F470C088E4809343048B |
:1055B0008CEE97E09F938F9381E08F930E949B14D2 |
:1055C0000F900F900F9061C0109243048FEE97E000 |
:1055D0009F938F9311E01F930E949B1484E180930B |
:1055E00043040F900F900F908091D8039091D903AE |
:1055F0009F938F938DEF97E09F938F931F930E94BC |
:105600009B1488E2809343040F900F900F900F90AB |
:105610000F908091DA039091DB039F938F938AE040 |
:1056200098E09F938F931F930E949B1489E480932B |
:1056300043040F900F900F900F900F9087E198E028 |
:105640009F938F931F930E949B14809145040F900A |
:105650000F900F9083FF19C01092D9031092D803B6 |
:10566000AEE0B0E080E0082E0E94A672AFE0B0E0AD |
:105670008091D803082E0E94A67207C0809144042E |
:1056800081508093830310924404109245041F912B |
:105690000F91FF90EF90DF9008951092B9008AE289 |
:1056A0008093B800089585EA8093BC00089584E94A |
:1056B0008093BC0008950E94572B1092460480915D |
:1056C000BB001092470480E88093BC001092BD009C |
:1056D0001092BA001092BB001092B9001092B8005C |
:1056E0000E944D2B0E94532B80E00E94782B08953E |
:1056F0001092B9008093BB0085E88093BC000895A8 |
:105700008093BB0085E88093BC00089585EC80936E |
:10571000BC00089585E88093BC0008951F920F9205 |
:105720000FB60F9211242F933F934F935F936F9374 |
:105730007F938F939F93AF93BF93EF93FF9380914A |
:105740004604282F3327442755278F5F809346042C |
:10575000F9012731310508F01DC1E05BFF4FEE0F65 |
:10576000FF1F0590F491E02D099440914704542FB8 |
:10577000842F99272FED35E0B901880F991F880FE5 |
:10578000991FFC01E20FF31F85851816ACF04C3011 |
:1057900098F4252F2F5F822F9927880F991F880F44 |
:1057A000991FFC01E60FF71F858518161CF0522F74 |
:1057B0002C3078F320934704809147048C3061F4B7 |
:1057C0001092470483E08093460480914804880F38 |
:1057D0008D5A0E94782BE0C080914704880F8E5A22 |
:1057E0000E94782BD9C08091470422EA39E0F90160 |
:1057F000E80FF11D8F5F8093470480810E94782B12 |
:10580000CBC08091B9008033A9F480914C048823E7 |
:1058100021F48091470480934C0480914704992798 |
:10582000FC01EF56F74F80818F5F8083882311F44E |
:105830008FEF80830E94572B8AE090E090939F0324 |
:1058400080939E03109246040E94532BA5C0809122 |
:10585000B9008034A9F0209148048EEA98E0FC0158 |
:10586000E20FF11D1082822F8F5F809348048C30ED |
:1058700010F0109248040E94572B109246040CC05E |
:10588000209148048EEA98E0FC01E20FF11D822F7E |
:105890008C5F80830E94862B80914C048093490406 |
:1058A00010924C0479C0209148048EE998E0FC01E4 |
:1058B000E20FF11D8091BB0080830E948A2B6CC097 |
:1058C0002091480482E898E0FC01E20FF11D8091EC |
:1058D000BB0080832F5F209348042C3010F010927F |
:1058E00048040E94572B1092460456C088E90E9433 |
:1058F000782B52C080E10E94782B4EC08091250306 |
:105900000E94782B49C080E80E94782B45C00E94F5 |
:10591000572B8AE090E090939F0380939E030E9410 |
:10592000532B3AC088E90E94782B36C082E10E944E |
:10593000782B32C0809126030E94782B2DC080E8FE |
:105940000E94782B29C00E94572B8AE090E0909308 |
:105950009F0380939E030E94532B1EC088E90E94E0 |
:10596000782B1AC084E10E94782B16C080912703FF |
:105970000E94782B11C080E80E94782B0DC00E94F5 |
:10598000572B8AE090E090939F0380939E031092A0 |
:10599000460402C0109246048091BC008068809347 |
:1059A000BC00FF91EF91BF91AF919F918F917F913B |
:1059B0006F915F914F913F912F910F900FBE0F907C |
:1059C0001F90189583EC8093810080916F00806216 |
:1059D00080936F001092B5041092B4041092B30437 |
:1059E0001092B2041092B1041092B00408951F9264 |
:1059F0000F920FB60F921124AF92BF92CF92DF9207 |
:105A0000EF92FF920F931F932F933F934F935F93C8 |
:105A10006F937F938F939F93AF93BF93CF93DF93B6 |
:105A2000EF93FF938091450982FDDFC020918600AE |
:105A30003091870080914E0490914F04A901481B3A |
:105A4000590B809186009091870090934F0480932A |
:105A50004E04CA018D549440835F9A4198F480911A |
:105A600050048093BA088091500490915104049797 |
:105A700014F01092840381E090E09093510480939D |
:105A8000500451C220915004309151042A30310504 |
:105A90000CF049C2CA018B5F9040845B914008F0D2 |
:105AA00083C0425D5140C901820F931FFC01E55440 |
:105AB000F74F80819181FA01E81BF90BCF011AF4AD |
:105AC000909581959F4F06976CF480911205883CC4 |
:105AD00030F480911205865F8093120503C088EC34 |
:105AE000809312058091500490915104880F991F62 |
:105AF000FC01E554F74F20813181C901880F991FBE |
:105B0000EC01C20FD31FC40FD51FCE01DD230CF44F |
:105B10000396EC01D595C795D595C795CA01019611 |
:105B20008C179D0714F4219706C0CA010197C81766 |
:105B3000D9070CF4219680911205833CF8F08091EE |
:105B4000500490915104880F991F8C010F52174FE8 |
:105B5000FC01E554F74F808191819E01281B390B90 |
:105B6000C90163E070E00E944972CB01880F991F60 |
:105B7000860F971FF801918380830BC0809150049A |
:105B800090915104880F991FFC01EF52F74F118239 |
:105B900010828091500490915104880F991FFC014C |
:105BA000E554F74FD183C083809150049091510404 |
:105BB00001969093510480935004059711F45D9AD7 |
:105BC00001C05D988091500490915104069711F4A2 |
:105BD0005C9A01C05C9880915004909151040797A1 |
:105BE00011F45B9AA0C15B989EC120918600309110 |
:105BF00087008091520490915304A901481B590BCE |
:105C00008091860090918700909353048093520472 |
:105C1000CA018D549440835F9A4108F098C08091E6 |
:105C2000AC0480934D0480914D04843008F46FC01F |
:105C30009091BA0880914D04981709F068C080913E |
:105C4000AD048B3008F45BC0109284031092AC0456 |
:105C5000582F0F2EF0E8AF2EF4E0BF2EF02DCBEB37 |
:105C6000D8E00F2EF6E9CF2EF4E0DF2EF02D61ED17 |
:105C700078E00F2EF4E5EF2EF4E0FF2EF02D0AE68B |
:105C800014E040E05F31C8F0842F99279C01280F71 |
:105C9000391FD901AA0DBB1DF901EC0FFD1F808131 |
:105CA00091818D939C93D901AC0DBD1DF901E60F37 |
:105CB000F71F808191818D939C93842F99279C015C |
:105CC000280F391FD901AC0FBD1FF901EE0DFF1DC3 |
:105CD0008081918111969C938E93D901A60FB71F55 |
:105CE000F901E00FF11F8081918111969C938E93B1 |
:105CF000842F8F5F482F8B3028F28093AC048091E3 |
:105D0000AD048F3FB9F08F5F8093AD0413C08091D5 |
:105D1000AD04853620F08AE08093AD0402C0109275 |
:105D2000AD04809100018A3011F0843111F4289A79 |
:105D300001C0289881E08093AC0480911C058823E1 |
:105D400009F0F1C080914D048093BA08ECC0209115 |
:105D5000AC042A3008F0B0C0CA018B5F9040845B6D |
:105D6000914008F08BC0425D5140822F9927880FE7 |
:105D7000991FFC01EC5AFB4F80819181FA01E81BCD |
:105D8000F90BCF0105960B97D0F48091AD048A31C1 |
:105D900030F080911205865F8093120509C08091D2 |
:105DA000AD048B3028F0809112058E5F8093120530 |
:105DB00080911205893C18F088EC8093120580913F |
:105DC000AC049927880F991FFC01EC5AFB4F2081E6 |
:105DD0003181C901880F991FEC01C20FD31FC40F75 |
:105DE000D51FCE01DD230CF40396EC01D595C795A4 |
:105DF000D595C795CA0101968C179D0714F4219774 |
:105E000006C0CA010197C817D9070CF421968091E2 |
:105E100012058E3BF0F08091AC049927880F991FF2 |
:105E20008C0106591B4FFC01EC5AFB4F808191817C |
:105E30009E01281B390BC90163E070E00E94497282 |
:105E4000CB01880F991F860F971FF80191838083DC |
:105E50000AC08091AC049927880F991FFC01E6596C |
:105E6000FB4F118210828091AC049927880F991FF3 |
:105E7000FC01EC5AFB4FD183C08309C08091000123 |
:105E80008A3011F0843111F4289A01C02898809149 |
:105E9000AC04853011F45D9A01C05D988091AC042A |
:105EA000863011F45C9A01C05C988091AC04873014 |
:105EB00011F45B9A01C05B988091AC04843120F4AA |
:105EC0008F5F8093AC042FC08091AC04843159F56E |
:105ED000809100018A3011F0843111F4289A01C0B8 |
:105EE00028988EE18093AC0440E00BEB18E0C0E80A |
:105EF000D4E061ED78E0842F99279C01280F391FA9 |
:105F0000D901A00FB11FF901EC0FFD1F8081918114 |
:105F100011969C938E93F901E60FF71F1182108260 |
:105F20004F5F4B3040F3FF91EF91DF91CF91BF91E5 |
:105F3000AF919F918F917F916F915F914F913F9121 |
:105F40002F911F910F91FF90EF90DF90CF90BF9016 |
:105F5000AF900F900FBE0F901F90189581E0809327 |
:105F6000EF0882E08093EE0883E08093ED0884E000 |
:105F70008093F00885E08093F10886E08093F20832 |
:105F800087E08093F30888E08093F40808951F93D6 |
:105F90008AE68093F50851E0509345094EE140931D |
:105FA000F6088BEF8093F8088AE08093F908409315 |
:105FB000F7084093FB0885E08093FC0880E4809319 |
:105FC000FD081092FE0884E18093FA088EE0809329 |
:105FD000FF08E0E1E09300091CE010930109F8E0FC |
:105FE000F093020986EE809303094093040980E848 |
:105FF0008093050930E53093060996E990930709E7 |
:1060000083E0809308093093090990930A0981E29B |
:1060100080930B0983E280930C0940930D09109241 |
:106020000E0960E260930F09109210091092110995 |
:10603000109212091092130910922809109229093E |
:1060400010922A0910922B0924E62093140998E251 |
:106050009093150950934409109216098AEF809382 |
:10606000170976E070931C09209318099093190979 |
:1060700010921A0980931B0982E380931D099AE507 |
:1060800090931E0980931F09109243099093200951 |
:10609000309321095093220985E580932309809349 |
:1060A0002409E093250960932609209327098FE5A9 |
:1060B00080932C0983EF80932E098AEA809330091C |
:1060C000809331098FE080932D0980932F098CEF05 |
:1060D00080933209209333099093340990933509C2 |
:1060E000909336098BE48093370980933809809325 |
:1060F000390910923A0970933B09F0933C09909347 |
:106100003D0940933E0920933F092093400984E0D4 |
:1061100080934109A5E8B3E0E6E4F9E00D9001922F |
:106120001A95E1F71F9108958AE68093F50871E0CA |
:10613000709345095EE15093F6088BEF8093F80861 |
:106140009AE09093F9085093F7085093FB0885E084 |
:106150008093FC0880E48093FD081092FE088FE095 |
:106160008093FA089093FF0880E18093000966E02D |
:1061700060930109E8E0E093020986EE8093030949 |
:106180005093040980E8809305092AE520930609C5 |
:1061900098E79093070983E0809308092093090901 |
:1061A00090930A0981E280930B0983E280930C09A2 |
:1061B00050930D0910920E0940E240930F0910927E |
:1061C00010091092110910921209109213091092DD |
:1061D00028091092290910922A0910922B0934E6F5 |
:1061E0003093140998E29093150970934409109222 |
:1061F00016098AEF8093170960931C0930931809D8 |
:106200009093190910921A0980931B0982E38093D5 |
:106210001D0920931E0980931F09109243092093A2 |
:10622000200980E5809321098CE38093220985E58C |
:1062300080932309809324094093250940932609DC |
:106240009BE4909327098FE580932C0983EF80933B |
:106250002E098AEA809330098093310984E1809382 |
:106260002D0980932F098CEF8093320930933309E5 |
:1062700020933409209335092093360990933709E8 |
:10628000909338099093390910923A0960933B0929 |
:10629000E0933C0920933D0950933E0930933F0918 |
:1062A0003093400984E0809341098CE0ACE8B3E08E |
:1062B000E6E4F9E00D9001928A95E1F708958AE607 |
:1062C0008093F50871E0709345094EE14093F6081C |
:1062D0008BEF8093F8088AE08093F9084093F708E1 |
:1062E0004093FB0885E08093FC0880E48093FD08E0 |
:1062F0001092FE088FE08093FA0868E06093FF0830 |
:1063000020E12093000956E05093010960930209AF |
:1063100086EE809303094093040980E88093050981 |
:1063200034E63093060998E79093070983E0809359 |
:1063300008093093090990930A0981E280930B09B7 |
:1063400083E280930C0984E180930D0910920E0979 |
:1063500020930F091092100910921109109212093E |
:1063600010921309109228091092290910922A09F3 |
:1063700010922B093093140998E2909315097093A9 |
:106380004409109216098AEF8093170950931C094B |
:10639000309318099093190910921A0980931B09D8 |
:1063A00092E390931D092AE520931E0990931F09FB |
:1063B000109243092093200980E58093210986E407 |
:1063C0008093220985E5809323098093240980E244 |
:1063D0008093250980932609909327098FE5809360 |
:1063E0002C0983EF80932E098AEA809330098093E9 |
:1063F000310940932D0940932F098CEF8093320986 |
:1064000030933309209334092093350920933609BA |
:106410008BE480933709809338098093390910926F |
:106420003A0950933B0960933C0920933D094093FE |
:106430003E0930933F093093400984E0809341093D |
:106440008CE0A4E9B3E0E6E4F9E00D9001928A95CE |
:10645000E1F708956817790754F4860F971F9C0198 |
:10646000992314F42F5F3F4FC9019595879508959F |
:106470001F93CF93DF93182FEB0180911C05882386 |
:10648000A1F411501F3F89F0D093FD03C093FC038A |
:106490008091FC039091FD03892BD1F7CE018C0FE5 |
:1064A0009D1F0E941318115078F7DF91CF911F9113 |
:1064B00008956F927F928F929F92AF92BF92CF92E8 |
:1064C000DF92EF92FF920F931F93CF9300E010E0C3 |
:1064D00078016801469A1093BB040093BA041093A4 |
:1064E000BD040093BC041093C1040093C004109336 |
:1064F000B1040093B0041093B3040093B20410935A |
:10650000B5040093B404109381090093800910929C |
:10651000BE031092BF03109224040E949C3F84E6A5 |
:1065200090E00E9420180E949C3F8091F50880FF17 |
:1065300010C08091230390912403875B934038F42B |
:1065400080912303909124038E5E924010F40E9468 |
:106550009C1CC0E08AE090E00E9420188091170403 |
:1065600090911804080F191F80911304909114043E |
:10657000E80EF91E8091150490911604C80ED91EDC |
:10658000CF5FC03238F3C7014096AC0156954795AE |
:10659000569547955093B1044093B004C601409678 |
:1065A0009C0136952795369527953093B304209313 |
:1065B000B204C801409696958795929582958F7002 |
:1065C00089279F7089279093B5048093B404909392 |
:1065D0008109809380093093B7042093B6045093C7 |
:1065E000B9044093B804A4E0B0E00E949972802DF1 |
:1065F000853058F18091BB099091BC0999231CF416 |
:10660000909581959F4F6CE070E00E944972709365 |
:10661000BD046093BC0480919F099091A0099923C7 |
:106620001CF4909581959F4F6CE070E00E94497238 |
:106630007093BB046093BA048091750890917608BA |
:106640009093C1048093C00439C0A4E0B0E00E94DC |
:106650009972802D9927382F2227A5E0B0E00E945B |
:106660009972802D280F311D3093BB042093BA04FA |
:10667000A6E0B0E00E949972802D9927382F22273A |
:10668000A7E0B0E00E949972802D280F311D309351 |
:10669000BD042093BC04A8E0B0E00E949972802D54 |
:1066A0009927382F2227A9E0B0E00E949972802D07 |
:1066B000280F311D3093C1042093C0041092640947 |
:1066C0001092630910925509109254091092B10961 |
:1066D0001092B00984E690E00E94201880911B047B |
:1066E00090911C049C01442737FD4095542FDA01FA |
:1066F000C901880F991FAA1FBB1F880F991FAA1FC6 |
:10670000BB1F820F931FA41FB51F7C018D01E20EDA |
:10671000F31E041F151FF092A009E0929F098091BB |
:10672000190490911A049C01442737FD4095542F79 |
:10673000DA01C901880F991FAA1FBB1F880F991F73 |
:10674000AA1FBB1F820F931FA41FB51F3C014D0141 |
:10675000620E731E841E951E7092BC096092BB0966 |
:1067600080910409A82EBB24CC24DD249701442762 |
:1067700037FD4095542FC601B5010E940A727B0176 |
:106780008C016093C4047093C5048093C6049093F5 |
:10679000C7049301442737FD4095542FC601B50126 |
:1067A0000E940A72DC01CB018093CC049093CD044B |
:1067B000A093CE04B093CF04E092E804F092E904F1 |
:1067C0000093EA041093EB048093F0049093F10497 |
:1067D000A093F204B093F3041092F4041092F50421 |
:1067E0001092F6041092F70480911F0390912003F9 |
:1067F000A0912103B09122039093780880937708A9 |
:1068000010922604109225041092FC041092FD04AC |
:106810001092FE041092FF048091000590910105F2 |
:1068200090930305809302050E94406882E390E004 |
:106830009093FD038093FC03809123099927AA2755 |
:10684000BB270F2EF4ECEF2EF9E0FF2EF0E00F2F18 |
:10685000F0E01F2FF02DBC01CD01A80197010E948F |
:106860000A72DC01CB018856954CAF4FBF4F809325 |
:10687000A2039093A303A093A403B093A5038091D4 |
:1068800024099927AA27BB27BC01CD010E940A72BF |
:10689000DC01CB018856954CAF4FBF4F8093A603C8 |
:1068A0009093A703A093A803B093A9031092C303E6 |
:1068B0001092C2038091000590910105AA2797FDCF |
:1068C000A095BA2F2091C4033091C5034091C6030F |
:1068D0005091C703BC01CD010E940A72DC01CB01BB |
:1068E0008093B7099093B809A093B909B093BA09F6 |
:1068F000109209051092080581E0809301010E9421 |
:10690000216C809147058460809347058FEF8093C9 |
:10691000200A1092210A80E28093220A8091F108D5 |
:1069200099272BEB38E0880F991FFC01E20FF31F2A |
:106930008081918182599F4F90930B0580930A0526 |
:106940008091F2089927880F991FFC01E20FF31F2D |
:106950008081918182599F4F90930D0580930C0502 |
:106960008091F3089927880F991FFC01E20FF31F0C |
:106970008081918182599F4F90930F0580930E05DE |
:106980008091F4089927880F991FFC01E20FF31FEB |
:106990008081918182599F4F9093110580931005BA |
:1069A00084E6809312058091FF03882311F0469AB4 |
:1069B000579ACF911F910F91FF90EF90DF90CF905A |
:1069C000BF90AF909F908F907F906F900895AF92FF |
:1069D000BF92CF92DF92EF92FF920F931F93CF93CC |
:1069E000DF938091B4049091B50420911704309105 |
:1069F0001804821B930B9093B1098093B009809186 |
:106A00000D0490910E0499230CF4079695958795A3 |
:106A100095958795959587959093640980936309DB |
:106A200020910F0430911004332314F4295F3F4F59 |
:106A300035952795359527953595279530935509A3 |
:106A4000209354098091630990916409909371098E |
:106A500080937009309367092093660980919F099C |
:106A60009091A009AA2797FDA095BA2F7C018D01CE |
:106A7000EE0CFF1C001F111FE80EF91E0A1F1B1F42 |
:106A800080911B0490911C049C01442737FD409584 |
:106A9000542FDA01C901880F991FAA1FBB1F880F45 |
:106AA000991FAA1FBB1F820F931FA41FB51F820F20 |
:106AB000931FA41FB51F8E0D9F1DA01FB11FBB23C9 |
:106AC0001CF40396A11DB11DB595A79597958795C3 |
:106AD000B595A795979587959093A00980939F0961 |
:106AE0008091BB099091BC09AA2797FDA095BA2F68 |
:106AF0007C018D01EE0CFF1C001F111FE80EF91E1A |
:106B00000A1F1B1F8091190490911A049C014427AD |
:106B100037FD4095542FDA01C901880F991FAA1F2C |
:106B2000BB1F880F991FAA1FBB1F820F931FA41F93 |
:106B3000B51F820F931FA41FB51F8E0D9F1DA01F91 |
:106B4000B11FBB231CF40396A11DB11DB595A795DC |
:106B500097958795B595A795979587959093BC0937 |
:106B60008093BB0980916E0990916F099C01442725 |
:106B700037FD4095542FDA01C901880F991FAA1FCC |
:106B8000BB1F820F931FA41FB51F20911D043091BE |
:106B90001E04442737FD4095542F820F931FA41FD6 |
:106BA000B51FBB231CF40396A11DB11DB595A79578 |
:106BB00097958795B595A7959795879590936F0924 |
:106BC00080936E0920911B0430911C04C901880F29 |
:106BD000991F880F991F820F931F820F931F9C018B |
:106BE000442737FD4095542F8091D4049091D504CB |
:106BF000A091D604B091D704820F931FA41FB51F94 |
:106C00008093D4049093D504A093D604B093D70472 |
:106C10002091190430911A04C901880F991F880F17 |
:106C2000991F820F931F820F931F9C01442737FDEA |
:106C30004095542F8091D8049091D904A091DA0402 |
:106C4000B091DB04820F931FA41FB51F8093D8045B |
:106C50009093D904A093DA04B093DB0420917909CE |
:106C600030917A0980911B0490911C04820F931F2C |
:106C700090937A09809379092091B3093091B409EE |
:106C80008091190490911A04820F931F9093B40974 |
:106C90008093B3098091BE049091BF0401969093B4 |
:106CA000BF048093BE0420917508309176088091CE |
:106CB000C0049091C104281B390BC9019C014427D1 |
:106CC00037FD4095542F8091DC049091DD04A09114 |
:106CD000DE04B091DF04820F931FA41FB51F8093C1 |
:106CE000DC049093DD04A093DE04B093DF048FEC0A |
:106CF00080937A00109228038091EC049091ED0427 |
:106D0000A091EE04B091EF0489549B46A140B0409D |
:106D10005CF00F2EF8E4AF2EFBE6BF2EF1E0CF2E95 |
:106D2000F0E0DF2EF02D20C08091EC049091ED0476 |
:106D3000A091EE04B091EF04885B9449AE4FBF4F31 |
:106D40005CF40F2EF8EBAF2EF4E9BF2EFEEFCF2E42 |
:106D5000FFEFDF2EF02D08C0A090EC04B090ED0402 |
:106D6000C090EE04D090EF048091E4049091E5048B |
:106D7000A091E604B091E70489549B46A140B0403D |
:106D80005CF00F2EF8E4EF2EFBE6FF2EF1E00F2F64 |
:106D9000F0E01F2FF02D20C08091E4049091E504D5 |
:106DA000A091E604B091E704885B9449AE4FBF4FD1 |
:106DB0005CF40F2EF8EBEF2EF4E9FF2EFEEF0F2F11 |
:106DC000FFEF1F2FF02D08C0E090E404F090E504E1 |
:106DD0000091E6041091E7048091B0099091B10907 |
:106DE0009C01442737FD4095542F8091F4049091E5 |
:106DF000F504A091F604B091F704820F931FA41F2D |
:106E0000B51F8093F4049093F504A093F604B09317 |
:106E1000F7048091B7099091B809A091B909B09190 |
:106E2000BA09820F931FA41FB51F8093B7099093CF |
:106E3000B809A093B909B093BA098091F50882FD09 |
:106E400004C080912F058D3810F010928209809136 |
:106E50002905882309F0E7C180912A05882309F0D4 |
:106E6000E2C180918209882309F4DDC18091F5088F |
:106E700086FFD9C18091540990915509AA2797FDA1 |
:106E8000A095BA2FBC01CD01A80197010E940A72FA |
:106E9000992324F46150784F8F4F9F4F9B01AC0191 |
:106EA000012E1BE055954795379527951A95D1F7F3 |
:106EB000102D8091BF039927AA27BB27BC01CD01C4 |
:106EC0000E940A72DC01CB01809351059093520518 |
:106ED000A0935305B0935405BB2324F48150904FE5 |
:106EE000AF4FBF4F072E7CE0B595A7959795879537 |
:106EF0007A95D1F7702D8093510590935205A09308 |
:106F00005305B09354058091630990916409AA27B1 |
:106F100097FDA095BA2FBC01CD01A60195010E9455 |
:106F20000A72992324F46150784F8F4F9F4F9B0131 |
:106F3000AC01012E1BE055954795379527951A957D |
:106F4000D1F7102D8091BF039927AA27BB27BC0139 |
:106F5000CD010E940A72DC01CB018093550590930C |
:106F60005605A0935705B0935805BB2324F48150D0 |
:106F7000904FAF4FBF4F9C01AD01012E1CE05595C6 |
:106F80004795379527951A95D1F7102D20935505DC |
:106F900030935605409357055093580580915105FD |
:106FA000909152059093E8088093E70880915505E9 |
:106FB000909156059093EC088093EB0880915105D1 |
:106FC00090915205A0915305B0915405281B390B9F |
:106FD0004A0B5B0B2093550530935605409357059C |
:106FE000509358058091B7099091B809A091B909BB |
:106FF000B091BA09820F931FA41FB51F8093B709E0 |
:107000009093B809A093B909B093BA098091C003CD |
:10701000882301F5552324F42F5F3F4F4F4F5F4FD7 |
:10702000DA01C901B595A795979587952091F40444 |
:107030003091F5044091F6045091F704281B390B68 |
:107040004A0B5B0B2093F4043093F5044093F60451 |
:107050005093F7048091B0099091B1099C014427A5 |
:1070600037FD4095542F8091550590915605A0917C |
:107070005705B0915805820F931FA41FB51FBC017F |
:10708000CD01A80197010E940A72992324F461504E |
:10709000784F8F4F9F4F9B01AC01012E1BE0559500 |
:1070A0004795379527951A95D1F7102D8091BE03F6 |
:1070B0009927AA27BB27BC01CD010E940A72DC01D7 |
:1070C000CB018093490590934A05A0934B05B0935B |
:1070D0004C05BB2324F48150904FAF4FBF4F072E78 |
:1070E0007CE0B595A795979587957A95D1F7702D02 |
:1070F0008093490590934A05A0934B05B0934C05A6 |
:107100008091B0099091B1099C01442737FD4095C9 |
:10711000542F8091550590915605A0915705B09137 |
:107120005805820F931FA41FB51FBC01CD01A601F6 |
:1071300095010E940A72992324F46150784F8F4F71 |
:107140009F4F9B01AC01012E1BE05595479537954C |
:1071500027951A95D1F7102D8091BE039927AA275C |
:10716000BB27BC01CD010E940A72DC01CB018093D8 |
:107170004D0590934E05A0934F05B0935005BB234A |
:1071800024F48150904FAF4FBF4F072E7CE0B59550 |
:10719000A795979587957A95D1F7702D80934D0592 |
:1071A00090934E05A0934F05B09350058091B00980 |
:1071B0009091B10999231CF4909581959F4F81344A |
:1071C00091050CF448C08091490590914A05A09121 |
:1071D0004B05B0914C05BB233CF4B095A095909520 |
:1071E00081959F4FAF4FBF4F81389105A105B105E4 |
:1071F000B4F480914D0590914E05A0914F05B0914A |
:107200005005BB233CF4B095A095909581959F4F78 |
:10721000AF4FBF4F81389105A105B105E4F081E082 |
:107220008093070518C01092EC081092EB0810929A |
:10723000E8081092E70810924D0510924E05109242 |
:107240004F05109250051092490510924A05109270 |
:107250004B0510924C0580914D0590914E05A091E3 |
:107260004F05B09150050F2EF4E6EF2EF0E0FF2E03 |
:10727000F0E00F2FF0E01F2FF02DBC01CD01A80191 |
:1072800097010E947E72DA01C9012091490530916F |
:107290004A05281B390B30936209209361098091BC |
:1072A000490590914A05A0914B05B0914C05BC0150 |
:1072B000CD01A80197010E947E72DA01C9012091D7 |
:1072C0004D0530914E05821B930B90935709809387 |
:1072D00056098091C4039091C503A091C603B09153 |
:1072E000C703BC01CD0128E631E040E050E00E9438 |
:1072F0000A729B01AC018091B7099091B809A091E5 |
:10730000B909B091BA0982179307A407B50764F0C9 |
:10731000821B930BA40BB50B8093B7099093B8090C |
:10732000A093B909B093BA09E090B709F090B809F1 |
:107330000091B9091091BA091123F4F48091C403A2 |
:107340009091C503A091C603B091C703BC01CD01C4 |
:1073500028E631E040E050E00E940A72DC01CB01F7 |
:107360008E0D9F1DA01FB11F8093B7099093B80980 |
:10737000A093B909B093BA092091540930915509E5 |
:107380008091610990916209B901680F791F9B0191 |
:10739000442737FD4095542F8091F0049091F104DB |
:1073A000A091F204B091F304820F931FA41FB51FA4 |
:1073B0008093F0049093F104A093F204B093F3044B |
:1073C0008091250590912605681B790B9B01442728 |
:1073D00037FD4095542F8091EC049091ED04A091DD |
:1073E000EE04B091EF04820F931FA41FB51F80938A |
:1073F000EC049093ED04A093EE04B093EF0420917D |
:10740000A6033091A7034091A8035091A903281720 |
:1074100039074A075B07C4F488EA91E6A0E0B0E0C8 |
:10742000821B930BA40BB50B8093EC049093ED049B |
:10743000A093EE04B093EF048093F0049093F104D2 |
:10744000A093F204B093F304C091A603D091A703D4 |
:10745000E091A803F091A90322273327A9012C1B4F |
:107460003D0B4E0B5F0B8091EC049091ED04A091CD |
:10747000EE04B091EF0482179307A407B507B4F4A4 |
:10748000CE01DF01885A9146A040B0408093EC04C1 |
:107490009093ED04A093EE04B093EF048093F00476 |
:1074A0009093F104A093F204B093F3042091630944 |
:1074B000309164098091560990915709B901680F7C |
:1074C000791F9B01442737FD4095542F8091E80494 |
:1074D0009091E904A091EA04B091EB04820F931F0C |
:1074E000A41FB51F8093E8049093E904A093EA04D5 |
:1074F000B093EB048091270590912805681B790BC8 |
:107500009B01442737FD4095542F8091E4049091CE |
:10751000E504A091E604B091E704820F931FA41F35 |
:10752000B51F8093E4049093E504A093E604B09320 |
:10753000E7042091A2033091A3034091A40350914A |
:10754000A503281739074A075B07C4F488EA91E6C0 |
:10755000A0E0B0E0821B930BA40BB50B8093E40476 |
:107560009093E504A093E604B093E7048093E804C5 |
:107570009093E904A093EA04B093EB04C091A203B2 |
:10758000D091A303E091A403F091A5032227332710 |
:10759000A9012C1B3D0B4E0B5F0B8091E4049091D5 |
:1075A000E504A091E604B091E70482179307A407CD |
:1075B000B507B4F4CE01DF01885A9146A040B0402F |
:1075C0008093E4049093E504A093E604B093E70469 |
:1075D0008093E8049093E904A093EA04B093EB0449 |
:1075E0008091F4049091F504A091F604B091F70411 |
:1075F0008093E0049093E104A093E204B093E30449 |
:107600008091E4049091E504A091E604B091E70430 |
:107610008093C4049093C504A093C604B093C70498 |
:107620008091EC049091ED04A091EE04B091EF04F0 |
:107630008093CC049093CD04A093CE04B093CF0458 |
:107640008091E8049091E904A091EA04B091EB04E0 |
:107650008093C8049093C904A093CA04B093CB0448 |
:107660008091F0049091F104A091F204B091F304A0 |
:107670008093D0049093D104A093D204B093D30408 |
:1076800080911B0390911C0399230CF40796959508 |
:10769000879595958795959587959093640980939F |
:1076A000630980911D0390911E0399230CF40796A2 |
:1076B0009595879595958795959587959093550977 |
:1076C00080935409809100018A3009F066C080914E |
:1076D000130490911404835F934034F088E592E0A2 |
:1076E000909364098093630980911304909114042A |
:1076F0008A5F934034F080E293E090936409809332 |
:10770000630980911304909114040F9734F488EA6C |
:107710009DEF909364098093630980911304909185 |
:107720001404079734F480EE9CEF909364098093DF |
:1077300063098091150490911604835F934034F09F |
:1077400088E592E09093550980935409809115043F |
:10775000909116048A5F934034F080E293E0909316 |
:1077600055098093540980911504909116040F9740 |
:1077700034F488EA9DEF90935509809354098091E1 |
:1077800015049091160407970CF06BC080EE9CEFE7 |
:10779000909355098093540964C08091130490918B |
:1077A0001404815D974034F080EB94E09093640979 |
:1077B000809363098091130490911404805E974034 |
:1077C00034F080E496E0909364098093630980919B |
:1077D0001304909114040F9734F480E59BEF909379 |
:1077E00064098093630980911304909114040797AE |
:1077F00034F480EC99EF909364098093630980914D |
:10780000150490911604815D974034F080EB94E06C |
:107810009093550980935409809115049091160412 |
:10782000805E974034F080E496E090935509809311 |
:10783000540980911504909116040F9734F480E553 |
:107840009BEF909355098093540980911504909172 |
:107850001604079734F480EC99EF909355098093C0 |
:1078600054098091B403882309F4EEC080911B036E |
:1078700090911C032091590530915A05821B930B5E |
:107880009093600580935F0580911B0390911C038A |
:10789000280F391F332314F42F5F3F4FC9019595EB |
:1078A000879590935A058093590580915F05909133 |
:1078B0006005813891053CF080E890E09093600588 |
:1078C00080935F050DC080915F05909160058058A1 |
:1078D0009F4F34F480E89FEF9093600580935F059D |
:1078E0008091B403282F332780915F059091600524 |
:1078F000289FA001299F500D389F500D11249A01F7 |
:10790000552314F4215F3F4F3595279535952795DD |
:107910003595279535952795809163099091640950 |
:10792000820F931F909364098093630980911D03D4 |
:1079300090911E0320915B0530915C05821B930B97 |
:1079400090935E0580935D0580911D0390911E03C9 |
:10795000280F391F332314F42F5F3F4FC90195952A |
:10796000879590935C0580935B0580915D05909170 |
:107970005E05813891053CF080E890E090935E05CB |
:1079800080935D050DC080915D0590915E058058E6 |
:107990009F4F34F480E89FEF90935E0580935D05E0 |
:1079A0008091B403282F332780915D0590915E0567 |
:1079B000289FA001299F500D389F500D11249A0136 |
:1079C000552314F4215F3F4F35952795359527951D |
:1079D00035952795359527958091540990915509AE |
:1079E000820F931F90935509809354098091B4039B |
:1079F000482F552780915F0590916005489F900121 |
:107A0000499F300D589F300D112480911B03909198 |
:107A10001C03820F931F90931C0380931B03809180 |
:107A20005D0590915E05489F9001499F300D589FDC |
:107A3000300D112480911D0390911E03820F931F1E |
:107A400090931E0380931D038091660990916709AE |
:107A5000181619068CF58091E7089091E80899238B |
:107A60001CF4909581959F4FAA2797FDA095BA2F5A |
:107A70002091C003332744275527BC01CD010E9424 |
:107A80000A72992324F4615C7F4F8F4F9F4FDC0172 |
:107A9000CB01689415F8B595A79597958795169499 |
:107AA000D1F72091610930916209820F931F909361 |
:107AB00062098093610930C08091E7089091E808DD |
:107AC00099231CF4909581959F4FAA2797FDA09527 |
:107AD000BA2F2091C003332744275527BC01CD017D |
:107AE0000E940A72992324F4615C7F4F8F4F9F4F4D |
:107AF000DC01CB01689415F8B595A7959795879506 |
:107B00001694D1F72091610930916209281B390B35 |
:107B100030936209209361098091700990917109F5 |
:107B2000181619068CF58091EB089091EC089923B2 |
:107B30001CF4909581959F4FAA2797FDA095BA2F89 |
:107B40002091C003332744275527BC01CD010E9453 |
:107B50000A72992324F4615C7F4F8F4F9F4FDC01A1 |
:107B6000CB01689415F8B595A795979587951694C8 |
:107B7000D1F72091560930915709820F931F9093A6 |
:107B800057098093560930C08091EB089091EC081A |
:107B900099231CF4909581959F4FAA2797FDA09556 |
:107BA000BA2F2091C003332744275527BC01CD01AC |
:107BB0000E940A72992324F4615C7F4F8F4F9F4F7C |
:107BC000DC01CB01689415F8B595A7959795879535 |
:107BD0001694D1F72091560930915709281B390B7B |
:107BE00030935709209356098091F50888230CF0AB |
:107BF0005CC080912905882309F057C080912A052F |
:107C0000882309F052C0209170093091710951E028 |
:107C1000213035076CF08091630990916409820FDF |
:107C2000931F80509140909364098093630914C01E |
:107C300020917009309171098FEF2030380764F47A |
:107C40008091630990916409820F931F80509F4F28 |
:107C500090936409809363092091660930916709C4 |
:107C600041E0213034076CF080915409909155091E |
:107C7000820F931F8050914090935509809354092F |
:107C800014C020916609309167095FEF20303507F5 |
:107C900064F48091540990915509820F931F80508C |
:107CA0009F4F90935509809354098091F10899272B |
:107CB000880F991FFC01E554F74F8081918182590B |
:107CC0009F4F20910A0530910B05281739073CF486 |
:107CD000C901019690930B0580930A051CC0809101 |
:107CE000F1089927880F991FFC01E554F74F80810F |
:107CF000918182599F4F20910A0530910B0582177F |
:107D000093074CF42115310531F0C9010197909387 |
:107D10000B0580930A058091F2089927880F991F17 |
:107D2000FC01E554F74F8081918182599F4F20914A |
:107D30000C0530910D05281739073CF4C90101964F |
:107D400090930D0580930C051CC08091F208992733 |
:107D5000880F991FFC01E554F74F8081918182596A |
:107D60009F4F20910C0530910D05821793074CF41D |
:107D70002115310531F0C901019790930D058093CC |
:107D80000C058091F3089927880F991FFC01E55491 |
:107D9000F74F8081918182599F4F20910E0530913C |
:107DA0000F05281739073CF4C901019690930F0578 |
:107DB00080930E051CC08091F3089927880F991FA6 |
:107DC000FC01E554F74F8081918182599F4F2091AA |
:107DD0000E0530910F05821793074CF421153105DC |
:107DE00031F0C901019790930F0580930E058091A2 |
:107DF000F4089927880F991FFC01E554F74F8081FB |
:107E0000918182599F4F20911005309111052817BB |
:107E100039073CF4C9010196909311058093100530 |
:107E20001CC08091F4089927880F991FFC01E55424 |
:107E3000F74F8081918182599F4F20911005309199 |
:107E40001105821793074CF42115310531F0C90152 |
:107E50000197909311058093100580910A059091E8 |
:107E60000B0599232CF410920B0510920A050EC0F5 |
:107E700080910A0590910B058F3F910539F034F000 |
:107E80008FEF90E090930B0580930A0580910C058D |
:107E900090910D0599232CF410920D0510920C056C |
:107EA0000EC080910C0590910D058F3F910539F022 |
:107EB00034F08FEF90E090930D0580930C05809146 |
:107EC0000E0590910F0599232CF410920F05109236 |
:107ED0000E050EC080910E0590910F058F3F910504 |
:107EE00039F034F08FEF90E090930F0580930E05FA |
:107EF000809110059091110599232CF41092110591 |
:107F0000109210050EC080911005909111058F3FC1 |
:107F1000910539F034F08FEF90E090931105809344 |
:107F20001005DF91CF911F910F91FF90EF90DF909F |
:107F3000CF90BF90AF900895EF92FF920F931F9351 |
:107F4000809100018D3011F40E94E81C10927A009B |
:107F500080911304909114049093640980936309B1 |
:107F600080911504909116049093550980935409BB |
:107F700080911704909118049093B1098093B009EF |
:107F800080911B0490911C049C01442737FD40956F |
:107F9000542FDA01C901880F991FAA1FBB1F880F30 |
:107FA000991FAA1FBB1F820F931FA41FB51F820F0B |
:107FB000931FA41FB51F9093A00980939F098091E0 |
:107FC000190490911A049C01442737FD4095542FC1 |
:107FD000DA01C901880F991FAA1FBB1F880F991FBB |
:107FE000AA1FBB1F820F931FA41FB51F820F931FD1 |
:107FF000A41FB51F9093BC098093BB0980911D04F9 |
:1080000090911E0490936F0980936E098FEC80937A |
:108010007A008091F1089927880F991FFC01E55497 |
:10802000F74F8081918182599F4F20910A053091AD |
:108030000B05281739073CF4C901019690930B05ED |
:1080400080930A051CC08091F1089927880F991F19 |
:10805000FC01E554F74F8081918182599F4F209117 |
:108060000A0530910B05821793074CF42115310551 |
:1080700031F0C901019790930B0580930A05809117 |
:10808000F2089927880F991FFC01E554F74F80816A |
:10809000918182599F4F20910C0530910D05281731 |
:1080A00039073CF4C901019690930D0580930C05A6 |
:1080B0001CC08091F2089927880F991FFC01E55494 |
:1080C000F74F8081918182599F4F20910C0530910B |
:1080D0000D05821793074CF42115310531F0C901C4 |
:1080E000019790930D0580930C058091F3089927D3 |
:1080F000880F991FFC01E554F74F808191818259C7 |
:108100009F4F20910E0530910F05281739073CF439 |
:10811000C901019690930F0580930E051CC08091B4 |
:10812000F3089927880F991FFC01E554F74F8081C8 |
:10813000918182599F4F20910E0530910F05821732 |
:1081400093074CF42115310531F0C9010197909343 |
:108150000F0580930E058091F4089927880F991FC9 |
:10816000FC01E554F74F8081918182599F4F209106 |
:10817000100530911105281739073CF4C901019603 |
:1081800090931105809310051CC08091F4089927E5 |
:10819000880F991FFC01E554F74F80819181825926 |
:1081A0009F4F2091100530911105821793074CF4D1 |
:1081B0002115310531F0C901019790931105809384 |
:1081C000100580910A0590910B0599232CF41092CB |
:1081D0000B0510920A050EC080910A0590910B05BF |
:1081E0008F3F910539F034F08FEF90E090930B05BD |
:1081F00080930A0580910C0590910D0599232CF42C |
:1082000010920D0510920C050EC080910C059091F6 |
:108210000D058F3F910539F034F08FEF90E090938A |
:108220000D0580930C0580910E0590910F05992303 |
:108230002CF410920F0510920E050EC080910E05C1 |
:1082400090910F058F3F910539F034F08FEF90E05A |
:1082500090930F0580930E05809110059091110564 |
:1082600099232CF410921105109210050EC08091E4 |
:108270001005909111058F3F910539F034F08FEF83 |
:1082800090E0909311058093100580912309992720 |
:10829000AA27BB270F2EF4ECEF2EF9E0FF2EF0E01B |
:1082A0000F2FF0E01F2FF02DBC01CD01A801970189 |
:1082B0000E940A72DC01CB018093A2039093A30376 |
:1082C000A093A403B093A503809124099927AA271A |
:1082D000BB27BC01CD010E940A72DC01CB01809357 |
:1082E000A6039093A703A093A803B093A9031F919B |
:1082F0000F91FF90EF90089590911C05992349F5F7 |
:10830000809147058C7F80934705292F44E757E0EC |
:1083100062EA79E08091EC03882321F4FA01E20F0C |
:10832000F11D8083822F9927DC01A60FB71FFC0166 |
:10833000E40FF51F80818C932F5F2C3058F38091D0 |
:10834000EC03882359F08091EC0381508093EC0377 |
:1083500005C0809147058160809347058091A209FF |
:10836000992790934A08809349088091A3099927F7 |
:1083700090934C0880934B088091A509992790937E |
:108380004E0880934D088091A40999279093500836 |
:1083900080934F0810924604109247040E94532B7A |
:1083A00008958091F8088B3F10F18B3F29F480915C |
:1083B0000A058093AF031FC08091F8088C3F29F411 |
:1083C00080910C058093AF0316C08091F8088D3F13 |
:1083D00029F480910E058093AF030DC08091F808B9 |
:1083E0008E3F49F4809110058093AF0304C08091C3 |
:1083F000F8088093AF038091F7088B3F10F18B3F13 |
:1084000029F480910A058093AE031FC08091F7087C |
:108410008C3F29F480910C058093AE0316C08091A7 |
:10842000F7088D3F29F480910E058093AE030DC0AF |
:108430008091F7088E3F49F4809110058093AE0338 |
:1084400004C08091F7088093AE038091AE03882327 |
:1084500039F08091AE03843618F084E68093AE0341 |
:108460008091F9088B3F10F18B3F29F480910A0528 |
:108470008093B0031FC08091F9088C3F29F480914C |
:108480000C058093B00316C08091F9088D3F29F444 |
:1084900080910E058093B0030DC08091F9088E3F46 |
:1084A00049F4809110058093B00304C08091F908CD |
:1084B0008093B0038091B003882339F08091B0039A |
:1084C000843618F084E68093B0038091FB088B3FDC |
:1084D00010F18B3F29F480910A058093B1031FC0EE |
:1084E0008091FB088C3F29F480910C058093B103A7 |
:1084F00016C08091FB088D3F29F480910E05809372 |
:10850000B1030DC08091FB088E3F49F480911005A6 |
:108510008093B10304C08091FB088093B1038091E4 |
:10852000FD088B3F10F18B3F29F480910A05809361 |
:10853000B3031FC08091FD088C3F29F480910C0586 |
:108540008093B30316C08091FD088D3F29F480917C |
:108550000E058093B3030DC08091FD088E3F49F452 |
:10856000809110058093B30304C08091FD0880932F |
:10857000B303809105098B3F10F18B3F29F4809163 |
:108580000A058093B2031FC0809105098C3F29F42E |
:1085900080910C058093B20316C0809105098D3F30 |
:1085A00029F480910E058093B2030DC080910509D6 |
:1085B0008E3F49F4809110058093B20304C08091EE |
:1085C00005098093B203809106098B3F10F18B3F20 |
:1085D00029F480910A058093B5031FC08091060994 |
:1085E0008C3F29F480910C058093B50316C08091CF |
:1085F00006098D3F29F480910E058093B5030DC0C7 |
:10860000809106098E3F49F4809110058093B5034F |
:1086100004C0809106098093B5038091B5038B3027 |
:1086200018F48AE08093B503809107098B3F10F11D |
:108630008B3F29F480910A058093B6031FC0809177 |
:1086400007098C3F29F480910C058093B60316C06E |
:10865000809107098D3F29F480910E058093B60320 |
:108660000DC0809107098E3F49F4809110058093D9 |
:10867000B60304C0809107098093B603809108096E |
:108680008B3F10F18B3F29F480910A058093B4034E |
:108690001FC0809108098C3F29F480910C058093BC |
:1086A000B40316C0809108098D3F29F480910E050E |
:1086B0008093B4030DC0809108098E3F49F48091E6 |
:1086C00010058093B40304C0809108098093B4031B |
:1086D000809109098B3F10F18B3F29F480910A05A5 |
:1086E0008093B7031FC0809109098C3F29F48091C2 |
:1086F0000C058093B70316C0809109098D3F29F4BA |
:1087000080910E058093B7030DC0809109098E3FBB |
:1087100049F4809110058093B70304C08091090942 |
:108720008093B70380910A098B3F10F18B3F29F4A6 |
:1087300080910A058093B8031FC080910A098C3F7D |
:1087400029F480910C058093B80316C080910A0922 |
:108750008D3F29F480910E058093B8030DC0809160 |
:108760000A098E3F49F4809110058093B80304C034 |
:1087700080910A098093B80380910F098B3F10F113 |
:108780008B3F29F480910A058093BA031FC0809122 |
:108790000F098C3F29F480910C058093BA0316C011 |
:1087A00080910F098D3F29F480910E058093BA03C3 |
:1087B0000DC080910F098E3F49F480911005809380 |
:1087C000BA0304C080910F098093BA038091100905 |
:1087D0008B3F10F18B3F29F480910A0580932F0580 |
:1087E0001FC0809110098C3F29F480910C05809363 |
:1087F0002F0516C0809110098D3F29F480910E0538 |
:1088000080932F050DC0809110098E3F49F480910F |
:10881000100580932F0504C08091100980932F05C7 |
:10882000809111098B3F10F18B3F29F480910A054B |
:10883000809330051FC0809111098C3F29F48091ED |
:108840000C058093300516C0809111098D3F29F4E5 |
:1088500080910E05809330050DC0809111098E3FE7 |
:1088600049F4809110058093300504C0809111096E |
:1088700080933005809112098B3F10F18B3F29F4D2 |
:1088800080910A05809331051FC0809112098C3FA9 |
:1088900029F480910C058093310516C0809112094E |
:1088A0008D3F29F480910E05809331050DC0809194 |
:1088B00012098E3F49F4809110058093310504C060 |
:1088C0008091120980933105809113098B3F10F13B |
:1088D0008B3F29F480910A05809332051FC0809157 |
:1088E00013098C3F29F480910C058093320516C042 |
:1088F000809113098D3F29F480910E0580933205F4 |
:108900000DC0809113098E3F49F48091100580932A |
:10891000320504C0809113098093320580912809A3 |
:108920008B3F10F18B3F29F480910A05809333052A |
:108930001FC0809128098C3F29F480910C058093F9 |
:10894000330516C0809128098D3F29F480910E05CA |
:10895000809333050DC0809128098E3F49F48091A2 |
:1089600010058093330504C0809128098093330556 |
:10897000809129098B3F10F18B3F29F480910A05E2 |
:10898000809334051FC0809129098C3F29F4809180 |
:108990000C058093340516C0809129098D3F29F478 |
:1089A00080910E05809334050DC0809129098E3F7A |
:1089B00049F4809110058093340504C08091290901 |
:1089C0008093340580912A098B3F10F18B3F29F465 |
:1089D00080910A05809335051FC080912A098C3F3C |
:1089E00029F480910C058093350516C080912A09E1 |
:1089F0008D3F29F480910E05809335050DC080913F |
:108A00002A098E3F49F4809110058093350504C0F2 |
:108A100080912A098093350580912B098B3F10F1B5 |
:108A20008B3F29F480910A05809336051FC0809101 |
:108A30002B098C3F29F480910C058093360516C0D4 |
:108A400080912B098D3F29F480910E058093360586 |
:108A50000DC080912B098E3F49F4809110058093C1 |
:108A6000360504C080912B09809336058091140946 |
:108A70008B3F10F18B3F29F480910A058093BB0353 |
:108A80001FC0809114098C3F29F480910C058093BC |
:108A9000BB0316C0809114098D3F29F480910E0507 |
:108AA0008093BB030DC0809114098E3F49F48091DF |
:108AB00010058093BB0304C0809114098093BB030D |
:108AC000809118098B3F10F18B3F29F480910A05A2 |
:108AD0008093BC031FC0809118098C3F29F48091BA |
:108AE0000C058093BC0316C0809118098D3F29F4B2 |
:108AF00080910E058093BC030DC0809118098E3FB4 |
:108B000049F4809110058093BC0304C0809118093A |
:108B10008093BC0380911D098B3F10F18B3F29F49A |
:108B200080910A058093BD031FC080911D098C3F71 |
:108B300029F480910C058093BD0316C080911D0916 |
:108B40008D3F29F480910E058093BD030DC0809167 |
:108B50001D098E3F49F4809110058093BD0304C028 |
:108B600080911D098093BD03809120098B3F10F1F6 |
:108B70008B3F29F480910A058093BE031FC080912A |
:108B800020098C3F29F480910C058093BE0316C008 |
:108B9000809120098D3F29F480910E058093BE03BA |
:108BA0000DC0809120098E3F49F48091100580937B |
:108BB000BE0304C0809120098093BE0380912109E7 |
:108BC0008B3F10F18B3F29F480910A058093BF03FE |
:108BD0001FC0809121098C3F29F480910C0580935E |
:108BE000BF0316C0809121098D3F29F480910E05A5 |
:108BF0008093BF030DC0809121098E3F49F480917D |
:108C000010058093BF0304C0809121098093BF03A6 |
:108C1000809122098B3F10F18B3F29F480910A0546 |
:108C20008093C0031FC0809122098C3F29F480915A |
:108C30000C058093C00316C0809122098D3F29F452 |
:108C400080910E058093C0030DC0809122098E3F54 |
:108C500049F4809110058093C00304C080912209DB |
:108C60008093C003809127098B3F10F18B3F29F43B |
:108C700080910A058093C1031FC0809127098C3F12 |
:108C800029F480910C058093C10316C080912709B7 |
:108C90008D3F29F480910E058093C1030DC0809112 |
:108CA00027098E3F49F4809110058093C10304C0C9 |
:108CB000809127098093C10380912D098B3F10F18A |
:108CC0008B3F29F480910A0580937B091FC0809116 |
:108CD0002D098C3F29F480910C0580937B0916C0E7 |
:108CE00080912D098D3F29F480910E0580937B0999 |
:108CF0000DC080912D098E3F49F48091100580931D |
:108D00007B0904C080912D0980937B0980917B09A8 |
:108D1000823018F481E080937B0980912F098B3F8A |
:108D200010F18B3F29F480910A058093AE091FC092 |
:108D300080912F098C3F29F480910C058093AE0916 |
:108D400016C080912F098D3F29F480910E058093E4 |
:108D5000AE090DC080912F098E3F49F48091100516 |
:108D60008093AE0904C080912F098093AE09809151 |
:108D7000AE09823018F481E08093AE0980914209F7 |
:108D80008B3F10F18B3F29F480910A058093BE0937 |
:108D90001FC0809142098C3F29F480910C0580937B |
:108DA000BE0916C0809142098D3F29F480910E05BD |
:108DB0008093BE090DC0809142098E3F49F4809195 |
:108DC00010058093BE0904C0809142098093BE09BA |
:108DD0008091BA0399279C012F5F3F4FECE3F8E2A3 |
:108DE000CF01B9010E9449727093AB036093AA034B |
:108DF00080912F058D3878F08091300599279C015E |
:108E00002F5F3F4FCF01B9010E9449727093AD03AC |
:108E10006093AC0308C08091AA039091AB03909338 |
:108E2000AD038093AC0380913209809360098091F7 |
:108E30008209882311F4809360098091030980934B |
:108E4000AF09809102098093680908952F923F929B |
:108E50004F925F926F927F928F929F92AF92BF924A |
:108E6000CF92DF92EF92FF920F931F93CF93DF93F6 |
:108E7000CDB7DEB728970FB6F894DEBF0FBECDBFD3 |
:108E800080914805815080934805882319F485E036 |
:108E9000809348050E94E734809100018C3010F4E3 |
:108EA000299A01C02998A0901A05B0901B05BA8292 |
:108EB000A9828091680999270A96A816B90614F420 |
:108EC0009A83898380911205843608F05FC080916F |
:108ED000850590918605009731F00197909386055E |
:108EE0008093850507C010921C05809147058F7EF1 |
:108EF00080934705809100018A3011F0843111F48C |
:108F0000289A01C028988091450590914605895E70 |
:108F10009340C8F180910C09482F55275A83498303 |
:108F2000809147058061809347058091ED089927DE |
:108F300021ED38E0AC01480F591FFA01E20FF31F91 |
:108F4000118210828091EE089927880F991FFC01E9 |
:108F5000E20FF31F118210822BEB38E0FA01E20FCF |
:108F6000F31F11821082FC01E20FF31F11821082A5 |
:108F70008091F0089927880F991FFC01E20FF31FD9 |
:108F800011821082F9C210921C05F6C2809112055E |
:108F90008D3808F4F1C2809147058F7E8093470594 |
:108FA00090910D0982E3989FC0011124909386054A |
:108FB0008093850569817A81693271058CF0809191 |
:108FC0001C05882369F080914505909146057FEF47 |
:108FD0008F3F970729F001969093460580934505AA |
:108FE00080914505909146058F3F910509F038F530 |
:108FF000109261051092620510926305109264054B |
:10900000109265051092660510926705109268052A |
:109010008A3F9105C9F481E080938B051092710518 |
:109020001092720510927305109274051092F40458 |
:109030001092F5041092F6041092F70405C0809186 |
:1090400047058260809347058091EF0899272BEBB5 |
:1090500038E0880F991FFC01E20FF31F8081918196 |
:10906000813591050CF4B2C180911C05882309F06B |
:10907000ADC18091F0089927880F991FFC01E20F7C |
:10908000F31F808191818C3491050CF41EC1809175 |
:1090900087058F5F80938705893C08F497C180918D |
:1090A00000018C3010F4299801C0299A10921C05F7 |
:1090B0001092870510924605109245058091ED08A3 |
:1090C00099272BEB38E0880F991FFC01E20FF31F63 |
:1090D0008081918187349105A4F48091EE089927CD |
:1090E000880F991FFC01E20FF31F0190F081E02D22 |
:1090F000FF231CF4F095E195FF4FE734F1050CF4E4 |
:1091000091C041E08091EE0899272BEB38E0880F61 |
:10911000991FFC01E20FF31F808191818734910533 |
:1091200054F08091ED089927880F991FFC01E20FF8 |
:10913000F31F808191818091EE0899272BEB38E015 |
:10914000880F991FFC01E20FF31F80819181873402 |
:10915000910574F08091ED089927880F991FFC0103 |
:10916000E20FF31F80819181873491050CF042E07A |
:109170008091EE0899272BEB38E0880F991FFC01AE |
:10918000E20FF31F808191818634910574F4809100 |
:10919000ED089927880F991FFC01E20FF31F8081CA |
:1091A0009181873491050CF043E08091EE08992776 |
:1091B0002BEB38E0880F991FFC01E20FF31F808131 |
:1091C00091818A5B9F4F74F48091ED089927880FF5 |
:1091D000991FFC01E20FF31F808191818734910573 |
:1091E0000CF044E08091EE0899272BEB38E0880FD3 |
:1091F000991FFC01E20FF31F808191818A5B9F4FD1 |
:1092000074F48091ED089927880F991FFC01E20FF3 |
:10921000F31F80819181863491050CF445E0842F01 |
:109220000E94C3058091EE089927880F991FFC01C1 |
:10923000E554F74F0190F081E02DFF231CF4F095E9 |
:10924000E195FF4F7E97BCF48091ED089927880F38 |
:10925000991FFC01E554F74F808191818A5B9F4FF4 |
:1092600054F481E080938A0788EE93E09093FD03A5 |
:109270008093FC03ABC00E94B10545E66DEE78E03B |
:109280000E9458058091F50880FF10C0809123034B |
:1092900090912403875B934038F48091230390914D |
:1092A00024038E5E924010F40E949C1C1092FF03D7 |
:1092B0000E94593281E08093FF03579A0E94B105C2 |
:1092C00068E770E00E94383281C08091F0089927E9 |
:1092D000880F991FFC01E554F74F80819181855BD0 |
:1092E0009F4F0CF071C0809187058F5F8093870539 |
:1092F000893C08F46BC0809100018C3010F42998EF |
:1093000001C0299AA4E0B0E08FEF082E0E94A67257 |
:1093100010921C0510928705109246051092450583 |
:109320000E945932A4E0B0E08091BA049091BB044D |
:10933000992314F481509F4F892F990F990B082E70 |
:109340000E94A672A5E0B0E08091BA049091BB049F |
:10935000082E0E94A672A6E0B0E08091BC04909115 |
:10936000BD04992314F481509F4F892F990F990BB5 |
:10937000082E0E94A672A7E0B0E08091BC049091F4 |
:10938000BD04082E0E94A672A8E0B0E08091C0043F |
:109390009091C104992314F481509F4F892F990F04 |
:1093A000990B082E0E94A672A9E0B0E08091C0043B |
:1093B0009091C104082E0E94A6720E94B10568E730 |
:1093C00070E00E94383202C0109287058091EF0849 |
:1093D00099272BEB38E0880F991FFC01E20FF31F50 |
:1093E000808191818B5A9F4F0CF0C6C08091F0080C |
:1093F0009927880F991FFC01E20FF31F808191814B |
:10940000855B9F4F0CF096C0809188058F5F80939D |
:109410008805893C08F490C088EC8093880581E039 |
:1094200090E0909346058093450581E080931C056C |
:1094300010927105109272051092730510927405C6 |
:109440001092F4041092F5041092F6041092F704AE |
:109450001092F8041092F9041092FA041092FB048E |
:1094600080910409A82EBB24CC24DD2480919F097F |
:109470009091A0099C01442737FD4095542FC601C7 |
:10948000B5010E940A72DC01CB018093E404909341 |
:10949000E504A093E604B093E7048091BB099091A2 |
:1094A000BC099C01442737FD4095542FC601B501E6 |
:1094B0000E940A72DC01CB018093EC049093ED04CE |
:1094C000A093EE04B093EF048091C4049091C5047E |
:1094D000A091C604B091C7048093E8049093E90476 |
:1094E000A093EA04B093EB048091CC049091CD0456 |
:1094F000A091CE04B091CF048093F0049093F10436 |
:10950000A093F204B093F3041092610510926205E7 |
:10951000109263051092640510926505109266051D |
:1095200010926705109268058091470588608093C6 |
:10953000470502C0109288058091F0089927880F8E |
:10954000991FFC01E554F74F808191818C3491057E |
:109550008CF0809189058F5F80938905893C60F04C |
:1095600010921C0588EC8093890510924605109294 |
:10957000450502C010928905809184038150809333 |
:109580008403809184038F3F21F08091470584FFFD |
:10959000CBC30E94D14180912F058D3808F467C05C |
:1095A0008091940590919505AC01440F551F480F8B |
:1095B000591F8091ED089927880F991FFC01E554E8 |
:1095C000F74F80913105282F332780819181289F83 |
:1095D000B001299F700D389F700D11249A01260F3C |
:1095E000371F8091410590914205281B390B12F4D9 |
:1095F0002D5F3F4FC90195958795959587959093D8 |
:109600009505809394058091960590919705AC01FE |
:10961000440F551F480F591F8091EE089927880F56 |
:10962000991FFC01E554F74F80913105282F33270E |
:1096300080819181289FD001299FB00D389FB00D66 |
:1096400011249A012A0F3B1F8091430590914405F4 |
:10965000281B390B12F42D5F3F4FC9019595879553 |
:1096600095958795909397058093960566C0809110 |
:10967000940590919505AC01440F551F480F591F53 |
:109680008091ED089927880F991FFC01E554F74F49 |
:109690008091FF08282F332780819181289FF00136 |
:1096A000299FF00D389FF00D11244E0F5F1F552399 |
:1096B00014F44D5F5F4FCA019595879595958795F1 |
:1096C00090939505809394058091960590919705C8 |
:1096D000AC01440F551F480F591F8091EE08992780 |
:1096E000880F991FFC01E554F74F8091FF08282F40 |
:1096F000332780819181289F5001299FB00C389F8A |
:10970000B00C11249A012A0D3B1D332314F42D5F54 |
:109710003F4F35952795359527953093970520939D |
:1097200096058091940590919505909342058093BC |
:109730004105309344052093430580918209882395 |
:1097400009F465C060919405709195057093420588 |
:1097500060934105A0919605B0919705B09344059B |
:10976000A09343058091ED08992741ED58E0880FBB |
:10977000991FFC01E40FF51F80910009282F332762 |
:1097800080819181289F6001299FD00C389FD00C47 |
:1097900011246C0D7D1D7093950560939405809147 |
:1097A000EE089927880F991FFC01E40FF51F8081AF |
:1097B0009181289FA001299F500D389F500D1124A1 |
:1097C0004A0F5B1F50939705409396052091B5056E |
:1097D0003091B6058091B9059091BA05820F931F1B |
:1097E000681B790B70931505609314052091B705DC |
:1097F0003091B8058091BB059091BC05820F931FF5 |
:10980000481B590B509317054093160510C08091C3 |
:10981000940590919505909315058093140580917A |
:109820009605909197059093170580931605809162 |
:10983000F0089927880F991FFC01E554F74F8081A4 |
:109840009181909581959F4F90931905809318056C |
:109850008330910534F00297909319058093180591 |
:1098600012C080911805909119055FEF8E3F950702 |
:1098700034F40296909319058093180504C0109251 |
:109880001905109218058091EF089927880F991FE4 |
:10989000FC01E554F74F808191818C0108581F4FDE |
:1098A00010931B0500931A058091B5039927AA27E9 |
:1098B00097FDA095BA2FBC01CD010E94B271DC01C9 |
:1098C000CB0120E030E040E251E4BC01CD010E9438 |
:1098D0005371DC01CB01BC01CD010E949571DC010B |
:1098E000CB018093B5098091B60380938209809162 |
:1098F000B7039927AA2797FDA095BA2FBC01CD01E0 |
:109900000E94B271DC01CB0120E030E040E251E482 |
:10991000BC01CD010E945371DC01CB01BC01CD0122 |
:109920000E949571DC01CB0180935B098091B803A3 |
:10993000809372098091960780FF64C08091BE0970 |
:10994000813808F45FC080918F07282F332727FDC7 |
:1099500030958091FF08482F5527249FB001259FFF |
:10996000700D349F700D1124809114059091150590 |
:10997000860F971F9093150580931405809190078B |
:10998000992787FD9095849F9001859F300D949F26 |
:10999000300D11248091160590911705820F931FA9 |
:1099A000909317058093160580919107282F3327F0 |
:1099B00027FD30958091180590911905820F931F0E |
:1099C000909319058093180580919307282F3327CA |
:1099D00027FD30958091FA089927289FD001299F6B |
:1099E000B00D389FB00D1124B093C303A093C203F0 |
:1099F0008091920799278017910724F490931B0573 |
:109A000080931A0580911A0590911B05992324F4DF |
:109A100010921B0510921A058091F50882FD04C072 |
:109A200080912F058D3810F01092820980911405D5 |
:109A30009091150599230CF403969C013595279573 |
:109A40003595279533231CF4309521953F4F809110 |
:109A50003D0590913E0582179307F4F4809114051B |
:109A60009091150599231CF4909581959F4F99230A |
:109A70000CF40396959587959595879590933E055B |
:109A800080933D058536910584F084E690E09093BF |
:109A90003E0580933D0509C080913D0590913E05AE |
:109AA000019790933E0580933D0580911605909116 |
:109AB000170599230CF403969C0135952795359548 |
:109AC000279533231CF4309521953F4F80913F0516 |
:109AD0009091400582179307F4F4809116059091B8 |
:109AE000170599231CF4909581959F4F99230CF4A9 |
:109AF00003969595879595958795909340058093C6 |
:109B00003F058536910584F084E690E0909340050A |
:109B100080933F0509C080913F05909140050197D2 |
:109B20009093400580933F058091470584FF08C0CE |
:109B300010923E0510923D051092400510923F058F |
:109B40008091EE089927880F991FFC01E554F74F83 |
:109B500080911E09282F332780819181281739078A |
:109B600044F48091430982FF04C081E080932B0577 |
:109B700017C08091EE089927880F991FFC01E554C2 |
:109B8000F74F80911E09992720911F09821B910987 |
:109B90009C01808191818217930714F410922B0508 |
:109BA0008091EE089927880F991FFC01E554F74F23 |
:109BB00080911E09992722273327281B390B808182 |
:109BC00091818217930744F48091430983FF04C075 |
:109BD00081E080932C051BC080912C058823B9F06F |
:109BE0008091EE089927880F991FFC01E554F74FE3 |
:109BF00080911F09992720911E09821B91099C01C0 |
:109C0000808191812817390714F410922C058091D6 |
:109C1000ED089927880F991FFC01E554F74F8091B3 |
:109C20001E09282F3327808191812817390744F492 |
:109C30008091430980FF04C081E080932E051BC002 |
:109C400080912E058823B9F08091ED089927880F1F |
:109C5000991FFC01E554F74F80911E099927209127 |
:109C60001F09821B91099C018081918182179307B2 |
:109C700014F410922E058091ED089927880F991FF2 |
:109C8000FC01E554F74F80911E09992722273327BD |
:109C9000281B390B808191818217930744F48091AE |
:109CA000430981FF04C081E080932D051BC0809192 |
:109CB0002D058823B9F08091ED089927880F991F09 |
:109CC000FC01E554F74F80911F09992720911E0947 |
:109CD000821B91099C01808191812817390714F416 |
:109CE00010922D0580912B05882321F480912C055D |
:109CF000882321F081E080932A0502C010922A0572 |
:109D000080912E05882321F480912D05882351F020 |
:109D100081E08093290510922A0510922B0510925C |
:109D20002C0502C01092290580912A05882321F470 |
:109D300080912905882369F080911D099927E9817F |
:109D4000FA818E179F0714F49A83898381E08093A8 |
:109D500007058091470584FF1AC0109219051092DB |
:109D600018051092150510921405109217051092FF |
:109D700016059AE59093B50988E780938209909338 |
:109D80005B098093720910922A051092290520918F |
:109D90007509309176094091770950917809809141 |
:109DA000C4049091C504A091C604B091C704820F69 |
:109DB000931FA41FB51F8093750990937609A093F4 |
:109DC0007709B093780920917C0930917D09409101 |
:109DD0007E0950917F098091CC049091CD04A0918F |
:109DE000CE04B091CF04820F931FA41FB51F8093A0 |
:109DF0007C0990937D09A0937E09B0937F092091FF |
:109E00006A0930916B0940916C0950916D098091FC |
:109E1000C8049091C904A091CA04B091CB04820FE8 |
:109E2000931FA41FB51F80936A0990936B09A09399 |
:109E30006C09B0936D0920915C0930915D094091E6 |
:109E40005E0950915F098091D0049091D104A09156 |
:109E5000D204B091D304820F931FA41FB51F809327 |
:109E60005C0990935D09A0935E09B0935F098091AE |
:109E70002905882349F480912A05882329F48091B3 |
:109E80008209882309F080C01092D4041092D5046E |
:109E90001092D6041092D7041092D8041092D904CC |
:109EA0001092DA041092DB04109275091092760970 |
:109EB000109277091092780910927C0910927D090E |
:109EC00010927E0910927F0910926A0910926B0914 |
:109ED00010926C0910926D0910925C0910925D0944 |
:109EE00010925E0910925F091092C4041092C5048A |
:109EF0001092C6041092C7041092CC041092CD04A4 |
:109F00001092CE041092CF041092E4041092E50453 |
:109F10001092E6041092E7041092EC041092ED0403 |
:109F20001092EE041092EF041092F4041092F504D3 |
:109F30001092F6041092F7041092F8041092F904AB |
:109F40001092FA041092FB0480E090E0A0E0B0E0F0 |
:109F50008093E8049093E904A093EA04B093EB049F |
:109F60008093F0049093F104A093F204B093F3046F |
:109F700010922804109227041092280510922705A9 |
:109F8000109226051092250580912905882309F055 |
:109F90004BC280912A05882309F046C2809175083A |
:109FA00090917608815092402CF480911C05882372 |
:109FB00009F43AC280918209882309F435C250908D |
:109FC000200AAA24AA945A1409F416C180910409FB |
:109FD000A82EBB24CC24DD248091C4049091C50418 |
:109FE000A091C604B091C704BC01CD01A6019501A2 |
:109FF0000E947E7280919F099091A009AA2797FDE7 |
:10A00000A095BA2F39014A01681A790A8A0A9B0A6F |
:10A010008091CC049091CD04A091CE04B091CF0456 |
:10A02000BC01CD01A60195010E947E728091BB0901 |
:10A030009091BC09AA2797FDA095BA2F59016A01F2 |
:10A04000A81AB90ACA0ADB0A252D332727FD30953D |
:10A05000432F532FC401B3010E940A723B014C01EC |
:10A06000DC01CB01992024F481509E4FAF4FBF4FAC |
:10A070003C014D01052E59E095948794779467949F |
:10A080005A95D1F7502D8091200A282F332727FD8C |
:10A090003095432F532FC601B5010E940A725B0110 |
:10A0A0006C01DC01CB01DD2024F481509E4FAF4FC9 |
:10A0B000BF4F5C016D01092E99E0D594C794B79408 |
:10A0C000A7949A95D1F7902D80913D0590913E05EA |
:10A0D000813491053CF480913F0590914005813495 |
:10A0E0009105D4F0D401C30199201CF40196A11D5F |
:10A0F000B11D3C014D019594879477946794D601E6 |
:10A10000C501DD201CF40196A11DB11D5C016D018E |
:10A11000D594C794B794A7948091F0089927880F95 |
:10A12000991FFC01E554F74F0190F081E02DFF23CA |
:10A130001CF4F095E195FF4F7A97D4F00F2EF3E0E1 |
:10A140002F2EF0E03F2EF0E04F2EF0E05F2EF02DAE |
:10A15000C401B301A20191010E947E7239014A013A |
:10A16000C601B501A20191010E947E7259016A01E6 |
:10A170008091220A992787FD9095A92FB92F8615DE |
:10A180009705A805B90514F43C014D018091220AF8 |
:10A19000992787FD9095909581959F4FAA2797FDC8 |
:10A1A000A095BA2F681679068A069B0614F43C011E |
:10A1B0004D018091220A992787FD9095A92FB92FEB |
:10A1C0008A159B05AC05BD0514F45C016D018091F9 |
:10A1D000220A992787FD9095909581959F4FAA27F0 |
:10A1E00097FDA095BA2FA816B906CA06DB060CF093 |
:10A1F000F3C05C016D01F0C080910409A82EBB245E |
:10A20000CC24DD248091C4049091C504A091C6049F |
:10A21000B091C704BC01CD01A60195010E947E72D8 |
:10A2200080919F099091A009AA2797FDA095BA2F28 |
:10A2300039014A01681A790A8A0A9B0A8091CC047A |
:10A240009091CD04A091CE04B091CF04BC01CD017A |
:10A25000A60195010E947E728091BB099091BC0974 |
:10A26000AA2797FDA095BA2F59016A01A81AB90A21 |
:10A27000CA0ADB0AD401C30199201CF40F96A11D60 |
:10A28000B11D3C014D01689413F89594879477941F |
:10A2900067941694D1F7D601C501DD201CF40F9602 |
:10A2A000A11DB11D5C016D01689413F8D594C7948C |
:10A2B000B794A7941694D1F780913D0590913E05EF |
:10A2C000813491053CF480913F05909140058134A3 |
:10A2D0009105D4F00F2EF3E02F2EF0E03F2EF0E0AA |
:10A2E0004F2EF0E05F2EF02DC401B301A2019101C9 |
:10A2F0000E947E7239014A01C601B501A201910195 |
:10A300000E947E7259016A018091F0089927880F96 |
:10A31000991FFC01E554F74F0190F081E02DFF23D8 |
:10A320001CF4F095E195FF4F7A97D4F00F2EF3E0EF |
:10A330002F2EF0E03F2EF0E04F2EF0E05F2EF02DBC |
:10A34000C401B301A20191010E947E7239014A0148 |
:10A35000C601B501A20191010E947E7259016A01F4 |
:10A3600021E262167104810491042CF066247724A2 |
:10A370004301689465F830EE63163FEF73063FEFD4 |
:10A3800083063FEF930654F40F2EF0EE6F2EFFEF8F |
:10A390007F2EFFEF8F2EFFEF9F2EF02D41E2A416B0 |
:10A3A000B104C104D1042CF0AA24BB246501689433 |
:10A3B000A5F850EEA5165FEFB5065FEFC5065FEF97 |
:10A3C000D50654F40F2EF0EEAF2EFFEFBF2EFFEFA9 |
:10A3D000CF2EFFEFDF2EF02D8091E4049091E50465 |
:10A3E000A091E604B091E70486199709A809B90974 |
:10A3F0008093E4049093E504A093E604B093E7040B |
:10A400008091EC049091ED04A091EE04B091EF04E2 |
:10A410008A199B09AC09BD098093EC049093ED0463 |
:10A42000A093EE04B093EF04809127049091280448 |
:10A430008F3F910509F008F462C6809129058823B1 |
:10A4400009F0EBC580912A05882309F0E6C58091C3 |
:10A450000705882309F0E1C580912609882309F4BE |
:10A46000DCC580918209882309F4D7C580917509DC |
:10A4700090917609A0917709B0917809BB2324F4D3 |
:10A4800081509F4FAF4FBF4F892F9A2FAB2FBB27C4 |
:10A49000A7FDBA958093750990937609A0937709E3 |
:10A4A000B093780980917C0990917D09A0917E09F3 |
:10A4B000B0917F09BB2324F481509F4FAF4FBF4F12 |
:10A4C000892F9A2FAB2FBB27A7FDBA9580937C09C4 |
:10A4D00090937D09A0937E09B0937F098091040930 |
:10A4E0009927AA27BB272091D4043091D504409105 |
:10A4F000D6045091D704BC01CD010E940A72992361 |
:10A5000024F461507F4F8F4F9F4FBB2797FDBA9523 |
:10A51000A92F982F872F8093D4049093D504A093CC |
:10A52000D604B093D704809104099927AA27BB27A2 |
:10A530002091D8043091D9044091DA045091DB0481 |
:10A54000BC01CD010E940A72992324F461507F4F0F |
:10A550008F4F9F4FBB2797FDBA95A92F982F872F15 |
:10A560008093D8049093D904A093DA04B093DB04C9 |
:10A570008091DC049091DD04A091DE04B091DF04B1 |
:10A58000BB2324F481509F4FAF4FBF4F892F9A2F89 |
:10A59000AB2FBB27A7FDBA958093DC049093DD0415 |
:10A5A000A093DE04B093DF04209175093091760901 |
:10A5B00040917709509178098091D4049091D50405 |
:10A5C000A091D604B091D704281B390B4A0B5B0B22 |
:10A5D000DA01C90120937D0530937E0540937F0504 |
:10A5E0005093800520912509622E77248824992490 |
:10A5F000BC01CD01A40193010E947E7259016A0140 |
:10A6000020938C0530938D0540938E0550938F05D4 |
:10A6100020917C0930917D0940917E0950917F09FC |
:10A620008091D8049091D904A091DA04B091DB0410 |
:10A63000281B390B4A0B5B0B209381053093820555 |
:10A640004093830550938405CA01B901A401930185 |
:10A650000E947E722093900530939105409392055D |
:10A6600050939305D601C501DD2024F481509F4FFE |
:10A67000AF4FBF4F892F9A2FAB2FBB27A7FDBA959E |
:10A6800090932805809327058091900590919105DE |
:10A69000A0919205B0919305BB2324F481509F4F64 |
:10A6A000AF4FBF4F892F9A2FAB2FBB27A7FDBA956E |
:10A6B000909326058093250580913D0590913E0558 |
:10A6C00081349105CCF480913F059091400581340F |
:10A6D000910594F48091F0089927880F991FFC0147 |
:10A6E000E554F74F0190F081E02DFF231CF4F09525 |
:10A6F000E195FF4F7A97F4F08091200A8F3FD1F4D3 |
:10A70000809127059091280599230CF40196959541 |
:10A710008795909328058093270580912505909132 |
:10A72000260599230CF40196959587959093260517 |
:10A730008093250580916A0990916B09A0916C091D |
:10A74000B0916D09BB2324F481509F4FAF4FBF4F91 |
:10A75000892F9A2FAB2FBB27A7FDBA9580936A0943 |
:10A7600090936B09A0936C09B0936D0980915C097B |
:10A7700090915D09A0915E09B0915F09BB2324F41B |
:10A7800081509F4FAF4FBF4F892F9A2FAB2FBB27C1 |
:10A79000A7FDBA9580935C0990935D09A0935E092B |
:10A7A000B0935F092091C8043091C9044091CA0454 |
:10A7B0005091CB048091C4049091C504A091C6042B |
:10A7C000B091C70459016A01A81AB90ACA0ADB0A7A |
:10A7D000A0927505B0927605C0927705D092780563 |
:10A7E0002091D0043091D1044091D2045091D304EF |
:10A7F0008091CC049091CD04A091CE04B091CF046F |
:10A80000281B390B4A0B5B0B2093790530937A0593 |
:10A8100040937B0550937C05A0927D05B0927E0508 |
:10A82000C0927F05D09280052093810530938205E8 |
:10A8300040938305509384058091E8049091E90446 |
:10A84000A091EA04B091EB048A199B09AC09BD09F7 |
:10A850008093E8049093E904A093EA04B093EB0496 |
:10A860008091F0049091F104A091F204B091F3046E |
:10A87000821B930BA40BB50B8093F0049093F1040F |
:10A88000A093F204B093F30480912609882391F1F8 |
:10A8900080910805909109058138910594F0809187 |
:10A8A000B4049091B50401969093B5048093B404D8 |
:10A8B00080918009909181090196909381098093FC |
:10A8C0008009809108059091090580589F4F94F464 |
:10A8D0008091B4049091B50401979093B50480934E |
:10A8E000B404809180099091810901979093810926 |
:10A8F00080938009109209051092080581E090E08C |
:10A90000909399058093980580917D0590917E059F |
:10A91000A0917F05B0918005BB233CF4B095A09534 |
:10A92000909581959F4FAF4FBF4F81509240A0406F |
:10A93000B04034F084E090E09093990580939805BE |
:10A9400020919E0530919F054091A0055091A10551 |
:10A950008091750990917609A0917709B091780955 |
:10A96000281B390B4A0B5B0BDA01C901815E914B45 |
:10A97000AF4FBF4F8F539C49A040B04028F080910B |
:10A98000210A89310CF41BC120917D0530917E058F |
:10A9900040917F05509180052130F0E13F07F0E0C4 |
:10A9A0004F07F0E05F070CF47AC080919A05882386 |
:10A9B00009F471C0DA01C90155233CF4B095A095A2 |
:10A9C000909581959F4FAF4FBF4FBB2324F481508B |
:10A9D0009E4FAF4FBF4F072E79E0B595A79597953E |
:10A9E00087957A95D1F7702D20919805309199052A |
:10A9F000820F931F909399058093980580917D0510 |
:10AA000090917E05A0917F05B0918005BB231CF439 |
:10AA10000796A11DB11D689412F8B595A795979555 |
:10AA200087951694D1F780938C0590938D05A0930C |
:10AA30008E05B0938F0589589341A040B04064F0D3 |
:10AA400088E893E1A0E0B0E080938C0590938D05B9 |
:10AA5000A0938E05B0938F0580918C0590918D0504 |
:10AA6000A0918E05B0918F05BB2324F481509F4F98 |
:10AA7000AF4FBF4F892F9A2FAB2FBB27A7FDBA959A |
:10AA80002091270530912805820F931F9093280568 |
:10AA90008093270506C081E080939A0502C010923A |
:10AAA0009A0520917D0530917E0540917F0550915A |
:10AAB0008005203060EF36076FEF46076FEF5607CF |
:10AAC0000CF07AC080919B05882309F471C0DA01EB |
:10AAD000C90155233CF4B095A095909581959F4F61 |
:10AAE000AF4FBF4FBB2324F481509E4FAF4FBF4F9A |
:10AAF000072E79E0B595A795979587957A95D1F723 |
:10AB0000702D2091980530919905820F931F909395 |
:10AB100099058093980580917D0590917E05A0917F |
:10AB20007F05B0918005BB231CF40796A11DB11DC4 |
:10AB3000689412F8B595A795979587951694D1F7CF |
:10AB400080938C0590938D05A0938E05B0938F050F |
:10AB500088579C4EAF4FBF4F64F488E79CEEAFEF31 |
:10AB6000BFEF80938C0590938D05A0938E05B093D5 |
:10AB70008F0580918C0590918D05A0918E05B091E7 |
:10AB80008F05BB2324F481509F4FAF4FBF4F892FB8 |
:10AB90009A2FAB2FBB27A7FDBA952091270530919F |
:10ABA0002805820F931F909328058093270511C0D5 |
:10ABB00081E080939B050DC010929B050AC0109206 |
:10ABC00099051092980588EE93E09093A1038093E5 |
:10ABD000A00380912609282F332780919805909112 |
:10ABE00099052817390724F430939905209398057F |
:10ABF0008091210A882379F0282F332727FD30956B |
:10AC000080919805909199052817390724F430937D |
:10AC100099052093980580917D0590917E05A091DE |
:10AC20007F05B091800581389105A105B10574F0CB |
:10AC30008091B0049091B1042091980530919905CC |
:10AC4000820F931F9093B1048093B00480917D058F |
:10AC500090917E05A0917F05B091800580589F4F0F |
:10AC6000AF4FBF4F74F48091B0049091B104209124 |
:10AC7000980530919905821B930B9093B1048093B2 |
:10AC8000B00481E090E090939905809398058091BD |
:10AC9000810590918205A0918305B0918405BB2325 |
:10ACA0003CF4B095A095909581959F4FAF4FBF4FC5 |
:10ACB00081509240A040B04034F084E090E0909306 |
:10ACC0009905809398051092900510929105109225 |
:10ACD0009205109293052091A2053091A305409111 |
:10ACE000A4055091A50580917C0990917D09A091C2 |
:10ACF0007E09B0917F09281B390B4A0B5B0BDA01E7 |
:10AD0000C901815E914BAF4FBF4F8F539C49A0400B |
:10AD1000B04028F08091210A89310CF41BC12091A8 |
:10AD20008105309182054091830550918405213041 |
:10AD300060E1360760E0460760E056070CF47AC031 |
:10AD400080919C05882309F471C0DA01C90155235B |
:10AD50003CF4B095A095909581959F4FAF4FBF4F14 |
:10AD6000BB2324F481509E4FAF4FBF4F072E79E095 |
:10AD7000B595A795979587957A95D1F7702D2091E0 |
:10AD8000980530919905820F931F909399058093B0 |
:10AD900098058091810590918205A0918305B091DD |
:10ADA0008405BB231CF40796A11DB11D689412F8FD |
:10ADB000B595A795979587951694D1F780939005AB |
:10ADC00090939105A0939205B09393058958934170 |
:10ADD000A040B04064F088E893E1A0E0B0E0809348 |
:10ADE000900590939105A0939205B093930580915F |
:10ADF000900590919105A0919205B0919305BB2388 |
:10AE000024F481509F4FAF4FBF4F892F9A2FAB2F04 |
:10AE1000BB27A7FDBA952091250530912605820F05 |
:10AE2000931F909326058093250506C081E08093AB |
:10AE30009C0502C010929C052091810530918205ED |
:10AE40004091830550918405203080EF38078FEFC3 |
:10AE500048078FEF58070CF07AC080919D05882332 |
:10AE600009F471C0DA01C90155233CF4B095A095ED |
:10AE7000909581959F4FAF4FBF4FBB2324F48150D6 |
:10AE80009E4FAF4FBF4F072E79E0B595A795979589 |
:10AE900087957A95D1F7702D209198053091990575 |
:10AEA000820F931F90939905809398058091810557 |
:10AEB00090918205A0918305B0918405BB231CF479 |
:10AEC0000796A11DB11D689412F8B595A7959795A1 |
:10AED00087951694D1F78093900590939105A09350 |
:10AEE0009205B093930588579C4EAF4FBF4F64F4C3 |
:10AEF00088E79CEEAFEFBFEF8093900590939105AC |
:10AF0000A0939205B093930580919005909191053F |
:10AF1000A0919205B0919305BB2324F481509F4FDB |
:10AF2000AF4FBF4F892F9A2FAB2FBB27A7FDBA95E5 |
:10AF30002091250530912605820F931F90932605B9 |
:10AF40008093250511C081E080939D050DC010926E |
:10AF50009D050AC0109299051092980588EE93E01D |
:10AF60009093A1038093A00380912609282F332773 |
:10AF700080919805909199052817390724F430930A |
:10AF80009905209398058091210A882379F0282F2C |
:10AF9000332727FD309580919805909199052817C2 |
:10AFA000390724F430939905209398058091810501 |
:10AFB00090918205A0918305B09184058138910517 |
:10AFC000A105B10574F08091B2049091B304209171 |
:10AFD000980530919905820F931F9093B304809345 |
:10AFE000B2048091810590918205A0918305B09172 |
:10AFF000840580589F4FAF4FBF4FCCF48091B2046F |
:10B000009091B3042091980530919905821B930B80 |
:10B010009093B3048093B2040AC010922605109254 |
:10B02000250510922805109227051092070580919A |
:10B030008209882341F4109226051092250510926A |
:10B040002805109227058091750990917609A091A5 |
:10B050007709B091780980939E0590939F05A093FE |
:10B06000A005B093A10580917C0990917D09A091E4 |
:10B070007E09B0917F098093A2059093A305A093C8 |
:10B08000A405B093A5051092D4041092D504109293 |
:10B09000D6041092D7041092D8041092D9041092BA |
:10B0A000DA041092DB041092DC041092DD0410929A |
:10B0B000DE041092DF041092750910927609109246 |
:10B0C00077091092780910927C0910927D091092EC |
:10B0D0007E0910927F0910926A0910926B091092F2 |
:10B0E0006C0910926D0910925C0910925D09109222 |
:10B0F0005E0910925F091092280410922704809133 |
:10B1000018059091190599231CF4909581959F4FEE |
:10B1100040976CF088EE93E09093A1038093A00396 |
:10B120008091F50884FD03C081E080938B058091B8 |
:10B130000109E82EFF24002711278091180590911E |
:10B1400019055C01CC24B7FCC094DC2C99231CF4B9 |
:10B15000909581959F4F9C01442737FD4095542F32 |
:10B16000C601B5010E940A729B01AC01C801B7017A |
:10B170000E940A72992324F461507E4F8F4F9F4F93 |
:10B18000DC01CB01072E79E0B595A79597958795BA |
:10B190007A95D1F7702DAC0180910109282F3327C2 |
:10B1A0008091180590911905289F5001299FB00C96 |
:10B1B000389FB00C11249501BB2014F42D5F3F4F34 |
:10B1C000C9019595879595958795480F591FBA019F |
:10B1D000882777FD8095982F9B01AC0160937105BE |
:10B1E0007093720580937305909374058091F404B5 |
:10B1F0009091F504A091F604B091F704821B930B93 |
:10B20000A40BB50B8093F4049093F504A093F6047B |
:10B21000B093F7048155934CA040B04064F080E5B2 |
:10B2200093ECA0E0B0E08093F4049093F504A09335 |
:10B23000F604B093F7048091F4049091F504A09182 |
:10B24000F604B091F704805B9C43AF4FBF4F64F4AA |
:10B2500080EB9CE3AFEFBFEF8093F4049093F50491 |
:10B26000A093F604B093F704809100059091010536 |
:10B27000892B09F4B7C18091F50883FFB3C1809190 |
:10B28000C4049091C504A091C604B091C704BB2327 |
:10B2900024F481509E4FAF4FBF4F072E79E0B595F4 |
:10B2A000A795979587957A95D1F7702D4C0199239D |
:10B2B00024F490948194910893948091CC0490917B |
:10B2C000CD04A091CE04B091CF04BB2324F48150CF |
:10B2D0009E4FAF4FBF4F072E79E0B595A795979535 |
:10B2E00087957A95D1F7702D8C0199231CF41095D0 |
:10B2F00001951F4F801691060CF44801B401992066 |
:10B3000014F4695F7F4F3B0175946794759467945B |
:10B31000759467940894611C711C8091000590914C |
:10B320000105845E9D4F5C01CC24B7FCC094DC2CED |
:10B330008091B7099091B809A091B909B091BA0963 |
:10B340002091C4033091C5034091C6035091C703B7 |
:10B35000BC01CD010E947E72A21AB30AC40AD50AAA |
:10B36000C601B50128E631E040E050E00E947E725F |
:10B37000DC01CB012C010F2EFCE4AF2EFFEFBF2E22 |
:10B38000F02D4A0C5B1C8091B0099091B109992372 |
:10B390001CF4909581959F4F8138910514F04424B9 |
:10B3A00055248091A0039091A103892BE1F529E117 |
:10B3B00082169104C4F58091080590910905840DC9 |
:10B3C000951D909309058093080580918B0588232E |
:10B3D00051F18091000590910105AA2797FDA09554 |
:10B3E000BA2FA090C403B090C503C090C603D090FC |
:10B3F000C703BC01CD01A60195010E940A72DC01C0 |
:10B40000CB018093B7099093B809A093B909B09381 |
:10B41000BA09BC01CD010E947E72309303052093CE |
:10B42000020510928B05C201880F991F880F991F82 |
:10B43000880F991FB3010E9449729B01442737FD71 |
:10B440004095542F8091B7099091B809A091B909FE |
:10B45000B091BA09820F931FA41FB51F8093B7093B |
:10B460009093B809A093B909B093BA098091B20337 |
:10B470009927889EA001899E500D989E500D1124F9 |
:10B48000CA0155230CF44F964C01959487949594DA |
:10B4900087949594879495948794959487948091B4 |
:10B4A000B2039927881999094C010AF495C0809133 |
:10B4B000A0039091A103892B09F082C020913D0542 |
:10B4C00030913E0580913F05909140058901080F1C |
:10B4D000191FC80111230CF407969595879595952A |
:10B4E0008795959587958C01005C1F4F8091B709D2 |
:10B4F0009091B809A091B909B091BA092091C403FB |
:10B500003091C5034091C6035091C703BC01CD01E2 |
:10B510000E947E728091020590910305AA2797FDF3 |
:10B52000A095BA2F281B390B4A0B5B0BDA01C90116 |
:10B53000845E9D4FAF4FBF4FBC01CD0128E631E087 |
:10B5400040E050E00E947E72DC01CB01845B9040C1 |
:10B55000889DB001899D700D989D700D1124CB01BF |
:10B56000B8010E9449728B019091B20383E0989FC9 |
:10B57000400111248616970614F4840108C0882718 |
:10B58000992788199909681779070CF48C01C80163 |
:10B59000AA2797FDA095BA2F2091F4043091F504C5 |
:10B5A0004091F6045091F704820F931FA41FB51F1A |
:10B5B0008093F4049093F504A093F604B093F704F9 |
:10B5C0008091A0039091A103009761F0019790935F |
:10B5D000A1038093A00306C084EF91E09093A103A0 |
:10B5E0008093A00380918A05815080938A058F3FC4 |
:10B5F00009F0CBC088E180938A05809104099927DE |
:10B60000880F991F880F991F5C01CC24B7FCC09448 |
:10B61000DC2C8091C4049091C504A091C604B09123 |
:10B62000C704BC01CD01A60195010E947E72309332 |
:10B630003208209331088091CC049091CD04A091E0 |
:10B64000CE04B091CF04BC01CD01A60195010E94AA |
:10B650007E72309334082093330880919F09909133 |
:10B66000A00999230CF40396959587959595879550 |
:10B6700090933608809335088091BB099091BC095E |
:10B6800099230CF4039695958795959587959093B6 |
:10B690003808809337088091B0099091B109909350 |
:10B6A0003A088093390880911D0590911E05A0915C |
:10B6B0001F05B0912005BC01CD0125E030E040E040 |
:10B6C00050E00E947E7230933C0820933B088091AA |
:10B6D00075089091760890933E0880933D0880917C |
:10B6E0000005909101059093420880934108809154 |
:10B6F000190390911A039093440880934308809112 |
:10B700001205992790934608809345088091B709C0 |
:10B710009091B809A091B909B091BA092091C403D8 |
:10B720003091C5034091C6035091C703BC01CD01C0 |
:10B730000E947E7230934808209347088091250428 |
:10B7400090912604909356088093550880918A071B |
:10B7500099279093580880935708809100049091FE |
:10B76000010490935A08809359088091B5059091EF |
:10B77000B60590936E0880936D088091B7059091FF |
:10B78000B8059093700880936F088091070588230F |
:10B7900081F010926505109266051092670510926F |
:10B7A000680510926105109262051092630510926F |
:10B7B0006405809129058823E9F4809182099927FD |
:10B7C000AA27BB272091C4043091C5044091C60428 |
:10B7D0005091C704BC01CD010E940A72DC01CB016B |
:10B7E000BC01CD0128EF3AE240E050E00E947E72B9 |
:10B7F000290102C04424552480912A058823E9F4B4 |
:10B80000809182099927AA27BB272091CC043091E7 |
:10B81000CD044091CE045091CF04BC01CD010E94D3 |
:10B820000A72DC01CB01BC01CD0128EF3AE240E015 |
:10B8300050E00E947E72190102C0222433248091BC |
:10B84000560990915709893C91053CF088EC90E0AD |
:10B8500090935709809356090DC080915609909195 |
:10B86000570988539F4F34F488E39FEF909357090B |
:10B87000809356098091610990916209893C9105F4 |
:10B880003CF088EC90E090936209809361090DC0D0 |
:10B89000809161099091620988539F4F34F488E345 |
:10B8A0009FEF9093620980936109809182098823B8 |
:10B8B00009F04BC08091630990916409AA2797FD14 |
:10B8C000A095BA2F2091B509332744275527BC01ED |
:10B8D000CD010E940A72992324F4615C7F4F8F4F3F |
:10B8E0009F4FDC01CB01689415F8B595A795979506 |
:10B8F00087951694D1F7909364098093630980919A |
:10B90000540990915509AA2797FDA095BA2F209127 |
:10B91000B509332744275527BC01CD010E940A727F |
:10B92000992324F4615C7F4F8F4F9F4FDC01CB0143 |
:10B93000689415F8B595A795979587951694D1F7BE |
:10B9400090935509809354097AC08091630990912E |
:10B950006409AA2797FDA095BA2F2091B50933272E |
:10B9600044275527BC01CD010E940A729B01AC01FE |
:10B970008091560990915709AA2797FDA095BA2F53 |
:10B98000689416F8880F991FAA1FBB1F1694D1F749 |
:10B99000280F391F4A1F5B1F552324F4215C3F4F9A |
:10B9A0004F4F5F4FDA01C901689415F8B595A79517 |
:10B9B000979587951694D1F7840D951D90936409FA |
:10B9C000809363098091540990915509AA2797FDA6 |
:10B9D000A095BA2F2091B509332744275527BC01DC |
:10B9E000CD010E940A729B01AC0180916109909186 |
:10B9F0006209AA2797FDA095BA2F689416F8880FB8 |
:10BA0000991FAA1FBB1F1694D1F7280F391F4A1F71 |
:10BA10005B1F552324F4215C3F4F4F4F5F4FDA01EA |
:10BA2000C901689415F8B595A795979587951694CB |
:10BA3000D1F7820D931D90935509809354098091FD |
:10BA4000B0099091B109880F991FAA2797FDA09579 |
:10BA5000BA2F20915B09332744275527BC01CD011C |
:10BA60000E940A72992324F4615C7F4F8F4F9F4F8D |
:10BA70005B016C01689415F8D594C794B794A794AA |
:10BA80001694D1F7809172099927AA27BB27209194 |
:10BA9000E0043091E1044091E2045091E304BC01E0 |
:10BAA000CD010E940A72DC01CB01BC01CD0120EF67 |
:10BAB00035E540E050E00E947E72DA01C9018A0D4E |
:10BAC0009B1D9093B1098093B00980916309909177 |
:10BAD00064098150904434F080E090E490936409CC |
:10BAE0008093630980916309909164098050904C20 |
:10BAF00034F480E090EC9093640980936309809122 |
:10BB00005409909155098150904434F080E090E4BC |
:10BB10009093550980935409809154099091550947 |
:10BB20008050904C34F480E090EC909355098093D1 |
:10BB300054098091B0099091B1098150904434F03A |
:10BB400080E090E49093B1098093B0098091B009AE |
:10BB50009091B1098050904C34F480E090EC909337 |
:10BB6000B1098093B00980910201482F5527809137 |
:10BB7000190390911A034817590794F42091190357 |
:10BB800030911A0369817A81649FC001659F900D8D |
:10BB9000749F900D1124B9010E9435727A836983D4 |
:10BBA00089819A81880F991F880F991F9A838983A9 |
:10BBB0008091F50880FF50C680912A05882309F0FE |
:10BBC0004BC680912905882309F046C68091AA05B5 |
:10BBD0009091AB0590935C0880935B08809125045D |
:10BBE0009091260490935608809355088091AE0456 |
:10BBF0009091AF04892B09F057C080912303909155 |
:10BC000024038959934010F187B5853FD8F480917A |
:10BC10002404982F9150909324048AE09802C00144 |
:10BC2000112420917F08281B27BD8CE291E090937E |
:10BC3000FD038093FC038EE591E09093AF04809325 |
:10BC4000AE0457C081E08093B30553C080912303B5 |
:10BC5000909124038436910510F587B58B30D8F088 |
:10BC600080912404982F9F5F909324048AE0980287 |
:10BC7000C001112420917F08281B27BD8CE291E090 |
:10BC80009093FD038093FC038EE591E09093AF04C5 |
:10BC90008093AE042EC081E08093B2052AC010923A |
:10BCA000B2051092B30525C080911D0590911E0527 |
:10BCB000A0911F05B0912005689413F8880F991F73 |
:10BCC000AA1FBB1F1694D1F78093200490932104E0 |
:10BCD000A0932204B093230410922604109225040A |
:10BCE0008091AE049091AF0401979093AF0480933C |
:10BCF000AE048091F50881FF2DC08091AF0382339F |
:10BD000020F080912F058D38F0F08091CD03815087 |
:10BD10008093CD038F3F09F047C0109206058091B4 |
:10BD20001D0590911E05A0911F05B09120058093DF |
:10BD3000210590932205A0932305B093240581E06B |
:10BD40008093CD0331C081E08093060588EC809319 |
:10BD5000CD032AC02091AF038091C2039091C30309 |
:10BD6000820F911D9C018091FA089927289FF0016C |
:10BD7000299FF00D389FF00D1124CF01AA2797FDC0 |
:10BD8000A095BA2F8093210590932205A0932305B7 |
:10BD9000B093240580912F058D3818F01092060578 |
:10BDA00003C081E0809306058091C4049091C5048E |
:10BDB000A091C604B091C7046090C4037090C503FD |
:10BDC0008090C6039090C703BC01CD01A4019301EC |
:10BDD0000E947E7259016A018091CC049091CD0439 |
:10BDE000A091CE04B091CF04BC01CD01A401930178 |
:10BDF0000E947E72B901C5010E941B718C01CD9712 |
:10BE000014F00CE310E0C8010E94C36F8C01809114 |
:10BE10000605882309F45CC38091470584FD58C357 |
:10BE20008091450980FD04C08091F50881FD07C01F |
:10BE300089809A801092A7051092A60584C18091EE |
:10BE4000470581FF58C18091C9039091CA039C01A5 |
:10BE5000215F3F4F80911A0590911B0528173907E4 |
:10BE6000DCF58091B2058823B9F58091B40581FF96 |
:10BE700013C08D7F8093B40580911D0590911E05A0 |
:10BE8000A0911F05B0912005809321059093220574 |
:10BE9000A0932305B09324058091B405816080931D |
:10BEA000B40520911A0530911B058091C90390912A |
:10BEB000CA03281B390B2F5030401AF430952195B6 |
:10BEC0003F4F8091A6059091A705820F931F9093F5 |
:10BED000A7058093A60573C08091C9039091CA03FA |
:10BEE0009C012F50304080911A0590911B058217BC |
:10BEF0009307DCF58091B3058823B9F58091B405EB |
:10BF000080FF13C08E7F8093B40580911D059091B2 |
:10BF10001E05A0911F05B0912005809321059093E7 |
:10BF20002205A0932305B09324058091B405826077 |
:10BF30008093B40520911A0530911B058091C903A7 |
:10BF40009091CA03281B390B215F3F4F1AF430959B |
:10BF500021953F4F8091A6059091A705821B930BD9 |
:10BF60009093A7058093A6052AC02091B405822F3F |
:10BF7000992783709070892B11F1822F8C7F809389 |
:10BF8000B4051092A7051092A60580911D05909109 |
:10BF90001E05A0911F05B091200580932105909367 |
:10BFA0002205A0932305B09324058091450981FFC4 |
:10BFB00006C084EF91E09093FD038093FC03809191 |
:10BFC000A6059091A70599231CF4909581959F4F04 |
:10BFD000815092400CF478C08091FA08282F3327C2 |
:10BFE0008091A6059091A705289F5001299FB00C2C |
:10BFF000389FB00C1124C50160E075E00E944972C1 |
:10C000009B01442737FD4095542F80912105909145 |
:10C010002205A0912305B0912405820F931FA41F30 |
:10C02000B51F8093210590932205A0932305B0931B |
:10C0300024051092A7051092A6058091450981FF5D |
:10C0400006C08BE490E09093FD038093FC03809105 |
:10C05000FE088823C9F56091AA057091AB05772386 |
:10C0600014F46D5F7F4F7595679575956795409151 |
:10C07000190350911A0380910201282F3327649FDE |
:10C08000C001659F900D749F900D1124B9010E940D |
:10C0900049727093CA036093C903663471053CF416 |
:10C0A00086E490E09093CA038093C9030DC0809109 |
:10C0B000C9039091CA038739910534F086E990E06D |
:10C0C0009093CA038093C9038091AE049091AF040A |
:10C0D000892BA9F180911D0590911E05A0911F0546 |
:10C0E000B09120058093210590932205A09323050C |
:10C0F000B093240524C080911D0590911E05A09148 |
:10C100001F05B091200580599140A040B040809318 |
:10C11000210590932205A0932305B09324058091D7 |
:10C12000FE08882331F099279093CA038093C903AE |
:10C1300006C088E790E09093CA038093C90380907B |
:10C14000AA059090AB0520911D0530911E054091E8 |
:10C150001F05509120058091210590912205A09105 |
:10C160002305B091240582179307A407B50724F08F |
:10C170008091450980FDFBC1E0901D05F0901E05F2 |
:10C180008091210590912205E81AF90A8091B00367 |
:10C19000482F55274E9D60014F9DD00C5E9DD00CC1 |
:10C1A0001124C601DD200CF40F96AC01559547957E |
:10C1B000559547955595479555954795841A950AF0 |
:10C1C0002091250430912604332314F4295F3F4F36 |
:10C1D000A9015595479555954795559547954930EA |
:10C1E000510514F048E050E014161506BCF4449FC5 |
:10C1F0009001459F300D549F300D1124332314F4CA |
:10C200002D5F3F4F359527953595279580912504CE |
:10C2100090912604A901480F591F16C0449F900110 |
:10C22000459F300D549F300D1124332314F42D5F9E |
:10C230003F4F359527953595279580912504909109 |
:10C240002604AC01421B530B8091AE039927AA2709 |
:10C25000BB275A01CC24B7FCC094DC2CA601950165 |
:10C26000BC01CD010E940A72992324F461587F4FCA |
:10C270008F4F9F4FDC01CB01689416F8B595A795B9 |
:10C28000979587951694D1F7AC012FEF81389207D7 |
:10C290001CF441E85FEF06C08F3F910519F014F0E0 |
:10C2A0004FEF50E0841A950A8091FC049091FD04B0 |
:10C2B000A091FE04B091FF04BB2324F481589F4F4A |
:10C2C000AF4FBF4F689416F8B595A795979587958A |
:10C2D0001694D1F72091B103332744275527BC0189 |
:10C2E000CD010E940A72992324F4615E7F4F8F4F23 |
:10C2F0009F4FDC01CB01689414F8B595A7959795ED |
:10C3000087951694D1F7AC013FEF813893071CF461 |
:10C3100041E85FEF06C08F3F910519F014F04FEF31 |
:10C3200050E0841A950AC7018B569F4F8B5291405B |
:10C33000F0F48091A6059091A705892BC1F4809116 |
:10C34000AA059091AB05181619068CF48091AC05DE |
:10C350009091AD058816990614F44C0108C080919F |
:10C36000CB039091CC03881599050CF44C01809176 |
:10C37000AE049091AF04892B21F08090AA05909093 |
:10C38000AB058091B3039927AA27BB272091240AE4 |
:10C39000332727FD3095432F532FBC01CD010E9439 |
:10C3A0000A72992324F461587F4F8F4F9F4FDC010D |
:10C3B000CB01689416F8B595A7959795879516942F |
:10C3C000D1F7AC016FEF813896071CF441E85FEFBD |
:10C3D00006C08F3F910519F014F04FEF50E0841A1A |
:10C3E000950AC401AA2797FDA095BA2F072E7DE0D4 |
:10C3F000880F991FAA1FBB1F7A95D1F7702D98013E |
:10C40000442737FD4095542FBC01CD010E947E7218 |
:10C410002093790530937A0540937B0550937C05F2 |
:10C420008090790590907A052091A8053091A90512 |
:10C43000C901880F991F820F931F9C01280D391D78 |
:10C44000332314F42D5F3F4F359527953595279568 |
:10C450003093A9052093A8058091F6089927880FA5 |
:10C46000991F880F991F281739072CF49093A90555 |
:10C470008093A80515C08091AF099927880F991F4F |
:10C48000880F991F9C01205530408091A8059091FC |
:10C49000A9052817390724F43093A9052093A80586 |
:10C4A0008091450980FF0DC08091A8059091A90554 |
:10C4B000A981BA81A817B90724F4B093A905A0935C |
:10C4C000A805E091A805F091A905FA83E9834FC07A |
:10C4D0008091FE08882319F56091AA057091AB053B |
:10C4E000772314F46D5F7F4F759567957595679504 |
:10C4F0004091190350911A0380910201282F33278C |
:10C50000649FC001659F900D749F900D1124B90127 |
:10C510000E9449727093CA036093C90307C0809157 |
:10C52000FE0899279093CA038093C9038091C90399 |
:10C530009091CA03863491053CF486E490E0909390 |
:10C54000CA038093C9030DC08091C9039091CA03A7 |
:10C550008739910534F086E990E09093CA0380937F |
:10C56000C903A980BA80B092A905A092A8058091BC |
:10C57000470581FF71C18091470584FD6DC18091A0 |
:10C58000AE059091AF05A091B005B091B1050097AF |
:10C59000A105B105C1F4C980DA80C601AA2797FDBB |
:10C5A000A095BA2F072E7CE0880F991FAA1FBB1FEA |
:10C5B0007A95D1F7702D8093AE059093AF05A09337 |
:10C5C000B005B093B105809125049091260499237C |
:10C5D0001CF4909581959F4F843691050CF03CC1D9 |
:10C5E00069817A819B01442737FD4095542FC8010A |
:10C5F000AA2797FDA095BA2FBC01CD010E940A720F |
:10C60000DC01CB018093790590937A05A0937B059B |
:10C61000B0937C05BB2324F48150904EAF4FBF4FA5 |
:10C620007C018D010D2EDDE015950795F794E794BB |
:10C63000DA95D1F7D02DE0927905F0927A05009342 |
:10C640007B0510937C058091450590914605805DA2 |
:10C65000974070F52091AE053091AF054091B0053F |
:10C660005091B105DA01C901072E79E0B695A79579 |
:10C67000979587957A95D1F7702D281B390B4A0B22 |
:10C680005B0BD801C701689412F8880F991FAA1F85 |
:10C69000BB1F1694D1F7820F931FA41FB51F809361 |
:10C6A000AE059093AF05A093B005B093B1059DC0C2 |
:10C6B0008091450590914605805A9F40A0F52091B4 |
:10C6C000AE053091AF054091B0055091B105DA014A |
:10C6D000C901072E7AE0B695A795979587957A9523 |
:10C6E000D1F7702D281B390B4A0B5B0B8091790514 |
:10C6F00090917A05A0917B05B0917C05880F991FD8 |
:10C70000AA1FBB1F880F991FAA1FBB1F820F931F51 |
:10C71000A41FB51F8093AE059093AF05A093B005FD |
:10C72000B093B10562C08091450590914605805453 |
:10C730009F4180F52091AE053091AF054091B00545 |
:10C740005091B105DA01C901072E7BE0B695A79596 |
:10C75000979587957A95D1F7702D281B390B4A0B41 |
:10C760005B0B8091790590917A05A0917B05B09142 |
:10C770007C05880F991FAA1FBB1F820F931FA41F40 |
:10C78000B51F8093AE059093AF05A093B005B0930D |
:10C79000B1052BC02091AE053091AF054091B00599 |
:10C7A0005091B105DA01C901072E7CE0B695A79535 |
:10C7B000979587957A95D1F7702D281B390B4A0BE1 |
:10C7C0005B0B8091790590917A05A0917B05B091E2 |
:10C7D0007C05820F931FA41FB51F8093AE05909315 |
:10C7E000AF05A093B005B093B1058091AE059091CF |
:10C7F000AF05A091B005B091B105072E7CE0B695CC |
:10C80000A795979587957A95D1F7702D9093AB055D |
:10C810008093AA052091FC082223A1F03327FC0174 |
:10C82000B9010E944972CF01861B970B9093AD0509 |
:10C830008093AC05CB018E0F9F1F9093CC03809308 |
:10C84000CB030AC01092AD051092AC058FEF93E0B8 |
:10C850009093CC038093CB03809168099927880F2C |
:10C86000991F880F991F8896E981FA81E817F907BF |
:10C8700014F49A8389838091AF099927880F991FAF |
:10C88000880F991F80559040A980BA808A159B0512 |
:10C8900014F49A838983809149048823C1F080919C |
:10C8A0004505909146050297C09788F4C980DA80C3 |
:10C8B0001C141D0464F481E090E09093460580937D |
:10C8C000450580916809282F33273A8329834981B8 |
:10C8D0005A815093400840933F0880917105909190 |
:10C8E0007205A0917305B0917405880F991FAA1F56 |
:10C8F000BB1F880F991FAA1FBB1F2091B009309141 |
:10C90000B1096901C81AD90A413A51056CF1CA0145 |
:10C9100055230CF40196959587958C159D054CF43F |
:10C9200029813A81332314F42F5F3F4F6901D59455 |
:10C93000C79489819A8199230CF4019695958795DE |
:10C94000909581959F4FC816D90614F529813A8193 |
:10C95000332314F42F5F3F4F6901D594C794D094CB |
:10C96000C194D108D39414C051E5C516D1042CF05C |
:10C970000F2EF0E5CF2EDD24F02D60EBC6166FEF05 |
:10C98000D60634F40F2EF0EBCF2EFFEFDF2EF02D76 |
:10C990008091AF09482F5527440F551F440F551F4D |
:10C9A000CA01A981BA818A1B9B0B8C159D050CF4C9 |
:10C9B0006C0129813A81241B350BC216D3060CF475 |
:10C9C0006901809163099091640920911405309167 |
:10C9D0001505821B930B90937409809373098091C2 |
:10C9E0008209882309F46BC0C201821B930B9C014E |
:10C9F000442737FD4095542F809161059091620541 |
:10CA0000A0916305B0916405820F931FA41FB51F09 |
:10CA10008093610590936205A0936305B0936405CC |
:10CA200081509D47A040B04064F080E09DE7A0E0C9 |
:10CA3000B0E08093610590936205A0936305B09385 |
:10CA400064058091610590916205A0916305B091A4 |
:10CA5000640580509348AF4FBF4F64F480E093E883 |
:10CA6000AFEFBFEF8093610590936205A0936305DC |
:10CA7000B09364058091AA039091AB039C01442775 |
:10CA800037FD4095542F8091610590916205A091EA |
:10CA90006305B0916405BC01CD010E947E7259010D |
:10CAA0008091730990917409A80EB91E10926905BE |
:10CAB00010926A0510926B0510926C056BC0809104 |
:10CAC0007309909174099C01442737FD4095542FB8 |
:10CAD0008091690590916A05A0916B05B0916C05F4 |
:10CAE000820F931FA41FB51F8093690590936A0559 |
:10CAF000A0936B05B0936C0581509D47A040B0405A |
:10CB000064F080E09DE7A0E0B0E080936905909339 |
:10CB10006A05A0936B05B0936C05809169059091AF |
:10CB20006A05A0916B05B0916C0580509348AF4F9A |
:10CB3000BF4F64F480E093E8AFEFBFEF80936905E7 |
:10CB400090936A05A0936B05B0936C058091AC033C |
:10CB50009091AD039C01442737FD4095542F80915F |
:10CB6000690590916A05A0916B05B0916C05BC01B7 |
:10CB7000CD010E947E7259018091730990917409D0 |
:10CB8000A80EB91E109261051092620510926305FD |
:10CB9000109264058091C103E82EFF24002711271D |
:10CBA000C601DD2024F4882799278C199D09992333 |
:10CBB0000CF401969595879549815A81840F951FAC |
:10CBC0009C01442737FD4095542FC801B7010E94AE |
:10CBD0000A72992324F4615C7F4F8F4F9F4F6894B2 |
:10CBE00015F895958795779567951694D1F7AB01CC |
:10CBF0006A157B050CF45B0122273327241B350BB8 |
:10CC0000A216B3060CF4590180915409909155096C |
:10CC10002091160530911705821B930B90935309B1 |
:10CC20008093520980918209882309F46BC0C10165 |
:10CC3000821B930B9C01442737FD4095542F809114 |
:10CC4000650590916605A0916705B0916805820F12 |
:10CC5000931FA41FB51F8093650590936605A0934D |
:10CC60006705B093680581509D47A040B04064F0CF |
:10CC700080E09DE7A0E0B0E08093650590936605B5 |
:10CC8000A0936705B093680580916505909166054E |
:10CC9000A0916705B091680580509348AF4FBF4F92 |
:10CCA00064F480E093E8AFEFBFEF80936505909365 |
:10CCB0006605A0936705B09368058091AA039091DB |
:10CCC000AB039C01442737FD4095542F80916505A7 |
:10CCD00090916605A0916705B0916805BC01CD01F2 |
:10CCE0000E947E7280915209909153094901880EE9 |
:10CCF000991E10926D0510926E0510926F0510929C |
:10CD000070056BC080915209909153099C01442792 |
:10CD100037FD4095542F80916D0590916E05A0913F |
:10CD20006F05B0917005820F931FA41FB51F8093EC |
:10CD30006D0590936E05A0936F05B09370058150BB |
:10CD40009D47A040B04064F080E09DE7A0E0B0E0E7 |
:10CD500080936D0590936E05A0936F05B093700559 |
:10CD600080916D0590916E05A0916F05B091700551 |
:10CD700080509348AF4FBF4F64F480E093E8AFEF2B |
:10CD8000BFEF80936D0590936E05A0936F05B093F0 |
:10CD900070058091AC039091AD039C01442737FD51 |
:10CDA0004095542F80916D0590916E05A0916F056F |
:10CDB000B0917005BC01CD010E947E724901809145 |
:10CDC000520990915309880E991E10926505109290 |
:10CDD000660510926705109268058091C103E82EE0 |
:10CDE000FF2400271127C601DD2024F48827992776 |
:10CDF0008C199D0999230CF40196959587952981A5 |
:10CE00003A81820F931F9C01442737FD4095542F90 |
:10CE1000C801B7010E940A72992324F4615C7F4F14 |
:10CE20008F4F9F4F689415F89595879577956795DF |
:10CE30001694D1F7AB01681579050CF44B01222744 |
:10CE40003327241B350B821693060CF4490100E0AE |
:10CE50002501662457FC6094762CAA2497FCA094A4 |
:10CE6000BA2CEE24D7FCE094FE2C80916809282E81 |
:10CE700033248091AF09482F55275E834D83802F3F |
:10CE80009927880F991F880F991FFC01E152FA4FCB |
:10CE9000258512160CF0D1C069817A81CB01AA27B1 |
:10CEA00097FDA095BA2F332727FD3095432F532F99 |
:10CEB000BC01CD010E940A72992324F4615C7F4F6A |
:10CEC0008F4F9F4FDC01CB01689415F8B595A7955E |
:10CED000979587951694D1F798878F83802F9927F8 |
:10CEE000880F991F880F991FFC01E152FA4F868520 |
:10CEF000282F332727FD3095432F532FC301B2012D |
:10CF00000E940A72992324F4615C7F4F8F4F9F4FD8 |
:10CF1000DC01CB01689415F8B595A7959795879591 |
:10CF20001694D1F7EF81F885E80FF91FF887EF83A2 |
:10CF3000802F9927880F991F880F991FFC01E152B4 |
:10CF4000FA4F8785282F332727FD3095432F532FFE |
:10CF5000C501B4010E940A72992324F4615C7F4FD9 |
:10CF60008F4F9F4FDC01CB01689415F8B595A795BD |
:10CF7000979587951694D1F72F813885280F391FFB |
:10CF800038872F83802F9927880F991F880F991F23 |
:10CF9000FC01E152FA4F8089282F332727FD309575 |
:10CFA000432F532FC701B6010E940A72992324F41C |
:10CFB000615C7F4F8F4F9F4F9B01AC01689415F8C8 |
:10CFC00055954795379527951694D1F7802F992732 |
:10CFD000880F991F8D57964F9C838B83DC016D9131 |
:10CFE0007C918F819885820F931F0E942A32EB815A |
:10CFF000FC819183808399230CF403969595879502 |
:10D000009595879598878F832F81388522153305CD |
:10D010001CF438862F8209C08D819E814F815885EE |
:10D020008417950714F498878F83802F9927FC0124 |
:10D03000EE55F64F5F81508306C0802F9927FC0183 |
:10D04000EE55F64F10820F5F0C3008F418CF28967B |
:10D050000FB6F894DEBF0FBECDBFDF91CF911F9109 |
:10D060000F91FF90EF90DF90CF90BF90AF909F9087 |
:10D070008F907F906F905F904F903F902F9008958A |
:10D080008091BD059091BE05A091BF05B091C005EE |
:10D090008093C5059093C605A093C705B093C805B6 |
:10D0A0008091C1059091C205A091C305B091C405BE |
:10D0B0008093C9059093CA05A093CB05B093CC0586 |
:10D0C00008951092B6051092B5051092B805109209 |
:10D0D000B705089584B1806A84B93D9A82E58CBD14 |
:10D0E0001DBC459A81E08093C1098AEA8093C509F5 |
:10D0F00083E88093C6099AE09093C7091092C90902 |
:10D100001092C8091092CB091092CA091092230AF2 |
:10D110001092E7091092E8098CE48093E90986E00F |
:10D120008093EA099093EB0908958091C1098823BF |
:10D1300009F43CC0459885EC99E09093C30980932D |
:10D14000C2092091CE058EEC93E0FC01E20FF11DA7 |
:10D150002F5F2093CE0580818093C709273010F080 |
:10D160001092CE051092C1090E94686981E08093F7 |
:10D17000C4090000000000000000000000000000E2 |
:10D18000000000000000000000000000000000009F |
:10D19000000000000000000000000000000000008F |
:10D1A00000008091C5098093E4098EBD08958091A7 |
:10D1B000C109882309F08BC00DB407FE88C084E044 |
:10D1C0008093FE03459A2EB58091CF059927813033 |
:10D1D000910599F0823091051CF4892B21F041C012 |
:10D1E0000297C9F03EC01092E6092093D00521387D |
:10D1F000C1F581E08093CF0534C0253549F4809195 |
:10D20000D005820F8093D00582E08093CF0529C09E |
:10D210001092CF0526C08091E609A6E0BAE0FD0194 |
:10D22000E80FF11D20838F5F8093E6098A31A0F01B |
:10D230008091D005281759F48AE1ECEEF9E00D90C1 |
:10D2400001928A95E1F781E08093E70902C010928C |
:10D25000E7091092CF0505C08091D005820F809319 |
:10D26000D0052091C409203208F029C0459800005B |
:10D2700000000000000000000000000000000000AE |
:10D28000000000000000000000000000000000009E |
:10D29000000000000000000000000000000080917D |
:10D2A000C2099091C309FC01E20FF11D80818EBD7E |
:10D2B0009091E4098081890F8093E40903C081E0A3 |
:10D2C0008093C1098091C4098F5F8093C409089538 |
:10D2D000EF92FF920F931F93809104099927880F73 |
:10D2E000991F880F991F7C010027F7FC0095102FCC |
:10D2F0008091C4049091C504A091C604B091C70464 |
:10D30000BC01CD01A80197010E947E723093C9092A |
:10D310002093C8098091CC049091CD04A091CE04B3 |
:10D32000B091CF04BC01CD01A80197010E947E728B |
:10D330003093CB092093CA092091B7093091B809DD |
:10D340004091B9095091BA09DA01C901689412F8FB |
:10D35000880F991FAA1FBB1F1694D1F7820F931F26 |
:10D36000A41FB51F820F931FA41FB51F2091C403D4 |
:10D370003091C5034091C6035091C703BC01CD0154 |
:10D380000E947E723093D1092093D0092091BE046F |
:10D390003091BF048091790990917A09B9010E9476 |
:10D3A0004972CB01880F991F880F991F860F971F0D |
:10D3B000860F971F99230CF403969595879595955D |
:10D3C00087959093CD098093CC092091BE0430912C |
:10D3D000BF048091B3099091B409B9010E944972C8 |
:10D3E000CB01880F991F880F991F860F971F860FF3 |
:10D3F000971F99230CF40396959587959595879596 |
:10D400009093CF098093CE091092BF041092BE046E |
:10D4100010927A09109279091092B4091092B30906 |
:10D420008091C70999278C30910509F40EC18D3080 |
:10D4300091053CF48A30910581F00B9709F479C08D |
:10D440007CC18E30910509F43BC18E3091050CF4FE |
:10D450003FC00F9709F449C170C180912F05809397 |
:10D46000D809809130058093D90980913105809346 |
:10D47000DA09809132058093DB098091330580932E |
:10D48000DC09809134058093DD0980913505809316 |
:10D49000DE09809136058093DF09809147058093EE |
:10D4A000E00980914705837F8093470580911903A8 |
:10D4B00090911A038093E109809102018093E2091F |
:10D4C000A2E0B0E00E949972802D8093E30935C1FB |
:10D4D000809160098093D809809133098093D9099C |
:10D4E000809134098093DA09809135098093DB09B2 |
:10D4F000809136098093DC0980913A098093DD0997 |
:10D5000080913B098093DE0980913C098093DF097B |
:10D5100080913F098093E00980913D098093E10962 |
:10D5200080913E098093E209809140098093E3094C |
:10D5300004C1F8948091EF089927880F991FFC0186 |
:10D54000E554F74F0190F081E02DE038F1051CF033 |
:10D55000EFE7F0E006C02FEFE138F20714F4E1E85E |
:10D56000FFEFE093D8098091F0089927880F991F61 |
:10D57000FC01E554F74F0190F081E02DE038F10512 |
:10D580001CF0EFE7F0E006C04FEFE138F40714F4C9 |
:10D59000E1E8FFEFE093D9098091EE089927880F21 |
:10D5A000991FFC01E554F74F0190F081E02DE03820 |
:10D5B000F1051CF0EFE7F0E006C06FEFE138F60789 |
:10D5C00014F4E1E8FFEFE093DA098091ED08992780 |
:10D5D000880F991FFC01E554F74F0190F081E02D71 |
:10D5E000E038F1051CF0EFE7F0E006C08FEFE1381E |
:10D5F000F80714F4E1E8FFEF7894E093DB098091F9 |
:10D600000A058093DC0980910C058093DD098091E7 |
:10D610000E058093DE09809110058093DF098091CB |
:10D6200012058093E009809113058093E1098091B0 |
:10D630003F089091400899230CF40396959587959F |
:10D64000959587958093E20978C080918A07863006 |
:10D6500030F010928A0785E08093D80904C0809149 |
:10D660008A078093D809809141098093D9098091D4 |
:10D670003B0890913C089093DB098093DA098091F4 |
:10D68000210590912205A0912305B0912405BC01AC |
:10D69000CD0125E030E040E050E00E947E72309302 |
:10D6A000DD092093DC09809137098093DE098091A0 |
:10D6B00038098093DF09809139098093E0093DC0E2 |
:10D6C0008091E8098093D8098091E9098093D9096C |
:10D6D0008091EA098093DA098091EB098093DB0954 |
:10D6E000809100018093DC0928C080911C098093FF |
:10D6F000D809809144098093D9098091BB03809314 |
:10D70000DA09809115098093DB09809116098093CD |
:10D71000DC09809117098093DD098091BC03809317 |
:10D72000DE09809119098093DF0980911A0980939D |
:10D73000E00980911B098093E1098091E709882322 |
:10D7400009F472C02091ED093091EE09C9018150B0 |
:10D750009E4F8F5F9340C8F44091EF095091F009BC |
:10D76000CA0181509E4F8F5F934078F48091F508F5 |
:10D7700085FF0BC03093B6052093B5055093B805CF |
:10D780004093B7058AEF8093CD058091F30990917E |
:10D79000F40921E08936920724F4909301058093DF |
:10D7A00000052091000530910105809102059091BE |
:10D7B0000305281B390BC901845E9D4F68E671E0A3 |
:10D7C0000E944972845B9040909305058093040504 |
:10D7D0002091F7093091F8098091FC039091FD03A5 |
:10D7E0008217930740F480918A07882321F43093AD |
:10D7F000FD032093FC038091EC098736E9F48091C6 |
:10D80000F9098093200A8091FA098093220A809175 |
:10D81000FB098093210A8091FC098093230A80915F |
:10D82000FD098093240A08C01092B6051092B50530 |
:10D830001092B8051092B7051F910F91FF90EF90CD |
:10D84000089587B18C6087B9429843981092D505A6 |
:10D8500080E88093D5031092D6058093D60308956F |
:10D860008091D70581508093D7058F3F09F0C0C0C4 |
:10D8700084E08093D7058091470585FD04C08091A1 |
:10D88000120588234CF0809130098093D80580914F |
:10D8900031098093D90508C080912C098093D8055F |
:10D8A00080912E098093D90580914309282F332731 |
:10D8B00024FF0AC080911C05882331F425FF02C093 |
:10D8C000429A44C0429842C080912D098B3F60F03B |
:10D8D00080917B098D3D40F08091D805882314F418 |
:10D8E000429A34C0429832C080912D098B3F60F03B |
:10D8F00080917B098A3040F48091D805882314F404 |
:10D90000429824C0429A22C08091D50581508093CC |
:10D91000D5058F3FD9F480917B0981508093D5053F |
:10D920008091D503813021F480E88093D50305C030 |
:10D930008091D50386958093D5038091D5039091EE |
:10D94000D805892311F0429A01C042988091430979 |
:10D95000282F332724FF0AC080911C05882331F427 |
:10D9600026FF02C0439A08954398089580912F0995 |
:10D970008B3F60F08091AE09873E40F08091D905E1 |
:10D98000882314F4439A08954398089580912F09A9 |
:10D990008B3F60F08091AE098A3040F48091D905C8 |
:10D9A000882314F443980895439A08958091D605E6 |
:10D9B00081508093D6058F3FD9F48091AE09815074 |
:10D9C0008093D6058091D603813021F480E880933E |
:10D9D000D60305C08091D60386958093D6038091A7 |
:10D9E000D6039091D905892311F0439A089543985D |
:10D9F00008951F93CF93DF9380E197E20E94FF1772 |
:10DA0000EC0110E08091C9008F778093C90080916C |
:10DA1000C9008F7E8093C9005A988FE198E09F9348 |
:10DA20008F931F930E949B140F900F900F9002C032 |
:10DA30004A997AC0CE010E9407188823C9F311239E |
:10DA400009F479C085E598E09F938F931F920E9417 |
:10DA50009B14529A0F900F900F90CE010E940718BE |
:10DA60008823D9F380E090E05A9A01968436910594 |
:10DA7000D8F380E090E05A98019621E0803992072F |
:10DA8000D0F380E090E05A9A01968A309105D8F35D |
:10DA900080E090E05A9801968A309105D8F380E0B2 |
:10DAA00090E05A9A019621E080399207D0F380E005 |
:10DAB00090E05A98019621E080399207D0F380E0F7 |
:10DAC00090E05A9A01968A309105D8F380E090E070 |
:10DAD0005A9801968A309105D8F380E090E05A9ADE |
:10DAE000019621E080399207D0F380E090E05A98C7 |
:10DAF000019621E080399207D0F380E090E05A9AB5 |
:10DB000001968A309105D8F380E090E05A9801960A |
:10DB10008A309105D8F380E090E05A9A019621E08E |
:10DB200080399207D0F311C08AE590E00E94FF1778 |
:10DB3000EC0111E084CF8BE598E09F938F931F92C7 |
:10DB40000E949B140F900F900F9052985A980E9429 |
:10DB5000AD6DDF91CF911F9108952FE78091C9009E |
:10DB600082238093C9008091C9008F7B8093C90074 |
:10DB70008091C9008F7D8093C9005A9A5298109263 |
:10DB8000CD0084E190E08093CC008091C800826059 |
:10DB90008093C80080E18093C9008091CA008223ED |
:10DBA0008093CA008091CA008F7B8093CA008091C5 |
:10DBB000CA008F7D8093CA008091CA008F7E8093B7 |
:10DBC000CA008091CA00877F8093CA008091C900F3 |
:10DBD0008B7F8093C9008091CA0084608093CA00C3 |
:10DBE0008091CA0082608093CA008091C800882317 |
:10DBF00034F48091CE008091C8008823D4F38091C2 |
:10DC0000C90080688093C90008951F920F920FB6D3 |
:10DC10000F921124EF92FF920F931F932F933F9334 |
:10DC20004F935F936F937F938F939F93AF93BF9324 |
:10DC3000CF93DF93EF93FF932091CE008091D70392 |
:10DC4000813061F41092D70384E48093DA05109256 |
:10DC5000DC051092DB051092DD052EC18091DA05FE |
:10DC6000882319F441E050E002C040E050E0809188 |
:10DC7000DB058823C1F4452B61F081E08093DB054F |
:10DC80008091DC058F5F8093DC0583E08093DA056B |
:10DC9000FCC084E48093DA051092DC051092DB0569 |
:10DCA0001092DD05F2C08091DB05813079F44115D9 |
:10DCB000510561F482E08093DB058091DC058F5F84 |
:10DCC0008093DC0583E08093DA05DFC08091DB057B |
:10DCD0008230E1F441155105C9F483E08093DA05FF |
:10DCE0002093DD058091DC05823039F41092DE0549 |
:10DCF00022231CF481E08093DE0583E08093DB0522 |
:10DD00008091DC058F5F8093DC05BFC08091DB05CF |
:10DD1000833009F0B0C0452B09F0ADC08093DA051F |
:10DD200082E08093DB058091DC058F5F8093DC05CA |
:10DD30009091DD05892F86958695C82FDD27CF70B8 |
:10DD4000D0702196892F9927982F88273327822BE7 |
:10DD5000932BBC017370CB018050924063E070E064 |
:10DD60000E944972CB30D10508F07FC0CE018C0FE4 |
:10DD70009D1FFC01E554F74F808191819B01281B79 |
:10DD8000390BC9011AF4909581959F4F069794F429 |
:10DD900080911205883C30F480911205865F809353 |
:10DDA000120508C088EC8093120580916F008F7D6A |
:10DDB00080936F00CE018C0F9D1FFC01E554F74F3F |
:10DDC00020813181C901880F991F7C01E20EF31E69 |
:10DDD000E60EF71EC701FF200CF403967C01F594B4 |
:10DDE000E794F594E794CB0101968E159F0524F4F2 |
:10DDF0000894E108F10808C0CB010197E816F9067C |
:10DE00001CF40894E11CF11C80911205843BE0F0A5 |
:10DE1000CE018C0F9D1F8C010F52174FFC01E55452 |
:10DE2000F74F80819181F701E81BF90BCF0163E087 |
:10DE300070E00E944972CB01880F991F860F971FCF |
:10DE4000F8019183808308C0CE018C0F9D1FFC01D7 |
:10DE5000EF52F74F11821082CE018C0F9D1FFC01F3 |
:10DE6000E554F74FF182E08210C0629770F081E0D4 |
:10DE70008093D7030AC081E08093D7031092DC051A |
:10DE80001092DE0584E48093DA058091DC05803110 |
:10DE900098F08091DE05882331F48091D7038823A0 |
:10DEA00011F4809384031092DC051092DE05109229 |
:10DEB000DB0584E48093DA05FF91EF91DF91CF9148 |
:10DEC000BF91AF919F918F917F916F915F914F9192 |
:10DED0003F912F911F910F91FF90EF900F900FBEE8 |
:10DEE0000F901F901895CF93FC0199232CF4CFEF3E |
:10DEF000F095E195FF4F01C0C1E0CF0168E671E008 |
:10DF00000E944972FC018B35910514F441E01CC05C |
:10DF10008B5590408A35910538F484EB90E08E1B48 |
:10DF20009F0BFC0141E010C0CF01855B90408A351A |
:10DF3000910520F4E45BF0404FEF06C088E691E0E5 |
:10DF40008E1B9F0BFC014FEFEE0FFF1FEA59F74F9F |
:10DF5000259134918C2F992787FD9095829FB00150 |
:10DF6000839F700D929F700D1124242F332727FD5E |
:10DF70003095629FA001639F500D729F500D112438 |
:10DF8000CA01CF9108952AE530E0281B390BC90159 |
:10DF90000E94736F08951F93CF93DF93EB01611578 |
:10DFA000710519F4009709F494C0992314F41FEF34 |
:10DFB00001C011E0209729F48AE51802B00111246C |
:10DFC00088C0AA2797FDA095BA2F689415F8880FE6 |
:10DFD000991FAA1FBB1F1694D1F79E01442737FD36 |
:10DFE0004095542FBC01CD010E947E72F90133236C |
:10DFF0001CF4F095E195FF4F81E0EA35F80734F421 |
:10E00000E45EF64F8491282F332747C08CE1E73A2E |
:10E01000F8071CF02AE530E040C089E0ED38F80749 |
:10E020001CF029E530E039C085E0EA3BF8071CF038 |
:10E0300028E530E032C084E0E731F8071CF027E53E |
:10E0400030E02BC083E0EE32F8071CF026E530E02C |
:10E0500024C082E0E939F8071CF025E530E01DC056 |
:10E0600082E0E233F8071CF024E530E016C081E0DE |
:10E07000E73EF8071CF023E530E00FC081E0ED3A01 |
:10E08000F8071CF022E530E008C0EF57F1401CF023 |
:10E0900021E530E002C020E530E01C161D0664F4E6 |
:10E0A000812F992787FD9095829FB001839F700DE6 |
:10E0B000929F700D11240DC0DD2344F4111634F429 |
:10E0C00084EB90E0BC01621B730B03C0B901645B7D |
:10E0D0007040CB01DF91CF911F910895EF92FF9295 |
:10E0E0000F931F93CF93DF937B018C01C0E0D0E0AF |
:10E0F000E0E0F0E09E01AF0160E0CC0FDD1FEE1F1D |
:10E10000FF1F220F331F441F551F220F331F441FB1 |
:10E11000551FD801C701072E7EE1B695A7959795A3 |
:10E1200087957A95D1F7702D280F391F4A1F5B1FED |
:10E13000EE0CFF1C001F111FEE0CFF1C001F111F17 |
:10E140002196E11DF11D2C173D074E075F0740F09A |
:10E150002C1B3D0B4E0B5F0B2196E11DF11D03C0E7 |
:10E160002197E109F1096F5F603138F2CE01DF01DB |
:10E17000B695A79597958795BC01CD01DF91CF9175 |
:10E180001F910F91FF90EF900895002422273327CD |
:10E19000442751E0BB27EE27FF27A0E1660F771F3A |
:10E1A000881F991F001C221F331F441F660F771FF3 |
:10E1B000881F991F001C221F331F441F2AF4050EBD |
:10E1C0002B1F3E1F4F1F04C0051A2B0B3E0B4F0B7E |
:10E1D000550FBB1FEE1F587F556047FD5250AA9543 |
:10E1E000E9F6E695B7955795E695B7955795852F36 |
:10E1F0009B2F08952227332741E0552768E0880F99 |
:10E20000991F221F331F880F991F221F331F1AF4D3 |
:10E21000240F351F02C0241B350B440F551F487FA8 |
:10E22000456037FD42506A9551F75695479556958A |
:10E230004795842F0895AA2797FF04C0809590954D |
:10E240008A1F9A1F77FF04C0609570956A1F7A1F16 |
:10E25000669F9001779FA001679F300D411D5A1F57 |
:10E26000300D411D5A1F889FF001999F2E0F3F1FAF |
:10E27000401D511D899F300D411D5A1F300D411DFC |
:10E280005A1FCA01B901112480CFFC0141505040EE |
:10E2900030F001900616D1F73197CF010895882705 |
:10E2A000992708955058192E84D001D06AC0BA1702 |
:10E2B0006207730784079507B1F188F40EF4109490 |
:10E2C0000B2EBA2FA02D062E622F202D072E732F76 |
:10E2D000302D082E842F402D092E952F502DFF27ED |
:10E2E0005523B9F0591B49F0573E98F0469537959C |
:10E2F0002795A795F0405395C9F776F0BA0F621F9E |
:10E30000731F841F30F4879577956795B795F04014 |
:10E31000939517FA0F2E0895BF1BBB27BA0B620BFC |
:10E32000730B840BF6CFDEF670C097FB4ED09F3791 |
:10E3300038F0FEE9F91B982F872F762F6B2F05C039 |
:10E3400061C09695879577956795F150D0F73EF423 |
:10E3500090958095709561957F4F8F4F9F4F089551 |
:10E36000E89403C097FB0EF4F3DFB62F672F782FE6 |
:10E37000892F9EE9002405C09A95BB0F661F771F61 |
:10E38000881F11249923A1F08823B2F79F3F59F0E9 |
:10E39000BB0F48F421F4002011F460FF04C06F5F4C |
:10E3A0007F4F8F4F9F4F881F9795879597F90895B7 |
:10E3B00029C0052E092607FA440F551F5F3F79F043 |
:10E3C000AA27A51708F051E04795880F991F9F3F8E |
:10E3D00031F0BB27B91708F091E0879508959F9118 |
:10E3E0009F91112414C097FB880F991F9F3F31F014 |
:10E3F000BB27B91708F091E0879508959F919F91E9 |
:10E40000112405C0662777278827992708959FEF4D |
:10E4100080EC0895629FD001739FF001829FE00D10 |
:10E42000F11D649FE00DF11D929FF00D839FF00D93 |
:10E43000749FF00D659FF00D9927729FB00DE11D3F |
:10E44000F91F639FB00DE11DF91FBD01CF0111241C |
:10E450000895991B79E004C0991F961708F0961B40 |
:10E46000881F7A95C9F780950895AA1BBB1B51E1B7 |
:10E4700007C0AA1FBB1FA617B70710F0A61BB70B34 |
:10E48000881F991F5A95A9F780959095BC01CD01D9 |
:10E49000089597FB092E07260AD077FD04D0E5DF03 |
:10E4A00006D000201AF4709561957F4F0895F6F715 |
:10E4B000909581959F4F0895A1E21A2EAA1BBB1B30 |
:10E4C000FD010DC0AA1FBB1FEE1FFF1FA217B30740 |
:10E4D000E407F50720F0A21BB30BE40BF50B661F56 |
:10E4E000771F881F991F1A9469F76095709580951A |
:10E4F00090959B01AC01BD01CF01089597FB092EBA |
:10E5000005260ED057FD04D0D7DF0AD0001C38F402 |
:10E5100050954095309521953F4F4F4F5F4F08954F |
:10E52000F6F790958095709561957F4F8F4F9F4F2F |
:10E530000895F999FECFB2BDA1BDF89A119600B425 |
:10E540000895F7DF01921A94E1F70895F999FECF43 |
:10E55000B2BDA1BD00BC11960FB6F894FA9AF99A13 |
:0EE560000FBE08950190F2DF1A94E1F70895BE |
:10E56E000A015E0151756164726F000001FF640162 |
:10E57E00C800416E676C654E69636B2020202020B9 |
:10E58E002020416E676C65526F6C6C20202020201D |
:10E59E0020204163634E69636B20202020202020C1 |
:10E5AE002020416363526F6C6C202020202020209D |
:10E5BE0020204779726F4769657220202020202025 |
:10E5CE00202048696768742056616C75652020208C |
:10E5DE0020204163635A202020202020202020204C |
:10E5EE002020476173202020202020202020202062 |
:10E5FE002020436F6D706173732056616C756520BA |
:10E60E002020566F6C74616765202020202020200A |
:10E61E002020456D7066616E67202020202020200E |
:10E62E0020204779726F204B6F6D706173732020BD |
:10E63E0020204D6F746F722046726F6E74202020F2 |
:10E64E0020204D6F746F7220526561722020202041 |
:10E65E0020204D6F746F72204C6566742020202030 |
:10E66E0020204D6F746F72205269676874202020CD |
:10E67E00202020202020202020202020202020208C |
:10E68E00202020202020202020202020202020207C |
:10E69E002020566172696F4D6574657220202020AE |
:10E6AE0020204D4B334D61672043616C5374617470 |
:10E6BE006520536572766F20202020202020202098 |
:10E6CE002020486F6F7665726761732020202020AE |
:10E6DE00202020202020202020202020202020202C |
:10E6EE00202020202020202020202020202020201C |
:10E6FE00202020202020202020202020202020200C |
:10E70E0020202020202020202020202020202020FB |
:10E71E0020202020202020202020202020202020EB |
:10E72E0020202020202020202020202020202020DB |
:10E73E0020204932432D4572726F722020202020F6 |
:10E74E0020202020202020202020202020202020BB |
:10E75E0020204750535F4E69636B202020202020DD |
:10E76E0020204750535F526F6C6C202020202020B9 |
:10E77E002020FFFF01FC01FC016400C409C4090054 |
:10E78E007D0000FF03737373010102030405060786 |
:10E79E0008090A48616C6C6F2057656C74000000A4 |
:10E7AE00000000000000000000000000000000005B |
:10E7BE00000000000000000000000000000000004B |
:10E7CE00000000000000000000000000000000003B |
:10E7DE00000000000000000000000000000000002B |
:10E7EE000000000E0153706F727400004E6F726D58 |
:10E7FE00616C0000426567696E6E657200006400B0 |
:10E80E00F40190D0030090D003003801380130FBA2 |
:10E81E00103A40400896969696020A6464465A410B |
:10E82E004064ECFF0B050000047800FF03640A0B44 |
:08E83E000D0B0C0E0F0101018E |
:00000001FF |
/branches/V0.76g_ACC-HH_MartinR/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_ACC-HH_MartinR/Hex-Files |
---|
Property changes: |
Added: svn:ignore |
+Flight-Ctrl_MEGA644_V0_76g_S3D.hex |
/branches/V0.76g_ACC-HH_MartinR/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_ACC-HH_MartinR/Settings.h |
---|
--- Spectrum.c (nonexistent) |
+++ Spectrum.c (revision 1476) |
@@ -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_ACC-HH_MartinR/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_ACC-HH_MartinR/_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_ACC-HH_MartinR/analog.c |
---|
0,0 → 1,468 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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; |
/* // MartinR: deaktiviert |
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; |
} |
} |
*/ // MartinR: deaktiviert Ende |
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_ACC-HH_MartinR/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_ACC-HH_MartinR/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_ACC-HH_MartinR/fc.c |
---|
0,0 → 1,1794 |
/*####################################################################################### |
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; // MartinR : so war es |
volatile int NeutralAccZ = 0; // MartinR geändert |
unsigned char CosinusNickWinkel = 0, CosinusRollWinkel = 0; |
long IntegralNick = 0,IntegralNick2 = 0; |
long IntegralRoll = 0,IntegralRoll2 = 0; |
long IntegralAccNick = 0,IntegralAccRoll = 0,IntegralAccZ = 0; |
long Integral_Gier = 0; |
long Mess_IntegralNick = 0,Mess_IntegralNick2 = 0; |
long Mess_IntegralRoll = 0,Mess_IntegralRoll2 = 0; |
long Mess_Integral_Gier = 0,Mess_Integral_Gier2 = 0; |
long MittelIntegralNick,MittelIntegralRoll,MittelIntegralNick2,MittelIntegralRoll2; |
volatile long Mess_Integral_Hoch = 0; |
int KompassValue = 0; |
int KompassStartwert = 0; |
int KompassRichtung = 0; |
unsigned int KompassSignalSchlecht = 500; |
unsigned char MAX_GAS,MIN_GAS; |
unsigned char HoehenReglerAktiv = 0; |
unsigned char TrichterFlug = 0; |
long Umschlag180Nick = 250000L, Umschlag180Roll = 250000L; |
long ErsatzKompass; |
int ErsatzKompassInGrad; // Kompasswert in Grad |
int GierGyroFehler = 0; |
char GyroFaktor,GyroFaktorGier; |
char IntegralFaktor,IntegralFaktorGier; |
int DiffNick,DiffRoll; |
int Poti1 = 0, Poti2 = 0, Poti3 = 0, Poti4 = 0; |
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; |
int KiHH = 10300 / 33; // MartinR : für Ki bei HH über Schalter |
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;MartinR: so war es |
int MaxStickNick = 0,MaxStickRoll = 0,stick_nick_neutral = 0,stick_roll_neutral = 0; // MartinR: stick_.._neutral hinzugefügt |
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; // MartinR: so war es |
else motor = neu; // MartinR: Entsprechend Vorschlag von MartinW geändert |
//if(Poti2 < 20) return(neu); |
return(motor); |
} |
void Piep(unsigned char Anzahl, unsigned int dauer) |
{ |
if(MotorenEin) return; //auf keinen Fall im Flug! |
while(Anzahl--) |
{ |
beeptime = dauer; |
while(beeptime); |
Delay_ms(dauer * 2); |
} |
} |
//############################################################################ |
// Nullwerte ermitteln |
void SetNeutral(void) |
//############################################################################ |
{ |
unsigned char i; |
unsigned int gier_neutral=0, nick_neutral=0, roll_neutral=0; |
HEF4017R_ON; |
NeutralAccX = 0; |
NeutralAccY = 0; |
NeutralAccZ = 0; |
AdNeutralNick = 0; |
AdNeutralRoll = 0; |
AdNeutralGier = 0; |
AdNeutralGierBias = 0; |
Parameter_AchsKopplung1 = 0; |
Parameter_AchsKopplung2 = 0; |
ExpandBaro = 0; |
CalibrierMittelwert(); |
Delay_ms_Mess(100); |
CalibrierMittelwert(); |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
{ |
if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
} |
#define NEUTRAL_FILTER 32 |
for(i=0; i<NEUTRAL_FILTER; i++) |
{ |
Delay_ms_Mess(10); |
gier_neutral += AdWertGier; |
nick_neutral += AdWertNick; |
roll_neutral += AdWertRoll; |
} |
AdNeutralNick= (nick_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER / 8); |
AdNeutralRoll= (roll_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER / 8); |
AdNeutralGier= (gier_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER); |
AdNeutralGierBias = AdNeutralGier; |
StartNeutralRoll = AdNeutralRoll; |
StartNeutralNick = AdNeutralNick; |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) > 4) |
{ |
NeutralAccY = abs(Mittelwert_AccRoll) / (2*ACC_AMPLIFY); |
NeutralAccX = abs(Mittelwert_AccNick) / (2*ACC_AMPLIFY); |
NeutralAccZ = Aktuell_az; |
} |
else |
{ |
NeutralAccX = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK+1]); |
NeutralAccY = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL+1]); |
NeutralAccZ = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_Z]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_Z+1]); |
} |
MesswertNick = 0; |
MesswertRoll = 0; |
MesswertGier = 0; |
Delay_ms_Mess(100); |
Mittelwert_AccNick = ACC_AMPLIFY * (long)AdWertAccNick; |
Mittelwert_AccRoll = ACC_AMPLIFY * (long)AdWertAccRoll; |
IntegralNick = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccNick; |
IntegralRoll = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccRoll; |
Mess_IntegralNick2 = IntegralNick; |
Mess_IntegralRoll2 = IntegralRoll; |
Mess_Integral_Gier = 0; |
StartLuftdruck = Luftdruck; |
VarioMeter = 0; |
Mess_Integral_Hoch = 0; |
KompassStartwert = KompassValue; |
GPS_Neutral(); |
beeptime = 50; |
Umschlag180Nick = ((long) EE_Parameter.WinkelUmschlagNick * 2500L) + 15000L; |
Umschlag180Roll = ((long) EE_Parameter.WinkelUmschlagRoll * 2500L) + 15000L; |
ExternHoehenValue = 0; |
ErsatzKompass = KompassValue * GIER_GRAD_FAKTOR; |
GierGyroFehler = 0; |
SendVersionToNavi = 1; |
LED_Init(); |
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((EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) || (Parameter_UserParam1 > 140)) IntegralFaktor = 0; // MartinR: zusätzlich |
//if(!Looping_Nick && !Looping_Roll && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV)) // MartinR : so war es |
if(!Looping_Nick && !Looping_Roll && IntegralFaktor && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV)) // MartinR: zusätzlich "&& IntegralFaktor" |
{ |
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; |
// MartinR : so war es Anfang |
/* |
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; } |
// MartinR : FC 1.0: Sprung von 500 auf 2000 !! FC-ME: Sprung von 1000 auf 2000 |
*/ |
// MartinR : so war es Ende |
// MartinR : Neu Anfang |
if(PlatinenVersion == 10) |
{ |
if(AdWertNick > 1010) MesswertNick = +600; |
if(AdWertNick > 1017) MesswertNick = +800; |
if(AdWertNick < 15) MesswertNick = -600; |
if(AdWertNick < 7) MesswertNick = -800; |
if(AdWertRoll > 1010) MesswertRoll = +600; |
if(AdWertRoll > 1017) MesswertRoll = +800; |
if(AdWertRoll < 15) MesswertRoll = -600; |
if(AdWertRoll < 7) MesswertRoll = -800; |
} |
else |
{ |
if(AdWertNick > 2000) MesswertNick = +1200; |
if(AdWertNick > 2015) MesswertNick = +1600; |
if(AdWertNick < 15) MesswertNick = -1200; |
if(AdWertNick < 7) MesswertNick = -1600; |
if(AdWertRoll > 2000) MesswertRoll = +1200; |
if(AdWertRoll > 2015) MesswertRoll = +1600; |
if(AdWertRoll < 15) MesswertRoll = -1200; |
if(AdWertRoll < 7) MesswertRoll = -1600; |
} |
// MartinR : Neu Ende |
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); |
if(Parameter_UserParam1 > 140) KiHH = 10300 / (Parameter_UserParam2 + 1); else KiHH = Ki; // MartinR : für HH über Schalter |
Parameter_NaviGpsModeControl = EE_Parameter.NaviGpsModeControl; //MartinR: Standard: EE_Parameter.NaviGpsModeControl wird übertragen |
if(!IntegralFaktor) Parameter_NaviGpsModeControl= 0; // MartinR: wenn HH dann GPS auf free- Mode |
// 0 = free; 100 = AID; 200 = coming home //neu |
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 SummeNickHH=0,SummeRollHH=0; // MartinR: Für ACC-HH Umschaltung |
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; |
} |
} |
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; |
ParameterZuordnung(); |
// MartinR: original: |
/* |
stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4; |
stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; |
StickNick = stick_nick - (GPS_Nick + GPS_Nick2); |
stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4; |
stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; |
StickRoll = stick_roll - (GPS_Roll + GPS_Roll2); |
*/ |
// MartinR: geändert Anfang |
if(Parameter_UserParam1 > 140) // MartinR: zweiter Stick_P Wert nur, wenn HH über Schalter aktiv ist |
{ |
stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * Parameter_UserParam3 - stick_nick_neutral) / 4; |
stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * Parameter_UserParam3 - stick_roll_neutral) / 4 ; |
//stick_nick = (PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * Parameter_UserParam3 - stick_nick_neutral); |
//stick_roll = (PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * Parameter_UserParam3 - stick_roll_neutral); |
} |
else |
{ |
stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4; |
stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4; |
stick_nick_neutral = stick_nick; // beim Umschalten auf HH wird derletzte Stickwert als Neutralposition verwendet, MartinR |
stick_roll_neutral = stick_roll; // beim Umschalten auf HH wird derletzte Stickwert als Neutralposition verwendet, MartinR |
} |
if(IntegralFaktor) |
{ |
stick_nick_neutral = stick_nick; // beim Umschalten auf HH wird derletzte Stickwert als Neutralposition verwendet, MartinR |
stick_roll_neutral = stick_roll; // beim Umschalten auf HH wird derletzte Stickwert als Neutralposition verwendet, MartinR |
stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; |
stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; |
StickNick = stick_nick - (GPS_Nick + GPS_Nick2); // MartinR: GPS nur im ACC-Mode wirksam |
StickRoll = stick_roll - (GPS_Roll + GPS_Roll2); // MartinR: GPS nur im ACC-Mode wirksam |
} |
else // wenn HH , MartinR |
{ |
//stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; // MartinR: eventuell vor if verschieben |
//stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; // MartinR: eventuell vor if verschieben |
StickNick = stick_nick; // MartinR: GPS nur im ACC-Mode wirksam |
StickRoll = stick_roll; // MartinR: GPS nur im ACC-Mode wirksam |
} |
// MartinR: geändert Ende |
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 |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// MartinR: ToDo: eventuell die Kombination HH und Steuerung per Seriell nicht zulassen?? |
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; // MartinR: Original |
if((EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) || (Parameter_UserParam1 > 140)) IntegralFaktor = 0; // MartinR |
//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) // MartinR: so war es |
if(Looping_Nick || Looping_Roll || !IntegralFaktor) // MartinR: "|| !IntegralFaktor" hinzugefügt |
{ |
IntegralAccNick = 0; |
IntegralAccRoll = 0; |
MittelIntegralNick = 0; |
MittelIntegralRoll = 0; |
MittelIntegralNick2 = 0; |
MittelIntegralRoll2 = 0; |
IntegralNick = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 |
IntegralRoll = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 |
Mess_IntegralNick = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 |
Mess_IntegralRoll = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 |
Mess_Integral_Gier = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 |
Mess_Integral_Gier2 = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 |
Mess_IntegralNick2 = Mess_IntegralNick; |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
ZaehlMessungen = 0; |
LageKorrekturNick = 0; |
LageKorrekturRoll = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!Looping_Nick && !Looping_Roll && (Aktuell_az > 512 || MotorenEin) && IntegralFaktor) // MartinR: "&& IntegralFaktor" hinzugefügt |
{ |
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 && IntegralFaktor) // MartinR: "&& IntegralFaktor" hinzugefügt |
{ |
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);// MartinR so war es |
//MesswertRoll = IntegralRollMalFaktor + (long)((long)MesswertRoll * GyroFaktor + (long)TrimRoll * 128L) / (256L / STICK_GAIN);// MartinR so war es |
if(!IntegralFaktor) // MartinR : hinzugefügt |
{ |
MesswertNick = (long) ((long)MesswertNick * GyroFaktor) / (256L / STICK_GAIN) ; // MartinR : hinzugefügt |
MesswertRoll = (long) ((long)MesswertRoll * GyroFaktor) / (256L / STICK_GAIN) ; // MartinR : hinzugefügt |
} |
else // MartinR so war es |
{ |
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 // MartinR: so war es |
if(Parameter_MaxHoehe < 50 || (Parameter_UserParam1 > 140) ) // MartinR: Schalter aus oder HH über UsererParam1 an |
{ //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; // MartinR : so war es |
// MartinR : geändert Anfang |
if(Parameter_UserParam1 > 140) // HH über Schalter: Höhenregler abgeschaltet, Nachführen von Parametern |
{ |
HoehenReglerAktiv = 0; |
} |
else // Höhenregler mit Sollhöhe über Poti aktiv |
{ |
HoehenReglerAktiv = 1; |
} |
// MartinR : geändert Ende |
} |
// 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 |
// MartinR : so war es Anfang |
/* |
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 |
*/ |
// MartinR : so war es Ende |
// MartinR : geändert Anfang |
if(IntegralFaktor) // MartinR : ACC-Mode |
{ |
SummeNick += IntegralNickMalFaktor - StickNick; // I-Anteil bei Winkelregelung |
if(SummeNick > (STICK_GAIN * 8000L)) SummeNick = (STICK_GAIN * 8000L); // MartinR : von 16000 auf 8000, da überlauf |
if(SummeNick < -(8000L * STICK_GAIN)) SummeNick = -(8000L * STICK_GAIN); // MartinR : von 16000 auf 8000, da überlauf |
pd_ergebnis_nick = DiffNick + (SummeNick / Ki); |
SummeNickHH = 0 ; |
} |
else // MartinR : HH-Mode |
{ |
SummeNickHH += DiffNick; // I-Anteil bei HH |
if(SummeNickHH > (STICK_GAIN * 8000L)) SummeNickHH = (STICK_GAIN * 8000L); // MartinR : von 16000 auf 8000, da überlauf |
if(SummeNickHH < -(8000L * STICK_GAIN)) SummeNickHH = -(8000L * STICK_GAIN); // MartinR : von 16000 auf 8000, da überlauf |
pd_ergebnis_nick = DiffNick + SummeNickHH / KiHH; // MartinR: PI-Regler für Nick bei HH |
SummeNick = 0; |
} |
// MartinR : geändert Ende |
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 |
// MartinR : so war es Anfang |
/* |
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 |
*/ |
// MartinR : so war es Ende |
// MartinR : geändert Anfang |
if(IntegralFaktor) // MartinR : ACC-Mode |
{ |
SummeRoll += IntegralRollMalFaktor - StickRoll; |
if(SummeRoll > (STICK_GAIN * 8000L)) SummeRoll = (STICK_GAIN * 8000L);// MartinR : von 16000 auf 8000, da überlauf |
if(SummeRoll < -(8000L * STICK_GAIN)) SummeRoll = -(8000L * STICK_GAIN);// MartinR : von 16000 auf 8000, da überlauf |
tmp_int = SummeRoll / Ki; |
pd_ergebnis_roll = DiffRoll + tmp_int; // MartinR: PI-Regler im ACC-Mode |
//SummeRollHH = (IntegralRollMalFaktor + tmp_int - stick_roll_neutral + (TrimRoll * STICK_GAIN / 2)) * KiHH;// MartinR: Startwert von SummeRollHH bei Umschaltung auf HH |
// MartinR: Hintergrund: pd_ergebnis_xx soll sich beim Umschalten nicht ändern! |
SummeRollHH = 0; |
} |
else // MartinR : HH-Mode |
{ |
SummeRollHH += DiffRoll; // I-Anteil bei HH |
if(SummeRollHH > (STICK_GAIN * 8000L)) SummeRollHH = (STICK_GAIN * 8000L);// MartinR : von 16000 auf 8000, da überlauf |
if(SummeRollHH < -(8000L * STICK_GAIN)) SummeRollHH = -(8000L * STICK_GAIN);// MartinR : von 16000 auf 8000, da überlauf |
pd_ergebnis_roll = DiffRoll + SummeRollHH / KiHH; // MartinR: PI-Regler für Roll bei HH |
SummeRoll = 0; |
} |
// MartinR : geändert Ende |
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_ACC-HH_MartinR/fc.h |
---|
0,0 → 1,206 |
/*####################################################################################### |
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;// MartinR : so war es |
extern volatile int NeutralAccZ; // MartinR : geändert |
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 unsigned char Parameter_NaviGpsModeControl; // MartinR: wird wiederverwendet für GPS free bei HH |
extern signed char MixerTable[MAX_MOTORS][4]; |
extern unsigned char Motor[MAX_MOTORS]; |
#endif //_FC_H |
/branches/V0.76g_ACC-HH_MartinR/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_ACC-HH_MartinR/flight.pnps |
---|
0,0 → 1,0 |
<pd><ViewState><e p="Flight-Ctrl" x="true"></e></ViewState></pd> |
/branches/V0.76g_ACC-HH_MartinR/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_ACC-HH_MartinR/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_ACC-HH_MartinR/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_ACC-HH_MartinR/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_ACC-HH_MartinR/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_ACC-HH_MartinR/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_ACC-HH_MartinR/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_ACC-HH_MartinR/makefile |
---|
0,0 → 1,451 |
#-------------------------------------------------------------------- |
# 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_ACC-HH_MartinR |
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 MartinR: so war es, geändert in OPT = 1 |
OPT = 1 |
########################################################################################################## |
# 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_ACC-HH_MartinR/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_ACC-HH_MartinR/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_ACC-HH_MartinR/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_ACC-HH_MartinR/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_ACC-HH_MartinR/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_ACC-HH_MartinR/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_ACC-HH_MartinR/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_ACC-HH_MartinR/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_ACC-HH_MartinR/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_ACC-HH_MartinR/spi.c |
---|
0,0 → 1,299 |
// ######################## 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 // MartinR: so war es |
ToNaviCtrl.Param.Byte[0] = Parameter_NaviGpsModeControl; // MartinR: wird wiederverwendet für GPS free bei HH |
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_ACC-HH_MartinR/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_ACC-HH_MartinR/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_ACC-HH_MartinR/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_ACC-HH_MartinR/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_ACC-HH_MartinR/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_ACC-HH_MartinR/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_ACC-HH_MartinR/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_ACC-HH_MartinR/version.txt |
---|
0,0 → 1,370 |
------- |
V0.53 27.04.2007 H.Buss |
- erste öffentliche Version |
V0.53b 29.04.2007 H.Buss |
- der FAKTOR_I war versehentlich auf Null, dann liegt der MikroKopter nicht so hart in der Luft |
V0.53c 29.04.2007 H.Buss |
- es gib ein Menü, in dem die Werte der Kanäle nach Nick, Roll, Gas,... sortiert sind. |
Die angezeigten Werte waren nicht die Werte der Funke |
V0.54 01.05.2007 H.Buss |
- die Paramtersätze können jetzt vor dem Start ausgewählt werden |
Dazu wird beim Kalibrieren der Messwerte (Gashebel oben links) der Nick-Rollhebel abgefragt: |
2 3 4 |
1 x 5 |
- - - |
Bedeutet: Nick-Rollhebel Links Mitte = Setting:1 Links Oben = Setting:2 usw. |
- der Faktor_I für den Hauptregler ist hinzugekommen. Im Heading-Hold-Modus sollte er vergössert werden, was Stabilität bringt |
V0.55 14.05.2007 H.Buss |
- es können nun Servos an J3,J4,J5 mit den Kanälen 5-7 gesteuert werden |
V0.56 14.05.2007 H.Buss |
- es gab Probleme mit Funken, die mehr als 8 Kanäle haben, wenn mehrere Kanäle dann auf Null waren |
- Funken, die nicht bis +-120 aussteuern können, sollten jetzt auch gehen |
V0.57 24.05.2007 H.Buss |
- Der Höhenregler kann nun auch mittels Schalter bedient werden |
- Bug im Gier-Algorithmus behoben; Schnelles Gieren fürhrte dazu, dass der MK zu weit gedreht hat |
- Kompass-Einfluss dämpfen bei Neigung |
- Man kann zwischen Kompass FIX (Richtung beim Kalibrieren) und Variabel (einstellbar per Gier) wählen |
- Der Motortest vom Kopter-Tool geht jetzt |
- Man kann den Parametersätzen einen Namen geben |
- Das Kamerasetting ist unter Setting 2 defaultmässig integriert |
V0.58 30.05.2007 H.Buss |
- Der Höhenregler-Algorithmus wird nun umgangen, wenn der Höhenreglerschalter aus ist |
V0.60 17.08.2007 H.Buss |
- "Schwindel-Bug" behoben |
- Die Poti-Werte werden jetzt auf Unterlauf (<0) überprüft |
- Poti4 zugefügt |
- Es werden jetzt 8 Kanäle ausgewertet |
- Kamera-Servo (an J7) |
- Die Settings müssen überschrieben werden |
V0.61 - V0.63 H.Buss 27.09.2007 |
- Poti 4 und Kanal 8 werden im Menü angezeigt |
- ein paar Kleinigkeiten bei den DefaultKonstanten2 bereinigt |
- Analog.c: Aktuell_ax korrigiert |
- auf 32 Debug-Kanäle erweitert |
- Loopings sind jetzt möglich und einzeln im KopterTool freischaltbar |
- leichte Anpassungen im Gier - Geschwindigkeit und Drift |
- die Hardwareversion V1.1 wird erkannt und das Programm stellt sich auf die geänderte Gyroverstärkung und die geänderten Portpins ein |
- die Software startet nach dem Einschalten schneller, weil der Luftdruckoffset schneller gefunden wird |
- die PPM-Ausgänge liegen wieder an den Pins an |
- Details an der Sensordatenverarbeitung -> es fliegt sich geringfügig anders |
- der MK ist bei wenig Gas nicht mehr so giftig -> soll das Landen vereinfachen |
- I2C-Bus läuft jetzt sicher nach einer Störung wieder an |
- Sticksignale werden präziser ausgewertet |
- Stick-Kanäle werden ans Kopter-Tool übertragen |
- Es muss die Version V1.47 des Kopter-Tool verwendet werden |
- Die Settings werden auf Default zurückgesetzt |
- am Piepen kann man die Fehlerart unterscheiden |
1. einzelnes Piepen beim Einschalten und Kalibrieren |
2. langsames Intervall mindestens 1 Sek -> Empfangsausfall |
3. schnelleres Intervall mindestens 1 Sek -> Akku |
4. sehr schnelles Intervall mindestens 1 Sek -> Kommunikation zu den Reglern gestört |
V0.64 H.Buss 30.09.2007 |
- beim Gieren wurden die Achsen nicht hart genug geregelt |
V0.65a H.Buss 15.10.2007 |
- Integral im Mischer wieder integriert |
- Feinabstimmung im ACC/Gyro Abgleich -> 1/32 & 100 |
- ACC/Gyro Abgleich auch bei HH |
V0.66a H.Buss 3.11.2007 |
- Messwertverarbeitung aus dem Analog-Interrupt entfernt |
- Analogmessung hängt jetzt am FC-Timing |
- Looping-Stick-Hysterese eingebaut |
- Looping-180°-Umschlag einstellbar |
- Achsenkopplung: Gierbewegung verkoppelt Nick und Roll |
- Lageregelung nach ACC-Sensor verbessert |
- zusätzlicher I-Anteil in der Lageregelung verbessert die Neutrallage |
- Gyrodriftkompensation überarbeitet |
- Bug in der Gier-Stick-Berechnung behoben |
- Gyro-Messung auf 1kHz beschleunigt |
V0.67a H.Buss 16.11.2007 |
- der Hauptregler-I-Anteil wirkt jetzt nur noch auf den Winkel (ausser im HH-Mode) |
- Gyro-Acc-Abgleich jetzt wieder in jedem Zyklus |
- Feinabstimmung |
- Beim HH-Modus gab es noch Bugs |
V0.67e H.Buss 29.11.2007 |
- Parameter: Dynamic Stability und Driftfaktor eingeführt |
- Die Namen der Analogwerte werden jetzt zum Koptertool übertragen |
- Kompatibilität zum Koptertool erhöht |
V0.67f H.Buss 04.12.2007 |
- Das Integral des Hauptreglers wird jetzt linear entladen und nicht mehr proportional |
- Schub für Gier wird jetzt auf den Gaswert begrenzt, dadurch steigt der MK nicht mehr beim Gieren. Gier ist allerdings nicht mehr so agressiv |
- Die ACC-Nullwerte können jetzt dauerhaft im EEPROM gespeichert werden (Stick:Vollgas und Gier rechts) |
V0.68a I.Busker 28.12.2007 |
- SPI.c & SPI.h ins Projekt aufgenommen |
SPI-Kommuikation kann in SPI.h aktiviert/deaktivert werden |
V0.68c H.Buss 05.01.2008 |
- Stickauswertung verbessert -> träger und präziser |
- Alle Settings angepasst |
V0.69e H.Buss 05.05.2008 |
- kleinere Bugs beseitigt |
- Schneller Sinkflug jetzt möglich |
- Min- und Maxgas in den Settings geändert |
- Lagewinkel wird jetzt in 0,1 Grad an Kompass und Navi gesendet |
- Kalibrierung für MK3Mag -> Nick unten beim Kalibrieren |
- Kompassroutine um den Ersatzkompass (Gyro unterstützt Kompasswert) erweitert |
V0.69h H.Buss 21.05.2008 |
- STICK_GAIN = 4 eingeführt. Das erhöht die Auflösung der Sollwerte. Stick_P und Stick_I müssen nun um Faktor 4 erhöht werden |
- SenderOkay auch an das Naviboard übertragen |
- Bessere Parameter bei Senderausfall |
V0.69j H.Buss 30.05.2008 |
- Höhere Präzision der Achsenkopplung |
V0.69k H.Buss 31.05.2008 |
- Bug in SPI.C behoben |
- in 0.69h war ein Bug, der zu ungewollten Loopings führen konnte |
V0.69L H.Buss 14.06.2008 |
- feinere Cam-Servo-Auflösung |
V0.70a H.Buss 01.07.2008 |
- Unterstützung der V1.3-Hardware mit automatischem Hardware-Gyro-Abgleich |
V0.70b H.Buss 14.07.2008 |
- flexible Einstellungsmöglichkeit von J16 und J17 (Transistorausgänge) |
- eigene Parameter für GPS-Naviboard |
- eigener Parameter für ExternalControl (war vorher UserParameter1 bzw. 8) |
- neue Parameter im EEPROM-Datensatz: J16Bitmask, J16Timing, ExternalControl, Navi... |
- MikroKopterFlags eingeführt, damit das Navi den Status des MKs kennt |
- KopterTool-Kompatibilität auf 8 erhöht |
V0.70c H.Buss 30.07.2008 |
- Parameter der Datenfusion leicht modifiziert |
- EEPROM-Parameter für Looping-Umschlag angepasst (von 100 auf 85) |
- MaxStick wird auf 100 begrenzt |
V0.70d H.Buss 02.08.2008 |
- Transistorausgänge: das oberste Bit der Blinkmaske (im KopterTool linkes Bit) gibt nun den Zustand des Ausgangs im Schalterbetrieb an |
0.71b: H.Buss 19.10.2008 |
Kommunikation zum Navi erweitert: |
- Beeptime jetzt 32Bit |
- Datenfusion und Driftkopensation wird durch NaviBoard unterstützt |
0.71c: H.Buss 20.10.2008 |
- LoopConfig heisst jetzt BitConfig |
- 3-Fach-Schalter für Höhensteuerung möglich -> kann man mit GPS-Schalter zusammenlegen |
- bei den Settings wurde Setting[0] mit abgespeichert, welches es nicht gab. |
- in Zukunft werden bei neuen EEPROM-Settings die Kanäle von Setting 1 übernommen |
- Variablen NaviWindCorrection, NaviSpeedCompensation, NaviOperatingRadius eingeführt |
0.71f: H.Buss 15.11.2008 |
- Ausschalten der Höhenregelung per Schalter um 0,3 sek verzögert |
- bei der seriellen Übertragung hat die FC jetzt als SlaveAdresse die 1 |
- VersionInfo.NaviKompatibel eingeführt |
- wenn manuell gegiert wird, wird der GyroKompass-Wert auf den Kompasswert gesetzt |
- Luftdruckwert wird an das Navi übertragen |
- Der Baro-Offset wird jetzt nachgeführt, um den Messbereich zu erweitern. Geht nur bei Höhenregler mit Schalter |
- Debugdaten können jetzt mit 'f' gepollt werden |
0.71g: Gregor 09.12.2008 |
- Kommunikation überarbeitet |
Infos hier: http://www.mikrokopter.de/ucwiki/en/SerialCommands |
0.71h: H.Buss 15.12.2008 |
- Freigegebene Version |
- NaviAngleLimitation als Parameter zum Navi implementiert |
- Antwort auf CMD: 't' entfernt |
0.72d: H.Buss 22.01.2009 |
- OCTO als Compilerschalter |
- Unterstützung der FC 2.0 (ME) |
- GYRO_D eingeführt |
- Achsenkopplung jetzt auch auf Nick/Roll-Bewegung |
0.72e: H.Buss 27.01.2009 |
- die 0.72d hatte kein Integral im Gier |
- Parameter eingeführt: |
EE_Parameter.NaviGpsPLimit |
EE_Parameter.NaviGpsILimit |
EE_Parameter.NaviGpsDLimit |
EE_Parameter.NaviPH_LoginTime |
EE_Parameter.AchsKopplung2 |
EE_Parameter.CouplingYawCorrection |
0.72f: H.Buss 28.01.2009 |
- Bug im Ersatzkompass entfernt |
0.72h: H.Buss 05.02.2009 |
- Algorithmen beschleunigt -> Floats durch Fixkomma ersetzt |
- Achsentkopplung weiter verbessert |
- Nick- und Roll im Octo-Mischer auf jeweils vier Motoren aufgeteilt |
0.72i: H.Buss 07.02.2009 |
- Abtastrate von 1kHz auf 2kHz erhöht |
0.72j: H.Buss 09.02.2009 |
- neue Implementierung der Servoausgänge |
0.72k: H.Buss 10.02.2009 |
- Abtastrate auf 5kHz erhöht |
0.72L: H.Buss 13.02.2009 |
- Signalfilterung überarbeitet |
- OCTO2 implementiert |
0.72M: H.Buss 13.02.2009 |
- Code Cleanup |
0.72o: H.Buss 24.02.2009 |
- Abtastrate auf 2kHz |
- HW-Version an Navi |
- neuer Datensatz 'c' -> Lagedaten für 3D-Grafik |
- Auswerteroutine für Spectrum-Satteliten implementiert |
- Kanalsettings werden beim Parameterreset nicht mehr gelöscht |
- die Driftkompensation wird jetzt feiner aufgelöst --> EE_Parameter.Driftkomp muss mal 8 genommen werden |
- die Integrale und ACC-Werte werden jetzt im Scope in ca. 0,1° angezeigt (wie beim NaviBrd) |
0.72p: H.Buss 01.03.2009 |
- Octo3 erstellt |
- Analogwerte umbenannt |
0.73a-d: H.Buss 05.04.2009 |
- MixerTabelle implementiert |
- I2C-Bus auf bis zu 12 Motoren erweitert |
- die Busfehler der BL-Regler werden im Menü angezeigt |
- Revision der MixerTabelle eingeführt |
- MixerTabelle wird bei Parameterreset neu initialisiert |
- Motortest auf [12] erweitert |
- Motorschalter nicht mehr 3-Stufig |
0.74a |
- Datenfusion im Flug auch, wenn ACC-Z < 512 |
- Wert für die Luftdruck-Messbereichserweiterung abgefangen |
0.74d |
- Die Driftkompensation ist jetzt dreistufig -> 0,5% pro sekunde zusätzlich eingeführts |
0.75a G.Stobrawa 22.5.2009 |
- Extern Control also received from NC via SPI |
0.75b H.Buss 27.05.2009 |
- Spektrum-Singale schalten den PPM-Eingang aus |
- max. 2 Sekunden nach dem Start auf die BL-Regler warten |
- Automatische Zellenerkennung, wenn Spannungswarnung < 5,0V |
- Bei automatischer Zellenerkennung piept es je nach Zellenzahl |
- EE_DATENREVISION auf 76 erhöht |
- Servo: |
- Roll-Servo für FC ME implementiert |
- Update-Cmd stoppt Servos |
- Servos werden erst nach dem ersten Kalibrieren aktiviert |
0.75c G.Stobrawa 25.7.2009 |
- Übertragung der Servo-Settings zur NC |
- RSSI wird an NC gesendet, derzeit wird der Wert nicht gesetzt |
- Bugfix Messbereichsumschaltung des Luftdrucksensors springt |
- Auflösung des Luftdrucks nun bis auf 1 cm (5mal feiner) zur genaueren Berechnung des D-Anteils |
- Unterstützung von Warnings-Bitmasks für die J16, J17-Outputs bei Unterspannung |
- Unterspannung für einzelne Zelle´n von 3.2V auf 3.3V angehoben (9.6V --> 9.9V für 3S) |
0.75d H.Buss 13.8.2009 |
- RC-Routine: Empfangsausfall soll sicherer erkannt werden |
- Zellenerkennung nun auch beim Speichern der Settings |
- Warnungs-Blinkmaske auch bei Empfangsausfall |
0.75e H.Buss 18.8.2009 |
- LED-Blinken kann an die Motoren gekoppelt werden |
- Feinabstimmung des Höhenreglers |
0.75f H.Buss 27.8.2009 |
- D-Anteil des Höhenreglers jetzt mit Quadratischer Komponente |
- Lagewinkel wirkt jetzt mit 1/Cos(x) mit in den Höhenregler |
- leichte Modifikation der RC-Empfangroutine |
0.75g H.Buss 31.08.2009 |
- die Akkuspannung geht jetzt antiproportional ins Gas ein |
0.75h H.Buss 3.09.2009 |
- im Höhenregler werden jetzt die Stellwerte begrenzt --> max +- 16% vom geschätzten Schwebegas |
0.75i H.Buss 7.09.2009 |
- GpsZ vom Navi zur FC für den Höhenregler |
- "hoovergas-Variation" als Parameter |
- Kompatibilität zu NC und PC erhöht |
0.75j H.Buss 17.09.2009 |
- Laufzeitzähler eingebaut |
0.75k H.Buss 22.09.2009 |
- zweite Variante (Gregor) der Höhenregelung implementiert |
- umschaltbare RC-Routine |
0.75L H.Buss 23.09.2009 |
- SollHoehe und Gas geht nun auch an die NC |
0.75M H.Buss 29.09.2009 |
- Spektrum-Timing wird nun überwacht |
- die FC kann nun stand-Alone als Kamera-Stabilizer eingesetzt werden, weil die Servos aktiviert werden, wenn I2C fehlt |
0.75N H.Buss 29.09.2009 |
- Hoover-Stickpunkt wird bei aktivem Höhenregler nicht nachgeführt |
- Hoover-Stickpunkt kann per Parameter fest eingestellt werden |
- Baro-Messbereichserweiterung auch bei aktiviertem Höhenregler |
- Gyro_Gier_P und Gyro_Gier_I eingeführt |
- I2C_fehler-Zähler jetzt in den Analogdaten |
0.75o H.Buss 01.10.2009 |
- der Höhenregler wird jetzt nur alle 10ms bearbeitet |
- Baro-Messbereichserweiterung auch bei Poti als Sollwert |
0.76d H.Buss 10.10.2009 |
- bei aktiver Messbereichserweiterung wird die aktuelle Höhe übernommen |
0.76e H.Buss 27.10.2009 |
- es werden beim Start einmal alle BL-Regler angesprochen, damit BL-Regler#8 auch einen Selbsttest macht |
- S3D-ACT-Summensignal als Compilerschalter |
0.76f H.Buss 05.11.2009 |
- untere Spannungsgrenze der Unterspannungswarnung (9,3V) entfernt |
0.76g H.Buss 10.11.2009 |
- Casting-Fehler in der Gas-Berechnung |
0.76g_ACC-HH_martinR 02.12.2009: |
Erweiterung um die Möglichkeit im Flug zwischen ACC und HH umschalten zu können: |
- Diverse Änderungen in der fc.c und spi.c um im Flug zwischen ACC-Mode und HH- Mode umschalten zu können. |
- WICHTIG !!!! über UserParameter1 (>180, per Schalter) kann im ACC- Modus auf HH umgeschaltet werden. |
- WICHTIG !!!! UserParameter2 ist dann der I-Faktor im HH-Mode. Hier unbedingt den für HH erforderlichen Wert eitragen! z.B.40 |
- WICHTIG !!!! UserParameter3 ist dann Stick-P-Wert im HH-Mode. Hier unbedingt den für HH erforderlichen Wert eitragen! z.B.5 |
UserParameter4 ist derzeit noch unbenutzt. |
- WICHTIG !!!! Beim Flug im HH-Mode unbedingt beachten: |
- Wird der HH-Mode über UserParameter1 aktiviert, so ist die Stick-Position im Moment des Umschaltens die Neutralposition |
für den HH-Mode. Hierdurch bleibt der ACC-Mode trimmbar. |
- Der Nick- und Roll-Knüppel muß daher aber beim Umschalten von ACC auf HH in Mittelstellung stehen. |
- Beim Zurückschalten von HH- auf ACC-Mode ist es egal wo der Knüppel steht |
- Der Höhenregler ist beim HH-Mode über UserParameter1 deaktiviert. Beim normalen HH kann der Höhenregler verwendet werden. |
- Die GPS-Funktionen sind im HH-Mode ebenfalls automatisch deaktiv. |
Dadurch kann aus dem HH-Mode heraus beim Zurückschalten in den ACC-Modus der MK in der Luft geparkt werden! |
- HH-Mode wurde reduziert auf die Regler-Grundfunktionen! |
keine Driftkompensation, Gierfunktion nur mit P-Regler, keine GPS- oder Kompass Funktion. |
- Zu beachten: die anwählbare Drehratenbegrenzung wird derzeit im HH-Modus nicht abgeschaltet |
- Begrenzung von SummeNick SummeRoll reduziert, da Überlauf beobachtet wurde |
- Die Progression von MesswetNick MesswertRoll, wenn der Gyro an die Grenzen kommt wurde Hardwareabhängig geändert (Sprung bei V1.0 war für HH zu groß) |
weitere Änderungen: |
- NeutralAccZ von float in int geändert und in der analog.c den "NeutralAccZ" Part deaktiviert |
- MotorSmoothing entsprechend einem Vorschlag von MartinW geändert |
- OPT level musste wegen Compiler- Fehlermeldung von 2 auf 1 geändert werden. |
/branches/V0.76g_ACC-HH_MartinR/. |
---|
Property changes: |
Added: tsvn:logminsize |
+8 |
\ No newline at end of property |