/branches/V0.74d-Arthur P/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.74d-Arthur P/GPS.c |
---|
0,0 → 1,32 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
signed int GPS_Nick = 0; |
signed int GPS_Roll = 0; |
signed int GPS_Nick2 = 0; |
signed int GPS_Roll2 = 0; |
long GpsAktuell_X = 0; |
long GpsAktuell_Y = 0; |
long GpsZiel_X = 0; |
long GpsZiel_Y = 0; |
void GPS_Neutral(void) |
{ |
GpsZiel_X = GpsAktuell_X; |
GpsZiel_Y = GpsAktuell_Y; |
} |
void GPS_BerechneZielrichtung(void) |
{ |
GPS_Nick = 0; |
GPS_Roll = 0; |
} |
/branches/V0.74d-Arthur P/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.74d-Arthur P/Hex-Files/Flight-Ctrl_MEGA644_V0_74d.hex |
---|
0,0 → 1,2990 |
:100000000C9497030C94B4030C94B4030C94B403B1 |
:100010000C94B4030C94B4030C94B4030C94B40384 |
:100020000C94B4030C9497150C94B4030C94B4037F |
:100030000C949C270C94B4030C94B4030C94B40358 |
:100040000C94B4030C94B4030C9447140C94B403B0 |
:100050000C94F0080C94B4030C94B8080C94B403FA |
:100060000C942C190C94B4030C9456260C94B403E1 |
:100070000C943A580C94B4030C94B403FE1AB31ABB |
:10008000BE1ACA1AE41A66190A1B1C1B3B1B9119DB |
:100090006619681A791A931AF61B161C701C8219B5 |
:1000A000B8261527F0262227A52690267A267A2616 |
:1000B0007D26B0261027812685267D2607270B273B |
:1000C000812685267D26B42602278126E5260A0D6F |
:1000D0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D50 |
:1000E0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D40 |
:1000F0003D3D3D0A0D004E6F726D616C20284143FD |
:10010000432D4D6F6465290048656164696E6748D9 |
:100110006F6C64000A0D436F6E74726F6C3A20004E |
:100120004F4B0A0D000A0D43616C6962726174697C |
:100130006E672070726573737572652073656E7378 |
:100140006F722E2E000A0D5573696E6720706172F2 |
:10015000616D65746572736574202564000A0D41D4 |
:100160004343206E6F742063616C696272617465D1 |
:10017000642021003A2047656E65726174696E677C |
:100180002044656661756C742D506172616D657493 |
:100190006572207573696E67206F6C642053746993 |
:1001A000636B2053657474696E6773000A0D496E42 |
:1001B00069742E20454550524F4D000A0D3D3D3D7E |
:1001C0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D5F |
:1001D0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D4F |
:1001E000000A0D0A0D2121204D495353494E472045 |
:1001F000424C2D4354524C3A2025642021210025A5 |
:100200006420000A0D466F756E6420424C2D4374C5 |
:10021000726C3A20000A0D4D697865722D436F6E3D |
:100220006669673A202725732720282575204D6F9A |
:10023000746F727329000A0D47656E657261746987 |
:100240006E672064656661756C74204D69786572AF |
:10025000205461626C65000A0D466C6967687443DE |
:100260006F6E74726F6C0A0D4861726477617265AB |
:100270003A25642E25640A0D536F667477617265A2 |
:100280003A5625642E2564256320000A0D3D3D3D28 |
:100290003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D8E |
:1002A0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D7E |
:1002B000000A0D20444143206F72204932432045FB |
:1002C00052524F522120436865636B204932432CC0 |
:1002D0002033567265662C2044414320616E6420B1 |
:1002E000424C2D4374726C002E00313200313100CB |
:1002F0003130002025632020202D2020202D20209B |
:10030000202D002025632020202563202020256328 |
:100310002020202563200020256320202025632025 |
:100320002020256320202025632000424C2D43748B |
:10033000726C20666F756E64200020253364202067 |
:1003400025336420202533642020253364200020B9 |
:100350002533642020253364202025336420202584 |
:100360003364200020253364202025336420202599 |
:10037000336420202533642000424C2D4374726C7A |
:10038000204572726F7273200048693A25346920E3 |
:100390002043663A253469200047733A25346920A2 |
:1003A0002047693A25346920004E693A253469208E |
:1003B00020526F3A253469200045787465726E4387 |
:1003C0006F6E74726F6C20200052616E67653A2503 |
:1003D00033692D253369005374656C6C756E673A0B |
:1003E0002025336900536574706F696E7420202571 |
:1003F000336900536572766F202000506F74693442 |
:100400003A202025336900506F7469333A20202543 |
:10041000336900506F7469323A20202533690050E7 |
:100420006F7469313A202025336900537461727406 |
:100430003A2020202020253569004D6573737765AB |
:1004400072743A2020253569005269636874756EAC |
:10045000673A2020253569004B6F6D7061737320FA |
:1004600020202020202000456D70662E5065676595 |
:100470006C3A253569005370616E6E756E673A206F |
:100480002025356900486F636820253469202825B8 |
:1004900033692900526F6C6C20253469202825337C |
:1004A0006929004E69636B2025346920282533694A |
:1004B0002900414343202D2053656E736F7200471E |
:1004C0006965722025346920282533692928253358 |
:1004D000692900526F6C6C20253469202825336906 |
:1004E000292825336929004E69636B20253469204A |
:1004F0002825336929282533692900476965722031 |
:1005000025346920282533692900526F6C6C202519 |
:10051000346920282533692E257829004E69636BBC |
:100520002025346920282533692E2578290047693C |
:1005300065722025346920282533692900526F6CA3 |
:100540006C2025346920282533692E256929004E21 |
:1005500069636B2025346920282533692E25692994 |
:10056000004779726F202D2053656E736F720050B3 |
:10057000333A253469202050343A2534692000501C |
:10058000313A253469202050323A25346920004719 |
:10059000733A253469202047693A25346920004E92 |
:1005A000693A2534692020526F3A25346920004B7E |
:1005B000373A25346920204B383A25346920004BDE |
:1005C000353A25346920204B363A25346920004BD2 |
:1005D000333A25346920204B343A25346920004BC6 |
:1005E000313A25346920204B323A25346920004BBA |
:1005F0006F6D706173733A20202025356900526F4A |
:100600006C6C3A202020202020253569004E69633B |
:100610006B3A20202020202025356900616B742E44 |
:10062000204C6167650048F668656E726567656CA9 |
:10063000756E67004B65696E6520004F6666202009 |
:10064000202020203A20253569004C75667464729C |
:1006500075636B3A2025356900536F6C6C486F6584 |
:1006600068653A2025356900486F6568653A20203D |
:100670002020202535690028632920486F6C676594 |
:10068000722042757373004D697373696E672042FF |
:100690004C2D4374726C3A25642121004932432069 |
:1006A0004552524F522121210053657474696E677F |
:1006B0003A25642025730048573A5625642E256450 |
:1006C0002053573A25642E25642563002B204D695D |
:1006D0006B726F4B6F70746572202B005B25695DC8 |
:1006E000005B25695D0054696D656F75742E0A0D98 |
:1006F000006F6B2E0A0D000A0D506C65617365204A |
:10070000636F6E6E656374205370656B7472756D84 |
:1007100020726563656976657220666F7220626912 |
:100720006E64696E67204E4F572E2E2E00001124E6 |
:100730001FBECFEFD0E1DEBFCDBF13E0A0E0B1E040 |
:10074000EEEFF7EB02C005900D92AE3CB107D9F782 |
:1007500019E0AEECB3E001C01D92AF38B107E1F78C |
:100760000E9468040C94FE5B0C940000863038F004 |
:1007700085E0A2E0B0E0082E0E94ED5B089588239A |
:10078000C1F70895A2E0B0E00E94E05B802D982FB1 |
:100790008150853018F4892F9927089583E00E94AD |
:1007A000B60383E090E0089580916008E82FFF276A |
:1007B000EE0FFF1FE25DF74F808191818D5E9F4FAD |
:1007C00014F010920A01808191818A5B9F4FACF4F2 |
:1007D00080910A01882389F481E080930A012091A5 |
:1007E000FB062F5F2093FB06253050F088EE93E048 |
:1007F0009093EF038093EE0308C02091FB0605C0A1 |
:10080000822F0E94BA392091FB06822F992790935C |
:10081000C9078093C8070895582F9B01863048F177 |
:1008200055E064E070E0842F9927869FD001879F70 |
:10083000B00D969FB00D1124AC59BF4FF90101972F |
:1008400024F001900E94ED5BFACF62E670E0DB01DC |
:10085000042E0E94ED5B88E062517040DB01F901DB |
:10086000182E0E94F95B852F0E94B6030E945857EC |
:1008700008958823E9F3682F772761507040D3CF1C |
:10088000CF93DF93982FFB018150853078F4C42FEC |
:10089000DD27892F992701978C9FD0018D9FB00D5F |
:1008A0009C9FB00D1124AC59BF4F07C0C42FDD274A |
:1008B000DE01AA0FBB1FAC59BF4F219724F00E9445 |
:1008C000E05B0192FACF0E945857DF91CF910895D3 |
:1008D0002F923F924F925F926F927F928F929F9250 |
:1008E000AF92BF92CF92DF92EF92FF920F931F933E |
:1008F000CF93DF9314B815B8189BD6C3199BE2C3E6 |
:100900008DE08093080181E887B93E9A8FEF88B91E |
:100910008BE184B981E085B98EE38AB9579A87E47F |
:100920008BB9469A84B7877F84BF809160008861C5 |
:10093000809360001092600080ED97E09093EF0349 |
:100940008093EE031092A5041092A4041092330831 |
:10095000109232081092A3041092A2041092A104E3 |
:100960001092A00420910801243108F48CC388E877 |
:1009700094E0A0E0B0E08093BD039093BE03A09309 |
:10098000BF03B093C003243109F48CC3289A0E949A |
:1009900080150E9458150E949C0A0E9487270E9479 |
:1009A00026190E9415260E94065478948BE892E03E |
:1009B0009F938F931F920E9470112091080184E6EB |
:1009C00090E09F938F938AE490E09F938F931F9280 |
:1009D0001F92822F6AE00E94705B892F99279F9354 |
:1009E0008F93822F0E94705B99279F938F9387E547 |
:1009F00092E09F938F931F920E9470118091C80084 |
:100A00002DB73EB7205F3F4F0FB6F8943EBF0FBEE5 |
:100A10002DBF803209F44EC3809108018C3008F05C |
:100A200030C3299A49E060E678E083E00E94400400 |
:100A3000C8EED3E0DE010E94E05B802D813019F525 |
:100A4000A1E0B0E00E94E05B802D8F3FE1F01092CA |
:100A5000C1038DE420E535E0DE01F901182E0E9486 |
:100A6000E85B9091C103F9013D96808118160CF462 |
:100A70009F5F349625E0ED39F207B9F79093C103F3 |
:100A800041E555E04DC086E392E09F938F931F921E |
:100A90000E947011EDE5F5E00F900F900F9010821D |
:100AA000118212821382349635E0ED39F307B9F7DB |
:100AB00080E480935D0580935E0510925F058093CE |
:100AC00060058093610590EC909362051092630538 |
:100AD0008093640580936505109266059093670581 |
:100AE000909368058093690510926A0580936B0561 |
:100AF00090936C0520E535E081E080935005A901D5 |
:100B00004F5F5F4FFA01A0E0B1E08BE00D900192E2 |
:100B10008150E1F78DE4DE01F901182E0E94F95BA6 |
:100B20008091C10399279F938F935F934F9385E1A2 |
:100B300092E09F938F931F920E94701183E092E046 |
:100B40009F938F931F920E94701110923304109202 |
:100B5000EB030E947D352DB73EB7265F3F4F0FB6A2 |
:100B6000F8943EBF0FBE2DBF8091EB038823E1F3C5 |
:100B700010923304C0E0D0E01FEFE12E11E0F12E1F |
:100B800002E218E01092EB030E947D358091EB03A6 |
:100B90008823E1F3F8018081882309F0FEC02196C3 |
:100BA0000F5F1F4FCC30D10568F300E010E0B1EECD |
:100BB000EB2EB1E0FB2E20C0F801EE0FFF1FEE0F71 |
:100BC000FF1FE05BFA4F85851816E4F4E8012196D3 |
:100BD000DF93CF93FF92EF921F920E9470110F90BC |
:100BE0000F900F900F900F900A5F174FF80110822F |
:100BF000CC30D10580F48E01F801EE5DF74F808195 |
:100C00008823D1F2E80121960A5F174FF80110827C |
:100C1000CC30D10580F38BEB91E09F938F931F92A3 |
:100C20000E947011A1E0B0E00E94E05B802D0F9067 |
:100C30000F900F908B3409F4CCC00E943A3B8CEAA1 |
:100C400091E09F938F931F920E94701111E00F907B |
:100C50000F900F90C0E5D0E07E010894E11CF11CDC |
:100C600072E0C72ED12CCC0EDD1E63E0A62EB12C77 |
:100C7000AC0EBD1E54E0852E912C8C0E9D1E45E0C1 |
:100C8000642E712C6C0E7D1E36E0432E512C4C0EC2 |
:100C90005D1E27E0222E312C2C0E3D1E73C080914C |
:100CA0000801843168F085E08093780810929008FC |
:100CB0008BE1809374088EE480938D0880938E0876 |
:100CC00020E530E0DE010E94E05B802D8C3008F0F2 |
:100CD00074C0F9013196D7010E94E05B802D8C3001 |
:100CE00008F06BC0B9016E5F7F4FD6010E94E05BD8 |
:100CF000802D8C3008F061C0A9014D5F5F4FD50198 |
:100D00000E94E05B802D8C3008F057C0D9010E9412 |
:100D1000E05B802D80936008DF010E94E05B802D06 |
:100D200080936108DB010E94E05B802D8093620864 |
:100D3000DA010E94E05B802D80936308D4010E9459 |
:100D4000E05B802D80936408D3010E94E05B802DDE |
:100D500080936508D2010E94E05B802D8093660835 |
:100D6000D1010E94E05B802D80936708113009F467 |
:100D7000DDC14DE560E678E0812F0E940C041F5F25 |
:100D80001630F0F4123031F0133009F4EEC11430A3 |
:100D900008F485CF0E94893A82CF21960F5F1F4FBA |
:100DA000DF93CF93FF92EF921F920E9470110F90EA |
:100DB0000F900F900F900F90F5CE0E948928D9CFF9 |
:100DC00083E00E94B6038BE4A1E0B0E0082E0E940D |
:100DD000ED5BA4E0B0E00E94E05B802D853008F080 |
:100DE0009AC10E94C2034DE560E678E00E9440048B |
:100DF0000E94C20399279F938F9385E491E09F936C |
:100E00008F931F920E947011809168080F900F902D |
:100E10000F900F900F9080FD5DC1C8EED3E00E944F |
:100E20003B37809108018A3009F49DC1843109F46F |
:100E30009AC1289A80ED97E09093EF038093EE0398 |
:100E400085E58093FD0684E191E09F938F931F9247 |
:100E50000E947011809168080F900F900F9082FF90 |
:100E600077C188E091E09F938F931F920E94701149 |
:100E70000F900F900F908EEC90E09F938F931F92A6 |
:100E80000E9470110E94BD1E88E893E190939E031A |
:100E900080939D0381E08093FC060F900F900F904C |
:100EA0008091EB03882309F487C08091270388236E |
:100EB00009F482C01092EB038091FB06882309F4A9 |
:100EC000A7C00E94D4030E947D35209108012A30DA |
:100ED00009F4A7C0243109F4A4C0289A80910D0117 |
:100EE000882309F4A4C0815080930D0180919F0450 |
:100EF000882329F080919F04815080939F048091E2 |
:100F00003B05882369F0815080933B05882341F499 |
:100F100010922405109223051092260510922505A3 |
:100F200080919D0390919E03019790939E038093DF |
:100F30009D0380919D0390919E03892B09F448C0E5 |
:100F400080913404882309F043C02A3009F48AC010 |
:100F5000243109F487C0289A8091EB03882329F073 |
:100F60008091A804882309F07AC00E94E50B0E94B2 |
:100F7000770ECE010E9426158823E1F020911803F8 |
:100F8000309119038091790899272817390744F47B |
:100F900080911103909112038F5F9F4F09F464C0F9 |
:100FA0000E948C5684E08093F00384E190E00E94DC |
:100FB0001D15EC010E9467578091F003882309F00A |
:100FC0006FCF0E94CE568091EB038823A9F36DCF9B |
:100FD00080919D0390919E03892BC1F18091110313 |
:100FE000909112038F5F9F4F09F0B6CF8091A804B4 |
:100FF000882309F4B1CF80E197E29093EF038093C7 |
:10100000EE0380E890E09093120380931103A4CF45 |
:101010000E94E93B0E947D35209108012A3009F0A9 |
:1010200059CF289880910D01882309F05CCF109248 |
:1010300007071092C0041092BF041092C2041092CD |
:10104000C1041092C4041092C30450CF0E942B26F6 |
:1010500085E090E090939E0380939D03BFCF0E9414 |
:10106000770E87CF289878CF80E797E19093EF03AA |
:101070008093EE0380E093E090931203809311033A |
:101080008FCF2998CFCC8BE095E0A0E0B0E08093A3 |
:10109000BD039093BE03A093BF03B093C0032A3057 |
:1010A00009F074CC289873CC199B10C084E180930C |
:1010B000080129CC8091CA00863009F0ADCC0E948D |
:1010C000E457AACC8BE0809308011DCC8AE0809382 |
:1010D000080119CC85E291E09F938F931F920E94A3 |
:1010E000701188EE93E00E941D15EC010E945D1EB8 |
:1010F0000F900F900F90CE010E9426158823D9F3F0 |
:1011000080E291E09F938F931F920E9470110F9045 |
:101110000F900F9084CE8DE591E09F938F931F9257 |
:101120000E9470110F900F900F905BCE24E731E07A |
:101130003F932F931F920E9470114DE560E678E077 |
:1011400081E00E940C0412E00F900F900F9022CECD |
:1011500086EF90E09F938F931F920E9470110F90E3 |
:101160000F900F9088CE289865CE0E94DA3997CDDF |
:101170001F920F920FB60F9211248F939F93EF93AC |
:10118000FF9380910B018823A9F48091E70390914C |
:10119000E80301969093E8038093E703FC01E3558D |
:1011A000FA4FE081ED3059F08639910541F0E09336 |
:1011B000C6000DC01092E8031092E70308C0109219 |
:1011C000E8031092E70381E080930B01F0CFFF91D9 |
:1011D000EF919F918F910F900FBE0F901F901895D8 |
:1011E0001F920F920FB60F9211242F933F934F939C |
:1011F0008F939F93AF93BF93CF93DF93EF93FF931F |
:101200008091C6008093D5034091E203463910F0E7 |
:101210001092E1038091D5038D3009F18091E103B3 |
:10122000813009F478C0813030F0823009F496C002 |
:101230001092E103B5C08091D503833209F485C0D3 |
:101240008091D50380930A0781E08093E203809127 |
:10125000D50399279093E6038093E503A1C080917D |
:10126000E1038230E9F61092E103A42FBB27FD01D0 |
:10127000E85FF84F3081ED01C75FD84F288180913A |
:10128000E5039091E603831B9109821B91099F70EE |
:101290009093E6038093E5039C010024220F331F03 |
:1012A000001C220F331F001C232F302D235C2093A2 |
:1012B000E403982F9F73935C9093E3038081281736 |
:1012C00009F468C08091D8038F5F8093D80390E0C1 |
:1012D0008091D603882309F063C0992309F460C084 |
:1012E00081E08093D6034F5F4093D903A65FB84F48 |
:1012F0008DE08C9380910C07823509F051C088E114 |
:1013000090E02CE00FB6F894A895809360000FBE93 |
:101310002093600045C082E08093E103E42FFF2723 |
:101320008091D503E65FF84F80834F5F4093E203DF |
:101330002091D5038091E5039091E603820F911DE2 |
:101340009093E6038093E5032BC08091D603882316 |
:1013500009F076CF81E08093E10372CFE42FFF277D |
:101360008091D503E65FF84F8083463980F44F5F64 |
:101370004093E2032091D5038091E5039091E60329 |
:10138000820F911D9093E6038093E50309C01092AC |
:10139000E103F0CF8881981709F094CF91E098CFBE |
:1013A000FF91EF91DF91CF91BF91AF919F918F917D |
:1013B0004F913F912F910F900FBE0F901F90189556 |
:1013C000CF93DF93BC01892B11F120E030E040E0A6 |
:1013D00050E0EDEAF5E08191280F311D4F5F5F4F3E |
:1013E00064177507C1F73F70C9010024880F991F62 |
:1013F000001C880F991F001C892F902D835CDB0136 |
:1014000011962F73235CED012196FB0108C0E0E0EB |
:10141000F0E08DE3A1E0B0E02DE3C2E0D0E0E355E1 |
:10142000FA4F8083A355BA4F2C93C355DA4F8DE002 |
:10143000888310920B018091AD058093C600DF91E7 |
:10144000CF9108954091D903465009F457C033E035 |
:1014500063E030C0282F2D53E62FFF279D53990FAF |
:10146000990F822F82958F70982BE65FF84F9083AB |
:10147000E62FEF5F4130E1F1972F9D53FF27229533 |
:10148000207F892F86958695282BE65FF84F20834D |
:10149000E62FEE5F43504F3F71F1FF279295990F72 |
:1014A000990F907C5D53952BE65FF84F90836D5FAD |
:1014B0004423D9F0E32FFF27E65FF84F90813F5F89 |
:1014C000E32FFF27E65FF84F80813F5FE32FFF2781 |
:1014D000E65FF84F70813F5FE32FFF27E65FF84F2D |
:1014E00050813F5F442309F0B5CFE62FE35007C09A |
:1014F000E62FE25004C0E62FE15001C0E0E08DE0AD |
:1015000097E09093DB038093DA03E093DC03089584 |
:101510001F93182F8A3029F08091C00085FFFCCFDF |
:1015200004C08DE00E94880AF7CF1093C60080E0C7 |
:1015300090E01F9108950895E1ECF0E088E1808348 |
:10154000A0ECB0E08C9182608C9380818068808375 |
:101550008081806480838AE28093C40080910F013F |
:10156000909110010E941D159093DA068093D90680 |
:101570008CED90E00E941D15909309078093080759 |
:101580001092DB068AE48093DC0683E08093DF061A |
:101590008AE08093DD0681E08093DE061092DB0313 |
:1015A0001092DA031092DC030895EF92FF920F93EA |
:1015B0001F93CF93DF93CDB7DEB722970FB6F89482 |
:1015C000DEBF0FBECDBF9C854D8583E28093AD0508 |
:1015D0009F599093AE058B858093AF05CE010E96F3 |
:1015E0009A838983442309F4B6C00E851F85CE01F2 |
:1015F00042969A838983288939892115310509F40E |
:10160000AAC0F42EFA9463E070E0A0E05DC0EA2F77 |
:10161000FF27AF5FE00FF11F40812150304009F4F8 |
:1016200077C0EA2FFF27AF5FE00FF11FB081215095 |
:10163000304009F058C0FF2009F455C0E981FA8113 |
:10164000008111813496FA83E983349722813381B2 |
:10165000FA94842F9927542F52955F708F70907051 |
:10166000880F991F880F991F4B2F429546954695D5 |
:101670004370482B435CBF73B35CA0E08E2D86950E |
:101680008695835CFB01E355FA4F80838E2D992765 |
:101690008370907082959295907F9827807F98278D |
:1016A000582B535CFB01E255FA4F5083FB01E15587 |
:1016B000FA4F4083FB01E055FA4FB0836C5F7F4FD8 |
:1016C0002115310509F471C0F801EA0FF11DE08020 |
:1016D000AF5F2150304009F09ACFFF2051F550E024 |
:1016E0004DE3BDE3CBCF842F9927542F52955F70E4 |
:1016F0008F709070880F991F880F991F4B2F4295FC |
:10170000469546954370482B435CBF73B35CB6CF98 |
:10171000FF2021F5842F9927542F52955F708F70E9 |
:101720009070880F991F880F991F482F435CBDE365 |
:10173000A5CFE981FA81008111813496FA83E9838A |
:10174000349722813381FA9421153105C9F0E0E004 |
:10175000F0E0A1E05FCF63E070E027C0E981FA81AB |
:10176000008111813496FA83E98334972281338191 |
:10177000FA942115310549F0E0E0F0E0A1E054CF02 |
:10178000A0E050E04DE3BDE379CF842F9927542F9B |
:1017900052955F708F709070880F991F880F991FF6 |
:1017A000482F435CA0E0BDE369CFCB010E94E00974 |
:1017B00022960FB6F894DEBF0FBECDBFDF91CF915A |
:1017C0001F910F91FF90EF900895EF92FF920F936A |
:1017D0001F9380910B01882309F484C28091D00368 |
:1017E000882309F093C18091CF03882309F059C160 |
:1017F0008091D203882309F02FC18091CE038823E2 |
:1018000009F000C180910807909109070E942615F0 |
:10181000882309F08FC080910F0190911001892BCE |
:1018200009F0B3C18091D103882309F0B7C1809139 |
:10183000DF039091E003892B09F0DDC120910C01B9 |
:101840002F3F61F180E190E09F938F93822F992742 |
:1018500082959295907F9827807F98278F5E9E4FE4 |
:101860009F938F9381E090E09F938F938CE091E022 |
:101870009F938F9382E08F9381E08F9381E48F9386 |
:101880000E94D50A8FEF80930C012DB73EB7255FDC |
:101890003F4F0FB6F8943EBF0FBE2DBF8091E207B9 |
:1018A000882329F58091D303882309F41BC28091F2 |
:1018B0000B01882309F416C286E190E09F938F9371 |
:1018C0008EE298E09F938F9381E08F938F9380E5D2 |
:1018D0008F930E94D50A1092D3032DB73EB7295F8C |
:1018E0003F4F0FB6F8943EBF0FBE2DBFFBC1809196 |
:1018F0000B018823B9F281E090E09F938F9382EEF1 |
:1019000097E09F938F9381E08F938F9382E48F93DF |
:101910000E94D50A1092E2078DB79EB707960FB6C0 |
:10192000F8949EBF0FBE8DBF8091D303882309F02A |
:10193000BECFD8C180910B01882309F46CCFE09011 |
:101940007408FF24EE0CFF1CEE0CFF1C0027F7FCB4 |
:101950000095102F609150047091510480915204B1 |
:1019600090915304A80197010E94C55B3093F6063D |
:101970002093F506609158047091590480915A049F |
:1019800090915B04A80197010E94C55B3093F80613 |
:101990002093F7068091B7048093F9068091B804EC |
:1019A0008093FA0688E090E09F938F9385EF96E00E |
:1019B0009F938F9381E08F9383E08F9387E78F933B |
:1019C0000E94D50A2DB73EB7295F3F4F0FB6F89456 |
:1019D0003EBF0FBE2DBF8091FB06853018F086E01C |
:1019E0008093FB0683E690E00E941D159093090703 |
:1019F0008093080780910F0190911001892B09F4C1 |
:101A000011CFC3C080910B01882309F4FBCE8BE07A |
:101A100090E09F938F938DEF96E09F938F9381E05B |
:101A20008F9380910E018F9387E48F930E94D50A44 |
:101A30001092CE038DB79EB707960FB6F8949EBF4F |
:101A40000FBE8DBF80910807909109070E9426154F |
:101A5000882309F4E0CE6ECF80910B01882309F42E |
:101A6000CCCE8AE090E09F938F938BED96E09F938E |
:101A70008F9381E08F938F9386E58F930E94D50A91 |
:101A80001092D2032DB73EB7295F3F4F0FB6F8949F |
:101A90003EBF0FBE2DBF8091CE03882309F4B2CE86 |
:101AA000B1CF80910B01882309F4A2CE0E94C61EFB |
:101AB00080E590E09F938F9382E393E09F938F93D1 |
:101AC00021E030E03F932F9382E893E09F938F9340 |
:101AD0003F932F938FE294E09F938F9383E08F93B4 |
:101AE00081E08F938CE48F930E94D50A1092CF03EC |
:101AF0008DB79EB70F960FB6F8949EBF0FBE8DBFE1 |
:101B00008091D203882309F478CEA6CF80910B016F |
:101B1000882309F468CE0E94C61E84E190E09F935A |
:101B20008F938091D40324E1829FC00111248E5CA5 |
:101B30009C4F9F938F9381E090E09F938F9384EDD0 |
:101B400093E09F938F9382E08F9381E08F9388E45B |
:101B50008F930E94D50A8091D4038F5F8093D40322 |
:101B60002DB73EB7255F3F4F0FB6F8943EBF0FBE6F |
:101B70002DBF843010F01092D4031092D0038091C6 |
:101B8000CF03882309F434CE8CCF8091D90690916D |
:101B9000DA060E942615882309F444CE80910B01B1 |
:101BA000882309F444CE82E490E09F938F9380EAE7 |
:101BB00097E09F938F9381E08F938F9384E48F932B |
:101BC0000E94D50A1092D10380910F0190911001CB |
:101BD0002DB73EB7295F3F4F0FB6F8943EBF0FBEFB |
:101BE0002DBF009709F423CE0E941D159093DA06AD |
:101BF0008093D9061CCE8091AB059091AC050E94D4 |
:101C00002615882309F41ACE80910B01882309F444 |
:101C100015CEE0907408FF24EE0CFF1CEE0CFF1CA8 |
:101C20000027F7FC0095102F60915004709151042B |
:101C30008091520490915304A80197010E94C55BC2 |
:101C400030939E0520939D0560915804709159042E |
:101C500080915A0490915B04A80197010E94C55B92 |
:101C60003093A00520939F0560912209709123096C |
:101C700080912409909125092AE030E040E050E06D |
:101C80000E94515B2091BD033091BE034091BF0380 |
:101C90005091C0030E94C55B3093A2052093A1051B |
:101CA0008EE090E09F938F938DE995E09F938F93C3 |
:101CB00081E08F938F9383E48F930E94D50A809164 |
:101CC000DF039091E0030E941D159093AC05809373 |
:101CD000AB058DB79EB707960FB6F8949EBF0FBEA3 |
:101CE0008DBFACCD1F910F91FF90EF900895EF92B3 |
:101CF000FF920F931F93CF93DF93CDB7DEB7229759 |
:101D00000FB6F894DEBF0FBECDBF8091D6038823F7 |
:101D100009F480C20E94220A80910B07823609F4DE |
:101D200067C080910C07843609F44FC0853640F1B6 |
:101D30008C3609F48EC18D3608F0DBC0873609F485 |
:101D400077C18836A1F48FEF80930D018091300424 |
:101D5000E091DA03F091DB039081892B80933004CA |
:101D6000882311F01092D40381E08093D003109265 |
:101D7000D6031092DB031092DA031092DC034AC2FE |
:101D8000813609F459C1823608F092C08B3479F754 |
:101D9000E091DA03F091DB038081918190938D04CF |
:101DA00080938C0420918E0430918F04821B930BBE |
:101DB000845E9D4F68E671E00E94905B845B90407A |
:101DC0009093910480939004D2CFE091DA03F09144 |
:101DD000DB0380812AE0829FC001112490931001CF |
:101DE00080930F01892B19F281E08093D103BFCF3B |
:101DF00080910C07803709F43AC1813708F483C019 |
:101E0000833709F438C1843709F491C1813709F067 |
:101E100088CF0091DA031091DB03F80180818F3FB6 |
:101E200009F4EFC1F8018081882309F0BEC181E087 |
:101E300080830091DA031091DB0380E6E82E88E0CE |
:101E4000F82E4DE5B701F80180810E944004809191 |
:101E50000B018823E1F3E091DA03F091DB03808149 |
:101E60008A838BE489838DE590E09F938F93FF9223 |
:101E7000EF9221E030E03F932F93CE0101969F93A4 |
:101E80008F933F932F93CE0102969F938F9383E07E |
:101E90008F9381E08F9381E58F930E94D50A8DB750 |
:101EA0009EB70F960FB6F8949EBF0FBE8DBF39CF69 |
:101EB000823609F4AAC0833609F059CF8091DF0336 |
:101EC0009091E003892B09F059C10091DA03109138 |
:101ED000DB03F8019081992309F084C1F801808126 |
:101EE0002AE0829FC00111249093E0038093DF03D6 |
:101EF0003ECF843709F463C0863709F038CF81E0DC |
:101F00008093D20334CF8D3621F18E3609F446C04A |
:101F10008B3409F006CF0091DA031091DB03F8014E |
:101F20008081918190938D0480938C0420918E0404 |
:101F300030918F04821B930B845E9D4F68E671E0A5 |
:101F40000E94905B845B90409093910480939004F6 |
:101F5000E8CE80910B018823E1F3E091DA03F09160 |
:101F6000DB038081813009F42BC11A8281E090E08B |
:101F70009F938F93CE0102969F938F9381E08F93CF |
:101F80008F938DE48F930E94D50A8DB79EB70796E5 |
:101F90000FB6F8949EBF0FBE8DBFC3CE80910B01CC |
:101FA0008823E1F38DE490E09F938F9380E595E0A3 |
:101FB0009F938F9381E08F938F938EE4E3CF8091F3 |
:101FC000D903853108F4C9C0A5EEB6E0E091DA0383 |
:101FD000F091DB0380E101900D928150E1F7809157 |
:101FE0000B018823E1F31F9280910E018F9384E50A |
:101FF0008F930E94D50A8AEF8093DE038FEF809340 |
:102000000D010F900F900F90B2CEADEFB6E0E091C2 |
:10201000DA03F091DB038BE001900D928150E1F740 |
:10202000809106078093E2078FEF80930D019FCE8A |
:1020300081E08093CE039BCEE091DA03F091DB0345 |
:10204000808180930C01803278F38FE180930C01C2 |
:10205000EBCF8FEF80930D01E091DA03F091DB037A |
:10206000808180932F0481E08093CF0380CE81E034 |
:102070008093D30356CE0091DA031091DB03F8016D |
:1020800080818150853018F481818B3491F01A82DF |
:1020900080910B018823E1F381E090E09F938F937F |
:1020A000CE0102969F938F9381E08F938F9383E568 |
:1020B00069CFA0E6B8E032968DE501900D9281508F |
:1020C000E1F74DE560E678E0F80180810E940C04BC |
:1020D00060918D0877278827992724EC39E040E024 |
:1020E00050E00E94515B6093A1037093A203809320 |
:1020F000A3039093A40360918E08772788279927DC |
:102100000E94515B6093A5037093A6038093A7037D |
:102110009093A803E091DA03F091DB0380810E94A1 |
:10212000B6030E94C2038A830E94BA39B1CF80915C |
:10213000D903853140F1A5EEB6E0E091DA03F091E4 |
:10214000DB0380E101900D928150E1F780EF8093F5 |
:10215000DE038FEF80930D01E4CDE091DA03F0917F |
:10216000DB0380819181A281B3818093E506909306 |
:10217000E606A093E706B093E80631CF0091DA03B4 |
:102180001091DB03ABCE0091DA031091DB03F80171 |
:1021900080819181A281B3818093E5069093E606C8 |
:1021A000A093E706B093E806D1CF863008F445CE79 |
:1021B00085E0F80180830091DA031091DB033DCEC6 |
:1021C00020E535E0D9018DE401900D928150E1F7D1 |
:1021D0008DE4A8EEB3E0F901182E0E94F95B81E0CE |
:1021E0008A83C4CE8AE0989FC00111240E941D15E5 |
:1021F0009093AC058093AB050091DA031091DB035B |
:102200006DCE0E94C203F80180830091DA03109121 |
:10221000DB0308CE22960FB6F894DEBF0FBECDBF0B |
:10222000DF91CF911F910F91FF90EF900895982F1C |
:102230008091E307813031F0892F0E94880A282F8E |
:1022400033270CC080912E04E82FFF27EE5CFC4F53 |
:1022500090838F5F80932E0421E030E0C9010895C0 |
:102260001F93182F18162CF480E30E941711115099 |
:10227000D9F71F9108951F93182F18162CF480E298 |
:102280000E9417111150D9F71F9108950F931F93B2 |
:10229000CF93DF938C01EB01672B49F0F8010F5FBF |
:1022A0001F4FE4918E2F0E9417112197B9F7DF91EC |
:1022B000CF911F910F9108950F931F93CF93DF93A9 |
:1022C0008C01EB01672B39F0F80181918F010E949D |
:1022D00017112197C9F7DF91CF911F910F910895A1 |
:1022E0002F923F924F925F926F927F928F929F9226 |
:1022F000AF92BF92CF92DF92EF92FF920F931F9314 |
:10230000CF93DF93CDB7DEB7E3970FB6F894DEBF78 |
:102310000FBECDBF29968FAD29978093E307CE01DD |
:10232000855B9F4F9D838C832B960EAD1FAD2B97A6 |
:10233000662477244301F8018491882309F48EC22E |
:10234000853209F450C1680103C0F5E2FF1639F087 |
:102350000894C11CD11CF601F490FF20B1F7B6011E |
:10236000601B710B09F03BC1FF2009F477C28601A5 |
:102370000F5F1F4F1982AC81BD81EE2419AA2FEF88 |
:1023800028ABF8010F5F1F4FF49035E7F31609F4FF |
:1023900042C08F2D8062883709F43DC080E2F81674 |
:1023A00009F445C093E2F91609F48EC0EAE2FE167C |
:1023B00009F47DC0FDE2FF1609F481C08BE2F81636 |
:1023C000D1F19EE2F916C9F1E0E3FE1609F488C0E6 |
:1023D0008F2D8153893008F07AC020E030E0C901A8 |
:1023E000880F991F880F991F880F991F220F331F7D |
:1023F000280F391F2F0D311D20533040F8010F5F7A |
:102400001F4FF4908F2D80538A3048F329AB35E766 |
:10241000F31609F0BECFE0FE3CC06D907D908D902C |
:102420009C901397149680E2F81609F0BBCF89812F |
:10243000882309F0A6CFF982A4CFF8010F5F1F4FC0 |
:1024400094919A3209F451C0892F80538A3060F5F3 |
:10245000492F20E030E0C901880F991F880F991F8C |
:10246000880F991F220F331F280F391F240F311D8A |
:1024700020533040F8010F5F1F4F6491462F862F85 |
:1024800080538A3040F3A90137FD0BC048ABF62ECC |
:102490007CCF8D919C9111973C01882499241296B0 |
:1024A0007DCF4FEF5FEFF2CFF92E18AA6ECFFD016F |
:1024B0001296E081E9ABE7FF64CFE195E9AB20E15B |
:1024C000E22A3FEDE3225DCF88E0E82A5ACF28E6F2 |
:1024D000F216A1F09CE6F916A1F4E1E0EE2A51CF44 |
:1024E000E4FC4FCFF0E2EF2A4CCFCD0102964D91A4 |
:1024F0005C9157FD71C048ABDC0143CF34E0E32A67 |
:1025000040CFBD83AC83F3E6FF1609F487C124E412 |
:10251000F21609F473C134E6F31609F471C189E6C1 |
:10252000F81609F46DC12FE4F21609F462C13FE612 |
:10253000F31609F45BC1F0E7FF1609F448C183E71D |
:10254000F81609F404C135E5F31609F4FBC085E774 |
:10255000F81609F4EFC028E5F21609F467C038E769 |
:10256000F31609F463C0FF2009F478C1FE821982D2 |
:10257000CE2CDD2433249E012A5F3F4F3BAB2AAB98 |
:1025800081E0E1E090E021E0A22EB12C298122231C |
:1025900009F447C08F5FE82EE90E30E3432E512C3B |
:1025A0004C205D2041145104B1F1222369F5C6FC91 |
:1025B00021C0E0E24E165104C1F0832D0E9430117B |
:1025C000B5018AA99BA90E945C11C4FEB4CE89A959 |
:1025D0008E190E943B11AFCE4FEF5FEF8CCFC80139 |
:1025E0000E944611C1CE6801C2CE89A98E190E94EF |
:1025F0003011E3CF80E38A83FB8262E070E0CE019A |
:1026000002960E945C11D5CF61E070E0CE01019688 |
:102610000E945C11CECF89A98E190E943B1129819D |
:10262000C4CFC6FEB8CF8E2F8E5FB5CFE3FC7AC085 |
:1026300080E18FA719826401530128A927FD02C0F8 |
:102640003FEDE322A114B104C104D10491F18FA59F |
:10265000282E332444245524FE01BE96FBABEAAB5E |
:1026600017C0605D6EA7EAA9FBA92EA52293FBAB5C |
:10267000EAABC601B501A20191010E94A35B390139 |
:102680004A01A214B304C404D50488F159016A01B3 |
:10269000C601B501A20191010E94A35B6A3008F353 |
:1026A000695A6EA738E5F316F1F6862F8F7D8EA74F |
:1026B000DACFF8A9FF2359F6CE2CDD24662477243F |
:1026C00043019E01225D3F4F3BAB2AAB9E019AA97D |
:1026D000291B822F825D48A9E82F342E381A37FC37 |
:1026E0000CC0932DA82EBB24A7FCB0944FCF3FA5C0 |
:1026F000383051F0CE2CDD24E9CFA82EBB24A7FC26 |
:10270000B094332490E042CFCE2CDD24C3FEDECF44 |
:102710008EA58033D9F280E3EAA9FBA98293FBABB3 |
:10272000EAABD4CF611471048104910431F490E1D7 |
:102730009FA780CF9AE09FA77DCFE0E4EE2AF0E14B |
:10274000FFA778CFE1E0EE2AFAE0FFA773CF129659 |
:10275000BD83AC83FE91EE91FBABEAABEF2B89F42A |
:1027600088E28E838EE68F8385E788878CE689876B |
:102770008A8789E28B871C869E012A5F3F4F3BAB8D |
:102780002AAB38A937FD19C0432F552747FD50956F |
:1027900060E070E08AA99BA90E946A5A009759F0EC |
:1027A000EAA98E1BF8A9F8170CF48F2F1982CE2CEA |
:1027B000DD2440E091CF88A9F9CFEAA9FBA90190D7 |
:1027C0000020E9F731978E2F2AA9821BEFCF1296AE |
:1027D000BD83AC839E918E913C018824992420E492 |
:1027E000E22A48E7F42E30E13FA724CF88E08FA704 |
:1027F00021CF91E0E92AE8E0EFA71CCF91E0E92A98 |
:10280000E0FE21C01496BD83AC83DE90CE90BE90D6 |
:10281000AE90D7FC0BC0EAE0EFA70FCF1296BD83B6 |
:10282000AC8312978C918E831982A2CED094C094DF |
:10283000B094A094A11CB11CC11CD11C2DE2298311 |
:10284000FAE0FFA7FACE1296BD83AC839E918E91DB |
:102850005C01CC24B7FCC094DC2CDBCFE3960FB634 |
:10286000F894DEBF0FBECDBFDF91CF911F910F91C6 |
:10287000FF90EF90DF90CF90BF90AF909F908F90A0 |
:102880007F906F905F904F903F902F9008951F9290 |
:102890000F920FB60F9211242F933F935F936F9374 |
:1028A0007F938F939F93AF93BF938091F00388237F |
:1028B00029F08091F00381508093F0038091FE0312 |
:1028C00081508093FE038F3F09F482C08091EE0314 |
:1028D0009091EF030297E0F08091EE039091EF0367 |
:1028E00001979093EF038093EE038091EE03909114 |
:1028F000EF03209111033091120382239323892B3C |
:1029000069F0809108018A3009F47DC0479A0CC0B3 |
:102910008FEF9FEF90931203809311038091080132 |
:102920008A3009F46AC047988091680883FF77C0AD |
:10293000349B0AC08091EC039091ED030196909333 |
:10294000ED038093EC036BC08091EC039091ED0359 |
:10295000892B19F18091EC039091ED038A569140F7 |
:10296000E0F48091EC039091ED032091EC03309121 |
:10297000ED0369E270E00E947C5B260F371F309305 |
:10298000ED032093EC038091EC039091ED030B9702 |
:10299000E0F510928D0410928C0480918C0490913B |
:1029A0008D0420918E0430918F04821B930B845EE2 |
:1029B0009D4F68E671E00E94905B845B904090932D |
:1029C0009104809390041092ED031092EC0327C0C1 |
:1029D00089E08093FE03809117038F5F817080935D |
:1029E0001703882361F08091E9039091EA0301962F |
:1029F0009093EA038093E90369CF5A9895CF81E0D9 |
:102A00008093EB03F0CF5A9A8FCF8091EC03909193 |
:102A1000ED030A9790938D0480938C04BECFBF91F1 |
:102A2000AF919F918F917F916F915F913F912F9186 |
:102A30000F900FBE0F901F9018952091E9033091D1 |
:102A4000EA032F5F3F4F820F931F08952091E90300 |
:102A50003091EA03821B930B892F99278695807406 |
:102A600099270895CF93DF930E941D15EC01CE01A5 |
:102A70000E9426158823D9F3DF91CF9108951F93E3 |
:102A8000CF93DF930E941D15EC011FEC08C08091CD |
:102A90002703882321F01092270310937A00CE0198 |
:102AA0000E942615882399F3DF91CF911F910895F5 |
:102AB0009FB7F894579A5F983E9A469AA0EBB0E079 |
:102AC0008C918F708C938C9183608C93E1EBF0E010 |
:102AD00080818B73808380818B6080831092B200B1 |
:102AE0008FEF8093B3008C9180688C93E0E7F0E0E7 |
:102AF00080818A7F80838081826080839FBF0895E8 |
:102B00008AE090E00E941D15909300048093FF03DB |
:102B100082E085BD83EA84BD17BC88E788BD86E076 |
:102B200086BDEEE6F0E080818160808308951F928B |
:102B30000F920FB60F921124CF92DF92EF92FF9275 |
:102B40000F931F932F933F934F935F936F937F93B5 |
:102B50008F939F93AF93BF93EF93FF93809108015F |
:102B60008431E0F48091BE0487FD18C08091FD039C |
:102B7000882309F466C02091FB033091FC0341E0F7 |
:102B80002F37340708F43FC08FEF8093B3002F5FD7 |
:102B900030403093FC032093FB0341C38091FD033D |
:102BA000882349F78091B00086FFF6C08091B0007D |
:102BB0008F7B8093B000E091F803EE2309F042C1CF |
:102BC0008091860899272DED36E0A901849F900118 |
:102BD000859F300D949F300D11248091F9039091C1 |
:102BE000FA03281B390B3093FC032093FB0310924C |
:102BF000FA031092F903469A81E08093FD0341E0C5 |
:102C00002F37340708F62F3F310509F048F4209399 |
:102C1000B3001092FC031092FB031092FD03FFC25D |
:102C2000C9018F5F90408F37910508F4E4C08FEFA2 |
:102C30008093B3002FE730E03093FC032093FB0335 |
:102C4000EEC28091B00086FFE0C08091B0008F7B23 |
:102C50008093B00080911503909116039C01220F80 |
:102C6000331F280F391F8091B5039927880F991FAB |
:102C7000880F991F280F391F37FD73C2C901959519 |
:102C80008795959587959093160380931503909358 |
:102C9000F5038093F4038091AC0880FF13C1C090CA |
:102CA000F403D090F503E0908308FF240027112758 |
:102CB000609150047091510480915204909153049A |
:102CC00020E830E040E050E00E94C55BC801B70159 |
:102CD0000E94515B20E430E040E050E00E94C55B80 |
:102CE000C20ED31ED092F503C092F40380918408E3 |
:102CF000282F3327220F331F220F331F8091F40315 |
:102D00009091F503821793077CF080918508282F16 |
:102D10003327220F331F220F331F8091F40390912A |
:102D2000F5032817390724F43093F5032093F403AF |
:102D30002091F4033091F50327553E4F3093FC0367 |
:102D40002093FB038091F4039091F50397FD0CC24F |
:102D500095958795959587959093F5038093F403C2 |
:102D60008091F4039091F5039093CB078093CA0769 |
:102D700045E02D3D340708F44EC12CED35E030938D |
:102D8000FC032093FB032091FB033091FC03309361 |
:102D9000FA032093F90330CF8091B00080648093D0 |
:102DA000B0002CEB30E03093FC032093FB038091C8 |
:102DB000F9039091FA0384549F4F9093FA03809300 |
:102DC000F9038091F103882329F080919F04853BCA |
:102DD00008F0A0C08091F8038F5F8093F803909172 |
:102DE0008608981708F069C01092F8032091FB0339 |
:102DF0003091FC0301CF80E88093B300205830402D |
:102E00003093FC032093FB030AC28091B0008064DE |
:102E10008093B0008091860899272DED36E0A901B6 |
:102E2000849F9001859F300D949F300D11248091D7 |
:102E3000F9039091FA03281B390B3093FC0320937C |
:102E4000FB03DACE29EA33E03093FC032093FB0343 |
:102E5000E13009F4F7C0E23009F45EC0FF27EE0F5D |
:102E6000FF1FE25DF74F80819181880F991F875581 |
:102E70009C4F9093FC038093FB032091FB033091C4 |
:102E8000FC0355E02D3D350708F4D0C02CED35E0AE |
:102E90003093FC032093FB032C5B30403093FC0306 |
:102EA0002093FB038091F9039091FA03820F931F03 |
:102EB0009093FA038093F9039FCE2091FB03309106 |
:102EC000FC039ACEC090F403D090F503E090830801 |
:102ED000FF240027112760915004709151048091C4 |
:102EE00052049091530420E830E040E050E00E940A |
:102EF000C55BC801B7010E94515B20E430E040E0AF |
:102F000050E00E94C55BC21AD30AD092F503C0926A |
:102F1000F403ECCE46985ECF809113039091140396 |
:102F20009C01220F331F280F391F205C3E4F37FDB5 |
:102F300071C1C901959587959595879590931403CF |
:102F4000809313039093F7038093F6038091BE045C |
:102F500086FF34C10091F6031091F7036091580485 |
:102F60007091590480915A0490915B0420E830E0FC |
:102F700040E050E00E94C55BCA01B90128EC30E096 |
:102F800040E050E00E94515B20E031E040E050E042 |
:102F90000E94C55B020F131F1093F7030093F60303 |
:102FA00080918408282F3327220F331F220F331FCD |
:102FB0008091F6039091F703821793077CF080913C |
:102FC0008508282F3327220F331F220F331F8091AC |
:102FD000F6039091F7032817390724F43093F70389 |
:102FE0002093F6038091F6039091F70387559E4F47 |
:102FF0009093FC038093FB038091F6039091F70379 |
:1030000097FD0BC195958795959587959093F703B7 |
:103010008093F60332CF2757314008F0B4CE27E72C |
:1030200031E03093FC032093FB03ADCE81E02737E2 |
:10303000380708F031CF27E731E03093FC032093C5 |
:10304000FB032ACF80911503909116039C01220F58 |
:10305000331F280F391F8091B5039927880F991FB7 |
:10306000880F991F280F391F37FDCFC0C9019595CB |
:103070008795959587959093160380931503909364 |
:10308000F5038093F4038091AC0880FF6FC0C0907B |
:10309000F403D090F503E0908308FF240027112764 |
:1030A00060915004709151048091520490915304A6 |
:1030B00020E830E040E050E00E94C55BC801B70165 |
:1030C0000E94515B20E430E040E050E00E94C55B8C |
:1030D000C20ED31ED092F503C092F40380918408EF |
:1030E000282F3327220F331F220F331F8091F40321 |
:1030F0009091F503821793077CF080918508282F23 |
:103100003327220F331F220F331F8091F403909136 |
:10311000F5032817390724F43093F5032093F403BB |
:103120008091F4039091F50387559E4F9093FC0393 |
:103130008093FB038091F4039091F50397FD68C0A1 |
:1031400095958795959587959093F5038093F403CE |
:103150008091F4039091F5039093CB078093CA0775 |
:103160008CCE2D5F3F4F8ACD0396F2CDC090F403F5 |
:10317000D090F503E0908308FF2400271127609189 |
:10318000500470915104809152049091530420E8AE |
:1031900030E040E050E00E94C55BC801B7010E94EA |
:1031A000515B20E430E040E050E00E94C55BC21A71 |
:1031B000D30AD092F503C092F40390CF0091F603A6 |
:1031C0001091F703609158047091590480915A044A |
:1031D00090915B0420E830E040E050E00E94C55B45 |
:1031E000CA01B90120EA30E040E050E00E94515BA2 |
:1031F00020E031E040E050E00E94C55B021B130B71 |
:103200001093F7030093F603CBCE2D5F3F4F2ECFE5 |
:10321000039696CF2D5F3F4F8CCE0396F3CEFF9152 |
:10322000EF91BF91AF919F918F917F916F915F913E |
:103230004F913F912F911F910F91FF90EF90DF9051 |
:10324000CF900F900FBE0F901F90189510927C009A |
:103250008FEC80937A0008951F920F920FB60F9211 |
:103260001124AF92BF92CF92DF92EF92FF920F9311 |
:103270002F933F934F935F936F937F938F939F937E |
:10328000AF93BF93EF93FF93CF93DF93CDB7DEB7A9 |
:103290002C97DEBFCDBF00912A04802F0F5F0093D3 |
:1032A0002A04E82FFF27E231F10540F4E25CFF4FEA |
:1032B000EE0FFF1F0590F491E02D099410922A045F |
:1032C00082E080932B0480937C00F9C38091780086 |
:1032D000909179002091240430912504280F391F02 |
:1032E000309325042093240481E080932B04809163 |
:1032F0002B0480937C00002309F4E1C38FEC8093BE |
:103300007A00DDC300E010922A0481E08093270355 |
:10331000809117049091180401969093180480935B |
:10332000170480917800909179002091F4073091F2 |
:10333000F507820F931F9093F5078093F407809110 |
:10334000EC078F5F8093EC078091EC07853008F4E1 |
:10335000BBC08091F4079091F50797FD9BC39595AD |
:1033600087959093F5078093F4078091780090916A |
:10337000790090932303809322031092EC074091ED |
:1033800015045091160480911404992787FD909597 |
:10339000B82EAA24A81AB90A8091E8079091E907E3 |
:1033A0006091F4077091F5072FE130E0429FF00142 |
:1033B000439FF00D529FF00D11244091AB03552710 |
:1033C0008A0D9B1D861B970B2091A9043091AA049E |
:1033D000821B930B7C014E9DC0014F9D900D5E9D05 |
:1033E000900D1124E80FF91FF7FD52C3F595E795ED |
:1033F000F595E795F595E795F595E795F595E795B5 |
:10340000F0931604E09315042091F4073091F5072A |
:1034100080911E0390911F03A0912003B09121037E |
:1034200089839A83AB83BC83BC01CD01660F771F70 |
:10343000881F991F660F771F881F991F660F771FB8 |
:10344000881F991FC980DA80EB80FC806C197D0988 |
:103450008E099F09442737FD4095542F2C5F3F4F1D |
:103460004F4F5F4F620F731F841F951F28E030E09E |
:1034700040E050E00E94C55B20931E0330931F0381 |
:1034800040932003509321032091E8073091E907EE |
:1034900080911E0390911F03A0912003B0912103FE |
:1034A000A20EB31EA81AB90AB092AA04A092A90447 |
:1034B0008091F4079091F50797FDE6C29595879561 |
:1034C0009093F5078093F40782E080932B040FCF4D |
:1034D0002091780030917900809126049091270402 |
:1034E000820F931F909327048093260410922B043D |
:1034F000FECE809108018A3009F453C2843109F468 |
:10350000CBC280917800909179002091280430916D |
:103510002904820F931F90930C0480930B0486E080 |
:1035200080932B04E4CE2091780030917900809133 |
:10353000460490914704821B930B9093E507809378 |
:10354000E4078091E4079091E50720911E043091F3 |
:103550001F04820F931F90930E0480930D0487E045 |
:1035600080932B04C4CE8091780090917900909341 |
:1035700027048093260410922B04B9CE8091780002 |
:1035800090917900909329048093280486E0809399 |
:103590002B04ADCE209178003091790080914604C3 |
:1035A00090914704821B930B9093E5078093E40767 |
:1035B0008091E4079091E50790931F0480931E0487 |
:1035C00087E080932B0493CE8091780090917900CE |
:1035D0002091440430914504821B930B9093F00793 |
:1035E0008093EF078091EF079091F00790931D046F |
:1035F00080931C0482E080932B0479CE8091780024 |
:1036000090917900909325048093240481E0809325 |
:103610002B046DCE80917800909179002091260442 |
:1036200030912704280F391F309327042093260454 |
:1036300084E080932B045BCE4091180350911903D2 |
:1036400080917800909179009A01220F331F240F06 |
:10365000351F63E070E00E947C5B260F371F3695B4 |
:10366000279536952795309319032093180385E005 |
:1036700080932B043CCE6091780070917900C090CB |
:103680004A04D0904B04E0904C04F0904D04C9865D |
:10369000DA86EB86FC86882777FD8095982F0E9436 |
:1036A000D75AA70196010E94775A0E94BA5A70937E |
:1036B00012046093110480911104909112040297F6 |
:1036C0000CF494C160914A0470914B0480914C04B5 |
:1036D00090914D0420E030E84BE354E40E94E15A1D |
:1036E00088239CF560914A0470914B0480914C04AE |
:1036F00090914D042AE037ED43EA5CE30E94785A4A |
:1037000060934A0470934B0480934C0490934D044F |
:103710008091C9049091CA04845F9140B0F4609193 |
:103720004A0470914B0480914C0490914D042DEC0F |
:103730003CEC4CEC5DE30E94785A60934A04709331 |
:103740004B0480934C0490934D0481E080931304C8 |
:1037500080917800909179009093E7078093E60735 |
:103760008091110490911204209188043091890471 |
:1037700040918A0450918B04AA2797FDA095BA2FF7 |
:10378000820F931FA41FB51F809388049093890410 |
:10379000A0938A04B0938B04C0908804D0908904CD |
:1037A000E0908A04F0908B04CD82DE82EF82F8866E |
:1037B000609188047091890480918A0490918B04AF |
:1037C00020E034E040E050E00E94C55BC21AD30A1A |
:1037D000E40AF50AC0928804D0928904E0928A042F |
:1037E000F0928B0483E080932B0481CD809178004C |
:1037F000909179002091440430914504821B930BF1 |
:103800009093F0078093EF078091EF079091F00776 |
:1038100020911C0430911D04820F931F909310047B |
:1038200080930F0482E080932B0461CD2091780077 |
:10383000309179008091240490912504280F391F3C |
:103840003093250420932404809108018A3009F4E0 |
:10385000BAC0220F331F220F331F30932504209349 |
:1038600024042091240430912504C90137FDB2C0FD |
:103870009595879595958795959587959093080447 |
:10388000809307048091220490912304820F931F58 |
:1038900097FDA5C095958795909323048093220466 |
:1038A00020913A0430913B04821B930B90931B03AD |
:1038B00080931A03209101043091020480911A032D |
:1038C00090911B03280F391F37FD86C0359527952A |
:1038D000309302042093010481E080932B0407CDF0 |
:1038E00020917800309179008091260490912704EE |
:1038F000280F391F30932704209326048091080154 |
:103900008A3009F447C0220F331F220F331F309330 |
:103910002704209326042091260430912704C9010E |
:1039200037FDB4C09595879595958795959587951D |
:1039300090930A04809309048091200490912104BB |
:10394000820F931F97FD50C0959587959093210402 |
:103950008093200420913C0430913D04821B930B02 |
:1039600090931D0380931C03209103043091040461 |
:1039700080911C0390911D03280F391F37FD31C022 |
:1039800035952795309304042093030483E08093B6 |
:103990002B04ADCC220F331F309327042093260431 |
:1039A000BACF8091780090917900019620912804F7 |
:1039B00030912904820F931F9695879590930C045C |
:1039C00080930B04ACCD220F331F3093250420933A |
:1039D000240447CF07964CCF2F5F3F4F77CF0196F8 |
:1039E00059CF2F5F3F4FCCCF0196AECF80911104BE |
:1039F000909112048F5F9F4F0CF0A7CE60914A0404 |
:103A000070914B0480914C0490914D0420E030E87B |
:103A100049E054E40E94E45A18160CF096CE6091E6 |
:103A20004A0470914B0480914C0490914D042AE01B |
:103A300037ED43EA5CE30E94775A60934A0470933F |
:103A40004B0480934C0490934D048091C904909151 |
:103A5000CA04845F914008F078CE60914A04709166 |
:103A60004B0480914C0490914D042DEC3CEC4CECBB |
:103A70005DE30E94775A60934A0470934B048093ED |
:103A80004C0490934D0461CE019618CD07964ACF11 |
:103A90007F96ACCC019663CC8091780090917900B0 |
:103AA0002091280430912904820F931F2FEF37E0D3 |
:103AB000281B390B30930C0420930B0430CD2C962B |
:103AC000F894DEBFCDBFDF91CF91FF91EF91BF9111 |
:103AD000AF919F918F917F916F915F914F913F91A6 |
:103AE0002F910F91FF90EF90DF90CF90BF90AF900C |
:103AF0000F900FBE0F901F901895DF92EF92FF92DC |
:103B00000F931F93CF93DF931092190410921A040E |
:103B100010921B0480ED97E00E941D15EC0100E05F |
:103B20001CE821E0F22E9AE0E92E85EFD82E033032 |
:103B300009F4A7C080910704909108048C5F93401A |
:103B40000CF091C08091240381508093240300E005 |
:103B50008091090490910A048C5F93400CF076C028 |
:103B60008091250381508093250380910B049091CF |
:103B70000C048C5F93400CF05CC080912603815054 |
:103B80008093260388E0809331040E941B26809155 |
:103B900024038A3008F045C0F0921904E09224030F |
:103BA000809125038A30B0F5F0921A04E092250343 |
:103BB000809126038A3038F5F0921B04E0922603A8 |
:103BC00080913104882379F0CE010E942615882344 |
:103BD000B9F381EB92E09F938F931F920E94701133 |
:103BE0000F900F900F901092EC078FEC80937A005B |
:103BF0008091EC078823E1F31A3008F43DC011509E |
:103C000009F095CF4EC0863FD8F2F0921B04D092B7 |
:103C10002603D6CF863F60F2F0921A04D092250395 |
:103C2000C7CF863F08F4BCCFF0921904D09224038A |
:103C3000B7CF80910B0490910C048750944044F1CD |
:103C4000809126038F5F809326039CCF8091090487 |
:103C500090910A0487509440CCF0809125038F5FA7 |
:103C60008093250382CF80910704909108048750A8 |
:103C7000944084F401E06CCF8AE090E00E943F150C |
:103C8000BECF1B3008F456CF19E054CF0F5F6DCF75 |
:103C90000F5F78CF809124038F5F8093240300E02F |
:103CA00057CF86E490E00E943F15DF91CF911F919E |
:103CB0000F91FF90EF90DF900895CF92DF92EF92F7 |
:103CC000FF921F93CF93DF9353E0E52E50E0F52E44 |
:103CD000D7010E94E05B802DC82FDD27C531D105BB |
:103CE00008F02A971C2FC7BD1092140484E690E0B8 |
:103CF0000E943F15809122039091230382559340A7 |
:103D000008F5C0E0D0E048EEC42E42E0D42E04C056 |
:103D10002196CA3FD105F0F41C2FC7BD82E390E085 |
:103D20000E943F15DF92CF921F920E9470118091E6 |
:103D30002203909123030F900F900F908255934090 |
:103D400038F709C0CA3FD10530F438EEC32E32E04F |
:103D5000D32EE2CF1C2FD701012E0E94ED5B1093D2 |
:103D6000F1078CE291E00E943F15DF91CF911F9106 |
:103D7000FF90EF90DF90CF900895E2E3F3E080E2D0 |
:103D8000819393E0E238F907D9F708951F934091A2 |
:103D9000820380912F04481710F440932F048091E0 |
:103DA0003004282F3327C90181709070582F882341 |
:103DB00039F080912F04882309F08CC140932F049F |
:103DC000B9016270707021FF08C080912F044817FC |
:103DD00009F4DFC18F5F80932F04552319F0672BFF |
:103DE00009F075C10E94BD1E90912F049A3008F011 |
:103DF000AFC081E180932E04892F99279F938F93E1 |
:103E000081EE96E09F938F9381E08F930E947011D3 |
:103E10000F900F900F900F900F9010912F0416306D |
:103E200009F45CC1173008F49DC01A3009F410C2BF |
:103E30001B3008F4B1C11C3009F41EC51C3008F455 |
:103E40009EC31D3009F0FEC110922E048BE293E058 |
:103E50009F938F9311E01F930E94701184E18093D0 |
:103E60002E048091250899278D969F938F9380919A |
:103E7000240899278D969F938F93809123089927E3 |
:103E80008D969F938F938091220899278D969F936B |
:103E90008F9387E193E09F938F931F930E947011FC |
:103EA00088E280932E048091290899278D969F930C |
:103EB0008F938091280899278D969F938F93809157 |
:103EC000270899278D969F938F938091260899278D |
:103ED0008D969F938F9383E093E09F938F931F938F |
:103EE0000E9470118CE380932E0480912A089927F8 |
:103EF0008D969F938F9383EF92E09F938F931F9361 |
:103F00000E9470112DB73EB7225E3F4F0FB6F89456 |
:103F10003EBF0FBE2DBF80912B08882309F057C6E6 |
:103F200080912C08882309F044C680912D088823AD |
:103F300009F477C688E480932E048AEE92E09F937A |
:103F40008F931F930E9470110F900F900F9069C66E |
:103F500080E180932E04892F99279F938F938CED76 |
:103F600096E050CF123009F4B9C1133008F464C19F |
:103F7000143009F4B5C3153008F475C210922E043C |
:103F800081E695E09F938F9311E01F930E9470113B |
:103F9000809108010F900F900F908A3009F499C515 |
:103FA0008B3009F4E4C4843109F4E1C48D3009F0A4 |
:103FB00038C684E180932E0420913A0430913B046A |
:103FC00040910704509108048091240399279F93FE |
:103FD0008F93C90137FD23C695958795959587954C |
:103FE00095958795959587959F938F93C90137FDF3 |
:103FF00014C6959587959595879595958795481BB2 |
:10400000590B5F934F9387EE94E09F938F931F9389 |
:104010000E94701188E280932E0420913C0430911C |
:104020003D044091090450910A0480912503992789 |
:104030009F938F93C90137FDEEC59595879595950B |
:10404000879595958795959587959F938F93C901AA |
:1040500037FDDFC5959587959595879595958795B6 |
:10406000481B590B5F934F9383ED94E09F938F937D |
:104070001F930E9470118CE380932E0420913E04C4 |
:1040800030913F0440910B0450910C048091260321 |
:1040900099279F938F93C90137FDB9C5959587954A |
:1040A0009F938F93241B350B3F932F938FEB94E0BB |
:1040B0009F938F931F930E9470112DB73EB7255E7B |
:1040C0003F4F0FB6F8943EBF0FBE2DBFAAC510924A |
:1040D0002F0488CE815080932F0472CE10922E042C |
:1040E00082EB94E09F938F9311E01F930E947011D5 |
:1040F00084E180932E0420910F043091100480916C |
:104100004404909145049F938F933F932F9383EAA8 |
:1041100094E09F938F931F930E94701188E2809385 |
:104120002E0420910D0430910E048091460490914C |
:1041300047049F938F933F932F9384E994E09F9339 |
:104140008F931F930E9470118CE380932E046091D3 |
:104150004A0470914B0480914C0490914D040E944C |
:10416000BA5A7F936F938091D9089091DA089F9300 |
:104170008F9385E894E09F938F931F930E94701113 |
:104180008DB79EB748960FB6F8949EBF0FBE8DBFF1 |
:1041900048C510922F0421CE183009F42AC31930D3 |
:1041A00008F4C3C110922E04809197049091980452 |
:1041B0009F938F938FE194E09F938F9311E01F93D0 |
:1041C0000E94701184E180932E0480919904909153 |
:1041D0009A049F938F9383E194E09F938F931F930F |
:1041E0000E94701188E280932E0480919B0490912C |
:1041F0009C049F938F9387E094E09F938F931F93EA |
:104200000E9470118CE380932E0480919D04909104 |
:104210009E049F938F938BEF93E09F938F931F93B5 |
:104220000E9470112DB73EB72C5E3F4F0FB6F89429 |
:104230003EBF0FBE2DBFF5C4112309F4AAC0113033 |
:1042400009F403C211501093820310922F04E9C4A1 |
:1042500010922E0483EF93E09F938F9311E01F93AE |
:104260000E94701184E180932E048091B5039927F8 |
:104270009F938F9385EE93E09F938F931F930E945C |
:10428000701188E280932E048091F2039091F303E1 |
:104290009F938F9387ED93E09F938F931F930E943B |
:1042A00070118CE380932E048091850899279F9349 |
:1042B0008F938091840899279F938F9389EC93E043 |
:1042C0009F938F931F930E9470118DB79EB7449652 |
:1042D0000FB6F8949EBF0FBE8DBFA3C410922E04DC |
:1042E0008CE196E09F938F9311E01F930E947011D1 |
:1042F00084E180932E046091500470915104809168 |
:1043000052049091530420E034E040E050E00E94D9 |
:10431000C55B5F934F933F932F938DE096E09F9300 |
:104320008F931F930E94701188E280932E046091F6 |
:1043300058047091590480915A0490915B0420E0D4 |
:1043400034E040E050E00E94C55B5F934F933F93A1 |
:104350002F938EEF95E09F938F931F930E94701180 |
:104360008CE380932E0480918C0490918D049F9314 |
:104370008F938FEE95E09F938F931F930E94701100 |
:104380008DB79EB746960FB6F8949EBF0FBE8DBFF1 |
:1043900048C410922E048CEC96E09F938F9311E00A |
:1043A0001F930E94701184E180932E0420910801D4 |
:1043B00084E690E09F938F938AE490E09F938F939D |
:1043C0001F921F92822F6AE00E94705B892F9927AB |
:1043D0009F938F93822F0E94705B99279F938F9357 |
:1043E00087EB96E09F938F931F930E94701188E252 |
:1043F00080932E040E94C20321E535E03F932F9362 |
:1044000099279F938F9389EA96E09F938F931F93A9 |
:104410000E94701180919D0390919E032DB73EB72D |
:10442000295E3F4F0FB6F8943EBF0FBE2DBF0697D3 |
:1044300008F4FDC090913404992309F48AC28CE3F6 |
:1044400080932E04892F99279F938F9387E896E076 |
:104450009F938F931F930E9470110F900F900F9056 |
:104460000F900F90DEC310922E048091320890912D |
:10447000330820913008309131089F938F933F93F8 |
:104480002F938FED95E09F938F9311E01F930E94E0 |
:10449000701184E180932E04809136089091370842 |
:1044A00020913408309135089F938F933F932F9339 |
:1044B0008FEC95E09F938F931F930E94701188E279 |
:1044C00080932E0480913A0890913B0820913808FF |
:1044D000309139089F938F933F932F938FEB95E003 |
:1044E0009F938F931F930E9470118CE380932E04EF |
:1044F00080913E0890913F0820913C0830913D0802 |
:104500009F938F933F932F938FEA95E09F938F9381 |
:104510001F930E9470112DB73EB7245E3F4F0FB618 |
:10452000F8943EBF0FBE2DBF7CC384E180932E0460 |
:1045300080911803909119039F938F9386E794E0DD |
:104540009F938F9311E01F930E94701188E28093D4 |
:104550002E0480919F0499279F938F9387E694E080 |
:104560009F938F931F930E9470112DB73EB7265FC4 |
:104570003F4F0FB6F8943EBF0FBE2DBF52C31092EF |
:104580002E0489EB93E09F938F9311E01F930E9479 |
:10459000701184E180932E0480910107992787FD93 |
:1045A00090959F938F9380910007992787FD909511 |
:1045B0009F938F9389EA93E09F938F931F930E9419 |
:1045C000701188E280932E0480910207992787FD5D |
:1045D00090959F938F938091030799279F938F9333 |
:1045E00089E993E09F938F931F930E9470118CE34E |
:1045F00080932E048091070799279F938F93809132 |
:104600000407992787FD90959F938F9389E893E0FE |
:104610009F938F931F930E9470112DB73EB7285E12 |
:104620003F4F0FB6F8943EBF0FBE2DBFFAC28CE3CA |
:1046300080932E048CE996E09F938F931F930E94A2 |
:1046400070110F900F900F90ECC28091680880FF5E |
:1046500022C210922E048091A9049091AA049F93E3 |
:104660008F9388E696E09F938F931F930E9470111B |
:1046700084E180932E048091AB049091AC049F93CD |
:104680008F9389E596E09F938F931F930E947011FB |
:1046900088E280932E0480912203909123039F93BC |
:1046A0008F938AE496E09F938F931F930E947011DB |
:1046B0008CE380932E048091F10799279F938F9329 |
:1046C0008BE396E09F938F931F930E9470118DB799 |
:1046D0009EB744960FB6F8949EBF0FBE8DBFA1C281 |
:1046E00010922E04E0916108FF27EE0FFF1FE25D9C |
:1046F000F74F20813181E0916008FF27EE0FFF1F07 |
:10470000E25DF74F808191813F932F939F938F9329 |
:104710008FE995E09F938F9311E01F930E94701192 |
:1047200084E180932E04E0916308FF27EE0FFF1FC2 |
:10473000E25DF74F20813181E0916208FF27EE0FA3 |
:10474000FF1FE25DF74F808191813F932F939F93ED |
:104750008F938FE895E09F938F931F930E94701122 |
:1047600088E280932E04E0916508FF27EE0FFF1F7B |
:10477000E25DF74F20813181E0916408FF27EE0F61 |
:10478000FF1FE25DF74F808191813F932F939F93AD |
:104790008F938FE795E09F938F931F930E947011E3 |
:1047A0008CE380932E04E0916708FF27EE0FFF1F34 |
:1047B000E25DF74F20813181E0916608FF27EE0F1F |
:1047C000FF1FE25DF74F808191813F932F939F936D |
:1047D0008F938FE695E09F938F931F930E947011A4 |
:1047E0008DB79EB74C960FB6F8949EBF0FBE8DBF87 |
:1047F00018C210922E0488E594E09F938F9311E0E5 |
:104800001F930E94701184E180932E048091900484 |
:10481000909191049F938F9389E494E09F938F9359 |
:104820001F930E94701188E280932E0480918C0463 |
:1048300090918D049F938F938AE394E09F938F933D |
:104840001F930E9470118CE380932E0480918E043C |
:1048500090918F049F938F938BE294E09F938F931B |
:104860001F930E9470118DB79EB742960FB6F894B1 |
:104870009EBF0FBE8DBFD5C110922E0489E793E075 |
:104880009F938F9311E01F930E94701184E1809396 |
:104890002E048091090899279F938F93809108088F |
:1048A00099279F938F938091070899279F938F93C0 |
:1048B0008091060899279F938F9384E693E09F93B6 |
:1048C0008F931F930E94701188E280932E04809131 |
:1048D0000D0899279F938F9380910C0899279F9398 |
:1048E0008F9380910B0899279F938F9380910A084B |
:1048F00099279F938F938FE493E09F938F931F93B8 |
:104900000E9470118CE380932E04809111089927E6 |
:104910009F938F938091100899279F938F938091F5 |
:104920000F0899279F938F9380910E0899279F9343 |
:104930008F938AE393E09F938F931F930E9470114C |
:104940008DB79EB784960FB6F8949EBF0FBE8DBFED |
:1049500068C18CE380932E0487E796E09F938F9342 |
:104960001F930E9470110F900F900F905AC184E115 |
:1049700080932E0420913A0430913B04E091070487 |
:10498000F0910804C90160E170E00E94905B97FD1E |
:1049900038C1959587959F938F93C90137FD2FC196 |
:1049A00095958795959587959595879595958795EF |
:1049B0009F938F93C90137FD20C195958795959554 |
:1049C000879595958795E81BF90BFF93EF938CE1FD |
:1049D00095E09F938F931F930E94701188E28093BC |
:1049E0002E0420913C0430913D04E0910904F091A3 |
:1049F0000A04C90160E170E00E94905B97FDFBC072 |
:104A0000959587959F938F93C90137FDF2C0959532 |
:104A100087959595879595958795959587959F9376 |
:104A20008F93C90137FDE3C0959587959595879537 |
:104A300095958795E81BF90BFF93EF938AE095E036 |
:104A40009F938F931F930E9470118CE380932E0489 |
:104A500020913E0430913F0440910B0450910C048E |
:104A6000C90137FDC2C0959587959F938F93241BED |
:104A7000350B3F932F938BEF94E09F938F931F936E |
:104A80000E9470118DB79EB749960FB6F8949EBFDD |
:104A90000FBE8DBFC6C084E180932E0484E396E0F0 |
:104AA0009F938F931F930E94701188E280932E042E |
:104AB00086E296E09F938F931F930E9470112DB70B |
:104AC0003EB72A5F3F4F0FB6F8943EBF0FBE2DBFD3 |
:104AD000A8C084E180932E0480913A0490913B0415 |
:104AE000FC0197FD92C0F595E795F595E795F5954D |
:104AF000E795209107043091080468E070E00E9477 |
:104B0000905B9F938F93FF93EF932E1B3F0B3F93ED |
:104B10002F938FE495E09F938F931F930E947011C2 |
:104B200088E280932E0480913C0490913D04FC0126 |
:104B300097FD69C0F595E795F595E795F595E795A6 |
:104B40002091090430910A0468E070E00E94905BB3 |
:104B50009F938F93FF93EF932E1B3F0B3F932F93C6 |
:104B60008DE395E09F938F931F930E9470118CE3C8 |
:104B700080932E0480913E0490913F0420910B0479 |
:104B800030910C049F938F93821B930B9F938F9371 |
:104B90008EE295E09F938F931F930E9470112DB723 |
:104BA0003EB7275E3F4F0FB6F8943EBF0FBE2DBFF6 |
:104BB00038C084E480932E048DEE92E09F938F930F |
:104BC0001F930E9470110F900F900F90AEC980E458 |
:104BD00080932E0480EF92E09F938F931F930E9407 |
:104BE00070110F900F900F909BC901963CCF0796C4 |
:104BF0001BCF0F960CCF019603CF0796DECE0F96F4 |
:104C0000CFCE0196C6CE379695CF37966CCF01960C |
:104C100045CA07961FCA0F9610CA0796EAC90F968B |
:104C2000DBC9109230041F9108951092B9008AE2F6 |
:104C30008093B800089585EA8093BC00089584E9C4 |
:104C40008093BC0008951092B9008093BB0085E862 |
:104C50008093BC0008950E941F2610923104EBEB54 |
:104C6000F0E080811092320480E88093BC001092C2 |
:104C7000BD001092BA0010821092B9001092B800D4 |
:104C80000E9415260E941B2680E00E94232608957C |
:104C90008093BB0085E88093BC00089585EC8093E9 |
:104CA000BC00089585E88093BC0008951F920F9280 |
:104CB0000FB60F9211242F933F934F935F936F93EF |
:104CC0007F938F939F93AF93BF93EF93FF938091C5 |
:104CD00031048F5F809331048150E82FFF27E73143 |
:104CE000F10540F4E05BFF4FEE0FFF1F0590F491DC |
:104CF000E02D099410923104F4C088E90E94232623 |
:104D0000F0C080E80E942326ECC00E941F268AE0A3 |
:104D100090E090939E0380939D030E941B26E1C028 |
:104D2000809133049091BB00E82FFF27EA50F84FA1 |
:104D300090838F5F809333048C3010F01092330493 |
:104D40000E941F2610923104CCC08091BB00E091DC |
:104D50003304FF27EE5EF74F80830E945226C1C0C6 |
:104D600080E10E942326BDC084E10E942326B9C0B1 |
:104D700090913204292F3327F901EE0FFF1FEE0F18 |
:104D8000FF1FE05BFA4F85851816ACF09C3020F0D1 |
:104D900012C09C3009F473C09F5F292F3327F9019B |
:104DA000EE0FFF1FEE0FFF1FE05BFA4F8585181611 |
:104DB00084F7909332049C3009F464C0220F331FAF |
:104DC000822F8E5A0E9423268CC00E941F268AE0C2 |
:104DD00090E090939E0380939D031092310481C0D4 |
:104DE0008091B900803309F459C00E941F268AE0DF |
:104DF00090E090939E0380939D03109231040E9453 |
:104E00001B266FC0809126030E9423266AC082E180 |
:104E10000E94232666C0809125030E94232661C03C |
:104E2000809124030E9423265CC090913204E92FD4 |
:104E3000FF27E35FF64F80819F5F909332040E94CB |
:104E400023264FC08091B9008034E9F1809133046A |
:104E5000E82FFF27EE5DF74F10828F5F80933304BA |
:104E60008C3010F0109233040E941F2610923104EF |
:104E700080913504809334041092350432C08CE064 |
:104E8000809332041092320483E080933104809145 |
:104E90003304880F8D5A0E94232623C08091350445 |
:104EA0008823E1F48091320480933504E82FFF27B2 |
:104EB000EB5FF74F80818F5F8083882309F095CF68 |
:104EC0008FEF808392CF80913304E82FFF27EE5D30 |
:104ED000F74F8C5F80830E944E26CACF80913204A8 |
:104EE000E5CF8091BC0080688093BC00FF91EF917A |
:104EF000BF91AF919F918F917F916F915F914F91F2 |
:104F00003F912F910F900FBE0F901F90189583EC3B |
:104F100080938100EFE6F0E08081806280831092D0 |
:104F20003F0410923E0410923D0410923C041092F3 |
:104F30003B0410923A0408951F920F920FB60F92FD |
:104F400011240F931F932F933F934F935F936F936E |
:104F50007F938F939F93AF93BF93CF93DF93EF9301 |
:104F6000FF932091860030918700809138049091C2 |
:104F70003904281B390B809186009091870090930B |
:104F8000390480933804C9018D549440835F9A4159 |
:104F900070F4809136049091370404970CF07CC033 |
:104FA00081E090E090933704809336049DC0009197 |
:104FB0003604109137040A3011050CF095C0C90170 |
:104FC0008B5F9040845B914008F054C0A901425D22 |
:104FD0005140E801CC0FDD1FFE01E25DF74F8081FB |
:104FE00091819A01281B390BC90137FD79C00697B9 |
:104FF00044F480919F04883C08F469C088EC809355 |
:105000009F04FE01E25DF74F808191819C01220F98 |
:10501000331F280F391F240F351F37FD5EC035950C |
:10502000279535952795CA010196821793070CF0AD |
:1050300043C02150304080919F04833CB8F1FE0171 |
:10504000E25DF74F80819181A901481B590BCA018C |
:1050500063E070E00E94905BCB01880F991F860F80 |
:10506000971FFE01EC5BF74F91838083C25DD74FA2 |
:1050700039832883C80101969093370480933604BE |
:105080008530910579F05D988630910541F05C9806 |
:105090000797D9F05B9828C01092830381CF5C9A60 |
:1050A0005B9822C05D9A5C985B981EC0FE01EC5B29 |
:1050B000F74F11821082DACF415050402417350744 |
:1050C0000CF0B9CF2F5F3F4FB6CF5B9A0DC08091E8 |
:1050D0009F04865F80939F0494CF2D5F3F4F9FCFA7 |
:1050E000909581959F4F83CFFF91EF91DF91CF9165 |
:1050F000BF91AF919F918F917F916F915F914F91F0 |
:105100003F912F911F910F910F900FBE0F901F9005 |
:10511000189581E08093600882E08093610883E0C5 |
:105120008093620884E08093630885E0809364083C |
:1051300086E08093650887E08093660888E0809326 |
:10514000670808956817790744F4680F791F77FD99 |
:1051500009C0CB01959587950895681B790B861B2F |
:10516000970B08956F5F7F4FCB01959587950895B5 |
:105170002F923F924F925F926F927F928F929F9267 |
:10518000AF92BF92CF92DF92EF92FF920F931F9355 |
:10519000CF93DF93CDB7DEB76D970FB6F894DEBF30 |
:1051A0000FBECDBF80910B0490910C0420913E0462 |
:1051B00030913F04281B390B3D8F2C8F30931C09F5 |
:1051C00020931B09209101043091020437FF02C093 |
:1051D0000C94E53035952795359527953595279588 |
:1051E0003D8B2C8B209103043091040437FD77C74D |
:1051F0003595279535952795359527953B8B2A8BA2 |
:105200004C895D895093DC084093DB083093D208C9 |
:105210002093D10860910F047091100420910A0925 |
:1052200030910B09442737FD4095542F79018A01AD |
:10523000EE0CFF1C001F111FE20EF31E041F151FB2 |
:10524000882777FD8095982F26E030E040E050E0F9 |
:105250000E94515BE60EF71E081F191FC801B70117 |
:1052600024E030E040E050E00E94C55B30930B0941 |
:1052700020930A0960910D0470910E042091260973 |
:1052800030912709442737FD4095542F79018A0131 |
:10529000EE0CFF1C001F111FE20EF31E041F151F52 |
:1052A000882777FD8095982F26E030E040E050E099 |
:1052B0000E94515BE60EF71E081F191FC801B701B7 |
:1052C00024E030E040E050E00E94C55B30932709C5 |
:1052D00020932609E0901104F09012042091D9083F |
:1052E0003091DA08442737FD4095542FCA01B9019F |
:1052F000660F771F881F991F620F731F841F951FEA |
:105300000027F7FC0095102F6E0D7F1D801F911F49 |
:1053100024E030E040E050E00E94C55B3093DA08C2 |
:105320002093D90820910F0430911004C901880FEF |
:10533000991F820F931F880F991FAA2797FDA09589 |
:10534000BA2F209160043091610440916204509121 |
:105350006304280F391F4A1F5B1F2093600430939A |
:105360006104409362045093630420910D043091D2 |
:105370000E04C901880F991F820F931F880F991F70 |
:10538000AA2797FDA095BA2F209164043091650457 |
:105390004091660450916704280F391F4A1F5B1F14 |
:1053A000209364043093650440936604509367042B |
:1053B00020910F04309110048091E4089091E50849 |
:1053C000820F931F9093E5088093E40820910D04C9 |
:1053D00030910E0480911E0990911F09820F931F36 |
:1053E00090931F0980931E0980914804909149046D |
:1053F00001969093490480934804E090E607F0906A |
:10540000E707A0904A04B0904B04C0904C04D090A1 |
:105410004D04609168047091690480916A049091D0 |
:105420006B040E94D75A3B014C010027F7FC009502 |
:10543000102FC801B7010E94D75AA60195010E94FA |
:10544000775A9B01AC01C401B3010E94785A0E94B3 |
:10545000BA5A609368047093690480936A049093C5 |
:105460006B048FEC80937A0010922703809178046C |
:1054700090917904A0917A04B0917B048E879F87E4 |
:10548000A88BB98B20917004309171044091720403 |
:10549000509173042A873B874C875D874C8D5D8DC7 |
:1054A0001A01442437FC4094542C8091800490913C |
:1054B0008104A0918204B0918304820D931DA41DE8 |
:1054C000B51D888F998FAA8FBB8F8093800490938E |
:1054D0008104A0938204B0938304609022097090A9 |
:1054E00023098090240990902509620C731C841C68 |
:1054F000951C60922209709223098092240990924F |
:1055000025099091B1049987992349F48091B204B7 |
:10551000882309F47DC4A0916808AF8B03C09091E3 |
:1055200068089F8B10925F0810925E0810925B08CB |
:1055300010925A0810921B0510921C0510921D051E |
:1055400010921E0510921F05109220051092210541 |
:1055500010922205B091B903BE8BE0901F05F09028 |
:1055600020050091210510912205A0901B05B09007 |
:105570001C05C0901D05D0901E05C601B50124E68E |
:1055800030E040E050E00E94C55B2701421A530A18 |
:105590005092CD084092CC08C801B70124E630E013 |
:1055A00040E050E00E94C55B19012A183B08309288 |
:1055B000C2082092C1086091BD037091BE03809122 |
:1055C000BF039091C00328E631E040E050E00E9424 |
:1055D000515B661677068806990664F0661A770AA4 |
:1055E000880A990A609222097092230980922409FC |
:1055F0009092250997FC66C56A897B89640D751DA3 |
:105600009B01442737FD4095542F80917C04909155 |
:105610007D04A0917E04B0917F04820F931FA41F8C |
:10562000B51F80937C0490937D04A0937E04B09377 |
:105630007F048091AD049091AE04681B790B7B01CF |
:105640000027F7FC0095102F2E853F854889598942 |
:10565000E20EF31E041F151FE0927804F092790405 |
:1056600000937A0410937B042091A5033091A60344 |
:105670004091A7035091A8032E153F0540075107FD |
:10568000D4F478EAE72E71E6F72E012D112DE21AF7 |
:10569000F30A040B150BE0927804F092790400935E |
:1056A0007A0410937B04E0927C04F0927D040093D2 |
:1056B0007E0410937F0488279927DC01821B930BBB |
:1056C000A40BB50BE0907804F090790400917A0473 |
:1056D00010917B04E816F9060A071B07E4F468E555 |
:1056E000E62E6EE9F62E6FEF062F6FEF162FE20E05 |
:1056F000F31E041F151FE0927804F09279040093C2 |
:105700007A0410937B04E0927C04F0927D04009371 |
:105710007E0410937F046C897D89620D731D9B014B |
:10572000442737FD4095542F80917404909175045F |
:10573000A0917604B0917704820F931FA41FB51F28 |
:105740008093740490937504A0937604B0937704C7 |
:105750008091AF049091B004681B790B9B014427A2 |
:1057600037FD4095542F8A859B85AC85BD85280FD4 |
:10577000391F4A1F5B1F20937004309371044093BC |
:10578000720450937304A090A103B090A203C09040 |
:10579000A303D090A403A216B306C406D506C4F48E |
:1057A00028EA31E640E050E02A193B094C095D093E |
:1057B00020937004309371044093720450937304E7 |
:1057C00020937404309375044093760450937704C7 |
:1057D00088279927DC018A199B09AC09BD0920910A |
:1057E0007004309171044091720450917304281731 |
:1057F00039074A075B07B4F4A6019501285A3146D8 |
:1058000040405040209370043093710440937204E0 |
:10581000509373042093740430937504409376047A |
:1058200050937704888D998DAA8DBB8D80936C04DD |
:1058300090936D04A0936E04B0936F042093500472 |
:10584000309351044093520450935304E09258040F |
:10585000F092590400935A0410935B0480917404ED |
:1058600090917504A0917604B091770480935404CC |
:1058700090935504A0935604B093570480917C04F0 |
:1058800090917D04A0917E04B0917F0480935C048C |
:1058900090935D04A0935E04B0935F0480911A031B |
:1058A00090911B0397FD0CC49595879595958795C9 |
:1058B000959587959093CF088093CE0880911C038F |
:1058C00090911D0397FDFAC39595879595958795BA |
:1058D000959587959093C0088093BF0880910704A1 |
:1058E000909108040F9734F488E19CEF9093CF08CF |
:1058F0008093CE088091070490910804079734F4B0 |
:1059000080E398EF9093CF088093CE082091080110 |
:105910002A3009F4B5C18091070490910804815D93 |
:1059200097400CF063C28091070490910804805E58 |
:1059300097400CF0BAC18091090490910A040F9726 |
:1059400034F488E19CEF9093C0088093BF08809165 |
:10595000090490910A04079734F480E398EF909338 |
:10596000C0088093BF082A3009F4A6C180910904B9 |
:1059700090910A04815D97400CF031C28091090436 |
:1059800090910A04805E97400CF0ABC16091B00327 |
:10599000662309F4A2C040911A0350911B03809121 |
:1059A000110590911205481B590B50930C0540931B |
:1059B0000B0520911A0330911B03280F391F37FD67 |
:1059C00008C4359527953093120520931105413869 |
:1059D00051050CF412C280E890E090930C0580937E |
:1059E0000B05E62FFF2780910B0590910C05E89F92 |
:1059F000B001E99F700DF89F700D11249B0177FD98 |
:105A0000F9C335952795359527953595279535957E |
:105A100027958091CE089091CF08820F931F909385 |
:105A2000CF088093CE0840911C0350911D038091B4 |
:105A30000F0590911005481B590B50930E0540938C |
:105A40000D0520911C0330911D03280F391F37FDD0 |
:105A5000CEC3359527953093100520930F05413817 |
:105A600051050CF420C380E890E090930E058093DC |
:105A70000D0580910D0590910E05E89FA001E99F0D |
:105A8000500DF89F500D11249A0157FDADC3359567 |
:105A900027953595279535952795359527958091A7 |
:105AA000BF089091C008820F931F9093C008809305 |
:105AB000BF0880911A0390911B03680F791F7093A0 |
:105AC0001B0360931A0380911C0390911D03480FE0 |
:105AD000591F50931D0340931C03AA89BB891A16B2 |
:105AE0001B060CF0FFC260915A0870915B0877FDAD |
:105AF00073C3882777FD8095982FBE892B2F332776 |
:105B0000442755270E94515B20E430E040E050E0FC |
:105B10000E94C55B420E531E5092CD084092CC08A5 |
:105B20002C893D89121613060CF0FFC260915E08A5 |
:105B300070915F0877FD54C3882777FD8095982F73 |
:105B4000AE892A2F3327442755270E94515B20E432 |
:105B500030E040E050E00E94C55B220E331E3092E0 |
:105B6000C2082092C108EF89E7FDFFC28091640856 |
:105B7000E82FFF27EE0FFF1FE25DF74F8081918135 |
:105B8000A0919704B091980482599F4FA817B90724 |
:105B90000CF0FFC01196B0939804A09397048091E5 |
:105BA0006508E82FFF27EE0FFF1FE25DF74F8081AA |
:105BB00091816091990470919A0482599F4F68175E |
:105BC00079070CF0D3C06F5F7F4F70939A04609396 |
:105BD000990480916608E82FFF27EE0FFF1FE25D12 |
:105BE000F74F8081918140919B0450919C04825990 |
:105BF0009F4F481759070CF0A6C04F5F5F4F509357 |
:105C00009C0440939B0480916708E82FFF27EE0FC8 |
:105C1000FF1FE25DF74F8081918120919D043091BB |
:105C20009E0482599F4F281739070CF061C02F5FDF |
:105C30003F4F30939E0420939D04B7FD6DC0AF3F4E |
:105C4000B10511F00CF0C4C077FD6CC06F3F710559 |
:105C500011F00CF0B6C057FD6BC04F3F510511F06D |
:105C60000CF0A8C037FD6AC02F3F310509F00CF4D5 |
:105C700009C38FEF90E090939E0480939D0402C32C |
:105C80008091070490910804835F934034F088EE7C |
:105C900093E09093CF088093CE0880910704909171 |
:105CA00008048A5F93400CF446CE80ED97E0909311 |
:105CB000CF088093CE083FCE8091090490910A04CA |
:105CC000835F934034F088EE93E09093C008809314 |
:105CD000BF088091090490910A048A5F93400CF4F4 |
:105CE00055CE80ED97E09093C0088093BF084ECECC |
:105CF0008081918182599F4F821793070CF09DCF2D |
:105D00002115310509F499CF2150304030939E047C |
:105D100020939D04B7FF93CF10929804109297049C |
:105D200077FF94CF10929A041092990457FF95CF61 |
:105D300010929C0410929B0437FF96CF10929E0401 |
:105D400010929D049FC28081918182599F4F841738 |
:105D500095070CF058CF4115510509F454CF415027 |
:105D6000504050939C0440939B044DCF808191817F |
:105D700082599F4F861797070CF02BCF611571053D |
:105D800009F427CF6150704070939A04609399048E |
:105D900020CF8081918182599F4F8A179B070CF0F9 |
:105DA000FECE109709F4FBCE1197B0939804A09300 |
:105DB0009704F5CE8FEF90E090939C0480939B0422 |
:105DC00051CF8FEF90E090939A048093990443CF42 |
:105DD0008FEF90E0909398048093970435CF88EEEE |
:105DE00093E09093C0088093BF08C8CD88EE93E0FD |
:105DF0009093CF088093CE0896CD40585F4F0CF01B |
:105E0000F0CD80E89FEF90930C0580930B05E9CDD2 |
:105E1000A0916808AF8BA6FF85CB6E857F858889AA |
:105E20009989683BB4E97B07BEEF8B07BFEF9B07FF |
:105E300024F468EB74E98EEF9FEF6D837E838F838C |
:105E4000988769547B468140904044F028E43BE6C3 |
:105E500041E050E02D833E834F8358876A857B85E0 |
:105E60008C859D85683B34E973073EEF83073FEFE0 |
:105E7000930724F468EB74E98EEF9FEF69837A83CC |
:105E80008B839C8369547B468140904044F088E436 |
:105E90009BE6A1E0B0E089839A83AB83BC83A090AA |
:105EA000B803BB24CC24DD24AA89BB899D014427E7 |
:105EB00037FD4095542F69817A818B819C810E94A6 |
:105EC000515B20E038E040E050E00E94C55BCA0131 |
:105ED000B901A60195010E94515B20E030E140E04C |
:105EE00050E00E94C55B79018A0120931705309329 |
:105EF00018054093190550931A05EC89FD899F01F7 |
:105F0000442737FD4095542F6D817E818F81988580 |
:105F10000E94515B20E038E040E050E00E94C55B09 |
:105F2000C601B5010E94515B20E030E140E050E045 |
:105F30000E94C55BF0925B08E0925A0830935F08BC |
:105F400020935E0859016A01AE18BF08C00AD10A41 |
:105F5000A0921305B0921405C0921505D0921605B3 |
:105F60006A0C7B1C8C1C9D1C609222097092230978 |
:105F70008092240990922509F091B903FE8BFF23AA |
:105F8000E1F4C601B50122E030E040E050E00E94BB |
:105F9000C55B888D998DAA8DBB8D821B930BA40B3D |
:105FA000B50B888F998FAA8FBB8F809380049093B5 |
:105FB0008104A0938204B0938304A20CB31CC41C7C |
:105FC000D51CE090B703FF240027112769817A814F |
:105FD0008B819C81A60195010E94515B20E038E0F5 |
:105FE00040E050E00E94C55BCA01B901A8019701D9 |
:105FF0000E94515B20E030E140E050E00E94C55B30 |
:1060000019012A0120931F05309320054093210593 |
:10601000509322056D817E818F819885A60195011F |
:106020000E94515B20E038E040E050E00E94C55BF8 |
:10603000C801B7010E94515B20E030E140E050E030 |
:106040000E94C55B79018A0120931B0530931C05D2 |
:1060500040931D0550931E058C8D9D8D97FD06C1A7 |
:10606000813491050CF479CAA201910157FCE1C079 |
:10607000213831054105510554F4A801970117FD58 |
:10608000F9C021383105410551050CF466CA81E09B |
:1060900080939404609022097090230980902409D1 |
:1060A000909025095ACA40585F4F0CF0E2CC80E826 |
:1060B0009FEF90930E0580930D05DBCC079604CCE3 |
:1060C0000796F2CB660E771E881E991E60922209F3 |
:1060D0007092230980922409909225098DCA295F24 |
:1060E0003F4F86C860915A0870915B0877FD85C064 |
:1060F000882777FD8095982FEE892E2F3327442708 |
:1061000055270E94515B20E430E040E050E00E94BF |
:10611000C55B421A530A5092CD084092CC082C8994 |
:106120003D89121613060CF401CD60915E08709142 |
:106130005F0877FD66C0882777FD8095982FBE8918 |
:106140002B2F3327442755270E94515B20E430E052 |
:1061500040E050E00E94C55B221A330A3092C20828 |
:106160002092C108EF89E7FF01CDF985FF2309F0EF |
:10617000FDCC8091B204882309F0F8CC2C893D89AC |
:1061800041E0213034070CF440C08091CE0890915A |
:10619000CF08820F931F805091409093CF08809337 |
:1061A000CE082A893B8941E0213034070CF449C0EC |
:1061B0008091BF089091C008820F931F805091403A |
:1061C0009093C0088093BF08D1CC295F3F4F0C94B7 |
:1061D000EA282F5F3F4FF5CB709561957F4F89CCB3 |
:1061E000709561957F4FA8CC215F3F4F50CC2F5FBA |
:1061F0003F4F2FCC215F3F4F04CC709561957F4F6F |
:1062000077CF709561957F4F96CF8C899D8980500F |
:106210009F4F3CF68091CE089091CF0880509F4FC1 |
:10622000EC89FD898E0F9F1F9093CF088093CE0835 |
:10623000B8CF50954095309521953F4F4F4F5F4FC8 |
:1062400017CF8A899B8980509F4F0CF08FCC80910B |
:10625000BF089091C00880509F4FEA89FB898E0F3C |
:106260009F1F9093C0088093BF0880CC9095819524 |
:106270009F4FF6CE50954095309521953F4F4F4F0B |
:106280005F4FFFCE6D960FB6F894DEBF0FBECDBF49 |
:10629000DF91CF911F910F91FF90EF90DF90CF9002 |
:1062A000BF90AF909F908F907F906F905F904F9036 |
:1062B0003F902F90089580916B088B3F80F08B3F2B |
:1062C00009F4DEC28C3F09F4C1C38D3F09F4FBC25F |
:1062D0008E3F39F480919D048093AC0302C080937B |
:1062E000AC0380916A088B3F80F08B3F09F4CDC2EC |
:1062F0008C3F09F4D8C38D3F09F412C38E3F39F4A3 |
:1063000080919D048093AB0302C08093AB03809186 |
:10631000AB038823B1F41092AB0380916C088B3FE0 |
:10632000C8F08B3F09F4B6C28C3F09F4C1C38D3F5E |
:1063300009F4E7C28E3F81F480919D048093AD0300 |
:106340000BC0843650F384E68093AB0380916C08D5 |
:106350008B3F38F78093AD038091AD038823B1F470 |
:106360001092AD0380916E088B3FC8F08B3F09F40B |
:10637000A5C28C3F09F465C38D3F09F4C7C28E3FA7 |
:1063800081F480919D048093AE030BC0843650F35A |
:1063900084E68093AD0380916E088B3F38F780933D |
:1063A000AE03809175088B3F80F08B3F09F47CC26F |
:1063B0008C3F09F469C38D3F09F4ADC28E3F39F4B7 |
:1063C00080919D048093AF0302C08093AF038091BE |
:1063D00076088B3F80F08B3F09F46BC28C3F09F449 |
:1063E0006CC38D3F09F47EC28E3F39F480919D04C9 |
:1063F0008093B10302C08093B1038091B1038B30CD |
:10640000B8F48AE08093B103809177088B3FC0F0A5 |
:106410008B3F09F412C28C3F09F454C38D3F09F439 |
:1064200066C28E3F79F480919D048093B2030AC0C6 |
:106430008F3F51F78093B103809177088B3F40F7EE |
:106440008093B203809178088B3F80F08B3F09F4F2 |
:10645000F9C18C3F09F413C38D3F09F44DC28E3F3F |
:1064600039F480919D048093B00302C08093B003FF |
:1064700080917D088B3F80F08B3F09F4E8C18C3F11 |
:1064800009F4D0C28D3F09F428C28E3F39F48091BF |
:106490009D048093B40302C08093B40380917E086E |
:1064A0008B3F80F08B3F09F4B4C18C3F09F497C255 |
:1064B0008D3F09F471C28E3F39F480919D04809321 |
:1064C000B70402C08093B70480917F088B3F80F0AF |
:1064D0008B3F09F4A3C18C3F09F486C28D3F09F4B8 |
:1064E0004CC28E3F39F480919D048093B80402C061 |
:1064F0008093B804809180088B3F80F08B3F09F433 |
:1065000092C18C3F09F489C28D3F09F43BC28E3F92 |
:1065100039F480919D048093B90402C08093B9043A |
:10652000809181088B3F80F08B3F09F481C18C3FC3 |
:1065300009F46EC28D3F09F42AC28E3F39F480916E |
:106540009D048093BA0402C08093BA04809192089B |
:106550008B3F80F08B3F09F434C18C3F09F435C286 |
:106560008D3F09F423C28E3F39F480919D048093BE |
:10657000BB0402C08093BB04809193088B3F80F0E2 |
:106580008B3F09F423C18C3F09F424C28D3F09F4E9 |
:1065900012C28E3F39F480919D048093BC0402C0E6 |
:1065A0008093BC04809194088B3F80F08B3F09F46A |
:1065B00012C18C3F09F427C28D3F09F401C28E3FFE |
:1065C00039F480919D048093BD0402C08093BD0482 |
:1065D000809195088B3F80F08B3F09F401C18C3F7F |
:1065E00009F40CC28D3F09F4DCC18E3F39F480916F |
:1065F0009D048093BE0402C08093BE0480918208F3 |
:106600008B3F80F08B3F09F4F0C08C3F09F423C22C |
:106610008D3F09F4ADC18E3F39F480919D04809384 |
:10662000B50302C08093B503809187088B3F80F04B |
:106630008B3F09F4DFC08C3F09F412C28D3F09F48F |
:1066400088C18E3F39F480919D048093B60302C0C7 |
:106650008093B60380918A088B3F80F08B3F09F4CA |
:10666000CEC08C3F09F4C5C18D3F09F477C18E3F80 |
:1066700039F480919D048093B70302C08093B703DF |
:1066800080918B088B3F80F08B3F09F4BDC08C3F1D |
:1066900009F4D2C18D3F09F466C18E3F39F480916F |
:1066A0009D048093B80302C08093B80380918C0846 |
:1066B0008B3F80F08B3F09F4CFC08C3F09F4D5C1EC |
:1066C0008D3F09F437C18E3F39F480919D0480934A |
:1066D000B90302C08093B903809191088B3F80F089 |
:1066E0008B3F09F4BEC08C3F09F4C4C18D3F09F44F |
:1066F00026C18E3F39F480919D048093BA0302C075 |
:106700008093BA03809197088B3F80F08B3F09F408 |
:10671000ADC08C3F09F48BC18D3F09F415C18E3F8C |
:1067200039F480919D048093E60802C08093E608C6 |
:106730008091E608823008F440C08F3FB9F1809123 |
:1067400099088B3F80F08B3F09F495C08C3F09F48A |
:10675000A5C18D3F09F4E9C08E3F39F480919D04B5 |
:106760008093190902C08093190980911909823018 |
:1067700000F18F3FC1F08091AA088B3F88F08B3FDA |
:1067800009F48DC08C3F09F484C18D3F09F4A0C089 |
:106790008E3F09F09CC180919D048093290997C187 |
:1067A0008093290994C180931909E5CF8093E60865 |
:1067B000C6CF81E080931909DECF81E08093E6089F |
:1067C000BECF809197048093BB04D6CE809197046E |
:1067D0008093BC04E7CE809197048093BD04F8CEEB |
:1067E000809197048093BE0409CF80919704809391 |
:1067F000B5031ACF809197048093B6032BCF809175 |
:1068000097048093B7033CCF809197048093B8039B |
:106810004DCF809197048093B70456CE8091970412 |
:106820008093B80467CE809197048093B90478CEA2 |
:10683000809197048093BA0489CE809197048093C5 |
:10684000B20300CE809197048093B00311CE809163 |
:1068500097048093B40322CE809197048093B90368 |
:106860003BCF809197048093BA034CCF80919704DB |
:106870008093E6085DCF809197048093190975CFC6 |
:10688000809197048093AC032CCD809197048093E2 |
:10689000AB033DCD809197048093AD035DCD809196 |
:1068A00097048093290913C1809197048093AF03C3 |
:1068B0008ECD809197048093B1039FCD80919704F2 |
:1068C0008093AE036ECD80919B048093AC0309CD81 |
:1068D00080919B0480932909FAC080919B04809346 |
:1068E000B403DCCD80919B048093B10386CD80916D |
:1068F0009B048093B203A6CD80919B048093B00348 |
:10690000B7CD80919B048093AD0326CD80919B04ED |
:106910008093AE0346CD80919B048093AF0357CD07 |
:1069200080919B048093AB03F2CC80919B04809375 |
:1069300019091BCF80919B048093B903CDCE809120 |
:106940009B048093BA03DECE80919B048093E6087B |
:10695000EFCE80919B048093B6037CCE80919B0404 |
:106960008093B7038DCE80919B048093B8039ECE15 |
:1069700080919B048093B50357CE80919B048093B4 |
:10698000B804B8CD80919B048093B904C9CD80919F |
:106990009B048093BA04DACD80919B048093B70462 |
:1069A00093CD80919B048093BE0428CE80919B045C |
:1069B0008093BB04E1CD80919B048093BC04F2CD15 |
:1069C00080919B048093BD0403CE809199048093B1 |
:1069D000BB04D2CD809199048093BC04E3CD809117 |
:1069E00099048093B70470CD809199048093B80482 |
:1069F00081CD809199048093B70342CE8091990410 |
:106A00008093BE04FBCD809199048093BD04E0CDBA |
:106A1000809199048093BA0499CD809199048093D0 |
:106A2000B9047ECD809199048093B40337CD8091D1 |
:106A300099048093E6087CCE809199048093B803F2 |
:106A400035CE809199048093AE03ABCC80919904AC |
:106A50008093AC0346CC809199048093B503E4CD38 |
:106A6000809199048093B603F5CD80919904809329 |
:106A7000B90332CE809199048093BA0343CE8091BA |
:106A800099048093B003F4CC809199048093AF0370 |
:106A90009ECC809199048093290919C08091990412 |
:106AA0008093190962CE809199048093AB032FCC17 |
:106AB000809199048093AD034FCC80919904809389 |
:106AC000B1039BCC809199048093B203BBCC6091BD |
:106AD000B40377276F5F7F4F8CE398E20E94905B4F |
:106AE0007093AA036093A9038091730880931A0995 |
:106AF000809172088093D3080895CF93DF9380919B |
:106B0000A804882301F58091CB048C7F8093CB046B |
:106B1000A5EEB6E0EDE0F9E0ED018091DE0388231B |
:106B200009F41C9289918193119689E0E931F80763 |
:106B3000A1F78091DE03882359F08091DE03815014 |
:106B40008093DE0305C08091CB0481608093CB04E9 |
:106B500080910D0999279093BB078093BA07809184 |
:106B60000E0999279093BD078093BC078091100967 |
:106B700099279093BF078093BE0780910F099927AB |
:106B80009093C1078093C007109231041092320491 |
:106B90000E941B26DF91CF910895809108018D30CE |
:106BA00009F443C110927A0080910704909108047F |
:106BB0009093CF088093CE088091090490910A04A5 |
:106BC0009093C0088093BF0880910B0490910C04AF |
:106BD00090931C0980931B0960910F04709110041D |
:106BE000882777FD8095982F26E030E040E050E040 |
:106BF0000E94515B70930B0960930A0960910D0428 |
:106C000070910E04882777FD8095982F0E94515B24 |
:106C100070932709609326098091110490911204C2 |
:106C20009093DA088093D9088FEC80937A00809152 |
:106C30006408E82FFF27EE0FFF1FE25DF74F80810A |
:106C40009181A0919704B091980482599F4FA81701 |
:106C5000B9070CF0C4C01196B0939804A0939704A0 |
:106C600080916508E82FFF27EE0FFF1FE25DF74FC9 |
:106C7000808191816091990470919A0482599F4F0B |
:106C8000681779070CF098C06F5F7F4F70939A0474 |
:106C90006093990480916608E82FFF27EE0FFF1F8D |
:106CA000E25DF74F8081918140919B0450919C045B |
:106CB00082599F4F481759070CF06BC04F5F5F4FC9 |
:106CC00050939C0440939B0480916708E82FFF2712 |
:106CD000EE0FFF1FE25DF74F8081918120919D04AF |
:106CE00030919E0482599F4F281739074CF52F5F2A |
:106CF0003F4F30939E0420939D04B7FD33C0AF3FB8 |
:106D0000B10511F00CF08AC077FD32C06F3F7105FC |
:106D100011F00CF07CC057FD31C04F3F510511F010 |
:106D20000CF06EC037FD30C02F3F310509F00CF478 |
:106D30007FC08FEF90E090939E0480939D0478C075 |
:106D40008081918182599F4F82179307B4F6211554 |
:106D5000310599F22150304030939E0420939D04D8 |
:106D6000B7FFCDCF109298041092970477FFCECF43 |
:106D700010929A041092990457FFCFCF10929C045E |
:106D800010929B0437FFD0CF10929E0410929D0466 |
:106D90004FC08081918182599F4F841795070CF0D5 |
:106DA00093CF4115510509F48FCF41505040509376 |
:106DB0009C0440939B0488CF8081918182599F4F8E |
:106DC000861797070CF066CF6115710509F462CF3D |
:106DD0006150704070939A04609399045BCF8081F6 |
:106DE000918182599F4F8A179B070CF039CF1097DA |
:106DF00009F436CF1197B0939804A093970430CF3D |
:106E00008FEF90E090939C0480939B048BCF8FEF47 |
:106E100090E090939A04809399047DCF8FEF90E057 |
:106E200090939804809397046FCF0E947D1DBACEF3 |
:106E300060918D0877278827992724EC39E040E076 |
:106E400050E00E94515B6093A1037093A203809372 |
:106E5000A3039093A40360918E087727882799272E |
:106E60000E94515B6093A5037093A6038093A703D0 |
:106E70009093A80308956F927F928F929F92AF9202 |
:106E8000BF92CF92DF92EF92FF920F931F93CF9317 |
:106E9000DF931092F103469A109245041092440435 |
:106EA000109247041092460480E090E0A0E0B0E029 |
:106EB00080934A0490934B04A0934C04B0934D04E8 |
:106EC00010923B0410923A0410923D0410923C043C |
:106ED00010923F0410923E041092EC081092EB08BE |
:106EE0001092B7031092B803109214040E94CD358B |
:106EF00084E690E00E943F150E94CD35809168089D |
:106F000080FF10C08091220390912303875B934000 |
:106F100008F0D8C080912203909123038E5E9240A6 |
:106F200008F4D0C0C0E0D0E000E010E0EE24CC24B3 |
:106F3000DD248AE090E00E943F1580910B0490913F |
:106F40000C04C80ED91E8091070490910804C80F44 |
:106F5000D91F8091090490910A04080F191FE39426 |
:106F600080E2E81631F7AE01405F5F4F56954795D6 |
:106F70005695479550933B0440933A049801205FFF |
:106F80003F4F369527953695279530933D042093AE |
:106F90003C04C601409696958795929582958F7090 |
:106FA00089279F70892790933F0480933E04909394 |
:106FB000EC088093EB0830934104209340045093F5 |
:106FC00043044093420444E050E0DA010E94E05B55 |
:106FD000802D853078F1809126099091270997FDC1 |
:106FE00078C06CE070E00E94905B709347046093FF |
:106FF000460480910A0990910B0997FD66C06CE0E8 |
:1070000070E00E94905B709345046093440460912B |
:10701000E6077091E707882777FD8095982F0E94F3 |
:10702000D75A60934A0470934B0480934C04909316 |
:107030004D0453C0DA010E94E05B802D4F5F5F4F2B |
:10704000DA010E94E05B202D9927982F8827820F74 |
:10705000911D90934504809344044F5F5F4FDA0184 |
:107060000E94E05B802D4F5F5F4FDA010E94E05B82 |
:10707000202D9927982F8827820F911D90934704E0 |
:10708000809346044F5F5F4FDA010E94E05B602D02 |
:107090004F5F5F4FDA010E94E05B202D7727762F4C |
:1070A0006627620F711D882777FD8095982F0E94B3 |
:1070B000D75A60934A0470934B0480934C04909386 |
:1070C0004D040BC00E945D1E2DCF909581959F4F62 |
:1070D00096CF909581959F4F84CF1092CF081092B4 |
:1070E000CE081092C0081092BF0810921C0910928E |
:1070F0001B0984E690E00E943F1560910F04709197 |
:107100001004882777FD8095982F26E030E040E036 |
:1071100050E00E94515B3B014C0170930B0960935E |
:107120000A0960910D0470910E04882777FD8095FF |
:10713000982F0E94515B5B016C017093270960934B |
:107140002609E0907408FF2400271127882477FC83 |
:107150008094982CC801B701A40193010E94515B4F |
:107160003B014C016093500470935104809352048E |
:1071700090935304CC24B7FCC094DC2CC801B70115 |
:10718000A60195010E94515B6093580470935904C5 |
:1071900080935A0490935B04609274047092750417 |
:1071A000809276049092770460937C0470937D04BF |
:1071B00080937E0490937F04109280041092810447 |
:1071C000109282041092830480911E0390911F03F9 |
:1071D000A0912003B09121039093E9078093E807E1 |
:1071E00010921604109215041092880410928904CB |
:1071F00010928A0410928B0480918C0490918D04DB |
:1072000090938F0480938E040E94DC5382E390E07D |
:107210009093EF038093EE0360918D087727882782 |
:10722000992724EC39E040E050E00E94515B685619 |
:10723000754C8F4F9F4F6093A1037093A20380936F |
:10724000A3039093A40360918E087727882799273A |
:107250000E94515B6856754C8F4F9F4F6093A503FA |
:107260007093A6038093A7039093A8031092BC0386 |
:107270001092BB0360918C0470918D04882777FD78 |
:107280008095982F2091BD033091BE034091BF039C |
:107290005091C0030E94515B6093220970932309AF |
:1072A00080932409909325091092960410929504D6 |
:1072B00011E0109309010E9458578091CB0484601B |
:1072C0008093CB048FEF80938B0910928C0980E21E |
:1072D00080938D09E0916408FF27EE0FFF1FE25DA8 |
:1072E000F74F8081918182599F4F909398048093AA |
:1072F0009704E0916508FF27EE0FFF1FE25DF74F4F |
:107300008081918182599F4F90939A048093990430 |
:10731000E0916608FF27EE0FFF1FE25DF74F8081C7 |
:10732000918182599F4F90939C0480939B04E0919C |
:107330006708FF27EE0FFF1FE25DF74F8081918105 |
:1073400082599F4F90939E0480939D041093F10364 |
:1073500084E680939F04DF91CF911F910F91FF905E |
:10736000EF90DF90CF90BF90AF909F908F907F90E5 |
:107370006F9008951F93CF93DF93182F11501F3FE5 |
:10738000A9F08091A804882389F4C4E6D0E004C061 |
:107390008091A804882351F4D093EF03C093EE03A7 |
:1073A0008AEF90E00E943215115090F7DF91CF9153 |
:1073B0001F91089588EE809368083EE13093690834 |
:1073C0008BEF80936B088AE080936C0830936A0897 |
:1073D00030936E0893E090936D0858E050936F08D7 |
:1073E00020E12093700866E0609371085093720862 |
:1073F00086EE809373083093740880E88093750854 |
:1074000044E64093760888E780937708909378085D |
:107410008EE58093790883E280937A0884E18093F3 |
:107420007B0810927C0820937D0810927E081092B1 |
:107430007F08109280081092810810929208109292 |
:10744000930810929408109295084093820888E25D |
:10745000809383081092AC0892E39093840886E9A5 |
:107460008093850885E080938608909387082AE5B5 |
:1074700020938808909389081092AB0820938A087B |
:1074800083E480938B0886E480938C0885E5809361 |
:107490008D0880938E0880E280938F0880939008F7 |
:1074A000909391088FE58093960883EF80939808D6 |
:1074B00030939708309399088DEF80939A08409302 |
:1074C0009B0820939C0820939D0820939E088BE4A2 |
:1074D00080939F088093A0088093A1081092A2082F |
:1074E0006093A3085093A4082093A5083093A6089E |
:1074F0004093A7084093A80884E08093A908A1EBD3 |
:10750000B8E0E4E8F3E08CE001900D928150E1F7FF |
:10751000089588E6809368085EE1509369088BEFD0 |
:1075200080936B088AE080936C0850936A085093AC |
:107530006E0893E090936D088CE080936F0880E173 |
:107540008093700866E06093710878E07093720829 |
:1075500086EE809373085093740880E880937508D2 |
:1075600080E58093760888E7809377089093780881 |
:107570008EE58093790883E280937A0850937B08A4 |
:1075800010927C0830E230937D0810927E081092B1 |
:107590007F08109280081092810810929208109231 |
:1075A0009308109294081092950844E6409382083C |
:1075B00088E2809383081092AC0892E39093840849 |
:1075C00086E98093850885E08093860890938708F4 |
:1075D0002AE520938808909389081092AB0820939D |
:1075E0008A0883E480938B088CE380938C0885E57C |
:1075F00080938D0880938E0830938F083093900885 |
:107600009BE4909391088FE58093960883EF809395 |
:10761000980884E180939708809399088DEF809370 |
:107620009A0840939B0820939C0820939D082093E0 |
:107630009E0890939F089093A0089093A1081092A1 |
:10764000A2086093A3087093A4082093A508509300 |
:10765000A6084093A7084093A80884E08093A9084F |
:10766000A1EBB8E0EEE8F3E08CE001900D928150E0 |
:10767000E1F7089588E6809368083EE13093690851 |
:107680008BEF80936B088AE080936C0830936A08D4 |
:1076900030936E08E4E0E0936D085FE050936F086C |
:1076A000309370088CE08093710878E070937208D2 |
:1076B00086EE809373083093740880E88093750891 |
:1076C00080E58093760826E92093770883E080930D |
:1076D00078088EE58093790883E280937A08309366 |
:1076E0007B0810927C0860E260937D0810927E080F |
:1076F00010927F08109280081092810810929208D0 |
:1077000010929308109294081092950844E64093C2 |
:10771000820888E2809383081092AC0892E39093E9 |
:1077200084082093850885E08093860890938708D5 |
:107730002AE520938808909389081092AB0820933B |
:107740008A0883E480938B0810928C0885E58093E7 |
:107750008D0880938E0880E180938F086093900855 |
:10776000409391088FE58093960883EF8093980863 |
:1077700050939708509399088DEF80939A084093FF |
:107780009B0820939C0820939D0820939E088BE4DF |
:1077900080939F088093A0088093A1081092A2086C |
:1077A00086E08093A3087093A4082093A5083093E3 |
:1077B000A6084093A7084093A808E093A908A1EB66 |
:1077C000B8E0E6E9F3E08CE001900D928150E1F73A |
:1077D00008952F923F924F925F926F927F928F9275 |
:1077E0009F92AF92BF92CF92DF92EF92FF920F9350 |
:1077F0001F93CF93DF93CDB7DEB7ED970FB6F89415 |
:10780000DEBF0FBECDBF0E94B828309108013C30CA |
:1078100008F031C7299A7090D308872D99270A96C6 |
:107820006090A6047090A7047C866B866816790623 |
:1078300014F49C878B8780919F04843608F0C4C31E |
:1078400080910D01882309F42BC78091ED0490915C |
:10785000EE04009709F41BC701979093EE04809300 |
:10786000ED043A3009F41AC7343109F417C72898DF |
:107870008091C9049091CA04895E934010F40C94DD |
:10788000A64A80917A08482F55275C874B8751E09C |
:1078900050939204A0916008BB27AA0FBB1FFD0163 |
:1078A000EC5BF74F11821082E09161082E2F332795 |
:1078B000220F331FC9018C5B974FFC01118210828C |
:1078C000A25DB74F11961C921E92225D374FD901CF |
:1078D00011961C921E92E0916308FF27EE0FFF1F86 |
:1078E000E25DF74F11821082809183038150809373 |
:1078F0008303809183038F3F09F4BDC4B091920448 |
:10790000BBABBB2309F0B7C4609068086CAA709049 |
:10791000B204772011F40C948B4E8091870899273C |
:107920008B849C848815990514F49C878B8721E0AF |
:10793000209394043BA93323D1F01092A504109214 |
:10794000A4041092A1041092A0041092A304109217 |
:10795000A2048AE58093200948E74093ED088093CC |
:10796000C6084093DD081092B2041092B1046091F1 |
:1079700050047091510480915204909153046BA370 |
:107980007CA38DA39EA38091E0089091E108A09133 |
:10799000E208B091E3088EAB9FABA8AFB9AF6BA084 |
:1079A0007CA08DA09EA0860D971DA81DB91D80935B |
:1079B000E0089093E108A093E208B093E3082091D7 |
:1079C00058043091590440915A0450915B042F8F10 |
:1079D00038A349A35AA32090E7083090E8084090C4 |
:1079E000E9085090EA08220E331E441E551E2092CC |
:1079F000E7083092E8084092E9085092EA0840917E |
:107A000054045091550460915604709157044A8F64 |
:107A10005B8F6C8F7D8F8091D5089091D608A09157 |
:107A2000D708B091D808840F951FA61FB71F809361 |
:107A3000D5089093D608A093D708B093D808609142 |
:107A40005C0470915D0480915E0490915F046E8B84 |
:107A50007F8B888F998F8091C7089091C808A091DB |
:107A6000C908B091CA086E887F88888C998C860D69 |
:107A7000971DA81DB91D8093C7089093C808A093AF |
:107A8000C908B093CA087090B1047E8E772011F0B7 |
:107A90000C9469488090B2048DAA882011F40C944B |
:107AA000B94910926004109261041092620410921D |
:107AB000630410926404109265041092660410929C |
:107AC00067041092E0081092E1081092E208109208 |
:107AD000E3081092E7081092E8081092E908109263 |
:107AE000EA081092D5081092D6081092D708109282 |
:107AF000D8081092C7081092C8081092C9081092AE |
:107B0000CA088091700490917104A0917204B091A0 |
:107B100073048093740490937504A0937604B093D7 |
:107B200077048091780490917904A0917A04B091BF |
:107B30007B0480937C0490937D04A0937E04B09397 |
:107B40007F0410921804109217041092B00410923F |
:107B5000AF041092AE041092AD048091170490917E |
:107B600018048F3F910509F010F40C94D2486E8DE3 |
:107B7000662329F47DA9772311F40C94384B1092D5 |
:107B8000AE041092AD041092B0041092AF041AAE7D |
:107B9000109294046091E0087091E1088091E208ED |
:107BA0009091E3086EAB7FAB88AF99AF2090E70868 |
:107BB0003090E8084090E9085090EA087091ED088C |
:107BC0007BAF772341F41092AE041092AD04109273 |
:107BD000B0041092AF048EA99FA9A8ADB9AD80934F |
:107BE000D0049093D104A093D204B093D3042092F4 |
:107BF000CC043092CD044092CE045092CF04109227 |
:107C00006004109261041092620410926304109256 |
:107C10006404109265041092660410926704109236 |
:107C200068041092690410926A0410926B04109216 |
:107C3000E0081092E1081092E2081092E308109216 |
:107C4000E7081092E8081092E9081092EA081092EA |
:107C5000D5081092D6081092D7081092D808109222 |
:107C6000C7081092C8081092C9081092CA0810924A |
:107C7000180410921704A090A404B090A5049501D4 |
:107C8000B7FE02C00C94E1482031310564F088EE63 |
:107C900093E09093A00380939F03BCA9B4FD03C01D |
:107CA00081E08093E604C090710879010027F7FC19 |
:107CB0000095102F6C2D7727882799279501442749 |
:107CC00037FD4095542F0E94515B9B01AC01C801C8 |
:107CD000B7010E94515B20E032E040E050E00E949A |
:107CE000C55BC901DD24AC9C9001AD9C300DBC9CF2 |
:107CF000300D112437FF02C00C94AA4A3595279500 |
:107D000035952795820F931F3C01882477FC80943A |
:107D1000982C698A7A8A8B8A9C8A6092FF04709276 |
:107D20000005809201059092020580918004909157 |
:107D30008104A0918204B091830486199709A8094F |
:107D4000B9098093800490938104A0938204B09336 |
:107D50008304813523EC920720E0A20720E0B207DC |
:107D600014F40C94E74880E593ECA0E0B0E0809335 |
:107D7000800490938104A0938204B0938304609064 |
:107D80008C0470908D046114710409F4A8C44CA98A |
:107D900043FFA5C46BA17CA18DA19EA120E032E090 |
:107DA00040E050E00E94C55B890137FF02C00C949F |
:107DB0004F4E6F8D78A189A19AA120E032E040E07A |
:107DC00050E00E94C55BC90137FF02C00C944A4EC7 |
:107DD0001DAF0CAF0817190714F40C94EE4D8090EA |
:107DE000220990902309A0902409B09025092090A1 |
:107DF000BD033090BE034090BF035090C003C090BD |
:107E00001B09D0901C09C601D7FE02C00C94444E39 |
:107E10008138910514F40C94C44D60E070E000E0EA |
:107E200010E0E0909F03F090A003E114F104A1F4AE |
:107E3000ACADBDAD599784F48091950490919604B2 |
:107E4000860F971F90939604809395048091E60483 |
:107E5000882311F00C94F84F6CAD7DAD77FF02C014 |
:107E60000C945E4F759567957595679575956795B3 |
:107E70006F5F7F4FC8010E94905BFB01AF016627D7 |
:107E800057FD6095762F480D591D6A1D7B1D409347 |
:107E90002209509323096093240970932509809146 |
:107EA000AF03082F11278CAC9DAC809E9001819E62 |
:107EB000300D909E300D112437FF02C00C945A4FA4 |
:107EC000359527953595279535952795359527959A |
:107ED000359527955801A21AB30AB7FE02C00C9433 |
:107EE000524FE114F10411F00C94824EE090C5045D |
:107EF000F090C6048091C7049091C804E80EF91E62 |
:107F0000F7FE02C00C94EC51F594E794F594E794D5 |
:107F1000F594E79480E490E0E80EF91ECB01BA01F5 |
:107F2000A20191010E94C55B80918E0490918F0403 |
:107F3000AA2797FDA095BA2F281B390B4A0B5B0B7C |
:107F4000245E3D4F4F4F5F4FCA01B90128E631E033 |
:107F500040E050E00E94C55B645B7040A69EC0019B |
:107F6000A79E900DB69E900D1124B7010E94905BC4 |
:107F70009801220F331F200F311F2617370714F4E3 |
:107F80000C94694E309521953F4F6217730714F496 |
:107F90000C94694E9B01442737FD4095542F8091E6 |
:107FA000800490918104A0918204B0918304820F97 |
:107FB000931FA41FB51F8093800490938104A09306 |
:107FC0008204B09383048FC380919F048D3808F49A |
:107FD0008BCC1092920480917B0822E3829FC00197 |
:107FE00011249093EE048093ED04EB85FC85B99702 |
:107FF0008CF08091A804882369F08091C904909145 |
:10800000CA04FFEF8F3F9F0779F001969093CA044F |
:108010008093C9048091C9049091CA048F3F91054F |
:1080200009F010F40C940D4E8091CB048260809383 |
:10803000CB0420916208E22FFF27EE0FFF1FE25DC5 |
:10804000F74F80819181813591050CF4D1C08091E9 |
:10805000A804882309F0CCC080916308E82FFF278B |
:10806000EE0FFF1FE25DF74F808191818C34910507 |
:1080700014F40C94624F8091EC048F5F8093EC04B5 |
:10808000893C08F4B5C03C3010F00C943F5329985B |
:108090001092A8041092EC041092CA041092C90421 |
:1080A00080916008482F5527440F551FFA01E25D63 |
:1080B000F74F808191818734910514F00C943B53E4 |
:1080C00080916108E82FFF27EE0FFF1FE25DF74F59 |
:1080D0000190F081E02DF7FF02C00C94B553E73416 |
:1080E000F1050CF45CC0A82FBB27AA0FBB1F9D0194 |
:1080F000225D374FF90180819181873491052CF001 |
:10810000FA01E25DF74F80819181F90180819181CF |
:108110008734910514F40C945553FA01E25DF74F3E |
:10812000808191818734910514F40C94555322E099 |
:10813000FD01E25DF74F80819181863491054CF419 |
:10814000FA01E25DF74F80819181873491050CF04F |
:1081500023E0FD01E25DF74F808191818A5B9F4FB3 |
:108160004CF4FA01E25DF74F8081918187349105EB |
:108170000CF024E0A25DB74F8D919C918A5B9F4FDC |
:108180004CF4425D574FDA018D919C9186349105F4 |
:108190000CF425E0822F0E94B60380916108E82F3D |
:1081A000FF27EE0FFF1FE25DF74F8081918197FF60 |
:1081B00002C00C9492534E9714F00C941653E09115 |
:1081C0006008FF27EE0FFF1FE25DF74F808191816E |
:1081D0008A5B9F4F14F00C94165381E08093FB064A |
:1081E00088EE93E09093EF038093EE032091620872 |
:1081F000E22FFF27EE0FFF1FE25DF74F8081918195 |
:108200008B5A9F4F0CF070CB80916308C82EDD24F1 |
:10821000CC0CDD1CF601E25DF74F80819181855B1E |
:108220009F4F14F00C949A4E8091EB048F5F8093D3 |
:10823000EB04893C10F00C9423508EE298E0C80EB9 |
:10824000D91ED6018D919C918C34910514F40C9417 |
:108250009E4E8091EA048F5F8093EA04893C08F483 |
:1082600043CB1092A80488EC8093EA041092CA04CD |
:108270001092C90439CB0E945B3180916008E82ECE |
:10828000FF24EE0CFF1CF701E25DF74F20813181E6 |
:1082900080916F08882E9924F701EC5BF74F0190CD |
:1082A000F081E02D80917008682F77278091DC04A1 |
:1082B0009091DD04AC01440F551F480F591F289DB4 |
:1082C000C001299D900D389D900D1124480F591F14 |
:1082D00057FF02C00C94054E559547955595479507 |
:1082E000E69FC001E79F900DF69F900D1124480F67 |
:1082F000591F5093DD044093DC0480912305909135 |
:1083000024052091270530912805820F931F5A01DB |
:10831000A81AB90AB092A104A092A00480916108A1 |
:10832000082F1127000F111FF801E25DF74F208180 |
:108330003181F801EC5BF74F0190F081E02D8091E5 |
:10834000DA049091DB04AC01440F551F480F591F0C |
:10835000829EC001839E900D929E900D1124480F25 |
:10836000591F57FF02C00C94094E559547955595D6 |
:1083700047956E9FC0016F9F900D7E9F900D1124B9 |
:10838000480F591F5093DB044093DA048091250570 |
:10839000909126052091290530912A05820F931F7F |
:1083A0006A01C81AD90AD092A304C092A204E0912B |
:1083B0006308FF27EE0FFF1FE25DF74F8081918179 |
:1083C000909581959F4F9093A5048093A40483304A |
:1083D00091050CF452C102979093A5048093A404D4 |
:1083E000E0916208FF27EE0FFF1FE25DF74F60800C |
:1083F000718028E730E0620E731E7092A7046092CD |
:10840000A6046091B1037727882777FD8095982F80 |
:108410000E94D75A20E030E040E251E40E94785AAE |
:108420000E94BA5A609320093091B2033093ED084C |
:108430006093C6083093DD088091070780FF06C06F |
:1084400080912909813810F00C94E14A8091A604AA |
:108450009091A70497FF02C00C94794EB0916808E0 |
:10846000BCABB2FF02C01092ED082091A004309185 |
:10847000A1044091C5045091C604C90137FF02C050 |
:108480000C94764E959587959595879597FF02C0A4 |
:108490000C94714E481759070CF05DC7C90137FF9E |
:1084A00002C00C94B14E97FF02C00C94A64E959555 |
:1084B0008795959587959093C6048093C5048536D6 |
:1084C000910514F00C94D24A2091A2043091A30497 |
:1084D0004091C7045091C804C90137FF02C00C94F1 |
:1084E0007F4E959587959595879597FF02C00C943B |
:1084F0006C4E481759070CF035C7C90137FF02C049 |
:108500000C94AC4E97FF02C00C94A94E959587959C |
:10851000959587959093C8048093C70485369105F7 |
:1085200014F00C94CA4AE0919204EBABEE2341F0B4 |
:108530001092C6041092C5041092C8041092C70489 |
:10854000F801E25DF74F2081318180918808482F42 |
:1085500055274217530734F48091AB0882FF02C0BD |
:108560000C94C54AF801E25DF74F2081318180917A |
:1085700089083A01681A71082615370514F4109213 |
:10858000B304F801E25DF74F808191816627772778 |
:10859000641B750B8617970724F48091AB0883FD45 |
:1085A000F0C78091B404882379F0025D174FD80199 |
:1085B0002D913C91809189089927841B950B8217F6 |
:1085C000930714F40C94404EF701E25DF74F80815D |
:1085D00091814817590724F48091AB0880FDCDC7DD |
:1085E000A091B604AA2379F0F701E25DF74F20814C |
:1085F000318180918908FA01E81BF1092E173F07A4 |
:1086000014F40C943B4EF701E25DF74F80819181A9 |
:108610008617970724F48091AB0881FDAAC7809143 |
:10862000B504882399F03EE2632E38E0732EE60C01 |
:10863000F71CF70120813181809189089927841BDB |
:10864000950B8217930714F40C94374E8091B30462 |
:10865000882329F48091B404882309F487C7F1E0C2 |
:10866000F093B204AA2389F58091B504882369F5B3 |
:108670001092B1044CC92998CEC8EFEF8E3F9E07E7 |
:108680000CF498C71092A5041092A404A9CE1092DD |
:10869000A804109292043A3009F0E6C8289AE8C873 |
:1086A00080911103909112038F5F9F4F09F0CDC805 |
:1086B00088E99AE39093EF038093EE0380E09CE0D7 |
:1086C0009093120380931103C0C881E08093B1049A |
:1086D0001092B2041092B3041092B4041EC9C09058 |
:1086E0001B09D0901C098091E70481508093E70416 |
:1086F0008F3F09F481C59AAD992381F0109203054B |
:1087000010920405109205051092060510920705B7 |
:10871000109208051092090510920A05AE8DAA2341 |
:1087200009F4C2C41A86198688249924EDA9EE2377 |
:1087300009F4A5C418861F82662477244090C108D6 |
:108740005090C20829EC421651040CF489C498ECEC |
:10875000492E512C5092C2084092C1082090CC085A |
:108760003090CD0849EC241631040CF46AC408ECAE |
:10877000202E312C3092CD082092CC08E090200998 |
:10878000FF2400271127A090CE08B090CF08B50194 |
:10879000882777FD8095982FA80197010E94515B4B |
:1087A0009B01AC01B201882777FD8095982F660F59 |
:1087B000771F881F991F660F771F881F991F660FE5 |
:1087C000771F881F991F660F771F881F991F660FD5 |
:1087D000771F881F991F660F771F881F991F660FC5 |
:1087E000771F881F991F620F731F841F951F20E436 |
:1087F00030E040E050E00E94C55B5401A20EB31E81 |
:10880000B092CF08A092CE084090BF085090C00808 |
:108810009201442737FD4095542FC801B7010E94AB |
:10882000515B9B01AC01B101882777FD8095982FA2 |
:10883000660F771F881F991F660F771F881F991F64 |
:10884000660F771F881F991F660F771F881F991F54 |
:10885000660F771F881F991F660F771F881F991F44 |
:10886000660F771F881F991F620F731F841F951F44 |
:1088700020E430E040E050E00E94C55B2301420E5E |
:10888000531E5092C0084092BF08CC0CDD1CB601AC |
:10889000882777FD8095982F2091C6083327442795 |
:1088A00055270E94515B20E430E040E050E00E94F8 |
:1088B000C55B79018A016091DD08772788279927B0 |
:1088C00020916C0430916D0440916E0450916F04BE |
:1088D0000E94515B20EF35E540E050E00E94C55B0F |
:1088E0006701C20ED31ED0921C09C0921B0961E021 |
:1088F000A61660E4B6060CF496C3A12C20E4B22EB2 |
:10890000B092CF08A092CE0881E0481680E45806C5 |
:108910000CF47BC3412C80E4582E5092C008409246 |
:10892000BF08A1E0CA16A0E4DA060CF460C3C12CAB |
:1089300010E4D12ED0921C09C0921B0980913404FE |
:108940008823C9F08091C9049091CA040297C09706 |
:1089500090F4EB85FC851E161F066CF481E090E018 |
:108960009093CA048093C9047090D308872C9924EB |
:108970009C868B8602C07090D308EB84FC84EE0C3E |
:10898000FF1CEE0CFF1C9CA8892D992780FFD6C0E8 |
:1089900081FF14C08091AC03823310F00C94F24D2F |
:1089A0008091C20381508093C2038F3F11F40C94D5 |
:1089B000B4502091A9043091AA041FC08091AC0347 |
:1089C0002091BB033091BC03280F311D80916D08AD |
:1089D0009927AC01249FC001259F900D349F900DD5 |
:1089E000112444979093AC048093AB0481E080936E |
:1089F00093042091A9043091AA045BA9552321F086 |
:108A00001092AC041092AB044091AB045091AC04B2 |
:108A1000421753070CF092C080919304882309F405 |
:108A20008DC0241B350B8091AD039927BC01269F77 |
:108A3000C001279F900D369F900D112497FF02C013 |
:108A40000C94205195958795959587959701281BAE |
:108A5000390B809115049091160497FF02C00C9475 |
:108A60002751959587958901081B190B60918804FA |
:108A70007091890480918A0490918B0420E830E001 |
:108A800040E050E00E94C55BCA01B9012091AE03ED |
:108A90003327442755270E94515B20E230E040E015 |
:108AA00050E00E94C55B7EEF283E370714F428EEA5 |
:108AB0003EEF81E02931380714F028E131E0A801C8 |
:108AC000421B530B8091E8049091E9049C01220F12 |
:108AD000331F280F391FC901880F991F880F991F4D |
:108AE000280F391F420F531F57FF02C00C94235108 |
:108AF0009A0135952795359527953595279535957F |
:108B000027953093E9042093E80480916908992718 |
:108B1000880F991F880F991F2817390714F00C9494 |
:108B2000934EE816F90614F00C941D50F092E904E7 |
:108B3000E092E804E090E804F090E90480911A09DA |
:108B4000A82FBB27B88BAF87AD01440F551F440F2B |
:108B5000551FCA0180559040FC82EB828E159F05FF |
:108B600014F49C838B83EB81FC81F093B107E09339 |
:108B7000B00769897A898B899C89660F771F881F5E |
:108B8000991F660F771F881F991F9601261B370BA9 |
:108B9000E13AF1050CF41EC2DF01B595A795B901C4 |
:108BA000A217B3070CF4BD01222733272A1B3B0B66 |
:108BB000261737070CF49B01CA01AB81BC818A1BC5 |
:108BC0009B0B821793070CF49C01EB80FC80E41A4A |
:108BD000F50AE216F3060CF479018091A004909155 |
:108BE000A1048501081B190B1093DF080093DE0810 |
:108BF000BBADBB2309F4D4C1E985FA85E81BF90BA9 |
:108C0000CF01AA2797FDA095BA2F20910705309193 |
:108C100008054091090550910A05280F391F4A1F80 |
:108C20005B1F209307053093080540930905509377 |
:108C30000A052130FAEF3F07F0E04F07F0E05F0749 |
:108C40000CF498C120E03AEF40E050E02093070593 |
:108C5000309308054093090550930A058091A903B4 |
:108C60009091AA035C01CC24B7FCC094DC2CCA010F |
:108C7000B901A60195010E94C55B020F131F8091E7 |
:108C8000BA03682F7727882799279701F7FC69C4CB |
:108C900037FD64C435952795AB81BC812A0F3B1FF6 |
:108CA000442737FD4095542F0E94515B20E430E06B |
:108CB00040E050E00E94C55B1901B8012017310760 |
:108CC0000CF4B901002711270219130948010617EE |
:108CD00017070CF48B018091A2049091A304481A09 |
:108CE000590A5092BE084092BD08BBADBB2309F49F |
:108CF00027C1EF81F885E81BF90BCF01AA2797FD63 |
:108D0000A095BA2F209103053091040540910505E7 |
:108D100050910605280F391F4A1F5B1F209303053A |
:108D20003093040540930505509306052130FAEF72 |
:108D30003F07F0E04F07F0E05F070CF4EBC020E0E6 |
:108D40003AEF40E050E02093030530930405409350 |
:108D5000050550930605CA01B901A60195010E94B7 |
:108D6000C55B240D351DF101221533050CF4F90105 |
:108D7000B4018E169F060CF4BF01872D99279A83A4 |
:108D80008983ADE5B5E0BDAFACAFEDE0F9E0FE83C2 |
:108D9000ED833EEE232E38E0332E3701882477FC16 |
:108DA0008094982C6FA278A689A69AA69B01442746 |
:108DB00037FD4095542F2BA73CA74DA75EA7A801D0 |
:108DC000662757FD6095762F4FA758AB69AB7AABF6 |
:108DD0008EC0F1010190F081E02DFE87ED87FD014D |
:108DE0002381332727FD3095432F532F6FA178A57B |
:108DF00089A59AA50E94515B20E430E040E050E054 |
:108E00000E94C55B39014A01ECADFDAD22813327DB |
:108E100027FD3095432F532F6BA57CA58DA59EA5CF |
:108E20000E94515B20E430E040E050E00E94C55BCE |
:108E300059016A01ECADFDAD2181332727FD309545 |
:108E4000432F532F6FA578A989A99AA90E94515B36 |
:108E500020E430E040E050E00E94C55B79018A01E7 |
:108E60002B813C81B901882777FD8095982F242D8F |
:108E7000332727FD3095432F532F0E94515B20E469 |
:108E800030E040E050E00E94C55BE20EF31EEA0CC9 |
:108E9000FB1CE60CF71C6D857E85C7010E94A2288D |
:108EA000D1018D939C9397FD33C0959587959595AA |
:108EB0008795E981FA818E179F071CF59F01AD8187 |
:108EC000BE812C932CAD3DAD2C5F3F4F3DAF2CAF01 |
:108ED0004D815E814F5F5F4F5E834D8362E070E046 |
:108EE000260E371E2D58354011F40C94C353ACADEB |
:108EF000BDAD4C9014140CF46CCFED81FE8110824A |
:108F0000E1CF2F85388982179307CCF69C01D7CF04 |
:108F10000396CBCF203066E036076FEF46076FEF42 |
:108F200056070CF018CF20E036E04FEF5FEF2093AC |
:108F300003053093040540930505509306050BCFB8 |
:108F4000C201AA2797FDA095BA2F20910305309161 |
:108F500004054091050550910605280F391F4A1F49 |
:108F60005B1F209303053093040540930505509340 |
:108F70000605DCCE203066E036076FEF46076FEF60 |
:108F800056070CF06BCE20E036E04FEF5FEF2093FA |
:108F90000705309308054093090550930A055ECEF6 |
:108FA000C801AA2797FDA095BA2F209107053091F7 |
:108FB00008054091090550910A05280F391F4A1FDD |
:108FC0005B1F2093070530930805409309055093D4 |
:108FD0000A052FCE7FEF203B370714F420EB3FEF3D |
:108FE000213531050CF4E8CD20E530E0E5CDB0E0E9 |
:108FF000CB16B0ECDB060CF0A1CCC12CB0ECDB2E18 |
:10900000D0921C09C0921B0999CC90E0491690ECB3 |
:1090100059060CF086CC412C00EC502E5092C00822 |
:109020004092BF087ECC70E0A71670ECB7060CF03B |
:109030006BCCA12C90ECB92EB092CF08A092CE08A8 |
:1090400063CC58E325165FEF35060CF097CB18E399 |
:10905000212E1FEF312E3092CD082092CC088ECBDE |
:1090600038E343163FEF53060CF078CB88E3482EE5 |
:109070008FEF582E5092C2084092C1086FCBFBADC3 |
:109080002F2F3327442755276F8D78A189A19AA1C7 |
:109090000E94515B28EF3AE240E050E00E94C55B3D |
:1090A00038872F8339014ACBBBAD2B2F3327442779 |
:1090B00055276BA17CA18DA19EA10E94515B28EF39 |
:1090C0003AE240E050E00E94C55B3A8729874901B7 |
:1090D0002DCB1092600410926104109262041092E1 |
:1090E0006304109264041092650410926604109256 |
:1090F00067041092E0081092E1081092E2081092C2 |
:10910000E3081092E7081092E8081092E90810921C |
:10911000EA081092D5081092D6081092D70810923B |
:10912000D8081092C7081092C8081092C908109267 |
:10913000CA088091700490917104A0917204B0915A |
:1091400073048093740490937504A0937604B09391 |
:1091500077048091780490917904A0917A04B09179 |
:109160007B0480937C0490937D04A0937E04B09351 |
:109170007F0410921804109217041092B0041092F9 |
:10918000AF041092AE041092AD049090B2049DAA68 |
:1091900080911704909118048F3F910519F010F0F9 |
:1091A0000C94B73D909194049AAFA091ED08ABAFA9 |
:1091B000A090A404B090A5049501B7FC02C00C9443 |
:1091C000443E222733272A193B090C94443E805BF6 |
:1091D0009C43AF4FBF4F14F00C94BF3E80EB9CE319 |
:1091E000AFEFBFEF8093800490938104A09382043B |
:1091F000B09383040C94BF3E88E18093E704E09031 |
:109200007408FF24EE0CFF1CEE0CFF1C0027F7FC7B |
:109210000095102F6BA17CA18DA19EA1A8019701A3 |
:109220000E94C55B3093A3072093A2076F8D78A19E |
:1092300089A19AA1A80197010E94C55B3093A50757 |
:109240002093A40780910A0990910B0997FD7CC592 |
:1092500095958795959587959093A7078093A607F1 |
:10926000809126099091270997FD6CC59595879562 |
:10927000959587959093A9078093A807D092AB07FF |
:10928000C092AA072091A9043091AA043093AD0797 |
:109290002093AC078091E6079091E7079093AF0782 |
:1092A0008093AE077092B3076092B2078091180363 |
:1092B000909119039093B5078093B40760912209A8 |
:1092C0007091230980912409909125092091BD0373 |
:1092D0003091BE034091BF035091C0030E94C55B13 |
:1092E0003093B9072093B80780919F0499279093F2 |
:1092F000B7078093B6078091FB0699279093C9071B |
:109300008093C8078091F2039091F3039093CB0769 |
:109310008093CA0780918C09992787FD9095909337 |
:10932000D9078093D80780918E0999279093DD07FC |
:109330008093DC0780912305909124059093DF07AB |
:109340008093DE0780912505909126059093E10793 |
:109350008093E007D0C9415050405093C6044093D9 |
:10936000C504B2C8415050405093C8044093C7044C |
:10937000DAC88091E6079091E707815092400CF49B |
:109380003DC480918B098F3F09F4F0C4E0907408CC |
:10939000FF2400271127A82EBB24A7FCB094CB2CB8 |
:1093A000DB2C6BA17CA18DA19EA1A80197010E943D |
:1093B000C55B80910A0990910B09AA2797FDA0959A |
:1093C000BA2F281B390B4A0B5B0BCA01B901A60146 |
:1093D00095010E94515B20E032E040E050E00E94A5 |
:1093E000C55B19012A016F8D78A189A19AA1A801F5 |
:1093F00097010E94C55B8091260990912709AA27B1 |
:1094000097FDA095BA2F281B390B4A0B5B0BCA019D |
:10941000B901A60195010E94515B20E032E040E0D5 |
:1094200050E00E94C55B39014A018091C5049091CA |
:10943000C604813491050CF037C48091C704909123 |
:10944000C804813491050CF02FC4E0916308FF2714 |
:10945000EE0FFF1FE25DF74F0190F081E02DF7FD69 |
:10946000EBC67A97A4F0C201B10123E030E040E0FE |
:1094700050E00E94C55B19012A01C401B30123E039 |
:1094800030E040E050E00E94C55B39014A01809124 |
:109490008D09E82EFF24E7FCF0940F2D1F2DA2016B |
:1094A0009101E214F3040405150514F4A8019701D1 |
:1094B000992787FD9095909581959F4F5C01CC24CD |
:1094C000B7FCC094DC2C19012A012A153B054C0578 |
:1094D0005D0514F415012601A4019301E614F704B7 |
:1094E0000805190514F4A80197012A153B054C0538 |
:1094F0005D0514F059016A01809170049091710426 |
:10950000A0917204B091730482199309A409B5095A |
:109510008093700490937104A0937204B0937304C9 |
:109520008091780490917904A0917A04B0917B04A1 |
:109530008A199B09AC09BD0980937804909379043A |
:10954000A0937A04B0937B040C94AD3D1092A804D0 |
:109550000C94743C2D5F3F4F0C947E3E2F5F3F4F29 |
:1095600099CB222733272E193F0992CB1092B204B0 |
:1095700079C881E08093B50469C8A1E0A093B604DE |
:1095800042C881E08093B4041FC881E08093B30493 |
:109590000C94C14284E690E09093C8048093C70481 |
:1095A0000C94934284E690E09093C6048093C504A3 |
:1095B0000C94644202969093A5048093A4040C94A6 |
:1095C000F04180910007992787FD9095AC01849E1A |
:1095D000C001859E900D949E900D1124A80EB91E79 |
:1095E000B092A104A092A00480910107992787FD61 |
:1095F0009095BC01869EC001879E900D969E900D11 |
:109600001124C80ED91ED092A304C092A2042091A6 |
:109610000207332727FD30958091A4049091A5047B |
:10962000820F931F9093A5048093A40420910407B4 |
:10963000332727FD309580916D089927DC012A9FFB |
:10964000C0012B9F900D3A9F900D11249093BC0365 |
:109650008093BB038091030799278615970514F023 |
:109660000C9426429093A7048093A6040C9426425F |
:10967000809194048AAF882311F00C94BF3D90919F |
:1096800090089D8B992311F40C94BF3D6090E008E5 |
:109690007090E1088090E2089090E308C401B30163 |
:1096A00020E031E040E050E00E94C55B2EAB3FABD4 |
:1096B00048AF59AF2093E0083093E1084093E208A7 |
:1096C0005093E3082090E7083090E8084090E908BC |
:1096D0005090EA08C201B10120E031E040E050E0E2 |
:1096E0000E94C55B19012A012093E7083093E8081E |
:1096F0004093E9085093EA08E0907408FF2400279B |
:1097000011272091600430916104409162045091CE |
:109710006304C801B7010E94515B20E031E040E0E2 |
:1097200050E00E94C55B59016A01209360043093A8 |
:109730006104409362045093630420916404309167 |
:1097400065044091660450916704C801B7010E9406 |
:10975000515B20E031E040E050E00E94C55B390100 |
:109760004A01209364043093650440936604509347 |
:109770006704609168047091690480916A04909113 |
:109780006B0420E031E040E050E00E94C55B209394 |
:1097900068043093690440936A0450936B04E0902A |
:1097A0008F08FF24002711276EA97FA988AD99ADE6 |
:1097B0006A197B098C099D09A80197010E94C55B64 |
:1097C0002093E2043093E3044093E4045093E504CF |
:1097D000CA01B90120E031E040E050E00E94C55BE1 |
:1097E00069013093B0042093AF04C201B10166193E |
:1097F000770988099909A80197010E94C55BCA01E8 |
:10980000B90120E031E040E050E00E94C55BB901C1 |
:109810003093AE042093AD048091C5049091C604AA |
:1098200081349105ACF48091C7049091C8048134CF |
:10983000910574F4E0916308FF27EE0FFF1FE25DCE |
:10984000F74F0190F081E02DF7FD85C77A972CF056 |
:1098500080918B098F3F09F415C76091D5087091ED |
:10986000D6088091D7089091D80820E031E040E0F8 |
:1098700050E00E94C55B2093D5083093D6084093F2 |
:10988000D7085093D8086091C7087091C808809194 |
:10989000C9089091CA0820E031E040E050E00E9401 |
:1098A000C55B2093C7083093C8084093C9085093FC |
:1098B000CA08EA8CFB8C0C8D1D8D2BA13CA14DA1FF |
:1098C0005EA1E21AF30A040B150BE092FB04F0927E |
:1098D000FC040093FD041093FE04AE88BF88C88C7E |
:1098E000D98C4F8D58A169A17AA1A41AB50AC60ACC |
:1098F000D70AA092F704B092F804C092F904D0926B |
:10990000FA04E092F304F092F4040093F504109347 |
:10991000F604A092EF04B092F004C092F104D09249 |
:10992000F2048091740490917504A0917604B09132 |
:1099300077048E199F09A00BB10B80937404909348 |
:109940007504A0937604B093770480917C04909181 |
:109950007D04A0917E04B0917F048A199B09AC0913 |
:10996000BD0980937C0490937D04A0937E04B09302 |
:109970007F048091950490919604813891050CF4B0 |
:1099800078C580913E0490913F04019690933F04E6 |
:1099900080933E048091EB089091EC08019690939F |
:1099A000EC088093EB08109296041092950461E005 |
:1099B00070E07093D9046093D804A801970117FD53 |
:1099C00088C6213072E0370770E0470770E057071C |
:1099D00034F084E090E09093D9048093D80480918F |
:1099E000D0049091D104A091D204B091D3046EA878 |
:1099F0007FA888AC99AC86199709A809B909815E36 |
:109A0000914BAF4FBF4F8F539C49A040B04008F4DB |
:109A100081C470908C0978E177150CF47DC41DAE7B |
:109A20001CAE1092D9041092D80488EE93E0909363 |
:109A3000A00380939F03FD898F2E99242CAD3DAD0B |
:109A40008216930624F49092D9048092D804772049 |
:109A500079F0272D332727FD30958091D8049091F8 |
:109A6000D9042817390724F43093D9042093D80453 |
:109A700031E8E316F104010511050CF4E1C480910D |
:109A80003A0490913B042091D8043091D904820F7C |
:109A9000931F90933B0480933A0461E070E07093CD |
:109AA000D9046093D804A6019501D7FC1AC62130C9 |
:109AB00072E0370770E0470770E0570734F084E042 |
:109AC00090E09093D9048093D8041092DE04109211 |
:109AD000DF041092E0041092E1048091CC04909194 |
:109AE000CD04A091CE04B091CF0482199309A409AA |
:109AF000B509815E914BAF4FBF4F8F539C49A0403A |
:109B0000B04008F4A7C3F8E1F7150CF4A3C31DAEE9 |
:109B10001CAE1092D9041092D80488EE93E0909372 |
:109B2000A00380939F032CAD3DAD8216930624F4D1 |
:109B30009092D9048092D804772079F0272D33278A |
:109B400027FD30958091D8049091D90428173907C2 |
:109B500024F43093D9042093D80431E8A316B10437 |
:109B6000C104D1040CF451C480913C0490913D0493 |
:109B70002091D8043091D904820F931F90933D0413 |
:109B800080933C040C94DE3D6CE172E0660E771E1F |
:109B900073010027F7FC0095102F84EE9DEF680EEF |
:109BA000791EC501B401A20191010E94C55BE21AB0 |
:109BB000F30A040B150BC801B70128E631E040E0B9 |
:109BC00050E00E94C55B645B70408B01000F111F69 |
:109BD000000F111F000F111F0C94113F9DAF8CAF90 |
:109BE0000C94EF3E81E08093930488EC8093C20351 |
:109BF0002091A9043091AA040C94FD448091A804FA |
:109C0000882311F40C94AD3DBCCB4D5F5F4F0C9499 |
:109C10006C414D5F5F4F0C94B54110920705109257 |
:109C200008051092090510920A051092030510927A |
:109C3000040510920505109206058A3F910511F062 |
:109C40000C94194081E08093E6041092FF04109276 |
:109C500000051092010510920205109280041092E6 |
:109C6000810410928204109283040C941940109283 |
:109C7000B5040C942643A0E01092B6040C94034360 |
:109C80001092B4040C94E442882799278C199D09FA |
:109C90000C94083F909581959F4F0C94E83E109549 |
:109CA00001951F4F0C94D93EC201B10122E030E072 |
:109CB00040E050E00E94C55B19012A01C401B301D4 |
:109CC00022E030E040E050E00E94C55B39014A01EB |
:109CD000BCCBB9010C94CA3F909581959F4F0C94D1 |
:109CE0007942909581959F4F0C944A4203960C942B |
:109CF00042421092A7041092A6040C942E4203969E |
:109D00000C9471420894E108F108F092A003E092EB |
:109D10009F030C9473438091B104882311F40C9435 |
:109D20009A3C0C948D3CE216F30614F00C949A4580 |
:109D30000C9496451092EB040C941D411092EA0489 |
:109D40000C94743C039692CA039682CA03960C94B0 |
:109D5000574203960C948642909581959F4F0C94A0 |
:109D60008242909581959F4F0C945342E0907408E5 |
:109D7000FF24002711276BA17CA18DA19EA1A80122 |
:109D800097010E94C55B59016A0180910A0990916F |
:109D90000B09AA2797FDA095BA2FA81AB90ACA0AD3 |
:109DA000DB0A6F8D78A189A19AA1A80197010E9471 |
:109DB000C55B79018A018091260990912709AA271C |
:109DC00097FDA095BA2FE81AF90A0A0B1B0BC601DA |
:109DD000B50120E130E040E050E00E94C55B190190 |
:109DE0002A01C801B70120E130E040E050E00E94C4 |
:109DF000C55B59016A018091C5049091C604813404 |
:109E000091050CF4A8C1C201B10123E030E040E0AB |
:109E100050E00E94C55B19012A01C601B50123E08B |
:109E200030E040E050E00E94C55B59016A01E091DA |
:109E30006308FF27EE0FFF1FE25DF74F0190F081EF |
:109E4000E02DF7FDEFC37A97A4F0C201B10123E042 |
:109E500030E040E050E00E94C55B19012A01C601D4 |
:109E6000B50123E030E040E050E00E94C55B5901BD |
:109E70006A0121E222163104410451040CF4AFC1FD |
:109E800080E2282E312C412C512C41E2A416B10441 |
:109E9000C104D1040CF490C110E2A12EB12CC12C4C |
:109EA000D12C2ACB84EF91E09093A00380939F0361 |
:109EB0000C947343215E3F4F0C94603F695F7F4F6A |
:109EC0000C94323F80819181855B9F4F0CF0E8C2FA |
:109ED0008091EC048F5F8093EC04893C10F40C9427 |
:109EE000F8403C3008F01CC429988FEF04E010E0E3 |
:109EF000D801082E0E94ED5B1092A8041092EC0489 |
:109F00001092CA041092C9040E943B378091440405 |
:109F10009091450497FD34C4892F990F990BD8016E |
:109F2000082E0E94ED5B809144049091450460E00E |
:109F300071E00E94905B0F5F1F4FD801082E0E94B6 |
:109F4000ED5B01501040209146043091470437FDED |
:109F500014C4832F992787FD9A950E5F1F4FD80150 |
:109F6000082E0E94ED5B809146049091470460E0CA |
:109F700071E00E94905B0F5F1F4FD801082E0E9476 |
:109F8000ED5B0350104060914A0470914B04809146 |
:109F90004C0490914D040E94BA5A9B0177FDEAC38C |
:109FA000832F992787FD9A950C5F1F4FD801082EA4 |
:109FB0000E94ED5B60914A0470914B0480914C04C7 |
:109FC00090914D040E94BA5ADC01CB0160E071E02F |
:109FD0000E94905B0F5F1F4FD801082E0E94ED5B1F |
:109FE0000E94C2030E94BA39209162080C94F84082 |
:109FF00088EC90E09093EF038093EE039301442765 |
:10A0000037FD4095542FC201B1010E94515B4B01B5 |
:10A010005C01609322097093230980932409909333 |
:10A020002509A20191010E94C55B30938F04209302 |
:10A030008E041092E6040C942C3F9093E9048093D4 |
:10A04000E8040C949A4588EC8093EB0481E090E05E |
:10A050009093CA048093C90481E08093A80410926D |
:10A06000FF04109200051092010510920205109253 |
:10A070008004109281041092820410928304109242 |
:10A080008404109285041092860410928704E09054 |
:10A090007408FF240027112720910A0930910B0929 |
:10A0A000442737FD4095542FC801B7010E94515BEA |
:10A0B000609370047093710480937204909373049E |
:10A0C0002091260930912709442737FD4095542FC8 |
:10A0D000C801B7010E94515B6093780470937904C2 |
:10A0E00080937A0490937B04809150049091510462 |
:10A0F000A0915204B091530480937404909375041A |
:10A10000A0937604B09377048091580490915904F9 |
:10A11000A0915A04B0915B0480937C0490937D04D9 |
:10A12000A0937E04B0937F04109207051092080557 |
:10A130001092090510920A05109203051092040569 |
:10A1400010920505109206058091CB0488608093DB |
:10A15000CB040C941D418091C7049091C8048134B4 |
:10A1600091050CF464CE4FCE80912203909123038D |
:10A17000895E934008F446C087B58E3F08F042C020 |
:10A1800087B5843F08F0C6C2909114049A5090930A |
:10A1900014048091F107891B87BD8CE291E09093B4 |
:10A1A000EF038093EE038AEF8093C2032091A9040A |
:10A1B0003091AA040C94FD4450EEA5165FEFB5064D |
:10A1C0005FEFC5065FEFD5060CF096C9B0EEAB2E7B |
:10A1D000BFEFBB2EBFEFCB2EBFEFDB2E8DC930EE16 |
:10A1E00023163FEF33063FEF43063FEF53060CF0D5 |
:10A1F0004CCE00EE202E0FEF302E0FEF402E0FEF43 |
:10A20000502E43CE809122039091230384369105F2 |
:10A2100008F0E8C087B5823008F4E4C087B58B3019 |
:10A2200008F47BC290911404965F9093140480917B |
:10A23000F107891B87BDB1CFF095E195FF4F11C99B |
:10A2400003960C942245415F5F4F0C94784501962C |
:10A250000C94314561E0A61660E1B60660E0C606E2 |
:10A2600060E0D6060CF47FC18091D504882309F400 |
:10A2700026C2CA01B90120E032E040E050E00E946D |
:10A28000C55B8091D8049091D904820F931F9DAF34 |
:10A290008CAF9093D9048093D804D601C50103E014 |
:10A2A000B595A795979587950A95D1F78093DE0484 |
:10A2B0009093DF04A093E004B093E10489589341A4 |
:10A2C000A040B04064F088E893E1A0E0B0E0809363 |
:10A2D000DE049093DF04A093E004B093E104609166 |
:10A2E000DE047091DF048091E0049091E10420E0AD |
:10A2F00031E040E050E00E94C55B8091AD04909158 |
:10A30000AE04820F931F9093AE048093AD0410921D |
:10A31000D40409CC70908C0981E0E81680E1F8063D |
:10A3200080E0080780E018070CF4BEC08091D704D5 |
:10A33000882309F4E5C1CA01B90120E032E040E018 |
:10A3400050E00E94C55BA091D804B091D904A20F3F |
:10A35000B31FBDAFACAFB093D904A093D804D8015C |
:10A36000C70123E0B595A795979587952A95D1F7CD |
:10A370008093E2049093E304A093E404B093E50493 |
:10A3800089589341A040B04064F088E893E1A0E090 |
:10A39000B0E08093E2049093E304A093E404B093CC |
:10A3A000E5046091E2047091E3048091E4049091EB |
:10A3B000E50420E031E040E050E00E94C55B809180 |
:10A3C000AF049091B004820F931F9093B0048093D8 |
:10A3D000AF041092D6042FCB27E030E0E20EF31E3C |
:10A3E0000C94843F2091A9043091AA042451304058 |
:10A3F0003093AC042093AB042C5E3F4F1092930437 |
:10A4000081E08093C2030C94FD4440E8A4164FEF12 |
:10A41000B4064FEFC4064FEFD40614F00C94DE3DA3 |
:10A4200080913C0490913D042091D8043091D9044E |
:10A43000821B930B90933D0480933C040C94DE3D6F |
:10A4400040E8E4164FEFF4064FEF04074FEF140710 |
:10A450000CF023CB80913A0490913B042091D804D6 |
:10A460003091D904821B930B90933B0480933A0460 |
:10A4700014CB80589F4F0CF096CA80913E04909167 |
:10A480003F04019790933F0480933E048091EB0832 |
:10A490009091EC0801979093EC088093EB0883CAA5 |
:10A4A0001092EC040C94F8401092D70460E0E61689 |
:10A4B00060EFF6066FEF06076FEF16070CF019C195 |
:10A4C0008091D604882309F43CC1CA01B90120E077 |
:10A4D00032E040E050E00E94C55B8091D80490914A |
:10A4E000D904820F931F9DAF8CAF9093D9048093B2 |
:10A4F000D804C801B70128E030E040E050E00E94F5 |
:10A50000C55B2093E2043093E3044093E40450934A |
:10A51000E50428573C4E4F4F5F4F64F488E79CEEAC |
:10A52000AFEFBFEF8093E2049093E304A093E404C1 |
:10A53000B093E5046091E2047091E3048091E40437 |
:10A540009091E50420E031E040E050E00E94C55BDE |
:10A550008091AF049091B004820F931F9093B00448 |
:10A560008093AF0468CA1092D50460E0A61660EF2D |
:10A57000B6066FEFC6066FEFD6060CF099C0809155 |
:10A58000D404882309F4D3C0CA01B90120E032E021 |
:10A5900040E050E00E94C55B8091D8049091D904BE |
:10A5A000820F931F9DAF8CAF9093D9048093D804F2 |
:10A5B000C601B50128E030E040E050E00E94C55BF4 |
:10A5C0002093DE043093DF044093E0045093E104D1 |
:10A5D00028573C4E4F4F5F4F64F488E79CEEAFEF37 |
:10A5E000BFEF8093DE049093DF04A093E004B09368 |
:10A5F000E1046091DE047091DF048091E0049091A9 |
:10A60000E10420E031E040E050E00E94C55B809131 |
:10A61000AD049091AE04820F931F9093AE0480938B |
:10A62000AD0481CAF095E195FF4F0DCC0E94C203A5 |
:10A630004DE560E678E00E9440048091680880FF64 |
:10A6400010C08091220390912303875B934038F4DC |
:10A6500080912203909123038E5E924010F40E9419 |
:10A660005D1E0E943B370E94C2030E94BA392091AE |
:10A6700062080C94F840809161080C947340299A08 |
:10A680000C9448409601D7FC6DC0359527953093C2 |
:10A69000B0042093AF049B0177FD61C035952795E9 |
:10A6A0003093AE042093AD04D8C821E00C949840B8 |
:10A6B000E091D804F091D904FDAFECAF28CE81E051 |
:10A6C0008093D5042091D8043091D9043DAF2CAFAC |
:10A6D0001ECE22273327A9012E193F09400B510B0B |
:10A6E00070C922273327A9012A193B094C095D09A2 |
:10A6F000DEC9E091D804F091D904FDAFECAF69CE8A |
:10A7000081E08093D7048090D8049090D9049DAEC6 |
:10A710008CAE5FCE8EEF87BD40CD81E087BD3DCD55 |
:10A72000299AE3CB909581959F4F0C94DB4081E073 |
:10A730008093D404A091D804B091D904BDAFACAF3C |
:10A74000F2C981E08093D604A091D804B091D904D5 |
:10A75000BDAFACAF70C9F095E195FF4F77C82F5FE3 |
:10A760003F4F9CCF2F5F3F4F90CFF095E195FF4F2C |
:10A770000C946F4021503F4F13CC21503F4FE9CBF9 |
:10A7800081509F4FC9CBED960FB6F894DEBF0FBE38 |
:10A79000CDBFDF91CF911F910F91FF90EF90DF9090 |
:10A7A000CF90BF90AF909F908F907F906F905F9071 |
:10A7B0004F903F902F90089580912B0590912C05FC |
:10A7C000A0912D05B0912E0580933305909334050B |
:10A7D000A0933505B093360580912F0590913005F3 |
:10A7E000A0913105B09132058093370590933805DB |
:10A7F000A0933905B0933A0508951092240510925C |
:10A8000023051092260510922505089584B1806ACB |
:10A8100084B93D9A82E58CBD1DBC459A81E0809348 |
:10A820002C098AEA8093300983E8809331098AE011 |
:10A83000809332091092340910923309109236092C |
:10A840001092350910928E091092520910925309F4 |
:10A850008AE48093540983E08093550986E08093CD |
:10A8600056090895EF92FF920F931F93F894E0908A |
:10A870007408FF24EE0CFF1CEE0CFF1C0027F7FCF5 |
:10A880000095102F609150047091510480915204F2 |
:10A8900090915304A80197010E94C55B309334093D |
:10A8A00020933309609158047091590480915A049F |
:10A8B00090915B04A80197010E94C55B3093360913 |
:10A8C0002093350960912209709123098091240910 |
:10A8D000909125092AE030E040E050E00E94515B71 |
:10A8E0002091BD033091BE034091BF035091C0033E |
:10A8F0000E94C55B30933C0920933B09E0914804DA |
:10A90000F09149048091E4089091E508BF010E940C |
:10A91000905BCB01880F991F860F971F9C01220F18 |
:10A92000331F96FD2BC13595279535952795309387 |
:10A9300038092093370980911E0990911F09BF01A2 |
:10A940000E94905BCB01880F991F860F971F9C0177 |
:10A95000220F331F96FD0FC1359527953595279505 |
:10A9600030933A092093390910924904109248040F |
:10A970001092E5081092E40810921F0910921E0927 |
:10A98000809132098C3009F4D4C08D3008F459C05C |
:10A990008D3009F473C18E3009F420C17894809110 |
:10A9A0005209882309F4BCC02091580930915909F3 |
:10A9B000C90181509E4F8F5F934058F440915A09CE |
:10A9C00050915B09CA0181509E4F8F5F934008F4FC |
:10A9D000F5C080915E0990915F0921E08936920768 |
:10A9E00024F490938D0480938C0480918C04909136 |
:10A9F0008D0420918E0430918F04821B930B845E12 |
:10AA00009D4F68E671E00E94905B845B904090935C |
:10AA100091048093900420916209309163098091A0 |
:10AA2000EE039091EF038217930728F48091FB06C1 |
:10AA3000882309F4A9C080915709873609F067C1B6 |
:10AA4000ACC08A3009F4DFC08B3009F0A7CFE091A9 |
:10AA50006208FF27EE0FFF1FE25DF74F0190F081C4 |
:10AA6000E02D2FEFE138F2070CF44EC1E038F1058C |
:10AA70000CF047C1E0934309E0916308FF27EE0F14 |
:10AA8000FF1FE25DF74F0190F081E02D4FEFE138BD |
:10AA9000F4070CF433C1E038F1050CF02CC1E0935D |
:10AAA0004409E0916108FF27EE0FFF1FE25DF74FB9 |
:10AAB0000190F081E02D6FEFE138F6070CF418C13A |
:10AAC000E038F1050CF011C1E0934509E091600810 |
:10AAD000FF27EE0FFF1FE25DF74F0190F081E02DA1 |
:10AAE0008FEFE138F8070CF4FDC0E038F1050CF009 |
:10AAF000F6C0E093460980919704809347098091BE |
:10AB000099048093480980919B048093490980911E |
:10AB10009D0480934A0980919F0480934B093ECF06 |
:10AB200010922405109223051092260510922505F7 |
:10AB3000EEC08091FB06863020F11092FB0685E086 |
:10AB4000809343098091A9049091AA0490934609A7 |
:10AB5000809345098091A9088093440980919F08BA |
:10AB6000809347098091A008809348098091A108AB |
:10AB70008093490913CF2D5F3F4FEECE2D5F3F4F9E |
:10AB8000D2CE80934309DECF3093EF032093EE03C0 |
:10AB900080915709873609F0BAC080916409809383 |
:10ABA0008B098091650980938D0980916609809356 |
:10ABB0008C098091670980938E09A9C080916808EB |
:10ABC00085FF07CF30932405209323055093260556 |
:10ABD000409325058AEF80933B05FBCE8091530976 |
:10ABE00080934309809154098093440980915509C9 |
:10ABF0008093450980915609809346098091080108 |
:10AC000080934709CBCE8091B7048093430980910C |
:10AC1000B804809344098091B904809345098091D8 |
:10AC2000BA04809346098091BB04809347098091C0 |
:10AC3000BC04809348098091BD04809349098091A8 |
:10AC4000BE0480934A098091CB0480934B09809184 |
:10AC5000CB04837F8093CB048091180390911903D8 |
:10AC600080934C098091790880934D09A2E0B0E06F |
:10AC70000E94E05B802D80934E0990CE80919A08CF |
:10AC80008093430980919B088093440980919C089C |
:10AC90008093450980919D088093460980919E0884 |
:10ACA000809347098091A208809348098091A30866 |
:10ACB000809349098091A40880934A098091A7084C |
:10ACC00080934B098091A50880934C098091A60838 |
:10ACD00080934D098091A80880934E095FCEEFE7DD |
:10ACE000F0E007CFE1E8FFEF00CFEFE7F0E0ECCED8 |
:10ACF000E1E8FFEFE5CEEFE7F0E0D1CEE1E8FFEFEE |
:10AD0000CACEEFE7F0E0B6CEE1E8FFEFAFCE1F919D |
:10AD10000F91FF90EF90089580912C09882309F4FA |
:10AD200039C0459880E399E090932E0980932D09CE |
:10AD300090913C05E92FFF27ED53FC4F80818093D4 |
:10AD400032099F5F90933C05963028F510922C09AC |
:10AD50000E94325481E080932F090000000000001F |
:10AD600000000000000000000000000000000000E3 |
:10AD700000000000000000000000000000000000D3 |
:10AD80000000000000000000000080913009809366 |
:10AD90004F098EBD089510923C05D8CF80912C09A3 |
:10ADA000882311F40DB407FE089584E08093F00326 |
:10ADB000459A9EB580913E05813009F436C08130B8 |
:10ADC00008F43CC0823009F44DC020912F09203294 |
:10ADD00008F030C0459800000000000000000000AE |
:10ADE0000000000000000000000000000000000063 |
:10ADF0000000000000000000000000000000000053 |
:10AE0000000000000000E0912D09F0912E09E20FF2 |
:10AE1000F11D80818EBD908180914F09890F8093B3 |
:10AE20004F092F5F20932F090895953591F01092C7 |
:10AE30003E05CBCF81E080932C09F3CF10925109CE |
:10AE400090933D05913809F0C0CF81E080933E0595 |
:10AE5000BCCF80913D058B5A80933D0582E0809365 |
:10AE60003E05B3CF80915109E82FFF27EF58F64FE9 |
:10AE700090838F5F809351098A3138F080913D052E |
:10AE8000981749F010925209D2CF80913D05890F51 |
:10AE900080933D059ACFA7E5B9E0E1E7F9E08AE1C3 |
:10AEA00001900D928150E1F781E080935209BFCF6C |
:10AEB00087B18C6087B9429843981092430580E827 |
:10AEC0008093C903109244058093CA03089580912A |
:10AED00045058150809345058F3F09F0089584E032 |
:10AEE00080934505809197088B3F68F18091E60833 |
:10AEF000873E08F045C08A3030F580919608882357 |
:10AF00000CF443C0429A809199088B3F38F58091A8 |
:10AF100044058150809344058F3F01F780911909C2 |
:10AF20008150809344058091CA03813009F444C064 |
:10AF300086958093CA03809198089091CA038923CB |
:10AF4000B9F4439808958091430581508093430557 |
:10AF50008F3FE9F0809199088B3FC8F280911909E1 |
:10AF6000873E40F48A3098F68091980887FD06C0A5 |
:10AF7000439A0895809198088823D4F343980895BC |
:10AF80008091960888230CF4BDCF4298E3CF80913E |
:10AF9000E6088150809343058091C903813081F098 |
:10AFA00086958093C903809196089091C90389235F |
:10AFB00009F0A8CF4298CECF80E88093CA03BBCFD8 |
:10AFC00080E88093C903EFCF8091C9008F77809389 |
:10AFD000C9008091C9008F7B8093C9008091C9000E |
:10AFE0008F7D8093C9005A9A52981092CD0084E1C7 |
:10AFF0008093CC008091C80082608093C80080E17B |
:10B000008093C9008091CA008F778093CA00809195 |
:10B01000CA008F7B8093CA008091CA008F7D809385 |
:10B02000CA008091CA008F7E8093CA008091CA00B6 |
:10B03000877F8093CA008091C9008B7F8093C9006D |
:10B040008091CA0084608093CA008091CA008260A7 |
:10B050008093CA008091C80087FF06C08091CE000F |
:10B060008091C80087FDFACF8091C90080688093E5 |
:10B07000C90008951F920F920FB60F9211240F93DB |
:10B080001F932F933F934F935F936F937F938F9370 |
:10B090009F93AF93BF93CF93DF93EF93FF93109161 |
:10B0A000CE008091CB039091CC03019709F459C055 |
:10B0B00080914605909147050E94261520914E05E6 |
:10B0C00030914F052115310519F12130310509F471 |
:10B0D00084C02230310509F462C02330310509F4FF |
:10B0E0008FC081E090E09093CC038093CB031092CB |
:10B0F0004D0510924C05109249051092480587E0C5 |
:10B1000090E00E941D15909347058093460521C14C |
:10B11000882309F43FC081E090E090934F0580932D |
:10B120004E05C0914C05D0914D052196D0934D050B |
:10B13000C0934C05609718F380914805909149059C |
:10B14000892B11F41092830310924D0510924C0537 |
:10B15000109249051092480510924F0510924E0525 |
:10B16000CECF1092CC031092CB0387E090E00E94E8 |
:10B170001D15909347058093460510924D0510923A |
:10B180004C0510924F0510924E0510924B051092EF |
:10B190004A05DFC0C0914C05D0914D05CBCF882327 |
:10B1A00009F09FCF212F332730934B0520934A0579 |
:10B1B00040914C0550914D054230510509F4A3C012 |
:10B1C00083E090E090934F0580934E05EA0121962D |
:10B1D000D0934D05C0934C05ADCF882309F081CFA6 |
:10B1E00082E090E090934F0580934E05C0914C050E |
:10B1F000D0914D052196D0934D05C0934C059ACF23 |
:10B20000882309F06ECF82E090E090934F05809301 |
:10B210004E05C0914C05D0914D052196D0934D051A |
:10B22000C0934C0580914A0590914B05FC01F69521 |
:10B23000E795F695E795EF70F0703196EB30F105F4 |
:10B2400008F078CF982F8827212F3327822B932B34 |
:10B2500093708050924063E070E00E94905B8F0199 |
:10B26000000F111FF801E25DF74F808191819B0172 |
:10B27000281B390BC90137FD68C0069754F480912B |
:10B280009F04883C08F05AC080919F04865F809399 |
:10B290009F04F801E25DF74F808191819C01220FAC |
:10B2A000331F280F391F260F371F37FD4BC0359529 |
:10B2B000279535952795CB01019682179307B4F50D |
:10B2C0002150304080919F04843B50F1F801E25DB1 |
:10B2D000F74F80819181A901481B590BCA0163E096 |
:10B2E00070E00E94905BCB01880F991F860F971F1B |
:10B2F000F801EC5BF74F91838083025D174FF801F3 |
:10B300003183208317CF109249051092480527FFFB |
:10B3100057CF81E090E0909349058093480550CF46 |
:10B32000F801EC5BF74F11821082E7CF615070405B |
:10B33000261737073CF62F5F3F4FC4CF88EC80932A |
:10B340009F04A7CF2D5F3F4FB2CF909581959F4F20 |
:10B3500094CFFF91EF91DF91CF91BF91AF919F91EA |
:10B360008F917F916F915F914F913F912F911F919D |
:10B370000F910F900FBE0F901F901895CF93DF93F2 |
:10B3800080E197E20E941D15EC018091C9008F7742 |
:10B390008093C9008091C9008F7E8093C9005A981C |
:10B3A00087EF96E09F938F931F920E9470110F90EA |
:10B3B0000F900F90CE010E942615882309F079C0C6 |
:10B3C0004A9BF8CF8AE590E00E941D15EC0181EFC1 |
:10B3D00096E09F938F931F920E947011529A0F9044 |
:10B3E0000F900F90CE010E9426158823D9F380E09C |
:10B3F00090E05A9A019684369105D9F780E090E062 |
:10B400005A98019621E080399207D1F780E090E0C8 |
:10B410005A9A01968A309105D9F780E090E05A98BF |
:10B4200001968A309105D9F780E090E05A9A01960A |
:10B4300021E080399207D1F780E090E05A98019698 |
:10B4400021E080399207D1F780E090E05A9A019686 |
:10B450008A309105D9F780E090E05A9801968A30B9 |
:10B460009105D9F780E090E05A9A019621E0803961 |
:10B470009207D1F780E090E05A98019621E0803958 |
:10B480009207D1F780E090E05A9A01968A309105B0 |
:10B49000D9F780E090E05A9801968A309105D9F763 |
:10B4A00080E090E05A9A019621E080399207D1F726 |
:10B4B0000AC086EE96E09F938F931F920E947011B0 |
:10B4C0000F900F900F9052985A980E94E457DF9176 |
:10B4D000CF910895FC014150504030F00190061684 |
:10B4E000D1F73197CF0108958827992708955058AB |
:10B4F000192EA6D001D08CC0BA1762077307840733 |
:10B500009507B1F188F40EF410940B2EBA2FA02DEC |
:10B51000062E622F202D072E732F302D082E842FFC |
:10B52000402D092E952F502DFF275523B9F0591B7B |
:10B5300049F0573E98F0469537952795A795F040E6 |
:10B540005395C9F776F0BA0F621F731F841F30F44A |
:10B55000879577956795B795F040939517FA0F2ED5 |
:10B560000895BF1BBB27BA0B620B730B840BF6CF7E |
:10B57000DEF692C097FB70D09F3738F0FEE9F91BDA |
:10B58000982F872F762F6B2F05C083C096958795B0 |
:10B5900077956795F150D0F73EF49095809570952A |
:10B5A00061957F4F8F4F9F4F0895E89403C097FB9D |
:10B5B0000EF4F3DFB62F672F782F892F9EE9002432 |
:10B5C00027C00ED05EF004C00BD026F001C008D01A |
:10B5D00019F020F48FEF089580E0089581E0089538 |
:10B5E00097FB092E052600F868942DD0E89407FCF7 |
:10B5F00007C0621773078407950721F008F40094C9 |
:10B600000794989408959A95BB0F661F771F881F1B |
:10B6100011249923A1F08823B2F79F3F59F0BB0F63 |
:10B6200048F421F4002011F460FF04C06F5F7F4FE5 |
:10B630008F4F9F4F881F9795879597F9089529C039 |
:10B64000052E092607FA440F551F5F3F79F0AA27F8 |
:10B65000A51708F051E04795880F991F9F3F31F0DB |
:10B66000BB27B91708F091E0879508959F919F91A6 |
:10B67000112414C097FB880F991F9F3F31F0BB27FF |
:10B68000B91708F091E0879508959F919F91112433 |
:10B6900005C0662777278827992708959FEF80ECB4 |
:10B6A0000895629FD001739FF001829FE00DF11D0C |
:10B6B000649FE00DF11D929FF00D839FF00D749F2C |
:10B6C000F00D659FF00D9927729FB00DE11DF91FD8 |
:10B6D000639FB00DE11DF91FBD01CF011124089535 |
:10B6E000991B79E004C0991F961708F0961B881FD4 |
:10B6F0007A95C9F780950895AA1BBB1B51E107C035 |
:10B70000AA1FBB1FA617B70710F0A61BB70B881FF1 |
:10B71000991F5A95A9F780959095BC01CD01089580 |
:10B7200097FB092E07260AD077FD04D0E5DF06D067 |
:10B7300000201AF4709561957F4F0895F6F7909563 |
:10B7400081959F4F0895A1E21A2EAA1BBB1BFD01F4 |
:10B750000DC0AA1FBB1FEE1FFF1FA217B307E407F0 |
:10B76000F50720F0A21BB30BE40BF50B661F771F48 |
:10B77000881F991F1A9469F7609570958095909528 |
:10B780009B01AC01BD01CF01089597FB092E052651 |
:10B790000ED057FD04D0D7DF0AD0001C38F45095E6 |
:10B7A0004095309521953F4F4F4F5F4F0895F6F7E5 |
:10B7B00090958095709561957F4F8F4F9F4F08951D |
:10B7C000F999FECFB2BDA1BDF89A119600B40895C3 |
:10B7D000F7DF01921A94E1F70895F999FECFB2BD0F |
:10B7E000A1BD00BC11960FB6F894FA9AF99A0FBE53 |
:0EB7F00008950190F2DF1A94E1F70895FFCF5B |
:10B7FE0051756164726F00000A010101FF6401C896 |
:10B80E0000416E676C654E69636B202020202020FE |
:10B81E0020416E676C65526F6C6C202020202020BA |
:10B82E00204163634E69636B20202020202020205E |
:10B83E0020416363526F6C6C20202020202020203A |
:10B84E00204779726F4769657220202020202020C2 |
:10B85E002048696768742056616C75652020202029 |
:10B86E00204163635A2020202020202020202020E9 |
:10B87E0020476173202020202020202020202020FF |
:10B88E0020436F6D706173732056616C7565202057 |
:10B89E0020566F6C746167652020202020202020A8 |
:10B8AE0020456D7066616E672020202020202020AC |
:10B8BE00204779726F204B6F6D706173732020205B |
:10B8CE00204D6F746F722046726F6E742020202090 |
:10B8DE00204D6F746F7220526561722020202020DF |
:10B8EE00204D6F746F72204C6566742020202020CE |
:10B8FE00204D6F746F72205269676874202020206B |
:10B90E002020202020202020202020202020202029 |
:10B91E002020202020202020202020202020202019 |
:10B92E002020202020202020202020202020202009 |
:10B93E00204D4B334D61672043616C5374617465C8 |
:10B94E0020536572766F202020202020202020207A |
:10B95E0020202020202020202020202020202020D9 |
:10B96E0020202020202020202020202020202020C9 |
:10B97E0020202020202020202020202020202020B9 |
:10B98E0020202020202020202020202020202020A9 |
:10B99E002020202020202020202020202020202099 |
:10B9AE002020202020202020202020202020202089 |
:10B9BE00204B616C6D616E5F4D6178447269667487 |
:10B9CE002020202020202020202020202020202069 |
:10B9DE00204E6176692053657269616C20446174F2 |
:10B9EE00614750535F4E69636B202020202020203A |
:10B9FE00204750535F526F6C6C2020202020202057 |
:10BA0E0020FFFFFC01FC01016400C409C409007D94 |
:10BA1E000000FF0373737301010203040506070898 |
:10BA2E00090A48616C6C6F2057656C740000000049 |
:10BA3E0000000000000000000000000000000000F8 |
:10BA4E0000000000000000000000000000000000E8 |
:10BA5E0000000000000000000000000000000000D8 |
:10BA6E0000000000000000000000000000000000C8 |
:10BA7E0000000D01426567696E6E657200004E6FC3 |
:10BA8E00726D616C000053706F727400006400F48C |
:10BA9E000190D0030090D00300380130FB103A40E3 |
:10BAAE00089696020A64465A414064ECFF0B050064 |
:0EBABE000004640A0B0D0B0C0E0101010000C8 |
:00000001FF |
/branches/V0.74d-Arthur P/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.74d-Arthur P/Hex-Files |
---|
Property changes: |
Added: svn:ignore |
+Flight-Ctrl_MEGA644_V0_74d_old.hex |
/branches/V0.74d-Arthur P/License.txt |
---|
0,0 → 1,52 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + Nur für den privaten Gebrauch |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten und nichtkommerziellen Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt und genannt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-profit use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet, our webpage (http://www.MikroKopter.de) must be |
// + clearly linked and named as origin |
// + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
/branches/V0.74d-Arthur P/Settings.h |
---|
--- branches/V0.74d-Arthur P/Spectrum.c (nonexistent) |
+++ branches/V0.74d-Arthur P/Spectrum.c (revision 1229) |
@@ -0,0 +1,310 @@ |
+/*####################################################################################### |
+Decodieren eines RC Summen Signals oder Spektrum Empfänger-Satellit |
+#######################################################################################*/ |
+ |
+#include "Spectrum.h" |
+#include "main.h" |
+ |
+//--------------------------------------------------------------// |
+ |
+//--------------------------------------------------------------// |
+void SpektrumBinding(void) |
+{ |
+ unsigned int timerTimeout = SetDelay(10000); // Timeout 10 sec. |
+ unsigned char connected = 0; |
+ unsigned int delaycounter; |
+ |
+ UCSR1B &= ~(1 << RXCIE1); // disable rx-interrupt |
+ UCSR1B &= ~(1<<RXEN1); // disable Uart-Rx |
+ PORTD &= ~(1 << PORTD2); // disable pull-up |
+ |
+ printf("\n\rPlease connect Spektrum receiver for binding NOW..."); |
+ |
+ while(!CheckDelay(timerTimeout)) |
+ { |
+ if (PIND & (1 << PORTD2)) { timerTimeout = SetDelay(90); connected = 1; break; } |
+ } |
+ |
+ if (connected) |
+ { |
+ |
+ printf("ok.\n\r"); |
+ DDRD |= (1 << DDD2); // Rx as output |
+ |
+ while(!CheckDelay(timerTimeout)); // delay after startup of RX |
+ for (delaycounter = 0; delaycounter < 100; delaycounter++) PORTD |= (1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 400; delaycounter++) PORTD &= ~(1 << PORTD2); |
+ |
+ for (delaycounter = 0; delaycounter < 10; delaycounter++) PORTD |= (1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 10; delaycounter++) PORTD &= ~(1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 400; delaycounter++) PORTD |= (1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 400; delaycounter++) PORTD &= ~(1 << PORTD2); |
+ |
+ for (delaycounter = 0; delaycounter < 10; delaycounter++) PORTD |= (1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 10; delaycounter++) PORTD &= ~(1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 400; delaycounter++) PORTD |= (1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 400; delaycounter++) PORTD &= ~(1 << PORTD2); |
+ |
+ for (delaycounter = 0; delaycounter < 10; delaycounter++) PORTD |= (1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 10; delaycounter++) PORTD &= ~(1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 400; delaycounter++) PORTD |= (1 << PORTD2); |
+ |
+ } |
+ else |
+ { printf("Timeout.\n\r"); |
+ |
+ |
+ } |
+ |
+ DDRD &= ~(1 << DDD2); // RX as input |
+ PORTD &= ~(1 << PORTD2); |
+ |
+ Uart1Init(); // init Uart again |
+} |
+ |
+//############################################################################ |
+// zum Decodieren des Spektrum Satelliten wird USART1 benutzt. |
+// USART1 initialisation from killagreg |
+void Uart1Init(void) |
+//############################################################################ |
+ { |
+ // -- Start of USART1 initialisation for Spekturm seriell-mode |
+ // USART1 Control and Status Register A, B, C and baud rate register |
+ uint16_t ubrr = (uint16_t) ((uint32_t) SYSCLK/(8 * 115200) - 1); |
+ // disable RX-Interrupt |
+ UCSR1B &= ~(1 << RXCIE1); |
+ // disable TX-Interrupt |
+ UCSR1B &= ~(1 << TXCIE1); |
+ // disable DRE-Interrupt |
+ UCSR1B &= ~(1 << UDRIE1); |
+ // set direction of RXD1 and TXD1 pins |
+ // set RXD1 (PD2) as an input pin |
+ PORTD |= (1 << PORTD2); |
+ DDRD &= ~(1 << DDD2); |
+ // USART0 Baud Rate Register |
+ // set clock divider |
+ |
+ UBRR1H = (uint8_t)(ubrr>>8); |
+ UBRR1L = (uint8_t)ubrr; |
+ // enable double speed operation |
+ UCSR1A |= (1 << U2X1); |
+ // enable receiver and transmitter |
+ //UCSR1B = (1<<RXEN1)|(1<<TXEN1); |
+ |
+ |
+ |
+ |
+ UCSR1B = (1<<RXEN1); |
+ // set asynchronous mode |
+ UCSR1C &= ~(1 << UMSEL11); |
+ UCSR1C &= ~(1 << UMSEL10); |
+ // no parity |
+ UCSR1C &= ~(1 << UPM11); |
+ UCSR1C &= ~(1 << UPM10); |
+ // 1 stop bit |
+ UCSR1C &= ~(1 << USBS1); |
+ // 8-bit |
+ UCSR1B &= ~(1 << UCSZ12); |
+ UCSR1C |= (1 << UCSZ11); |
+ UCSR1C |= (1 << UCSZ10); |
+ // flush receive buffer explicit |
+ while(UCSR1A & (1<<RXC1)) UDR1; |
+ // enable RX-interrupts at the end |
+ UCSR1B |= (1 << RXCIE1); |
+ // -- End of USART1 initialisation |
+ return; |
+ } |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// + Copyright (c) Rainer Walther |
+// + RC-routines from original MK rc.c (c) H&I |
+// + Useful infos from Walter: http://www.rcgroups.com/forums/showthread.php?t=714299&page=2 |
+// + only for non-profit use |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// |
+// 20080808 rw Modified for Spektrum AR6100 (PPM) |
+// 20080823 rw Add Spektrum satellite receiver on USART1 (644P only) |
+// 20081213 rw Add support for Spektrum DS9 Air-Tx-Module (9 channels) |
+// Replace AR6100-coding with original composit-signal routines |
+// |
+// --- |
+// Entweder Summensignal ODER Spektrum-Receiver anschließen. Nicht beides gleichzeitig betreiben! |
+// Binding is not implemented. Bind with external Receiver. |
+// Servo output J3, J4, J5 not serviced |
+// |
+// Anschuß Spektrum Receiver |
+// Orange: 3V von der FC (keinesfalls an 5V anschließen!) |
+// Schwarz: GND |
+// Grau: RXD1 (Pin 3) auf 10-Pol FC-Stecker |
+// |
+// --- |
+// Satellite-Reciever connected on USART1: |
+// |
+// DX7/DX6i: One data-frame at 115200 baud every 22ms. |
+// DX7se: One data-frame at 115200 baud every 11ms. |
+// byte1: unknown |
+// byte2: unknown |
+// byte3: and byte4: channel data (FLT-Mode) |
+// byte5: and byte6: channel data (Roll) |
+// byte7: and byte8: channel data (Nick) |
+// byte9: and byte10: channel data (Gier) |
+// byte11: and byte12: channel data (Gear Switch) |
+// byte13: and byte14: channel data (Gas) |
+// byte15: and byte16: channel data (AUX2) |
+// |
+// DS9 (9 Channel): One data-frame at 115200 baud every 11ms, alternating frame 1/2 for CH1-7 / CH8-9 |
+// 1st Frame: |
+// byte1: unknown |
+// byte2: unknown |
+// byte3: and byte4: channel data |
+// byte5: and byte6: channel data |
+// byte7: and byte8: channel data |
+// byte9: and byte10: channel data |
+// byte11: and byte12: channel data |
+// byte13: and byte14: channel data |
+// byte15: and byte16: channel data |
+// 2nd Frame: |
+// byte1: unknown |
+// byte2: unknown |
+// byte3: and byte4: channel data |
+// byte5: and byte6: channel data |
+// byte7: and byte8: 0xffff |
+// byte9: and byte10: 0xffff |
+// byte11: and byte12: 0xffff |
+// byte13: and byte14: 0xffff |
+// byte15: and byte16: 0xffff |
+// |
+// Each channel data (16 bit= 2byte, first msb, second lsb) is arranged as: |
+// |
+// Bits: F 0 C3 C2 C1 C0 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 |
+// |
+// 0 means a '0' bit |
+// F: 1 = indicates beginning of 2nd frame for CH8-9 (DS9 only) |
+// C3 to C0 is the channel number. 0 to 9 (4 bit, as assigned in the transmitter) |
+// D9 to D0 is the channel data (10 bit) 0xaa..0x200..0x356 for 100% transmitter-travel |
+// |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ |
+//############################################################################ |
+//Diese Routine startet und inizialisiert den USART1 für seriellen Spektrum satellite reciever |
+SIGNAL(USART1_RX_vect) |
+//############################################################################ |
+{ |
+static unsigned int Sync=0, FrameCnt=0, ByteHigh=0, ReSync=1, Frame2=0, FrameTimer; |
+ unsigned int Channel, index; |
+ signed int signal, tmp; |
+ int bCheckDelay; |
+ uint8_t c; |
+ |
+ c = UDR1; // get data byte |
+ |
+ if (ReSync == 1) |
+ { |
+ // wait for beginning of new frame |
+ ReSync = 0; |
+ |
+ FrameTimer = SetDelay(7); // minimum 7ms zwischen den frames |
+ FrameCnt = 0; |
+ Sync = 0; |
+ ByteHigh = 0; |
+ } |
+ else |
+ { |
+ bCheckDelay = CheckDelay(FrameTimer); |
+ if ( Sync == 0 ) |
+ { |
+ if(bCheckDelay) |
+ { |
+ // nach einer Pause von mind. 7ms erstes Sync-Character gefunden |
+ // Zeichen ignorieren, da Bedeutung unbekannt |
+ Sync = 1; |
+ FrameCnt ++; |
+ } |
+ else |
+ { |
+ // Zeichen kam vor Ablauf der 7ms Sync-Pause |
+ // warten auf erstes Sync-Zeichen |
+ } |
+ } |
+ else if((Sync == 1) && !bCheckDelay) |
+ { |
+ // zweites Sync-Character ignorieren, Bedeutung unbekannt |
+ Sync = 2; |
+ FrameCnt ++; |
+ } |
+ else if((Sync == 2) && !bCheckDelay) |
+ { |
+ // Datenbyte high |
+ ByteHigh = c; |
+ |
+ if (FrameCnt == 2) |
+ { |
+ // is 1st Byte of Channel-data |
+ // Frame 1 with Channel 1-7 comming next |
+ Frame2 = 0; |
+ if(ByteHigh & 0x80) |
+ { |
+ // DS9: Frame 2 with Channel 8-9 comming next |
+ Frame2 = 1; |
+ } |
+ } |
+ Sync = 3; |
+ FrameCnt ++; |
+ } |
+ else if((Sync == 3) && !bCheckDelay) |
+ { |
+ // Datenbyte low |
+ |
+ // High-Byte for next channel comes next |
+ Sync = 2; |
+ FrameCnt ++; |
+ |
+ index = (ByteHigh >> 2) & 0x0f; |
+ index ++; |
+ Channel = (ByteHigh << 8) | c; |
+ signal = Channel & 0x3ff; |
+ signal -= 0x200; // Offset, range 0x000..0x3ff? |
+ signal = signal/3; // scaling to fit PPM resolution |
+ |
+ if(index >= 0 && index <= 10) |
+ { |
+ // Stabiles Signal |
+ if(abs(signal - PPM_in[index]) < 6) { if(SenderOkay < 200) SenderOkay += 10; else SenderOkay = 200;} |
+ tmp = (3 * (PPM_in[index]) + signal) / 4; |
+ if(tmp > signal+1) tmp--; else |
+ if(tmp < signal-1) tmp++; |
+ if(SenderOkay >= 180) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; |
+ else PPM_diff[index] = 0; |
+ PPM_in[index] = tmp; |
+ } |
+ } |
+ else |
+ { |
+ // hier stimmt was nicht: neu synchronisieren |
+ ReSync = 1; |
+ FrameCnt = 0; |
+ Frame2 = 0; |
+ } |
+ |
+ // 16 Bytes per frame |
+ if(FrameCnt >= 16) |
+ { |
+ // Frame complete |
+ if(Frame2 == 0) |
+ { |
+ // Null bedeutet: Neue Daten |
+ // nur beim ersten Frame (CH 0-7) setzen |
+ NewPpmData = 0; |
+ } |
+ |
+ // new frame next, nach fruehestens 7ms erwartet |
+ FrameCnt = 0; |
+ Frame2 = 0; |
+ Sync = 0; |
+ } |
+ // Zeit bis zum nächsten Zeichen messen |
+ FrameTimer = SetDelay(7); |
+ } |
+} |
+ |
+ |
/branches/V0.74d-Arthur P/Spectrum.h |
---|
0,0 → 1,9 |
/*####################################################################################### |
Dekodieren eines Spectrum Signals |
#######################################################################################*/ |
#ifndef _SPECTRUM_H |
#define _SPECTRUM_H |
void Uart1Init(void); |
void SpektrumBinding(void); |
#endif //_RC_H |
/branches/V0.74d-Arthur P/_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.74d-Arthur P/analog.c |
---|
0,0 → 1,459 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_ax, Aktuell_ay,Aktuell_az, UBat = 100; |
volatile int AdWertNickFilter = 0, AdWertRollFilter = 0, AdWertGierFilter = 0; |
volatile int HiResNick = 2500, HiResRoll = 2500; |
volatile int AdWertNick = 0, AdWertRoll = 0, AdWertGier = 0; |
volatile int AdWertAccRoll = 0,AdWertAccNick = 0,AdWertAccHoch = 0; |
volatile char messanzahl_AccHoch = 0; |
volatile long Luftdruck = 32000; |
volatile int StartLuftdruck; |
volatile unsigned int MessLuftdruck = 1023; |
unsigned char DruckOffsetSetting; |
signed char ExpandBaro = 0; |
volatile int HoeheD = 0; |
volatile char messanzahl_Druck; |
volatile int tmpLuftdruck; |
volatile unsigned int ZaehlMessungen = 0; |
unsigned char AnalogOffsetNick = 115,AnalogOffsetRoll = 115,AnalogOffsetGier = 115; |
unsigned char GyroDefektN = 0,GyroDefektR = 0,GyroDefektG = 0; |
volatile unsigned char AdReady = 1; |
//####################################################################################### |
// |
void ADC_Init(void) |
//####################################################################################### |
{ |
ADMUX = 0;//Referenz ist extern |
ANALOG_ON; |
} |
void SucheLuftruckOffset(void) |
{ |
unsigned int off; |
off = eeprom_read_byte(&EEPromArray[EEPROM_ADR_LAST_OFFSET]); |
if(off > 20) off -= 10; |
OCR0A = off; |
ExpandBaro = 0; |
Delay_ms_Mess(100); |
if(MessLuftdruck < 850) off = 0; |
for(; off < 250;off++) |
{ |
OCR0A = off; |
Delay_ms_Mess(50); |
printf("."); |
if(MessLuftdruck < 850) break; |
} |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_LAST_OFFSET], off); |
DruckOffsetSetting = off; |
Delay_ms_Mess(300); |
} |
void SucheGyroOffset(void) |
{ |
unsigned char i, ready = 0; |
int timeout; |
GyroDefektN = 0; GyroDefektR = 0; GyroDefektG = 0; |
timeout = SetDelay(2000); |
for(i=140; i != 0; i--) |
{ |
if(ready == 3 && i > 10) i = 9; |
ready = 0; |
if(AdWertNick < 1020) AnalogOffsetNick--; else if(AdWertNick > 1030) AnalogOffsetNick++; else ready++; |
if(AdWertRoll < 1020) AnalogOffsetRoll--; else if(AdWertRoll > 1030) AnalogOffsetRoll++; else ready++; |
if(AdWertGier < 1020) AnalogOffsetGier--; else if(AdWertGier > 1030) AnalogOffsetGier++; else ready++; |
twi_state = 8; |
i2c_start(); |
if(AnalogOffsetNick < 10) { GyroDefektN = 1; AnalogOffsetNick = 10;}; if(AnalogOffsetNick > 245) { GyroDefektN = 1; AnalogOffsetNick = 245;}; |
if(AnalogOffsetRoll < 10) { GyroDefektR = 1; AnalogOffsetRoll = 10;}; if(AnalogOffsetRoll > 245) { GyroDefektR = 1; AnalogOffsetRoll = 245;}; |
if(AnalogOffsetGier < 10) { GyroDefektG = 1; AnalogOffsetGier = 10;}; if(AnalogOffsetGier > 245) { GyroDefektG = 1; AnalogOffsetGier = 245;}; |
while(twi_state) if(CheckDelay(timeout)) {printf("\n\r DAC or I2C ERROR! Check I2C, 3Vref, DAC and BL-Ctrl"); break;} |
messanzahl_Druck = 0; |
ANALOG_ON; |
while(messanzahl_Druck == 0); |
if(i<10) Delay_ms_Mess(10); |
} |
Delay_ms_Mess(70); |
} |
/* |
0 n |
1 r |
2 g |
3 y |
4 x |
5 n |
6 r |
7 u |
8 z |
9 L |
10 n |
11 r |
12 g |
13 y |
14 x |
15 n |
16 r |
17 L |
*/ |
//####################################################################################### |
// |
SIGNAL(SIG_ADC) |
//####################################################################################### |
{ |
static unsigned char kanal=0,state = 0; |
static signed int gier1, roll1, nick1, nick_filter, roll_filter; |
static signed int accy, accx; |
switch(state++) |
{ |
case 0: |
nick1 = ADC; |
kanal = AD_ROLL; |
break; |
case 1: |
roll1 = ADC; |
kanal = AD_GIER; |
break; |
case 2: |
gier1 = ADC; |
kanal = AD_ACC_Y; |
break; |
case 3: |
Aktuell_ay = NeutralAccY - ADC; |
accy = Aktuell_ay; |
kanal = AD_ACC_X; |
break; |
case 4: |
Aktuell_ax = ADC - NeutralAccX; |
accx = Aktuell_ax; |
kanal = AD_NICK; |
break; |
case 5: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 6: |
roll1 += ADC; |
kanal = AD_UBAT; |
break; |
case 7: |
UBat = (3 * UBat + ADC / 3) / 4; |
kanal = AD_ACC_Z; |
break; |
case 8: |
AdWertAccHoch = (signed int) ADC - NeutralAccZ; |
if(AdWertAccHoch > 1) |
{ |
if(NeutralAccZ < 750) |
{ |
NeutralAccZ += 0.02; |
if(modell_fliegt < 500) NeutralAccZ += 0.1; |
} |
} |
else if(AdWertAccHoch < -1) |
{ |
if(NeutralAccZ > 550) |
{ |
NeutralAccZ-= 0.02; |
if(modell_fliegt < 500) NeutralAccZ -= 0.1; |
} |
} |
messanzahl_AccHoch = 1; |
Aktuell_az = ADC; |
Mess_Integral_Hoch += AdWertAccHoch; // Integrieren |
Mess_Integral_Hoch -= Mess_Integral_Hoch / 1024; // dämfen |
kanal = AD_DRUCK; |
break; |
// "case 8:" fehlt hier absichtlich |
case 10: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 11: |
roll1 += ADC; |
kanal = AD_GIER; |
break; |
case 12: |
if(PlatinenVersion == 10) AdWertGier = (ADC + gier1 + 1) / 2; |
else |
if(PlatinenVersion == 20) AdWertGier = 2047 - (ADC + gier1); |
else AdWertGier = (ADC + gier1); |
kanal = AD_ACC_Y; |
break; |
case 13: |
Aktuell_ay = NeutralAccY - ADC; |
AdWertAccRoll = (Aktuell_ay + accy); |
kanal = AD_ACC_X; |
break; |
case 14: |
Aktuell_ax = ADC - NeutralAccX; |
AdWertAccNick = (Aktuell_ax + accx); |
kanal = AD_NICK; |
break; |
case 15: |
nick1 += ADC; |
if(PlatinenVersion == 10) nick1 *= 2; else nick1 *= 4; |
AdWertNick = nick1 / 8; |
nick_filter = (nick_filter + nick1) / 2; |
HiResNick = nick_filter - AdNeutralNick; |
AdWertNickFilter = (AdWertNickFilter + HiResNick) / 2; |
kanal = AD_ROLL; |
break; |
case 16: |
roll1 += ADC; |
if(PlatinenVersion == 10) roll1 *= 2; else roll1 *= 4; |
AdWertRoll = roll1 / 8; |
roll_filter = (roll_filter + roll1) / 2; |
HiResRoll = roll_filter - AdNeutralRoll; |
AdWertRollFilter = (AdWertRollFilter + HiResRoll) / 2; |
kanal = AD_DRUCK; |
break; |
case 17: |
state = 0; |
AdReady = 1; |
ZaehlMessungen++; |
// "break" fehlt hier absichtlich |
case 9: |
tmpLuftdruck += ADC; |
if(++messanzahl_Druck >= 5) |
{ |
tmpLuftdruck /= 2; |
MessLuftdruck = ADC; |
messanzahl_Druck = 0; |
HoeheD = (31 * HoeheD + (int) Parameter_Luftdruck_D * (int)(255 * ExpandBaro + StartLuftdruck - tmpLuftdruck - HoehenWert))/32; // D-Anteil = neuerWert - AlterWert |
Luftdruck = (tmpLuftdruck + 7 * Luftdruck + 4) / 8; |
HoehenWert = 255 * ExpandBaro + StartLuftdruck - Luftdruck; |
tmpLuftdruck /= 2; |
} |
kanal = AD_NICK; |
break; |
default: |
kanal = 0; state = 0; kanal = AD_NICK; |
break; |
} |
ADMUX = kanal; |
if(state != 0) ANALOG_ON; |
} |
/* |
//####################################################################################### |
// |
SIGNAL(SIG_ADC) |
//####################################################################################### |
{ |
static unsigned char kanal=0,state = 0; |
static signed int gier1, roll1, nick1; |
static signed long nick_filter, roll_filter; |
static signed int accy, accx; |
switch(state++) |
{ |
case 0: |
nick1 = ADC; |
kanal = AD_ROLL; |
break; |
case 1: |
roll1 = ADC; |
kanal = AD_GIER; |
break; |
case 2: |
gier1 = ADC; |
kanal = AD_ACC_Y; |
break; |
case 3: |
Aktuell_ay = NeutralAccY - ADC; |
accy = Aktuell_ay; |
kanal = AD_NICK; |
break; |
case 4: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 5: |
roll1 += ADC; |
kanal = AD_ACC_Z; |
break; |
case 6: |
AdWertAccHoch = (signed int) ADC - NeutralAccZ; |
if(AdWertAccHoch > 1) |
{ |
if(NeutralAccZ < 750) |
{ |
NeutralAccZ += 0.02; |
if(modell_fliegt < 500) NeutralAccZ += 0.1; |
} |
} |
else if(AdWertAccHoch < -1) |
{ |
if(NeutralAccZ > 550) |
{ |
NeutralAccZ-= 0.02; |
if(modell_fliegt < 500) NeutralAccZ -= 0.1; |
} |
} |
messanzahl_AccHoch = 1; |
Aktuell_az = ADC; |
Mess_Integral_Hoch += AdWertAccHoch; // Integrieren |
Mess_Integral_Hoch -= Mess_Integral_Hoch / 1024; // dämfen |
kanal = AD_NICK; |
break; |
case 7: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 8: |
roll1 += ADC; |
kanal = AD_ACC_X; |
break; |
case 9: |
Aktuell_ax = ADC - NeutralAccX; |
accx = Aktuell_ax; |
kanal = AD_GIER; |
break; |
case 10: |
gier1 += ADC; |
kanal = AD_NICK; |
break; |
case 11: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 12: |
roll1 += ADC; |
kanal = AD_UBAT; |
break; |
case 13: |
UBat = (3 * UBat + ADC / 3) / 4;//(UBat + ((ADC * 39) / 256) + 19) / 2; |
kanal = AD_ACC_Y; |
break; |
case 14: |
Aktuell_ay = NeutralAccY - ADC; |
accy += Aktuell_ay; |
kanal = AD_NICK; |
break; |
case 15: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 16: |
roll1 += ADC; |
kanal = AD_ACC_X; |
break; |
case 17: |
Aktuell_ax = ADC - NeutralAccX; |
accx += Aktuell_ax; |
kanal = AD_NICK; |
break; |
case 18: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 19: |
roll1 += ADC; |
kanal = AD_GIER; |
break; |
case 20: |
gier1 += ADC; |
kanal = AD_ACC_Y; |
break; |
case 21: |
Aktuell_ay = NeutralAccY - ADC; |
accy += Aktuell_ay; |
kanal = AD_NICK; |
break; |
case 22: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 23: |
roll1 += ADC; |
kanal = AD_DRUCK; |
break; |
case 24: |
tmpLuftdruck += ADC; |
if(++messanzahl_Druck >= 5) |
{ |
MessLuftdruck = ADC; |
messanzahl_Druck = 0; |
HoeheD = (7 * HoeheD + (int) Parameter_Luftdruck_D * (int)(255 * ExpandBaro + StartLuftdruck - tmpLuftdruck - HoehenWert)) / 8; // D-Anteil = neuerWert - AlterWert |
Luftdruck = (tmpLuftdruck + 3 * Luftdruck) / 4; |
HoehenWert = 255 * ExpandBaro + StartLuftdruck - Luftdruck; |
tmpLuftdruck = 0; |
} |
kanal = AD_NICK; |
break; |
case 25: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 26: |
roll1 += ADC; |
kanal = AD_ACC_X; |
break; |
case 27: |
Aktuell_ax = ADC - NeutralAccX; |
accx += Aktuell_ax; |
kanal = AD_GIER; |
break; |
case 28: |
if(PlatinenVersion == 10) AdWertGier = (ADC + gier1 + 2) / 4; |
else |
if(PlatinenVersion == 20) AdWertGier = 2047 - (ADC + gier1 + 1) / 2; |
else AdWertGier = (ADC + gier1 + 1) / 2; |
kanal = AD_NICK; |
break; |
case 29: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 30: |
roll1 += ADC; |
kanal = AD_ACC_Y; |
break; |
case 31: |
Aktuell_ay = NeutralAccY - ADC; |
AdWertAccRoll = (Aktuell_ay + accy); |
kanal = AD_NICK; |
break; |
case 32: |
AdWertNick = (ADC + nick1 + 3) / 5; |
nick_filter = (long) (1 * (long) nick_filter + 4 * (long)(ADC + nick1) + 1) / 2; |
if(PlatinenVersion == 10) { AdWertNick /= 2;nick_filter /=2;} |
HiResNick = nick_filter - 20 * AdNeutralNick; |
AdWertNickFilter = (long)(3L * (long)AdWertNickFilter + HiResNick + 2) / 4; |
DebugOut.Analog[21] = AdWertNickFilter / 4; |
kanal = AD_ROLL; |
break; |
case 33: |
AdWertRoll = (ADC + roll1 + 3) / 5; |
roll_filter = (long)(1 * (long)roll_filter + 4 * (long)(ADC + roll1) + 1) / 2; |
if(PlatinenVersion == 10) { AdWertRoll /= 2;roll_filter /=2;} |
HiResRoll = roll_filter - 20 * AdNeutralRoll; |
AdWertRollFilter = (long)(3L * (long)AdWertRollFilter + HiResRoll + 2) / 4; |
DebugOut.Analog[22] = AdWertRollFilter / 4; |
kanal = AD_ACC_X; |
break; |
case 34: |
Aktuell_ax = ADC - NeutralAccX; |
AdWertAccNick = (Aktuell_ax + accx); |
kanal = AD_NICK; |
state = 0; |
AdReady = 1; |
ZaehlMessungen++; |
break; |
default: |
kanal = 0; |
state = 0; |
break; |
} |
ADMUX = kanal; |
if(state != 0) ANALOG_ON; |
} |
*/ |
/branches/V0.74d-Arthur P/analog.h |
---|
0,0 → 1,45 |
#ifndef _ANALOG_H |
#define _ANALOG_H |
/*####################################################################################### |
#######################################################################################*/ |
extern volatile int UBat; |
extern volatile int AdWertNick, AdWertRoll, AdWertGier; |
extern volatile int AdWertAccRoll,AdWertAccNick,AdWertAccHoch; |
extern volatile int HiResNick, HiResRoll; |
extern volatile int AdWertNickFilter, AdWertRollFilter, AdWertGierFilter; |
extern volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_ax, Aktuell_ay,Aktuell_az; |
extern volatile long Luftdruck; |
extern volatile char messanzahl_Druck; |
extern volatile unsigned int ZaehlMessungen; |
extern unsigned char DruckOffsetSetting; |
extern signed char ExpandBaro; |
extern volatile int HoeheD; |
extern volatile unsigned int MessLuftdruck; |
extern volatile int StartLuftdruck; |
extern volatile char MessanzahlNick; |
extern unsigned char AnalogOffsetNick,AnalogOffsetRoll,AnalogOffsetGier; |
extern volatile unsigned char AdReady; |
unsigned int ReadADC(unsigned char adc_input); |
void ADC_Init(void); |
void SucheLuftruckOffset(void); |
void SucheGyroOffset(void); |
#define 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.74d-Arthur P/eeprom.c |
---|
0,0 → 1,236 |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Konstanten |
// + 0-250 -> normale Werte |
// + 251 -> Poti1 |
// + 252 -> Poti2 |
// + 253 -> Poti3 |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
void DefaultStickMapping(void) |
{ |
EE_Parameter.Kanalbelegung[K_NICK] = 1; |
EE_Parameter.Kanalbelegung[K_ROLL] = 2; |
EE_Parameter.Kanalbelegung[K_GAS] = 3; |
EE_Parameter.Kanalbelegung[K_GIER] = 4; |
EE_Parameter.Kanalbelegung[K_POTI1] = 5; |
EE_Parameter.Kanalbelegung[K_POTI2] = 6; |
EE_Parameter.Kanalbelegung[K_POTI3] = 7; |
EE_Parameter.Kanalbelegung[K_POTI4] = 8; |
} |
void DefaultKonstanten1(void) |
{ |
EE_Parameter.GlobalConfig = CFG_ACHSENKOPPLUNG_AKTIV | CFG_KOMPASS_AKTIV | CFG_GPS_AKTIV;//CFG_HOEHEN_SCHALTER |
EE_Parameter.Hoehe_MinGas = 30; |
EE_Parameter.MaxHoehe = 251; // Wert : 0-250 251 -> Poti1 |
EE_Parameter.Hoehe_P = 10; // Wert : 0-32 |
EE_Parameter.Luftdruck_D = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_ACC_Wirkung = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_Verstaerkung = 4; // Wert : 0-50 |
EE_Parameter.Stick_P = 15; // Wert : 1-6 |
EE_Parameter.Stick_D = 30; // Wert : 0-64 |
EE_Parameter.Gier_P = 12; // Wert : 1-20 |
EE_Parameter.Gas_Min = 8; // Wert : 0-32 |
EE_Parameter.Gas_Max = 230; // Wert : 33-250 |
EE_Parameter.GyroAccFaktor = 30; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
EE_Parameter.Gyro_P = 80; // Wert : 0-250 |
EE_Parameter.Gyro_I = 150; // Wert : 0-250 |
EE_Parameter.Gyro_D = 3; // Wert : 0-250 |
EE_Parameter.UnterspannungsWarnung = 94; // Wert : 0-250 |
EE_Parameter.NotGas = 35; // Wert : 0-250 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 30; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
EE_Parameter.I_Faktor = 32; |
EE_Parameter.UserParam1 = 0; // zur freien Verwendung |
EE_Parameter.UserParam2 = 0; // zur freien Verwendung |
EE_Parameter.UserParam3 = 0; // zur freien Verwendung |
EE_Parameter.UserParam4 = 0; // zur freien Verwendung |
EE_Parameter.UserParam5 = 0; // zur freien Verwendung |
EE_Parameter.UserParam6 = 0; // zur freien Verwendung |
EE_Parameter.UserParam7 = 0; // zur freien Verwendung |
EE_Parameter.UserParam8 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoNickCompInvert = 0; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 50; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickMax = 150; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickRefresh = 5; |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.BitConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
EE_Parameter.AchsKopplung1 = 90; |
EE_Parameter.AchsKopplung2 = 67; |
EE_Parameter.CouplingYawCorrection = 0; |
EE_Parameter.WinkelUmschlagNick = 85; |
EE_Parameter.WinkelUmschlagRoll = 85; |
EE_Parameter.GyroAccAbgleich = 16; // 1/k |
EE_Parameter.Driftkomp = 32; |
EE_Parameter.DynamicStability = 100; |
EE_Parameter.J16Bitmask = 95; |
EE_Parameter.J17Bitmask = 243; |
EE_Parameter.J16Timing = 15; |
EE_Parameter.J17Timing = 15; |
EE_Parameter.NaviGpsModeControl = 253; |
EE_Parameter.NaviGpsGain = 100; |
EE_Parameter.NaviGpsP = 90; |
EE_Parameter.NaviGpsI = 90; |
EE_Parameter.NaviGpsD = 90; |
EE_Parameter.NaviGpsPLimit = 75; |
EE_Parameter.NaviGpsILimit = 75; |
EE_Parameter.NaviGpsDLimit = 75; |
EE_Parameter.NaviGpsACC = 0; |
EE_Parameter.NaviGpsMinSat = 6; |
EE_Parameter.NaviStickThreshold = 8; |
EE_Parameter.NaviWindCorrection = 90; |
EE_Parameter.NaviSpeedCompensation = 30; |
EE_Parameter.NaviOperatingRadius = 100; |
EE_Parameter.NaviAngleLimitation = 100; |
EE_Parameter.NaviPH_LoginTime = 4; |
memcpy(EE_Parameter.Name, "Sport\0", 12); |
} |
void DefaultKonstanten2(void) |
{ |
EE_Parameter.GlobalConfig = CFG_ACHSENKOPPLUNG_AKTIV | CFG_KOMPASS_AKTIV | CFG_GPS_AKTIV;///*CFG_HOEHEN_SCHALTER |*/ CFG_KOMPASS_AKTIV;//0x01; |
EE_Parameter.Hoehe_MinGas = 30; |
EE_Parameter.MaxHoehe = 251; // Wert : 0-250 251 -> Poti1 |
EE_Parameter.Hoehe_P = 10; // Wert : 0-32 |
EE_Parameter.Luftdruck_D = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_ACC_Wirkung = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_Verstaerkung = 3; // Wert : 0-50 |
EE_Parameter.Stick_P = 12; // Wert : 1-6 |
EE_Parameter.Stick_D = 16; // Wert : 0-64 |
EE_Parameter.Gier_P = 6; // Wert : 1-20 |
EE_Parameter.Gas_Min = 8; // Wert : 0-32 |
EE_Parameter.Gas_Max = 230; // Wert : 33-250 |
EE_Parameter.GyroAccFaktor = 30; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
EE_Parameter.Gyro_P = 80; // Wert : 0-250 |
EE_Parameter.Gyro_I = 120; // Wert : 0-250 |
EE_Parameter.Gyro_D = 3; // Wert : 0-250 |
EE_Parameter.UnterspannungsWarnung = 94; // Wert : 0-250 |
EE_Parameter.NotGas = 35; // Wert : 0-250 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 30; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
EE_Parameter.I_Faktor = 32; |
EE_Parameter.UserParam1 = 0; // zur freien Verwendung |
EE_Parameter.UserParam2 = 0; // zur freien Verwendung |
EE_Parameter.UserParam3 = 0; // zur freien Verwendung |
EE_Parameter.UserParam4 = 0; // zur freien Verwendung |
EE_Parameter.UserParam5 = 0; // zur freien Verwendung |
EE_Parameter.UserParam6 = 0; // zur freien Verwendung |
EE_Parameter.UserParam7 = 0; // zur freien Verwendung |
EE_Parameter.UserParam8 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoNickCompInvert = 0; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 50; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickMax = 150; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickRefresh = 5; |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.BitConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts |
EE_Parameter.AchsKopplung1 = 90; |
EE_Parameter.AchsKopplung2 = 67; |
EE_Parameter.CouplingYawCorrection = 60; |
EE_Parameter.WinkelUmschlagNick = 85; |
EE_Parameter.WinkelUmschlagRoll = 85; |
EE_Parameter.GyroAccAbgleich = 32; // 1/k |
EE_Parameter.Driftkomp = 32; |
EE_Parameter.DynamicStability = 75; |
EE_Parameter.J16Bitmask = 95; |
EE_Parameter.J17Bitmask = 243; |
EE_Parameter.J16Timing = 20; |
EE_Parameter.J17Timing = 20; |
EE_Parameter.NaviGpsModeControl = 253; |
EE_Parameter.NaviGpsGain = 100; |
EE_Parameter.NaviGpsP = 90; |
EE_Parameter.NaviGpsI = 90; |
EE_Parameter.NaviGpsD = 90; |
EE_Parameter.NaviGpsPLimit = 75; |
EE_Parameter.NaviGpsILimit = 75; |
EE_Parameter.NaviGpsDLimit = 75; |
EE_Parameter.NaviGpsACC = 0; |
EE_Parameter.NaviGpsMinSat = 6; |
EE_Parameter.NaviStickThreshold = 8; |
EE_Parameter.NaviWindCorrection = 90; |
EE_Parameter.NaviSpeedCompensation = 30; |
EE_Parameter.NaviOperatingRadius = 100; |
EE_Parameter.NaviAngleLimitation = 100; |
EE_Parameter.NaviPH_LoginTime = 4; |
memcpy(EE_Parameter.Name, "Normal\0", 12); |
} |
void DefaultKonstanten3(void) |
{ |
EE_Parameter.GlobalConfig = CFG_DREHRATEN_BEGRENZER | CFG_ACHSENKOPPLUNG_AKTIV | CFG_KOMPASS_AKTIV | CFG_GPS_AKTIV;///*CFG_HOEHEN_SCHALTER |*/ CFG_KOMPASS_AKTIV;//0x01; |
EE_Parameter.Hoehe_MinGas = 30; |
EE_Parameter.MaxHoehe = 251; // Wert : 0-250 251 -> Poti1 |
EE_Parameter.Hoehe_P = 10; // Wert : 0-32 |
EE_Parameter.Luftdruck_D = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_ACC_Wirkung = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_Verstaerkung = 3; // Wert : 0-50 |
EE_Parameter.Stick_P = 8; // Wert : 1-6 |
EE_Parameter.Stick_D = 16; // Wert : 0-64 |
EE_Parameter.Gier_P = 6; // Wert : 1-20 |
EE_Parameter.Gas_Min = 8; // Wert : 0-32 |
EE_Parameter.Gas_Max = 230; // Wert : 33-250 |
EE_Parameter.GyroAccFaktor = 30; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
EE_Parameter.Gyro_P = 100; // Wert : 0-250 |
EE_Parameter.Gyro_I = 120; // Wert : 0-250 |
EE_Parameter.Gyro_D = 3; // Wert : 0-250 |
EE_Parameter.UnterspannungsWarnung = 94; // Wert : 0-250 |
EE_Parameter.NotGas = 35; // Wert : 0-250 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 20; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
EE_Parameter.I_Faktor = 16; |
EE_Parameter.UserParam1 = 0; // zur freien Verwendung |
EE_Parameter.UserParam2 = 0; // zur freien Verwendung |
EE_Parameter.UserParam3 = 0; // zur freien Verwendung |
EE_Parameter.UserParam4 = 0; // zur freien Verwendung |
EE_Parameter.UserParam5 = 0; // zur freien Verwendung |
EE_Parameter.UserParam6 = 0; // zur freien Verwendung |
EE_Parameter.UserParam7 = 0; // zur freien Verwendung |
EE_Parameter.UserParam8 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoNickCompInvert = 0; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 50; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickMax = 150; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickRefresh = 5; |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.BitConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts |
EE_Parameter.AchsKopplung1 = 90; |
EE_Parameter.AchsKopplung2 = 67; |
EE_Parameter.CouplingYawCorrection = 70; |
EE_Parameter.WinkelUmschlagNick = 85; |
EE_Parameter.WinkelUmschlagRoll = 85; |
EE_Parameter.GyroAccAbgleich = 32; // 1/k |
EE_Parameter.Driftkomp = 32; |
EE_Parameter.DynamicStability = 50; |
EE_Parameter.J16Bitmask = 95; |
EE_Parameter.J17Bitmask = 243; |
EE_Parameter.J16Timing = 30; |
EE_Parameter.J17Timing = 30; |
EE_Parameter.NaviGpsModeControl = 253; |
EE_Parameter.NaviGpsGain = 100; |
EE_Parameter.NaviGpsP = 90; |
EE_Parameter.NaviGpsI = 90; |
EE_Parameter.NaviGpsD = 90; |
EE_Parameter.NaviGpsPLimit = 75; |
EE_Parameter.NaviGpsILimit = 75; |
EE_Parameter.NaviGpsDLimit = 75; |
EE_Parameter.NaviGpsACC = 0; |
EE_Parameter.NaviGpsMinSat = 6; |
EE_Parameter.NaviStickThreshold = 8; |
EE_Parameter.NaviWindCorrection = 90; |
EE_Parameter.NaviSpeedCompensation = 30; |
EE_Parameter.NaviOperatingRadius = 100; |
EE_Parameter.NaviAngleLimitation = 100; |
EE_Parameter.NaviPH_LoginTime = 4; |
memcpy(EE_Parameter.Name, "Beginner\0", 12); |
} |
/branches/V0.74d-Arthur P/fc.c |
---|
0,0 → 1,1417 |
/*####################################################################################### |
Flight Control |
#######################################################################################*/ |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + Nur für den privaten Gebrauch |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-commercial use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be |
// + clearly linked as origin |
// + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
#include "eeprom.c" |
unsigned char h,m,s; |
volatile unsigned int I2CTimeout = 100; |
int MesswertNick,MesswertRoll,MesswertGier,MesswertGierBias, RohMesswertNick,RohMesswertRoll; |
int TrimNick, TrimRoll; |
int AdNeutralGierBias; |
int AdNeutralNick = 0,AdNeutralRoll = 0,AdNeutralGier = 0,StartNeutralRoll = 0,StartNeutralNick = 0; |
int Mittelwert_AccNick, Mittelwert_AccRoll,Mittelwert_AccHoch, NeutralAccX=0, NeutralAccY=0; |
int NaviAccNick, NaviAccRoll,NaviCntAcc = 0; |
volatile float NeutralAccZ = 0; |
unsigned char CosinusNickWinkel = 0, CosinusRollWinkel = 0; |
long IntegralNick = 0,IntegralNick2 = 0; |
long IntegralRoll = 0,IntegralRoll2 = 0; |
long IntegralAccNick = 0,IntegralAccRoll = 0,IntegralAccZ = 0; |
long Integral_Gier = 0; |
long Mess_IntegralNick = 0,Mess_IntegralNick2 = 0; |
long Mess_IntegralRoll = 0,Mess_IntegralRoll2 = 0; |
long Mess_Integral_Gier = 0,Mess_Integral_Gier2 = 0; |
long MittelIntegralNick,MittelIntegralRoll,MittelIntegralNick2,MittelIntegralRoll2; |
volatile long Mess_Integral_Hoch = 0; |
int KompassValue = 0; |
int KompassStartwert = 0; |
int KompassRichtung = 0; |
unsigned int KompassSignalSchlecht = 500; |
unsigned char MAX_GAS,MIN_GAS; |
unsigned char Notlandung = 0; |
unsigned char HoehenReglerAktiv = 0; |
unsigned char TrichterFlug = 0; |
long Umschlag180Nick = 250000L, Umschlag180Roll = 250000L; |
long ErsatzKompass; |
int ErsatzKompassInGrad; // Kompasswert in Grad |
int GierGyroFehler = 0; |
char GyroFaktor,GyroFaktorGier; |
char IntegralFaktor,IntegralFaktorGier; |
int DiffNick,DiffRoll; |
int Poti1 = 0, Poti2 = 0, Poti3 = 0, Poti4 = 0; |
volatile unsigned char SenderOkay = 0; |
int StickNick = 0,StickRoll = 0,StickGier = 0,StickGas = 0; |
char MotorenEin = 0; |
int HoehenWert = 0; |
int SollHoehe = 0; |
int LageKorrekturRoll = 0,LageKorrekturNick = 0; |
//float Ki = FAKTOR_I; |
int Ki = 10300 / 33; |
unsigned char Looping_Nick = 0,Looping_Roll = 0; |
unsigned char Looping_Links = 0, Looping_Rechts = 0, Looping_Unten = 0, Looping_Oben = 0; |
unsigned char Parameter_Luftdruck_D = 48; // Wert : 0-250 |
unsigned char Parameter_MaxHoehe = 251; // Wert : 0-250 |
unsigned char Parameter_Hoehe_P = 16; // Wert : 0-32 |
unsigned char Parameter_Hoehe_ACC_Wirkung = 58; // Wert : 0-250 |
unsigned char Parameter_KompassWirkung = 64; // Wert : 0-250 |
unsigned char Parameter_Gyro_D = 8; // Wert : 0-250 |
unsigned char Parameter_Gyro_P = 150; // Wert : 10-250 |
unsigned char Parameter_Gyro_I = 150; // Wert : 0-250 |
unsigned char Parameter_Gier_P = 2; // Wert : 1-20 |
unsigned char Parameter_I_Faktor = 10; // Wert : 1-20 |
unsigned char Parameter_UserParam1 = 0; |
unsigned char Parameter_UserParam2 = 0; |
unsigned char Parameter_UserParam3 = 0; |
unsigned char Parameter_UserParam4 = 0; |
unsigned char Parameter_UserParam5 = 0; |
unsigned char Parameter_UserParam6 = 0; |
unsigned char Parameter_UserParam7 = 0; |
unsigned char Parameter_UserParam8 = 0; |
unsigned char Parameter_ServoNickControl = 100; |
unsigned char Parameter_LoopGasLimit = 70; |
unsigned char Parameter_AchsKopplung1 = 90; |
unsigned char Parameter_AchsKopplung2 = 65; |
unsigned char Parameter_CouplingYawCorrection = 64; |
//unsigned char Parameter_AchsGegenKopplung1 = 0; |
unsigned char Parameter_DynamicStability = 100; |
unsigned char Parameter_J16Bitmask; // for the J16 Output |
unsigned char Parameter_J16Timing; // for the J16 Output |
unsigned char Parameter_J17Bitmask; // for the J17 Output |
unsigned char Parameter_J17Timing; // for the J17 Output |
unsigned char Parameter_NaviGpsModeControl; // Parameters for the Naviboard |
unsigned char Parameter_NaviGpsGain; |
unsigned char Parameter_NaviGpsP; |
unsigned char Parameter_NaviGpsI; |
unsigned char Parameter_NaviGpsD; |
unsigned char Parameter_NaviGpsACC; |
unsigned char Parameter_NaviOperatingRadius; |
unsigned char Parameter_NaviWindCorrection; |
unsigned char Parameter_NaviSpeedCompensation; |
unsigned char Parameter_ExternalControl; |
struct mk_param_struct EE_Parameter; |
signed int ExternStickNick = 0,ExternStickRoll = 0,ExternStickGier = 0, ExternHoehenValue = -20; |
int MaxStickNick = 0,MaxStickRoll = 0; |
unsigned int modell_fliegt = 0; |
volatile unsigned char MikroKopterFlags = 0; |
long GIER_GRAD_FAKTOR = 1291; |
signed int KopplungsteilNickRoll,KopplungsteilRollNick; |
unsigned char RequiredMotors = 4; |
unsigned char Motor[MAX_MOTORS]; |
signed int tmp_motorwert[MAX_MOTORS]; |
int MotorSmoothing(int neu, int alt) |
{ |
int motor; |
if(neu > alt) motor = (1*(int)alt + neu) / 2; |
else motor = neu - (alt - neu)*1; |
//if(Poti2 < 20) return(neu); |
return(motor); |
} |
void Piep(unsigned char Anzahl) |
{ |
while(Anzahl--) |
{ |
if(MotorenEin) return; //auf keinen Fall im Flug! |
beeptime = 100; |
Delay_ms(250); |
} |
} |
//############################################################################ |
// Nullwerte ermitteln |
void SetNeutral(void) |
//############################################################################ |
{ |
unsigned char i; |
unsigned int gier_neutral=0, nick_neutral=0, roll_neutral=0; |
ServoActive = 0; HEF4017R_ON; |
NeutralAccX = 0; |
NeutralAccY = 0; |
NeutralAccZ = 0; |
AdNeutralNick = 0; |
AdNeutralRoll = 0; |
AdNeutralGier = 0; |
AdNeutralGierBias = 0; |
Parameter_AchsKopplung1 = 0; |
Parameter_AchsKopplung2 = 0; |
ExpandBaro = 0; |
CalibrierMittelwert(); |
Delay_ms_Mess(100); |
CalibrierMittelwert(); |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
{ |
if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
} |
#define NEUTRAL_FILTER 32 |
for(i=0; i<NEUTRAL_FILTER; i++) |
{ |
Delay_ms_Mess(10); |
gier_neutral += AdWertGier; |
nick_neutral += AdWertNick; |
roll_neutral += AdWertRoll; |
} |
AdNeutralNick= (nick_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER / 8); |
AdNeutralRoll= (roll_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER / 8); |
AdNeutralGier= (gier_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER); |
AdNeutralGierBias = AdNeutralGier; |
StartNeutralRoll = AdNeutralRoll; |
StartNeutralNick = AdNeutralNick; |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) > 4) |
{ |
NeutralAccY = abs(Mittelwert_AccRoll) / (2*ACC_AMPLIFY); |
NeutralAccX = abs(Mittelwert_AccNick) / (2*ACC_AMPLIFY); |
NeutralAccZ = Aktuell_az; |
} |
else |
{ |
NeutralAccX = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK+1]); |
NeutralAccY = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL+1]); |
NeutralAccZ = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_Z]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_Z+1]); |
} |
MesswertNick = 0; |
MesswertRoll = 0; |
MesswertGier = 0; |
Delay_ms_Mess(100); |
Mittelwert_AccNick = ACC_AMPLIFY * (long)AdWertAccNick; |
Mittelwert_AccRoll = ACC_AMPLIFY * (long)AdWertAccRoll; |
IntegralNick = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccNick; |
IntegralRoll = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccRoll; |
Mess_IntegralNick2 = IntegralNick; |
Mess_IntegralRoll2 = IntegralRoll; |
Mess_Integral_Gier = 0; |
StartLuftdruck = Luftdruck; |
HoeheD = 0; |
Mess_Integral_Hoch = 0; |
KompassStartwert = KompassValue; |
GPS_Neutral(); |
beeptime = 50; |
Umschlag180Nick = ((long) EE_Parameter.WinkelUmschlagNick * 2500L) + 15000L; |
Umschlag180Roll = ((long) EE_Parameter.WinkelUmschlagRoll * 2500L) + 15000L; |
ExternHoehenValue = 0; |
ErsatzKompass = KompassValue * GIER_GRAD_FAKTOR; |
GierGyroFehler = 0; |
SendVersionToNavi = 1; |
LED_Init(); |
MikroKopterFlags |= FLAG_CALIBRATE; |
FromNaviCtrl_Value.Kalman_K = -1; |
FromNaviCtrl_Value.Kalman_MaxDrift = 0; |
FromNaviCtrl_Value.Kalman_MaxFusion = 32; |
Poti1 = PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110; |
Poti2 = PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110; |
Poti3 = PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110; |
Poti4 = PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110; |
ServoActive = 1; |
SenderOkay = 100; |
} |
//############################################################################ |
// Bearbeitet die Messwerte |
void Mittelwert(void) |
//############################################################################ |
{ |
static signed long tmpl,tmpl2,tmpl3,tmpl4; |
static signed int oldNick, oldRoll, d2Roll, d2Nick; |
signed long winkel_nick, winkel_roll; |
MesswertGier = (signed int) AdNeutralGier - AdWertGier; |
// MesswertGierBias = (signed int) AdNeutralGierBias - AdWertGier; |
MesswertNick = (signed int) AdWertNickFilter / 8; |
MesswertRoll = (signed int) AdWertRollFilter / 8; |
RohMesswertNick = MesswertNick; |
RohMesswertRoll = MesswertRoll; |
//DebugOut.Analog[21] = MesswertNick; |
//DebugOut.Analog[22] = MesswertRoll; |
//DebugOut.Analog[22] = Mess_Integral_Gier; |
//DebugOut.Analog[21] = MesswertNick; |
//DebugOut.Analog[22] = MesswertRoll; |
// Beschleunigungssensor ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mittelwert_AccNick = ((long)Mittelwert_AccNick * 3 + ((ACC_AMPLIFY * (long)AdWertAccNick))) / 4L; |
Mittelwert_AccRoll = ((long)Mittelwert_AccRoll * 3 + ((ACC_AMPLIFY * (long)AdWertAccRoll))) / 4L; |
Mittelwert_AccHoch = ((long)Mittelwert_AccHoch * 3 + ((long)AdWertAccHoch)) / 4L; |
IntegralAccNick += ACC_AMPLIFY * AdWertAccNick; |
IntegralAccRoll += ACC_AMPLIFY * AdWertAccRoll; |
NaviAccNick += AdWertAccNick; |
NaviAccRoll += AdWertAccRoll; |
NaviCntAcc++; |
IntegralAccZ += Aktuell_az - NeutralAccZ; |
//++++++++++++++++++++++++++++++++++++++++++++++++ |
// ADC einschalten |
ANALOG_ON; |
AdReady = 0; |
//++++++++++++++++++++++++++++++++++++++++++++++++ |
if(Mess_IntegralRoll > 93000L) winkel_roll = 93000L; |
else if(Mess_IntegralRoll <-93000L) winkel_roll = -93000L; |
else winkel_roll = Mess_IntegralRoll; |
if(Mess_IntegralNick > 93000L) winkel_nick = 93000L; |
else if(Mess_IntegralNick <-93000L) winkel_nick = -93000L; |
else winkel_nick = Mess_IntegralNick; |
// Gier ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mess_Integral_Gier += MesswertGier; |
ErsatzKompass += MesswertGier; |
// Kopplungsanteil +++++++++++++++++++++++++++++++++++++ |
if(!Looping_Nick && !Looping_Roll && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV)) |
{ |
tmpl3 = (MesswertRoll * winkel_nick) / 2048L; |
tmpl3 *= Parameter_AchsKopplung2; //65 |
tmpl3 /= 4096L; |
tmpl4 = (MesswertNick * winkel_roll) / 2048L; |
tmpl4 *= Parameter_AchsKopplung2; //65 |
tmpl4 /= 4096L; |
KopplungsteilNickRoll = tmpl3; |
KopplungsteilRollNick = tmpl4; |
tmpl4 -= tmpl3; |
ErsatzKompass += tmpl4; |
if(!Parameter_CouplingYawCorrection) Mess_Integral_Gier -= tmpl4/2; // Gier nachhelfen |
tmpl = ((MesswertGier + tmpl4) * winkel_nick) / 2048L; |
tmpl *= Parameter_AchsKopplung1; // 90 |
tmpl /= 4096L; |
tmpl2 = ((MesswertGier + tmpl4) * winkel_roll) / 2048L; |
tmpl2 *= Parameter_AchsKopplung1; |
tmpl2 /= 4096L; |
if(abs(MesswertGier) > 64) if(labs(tmpl) > 128 || labs(tmpl2) > 128) TrichterFlug = 1; |
//MesswertGier += (Parameter_CouplingYawCorrection * tmpl4) / 256; |
} |
else tmpl = tmpl2 = KopplungsteilNickRoll = KopplungsteilRollNick = 0; |
TrimRoll = tmpl - tmpl2 / 100L; |
TrimNick = -tmpl2 + tmpl / 100L; |
// Kompasswert begrenzen ++++++++++++++++++++++++++++++++++++++++++++++++ |
if(ErsatzKompass >= (360L * GIER_GRAD_FAKTOR)) ErsatzKompass -= 360L * GIER_GRAD_FAKTOR; // 360° Umschlag |
if(ErsatzKompass < 0) ErsatzKompass += 360L * GIER_GRAD_FAKTOR; |
// Roll ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mess_IntegralRoll2 += MesswertRoll + TrimRoll; |
Mess_IntegralRoll += MesswertRoll + TrimRoll - LageKorrekturRoll; |
if(Mess_IntegralRoll > Umschlag180Roll) |
{ |
Mess_IntegralRoll = -(Umschlag180Roll - 25000L); |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
} |
if(Mess_IntegralRoll <-Umschlag180Roll) |
{ |
Mess_IntegralRoll = (Umschlag180Roll - 25000L); |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
} |
// Nick ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mess_IntegralNick2 += MesswertNick + TrimNick; |
Mess_IntegralNick += MesswertNick + TrimNick - LageKorrekturNick; |
if(Mess_IntegralNick > Umschlag180Nick) |
{ |
Mess_IntegralNick = -(Umschlag180Nick - 25000L); |
Mess_IntegralNick2 = Mess_IntegralNick; |
} |
if(Mess_IntegralNick <-Umschlag180Nick) |
{ |
Mess_IntegralNick = (Umschlag180Nick - 25000L); |
Mess_IntegralNick2 = Mess_IntegralNick; |
} |
Integral_Gier = Mess_Integral_Gier; |
IntegralNick = Mess_IntegralNick; |
IntegralRoll = Mess_IntegralRoll; |
IntegralNick2 = Mess_IntegralNick2; |
IntegralRoll2 = Mess_IntegralRoll2; |
#define D_LIMIT 128 |
MesswertNick = HiResNick / 8; |
MesswertRoll = HiResRoll / 8; |
if(AdWertNick < 15) MesswertNick = -1000; if(AdWertNick < 7) MesswertNick = -2000; |
if(PlatinenVersion == 10) { if(AdWertNick > 1010) MesswertNick = +1000; if(AdWertNick > 1017) MesswertNick = +2000; } |
else { if(AdWertNick > 2000) MesswertNick = +1000; if(AdWertNick > 2015) MesswertNick = +2000; } |
if(AdWertRoll < 15) MesswertRoll = -1000; if(AdWertRoll < 7) MesswertRoll = -2000; |
if(PlatinenVersion == 10) { if(AdWertRoll > 1010) MesswertRoll = +1000; if(AdWertRoll > 1017) MesswertRoll = +2000; } |
else { if(AdWertRoll > 2000) MesswertRoll = +1000; if(AdWertRoll > 2015) MesswertRoll = +2000; } |
if(Parameter_Gyro_D) |
{ |
d2Nick = HiResNick - oldNick; |
oldNick = (oldNick + HiResNick)/2; |
if(d2Nick > D_LIMIT) d2Nick = D_LIMIT; |
else if(d2Nick < -D_LIMIT) d2Nick = -D_LIMIT; |
MesswertNick += (d2Nick * (signed int) Parameter_Gyro_D) / 16; |
d2Roll = HiResRoll - oldRoll; |
oldRoll = (oldRoll + HiResRoll)/2; |
if(d2Roll > D_LIMIT) d2Roll = D_LIMIT; |
else if(d2Roll < -D_LIMIT) d2Roll = -D_LIMIT; |
MesswertRoll += (d2Roll * (signed int) Parameter_Gyro_D) / 16; |
HiResNick += (d2Nick * (signed int) Parameter_Gyro_D); |
HiResRoll += (d2Roll * (signed int) Parameter_Gyro_D); |
} |
if(RohMesswertRoll > 0) TrimRoll += ((long) abs(KopplungsteilNickRoll) * Parameter_CouplingYawCorrection) / 64L; |
else TrimRoll -= ((long) abs(KopplungsteilNickRoll) * Parameter_CouplingYawCorrection) / 64L; |
if(RohMesswertNick > 0) TrimNick += ((long) abs(KopplungsteilRollNick) * Parameter_CouplingYawCorrection) / 64L; |
else TrimNick -= ((long) abs(KopplungsteilRollNick) * Parameter_CouplingYawCorrection) / 64L; |
if(EE_Parameter.GlobalConfig & CFG_DREHRATEN_BEGRENZER && !Looping_Nick && !Looping_Roll) |
{ |
if(RohMesswertNick > 256) MesswertNick += 1 * (RohMesswertNick - 256); |
else if(RohMesswertNick < -256) MesswertNick += 1 * (RohMesswertNick + 256); |
if(RohMesswertRoll > 256) MesswertRoll += 1 * (RohMesswertRoll - 256); |
else if(RohMesswertRoll < -256) MesswertRoll += 1 * (RohMesswertRoll + 256); |
} |
if(Poti1 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110) Poti1++; else if(Poti1 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110 && Poti1) Poti1--; |
if(Poti2 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110) Poti2++; else if(Poti2 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110 && Poti2) Poti2--; |
if(Poti3 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110) Poti3++; else if(Poti3 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110 && Poti3) Poti3--; |
if(Poti4 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110) Poti4++; else if(Poti4 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110 && Poti4) Poti4--; |
if(Poti1 < 0) Poti1 = 0; else if(Poti1 > 255) Poti1 = 255; |
if(Poti2 < 0) Poti2 = 0; else if(Poti2 > 255) Poti2 = 255; |
if(Poti3 < 0) Poti3 = 0; else if(Poti3 > 255) Poti3 = 255; |
if(Poti4 < 0) Poti4 = 0; else if(Poti4 > 255) Poti4 = 255; |
} |
//############################################################################ |
// Messwerte beim Ermitteln der Nullage |
void CalibrierMittelwert(void) |
//############################################################################ |
{ |
if(PlatinenVersion == 13) SucheGyroOffset(); |
// ADC auschalten, damit die Werte sich nicht während der Berechnung ändern |
ANALOG_OFF; |
MesswertNick = AdWertNick; |
MesswertRoll = AdWertRoll; |
MesswertGier = AdWertGier; |
Mittelwert_AccNick = ACC_AMPLIFY * (long)AdWertAccNick; |
Mittelwert_AccRoll = ACC_AMPLIFY * (long)AdWertAccRoll; |
Mittelwert_AccHoch = (long)AdWertAccHoch; |
// ADC einschalten |
ANALOG_ON; |
if(Poti1 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110) Poti1++; else if(Poti1 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110 && Poti1) Poti1--; |
if(Poti2 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110) Poti2++; else if(Poti2 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110 && Poti2) Poti2--; |
if(Poti3 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110) Poti3++; else if(Poti3 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110 && Poti3) Poti3--; |
if(Poti4 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110) Poti4++; else if(Poti4 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110 && Poti4) Poti4--; |
if(Poti1 < 0) Poti1 = 0; else if(Poti1 > 255) Poti1 = 255; |
if(Poti2 < 0) Poti2 = 0; else if(Poti2 > 255) Poti2 = 255; |
if(Poti3 < 0) Poti3 = 0; else if(Poti3 > 255) Poti3 = 255; |
if(Poti4 < 0) Poti4 = 0; else if(Poti4 > 255) Poti4 = 255; |
Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L; |
Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagRoll * 2500L; |
} |
//############################################################################ |
// Senden der Motorwerte per I2C-Bus |
void SendMotorData(void) |
//############################################################################ |
{ |
unsigned char i; |
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_KompassWirkung,EE_Parameter.KompassWirkung,0,255); |
CHK_POTI_MM(Parameter_Gyro_P,EE_Parameter.Gyro_P,10,255); |
CHK_POTI(Parameter_Gyro_I,EE_Parameter.Gyro_I,0,255); |
CHK_POTI(Parameter_Gyro_D,EE_Parameter.Gyro_D,0,255); |
CHK_POTI(Parameter_I_Faktor,EE_Parameter.I_Faktor,0,255); |
CHK_POTI(Parameter_UserParam1,EE_Parameter.UserParam1,0,255); |
CHK_POTI(Parameter_UserParam2,EE_Parameter.UserParam2,0,255); |
CHK_POTI(Parameter_UserParam3,EE_Parameter.UserParam3,0,255); |
CHK_POTI(Parameter_UserParam4,EE_Parameter.UserParam4,0,255); |
CHK_POTI(Parameter_UserParam5,EE_Parameter.UserParam5,0,255); |
CHK_POTI(Parameter_UserParam6,EE_Parameter.UserParam6,0,255); |
CHK_POTI(Parameter_UserParam7,EE_Parameter.UserParam7,0,255); |
CHK_POTI(Parameter_UserParam8,EE_Parameter.UserParam8,0,255); |
CHK_POTI(Parameter_ServoNickControl,EE_Parameter.ServoNickControl,0,255); |
CHK_POTI(Parameter_LoopGasLimit,EE_Parameter.LoopGasLimit,0,255); |
CHK_POTI(Parameter_AchsKopplung1, EE_Parameter.AchsKopplung1,0,255); |
CHK_POTI(Parameter_AchsKopplung2, EE_Parameter.AchsKopplung2,0,255); |
CHK_POTI(Parameter_CouplingYawCorrection,EE_Parameter.CouplingYawCorrection,0,255); |
// CHK_POTI(Parameter_AchsGegenKopplung1,EE_Parameter.AchsGegenKopplung1,0,255); |
CHK_POTI(Parameter_DynamicStability,EE_Parameter.DynamicStability,0,255); |
CHK_POTI_MM(Parameter_J16Timing,EE_Parameter.J16Timing,1,255); |
CHK_POTI_MM(Parameter_J17Timing,EE_Parameter.J17Timing,1,255); |
CHK_POTI(Parameter_ExternalControl,EE_Parameter.ExternalControl,0,255); |
Ki = 10300 / (Parameter_I_Faktor + 1); |
MAX_GAS = EE_Parameter.Gas_Max; |
MIN_GAS = EE_Parameter.Gas_Min; |
} |
//############################################################################ |
// |
void MotorRegler(void) |
//############################################################################ |
{ |
int pd_ergebnis_nick,pd_ergebnis_roll,h,tmp_int; |
int GierMischanteil,GasMischanteil; |
static long SummeNick=0,SummeRoll=0; |
static long sollGier = 0,tmp_long,tmp_long2; |
static long IntegralFehlerNick = 0; |
static long IntegralFehlerRoll = 0; |
static unsigned int RcLostTimer; |
static unsigned char delay_neutral = 0; |
static unsigned char delay_einschalten = 0,delay_ausschalten = 0; |
static int hoehenregler = 0; |
static char TimerWerteausgabe = 0; |
static char NeueKompassRichtungMerken = 0; |
static long ausgleichNick, ausgleichRoll; |
int IntegralNickMalFaktor,IntegralRollMalFaktor; |
unsigned char i; |
Mittelwert(); |
GRN_ON; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gaswert ermitteln |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
GasMischanteil = StickGas; |
if(GasMischanteil < MIN_GAS + 10) GasMischanteil = MIN_GAS + 10; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Empfang schlecht |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(SenderOkay < 100) |
{ |
if(!PcZugriff) |
{ |
if(BeepMuster == 0xffff) |
{ |
beeptime = 15000; |
BeepMuster = 0x0c00; |
} |
} |
if(RcLostTimer) RcLostTimer--; |
else |
{ |
MotorenEin = 0; |
Notlandung = 0; |
} |
ROT_ON; |
if(modell_fliegt > 1000) // wahrscheinlich in der Luft --> langsam absenken |
{ |
GasMischanteil = EE_Parameter.NotGas; |
Notlandung = 1; |
PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] = 0; |
PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] = 0; |
PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] = 0; |
PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] = 0; |
PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] = 0; |
} |
else MotorenEin = 0; |
} |
else |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Emfang gut |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(SenderOkay > 140) |
{ |
Notlandung = 0; |
RcLostTimer = EE_Parameter.NotGasZeit * 50; |
if(GasMischanteil > 40 && MotorenEin) |
{ |
if(modell_fliegt < 0xffff) modell_fliegt++; |
} |
if((modell_fliegt < 256)) |
{ |
SummeNick = 0; |
SummeRoll = 0; |
if(modell_fliegt == 250) |
{ |
NeueKompassRichtungMerken = 1; |
sollGier = 0; |
Mess_Integral_Gier = 0; |
// Mess_Integral_Gier2 = 0; |
} |
} else MikroKopterFlags |= FLAG_FLY; |
if((PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] > 80) && MotorenEin == 0) |
{ |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// auf Nullwerte kalibrieren |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] > 75) // Neutralwerte |
{ |
if(++delay_neutral > 200) // nicht sofort |
{ |
GRN_OFF; |
MotorenEin = 0; |
delay_neutral = 0; |
modell_fliegt = 0; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70 || abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) > 70) |
{ |
unsigned char setting=1; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < 70) setting = 1; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 2; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 3; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] <-70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 4; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] <-70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < 70) setting = 5; |
SetActiveParamSetNumber(setting); // aktiven Datensatz merken |
} |
// else |
if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) < 30 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < -70) |
{ |
WinkelOut.CalcState = 1; |
beeptime = 1000; |
} |
else |
{ |
ReadParameterSet(GetActiveParamSetNumber(), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
{ |
if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
} |
SetNeutral(); |
Piep(GetActiveParamSetNumber()); |
} |
} |
} |
else |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] < -75) // ACC Neutralwerte speichern |
{ |
if(++delay_neutral > 200) // nicht sofort |
{ |
GRN_OFF; |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_NICK],0xff); // Werte löschen |
MotorenEin = 0; |
delay_neutral = 0; |
modell_fliegt = 0; |
SetNeutral(); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_NICK],NeutralAccX / 256); // ACC-NeutralWerte speichern |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_NICK+1],NeutralAccX % 256); // ACC-NeutralWerte speichern |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL],NeutralAccY / 256); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL+1],NeutralAccY % 256); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_Z],(int)NeutralAccZ / 256); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_Z+1],(int)NeutralAccZ % 256); |
Piep(GetActiveParamSetNumber()); |
} |
} |
else delay_neutral = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gas ist unten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] < 35-120) |
{ |
// Starten |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] < -75) |
{ |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Einschalten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(++delay_einschalten > 200) |
{ |
delay_einschalten = 200; |
modell_fliegt = 1; |
MotorenEin = 1; |
sollGier = 0; |
Mess_Integral_Gier = 0; |
Mess_Integral_Gier2 = 0; |
Mess_IntegralNick = 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-- || Notlandung) |
{ |
static int stick_nick,stick_roll; |
ParameterZuordnung(); |
stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4; |
stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; |
StickNick = stick_nick - (GPS_Nick + GPS_Nick2); |
stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4; |
stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; |
StickRoll = stick_roll - (GPS_Roll + GPS_Roll2); |
StickGier = -PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]; |
if(StickGier > 2) StickGier -= 2; else |
if(StickGier < -2) StickGier += 2; else StickGier = 0; |
StickGas = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] + 120; |
GyroFaktor = (Parameter_Gyro_P + 10.0); |
IntegralFaktor = Parameter_Gyro_I; |
GyroFaktorGier = (Parameter_Gyro_P + 10.0); |
IntegralFaktorGier = Parameter_Gyro_I; |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//+ Analoge Steuerung per Seriell |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(ExternControl.Config & 0x01 && Parameter_ExternalControl > 128) |
{ |
StickNick += (int) ExternControl.Nick * (int) EE_Parameter.Stick_P; |
StickRoll += (int) ExternControl.Roll * (int) EE_Parameter.Stick_P; |
StickGier += ExternControl.Gier; |
ExternHoehenValue = (int) ExternControl.Hight * (int)EE_Parameter.Hoehe_Verstaerkung; |
if(ExternControl.Gas < StickGas) StickGas = ExternControl.Gas; |
} |
if(StickGas < 0) StickGas = 0; |
if(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) IntegralFaktor = 0; |
if(GyroFaktor < 0) GyroFaktor = 0; |
if(IntegralFaktor < 0) IntegralFaktor = 0; |
if(abs(StickNick/STICK_GAIN) > MaxStickNick) |
{ |
MaxStickNick = abs(StickNick)/STICK_GAIN; |
if(MaxStickNick > 100) MaxStickNick = 100; |
} |
else MaxStickNick--; |
if(abs(StickRoll/STICK_GAIN) > MaxStickRoll) |
{ |
MaxStickRoll = abs(StickRoll)/STICK_GAIN; |
if(MaxStickRoll > 100) MaxStickRoll = 100; |
} |
else MaxStickRoll--; |
if(Notlandung) {MaxStickNick = 0; MaxStickRoll = 0;} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Looping? |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > EE_Parameter.LoopThreshold) && EE_Parameter.BitConfig & CFG_LOOP_LINKS) Looping_Links = 1; |
else |
{ |
{ |
if((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < (EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese))) Looping_Links = 0; |
} |
} |
if((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < -EE_Parameter.LoopThreshold) && EE_Parameter.BitConfig & CFG_LOOP_RECHTS) Looping_Rechts = 1; |
else |
{ |
if(Looping_Rechts) // Hysterese |
{ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > -(EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese)) Looping_Rechts = 0; |
} |
} |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > EE_Parameter.LoopThreshold) && EE_Parameter.BitConfig & CFG_LOOP_OBEN) Looping_Oben = 1; |
else |
{ |
if(Looping_Oben) // Hysterese |
{ |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < (EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese))) Looping_Oben = 0; |
} |
} |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < -EE_Parameter.LoopThreshold) && EE_Parameter.BitConfig & CFG_LOOP_UNTEN) Looping_Unten = 1; |
else |
{ |
if(Looping_Unten) // Hysterese |
{ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > -(EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese)) Looping_Unten = 0; |
} |
} |
if(Looping_Links || Looping_Rechts) Looping_Roll = 1; else Looping_Roll = 0; |
if(Looping_Oben || Looping_Unten) { Looping_Nick = 1; Looping_Roll = 0; Looping_Links = 0; Looping_Rechts = 0;} else Looping_Nick = 0; |
} // Ende neue Funken-Werte |
if(Looping_Roll || Looping_Nick) |
{ |
if(GasMischanteil > EE_Parameter.LoopGasLimit) GasMischanteil = EE_Parameter.LoopGasLimit; |
TrichterFlug = 1; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Bei Empfangsausfall im Flug |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(Notlandung) |
{ |
StickGier = 0; |
StickNick = 0; |
StickRoll = 0; |
GyroFaktor = 90; |
IntegralFaktor = 120; |
GyroFaktorGier = 90; |
IntegralFaktorGier = 120; |
Looping_Roll = 0; |
Looping_Nick = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Integrale auf ACC-Signal abgleichen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define ABGLEICH_ANZAHL 256L |
MittelIntegralNick += IntegralNick; // Für die Mittelwertbildung aufsummieren |
MittelIntegralRoll += IntegralRoll; |
MittelIntegralNick2 += IntegralNick2; |
MittelIntegralRoll2 += IntegralRoll2; |
if(Looping_Nick || Looping_Roll) |
{ |
IntegralAccNick = 0; |
IntegralAccRoll = 0; |
MittelIntegralNick = 0; |
MittelIntegralRoll = 0; |
MittelIntegralNick2 = 0; |
MittelIntegralRoll2 = 0; |
Mess_IntegralNick2 = Mess_IntegralNick; |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
ZaehlMessungen = 0; |
LageKorrekturNick = 0; |
LageKorrekturRoll = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!Looping_Nick && !Looping_Roll && (Aktuell_az > 512 || MotorenEin)) |
{ |
long tmp_long, tmp_long2; |
if(FromNaviCtrl_Value.Kalman_K != -1 /*&& !TrichterFlug*/) |
{ |
tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick); |
tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll); |
tmp_long = (tmp_long * FromNaviCtrl_Value.Kalman_K) / (32 * 16); |
tmp_long2 = (tmp_long2 * FromNaviCtrl_Value.Kalman_K) / (32 * 16); |
if((MaxStickNick > 64) || (MaxStickRoll > 64)) |
{ |
tmp_long /= 2; |
tmp_long2 /= 2; |
} |
if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25) |
{ |
tmp_long /= 3; |
tmp_long2 /= 3; |
} |
if(tmp_long > (long) FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long = (long) FromNaviCtrl_Value.Kalman_MaxFusion; |
if(tmp_long < (long)-FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long = (long)-FromNaviCtrl_Value.Kalman_MaxFusion; |
if(tmp_long2 > (long) FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long2 = (long) FromNaviCtrl_Value.Kalman_MaxFusion; |
if(tmp_long2 < (long)-FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long2 = (long)-FromNaviCtrl_Value.Kalman_MaxFusion; |
} |
else |
{ |
tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick); |
tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll); |
tmp_long /= 16; |
tmp_long2 /= 16; |
if((MaxStickNick > 64) || (MaxStickRoll > 64)) |
{ |
tmp_long /= 3; |
tmp_long2 /= 3; |
} |
if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25) |
{ |
tmp_long /= 3; |
tmp_long2 /= 3; |
} |
#define AUSGLEICH 32 |
if(tmp_long > AUSGLEICH) tmp_long = AUSGLEICH; |
if(tmp_long < -AUSGLEICH) tmp_long =-AUSGLEICH; |
if(tmp_long2 > AUSGLEICH) tmp_long2 = AUSGLEICH; |
if(tmp_long2 <-AUSGLEICH) tmp_long2 =-AUSGLEICH; |
} |
//if(Poti2 > 20) { tmp_long = 0; tmp_long2 = 0;} |
Mess_IntegralNick -= tmp_long; |
Mess_IntegralRoll -= tmp_long2; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(ZaehlMessungen >= ABGLEICH_ANZAHL) |
{ |
static int cnt = 0; |
static char last_n_p,last_n_n,last_r_p,last_r_n; |
static long MittelIntegralNick_Alt,MittelIntegralRoll_Alt; |
if(!Looping_Nick && !Looping_Roll && !TrichterFlug && EE_Parameter.Driftkomp) |
{ |
MittelIntegralNick /= ABGLEICH_ANZAHL; |
MittelIntegralRoll /= ABGLEICH_ANZAHL; |
IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL; |
IntegralAccRoll = (EE_Parameter.GyroAccFaktor * IntegralAccRoll) / ABGLEICH_ANZAHL; |
IntegralAccZ = IntegralAccZ / ABGLEICH_ANZAHL; |
#define MAX_I 0//(Poti2/10) |
// Nick ++++++++++++++++++++++++++++++++++++++++++++++++ |
IntegralFehlerNick = (long)(MittelIntegralNick - (long)IntegralAccNick); |
ausgleichNick = IntegralFehlerNick / EE_Parameter.GyroAccAbgleich; |
// Roll ++++++++++++++++++++++++++++++++++++++++++++++++ |
IntegralFehlerRoll = (long)(MittelIntegralRoll - (long)IntegralAccRoll); |
ausgleichRoll = IntegralFehlerRoll / EE_Parameter.GyroAccAbgleich; |
LageKorrekturNick = ausgleichNick / ABGLEICH_ANZAHL; |
LageKorrekturRoll = ausgleichRoll / ABGLEICH_ANZAHL; |
if(((MaxStickNick > 64) || (MaxStickRoll > 64) || (abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25)) && (FromNaviCtrl_Value.Kalman_K == -1)) |
{ |
LageKorrekturNick /= 2; |
LageKorrekturRoll /= 2; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gyro-Drift ermitteln |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
MittelIntegralNick2 /= ABGLEICH_ANZAHL; |
MittelIntegralRoll2 /= ABGLEICH_ANZAHL; |
tmp_long = IntegralNick2 - IntegralNick; |
tmp_long2 = IntegralRoll2 - IntegralRoll; |
//DebugOut.Analog[25] = MittelIntegralRoll2 / 26; |
IntegralFehlerNick = tmp_long; |
IntegralFehlerRoll = tmp_long2; |
Mess_IntegralNick2 -= IntegralFehlerNick; |
Mess_IntegralRoll2 -= IntegralFehlerRoll; |
// IntegralFehlerNick = (IntegralFehlerNick * 1 + tmp_long) / 2; |
// IntegralFehlerRoll = (IntegralFehlerRoll * 1 + tmp_long2) / 2; |
if(EE_Parameter.Driftkomp) |
{ |
if(GierGyroFehler > ABGLEICH_ANZAHL/2) { AdNeutralGier++; AdNeutralGierBias++; } |
if(GierGyroFehler <-ABGLEICH_ANZAHL/2) { AdNeutralGier--; AdNeutralGierBias--; } |
} |
//DebugOut.Analog[22] = MittelIntegralRoll / 26; |
//DebugOut.Analog[24] = GierGyroFehler; |
GierGyroFehler = 0; |
/*DebugOut.Analog[17] = IntegralAccNick / 26; |
DebugOut.Analog[18] = IntegralAccRoll / 26; |
DebugOut.Analog[19] = IntegralFehlerNick;// / 26; |
DebugOut.Analog[20] = IntegralFehlerRoll;// / 26; |
*/ |
//DebugOut.Analog[21] = MittelIntegralNick / 26; |
//MittelIntegralRoll = MittelIntegralRoll; |
//DebugOut.Analog[28] = ausgleichNick; |
/* |
DebugOut.Analog[29] = ausgleichRoll; |
DebugOut.Analog[30] = LageKorrekturRoll * 10; |
*/ |
#define FEHLER_LIMIT (ABGLEICH_ANZAHL / 2) |
#define FEHLER_LIMIT1 (ABGLEICH_ANZAHL * 2) //4 |
#define FEHLER_LIMIT2 (ABGLEICH_ANZAHL * 16) //16 |
#define BEWEGUNGS_LIMIT 20000 |
// Nick +++++++++++++++++++++++++++++++++++++++++++++++++ |
cnt = 1;// + labs(IntegralFehlerNick) / 4096; |
if(labs(IntegralFehlerNick) > FEHLER_LIMIT1) cnt = 4; |
if(labs(MittelIntegralNick_Alt - MittelIntegralNick) < BEWEGUNGS_LIMIT || (FromNaviCtrl_Value.Kalman_MaxDrift > 3*8)) |
{ |
if(IntegralFehlerNick > FEHLER_LIMIT2) |
{ |
if(last_n_p) |
{ |
cnt += labs(IntegralFehlerNick) / (FEHLER_LIMIT2 / 8); |
ausgleichNick = IntegralFehlerNick / 8; |
if(ausgleichNick > 5000) ausgleichNick = 5000; |
LageKorrekturNick += ausgleichNick / ABGLEICH_ANZAHL; |
} |
else last_n_p = 1; |
} else last_n_p = 0; |
if(IntegralFehlerNick < -FEHLER_LIMIT2) |
{ |
if(last_n_n) |
{ |
cnt += labs(IntegralFehlerNick) / (FEHLER_LIMIT2 / 8); |
ausgleichNick = IntegralFehlerNick / 8; |
if(ausgleichNick < -5000) ausgleichNick = -5000; |
LageKorrekturNick += ausgleichNick / ABGLEICH_ANZAHL; |
} |
else last_n_n = 1; |
} else last_n_n = 0; |
} |
else |
{ |
cnt = 0; |
KompassSignalSchlecht = 1000; |
} |
if(cnt > EE_Parameter.Driftkomp) cnt = EE_Parameter.Driftkomp; |
if(FromNaviCtrl_Value.Kalman_MaxDrift) if(cnt > FromNaviCtrl_Value.Kalman_MaxDrift) cnt = FromNaviCtrl_Value.Kalman_MaxDrift; |
if(IntegralFehlerNick > FEHLER_LIMIT) AdNeutralNick += cnt; |
if(IntegralFehlerNick < -FEHLER_LIMIT) AdNeutralNick -= cnt; |
// Roll +++++++++++++++++++++++++++++++++++++++++++++++++ |
cnt = 1;// + labs(IntegralFehlerNick) / 4096; |
if(labs(IntegralFehlerRoll) > FEHLER_LIMIT1) cnt = 4; |
ausgleichRoll = 0; |
if(labs(MittelIntegralRoll_Alt - MittelIntegralRoll) < BEWEGUNGS_LIMIT || (FromNaviCtrl_Value.Kalman_MaxDrift > 3*8)) |
{ |
if(IntegralFehlerRoll > FEHLER_LIMIT2) |
{ |
if(last_r_p) |
{ |
cnt += labs(IntegralFehlerRoll) / (FEHLER_LIMIT2 / 8); |
ausgleichRoll = IntegralFehlerRoll / 8; |
if(ausgleichRoll > 5000) ausgleichRoll = 5000; |
LageKorrekturRoll += ausgleichRoll / ABGLEICH_ANZAHL; |
} |
else last_r_p = 1; |
} else last_r_p = 0; |
if(IntegralFehlerRoll < -FEHLER_LIMIT2) |
{ |
if(last_r_n) |
{ |
cnt += labs(IntegralFehlerRoll) / (FEHLER_LIMIT2 / 8); |
ausgleichRoll = IntegralFehlerRoll / 8; |
if(ausgleichRoll < -5000) ausgleichRoll = -5000; |
LageKorrekturRoll += ausgleichRoll / ABGLEICH_ANZAHL; |
} |
else last_r_n = 1; |
} else last_r_n = 0; |
} else |
{ |
cnt = 0; |
KompassSignalSchlecht = 1000; |
} |
if(cnt > EE_Parameter.Driftkomp) cnt = EE_Parameter.Driftkomp; |
if(FromNaviCtrl_Value.Kalman_MaxDrift) if(cnt > FromNaviCtrl_Value.Kalman_MaxDrift) cnt = FromNaviCtrl_Value.Kalman_MaxDrift; |
if(IntegralFehlerRoll > FEHLER_LIMIT) AdNeutralRoll += cnt; |
if(IntegralFehlerRoll < -FEHLER_LIMIT) AdNeutralRoll -= cnt; |
} |
else |
{ |
LageKorrekturRoll = 0; |
LageKorrekturNick = 0; |
TrichterFlug = 0; |
} |
if(!IntegralFaktor) { LageKorrekturRoll = 0; LageKorrekturNick = 0;} // z.B. bei HH |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++ |
MittelIntegralNick_Alt = MittelIntegralNick; |
MittelIntegralRoll_Alt = MittelIntegralRoll; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++ |
IntegralAccNick = 0; |
IntegralAccRoll = 0; |
IntegralAccZ = 0; |
MittelIntegralNick = 0; |
MittelIntegralRoll = 0; |
MittelIntegralNick2 = 0; |
MittelIntegralRoll2 = 0; |
ZaehlMessungen = 0; |
} // ZaehlMessungen >= ABGLEICH_ANZAHL |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gieren |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// if(GasMischanteil < 35) { if(StickGier > 10) StickGier = 10; else if(StickGier < -10) StickGier = -10;}; |
if(abs(StickGier) > 15) // war 35 |
{ |
KompassSignalSchlecht = 1000; |
if(!(EE_Parameter.GlobalConfig & CFG_KOMPASS_FIX)) |
{ |
NeueKompassRichtungMerken = 1; |
}; |
} |
tmp_int = (long) EE_Parameter.Gier_P * ((long)StickGier * abs(StickGier)) / 512L; // expo y = ax + bx² |
tmp_int += (EE_Parameter.Gier_P * StickGier) / 4; |
sollGier = tmp_int; |
Mess_Integral_Gier -= tmp_int; |
if(Mess_Integral_Gier > 50000) Mess_Integral_Gier = 50000; // begrenzen |
if(Mess_Integral_Gier <-50000) Mess_Integral_Gier =-50000; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Kompass |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//DebugOut.Analog[16] = KompassSignalSchlecht; |
if(KompassValue && (EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV)) |
{ |
int w,v,r,fehler,korrektur; |
w = abs(IntegralNick /512); // mit zunehmender Neigung den Einfluss drosseln |
v = abs(IntegralRoll /512); |
if(v > w) w = v; // grösste Neigung ermitteln |
korrektur = w / 8 + 1; |
fehler = ((540 + KompassValue - (ErsatzKompass/GIER_GRAD_FAKTOR)) % 360) - 180; |
if(abs(MesswertGier) > 128) |
{ |
fehler = 0; |
} |
if(!KompassSignalSchlecht && w < 25) |
{ |
GierGyroFehler += fehler; |
if(NeueKompassRichtungMerken) |
{ |
beeptime = 200; |
// KompassStartwert = KompassValue; |
ErsatzKompass = KompassValue * GIER_GRAD_FAKTOR; |
KompassStartwert = (ErsatzKompass/GIER_GRAD_FAKTOR); |
NeueKompassRichtungMerken = 0; |
} |
} |
ErsatzKompass += (fehler * 8) / korrektur; |
w = (w * Parameter_KompassWirkung) / 32; // auf die Wirkung normieren |
w = Parameter_KompassWirkung - w; // Wirkung ggf drosseln |
if(w >= 0) |
{ |
if(!KompassSignalSchlecht) |
{ |
v = 64 + ((MaxStickNick + MaxStickRoll)) / 8; |
r = ((540 + (ErsatzKompass/GIER_GRAD_FAKTOR) - KompassStartwert) % 360) - 180; |
// r = KompassRichtung; |
v = (r * w) / v; // nach Kompass ausrichten |
w = 3 * Parameter_KompassWirkung; |
if(v > w) v = w; // Begrenzen |
else |
if(v < -w) v = -w; |
Mess_Integral_Gier += v; |
} |
if(KompassSignalSchlecht) KompassSignalSchlecht--; |
} |
else KompassSignalSchlecht = 500; // so lange das Signal taub stellen --> ca. 1 sek |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Debugwerte zuordnen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!TimerWerteausgabe--) |
{ |
TimerWerteausgabe = 24; |
DebugOut.Analog[0] = IntegralNick / (EE_Parameter.GyroAccFaktor * 4); |
DebugOut.Analog[1] = IntegralRoll / (EE_Parameter.GyroAccFaktor * 4); |
DebugOut.Analog[2] = Mittelwert_AccNick / 4; |
DebugOut.Analog[3] = Mittelwert_AccRoll / 4; |
DebugOut.Analog[4] = MesswertGier; |
DebugOut.Analog[5] = HoehenWert; |
DebugOut.Analog[6] = Aktuell_az;//(Mess_Integral_Hoch / 512);//Aktuell_az; |
DebugOut.Analog[8] = KompassValue; |
DebugOut.Analog[9] = UBat; |
DebugOut.Analog[11] = ErsatzKompass / GIER_GRAD_FAKTOR; |
DebugOut.Analog[10] = SenderOkay; |
//DebugOut.Analog[16] = Mittelwert_AccHoch; |
//DebugOut.Analog[17] = FromNaviCtrl_Value.Distance; |
//DebugOut.Analog[18] = (int)FromNaviCtrl_Value.OsdBar; |
DebugOut.Analog[19] = WinkelOut.CalcState; |
DebugOut.Analog[20] = ServoValue; |
// DebugOut.Analog[24] = MesswertNick/2; |
// DebugOut.Analog[25] = MesswertRoll/2; |
DebugOut.Analog[27] = (int)FromNaviCtrl_Value.Kalman_MaxDrift; |
// DebugOut.Analog[28] = (int)FromNaviCtrl_Value.Kalman_MaxFusion; |
// DebugOut.Analog[29] = (int)FromNaviCtrl_Value.Kalman_K; |
DebugOut.Analog[29] = FromNaviCtrl_Value.SerialDataOkay; |
DebugOut.Analog[30] = GPS_Nick; |
DebugOut.Analog[31] = GPS_Roll; |
// DebugOut.Analog[19] -= DebugOut.Analog[19]/128; |
// if(DebugOut.Analog[19] > 0) DebugOut.Analog[19]--; else DebugOut.Analog[19]++; |
/* DebugOut.Analog[16] = motor_rx[0]; |
DebugOut.Analog[17] = motor_rx[1]; |
DebugOut.Analog[18] = motor_rx[2]; |
DebugOut.Analog[19] = motor_rx[3]; |
DebugOut.Analog[20] = motor_rx[0] + motor_rx[1] + motor_rx[2] + motor_rx[3]; |
DebugOut.Analog[20] /= 14; |
DebugOut.Analog[21] = motor_rx[4]; |
DebugOut.Analog[22] = motor_rx[5]; |
DebugOut.Analog[23] = motor_rx[6]; |
DebugOut.Analog[24] = motor_rx[7]; |
DebugOut.Analog[25] = motor_rx[4] + motor_rx[5] + motor_rx[6] + motor_rx[7]; |
*/ |
// DebugOut.Analog[9] = MesswertNick; |
// DebugOut.Analog[9] = SollHoehe; |
// DebugOut.Analog[10] = Mess_Integral_Gier / 128; |
// DebugOut.Analog[11] = KompassStartwert; |
// DebugOut.Analog[10] = Parameter_Gyro_I; |
// DebugOut.Analog[10] = EE_Parameter.Gyro_I; |
// DebugOut.Analog[9] = KompassRichtung; |
// DebugOut.Analog[10] = GasMischanteil; |
// DebugOut.Analog[3] = HoeheD * 32; |
// DebugOut.Analog[4] = hoehenregler; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Drehgeschwindigkeit und -winkel zu einem Istwert zusammenfassen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(TrichterFlug) { SummeRoll = 0; SummeNick = 0;}; |
if(!Looping_Nick) IntegralNickMalFaktor = (IntegralNick * IntegralFaktor) / (44000 / STICK_GAIN); else IntegralNickMalFaktor = 0; |
if(!Looping_Roll) IntegralRollMalFaktor = (IntegralRoll * IntegralFaktor) / (44000 / STICK_GAIN); else IntegralRollMalFaktor = 0; |
#define TRIM_MAX 200 |
if(TrimNick > TRIM_MAX) TrimNick = TRIM_MAX; else if(TrimNick <-TRIM_MAX) TrimNick =-TRIM_MAX; |
if(TrimRoll > TRIM_MAX) TrimRoll = TRIM_MAX; else if(TrimRoll <-TRIM_MAX) TrimRoll =-TRIM_MAX; |
MesswertNick = IntegralNickMalFaktor + (long)((long)MesswertNick * GyroFaktor + (long)TrimNick * 128L) / (256L / STICK_GAIN); |
MesswertRoll = IntegralRollMalFaktor + (long)((long)MesswertRoll * GyroFaktor + (long)TrimRoll * 128L) / (256L / STICK_GAIN); |
MesswertGier = (long)(MesswertGier * 2 * (long)GyroFaktorGier) / (256L / STICK_GAIN) + (long)(Integral_Gier * IntegralFaktorGier) / (2 * (44000 / STICK_GAIN)); |
// Maximalwerte abfangen |
// #define MAX_SENSOR (4096*STICK_GAIN) |
#define MAX_SENSOR (4096*4) |
if(MesswertNick > MAX_SENSOR) MesswertNick = MAX_SENSOR; |
if(MesswertNick < -MAX_SENSOR) MesswertNick = -MAX_SENSOR; |
if(MesswertRoll > MAX_SENSOR) MesswertRoll = MAX_SENSOR; |
if(MesswertRoll < -MAX_SENSOR) MesswertRoll = -MAX_SENSOR; |
if(MesswertGier > MAX_SENSOR) MesswertGier = MAX_SENSOR; |
if(MesswertGier < -MAX_SENSOR) MesswertGier = -MAX_SENSOR; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// all BL-Ctrl connected? |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(MissingMotor) if(modell_fliegt > 1 && modell_fliegt < 50 && GasMischanteil > 0) |
{ |
modell_fliegt = 1; |
GasMischanteil = MIN_GAS; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Höhenregelung |
// Die Höhenregelung schwächt lediglich das Gas ab, erhöht es allerdings nicht |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
GasMischanteil *= STICK_GAIN; |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung |
{ |
int tmp_int; |
static char delay = 100; |
if(EE_Parameter.GlobalConfig & CFG_HOEHEN_SCHALTER) // Regler wird über Schalter gesteuert |
{ |
if(Parameter_MaxHoehe < 50) |
{ |
if(!delay--) |
{ |
if((MessLuftdruck > 1000) && OCR0A < 254) |
{ |
if(OCR0A < 244) |
{ |
ExpandBaro -= 10; |
OCR0A = DruckOffsetSetting - ExpandBaro; |
} |
else OCR0A = 254; |
beeptime = 300; |
delay = 250; |
} |
else |
if((MessLuftdruck < 100) && OCR0A > 1) |
{ |
if(OCR0A > 10) |
{ |
ExpandBaro += 10; |
OCR0A = DruckOffsetSetting - ExpandBaro; |
} |
else OCR0A = 1; |
beeptime = 300; |
delay = 250; |
} |
else |
{ |
SollHoehe = HoehenWert - 20; // Parameter_MaxHoehe ist der PPM-Wert des Schalters |
HoehenReglerAktiv = 0; |
delay = 1; |
} |
} |
} |
else |
{ |
HoehenReglerAktiv = 1; |
delay = 200; |
} |
} |
else |
{ |
SollHoehe = ((int) ExternHoehenValue + (int) Parameter_MaxHoehe) * (int)EE_Parameter.Hoehe_Verstaerkung - 20; |
HoehenReglerAktiv = 1; |
} |
if(Notlandung) SollHoehe = 0; |
h = HoehenWert; |
if((h > SollHoehe) && HoehenReglerAktiv) // zu hoch --> drosseln |
{ |
h = ((h - SollHoehe) * (int) Parameter_Hoehe_P) / (16 / STICK_GAIN); // Differenz bestimmen --> P-Anteil |
h = GasMischanteil - h; // vom Gas abziehen |
h -= (HoeheD)/(8/STICK_GAIN); // D-Anteil |
tmp_int = ((Mess_Integral_Hoch / 128) * (signed long) Parameter_Hoehe_ACC_Wirkung) / (128 / STICK_GAIN); |
if(tmp_int > 70*STICK_GAIN) tmp_int = 70*STICK_GAIN; |
else if(tmp_int < -(70*STICK_GAIN)) tmp_int = -(70*STICK_GAIN); |
h -= tmp_int; |
hoehenregler = (hoehenregler*15 + h) / 16; |
if(hoehenregler < EE_Parameter.Hoehe_MinGas * STICK_GAIN) // nicht unter MIN |
{ |
if(GasMischanteil >= EE_Parameter.Hoehe_MinGas * STICK_GAIN) hoehenregler = EE_Parameter.Hoehe_MinGas * STICK_GAIN; |
if(GasMischanteil < EE_Parameter.Hoehe_MinGas * STICK_GAIN) hoehenregler = GasMischanteil; |
} |
if(hoehenregler > GasMischanteil) hoehenregler = GasMischanteil; // nicht mehr als Gas |
GasMischanteil = hoehenregler; |
} |
} |
if(GasMischanteil > (MAX_GAS - 20) * STICK_GAIN) GasMischanteil = (MAX_GAS - 20) * STICK_GAIN; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Mischer und PI-Regler |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DebugOut.Analog[7] = GasMischanteil; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gier-Anteil |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define MUL_G 1.0 |
GierMischanteil = MesswertGier - sollGier * STICK_GAIN; // Regler für Gier |
// GierMischanteil = 0; |
#define MIN_GIERGAS (40*STICK_GAIN) // unter diesem Gaswert trotzdem Gieren |
if(GasMischanteil > MIN_GIERGAS) |
{ |
if(GierMischanteil > (GasMischanteil / 2)) GierMischanteil = GasMischanteil / 2; |
if(GierMischanteil < -(GasMischanteil / 2)) GierMischanteil = -(GasMischanteil / 2); |
} |
else |
{ |
if(GierMischanteil > (MIN_GIERGAS / 2)) GierMischanteil = MIN_GIERGAS / 2; |
if(GierMischanteil < -(MIN_GIERGAS / 2)) GierMischanteil = -(MIN_GIERGAS / 2); |
} |
tmp_int = MAX_GAS*STICK_GAIN; |
if(GierMischanteil > ((tmp_int - GasMischanteil))) GierMischanteil = ((tmp_int - GasMischanteil)); |
if(GierMischanteil < -((tmp_int - GasMischanteil))) GierMischanteil = -((tmp_int - GasMischanteil)); |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Nick-Achse |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DiffNick = MesswertNick - StickNick; // Differenz bestimmen |
if(IntegralFaktor) SummeNick += IntegralNickMalFaktor - StickNick; // I-Anteil bei Winkelregelung |
else SummeNick += DiffNick; // I-Anteil bei HH |
if(SummeNick > (STICK_GAIN * 16000L)) SummeNick = (STICK_GAIN * 16000L); |
if(SummeNick < -(16000L * STICK_GAIN)) SummeNick = -(16000L * STICK_GAIN); |
pd_ergebnis_nick = DiffNick + SummeNick / Ki; // PI-Regler für Nick |
// Motor Vorn |
tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
if(pd_ergebnis_nick > tmp_int) pd_ergebnis_nick = tmp_int; |
if(pd_ergebnis_nick < -tmp_int) pd_ergebnis_nick = -tmp_int; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Roll-Achse |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DiffRoll = MesswertRoll - StickRoll; // Differenz bestimmen |
if(IntegralFaktor) SummeRoll += IntegralRollMalFaktor - StickRoll;// I-Anteil bei Winkelregelung |
else SummeRoll += DiffRoll; // I-Anteil bei HH |
if(SummeRoll > (STICK_GAIN * 16000L)) SummeRoll = (STICK_GAIN * 16000L); |
if(SummeRoll < -(16000L * STICK_GAIN)) SummeRoll = -(16000L * STICK_GAIN); |
pd_ergebnis_roll = DiffRoll + SummeRoll / Ki; // PI-Regler für Roll |
tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
if(pd_ergebnis_roll > tmp_int) pd_ergebnis_roll = tmp_int; |
if(pd_ergebnis_roll < -tmp_int) pd_ergebnis_roll = -tmp_int; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Universal Mixer |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
for(i=0; i<MAX_MOTORS; i++) |
{ |
signed int tmp_int; |
if(Mixer.Motor[i][0] > 0) |
{ |
tmp_int = ((long)GasMischanteil * Mixer.Motor[i][0]) / 64L; |
tmp_int += ((long)pd_ergebnis_nick * Mixer.Motor[i][1]) / 64L; |
tmp_int += ((long)pd_ergebnis_roll * Mixer.Motor[i][2]) / 64L; |
tmp_int += ((long)GierMischanteil * Mixer.Motor[i][3]) / 64L; |
tmp_motorwert[i] = MotorSmoothing(tmp_int,tmp_motorwert[i]); // Filter |
tmp_int = tmp_motorwert[i] / STICK_GAIN; |
CHECK_MIN_MAX(tmp_int,MIN_GAS,MAX_GAS); |
Motor[i] = tmp_int; |
} |
else Motor[i] = 0; |
} |
/* |
if(Poti1 > 20) Motor1 = 0; |
if(Poti1 > 90) Motor6 = 0; |
if(Poti1 > 140) Motor2 = 0; |
//if(Poti1 > 200) Motor7 = 0; |
*/ |
} |
/branches/V0.74d-Arthur P/fc.h |
---|
0,0 → 1,182 |
/*####################################################################################### |
Flight Control |
#######################################################################################*/ |
#ifndef _FC_H |
#define _FC_H |
//#define GIER_GRAD_FAKTOR 1291L // Abhängigkeit zwischen GyroIntegral und Winkel |
//#define GIER_GRAD_FAKTOR 1160L |
extern long GIER_GRAD_FAKTOR; // Abhängigkeit zwischen GyroIntegral und Winkel |
#define STICK_GAIN 4 |
#define FLAG_MOTOR_RUN 1 |
#define FLAG_FLY 2 |
#define FLAG_CALIBRATE 4 |
#define FLAG_START 8 |
#define MAX_MOTORS 12 |
#define CHECK_MIN_MAX(wert,min,max) {if(wert < min) wert = min; else if(wert > max) wert = max;} |
extern volatile unsigned char MikroKopterFlags; |
extern volatile unsigned int I2CTimeout; |
extern unsigned char Sekunde,Minute; |
extern long IntegralNick,IntegralNick2; |
extern long IntegralRoll,IntegralRoll2; |
//extern int IntegralNick,IntegralNick2; |
//extern int IntegralRoll,IntegralRoll2; |
extern long Mess_IntegralNick,Mess_IntegralNick2; |
extern long Mess_IntegralRoll,Mess_IntegralRoll2; |
extern long IntegralAccNick,IntegralAccRoll; |
extern volatile long Mess_Integral_Hoch; |
extern long Integral_Gier,Mess_Integral_Gier,Mess_Integral_Gier2; |
extern int KompassValue; |
extern int KompassStartwert; |
extern int KompassRichtung; |
extern int TrimNick, TrimRoll; |
extern long ErsatzKompass; |
extern int ErsatzKompassInGrad; // Kompasswert in Grad |
extern int HoehenWert; |
extern int SollHoehe; |
extern int MesswertNick,MesswertRoll,MesswertGier; |
extern int AdNeutralNick,AdNeutralRoll,AdNeutralGier, Mittelwert_AccNick, Mittelwert_AccRoll; |
extern int NeutralAccX, NeutralAccY,Mittelwert_AccHoch; |
extern unsigned char HoehenReglerAktiv; |
extern volatile float NeutralAccZ; |
extern long Umschlag180Nick, Umschlag180Roll; |
extern signed int ExternStickNick,ExternStickRoll,ExternStickGier; |
extern unsigned char Parameter_UserParam1,Parameter_UserParam2,Parameter_UserParam3,Parameter_UserParam4,Parameter_UserParam5,Parameter_UserParam6,Parameter_UserParam7,Parameter_UserParam8; |
extern int NaviAccNick,NaviAccRoll,NaviCntAcc; |
extern unsigned int modell_fliegt; |
void MotorRegler(void); |
void SendMotorData(void); |
void CalibrierMittelwert(void); |
void Mittelwert(void); |
void SetNeutral(void); |
void Piep(unsigned char Anzahl); |
extern unsigned char h,m,s; |
extern volatile unsigned char Timeout ; |
extern unsigned char CosinusNickWinkel, CosinusRollWinkel; |
extern int DiffNick,DiffRoll; |
extern int Poti1, Poti2, Poti3, Poti4; |
extern volatile unsigned char SenderOkay; |
extern unsigned char RequiredMotors; |
extern int StickNick,StickRoll,StickGier; |
extern char MotorenEin; |
extern void DefaultKonstanten1(void); |
extern void DefaultKonstanten2(void); |
extern void DefaultKonstanten3(void); |
extern void DefaultStickMapping(void); |
#define STRUCT_PARAM_LAENGE sizeof(EE_Parameter) |
struct mk_param_struct |
{ |
unsigned char Kanalbelegung[8]; // GAS[0], GIER[1],NICK[2], ROLL[3], POTI1, POTI2, POTI3 |
unsigned char GlobalConfig; // 0x01=Höhenregler aktiv,0x02=Kompass aktiv, 0x04=GPS aktiv, 0x08=Heading Hold aktiv |
unsigned char Hoehe_MinGas; // Wert : 0-100 |
unsigned char Luftdruck_D; // Wert : 0-250 |
unsigned char MaxHoehe; // Wert : 0-32 |
unsigned char Hoehe_P; // Wert : 0-32 |
unsigned char Hoehe_Verstaerkung; // Wert : 0-50 |
unsigned char Hoehe_ACC_Wirkung; // Wert : 0-250 |
unsigned char Stick_P; // Wert : 1-6 |
unsigned char Stick_D; // Wert : 0-64 |
unsigned char Gier_P; // Wert : 1-20 |
unsigned char Gas_Min; // Wert : 0-32 |
unsigned char Gas_Max; // Wert : 33-250 |
unsigned char GyroAccFaktor; // Wert : 1-64 |
unsigned char KompassWirkung; // Wert : 0-32 |
unsigned char Gyro_P; // Wert : 10-250 |
unsigned char Gyro_I; // Wert : 0-250 |
unsigned char Gyro_D; // Wert : 0-250 |
unsigned char UnterspannungsWarnung; // Wert : 0-250 |
unsigned char NotGas; // Wert : 0-250 //Gaswert bei Empängsverlust |
unsigned char NotGasZeit; // Wert : 0-250 // Zeitbis auf NotGas geschaltet wird, wg. Rx-Problemen |
unsigned char UfoAusrichtung; // X oder + Formation |
unsigned char I_Faktor; // Wert : 0-250 |
unsigned char UserParam1; // Wert : 0-250 |
unsigned char UserParam2; // Wert : 0-250 |
unsigned char UserParam3; // Wert : 0-250 |
unsigned char UserParam4; // Wert : 0-250 |
unsigned char ServoNickControl; // Wert : 0-250 // Stellung des Servos |
unsigned char ServoNickComp; // Wert : 0-250 // Einfluss Gyro/Servo |
unsigned char ServoNickMin; // Wert : 0-250 // Anschlag |
unsigned char ServoNickMax; // Wert : 0-250 // Anschlag |
unsigned char ServoNickRefresh; // |
unsigned char LoopGasLimit; // Wert: 0-250 max. Gas während Looping |
unsigned char LoopThreshold; // Wert: 0-250 Schwelle für Stickausschlag |
unsigned char LoopHysterese; // Wert: 0-250 Hysterese für Stickausschlag |
unsigned char AchsKopplung1; // Wert: 0-250 Faktor, mit dem Gier die Achsen Roll und Nick koppelt (NickRollMitkopplung) |
unsigned char AchsKopplung2; // Wert: 0-250 Faktor, mit dem Nick und Roll verkoppelt werden |
unsigned char CouplingYawCorrection; // Wert: 0-250 Faktor, mit dem Nick und Roll verkoppelt werden |
unsigned char WinkelUmschlagNick; // Wert: 0-250 180°-Punkt |
unsigned char WinkelUmschlagRoll; // Wert: 0-250 180°-Punkt |
unsigned char GyroAccAbgleich; // 1/k (Koppel_ACC_Wirkung) |
unsigned char Driftkomp; |
unsigned char DynamicStability; |
unsigned char UserParam5; // Wert : 0-250 |
unsigned char UserParam6; // Wert : 0-250 |
unsigned char UserParam7; // Wert : 0-250 |
unsigned char UserParam8; // Wert : 0-250 |
//---Output --------------------------------------------- |
unsigned char J16Bitmask; // for the J16 Output |
unsigned char J16Timing; // for the J16 Output |
unsigned char J17Bitmask; // for the J17 Output |
unsigned char J17Timing; // for the J17 Output |
//---NaviCtrl--------------------------------------------- |
unsigned char NaviGpsModeControl; // Parameters for the Naviboard |
unsigned char NaviGpsGain; |
unsigned char NaviGpsP; |
unsigned char NaviGpsI; |
unsigned char NaviGpsD; |
unsigned char NaviGpsPLimit; |
unsigned char NaviGpsILimit; |
unsigned char NaviGpsDLimit; |
unsigned char NaviGpsACC; |
unsigned char NaviGpsMinSat; |
unsigned char NaviStickThreshold; |
unsigned char NaviWindCorrection; |
unsigned char NaviSpeedCompensation; |
unsigned char NaviOperatingRadius; |
unsigned char NaviAngleLimitation; |
unsigned char NaviPH_LoginTime; |
//---Ext.Ctrl--------------------------------------------- |
unsigned char ExternalControl; // for serial Control |
//------------------------------------------------ |
unsigned char BitConfig; // (war Loop-Cfg) Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
unsigned char ServoNickCompInvert; // Wert : 0-250 0 oder 1 // WICHTIG!!! am Ende lassen |
unsigned char Reserved[4]; |
char Name[12]; |
}; |
struct |
{ |
char Revision; |
char Name[12]; |
signed char Motor[16][4]; |
} Mixer; |
extern struct mk_param_struct EE_Parameter; |
extern unsigned char Parameter_Luftdruck_D; |
extern unsigned char Parameter_MaxHoehe; |
extern unsigned char Parameter_Hoehe_P; |
extern unsigned char Parameter_Hoehe_ACC_Wirkung; |
extern unsigned char Parameter_KompassWirkung; |
extern unsigned char Parameter_Gyro_P; |
extern unsigned char Parameter_Gyro_I; |
extern unsigned char Parameter_Gier_P; |
extern unsigned char Parameter_ServoNickControl; |
extern unsigned char Parameter_AchsKopplung1; |
extern unsigned char Parameter_AchsKopplung2; |
//extern unsigned char Parameter_AchsGegenKopplung1; |
extern unsigned char Parameter_J16Bitmask; // for the J16 Output |
extern unsigned char Parameter_J16Timing; // for the J16 Output |
extern unsigned char Parameter_J17Bitmask; // for the J17 Output |
extern unsigned char Parameter_J17Timing; // for the J17 Output |
extern signed char MixerTable[MAX_MOTORS][4]; |
extern unsigned char Motor[MAX_MOTORS]; |
#endif //_FC_H |
/branches/V0.74d-Arthur P/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></Project> |
/branches/V0.74d-Arthur P/flight.pnps |
---|
0,0 → 1,0 |
<pd><ViewState><e p="Flight-Ctrl" x="true"></e></ViewState></pd> |
/branches/V0.74d-Arthur P/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.74d-Arthur P/led.c |
---|
0,0 → 1,49 |
#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; |
if(!delay--) // 10ms Intervall |
{ |
delay = 4; |
if((EE_Parameter.J16Timing > 250) && (Parameter_J16Timing > 230)) {if(EE_Parameter.J16Bitmask & 128) J16_ON; else J16_OFF;} |
else |
if((EE_Parameter.J16Timing > 250) && (Parameter_J16Timing < 10)) {if(EE_Parameter.J16Bitmask & 128) J16_OFF; else J16_ON;} |
else |
if(!J16Blinkcount--) |
{ |
J16Blinkcount = Parameter_J16Timing-1; |
if(J16Mask == 1) J16Mask = 128; else J16Mask /= 2; |
if(J16Mask & EE_Parameter.J16Bitmask) J16_ON; else J16_OFF; |
} |
if((EE_Parameter.J17Timing > 250) && (Parameter_J17Timing > 230)) {if(EE_Parameter.J17Bitmask & 128) J17_ON; else J17_OFF;} |
else |
if((EE_Parameter.J17Timing > 250) && (Parameter_J17Timing < 10)) {if(EE_Parameter.J17Bitmask & 128) J17_OFF; else J17_ON;} |
else |
if(!J17Blinkcount--) |
{ |
J17Blinkcount = Parameter_J17Timing-1; |
if(J17Mask == 1) J17Mask = 128; else J17Mask /= 2; |
if(J17Mask & EE_Parameter.J17Bitmask) J17_ON; else J17_OFF; |
} |
} |
} |
/branches/V0.74d-Arthur P/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.74d-Arthur P/main.c |
---|
0,0 → 1,365 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + Nur für den privaten Gebrauch |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten und nicht-kommerziellen Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt und genannt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-commercial use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be |
// + clearly linked as origin |
// + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
unsigned char EEPromArray[E2END+1] EEMEM; |
unsigned char PlatinenVersion = 10; |
unsigned char SendVersionToNavi = 1; |
// -- Parametersatz aus EEPROM lesen --- |
// number [1..5] |
void ReadParameterSet(unsigned char number, unsigned char *buffer, unsigned char length) |
{ |
if((number > 5)||(number < 1)) number = 3; |
eeprom_read_block(buffer, &EEPromArray[EEPROM_ADR_PARAM_BEGIN + length * (number - 1)], length); |
LED_Init(); |
} |
// -- Parametersatz ins EEPROM schreiben --- |
// number [1..5] |
void WriteParameterSet(unsigned char number, unsigned char *buffer, unsigned char length) |
{ |
if(number > 5) number = 5; |
if(number < 1) return; |
eeprom_write_block(buffer, &EEPromArray[EEPROM_ADR_PARAM_BEGIN + length * (number - 1)], length); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_PARAM_LENGTH], length); // Länge der Datensätze merken |
eeprom_write_block(buffer, &EEPromArray[EEPROM_ADR_CHANNELS], 8); // 8 Kanäle merken |
SetActiveParamSetNumber(number); |
LED_Init(); |
} |
unsigned char GetActiveParamSetNumber(void) |
{ |
unsigned char set; |
set = eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET]); |
if((set > 5) || (set < 1)) |
{ |
set = 3; |
SetActiveParamSetNumber(set); // diesen Parametersatz als aktuell merken |
} |
return(set); |
} |
void SetActiveParamSetNumber(unsigned char number) |
{ |
if(number > 5) number = 5; |
if(number < 1) return; |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], number); // diesen Parametersatz als aktuell merken |
} |
void CalMk3Mag(void) |
{ |
static unsigned char stick = 1; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > -20) stick = 0; |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < -70) && !stick) |
{ |
stick = 1; |
WinkelOut.CalcState++; |
if(WinkelOut.CalcState > 4) |
{ |
// WinkelOut.CalcState = 0; // in Uart.c |
beeptime = 1000; |
} |
else Piep(WinkelOut.CalcState); |
} |
DebugOut.Analog[19] = WinkelOut.CalcState; |
} |
//############################################################################ |
//Hauptprogramm |
int main (void) |
//############################################################################ |
{ |
unsigned int timer,i; |
DDRB = 0x00; |
PORTB = 0x00; |
for(timer = 0; timer < 1000; timer++); // verzögern |
if(PINB & 0x01) |
{ |
if(PINB & 0x02) PlatinenVersion = 13; |
else PlatinenVersion = 11; |
} |
else |
{ |
if(PINB & 0x02) PlatinenVersion = 20; |
else PlatinenVersion = 10; |
} |
DDRC = 0x81; // SCL |
DDRC |=0x40; // HEF4017 Reset |
PORTC = 0xff; // Pullup SDA |
DDRB = 0x1B; // LEDs und Druckoffset |
PORTB = 0x01; // LED_Rot |
DDRD = 0x3E; // Speaker & TXD & J3 J4 J5 |
DDRD |=0x80; // J7 -> Servo signal |
PORTD = 0x47; // LED |
HEF4017R_ON; |
MCUSR &=~(1<<WDRF); |
WDTCSR |= (1<<WDCE)|(1<<WDE); |
WDTCSR = 0; |
beeptime = 2000; |
StickGier = 0; PPM_in[K_GAS] = 0;StickRoll = 0; StickNick = 0; |
if(PlatinenVersion >= 20) GIER_GRAD_FAKTOR = 1160; else GIER_GRAD_FAKTOR = 1291; // unterschiedlich für ME und ENC |
ROT_OFF; |
Timer_Init(); |
TIMER2_Init(); |
UART_Init(); |
rc_sum_init(); |
ADC_Init(); |
i2c_init(); |
SPI_MasterInit(); |
sei(); |
printf("\n\r==================================="); |
printf("\n\rFlightControl\n\rHardware:%d.%d\n\rSoftware:V%d.%d%c ",PlatinenVersion/10,PlatinenVersion%10, VERSION_MAJOR, VERSION_MINOR,VERSION_PATCH + 'a'); |
if(UCSR1A == 0x20 && UCSR1C == 0x06) // initial Values for 644P |
{ |
Uart1Init(); |
} |
GRN_ON; |
ReadParameterSet(3, (unsigned char *) &EE_Parameter.Kanalbelegung[0], 9); // read only the first bytes |
if((eeprom_read_byte(&EEPromArray[EEPROM_ADR_MIXER_TABLE]) == MIXER_REVISION) && // Check Revision in the first Byte |
(eeprom_read_byte(&EEPromArray[EEPROM_ADR_VALID]) != 0xff)) // Settings reset via Koptertool |
{ |
unsigned char i; |
RequiredMotors = 0; |
eeprom_read_block(&Mixer, &EEPromArray[EEPROM_ADR_MIXER_TABLE], sizeof(Mixer)); |
for(i=0; i<16;i++) { if(Mixer.Motor[i][0] > 0) RequiredMotors++;} |
} |
else // default |
{ |
unsigned char i; |
printf("\n\rGenerating default Mixer Table"); |
for(i=0; i<16;i++) { Mixer.Motor[i][0] = 0;Mixer.Motor[i][1] = 0;Mixer.Motor[i][2] = 0;Mixer.Motor[i][3] = 0;}; |
// default = Quadro |
Mixer.Motor[0][0] = 64; Mixer.Motor[0][1] = +64; Mixer.Motor[0][2] = 0; Mixer.Motor[0][3] = +64; |
Mixer.Motor[1][0] = 64; Mixer.Motor[1][1] = -64; Mixer.Motor[1][2] = 0; Mixer.Motor[1][3] = +64; |
Mixer.Motor[2][0] = 64; Mixer.Motor[2][1] = 0; Mixer.Motor[2][2] = -64; Mixer.Motor[2][3] = -64; |
Mixer.Motor[3][0] = 64; Mixer.Motor[3][1] = 0; Mixer.Motor[3][2] = +64; Mixer.Motor[3][3] = -64; |
Mixer.Revision = MIXER_REVISION; |
memcpy(Mixer.Name, "Quadro\0", 11); |
eeprom_write_block(&Mixer, &EEPromArray[EEPROM_ADR_MIXER_TABLE], sizeof(Mixer)); |
} |
printf("\n\rMixer-Config: '%s' (%u Motors)",Mixer.Name,RequiredMotors); |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Check connected BL-Ctrls |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
printf("\n\rFound BL-Ctrl: "); |
motorread = 0; UpdateMotor = 0; SendMotorData(); while(!UpdateMotor); motorread = 0; // read the first I2C-Data |
for(i=0; i < MAX_MOTORS; i++) |
{ |
UpdateMotor = 0; |
SendMotorData(); |
while(!UpdateMotor); |
if(MotorPresent[i]) printf("%d ",i+1); |
} |
for(i=0; i < MAX_MOTORS; i++) |
{ |
if(!MotorPresent[i] && Mixer.Motor[i][0] > 0) printf("\n\r\n\r!! MISSING BL-CTRL: %d !!",i+1); |
MotorError[i] = 0; |
} |
printf("\n\r==================================="); |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Check Settings |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_VALID]) != EE_DATENREVISION) |
{ |
DefaultKonstanten1(); |
printf("\n\rInit. EEPROM"); |
for (unsigned char i=1;i<6;i++) |
{ |
if(i==2) DefaultKonstanten2(); // Kamera |
if(i==3) DefaultKonstanten3(); // Beginner |
if(i>3) DefaultKonstanten2(); // Kamera |
if(PlatinenVersion >= 20) |
{ |
EE_Parameter.Gyro_D = 5; |
EE_Parameter.Driftkomp = 0; |
EE_Parameter.GyroAccFaktor = 27; |
EE_Parameter.WinkelUmschlagNick = 78; |
EE_Parameter.WinkelUmschlagRoll = 78; |
} |
// valid Stick-Settings? |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS]) < 12 && eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+1]) < 12 && eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+2]) < 12 && eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+3]) < 12) |
{ |
EE_Parameter.Kanalbelegung[0] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+0]); |
EE_Parameter.Kanalbelegung[1] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+1]); |
EE_Parameter.Kanalbelegung[2] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+2]); |
EE_Parameter.Kanalbelegung[3] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+3]); |
EE_Parameter.Kanalbelegung[4] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+4]); |
EE_Parameter.Kanalbelegung[5] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+5]); |
EE_Parameter.Kanalbelegung[6] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+6]); |
EE_Parameter.Kanalbelegung[7] = eeprom_read_byte(&EEPromArray[EEPROM_ADR_CHANNELS+7]); |
if(i==1) printf(": Generating Default-Parameter using old Stick Settings"); |
} else DefaultStickMapping(); |
WriteParameterSet(i, (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
} |
SetActiveParamSetNumber(3); // default-Setting |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_VALID], EE_DATENREVISION); |
} |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) > 4) |
{ |
printf("\n\rACC not calibrated !"); |
} |
ReadParameterSet(GetActiveParamSetNumber(), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
printf("\n\rUsing parameterset %d", GetActiveParamSetNumber()); |
if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
printf("\n\rCalibrating pressure sensor.."); |
timer = SetDelay(1000); |
SucheLuftruckOffset(); |
while (!CheckDelay(timer)); |
printf("OK\n\r"); |
} |
SetNeutral(); |
ROT_OFF; |
beeptime = 2000; |
ExternControl.Digital[0] = 0x55; |
printf("\n\rControl: "); |
if (EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) printf("HeadingHold"); |
else printf("Normal (ACC-Mode)"); |
printf("\n\r===================================\n\r"); |
LcdClear(); |
I2CTimeout = 5000; |
WinkelOut.Orientation = 1; |
while (1) |
{ |
if(UpdateMotor && AdReady) // ReglerIntervall |
{ |
UpdateMotor=0; |
if(WinkelOut.CalcState) CalMk3Mag(); |
else MotorRegler(); |
SendMotorData(); |
ROT_OFF; |
if(PcZugriff) PcZugriff--; |
else |
{ |
ExternControl.Config = 0; |
ExternStickNick = 0; |
ExternStickRoll = 0; |
ExternStickGier = 0; |
} |
if(SenderOkay) SenderOkay--; |
if(NaviDataOkay) |
{ |
if(--NaviDataOkay == 0) |
{ |
GPS_Nick = 0; |
GPS_Roll = 0; |
} |
} |
if(!--I2CTimeout || MissingMotor) |
{ |
if(!I2CTimeout) |
{ |
i2c_reset(); |
I2CTimeout = 5; |
} |
if((BeepMuster == 0xffff) && MotorenEin) |
{ |
beeptime = 10000; |
BeepMuster = 0x0080; |
} |
} |
else |
{ |
ROT_OFF; |
} |
if(SIO_DEBUG && (!UpdateMotor || !MotorenEin)) |
{ |
DatenUebertragung(); |
BearbeiteRxDaten(); |
} |
else BearbeiteRxDaten(); |
if(CheckDelay(timer)) |
{ |
if(UBat < EE_Parameter.UnterspannungsWarnung) |
{ |
if(BeepMuster == 0xffff) |
{ |
beeptime = 6000; |
BeepMuster = 0x0300; |
} |
} |
SPI_StartTransmitPacket(); |
SendSPI = 4; |
timer = SetDelay(20); |
} |
LED_Update(); |
} |
if(!SendSPI) { SPI_TransmitByte(); } |
} |
return (1); |
} |
//if(HoehenReglerAktiv && NaviDataOkay && SenderOkay < 160 && SenderOkay > 10 && FromNaviCtrl_Value.SerialDataOkay > 220) SenderOkay = 160; |
//if(HoehenReglerAktiv && NaviDataOkay && SenderOkay < 101 && SenderOkay > 10 && FromNaviCtrl_Value.SerialDataOkay > 1) SenderOkay = 101; |
/branches/V0.74d-Arthur P/main.h |
---|
0,0 → 1,166 |
#ifndef _MAIN_H |
#define _MAIN_H |
#define QUADRO |
//#define OCTO // 2 Arms in Front |
//#define OCTO2 // 1 Arm in front |
//#define OCTO3 // 1 Arm with two Motors in front or Coax |
//+++++++++++ |
// Quadro: |
// 1 |
// 4 3 |
// 2 |
//+++++++++++ |
// Reverse Props on 1 2 |
//+++++++++++ |
// Octo: |
// 1 2 |
// 8 3 |
// 7 4 |
// 6 5 |
//+++++++++++ |
//+++++++++++ |
// Octo2: |
// 1 |
// 8 2 |
// 7 3 |
// 6 4 |
// 5 |
//+++++++++++ |
//+++++++++++ |
// Octo3: |
// 1 |
// 2 |
// 8 7 3 4 |
// 5 |
// 6 |
//+++++++++++ |
// Reverse Props on octo: 1 3 5 7 |
//Hier die Quarz Frequenz einstellen |
#if defined (__AVR_ATmega32__) |
#define SYSCLK 20000000L //Quarz Frequenz in Hz |
#endif |
#if defined (__AVR_ATmega644__) |
#define SYSCLK 20000000L //Quarz Frequenz in Hz |
#endif |
#if defined (__AVR_ATmega644P__) |
#define SYSCLK 20000000L //Quarz Frequenz in Hz |
#endif |
// neue Hardware |
#define ROT_OFF {if((PlatinenVersion == 10)||(PlatinenVersion == 20)) PORTB &=~0x01; else PORTB |= 0x01;} |
#define ROT_ON {if((PlatinenVersion == 10)||(PlatinenVersion == 20)) PORTB |= 0x01; else PORTB &=~0x01;} |
#define ROT_FLASH PORTB ^= 0x01 |
#define GRN_OFF {if((PlatinenVersion < 12)) PORTB &=~0x02; else PORTB |= 0x02;} |
#define GRN_ON {if((PlatinenVersion < 12)) PORTB |= 0x02; else PORTB &=~0x02;} |
#define GRN_FLASH PORTB ^= 0x02 |
#define F_CPU SYSCLK |
//#ifndef F_CPU |
//#error ################## F_CPU nicht definiert oder ungültig ############# |
//#endif |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define EE_DATENREVISION 75 // wird angepasst, wenn sich die EEPROM-Daten geändert haben |
#define MIXER_REVISION 1 // wird angepasst, wenn sich die Mixer-Daten geändert haben |
#define EEPROM_ADR_VALID 1 |
#define EEPROM_ADR_ACTIVE_SET 2 |
#define EEPROM_ADR_LAST_OFFSET 3 |
#define EEPROM_ADR_ACC_NICK 4 |
#define EEPROM_ADR_ACC_ROLL 6 |
#define EEPROM_ADR_ACC_Z 8 |
#define EEPROM_ADR_CHANNELS 80 |
#define EEPROM_ADR_PARAM_LENGTH 98 |
#define EEPROM_ADR_PARAM_BEGIN 100 |
#define EEPROM_ADR_MIXER_TABLE 1000 // 1001 - 1100 |
#define CFG_HOEHENREGELUNG 0x01 |
#define CFG_HOEHEN_SCHALTER 0x02 |
#define CFG_HEADING_HOLD 0x04 |
#define CFG_KOMPASS_AKTIV 0x08 |
#define CFG_KOMPASS_FIX 0x10 |
#define CFG_GPS_AKTIV 0x20 |
#define CFG_ACHSENKOPPLUNG_AKTIV 0x40 |
#define CFG_DREHRATEN_BEGRENZER 0x80 |
#define CFG_LOOP_OBEN 0x01 |
#define CFG_LOOP_UNTEN 0x02 |
#define CFG_LOOP_LINKS 0x04 |
#define CFG_LOOP_RECHTS 0x08 |
#define CFG_RES1 0x10 |
#define CFG_RES2 0x20 |
#define CFG_RES3 0x40 |
#define CFG_RES4 0x80 |
#define J3High PORTD |= 0x20 |
#define J3Low PORTD &= ~0x20 |
#define J4High PORTD |= 0x10 |
#define J4Low PORTD &= ~0x10 |
#define J5High PORTD |= 0x08 |
#define J5Low PORTD &= ~0x08 |
//#define SYSCLK |
//extern unsigned long SYSCLK; |
extern volatile unsigned char SenderOkay; |
extern unsigned char CosinusNickWinkel, CosinusRollWinkel; |
extern unsigned char PlatinenVersion; |
extern unsigned char SendVersionToNavi; |
void ReadParameterSet (unsigned char number, unsigned char *buffer, unsigned char length); |
void WriteParameterSet(unsigned char number, unsigned char *buffer, unsigned char length); |
extern unsigned char GetActiveParamSetNumber(void); |
void SetActiveParamSetNumber(unsigned char number); |
extern unsigned char EEPromArray[]; |
#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.74d-Arthur P/makefile |
---|
0,0 → 1,449 |
#-------------------------------------------------------------------- |
# MCU name |
MCU = atmega644p |
F_CPU = 20000000 |
#------------------------------------------------------------------- |
VERSION_MAJOR = 0 |
VERSION_MINOR = 74 |
VERSION_PATCH = 3 |
VERSION_SERIAL_MAJOR = 10 # Serial Protocol |
VERSION_SERIAL_MINOR = 1 # Serial Protocol |
NC_SPI_COMPATIBLE = 6 # Navi-Kompatibilität |
#------------------------------------------------------------------- |
ifeq ($(MCU), atmega32) |
# FUSE_SETTINGS= -u -U lfuse:w:0xff:m -U hfuse:w:0xcf:m |
HEX_NAME = MEGA32 |
endif |
ifeq ($(MCU), atmega644) |
FUSE_SETTINGS = -u -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
#FUSE_SETTINGS = -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
# -u bei neuen Controllern wieder einspielen |
HEX_NAME = MEGA644 |
endif |
ifeq ($(MCU), atmega644p) |
FUSE_SETTINGS = -u -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
HEX_NAME = MEGA644 |
endif |
ifeq ($(F_CPU), 16000000) |
QUARZ = 16MHZ |
endif |
ifeq ($(F_CPU), 20000000) |
QUARZ = 20MHZ |
endif |
# Output format. (can be srec, ihex, binary) |
FORMAT = ihex |
# Target file name (without extension). |
ifeq ($(VERSION_PATCH), 0) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)a |
endif |
ifeq ($(VERSION_PATCH), 1) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)b |
endif |
ifeq ($(VERSION_PATCH), 2) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)c |
endif |
ifeq ($(VERSION_PATCH), 3) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)d |
endif |
ifeq ($(VERSION_PATCH), 4) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)e |
endif |
ifeq ($(VERSION_PATCH), 5) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)f |
endif |
ifeq ($(VERSION_PATCH), 6) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)g |
endif |
ifeq ($(VERSION_PATCH), 7) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)h |
endif |
ifeq ($(VERSION_PATCH), 8) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)i |
endif |
ifeq ($(VERSION_PATCH), 9) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)j |
endif |
ifeq ($(VERSION_PATCH), 10) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)k |
endif |
ifeq ($(VERSION_PATCH), 11) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)L |
endif |
ifeq ($(VERSION_PATCH), 12) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)m |
endif |
ifeq ($(VERSION_PATCH), 13) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)n |
endif |
ifeq ($(VERSION_PATCH), 14) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)o |
endif |
ifeq ($(VERSION_PATCH), 15) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)p |
endif |
ifeq ($(VERSION_PATCH), 16) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)q |
endif |
# Optimization level, can be [0, 1, 2, 3, s]. 0 turns off optimization. |
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) |
OPT = 2 |
########################################################################################################## |
# List C source files here. (C dependencies are automatically generated.) |
SRC = main.c uart.c printf_P.c timer0.c analog.c menu.c |
SRC += twimaster.c rc.c fc.c GPS.c spi.c led.c Spectrum.c |
########################################################################################################## |
# List Assembler source files here. |
# Make them always end in a capital .S. Files ending in a lowercase .s |
# will not be considered source files but generated files (assembler |
# output from the compiler), and will be deleted upon "make clean"! |
# Even though the DOS/Win* filesystem matches both .s and .S the same, |
# it will preserve the spelling of the filenames, and gcc itself does |
# care about how the name is spelled on its command-line. |
ASRC = |
# List any extra directories to look for include files here. |
# Each directory must be seperated by a space. |
EXTRAINCDIRS = |
# Optional compiler flags. |
# -g: generate debugging information (for GDB, or for COFF conversion) |
# -O*: optimization level |
# -f...: tuning, see gcc manual and avr-libc documentation |
# -Wall...: warning level |
# -Wa,...: tell GCC to pass this to the assembler. |
# -ahlms: create assembler listing |
CFLAGS = -O$(OPT) \ |
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \ |
-Wall -Wstrict-prototypes \ |
-Wa,-adhlns=$(<:.c=.lst) \ |
$(patsubst %,-I%,$(EXTRAINCDIRS)) |
# Set a "language standard" compiler flag. |
# Unremark just one line below to set the language standard to use. |
# gnu99 = C99 + GNU extensions. See GCC manual for more information. |
#CFLAGS += -std=c89 |
#CFLAGS += -std=gnu89 |
#CFLAGS += -std=c99 |
CFLAGS += -std=gnu99 |
CFLAGS += -DVERSION_MAJOR=$(VERSION_MAJOR) -DVERSION_MINOR=$(VERSION_MINOR) -DVERSION_PATCH=$(VERSION_PATCH) -DVERSION_SERIAL_MAJOR=$(VERSION_SERIAL_MAJOR) -DVERSION_SERIAL_MINOR=$(VERSION_SERIAL_MINOR) -DNC_SPI_COMPATIBLE=$(NC_SPI_COMPATIBLE) |
# Optional assembler flags. |
# -Wa,...: tell GCC to pass this to the assembler. |
# -ahlms: create listing |
# -gstabs: have the assembler create line number information; note that |
# for use in COFF files, additional information about filenames |
# and function names needs to be present in the assembler source |
# files -- see avr-libc docs [FIXME: not yet described there] |
ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs |
# Optional linker flags. |
# -Wl,...: tell GCC to pass this to linker. |
# -Map: create map file |
# --cref: add cross reference to map file |
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref |
# Additional libraries |
# Minimalistic printf version |
#LDFLAGS += -Wl,-u,vfprintf -lprintf_min |
# Floating point printf version (requires -lm below) |
#LDFLAGS += -Wl,-u,vfprintf -lprintf_flt |
# -lm = math library |
LDFLAGS += -lm |
##LDFLAGS += -T./linkerfile/avr5.x |
# Programming support using avrdude. Settings and variables. |
# Programming hardware: alf avr910 avrisp bascom bsd |
# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500 |
# |
# Type: avrdude -c ? |
# to get a full listing. |
# |
#AVRDUDE_PROGRAMMER = dt006 |
#AVRDUDE_PROGRAMMER = stk200 |
#AVRDUDE_PROGRAMMER = ponyser |
AVRDUDE_PROGRAMMER = avrispv2 |
#falls Ponyser ausgewählt wird, muss sich unsere avrdude-Configdatei im Bin-Verzeichnis des Compilers befinden |
#AVRDUDE_PORT = com1 # programmer connected to serial device |
#AVRDUDE_PORT = lpt1 # programmer connected to parallel port |
AVRDUDE_PORT = usb # programmer connected to USB |
#AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex |
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex $(FUSE_SETTINGS) |
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep |
#avrdude -c avrispv2 -P usb -p m32 -U flash:w:blink.hex |
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) |
# Uncomment the following if you want avrdude's erase cycle counter. |
# Note that this counter needs to be initialized first using -Yn, |
# see avrdude manual. |
#AVRDUDE_ERASE += -y |
# Uncomment the following if you do /not/ wish a verification to be |
# performed after programming the device. |
AVRDUDE_FLAGS += -V |
# Increase verbosity level. Please use this when submitting bug |
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude> |
# to submit bug reports. |
#AVRDUDE_FLAGS += -v -v |
# --------------------------------------------------------------------------- |
# Define directories, if needed. |
DIRAVR = c:/winavr |
DIRAVRBIN = $(DIRAVR)/bin |
DIRAVRUTILS = $(DIRAVR)/utils/bin |
DIRINC = . |
DIRLIB = $(DIRAVR)/avr/lib |
# Define programs and commands. |
SHELL = sh |
CC = avr-gcc |
OBJCOPY = avr-objcopy |
OBJDUMP = avr-objdump |
SIZE = avr-size |
# Programming support using avrdude. |
AVRDUDE = avrdude |
REMOVE = rm -f |
COPY = cp |
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex |
ELFSIZE = $(SIZE) -A $(TARGET).elf |
# Define Messages |
# English |
MSG_ERRORS_NONE = Errors: none |
MSG_BEGIN = -------- begin -------- |
MSG_END = -------- end -------- |
MSG_SIZE_BEFORE = Size before: |
MSG_SIZE_AFTER = Size after: |
MSG_COFF = Converting to AVR COFF: |
MSG_EXTENDED_COFF = Converting to AVR Extended COFF: |
MSG_FLASH = Creating load file for Flash: |
MSG_EEPROM = Creating load file for EEPROM: |
MSG_EXTENDED_LISTING = Creating Extended Listing: |
MSG_SYMBOL_TABLE = Creating Symbol Table: |
MSG_LINKING = Linking: |
MSG_COMPILING = Compiling: |
MSG_ASSEMBLING = Assembling: |
MSG_CLEANING = Cleaning project: |
# Define all object files. |
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) |
# Define all listing files. |
LST = $(ASRC:.S=.lst) $(SRC:.c=.lst) |
# Combine all necessary flags and optional flags. |
# Add target processor to flags. |
#ALL_CFLAGS = -mmcu=$(MCU) -DF_CPU=$(F_CPU) -I. $(CFLAGS) |
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) |
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) |
# Default target. |
all: begin gccversion sizebefore $(TARGET).elf $(TARGET).hex $(TARGET).eep \ |
$(TARGET).lss $(TARGET).sym sizeafter finished end |
# Eye candy. |
# AVR Studio 3.x does not check make's exit code but relies on |
# the following magic strings to be generated by the compile job. |
begin: |
@echo |
@echo $(MSG_BEGIN) |
finished: |
@echo $(MSG_ERRORS_NONE) |
end: |
@echo $(MSG_END) |
@echo |
# Display size of file. |
# Display size of file. |
sizebefore: |
@if [ -f $(TARGET).elf ]; then echo Size before:; $(ELFSIZE); $(HEXSIZE); echo; fi |
sizeafter: |
@if [ -f $(TARGET).elf ]; then echo Size after:; $(ELFSIZE); $(HEXSIZE); echo; fi |
# Display compiler version information. |
gccversion : |
@$(CC) --version |
# Convert ELF to COFF for use in debugging / simulating in |
# AVR Studio or VMLAB. |
COFFCONVERT=$(OBJCOPY) --debugging \ |
--change-section-address .data-0x800000 \ |
--change-section-address .bss-0x800000 \ |
--change-section-address .noinit-0x800000 \ |
--change-section-address .eeprom-0x810000 |
coff: $(TARGET).elf |
@echo |
@echo $(MSG_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof |
extcoff: $(TARGET).elf |
@echo |
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof |
# Program the device. |
program: $(TARGET).hex $(TARGET).eep |
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) |
# Create final output files (.hex, .eep) from ELF output file. |
%.hex: %.elf |
@echo |
@echo $(MSG_FLASH) $@ |
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ |
%.eep: %.elf |
@echo |
@echo $(MSG_EEPROM) $@ |
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ |
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@ |
# Create extended listing file from ELF output file. |
%.lss: %.elf |
@echo |
@echo $(MSG_EXTENDED_LISTING) $@ |
$(OBJDUMP) -h -S $< > $@ |
# Create a symbol table from ELF output file. |
%.sym: %.elf |
@echo |
@echo $(MSG_SYMBOL_TABLE) $@ |
avr-nm -n $< > $@ |
# Link: create ELF output file from object files. |
.SECONDARY : $(TARGET).elf |
.PRECIOUS : $(OBJ) |
%.elf: $(OBJ) |
@echo |
@echo $(MSG_LINKING) $@ |
$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) |
# Compile: create object files from C source files. |
%.o : %.c |
@echo |
@echo $(MSG_COMPILING) $< |
$(CC) -c $(ALL_CFLAGS) $< -o $@ |
# Compile: create assembler files from C source files. |
%.s : %.c |
$(CC) -S $(ALL_CFLAGS) $< -o $@ |
# Assemble: create object files from assembler source files. |
%.o : %.S |
@echo |
@echo $(MSG_ASSEMBLING) $< |
$(CC) -c $(ALL_ASFLAGS) $< -o $@ |
# Target: clean project. |
clean: begin clean_list finished end |
clean_list : |
@echo |
@echo $(MSG_CLEANING) |
# $(REMOVE) $(TARGET).hex |
$(REMOVE) $(TARGET).eep |
$(REMOVE) $(TARGET).obj |
$(REMOVE) $(TARGET).cof |
$(REMOVE) $(TARGET).elf |
$(REMOVE) $(TARGET).map |
$(REMOVE) $(TARGET).obj |
$(REMOVE) $(TARGET).a90 |
$(REMOVE) $(TARGET).sym |
$(REMOVE) $(TARGET).lnk |
$(REMOVE) $(TARGET).lss |
$(REMOVE) $(OBJ) |
$(REMOVE) $(LST) |
$(REMOVE) $(SRC:.c=.s) |
$(REMOVE) $(SRC:.c=.d) |
# Automatically generate C source code dependencies. |
# (Code originally taken from the GNU make user manual and modified |
# (See README.txt Credits).) |
# |
# Note that this will work with sh (bash) and sed that is shipped with WinAVR |
# (see the SHELL variable defined above). |
# This may not work with other shells or other seds. |
# |
%.d: %.c |
set -e; $(CC) -MM $(ALL_CFLAGS) $< \ |
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > $@; \ |
[ -s $@ ] || rm -f $@ |
# Remove the '-' if you want to see the dependency files generated. |
-include $(SRC:.c=.d) |
# Listing of phony targets. |
.PHONY : all begin finish end sizebefore sizeafter gccversion coff extcoff \ |
clean clean_list program |
/branches/V0.74d-Arthur P/menu.c |
---|
0,0 → 1,168 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
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 = 13; |
unsigned char MenuePunkt = 0; |
unsigned char RemoteKeys = 0; |
#define KEY1 0x01 |
#define KEY2 0x02 |
#define KEY3 0x04 |
#define KEY4 0x08 |
#define KEY5 0x10 |
void LcdClear(void) |
{ |
unsigned char i; |
for(i=0;i<80;i++) DisplayBuff[i] = ' '; |
} |
void Menu(void) |
{ |
if(MenuePunkt > MaxMenue) MenuePunkt = MaxMenue; |
if(RemoteKeys & KEY1) { if(MenuePunkt) MenuePunkt--; else MenuePunkt = MaxMenue;} |
if(RemoteKeys & KEY2) { if(MenuePunkt == MaxMenue) MenuePunkt = 0; else MenuePunkt++;} |
if((RemoteKeys & KEY1) && (RemoteKeys & KEY2)) MenuePunkt = 0; |
LcdClear(); |
if(MenuePunkt < 10) {LCD_printfxy(17,0,"[%i]",MenuePunkt);} |
else {LCD_printfxy(16,0,"[%i]",MenuePunkt);}; |
switch(MenuePunkt) |
{ |
case 0: |
LCD_printfxy(0,0,"+ MikroKopter +"); |
LCD_printfxy(0,1,"HW:V%d.%d SW:%d.%d%c",PlatinenVersion/10,PlatinenVersion%10, VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH +'a'); |
LCD_printfxy(0,2,"Setting:%d %s",GetActiveParamSetNumber(),Mixer.Name); |
if(I2CTimeout < 6) LCD_printfxy(0,3,"I2C ERROR!!!") |
else |
if(MissingMotor) LCD_printfxy(0,3,"Missing BL-Ctrl:%d!!",MissingMotor) |
else LCD_printfxy(0,3,"(c) Holger Buss"); |
// if(RemoteTasten & KEY3) TestInt--; |
// if(RemoteTasten & KEY4) TestInt++; |
break; |
case 1: |
if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
LCD_printfxy(0,0,"Hoehe: %5i",HoehenWert); |
LCD_printfxy(0,1,"SollHoehe: %5i",SollHoehe); |
LCD_printfxy(0,2,"Luftdruck: %5i",MessLuftdruck); |
LCD_printfxy(0,3,"Off : %5i",DruckOffsetSetting); |
} |
else |
{ |
LCD_printfxy(0,1,"Keine "); |
LCD_printfxy(0,2,"Höhenregelung"); |
} |
break; |
case 2: |
LCD_printfxy(0,0,"akt. Lage"); |
LCD_printfxy(0,1,"Nick: %5i",IntegralNick/1024); |
LCD_printfxy(0,2,"Roll: %5i",IntegralRoll/1024); |
LCD_printfxy(0,3,"Kompass: %5i",KompassValue); |
break; |
case 3: |
LCD_printfxy(0,0,"K1:%4i K2:%4i ",PPM_in[1],PPM_in[2]); |
LCD_printfxy(0,1,"K3:%4i K4:%4i ",PPM_in[3],PPM_in[4]); |
LCD_printfxy(0,2,"K5:%4i K6:%4i ",PPM_in[5],PPM_in[6]); |
LCD_printfxy(0,3,"K7:%4i K8:%4i ",PPM_in[7],PPM_in[8]); |
break; |
case 4: |
LCD_printfxy(0,0,"Ni:%4i Ro:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_NICK]],PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]); |
LCD_printfxy(0,1,"Gs:%4i Gi:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_GAS]],PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]); |
LCD_printfxy(0,2,"P1:%4i P2:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]],PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]]); |
LCD_printfxy(0,3,"P3:%4i P4:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]],PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]]); |
break; |
case 5: |
LCD_printfxy(0,0,"Gyro - Sensor"); |
if(PlatinenVersion == 10) |
{ |
LCD_printfxy(0,1,"Nick %4i (%3i.%i)",AdWertNick - AdNeutralNick/8, AdNeutralNick/8, AdNeutralNick%8); |
LCD_printfxy(0,2,"Roll %4i (%3i.%i)",AdWertRoll - AdNeutralRoll/8, AdNeutralRoll/8, AdNeutralRoll%8); |
LCD_printfxy(0,3,"Gier %4i (%3i)",AdNeutralGier - AdWertGier, AdNeutralGier); |
} |
else |
if((PlatinenVersion == 11) || (PlatinenVersion == 20)) |
{ |
LCD_printfxy(0,1,"Nick %4i (%3i.%x)",AdWertNick - AdNeutralNick/8, AdNeutralNick/16, (AdNeutralNick%16)/2); |
LCD_printfxy(0,2,"Roll %4i (%3i.%x)",AdWertRoll - AdNeutralRoll/8, AdNeutralRoll/16, (AdNeutralRoll%16)/2); |
LCD_printfxy(0,3,"Gier %4i (%3i)",AdNeutralGier - AdWertGier, AdNeutralGier/2); |
} |
else |
if(PlatinenVersion == 13) |
{ |
LCD_printfxy(0,1,"Nick %4i (%3i)(%3i)",AdWertNick - AdNeutralNick/8, AdNeutralNick/16,AnalogOffsetNick); |
LCD_printfxy(0,2,"Roll %4i (%3i)(%3i)",AdWertRoll - AdNeutralRoll/8, AdNeutralRoll/16,AnalogOffsetRoll); |
LCD_printfxy(0,3,"Gier %4i (%3i)(%3i)",AdNeutralGier - AdWertGier, AdNeutralGier/2,AnalogOffsetGier); |
} |
break; |
case 6: |
LCD_printfxy(0,0,"ACC - Sensor"); |
LCD_printfxy(0,1,"Nick %4i (%3i)",AdWertAccNick,NeutralAccX); |
LCD_printfxy(0,2,"Roll %4i (%3i)",AdWertAccRoll,NeutralAccY); |
LCD_printfxy(0,3,"Hoch %4i (%3i)",Mittelwert_AccHoch/*accumulate_AccHoch / messanzahl_AccHoch*/,(int)NeutralAccZ); |
break; |
case 7: |
LCD_printfxy(0,1,"Spannung: %5i",UBat); |
LCD_printfxy(0,2,"Empf.Pegel:%5i",SenderOkay); |
break; |
case 8: |
LCD_printfxy(0,0,"Kompass "); |
LCD_printfxy(0,1,"Richtung: %5i",KompassRichtung); |
LCD_printfxy(0,2,"Messwert: %5i",KompassValue); |
LCD_printfxy(0,3,"Start: %5i",KompassStartwert); |
break; |
case 9: |
LCD_printfxy(0,0,"Poti1: %3i",Poti1); |
LCD_printfxy(0,1,"Poti2: %3i",Poti2); |
LCD_printfxy(0,2,"Poti3: %3i",Poti3); |
LCD_printfxy(0,3,"Poti4: %3i",Poti4); |
break; |
case 10: |
LCD_printfxy(0,0,"Servo " ); |
LCD_printfxy(0,1,"Setpoint %3i",Parameter_ServoNickControl); |
LCD_printfxy(0,2,"Stellung: %3i",ServoValue); |
LCD_printfxy(0,3,"Range:%3i-%3i",EE_Parameter.ServoNickMin,EE_Parameter.ServoNickMax); |
break; |
case 11: |
LCD_printfxy(0,0,"ExternControl " ); |
LCD_printfxy(0,1,"Ni:%4i Ro:%4i ",ExternControl.Nick,ExternControl.Roll); |
LCD_printfxy(0,2,"Gs:%4i Gi:%4i ",ExternControl.Gas,ExternControl.Gier); |
LCD_printfxy(0,3,"Hi:%4i Cf:%4i ",ExternControl.Hight,ExternControl.Config); |
break; |
case 12: |
LCD_printfxy(0,0,"BL-Ctrl Errors " ); |
LCD_printfxy(0,1," %3d %3d %3d %3d ",MotorError[0],MotorError[1],MotorError[2],MotorError[3]); |
LCD_printfxy(0,2," %3d %3d %3d %3d ",MotorError[4],MotorError[5],MotorError[6],MotorError[7]); |
LCD_printfxy(0,3," %3d %3d %3d %3d ",MotorError[8],MotorError[9],MotorError[10],MotorError[11]); |
break; |
case 13: |
LCD_printfxy(0,0,"BL-Ctrl found " ); |
LCD_printfxy(0,1," %c %c %c %c ",MotorPresent[0] + '-',MotorPresent[1] + '-',MotorPresent[2] + '-',MotorPresent[3] + '-'); |
LCD_printfxy(0,2," %c %c %c %c ",MotorPresent[4] + '-',MotorPresent[5] + '-',MotorPresent[6] + '-',MotorPresent[7] + '-'); |
LCD_printfxy(0,3," %c - - -",MotorPresent[8] + '-'); |
if(MotorPresent[9]) LCD_printfxy(4,3,"10"); |
if(MotorPresent[10]) LCD_printfxy(8,3,"11"); |
if(MotorPresent[11]) LCD_printfxy(12,3,"12"); |
break; |
default: MaxMenue = MenuePunkt - 1; |
MenuePunkt = 0; |
break; |
} |
RemoteKeys = 0; |
} |
/branches/V0.74d-Arthur P/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.74d-Arthur P/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.74d-Arthur P/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.74d-Arthur P/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.74d-Arthur P/rc.c |
---|
0,0 → 1,122 |
/*####################################################################################### |
Decodieren eines RC Summen Signals |
#######################################################################################*/ |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "rc.h" |
#include "main.h" |
volatile int PPM_in[11]; |
volatile int PPM_diff[11]; // das diffenzierte Stick-Signal |
volatile unsigned char NewPpmData = 1; |
//############################################################################ |
//zum decodieren des PPM-Signals wird Timer1 mit seiner Input |
//Capture Funktion benutzt: |
void rc_sum_init (void) |
//############################################################################ |
{ |
TCCR1B=(1<<CS11)|(1<<CS10)|(1<<ICES1)|(1<<ICNC1);//|(1 << WGM12); //timer1 prescale 64 |
// TCCR1B=(1<<CS11)|(0<<CS10)|(1<<ICES1)|(1<<ICNC1); //timer1 prescale 64 |
TIMSK1 |= _BV(ICIE1); |
AdNeutralGier = 0; |
AdNeutralRoll = 0; |
AdNeutralNick = 0; |
return; |
} |
//############################################################################ |
//Diese Routine startet und inizialisiert den Timer für RC |
SIGNAL(SIG_INPUT_CAPTURE1) |
//############################################################################ |
{ |
static unsigned int AltICR=0; |
signed int signal = 0,tmp; |
static int index; |
signal = (unsigned int) ICR1 - AltICR; |
AltICR = ICR1; |
//Syncronisationspause? |
if((signal > 1100) && (signal < 8000)) |
{ |
if(index >= 4) NewPpmData = 0; // Null bedeutet: Neue Daten |
index = 1; |
} |
else |
{ |
if(index < 10) |
{ |
if((signal > 250) && (signal < 687)) |
{ |
signal -= 466; |
// Stabiles Signal |
if(abs(signal - PPM_in[index]) < 6) { if(SenderOkay < 200) SenderOkay += 10; else SenderOkay = 200;} |
tmp = (3 * (PPM_in[index]) + signal) / 4; |
if(tmp > signal+1) tmp--; else |
if(tmp < signal-1) tmp++; |
if(SenderOkay >= 195) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; |
else PPM_diff[index] = 0; |
PPM_in[index] = tmp; |
} |
index++; |
if(index == 5) J3High; else J3Low; // Servosignal an J3 anlegen |
if(index == 6) J4High; else J4Low; // Servosignal an J4 anlegen |
if(index == 7) J5High; else J5Low; // Servosignal an J5 anlegen |
} |
} |
} |
/* |
//############################################################################ |
//Diese Routine startet und inizialisiert den Timer für RC |
SIGNAL(SIG_INPUT_CAPTURE1) |
//############################################################################ |
{ |
static unsigned int AltICR=0; |
signed int signal = 0,tmp; |
static int index; |
signal = (unsigned int) ICR1 - AltICR; |
DebugOut.Analog[16] = signal; |
signal /= 2; |
AltICR = ICR1; |
//Syncronisationspause? |
if((signal > 1100*2) && (signal < 8000*2)) |
{ |
if(index >= 4) NewPpmData = 0; // Null bedeutet: Neue Daten |
index = 1; |
} |
else |
{ |
if(index < 10) |
{ |
if((signal > 250) && (signal < 687*2)) |
{ |
signal -= 962; |
// Stabiles Signal |
if(abs(signal - PPM_in[index]) < 6) { if(SenderOkay < 200) SenderOkay += 10;} |
tmp = (3 * (PPM_in[index]) + signal) / 4; |
if(tmp > signal+1) tmp--; else |
if(tmp < signal-1) tmp++; |
if(SenderOkay >= 195) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; |
else PPM_diff[index] = 0; |
PPM_in[index] = tmp; |
} |
index++; |
if(index == 5) J3High; else J3Low; // Servosignal an J3 anlegen |
if(index == 2) J4High; else J4Low; // Servosignal an J4 anlegen |
if(index == 7) J5High; else J5Low; // Servosignal an J5 anlegen |
} |
} |
} |
*/ |
/branches/V0.74d-Arthur P/rc.h |
---|
0,0 → 1,30 |
/*####################################################################################### |
Derkodieren eines RC Summen Signals |
#######################################################################################*/ |
#ifndef _RC_H |
#define _RC_H |
#if defined (__AVR_ATmega32__) |
#define TIMER_TEILER CK64 |
#define TIMER_RELOAD_VALUE 250 |
#endif |
#if defined (__AVR_ATmega644__) |
#define TIMER_RELOAD_VALUE 250 |
#endif |
#if defined (__AVR_ATmega644P__) |
#define TIMER_RELOAD_VALUE 250 |
#endif |
#define GAS PPM_in[2] |
extern void rc_sum_init (void); |
extern volatile int PPM_in[11]; |
extern volatile int PPM_diff[11]; // das diffenzierte Stick-Signal |
extern volatile unsigned char NewPpmData; |
#endif //_RC_H |
/branches/V0.74d-Arthur P/spi.c |
---|
0,0 → 1,281 |
// ######################## SPI - FlightCtrl ################### |
#include "main.h" |
//struct str_ToNaviCtrl_Version ToNaviCtrl_Version; |
//struct str_FromNaviCtrl_Version FromNaviCtrl_Version; |
struct str_ToNaviCtrl ToNaviCtrl; |
struct str_FromNaviCtrl FromNaviCtrl; |
struct str_FromNaviCtrl_Value FromNaviCtrl_Value; |
struct str_SPI_VersionInfo SPI_VersionInfo; |
unsigned char SPI_BufferIndex; |
unsigned char SPI_RxBufferIndex; |
volatile unsigned char SPI_Buffer[sizeof(FromNaviCtrl)]; |
unsigned char *SPI_TX_Buffer; |
unsigned char SPITransferCompleted, SPI_ChkSum; |
unsigned char SPI_RxDataValid,NaviDataOkay = 0; |
unsigned char SPI_CommandSequence[] = { SPI_CMD_USER, SPI_CMD_STICK, SPI_CMD_PARAMETER1, SPI_CMD_STICK, SPI_CMD_MISC, SPI_CMD_VERSION }; |
unsigned char SPI_CommandCounter = 0; |
#ifdef USE_SPI_COMMUNICATION |
//------------------------------------------------------ |
void SPI_MasterInit(void) |
{ |
DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK); // Set MOSI and SCK output, all others input |
SLAVE_SELECT_DDR_PORT |= (1 << SPI_SLAVE_SELECT); |
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(0<<SPR0)|(0<<SPIE); // Enable SPI, Master, set clock rate fck/64 |
SPSR = 0;//(1<<SPI2X); |
SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); |
SPITransferCompleted = 1; |
//SPDR = 0x00; // dummy write |
ToNaviCtrl.Sync1 = 0xAA; |
ToNaviCtrl.Sync2 = 0x83; |
ToNaviCtrl.Command = SPI_CMD_USER; |
ToNaviCtrl.IntegralNick = 0; |
ToNaviCtrl.IntegralRoll = 0; |
FromNaviCtrl_Value.SerialDataOkay = 0; |
SPI_RxDataValid = 0; |
SPI_VersionInfo.Major = VERSION_MAJOR; |
SPI_VersionInfo.Minor = VERSION_MINOR; |
SPI_VersionInfo.Patch = VERSION_PATCH; |
SPI_VersionInfo.Compatible = NC_SPI_COMPATIBLE; |
} |
//------------------------------------------------------ |
void SPI_StartTransmitPacket(void) |
{ |
//if ((SLAVE_SELECT_PORT & (1 << SPI_SLAVE_SELECT)) == 0) return; // transfer of prev. packet not completed |
if (!SPITransferCompleted) return; |
// _delay_us(30); |
SLAVE_SELECT_PORT &= ~(1 << SPI_SLAVE_SELECT); // SelectSlave |
SPI_TX_Buffer = (unsigned char *) &ToNaviCtrl; |
ToNaviCtrl.Command = SPI_CommandSequence[SPI_CommandCounter++]; |
if (SPI_CommandCounter >= sizeof(SPI_CommandSequence)) SPI_CommandCounter = 0; |
SPITransferCompleted = 0; |
UpdateSPI_Buffer(); // update buffer |
SPI_BufferIndex = 1; |
//ebugOut.Analog[16]++; |
// -- Debug-Output --- |
//---- |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
ToNaviCtrl.Chksum = ToNaviCtrl.Sync1; |
SPDR = ToNaviCtrl.Sync1; // Start transmission |
// SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
} |
//------------------------------------------------------ |
//SIGNAL(SIG_SPI) |
void SPI_TransmitByte(void) |
{ |
static unsigned char SPI_RXState = 0; |
unsigned char rxdata; |
static unsigned char rxchksum; |
if (SPITransferCompleted) return; |
if (!(SPSR & (1 << SPIF))) return; |
SendSPI = 4; |
// _delay_us(30); |
SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
rxdata = SPDR; |
switch ( SPI_RXState) |
{ |
case 0: |
SPI_RxBufferIndex = 0; |
//DebugOut.Analog[17]++; |
rxchksum = rxdata; |
if (rxdata == 0x81 ) { SPI_RXState = 1; } // 1. Syncbyte ok |
break; |
case 1: |
if (rxdata == 0x55) { rxchksum += rxdata; SPI_RXState = 2; } // 2. Syncbyte ok |
else SPI_RXState = 0; |
//DebugOut.Analog[18]++; |
break; |
case 2: |
SPI_Buffer[SPI_RxBufferIndex++]= rxdata; // get data |
//DebugOut.Analog[19]++; |
if (SPI_RxBufferIndex >= sizeof(FromNaviCtrl)) |
{ |
if (rxdata == rxchksum) |
{ |
unsigned char *ptr = (unsigned char *)&FromNaviCtrl; |
memcpy(ptr, (unsigned char *) SPI_Buffer, sizeof(SPI_Buffer)); |
SPI_RxDataValid = 1; |
} |
else SPI_RxDataValid = 0; |
SPI_RXState = 0; |
} |
else rxchksum += rxdata; |
break; |
} |
if (SPI_BufferIndex < sizeof(ToNaviCtrl)) |
{ |
SLAVE_SELECT_PORT &= ~(1 << SPI_SLAVE_SELECT); // SelectSlave |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
SPDR = SPI_TX_Buffer[SPI_BufferIndex]; |
ToNaviCtrl.Chksum += SPI_TX_Buffer[SPI_BufferIndex]; |
// SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
} |
else SPITransferCompleted = 1; |
SPI_BufferIndex++; |
} |
//------------------------------------------------------ |
void UpdateSPI_Buffer(void) |
{ |
signed int tmp; |
cli(); |
ToNaviCtrl.IntegralNick = (int) (IntegralNick / (long)(EE_Parameter.GyroAccFaktor * 4)); |
ToNaviCtrl.IntegralRoll = (int) (IntegralRoll / (long)(EE_Parameter.GyroAccFaktor * 4)); |
ToNaviCtrl.GyroCompass = (10 * ErsatzKompass) / GIER_GRAD_FAKTOR; |
ToNaviCtrl.AccNick = ((int) ACC_AMPLIFY * (NaviAccNick / NaviCntAcc))/4; |
ToNaviCtrl.AccRoll = ((int) ACC_AMPLIFY * (NaviAccRoll / NaviCntAcc))/4; |
NaviCntAcc = 0; NaviAccNick = 0; NaviAccRoll = 0; |
// ToNaviCtrl.User8 = Parameter_UserParam8; |
// ToNaviCtrl.CalState = WinkelOut.CalcState; |
switch(ToNaviCtrl.Command) // |
{ |
case SPI_CMD_USER: |
ToNaviCtrl.Param.Byte[0] = Parameter_UserParam1; |
ToNaviCtrl.Param.Byte[1] = Parameter_UserParam2; |
ToNaviCtrl.Param.Byte[2] = Parameter_UserParam3; |
ToNaviCtrl.Param.Byte[3] = Parameter_UserParam4; |
ToNaviCtrl.Param.Byte[4] = Parameter_UserParam5; |
ToNaviCtrl.Param.Byte[5] = Parameter_UserParam6; |
ToNaviCtrl.Param.Byte[6] = Parameter_UserParam7; |
ToNaviCtrl.Param.Byte[7] = Parameter_UserParam8; |
ToNaviCtrl.Param.Byte[8] = (unsigned char) MikroKopterFlags; |
MikroKopterFlags &= ~(FLAG_CALIBRATE | FLAG_START); |
ToNaviCtrl.Param.Byte[9] = (unsigned char) UBat; |
ToNaviCtrl.Param.Byte[10] =(unsigned char) EE_Parameter.UnterspannungsWarnung; |
ToNaviCtrl.Param.Byte[11] =(unsigned char) eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET]); |
break; |
case SPI_CMD_PARAMETER1: |
ToNaviCtrl.Param.Byte[0] = EE_Parameter.NaviGpsModeControl; // Parameters for the Naviboard |
ToNaviCtrl.Param.Byte[1] = EE_Parameter.NaviGpsGain; |
ToNaviCtrl.Param.Byte[2] = EE_Parameter.NaviGpsP; |
ToNaviCtrl.Param.Byte[3] = EE_Parameter.NaviGpsI; |
ToNaviCtrl.Param.Byte[4] = EE_Parameter.NaviGpsD; |
ToNaviCtrl.Param.Byte[5] = EE_Parameter.NaviGpsACC; |
ToNaviCtrl.Param.Byte[6] = EE_Parameter.NaviGpsMinSat; |
ToNaviCtrl.Param.Byte[7] = EE_Parameter.NaviStickThreshold; |
ToNaviCtrl.Param.Byte[8] = EE_Parameter.NaviOperatingRadius; |
ToNaviCtrl.Param.Byte[9] = EE_Parameter.NaviWindCorrection; |
ToNaviCtrl.Param.Byte[10] = EE_Parameter.NaviSpeedCompensation; |
ToNaviCtrl.Param.Byte[11] = EE_Parameter.NaviAngleLimitation; |
break; |
case SPI_CMD_STICK: |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[0] = (char) tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[1] = (char) tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[2] = (char) tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_NICK]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[3] = (char) tmp; |
ToNaviCtrl.Param.Byte[4] = (unsigned char) Poti1; |
ToNaviCtrl.Param.Byte[5] = (unsigned char) Poti2; |
ToNaviCtrl.Param.Byte[6] = (unsigned char) Poti3; |
ToNaviCtrl.Param.Byte[7] = (unsigned char) Poti4; |
ToNaviCtrl.Param.Byte[8] = (unsigned char) SenderOkay; |
break; |
case SPI_CMD_MISC: |
if(WinkelOut.CalcState > 5) |
{ |
WinkelOut.CalcState = 0; |
ToNaviCtrl.Param.Byte[0] = 5; |
} |
else ToNaviCtrl.Param.Byte[0] = WinkelOut.CalcState; |
ToNaviCtrl.Param.Int[1] = HoehenWert; |
ToNaviCtrl.Param.Byte[1] = EE_Parameter.NaviPH_LoginTime; |
ToNaviCtrl.Param.Byte[4] = EE_Parameter.NaviGpsPLimit; |
ToNaviCtrl.Param.Byte[5] = EE_Parameter.NaviGpsILimit; |
ToNaviCtrl.Param.Byte[6] = EE_Parameter.NaviGpsDLimit; |
break; |
case SPI_CMD_VERSION: |
ToNaviCtrl.Param.Byte[0] = SPI_VersionInfo.Major; |
ToNaviCtrl.Param.Byte[1] = SPI_VersionInfo.Minor; |
ToNaviCtrl.Param.Byte[2] = SPI_VersionInfo.Patch; |
ToNaviCtrl.Param.Byte[3] = SPI_VersionInfo.Compatible; |
ToNaviCtrl.Param.Byte[4] = PlatinenVersion; |
break; |
} |
sei(); |
if(SPI_RxDataValid) |
{ |
if(abs(FromNaviCtrl.GPS_Nick) < 512 && abs(FromNaviCtrl.GPS_Roll) < 512 && (EE_Parameter.GlobalConfig & CFG_GPS_AKTIV)) |
{ |
GPS_Nick = FromNaviCtrl.GPS_Nick; |
GPS_Roll = FromNaviCtrl.GPS_Roll; |
NaviDataOkay = 250; |
} |
if(FromNaviCtrl.CompassValue <= 360) KompassValue = FromNaviCtrl.CompassValue; |
KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180; |
if(FromNaviCtrl.BeepTime > beeptime && !WinkelOut.CalcState) beeptime = FromNaviCtrl.BeepTime; |
switch (FromNaviCtrl.Command) |
{ |
case SPI_KALMAN: |
FromNaviCtrl_Value.Kalman_K = FromNaviCtrl.Param.Byte[0]; |
FromNaviCtrl_Value.Kalman_MaxFusion = FromNaviCtrl.Param.Byte[1]; |
FromNaviCtrl_Value.Kalman_MaxDrift = FromNaviCtrl.Param.Byte[2]; |
FromNaviCtrl_Value.SerialDataOkay = FromNaviCtrl.Param.Byte[3]; |
break; |
default: |
break; |
} |
} |
else |
{ |
// KompassValue = 0; |
// KompassRichtung = 0; |
GPS_Nick = 0; |
GPS_Roll = 0; |
} |
} |
#endif |
/branches/V0.74d-Arthur P/spi.h |
---|
0,0 → 1,140 |
// ######################## SPI - FlightCtrl ################### |
#ifndef _SPI_H |
#define _SPI_H |
#include <util/delay.h> |
#define USE_SPI_COMMUNICATION |
#define SPI_PROTOCOL_COMP 1 |
//----------------------------------------- |
#define DDR_SPI DDRB |
#define DD_SS PB4 |
#define DD_SCK PB7 |
#define DD_MOSI PB5 |
#define DD_MISO PB6 |
// for compatibility reasons gcc3.x <-> gcc4.x |
#ifndef SPCR |
#define SPCR SPCR0 |
#endif |
#ifndef SPE |
#define SPE SPE0 |
#endif |
#ifndef MSTR |
#define MSTR MSTR0 |
#endif |
#ifndef SPR1 |
#define SPR1 SPR01 |
#endif |
#ifndef SPR0 |
#define SPR0 SPR00 |
#endif |
#ifndef SPIE |
#define SPIE SPIE0 |
#endif |
#ifndef SPDR |
#define SPDR SPDR0 |
#endif |
#ifndef SPIF |
#define SPIF SPIF0 |
#endif |
#ifndef SPSR |
#define SPSR SPSR0 |
#endif |
// ------------------------- |
#define SLAVE_SELECT_DDR_PORT DDRC |
#define SLAVE_SELECT_PORT PORTC |
#define SPI_SLAVE_SELECT PC5 |
#define SPI_CMD_USER 10 |
#define SPI_CMD_STICK 11 |
#define SPI_CMD_MISC 12 |
#define SPI_CMD_PARAMETER1 13 |
#define SPI_CMD_VERSION 14 |
struct str_ToNaviCtrl |
{ |
unsigned char Sync1, Sync2; |
unsigned char Command; |
signed int IntegralNick; |
signed int IntegralRoll; |
signed int AccNick; |
signed int AccRoll; |
signed int GyroCompass; |
signed int GyroNick; |
signed int GyroRoll; |
signed int GyroGier; |
union |
{ char Byte[12]; |
int Int[6]; |
long Long[3]; |
float Float[3]; |
} Param; |
unsigned char Chksum; |
}; |
#define SPI_KALMAN 103 |
struct str_FromNaviCtrl |
{ |
unsigned char Command; |
signed int GPS_Nick; |
signed int GPS_Roll; |
signed int GPS_Gier; |
signed int CompassValue; |
signed int Status; |
unsigned int BeepTime; |
union |
{ char Byte[12]; |
int Int[6]; |
long Long[3]; |
float Float[3]; |
} Param; |
unsigned char Chksum; |
}; |
struct str_FromNaviCtrl_Value |
{ |
signed char Kalman_K; |
signed char Kalman_MaxDrift; |
signed char Kalman_MaxFusion; |
unsigned char SerialDataOkay; |
}; |
struct str_SPI_VersionInfo |
{ |
unsigned char Major; |
unsigned char Minor; |
unsigned char Patch; |
unsigned char Compatible; |
}; |
#ifdef USE_SPI_COMMUNICATION |
extern struct str_FromNaviCtrl_Value FromNaviCtrl_Value; |
extern struct str_ToNaviCtrl ToNaviCtrl; |
extern struct str_FromNaviCtrl FromNaviCtrl; |
extern unsigned char SPI_CommandCounter,NaviDataOkay; |
//#define SPI_CMD_VALUE 0x03 |
extern void SPI_MasterInit(void); |
extern void SPI_StartTransmitPacket(void); |
extern void UpdateSPI_Buffer(void); |
extern void SPI_TransmitByte(void); |
#else |
// -------------------------------- Dummy ----------------------------------------- |
#define SPI_MasterInit() ; |
#define SPI_StartTransmitPacket() ; |
#define UpdateSPI_Buffer() ; |
#define SPI_TransmitByte() ; |
#endif |
#endif |
/branches/V0.74d-Arthur P/timer0.c |
---|
0,0 → 1,431 |
#include "main.h" |
volatile unsigned int CountMilliseconds = 0; |
volatile static unsigned int tim_main; |
volatile unsigned char UpdateMotor = 0; |
volatile unsigned int cntKompass = 0; |
volatile unsigned int beeptime = 0; |
volatile unsigned char SendSPI = 0, ServoActive = 0; |
unsigned int BeepMuster = 0xffff; |
int ServoValue = 0; |
volatile int16_t ServoNickValue = 0; |
volatile int16_t ServoRollValue = 0; |
enum { |
STOP = 0, |
CK = 1, |
CK8 = 2, |
CK64 = 3, |
CK256 = 4, |
CK1024 = 5, |
T0_FALLING_EDGE = 6, |
T0_RISING_EDGE = 7 |
}; |
SIGNAL (SIG_OVERFLOW0) // 8kHz |
{ |
static unsigned char cnt_1ms = 1,cnt = 0; |
unsigned char pieper_ein = 0; |
// TCNT0 -= 250;//TIMER_RELOAD_VALUE; |
if(SendSPI) SendSPI--; |
if(!cnt--) |
{ |
cnt = 9; |
cnt_1ms++; |
cnt_1ms %= 2; |
if(!cnt_1ms) UpdateMotor = 1; |
CountMilliseconds++; |
} |
if(beeptime > 1) |
{ |
beeptime--; |
if(beeptime & BeepMuster) |
{ |
pieper_ein = 1; |
} |
else pieper_ein = 0; |
} |
else |
{ |
pieper_ein = 0; |
BeepMuster = 0xffff; |
} |
if(pieper_ein) |
{ |
if(PlatinenVersion == 10) PORTD |= (1<<2); // Speaker an PORTD.2 |
else PORTC |= (1<<7); // Speaker an PORTC.7 |
} |
else |
{ |
if(PlatinenVersion == 10) PORTD &= ~(1<<2); |
else PORTC &= ~(1<<7); |
} |
if(EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV) |
{ |
if(PINC & 0x10) |
{ |
cntKompass++; |
} |
else |
{ |
if((cntKompass) && (cntKompass < 362)) |
{ |
cntKompass += cntKompass / 41; |
if(cntKompass > 10) KompassValue = cntKompass - 10; else KompassValue = 0; |
} |
// if(cntKompass < 10) cntKompass = 10; |
// KompassValue = (unsigned long)((unsigned long)(cntKompass-10)*720L + 1L) / 703L; |
KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180; |
cntKompass = 0; |
} |
} |
} |
// ----------------------------------------------------------------------- |
unsigned int SetDelay (unsigned int t) |
{ |
// TIMSK0 &= ~_BV(TOIE0); |
return(CountMilliseconds + t + 1); |
// TIMSK0 |= _BV(TOIE0); |
} |
// ----------------------------------------------------------------------- |
char CheckDelay(unsigned int t) |
{ |
// TIMSK0 &= ~_BV(TOIE0); |
return(((t - CountMilliseconds) & 0x8000) >> 9); |
// TIMSK0 |= _BV(TOIE0); |
} |
// ----------------------------------------------------------------------- |
void Delay_ms(unsigned int w) |
{ |
unsigned int akt; |
akt = SetDelay(w); |
while (!CheckDelay(akt)); |
} |
void Delay_ms_Mess(unsigned int w) |
{ |
unsigned int akt; |
akt = SetDelay(w); |
while (!CheckDelay(akt)) if(AdReady) {AdReady = 0; ANALOG_ON;} |
} |
/*****************************************************/ |
/* Initialize Timer 2 */ |
/*****************************************************/ |
// The timer 2 is used to generate the PWM at PD7 (J7) |
// to control a camera servo for nick compensation. |
void TIMER2_Init(void) |
{ |
uint8_t sreg = SREG; |
// disable all interrupts before reconfiguration |
cli(); |
// set PD7 as output of the PWM for nick servo |
DDRD |= (1<<DDD7); |
PORTD &= ~(1<<PORTD7); // set PD7 to low |
DDRC |= (1<<DDC6); // set PC6 as output (Reset for HEF4017) |
HEF4017R_ON; |
// Timer/Counter 2 Control Register A |
// Timer Mode is FastPWM with timer reload at OCR2A (Bits: WGM22 = 1, WGM21 = 1, WGM20 = 1) |
// PD7: Normal port operation, OC2A disconnected, (Bits: COM2A1 = 0, COM2A0 = 0) |
// PD6: Normal port operation, OC2B disconnected, (Bits: COM2B1 = 0, COM2B0 = 0) |
TCCR2A &= ~((1<<COM2A1)|(1<<COM2A0)|(1<<COM2B1)|(1<<COM2B0)); |
TCCR2A |= (1<<WGM21)|(1<<WGM20); |
// Timer/Counter 2 Control Register B |
// Set clock divider for timer 2 to SYSKLOCK/32 = 20MHz / 32 = 625 kHz |
// The timer increments from 0x00 to 0xFF with an update rate of 625 kHz or 1.6 us |
// hence the timer overflow interrupt frequency is 625 kHz / 256 = 2.44 kHz or 0.4096 ms |
// divider 32 (Bits: CS022 = 0, CS21 = 1, CS20 = 1) |
TCCR2B &= ~((1<<FOC2A)|(1<<FOC2B)|(1<<CS22)); |
TCCR2B |= (1<<CS21)|(1<<CS20)|(1<<WGM22); |
// Initialize the Timer/Counter 2 Register |
TCNT2 = 0; |
// Initialize the Output Compare Register A used for PWM generation on port PD7. |
OCR2A = 255; |
TCCR2A |= (1<<COM2A1); // set or clear at compare match depends on value of COM2A0 |
// Timer/Counter 2 Interrupt Mask Register |
// Enable timer output compare match A Interrupt only |
TIMSK2 &= ~((1<<OCIE2B)|(1<<TOIE2)); |
TIMSK2 |= (1<<OCIE2A); |
SREG = sreg; |
} |
//---------------------------- |
void Timer_Init(void) |
{ |
tim_main = SetDelay(10); |
TCCR0B = CK8; |
TCCR0A = (1<<COM0A1)|(1<<COM0B1)|3;//fast PWM |
OCR0A = 0; |
OCR0B = 120; |
TCNT0 = (unsigned char)-TIMER_RELOAD_VALUE; // reload |
//OCR1 = 0x00; |
TIMSK0 |= _BV(TOIE0); |
} |
/*****************************************************/ |
/* Control Servo Position */ |
/*****************************************************/ |
ISR(TIMER2_COMPA_vect) |
{ |
// frame len 22.5 ms = 14063 * 1.6 us |
// stop pulse: 0.3 ms = 188 * 1.6 us |
// min servo pulse: 0.6 ms = 375 * 1.6 us |
// max servo pulse: 2.4 ms = 1500 * 1.6 us |
// resolution: 1500 - 375 = 1125 steps |
#define IRS_RUNTIME 127 |
#define PPM_STOPPULSE 188 |
// #define PPM_FRAMELEN (14063 |
#define PPM_FRAMELEN (1757 * EE_Parameter.ServoNickRefresh) |
#define MINSERVOPULSE 375 |
#define MAXSERVOPULSE 1500 |
#define SERVORANGE (MAXSERVOPULSE - MINSERVOPULSE) |
static uint8_t PulseOutput = 0; |
static uint16_t RemainingPulse = 0; |
static uint16_t ServoFrameTime = 0; |
static uint8_t ServoIndex = 0; |
#define MULTIPLYER 4 |
static int16_t ServoNickOffset = (255 / 2) * MULTIPLYER; // initial value near center positon |
static int16_t ServoRollOffset = (255 / 2) * MULTIPLYER; // initial value near center positon |
// if((PlatinenVersion < 20) |
if((PlatinenVersion < 20) && (Parameter_UserParam8 < 128 )) |
{ |
//--------------------------- |
// Nick servo state machine |
//--------------------------- |
if(!PulseOutput) // pulse output complete |
{ |
if(TCCR2A & (1<<COM2A0)) // we had a low pulse |
{ |
TCCR2A &= ~(1<<COM2A0);// make a high pulse |
RemainingPulse = MINSERVOPULSE + SERVORANGE/2; // center position ~ 1.5ms |
ServoNickOffset = (ServoNickOffset * 3 + (int16_t)Parameter_ServoNickControl * MULTIPLYER) / 4; // lowpass offset |
ServoNickValue = ServoNickOffset; // offset (Range from 0 to 255 * 3 = 765) |
if(EE_Parameter.ServoNickCompInvert & 0x01) |
{ // inverting movement of servo |
ServoNickValue += (int16_t)( ( (int32_t)EE_Parameter.ServoNickComp * MULTIPLYER * (IntegralNick / 128L ) ) / (256L) ); |
} |
else |
{ // non inverting movement of servo |
ServoNickValue -= (int16_t)( ( (int32_t)EE_Parameter.ServoNickComp * MULTIPLYER * (IntegralNick / 128L ) ) / (256L) ); |
} |
// limit servo value to its parameter range definition |
if(ServoNickValue < ((int16_t)EE_Parameter.ServoNickMin * MULTIPLYER) ) |
{ |
ServoNickValue = (int16_t)EE_Parameter.ServoNickMin * MULTIPLYER; |
} |
else |
if(ServoNickValue > ((int16_t)EE_Parameter.ServoNickMax * MULTIPLYER) ) |
{ |
ServoNickValue = (int16_t)EE_Parameter.ServoNickMax * MULTIPLYER; |
} |
RemainingPulse += ServoNickValue - (256 / 2) * MULTIPLYER; // shift ServoNickValue to center position |
ServoNickValue /= MULTIPLYER; |
DebugOut.Analog[20] = ServoNickValue; |
// range servo pulse width |
if(RemainingPulse > MAXSERVOPULSE ) RemainingPulse = MAXSERVOPULSE; // upper servo pulse limit |
else if(RemainingPulse < MINSERVOPULSE ) RemainingPulse = MINSERVOPULSE; // lower servo pulse limit |
// accumulate time for correct update rate |
ServoFrameTime = RemainingPulse; |
} |
else // we had a high pulse |
{ |
TCCR2A |= (1<<COM2A0); // make a low pulse |
RemainingPulse = PPM_FRAMELEN - ServoFrameTime; |
} |
// set pulse output active |
PulseOutput = 1; |
} |
} // EOF Nick servo state machine |
else |
{ |
//----------------------------------------------------- |
// PPM state machine, onboard demultiplexed by HEF4017 |
//----------------------------------------------------- |
if(!PulseOutput) // pulse output complete |
{ |
if(TCCR2A & (1<<COM2A0)) // we had a low pulse |
{ |
TCCR2A &= ~(1<<COM2A0);// make a high pulse |
if(ServoIndex == 0) // if we are at the sync gap |
{ |
RemainingPulse = PPM_FRAMELEN - ServoFrameTime; // generate sync gap by filling time to full frame time |
ServoFrameTime = 0; // reset servo frame time |
HEF4017R_ON; // enable HEF4017 reset |
} |
else // servo channels |
{ |
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.ServoNickCompInvert & 0x01) |
{ // inverting movement of servo |
ServoNickValue += (int16_t)( ( (int32_t)EE_Parameter.ServoNickComp * MULTIPLYER * (IntegralNick / 128L ) ) / (256L) ); |
} |
else |
{ // non inverting movement of servo |
ServoNickValue -= (int16_t)( ( (int32_t)EE_Parameter.ServoNickComp * MULTIPLYER * (IntegralNick / 128L ) ) / (256L) ); |
} |
// limit servo value to its parameter range definition |
if(ServoNickValue < ((int16_t)EE_Parameter.ServoNickMin * MULTIPLYER) ) |
{ |
ServoNickValue = (int16_t)EE_Parameter.ServoNickMin * MULTIPLYER; |
} |
else |
if(ServoNickValue > ((int16_t)EE_Parameter.ServoNickMax * MULTIPLYER) ) |
{ |
ServoNickValue = (int16_t)EE_Parameter.ServoNickMax * MULTIPLYER; |
} |
RemainingPulse += ServoNickValue - (256 / 2) * MULTIPLYER; // shift ServoNickValue to center position |
ServoNickValue /= MULTIPLYER; |
DebugOut.Analog[20] = ServoNickValue; |
break; |
case 2: // Roll Compensation Servo |
ServoRollOffset = (ServoRollOffset * 3 + (int16_t) 80 * MULTIPLYER) / 4; // lowpass offset |
ServoRollValue = ServoRollOffset; // offset (Range from 0 to 255 * 3 = 765) |
//if(EE_Parameter.ServoRollCompInvert & 0x01) |
if(Parameter_UserParam8 & 0x40) |
{ // inverting movement of servo if 64 has been added to User Parameter8 |
ServoRollValue += (int16_t)( ( (int32_t) 50 * MULTIPLYER * (IntegralRoll / 128L ) ) / (256L) ); |
} |
/**/ else |
{ // non inverting movement of servo |
ServoRollValue -= (int16_t)( ( (int32_t) 40 * MULTIPLYER * (IntegralRoll / 128L ) ) / (256L) ); |
} |
/**/ // limit servo value to its parameter range definition |
if(ServoRollValue < ((int16_t)EE_Parameter.ServoNickMin * MULTIPLYER) ) |
{ |
ServoRollValue = (int16_t)EE_Parameter.ServoNickMin * MULTIPLYER; |
} |
else |
if(ServoRollValue > ((int16_t)EE_Parameter.ServoNickMax * MULTIPLYER) ) |
{ |
ServoRollValue = (int16_t)EE_Parameter.ServoNickMax * MULTIPLYER; |
} |
RemainingPulse += ServoRollValue - (256 / 2) * MULTIPLYER; // shift ServoNickValue to center position |
ServoRollValue /= MULTIPLYER; |
//DebugOut.Analog[20] = ServoRollValue; |
/* ServoRollOffset = (ServoRollOffset * 3 + (int16_t)Parameter_ServoRollControl * MULTIPLYER) / 4; // lowpass offset |
ServoRollValue = ServoRollOffset; // offset (Range from 0 to 255 * 3 = 765) |
if(EE_Parameter.ServoRollCompInvert & 0x01) |
{ // inverting movement of servo |
ServoRollValue += (int16_t)( ( (int32_t)EE_Parameter.ServoNickComp * MULTIPLYER * (IntegralNick / 128L ) ) / (256L) ); |
} |
else |
{ // non inverting movement of servo |
ServoRollValue -= (int16_t)( ( (int32_t)EE_Parameter.ServoNickComp * MULTIPLYER * (IntegralNick / 128L ) ) / (256L) ); |
} |
// limit servo value to its parameter range definition |
if(ServoRollValue < ((int16_t)EE_Parameter.ServoRollMin * MULTIPLYER) ) |
{ |
ServoRollValue = (int16_t)EE_Parameter.ServoRollMin * MULTIPLYER; |
} |
else |
if(ServoRollValue > ((int16_t)EE_Parameter.ServoRollMax * MULTIPLYER) ) |
{ |
ServoRollValue = (int16_t)EE_Parameter.ServoRollMax * MULTIPLYER; |
} |
RemainingPulse += ServoRollValue - (256 / 2) * MULTIPLYER; // shift ServoNickValue to center position |
ServoRollValue /= MULTIPLYER; |
//DebugOut.Analog[20] = ServoRollValue; |
*/ break; |
default: // other servo channels |
RemainingPulse += 2 * PPM_in[ServoIndex]; // add channel value, factor of 2 because timer 1 increments 3.2µs |
break; |
} |
// range servo pulse width |
if(RemainingPulse > MAXSERVOPULSE ) RemainingPulse = MAXSERVOPULSE; // upper servo pulse limit |
else if(RemainingPulse < MINSERVOPULSE ) RemainingPulse = MINSERVOPULSE; // lower servo pulse limit |
// substract stop pulse width |
RemainingPulse -= PPM_STOPPULSE; |
// accumulate time for correct sync gap |
ServoFrameTime += RemainingPulse; |
} |
} |
else // we had a high pulse |
{ |
TCCR2A |= (1<<COM2A0); // make a low pulse |
// set pulsewidth to stop pulse width |
RemainingPulse = PPM_STOPPULSE; |
// accumulate time for correct sync gap |
ServoFrameTime += RemainingPulse; |
if(ServoActive && SenderOkay > 180) HEF4017R_OFF; // disable HEF4017 reset |
ServoIndex++; // change to next servo channel |
if(ServoIndex > EE_Parameter.ServoNickRefresh) ServoIndex = 0; // reset to the sync gap |
} |
// set pulse output active |
PulseOutput = 1; |
} |
} // EOF PPM state machine |
// General pulse output generator |
if(RemainingPulse > (255 + IRS_RUNTIME)) |
{ |
OCR2A = 255; |
RemainingPulse -= 255; |
} |
else |
{ |
if(RemainingPulse > 255) // this is the 2nd last part |
{ |
if((RemainingPulse - 255) < IRS_RUNTIME) |
{ |
OCR2A = 255 - IRS_RUNTIME; |
RemainingPulse -= 255 - IRS_RUNTIME; |
} |
else // last part > ISR_RUNTIME |
{ |
OCR2A = 255; |
RemainingPulse -= 255; |
} |
} |
else // this is the last part |
{ |
OCR2A = RemainingPulse; |
RemainingPulse = 0; |
PulseOutput = 0; // trigger to stop pulse |
} |
} // EOF general pulse output generator |
} |
/branches/V0.74d-Arthur P/timer0.h |
---|
0,0 → 1,20 |
#define TIMER_TEILER CK8 |
#define TIMER_RELOAD_VALUE 250 |
#define HEF4017R_ON PORTC |= (1<<PORTC6) |
#define HEF4017R_OFF PORTC &= ~(1<<PORTC6) |
void Timer_Init(void); |
void TIMER2_Init(void); |
void Delay_ms(unsigned int); |
void Delay_ms_Mess(unsigned int); |
unsigned int SetDelay (unsigned int t); |
char CheckDelay (unsigned int t); |
extern volatile unsigned int CountMilliseconds; |
extern volatile unsigned char UpdateMotor; |
extern volatile unsigned int beeptime; |
extern volatile unsigned int cntKompass; |
extern int ServoValue; |
extern unsigned int BeepMuster; |
extern volatile unsigned char SendSPI, ServoActive; |
/branches/V0.74d-Arthur P/twimaster.c |
---|
0,0 → 1,216 |
/*############################################################################ |
############################################################################*/ |
#include "main.h" |
volatile unsigned char twi_state = 0; |
unsigned char motor = 0; |
unsigned char motorread = 0,MissingMotor = 0; |
unsigned char motor_rx[16],motor_rx2[16]; |
unsigned char MotorPresent[MAX_MOTORS]; |
unsigned char MotorError[MAX_MOTORS]; |
//############################################################################ |
//Initzialisieren der I2C (TWI) Schnittstelle |
void i2c_init(void) |
//############################################################################ |
{ |
TWSR = 0; |
TWBR = ((SYSCLK/SCL_CLOCK)-16)/2; |
} |
//############################################################################ |
//Start I2C |
void i2c_start(void) |
//############################################################################ |
{ |
TWCR = (1<<TWSTA) | (1<<TWEN) | (1<<TWINT) | (1<<TWIE); |
} |
//############################################################################ |
void i2c_stop(void) |
//############################################################################ |
{ |
TWCR = (1<<TWEN) | (1<<TWSTO) | (1<<TWINT); |
} |
void i2c_reset(void) |
//############################################################################ |
{ |
i2c_stop(); |
twi_state = 0; |
motor = TWDR; |
motor = 0; |
TWCR = 0x80; |
TWAMR = 0; |
TWAR = 0; |
TWDR = 0; |
TWSR = 0; |
TWBR = 0; |
i2c_init(); |
i2c_start(); |
i2c_write_byte(0); |
} |
//############################################################################ |
void i2c_write_byte(char byte) |
//############################################################################ |
{ |
TWSR = 0x00; |
TWDR = byte; |
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE); |
} |
/****************************************/ |
/* Write to I2C */ |
/****************************************/ |
void I2C_WriteByte(int8_t byte) |
{ |
// move byte to send into TWI Data Register |
TWDR = byte; |
// clear interrupt flag (TWINT = 1) |
// enable i2c bus (TWEN = 1) |
// enable interrupt (TWIE = 1) |
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE); |
} |
/****************************************/ |
/* Receive byte and send ACK */ |
/****************************************/ |
void I2C_ReceiveByte(void) |
{ |
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE) | (1<<TWEA); |
} |
/****************************************/ |
/* I2C receive last byte and send no ACK*/ |
/****************************************/ |
void I2C_ReceiveLastByte(void) |
{ |
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE); |
} |
//############################################################################ |
SIGNAL (TWI_vect) |
//############################################################################ |
{ |
static unsigned char missing_motor; |
switch(twi_state++) |
{ |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Writing the Data |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
case 0: |
while(Mixer.Motor[motor][0] <= 0 && motor < MAX_MOTORS) motor++; // skip if not used |
if(motor == MAX_MOTORS) // writing finished -> now read |
{ |
motor = 0; |
twi_state = 3; |
i2c_write_byte(0x53+(motorread*2)); |
} |
else i2c_write_byte(0x52+(motor*2)); |
break; |
case 1: |
i2c_write_byte(Motor[motor++]); |
break; |
case 2: |
if(TWSR == 0x30) { if(!missing_motor) missing_motor = motor; if(++MotorError[motor-1] == 0) MotorError[motor-1] = 255;} |
i2c_stop(); |
I2CTimeout = 10; |
twi_state = 0; |
i2c_start(); |
break; |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Reading Data |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
case 3: |
//Transmit 1st byte for reading |
if(TWSR != 0x40) // Error? |
{ |
MotorPresent[motorread] = 0; |
motorread++; |
if(motorread >= MAX_MOTORS) motorread = 0; |
i2c_stop(); |
twi_state = 0; |
} |
else |
{ |
MotorPresent[motorread] = ('1' - '-') + motorread; |
I2C_ReceiveByte(); |
} |
MissingMotor = missing_motor; |
missing_motor = 0; |
break; |
case 4: //Read 1st byte and transmit 2nd Byte |
motor_rx[motorread] = TWDR; |
I2C_ReceiveLastByte(); //nack |
break; |
case 5: |
//Read 2nd byte |
motor_rx2[motorread++] = TWDR; |
if(motorread >= MAX_MOTORS) motorread = 0; |
i2c_stop(); |
twi_state = 0; |
break; |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// writing Gyro-Offset |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
case 8: |
i2c_write_byte(0x98); // Address of the DAC |
break; |
case 9: |
i2c_write_byte(0x10); // Update Channel A |
break; |
case 10: |
i2c_write_byte(AnalogOffsetNick); // Value |
break; |
case 11: |
i2c_write_byte(0x80); // Value |
break; |
case 12: |
i2c_stop(); |
I2CTimeout = 10; |
i2c_start(); |
break; |
case 13: |
i2c_write_byte(0x98); // Address of the DAC |
break; |
case 14: |
i2c_write_byte(0x12); // Update Channel B |
break; |
case 15: |
i2c_write_byte(AnalogOffsetRoll); // Value |
break; |
case 16: |
i2c_write_byte(0x80); // Value |
break; |
case 17: |
i2c_stop(); |
I2CTimeout = 10; |
i2c_start(); |
break; |
case 18: |
i2c_write_byte(0x98); // Address of the DAC |
break; |
case 19: |
i2c_write_byte(0x14); // Update Channel C |
break; |
case 20: |
i2c_write_byte(AnalogOffsetGier); // Value |
break; |
case 21: |
i2c_write_byte(0x80); // Value |
break; |
case 22: |
i2c_stop(); |
I2CTimeout = 10; |
twi_state = 0; |
break; |
default: twi_state = 0; |
break; |
} |
TWCR |= 0x80; |
} |
/branches/V0.74d-Arthur P/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.74d-Arthur P/uart.c |
---|
0,0 → 1,564 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include <stdarg.h> |
#include <string.h> |
#include "main.h" |
#include "uart.h" |
#define FC_ADDRESS 1 |
#define NC_ADDRESS 2 |
#define MK3MAG_ADDRESS 3 |
unsigned char GetExternalControl = 0,DebugDisplayAnforderung1 = 0, DebugDisplayAnforderung = 0,DebugDataAnforderung = 0,GetVersionAnforderung = 0, GetPPMChannelAnforderung = 0; |
unsigned char DisplayLine = 0; |
unsigned volatile char SioTmp = 0; |
unsigned volatile char SendeBuffer[MAX_SENDE_BUFF]; |
unsigned volatile char RxdBuffer[MAX_EMPFANGS_BUFF]; |
unsigned volatile char NMEABuffer[MAX_EMPFANGS_BUFF]; |
unsigned volatile char NeuerDatensatzEmpfangen = 0; |
unsigned volatile char NeueKoordinateEmpfangen = 0; |
unsigned volatile char UebertragungAbgeschlossen = 1; |
unsigned volatile char CntCrcError = 0; |
unsigned volatile char AnzahlEmpfangsBytes = 0; |
unsigned char *pRxData = 0; |
unsigned char RxDataLen = 0; |
unsigned volatile char PC_DebugTimeout = 0; |
unsigned volatile char PC_MotortestActive = 0; |
unsigned char DebugTextAnforderung = 255; |
unsigned char PcZugriff = 100; |
unsigned char MotorTest[16]; |
unsigned char MeineSlaveAdresse = 1; // Flight-Ctrl |
unsigned char ConfirmFrame; |
struct str_DebugOut DebugOut; |
struct str_ExternControl ExternControl; |
struct str_VersionInfo VersionInfo; |
struct str_WinkelOut WinkelOut; |
struct str_Data3D Data3D; |
int Debug_Timer,Kompass_Timer,Timer3D; |
unsigned int DebugDataIntervall = 200, Intervall3D = 0; |
const unsigned char ANALOG_TEXT[32][16] = |
{ |
//1234567890123456 |
"AngleNick ", //0 |
"AngleRoll ", |
"AccNick ", |
"AccRoll ", |
"GyroGier ", |
"Hight Value ", //5 |
"AccZ ", |
"Gas ", |
"Compass Value ", |
"Voltage ", |
"Empfang ", //10 |
"Gyro Kompass ", |
"Motor Front ", |
"Motor Rear ", |
"Motor Left ", |
"Motor Right ", //15 |
" ", |
" ", |
" ", |
"MK3Mag CalState ", |
"Servo ", //20 |
" ", |
" ", |
" ", |
" ", |
" ", //25 |
" ", |
"Kalman_MaxDrift ", |
" ", |
"Navi Serial Data", |
"GPS_Nick ", //30 |
"GPS_Roll " |
}; |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ Sende-Part der Datenübertragung |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
SIGNAL(INT_VEC_TX) |
{ |
static unsigned int ptr = 0; |
unsigned char tmp_tx; |
if(!UebertragungAbgeschlossen) |
{ |
ptr++; // die [0] wurde schon gesendet |
tmp_tx = SendeBuffer[ptr]; |
if((tmp_tx == '\r') || (ptr == MAX_SENDE_BUFF)) |
{ |
ptr = 0; |
UebertragungAbgeschlossen = 1; |
} |
UDR = tmp_tx; |
} |
else ptr = 0; |
} |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ Empfangs-Part der Datenübertragung, incl. CRC-Auswertung |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
SIGNAL(INT_VEC_RX) |
{ |
static unsigned int crc; |
static unsigned char crc1,crc2,buf_ptr; |
static unsigned char UartState = 0; |
unsigned char CrcOkay = 0; |
SioTmp = UDR; |
if(buf_ptr >= MAX_EMPFANGS_BUFF) UartState = 0; |
if(SioTmp == '\r' && UartState == 2) |
{ |
UartState = 0; |
crc -= RxdBuffer[buf_ptr-2]; |
crc -= RxdBuffer[buf_ptr-1]; |
crc %= 4096; |
crc1 = '=' + crc / 64; |
crc2 = '=' + crc % 64; |
CrcOkay = 0; |
if((crc1 == RxdBuffer[buf_ptr-2]) && (crc2 == RxdBuffer[buf_ptr-1])) CrcOkay = 1; else { CrcOkay = 0; CntCrcError++;}; |
if(!NeuerDatensatzEmpfangen && CrcOkay) // Datensatz schon verarbeitet |
{ |
NeuerDatensatzEmpfangen = 1; |
AnzahlEmpfangsBytes = buf_ptr + 1; |
RxdBuffer[buf_ptr] = '\r'; |
if(RxdBuffer[2] == 'R') wdt_enable(WDTO_250MS); // Reset-Commando |
} |
} |
else |
switch(UartState) |
{ |
case 0: |
if(SioTmp == '#' && !NeuerDatensatzEmpfangen) UartState = 1; // Startzeichen und Daten schon verarbeitet |
buf_ptr = 0; |
RxdBuffer[buf_ptr++] = SioTmp; |
crc = SioTmp; |
break; |
case 1: // Adresse auswerten |
UartState++; |
RxdBuffer[buf_ptr++] = SioTmp; |
crc += SioTmp; |
break; |
case 2: // Eingangsdaten sammeln |
RxdBuffer[buf_ptr] = SioTmp; |
if(buf_ptr < MAX_EMPFANGS_BUFF) buf_ptr++; |
else UartState = 0; |
crc += SioTmp; |
break; |
default: |
UartState = 0; |
break; |
} |
} |
// -------------------------------------------------------------------------- |
void AddCRC(unsigned int wieviele) |
{ |
unsigned int tmpCRC = 0,i; |
for(i = 0; i < wieviele;i++) |
{ |
tmpCRC += SendeBuffer[i]; |
} |
tmpCRC %= 4096; |
SendeBuffer[i++] = '=' + tmpCRC / 64; |
SendeBuffer[i++] = '=' + tmpCRC % 64; |
SendeBuffer[i++] = '\r'; |
UebertragungAbgeschlossen = 0; |
UDR = SendeBuffer[0]; |
} |
// -------------------------------------------------------------------------- |
void SendOutData(unsigned char cmd,unsigned char address, unsigned char BufferAnzahl, ...) //unsigned char *snd, unsigned char len) |
{ |
va_list ap; |
unsigned int pt = 0; |
unsigned char a,b,c; |
unsigned char ptr = 0; |
unsigned char *snd = 0; |
int len = 0; |
SendeBuffer[pt++] = '#'; // Startzeichen |
SendeBuffer[pt++] = 'a' + address; // Adresse (a=0; b=1,...) |
SendeBuffer[pt++] = cmd; // Commando |
va_start(ap, BufferAnzahl); |
if(BufferAnzahl) |
{ |
snd = va_arg(ap, unsigned char*); |
len = va_arg(ap, int); |
ptr = 0; |
BufferAnzahl--; |
} |
while(len) |
{ |
if(len) |
{ |
a = snd[ptr++]; |
len--; |
if((!len) && BufferAnzahl) |
{ |
snd = va_arg(ap, unsigned char*); |
len = va_arg(ap, int); |
ptr = 0; |
BufferAnzahl--; |
} |
} |
else a = 0; |
if(len) |
{ |
b = snd[ptr++]; |
len--; |
if((!len) && BufferAnzahl) |
{ |
snd = va_arg(ap, unsigned char*); |
len = va_arg(ap, int); |
ptr = 0; |
BufferAnzahl--; |
} |
} |
else b = 0; |
if(len) |
{ |
c = snd[ptr++]; |
len--; |
if((!len) && BufferAnzahl) |
{ |
snd = va_arg(ap, unsigned char*); |
len = va_arg(ap, int); |
ptr = 0; |
BufferAnzahl--; |
} |
} |
else c = 0; |
SendeBuffer[pt++] = '=' + (a >> 2); |
SendeBuffer[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4)); |
SendeBuffer[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6)); |
SendeBuffer[pt++] = '=' + ( c & 0x3f); |
} |
va_end(ap); |
AddCRC(pt); |
} |
// -------------------------------------------------------------------------- |
void Decode64(void) // die daten werden im rx buffer dekodiert, das geht nur, weil aus 4 byte immer 3 gemacht werden. |
{ |
unsigned char a,b,c,d; |
unsigned char x,y,z; |
unsigned char ptrIn = 3; // start at begin of data block |
unsigned char ptrOut = 3; |
unsigned char len = AnzahlEmpfangsBytes - 6; // von der Gesamtbytezahl eines Frames gehen 3 Bytes des Headers ('#',Addr, Cmd) und 3 Bytes des Footers (CRC1, CRC2, '\r') ab. |
while(len) |
{ |
a = RxdBuffer[ptrIn++] - '='; |
b = RxdBuffer[ptrIn++] - '='; |
c = RxdBuffer[ptrIn++] - '='; |
d = RxdBuffer[ptrIn++] - '='; |
x = (a << 2) | (b >> 4); |
y = ((b & 0x0f) << 4) | (c >> 2); |
z = ((c & 0x03) << 6) | d; |
if(len--) RxdBuffer[ptrOut++] = x; else break; |
if(len--) RxdBuffer[ptrOut++] = y; else break; |
if(len--) RxdBuffer[ptrOut++] = z; else break; |
} |
pRxData = (unsigned char*)&RxdBuffer[3]; // decodierte Daten beginnen beim 4. Byte |
RxDataLen = ptrOut - 3; // wie viele Bytes wurden dekodiert? |
} |
// -------------------------------------------------------------------------- |
void BearbeiteRxDaten(void) |
{ |
if(!NeuerDatensatzEmpfangen) return; |
unsigned char tempchar1, tempchar2; |
Decode64(); // dekodiere datenblock im Empfangsbuffer |
switch(RxdBuffer[1]-'a') // check for Slave Address |
{ |
case FC_ADDRESS: // FC special commands |
switch(RxdBuffer[2]) |
{ |
case 'K':// Kompasswert |
memcpy((unsigned char *)&KompassValue , (unsigned char *)pRxData, sizeof(KompassValue)); |
KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180; |
break; |
case 't':// Motortest |
if(AnzahlEmpfangsBytes > 20) memcpy(&MotorTest[0], (unsigned char *)pRxData, sizeof(MotorTest)); |
else memcpy(&MotorTest[0], (unsigned char *)pRxData, 4); |
PC_MotortestActive = 240; |
//while(!UebertragungAbgeschlossen); |
//SendOutData('T', MeineSlaveAdresse, 0); |
PcZugriff = 255; |
break; |
case 'n':// "Get Mixer |
while(!UebertragungAbgeschlossen); |
SendOutData('N', FC_ADDRESS, 1, (unsigned char *) &Mixer,sizeof(Mixer)); |
break; |
case 'm':// "Write Mixer |
while(!UebertragungAbgeschlossen); |
if(pRxData[0] == MIXER_REVISION) |
{ |
memcpy(&Mixer, (unsigned char *)pRxData, sizeof(Mixer)); |
eeprom_write_block(&Mixer, &EEPromArray[EEPROM_ADR_MIXER_TABLE], sizeof(Mixer)); |
tempchar1 = 1; |
} |
else tempchar1 = 0; |
SendOutData('M', FC_ADDRESS, 1, &tempchar1, sizeof(tempchar1)); |
break; |
case 'p': // get PPM Channels |
GetPPMChannelAnforderung = 1; |
break; |
case 'q':// "Get"-Anforderung für Settings |
// Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
if(pRxData[0] == 0xFF) |
{ |
pRxData[0] = GetActiveParamSetNumber(); |
} |
// limit settings range |
if(pRxData[0] < 1) pRxData[0] = 1; // limit to 5 |
else if(pRxData[0] > 5) pRxData[0] = 5; // limit to 5 |
// load requested parameter set |
ReadParameterSet(pRxData[0], (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
while(!UebertragungAbgeschlossen); |
tempchar1 = pRxData[0]; |
tempchar2 = EE_DATENREVISION; |
SendOutData('Q', FC_ADDRESS, 3, &tempchar1, sizeof(tempchar1), &tempchar2, sizeof(tempchar2), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
break; |
case 's': // Parametersatz speichern |
if((1 <= pRxData[0]) && (pRxData[0] <= 5) && (pRxData[1] == EE_DATENREVISION)) // check for setting to be in range |
{ |
memcpy((unsigned char *) &EE_Parameter.Kanalbelegung[0], (unsigned char *)&pRxData[2], STRUCT_PARAM_LAENGE); |
WriteParameterSet(pRxData[0], (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L; |
Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagRoll * 2500L; |
SetActiveParamSetNumber(pRxData[0]); |
tempchar1 = GetActiveParamSetNumber(); |
Piep(tempchar1); |
} |
else |
{ |
tempchar1 = 0; // mark in response an invlid setting |
} |
while(!UebertragungAbgeschlossen); |
SendOutData('S', FC_ADDRESS, 1, &tempchar1, sizeof(tempchar1)); |
break; |
} // case FC_ADDRESS: |
default: // any Slave Address |
switch(RxdBuffer[2]) |
{ |
// 't' comand placed here only for compatibility to BL |
case 't':// Motortest |
if(AnzahlEmpfangsBytes > 20) memcpy(&MotorTest[0], (unsigned char *)pRxData, sizeof(MotorTest)); |
else memcpy(&MotorTest[0], (unsigned char *)pRxData, 4); |
while(!UebertragungAbgeschlossen); |
SendOutData('T', MeineSlaveAdresse, 0); |
PC_MotortestActive = 250; |
PcZugriff = 255; |
break; |
// 'K' comand placed here only for compatibility to old MK3MAG software, that does not send the right Slave Address |
case 'K':// Kompasswert |
memcpy((unsigned char *)&KompassValue , (unsigned char *)pRxData, sizeof(KompassValue)); |
KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180; |
break; |
case 'a':// Texte der Analogwerte |
DebugTextAnforderung = pRxData[0]; |
if (DebugTextAnforderung > 31) DebugTextAnforderung = 31; |
PcZugriff = 255; |
break; |
case 'b': |
memcpy((unsigned char *)&ExternControl, (unsigned char *)pRxData, sizeof(ExternControl)); |
ConfirmFrame = ExternControl.Frame; |
PcZugriff = 255; |
break; |
case 'c': // Poll the 3D-Data |
if(!Intervall3D) { if(pRxData[0]) Timer3D = SetDelay(pRxData[0] * 10);} |
Intervall3D = pRxData[0] * 10; |
break; |
case 'd': // Poll the debug data |
DebugDataIntervall = pRxData[0] * 10; |
if(DebugDataIntervall > 0) DebugDataAnforderung = 1; |
break; |
case 'h':// x-1 Displayzeilen |
PcZugriff = 255; |
RemoteKeys |= pRxData[0]; |
if(RemoteKeys) DisplayLine = 0; |
DebugDisplayAnforderung = 1; |
break; |
case 'l':// x-1 Displayzeilen |
PcZugriff = 255; |
MenuePunkt = pRxData[0]; |
DebugDisplayAnforderung1 = 1; |
break; |
case 'v': // Version-Anforderung und Ausbaustufe |
GetVersionAnforderung = 1; |
break; |
case 'g':// |
GetExternalControl = 1; |
break; |
} |
break; // default: |
} |
NeuerDatensatzEmpfangen = 0; |
pRxData = 0; |
RxDataLen = 0; |
} |
//############################################################################ |
//Routine für die Serielle Ausgabe |
int uart_putchar (char c) |
//############################################################################ |
{ |
if (c == '\n') |
uart_putchar('\r'); |
//Warten solange bis Zeichen gesendet wurde |
loop_until_bit_is_set(USR, UDRE); |
//Ausgabe des Zeichens |
UDR = c; |
return (0); |
} |
// -------------------------------------------------------------------------- |
void WriteProgramData(unsigned int pos, unsigned char wert) |
{ |
//if (ProgramLocation == IN_RAM) Buffer[pos] = wert; |
// else eeprom_write_byte(&EE_Buffer[pos], wert); |
// Buffer[pos] = wert; |
} |
//############################################################################ |
//INstallation der Seriellen Schnittstelle |
void UART_Init (void) |
//############################################################################ |
{ |
//Enable TXEN im Register UCR TX-Data Enable & RX Enable |
UCR=(1 << TXEN) | (1 << RXEN); |
// UART Double Speed (U2X) |
USR |= (1<<U2X); |
// RX-Interrupt Freigabe |
UCSRB |= (1<<RXCIE); |
// TX-Interrupt Freigabe |
UCSRB |= (1<<TXCIE); |
//Teiler wird gesetzt |
UBRR=(SYSCLK / (BAUD_RATE * 8L) - 1); |
//UBRR = 33; |
//öffnet einen Kanal für printf (STDOUT) |
//fdevopen (uart_putchar, 0); |
//sbi(PORTD,4); |
Debug_Timer = SetDelay(DebugDataIntervall); |
Kompass_Timer = SetDelay(220); |
VersionInfo.SWMajor = 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) |
{ |
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.74d-Arthur P/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.74d-Arthur P/version.txt |
---|
0,0 → 1,258 |
------- |
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ührt |
/branches/V0.74d-Arthur P |
---|
Property changes: |
Added: tsvn:logminsize |
+8 |
\ No newline at end of property |