/branches/V0.74d_ACC-HH_MartinR/FlightCtrl.aps |
---|
0,0 → 1,0 |
<AVRStudio><MANAGEMENT><ProjectName>FlightCtrl</ProjectName><Created>15-May-2007 11:20:41</Created><LastEdit>11-Oct-2007 22:58:54</LastEdit><ICON>241</ICON><ProjectType>0</ProjectType><Created>15-May-2007 11:20:41</Created><Version>4</Version><Build>4, 13, 0, 528</Build><ProjectTypeName>AVR GCC</ProjectTypeName></MANAGEMENT><CODE_CREATION><ObjectFile>default\Flight-Ctrl.elf</ObjectFile><EntryFile></EntryFile><SaveFolder>F:\SVN\MikroKopter\FlightCtrl\branches\V0.64_ZeroWarnings\</SaveFolder></CODE_CREATION><DEBUG_TARGET><CURRENT_TARGET>AVR Simulator</CURRENT_TARGET><CURRENT_PART>ATmega644.xml</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND><HIDE>false</HIDE></IO_EXPAND><REGISTERNAMES><Register>R00</Register><Register>R01</Register><Register>R02</Register><Register>R03</Register><Register>R04</Register><Register>R05</Register><Register>R06</Register><Register>R07</Register><Register>R08</Register><Register>R09</Register><Register>R10</Register><Register>R11</Register><Register>R12</Register><Register>R13</Register><Register>R14</Register><Register>R15</Register><Register>R16</Register><Register>R17</Register><Register>R18</Register><Register>R19</Register><Register>R20</Register><Register>R21</Register><Register>R22</Register><Register>R23</Register><Register>R24</Register><Register>R25</Register><Register>R26</Register><Register>R27</Register><Register>R28</Register><Register>R29</Register><Register>R30</Register><Register>R31</Register></REGISTERNAMES><COM>Auto</COM><COMType>0</COMType><WATCHNUM>0</WATCHNUM><WATCHNAMES><Pane0></Pane0><Pane1></Pane1><Pane2></Pane2><Pane3></Pane3></WATCHNAMES><BreakOnTrcaeFull>0</BreakOnTrcaeFull></DEBUG_TARGET><Debugger><Triggers></Triggers></Debugger><AVRGCCPLUGIN><FILES><SOURCEFILE>uart.c</SOURCEFILE><SOURCEFILE>analog.c</SOURCEFILE><SOURCEFILE>eeprom.c</SOURCEFILE><SOURCEFILE>fc.c</SOURCEFILE><SOURCEFILE>GPS.c</SOURCEFILE><SOURCEFILE>main.c</SOURCEFILE><SOURCEFILE>menu.c</SOURCEFILE><SOURCEFILE>printf_P.c</SOURCEFILE><SOURCEFILE>rc.c</SOURCEFILE><SOURCEFILE>timer0.c</SOURCEFILE><SOURCEFILE>twimaster.c</SOURCEFILE><HEADERFILE>uart.h</HEADERFILE><HEADERFILE>_Settings.h</HEADERFILE><HEADERFILE>analog.h</HEADERFILE><HEADERFILE>fc.h</HEADERFILE><HEADERFILE>gps.h</HEADERFILE><HEADERFILE>main.h</HEADERFILE><HEADERFILE>menu.h</HEADERFILE><HEADERFILE>old_macros.h</HEADERFILE><HEADERFILE>printf_P.h</HEADERFILE><HEADERFILE>rc.h</HEADERFILE><HEADERFILE>Settings.h</HEADERFILE><HEADERFILE>timer0.h</HEADERFILE><HEADERFILE>twimaster.h</HEADERFILE></FILES><CONFIGS><CONFIG><NAME>default</NAME><USESEXTERNALMAKEFILE>NO</USESEXTERNALMAKEFILE><EXTERNALMAKEFILE></EXTERNALMAKEFILE><PART>atmega644</PART><HEX>1</HEX><LIST>1</LIST><MAP>1</MAP><OUTPUTFILENAME>Flight-Ctrl.elf</OUTPUTFILENAME><OUTPUTDIR>default\</OUTPUTDIR><ISDIRTY>1</ISDIRTY><OPTIONS><OPTION><FILE>GPS.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>analog.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>eeprom.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>fc.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>main.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>menu.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>printf_P.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>rc.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>timer0.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>twimaster.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>uart.c</FILE><OPTIONLIST></OPTIONLIST></OPTION></OPTIONS><INCDIRS/><LIBDIRS/><LIBS><LIB>libc.a</LIB><LIB>libm.a</LIB></LIBS><LINKOBJECTS/><OPTIONSFORALL>-Wall -gdwarf-2 -Wstrict-prototypes -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -DVERSION_HAUPTVERSION=0 -DVERSION_NEBENVERSION=64 -DVERSION_KOMPATIBEL=5</OPTIONSFORALL><LINKEROPTIONS></LINKEROPTIONS><SEGMENTS/></CONFIG></CONFIGS><LASTCONFIG>default</LASTCONFIG><USES_WINAVR>1</USES_WINAVR><GCC_LOC>C:\Program Files\WinAVR\bin\avr-gcc.exe</GCC_LOC><MAKE_LOC>C:\Program Files\WinAVR\utils\bin\make.exe</MAKE_LOC></AVRGCCPLUGIN><IOView><usergroups/></IOView><Files><File00000><FileId>00000</FileId><FileName>main.c</FileName><Status>1</Status></File00000><File00001><FileId>00001</FileId><FileName>uart.c</FileName><Status>1</Status></File00001><File00002><FileId>00002</FileId><FileName>menu.c</FileName><Status>1</Status></File00002><File00003><FileId>00003</FileId><FileName>timer0.c</FileName><Status>1</Status></File00003><File00004><FileId>00004</FileId><FileName>fc.c</FileName><Status>1</Status></File00004><File00005><FileId>00005</FileId><FileName>fc.h</FileName><Status>1</Status></File00005><File00006><FileId>00006</FileId><FileName>menu.h</FileName><Status>1</Status></File00006><File00007><FileId>00007</FileId><FileName>TWIMASTER.C</FileName><Status>1</Status></File00007><File00008><FileId>00008</FileId><FileName>twimaster.h</FileName><Status>1</Status></File00008><File00009><FileId>00009</FileId><FileName>uart.h</FileName><Status>1</Status></File00009><File00010><FileId>00010</FileId><FileName>_Settings.h</FileName><Status>1</Status></File00010><File00011><FileId>00011</FileId><FileName>analog.h</FileName><Status>1</Status></File00011><File00012><FileId>00012</FileId><FileName>gps.h</FileName><Status>1</Status></File00012><File00013><FileId>00013</FileId><FileName>main.h</FileName><Status>1</Status></File00013><File00014><FileId>00014</FileId><FileName>old_macros.h</FileName><Status>1</Status></File00014><File00015><FileId>00015</FileId><FileName>printf_P.h</FileName><Status>1</Status></File00015><File00016><FileId>00016</FileId><FileName>rc.h</FileName><Status>1</Status></File00016><File00017><FileId>00017</FileId><FileName>Settings.h</FileName><Status>1</Status></File00017><File00018><FileId>00018</FileId><FileName>timer0.h</FileName><Status>1</Status></File00018></Files><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio> |
/branches/V0.74d_ACC-HH_MartinR/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_ACC-HH_MartinR/Hex-Files/BootLoader_MEGA644_20MHZ_V0_1.hex |
---|
0,0 → 1,64 |
:10F8000011241FBECFEFD0E1DEBFCDBF11E0A0E0DD |
:10F81000B1E0E0EEFBEF02C005900D92A030B10721 |
:10F82000D9F712E0A0E0B1E001C01D92A230B1070B |
:10F83000E1F70C943B7C0C941D7C0895982F8091EB |
:10F84000C00085FFFCCF9093C60008958091C00052 |
:10F850008823E4F78091C600992708958DE40E94DB |
:10F860001E7C8BE40E941E7C82E40E941E7C8CE441 |
:10F870000E941E7C0895CFEFD0E1DEBFCDBFE0E057 |
:10F88000F0E014915F01772474BE98E10FB6F8940C |
:10F8900090936000109260000FBE7092C5008AE2E3 |
:10F8A0008093C4008091C00082608093C0009093D8 |
:10F8B000C10086E08093C200EF01072D8091C00057 |
:10F8C00087FF0DC0013031F48091C6008A3AB1F152 |
:10F8D00000E005C08091C6008B3109F401E0CE0143 |
:10F8E00021968436910528F11F3F41F0112331F014 |
:10F8F000E0910001F091010109951BC01092C50033 |
:10F900008AE28093C4008AE00E941E7C8DE00E94FF |
:10F910001E7C86E50E941E7C80E30E941E7C8EE297 |
:10F920000E941E7C81E30E941E7C8AE30E941E7C52 |
:10F9300005C080E593EC0197F1F7C0CF0E942E7CC3 |
:10F940000E94267C813611F489E547C1813471F427 |
:10F950000E94267CA82EBB24BA2CAA240E94267CB6 |
:10F960009927A82AB92AB694A79406C1823629F401 |
:10F9700089E50E941E7C81E00BC1823409F083C0BE |
:10F980000E94267C9927D82FCC270E94267C992775 |
:10F99000C82BD92B0E94267C082F12E0812E11E063 |
:10F9A000912EEE24FF2464010894811C911CEC1616 |
:10F9B000FD0618F40E94267C01C08FEFD6018C93BF |
:10F9C0000894E11CF11CBFEFEB16F10461F358F34E |
:10F9D000E4E77E1609F0DEC0063409F03DC0FFEF13 |
:10F9E000AF16F7EFBF0608F033C0DE01A5016627AA |
:10F9F0007727440F551F661F771F6A017B01C2E0FE |
:10FA0000D1E001E08991992729913327322F2227CC |
:10FA1000822B932B0C01FA0100935700E8951124D7 |
:10FA20004E5F5F4F6F4F7F4F129761F785E0F60192 |
:10FA300080935700E89507B600FCFDCF81E18093E5 |
:10FA40005700E89576956795579547955A0194C064 |
:10FA500080E00E941E7C90C0053409F08DC0F50145 |
:10FA60009E01A2E0B1E0E1BD8F2F992782BD8D916B |
:10FA700080BD3196FA9AF99AF999FECF215030401B |
:10FA800091F75F0179C0873609F047C00E94267C54 |
:10FA90009927D82ECC240E94267C9927C82AD92AB7 |
:10FAA0000E94267C863411F5E6016501EE24FF24D0 |
:10FAB000CC0CDD1CEE1CFF1CF60105911491802F6F |
:10FAC0000E941E7C812F99270E941E7C82E090E07C |
:10FAD000A0E0B0E0C80ED91EEA1EFB1E229761F717 |
:10FAE000F694E794D794C79456012ACF853409F049 |
:10FAF00027CF7501E1BC8F2D992782BDF89A089414 |
:10FB0000E11CF11C80B50E941E7C0894C108D1083C |
:10FB1000C114D10479F7570113CF853601F594E765 |
:10FB2000791651F580E090E0A0E0B0E023E0FC0120 |
:10FB300020935700E89507B600FCFDCF80509F4FFB |
:10FB4000AF4FBF4F8F3FE7EF9E07E0E0AE07E0E02B |
:10FB5000BE0768F381E180935700E8950DC08534B6 |
:10FB600069F488E190E02CE00FB6F894A8958093B2 |
:10FB700060000FBE209360008DE02FC08035E1F360 |
:10FB80008C34D1F3803711F483E527C0843721F416 |
:10FB90000E941E7C80E021C0843521F40E94267CD6 |
:10FBA000782EEACF8B3109F4C9CE8A3A09F4C6CE51 |
:10FBB000863529F480E30E941E7C81E30EC08337E2 |
:10FBC00041F489E00E941E7C86E90E941E7C8EE141 |
:10FBD00004C08B3109F4B4CE8FE30E941E7CB0CEFA |
:040000030000F80001 |
:00000001FF |
/branches/V0.74d_ACC-HH_MartinR/Hex-Files/Flight-Ctrl_MEGA644_V0_74d_MartinR.hex |
---|
0,0 → 1,3425 |
:100000000C948D040C94A8040C94A8040C94A804DB |
:100010000C94A8040C94A8040C94A8040C94A804B0 |
:100020000C94A8040C942C160C94A8040C94A8040A |
:100030000C9404290C94A8040C94A8040C94A8040F |
:100040000C94A8040C94A8040C94CE140C94A8044A |
:100050000C94A6090C94A8040C9470090C94A804A0 |
:100060000C94391B0C94A8040C949B270C94A804A2 |
:100070000C9481660C94A8040C94A804C227002850 |
:100080000E28342860286D28D728D7288328872869 |
:100090008B28902894289F28A328A728AC28B0282C |
:1000A000BB28BF28C328C828CC280A0D3D3D3D3DAC |
:1000B0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D70 |
:1000C0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D009D |
:1000D0000A0D466C69676874436F6E74726F6C0AC0 |
:1000E0000D48617264776172653A25642E25640A51 |
:1000F0000D536F6674776172653A5625642E2564D8 |
:10010000256320000A0D47656E65726174696E672C |
:100110002064656661756C74204D69786572205441 |
:1001200061626C65000A0D4D697865722D436F6ED2 |
:100130006669673A202725732720282575204D6F8B |
:10014000746F727329000A0D466F756E6420424CFD |
:100150002D4374726C3A2000256420000A0D0A0DAC |
:100160002121204D495353494E4720424C2D4354A1 |
:10017000524C3A202564202121000A0D3D3D3D3D91 |
:100180003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D9F |
:100190003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D00CC |
:1001A0000A0D496E69742E20454550524F4D003A54 |
:1001B0002047656E65726174696E6720446566618B |
:1001C000756C742D506172616D6574657220757304 |
:1001D000696E67206F6C6420537469636B2053658C |
:1001E0007474696E6773000A0D414343206E6F7427 |
:1001F0002063616C696272617465642021000A0D7C |
:100200005573696E6720706172616D657465727394 |
:100210006574202564000A0D43616C696272617423 |
:10022000696E672070726573737572652073656E91 |
:10023000736F722E2E004F4B0A0D000A0D436F6E26 |
:1002400074726F6C3A200048656164696E67486F2C |
:100250006C64004E6F726D616C20284143432D4DDC |
:100260006F646529000A0D3D3D3D3D3D3D3D3D3DF1 |
:100270003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3DAE |
:100280003D3D3D3D3D3D3D3D3D3D0A0D002E000ABD |
:100290000D20444143206F72204932432045525281 |
:1002A0004F522120436865636B204932432C203331 |
:1002B000567265662C2044414320616E6420424C96 |
:1002C0002D4374726C005B25695D005B25695D00E0 |
:1002D0002B204D696B726F4B6F70746572202B0011 |
:1002E00048573A5625642E25642053573A25642EE4 |
:1002F000256425630053657474696E673A2564202C |
:10030000257300493243204552524F52212121008A |
:100310004D697373696E6720424C2D4374726C3A59 |
:10032000256421210028632920486F6C67657220AD |
:100330004275737300486F6568653A20202020205D |
:1003400025356900536F6C6C486F6568653A2025E8 |
:100350003569004C756674647275636B3A20253597 |
:1003600069004F66662020202020203A202535692C |
:10037000004B65696E65200048F668656E726567BA |
:10038000656C756E6700616B742E204C616765004B |
:100390004E69636B3A2020202020202535690052C9 |
:1003A0006F6C6C3A202020202020253569004B6F8F |
:1003B0006D706173733A202020253569004B313A06 |
:1003C00025346920204B323A25346920004B333ADA |
:1003D00025346920204B343A25346920004B353AC6 |
:1003E00025346920204B363A25346920004B373AB2 |
:1003F00025346920204B383A25346920004E693A6B |
:100400002534692020526F3A253469200047733A19 |
:10041000253469202047693A253469200050313A53 |
:10042000253469202050323A253469200050333A6F |
:10043000253469202050343A2534692000477972E8 |
:100440006F202D2053656E736F72004E69636B20B1 |
:1004500025346920282533692E25692900526F6CBF |
:100460006C2025346920282533692E256929004709 |
:1004700069657220253469202825336929004E6971 |
:10048000636B2025346920282533692E25782900BF |
:10049000526F6C6C2025346920282533692E25780D |
:1004A0002900476965722025346920282533692988 |
:1004B000004E69636B20253469202825336929287B |
:1004C0002533692900526F6C6C202534692028255A |
:1004D0003369292825336929004769657220253445 |
:1004E0006920282533692928253369290041434398 |
:1004F000202D2053656E736F72004E69636B20254B |
:10050000346920282533692900526F6C6C2025340A |
:100510006920282533692900486F636820253469DC |
:10052000202825336929005370616E6E756E673A15 |
:10053000202025356900456D70662E506567656C15 |
:100540003A253569004B6F6D706173732020202050 |
:10055000202020005269636874756E673A20202558 |
:100560003569004D657373776572743A20202535BF |
:10057000690053746172743A202020202025356967 |
:1005800000506F7469313A202025336900506F7430 |
:1005900069323A202025336900506F7469333A205C |
:1005A0002025336900506F7469343A20202533695F |
:1005B00000536572766F202000536574706F696E0A |
:1005C000742020253369005374656C6C756E673A2E |
:1005D000202533690052616E67653A2533692D2500 |
:1005E00033690045787465726E436F6E74726F6C18 |
:1005F0002020004E693A2534692020526F3A253474 |
:1006000069200047733A253469202047693A253428 |
:1006100069200048693A253469202043663A253428 |
:10062000692000424C2D4374726C204572726F72C7 |
:1006300073200020253364202025336420202533B7 |
:1006400064202025336420002025336420202533B6 |
:1006500064202025336420202533642000202533A6 |
:100660006420202533642020253364202025336432 |
:100670002000424C2D4374726C20666F756E6420AE |
:1006800000202563202020256320202025632020B2 |
:1006900020256320002025632020202563202020A2 |
:1006A0002563202020256320002025632020202D85 |
:1006B0002020202D2020202D00313000313100312C |
:1006C000320000008F001E01AD013B02CA02580338 |
:1006D000E603740402058F051B06A7063307BE0751 |
:1006E0004808D2085B09E3096B0AF20A780BFD0B94 |
:1006F000810C040D860D070E870E060F840F001067 |
:100700007B10F5106E11E5115B12CF124213B3137B |
:1007100023149214FE146A15D3153B16A11605175F |
:100720006717C81727188318DE1837198E19E319A9 |
:10073000361A871AD61A231B6E1BB61BFD1B411CCB |
:10074000831CC31C001D3C1D751DAB1DE01D121E2E |
:10075000421E6F1E9A1EC31EE91E0D1F2E1F4D1F27 |
:10076000691F841F9B1FB01FC31FD31FE11FEC1FF6 |
:10077000F51FFB1FFF1F00200001020304040506F4 |
:100780000708090A0B0B0C0D0E0F10111112131490 |
:10079000151516171818191A1B1B1C1D1D1E1F1FB7 |
:1007A0002021212223232424252526272728282900 |
:1007B000292A2A2B2B2C2C2D2D2D2E2E2F2F30306D |
:1007C00030313132323233333334343435353536F7 |
:1007D000363637373737383838393939393A3A3A97 |
:1007E0003A3B3B3B3B3C3C3C3C3C3D3D3D3D3E3E47 |
:1007F0003E3E3E3F3F3F3F3F3F4040404040404104 |
:1008000041414141414242424242424243434343C9 |
:100810004343434444444444444444454545454596 |
:100820004545454546464646464646464647474769 |
:100830004747474747474747484848484848484840 |
:10084000484848494949494949494949494949491B |
:10085000494A4A4A4A4A4A4A4A4A4A4A4A4A4A4BF8 |
:100860004B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4BD8 |
:100870004C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4CB8 |
:100880004C4C4C4D4D4D4D4D4D4D4D4D4D4D4D4D9B |
:100890004D4D4D4D4D4D4D4D4D4E4E4E4E4E4E4E81 |
:1008A0004E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E68 |
:1008B0004E4E4E4F4F4F4F4F4F4F4F4F4F4F4F4F4B |
:1008C0004F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F38 |
:1008D0004F4F0A0D506C6561736520636F6E6E65D6 |
:1008E0006374205370656B7472756D2072656365F7 |
:1008F0006976657220666F722062696E64696E67E0 |
:10090000204E4F572E2E2E006F6B2E0A0D0054696D |
:100910006D656F75742E0A0D000011241FBECFEF98 |
:10092000D0E1DEBFCDBF13E0A0E0B1E0E2E2F3ED45 |
:1009300002C005900D92A03DB107D9F719E0A0EDD6 |
:10094000B3E001C01D92AB3CB107E1F70C945D052B |
:100950000C940000982F8150853008F093E0FB0143 |
:10096000A42FBB27892F99270197A89F9001A99FA2 |
:10097000300DB89F300D1124D901AC59BF4F842FD1 |
:100980009927019724F00E9473690192FACF0E947F |
:10099000D6640895582F9B01863008F055E0552302 |
:1009A00089F1A42FBB27852F99270197A89FB00114 |
:1009B000A99F700DB89F700D1124DB01AC59BF4F7A |
:1009C000842F9927F901019724F001900E948069F2 |
:1009D000FACFA2E6B0E0042E0E948069F901A0E5FA |
:1009E000B0E088E090E021E08030920719F40E94A6 |
:1009F0008C6903C0182E0E948C69852F0E941505F2 |
:100A00000E94D6640895CF93A2E0B0E00E9473697B |
:100A1000802DC82F8150853020F0C3E08C2F0E949C |
:100A200015058C2F9927CF910895863008F085E021 |
:100A3000882329F0A2E0B0E0082E0E948069089582 |
:100A4000809191089927880F991FFC01E15AF74F6F |
:100A5000808191818D5E9F4F14F0109202018091F0 |
:100A600091089927880F991FFC01E15AF74F80815F |
:100A700091818A5B9F4FCCF4809102018823A9F475 |
:100A800081E08093020180912C078F5F80932C0777 |
:100A9000853038F088EE93E09093F1038093F00373 |
:100AA00004C080912C070E94682D80912C07992703 |
:100AB0009093FA078093F9070895CFEFD0E1DEBF56 |
:100AC000CDBF14B815B8C0E0D0E0219623E0C83EF1 |
:100AD000D207D8F3189B0AC0199B04C08DE08093FD |
:100AE00000010DC08BE08093000109C0199B04C078 |
:100AF00084E18093000103C08AE08093000181E8D3 |
:100B000087B93E9A8FEF88B98BE184B981E085B9C6 |
:100B10008EE38AB9579A87E48BB9469A84B7877F60 |
:100B200084BF8091600088618093600010926000B3 |
:100B300080ED97E09093F1038093F0031092B60458 |
:100B40001092B50410926408109263081092B404D5 |
:100B50001092B3041092B2041092B104809100017B |
:100B6000843168F088E894E0A0E0B0E08093BF03AF |
:100B70009093C003A093C103B093C2030CC08BE059 |
:100B800095E0A0E0B0E08093BF039093C003A093F2 |
:100B9000C103B093C203809100018A3011F0843107 |
:100BA00011F4289801C0289A0E9415160E94E51594 |
:100BB0000E94440F0E94EF280E94061A0E945A27A2 |
:100BC0000E94766178948AEA90E09F938F931F92B7 |
:100BD0000E9449120F900F900F9084E690E09F932F |
:100BE0008F938AE490E09F938F931F921F922AE045 |
:100BF00080910001622F0E940369892F99279F939A |
:100C00008F93809100010E94036999279F938F938E |
:100C100080ED90E09F938F931F920E9449128DB7B1 |
:100C20009EB70D960FB6F8949EBF0FBE8DBF8091F4 |
:100C3000C800803231F48091CA00863011F40E94DD |
:100C40002966809100018C3010F4299A01C02998FE |
:100C500049E061E978E083E00E94AA04A8EEB3E0ED |
:100C60000E947369802D813089F5A1E0B0E00E9477 |
:100C70007369802D8F3F51F11092C303E1E8F5E0D5 |
:100C8000A8EEB3E08DE490E021E08030920719F403 |
:100C90000E947B6903C0182E0E947B6930E041E806 |
:100CA00055E02091C303832F9927880F991F880F40 |
:100CB000991FFC01E40FF51F858518160CF42F5FB2 |
:100CC0003F5F303180F32093C3035CC084E091E048 |
:100CD0009F938F931F920E94491220E00F900F90D4 |
:100CE0000F9041E855E0822F9927880F991F880FB0 |
:100CF000991FFC01E40FF51F158616861786108ACA |
:100D00002F5F203180F380E480938E0580938F05E0 |
:100D100010929005809391058093920590EC9093AA |
:100D200093051092940580939505809396051092F3 |
:100D30009705909398059093990580939A05109242 |
:100D40009B0580939C0590939D0521E835E081E00B |
:100D500080938105D90111968BE0E3E0F1E00190E9 |
:100D60000D928A95E1F7F901A8EEB3E08DE490E0E9 |
:100D700021E08030920719F40E948C6903C0182E7C |
:100D80000E948C698091C30399279F938F9382E877 |
:100D900095E09F938F9385E291E09F938F931F92AD |
:100DA0000E9449128DB79EB707960FB6F8949EBF62 |
:100DB0000FBE8DBF86E491E09F938F931F920E9498 |
:100DC0004912109241041092ED030E94993C0F9039 |
:100DD0000F900F908091ED038823E1F3109241046E |
:100DE00000E010E00F2EF8E5EF2EF1E0FF2EF02DE1 |
:100DF0001092ED030E94993C8091ED038823E1F36A |
:100E0000F801ED5AF74F8081882371F0C8010196EF |
:100E10009F938F93FF92EF921F920E9449120F901F |
:100E20000F900F900F900F900F5F1F4F0C30110518 |
:100E3000F8F200E010E00F2EFCE5EF2EF1E0FF2EBF |
:100E4000F02DF801ED5AF74F20812223C9F4C80193 |
:100E5000880F991F880F991FFC01EF57FA4F85855E |
:100E6000181674F4C80101969F938F93FF92EF9226 |
:100E70002F930E9449120F900F900F900F900F9098 |
:100E8000F801E95CF74F10820F5F1F4F0C3011051E |
:100E9000C0F28AE791E09F938F931F920E944912BC |
:100EA0000F900F900F90A1E0B0E00E947369802D29 |
:100EB0008B3409F4A4C00E94112A80EA91E09F9328 |
:100EC0008F931F920E94491211E00F900F900F9084 |
:100ED000123011F40E94C12A133011F40E94732BB6 |
:100EE000143010F00E94C12A80910001843168F012 |
:100EF00085E08093A9081092C1088BE18093A50832 |
:100F00008EE48093BE088093BF08A0E5B0E00E9405 |
:100F10007369802D8C3008F05DC0A1E5B0E00E94BF |
:100F20007369802D8C3008F055C0A2E5B0E00E94B6 |
:100F30007369802D8C3008F04DC0A3E5B0E00E94AD |
:100F40007369802D8C3008F045C0A0E5B0E00E94A8 |
:100F50007369802D80939108A1E5B0E00E947369C8 |
:100F6000802D80939208A2E5B0E00E947369802DE5 |
:100F700080939308A3E5B0E00E947369802D80936D |
:100F80009408A4E5B0E00E947369802D80939508D1 |
:100F9000A5E5B0E00E947369802D80939608A6E5D0 |
:100FA000B0E00E947369802D80939708A7E5B0E0B8 |
:100FB0000E947369802D80939808113069F48FEA3C |
:100FC00091E09F938F931F920E9449120F900F9070 |
:100FD0000F9002C00E94F8294DE561E978E0812F69 |
:100FE0000E94CA041F5F163008F472CF83E00E948B |
:100FF0001505A1E0B0E08BE4082E0E948069A4E012 |
:10100000B0E00E947369802D853050F087EE91E04A |
:101010009F938F931F920E9449120F900F900F90F1 |
:101020000E9403054DE561E978E00E94AA040E9450 |
:10103000030599279F938F938EEF91E09F938F9352 |
:101040001F920E944912809199080F900F900F9063 |
:101050000F900F9080FF20C086E192E09F938F93C6 |
:101060001F920E94491288EE93E00E94AB15EC019A |
:101070000E940C1A0F900F900F90CE010E94B31592 |
:101080008823D9F386E392E09F938F931F920E9467 |
:1010900049120F900F900F900E94832D80910001B4 |
:1010A0008A3011F0843111F4289801C0289A80ED1B |
:1010B00097E09093F1038093F00385E580932E07EA |
:1010C0008BE392E09F938F931F920E94491280912D |
:1010D00099080F900F900F9082FF0BC087E492E069 |
:1010E0009F938F931F920E9449120F900F900F9021 |
:1010F0000AC083E592E09F938F931F920E9449124A |
:101100000F900F900F9085E692E09F938F931F9220 |
:101110000E9449120E94881E88E893E190939E03E2 |
:1011200080939D0381E080932D070F900F900F9087 |
:101130008091ED03882309F4CBC080912703882395 |
:1011400009F4C6C01092ED0380912C07882319F092 |
:101150000E94200502C00E949B410E94993C809100 |
:1011600000018A3011F0843111F4289801C0289AC6 |
:1011700080910D01882321F0815080930D010EC0D4 |
:10118000109238071092DD041092DC041092DF04F4 |
:101190001092DE041092E1041092E0048091B004F9 |
:1011A000882329F08091B00481508093B00480910D |
:1011B0006C05882369F0815080936C05882341F485 |
:1011C000109255051092540510925705109256052D |
:1011D00080919D0390919E03019790939E0380932D |
:1011E0009D0380919D0390919E03892B21F0809116 |
:1011F0004204882331F180919D0390919E03892BB5 |
:1012000041F40E94682785E090E090939E038093CC |
:101210009D0380911103909112038F5F9F4FD1F432 |
:101220008091B9048823B1F080E197E29093F103B3 |
:101230008093F00380E890E0909312038093110371 |
:1012400009C0809100018A3011F0843111F428988E |
:1012500001C0289A8091ED03882321F08091B90480 |
:10126000882329F40E94800F0E944C0C02C00E9427 |
:101270004C0CCE010E94B315882341F18091AA083D |
:10128000282F332780911803909119038217930711 |
:101290009CF480911103909112038F5F9F4F61F432 |
:1012A00080E797E19093F1038093F00380E093E06F |
:1012B00090931203809311030E94A26184E08093B3 |
:1012C000F20384E190E00E94AB15EC010E94E5641A |
:1012D0008091F203882309F02BCF0E94E46128CF8C |
:1012E0001F920F920FB60F9211248F939F93EF933B |
:1012F000FF9380910B018823E1F48091E3039091A7 |
:10130000E40301969093E4038093E303FC01E2522B |
:10131000FA4FE081ED3019F08639910539F41092D9 |
:10132000E4031092E30381E080930B01E093C60095 |
:1013300004C01092E4031092E303FF91EF919F9198 |
:101340008F910F900FBE0F901F9018951F920F92C4 |
:101350000FB60F9211242F933F934F935F938F9368 |
:101360009F93AF93BF93EF93FF9390E08091C6005C |
:101370008093D7038091E903863910F09093EA03B4 |
:101380008091D7038D3009F06EC08091EA038230DE |
:1013900009F069C01092EA032091E9038BE397E01A |
:1013A000AC01420F511DFA01329720818091E50373 |
:1013B0009091E603821B91099C01DA0111978C91AF |
:1013C000281B3109C9019F709093E6038093E503C0 |
:1013D0000024880F991F001C880F991F001C892F5B |
:1013E000902D482F435C4093E703C9018F739070A1 |
:1013F000982F935C9093E8038081841729F48C9153 |
:10140000891711F491E006C090E08091DA038F5FB4 |
:101410008093DA038091D803882309F08EC0992342 |
:1014200009F48BC081E08093D8032091E903822FD7 |
:101430008F5F8093DB038BE397E0FC01E20FF11DEC |
:101440008DE0808380913D07823509F076C088E188 |
:1014500090E02CE00FB6F894A895809360000FBE42 |
:10146000209360006AC08091EA039927813091053A |
:1014700019F1823091051CF4892B21F05CC0029790 |
:10148000D1F159C08091D703833239F48091D803C8 |
:10149000882319F481E08093EA038091D703809335 |
:1014A0003B0781E08093E9038091D70399279093CC |
:1014B000E6038093E50341C08091EA038F5F809348 |
:1014C000EA032091E9038BE397E0FC01E20FF11DB1 |
:1014D0008091D70380832F5F2093E9032091D70366 |
:1014E0008091E5039091E603820F911D9093E603AE |
:1014F0008093E50322C02091E9038BE397E0FC0190 |
:10150000E20FF11D8091D7038083263928F4822FC2 |
:101510008F5F8093E90302C01092EA038091D703A2 |
:101520002091E5033091E603280F311D3093E60347 |
:101530002093E50302C01092EA03FF91EF91BF915F |
:10154000AF919F918F915F914F913F912F910F900C |
:101550000FBE0F901F9018959C0140E050E0BA011B |
:101560004817590768F4AEEDB5E0FA01EA0FFB1F22 |
:101570008081680F711D4F5F5F4F42175307A8F3BB |
:101580007F702EED35E0FA01E20FF31FCB0100244E |
:10159000880F991F001C880F991F001C892F902D00 |
:1015A000835C80834F5F5F4FFA01E20FF31FCB0133 |
:1015B0008F739070835C80834F5F5F4FFA01E20FFF |
:1015C000F31F8DE0808310920B018091DE058093E4 |
:1015D000C60008958F929F92BF92CF92DF92EF92B2 |
:1015E000FF920F931F93CF93DF93CDB7DEB72E8576 |
:1015F0009F85B88860E070E000E06B01DB0183E26A |
:101600008093DE05892F8F598093DF052093E005B5 |
:101610006D5F7F4F0F2EF1E18F2E9924F02D8C0EF0 |
:101620009D1EBB2069F0F401C080D18032968824D1 |
:101630009924689481F88E0E9F1EA081B181BA947E |
:10164000109709F4A3C00F2EFEEDEF2EF5E0FF2E4C |
:10165000F02D1097C1F0F601E00FF11D0F5F9081A2 |
:10166000119791F4BB2081F0F401C080D1803296B3 |
:1016700088249924689481F88E0E9F1EA081B181E0 |
:1016800000E0BA9401C090E01097C1F0F601E00FBD |
:10169000F11D0F5F4081119791F4BB2081F0F4019F |
:1016A000C080D180329688249924689481F88E0E67 |
:1016B0009F1EA081B18100E0BA9401C040E0109764 |
:1016C000C1F0F601E00FF11D0F5F1081119791F449 |
:1016D000BB2081F0F401C080D18032968824992407 |
:1016E000689481F88E0E9F1EA081B18100E0BA94AB |
:1016F00001C010E0FB01EE0DFF1D892F8695869538 |
:10170000835C80836F5F7F4FFB01EE0DFF1D892F90 |
:101710009927837090709C0122953295307F3227F3 |
:10172000207F32275527CA01929582958F7089278D |
:101730009F708927822B835C80836F5F7F4FFB01C3 |
:10174000EE0DFF1DCA018F7090709C01220F331F98 |
:10175000220F331F812F99270024880F991F001C07 |
:10176000880F991F001C892F902D822B835C80830A |
:101770006F5F7F4FFB01EE0DFF1D812F8F73835C29 |
:1017800080836F5F7F4F109709F063CFCB010E947A |
:10179000AC0ADF91CF911F910F91FF90EF90DF90F6 |
:1017A000CF90BF909F908F9008951F93CF93C3E0E9 |
:1017B0007C2F8091DB03682F665009F460C0ABE397 |
:1017C000B7E0FD01E70FF11D8081982F9D537F5FEA |
:1017D000FD01E70FF11D8081382F3D537F5FFD0133 |
:1017E000E70FF11D8081482F4D537F5FFD01E70F0B |
:1017F000F11D8081582F5D537F5F892F9927880FB6 |
:10180000991F880F991F232F22952F70122F182BA5 |
:10181000832F99278F70907082959295907F98274B |
:10182000807F9827242F26952695282B842F99276B |
:101830008370907000249695879507949695879568 |
:101840000794982F802D582B61506F3FC1F0FD01F8 |
:10185000EC0FF11D1083CF5F61506F3F81F0FD01F0 |
:10186000EC0FF11D2083CF5F61506F3F41F0FD0110 |
:10187000EC0FF11D5083CF5F662309F0A2CF8EE3FA |
:1018800097E09093DD038093DC038C2F835080934B |
:10189000DE03CF911F910895EF92FF920F931F9354 |
:1018A000CF93DF93CDB7DEB722970FB6F894DEBFA4 |
:1018B0000FBECDBF8091D803882309F4C6C20E9411 |
:1018C000D50B80913C07823609F0A7C180913D0776 |
:1018D00099278037910509F4C2C08137910584F4B6 |
:1018E0008D36910509F47DC08E36910524F48B3434 |
:1018F0009105B1F092C18E36910509F456C08DC1A3 |
:101900008337910509F40EC1843791052CF4813792 |
:10191000910509F4A8C081C184379105F9F07DC112 |
:10192000E091DC03F091DD032081318130939B0451 |
:1019300020939A0480919C0490919D04281B390B5C |
:10194000C901845E9D4F68E671E00E942369845B53 |
:10195000904090939F0480939E045FC18091DB032D |
:10196000853160F0E091DC03F091DD0380E1A6E1D8 |
:10197000B7E001900D928A95E1F710C0E091DC0389 |
:10198000F091DD0380819181A281B381809316075C |
:1019900090931707A0931807B093190780EF8093CF |
:1019A000E0038FEF80930D0138C180910B018823F4 |
:1019B000E1F38DE490E09F938F9381E895E09F930E |
:1019C0008F9381E08F938F938EE48F930E94EA0A26 |
:1019D0008DB79EB707960FB6F8949EBF0FBE8DBF0A |
:1019E0001CC180910B018823E1F3A091DC03B0912D |
:1019F000DD038C918130D1F421E835E08DE4F901EB |
:101A00000D9001928A95E1F7F901A8EEB3E08DE41B |
:101A100090E021E08030920719F40E948C6903C0A5 |
:101A2000182E0E948C6981E0898301C0198281E0AF |
:101A300090E09F938F93CE0101969F938F9381E0C7 |
:101A40008F938F938DE48F930E94EA0A8DB79EB790 |
:101A500007960FB6F8949EBF0FBE8DBFDEC081E023 |
:101A60008093D503DAC0E091DC03F091DD0380813F |
:101A70008F3F39F40E940305E091DC03F091DD0310 |
:101A80008083E091DC03F091DD038081882319F4E9 |
:101A900081E0808309C0E091DC03F091DD03808167 |
:101AA000863010F085E08083E091DC03F091DD0367 |
:101AB0004DE561E978E080810E94AA0480910B01E4 |
:101AC0008823E1F3E091DC03F091DD0380818983D9 |
:101AD0008BE48A838DE590E09F938F9381E998E072 |
:101AE0009F938F9321E030E03F932F93CE01029696 |
:101AF0009F938F933F932F93CE01820F931F9F93BA |
:101B00008F9383E08F9381E08F9381E58F930E9481 |
:101B1000EA0AADB7BEB71F960FB6F894BEBF0FBEA8 |
:101B2000ADBF7BC02091DC033091DD03F9018081E2 |
:101B30008150853008F055C081818B3409F051C047 |
:101B400061E978E08DE5A9014E5F5F4FDB01FA01A5 |
:101B5000982F01900D929A95E1F7482FD9018C9119 |
:101B60000E94CA048091BE089927AA27BB270F2E7E |
:101B7000F4ECEF2EF9E0FF2EF0E00F2FF0E01F2F36 |
:101B8000F02DBC01CD01A80197010E94E468DC01A1 |
:101B9000CB018093A1039093A203A093A303B093DE |
:101BA000A4038091BF089927AA27BB27BC01CD01B8 |
:101BB0000E94E468DC01CB018093A5039093A60307 |
:101BC000A093A703B093A803E091DC03F091DD0399 |
:101BD00080810E9415050E94030589830E94682D5B |
:101BE00001C0198280910B018823E1F381E090E02C |
:101BF0009F938F93CE0101969F938F9381E08F9354 |
:101C00008F9383E58F930E94EA0AEDB7FEB737966C |
:101C10000FB6F894FEBF0FBEEDBF80913D07992728 |
:101C20008436910509F4CCC085369105ACF4813633 |
:101C3000910509F47DC0823691052CF48B34910511 |
:101C400009F458C0FAC08236910509F481C0833680 |
:101C5000910509F490C0F1C08C36910509F4D8C003 |
:101C60008D3691054CF48736910509F4E3C088362A |
:101C7000910509F4B8C0E1C08437910529F0863791 |
:101C8000910509F4D3C0D9C08091DB03853160F0A0 |
:101C9000E091DC03F091DD0380E1A6E1B7E0019083 |
:101CA0000D928A95E1F710C0E091DC03F091DD031D |
:101CB00080819181A281B381809316079093170749 |
:101CC000A0931807B093190780910B018823E1F3C3 |
:101CD0001F9280910E018F9384E58F930E94EA0AF0 |
:101CE0008AEF8093E0038FEF80930D010F900F90A8 |
:101CF0000F90A3C0E091DC03F091DD0320813181DE |
:101D000030939B0420939A0480919C0490919D04AD |
:101D1000281B390BC901845E9D4F68E671E00E9463 |
:101D20002369845B904090939F0480939E0485C0B8 |
:101D3000E091DC03F091DD03808180930C0180321F |
:101D400018F08FE180930C018FEF80930D0175C027 |
:101D5000A091DC03B091DD038BE0EEE2F7E00D90A3 |
:101D600001928A95E1F780913707809313088FEFEE |
:101D700080930D0162C08091E1039091E203892B71 |
:101D800089F4E091DC03F091DD03E081EE2351F072 |
:101D90008AE0E89FC00111240E94AB159093DD05F5 |
:101DA0008093DC05E091DC03F091DD0390818AE013 |
:101DB000989FC00111249093E2038093E1033DC0FA |
:101DC000E091DC03F091DD0390818AE0989FC001EF |
:101DD00011249093100180930F01892B71F181E000 |
:101DE0008093D3032AC08FEF80930D01E091DC0331 |
:101DF000F091DD03908180913E04892B80933E0415 |
:101E0000882311F01092D60381E08093D20315C08D |
:101E10008FEF80930D01E091DC03F091DD03808171 |
:101E200080933D0481E08093D10307C081E08093DB |
:101E3000D40303C081E08093D0031092D8031092A2 |
:101E4000DD031092DC031092DE0322960FB6F894A5 |
:101E5000DEBF0FBECDBFDF91CF911F910F91FF90DD |
:101E6000EF900895CF93C82F8A3019F48DE00E9427 |
:101E7000320F8091C00085FFFCCFC093C60080E088 |
:101E800090E0CF910895089588E18093C1008091FA |
:101E9000C00082608093C0008091C1008068809300 |
:101EA000C1008091C10080648093C1008AE2809368 |
:101EB000C40080910F01909110010E94AB15909386 |
:101EC0000B0780930A078CED90E00E94AB1590936E |
:101ED0003A078093390710920C078AE480930D0724 |
:101EE00083E0809310078AE080930E0781E080935F |
:101EF0000F071092DD031092DC031092DE030895A9 |
:101F0000EF92FF920F931F9380910B01882309F4A6 |
:101F100060C28091D2038823C1F180910B01882394 |
:101F2000A1F10E94941E84E190E09F938F93909181 |
:101F3000D60384E1989FC00111248E5C9C4F9F932F |
:101F40008F9381E090E09F938F9386ED93E09F9332 |
:101F50008F9382E08F9381E08F9388E48F930E9428 |
:101F6000EA0A8091D6038F5F8093D6032DB73EB7E0 |
:101F7000255F3F4F0FB6F8943EBF0FBE2DBF843094 |
:101F800010F01092D6031092D2038091D1038823CF |
:101F900071F180910B01882351F10E94941E80E51C |
:101FA00090E09F938F9382E393E09F938F9321E040 |
:101FB00030E03F932F9382E893E09F938F933F937A |
:101FC0002F938DE394E09F938F9383E08F9381E031 |
:101FD0008F938CE48F930E94EA0A1092D1038DB7FD |
:101FE0009EB70F960FB6F8949EBF0FBE8DBF80911F |
:101FF000D4038823F1F080910B018823D1F08AE08B |
:1020000090E09F938F938CE097E09F938F9381E074 |
:102010008F938F9386E58F930E94EA0A1092D403E0 |
:102020002DB73EB7295F3F4F0FB6F8943EBF0FBEA6 |
:102030002DBF8091D0038823F9F080910B01882374 |
:10204000D9F08BE090E09F938F938EE297E09F937F |
:102050008F9381E08F9380910E018F9387E48F930C |
:102060000E94EA0A1092D0038DB79EB707960FB66A |
:10207000F8949EBF0FBE8DBF8091390790913A07AB |
:102080000E94B315882309F465C080910B01882351 |
:1020900009F460C08091A5089927880F991F880FBF |
:1020A000991F7C010027F7FC0095102F80915E049A |
:1020B00090915F04A0916004B0916104BC01CD01D6 |
:1020C000A80197010E94586930932707209326079B |
:1020D0008091660490916704A0916804B0916904AE |
:1020E000BC01CD01A80197010E94586930932907CE |
:1020F000209328078091D40480932A078091D504E7 |
:1021000080932B0788E090E09F938F9386E297E07F |
:102110009F938F9381E08F9383E08F9387E78F93D3 |
:102120000E94EA0A2DB73EB7295F3F4F0FB6F894D9 |
:102130003EBF0FBE2DBF80912C07853018F086E082 |
:1021400080932C0783E690E00E94AB1590933A07AA |
:102150008093390780910F0190911001892B41F0F4 |
:1021600080910A0790910B070E94B315882321F4F0 |
:102170008091D303882349F180910B01882329F1B1 |
:1021800082E490E09F938F9381ED97E09F938F93EC |
:1021900081E08F938F9384E48F930E94EA0A1092D8 |
:1021A000D3038DB79EB707960FB6F8949EBF0FBEA8 |
:1021B0008DBF80910F0190911001009731F00E9426 |
:1021C000AB1590930B0780930A078091E1039091E0 |
:1021D000E203892B09F48AC08091DC059091DD052A |
:1021E0000E94B315882309F481C080910B018823D4 |
:1021F00009F47CC08091A5089927880F991F880F42 |
:10220000991F7C010027F7FC0095102F80915E0438 |
:1022100090915F04A0916004B0916104BC01CD0174 |
:10222000A80197010E9458693093CF052093CE05ED |
:102230008091660490916704A0916804B09169044C |
:10224000BC01CD01A80197010E9458693093D105C6 |
:102250002093D00520915C0930915D0940915E0981 |
:1022600050915F09DA01C901689412F8880F991F2B |
:10227000AA1FBB1F1694D1F7820F931FA41FB51F6F |
:10228000820F931FA41FB51F2091BF033091C0037D |
:102290004091C1035091C203BC01CD010E94586915 |
:1022A0003093D3052093D2058EE090E09F938F93D7 |
:1022B0008EEC95E09F938F9381E08F938F9383E4CF |
:1022C0008F930E94EA0A8091E1039091E2030E94B9 |
:1022D000AB159093DD058093DC052DB73EB7295FE4 |
:1022E0003F4F0FB6F8943EBF0FBE2DBF80910C013B |
:1022F0008F3F61F180E190E09F938F9380910C017B |
:10230000992782959295907F9827807F98278F5E56 |
:102310009E4F9F938F9381E090E09F938F938CE0EB |
:1023200091E09F938F9382E08F9381E08F9381E47C |
:102330008F930E94EA0A8FEF80930C018DB79EB7AE |
:102340000B960FB6F8949EBF0FBE8DBF80911308F9 |
:102350008823F1F080910B018823D1F081E090E097 |
:102360009F938F9383E198E09F938F9381E08F9366 |
:102370008F9382E48F930E94EA0A109213082DB77C |
:102380003EB7295F3F4F0FB6F8943EBF0FBE2DBF3B |
:102390008091D5038823E9F080910B018823C9F04F |
:1023A00086E190E09F938F938FE598E09F938F93C2 |
:1023B00081E08F938F9380E58F930E94EA0A1092B9 |
:1023C000D5038DB79EB707960FB6F8949EBF0FBE84 |
:1023D0008DBF1F910F91FF90EF900895982F8091DE |
:1023E0001408813071F480913C0422E333E0F90158 |
:1023F000E80FF11D90838F5F80933C0421E030E073 |
:1024000005C0892F0E94320F282F3327C901089554 |
:102410000F931F93CF93DF938C01EB01672B39F060 |
:10242000F80181918F010E94EE112197C9F7DF9188 |
:10243000CF911F910F9108950F931F93CF93DF9327 |
:102440008C01EB01672B41F0F8010F5F1F4F849166 |
:102450000E94EE112197C1F7DF91CF911F910F914B |
:102460000895CF93C82F181634F480E20E94EE111D |
:10247000C1501C16D4F3CF910895CF93C82F1816CE |
:1024800034F480E30E94EE11C1501C16D4F3CF91B6 |
:1024900008952F923F924F925F926F927F928F9208 |
:1024A0009F92AF92BF92CF92DF92EF92FF920F93E3 |
:1024B0001F93CF93DF93CDB7DEB7AF970FB6F894E6 |
:1024C000DEBF0FBECDBF25962FAD259727968EADCB |
:1024D0009FAD2797882499245401209314080F2E28 |
:1024E000F7E4CF2EDD24F02DCC0EDD1E7C01C701DC |
:1024F000F7011491112359F0153249F00894E11CA9 |
:10250000F11CF7011491112311F01532B9F7B7013D |
:10251000681B790B11F00E941C12112309F425C2CB |
:102520000894E11CF11C00E00EA70CA777247A9414 |
:1025300009A7F7010894E11CF11C1491153721F04B |
:10254000812F80628837D1F400FF0CC0F601CC24C3 |
:10255000DD246894C2F8CE0EDF1E80809180A280B8 |
:10256000B3800CC0F601CC24DD246894C1F8CE0EF3 |
:10257000DF1E808191814C01AA24BB24103229F4F2 |
:1025800089A58823B1F619A7D4CF133211F40860B6 |
:10259000D0CF1A3211F01D3299F41A3271F4F601CB |
:1025A000CC24DD246894C1F8CE0EDF1EE081ECA7B8 |
:1025B000EE230CF0BECFE195ECA700610F7DB9CF03 |
:1025C0001B3211F419A7B5CF1E3209F03FC0F70135 |
:1025D0000894E11CF11C14911A3289F4F601CC2400 |
:1025E000DD246894C1F8CE0EDF1E60817181CB01BD |
:1025F0006F5F7F4F14F48FEF9FEF782E9ACF60E0DC |
:1026000070E0812F80538A30C8F4CB01880F991F66 |
:10261000880F991F880F991F860F971F860F971F86 |
:10262000810F911DBC0160537040F7010894E11CBB |
:10263000F11C1491812F80538A3038F3CB016F5FE6 |
:102640007F4F14F48FEF9FEF782E78CF103321F463 |
:1026500004FD6FCF00626DCF812F81538930E8F484 |
:1026600060E070E0CB01880F991F880F991F880FD9 |
:10267000991F860F971F860F971F810F911DBC0111 |
:1026800060537040F7010894E11CF11C1491812FF4 |
:1026900080538A3038F36CA751CF183611F4046098 |
:1026A00048CF1C3611F4016044CF133689F41E0163 |
:1026B0000894211C311CF601CC24DD246894C1F857 |
:1026C000CE0EDF1E808189836624639419A602C121 |
:1026D000143421F0143611F0193671F5143409F45C |
:1026E000016000FF0CC0F601CC24DD246894C2F820 |
:1026F000CE0EDF1E80809180A280B3800EC0F601D6 |
:10270000CC24DD246894C1F8CE0EDF1E8081918137 |
:102710004C01AA2497FCA094BA2CBB2054F4B0948A |
:10272000A09490948094811C911CA11CB11C8DE2FA |
:1027300089A78AE08DA775C01F3411F01F3631F4C8 |
:102740001F3409F40160E8E0EDA76AC0103789F48E |
:10275000F601CC24DD246894C1F8CE0EDF1E808102 |
:1027600091814C01AA24BB24F0E1FDA7006418E785 |
:1027700057C01337E1F5F601CC24DD246894C1F885 |
:10278000CE0EDF1E208031802114310489F41E0119 |
:102790000894211C311C88E289838EE6F101818333 |
:1027A00085E78B838CE68C838D8389E28E831F8201 |
:1027B0007720A4F0872D992787FD9095AC0160E0E4 |
:1027C00070E0C1010E941F68009731F0682E621806 |
:1027D00076145CF4672C09C0672C07C0F1010190E6 |
:1027E0000020E9F731976E2E621819A673C01535CF |
:1027F00011F0153731F4153509F40160FAE0FDA741 |
:102800000FC0183519F0183709F059C020E12DA76D |
:1028100003FF06C081149104A104B10409F000640F |
:1028200019A67EA677200CF00F7D0F2EF9E22F2E31 |
:102830003324F02D2C0E3D1E81149104A104B1040B |
:1028400011F47720B9F18DA5482E552466247724FC |
:102850001FA684149504A604B70410F0E1E0EFA7C6 |
:10286000C501B401A30192010E943669DC01CB01CC |
:102870008A3010F4805D04C0895A183509F48F7DC0 |
:10288000F10182931F01C501B401A30192010E94CD |
:10289000366949015A01FFA5FF23D1F62DA528303D |
:1028A00049F403FF07C0F1018081803319F080E310 |
:1028B00082931F016C2E6218F9E26F0E0BC0112378 |
:1028C00009F453C01E010894211C311C198366248D |
:1028D000639419A6762C5EA456180AF4552489A58B |
:1028E000882311F0739404C006FF02C022E0720E28 |
:1028F000750C802F992780739070892B21F48CA5FB |
:1029000087190E94311289A5882339F061E070E0AF |
:10291000CE0189960E9408120CC006FF0AC080E30F |
:102920008AA7FE01BA96118362E070E0CF010E948F |
:102930000812802F992780739070809721F48CA5BE |
:1029400087190E943D12852D0E943D12862D9927E0 |
:1029500087FD9095BC01C1010E94081204FFC7CDFC |
:102960008CA587190E943112C2CDAF960FB6F8948C |
:10297000DEBF0FBECDBFDF91CF911F910F91FF90B2 |
:10298000EF90DF90CF90BF90AF909F908F907F900F |
:102990006F905F904F903F902F9008951F920F92ED |
:1029A0000FB60F9211242F933F935F936F937F93F2 |
:1029B0008F939F93AF93BF938091F203882329F065 |
:1029C0008091F20381508093F20380917A008064B9 |
:1029D00080937A008091FA0381508093FA038F3FAD |
:1029E000B9F489E08093FA03809113038F5F8170BB |
:1029F00080931303882319F481E08093ED03809181 |
:102A0000EB039091EC0301969093EC038093EB031E |
:102A10008091F0039091F1030297C8F08091F00348 |
:102A20009091F10301979093F1038093F00320912B |
:102A3000F0033091F10380911103909112038223EE |
:102A40009323892B11F021E009C020E007C020E08A |
:102A50008FEF9FEF9093120380931103222341F095 |
:102A6000809100018A3011F45A9A09C0479A07C030 |
:102A7000809100018A3011F45A9801C047988091E2 |
:102A8000990883FF5AC0349B0AC08091EE0390914D |
:102A9000EF0301969093EF038093EE034EC0809175 |
:102AA000EE039091EF03892B69F18091EE039091F1 |
:102AB000EF038A56914030F58091EE039091EF0339 |
:102AC00069E270E00E940F698091EE039091EF033C |
:102AD000860F971F9093EF038093EE038091EE0390 |
:102AE0009091EF030B9750F08091EE039091EF03DC |
:102AF0000A9790939B0480939A0404C010929B04BD |
:102B000010929A0420919A0430919B0480919C0425 |
:102B100090919D04281B390BC901845E9D4F68E686 |
:102B200071E00E942369845B904090939F0480939E |
:102B30009E041092EF031092EE03BF91AF919F910C |
:102B40008F917F916F915F913F912F910F900FBE69 |
:102B50000F901F9018952091EB033091EC03820F9A |
:102B6000931F019608952091EB033091EC03821B93 |
:102B7000930B892F99278695807490700895CF9331 |
:102B8000DF930E94AB15EC01CE010E94B3158823A0 |
:102B9000D9F3DF91CF9108951F93CF93DF930E94D4 |
:102BA000AB15EC011FEC08C080912703882321F0AE |
:102BB0001092270310937A00CE010E94B315882348 |
:102BC00099F3DF91CF911F9108959FB7F894579A89 |
:102BD0005F983E9A469A8091B0008F708093B000C3 |
:102BE0008091B00083608093B0008091B1008B73BE |
:102BF0008093B1008091B1008B608093B1001092FE |
:102C0000B2008FEF8093B3008091B0008068809312 |
:102C1000B000809170008A7F809370008091700076 |
:102C20008260809370009FBF08958AE090E00E94C8 |
:102C3000AB15909302048093010482E085BD83EA82 |
:102C400084BD17BC88E788BD86E086BD80916E0094 |
:102C5000816080936E0008951F920F920FB60F92BD |
:102C600011242F933F934F935F936F937F938F9391 |
:102C70009F93AF93BF93EF93FF93809100018431B3 |
:102C800008F03FC18091FB03882309F06AC380915B |
:102C9000B00086FF15C18091B0008F7B8093B0009B |
:102CA00089EA93E09093FD038093FC0380911403E1 |
:102CB000909115039C01220F331F280F391F80911B |
:102CC000B7039927880F991F880F991F280F391F5D |
:102CD000332314F42D5F3F4FC90195958795959542 |
:102CE000879590931503809314039093F703809333 |
:102CF000F6038091DD0880FF39C08091B408682F09 |
:102D000077278827992720915E0430915F044091AE |
:102D1000600450916104552324F421583F4F4F4FD4 |
:102D20005F4F689416F855954795379527951694F3 |
:102D3000D1F70E94E468992324F4615C7F4F8F4FA0 |
:102D40009F4FDC01CB01689415F8B595A795979531 |
:102D500087951694D1F72091F6033091F703820FEF |
:102D6000931F9093F7038093F60338C08091B408C3 |
:102D7000682F77278827992720915E0430915F0478 |
:102D80004091600450916104552324F421583F4F31 |
:102D90004F4F5F4F689416F855954795379527958F |
:102DA0001694D1F70E94E468992324F4615C7F4F64 |
:102DB0008F4F9F4FDC01CB01689415F8B595A7950F |
:102DC000979587951694D1F72091F6033091F703E4 |
:102DD000281B390B3093F7032093F6038091B50835 |
:102DE00099279C01220F331F220F331F8091F60376 |
:102DF0009091F703821793072CF43093F7032093F5 |
:102E0000F60313C08091B60899279C01220F331F47 |
:102E1000220F331F8091F6039091F703281739078B |
:102E200024F43093F7032093F6032091F6033091B6 |
:102E3000F7038091FC039091FD03820F931F805054 |
:102E400092409093FD038093FC038091F603909150 |
:102E5000F70399230CF40396959587959595879597 |
:102E60009093F7038093F6038091F6039091F70314 |
:102E70009093FC078093FB078091FC039091FD03E6 |
:102E80008D5D954038F08CED95E09093FD03809337 |
:102E9000FC030DC08091FC039091FD038757914086 |
:102EA00030F487E791E09093FD038093FC038091D9 |
:102EB000FC039091FD039093FF038093FE031DC0DC |
:102EC0008091B00080648093B0008091B708282F73 |
:102ED00033278DED96E0289FA001299F500D389F44 |
:102EE000500D11249A018091FE039091FF03281B3D |
:102EF000390B3093FD032093FC0381E08093FB03A7 |
:102F000030C28091FB03882309F02BC28091B0006E |
:102F100086FFFAC18091B0008F7B8093B0008091D2 |
:102F200000048823F1F48091B708282F33278DED12 |
:102F300096E0289FA001299F500D389F500D112425 |
:102F40009A018091FE039091FF03281B390B309367 |
:102F5000FD032093FC031092FF031092FE03469A98 |
:102F6000FDC189EA93E09093FD038093FC03809177 |
:102F7000000499278130910521F0029709F4E8C0F7 |
:102F80007BC180911403909115039C01220F331F84 |
:102F9000280F391F8091B7039927880F991F880F31 |
:102FA000991F280F391F332314F42D5F3F4FC90198 |
:102FB0009595879595958795909315038093140320 |
:102FC0009093F7038093F6038091DD0880FF39C06A |
:102FD0008091B408682F77278827992720915E046D |
:102FE00030915F044091600450916104552324F4B2 |
:102FF00021583F4F4F4F5F4F689416F855954795AE |
:10300000379527951694D1F70E94E468992324F404 |
:10301000615C7F4F8F4F9F4FDC01CB01689415F8A7 |
:10302000B595A795979587951694D1F72091F603B6 |
:103030003091F703820F931F9093F7038093F60369 |
:1030400038C08091B408682F772788279927209166 |
:103050005E0430915F0440916004509161045523F7 |
:1030600024F421583F4F4F4F5F4F689416F8559501 |
:103070004795379527951694D1F70E94E4689923D0 |
:1030800024F4615C7F4F8F4F9F4FDC01CB0168942C |
:1030900015F8B595A795979587951694D1F7209132 |
:1030A000F6033091F703281B390B3093F703209375 |
:1030B000F6038091B50899279C01220F331F220F38 |
:1030C000331F8091F6039091F703821793072CF436 |
:1030D0003093F7032093F60313C08091B608992725 |
:1030E0009C01220F331F220F331F8091F603909112 |
:1030F000F7032817390724F43093F7032093F603D6 |
:103100002091F6033091F7038091FC039091FD0329 |
:10311000820F931F805092409093FD038093FC0395 |
:103120008091F6039091F70399230CF403969595FB |
:103130008795959587959093F7038093F6038091F3 |
:10314000F6039091F7039093FC078093FB07ABC0C5 |
:103150002091160330911703C901880F991F820F20 |
:10316000931F805C9E4F0AF40396959587959595DD |
:10317000879590931703809316039093F903809398 |
:10318000F8038091660490916704A0916804B0915F |
:103190006904BB2324F481589F4FAF4FBF4F6894FD |
:1031A00016F8B595A795979587951694D1F7BC0114 |
:1031B000CD0128EC30E040E050E00E94E468992323 |
:1031C00024F461507F4F8F4F9F4FBB2797FDBA95D7 |
:1031D000A92F982F872F2091F8033091F903820FA0 |
:1031E000931F9093F9038093F8038091B508992772 |
:1031F0009C01220F331F220F331F8091F8039091FF |
:10320000F903821793072CF43093F9032093F80302 |
:1032100013C08091B60899279C01220F331F220FFB |
:10322000331F8091F8039091F9032817390724F48C |
:103230003093F9032093F8032091F8033091F903B8 |
:103240008091FC039091FD03820F931F8050924068 |
:103250009093FD038093FC038091F8039091F90310 |
:1032600099230CF40396959587959595879590935A |
:10327000F9038093F80317C0809100049927880F01 |
:10328000991FFC01E15AF74F808191819C01280F21 |
:10329000391F8091FC039091FD03820F931F90933F |
:1032A000FD038093FC038091FC039091FD038D5DF1 |
:1032B000954038F08CED95E09093FD038093FC03EE |
:1032C0000DC08091FC039091FD038757914030F42D |
:1032D00087E791E09093FD038093FC038091FC03CA |
:1032E0009091FD039C012C5B30403093FD032093B3 |
:1032F000FC038091FE039091FF03820F931F909334 |
:10330000FF038093FE032AC08091B0008064809305 |
:10331000B0002CEB30E03093FD032093FC03809150 |
:10332000FE039091FF03820F931F9093FF038093FE |
:10333000FE038091F303882329F08091B004853B3C |
:1033400008F0469880910004982F9F5F90930004A6 |
:103350008091B708891710F41092000481E08093DF |
:10336000FB032091FC033091FD0341E02F3734072C |
:1033700058F08FEF8093B300C9018F5F9040909316 |
:10338000FD038093FC0331C02091FC033091FD03C9 |
:103390002F3F310501F1F8F0C9018F5F90408F3761 |
:1033A000910558F480E88093B300C901805890409B |
:1033B0009093FD038093FC0318C08FEF8093B300BC |
:1033C0008091FC039091FD038F5F90409093FD03EB |
:1033D0008093FC030AC08091FC038093B300109299 |
:1033E000FD031092FC031092FB03FF91EF91BF913C |
:1033F000AF919F918F917F916F915F914F913F918D |
:103400002F910F900FBE0F901F90189510927C0077 |
:103410008FEC80937A0008950F931F93CF93DF93DF |
:10342000A3E0B0E00E947369802DC82FDD27C5316D |
:10343000D10508F02A97C7BD1092160484E690E0E3 |
:103440000E94CC15809122039091230382559340D2 |
:1034500010F4C0E0D0E0CA3FD105D0F40DE812E08E |
:10346000C7BD82E390E00E94CC151F930F931F927B |
:103470000E9449120F900F900F908091220390911B |
:1034800023038255934020F02196CA3FD10540F393 |
:10349000A3E0B0E00C2E0E948069C09322088CE269 |
:1034A00091E00E94CC15DF91CF911F910F9108956B |
:1034B000DF92EF92FF920F931F93CF93DF93FF243E |
:1034C000F0921B04F0921C04F0921D0480ED97E032 |
:1034D0000E94AB15EC011CE801E00F2EFAE0EF2E84 |
:1034E000F02D0F2EF5EFDF2EF02D23E0F21619F45C |
:1034F0001B3008F019E0FF248091090490910A0420 |
:103500008C5F934034F48091240381508093240392 |
:103510000EC08091090490910A048750944034F0C1 |
:10352000809124038F5F8093240301C0F3948091E2 |
:103530000B0490910C048C5F934034F4809125032C |
:103540008150809325030EC080910B0490910C0450 |
:103550008750944034F0809125038F5F809325033A |
:1035600001C0F39480910D0490910E048C5F934000 |
:1035700034F48091260381508093260319C08091F2 |
:103580000D0490910E04875094408CF08091260396 |
:103590008F5F809326030CC08FE892E09F938F93F8 |
:1035A0001F920E9449120F900F900F9044C0F39405 |
:1035B00088E080933F040E946027809124038A3032 |
:1035C00020F400931B04E092240380912403863F9F |
:1035D00020F000931B04D0922403809125038A30AD |
:1035E00020F400931C04E092250380912503863F7C |
:1035F00020F000931C04D0922503809126038A308A |
:1036000020F400931D04E092260380912603863F58 |
:1036100020F000931D04D092260380913F0488235C |
:1036200051F0CE010E94B315882309F0B5CF8091E7 |
:103630003F048823B1F710921D088FEC80937A0025 |
:1036400080911D088823E1F31A3020F48AE090E08D |
:103650000E94CC15115009F048CF86E490E00E94FA |
:10366000CC15DF91CF911F910F91FF90EF90DF90DC |
:1036700008951F920F920FB60F921124EF92FF92AE |
:103680000F931F932F933F934F935F936F937F936A |
:103690008F939F93AF93BF93EF93FF9380911F04FA |
:1036A000282F33278F5F80931F042730310509F4BB |
:1036B000C4C028303105D4F42330310509F45AC090 |
:1036C0002430310554F421303105E9F1223031053F |
:1036D0000CF044C0232B59F1FDC22530310509F40B |
:1036E00072C0263031050CF080C05BC02B30310534 |
:1036F00009F42DC12C3031054CF42930310509F481 |
:10370000D6C02A3031050CF0E3C0BFC02D303105E2 |
:1037100009F433C22D3031050CF4C9C12E30310506 |
:1037200009F491C22F30310509F4ADC2D3C28091A2 |
:10373000780090917900909325048093240481E08F |
:1037400080931E04CCC28091780090917900909370 |
:1037500023048093220410921E04C1C28091780039 |
:1037600090917900909321048093200483E08093CA |
:103770001E04B5C22091780030917900809125080F |
:1037800090912608820F931F909326088093250816 |
:1037900080911D088F5F80931D0882E080931E0436 |
:1037A0009EC22091780030917900809124049091FC |
:1037B0002504820F931F909325048093240481E0B5 |
:1037C00080931E048CC22091780030917900809102 |
:1037D000220490912304820F931F909323048093DB |
:1037E000220486E080931E047AC220915404309112 |
:1037F00055048091780090917900281B390B309303 |
:10380000160820931508209115083091160880910C |
:10381000360490913704820F931F90931004809385 |
:103820000F048091150890911608909337048093A7 |
:10383000360487E080931E0452C2209178003091B4 |
:1038400079008091520490915304281B390B3093D6 |
:103850002108209320082091200830912108809190 |
:10386000380490913904820F931F9093120480932F |
:10387000110480912008909121089093390480933D |
:10388000380482E080931E042AC22091780030918F |
:1038900079008091240490912504820F931F9093C6 |
:1038A00025048093240481E080931E0418C2809133 |
:1038B0007800909179002091220430912304820FA6 |
:1038C000931F909323048093220410921E0407C236 |
:1038D000809100018A3091F4209178003091790034 |
:1038E0008091200490912104820F931F0196969558 |
:1038F000879590930E0480930D0425C0809100015C |
:10390000843199F4209178003091790080912004DD |
:1039100090912104280F391F8FEF97E0821B930BA2 |
:1039200090930E0480930D040EC0809178009091C6 |
:1039300079002091200430912104820F931F9093ED |
:103940000E0480930D0483E080931E04C8C120916F |
:103950007800309179008091250890912608820F97 |
:10396000931F90932608809325088091780090916A |
:103970007900909323038093220380911D088F5F29 |
:1039800080931D0880911D08853008F48CC08091BB |
:103990001604992787FD9095A92FB92FBC01CD0159 |
:1039A00028E33AE040E050E00E94E468DC01CB010B |
:1039B0002091250830912608281B390B30932608C2 |
:1039C00020932508809125089091260899230CF4CE |
:1039D00001969595879590932608809325081092D7 |
:1039E0001D0880912508909126087C010027F7FC8E |
:1039F0000095102F20911E0330911F03409120034A |
:103A000050912103DA01C901689412F8880F991FB7 |
:103A1000AA1FBB1F1694D1F7821B930BA40BB50BE7 |
:103A2000A8019701280F391F4A1F5B1FDA01C9013E |
:103A30000496A11DB11DBB232CF4DA01C9010B961C |
:103A4000A11DB11D689412F8B595A7959795879516 |
:103A50001694D1F780931E0390931F03A093200325 |
:103A6000B09321038091190890911A089C01442772 |
:103A700037FD4095542F80911E0390911F03A09114 |
:103A80002003B0912103281B390B4A0B5B0B2093B9 |
:103A9000BA043093BB044093BC045093BD0410920D |
:103AA00026081092250882E080931E0418C1809198 |
:103AB0007800909179002091240430912504280FFA |
:103AC000391F3093250420932404809100018A300B |
:103AD00051F4C90133230CF4019695958795909381 |
:103AE0002504809324048091240490912504992333 |
:103AF0000CF401969595879590930A048093090498 |
:103B00008091340490913504E0913204F0913304B3 |
:103B10008E0F9F1F4091300450913104840F951FE8 |
:103B20002091240430912504BC01620F731F70930F |
:103B3000270460932604F0933504E09334045093F3 |
:103B40003304409332043093310420933004809145 |
:103B5000480490914904681B790B70931B03609390 |
:103B60001A0380911A0390911B039093040480938D |
:103B7000030481E080931E04B2C08091780090918C |
:103B800079002091220430912304280F391F3093AB |
:103B9000230420932204809100018A3051F4C9014A |
:103BA00033230CF401969595879590932304809385 |
:103BB0002204809122049091230499230CF401960D |
:103BC0009595879590930C0480930B0480912E0417 |
:103BD00090912F04E0912C04F0912D048E0F9F1FE3 |
:103BE00040912A0450912B04840F951F20912204A8 |
:103BF00030912304BC01620F731F709329046093FA |
:103C00002804F0932F04E0932E0450932D04409346 |
:103C10002C0430932B0420932A0480914A04909121 |
:103C20004B04681B790B70931D0360931C038091F8 |
:103C30001C0390911D03909306048093050484E077 |
:103C400080931E044CC080911803909119039C012D |
:103C5000220F331F280F391F80917800909179002F |
:103C600063E070E00E940F69CB01820F931F96956D |
:103C7000879596958795909319038093180385E00F |
:103C800080931E042CC0209178003091790080919F |
:103C9000170890911808820F931F96958795909317 |
:103CA0001808809317082091170830911808809100 |
:103CB000580490915904281B390B30931404209315 |
:103CC000130481E08093270310921F0482E0809305 |
:103CD0001E0405C010921F0482E080931E04809190 |
:103CE0001E0480937C00FF91EF91BF91AF919F9153 |
:103CF0008F917F916F915F914F913F912F911F9184 |
:103D00000F91FF90EF900F900FBE0F901F9018959E |
:103D100080E022E333E090E2F901E80FF11D9083A7 |
:103D20008F5F8035C8F30895FF920F931F938091A2 |
:103D30003D0490918203981710F490933D04809174 |
:103D40003E0480FF0CC080913D04882321F0815007 |
:103D500080933D0404C08091820380933D04809150 |
:103D60003E0481FF0EC090913D048091820398171C |
:103D700019F410923D0405C080913D048F5F80933B |
:103D80003D0480913E04992780FF04C081FF02C05A |
:103D900010923D040E94881E90913D049A30A8F430 |
:103DA00081E180933C04892F99279F938F9386EC20 |
:103DB00092E09F938F9381E08F930E9449120F901E |
:103DC0000F900F900F900F9015C080E180933C04EE |
:103DD00080913D0499279F938F938BEC92E09F9362 |
:103DE0008F9381E08F930E9449120F900F900F9054 |
:103DF0000F900F9080913D0499278630910509F42A |
:103E00002EC587309105B4F48230910509F445C17F |
:103E1000833091053CF4009749F1019709F4B7C04C |
:103E20000C944D278430910509F42FC205970CF0AE |
:103E3000D8C2B2C18A30910509F446C68B309105CB |
:103E400044F48830910509F49DC509970CF0E7C545 |
:103E50006EC58C30910509F4F4C68C3091050CF4D4 |
:103E600086C60D9709F46DC70C944D2710923C043B |
:103E700080ED92E09F938F9311E01F930E9449126F |
:103E800084E180933C040F900F900F9084E690E0C3 |
:103E90009F938F938AE490E09F938F931F921F923A |
:103EA0002AE080910001622F0E940369892F9927DF |
:103EB0009F938F93809100010E94036999279F939C |
:103EC0008F9380EE92E09F938F931F930E944912ED |
:103ED00088E280933C048DB79EB70D960FB6F89498 |
:103EE0009EBF0FBE8DBF82E895E09F938F930E9487 |
:103EF000030599279F938F9385EF92E09F938F936C |
:103F00001F930E9449128DB79EB707960FB6F8947B |
:103F10009EBF0FBE8DBF80919D0390919E0306971B |
:103F200070F48CE380933C0483E093E09F938F9341 |
:103F30001F930E9449120F900F900F90B5C7909158 |
:103F400042049923A9F08CE380933C04892F99279C |
:103F50009F938F9380E193E09F938F9381E08F9362 |
:103F60000E9449120F900F900F900F900F909CC7D6 |
:103F70008CE380933C0485E293E09F938F9381E0F0 |
:103F80008F930E9449120F900F900F908DC78091D0 |
:103F9000990880FF66C010923C048091BA04909109 |
:103FA000BB04A091BC04B091BD04BF93AF939F9399 |
:103FB0008F9385E393E09F938F9311E01F930E946B |
:103FC000491284E180933C048DB79EB707960FB6E3 |
:103FD000F8949EBF0FBE8DBF8091C6049091C70418 |
:103FE000A091C804B091C904BF93AF939F938F93DE |
:103FF00084E493E09F938F931F930E94491288E279 |
:1040000080933C048DB79EB707960FB6F8949EBF79 |
:104010000FBE8DBF80912203909123039F938F93B6 |
:1040200083E593E09F938F931F930E9449128CE343 |
:1040300080933C040F900F900F900F900F90809101 |
:10404000220899279F938F9382E693E09F938F9303 |
:104050001F930E9449120F900F900F900F900F9096 |
:1040600023C784E180933C0481E793E09F938F937F |
:1040700011E01F930E94491288E280933C040F9044 |
:104080000F900F9088E793E09F938F931F930E9468 |
:1040900049120F900F900F9007C710923C0486E8CA |
:1040A00093E09F938F9381E08F930E94491284E164 |
:1040B00080933C040F900F900F9080915E0490913C |
:1040C0005F04A0916004B0916104BB2324F481508B |
:1040D0009C4FAF4FBF4F072E7AE0B595A7959795A8 |
:1040E00087957A95D1F7702DBF93AF939F938F9358 |
:1040F00080E993E09F938F9381E08F930E94491210 |
:1041000088E280933C048DB79EB707960FB6F8946B |
:104110009EBF0FBE8DBF8091660490916704A091F1 |
:104120006804B0916904BB2324F481509C4FAF4FC5 |
:10413000BF4F072E7AE0B595A795979587957A9505 |
:10414000D1F7702DBF93AF939F938F938FE993E037 |
:104150009F938F9311E01F930E9449128CE38093E9 |
:104160003C048DB79EB707960FB6F8949EBF0FBE5E |
:104170008DBF80919A0490919B049F938F938EEAB8 |
:1041800093E09F938F931F930E9449120F900F907B |
:104190000F900F900F9088C610923C048091630896 |
:1041A000909164089F938F93809161089091620829 |
:1041B0009F938F938DEB93E09F938F9311E01F93C9 |
:1041C0000E94491284E180933C048DB79EB7079604 |
:1041D0000FB6F8949EBF0FBE8DBF80916708909177 |
:1041E00068089F938F9380916508909166089F93CC |
:1041F0008F938DEC93E09F938F931F930E944912AE |
:1042000088E280933C048DB79EB707960FB6F8946A |
:104210009EBF0FBE8DBF80916B0890916C089F93DD |
:104220008F938091690890916A089F938F938DED89 |
:1042300093E09F938F931F930E9449128CE3809386 |
:104240003C048DB79EB707960FB6F8949EBF0FBE7D |
:104250008DBF80916F08909170089F938F9380918C |
:104260006D0890916E089F938F938DEE93E09F93CE |
:104270008F931F930E9449128DB79EB707960FB672 |
:10428000F8949EBF0FBE8DBF0FC610923C04809164 |
:10429000920899270FE518E0880F991FFC01E00F9D |
:1042A000F11F808191819F938F938091910899272D |
:1042B000880F991FFC01E00FF11F808191819F936E |
:1042C0008F938DEF93E09F938F93FF24F394FF924E |
:1042D0000E94491284E180933C048DB79EB70796F3 |
:1042E0000FB6F8949EBF0FBE8DBF8091940899279A |
:1042F000880F991FFC01E00FF11F808191819F932E |
:104300008F93809193089927880F991FFC01E00FE4 |
:10431000F11F808191819F938F938DE094E09F9313 |
:104320008F93FF920E94491288E280933C048DB7DC |
:104330009EB707960FB6F8949EBF0FBE8DBF8091B3 |
:1043400096089927880F991FFC01E00FF11F8081C3 |
:1043500091819F938F93809195089927880F991F3A |
:10436000FC01E00FF11F808191819F938F938DE17C |
:1043700094E09F938F93FF920E9449128CE3809365 |
:104380003C048DB79EB707960FB6F8949EBF0FBE3C |
:104390008DBF809198089927880F991FFC01E00F25 |
:1043A000F11F808191819F938F9380919708992726 |
:1043B000880F991FFC01E00FF11F808191819F936D |
:1043C0008F938DE294E09F938F93FF920E94491206 |
:1043D0008DB79EB707960FB6F8949EBF0FBE8DBFE0 |
:1043E00063C510923C048DE394E09F938F9381E02A |
:1043F0008F930E9449120F900F900F9080910001AF |
:104400008A3009F0AFC084E180933C0420914804D5 |
:1044100030914904C90133230CF40796887F281B87 |
:10442000390B3F932F93809148049091490499232D |
:104430000CF407969595879595958795959587950D |
:104440009F938F932091480430914904332314F4AF |
:10445000295F3F4F359527953595279535952795B4 |
:104460008091090490910A04821B930B9F938F9370 |
:104470008BE494E09F938F9381E08F930E94491285 |
:1044800088E280933C048DB79EB709960FB6F894E6 |
:104490009EBF0FBE8DBF20914A0430914B04C901CD |
:1044A00033230CF40796887F281B390B3F932F93F7 |
:1044B00080914A0490914B0499230CF407969595AA |
:1044C000879595958795959587959F938F9320913F |
:1044D0004A0430914B04332314F4295F3F4F359540 |
:1044E0002795359527953595279580910B049091C3 |
:1044F0000C04821B930B9F938F938DE594E09F9305 |
:104500008F9311E01F930E9449128CE380933C0427 |
:104510008DB79EB709960FB6F8949EBF0FBE8DBF9C |
:1045200080914C0490914D049F938F9320914C0463 |
:1045300030914D0480910D0490910E04281B390B8D |
:104540003F932F938FE694E09F938F931F930E9446 |
:1045500049128DB79EB707960FB6F8949EBF0FBE4F |
:104560008DBFA2C4809100018B3019F0843109F015 |
:10457000C3C084E180933C042091480430914904F5 |
:10458000C90133230CF40F96807F281B390BC90116 |
:104590000AF40196959587959F938F93809148048F |
:1045A0009091490499230CF40F96959587959595CC |
:1045B000879595958795959587959F938F9320914E |
:1045C000480430914904332314F4295F3F4F359553 |
:1045D00027953595279535952795809109049091D4 |
:1045E0000A04821B930B9F938F938EE794E09F9313 |
:1045F0008F9381E08F930E94491288E280933C045C |
:104600008DB79EB709960FB6F8949EBF0FBE8DBFAB |
:1046100020914A0430914B04C90133230CF40F96C6 |
:10462000807F281B390BC9010AF40196959587955F |
:104630009F938F9380914A0490914B0499230CF49B |
:104640000F969595879595958795959587959595C9 |
:1046500087959F938F9320914A0430914B04332385 |
:1046600014F4295F3F4F3595279535952795359556 |
:10467000279580910B0490910C04821B930B9F93C0 |
:104680008F9380E994E09F938F9381E08F930E94B2 |
:1046900049128CE380933C048DB79EB709960FB600 |
:1046A000F8949EBF0FBE8DBF80914C0490914D0435 |
:1046B00099230CF40196959587959F938F9320915C |
:1046C0004C0430914D0480910D0490910E04281BF0 |
:1046D000390B3F932F9382EA94E09F938F9381E06D |
:1046E0008F930E9449128DB79EB707960FB6F89424 |
:1046F0009EBF0FBE8DBFD8C3809100018D3009F0E1 |
:10470000D3C384E180933C048091240399279F9331 |
:104710008F93809148049091490499230CF40F964B |
:104720009595879595958795959587959595879571 |
:104730009F938F932091480430914904332314F4BC |
:10474000295F3F4F359527953595279535952795C1 |
:104750008091090490910A04821B930B9F938F937D |
:1047600081EB94E09F938F9381E08F930E94491295 |
:1047700088E280933C048DB79EB709960FB6F894F3 |
:104780009EBF0FBE8DBF8091250399279F938F9366 |
:1047900080914A0490914B0499230CF40F969595BF |
:1047A00087959595879595958795959587959F93E9 |
:1047B0008F9320914A0430914B04332314F4295FE2 |
:1047C0003F4F3595279535952795359527958091B8 |
:1047D0000B0490910C04821B930B9F938F9385EC99 |
:1047E00094E09F938F9381E08F930E9449128CE312 |
:1047F00080933C048DB79EB709960FB6F8949EBF80 |
:104800000FBE8DBF8091260399279F938F93809130 |
:104810004C0490914D0499230CF40196959587953D |
:104820009F938F9320914C0430914D0480910D04FF |
:1048300090910E04281B390B3F932F9389ED94E040 |
:104840009F938F9381E08F930E9449128DB79EB7FB |
:1048500009960FB6F8949EBF0FBE8DBF25C3109268 |
:104860003C048DEE94E09F938F9311E01F930E9480 |
:10487000491284E180933C040F900F900F90809137 |
:104880005204909153049F938F93809111049091BF |
:1048900012049F938F938AEF94E09F938F931F93BB |
:1048A0000E94491288E280933C048DB79EB7079618 |
:1048B0000FB6F8949EBF0FBE8DBF809154049091A7 |
:1048C00055049F938F9380910F04909110049F93B0 |
:1048D0008F9389E095E09F938F931F930E944912D5 |
:1048E0008CE380933C048DB79EB707960FB6F8947F |
:1048F0009EBF0FBE8DBF80915804909159049F9325 |
:104900008F9380910A0990910B099F938F9388E16F |
:1049100095E09F938F931F930E9449128DB79EB786 |
:1049200007960FB6F8949EBF0FBE8DBFBDC284E13F |
:1049300080933C0480911803909119039F938F9367 |
:1049400087E295E09F938F9311E01F930E94491295 |
:1049500088E280933C040F900F900F900F900F907F |
:104960008091B00499279F938F9386E395E09F935E |
:104970008F931F930E9449120F900F900F900F90EA |
:104980000F9092C210923C0485E495E09F938F9320 |
:1049900011E01F930E94491284E180933C040F9020 |
:1049A0000F900F9080919E0490919F049F938F93FE |
:1049B00084E595E09F938F931F930E94491288E2AC |
:1049C00080933C040F900F900F900F900F90809168 |
:1049D0009A0490919B049F938F9383E695E09F9315 |
:1049E0008F931F930E9449128CE380933C040F9095 |
:1049F0000F900F900F900F9080919C0490919D04C8 |
:104A00009F938F9382E795E09F938F931F930E94CC |
:104A100049120F900F900F900F900F9045C2109277 |
:104A20003C048091A8049091A9049F938F9381E8FE |
:104A300095E09F938F9311E01F930E94491284E1A8 |
:104A400080933C040F900F900F900F900F908091E7 |
:104A5000AA049091AB049F938F938DE895E09F9368 |
:104A60008F931F930E94491288E280933C040F9019 |
:104A70000F900F900F900F908091AC049091AD0427 |
:104A80009F938F9389E995E09F938F931F930E9443 |
:104A900049128CE380933C040F900F900F900F907D |
:104AA0000F908091AE049091AF049F938F9385EA0D |
:104AB00095E09F938F931F930E9449120F900F9040 |
:104AC0000F900F900F90F0C110923C0481EB95E095 |
:104AD0009F938F9311E01F930E94491284E180936A |
:104AE0003C040F900F900F908091B70399279F93EC |
:104AF0008F9389EB95E09F938F931F930E944912A8 |
:104B000088E280933C040F900F900F900F900F90CD |
:104B10008091F4039091F5039F938F9387EC95E038 |
:104B20009F938F931F930E9449128CE380933C04C0 |
:104B30000F900F900F900F900F908091B6089927CB |
:104B40009F938F938091B50899279F938F9385EDBD |
:104B500095E09F938F931F930E9449128DB79EB744 |
:104B600007960FB6F8949EBF0FBE8DBF9DC11092E1 |
:104B70003C0483EE95E09F938F9311E01F930E9476 |
:104B8000491284E180933C040F900F900F90809124 |
:104B90003207992787FD90959F938F9380913107D6 |
:104BA000992787FD90959F938F9383EF95E09F932F |
:104BB0008F931F930E94491288E280933C048DB723 |
:104BC0009EB707960FB6F8949EBF0FBE8DBF80911B |
:104BD0003307992787FD90959F938F938091340792 |
:104BE00099279F938F9383E096E09F938F931F93D2 |
:104BF0000E9449128CE380933C048DB79EB70796C0 |
:104C00000FB6F8949EBF0FBE8DBF809138079927CD |
:104C10009F938F9380913507992787FD90959F9358 |
:104C20008F9383E196E09F938F931F930E94491285 |
:104C30008DB79EB707960FB6F8949EBF0FBE8DBF77 |
:104C400033C110923C0483E296E09F938F9311E06E |
:104C50001F930E94491284E180933C040F900F90AF |
:104C60000F9080913A0899279F938F9380913908EC |
:104C700099279F938F938091380899279F938F93BB |
:104C80008091370899279F938F9383E396E09F93B2 |
:104C90008F931F930E94491288E280933C048DB742 |
:104CA0009EB70B960FB6F8949EBF0FBE8DBF809136 |
:104CB0003E0899279F938F9380913D0899279F9352 |
:104CC0008F9380913C0899279F938F9380913B0805 |
:104CD00099279F938F9388E496E09F938F931F93D8 |
:104CE0000E9449128CE380933C048DB79EB70B96CB |
:104CF0000FB6F8949EBF0FBE8DBF809142089927D2 |
:104D00009F938F938091410899279F938F938091D0 |
:104D1000400899279F938F9380913F0899279F93ED |
:104D20008F938DE596E09F938F931F930E94491276 |
:104D30008DB79EB70B960FB6F8949EBF0FBE8DBF72 |
:104D4000B3C010923C0482E796E09F938F9311E0EA |
:104D50001F930E94491284E180933C040F900F90AE |
:104D60000F908091560899278D969F938F938091ED |
:104D7000550899278D969F938F9380915408992772 |
:104D80008D969F938F938091530899278D969F932B |
:104D90008F9381E896E09F938F931F930E9449120F |
:104DA00088E280933C048DB79EB70B960FB6F894BB |
:104DB0009EBF0FBE8DBF80915A0899278D969F93F5 |
:104DC0008F938091590899278D969F938F93809107 |
:104DD000580899278D969F938F938091570899270C |
:104DE0008D969F938F9385E996E09F938F931F9362 |
:104DF0000E9449128CE380933C048DB79EB70B96BA |
:104E00000FB6F8949EBF0FBE8DBF80915B089927A7 |
:104E10008D969F938F9389EA96E09F938F931F932C |
:104E20000E9449120F900F900F900F900F90809159 |
:104E30005C08882369F080E480933C0489EB96E069 |
:104E40009F938F931F930E9449120F900F900F9082 |
:104E500080915D08882371F084E480933C048CEB9E |
:104E600096E09F938F9381E08F930E9449120F9059 |
:104E70000F900F9080915E088823B1F088E48093B2 |
:104E80003C048FEB96E09F938F9381E08F930E9479 |
:104E900049120F900F900F9007C080913D048150F0 |
:104EA0008093820310923D0410923E041F910F9153 |
:104EB000FF9008951092B9008AE28093B800089597 |
:104EC00085EA8093BC00089584E98093BC0008952E |
:104ED0000E94642710923F048091BB00109240040E |
:104EE00080E88093BC001092BD001092BA0010922E |
:104EF000BB001092B9001092B8000E945A270E947D |
:104F0000602780E00E94852708951092B900809361 |
:104F1000BB0085E88093BC0008958093BB0085E8C2 |
:104F20008093BC00089585EC8093BC00089585E8CB |
:104F30008093BC0008951F920F920FB60F92112418 |
:104F40002F933F934F935F936F937F938F939F9391 |
:104F5000AF93BF93EF93FF9380913F04282F3327A4 |
:104F6000442755278F5F80933F04F901273131058E |
:104F700008F01DC1E25CFF4FEE0FFF1F0590F4919A |
:104F8000E02D099440914004542F842F992721E863 |
:104F900035E0B901880F991F880F991FFC01E20FB6 |
:104FA000F31F85851816ACF04C3098F4252F2F5F31 |
:104FB000822F9927880F991F880F991FFC01E60FF0 |
:104FC000F71F858518161CF0522F2C3078F320938C |
:104FD0004004809140048C3061F41092400483E0DE |
:104FE00080933F0480914104880F8D5A0E94852749 |
:104FF000E0C080914004880F8E5A0E948527D9C056 |
:105000008091400427E439E0F901E80FF11D8F5F3A |
:105010008093400480810E948527CBC08091B90095 |
:105020008033A9F480914304882321F480914004C3 |
:1050300080934304809140049927FC01EA5CF74F78 |
:1050400080818F5F8083882311F48FEF80830E949B |
:1050500064278AE090E090939E0380939D031092D2 |
:105060003F040E946027A5C08091B9008034A9F058 |
:105070002091410483E598E0FC01E20FF11D1082CC |
:10508000822F8F5F809341048C3010F01092410486 |
:105090000E94642710923F040CC02091410483E5D4 |
:1050A00098E0FC01E20FF11D822F8C5F80830E944B |
:1050B000932780914304809342041092430479C063 |
:1050C0002091410483E498E0FC01E20FF11D8091FE |
:1050D000BB0080830E9497276CC02091410487E227 |
:1050E00098E0FC01E20FF11D8091BB0080832F5FEF |
:1050F000209341042C3010F0109241040E94642748 |
:1051000010923F0456C088E90E94852752C080E172 |
:105110000E9485274EC0809124030E94852749C0A4 |
:1051200080E80E94852745C00E9464278AE090E0BD |
:1051300090939E0380939D030E9460273AC088E964 |
:105140000E94852736C082E10E94852732C0809167 |
:1051500025030E9485272DC080E80E94852729C04D |
:105160000E9464278AE090E090939E0380939D03C1 |
:105170000E9460271EC088E90E9485271AC084E12A |
:105180000E94852716C0809126030E94852711C0A2 |
:1051900080E80E9485270DC00E9464278AE090E085 |
:1051A00090939E0380939D0310923F0402C010923F |
:1051B0003F048091BC0080688093BC00FF91EF9118 |
:1051C000BF91AF919F918F917F916F915F914F911F |
:1051D0003F912F910F900FBE0F901F90189583EC69 |
:1051E0008093810080916F00806280936F001092A5 |
:1051F0004D0410924C0410924B0410924A041092E9 |
:1052000049041092480408951F920F920FB60F920E |
:1052100011242F933F934F935F936F937F938F93BB |
:105220009F93AF93BF93EF93FF93209186003091AC |
:1052300087008091440490914504A901481B590BB3 |
:105240008091860090918700909345048093440458 |
:10525000CA018D549440835F9A4178F4809146044A |
:1052600090914704049714F01092830381E090E03A |
:105270009093470480934604AAC02091460430913D |
:1052800047042A3031050CF0A2C0CA018B5F904060 |
:10529000845B914008F07BC0425D5140C901820FA0 |
:1052A000931FFC01E15AF74F808191819A01281BDD |
:1052B000390BC9011AF4909581959F4F06976CF4AC |
:1052C0008091B004883C30F48091B004865F809374 |
:1052D000B00403C088EC8093B004809146049091A0 |
:1052E0004704880F991FFC01E15AF74F2081318153 |
:1052F000C901880F991FBC01620F731F640F751FCE |
:10530000CB0177230CF40396BC01759567957595D1 |
:105310006795CA010196861797071CF46150704083 |
:1053200007C0CA0101976817790714F46F5F7F4FB0 |
:105330008091B004833CA8F080914604909147048A |
:10534000880F991FDC01AB58B74FFC01E15AF74FAA |
:10535000808191819B01281B390B11963C932E93E0 |
:105360000BC08091460490914704880F991FFC015F |
:10537000EB58F74F118210828091460490914704B8 |
:10538000880F991FFC01E15AF74F71836083809168 |
:1053900046049091470401969093470480934604F5 |
:1053A000059711F45D9A01C05D9880914604909133 |
:1053B0004704069711F45C9A01C05C9880914604FA |
:1053C00090914704079711F45B9A01C05B98FF9195 |
:1053D000EF91BF91AF919F918F917F916F915F916D |
:1053E0004F913F912F910F900FBE0F901F901895E6 |
:1053F00081E08093910882E08093920883E080931B |
:10540000930884E08093940885E08093950886E073 |
:105410008093960887E08093970888E080939808A7 |
:1054200008951F9388E6809399083EE130939A0887 |
:105430008BEF80939C088AE080939D0830939B08B3 |
:1054400030939F08E4E0E0939E085FE05093A0084B |
:105450003093A1081CE01093A20878E07093A30891 |
:1054600086EE8093A4083093A50880E88093A60870 |
:1054700080E58093A70826E92093A80883E080931D |
:10548000A9088EE58093AA0883E28093AB08309345 |
:10549000AC081092AD0860E26093AE081092AF08BD |
:1054A0001092B0081092B1081092B2081092C3087E |
:1054B0001092C4081092C5081092C60844E64093A2 |
:1054C000B30888E28093B4081092DD0892E39093C9 |
:1054D000B5082093B60885E08093B7089093B80884 |
:1054E0002AE52093B9089093BA081092DC0820931B |
:1054F000BB0883E48093BC081092BD0885E58093C7 |
:10550000BE088093BF0880E18093C0086093C10803 |
:105510004093C2088FE58093C70883EF8093C90842 |
:105520005093C8085093CA088DEF8093CB084093DE |
:10553000CC082093CD082093CE082093CF088BE48D |
:105540008093D0088093D1088093D2081092D3081A |
:1055500086E08093D4087093D5082093D6083093C2 |
:10556000D7084093D8084093D908E093DA08A4E814 |
:10557000B3E0E2EEF8E00D9001921A95E1F71F9189 |
:1055800008951F9388E6809399085EE150939A08E6 |
:105590008BEF80939C088AE080939D0850939B0832 |
:1055A00050939F0893E090939E081CE01093A008EE |
:1055B00080E18093A10876E07093A20868E0609390 |
:1055C000A30886EE8093A4085093A50880E88093F2 |
:1055D000A60880E58093A70888E78093A8089093A1 |
:1055E000A9088EE58093AA0883E28093AB085093C4 |
:1055F000AC081092AD0830E23093AE081092AF08BC |
:105600001092B0081092B1081092B2081092C3081C |
:105610001092C4081092C5081092C60844E6409340 |
:10562000B30888E28093B4081092DD0892E3909367 |
:10563000B50886E98093B60885E08093B708909313 |
:10564000B8082AE52093B9089093BA081092DC08AC |
:105650002093BB0883E48093BC088CE38093BD084F |
:1056600085E58093BE088093BF083093C0083093CF |
:10567000C1089BE49093C2088FE58093C70883EF2D |
:105680008093C90884E18093C8088093CA088DEF8D |
:105690008093CB084093CC082093CD082093CE086C |
:1056A0002093CF089093D0089093D1089093D2087C |
:1056B0001092D3087093D4086093D5082093D6082D |
:1056C0005093D7084093D8084093D90884E080933A |
:1056D000DA08ABE8B3E0E2EEF8E00D9001921A953B |
:1056E000E1F71F91089588EE809399083EE1309389 |
:1056F0009A088BEF80939C088AE080939D083093F2 |
:105700009B0830939F0893E090939E0858E0509335 |
:10571000A00820E12093A10866E06093A2085093BE |
:10572000A30886EE8093A4083093A50880E88093B0 |
:10573000A60844E64093A70888E78093A8089093BA |
:10574000A9088EE58093AA0883E28093AB0884E1E0 |
:105750008093AC081092AD082093AE081092AF0869 |
:105760001092B0081092B1081092B2081092C308BB |
:105770001092C4081092C5081092C6084093B3084E |
:1057800088E28093B4081092DD0892E39093B50804 |
:1057900086E98093B60885E08093B7089093B808AF |
:1057A0002AE52093B9089093BA081092DC08209358 |
:1057B000BB0883E48093BC0886E48093BD0885E53C |
:1057C0008093BE088093BF0880E28093C0088093D6 |
:1057D000C1089093C2088FE58093C70883EF809338 |
:1057E000C9083093C8083093CA088DEF8093CB085E |
:1057F0004093CC082093CD082093CE082093CF0867 |
:105800008BE48093D0088093D1088093D2081092C3 |
:10581000D3086093D4085093D5082093D6083093CA |
:10582000D7084093D8084093D90884E08093DA08D9 |
:105830008CE0A3E9B3E0E2EEF8E00D9001928A95E6 |
:10584000E1F70895CF93FC0199232CF4CFEFF09565 |
:10585000E195FF4F01C0C1E0CF0168E671E00E9411 |
:105860002369FC018B35910514F441E01CC08B5574 |
:1058700090408A35910538F484EB90E08E1B9F0BA5 |
:10588000FC0141E010C0CF01855B90408A35910555 |
:1058900020F4E45BF0404FEF06C088E691E08E1BF9 |
:1058A0009F0BFC014FEFEE0FFF1FEE53F94F2591B9 |
:1058B00034918C2F992787FD9095829FB001839F0B |
:1058C000700D929F700D1124242F332727FD3095E2 |
:1058D000629FA001639F500D729F500D1124CA0159 |
:1058E000CF9108952AE530E0281B390BC9010E94A9 |
:1058F000222C08951F93CF93DF93EB01611571055F |
:1059000019F4009709F494C0992314F41FEF01C00F |
:1059100011E0209729F48AE51802B001112488C00B |
:10592000AA2797FDA095BA2F689415F8880F991F9C |
:10593000AA1FBB1F1694D1F79E01442737FD40953F |
:10594000542FBC01CD010E945869F90133231CF486 |
:10595000F095E195FF4F81E0EA35F80734F4E85817 |
:10596000F84F8491282F332747C08CE1E73AF80796 |
:105970001CF02AE530E040C089E0ED38F8071CF063 |
:1059800029E530E039C085E0EA3BF8071CF028E55E |
:1059900030E032C084E0E731F8071CF027E530E062 |
:1059A0002BC083E0EE32F8071CF026E530E024C07F |
:1059B00082E0E939F8071CF025E530E01DC082E0FF |
:1059C000E233F8071CF024E530E016C081E0E73E42 |
:1059D000F8071CF023E530E00FC081E0ED3AF8074E |
:1059E0001CF022E530E008C0EF57F1401CF021E543 |
:1059F00030E002C020E530E01C161D0664F4812F63 |
:105A0000992787FD9095829FB001839F700D929F8B |
:105A1000700D11240DC0DD2344F4111634F484EB11 |
:105A200090E0BC01621B730B03C0B901645B704062 |
:105A3000CB01DF91CF911F910895AF92BF92CF928A |
:105A4000DF92EF92FF920F931F93CF935B016C0154 |
:105A5000611571058105910519F49B01AC011EC00A |
:105A6000C0E09B01AC0179018A01C601B5010E9429 |
:105A700036692E0D3F1D401F511F5695479537958E |
:105A80002795CF5FD801C701821B930BA40BB50BE1 |
:105A90000297A105B10510F0C83228F3CA01B90177 |
:105AA000CF911F910F91FF90EF90DF90CF90BF901B |
:105AB000AF9008956817790754F4860F971F9C01DB |
:105AC000992314F42F5F3F4FC90195958795089549 |
:105AD0000F931F93CF93C82FC150CF3F81F004E69F |
:105AE00010E08091B904882351F41093F1030093DE |
:105AF000F0038AEF90E00E94BF15C15090F7CF915C |
:105B00001F910F9108956F927F928F929F92AF9203 |
:105B1000BF92CF92DF92EF92FF920F931F93CF939A |
:105B2000DF93C0E0D0E07E016E011092F303469A4D |
:105B3000D0935304C0935204D0935504C09354049B |
:105B4000D0935904C0935804D0935B04C0935A0473 |
:105B5000D0934904C0934804D0934B04C0934A04A3 |
:105B6000D0934D04C0934C04D0932009C0931F09D7 |
:105B70001092B9031092BA03109216040E94B93A17 |
:105B800084E690E00E94CC150E94B93A8091990871 |
:105B900080FF10C08091220390912303875B934084 |
:105BA00038F480912203909123038E5E924010F48A |
:105BB0000E940C1A10E08AE090E00E94CC158091BF |
:105BC0000D0490910E04C80FD91F80910904909183 |
:105BD0000A04E80EF91E80910B0490910C04C80E83 |
:105BE000D91E1F5F103238F3C7014096AC0156959D |
:105BF0004795569547955093490440934804C601EC |
:105C000040969C01369527953695279530934B0401 |
:105C100020934A04CE014096969587959295829559 |
:105C20008F7089279F70892790934D0480934C042F |
:105C30009093200980931F0930934F0420934E04C2 |
:105C40005093510440935004A4E0B0E00E94736963 |
:105C5000802D853098F18091600990916109992398 |
:105C60001CF4909581959F4F6CE070E00E94236931 |
:105C700070935504609354048091440990914509B0 |
:105C800099231CF4909581959F4F6CE070E00E94E1 |
:105C90002369709353046093520480911708909184 |
:105CA0001808909359048093580480915804909157 |
:105CB000590490935B0480935A0439C0A4E0B0E087 |
:105CC0000E947369802D9927382F2227A5E0B0E024 |
:105CD0000E947369802D280F311D30935304209347 |
:105CE0005204A6E0B0E00E947369802D9927382FF6 |
:105CF0002227A7E0B0E00E947369802D280F311D94 |
:105D00003093550420935404A8E0B0E00E947369D6 |
:105D1000802D9927382F2227A9E0B0E00E947369CF |
:105D2000802D280F311D3093590420935804109270 |
:105D300000091092FF081092F1081092F0081092DA |
:105D400056091092550984E690E00E94CC15809186 |
:105D50001104909112049C01442737FD4095542F63 |
:105D6000DA01C901880F991FAA1FBB1F880F991F4D |
:105D7000AA1FBB1F820F931FA41FB51F7C018D019B |
:105D8000E20EF31E041F151FF0924509E09244092C |
:105D900080910F04909110049C01442737FD409599 |
:105DA000542FDA01C901880F991FAA1FBB1F880F42 |
:105DB000991FAA1FBB1F820F931FA41FB51F3C0171 |
:105DC0004D01620E731E841E951E709261096092D1 |
:105DD00060098091A508A82EBB24CC24DD2497015E |
:105DE000442737FD4095542FC601B5010E94E46851 |
:105DF0007B018C0160935E0470935F048093600468 |
:105E0000909361049301442737FD4095542FC601B8 |
:105E1000B5010E94E468DC01CB0180936604909395 |
:105E20006704A0936804B0936904E0928204F0923E |
:105E30008304009384041093850480938A049093D0 |
:105E40008B04A0938C04B0938D0410928E04109256 |
:105E50008F04109290041092910480911E039091EF |
:105E60001F03A0912003B091210390931A088093FF |
:105E700019081092180410921704109296041092A8 |
:105E80009704109298041092990480919A0490912A |
:105E90009B0490939D0480939C040E944C6182E338 |
:105EA00090E09093F1038093F0038091BE089927CE |
:105EB000AA27BB270F2EF4ECEF2EF9E0FF2EF0E01F |
:105EC0000F2FF0E01F2FF02DBC01CD01A80197018D |
:105ED0000E94E468DC01CB018856954CAF4FBF4F60 |
:105EE0008093A1039093A203A093A303B093A40370 |
:105EF0008091BF089927AA27BB27BC01CD010E942A |
:105F0000E468DC01CB018856954CAF4FBF4F8093BE |
:105F1000A5039093A603A093A703B093A8031092A0 |
:105F2000BE031092BD0380919A0490919B04AA270E |
:105F300097FDA095BA2F2091BF033091C0034091E7 |
:105F4000C1035091C203BC01CD010E94E468DC0191 |
:105F5000CB0180935C0990935D09A0935E09B09397 |
:105F60005F091092A7041092A60411E0109301019A |
:105F70000E94D6648091EC0484608093EC048FEFDF |
:105F80008093C7091092C80980E28093C909809163 |
:105F9000950899272FE538E0880F991FFC01E20F3B |
:105FA000F31F8081918182599F4F9093A904809320 |
:105FB000A804809196089927880F991FFC01E20F89 |
:105FC000F31F8081918182599F4F9093AB048093FE |
:105FD000AA04809197089927880F991FFC01E20F66 |
:105FE000F31F8081918182599F4F9093AD048093DC |
:105FF000AC04809198089927880F991FFC01E20F43 |
:10600000F31F8081918182599F4F9093AF048093B9 |
:10601000AE041093F30384E68093B004DF91CF9134 |
:106020001F910F91FF90EF90DF90CF90BF90AF90B6 |
:106030009F908F907F906F900895AF92BF92CF9274 |
:10604000DF92EF92FF920F931F93CF93DF93809194 |
:106050004C0490914D0420910D0430910E04821B4C |
:10606000930B909356098093550980910304909166 |
:10607000040499230CF40796959587959595879533 |
:1060800095958795909300098093FF0820910504CA |
:1060900030910604332314F4295F3F4F359527953B |
:1060A00035952795359527953093F1082093F0087D |
:1060B0008091FF089091000990930D0980930C093D |
:1060C0003093030920930209809144099091450976 |
:1060D000AA2797FDA095BA2F7C018D01EE0CFF1C1D |
:1060E000001F111FE80EF91E0A1F1B1F80911104CB |
:1060F000909112049C01442737FD4095542FDA01FA |
:10610000C901880F991FAA1FBB1F880F991FAA1FBB |
:10611000BB1F820F931FA41FB51F820F931FA41FC5 |
:10612000B51F8E0D9F1DA01FB11FBB231CF403962E |
:10613000A11DB11DB595A79597958795B595A7957F |
:1061400097958795909345098093440980916009BC |
:1061500090916109AA2797FDA095BA2F7C018D0126 |
:10616000EE0CFF1C001F111FE80EF91E0A1F1B1F5B |
:1061700080910F04909110049C01442737FD4095B5 |
:10618000542FDA01C901880F991FAA1FBB1F880F5E |
:10619000991FAA1FBB1F820F931FA41FB51F820F39 |
:1061A000931FA41FB51F8E0D9F1DA01FB11FBB23E2 |
:1061B0001CF40396A11DB11DB595A79597958795DC |
:1061C000B595A795979587959093610980936009F8 |
:1061D00080910A0990910B099C01442737FD409555 |
:1061E000542FDA01C901880F991FAA1FBB1F820F04 |
:1061F000931FA41FB51F209113043091140444274A |
:1062000037FD4095542F820F931FA41FB51FBB234A |
:106210001CF40396A11DB11DB595A795979587957B |
:10622000B595A7959795879590930B0980930A0943 |
:106230002091110430911204C901880F991F880F11 |
:10624000991F820F931F820F931F9C01442737FDD4 |
:106250004095542F80916E0490916F04A09170042A |
:10626000B0917104820F931FA41FB51F80936E0419 |
:1062700090936F04A0937004B093710420910F0465 |
:1062800030911004C901880F991F880F991F820F40 |
:10629000931F820F931F9C01442737FD4095542F75 |
:1062A0008091720490917304A0917404B09175046C |
:1062B000820F931FA41FB51F8093720490937304E1 |
:1062C000A0937404B09375042091160930911709B6 |
:1062D0008091110490911204820F931F90931709DB |
:1062E00080931609209158093091590980910F0423 |
:1062F00090911004820F931F90935909809358092D |
:10630000809156049091570401969093570480937E |
:10631000560480911304909114049C01442737FD86 |
:106320004095542F8091760490917704A091780441 |
:10633000B0917904820F931FA41FB51F8093760438 |
:1063400090937704A0937804B09379041092270374 |
:106350008091860490918704A0918804B09189046B |
:1063600089549B46A140B0405CF00F2EF8E4AF2E5C |
:10637000FBE6BF2EF1E0CF2EF0E0DF2EF02D20C0A7 |
:106380008091860490918704A0918804B09189043B |
:10639000885B9449AE4FBF4F5CF40F2EF8EBAF2EE5 |
:1063A000F4E9BF2EFEEFCF2EFFEFDF2EF02D08C059 |
:1063B000A0908604B0908704C0908804D09089048F |
:1063C00080917E0490917F04A0918004B09181041B |
:1063D00089549B46A140B0405CF00F2EF8E4EF2EAC |
:1063E000FBE6FF2EF1E00F2FF0E01F2FF02D20C075 |
:1063F00080917E0490917F04A0918004B0918104EB |
:10640000885B9449AE4FBF4F5CF40F2EF8EBEF2E34 |
:10641000F4E9FF2EFEEF0F2FFFEF1F2FF02D08C026 |
:10642000E0907E04F0907F0400918004109181043C |
:1064300080915509909156099C01442737FD40955C |
:10644000542F80918E0490918F04A0919004B0916C |
:106450009104820F931FA41FB51F80938E04909305 |
:106460008F04A0939004B093910480915C09909163 |
:106470005D09A0915E09B0915F09820F931FA41F6F |
:10648000B51F80935C0990935D09A0935E09B0935A |
:106490005F098091990882FD04C08091D4048D38F1 |
:1064A00010F0109221098091CE04882309F0E7C1F1 |
:1064B0008091CF04882309F0E2C1809121098823CB |
:1064C00009F4DDC18091990886FFD9C18091F00857 |
:1064D0009091F108AA2797FDA095BA2FBC01CD0194 |
:1064E000A80197010E94E468992324F46150784F31 |
:1064F0008F4F9F4F9B01AC01012E1BE05595479597 |
:10650000379527951A95D1F7102D8091BA039927C1 |
:10651000AA27BB27BC01CD010E94E468DC01CB01A6 |
:106520008093F5049093F604A093F704B093F804D5 |
:10653000BB2324F48150904FAF4FBF4F072E7CE018 |
:10654000B595A795979587957A95D1F7702D8093F6 |
:10655000F5049093F604A093F704B093F8048091A7 |
:10656000FF0890910009AA2797FDA095BA2FBC01BA |
:10657000CD01A60195010E94E468992324F461509D |
:10658000784F8F4F9F4F9B01AC01012E1BE055951B |
:106590004795379527951A95D1F7102D8091BA0315 |
:1065A0009927AA27BB27BC01CD010E94E468DC0122 |
:1065B000CB018093F9049093FA04A093FB04B09369 |
:1065C000FC04BB2324F48150904FAF4FBF4F9C017C |
:1065D000AD01012E1CE055954795379527951A95E5 |
:1065E000D1F7102D2093F9043093FA044093FB0463 |
:1065F0005093FC048091F5049091F60490938C08DC |
:1066000080938B088091F9049091FA0490939008FC |
:1066100080938F088091F5049091F604A091F7047F |
:10662000B091F804281B390B4A0B5B0B2093F9043B |
:106630003093FA044093FB045093FC0480915C096E |
:1066400090915D09A0915E09B0915F09820F931F3F |
:10665000A41FB51F80935C0990935D09A0935E0908 |
:10666000B0935F098091BB03882301F5552324F47F |
:106670002F5F3F4F4F4F5F4FDA01C901B595A79587 |
:106680009795879520918E0430918F0440919004C6 |
:1066900050919104281B390B4A0B5B0B20938E04FD |
:1066A00030938F0440939004509391048091550946 |
:1066B000909156099C01442737FD4095542F8091B5 |
:1066C000F9049091FA04A091FB04B091FC04820FAC |
:1066D000931FA41FB51FBC01CD01A80197010E9403 |
:1066E000E468992324F46150784F8F4F9F4F9B01AA |
:1066F000AC01012E1BE055954795379527951A95C6 |
:10670000D1F7102D8091B9039927AA27BB27BC0187 |
:10671000CD010E94E468DC01CB018093ED049093ED |
:10672000EE04A093EF04B093F004BB2324F4815053 |
:10673000904FAF4FBF4F072E7CE0B595A79597952B |
:1067400087957A95D1F7702D8093ED049093EE04A0 |
:10675000A093EF04B093F0048091550990915609ED |
:106760009C01442737FD4095542F8091F904909166 |
:10677000FA04A091FB04B091FC04820F931FA41FA4 |
:10678000B51FBC01CD01A60195010E94E4689923C3 |
:1067900024F46150784F8F4F9F4F9B01AC01012E25 |
:1067A0001BE055954795379527951A95D1F7102DEC |
:1067B0008091B9039927AA27BB27BC01CD010E946C |
:1067C000E468DC01CB018093F1049093F204A09380 |
:1067D000F304B093F404BB2324F48150904FAF4FE3 |
:1067E000BF4F072E7CE0B595A795979587957A952D |
:1067F000D1F7702D8093F1049093F204A093F304E9 |
:10680000B093F404809155099091560999231CF492 |
:10681000909581959F4F813491050CF448C08091EB |
:10682000ED049091EE04A091EF04B091F004BB232D |
:106830003CF4B095A095909581959F4FAF4FBF4F79 |
:1068400081389105A105B105B4F48091F1049091CE |
:10685000F204A091F304B091F404BB233CF4B0958E |
:10686000A095909581959F4FAF4FBF4F813891056F |
:10687000A105B105E4F081E08093A20418C0109254 |
:10688000900810928F0810928C0810928B0810922A |
:10689000F1041092F2041092F3041092F404109296 |
:1068A000ED041092EE041092EF041092F004809127 |
:1068B000F1049091F204A091F304B091F4040F2E2E |
:1068C000F4E6EF2EF0E0FF2EF0E00F2FF0E01F2FA8 |
:1068D000F02DBC01CD01A80197010E945869DA0191 |
:1068E000C9012091ED043091EE04281B390B30933F |
:1068F000FE082093FD088091ED049091EE04A09194 |
:10690000EF04B091F004BC01CD01A80197010E94F1 |
:106910005869DA01C9012091F1043091F204821B17 |
:10692000930B9093F3088093F2088091BF039091AA |
:10693000C003A091C103B091C203BC01CD0128E600 |
:1069400031E040E050E00E94E4689B01AC0180919E |
:106950005C0990915D09A0915E09B0915F09821771 |
:106960009307A407B50764F0821B930BA40BB50B28 |
:1069700080935C0990935D09A0935E09B0935F09D1 |
:10698000E0905C09F0905D0900915E0910915F094B |
:106990001123F4F48091BF039091C003A091C1032F |
:1069A000B091C203BC01CD0128E631E040E050E0E7 |
:1069B0000E94E468DC01CB018E0D9F1DA01FB11F5A |
:1069C00080935C0990935D09A0935E09B0935F0981 |
:1069D0002091F0083091F1088091FD089091FE0817 |
:1069E000B901680F791F9B01442737FD4095542F4B |
:1069F00080918A0490918B04A0918C04B0918D04B5 |
:106A0000820F931FA41FB51F80938A0490938B0459 |
:106A1000A0938C04B0938D048091CA049091CB0410 |
:106A2000681B790B9B01442737FD4095542F8091BB |
:106A3000860490918704A0918804B0918904820F04 |
:106A4000931FA41FB51F8093860490938704A0937F |
:106A50008804B09389042091A5033091A603409146 |
:106A6000A7035091A803281739074A075B07C4F406 |
:106A700088EA91E6A0E0B0E0821B930BA40BB50B73 |
:106A80008093860490938704A0938804B09389042C |
:106A900080938A0490938B04A0938C04B0938D040C |
:106AA000C091A503D091A603E091A703F091A8039C |
:106AB00022273327A9012C1B3D0B4E0B5F0B809126 |
:106AC000860490918704A0918804B091890482176C |
:106AD0009307A407B507B4F4CE01DF01885A9146A5 |
:106AE000A040B0408093860490938704A0938804CC |
:106AF000B093890480938A0490938B04A0938C04B0 |
:106B0000B0938D042091FF08309100098091F20824 |
:106B10009091F308B901680F791F9B01442737FD55 |
:106B20004095542F8091820490918304A091840415 |
:106B3000B0918504820F931FA41FB51F8093820418 |
:106B400090938304A0938404B09385048091CC0433 |
:106B50009091CD04681B790B9B01442737FD40952C |
:106B6000542F80917E0490917F04A0918004B09175 |
:106B70008104820F931FA41FB51F80937E049093FE |
:106B80007F04A0938004B09381042091A1033091ED |
:106B9000A2034091A3035091A403281739074A0781 |
:106BA0005B07C4F488EA91E6A0E0B0E0821B930B97 |
:106BB000A40BB50B80937E0490937F04A093800474 |
:106BC000B09381048093820490938304A0938404FF |
:106BD000B0938504C091A103D091A203E091A303D7 |
:106BE000F091A40322273327A9012C1B3D0B4E0B48 |
:106BF0005F0B80917E0490917F04A0918004B091FE |
:106C0000810482179307A407B507B4F4CE01DF010E |
:106C1000885A9146A040B04080937E0490937F04B0 |
:106C2000A0938004B09381048093820490938304A2 |
:106C3000A0938404B093850480918E0490918F0476 |
:106C4000A0919004B091910480937A0490937B0476 |
:106C5000A0937C04B0937D0480917E0490917F0486 |
:106C6000A0918004B091810480935E0490935F04AE |
:106C7000A0936004B093610480918604909187048E |
:106C8000A0918804B091890480936604909367046E |
:106C9000A0936804B0936904809182049091830466 |
:106CA000A0918404B091850480936204909363045E |
:106CB000A0936404B093650480918A0490918B043E |
:106CC000A0918C04B0918D0480936A0490936B041E |
:106CD000A0936C04B0936D0480910304909104041C |
:106CE00099230CF407969595879595958795959595 |
:106CF0008795909300098093FF08809105049091F7 |
:106D0000060499230CF40796959587959595879594 |
:106D1000959587959093F1088093F00880910001F4 |
:106D20008A3009F066C08091090490910A04835F5B |
:106D3000934034F088E592E0909300098093FF0837 |
:106D40008091090490910A048A5F934034F080E2B4 |
:106D500093E0909300098093FF088091090490913B |
:106D60000A040F9734F488EA9DEF9093000980930A |
:106D7000FF088091090490910A04079734F480EE8B |
:106D80009CEF909300098093FF0880910B049091F1 |
:106D90000C04835F934034F088E592E09093F1080F |
:106DA0008093F00880910B0490910C048A5F9340CB |
:106DB00034F080E293E09093F1088093F0088091A2 |
:106DC0000B0490910C040F9734F488EA9DEF909394 |
:106DD000F1088093F00880910B0490910C040797C0 |
:106DE0000CF06BC080EE9CEF9093F1088093F0085C |
:106DF00064C08091090490910A04815D974034F049 |
:106E000080EB94E0909300098093FF08809109043F |
:106E100090910A04805E974034F080E496E090936D |
:106E200000098093FF088091090490910A040F974C |
:106E300034F480E59BEF909300098093FF088091E4 |
:106E4000090490910A04079734F480EC99EF909329 |
:106E500000098093FF0880910B0490910C04815DE0 |
:106E6000974034F080EB94E09093F1088093F00821 |
:106E700080910B0490910C04805E974034F080E484 |
:106E800096E09093F1088093F00880910B04909124 |
:106E90000C040F9734F480E59BEF9093F1088093F6 |
:106EA000F00880910B0490910C04079734F480EC67 |
:106EB00099EF9093F1088093F0088091B2038823B2 |
:106EC00009F4DFC04091FF08509100098091050549 |
:106ED000909106059A01281B390B309304052093E5 |
:106EE00003058091FD049091FE0490930605809324 |
:106EF00005055093FE044093FD04213831053CF014 |
:106F000080E890E090930405809303050DC0809184 |
:106F100003059091040580589F4F34F480E89FEF5B |
:106F200090930405809303058091030590910405D7 |
:106F3000181619062CF40197909304058093030505 |
:106F4000809103059091040599232CF40196909368 |
:106F50000405809303058091B203282F3327809185 |
:106F6000030590910405289FA001299F500D389F8B |
:106F7000500D11249A01552314F4215F3F4F35958C |
:106F800027953595279535952795359527958091A2 |
:106F9000FF0890910009820F931F9093000980933E |
:106FA000FF084091F0085091F108809107059091F9 |
:106FB00008059A01281B390B30930205209301051F |
:106FC0008091FF0490910005909308058093070538 |
:106FD000509300054093FF04213831053CF080E8D0 |
:106FE00090E090930205809301050DC0809101050A |
:106FF0009091020580589F4F34F480E89FEF909362 |
:1070000002058093010580910105909102051816F3 |
:1070100019062CF401979093020580930105809145 |
:1070200001059091020599232CF401969093020595 |
:10703000809301058091B203282F332780910105A9 |
:1070400090910205289FA001299F500D389F500D57 |
:1070500011249A01552314F4215F3F4FC9019595DE |
:107060008795959587959595879595958795209181 |
:10707000F0083091F108820F931F9093F1088093EC |
:10708000F0088091020990910309181619068CF5F1 |
:1070900080918B0890918C0899231CF49095819590 |
:1070A0009F4FAA2797FDA095BA2F2091BB033327A6 |
:1070B00044275527BC01CD010E94E468992324F49C |
:1070C000615C7F4F8F4F9F4FDC01CB01689415F8B7 |
:1070D000B595A795979587951694D1F72091FD08BA |
:1070E0003091FE08820F931F9093FE088093FD0855 |
:1070F00030C080918B0890918C0899231CF4909556 |
:1071000081959F4FAA2797FDA095BA2F2091BB0389 |
:10711000332744275527BC01CD010E94E4689923F9 |
:1071200024F4615C7F4F8F4F9F4FDC01CB0168944B |
:1071300015F8B595A795979587951694D1F7209151 |
:10714000FD083091FE08281B390B3093FE08209370 |
:10715000FD0880910C0990910D09181619068CF5FF |
:1071600080918F089091900899231CF490958195B7 |
:107170009F4FAA2797FDA095BA2F2091BB033327D5 |
:1071800044275527BC01CD010E94E468992324F4CB |
:10719000615C7F4F8F4F9F4FDC01CB01689415F8E6 |
:1071A000B595A795979587951694D1F72091F208F4 |
:1071B0003091F308820F931F9093F3088093F208A5 |
:1071C00030C080918F089091900899231CF490957D |
:1071D00081959F4FAA2797FDA095BA2F2091BB03B9 |
:1071E000332744275527BC01CD010E94E468992329 |
:1071F00024F4615C7F4F8F4F9F4FDC01CB0168947B |
:1072000015F8B595A795979587951694D1F7209180 |
:10721000F2083091F308281B390B3093F3082093C0 |
:10722000F2088091990888230CF05CC08091CE040C |
:10723000882309F057C08091CF04882309F052C0F9 |
:1072400020910C0930910D0951E0213035076CF087 |
:107250008091FF0890910009820F931F8050914008 |
:10726000909300098093FF0814C020910C0930917D |
:107270000D098FEF2030380764F48091FF0890915A |
:107280000009820F931F80509F4F909300098093B5 |
:10729000FF08209102093091030941E021303407B1 |
:1072A0006CF08091F0089091F108820F931F80504C |
:1072B00091409093F1088093F00814C02091020946 |
:1072C000309103095FEF2030350764F48091F008B6 |
:1072D0009091F108820F931F80509F4F9093F10877 |
:1072E0008093F008809195089927880F991FFC01D9 |
:1072F000E15AF74F8081918182599F4F2091A804D4 |
:107300003091A904281739073CF4C90101969093DC |
:10731000A9048093A8041CC0809195089927880F20 |
:10732000991FFC01E15AF74F8081918182599F4F4B |
:107330002091A8043091A904821793074CF42115D9 |
:10734000310531F0C90101979093A9048093A804F5 |
:10735000809196089927880F991FFC01E15AF74FF1 |
:107360008081918182599F4F2091AA043091AB0472 |
:10737000281739073CF4C90101969093AB04809318 |
:10738000AA041CC0809196089927880F991FFC01B8 |
:10739000E15AF74F8081918182599F4F2091AA0431 |
:1073A0003091AB04821793074CF42115310531F06D |
:1073B000C90101979093AB048093AA048091970828 |
:1073C0009927880F991FFC01E15AF74F808191811D |
:1073D00082599F4F2091AC043091AD042817390792 |
:1073E0003CF4C90101969093AD048093AC041CC099 |
:1073F000809197089927880F991FFC01E15AF74F50 |
:107400008081918182599F4F2091AC043091AD04CD |
:10741000821793074CF42115310531F0C90101970A |
:107420009093AD048093AC04809198089927880FBD |
:10743000991FFC01E15AF74F8081918182599F4F3A |
:107440002091AE043091AF04281739073CF4C901EC |
:1074500001969093AF048093AE041CC0809198086D |
:107460009927880F991FFC01E15AF74F808191817C |
:1074700082599F4F2091AE043091AF048217930739 |
:107480004CF42115310531F0C90101979093AF04F7 |
:107490008093AE048091A8049091A90499232CF4C0 |
:1074A0001092A9041092A8040EC08091A804909193 |
:1074B000A9048F3F910539F034F08FEF90E090935D |
:1074C000A9048093A8048091AA049091AB04992305 |
:1074D0002CF41092AB041092AA040EC08091AA045E |
:1074E0009091AB048F3F910539F034F08FEF90E02D |
:1074F0009093AB048093AA048091AC049091AD0466 |
:1075000099232CF41092AD041092AC040EC080911B |
:10751000AC049091AD048F3F910539F034F08FEFBA |
:1075200090E09093AD048093AC048091AE04909170 |
:10753000AF0499232CF41092AF041092AE040EC045 |
:107540008091AE049091AF048F3F910539F034F0F3 |
:107550008FEF90E09093AF048093AE04DF91CF91D2 |
:107560001F910F91FF90EF90DF90CF90BF90AF9061 |
:107570000895EF92FF920F931F93809100018D3039 |
:1075800011F40E94581A10927A0080910904909187 |
:107590000A04909300098093FF0880910B04909156 |
:1075A0000C049093F1088093F00880910D04909161 |
:1075B0000E0490935609809355098091110490917F |
:1075C00012049C01442737FD4095542FDA01C9016C |
:1075D000880F991FAA1FBB1F880F991FAA1FBB1FC7 |
:1075E000820F931FA41FB51F820F931FA41FB51FE7 |
:1075F000909345098093440980910F049091100461 |
:107600009C01442737FD4095542FDA01C901880FAA |
:10761000991FAA1FBB1F880F991FAA1FBB1F820F8C |
:10762000931FA41FB51F820F931FA41FB51F909314 |
:1076300061098093600980911304909114049093E0 |
:107640000B0980930A098FEC80937A00809195084A |
:107650009927880F991FFC01E15AF74F808191818A |
:1076600082599F4F2091A8043091A9042817390707 |
:107670003CF4C90101969093A9048093A8041CC00E |
:10768000809195089927880F991FFC01E15AF74FBF |
:107690008081918182599F4F2091A8043091A90443 |
:1076A000821793074CF42115310531F0C901019778 |
:1076B0009093A9048093A804809196089927880F35 |
:1076C000991FFC01E15AF74F8081918182599F4FA8 |
:1076D0002091AA043091AB04281739073CF4C90162 |
:1076E00001969093AB048093AA041CC080919608E5 |
:1076F0009927880F991FFC01E15AF74F80819181EA |
:1077000082599F4F2091AA043091AB0482179307AE |
:107710004CF42115310531F0C90101979093AB0468 |
:107720008093AA04809197089927880F991FFC01DC |
:10773000E15AF74F8081918182599F4F2091AC048B |
:107740003091AD04281739073CF4C9010196909394 |
:10775000AD048093AC041CC0809197089927880FD2 |
:10776000991FFC01E15AF74F8081918182599F4F07 |
:107770002091AC043091AD04821793074CF421158D |
:10778000310531F0C90101979093AD048093AC04A9 |
:10779000809198089927880F991FFC01E15AF74FAB |
:1077A0008081918182599F4F2091AE043091AF0426 |
:1077B000281739073CF4C90101969093AF048093D0 |
:1077C000AE041CC0809198089927880F991FFC016E |
:1077D000E15AF74F8081918182599F4F2091AE04E9 |
:1077E0003091AF04821793074CF42115310531F025 |
:1077F000C90101979093AF048093AE048091A804CF |
:107800009091A90499232CF41092A9041092A80431 |
:107810000EC08091A8049091A9048F3F910539F082 |
:1078200034F08FEF90E09093A9048093A8048091A6 |
:10783000AA049091AB0499232CF41092AB041092FB |
:10784000AA040EC08091AA049091AB048F3F9105C9 |
:1078500039F034F08FEF90E09093AB048093AA045A |
:107860008091AC049091AD0499232CF41092AD0456 |
:107870001092AC040EC08091AC049091AD048F3F87 |
:10788000910539F034F08FEF90E09093AD04809340 |
:10789000AC048091AE049091AF0499232CF4109223 |
:1078A000AF041092AE040EC08091AE049091AF046C |
:1078B0008F3F910539F034F08FEF90E09093AF0453 |
:1078C0008093AE048091BE089927AA27BB270F2E6C |
:1078D000F4ECEF2EF9E0FF2EF0E00F2FF0E01F2F79 |
:1078E000F02DBC01CD01A80197010E94E468DC01E4 |
:1078F000CB018093A1039093A203A093A303B09321 |
:10790000A4038091BF089927AA27BB27BC01CD01FA |
:107910000E94E468DC01CB018093A5039093A60349 |
:10792000A093A703B093A8031F910F91FF90EF902E |
:1079300008959091B904992349F58091EC048C7FC6 |
:107940008093EC04292F46E157E067E479E08091C9 |
:10795000E003882321F4FA01E20FF11D8083822FD6 |
:107960009927DC01A60FB71FFC01E40FF51F8081EA |
:107970008C932F5F2C3058F38091E003882359F0CB |
:107980008091E00381508093E00305C08091EC0476 |
:1079900081608093EC048091470999279093EC07CC |
:1079A0008093EB078091480999279093EE07809385 |
:1079B000ED0780914A0999279093F0078093EF078C |
:1079C0008091490999279093F2078093F1071092CB |
:1079D0003F04109240040E946027089580919C0803 |
:1079E0008B3F10F18B3F29F48091A8048093AE0364 |
:1079F0001FC080919C088C3F29F48091AA04809339 |
:107A0000AE0316C080919C088D3F29F48091AC0490 |
:107A10008093AE030DC080919C088E3F49F4809105 |
:107A2000AE048093AE0304C080919C088093AE03A3 |
:107A300080919B088B3F10F18B3F29F48091A80423 |
:107A40008093AD031FC080919B088C3F29F48091E7 |
:107A5000AA048093AD0316C080919B088D3F29F442 |
:107A60008091AC048093AD030DC080919B088E3F44 |
:107A700049F48091AE048093AD0304C080919B08CB |
:107A80008093AD038091AD03882339F08091AD03DD |
:107A9000843618F084E68093AD0380919D088B3F77 |
:107AA00010F18B3F29F48091A8048093AF031FC08D |
:107AB00080919D088C3F29F48091AA048093AF03A4 |
:107AC00016C080919D088D3F29F48091AC0480936D |
:107AD000AF030DC080919D088E3F49F48091AE04A4 |
:107AE0008093AF0304C080919D088093AF03809181 |
:107AF000AF03882339F08091AF03843618F084E611 |
:107B00008093AF0380919F088B3F10F18B3F29F446 |
:107B10008091A8048093B0031FC080919F088C3F80 |
:107B200029F48091AA048093B00316C080919F0825 |
:107B30008D3F29F48091AC048093B0030DC08091F7 |
:107B40009F088E3F49F48091AE048093B00304C037 |
:107B500080919F088093B0038091A6088B3F10F11D |
:107B60008B3F29F48091A8048093B1031FC08091BA |
:107B7000A6088C3F29F48091AA048093B10316C013 |
:107B80008091A6088D3F29F48091AC048093B103C5 |
:107B90000DC08091A6088E3F49F48091AE04809379 |
:107BA000B10304C08091A6088093B1038091A70817 |
:107BB0008B3F10F18B3F29F48091A8048093B3038D |
:107BC0001FC08091A7088C3F29F48091AA0480935C |
:107BD000B30316C08091A7088D3F29F48091AC04AF |
:107BE0008093B3030DC08091A7088E3F49F4809124 |
:107BF000AE048093B30304C08091A7088093B303BD |
:107C00008091B3038B3018F48AE08093B3038091A2 |
:107C1000A8088B3F10F18B3F29F48091A804809332 |
:107C2000B4031FC08091A8088C3F29F48091AA0456 |
:107C30008093B40316C08091A8088D3F29F48091E9 |
:107C4000AC048093B4030DC08091A8088E3F49F422 |
:107C50008091AE048093B40304C08091A8088093FF |
:107C6000B4038091A9088B3F10F18B3F29F48091D8 |
:107C7000A8048093B2031FC08091A9088C3F29F407 |
:107C80008091AA048093B20316C08091A9088D3F09 |
:107C900029F48091AC048093B2030DC08091A908AF |
:107CA0008E3F49F48091AE048093B20304C080916A |
:107CB000A9088093B2038091AE088B3F10F18B3FEF |
:107CC00029F48091A8048093B6031FC08091AE0868 |
:107CD0008C3F29F48091AA048093B60316C080914A |
:107CE000AE088D3F29F48091AC048093B6030DC09B |
:107CF0008091AE088E3F49F48091AE048093B60324 |
:107D000004C08091AE088093B6038091AF088B3F8A |
:107D100010F18B3F29F48091A8048093D4041FC0F4 |
:107D20008091AF088C3F29F48091AA048093D404F9 |
:107D300016C08091AF088D3F29F48091AC048093E8 |
:107D4000D4040DC08091AF088E3F49F48091AE04F9 |
:107D50008093D40404C08091AF088093D4048091B0 |
:107D6000B0088B3F10F18B3F29F48091A8048093D9 |
:107D7000D5041FC08091B0088C3F29F48091AA04DB |
:107D80008093D50416C08091B0088D3F29F480916E |
:107D9000AC048093D5040DC08091B0088E3F49F4A7 |
:107DA0008091AE048093D50404C08091B008809384 |
:107DB000D5048091B1088B3F10F18B3F29F480915D |
:107DC000A8048093D6041FC08091B1088C3F29F489 |
:107DD0008091AA048093D60416C08091B1088D3F8B |
:107DE00029F48091AC048093D6040DC08091B10831 |
:107DF0008E3F49F48091AE048093D60404C08091F4 |
:107E0000B1088093D6048091B2088B3F10F18B3F6C |
:107E100029F48091A8048093D7041FC08091B208F0 |
:107E20008C3F29F48091AA048093D70416C08091D6 |
:107E3000B2088D3F29F48091AC048093D7040DC023 |
:107E40008091B2088E3F49F48091AE048093D704AC |
:107E500004C08091B2088093D7048091C3088B3FFF |
:107E600010F18B3F29F48091A8048093D8041FC09F |
:107E70008091C3088C3F29F48091AA048093D80490 |
:107E800016C08091C3088D3F29F48091AC04809383 |
:107E9000D8040DC08091C3088E3F49F48091AE0490 |
:107EA0008093D80404C08091C3088093D804809143 |
:107EB000C4088B3F10F18B3F29F48091A804809374 |
:107EC000D9041FC08091C4088C3F29F48091AA0472 |
:107ED0008093D90416C08091C4088D3F29F4809105 |
:107EE000AC048093D9040DC08091C4088E3F49F43E |
:107EF0008091AE048093D90404C08091C40880931B |
:107F0000D9048091C5088B3F10F18B3F29F48091F3 |
:107F1000A8048093DA041FC08091C5088C3F29F41F |
:107F20008091AA048093DA0416C08091C5088D3F21 |
:107F300029F48091AC048093DA040DC08091C508C7 |
:107F40008E3F49F48091AE048093DA0404C080919E |
:107F5000C5088093DA048091C6088B3F10F18B3FEF |
:107F600029F48091A8048093DB041FC08091C60887 |
:107F70008C3F29F48091AA048093DB0416C0809181 |
:107F8000C6088D3F29F48091AC048093DB040DC0BA |
:107F90008091C6088E3F49F48091AE048093DB0443 |
:107FA00004C08091C6088093DB048091B3088B3FA6 |
:107FB00010F18B3F29F48091A8048093B7031FC070 |
:107FC0008091B3088C3F29F48091AA048093B70371 |
:107FD00016C08091B3088D3F29F48091AC04809342 |
:107FE000B7030DC08091B3088E3F49F48091AE0471 |
:107FF0008093B70304C08091B3088093B703809146 |
:10800000B8088B3F10F18B3F29F48091A80480932E |
:10801000B8031FC08091B8088C3F29F48091AA044E |
:108020008093B80316C08091B8088D3F29F48091E1 |
:10803000AC048093B8030DC08091B8088E3F49F41A |
:108040008091AE048093B80304C08091B8088093F7 |
:10805000B8038091BB088B3F10F18B3F29F48091CE |
:10806000A8048093B9031FC08091BB088C3F29F4FA |
:108070008091AA048093B90316C08091BB088D3FFC |
:1080800029F48091AC048093B9030DC08091BB08A2 |
:108090008E3F49F48091AE048093B90304C080916F |
:1080A000BB088093B9038091BC088B3F10F18B3FD4 |
:1080B00029F48091A8048093BA031FC08091BC0862 |
:1080C0008C3F29F48091AA048093BA0316C0809152 |
:1080D000BC088D3F29F48091AC048093BA030DC095 |
:1080E0008091BC088E3F49F48091AE048093BA031E |
:1080F00004C08091BC088093BA038091BD088B3F77 |
:1081000010F18B3F29F48091A8048093BB031FC01A |
:108110008091BD088C3F29F48091AA048093BB0311 |
:1081200016C08091BD088D3F29F48091AC048093E6 |
:10813000BB030DC08091BD088E3F49F48091AE0411 |
:108140008093BB0304C08091BD088093BB038091E2 |
:10815000C2088B3F10F18B3F29F48091A8048093D3 |
:10816000BC031FC08091C2088C3F29F48091AA04EF |
:108170008093BC0316C08091C2088D3F29F4809182 |
:10818000AC048093BC030DC08091C2088E3F49F4BB |
:108190008091AE048093BC0304C08091C208809398 |
:1081A000BC038091C8088B3F10F18B3F29F480916C |
:1081B000A804809318091FC08091C8088C3F29F437 |
:1081C0008091AA048093180916C08091C8088D3F39 |
:1081D00029F48091AC04809318090DC08091C808DF |
:1081E0008E3F49F48091AE048093180904C08091B9 |
:1081F000C8088093180980911809823018F481E02A |
:10820000809318098091CA088B3F10F18B3F29F4A5 |
:108210008091A804809353091FC08091CA088C3FA5 |
:1082200029F48091AA048093530916C08091CA084A |
:108230008D3F29F48091AC04809353090DC0809147 |
:10824000CA088E3F49F48091AE048093530904C05C |
:108250008091CA088093530980915309823018F4A1 |
:1082600081E0809353098091DB088B3F10F18B3FB5 |
:1082700029F48091A804809365091FC08091DB08D0 |
:108280008C3F29F48091AA048093650916C08091DF |
:10829000DB088D3F29F48091AC04809365090DC003 |
:1082A0008091DB088E3F49F48091AE04809365098C |
:1082B00004C08091DB08809365098091B6039927FB |
:1082C0009C012F5F3F4FECE3F8E2CF01B9010E9420 |
:1082D00023697093AA036093A9038091D4048D3815 |
:1082E00078F08091D50499279C012F5F3F4FCF01F3 |
:1082F000B9010E9423697093AC036093AB0308C07B |
:108300008091A9039091AA039093AC038093AB034F |
:108310008091CB088093FC0880912109882311F477 |
:108320008093FC088091A408809354098091A3084D |
:108330008093040908952F923F924F925F926F921B |
:108340007F928F929F92AF92BF92CF92DF92EF92E5 |
:10835000FF920F931F93CF93DF93CDB7DEB72C9788 |
:108360000FB6F894DEBF0FBECDBF0E941D308091C6 |
:1083700000018C3010F4299A01C029982091B7048B |
:108380003091B8043A8329838091040999270A9689 |
:108390002817390714F49A8389838091B0048436AE |
:1083A00008F071C080910D01882399F48091110328 |
:1083B000909112038F5F9F4F61F488E99AE3909345 |
:1083C000F1038093F00380E09CE09093120380938C |
:1083D000110380912D0590912E05009731F00197A2 |
:1083E00090932E0580932D0504C01092B90410922D |
:1083F000A004809100018A3011F0843111F4289A90 |
:1084000001C028988091EA049091EB04895E934022 |
:10841000B8F18091AB08682F77277A83698381E070 |
:108420008093A00480919108992725E738E0AC015A |
:10843000480F591FFA01E20FF31F11821082809139 |
:1084400092089927880F991FFC01E20FF31F1182F0 |
:1084500010822FE538E0FA01E20FF31F118210823B |
:10846000FC01E20FF31F118210828091940899277A |
:10847000880F991FFC01E20FF31F11821082EFC2D7 |
:108480001092B904ECC28091B0048D3808F4E7C2B0 |
:108490001092A0049091AC0882E3989FC00111242F |
:1084A00090932E0580932D0589819A8189978CF070 |
:1084B0008091B904882369F08091EA049091EB04DB |
:1084C000AFEF8F3F9A0729F001969093EB048093CA |
:1084D000EA048091EA049091EB048F3F910509F042 |
:1084E00038F51092090510920A0510920B051092AA |
:1084F0000C0510920D0510920E0510920F051092AA |
:1085000010058A3F9105C9F481E0809335051092EA |
:10851000190510921A0510921B0510921C05109255 |
:108520008E0410928F04109290041092910405C052 |
:108530008091EC0482608093EC04809193089927E9 |
:108540002FE538E0880F991FFC01E20FF31F8081AF |
:108550009181813591050CF4A8C18091B9048823DB |
:1085600009F0A3C1809194089927880F991FFC01F5 |
:10857000E20FF31F808191818C3491050CF416C1B8 |
:1085800080912F058F5F80932F05893C08F48DC162 |
:10859000809100018C3010F4299801C0299A109222 |
:1085A000B90410922F051092EB041092EA04809106 |
:1085B000910899272FE538E0880F991FFC01E20FF9 |
:1085C000F31F8081918187349105A4F480919208F2 |
:1085D0009927880F991FFC01E20FF31F0190F0818A |
:1085E000E02DFF231CF4F095E195FF4FE734F105F2 |
:1085F0000CF491C041E08091920899272FE538E072 |
:10860000880F991FFC01E20FF31F8081918187344D |
:10861000910554F0809191089927880F991FFC01CA |
:10862000E20FF31F808191818091920899272FE5B5 |
:1086300038E0880F991FFC01E20FF31F80819181C0 |
:108640008734910574F0809191089927880F991FBC |
:10865000FC01E20FF31F80819181873491050CF0BA |
:1086600042E08091920899272FE538E0880F991F02 |
:10867000FC01E20FF31F808191818634910574F42F |
:10868000809191089927880F991FFC01E20FF31F31 |
:1086900080819181873491050CF043E080919208AC |
:1086A00099272FE538E0880F991FFC01E20FF31F8F |
:1086B000808191818A5B9F4F74F480919108992702 |
:1086C000880F991FFC01E20FF31F8081918187348D |
:1086D00091050CF044E08091920899272FE538E04D |
:1086E000880F991FFC01E20FF31F808191818A5B43 |
:1086F0009F4F74F4809191089927880F991FFC016E |
:10870000E20FF31F80819181863491050CF445E0DE |
:10871000842F0E941505809192089927880F991F30 |
:10872000FC01E15AF74F0190F081E02DFF231CF48A |
:10873000F095E195FF4F7E97BCF4809191089927C1 |
:10874000880F991FFC01E15AF74F808191818A5B64 |
:108750009F4F54F481E080932C0788EE93E0909330 |
:10876000F1038093F003A1C00E9403054DE561E988 |
:1087700078E00E94AA048091990880FF10C080913F |
:10878000220390912303875B934038F48091220366 |
:10879000909123038E5E924010F40E940C1A0E9466 |
:1087A000832D0E9403050E94682D7FC0809194084C |
:1087B0009927880F991FFC01E15AF74F8081918119 |
:1087C000855B9F4F0CF06FC080912F058F5F80936A |
:1087D0002F05893C08F469C0809100018C3010F4A9 |
:1087E000299801C0299AA4E0B0E08FEF082E0E94DA |
:1087F00080691092B90410922F051092EB04109228 |
:10880000EA040E94832DA4E0B0E08091520490918C |
:108810005304992314F481509F4F892F990F990B7A |
:10882000082E0E948069A5E0B0E0809152049091EA |
:108830005304082E0E948069A6E0B0E080915404A1 |
:1088400090915504992314F481509F4F892F990FCB |
:10885000990B082E0E948069A7E0B0E08091540433 |
:1088600090915504082E0E948069A8E0B0E08091A4 |
:10887000580490915904992314F481509F4F892FE3 |
:10888000990F990B082E0E948069A9E0B0E08091B1 |
:10889000580490915904082E0E9480690E94030593 |
:1088A0000E94682D02C010922F058091930899278D |
:1088B0002FE538E0880F991FFC01E20FF31F80813C |
:1088C00091818B5A9F4F0CF0CAC0809194089927D0 |
:1088D000880F991FFC01E20FF31F80819181855B56 |
:1088E0009F4F0CF09AC0809130058F5F80933005C8 |
:1088F000893C08F494C088EC8093300581E090E0D6 |
:108900009093EB048093EA0481E08093B904109281 |
:10891000190510921A0510921B0510921C05109251 |
:108920008E0410928F041092900410929104109271 |
:1089300092041092930410929404109295048091E2 |
:10894000A508A82EBB24CC24DD2480914409909155 |
:1089500045099C01442737FD4095542FC601B501B8 |
:108960000E94E468DC01CB0180937E0490937F0435 |
:10897000A0938004B0938104809160099091610973 |
:108980009C01442737FD4095542FC601B5010E9434 |
:10899000E468DC01CB018093860490938704A09364 |
:1089A0008804B093890480915E0490915F04A09143 |
:1089B0006004B09161048093820490938304A09337 |
:1089C0008404B09385048091660490916704A0911B |
:1089D0006804B091690480938A0490938B04A093F7 |
:1089E0008C04B0938D041092090510920A05109220 |
:1089F0000B0510920C0510920D0510920E051092A9 |
:108A00000F0510921005109264091092630980916D |
:108A1000EC0488608093EC0402C0109230058091D1 |
:108A200094089927880F991FFC01E15AF74F80811C |
:108A300091818C3491058CF0809131058F5F80930A |
:108A40003105893C60F01092B90488EC80933105BF |
:108A50001092EB041092EA0402C01092310580914A |
:108A60008303815080938303809183038F3F29F098 |
:108A70008091A004882309F4D2C30E94EE3C809127 |
:108A8000D4048D3808F467C080913E0590913F056D |
:108A9000AC01440F551F480F591F80919108992729 |
:108AA000880F991FFC01E15AF74F8091D604282FB7 |
:108AB000332780819181289FD001299FB00D389F55 |
:108AC000B00D11249A012A0F3B1F8091E60490916A |
:108AD000E704281B390B12F42D5F3F4FC901959510 |
:108AE00087959595879590933F0580933E05809156 |
:108AF000400590914105AC01440F551F480F591F87 |
:108B0000809192089927880F991FFC01E15AF74F2D |
:108B10008091D604282F332780819181289FF001EE |
:108B2000299FF00D389FF00D11249A012E0F3F1F41 |
:108B30008091E8049091E904281B390B12F42D5F11 |
:108B40003F4FC901959587959595879590934105D8 |
:108B5000809340052DC080913E0590913F05AC016A |
:108B6000440F551F480F591F809191089927880F6E |
:108B7000991FFC01E15AF74F8091A008282F332755 |
:108B800080819181289FB001299F700D389F700DC1 |
:108B90001124460F571F552314F44D5F5F4FCA0130 |
:108BA000959587959595879590933F0580933E057C |
:108BB0008091400590914105AC01440F551F480F2D |
:108BC000591F809192089927880F991FFC01E15A3B |
:108BD000F74F8091A008282F332780819181289F0B |
:108BE000D001299FB00D389FB00D11244A0F5B1F93 |
:108BF000552314F44D5F5F4F7A01F594E794F59493 |
:108C0000E794F0924105E092400580912109882384 |
:108C100009F462C040913E0550913F055093E7042E |
:108C20004093E604F092E904E092E8048091910810 |
:108C3000992765E778E0880F991FFC01E60FF71F79 |
:108C40008091A108282F332780819181289FF001EE |
:108C5000299FF00D389FF00D1124DF01A40FB51FDF |
:108C6000B0933F05A0933E05809192089927880F05 |
:108C7000991FFC01E60FF71F80819181289FA001B9 |
:108C8000299F500D389F500D11244E0D5F1D50939C |
:108C90004105409340052091540530915505809140 |
:108CA000580590915905820F931FA81BB90BB093DB |
:108CB000B204A093B10420915605309157058091DC |
:108CC0005A0590915B05820F931F481B590B5093D7 |
:108CD000B4044093B30445C0809191089927A5E757 |
:108CE000B8E0880F991FFC01EA0FFB1F8091A108D3 |
:108CF000482F552780819181489F9001499F300DD1 |
:108D0000589F300D112480913E0590913F05B90187 |
:108D1000680F791F70933F0560933E05809192081C |
:108D20009927880F991FFC01EA0FFB1F8081918111 |
:108D3000489F9001499F300D589F300D112480911C |
:108D4000400590914105820F931F909341058093B8 |
:108D500040057093B2046093B1049093B40480937F |
:108D6000B304809194089927880F991FFC01E15A58 |
:108D7000F74F80819181909581959F4F9093B60494 |
:108D80008093B5048330910534F002979093B60434 |
:108D90008093B50412C08091B5049091B6045FEF42 |
:108DA0008E3F950734F402969093B6048093B504F1 |
:108DB00004C01092B6041092B504809193089927CC |
:108DC000880F991FFC01E15AF74F808191818C0136 |
:108DD00008581F4F1093B8040093B7048091B30351 |
:108DE0009927AA2797FDA095BA2FBC01CD010E9413 |
:108DF0008C68DC01CB0120E030E040E251E4BC01B2 |
:108E0000CD010E942D68DC01CB01BC01CD010E9487 |
:108E10006F68DC01CB0180935A092091B403209341 |
:108E200021098093F70820930E098091380780FF6D |
:108E300064C080916509813808F45FC08091310772 |
:108E4000282F332727FD30958091A008482F5527DC |
:108E5000249FB001259F700D349F700D11248091C7 |
:108E6000B1049091B204860F971F9093B20480933F |
:108E7000B10480913207992787FD9095849F9001D6 |
:108E8000859F300D949F300D11248091B3049091F3 |
:108E9000B404820F931F9093B4048093B304809121 |
:108EA0003307282F332727FD30958091B504909103 |
:108EB000B604820F931F9093B6048093B5048091FB |
:108EC0003507282F332727FD309580919E08992755 |
:108ED000289FD001299FB00D389FB00D1124B09369 |
:108EE000BE03A093BD038091340799278017910793 |
:108EF00024F49093B8048093B7048091B7049091C0 |
:108F0000B804992324F41092B8041092B704809105 |
:108F1000990882FD04C08091D4048D3810F010921D |
:108F200021098091B1049091B20499230CF4039625 |
:108F30009C01359527953595279533231CF430955D |
:108F400021953F4F8091E2049091E30482179307AB |
:108F5000F4F48091B1049091B20499231CF490959B |
:108F600081959F4F99230CF4039695958795959538 |
:108F700087959093E3048093E2048536910584F00D |
:108F800084E690E09093E3048093E20409C080912A |
:108F9000E2049091E30401979093E3048093E20448 |
:108FA0008091B3049091B40499230CF403969C012E |
:108FB000359527953595279533231CF430952195C4 |
:108FC0003F4F8091E4049091E50482179307F4F4F5 |
:108FD0008091B3049091B40499231CF490958195E9 |
:108FE0009F4F99230CF403969595879595958795B2 |
:108FF0009093E5048093E4048536910584F084E63B |
:1090000090E09093E5048093E40409C08091E40427 |
:109010009091E50401979093E5048093E404809196 |
:10902000A004882341F01092E3041092E20410920D |
:10903000E5041092E404809192089927880F991F03 |
:10904000FC01E15AF74F8091B908282F332780811E |
:1090500091812817390744F48091DC0882FF04C00D |
:1090600081E08093D00417C0809192089927880FDF |
:10907000991FFC01E15AF74F8091B9089927209177 |
:10908000BA08821B91099C01808191818217930704 |
:1090900014F41092D004809192089927880F991F98 |
:1090A000FC01E15AF74F8091B9089927222733270D |
:1090B000281B390B808191818217930744F480919A |
:1090C000DC0883FF04C081E08093D1041BC0809141 |
:1090D000D1048823B9F0809192089927880F991FAD |
:1090E000FC01E15AF74F8091BA0899272091B908FD |
:1090F000821B91099C01808191812817390714F402 |
:109100001092D104809191089927880F991FFC0132 |
:10911000E15AF74F8091B908282F33278081918138 |
:109120002817390744F48091DC0880FF04C081E0EF |
:109130008093D3041BC08091D3048823B9F080911D |
:1091400091089927880F991FFC01E15AF74F8091E8 |
:10915000B90899272091BA08821B91099C01808146 |
:1091600091818217930714F41092D304809191088F |
:109170009927880F991FFC01E15AF74F8091B90890 |
:10918000992722273327281B390B80819181821749 |
:10919000930744F48091DC0881FF04C081E0809350 |
:1091A000D2041BC08091D2048823B9F08091910829 |
:1091B0009927880F991FFC01E15AF74F8091BA084F |
:1091C00099272091B908821B91099C018081918186 |
:1091D0002817390714F41092D2048091D004882300 |
:1091E00021F48091D104882321F081E08093CF0481 |
:1091F00002C01092CF048091D304882321F480917F |
:10920000D204882351F081E08093CE041092CF04E1 |
:109210001092D0041092D10402C01092CE0480911A |
:10922000CF04882321F48091CE04882369F08091B3 |
:10923000B8089927E981FA818E179F0714F49A8359 |
:10924000898381E08093A2048091A0048823D1F0D7 |
:109250001092B6041092B5041092B2041092B104A8 |
:109260001092B4041092B3049AE590935A0988E7D7 |
:10927000809321099093F70880930E091092CF04F0 |
:109280001092CE04209112093091130940911409D3 |
:109290005091150980915E0490915F04A091600443 |
:1092A000B0916104820F931FA41FB51F8093120910 |
:1092B00090931309A0931409B093150920911909EB |
:1092C00030911A0940911B0950911C098091660444 |
:1092D00090916704A0916804B0916904820F931F74 |
:1092E000A41FB51F8093190990931A09A0931B0915 |
:1092F000B0931C0920910609309107094091080993 |
:10930000509109098091620490916304A0916404D2 |
:10931000B0916504820F931FA41FB51F80930609A7 |
:1093200090930709A0930809B09309092091F808C0 |
:109330003091F9084091FA085091FB0880916A0435 |
:1093400090916B04A0916C04B0916D04820F931FF7 |
:10935000A41FB51F8093F8089093F908A093FA080A |
:10936000B093FB088091CE04882349F48091CF0408 |
:10937000882329F480912109882309F080C0109264 |
:109380006E0410926F041092700410927104109287 |
:109390007204109273041092740410927504109267 |
:1093A00012091092130910921409109215091092C3 |
:1093B000190910921A0910921B0910921C09109297 |
:1093C00006091092070910920809109209091092D3 |
:1093D000F8081092F9081092FA081092FB081092FF |
:1093E0005E0410925F041092600410926104109267 |
:1093F0006604109267041092680410926904109237 |
:109400007E0410927F0410928004109281041092C6 |
:109410008604109287041092880410928904109296 |
:109420008E0410928F041092900410929104109266 |
:10943000920410929304109294041092950480E088 |
:1094400090E0A0E0B0E08093820490938304A09326 |
:109450008404B093850480938A0490938B04A09332 |
:109460008C04B0938D0410921A0410921904109277 |
:10947000CD041092CC041092CB041092CA048091B7 |
:10948000CE04882309F04AC28091CF04882309F0D2 |
:1094900045C28091170890911808815092402CF491 |
:1094A0008091B904882309F439C280912109882365 |
:1094B00009F434C25090C7092FEF521609F416C1AF |
:1094C0008091A508A82EBB24CC24DD2480915E04C5 |
:1094D00090915F04A0916004B0916104BC01CD0142 |
:1094E000A60195010E94586980914409909145090F |
:1094F000AA2797FDA095BA2F39014A01681A790A5F |
:109500008A0A9B0A8091660490916704A09168047E |
:10951000B0916904BC01CD01A60195010E94586972 |
:109520008091600990916109AA2797FDA095BA2FB3 |
:1095300059016A01A81AB90ACA0ADB0A252D33277C |
:1095400027FD3095432F532FC401B3010E94E468D7 |
:109550003B014C01DC01CB01992024F481509E4F4A |
:10956000AF4FBF4F3C014D01052E59E095948794B4 |
:10957000779467945A95D1F7502D8091C709282F79 |
:10958000332727FD3095432F532FC601B5010E9485 |
:10959000E4685B016C01DC01CB01DD2024F4815027 |
:1095A0009E4FAF4FBF4F5C016D01092E99E0D594DE |
:1095B000C794B794A7949A95D1F7902D8091E2041F |
:1095C0009091E304813491053CF48091E4049091FE |
:1095D000E50481349105D4F0D401C30199201CF431 |
:1095E0000196A11DB11D3C014D019594879477947E |
:1095F0006794D601C501DD201CF40196A11DB11DA3 |
:109600005C016D01D594C794B794A7948091940898 |
:109610009927880F991FFC01E15AF74F0190F081BB |
:10962000E02DFF231CF4F095E195FF4F7A97D4F0DD |
:109630000F2EF3E02F2EF0E03F2EF0E04F2EF0E063 |
:109640005F2EF02DC401B301A20191010E9458695F |
:1096500039014A01C601B501A20191010E94586970 |
:1096600059016A018091C909992787FD9095A92F11 |
:10967000B92F86159705A805B90514F43C014D01CD |
:109680008091C909992787FD9095909581959F4F65 |
:10969000AA2797FDA095BA2F681679068A069B0619 |
:1096A00014F43C014D018091C909992787FD9095DB |
:1096B000A92FB92F8A159B05AC05BD0514F45C01D3 |
:1096C0006D018091C909992787FD909590958195A5 |
:1096D0009F4FAA2797FDA095BA2FA816B906CA06CC |
:1096E000DB060CF0F3C05C016D01F0C08091A508B1 |
:1096F000A82EBB24CC24DD2480915E0490915F04CD |
:10970000A0916004B0916104BC01CD01A601950156 |
:109710000E9458698091440990914509AA2797FDB4 |
:10972000A095BA2F39014A01681A790A8A0A9B0A58 |
:109730008091660490916704A0916804B0916904D7 |
:10974000BC01CD01A60195010E9458698091600974 |
:1097500090916109AA2797FDA095BA2F59016A0136 |
:10976000A81AB90ACA0ADB0AD401C30199201CF459 |
:109770000F96A11DB11D3C014D01689413F89594FD |
:109780008794779467941694D1F7D601C501DD20AC |
:109790001CF40F96A11DB11D5C016D01689413F8B6 |
:1097A000D594C794B794A7941694D1F78091E20406 |
:1097B0009091E304813491053CF48091E40490910C |
:1097C000E50481349105D4F00F2EF3E02F2EF0E064 |
:1097D0003F2EF0E04F2EF0E05F2EF02DC401B301DC |
:1097E000A20191010E94586939014A01C601B501DF |
:1097F000A20191010E94586959016A01809194085F |
:109800009927880F991FFC01E15AF74F0190F081C9 |
:10981000E02DFF231CF4F095E195FF4F7A97D4F0EB |
:109820000F2EF3E02F2EF0E03F2EF0E04F2EF0E071 |
:109830005F2EF02DC401B301A20191010E9458696D |
:1098400039014A01C601B501A20191010E9458697E |
:1098500059016A0131E263167104810491042CF00C |
:10986000662477244301689465F840EE64164FEF50 |
:1098700074064FEF84064FEF940654F40F2EF0EE6B |
:109880006F2EFFEF7F2EFFEF8F2EFFEF9F2EF02D1D |
:1098900051E2A516B104C104D1042CF0AA24BB24C2 |
:1098A00065016894A5F860EEA6166FEFB6066FEF37 |
:1098B000C6066FEFD60654F40F2EF0EEAF2EFFEF74 |
:1098C000BF2EFFEFCF2EFFEFDF2EF02D80917E0415 |
:1098D00090917F04A0918004B0918104861997092A |
:1098E000A809B90980937E0490937F04A093800413 |
:1098F000B09381048091860490918704A09188049C |
:10990000B09189048A199B09AC09BD09809386042A |
:1099100090938704A0938804B093890480911904DC |
:1099200090911A048F3F910509F008F462C6809166 |
:10993000CE04882309F0EBC58091CF04882309F079 |
:10994000E6C58091A204882309F0E1C58091C10891 |
:10995000882309F4DCC580912109882309F4D7C53F |
:109960008091120990911309A0911409B0911509E1 |
:10997000BB2324F481509F4FAF4FBF4F892F9A2FA5 |
:10998000AB2FBB27A7FDBA958093120990931309BB |
:10999000A0931409B09315098091190990911A099F |
:1099A000A0911B09B0911C09BB2324F481509F4F47 |
:1099B000AF4FBF4F892F9A2FAB2FBB27A7FDBA956B |
:1099C0008093190990931A09A0931B09B0931C095D |
:1099D0008091A5089927AA27BB2720916E04309172 |
:1099E0006F044091700450917104BC01CD010E943C |
:1099F000E468992324F461507F4F8F4F9F4FBB271A |
:109A000097FDBA95A92F982F872F80936E04909376 |
:109A10006F04A0937004B09371048091A5089927F6 |
:109A2000AA27BB27209172043091730440917404DB |
:109A300050917504BC01CD010E94E468992324F47F |
:109A400061507F4F8F4F9F4FBB2797FDBA95A92F2E |
:109A5000982F872F8093720490937304A0937404BB |
:109A6000B09375048091760490917704A091780466 |
:109A7000B0917904BB2324F481509F4FAF4FBF4F67 |
:109A8000892F9A2FAB2FBB27A7FDBA958093760419 |
:109A900090937704A0937804B093790420911209ED |
:109AA00030911309409114095091150980916E0469 |
:109AB00090916F04A0917004B0917104281B390B30 |
:109AC0004A0B5B0BDA01C90120932505309326056B |
:109AD00040932705509328052091C008622E7724D3 |
:109AE00088249924BC01CD01A40193010E945869E6 |
:109AF00059016A01209336053093370540933805A4 |
:109B0000509339052091190930911A0940911B0988 |
:109B100050911C098091720490917304A091740477 |
:109B2000B0917504281B390B4A0B5B0B2093290558 |
:109B300030932A0540932B0550932C05CA01B90197 |
:109B4000A40193010E94586920933A0530933B0584 |
:109B500040933C0550933D05D601C501DD2024F41A |
:109B600081509F4FAF4FBF4F892F9A2FAB2FBB27ED |
:109B7000A7FDBA959093CD048093CC0480913A05CB |
:109B800090913B05A0913C05B0913D05BB2324F489 |
:109B900081509F4FAF4FBF4F892F9A2FAB2FBB27BD |
:109BA000A7FDBA959093CB048093CA048091E204F8 |
:109BB0009091E30481349105CCF48091E404909178 |
:109BC000E5048134910594F4809194089927880FD5 |
:109BD000991FFC01E15AF74F0190F081E02DFF231E |
:109BE0001CF4F095E195FF4F7A97F4F08091C70946 |
:109BF0008F3FD1F48091CC049091CD0499230CF443 |
:109C00000196959587959093CD048093CC0480918F |
:109C1000CA049091CB0499230CF4019695958795ED |
:109C20009093CB048093CA04809106099091070910 |
:109C3000A0910809B0910909BB2324F481509F4FDA |
:109C4000AF4FBF4F892F9A2FAB2FBB27A7FDBA95D8 |
:109C50008093060990930709A0930809B093090916 |
:109C60008091F8089091F908A091FA08B091FB084A |
:109C7000BB2324F481509F4FAF4FBF4F892F9A2FA2 |
:109C8000AB2FBB27A7FDBA958093F8089093F908EE |
:109C9000A093FA08B093FB0820916204309163040A |
:109CA000409164045091650480915E0490915F043A |
:109CB000A0916004B091610459016A01A81AB90A1F |
:109CC000CA0ADB0AA0921D05B0921E05C0921F05AC |
:109CD000D092200520916A0430916B0440916C046D |
:109CE00050916D048091660490916704A09168047E |
:109CF000B0916904281B390B4A0B5B0B209321059B |
:109D0000309322054093230550932405A092250506 |
:109D1000B0922605C0922705D092280520932905E8 |
:109D200030932A0540932B0550932C058091820493 |
:109D300090918304A0918404B09185048A199B09B1 |
:109D4000AC09BD098093820490938304A09384049A |
:109D5000B093850480918A0490918B04A0918C0427 |
:109D6000B0918D04821B930BA40BB50B80938A04D6 |
:109D700090938B04A0938C04B0938D048091C108C0 |
:109D8000882391F18091A6049091A70481389105D0 |
:109D900094F080914C0490914D04019690934D0461 |
:109DA00080934C0480911F09909120090196909313 |
:109DB000200980931F098091A6049091A7048058E0 |
:109DC0009F4F94F480914C0490914D04019790938F |
:109DD0004D0480934C0480911F09909120090197B4 |
:109DE0009093200980931F091092A7041092A60453 |
:109DF00081E090E090934305809342058091250592 |
:109E000090912605A0912705B0912805BB233CF42D |
:109E1000B095A095909581959F4FAF4FBF4F8150C2 |
:109E20009240A040B04034F084E090E0909343052D |
:109E300080934205209148053091490540914A059B |
:109E400050914B058091120990911309A09114092A |
:109E5000B0911509281B390B4A0B5B0BDA01C901BC |
:109E6000815E914BAF4FBF4F8F539C49A040B04094 |
:109E700028F08091C80989310CF41BC12091250577 |
:109E8000309126054091270550912805213060E149 |
:109E9000360760E0460760E056070CF47AC0809110 |
:109EA0004405882309F471C0DA01C90155233CF443 |
:109EB000B095A095909581959F4FAF4FBF4FBB2315 |
:109EC00024F481509E4FAF4FBF4F072E79E0B595D8 |
:109ED000A795979587957A95D1F7702D2091420592 |
:109EE00030914305820F931F909343058093420561 |
:109EF0008091250590912605A0912705B091280510 |
:109F0000BB231CF40796A11DB11D689412F8B595EA |
:109F1000A795979587951694D1F7809336059093DA |
:109F20003705A0933805B093390589589341A0406F |
:109F3000B04064F088E893E1A0E0B0E0809336059B |
:109F400090933705A0933805B09339058091360575 |
:109F500090913705A0913805B0913905BB2324F4C1 |
:109F600081509F4FAF4FBF4F892F9A2FAB2FBB27E9 |
:109F7000A7FDBA952091CC043091CD04820F931F98 |
:109F80009093CD048093CC0406C081E08093440577 |
:109F900002C010924405209125053091260540917C |
:109FA000270550912805203080EF38078FEF4807AC |
:109FB0008FEF58070CF07AC080914505882309F48B |
:109FC00071C0DA01C90155233CF4B095A095909574 |
:109FD00081959F4FAF4FBF4FBB2324F481509E4FBD |
:109FE000AF4FBF4F072E79E0B595A7959795879509 |
:109FF0007A95D1F7702D2091420530914305820F5B |
:10A00000931F90934305809342058091250590917D |
:10A010002605A0912705B0912805BB231CF40796BF |
:10A02000A11DB11D689412F8B595A79597958795D0 |
:10A030001694D1F78093360590933705A093380591 |
:10A04000B093390588579C4EAF4FBF4F64F488E7F3 |
:10A050009CEEAFEFBFEF8093360590933705A0934A |
:10A060003805B09339058091360590913705A09158 |
:10A070003805B0913905BB2324F481509F4FAF4F71 |
:10A08000BF4F892F9A2FAB2FBB27A7FDBA952091E1 |
:10A09000CC043091CD04820F931F9093CD04809314 |
:10A0A000CC0411C081E0809345050DC01092450598 |
:10A0B0000AC0109243051092420588EE93E09093F7 |
:10A0C000A00380939F038091C108282F332780919C |
:10A0D0004205909143052817390724F4309343052E |
:10A0E000209342058091C809882379F0282F3327CF |
:10A0F00027FD309580914205909143052817390737 |
:10A1000024F43093430520934205809125059091D6 |
:10A110002605A0912705B091280581389105A10554 |
:10A12000B10574F080914804909149042091420552 |
:10A1300030914305820F931F909349048093480404 |
:10A140008091250590912605A0912705B0912805BD |
:10A1500080589F4FAF4FBF4F74F480914804909147 |
:10A1600049042091420530914305821B930B909343 |
:10A1700049048093480481E090E0909343058093E4 |
:10A1800042058091290590912A05A0912B05B09157 |
:10A190002C05BB233CF4B095A095909581959F4FDD |
:10A1A000AF4FBF4F81509240A040B04034F084E0A8 |
:10A1B00090E0909343058093420510923A051092E7 |
:10A1C0003B0510923C0510923D0520914C053091C5 |
:10A1D0004D0540914E0550914F0580911909909180 |
:10A1E0001A09A0911B09B0911C09281B390B4A0BB5 |
:10A1F0005B0BDA01C901815E914BAF4FBF4F8F53AB |
:10A200009C49A040B04028F08091C80989310CF4E5 |
:10A210001BC12091290530912A0540912B055091B1 |
:10A220002C05213060E1360760E0460760E0560704 |
:10A230000CF47AC080914605882309F471C0DA01D4 |
:10A24000C90155233CF4B095A095909581959F4FF9 |
:10A25000AF4FBF4FBB2324F481509E4FAF4FBF4F32 |
:10A26000072E79E0B595A795979587957A95D1F7BB |
:10A27000702D2091420530914305820F931F9093DA |
:10A280004305809342058091290590912A05A0916C |
:10A290002B05B0912C05BB231CF40796A11DB11D05 |
:10A2A000689412F8B595A795979587951694D1F768 |
:10A2B00080933A0590933B05A0933C05B0933D05F0 |
:10A2C00089589341A040B04064F088E893E1A0E051 |
:10A2D000B0E080933A0590933B05A0933C05B09382 |
:10A2E0003D0580913A0590913B05A0913C05B091C8 |
:10A2F0003D05BB2324F481509F4FAF4FBF4F892FA3 |
:10A300009A2FAB2FBB27A7FDBA952091CA04309195 |
:10A31000CB04820F931F9093CB048093CA0406C092 |
:10A3200081E08093460502C01092460520912905E0 |
:10A3300030912A0540912B0550912C05203080EF5B |
:10A3400038078FEF48078FEF58070CF07AC08091DD |
:10A350004705882309F471C0DA01C90155233CF48B |
:10A36000B095A095909581959F4FAF4FBF4FBB2360 |
:10A3700024F481509E4FAF4FBF4F072E79E0B59523 |
:10A38000A795979587957A95D1F7702D20914205DD |
:10A3900030914305820F931F9093430580934205AC |
:10A3A0008091290590912A05A0912B05B0912C054B |
:10A3B000BB231CF40796A11DB11D689412F8B59536 |
:10A3C000A795979587951694D1F780933A05909322 |
:10A3D0003B05A0933C05B0933D0588579C4EAF4F7D |
:10A3E000BF4F64F488E79CEEAFEFBFEF80933A0570 |
:10A3F00090933B05A0933C05B0933D0580913A05B1 |
:10A4000090913B05A0913C05B0913D05BB2324F400 |
:10A4100081509F4FAF4FBF4F892F9A2FAB2FBB2734 |
:10A42000A7FDBA952091CA043091CB04820F931FE7 |
:10A430009093CB048093CA0411C081E080934705B8 |
:10A440000DC0109247050AC01092430510924205B4 |
:10A4500088EE93E09093A00380939F038091C108BE |
:10A46000282F3327809142059091430528173907FB |
:10A4700024F430934305209342058091C809882332 |
:10A4800079F0282F332727FD309580914205909150 |
:10A4900043052817390724F43093430520934205D8 |
:10A4A0008091290590912A05A0912B05B0912C054A |
:10A4B00081389105A105B10574F080914A0490910D |
:10A4C0004B042091420530914305820F931F9093D6 |
:10A4D0004B0480934A048091290590912A05A0910C |
:10A4E0002B05B0912C0580589F4FAF4FBF4FCCF438 |
:10A4F00080914A0490914B0420914205309143058C |
:10A50000821B930B90934B0480934A040AC01092D1 |
:10A51000CB041092CA041092CD041092CC04109275 |
:10A52000A20480912109882341F41092CB04109257 |
:10A53000CA041092CD041092CC048091120990911B |
:10A540001309A0911409B0911509809348059093BF |
:10A550004905A0934A05B0934B0580911909909144 |
:10A560001A09A0911B09B0911C0980934C05909386 |
:10A570004D05A0934E05B0934F0510926E041092B6 |
:10A580006F04109270041092710410927204109271 |
:10A590007304109274041092750410927604109251 |
:10A5A0007704109278041092790410921209109294 |
:10A5B000130910921409109215091092190910929A |
:10A5C0001A0910921B0910921C0910920609109288 |
:10A5D000070910920809109209091092F8081092C0 |
:10A5E000F9081092FA081092FB0810921A041092BF |
:10A5F00019048091B5049091B60499231CF49095A8 |
:10A6000081959F4F40976CF088EE93E09093A00364 |
:10A6100080939F038091990884FD03C081E080931B |
:10A6200035058091A208A82EBB24CC24DD2480917E |
:10A63000B5049091B6047C010027F7FC0095102F1B |
:10A6400099231CF4909581959F4F9C01442737FDD9 |
:10A650004095542FC801B7010E94E4689B01AC01EA |
:10A66000C601B5010E94E468992324F461507E4F2D |
:10A670008F4F9F4FDC01CB01072E79E0B595A79551 |
:10A68000979587957A95D1F7702DAC018091A208A6 |
:10A69000282F33278091B5049091B604289FB001EC |
:10A6A000299F700D389F700D11249B01772314F49E |
:10A6B0002D5F3F4FC9019595879595958795480FD3 |
:10A6C000591FCA01AA2797FDA095BA2F9C01AD0179 |
:10A6D0008093190590931A05A0931B05B0931C0550 |
:10A6E00080918E0490918F04A0919004B091910478 |
:10A6F000821B930BA40BB50B80938E0490938F0455 |
:10A70000A0939004B09391048155934CA040B04025 |
:10A7100064F080E593ECA0E0B0E080938E04909329 |
:10A720008F04A0939004B093910480918E04909133 |
:10A730008F04A0919004B0919104805B9C43AF4F33 |
:10A74000BF4F64F480EB9CE3AFEFBFEF80938E04C8 |
:10A7500090938F04A0939004B093910480919A04F5 |
:10A7600090919B04892B09F4BAC18091990883FFC9 |
:10A77000B6C180915E0490915F04A0916004B09195 |
:10A780006104BB2324F481509E4FAF4FBF4F072E6F |
:10A7900079E0B595A795979587957A95D1F7702D1E |
:10A7A0004C01992324F4909481949108939480917E |
:10A7B000660490916704A0916804B0916904BB237A |
:10A7C00024F481509E4FAF4FBF4F072E79E0B595CF |
:10A7D000A795979587957A95D1F7702D8C01992338 |
:10A7E0001CF4109501951F4F801691060CF448013A |
:10A7F000B401992014F4695F7F4F3B01759467940D |
:10A8000075946794759467940894611C711C809189 |
:10A810009A0490919B04845E9D4F5C01CC24B7FC0C |
:10A82000C094DC2C80915C0990915D09A0915E0937 |
:10A83000B0915F092091BF033091C0034091C103E3 |
:10A840005091C203BC01CD010E945869A21AB30AFB |
:10A85000C40AD50AC601B50128E631E040E050E05F |
:10A860000E945869DC01CB012C012CE43FEF420E21 |
:10A87000531E809155099091560999231CF4909587 |
:10A8800081959F4F8138910514F04424552480917F |
:10A890009F039091A003892B09F042C039E18316F0 |
:10A8A0009104F4F58091A6049091A704840D951D60 |
:10A8B0009093A7048093A60480913505882381F1A5 |
:10A8C00088EC90E09093F1038093F00380919A04D8 |
:10A8D00090919B04AA2797FDA095BA2FA090BF0343 |
:10A8E000B090C003C090C103D090C203BC01CD01A1 |
:10A8F000A60195010E94E468DC01CB0180935C090C |
:10A9000090935D09A0935E09B0935F09BC01CD01EE |
:10A910000E94586930939D0420939C041092350541 |
:10A92000C201880F991F880F991F880F991FB301C3 |
:10A930000E9423699B01442737FD4095542F809145 |
:10A940005C0990915D09A0915E09B0915F09820F49 |
:10A95000931FA41FB51F80935C0990935D09A0937A |
:10A960005E09B0935F098091B1039927889EA00189 |
:10A97000899E500D989E500D1124CA0155230CF448 |
:10A980004F964C01959487949594879495948794C9 |
:10A9900095948794959487948091B1039927881909 |
:10A9A00099094C010AF495C080919F039091A003EE |
:10A9B000892B09F082C02091E2043091E304809158 |
:10A9C000E4049091E5048901080F191FC8011123BF |
:10A9D0000CF4079695958795959587959595879508 |
:10A9E0008C01005C1F4F80915C0990915D09A091E2 |
:10A9F0005E09B0915F092091BF033091C00340917F |
:10AA0000C1035091C203BC01CD010E9458698091DD |
:10AA10009C0490919D04AA2797FDA095BA2F281B0E |
:10AA2000390B4A0B5B0BDA01C901845E9D4FAF4FB6 |
:10AA3000BF4FBC01CD0128E631E040E050E00E946C |
:10AA40005869DC01CB01845B9040889DB001899DF1 |
:10AA5000700D989D700D1124CB01B8010E942369DF |
:10AA60008B019091B10383E0989F400111248616D9 |
:10AA7000970614F4840108C0882799278819990932 |
:10AA8000681779070CF48C01C801AA2797FDA095D7 |
:10AA9000BA2F20918E0430918F04409190045091F0 |
:10AAA0009104820F931FA41FB51F80938E0490936F |
:10AAB0008F04A0939004B093910480919F03909190 |
:10AAC000A003009761F001979093A00380939F03E8 |
:10AAD00006C084EF91E09093A00380939F03809140 |
:10AAE00034058150809334058F3F09F0BFC088E161 |
:10AAF000809334058091A5089927880F991F880FA6 |
:10AB0000991F5C01CC24B7FCC094DC2C80915E04BE |
:10AB100090915F04A0916004B0916104BC01CD01EB |
:10AB2000A60195010E9458693093D4072093D3075A |
:10AB30008091660490916704A0916804B0916904C3 |
:10AB4000BC01CD01A60195010E9458693093D6073A |
:10AB50002093D507809144099091450999230CF4DD |
:10AB6000039695958795959587959093D8078093AB |
:10AB7000D707809160099091610999230CF403969D |
:10AB800095958795959587959093DA078093D90742 |
:10AB900080915509909156099093DC078093DB07CB |
:10ABA0008091BA049091BB049093DE078093DD07F7 |
:10ABB00080911708909118089093E0078093DF0721 |
:10ABC00080919A0490919B049093E4078093E3070B |
:10ABD00080911803909119039093E6078093E507FD |
:10ABE00080915C0990915D09A0915E09B0915F0927 |
:10ABF0002091BF033091C0034091C1035091C20323 |
:10AC0000BC01CD010E9458693093EA072093E907FF |
:10AC10008091B00499279093E8078093E70780918B |
:10AC20002C0799279093FA078093F9078091C80918 |
:10AC3000992787FD909590930A0880930908809141 |
:10AC4000CA09992790930E0880930D0880915405A6 |
:10AC5000909155059093100880930F0880915605A8 |
:10AC60009091570590931208809311088091A20447 |
:10AC7000882381F010920D0510920E0510920F0599 |
:10AC8000109210051092090510920A0510920B05FA |
:10AC900010920C058091CE048823E9F4809121095B |
:10ACA0009927AA27BB2720915E0430915F04409129 |
:10ACB000600450916104BC01CD010E94E468DC0194 |
:10ACC000CB01BC01CD0128EF3AE240E050E00E9408 |
:10ACD0005869190102C0222433248091CF048823AB |
:10ACE000F1F4809121099927AA27BB2720916604B6 |
:10ACF000309167044091680450916904BC01CD0112 |
:10AD00000E94E468DC01CB01BC01CD0128EF3AE2EE |
:10AD100040E050E00E9458693C832B8302C01C82B3 |
:10AD20001B828091F2089091F308893C91053CF0D8 |
:10AD300088EC90E09093F3088093F2080DC0809126 |
:10AD4000F2089091F30888539F4F34F488E39FEF03 |
:10AD50009093F3088093F2088091FD089091FE088B |
:10AD6000893C91053CF088EC90E09093FE0880933C |
:10AD7000FD080DC08091FD089091FE0888539F4FFB |
:10AD800034F488E39FEF9093FE088093FD08809150 |
:10AD90002109882309F04BC08091FF089091000998 |
:10ADA000AA2797FDA095BA2F20915A093327442747 |
:10ADB0005527BC01CD010E94E468992324F4615C0D |
:10ADC0007F4F8F4F9F4FDC01CB01689415F8B595ED |
:10ADD000A795979587951694D1F79093000980933E |
:10ADE000FF088091F0089091F108AA2797FDA0959F |
:10ADF000BA2F20915A09332744275527BC01CD018A |
:10AE00000E94E468992324F4615C7F4F8F4F9F4F29 |
:10AE1000DC01CB01689415F8B595A79597958795B2 |
:10AE20001694D1F79093F1088093F0087CC080913C |
:10AE3000FF0890910009AA2797FDA095BA2F2091AD |
:10AE40005A09332744275527BC01CD010E94E468E5 |
:10AE50009B01AC018091F2089091F308AA2797FD1D |
:10AE6000A095BA2F689416F8880F991FAA1FBB1FC8 |
:10AE70001694D1F7280F391F4A1F5B1F552324F45E |
:10AE8000215C3F4F4F4F5F4FDA01C901689415F8BD |
:10AE9000B595A795979587951694D1F7820D931D33 |
:10AEA000909300098093FF088091F0089091F10839 |
:10AEB000AA2797FDA095BA2F20915A093327442736 |
:10AEC0005527BC01CD010E94E4689B01AC01809133 |
:10AED000FD089091FE08AA2797FDA095BA2F6894C7 |
:10AEE00016F8880F991FAA1FBB1F1694D1F7280FB9 |
:10AEF000391F4A1F5B1F552324F4215C3F4F4F4FDE |
:10AF00005F4FDA01C901689415F8B595A795979533 |
:10AF100087951694D1F7EB81FC818E0F9F1F90933C |
:10AF2000F1088093F0088091550990915609880F97 |
:10AF3000991FAA2797FDA095BA2F2091F7083327CC |
:10AF400044275527BC01CD010E94E468992324F4CD |
:10AF5000615C7F4F8F4F9F4F5B016C01689415F8C8 |
:10AF6000D594C794B794A7941694D1F780910E09FD |
:10AF70009927AA27BB2720917A0430917B0440911E |
:10AF80007C0450917D04BC01CD010E94E468DC0189 |
:10AF9000CB01BC01CD0120EF35E540E050E00E943F |
:10AFA0005869DA01C9018A0D9B1D90935609809357 |
:10AFB00055098091FF08909100098150904434F028 |
:10AFC00080E090E4909300098093FF088091FF084F |
:10AFD000909100098050904C34F480E090EC909374 |
:10AFE00000098093FF088091F0089091F10881504A |
:10AFF000904434F080E090E49093F1088093F0085E |
:10B000008091F0089091F1088050904C34F480E0E9 |
:10B0100090EC9093F1088093F008809155099091FD |
:10B0200056098150904434F080E090E490935609A2 |
:10B030008093550980915509909156098050904C04 |
:10B0400034F480E090EC90935609809355098091F8 |
:10B0500042048823C1F08091EA049091EB040297A6 |
:10B06000C09788F489819A811816190664F481E0E2 |
:10B0700090E09093EB048093EA0480910409A82F58 |
:10B08000BB27BA83A983E981FA81EE0FFF1FEE0F78 |
:10B09000FF1FFA83E9838091990880FF0FC5809193 |
:10B0A0005E0490915F04A0916004B09161042091CE |
:10B0B000BF033091C0034091C1035091C203BC0152 |
:10B0C000CD010E945869DA01C9013901245C3F4F62 |
:10B0D0003CF40F2EF4EC6F2EFFEF7F2EF02D07C007 |
:10B0E000CD972CF00F2EFCE36F2E7724F02DC301AB |
:10B0F0000E94722C3C018091660490916704A0919B |
:10B100006804B09169042091BF033091C00340915D |
:10B11000C1035091C203BC01CD010E945869DA01FC |
:10B12000C90149013FEF843C93073CF40F2EF4EC36 |
:10B130008F2EFFEF9F2EF02D07C0CD972CF00F2EF6 |
:10B14000FCE38F2E9924F02DC4010E94722C4C0137 |
:10B150008091D90499279C01220F331F220F331F9E |
:10B160008091580490915904821B930B5C01CC246C |
:10B17000B7FCC094DC2C9301442737FD4095542F35 |
:10B18000C601B5010E94E4685B016C01DC01CB01E2 |
:10B19000DD2024F48150904EAF4FBF4F5C016D0114 |
:10B1A000092E9DE0D594C794B794A7949A95D1F7AA |
:10B1B000902D9401442737FD4095542FC601B501C9 |
:10B1C0000E94E46821EC3FE140E050E00E945869B1 |
:10B1D00059016A012091130430911404809158049C |
:10B1E00090915904280F391F2A193B098091D904DD |
:10B1F0009927880F991F880F991F281B390B12F464 |
:10B200002F5F3F4F1216130614F421503040C9012E |
:10B21000AA2797FDA095BA2F209196043091970404 |
:10B220004091980450919904820F931FA41FB51F59 |
:10B230008093960490939704A0939804B0939904F4 |
:10B24000209196043091970440919804509199046C |
:10B25000552324F421503F4F4F4F5F4F232F342F5E |
:10B26000452F552747FD5A95809196049091970454 |
:10B27000A0919804B0919904821B930BA40BB50B79 |
:10B280008093960490939704A0939804B0939904A4 |
:10B290008091960490919704A0919804B09199049C |
:10B2A0008058914CAF4FBF4F6CF480E891ECAFEFFA |
:10B2B000BFEF8093960490939704A0939804B09363 |
:10B2C000990419C08091960490919704A0919804D4 |
:10B2D000B091990481589E43A040B04064F080E84A |
:10B2E0009EE3A0E0B0E08093960490939704A0932F |
:10B2F0009804B09399048091C2049091C304A091E2 |
:10B30000C404B091C504A090BA04B090BB04C0902E |
:10B31000BC04D090BD047C018D01EA0CFB1C0C1D0B |
:10B320001D1DE092C204F092C3040093C404109364 |
:10B33000C50480911109282F2F5F20931109809156 |
:10B34000D804281708F470C0332744275527C801AC |
:10B35000B7010E9458692093C2043093C3044093FC |
:10B36000C4045093C5045090AD03852D9927AA2796 |
:10B37000BB2789879A87AB87BC878091BE04909151 |
:10B38000BF04A091C004B091C104A6019501281B7F |
:10B39000390B4A0B5B0B69857A858B859C850E94EE |
:10B3A000E468DC01CB01909318048093170480912A |
:10B3B000170490911804992354F4809117049091E4 |
:10B3C0001804850D911D90931804809317048091A3 |
:10B3D0001704909118041816190664F48091AD03AF |
:10B3E0002091170430911804281B31093093180458 |
:10B3F00020931704109211098091C2049091C30404 |
:10B40000A091C404B091C5048093BE049093BF047E |
:10B41000A093C004B093C1041092C2041092C3045C |
:10B420001092C4041092C5048091170490911804DE |
:10B4300099230CF40F9695958795959587959595F5 |
:10B4400087959595879590931E0980931D09809106 |
:10B45000960490919704A0919804B0919904BB230D |
:10B4600024F481589F4FAF4FBF4F689416F8B5959D |
:10B47000A795979587951694D1F72091B003332718 |
:10B4800044275527BC01CD010E94E468992324F488 |
:10B49000615E7F4F8F4F9F4FDC01CB01689414F8A2 |
:10B4A000B595A795979587951694D1F79C01893CFA |
:10B4B00091051CF028EC30E006C09FEF28333907D7 |
:10B4C00014F428E33FEF80911D0990911E09820F2B |
:10B4D000931F90931E0980931D098091990881FF05 |
:10B4E000A8C08091AE03823328F08091D4048D38B7 |
:10B4F00008F498C08091C40381508093C4038F3FA7 |
:10B5000009F07DC08091220390912303895E9340CE |
:10B51000D8F087B5853FC0F480911604982F9150DC |
:10B52000909316048AE09802C00111242091220809 |
:10B53000281B27BD8CE291E09093F1038093F003E8 |
:10B540008AEF8093C4035BC0809122039091230310 |
:10B5500084369105D8F487B58B30C0F080911604FD |
:10B56000982F9F5F909316048AE09802C0011124DF |
:10B5700020912208281B27BD8CE291E09093F103D3 |
:10B580008093F0038AEF8093C40339C08091220333 |
:10B590009091230384369105E8F487B58230D0F08A |
:10B5A00087B58B3058F080911604982F965F909352 |
:10B5B000160480912208891B87BD02C081E087BDE7 |
:10B5C0008CE291E09093F1038093F0038AEF8093F3 |
:10B5D000C40315C08091BA049091BB04A091BC042F |
:10B5E000B091BD048093C6049093C704A093C8048F |
:10B5F000B093C9041092A10481E08093C4038091A8 |
:10B60000BA049091BB04A091BC04B091BD04809396 |
:10B61000C6049093C704A093C804B093C9041092C1 |
:10B62000A104A5C081E08093A10488EC8093C403A9 |
:10B630009EC08091D4048D3898F08091BA04909186 |
:10B64000BB04A091BC04B091BD048093C604909348 |
:10B65000C704A093C804B093C9041092A10487C082 |
:10B6600081E08093A1042091AE038091BD0390916D |
:10B67000BE03820F911D9C0180919E089927289FEF |
:10B68000F001299FF00D389FF00D1124CF01449750 |
:10B69000AA2797FDA095BA2F2091C6043091C70420 |
:10B6A0004091C8045091C904281739074A075B071D |
:10B6B000ECF48091A304982F9F5F9093A304809152 |
:10B6C000D70486958695891708F051C01092A30477 |
:10B6D000DA01C9010196A11DB11D8093C6049093A2 |
:10B6E000C704A093C804B093C90441C02091AE031D |
:10B6F0008091BD039091BE03820F911D9C018091AA |
:10B700009E089927289FA001299F500D389F500D12 |
:10B710001124CA014497AA2797FDA095BA2F20911A |
:10B72000C6043091C7044091C8045091C9048217DF |
:10B730009307A407B507DCF48091A304982F9F5FBB |
:10B740009093A3048091D70486958695891778F401 |
:10B750001092A304DA01C9010197A109B1098093EC |
:10B76000C6049093C704A093C804B093C904809101 |
:10B77000A004882341F01092C6041092C7041092CE |
:10B78000C8041092C9048091A104882309F4E3C07D |
:10B790008091D4048D3808F0DEC02091C604309129 |
:10B7A000C7048091BA049091BB04281B390B3093D5 |
:10B7B000400920933F098091AF039927829FB001F0 |
:10B7C000839F700D929F700D1124CB0177230CF491 |
:10B7D0000396959587959595879590933E098093C7 |
:10B7E0003D098091500590915105A0915205B0916D |
:10B7F00053050097A105B10539F489819A81909389 |
:10B8000064098093630914C080915005909151059B |
:10B81000A0915205B0915305BC01CD0120E630E165 |
:10B8200040E050E00E943669309364092093630938 |
:10B83000209163093091640980913D0990913E09FE |
:10B84000B901680F791F80911D0990911E09681B2D |
:10B85000790B5B01CC24B7FCC094DC2C092E9DE055 |
:10B86000AA0CBB1CCC1CDD1C9A95D1F7902D930122 |
:10B87000442737FD4095542FC601B5010E945869F1 |
:10B8800059016A01092E9DE0AA0CBB1CCC1CDD1CD1 |
:10B890009A95D1F7902D9401442737FD4095542F68 |
:10B8A000C601B5010E94586959016A01209132050B |
:10B8B00030913305C901880F991F880F991F880F90 |
:10B8C000991F821B930B9C012A0D3B1D332314F4FB |
:10B8D000295F3F4F359527953595279535952795C0 |
:10B8E000309333052093320580919A089927880F69 |
:10B8F000991F880F991F28173907CCF4A981BA819D |
:10B90000A817B90724F090933305809332058091EE |
:10B910009A089927880F991F880F991FE981FA8142 |
:10B92000E817F90724F4F0933305E093320580918A |
:10B9300032059091330529813A812817390724F47B |
:10B9400030933305209332054091320550913305F1 |
:10B950005A8349830EC01092960410929704109255 |
:10B9600098041092990469817A81709333056093E9 |
:10B9700032058091EC0481FF85C080915005909143 |
:10B980005105A0915205B09153050097A105B1054D |
:10B99000C9F4E981FA81CF01AA2797FDA095BA2FB2 |
:10B9A000BC01CD0120E630E140E050E00E94E468B7 |
:10B9B000DC01CB018093500590935105A093520573 |
:10B9C000B093530580911D0990911E0907960F971A |
:10B9D00008F058C029813A815901CC24B7FCC094A1 |
:10B9E000DC2C9301442737FD4095542FC601B50147 |
:10B9F0000E94E4685B016C01DC01CB01DD2024F4D2 |
:10BA00008150904EAF4FBF4F5C016D01092E9DE0FC |
:10BA1000D594C794B794A7949A95D1F7902D940193 |
:10BA2000442737FD4095542FC601B5010E94E468B4 |
:10BA300021EC3FE140E050E00E94586959016A0161 |
:10BA4000609050057090510580905205909053057C |
:10BA5000C401B30120E630E140E050E00E943669C5 |
:10BA6000621A730A840A950AD401C3018A0D9B1DC8 |
:10BA7000AC1DBD1D8093500590935105A0935205B8 |
:10BA8000B09353058091500590915105A0915205B6 |
:10BA9000B0915305BC01CD0120E630E140E050E01B |
:10BAA0000E9436693093F4072093F30780911D09B3 |
:10BAB00090911E099093F6078093F50780915409A1 |
:10BAC0009927880F991F880F991F805590404981A9 |
:10BAD0005A818417950714F49A83898369817A813E |
:10BAE0007093E2076093E1078091190590911A0520 |
:10BAF000A0911B05B0911C05880F991FAA1FBB1FA1 |
:10BB0000880F991FAA1FBB1F209155093091560914 |
:10BB10007901E81AF90A613A71056CF1CB017723D2 |
:10BB20000CF40196959587958E159F054CF4298107 |
:10BB30003A81332314F42F5F3F4F7901F594E79452 |
:10BB400089819A8199230CF4019695958795909512 |
:10BB500081959F4FE816F90614F529813A81332320 |
:10BB600014F42F5F3F4F7901F594E794F094E1943A |
:10BB7000F108F39414C071E5E716F1042CF00F2ED0 |
:10BB8000F0E5EF2EFF24F02D80EBE8168FEFF8069E |
:10BB900034F40F2EF0EBEF2EFFEFFF2EF02D8091FF |
:10BBA0005409482F5527440F551F440F551FCA01EC |
:10BBB000A981BA818A1B9B0B8E159F050CF47C0111 |
:10BBC00029813A81241B350BE216F3060CF4790126 |
:10BBD0008091FF08909100092091B1043091B20446 |
:10BBE000821B930B9093100980930F098091210978 |
:10BBF000882309F46BC0C101821B930B9C0144276D |
:10BC000037FD4095542F8091090590910A05A09128 |
:10BC10000B05B0910C05820F931FA41FB51F8093D5 |
:10BC2000090590930A05A0930B05B0930C0581506C |
:10BC30009D47A040B04064F080E09DE7A0E0B0E008 |
:10BC40008093090590930A05A0930B05B0930C050A |
:10BC50008091090590910A05A0910B05B0910C0502 |
:10BC600080509348AF4FBF4F64F480E093E8AFEF4C |
:10BC7000BFEF8093090590930A05A0930B05B0933D |
:10BC80000C058091A9039091AA039C01442737FDDC |
:10BC90004095542F8091090590910A05A0910B05BC |
:10BCA000B0910C05BC01CD010E94586949018091F9 |
:10BCB0000F0990911009880E991E1092110510928B |
:10BCC000120510921305109214056BC080910F0994 |
:10BCD000909110099C01442737FD4095542F809185 |
:10BCE000110590911205A0911305B0911405820FD2 |
:10BCF000931FA41FB51F8093110590931205A09365 |
:10BD00001305B093140581509D47A040B04064F0E6 |
:10BD100080E09DE7A0E0B0E08093110590931205CC |
:10BD2000A0931305B093140580911105909112050D |
:10BD3000A0911305B091140580509348AF4FBF4FA9 |
:10BD400064F480E093E8AFEFBFEF80931105909328 |
:10BD50001205A0931305B09314058091AB03909145 |
:10BD6000AC039C01442737FD4095542F8091110569 |
:10BD700090911205A0911305B0911405BC01CD015D |
:10BD80000E945869490180910F0990911009880E0D |
:10BD9000991E1092090510920A0510920B05109237 |
:10BDA0000C058091BC03A82EBB24CC24DD24C70144 |
:10BDB000FF2024F4882799278E199F0999230CF4D2 |
:10BDC00001969595879549815A81840F951F9C010D |
:10BDD000442737FD4095542FC601B5010E94E46801 |
:10BDE000992324F4615C7F4F8F4F9F4F689415F81F |
:10BDF00095958795779567951694D1F7AB0168155A |
:10BE000079050CF44B0122273327241B350B8216AE |
:10BE100093060CF449018091F0089091F10820916B |
:10BE2000B3043091B404821B930B9093EF0880937A |
:10BE3000EE0880912109882309F46CC08B819C81D4 |
:10BE4000821B930B9C01442737FD4095542F809112 |
:10BE50000D0590910E05A0910F05B0911005820F70 |
:10BE6000931FA41FB51F80930D0590930E05A093FB |
:10BE70000F05B093100581509D47A040B04064F07D |
:10BE800080E09DE7A0E0B0E080930D0590930E0563 |
:10BE9000A0930F05B093100580910D0590910E05AC |
:10BEA000A0910F05B091100580509348AF4FBF4F40 |
:10BEB00064F480E093E8AFEFBFEF80930D059093BB |
:10BEC0000E05A0930F05B09310058091A9039091E2 |
:10BED000AA039C01442737FD4095542F80910D05FE |
:10BEE00090910E05A0910F05B0911005BC01CD01F8 |
:10BEF0000E9458698091EE089091EF081901280E70 |
:10BF0000391E109215051092160510921705109201 |
:10BF100018056BC08091EE089091EF089C014427B2 |
:10BF200037FD4095542F8091150590911605A091ED |
:10BF30001705B0911805820F931FA41FB51F80939A |
:10BF4000150590931605A0931705B0931805815019 |
:10BF50009D47A040B04064F080E09DE7A0E0B0E0E5 |
:10BF60008093150590931605A0931705B0931805B7 |
:10BF70008091150590911605A0911705B0911805AF |
:10BF800080509348AF4FBF4F64F480E093E8AFEF29 |
:10BF9000BFEF8093150590931605A0931705B093F6 |
:10BFA00018058091AB039091AC039C01442737FDA9 |
:10BFB0004095542F8091150590911605A091170575 |
:10BFC000B0911805BC01CD010E94586919018091FA |
:10BFD000EE089091EF08280E391E10920D05109270 |
:10BFE0000E0510920F05109210058091BC03A82E2B |
:10BFF000BB24CC24DD24C701FF2024F48827992703 |
:10C000008E199F0999230CF401969595879529819E |
:10C010003A81820F931F9C01442737FD4095542F8E |
:10C02000C601B5010E94E468992324F4615C7F4F46 |
:10C030008F4F9F4F689415F89595879577956795DD |
:10C040001694D1F7AB01621573050CF41B0122277E |
:10C050003327241B350B221633060CF4190100E09C |
:10C060002401662457FC6094762C4101AA2497FC95 |
:10C07000A094BA2CA701662757FD6095762F6A0118 |
:10C080007B0180910409282E332480915409682F64 |
:10C09000772778876F83802F9927880F991F880FBC |
:10C0A000991FFC01EF57FA4F258512160CF0D1C0ED |
:10C0B000E981FA81CF01AA2797FDA095BA2F3327EE |
:10C0C00027FD3095432F532FBC01CD010E94E4681A |
:10C0D000992324F4615C7F4F8F4F9F4FDC01CB018C |
:10C0E000689415F8B595A795979587951694D1F707 |
:10C0F0009A878987802F9927880F991F880F991F02 |
:10C10000FC01EF57FA4F8685282F332727FD3095FE |
:10C11000432F532FC301B2010E94E468992324F4F2 |
:10C12000615C7F4F8F4F9F4FDC01CB01689415F806 |
:10C13000B595A795979587951694D1F729853A8552 |
:10C14000280F391F3A872987802F9927880F991F31 |
:10C15000880F991FFC01EF57FA4F8785282F332747 |
:10C1600027FD3095432F532FC501B4010E94E46889 |
:10C17000992324F4615C7F4F8F4F9F4FDC01CB01EB |
:10C18000689415F8B595A795979587951694D1F766 |
:10C1900049855A85480F591F5A874987802F992703 |
:10C1A000880F991F880F991FFC01EF57FA4F80895C |
:10C1B000282F332727FD3095432F532FC701B60172 |
:10C1C0000E94E468992324F4615C7F4F8F4F9F4F56 |
:10C1D0009B01AC01689415F85595479537952795BF |
:10C1E0001694D1F7802F9927880F991F8E5D964F4F |
:10C1F0009E838D83DC016D917C9189859A85820F68 |
:10C20000931F0E945A2DED81FE8191838083992393 |
:10C210000CF4039695958795959587959A878987C8 |
:10C2200029853A85221533051CF43A86298609C0EA |
:10C230008F81988549855A858417950714F49A87C4 |
:10C240008987802F9927FC01E95BF64F5985508338 |
:10C2500006C0802F9927FC01E95BF64F10820F5F23 |
:10C260000C3008F418CF2C960FB6F894DEBF0FBE32 |
:10C27000CDBFDF91CF911F910F91FF90EF90DF9095 |
:10C28000CF90BF90AF909F908F907F906F905F9076 |
:10C290004F903F902F90089580915C0590915D059F |
:10C2A000A0915E05B0915F0580936405909365054C |
:10C2B000A0936605B0936705809160059091610534 |
:10C2C000A0916205B091630580936805909369051C |
:10C2D000A0936A05B0936B050895109255051092CE |
:10C2E00054051092570510925605089584B1806A3E |
:10C2F00084B93D9A82E58CBD1DBC459A81E080934E |
:10C3000068098AEA80936C0983E880936D098AE062 |
:10C3100080936E091092700910926F091092720941 |
:10C32000109271091092CA0910928E0910928F0909 |
:10C330008AE48093900983E08093910986E080935A |
:10C340009209089580916809882309F43CC04598B2 |
:10C350008CE699E090936A098093690920916D05B4 |
:10C3600085EC93E0FC01E20FF11D2F5F20936D053A |
:10C37000808180936E09263010F010926D05109226 |
:10C3800068090E94756281E080936B0900000000DB |
:10C39000000000000000000000000000000000009D |
:10C3A000000000000000000000000000000000008D |
:10C3B00000000000000000000000000080916C09F7 |
:10C3C00080938B098EBD089580916809882309F0B8 |
:10C3D0008BC00DB407FE88C084E08093F203459AB9 |
:10C3E0002EB580916E0599278130910599F08230A4 |
:10C3F00091051CF4892B21F041C00297C9F03EC081 |
:10C4000010928D0920936F052138C1F581E080934A |
:10C410006E0534C0253549F480916F05820F8093F5 |
:10C420006F0582E080936E0529C010926E0526C0CC |
:10C4300080918D09ADEAB9E0FD01E80FF11D20837F |
:10C440008F5F80938D098A31A0F080916F05281746 |
:10C4500059F48AE1E3E9F9E00D9001928A95E1F758 |
:10C4600081E080938E0902C010928E0910926E05B1 |
:10C4700005C080916F05820F80936F0520916B0935 |
:10C48000203208F029C0459800000000000000009C |
:10C49000000000000000000000000000000000009C |
:10C4A000000000000000000000000000000000008C |
:10C4B00000000000000000008091690990916A0965 |
:10C4C000FC01E20FF11D80818EBD90918B0980816E |
:10C4D000890F80938B0903C081E080936809809164 |
:10C4E0006B098F5F80936B090895EF92FF920F9312 |
:10C4F0001F938091A5089927880F991F880F991F6E |
:10C500007C010027F7FC0095102F80915E0490912C |
:10C510005F04A0916004B0916104BC01CD01A80149 |
:10C5200097010E9458693093700920936F09809198 |
:10C53000660490916704A0916804B0916904BC01FD |
:10C54000CD01A80197010E94586930937209209388 |
:10C55000710920915C0930915D0940915E0950910B |
:10C560005F09DA01C901689412F8880F991FAA1FA0 |
:10C57000BB1F1694D1F7820F931FA41FB51F820F04 |
:10C58000931FA41FB51F2091BF033091C00340919A |
:10C59000C1035091C203BC01CD010E945869309380 |
:10C5A000780920937709209156043091570480919F |
:10C5B000160990911709B9010E942369CB01880FD0 |
:10C5C000991F880F991F860F971F860F971F992312 |
:10C5D0000CF4039695958795959587959093740996 |
:10C5E0008093730920915604309157048091580923 |
:10C5F00090915909B9010E942369CB01880F991FB5 |
:10C60000880F991F860F971F860F971F99230CF489 |
:10C610000396959587959595879590937609809340 |
:10C62000750910925704109256041092170910922F |
:10C630001609109259091092580980916E0999278C |
:10C640008C30910509F4F7C08D3091053CF48A30A7 |
:10C65000910561F00B9709F475C028C18D309105E3 |
:10C6600009F43FC00E9709F40DC120C18091D40494 |
:10C6700080937F098091D504809380098091D604AE |
:10C68000809381098091D704809382098091D80496 |
:10C69000809383098091D904809384098091DA047E |
:10C6A000809385098091DB04809386098091EC0456 |
:10C6B000809387098091EC04837F8093EC048091C0 |
:10C6C000180390911903809388098091AA08809398 |
:10C6D0008909A2E0B0E00E947369802D80938A09E5 |
:10C6E000E5C08091FC0880937F098091CC088093FD |
:10C6F00080098091CD08809381098091CE08809334 |
:10C7000082098091CF08809383098091D308809318 |
:10C7100084098091D408809385098091D5088093FD |
:10C7200086098091D808809387098091D6088093E4 |
:10C7300088098091D708809389098091D9088093CE |
:10C740008A09B4C0809193089927880F991FFC012A |
:10C75000E15AF74F0190F081E02DE038F1051CF02F |
:10C76000EFE7F0E006C02FEFE138F20714F4E1E85C |
:10C77000FFEFE0937F09809194089927880F991F14 |
:10C78000FC01E15AF74F0190F081E02DE038F1050E |
:10C790001CF0EFE7F0E006C04FEFE138F40714F4C7 |
:10C7A000E1E8FFEFE0938009809192089927880FD4 |
:10C7B000991FFC01E15AF74F0190F081E02DE0381C |
:10C7C000F1051CF0EFE7F0E006C06FEFE138F60787 |
:10C7D00014F4E1E8FFEFE093810980919108992733 |
:10C7E000880F991FFC01E15AF74F0190F081E02D6D |
:10C7F000E038F1051CF0EFE7F0E006C08FEFE1381C |
:10C80000F80714F4E1E8FFEFE09382098091A804AF |
:10C81000809383098091AA04809384098091AC0459 |
:10C82000809385098091AE04809386098091B0043D |
:10C83000809387093BC080912C07863030F010929E |
:10C840002C0785E080937F0904C080912C0780939A |
:10C850007F098091BA049091BB04909382098093E0 |
:10C8600081098091DA08809380098091D0088093B3 |
:10C8700083098091D108809384098091D2088093A4 |
:10C88000850914C080918F0980937F098091900958 |
:10C890008093800980919109809381098091920908 |
:10C8A00080938209809100018093830980918E0991 |
:10C8B000882309F46EC02091940930919509C9012B |
:10C8C00081509E4F8F5F9340C8F4409196095091DC |
:10C8D0009709CA0181509E4F8F5F934078F48091F1 |
:10C8E000990885FF0BC0309355052093540550934C |
:10C8F0005705409356058AEF80936C0580919A09FD |
:10C9000090919B0921E08936920724F490939B042F |
:10C9100080939A0420919A0430919B0480919C0406 |
:10C9200090919D04281B390BC901845E9D4F68E6D8 |
:10C9300071E00E942369845B904090939F048093F0 |
:10C940009E0420919E0930919F098091F00390915F |
:10C95000F1038217930740F480912C07882321F478 |
:10C960003093F1032093F003809193098736C9F443 |
:10C970008091A0098093C7098091A1098093C9097A |
:10C980008091A2098093C8098091A3098093CA0964 |
:10C9900008C0109255051092540510925705109238 |
:10C9A00056051F910F91FF90EF90089587B18C600D |
:10C9B00087B9429843981092740580E88093CB031E |
:10C9C000109275058093CC0308958091760581506F |
:10C9D000809376058F3F09F087C084E080937605C9 |
:10C9E0008091C8088B3F60F080911809873E40F025 |
:10C9F0008091C708882314F4429A34C0429832C008 |
:10CA00008091C8088B3F60F0809118098A3040F40B |
:10CA10008091C708882314F4429824C0429A22C007 |
:10CA2000809174058150809374058F3FD9F4809173 |
:10CA300018098150809374058091CB03813021F4D3 |
:10CA400080E88093CB0305C08091CB0386958093CB |
:10CA5000CB038091C7089091CB03892311F0429AB0 |
:10CA600001C042988091CA088B3F60F080915309C1 |
:10CA7000873E40F08091C908882314F4439A0895B2 |
:10CA8000439808958091CA088B3F60F080915309C4 |
:10CA90008A3040F48091C908882314F4439808959B |
:10CAA000439A0895809175058150809375058F3F55 |
:10CAB000D9F4809153098150809375058091CC03FE |
:10CAC000813021F480E88093CC0305C08091CC03B1 |
:10CAD00086958093CC038091C9089091CC038923DB |
:10CAE00011F0439A0895439808951F93CF93DF93CD |
:10CAF00080E197E20E94AB15EC0110E08091C90043 |
:10CB00008F778093C9008091C9008F7E8093C90080 |
:10CB10005A9882ED98E09F938F931F930E94491239 |
:10CB20000F900F900F9002C04A997AC0CE010E94D8 |
:10CB3000B3158823C9F3112309F479C088E099E07B |
:10CB40009F938F931F920E944912529A0F900F90B9 |
:10CB50000F90CE010E94B3158823D9F380E090E0B6 |
:10CB60005A9A019684369105D8F380E090E05A985D |
:10CB7000019621E080399207D0F380E090E05A9A44 |
:10CB800001968A309105D8F380E090E05A9801969A |
:10CB90008A309105D8F380E090E05A9A019621E01E |
:10CBA00080399207D0F380E090E05A98019621E016 |
:10CBB00080399207D0F380E090E05A9A01968A304B |
:10CBC0009105D8F380E090E05A9801968A3091055B |
:10CBD000D8F380E090E05A9A019621E080399207DC |
:10CBE000D0F380E090E05A98019621E080399207D6 |
:10CBF000D0F380E090E05A9A01968A309105D8F3FC |
:10CC000080E090E05A9801968A309105D8F380E050 |
:10CC100090E05A9A019621E080399207D0F311C032 |
:10CC20008AE590E00E94AB15EC0111E084CF8EE024 |
:10CC300099E09F938F931F920E9449120F900F903B |
:10CC40000F9052985A980E942966DF91CF911F91B8 |
:10CC500008952FE78091C90082238093C9008091B5 |
:10CC6000C9008F7B8093C9008091C9008F7D80931C |
:10CC7000C9005A9A52981092CD0084E190E08093B6 |
:10CC8000CC008091C80082608093C80080E18093CE |
:10CC9000C9008091CA0082238093CA008091CA0093 |
:10CCA0008F7B8093CA008091CA008F7D8093CA00D9 |
:10CCB0008091CA008F7E8093CA008091CA00877FCE |
:10CCC0008093CA008091C9008B7F8093C9008091B6 |
:10CCD000CA0084608093CA008091CA0082608093F9 |
:10CCE000CA008091C800882334F48091CE008091DE |
:10CCF000C8008823D4F38091C90080688093C9005C |
:10CD000008951F920F920FB60F921124EF92FF9287 |
:10CD10000F931F932F933F934F935F936F937F9343 |
:10CD20008F939F93AF93BF93CF93DF93EF93FF9333 |
:10CD30000091CE008091CD039091CE030197C9F46C |
:10CD40001092CE031092CD0387E090E00E94AB15C5 |
:10CD50009093800580937F0510927A051092790553 |
:10CD6000109278051092770510927C0510927B0541 |
:10CD70004FC180917F05909180050E94B315482F87 |
:10CD800055278091770590917805892B99F4452B4B |
:10CD900009F41CC181E090E09093780580937705B9 |
:10CDA0008091790590917A05019690937A05809308 |
:10CDB00079050CC18091770590917805019799F4D8 |
:10CDC0004115510581F482E090E0909378058093BD |
:10CDD00077058091790590917A05019690937A056F |
:10CDE00080937905F3C0809177059091780502973B |
:10CDF00069F54115510551F5802F992790937C05D0 |
:10CE000080937B058091790590917A05029771F462 |
:10CE100050937E0540937D0580917B05882334F4F3 |
:10CE200081E090E090937E0580937D0583E090E023 |
:10CE300090937805809377058091790590917A0594 |
:10CE4000019690937A0580937905C0C0609177052B |
:10CE5000709178056330710509F0AAC0452B09F07F |
:10CE6000A7C082E090E09093780580937705809149 |
:10CE7000790590917A05019690937A0580937905CA |
:10CE800080917B0590917C05EC01D695C795D69550 |
:10CE9000C795CF70D0702196982F8827202F3327E1 |
:10CEA000822B932BAC015370CA01805092400E9498 |
:10CEB0002369AB01CB30D10508F088C0CE018C0FBF |
:10CEC0009D1FFC01E15AF74F808191819B01281B36 |
:10CED000390BC9011AF4909581959F4F06976CF410 |
:10CEE0008091B004883C30F48091B004865F8093D8 |
:10CEF000B00403C088EC8093B004CE018C0F9D1F5A |
:10CF0000FC01E15AF74F20813181C901880F991F37 |
:10CF10007C01E20EF31EE40EF51EC701FF200CF4A7 |
:10CF200003967C01F594E794F594E794CA01019681 |
:10CF30008E159F0524F40894E108F10808C0CA0181 |
:10CF40000197E816F9061CF40894E11CF11C809185 |
:10CF5000B004843BE0F0CE018C0F9D1F8C010B5878 |
:10CF6000174FFC01E15AF74F80819181F701E81BCF |
:10CF7000F90BCF0163E070E00E942369CB01880FB9 |
:10CF8000991F860F971FF8019183808308C0CE01F7 |
:10CF90008C0F9D1FFC01EB58F74F11821082CE01C0 |
:10CFA0008C0F9D1FFC01E15AF74FF182E0820EC009 |
:10CFB00081E090E09093CE038093CD0310927A05A8 |
:10CFC0001092790510927E0510927D058091790569 |
:10CFD00090917A054097A0F080917D0590917E0513 |
:10CFE000892B11F41092830310927A05109279051F |
:10CFF00010927E0510927D051092780510927705AB |
:10D0000087E090E00E94AB159093800580937F05A8 |
:10D01000FF91EF91DF91CF91BF91AF919F918F9150 |
:10D020007F916F915F914F913F912F911F910F9140 |
:10D03000FF90EF900F900FBE0F901F901895FC017E |
:10D040004150504030F001900616D1F73197CF0192 |
:10D0500008958827992708955058192E84D001D013 |
:10D060006AC0BA176207730784079507B1F188F49D |
:10D070000EF410940B2EBA2FA02D062E622F202D09 |
:10D08000072E732F302D082E842F402D092E952F1B |
:10D09000502DFF275523B9F0591B49F0573E98F002 |
:10D0A000469537952795A795F0405395C9F776F0A3 |
:10D0B000BA0F621F731F841F30F4879577956795A9 |
:10D0C000B795F040939517FA0F2E0895BF1BBB2715 |
:10D0D000BA0B620B730B840BF6CFDEF670C097FBB6 |
:10D0E0004ED09F3738F0FEE9F91B982F872F762F07 |
:10D0F0006B2F05C061C09695879577956795F15020 |
:10D10000D0F73EF490958095709561957F4F8F4F45 |
:10D110009F4F0895E89403C097FB0EF4F3DFB62FFA |
:10D12000672F782F892F9EE9002405C09A95BB0FA1 |
:10D13000661F771F881F11249923A1F08823B2F757 |
:10D140009F3F59F0BB0F48F421F4002011F460FF19 |
:10D1500004C06F5F7F4F8F4F9F4F881F97958795B4 |
:10D1600097F9089529C0052E092607FA440F551F7F |
:10D170005F3F79F0AA27A51708F051E04795880F7F |
:10D18000991F9F3F31F0BB27B91708F091E08795B1 |
:10D1900008959F919F91112414C097FB880F991FA8 |
:10D1A0009F3F31F0BB27B91708F091E087950895AC |
:10D1B0009F919F91112405C066277727882799277B |
:10D1C00008959FEF80EC0895629FD001739FF00156 |
:10D1D000829FE00DF11D649FE00DF11D929FF00D07 |
:10D1E000839FF00D749FF00D659FF00D9927729F3E |
:10D1F000B00DE11DF91F639FB00DE11DF91FBD01C9 |
:10D20000CF0111240895991B79E004C0991F961746 |
:10D2100008F0961B881F7A95C9F780950895AA1B78 |
:10D22000BB1B51E107C0AA1FBB1FA617B70710F011 |
:10D23000A61BB70B881F991F5A95A9F78095909543 |
:10D24000BC01CD01089597FB092E07260AD077FD72 |
:10D2500004D0E5DF06D000201AF4709561957F4F69 |
:10D260000895F6F7909581959F4F0895A1E21A2EA3 |
:10D27000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1F7A |
:10D28000A217B307E407F50720F0A21BB30BE40BCA |
:10D29000F50B661F771F881F991F1A9469F7609511 |
:10D2A0007095809590959B01AC01BD01CF010895CB |
:10D2B00097FB092E05260ED057FD04D0D7DF0AD0E4 |
:10D2C000001C38F450954095309521953F4F4F4FB5 |
:10D2D0005F4F0895F6F790958095709561957F4F13 |
:10D2E0008F4F9F4F0895F999FECFB2BDA1BDF89A17 |
:10D2F000119600B40895F7DF01921A94E1F70895AA |
:10D30000F999FECFB2BDA1BD00BC11960FB6F8943D |
:10D31000FA9AF99A0FBE08950190F2DF1A94E1F794 |
:02D3200008956E |
:10D322000A010151756164726F000001FF6401C856 |
:10D3320000416E676C654E69636B202020202020BF |
:10D3420020416E676C65526F6C6C2020202020207B |
:10D35200204163634E69636B20202020202020201F |
:10D3620020416363526F6C6C2020202020202020FB |
:10D37200204779726F476965722020202020202083 |
:10D382002048696768742056616C756520202020EA |
:10D39200204163635A2020202020202020202020AA |
:10D3A20020476173202020202020202020202020C0 |
:10D3B20020436F6D706173732056616C7565202018 |
:10D3C20020566F6C74616765202020202020202069 |
:10D3D20020456D7066616E6720202020202020206D |
:10D3E200204779726F204B6F6D706173732020201C |
:10D3F200204D6F746F722046726F6E742020202051 |
:10D40200204D6F746F72205265617220202020209F |
:10D41200204D6F746F72204C65667420202020208E |
:10D42200204D6F746F72205269676874202020202B |
:10D4320020202020202020202020202020202020EA |
:10D4420020202020202020202020202020202020DA |
:10D4520020202020202020202020202020202020CA |
:10D46200204D4B334D61672043616C537461746589 |
:10D4720020536572766F202020202020202020203B |
:10D48200202020202020202020202020202020209A |
:10D49200202020202020202020202020202020208A |
:10D4A200202020202020202020202020202020207A |
:10D4B200202020202020202020202020202020206A |
:10D4C200202020202020202020202020202020205A |
:10D4D200202020202020202020202020202020204A |
:10D4E200204B616C6D616E5F4D6178447269667448 |
:10D4F200202020202020202020202020202020202A |
:10D50200204E6176692053657269616C20446174B2 |
:10D51200614750535F4E69636B20202020202020FA |
:10D52200204750535F526F6C6C2020202020202017 |
:10D5320020FFFF01FC01FC016400C409C409007D55 |
:10D542000000FF0373737301010203040506070859 |
:10D55200090A48616C6C6F2057656C74000000000A |
:10D5620000000000000000000000000000000000B9 |
:10D5720000000000000000000000000000000000A9 |
:10D582000000000000000000000000000000000099 |
:10D592000000000000000000000000000000000089 |
:10D5A20000000D0153706F727400004E6F726D6156 |
:10D5B2006C0000426567696E6E657200006400F47B |
:10D5C2000190D0030090D003003801380130FB10E5 |
:10D5D2003A40089696020A64465A414064ECFF0BB0 |
:10D5E20005000004640A0B0D0B0C0E010101000082 |
:00000001FF |
/branches/V0.74d_ACC-HH_MartinR/Hex-Files/WasIstWas.txt |
---|
0,0 → 1,51 |
+++++++++++++++++++++++++ |
+ Flight-Ctrl: |
+++++++++++++++++++++++++ |
BootLoader_MEGA644_20MHZ_V0_1.hex |
Der Bootloader wird per ISP eingespielt |
Der Bootloader nur dann eingespielt werden, wenn noch nie ein Bootloader eingespielt wurde! |
Danach können Softwareupdates seriell eingespielt werden. |
Flight-Ctrl_MEGA644_Vx_yy.hex |
Aktuelle Firmware |
Wird per serielle Schnittstelle (durch den Bootloader) eingespielt |
//+++++++++++ |
// Quadro: |
// 1 |
// 4 3 |
// 2 |
//+++++++++++ |
// Reverse Props on 1 2 |
//+++++++++++ |
// Octo: |
// 1 2 |
// 8 3 |
// 7 4 |
// 6 5 |
//+++++++++++ |
//+++++++++++ |
// Octo2: |
// 1 |
// 8 2 |
// 7 3 |
// 6 4 |
// 5 |
//+++++++++++ |
//+++++++++++ |
// Octo3: |
// 1 |
// 2 |
// 8 7 3 4 |
// 5 |
// 6 |
//+++++++++++ |
// Reverse Props on octo: 1 3 5 7 |
/branches/V0.74d_ACC-HH_MartinR/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_ACC-HH_MartinR/Settings.h |
---|
--- Spectrum.c (nonexistent) |
+++ Spectrum.c (revision 1286) |
@@ -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_ACC-HH_MartinR/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_ACC-HH_MartinR/_Settings.h |
---|
0,0 → 1,43 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Abstimmung |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define ACC_AMPLIFY 6 |
#define FAKTOR_P 1 |
#define FAKTOR_I 0.0001 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Debug-Interface |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define SIO_DEBUG 1 // Soll der Debugger aktiviert sein? |
#define MIN_DEBUG_INTERVALL 250 // in diesem Intervall werden Degugdaten ohne Aufforderung gesendet |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Sender |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define K_NICK 0 |
#define K_ROLL 1 |
#define K_GAS 2 |
#define K_GIER 3 |
#define K_POTI1 4 |
#define K_POTI2 5 |
#define K_POTI3 6 |
#define K_POTI4 7 |
// +++++++++++++++++++++++++++++++ |
// + Getestete Settings: |
// +++++++++++++++++++++++++++++++ |
// Setting: Kamera |
// Stick_P:3 |
// Stick_D:0 |
// Gyro_P: 175 |
// Gyro_I: 175 |
// Ki_Anteil: 10 |
// +++++++++++++++++++++++++++++++ |
// + Getestete Settings: |
// +++++++++++++++++++++++++++++++ |
// Setting: Normal |
// Stick_P:2 |
// Stick_D:8 |
// Gyro_P: 80 |
// Gyro_I: 150 |
// Ki_Anteil: 5 |
/branches/V0.74d_ACC-HH_MartinR/analog.c |
---|
0,0 → 1,669 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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); |
} |
/* // MartinR: so war es |
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 |
*/ |
/* MartinR : geändert |
0 n |
1 r |
2 g |
3 L |
4 n |
5 r |
6 y |
7 x |
8 n |
9 r |
10 g |
11 L |
12 n |
13 r |
14 u |
15 z |
*/ |
//####################################################################################### |
// |
SIGNAL(SIG_ADC) |
//####################################################################################### |
{ |
static unsigned char kanal=0,state = 0; |
static signed int gier1, roll1, nick1, nick_filter, roll_filter; |
static signed int roll_alt1, roll_alt2, roll_alt3, nick_alt1, nick_alt2, nick_alt3; // MartinR: 4x Mittelung |
//static signed int roll_alt1, nick_alt1; // MartinR: 2x Mittelung |
static signed int accy, accx; |
/* // MartinR : so war es Anfang |
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; |
} |
*/ // MartinR : so war es Ende |
// MartinR : geändert Anfang |
switch(state++) |
{ |
case 0: |
nick1 = ADC; |
kanal = AD_ROLL; |
break; |
case 1: |
roll1 = ADC; |
kanal = AD_GIER; |
break; |
case 2: |
gier1 = ADC; |
kanal = AD_DRUCK; |
break; |
case 3: |
tmpLuftdruck += ADC; |
messanzahl_Druck ++; |
kanal = AD_NICK; |
break; |
case 4: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 5: |
roll1 += ADC; |
kanal = AD_ACC_Y; |
break; |
case 6: |
Aktuell_ay = NeutralAccY - ADC; |
AdWertAccRoll = (Aktuell_ay + accy); |
accy = Aktuell_ay; |
kanal = AD_ACC_X; |
break; |
case 7: |
Aktuell_ax = ADC - NeutralAccX; |
AdWertAccNick = (Aktuell_ax + accx); |
accx = Aktuell_ax; |
kanal = AD_NICK; |
break; |
case 8: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 9: |
roll1 += ADC; |
kanal = AD_GIER; |
break; |
case 10: |
if(PlatinenVersion == 10) AdWertGier = (ADC + gier1 + 1) / 2; |
else |
if(PlatinenVersion == 20) AdWertGier = 2047 - (ADC + gier1); |
else AdWertGier = (ADC + gier1); |
kanal = AD_DRUCK; |
break; |
case 11: |
// MartinR: neu |
tmpLuftdruck += ADC; |
//MessLuftdruck = tmpLuftdruck / 2; |
MessLuftdruck = ADC; |
if(++messanzahl_Druck >= 5) |
{ |
tmpLuftdruck -= 2616L * ExpandBaro; // -523.19 counts per 10 counts offset step |
tmpLuftdruck /= 2; |
messanzahl_Druck = 0; |
//HoeheD = (31 * HoeheD + (int) Parameter_Luftdruck_D * (int)((int)(StartLuftdruck - tmpLuftdruck) - HoehenWert))/32; // D-Anteil = neuerWert - AlterWert |
Luftdruck = (tmpLuftdruck + 7 * Luftdruck + 4) / 8; |
HoehenWert = StartLuftdruck - Luftdruck; |
//tmpLuftdruck /= 2; |
tmpLuftdruck = 0; |
} |
// Luftdruck = (tmpLuftdruck + 7 * Luftdruck + 4) / 8; |
// HoehenWert = 255 * ExpandBaro + StartLuftdruck - Luftdruck; // MartinR: zu Höhenregler |
kanal = AD_NICK; |
break; |
case 12: |
nick1 += ADC; |
//if(PlatinenVersion == 10) nick1 *= 2; else nick1 *= 4; // MartinR: so war es |
//if(PlatinenVersion == 10) ; else nick1 *= 2; // MartinR: 2x Mittelung |
if(PlatinenVersion == 10) nick1 /= 2; //else nick1 *= 1; // MartinR: 4x Mittelung |
//AdWertNick = nick1 / 8; // MartinR: so war es |
//AdWertNick = nick1 / 4; // MartinR: 2x Mittelung |
AdWertNick = nick1 / 2; // MartinR: 4x Mittelung |
// nick_filter = (nick_filter + nick1) / 2; // MartinR: so war es |
//nick_filter = (nick_alt1 + nick1); // MartinR: anderer Nick-Filter: 2x Mittelung |
nick_filter = (nick_alt3 +nick_alt2 +nick_alt1 + nick1); // MartinR: anderer Nick-Filter: 4x Mittelung |
nick_alt3 = nick_alt2; // MartinR: anderer Nick-Filter |
nick_alt2 = nick_alt1; // MartinR: anderer Nick-Filter |
nick_alt1 = nick1; // MartinR: anderer Nick-Filter |
HiResNick = nick_filter - AdNeutralNick; |
//AdWertNickFilter = (AdWertNickFilter + HiResNick) / 2; // MartinR: so war es |
AdWertNickFilter = HiResNick; // MartinR: Filter deaktiviert |
kanal = AD_ROLL; |
break; |
case 13: |
roll1 += ADC; |
// if(PlatinenVersion == 10) roll1 *= 2; else roll1 *= 4; // MartinR: so war es |
//if(PlatinenVersion == 10) ; else roll1 *= 2; // MartinR: 2x Mittelung |
if(PlatinenVersion == 10) roll1 /= 2; //else roll1 *= 1; // MartinR: 4x Mittelung |
// AdWertRoll = roll1 / 8; // MartinR: so war es |
//AdWertRoll = roll1 / 4; // MartinR: 2x Mittelung |
AdWertRoll = roll1 / 2; // MartinR: 4x Mittelung |
//roll_filter = (roll_filter + roll1) / 2; // MartinR: so war es |
//roll_filter = (roll_alt1 + roll1); // MartinR: anderer Nick-Filter: 2x Mittelung |
roll_filter = (roll_alt3 + roll_alt2 + roll_alt1 + roll1); // MartinR: anderer Nick-Filter: 4x Mittelung |
roll_alt3 = roll_alt2; // MartinR: anderer Nick-Filter |
roll_alt2 = roll_alt1; // MartinR: anderer Nick-Filter |
roll_alt1 = roll1; // MartinR: anderer Nick-Filter |
HiResRoll = roll_filter - AdNeutralRoll; |
//AdWertRollFilter = (AdWertRollFilter + HiResRoll) / 2; // MartinR: so war es |
AdWertRollFilter = HiResRoll; // MartinR: Filter deaktiviert |
kanal = AD_UBAT; |
break; |
case 14: |
UBat = (3 * UBat + ADC / 3) / 4; |
kanal = AD_ACC_Z; |
break; |
case 15: |
// AdWertAccHoch = (signed int) ADC - NeutralAccZ; // MartinR : so war es |
//AdWertAccHoch = ADC - NeutralAccZ; // MartinR: modifiziert für Tests |
/* // MartinR: deaktiviert |
if(AdWertAccHoch > 1) |
{ |
if(NeutralAccZ < 750) |
{ |
NeutralAccZ += 0.02; |
if(modell_fliegt < 500) NeutralAccZ += 0.1; |
} |
} |
else if(AdWertAccHoch < -1) |
{ |
if(NeutralAccZ > 550) |
{ |
NeutralAccZ -= 0.02; |
if(modell_fliegt < 500) NeutralAccZ -= 0.1; |
} |
} |
*/ // MartinR: deaktiviert Ende |
// messanzahl_AccHoch = 1; MartinR: deaktiviert, da nicht verwendet |
Aktuell_az = (Aktuell_az + ADC) / 2; |
AdWertAccHoch = Aktuell_az - NeutralAccZ; // MartinR: modifiziert für Tests |
//Mess_Integral_Hoch += AdWertAccHoch; // Integrieren // MartinR: zu Höhenregler in fc.c verschoben |
//Mess_Integral_Hoch -= Mess_Integral_Hoch / 1024; // dämfen // MartinR: zu Höhenregler in fc.c verschoben |
AdReady = 1; |
state = 0; |
kanal = AD_NICK; |
break; |
default: |
kanal = 0; state = 0; kanal = AD_NICK; |
break; |
} |
// MartinR : geändert Ende |
ADMUX = kanal; |
// if(state != 0) ANALOG_ON; // MartinR : so war es: |
// Bei jedem Reglerzyklus wurde nur der Ablauf der Reihenfolge der AD-Wandlungen angestoßen. |
// Solange die Reihe nicht durchgelaufen ist, wurde nach jeder AD-Wandlung die nächste AD-Wandlung über ANALOG_ON gestartet. |
// if(state != 0) ANALOG_START; // MartinR verschoben zu timer0 |
} |
/* |
//####################################################################################### |
// |
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_ACC-HH_MartinR/analog.h |
---|
0,0 → 1,48 |
#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 |
#define ANALOG_START ADCSRA |= (1<<ADSC) // MartinR |
#endif //_ANALOG_H |
/branches/V0.74d_ACC-HH_MartinR/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_ACC-HH_MartinR/fc.c |
---|
0,0 → 1,1892 |
/*####################################################################################### |
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" |
#include "mymath.c" // MartinR: für Killagreg´s Erweiterung |
#include "mymath.h" // MartinR: für Killagreg´s Erweiterung |
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; // MartinR : so war es |
volatile int NeutralAccZ = 0; // MartinR geändert |
volatile int NeutralAccZ2 = 0; // MartinR: für HP-Filter |
signed int h_p,h_d,h_delta,Ziel_d; // MartinR: P,D Anteil beim eigenen Höhenregler |
signed int SchwebeGas; // MartinR: für neuen Höhenregler |
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; |
unsigned char delay_Hoehenregler = 0; // MartinR: zur Begrenzung der Sinkgeschwindigkeit |
signed int delay_SchwebeGas = 0; // MartinR: zur Begrenzung der Sinkgeschwindigkeit |
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; //MartinR: so war es |
long HoehenWert = 0; //MartinR: geändert |
long HoehenWertalt = 0; //MartinR: Test |
unsigned char iHoehe; // MartinR: Zähler für HoeheD |
signed long HoehenWertSumme = 0; // MartinR: für neuen Höhenregler D-Anteil |
//int SollHoehe = 0;//MartinR: so war es |
long SollHoehe = 0;//MartinR: geändert |
int LageKorrekturRoll = 0,LageKorrekturNick = 0; |
//float Ki = FAKTOR_I; |
int Ki = 10300 / 33; |
int KiHH = 10300 / 33; // MartinR : für Ki bei HH über Schalter |
unsigned char Looping_Nick = 0,Looping_Roll = 0; |
unsigned char Looping_Links = 0, Looping_Rechts = 0, Looping_Unten = 0, Looping_Oben = 0; |
unsigned char Parameter_Luftdruck_D = 48; // Wert : 0-250 |
unsigned char Parameter_MaxHoehe = 251; // Wert : 0-250 |
unsigned char Parameter_Hoehe_P = 16; // Wert : 0-32 |
unsigned char Parameter_Hoehe_ACC_Wirkung = 58; // Wert : 0-250 |
unsigned char Parameter_KompassWirkung = 64; // Wert : 0-250 |
unsigned char Parameter_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;MartinR: so war es |
int MaxStickNick = 0,MaxStickRoll = 0,stick_nick_neutral = 0,stick_roll_neutral = 0; // MartinR: stick_.._neutral hinzugefügt |
unsigned int modell_fliegt = 0; |
volatile unsigned char MikroKopterFlags = 0; |
long GIER_GRAD_FAKTOR = 1291; |
signed int KopplungsteilNickRoll,KopplungsteilRollNick; |
unsigned char RequiredMotors = 4; |
unsigned char Motor[MAX_MOTORS]; |
signed int tmp_motorwert[MAX_MOTORS]; |
int MotorSmoothing(int neu, int alt) |
{ |
int motor; |
if(neu > alt) motor = (1*(int)alt + neu) / 2; |
//else motor = neu - (alt - neu)*1; // MartinR: so war es |
else motor = neu; // MartinR: Entsprechend Vorschlag von MartinW geändert |
//if(Poti2 < 20) return(neu); |
return(motor); |
} |
void Piep(unsigned char Anzahl) |
{ |
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; |
NeutralAccZ2 = 0; // MartinR |
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; |
NeutralAccZ2 = NeutralAccZ; // MartinR |
} |
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; |
static signed int oldNick2, oldRoll2 ; //MartinR : für geänderte d2* Ermittlung |
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; // MartinR: so war es |
IntegralAccZ += AdWertAccHoch;// MartinR: AdWertAccHoch = Aktuell_az - NeutralAccZ; in analog.c |
//++++++++++++++++++++++++++++++++++++++++++++++++ |
// ADC einschalten |
//ANALOG_ON; // MartinR : so war es |
// ANALOG_START; // MartinR verschoben zu timer0 |
AdReady = 0; |
//++++++++++++++++++++++++++++++++++++++++++++++++ |
if(Mess_IntegralRoll > 93000L) winkel_roll = 93000L; |
else if(Mess_IntegralRoll <-93000L) winkel_roll = -93000L; |
else winkel_roll = Mess_IntegralRoll; |
if(Mess_IntegralNick > 93000L) winkel_nick = 93000L; |
else if(Mess_IntegralNick <-93000L) winkel_nick = -93000L; |
else winkel_nick = Mess_IntegralNick; |
// Gier ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mess_Integral_Gier += MesswertGier; |
ErsatzKompass += MesswertGier; |
// Kopplungsanteil +++++++++++++++++++++++++++++++++++++ |
if((EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) || (Parameter_UserParam1 > 140)) IntegralFaktor = 0; // MartinR: zusätzlich |
//if(!Looping_Nick && !Looping_Roll && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV)) // MartinR : so war es |
if(!Looping_Nick && !Looping_Roll && IntegralFaktor && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV)) // MartinR: zusätzlich "&& IntegralFaktor" |
{ |
tmpl3 = (MesswertRoll * winkel_nick) / 2048L; |
tmpl3 *= Parameter_AchsKopplung2; //65 |
tmpl3 /= 4096L; |
tmpl4 = (MesswertNick * winkel_roll) / 2048L; |
tmpl4 *= Parameter_AchsKopplung2; //65 |
tmpl4 /= 4096L; |
KopplungsteilNickRoll = tmpl3; |
KopplungsteilRollNick = tmpl4; |
tmpl4 -= tmpl3; |
ErsatzKompass += tmpl4; |
if(!Parameter_CouplingYawCorrection) Mess_Integral_Gier -= tmpl4/2; // Gier nachhelfen |
tmpl = ((MesswertGier + tmpl4) * winkel_nick) / 2048L; |
tmpl *= Parameter_AchsKopplung1; // 90 |
tmpl /= 4096L; |
tmpl2 = ((MesswertGier + tmpl4) * winkel_roll) / 2048L; |
tmpl2 *= Parameter_AchsKopplung1; |
tmpl2 /= 4096L; |
if(abs(MesswertGier) > 64) if(labs(tmpl) > 128 || labs(tmpl2) > 128) TrichterFlug = 1; |
//MesswertGier += (Parameter_CouplingYawCorrection * tmpl4) / 256; |
} |
else tmpl = tmpl2 = KopplungsteilNickRoll = KopplungsteilRollNick = 0; |
TrimRoll = tmpl - tmpl2 / 100L; |
TrimNick = -tmpl2 + tmpl / 100L; |
// Kompasswert begrenzen ++++++++++++++++++++++++++++++++++++++++++++++++ |
if(ErsatzKompass >= (360L * GIER_GRAD_FAKTOR)) ErsatzKompass -= 360L * GIER_GRAD_FAKTOR; // 360° Umschlag |
if(ErsatzKompass < 0) ErsatzKompass += 360L * GIER_GRAD_FAKTOR; |
// Roll ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mess_IntegralRoll2 += MesswertRoll + TrimRoll; |
Mess_IntegralRoll += MesswertRoll + TrimRoll - LageKorrekturRoll; |
if(Mess_IntegralRoll > Umschlag180Roll) |
{ |
Mess_IntegralRoll = -(Umschlag180Roll - 25000L); |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
} |
if(Mess_IntegralRoll <-Umschlag180Roll) |
{ |
Mess_IntegralRoll = (Umschlag180Roll - 25000L); |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
} |
// Nick ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mess_IntegralNick2 += MesswertNick + TrimNick; |
Mess_IntegralNick += MesswertNick + TrimNick - LageKorrekturNick; |
if(Mess_IntegralNick > Umschlag180Nick) |
{ |
Mess_IntegralNick = -(Umschlag180Nick - 25000L); |
Mess_IntegralNick2 = Mess_IntegralNick; |
} |
if(Mess_IntegralNick <-Umschlag180Nick) |
{ |
Mess_IntegralNick = (Umschlag180Nick - 25000L); |
Mess_IntegralNick2 = Mess_IntegralNick; |
} |
Integral_Gier = Mess_Integral_Gier; |
IntegralNick = Mess_IntegralNick; |
IntegralRoll = Mess_IntegralRoll; |
IntegralNick2 = Mess_IntegralNick2; |
IntegralRoll2 = Mess_IntegralRoll2; |
#define D_LIMIT 128 |
//MesswertNick = HiResNick / 8;// MartinR : so war es |
//MesswertRoll = HiResRoll / 8;// MartinR : so war es |
MesswertNick = AdWertNickFilter / 8;// MartinR : anstelle HiResNick : AdWertNickFilter |
MesswertRoll = AdWertRollFilter / 8;// MartinR : ist im vergleich zu HiRes.. eimal mehr gemittelt |
// MartinR : so war es Anfang |
/* |
if(AdWertNick < 15) MesswertNick = -1000; if(AdWertNick < 7) MesswertNick = -2000; |
if(PlatinenVersion == 10) { if(AdWertNick > 1010) MesswertNick = +1000; if(AdWertNick > 1017) MesswertNick = +2000; } |
else { if(AdWertNick > 2000) MesswertNick = +1000; if(AdWertNick > 2015) MesswertNick = +2000; } |
if(AdWertRoll < 15) MesswertRoll = -1000; if(AdWertRoll < 7) MesswertRoll = -2000; |
if(PlatinenVersion == 10) { if(AdWertRoll > 1010) MesswertRoll = +1000; if(AdWertRoll > 1017) MesswertRoll = +2000; } |
else { if(AdWertRoll > 2000) MesswertRoll = +1000; if(AdWertRoll > 2015) MesswertRoll = +2000; } |
// MartinR : FC 1.0: Sprung von 500 auf 2000 !! FC-ME: Sprung von 1000 auf 2000 |
*/ |
// MartinR : so war es Ende |
// MartinR : Neu Anfang |
if(PlatinenVersion == 10) |
{ |
if(AdWertNick > 1010) MesswertNick = +600; |
if(AdWertNick > 1017) MesswertNick = +800; |
if(AdWertNick < 15) MesswertNick = -600; |
if(AdWertNick < 7) MesswertNick = -800; |
if(AdWertRoll > 1010) MesswertRoll = +600; |
if(AdWertRoll > 1017) MesswertRoll = +800; |
if(AdWertRoll < 15) MesswertRoll = -600; |
if(AdWertRoll < 7) MesswertRoll = -800; |
} |
else |
{ |
if(AdWertNick > 2000) MesswertNick = +1200; |
if(AdWertNick > 2015) MesswertNick = +1600; |
if(AdWertNick < 15) MesswertNick = -1200; |
if(AdWertNick < 7) MesswertNick = -1600; |
if(AdWertRoll > 2000) MesswertRoll = +1200; |
if(AdWertRoll > 2015) MesswertRoll = +1600; |
if(AdWertRoll < 15) MesswertRoll = -1200; |
if(AdWertRoll < 7) MesswertRoll = -1600; |
} |
// MartinR : Neu Ende |
if(Parameter_Gyro_D) |
{ |
/* MartinR: so war es Anfang |
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); |
*/ //MartinR: so war es Ende |
// MartinR :neu Anfang |
d2Nick = MesswertNick - oldNick2; |
oldNick2 = oldNick; |
oldNick = MesswertNick; |
if(d2Nick > D_LIMIT) d2Nick = D_LIMIT; |
else if(d2Nick < -D_LIMIT) d2Nick = -D_LIMIT; |
if(d2Nick > 0) d2Nick --; |
if(d2Nick < 0) d2Nick ++; |
MesswertNick += (d2Nick * (signed int) Parameter_Gyro_D) / 16; |
d2Roll = MesswertRoll - oldRoll2; |
oldRoll2 = oldRoll; |
oldRoll = MesswertRoll; |
if(d2Roll > D_LIMIT) d2Roll = D_LIMIT; |
else if(d2Roll < -D_LIMIT) d2Roll = -D_LIMIT; |
if(d2Roll > 0) d2Roll --; |
if(d2Roll < 0) d2Roll ++; |
MesswertRoll += (d2Roll * (signed int) Parameter_Gyro_D) / 16; |
// MartinR :neu Ende |
} |
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); |
if(Parameter_UserParam1 > 140) KiHH = 10300 / (Parameter_UserParam2 + 1); else KiHH = Ki; // MartinR : für HH über Schalter |
Parameter_NaviGpsModeControl = EE_Parameter.NaviGpsModeControl; //MartinR: Standard: EE_Parameter.NaviGpsModeControl wird übertragen |
if(!IntegralFaktor) Parameter_NaviGpsModeControl= 0; // MartinR: wenn HH dann GPS auf free- Mode |
// 0 = AID; 100 = free; 200 = coming home //so war es |
// 0 = free; 100 = AID; 200 = coming home //neu |
MAX_GAS = EE_Parameter.Gas_Max; |
MIN_GAS = EE_Parameter.Gas_Min; |
} |
//############################################################################ |
// |
void MotorRegler(void) |
//############################################################################ |
{ |
int pd_ergebnis_nick,pd_ergebnis_roll,h,tmp_int; |
int GierMischanteil,GasMischanteil; |
static long SummeNick=0,SummeRoll=0; |
static long SummeNickHH=0,SummeRollHH=0; // MartinR: Für ACC-HH Umschaltung |
static long sollGier = 0,tmp_long,tmp_long2; |
static long IntegralFehlerNick = 0; |
static long IntegralFehlerRoll = 0; |
static unsigned int RcLostTimer; |
static unsigned char delay_neutral = 0; |
static unsigned char delay_einschalten = 0,delay_ausschalten = 0; |
static 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; |
SchwebeGas = 0; // MartinR: für neuen Höhenregler |
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(); |
// MartinR: original: |
/* |
stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4; |
stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; |
StickNick = stick_nick - (GPS_Nick + GPS_Nick2); |
stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4; |
stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; |
StickRoll = stick_roll - (GPS_Roll + GPS_Roll2); |
*/ |
// MartinR: geändert Anfang |
if(Parameter_UserParam1 > 140) // MartinR: zweiter Stick_P Wert nur, wenn HH über Schalter aktiv ist |
{ |
stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * Parameter_UserParam3 - stick_nick_neutral) / 4; |
stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * Parameter_UserParam3 - stick_roll_neutral) / 4 ; |
} |
else |
stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4; |
stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4; |
if(IntegralFaktor) |
{ |
stick_nick_neutral = stick_nick; // beim Umschalten auf HH wird derletzte Stickwert als Neutralposition verwendet, MartinR |
stick_roll_neutral = stick_roll; // beim Umschalten auf HH wird derletzte Stickwert als Neutralposition verwendet, MartinR |
stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; |
stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; |
StickNick = stick_nick - (GPS_Nick + GPS_Nick2); // MartinR: GPS nur im ACC-Mode wirksam |
StickRoll = stick_roll - (GPS_Roll + GPS_Roll2); // MartinR: GPS nur im ACC-Mode wirksam |
} |
else // wenn HH , MartinR |
{ |
stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; // MartinR: eventuell vor if verschieben |
stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; // MartinR: eventuell vor if verschieben |
StickNick = stick_nick; // MartinR: GPS nur im ACC-Mode wirksam |
StickRoll = stick_roll; // MartinR: GPS nur im ACC-Mode wirksam |
} |
// MartinR: geändert Ende |
StickGier = -PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]; |
if(StickGier > 2) StickGier -= 2; else |
if(StickGier < -2) StickGier += 2; else StickGier = 0; |
StickGas = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] + 120; |
GyroFaktor = (Parameter_Gyro_P + 10.0); |
IntegralFaktor = Parameter_Gyro_I; |
GyroFaktorGier = (Parameter_Gyro_P + 10.0); |
IntegralFaktorGier = Parameter_Gyro_I; |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//+ Analoge Steuerung per Seriell |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// MartinR: ToDo: eventuell die Kombination HH und Steuerung per Seriell nicht zulassen?? |
if(ExternControl.Config & 0x01 && Parameter_ExternalControl > 128) |
{ |
StickNick += (int) ExternControl.Nick * (int) EE_Parameter.Stick_P; |
StickRoll += (int) ExternControl.Roll * (int) EE_Parameter.Stick_P; |
StickGier += ExternControl.Gier; |
ExternHoehenValue = (int) ExternControl.Hight * (int)EE_Parameter.Hoehe_Verstaerkung; |
if(ExternControl.Gas < StickGas) StickGas = ExternControl.Gas; |
} |
if(StickGas < 0) StickGas = 0; |
//if(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) IntegralFaktor = 0; // MartinR: Original |
if((EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) || (Parameter_UserParam1 > 140)) IntegralFaktor = 0; // MartinR |
if(GyroFaktor < 0) GyroFaktor = 0; |
if(IntegralFaktor < 0) IntegralFaktor = 0; |
if(abs(StickNick/STICK_GAIN) > MaxStickNick) |
{ |
MaxStickNick = abs(StickNick)/STICK_GAIN; |
if(MaxStickNick > 100) MaxStickNick = 100; |
} |
else MaxStickNick--; |
if(abs(StickRoll/STICK_GAIN) > MaxStickRoll) |
{ |
MaxStickRoll = abs(StickRoll)/STICK_GAIN; |
if(MaxStickRoll > 100) MaxStickRoll = 100; |
} |
else MaxStickRoll--; |
if(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) // MartinR: so war es |
if(Looping_Nick || Looping_Roll || !IntegralFaktor) // MartinR: "|| !IntegralFaktor" hinzugefügt |
{ |
IntegralAccNick = 0; |
IntegralAccRoll = 0; |
MittelIntegralNick = 0; |
MittelIntegralRoll = 0; |
MittelIntegralNick2 = 0; |
MittelIntegralRoll2 = 0; |
IntegralNick = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 |
IntegralRoll = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 |
Mess_IntegralNick = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 |
Mess_IntegralRoll = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 |
Mess_Integral_Gier = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 |
Mess_Integral_Gier2 = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 |
Mess_IntegralNick2 = Mess_IntegralNick; |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
ZaehlMessungen = 0; |
LageKorrekturNick = 0; |
LageKorrekturRoll = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!Looping_Nick && !Looping_Roll && (Aktuell_az > 512 || MotorenEin) && IntegralFaktor) // MartinR: "&& IntegralFaktor" hinzugefügt |
{ |
long tmp_long, tmp_long2; |
if(FromNaviCtrl_Value.Kalman_K != -1 /*&& !TrichterFlug*/) |
{ |
tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick); |
tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll); |
tmp_long = (tmp_long * FromNaviCtrl_Value.Kalman_K) / (32 * 16); |
tmp_long2 = (tmp_long2 * FromNaviCtrl_Value.Kalman_K) / (32 * 16); |
if((MaxStickNick > 64) || (MaxStickRoll > 64)) |
{ |
tmp_long /= 2; |
tmp_long2 /= 2; |
} |
if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25) |
{ |
tmp_long /= 3; |
tmp_long2 /= 3; |
} |
if(tmp_long > (long) FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long = (long) FromNaviCtrl_Value.Kalman_MaxFusion; |
if(tmp_long < (long)-FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long = (long)-FromNaviCtrl_Value.Kalman_MaxFusion; |
if(tmp_long2 > (long) FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long2 = (long) FromNaviCtrl_Value.Kalman_MaxFusion; |
if(tmp_long2 < (long)-FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long2 = (long)-FromNaviCtrl_Value.Kalman_MaxFusion; |
} |
else |
{ |
tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick); |
tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll); |
tmp_long /= 16; |
tmp_long2 /= 16; |
if((MaxStickNick > 64) || (MaxStickRoll > 64)) |
{ |
tmp_long /= 3; |
tmp_long2 /= 3; |
} |
if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25) |
{ |
tmp_long /= 3; |
tmp_long2 /= 3; |
} |
#define AUSGLEICH 32 |
if(tmp_long > AUSGLEICH) tmp_long = AUSGLEICH; |
if(tmp_long < -AUSGLEICH) tmp_long =-AUSGLEICH; |
if(tmp_long2 > AUSGLEICH) tmp_long2 = AUSGLEICH; |
if(tmp_long2 <-AUSGLEICH) tmp_long2 =-AUSGLEICH; |
} |
//if(Poti2 > 20) { tmp_long = 0; tmp_long2 = 0;} |
Mess_IntegralNick -= tmp_long; |
Mess_IntegralRoll -= tmp_long2; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(ZaehlMessungen >= ABGLEICH_ANZAHL) |
{ |
static int cnt = 0; |
static char last_n_p,last_n_n,last_r_p,last_r_n; |
static long MittelIntegralNick_Alt,MittelIntegralRoll_Alt; |
if(!Looping_Nick && !Looping_Roll && !TrichterFlug && EE_Parameter.Driftkomp && IntegralFaktor) // MartinR: "&& IntegralFaktor" hinzugefügt |
{ |
MittelIntegralNick /= ABGLEICH_ANZAHL; |
MittelIntegralRoll /= ABGLEICH_ANZAHL; |
IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL; |
IntegralAccRoll = (EE_Parameter.GyroAccFaktor * IntegralAccRoll) / ABGLEICH_ANZAHL; |
IntegralAccZ = IntegralAccZ / ABGLEICH_ANZAHL; |
#define MAX_I 0//(Poti2/10) |
// Nick ++++++++++++++++++++++++++++++++++++++++++++++++ |
IntegralFehlerNick = (long)(MittelIntegralNick - (long)IntegralAccNick); |
ausgleichNick = IntegralFehlerNick / EE_Parameter.GyroAccAbgleich; |
// Roll ++++++++++++++++++++++++++++++++++++++++++++++++ |
IntegralFehlerRoll = (long)(MittelIntegralRoll - (long)IntegralAccRoll); |
ausgleichRoll = IntegralFehlerRoll / EE_Parameter.GyroAccAbgleich; |
LageKorrekturNick = ausgleichNick / ABGLEICH_ANZAHL; |
LageKorrekturRoll = ausgleichRoll / ABGLEICH_ANZAHL; |
if(((MaxStickNick > 64) || (MaxStickRoll > 64) || (abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25)) && (FromNaviCtrl_Value.Kalman_K == -1)) |
{ |
LageKorrekturNick /= 2; |
LageKorrekturRoll /= 2; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gyro-Drift ermitteln |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
MittelIntegralNick2 /= ABGLEICH_ANZAHL; |
MittelIntegralRoll2 /= ABGLEICH_ANZAHL; |
tmp_long = IntegralNick2 - IntegralNick; |
tmp_long2 = IntegralRoll2 - IntegralRoll; |
//DebugOut.Analog[25] = MittelIntegralRoll2 / 26; |
IntegralFehlerNick = tmp_long; |
IntegralFehlerRoll = tmp_long2; |
Mess_IntegralNick2 -= IntegralFehlerNick; |
Mess_IntegralRoll2 -= IntegralFehlerRoll; |
// 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; // MartinR: DebugOut.Analog[20] wird in timer0.c ausgegeben!! |
// 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; |
if(!IntegralFaktor) // MartinR : hinzugefügt |
{ |
MesswertNick = (long) ((long)MesswertNick * GyroFaktor) / (256L / STICK_GAIN) ; // MartinR : hinzugefügt |
MesswertRoll = (long) ((long)MesswertRoll * GyroFaktor) / (256L / STICK_GAIN) ; // MartinR : hinzugefügt |
} |
else // MartinR so war es |
{ |
MesswertNick = IntegralNickMalFaktor + (long)((long)MesswertNick * GyroFaktor + (long)TrimNick * 128L) / (256L / STICK_GAIN); |
MesswertRoll = IntegralRollMalFaktor + (long)((long)MesswertRoll * GyroFaktor + (long)TrimRoll * 128L) / (256L / STICK_GAIN); |
} |
MesswertGier = (long)(MesswertGier * 2 * (long)GyroFaktorGier) / (256L / STICK_GAIN) + (long)(Integral_Gier * IntegralFaktorGier) / (2 * (44000 / STICK_GAIN)); |
// Maximalwerte abfangen |
// MartinR : Prüfen ob Unterscheidung nach Platinenversion erforderlich? |
// #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; |
// MartinR : so war es: |
/* |
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; |
*/ |
// MartinR: Neuer Höhenregler von MartinR: Anfang |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung |
{ |
int tmp_int; |
static char delay = 100; |
// Definitionen Vorschlag Killagreg Anfang |
#define HOOVER_GAS_AVERAGE 4192 // 4192 * 2ms = 8.2s averaging |
#define HEIGHT_CONTROL_GAS_AVERAGE 16 |
int16_t CosNick, CosRoll; |
//int16_t HeightControlGas; // MartinR: Schwebegas |
//static int16_t FilterHeightControlGas = 0; // MartinR: SchwebegasFilter |
static uint32_t HooverGasEstimation = 0; |
//static uint8_t delay = 100; |
int32_t tmp_long3; |
// Ende Definitionen Vorschlag Killagreg |
// calculate cos of nick and roll angle used for projection of the vertical hoover gas // Vorschlag von Killagerg: |
CosNick = IntegralNick/GIER_GRAD_FAKTOR; // nick angle in deg // =IntegralNick/GIER_GRAD_FAKTOR |
CHECK_MIN_MAX(CosNick, -60, 60); // limit nick angle |
CosNick = c_cos_8192(CosNick); |
CosRoll = IntegralRoll/GIER_GRAD_FAKTOR; // roll angle in deg |
CHECK_MIN_MAX(CosRoll, -60, 60); // limit roll angle |
CosRoll = c_cos_8192(CosRoll); |
// Neigungskorrektur ACCHoch: |
tmp_long3 = (int32_t) (NeutralAccZ-(Parameter_UserParam6*4)); // take current thrust |
tmp_long3 *= CosNick; // apply nick projection |
tmp_long3 /= 8192; tmp_long3 *= CosRoll; // apply roll projection |
tmp_long3 /= 8129; // average vertical projected thrust |
//Mess_Integral_Hoch += AdWertAccHoch; // Integrieren // MartinR: zu Höhenregler in fc.c verschoben |
//Mess_Integral_Hoch += tmp_long3; // Integrieren // MartinR: mit Neigungskorrektur // Test |
tmp_int = (int16_t) (AdWertAccHoch + NeutralAccZ - tmp_long3 - (Parameter_UserParam6*4)); |
if (tmp_int < 0) tmp_int ++ ; // MartinR: Digitalisierungsrauschen abmindern |
if (tmp_int > 0) tmp_int -- ; // MartinR: entspricht - 1 Bit |
Mess_Integral_Hoch += tmp_int; // Integrieren // MartinR: mit Neigungskorrektur |
Mess_Integral_Hoch -= Mess_Integral_Hoch / 256; // dämfen // MartinR: zu Höhenregler in fc.c verschoben |
CHECK_MIN_MAX(Mess_Integral_Hoch, -16000, 16000); // limit |
// MartinR: Änderungen HoheD und D-Anteil Höhenregler (h_d) Anfang : |
HoehenWertSumme += HoehenWert ; |
//if (++ iHoehe >= 40) // MartinR: Wartezeit um auch kleine Änderungsgeschwindigkeiten erkennen zu können |
if (++ iHoehe >= Parameter_UserParam5) // MartinR: Wartezeit einstellbar |
{ |
HoehenWertSumme = HoehenWertSumme / iHoehe ; // MartinR: Mittelwert während der Wartezeit |
HoeheD = (int) Parameter_Luftdruck_D * (HoehenWert - HoehenWertalt) ; |
if (HoeheD < 0) HoeheD += Parameter_Luftdruck_D ; // MartinR: Digitalisierungsrauschen abmindern |
if (HoeheD > 0) HoeheD -= Parameter_Luftdruck_D ; // MartinR: entspricht - 1 Bit vom Höhenwert |
iHoehe = 0 ; |
HoehenWertalt = HoehenWertSumme ; |
HoehenWertSumme = 0 ; |
} |
// D-Anteil berechnen: |
h_d = (int) (HoeheD)/(64/STICK_GAIN); // D-Anteil (8*8=64) |
// ACC-D-Anteil |
tmp_int = ((Mess_Integral_Hoch / 128) * (signed long) Parameter_Hoehe_ACC_Wirkung) / (128 / STICK_GAIN); |
if(tmp_int > 50*STICK_GAIN) tmp_int = 50*STICK_GAIN; |
else if(tmp_int < -(50*STICK_GAIN)) tmp_int = -(50*STICK_GAIN); |
h_d += tmp_int; // positiver D-Anteil bedeutet Steigen |
// MartinR: Änderungen HoheD und D-Anteil Höhenregler (h_d) Ende |
if(EE_Parameter.GlobalConfig & CFG_HOEHEN_SCHALTER) // Regler wird über Schalter gesteuert |
{ |
//if(Parameter_MaxHoehe < 50) // MartinR :so war es |
if(Parameter_MaxHoehe < 50 || (Parameter_UserParam1 > 140) ) // MartinR: Schalter aus oder HH über UsererParam1 an |
{ |
// Höhenregler nicht aktiv |
if(!delay--) |
{ |
#define OPA_OFFSET_STEP 10 |
if((MessLuftdruck > 1000) && (OCR0A < (255 - OPA_OFFSET_STEP)) ) |
{ |
ExpandBaro -= 1; |
OCR0A = DruckOffsetSetting - OPA_OFFSET_STEP * ExpandBaro; |
beeptime = 300; |
delay = 250; |
} |
else if((MessLuftdruck < 100) && (OCR0A > OPA_OFFSET_STEP)) |
{ |
ExpandBaro += 1; |
OCR0A = DruckOffsetSetting - OPA_OFFSET_STEP * ExpandBaro; |
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 // MartinR : so war es |
SollHoehe = HoehenWert; // MartinR : geändert |
HoehenReglerAktiv = 0; |
delay = 1; |
} |
} |
SollHoehe = HoehenWert; // MartinR: SollHoehe wird nachgeführt bis HoehenreglerAktiv = 1 |
//SchwebeGas = GasMischanteil; // MartinR: SchwebeGas wird nachgeführt bis HoehenreglerAktiv = 1 |
// Deaktiv wegen HooverGasEstimation/HOOVER_GAS_AVERAGE |
HoehenReglerAktiv = 0; // MartinR: zur Sicherheit |
} |
else // Schalter an und kein HH über Schalter |
{ |
HoehenReglerAktiv = 1; |
// Schwebegas ist der letzte GasMischanteil vor dem Aktivieren der Höhenregelung |
delay = 200; |
} |
} |
else // Sollhöhe über Poti |
{ |
//SollHoehe = ((int) ExternHoehenValue + (int) Parameter_MaxHoehe) * (int)EE_Parameter.Hoehe_Verstaerkung - 20; // MartinR : so war es |
//HoehenReglerAktiv = 1; // MartinR : so war es |
if(Parameter_UserParam1 > 140) // HH über Schalter: Höhenregler abgeschaltet, Nachführen von Parametern |
{ |
SollHoehe = HoehenWert; // SollHoehe wird nachgeführt bis HoehenreglerAktiv = 1 |
HoehenReglerAktiv = 0; |
} |
else // Höhenregler mit Sollhöhe über Poti aktiv |
{ |
// SchwebeGas = GasMischanteil; // SchwebeGas zunächst = Gasmischanteil bis bessere Lösung |
// Deaktiv wegen HooverGasEstimation/HOOVER_GAS_AVERAGE |
HoehenReglerAktiv = 1; |
// MartinR: Versuch Höhenregler zu verlangsamen. Steig- / Sinkrate im MK-Tool über UserParam4 einstellbar |
if (((int) ExternHoehenValue + (int) Parameter_MaxHoehe) * (int)EE_Parameter.Hoehe_Verstaerkung - 20 > SollHoehe) |
{ |
if(++delay_Hoehenregler > (Parameter_UserParam4 / 4)) |
{ |
delay_Hoehenregler = 0; |
SollHoehe ++ ; //MartinR: Höhenänderung begrenzen. |
} |
} |
else |
{ |
if (((int) ExternHoehenValue + (int) Parameter_MaxHoehe) * (int)EE_Parameter.Hoehe_Verstaerkung - 20 < SollHoehe) |
{ |
if(++delay_Hoehenregler > (Parameter_UserParam4 / 4)) |
{ |
delay_Hoehenregler = 0; |
SollHoehe -- ; //MartinR: Höhenänderung begrenzen. |
} |
} |
} |
} |
} |
if(Notlandung) SollHoehe = 0; |
if(HoehenReglerAktiv && !(Parameter_UserParam1 > 140)) // kein HH |
{ |
h_delta = (int) SollHoehe - (int) HoehenWert; // positiver Wert: MK ist unterhalb der Sollhöhe |
h_p = (h_delta * (int) Parameter_Hoehe_P) / (16 / STICK_GAIN); // Differenz bestimmen --> P-Anteil |
/* an Anfang Höhenregler verschoben, da h_d für Schwebegas- Abschätzung verwendet wird |
h_d = (int) (HoeheD)/(64/STICK_GAIN); // D-Anteil (8*8=64) |
// ACC-D-Anteil |
tmp_int = ((Mess_Integral_Hoch / 128) * (signed long) Parameter_Hoehe_ACC_Wirkung) / (128 / STICK_GAIN); |
if(tmp_int > 50*STICK_GAIN) tmp_int = 50*STICK_GAIN; |
else if(tmp_int < -(50*STICK_GAIN)) tmp_int = -(50*STICK_GAIN); |
h_d += tmp_int; // positiver D-Anteil bedeutet Steigen |
*/ |
//if(HooverGasEstimation == 0) HeightControlGas = GasMixFraction; // take stick gas // MartinR: SchwebeGas = GasMischanteil; |
if(HooverGasEstimation == 0) SchwebeGas = GasMischanteil; |
else SchwebeGas = (int16_t)(HooverGasEstimation/HOOVER_GAS_AVERAGE); // take hoover point |
// MartinR: SchwebeGas = HooverGasEstimation/HOOVER_GAS_AVERAGE |
h = SchwebeGas + h_p - h_d ; |
// strech by actual attitude projection // Neigungskorrektur |
tmp_long3 = (int32_t)h; // MartinR: HeightControlGas = h |
tmp_long3 *= 8192; tmp_long3 /= CosNick; |
tmp_long3 *= 8192; tmp_long3 /= CosRoll; |
h = (int16_t)tmp_long3; |
hoehenregler = (hoehenregler*7 + h) / 8; |
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 |
//else hoehenregler += (GasMischanteil-hoehenregler)/16 ; // um die Höhe noch leicht mit Gas korrigieren zu können |
//if(SchwebeGas < 20) SchwebeGas = 20; // nicht unter 20 |
GasMischanteil = hoehenregler; |
} |
else // Integratoren auf Null halten |
{ |
Mess_Integral_Hoch = 0; |
hoehenregler = GasMischanteil; |
// h_p = 0 ; |
// h_d = 0 ; |
} |
// Hoover gas estimation by averaging gas control output on small z-velocities |
// this is done only if height contol option is selected in global config and aircraft is flying |
if(MikroKopterFlags & FLAG_FLY) //MikroKopterFlags FLAG_FLY |
{ |
if(HooverGasEstimation == 0) HooverGasEstimation = HOOVER_GAS_AVERAGE * (uint32_t)GasMischanteil; // init estimation |
// HOOVER_GAS_AVERAGE= 4192 |
if(abs(h_d) < 8) |
{ |
tmp_long3 = (int32_t)GasMischanteil; // take current thrust |
tmp_long3 *= CosNick; // apply nick projection |
tmp_long3 /= 8192; tmp_long3 *= CosRoll; // apply roll projection |
tmp_long3 /= 8129; // average vertical projected thrust |
HooverGasEstimation -= HooverGasEstimation/HOOVER_GAS_AVERAGE; |
HooverGasEstimation += tmp_long3; |
} |
} |
DebugOut.Analog[16] = HooverGasEstimation/HOOVER_GAS_AVERAGE; |
//DebugOut.Analog[16] = Mess_Integral_Hoch; |
DebugOut.Analog[17] = h_d; |
} // EOF: EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG |
if(GasMischanteil > (MAX_GAS - 20) * STICK_GAIN) GasMischanteil = (MAX_GAS - 20) * STICK_GAIN; |
// MartinR: Ende neuer Höhenregler |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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 |
// MartinR : so war es Anfang |
/* |
if(IntegralFaktor) SummeNick += IntegralNickMalFaktor - StickNick; // I-Anteil bei Winkelregelung |
else SummeNick += DiffNick; // I-Anteil bei HH |
if(SummeNick > (STICK_GAIN * 16000L)) SummeNick = (STICK_GAIN * 16000L); |
if(SummeNick < -(16000L * STICK_GAIN)) SummeNick = -(16000L * STICK_GAIN); |
pd_ergebnis_nick = DiffNick + SummeNick / Ki; // PI-Regler für Nick |
// Motor Vorn |
*/ |
// MartinR : so war es Ende |
// MartinR : geändert Anfang |
if(IntegralFaktor) // MartinR : ACC-Mode |
{ |
SummeNick += IntegralNickMalFaktor - StickNick; // I-Anteil bei Winkelregelung |
if(SummeNick > (STICK_GAIN * 8000L)) SummeNick = (STICK_GAIN * 8000L); // MartinR : von 16000 auf 8000, da überlauf |
if(SummeNick < -(8000L * STICK_GAIN)) SummeNick = -(8000L * STICK_GAIN); // MartinR : von 16000 auf 8000, da überlauf |
pd_ergebnis_nick = DiffNick + (SummeNick / Ki); |
SummeNickHH = 0 ; |
} |
else // MartinR : HH-Mode |
{ |
SummeNickHH += DiffNick; // I-Anteil bei HH |
if(SummeNickHH > (STICK_GAIN * 8000L)) SummeNickHH = (STICK_GAIN * 8000L); // MartinR : von 16000 auf 8000, da überlauf |
if(SummeNickHH < -(8000L * STICK_GAIN)) SummeNickHH = -(8000L * STICK_GAIN); // MartinR : von 16000 auf 8000, da überlauf |
pd_ergebnis_nick = DiffNick + SummeNickHH / KiHH; // MartinR: PI-Regler für Nick bei HH |
SummeNick = 0; |
} |
// MartinR : geändert Ende |
tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
if(pd_ergebnis_nick > tmp_int) pd_ergebnis_nick = tmp_int; |
if(pd_ergebnis_nick < -tmp_int) pd_ergebnis_nick = -tmp_int; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Roll-Achse |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DiffRoll = MesswertRoll - StickRoll; // Differenz bestimmen |
// MartinR : so war es Anfang |
/* |
if(IntegralFaktor) SummeRoll += IntegralRollMalFaktor - StickRoll;// I-Anteil bei Winkelregelung |
else SummeRoll += DiffRoll; // I-Anteil bei HH |
if(SummeRoll > (STICK_GAIN * 16000L)) SummeRoll = (STICK_GAIN * 16000L); |
if(SummeRoll < -(16000L * STICK_GAIN)) SummeRoll = -(16000L * STICK_GAIN); |
pd_ergebnis_roll = DiffRoll + SummeRoll / Ki; // PI-Regler für Roll |
*/ |
// MartinR : so war es Ende |
// MartinR : geändert Anfang |
if(IntegralFaktor) // MartinR : ACC-Mode |
{ |
SummeRoll += IntegralRollMalFaktor - StickRoll; |
if(SummeRoll > (STICK_GAIN * 8000L)) SummeRoll = (STICK_GAIN * 8000L);// MartinR : von 16000 auf 8000, da überlauf |
if(SummeRoll < -(8000L * STICK_GAIN)) SummeRoll = -(8000L * STICK_GAIN);// MartinR : von 16000 auf 8000, da überlauf |
tmp_int = SummeRoll / Ki; |
pd_ergebnis_roll = DiffRoll + tmp_int; // MartinR: PI-Regler im ACC-Mode |
//SummeRollHH = (IntegralRollMalFaktor + tmp_int - stick_roll_neutral + (TrimRoll * STICK_GAIN / 2)) * KiHH;// MartinR: Startwert von SummeRollHH bei Umschaltung auf HH |
// MartinR: Hintergrund: pd_ergebnis_xx soll sich beim Umschalten nicht ändern! |
SummeRollHH = 0; |
} |
else // MartinR : HH-Mode |
{ |
SummeRollHH += DiffRoll; // I-Anteil bei HH |
if(SummeRollHH > (STICK_GAIN * 8000L)) SummeRollHH = (STICK_GAIN * 8000L);// MartinR : von 16000 auf 8000, da überlauf |
if(SummeRollHH < -(8000L * STICK_GAIN)) SummeRollHH = -(8000L * STICK_GAIN);// MartinR : von 16000 auf 8000, da überlauf |
pd_ergebnis_roll = DiffRoll + SummeRollHH / KiHH; // MartinR: PI-Regler für Roll bei HH |
SummeRoll = 0; |
} |
// MartinR : geändert Ende |
tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
if(pd_ergebnis_roll > tmp_int) pd_ergebnis_roll = tmp_int; |
if(pd_ergebnis_roll < -tmp_int) pd_ergebnis_roll = -tmp_int; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Universal Mixer |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
for(i=0; i<MAX_MOTORS; i++) |
{ |
signed int tmp_int; |
if(Mixer.Motor[i][0] > 0) |
{ |
tmp_int = ((long)GasMischanteil * Mixer.Motor[i][0]) / 64L; |
tmp_int += ((long)pd_ergebnis_nick * Mixer.Motor[i][1]) / 64L; |
tmp_int += ((long)pd_ergebnis_roll * Mixer.Motor[i][2]) / 64L; |
tmp_int += ((long)GierMischanteil * Mixer.Motor[i][3]) / 64L; |
tmp_motorwert[i] = MotorSmoothing(tmp_int,tmp_motorwert[i]); // Filter |
tmp_int = tmp_motorwert[i] / STICK_GAIN; |
CHECK_MIN_MAX(tmp_int,MIN_GAS,MAX_GAS); |
Motor[i] = tmp_int; |
} |
else Motor[i] = 0; |
} |
/* |
if(Poti1 > 20) Motor1 = 0; |
if(Poti1 > 90) Motor6 = 0; |
if(Poti1 > 140) Motor2 = 0; |
//if(Poti1 > 200) Motor7 = 0; |
*/ |
} |
/branches/V0.74d_ACC-HH_MartinR/fc.h |
---|
0,0 → 1,188 |
/*####################################################################################### |
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 long HoehenWert; // MartinR: war int |
extern long SollHoehe; // MartinR: war int |
extern int MesswertNick,MesswertRoll,MesswertGier; |
extern int AdNeutralNick,AdNeutralRoll,AdNeutralGier, Mittelwert_AccNick, Mittelwert_AccRoll; |
extern int NeutralAccX, NeutralAccY,Mittelwert_AccHoch; |
extern unsigned char HoehenReglerAktiv; |
// extern volatile float NeutralAccZ; // MartinR : so war es |
extern volatile int NeutralAccZ; // MartinR : geändert |
extern long Umschlag180Nick, Umschlag180Roll; |
extern signed int ExternStickNick,ExternStickRoll,ExternStickGier; |
extern unsigned char Parameter_UserParam1,Parameter_UserParam2,Parameter_UserParam3,Parameter_UserParam4,Parameter_UserParam5,Parameter_UserParam6,Parameter_UserParam7,Parameter_UserParam8; |
extern int NaviAccNick,NaviAccRoll,NaviCntAcc; |
extern unsigned int modell_fliegt; |
void MotorRegler(void); |
void SendMotorData(void); |
void CalibrierMittelwert(void); |
void Mittelwert(void); |
void SetNeutral(void); |
void Piep(unsigned char Anzahl); |
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 unsigned char Parameter_NaviGpsModeControl; // MartinR: wird wiederverwendet für GPS free bei HH |
extern signed char MixerTable[MAX_MOTORS][4]; |
extern unsigned char Motor[MAX_MOTORS]; |
#endif //_FC_H |
/branches/V0.74d_ACC-HH_MartinR/flight.pnproj |
---|
0,0 → 1,0 |
<Project name="Flight-Ctrl"><File path="uart.h"></File><File path="main.c"></File><File path="main.h"></File><File path="makefile"></File><File path="uart.c"></File><File path="printf_P.h"></File><File path="printf_P.c"></File><File path="timer0.c"></File><File path="timer0.h"></File><File path="old_macros.h"></File><File path="twimaster.c"></File><File path="version.txt"></File><File path="twimaster.h"></File><File path="rc.c"></File><File path="rc.h"></File><File path="fc.h"></File><File path="menu.h"></File><File path="menu.c"></File><File path="_Settings.h"></File><File path="analog.c"></File><File path="analog.h"></File><File path="GPS.c"></File><File path="gps.h"></File><File path="License.txt"></File><File path="eeprom.c"></File><File path="spi.h"></File><File path="spi.c"></File><File path="led.h"></File><File path="led.c"></File><File path="fc.c"></File><File path="Spectrum.c"></File><File path="Spectrum.h"></File><File path="mymath.h"></File><File path="mymath.c"></File></Project> |
/branches/V0.74d_ACC-HH_MartinR/flight.pnps |
---|
0,0 → 1,0 |
<pd><ViewState><e p="Flight-Ctrl" x="true"></e></ViewState></pd> |
/branches/V0.74d_ACC-HH_MartinR/gps.h |
---|
0,0 → 1,7 |
extern signed int GPS_Nick; |
extern signed int GPS_Roll; |
extern signed int GPS_Nick2; |
extern signed int GPS_Roll2; |
void GPS_Neutral(void); |
void GPS_BerechneZielrichtung(void); |
/branches/V0.74d_ACC-HH_MartinR/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_ACC-HH_MartinR/led.h |
---|
0,0 → 1,11 |
#include <avr/io.h> |
#define J16_ON PORTC |= (1<<PORTC2) |
#define J16_OFF PORTC &= ~(1<<PORTC2) |
#define J16_TOGGLE PORTC ^= (1<<PORTC2) |
#define J17_ON PORTC |= (1<<PORTC3) |
#define J17_OFF PORTC &= ~(1<<PORTC3) |
#define J17_TOGGLE PORTC ^= (1<<PORTC3) |
extern void LED_Init(void); |
extern void LED_Update(void); |
/branches/V0.74d_ACC-HH_MartinR/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_ACC-HH_MartinR/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_ACC-HH_MartinR/makefile |
---|
0,0 → 1,451 |
#-------------------------------------------------------------------- |
# 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_MartinR |
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 MartinR: so war es |
# MartinR: mit meinen Änderungen ist der Compiler mit OPT 2 nicht mehr durchgelaufen. Daher OPT = 1 |
OPT = 1 |
########################################################################################################## |
# List C source files here. (C dependencies are automatically generated.) |
SRC = main.c uart.c printf_P.c timer0.c analog.c menu.c |
SRC += twimaster.c rc.c fc.c GPS.c spi.c led.c Spectrum.c |
########################################################################################################## |
# 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_ACC-HH_MartinR/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_ACC-HH_MartinR/menu.h |
---|
0,0 → 1,9 |
extern void Menu(void); |
extern void LcdClear(void); |
extern char DisplayBuff[80]; |
extern unsigned char DispPtr; |
extern unsigned char MaxMenue; |
extern unsigned char MenuePunkt; |
extern unsigned char RemoteKeys; |
/branches/V0.74d_ACC-HH_MartinR/old_macros.h |
---|
0,0 → 1,47 |
/* |
For backwards compatibility only. |
Ingo Busker ingo@mikrocontroller.com |
*/ |
#ifndef cbi |
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) |
#endif |
#ifndef sbi |
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) |
#endif |
#ifndef inb |
#define inb(sfr) _SFR_BYTE(sfr) |
#endif |
#ifndef outb |
#define outb(sfr, val) (_SFR_BYTE(sfr) = (val)) |
#endif |
#ifndef inw |
#define inw(sfr) _SFR_WORD(sfr) |
#endif |
#ifndef outw |
#define outw(sfr, val) (_SFR_WORD(sfr) = (val)) |
#endif |
#ifndef outp |
#define outp(val, sfr) outb(sfr, val) |
#endif |
#ifndef inp |
#define inp(sfr) inb(sfr) |
#endif |
#ifndef BV |
#define BV(bit) _BV(bit) |
#endif |
#ifndef PRG_RDB |
#define PRG_RDB pgm_read_byte |
#endif |
/branches/V0.74d_ACC-HH_MartinR/printf_P.c |
---|
0,0 → 1,480 |
// Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist nicht von der Lizenz für den MikroKopter-Teil unterstellt |
/* |
Copyright (C) 1993 Free Software Foundation |
This file is part of the GNU IO Library. This library is free |
software; you can redistribute it and/or modify it under the |
terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) |
any later version. |
This library is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this library; see the file COPYING. If not, write to the Free |
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
As a special exception, if you link this library with files |
compiled with a GNU compiler to produce an executable, this does not cause |
the resulting executable to be covered by the GNU General Public License. |
This exception does not however invalidate any other reasons why |
the executable file might be covered by the GNU General Public License. */ |
/* |
* Copyright (c) 1990 Regents of the University of California. |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. [rescinded 22 July 1999] |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
/****************************************************************************** |
This file is a patched version of printf called _printf_P |
It is made to work with avr-gcc for Atmel AVR MCUs. |
There are some differences from standard printf: |
1. There is no floating point support (with fp the code is about 8K!) |
2. Return type is void |
3. Format string must be in program memory (by using macro printf this is |
done automaticaly) |
4. %n is not implemented (just remove the comment around it if you need it) |
5. If LIGHTPRINTF is defined, the code is about 550 bytes smaller and the |
folowing specifiers are disabled : |
space # * . - + p s o O |
6. A function void uart_sendchar(char c) is used for output. The UART must |
be initialized before using printf. |
Alexander Popov |
sasho@vip.orbitel.bg |
******************************************************************************/ |
/* |
* Actual printf innards. |
* |
* This code is large and complicated... |
*/ |
#include <string.h> |
#ifdef __STDC__ |
#include <stdarg.h> |
#else |
#include <varargs.h> |
#endif |
#include "main.h" |
//#define LIGHTPRINTF |
char PrintZiel; |
char Putchar(char zeichen) |
{ |
if(PrintZiel == OUT_LCD) { DisplayBuff[DispPtr++] = zeichen; return(1);} |
else return(uart_putchar(zeichen)); |
} |
void PRINT(const char * ptr, unsigned int len) |
{ |
for(;len;len--) Putchar(*ptr++); |
} |
void PRINTP(const char * ptr, unsigned int len) |
{ |
for(;len;len--) Putchar(pgm_read_byte(ptr++)); |
} |
void PAD_SP(signed char howmany) |
{ |
for(;howmany>0;howmany--) Putchar(' '); |
} |
void PAD_0(signed char howmany) |
{ |
for(;howmany>0;howmany--) Putchar('0'); |
} |
#define BUF 40 |
/* |
* Macros for converting digits to letters and vice versa |
*/ |
#define to_digit(c) ((c) - '0') |
#define is_digit(c) ((c)<='9' && (c)>='0') |
#define to_char(n) ((n) + '0') |
/* |
* Flags used during conversion. |
*/ |
#define LONGINT 0x01 /* long integer */ |
#define LONGDBL 0x02 /* long double; unimplemented */ |
#define SHORTINT 0x04 /* short integer */ |
#define ALT 0x08 /* alternate form */ |
#define LADJUST 0x10 /* left adjustment */ |
#define ZEROPAD 0x20 /* zero (as opposed to blank) pad */ |
#define HEXPREFIX 0x40 /* add 0x or 0X prefix */ |
void _printf_P (char ziel,char const *fmt0, ...) /* Works with string from FLASH */ |
{ |
va_list ap; |
register const char *fmt; /* format string */ |
register char ch; /* character from fmt */ |
register int n; /* handy integer (short term usage) */ |
register char *cp; /* handy char pointer (short term usage) */ |
const char *fmark; /* for remembering a place in fmt */ |
register unsigned char flags; /* flags as above */ |
signed char width; /* width from format (%8d), or 0 */ |
signed char prec; /* precision from format (%.3d), or -1 */ |
char sign; /* sign prefix (' ', '+', '-', or \0) */ |
unsigned long _ulong=0; /* integer arguments %[diouxX] */ |
#define OCT 8 |
#define DEC 10 |
#define HEX 16 |
unsigned char base; /* base for [diouxX] conversion */ |
signed char dprec; /* a copy of prec if [diouxX], 0 otherwise */ |
signed char dpad; /* extra 0 padding needed for integers */ |
signed char fieldsz; /* field size expanded by sign, dpad etc */ |
/* The initialization of 'size' is to suppress a warning that |
'size' might be used unitialized. It seems gcc can't |
quite grok this spaghetti code ... */ |
signed char size = 0; /* size of converted field or string */ |
char buf[BUF]; /* space for %c, %[diouxX], %[eEfgG] */ |
char ox[2]; /* space for 0x hex-prefix */ |
PrintZiel = ziel; // bestimmt, LCD oder UART |
va_start(ap, fmt0); |
fmt = fmt0; |
/* |
* Scan the format for conversions (`%' character). |
*/ |
for (;;) { |
for (fmark = fmt; (ch = pgm_read_byte(fmt)) != '\0' && ch != '%'; fmt++) |
/* void */; |
if ((n = fmt - fmark) != 0) { |
PRINTP(fmark, n); |
} |
if (ch == '\0') |
goto done; |
fmt++; /* skip over '%' */ |
flags = 0; |
dprec = 0; |
width = 0; |
prec = -1; |
sign = '\0'; |
rflag: ch = PRG_RDB(fmt++); |
reswitch: |
#ifdef LIGHTPRINTF |
if (ch=='o' || ch=='u' || (ch|0x20)=='x') { |
#else |
if (ch=='u' || (ch|0x20)=='x') { |
#endif |
if (flags&LONGINT) { |
_ulong=va_arg(ap, unsigned long); |
} else { |
register unsigned int _d; |
_d=va_arg(ap, unsigned int); |
_ulong = flags&SHORTINT ? (unsigned long)(unsigned short)_d : (unsigned long)_d; |
} |
} |
#ifndef LIGHTPRINTF |
if(ch==' ') { |
/* |
* ``If the space and + flags both appear, the space |
* flag will be ignored.'' |
* -- ANSI X3J11 |
*/ |
if (!sign) |
sign = ' '; |
goto rflag; |
} else if (ch=='#') { |
flags |= ALT; |
goto rflag; |
} else if (ch=='*'||ch=='-') { |
if (ch=='*') { |
/* |
* ``A negative field width argument is taken as a |
* - flag followed by a positive field width.'' |
* -- ANSI X3J11 |
* They don't exclude field widths read from args. |
*/ |
if ((width = va_arg(ap, int)) >= 0) |
goto rflag; |
width = -width; |
} |
flags |= LADJUST; |
flags &= ~ZEROPAD; /* '-' disables '0' */ |
goto rflag; |
} else if (ch=='+') { |
sign = '+'; |
goto rflag; |
} else if (ch=='.') { |
if ((ch = PRG_RDB(fmt++)) == '*') { |
n = va_arg(ap, int); |
prec = n < 0 ? -1 : n; |
goto rflag; |
} |
n = 0; |
while (is_digit(ch)) { |
n = n*10 + to_digit(ch); |
ch = PRG_RDB(fmt++); |
} |
prec = n < 0 ? -1 : n; |
goto reswitch; |
} else |
#endif /* LIGHTPRINTF */ |
if (ch=='0') { |
/* |
* ``Note that 0 is taken as a flag, not as the |
* beginning of a field width.'' |
* -- ANSI X3J11 |
*/ |
if (!(flags & LADJUST)) |
flags |= ZEROPAD; /* '-' disables '0' */ |
goto rflag; |
} else if (ch>='1' && ch<='9') { |
n = 0; |
do { |
n = 10 * n + to_digit(ch); |
ch = PRG_RDB(fmt++); |
} while (is_digit(ch)); |
width = n; |
goto reswitch; |
} else if (ch=='h') { |
flags |= SHORTINT; |
goto rflag; |
} else if (ch=='l') { |
flags |= LONGINT; |
goto rflag; |
} else if (ch=='c') { |
*(cp = buf) = va_arg(ap, int); |
size = 1; |
sign = '\0'; |
} else if (ch=='D'||ch=='d'||ch=='i') { |
if(ch=='D') |
flags |= LONGINT; |
if (flags&LONGINT) { |
_ulong=va_arg(ap, long); |
} else { |
register int _d; |
_d=va_arg(ap, int); |
_ulong = flags&SHORTINT ? (long)(short)_d : (long)_d; |
} |
if ((long)_ulong < 0) { |
_ulong = -_ulong; |
sign = '-'; |
} |
base = DEC; |
goto number; |
} else |
/* |
if (ch=='n') { |
if (flags & LONGINT) |
*va_arg(ap, long *) = ret; |
else if (flags & SHORTINT) |
*va_arg(ap, short *) = ret; |
else |
*va_arg(ap, int *) = ret; |
continue; // no output |
} else |
*/ |
#ifndef LIGHTPRINTF |
if (ch=='O'||ch=='o') { |
if (ch=='O') |
flags |= LONGINT; |
base = OCT; |
goto nosign; |
} else if (ch=='p') { |
/* |
* ``The argument shall be a pointer to void. The |
* value of the pointer is converted to a sequence |
* of printable characters, in an implementation- |
* defined manner.'' |
* -- ANSI X3J11 |
*/ |
/* NOSTRICT */ |
_ulong = (unsigned int)va_arg(ap, void *); |
base = HEX; |
flags |= HEXPREFIX; |
ch = 'x'; |
goto nosign; |
} else if (ch=='s') { // print a string from RAM |
if ((cp = va_arg(ap, char *)) == NULL) { |
cp=buf; |
cp[0] = '('; |
cp[1] = 'n'; |
cp[2] = 'u'; |
cp[4] = cp[3] = 'l'; |
cp[5] = ')'; |
cp[6] = '\0'; |
} |
if (prec >= 0) { |
/* |
* can't use strlen; can only look for the |
* NUL in the first `prec' characters, and |
* strlen() will go further. |
*/ |
char *p = (char*)memchr(cp, 0, prec); |
if (p != NULL) { |
size = p - cp; |
if (size > prec) |
size = prec; |
} else |
size = prec; |
} else |
size = strlen(cp); |
sign = '\0'; |
} else |
#endif /* LIGHTPRINTF */ |
if(ch=='U'||ch=='u') { |
if (ch=='U') |
flags |= LONGINT; |
base = DEC; |
goto nosign; |
} else if (ch=='X'||ch=='x') { |
base = HEX; |
/* leading 0x/X only if non-zero */ |
if (flags & ALT && _ulong != 0) |
flags |= HEXPREFIX; |
/* unsigned conversions */ |
nosign: sign = '\0'; |
/* |
* ``... diouXx conversions ... if a precision is |
* specified, the 0 flag will be ignored.'' |
* -- ANSI X3J11 |
*/ |
number: if ((dprec = prec) >= 0) |
flags &= ~ZEROPAD; |
/* |
* ``The result of converting a zero value with an |
* explicit precision of zero is no characters.'' |
* -- ANSI X3J11 |
*/ |
cp = buf + BUF; |
if (_ulong != 0 || prec != 0) { |
register unsigned char _d,notlastdigit; |
do { |
notlastdigit=(_ulong>=base); |
_d = _ulong % base; |
if (_d<10) { |
_d+='0'; |
} else { |
_d+='a'-10; |
if (ch=='X') _d&=~0x20; |
} |
*--cp=_d; |
_ulong /= base; |
} while (notlastdigit); |
#ifndef LIGHTPRINTF |
// handle octal leading 0 |
if (base==OCT && flags & ALT && *cp != '0') |
*--cp = '0'; |
#endif |
} |
size = buf + BUF - cp; |
} else { //default |
/* "%?" prints ?, unless ? is NUL */ |
if (ch == '\0') |
goto done; |
/* pretend it was %c with argument ch */ |
cp = buf; |
*cp = ch; |
size = 1; |
sign = '\0'; |
} |
/* |
* All reasonable formats wind up here. At this point, |
* `cp' points to a string which (if not flags&LADJUST) |
* should be padded out to `width' places. If |
* flags&ZEROPAD, it should first be prefixed by any |
* sign or other prefix; otherwise, it should be blank |
* padded before the prefix is emitted. After any |
* left-hand padding and prefixing, emit zeroes |
* required by a decimal [diouxX] precision, then print |
* the string proper, then emit zeroes required by any |
* leftover floating precision; finally, if LADJUST, |
* pad with blanks. |
*/ |
/* |
* compute actual size, so we know how much to pad. |
*/ |
fieldsz = size; |
dpad = dprec - size; |
if (dpad < 0) |
dpad = 0; |
if (sign) |
fieldsz++; |
else if (flags & HEXPREFIX) |
fieldsz += 2; |
fieldsz += dpad; |
/* right-adjusting blank padding */ |
if ((flags & (LADJUST|ZEROPAD)) == 0) |
PAD_SP(width - fieldsz); |
/* prefix */ |
if (sign) { |
PRINT(&sign, 1); |
} else if (flags & HEXPREFIX) { |
ox[0] = '0'; |
ox[1] = ch; |
PRINT(ox, 2); |
} |
/* right-adjusting zero padding */ |
if ((flags & (LADJUST|ZEROPAD)) == ZEROPAD) |
PAD_0(width - fieldsz); |
/* leading zeroes from decimal precision */ |
PAD_0(dpad); |
/* the string or number proper */ |
PRINT(cp, size); |
/* left-adjusting padding (always blank) */ |
if (flags & LADJUST) |
PAD_SP(width - fieldsz); |
} |
done: |
va_end(ap); |
} |
/branches/V0.74d_ACC-HH_MartinR/printf_P.h |
---|
0,0 → 1,19 |
#ifndef _PRINTF_P_H_ |
#define _PRINTF_P_H_ |
#include <avr/pgmspace.h> |
#define OUT_V24 0 |
#define OUT_LCD 1 |
void _printf_P (char, char const *fmt0, ...); |
extern char PrintZiel; |
#define printf_P(format, args...) _printf_P(OUT_V24,format , ## args) |
#define printf(format, args...) _printf_P(OUT_V24,PSTR(format) , ## args) |
#define LCD_printfxy(x,y,format, args...) { DispPtr = y * 20 + x; _printf_P(OUT_LCD,PSTR(format) , ## args);} |
#define LCD_printf(format, args...) { _printf_P(OUT_LCD,PSTR(format) , ## args);} |
#endif |
/branches/V0.74d_ACC-HH_MartinR/rc.c |
---|
0,0 → 1,123 |
/*####################################################################################### |
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; // MartinR: so war es |
if(SenderOkay >= 195) PPM_diff[index] = (tmp - PPM_in[index]); // MartinR: Optimiert |
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_ACC-HH_MartinR/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_ACC-HH_MartinR/spi.c |
---|
0,0 → 1,283 |
// ######################## 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(); // MartinR: Interrupt wird zu lange abgeschaltet (130us). Daher deaktiviert |
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 // MartinR: so war es |
ToNaviCtrl.Param.Byte[0] = Parameter_NaviGpsModeControl; // MartinR: wird wiederverwendet für GPS free bei HH |
ToNaviCtrl.Param.Byte[1] = EE_Parameter.NaviGpsGain; |
ToNaviCtrl.Param.Byte[2] = EE_Parameter.NaviGpsP; |
ToNaviCtrl.Param.Byte[3] = EE_Parameter.NaviGpsI; |
ToNaviCtrl.Param.Byte[4] = EE_Parameter.NaviGpsD; |
ToNaviCtrl.Param.Byte[5] = EE_Parameter.NaviGpsACC; |
ToNaviCtrl.Param.Byte[6] = EE_Parameter.NaviGpsMinSat; |
ToNaviCtrl.Param.Byte[7] = EE_Parameter.NaviStickThreshold; |
ToNaviCtrl.Param.Byte[8] = EE_Parameter.NaviOperatingRadius; |
ToNaviCtrl.Param.Byte[9] = EE_Parameter.NaviWindCorrection; |
ToNaviCtrl.Param.Byte[10] = EE_Parameter.NaviSpeedCompensation; |
ToNaviCtrl.Param.Byte[11] = EE_Parameter.NaviAngleLimitation; |
break; |
case SPI_CMD_STICK: |
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(); // MartinR: Interrupt wird zu lange abgeschaltet (130us). Daher deaktiviert |
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_ACC-HH_MartinR/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_ACC-HH_MartinR/timer0.c |
---|
0,0 → 1,432 |
#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--; |
ANALOG_START; // MartinR: um Start AD zu steuern. 16 AD-Wandlungen mit 8kHz= 500 Hz |
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) |
{ |
//--------------------------- |
// 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) |
{ // inverting movement of servo |
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_ACC-HH_MartinR/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_ACC-HH_MartinR/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_ACC-HH_MartinR/twimaster.h |
---|
0,0 → 1,35 |
/*############################################################################ |
############################################################################*/ |
#ifndef _I2C_MASTER_H |
#define _I2C_MASTER_H |
//############################################################################ |
// I2C Konstanten |
#define SCL_CLOCK 200000L |
#define I2C_TIMEOUT 30000 |
#define I2C_START 0x08 |
#define I2C_REPEATED_START 0x10 |
#define I2C_TX_SLA_ACK 0x18 |
#define I2C_TX_DATA_ACK 0x28 |
#define I2C_RX_SLA_ACK 0x40 |
#define I2C_RX_DATA_ACK 0x50 |
//############################################################################ |
extern volatile unsigned char twi_state; |
extern unsigned char motor,MissingMotor; |
extern unsigned char motorread; |
extern unsigned char motor_rx[]; |
extern unsigned char MotorPresent[]; |
extern unsigned char MotorError[]; |
void i2c_reset(void); |
extern void i2c_init (void); // I2C initialisieren |
extern void i2c_start (void); // Start I2C |
extern void i2c_stop (void); // Stop I2C |
extern void i2c_write_byte (char byte); // 1 Byte schreiben |
extern void i2c_reset(void); |
#endif |
/branches/V0.74d_ACC-HH_MartinR/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_ACC-HH_MartinR/uart.h |
---|
0,0 → 1,136 |
#ifndef _UART_H |
#define _UART_H |
#define MAX_SENDE_BUFF 150 |
#define MAX_EMPFANGS_BUFF 150 |
void BearbeiteRxDaten(void); |
extern unsigned char DebugGetAnforderung; |
extern unsigned volatile char SendeBuffer[MAX_SENDE_BUFF]; |
extern unsigned volatile char RxdBuffer[MAX_EMPFANGS_BUFF]; |
extern unsigned volatile char UebertragungAbgeschlossen; |
extern unsigned volatile char PC_DebugTimeout; |
extern unsigned volatile char NeueKoordinateEmpfangen; |
extern unsigned volatile char PC_MotortestActive; |
extern unsigned char MeineSlaveAdresse; |
extern unsigned char PcZugriff; |
extern unsigned char RemotePollDisplayLine; |
extern int Debug_Timer,Kompass_Timer; |
extern void UART_Init (void); |
extern int uart_putchar (char c); |
extern void boot_program_page (uint32_t page, uint8_t *buf); |
extern void DatenUebertragung(void); |
extern void Uart1Init(void); |
extern void BearbeiteRxDaten(void); |
extern unsigned char MotorTest[16]; |
struct str_DebugOut |
{ |
unsigned char Digital[2]; |
signed int Analog[32]; // Debugwerte |
}; |
extern struct str_DebugOut DebugOut; |
struct str_WinkelOut |
{ |
signed int Winkel[2]; |
unsigned char UserParameter[2]; |
unsigned char CalcState; |
unsigned char Orientation; |
}; |
extern struct str_WinkelOut WinkelOut; |
struct str_Data3D |
{ |
signed int Winkel[3]; // nick, roll, compass in 0,1° |
signed char reserve[8]; |
}; |
extern struct str_Data3D Data3D; |
struct str_ExternControl |
{ |
unsigned char Digital[2]; |
unsigned char RemoteTasten; |
signed char Nick; |
signed char Roll; |
signed char Gier; |
unsigned char Gas; |
signed char Hight; |
unsigned char free; |
unsigned char Frame; |
unsigned char Config; |
}; |
extern struct str_ExternControl ExternControl; |
struct str_VersionInfo |
{ |
unsigned char SWMajor; |
unsigned char SWMinor; |
unsigned char ProtoMajor; |
unsigned char ProtoMinor; |
unsigned char SWPatch; |
unsigned char Reserved[5]; |
}; |
extern struct str_VersionInfo VersionInfo; |
//Die Baud_Rate der Seriellen Schnittstelle ist 9600 Baud |
//#define BAUD_RATE 9600 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 14400 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 28800 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 38400 //Baud Rate für die Serielle Schnittstelle |
#define BAUD_RATE 57600 //Baud Rate für die Serielle Schnittstelle |
//Anpassen der seriellen Schnittstellen Register wenn ein ATMega128 benutzt wird |
#if defined (__AVR_ATmega128__) |
# define USR UCSR0A |
# define UCR UCSR0B |
# define UDR UDR0 |
# define UBRR UBRR0L |
# define EICR EICRB |
#endif |
#if defined (__AVR_ATmega32__) |
# define USR UCSRA |
# define UCR UCSRB |
# define UBRR UBRRL |
# define EICR EICRB |
# define INT_VEC_RX SIG_UART_RECV |
# define INT_VEC_TX SIG_UART_TRANS |
#endif |
#if defined (__AVR_ATmega644__) |
# define USR UCSR0A |
# define UCR UCSR0B |
# define UDR UDR0 |
# define UBRR UBRR0L |
# define EICR EICR0B |
# define TXEN TXEN0 |
# define RXEN RXEN0 |
# define RXCIE RXCIE0 |
# define TXCIE TXCIE0 |
# define U2X U2X0 |
# define UCSRB UCSR0B |
# define UDRE UDRE0 |
# define INT_VEC_RX SIG_USART_RECV |
# define INT_VEC_TX SIG_USART_TRANS |
#endif |
#if defined (__AVR_ATmega644P__) |
# define USR UCSR0A |
# define UCR UCSR0B |
# define UDR UDR0 |
# define UBRR UBRR0L |
# define EICR EICR0B |
# define TXEN TXEN0 |
# define RXEN RXEN0 |
# define RXCIE RXCIE0 |
# define TXCIE TXCIE0 |
# define U2X U2X0 |
# define UCSRB UCSR0B |
# define UDRE UDRE0 |
# define INT_VEC_RX SIG_USART_RECV |
# define INT_VEC_TX SIG_USART_TRANS |
#endif |
#endif //_UART_H |
/branches/V0.74d_ACC-HH_MartinR/version.txt |
---|
0,0 → 1,315 |
------- |
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 |
V0.74d_MartinR 03.08.2009 |
Diverse Änderungen in der fc.c, fc.h, analog.c, analog.h, rc.c, spi.c, timer0.c, makefile um: |
-- im Flug zwischen ACC-Mode und HH- Mode umschalten zu können. |
-- Optimierungen des HH-Modus |
- HH-Mode wurde reduziert auf die Regler-Grundfunktionen! |
keine Driftkompensation, Gierfunktion nur mit P-Regler, keine GPS- oder Kompass Funktion. |
- Zu beachten: die anwählbare Drehratenbegrenzung wird derzeit im HH-Modus nicht abgeschaltet |
- Begrenzung von SummeNick SummeRoll reduziert, da Überlauf beobachtet wurde |
- Die Progression von MesswetNick MesswertRoll, wenn der Gyro an die Grenzen kommt wurde Hardwareabhängig geändert (Sprung bei V1.0 war für HH zu groß) |
-- Optimierungen um den MK zitterunempfindlicher zu machen (Wirkung ist aber nicht eindeutig): |
- Diverse Änderungen, um die AD-Wandlung und Weiterverarbeitung der Analogkanäle zu Optimieren: |
(Ziel war es, den MK Zitterunempfindlicher zu machen) |
- diverse Änderungen / Optimierungen bei den Interrupts (kürzere Interrupts) |
- spi.c: Interrupt- Abschaltung (cli(), sei()) wurde deaktiviert, da der Interrupt zu lange abgeschaltet wurde. |
- A/D- Wandlung wird nun über Timer gestartet, 16 Wandlungen je Reglerzyklus, Nick und Roll werden 4x je Zyklus(500Hz) abgetastet (=2kHz) |
- Gyro-D wurde geändert, hier sind nun höhere werte sinnvoll (40..60) |
- Motorsmooting wurde wie von MartinK vorgeschlagen geändert (nur Filter bei mehr Gas) |
-- Höhenregler modifiziert: |
- Diverse Änderungen um die Höhenregelung zu Verbessern |
Alle Änderungen sind mit "MartinR" kommentiert |
Unbedingt beachten: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
- WICHTIG !!!! folgende Parameter haben sich geändert: |
- Gyro-D wurde geändert, hier sind nun deutlich höhere Werte sinnvoll z.B. 40 |
- Barometric-D hat sich geändert, hier ca. 150 eintragen |
- WICHTIG !!!! Beim Flug im HH-Mode unbedingt beachten: |
- Wird der HH-Mode über UserParameter1 aktiviert, so ist die Stick-Position im Moment des Umschaltens die Neutralposition |
für den HH-Mode. Hierdurch bleibt der ACC-Mode trimmbar. |
- Der Nick- und Roll-Knüppel muß daher aber beim Umschalten von ACC auf HH in Mittelstellung stehen. |
- Beim Zurückschalten von HH- auf ACC-Mode ist es egal wo der Knüppelsteht |
- Der Höhenregler ist beim HH-Mode über UserParameter1 deaktiviert. Beim normalen HH kann der Höhenregler verwendet werden. |
- Die GPS-Funktionen sind im HH-Mode ebenfalls deaktiv. |
Dadurch kann aus dem HH-Mode heraus beim Zurückschalten in den ACC-Modus der MK in der Luft geparkt werden! |
- WICHTIG !!!! UserParameter1 - 6 haben folgende Funktion: |
UserParameter1 (>180, per Schalter) kann im ACC- Modus auf HH umgeschaltet werden. |
UserParameter2 ist dann der I-Faktor im HH-Mode. Hier unbedingt den für HH erforderlichen Wert eitragen! z.B. 40 |
UserParameter3 ist dann Stick-P-Wert im HH-Mode. Hier unbedingt den für HH erforderlichen Wert eitragen! z.B.5 |
UserParameter4: Die Höhenänderungsgeschwindigkeit im Poti-Modus kann über UserParameter4 begrenzt werden. z.B. 40 |
UserParameter5: Wartezeit bei Ermittlung von HoeheD hier z.B. 150 eintragen |
UserParam6 ist der Neutralwert des ACC-Z-Sensors ohne Erdbeschleunigung / 4 (wird für die Neigungskorrektur benötigt) |
Vorgehensweise: im MK-Tool den Wert von ACC-Z ablesen, wenn der MK senkrecht steht (an einem Arm festhalten). |
Diesen Wert /4 als UserParam6 (bei mir: 115) eintragen |
Beim Höhenregler gibt es nun keinen Offset mehr, allerdings muß dafür nach dem Umschalten etwas Gas gegeben werden, damit der Höhenregler arbeiten kann. |
Bisher getestet auf FC V1.0 und V2.0 ME Hardware, aber keine Gewähr!! |
/branches/V0.74d_ACC-HH_MartinR/. |
---|
Property changes: |
Added: tsvn:logminsize |
+8 |
\ No newline at end of property |