/tags/V0.74d/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> |
/tags/V0.74d/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; |
} |
/tags/V0.74d/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 |
/tags/V0.74d/Hex-Files/Flight-Ctrl_MEGA644_V0_74d.hex |
---|
0,0 → 1,3070 |
:100000000C9497030C94B2030C94B2030C94B203B7 |
:100010000C94B2030C94B2030C94B2030C94B2038C |
:100020000C94B2030C9409150C94B2030C94B20313 |
:100030000C94D2270C94B2030C94B2030C94B20328 |
:100040000C94B2030C94B2030C94A3130C94B2035B |
:100050000C94AF080C94B2030C9476080C94B20381 |
:100060000C94E7190C94B2030C948D260C94B203F3 |
:100070000C946C5B0C94B2030C94B203931A861A22 |
:100080007A1A601A461A221A341A621D961C931C98 |
:10009000221A801C661C461C261CD41B821B9F1A1D |
:1000A0000227F526422726271A27B326C426C42668 |
:1000B000CB26E726E226C726CF26CB26DE26EB2652 |
:1000C000C726CF26CB26DA26F026C72654270A0DC8 |
:1000D0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D50 |
:1000E0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D40 |
:1000F0003D3D3D000A0D466C69676874436F6E7440 |
:10010000726F6C0A0D48617264776172653A25649A |
:100110002E25640A0D536F6674776172653A562511 |
:10012000642E2564256320000A0D47656E657261A3 |
:1001300074696E672064656661756C74204D6978BA |
:100140006572205461626C65000A0D4D69786572B4 |
:100150002D436F6E6669673A20272573272028256F |
:1001600075204D6F746F727329000A0D466F756E9E |
:100170006420424C2D4374726C3A200025642000A8 |
:100180000A0D0A0D2121204D495353494E47204263 |
:100190004C2D4354524C3A202564202121000A0D55 |
:1001A0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D7F |
:1001B0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D6F |
:1001C0003D3D3D000A0D496E69742E204545505253 |
:1001D0004F4D003A2047656E65726174696E672005 |
:1001E00044656661756C742D506172616D657465EE |
:1001F00072207573696E67206F6C64205374696335 |
:100200006B2053657474696E6773000A0D41434334 |
:10021000206E6F742063616C696272617465642022 |
:1002200021000A0D5573696E6720706172616D65FA |
:10023000746572736574202564000A0D43616C69EE |
:1002400062726174696E672070726573737572652E |
:100250002073656E736F722E2E004F4B0A0D000ACD |
:100260000D436F6E74726F6C3A200048656164696B |
:100270006E67486F6C64004E6F726D616C20284130 |
:1002800043432D4D6F646529000A0D3D3D3D3D3DC5 |
:100290003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D8E |
:1002A0003D3D3D3D3D3D3D3D3D3D3D3D3D3D0A0DE1 |
:1002B000002E000A0D20444143206F722049324332 |
:1002C000204552524F522120436865636B204932CA |
:1002D000432C2033567265662C2044414320616EC6 |
:1002E0006420424C2D4374726C005B25695D005B99 |
:1002F00025695D002B204D696B726F4B6F707465C3 |
:1003000072202B0048573A5625642E2564205357F7 |
:100310003A25642E256425630053657474696E67FD |
:100320003A256420257300493243204552524F52EA |
:10033000212121004D697373696E6720424C2D4362 |
:1003400074726C3A256421210028632920486F6C5F |
:10035000676572204275737300486F6568653A205F |
:100360002020202025356900536F6C6C486F65682C |
:10037000653A20253569004C756674647275636B47 |
:100380003A20253569004F66662020202020203A3B |
:1003900020253569004B65696E65200048F6686563 |
:1003A0006E726567656C756E6700616B742E204CAC |
:1003B000616765004E69636B3A202020202020256C |
:1003C000356900526F6C6C3A2020202020202535A2 |
:1003D00069004B6F6D706173733A20202025356979 |
:1003E000004B313A25346920204B323A25346920BC |
:1003F000004B333A25346920204B343A25346920A8 |
:10040000004B353A25346920204B363A2534692093 |
:10041000004B373A25346920204B383A253469207F |
:10042000004E693A2534692020526F3A25346920FC |
:100430000047733A253469202047693A25346920FA |
:100440000050313A253469202050323A2534692051 |
:100450000050333A253469202050343A253469203D |
:10046000004779726F202D2053656E736F72004EB6 |
:1004700069636B2025346920282533692E25692975 |
:1004800000526F6C6C2025346920282533692E2595 |
:100490006929004769657220253469202825336958 |
:1004A00029004E69636B2025346920282533692E85 |
:1004B00025782900526F6C6C20253469202825335B |
:1004C000692E25782900476965722025346920281E |
:1004D00025336929004E69636B202534692028255E |
:1004E000336929282533692900526F6C6C20253423 |
:1004F000692028253369292825336929004769653A |
:100500007220253469202825336929282533692953 |
:1005100000414343202D2053656E736F72004E6976 |
:10052000636B2025346920282533692900526F6CBC |
:100530006C2025346920282533692900486F6368B9 |
:1005400020253469202825336929005370616E6E97 |
:10055000756E673A202025356900456D70662E500E |
:100560006567656C3A253569004B6F6D7061737313 |
:1005700020202020202020005269636874756E6757 |
:100580003A2020253569004D657373776572743A9A |
:1005900020202535690053746172743A2020202090 |
:1005A0002025356900506F7469313A202025336960 |
:1005B00000506F7469323A202025336900506F74FF |
:1005C00069333A202025336900506F7469343A202A |
:1005D0002025336900536572766F202000536574BF |
:1005E000706F696E742020253369005374656C6CDC |
:1005F000756E673A202533690052616E67653A254A |
:1006000033692D2533690045787465726E436F6ECA |
:1006100074726F6C2020004E693A25346920205294 |
:100620006F3A253469200047733A25346920204702 |
:10063000693A253469200048693A25346920204305 |
:10064000663A2534692000424C2D4374726C204573 |
:1006500072726F727320002025336420202533646A |
:100660002020253364202025336420002025336496 |
:100670002020253364202025336420202533642066 |
:100680000020253364202025336420202533642076 |
:10069000202533642000424C2D4374726C20666F19 |
:1006A000756E6420002025632020202563202020F3 |
:1006B000256320202025632000202563202020257D |
:1006C000632020202563202020256320002025632F |
:1006D0002020202D2020202D2020202D0031300012 |
:1006E0003131003132000A0D506C65617365206351 |
:1006F0006F6E6E656374205370656B7472756D20D8 |
:10070000726563656976657220666F722062696ED4 |
:1007100064696E67204E4F572E2E2E006F6B2E0A87 |
:100720000D0054696D656F75742E0A0D000011245B |
:100730001FBECFEFD0E1DEBFCDBF13E0A0E0B1E040 |
:10074000E0E0FDEB02C005900D92AE3CB107D9F799 |
:1007500019E0AEECB3E001C01D92AF38B107E1F78C |
:100760000C9455040C940000282FFB018150853017 |
:1007700008F023E0842F9927332721503040829FAF |
:10078000D001839FB00D929FB00D1124AC59BF4F83 |
:10079000019724F00E94625E0192FACF0E94EB5909 |
:1007A0000895863038F085E0A2E0B0E0082E0E947F |
:1007B0006F5E08958823C1F70895582F863048F159 |
:1007C00055E0842F9927252F332721503040829FD1 |
:1007D000D001839FB00D929FB00D1124AC59BF4F33 |
:1007E000FB01019724F001900E946F5EFACFA2E610 |
:1007F000B0E0042E0E946F5EA0E5B0E088E0FB014F |
:10080000182E0E947B5E852F0E94D1030E94EB5917 |
:1008100008958823B1F60895CF93A2E0B0E00E9436 |
:10082000625E802DC82F8150853020F0C3E08C2F70 |
:100830000E94D1038C2F9927CF9108958091600851 |
:10084000E82FFF27EE0FFF1FE25DF74F80819181B8 |
:100850008D5E9F4F14F010920201808191818A5B1E |
:100860009F4F24F480910201882319F02091FB0608 |
:1008700015C081E0809302012091FB06280F209390 |
:10088000FB06253038F088EE93E09093F2038093D6 |
:10089000F10304C0822F0E940A2BE8CF822F9927F0 |
:1008A0009093C9078093C8070895CFEFD0E1DEBFCA |
:1008B000CDBF14B815B807EE13E00253104017FF70 |
:1008C000FCCF08EE13E0189B6BC1199B74C12DE09F |
:1008D0002093010181E887B93E9A8FEF88B98BE1B7 |
:1008E00084B981E085B98EE38AB9579A87E48BB9D8 |
:1008F000469A84B7877F84BF809160008861809327 |
:1009000060001092600080ED97E09093F203809376 |
:10091000F103109261041092600410923308109257 |
:1009200032081092630410926204109265041092CF |
:100930006404243108F43AC188E894E0A0E0B0E00F |
:100940008093850390938603A0938703B0938803D5 |
:100950002A3009F460C1243109F45DC1289A0E944B |
:10096000F2140E94C2140E94E30D0E94BD270E944F |
:10097000B5180E944C260E94755678948EEC90E033 |
:100980009F938F931F920E940E110F900F900F90C4 |
:1009900084E690E09F938F938AE490E09F938F93F7 |
:1009A0001F921F92809101016AE00E94F25D892FDF |
:1009B00099279F938F93809101010E94F25D99275F |
:1009C0009F938F9384EF90E09F938F931F920E9449 |
:1009D0000E118091C8002DB73EB7235F3F4F0FB671 |
:1009E000F8943EBF0FBE2DBF803209F40CC1809138 |
:1009F00001018C3008F0D8C0299A49E060E678E01F |
:100A000083E00E94B403C8EED3E0DE010E94625E80 |
:100A1000802D813009F4D1C088E291E09F938F93BB |
:100A20001F920E940E110F900F900F9020E535E05D |
:100A3000F9018FE0158616861786108A8150349644 |
:100A400087FFF8CF80E480935D0580935E05109268 |
:100A50005F05809360058093610590EC909362053B |
:100A60001092630580936405809365051092660576 |
:100A700090936705909368058093690510926A05C5 |
:100A800080936B0590936C0581E08093500541E560 |
:100A900055E08BE0E3E0F1E0DA0101900D928A95F8 |
:100AA000E1F78DE4DE01F901182E0E947B5E809152 |
:100AB000840399279F938F935F934F9389E491E0E9 |
:100AC0009F938F931F920E940E112DB73EB7295FFF |
:100AD0003F4F0FB6F8943EBF0FBE2DBF8AE691E0A0 |
:100AE0009F938F931F920E940E11109232041092C6 |
:100AF000F5030E94EA380F900F900F908091F50354 |
:100B00008823E1F310923204EE24FF24ECE7CE2E8A |
:100B1000E1E0DE2E1092F5030E94EA388091F503A1 |
:100B20008823E1F3F701EE5DF74F8081882309F018 |
:100B300074C0E70121967E012C9760F3EE24FF2418 |
:100B400070E8C72E71E0D72E22C0F701EE0FFF1F0D |
:100B5000EE0FFF1FE05BFA4F85851816F4F4E701EE |
:100B60002196DF93CF93DF92CF929F930E940E1135 |
:100B70000F900F900F900F900F9086E098E0E80E86 |
:100B8000F91ED7011C927E012C9708F055C0F70181 |
:100B9000EE5DF74F90819923C1F2E7012196EDCFE9 |
:100BA000199B2FC024E194CE299827CF8BE095E0A4 |
:100BB000A0E0B0E0C5CE2BE08BCEA1E0B0E00E947B |
:100BC000625E802D8F3F09F427CF1092840320E5C9 |
:100BD00035E08DE4DE01F901182E0E946A5E9091E5 |
:100BE0008403F9013D962FE08081349618160CF4A9 |
:100BF0009F5F215027FFF8CF9093840341E555E094 |
:100C000056CF2AE065CE8091CA00863009F0EFCE3B |
:100C10000E94735AECCE2898A2CEE7012196DF936A |
:100C2000CF93DF92CF921F920E940E110F900F90E0 |
:100C30000F900F900F907FCF8EE991E09F938F934D |
:100C40001F920E940E110F900F900F90A1E0B0E044 |
:100C50000E94625E802D8B3409F055C1A4E0B0E0A3 |
:100C60000E94625E802D853008F035C20E940C041F |
:100C70004DE560E678E00E94B4030E940C049927D9 |
:100C80009F938F9382E292E09F938F931F920E9493 |
:100C90000E11809168080F900F900F900F900F9099 |
:100CA00080FDF5C10E944636809101018A3009F429 |
:100CB000ECC1843109F4E9C1289A80ED97E0909362 |
:100CC000F2038093F10385E58093FD068FE592E0C2 |
:100CD0009F938F931F920E940E11809168080F902E |
:100CE0000F900F9082FFF4C18BE692E09F938F9359 |
:100CF0001F920E940E110F900F900F9089E892E0C2 |
:100D00009F938F931F920E940E110E942E1E88E8BF |
:100D100093E19093A8038093A70381E08093FC065E |
:100D20000F900F900F908091F503882309F48EC0E7 |
:100D300080911803882309F489C01092F5038091EB |
:100D4000FB06882309F48AC00E941E040E94EA3828 |
:100D5000209101012A3009F48AC0243109F487C0A6 |
:100D6000289A80910E03882309F487C081508093CC |
:100D70000E0380916604882329F0809166048150D7 |
:100D80008093660480913C05882369F081508093AC |
:100D90003C05882341F410923A05109239051092CF |
:100DA0003805109237058091A7039091A803019709 |
:100DB0009093A8038093A7038091A7039091A80321 |
:100DC000892B29F080913104882309F465C0809132 |
:100DD000A7039091A803892B09F464C080911103A3 |
:100DE000909112038F5F9F4F09F46CC08091F503BF |
:100DF000882321F080915D04882311F40E941F0E46 |
:100E00000E940E0BC8010E948F148823E9F0809184 |
:100E10007908282F33278091260390912703821782 |
:100E2000930744F480911103909112038F5F9F4FB9 |
:100E300009F45CC00E94125984E08093F00384E1BD |
:100E400090E00E9486148C010E94FA598091F00370 |
:100E5000882309F068CF0E94565965CF0E94923CC2 |
:100E60000E94EA38209101012A3009F076CF2898B3 |
:100E700080910E03882309F079CF809307071092A1 |
:100E800046041092450410924404109243041092B8 |
:100E90004204109241046DCF2A3031F1243121F106 |
:100EA000289AA4CF0E94622685E090E09093A80340 |
:100EB0008093A70380911103909112038F5F9F4F3E |
:100EC00009F094CF80915D04882309F48FCF80E1ED |
:100ED00097E29093F2038093F10380E890E090937F |
:100EE00012038093110382CF289880CF80E797E187 |
:100EF0009093F2038093F10380E093E090931203C8 |
:100F00008093110397CF0E94E32884EC91E09F9394 |
:100F10008F931F920E940E1151E0952E0F900F900B |
:100F20000F90C0E5D0E07E010894E11CF11C42E086 |
:100F3000C42ED12CCC0EDD1E33E0A32EB12CAC0E72 |
:100F4000BD1E24E0622E712C6C0E7D1E95E0492E94 |
:100F5000512C4C0E5D1E86E0282E312C2C0E3D1E91 |
:100F6000E2E09E1609F48BC0F3E09F1609F48AC0F4 |
:100F700023E0291508F483C080910101843168F0D1 |
:100F800085E080937808109290088BE18093740834 |
:100F90008EE480938D0880938E08DE010E94625E4D |
:100FA000802D8C3008F068C0D7010E94625E802DD1 |
:100FB0008C3008F061C0D6010E94625E802D8C30BA |
:100FC00008F05AC0D5010E94625E802D8C3008F076 |
:100FD00053C0DE010E94625E802D80936008D701BD |
:100FE0000E94625E802D80936108D6010E94625E3D |
:100FF000802D80936208D5010E94625E802D8093CF |
:101000006308D3010E94625E802D80936408D20140 |
:101010000E94625E802D80936508D1010E94625E0D |
:10102000802D80936608A7E5B0E00E94625E802D67 |
:101030008093670831E0931651F483ED91E09F931C |
:101040008F931F920E940E110F900F900F904DE5FD |
:1010500060E678E0892D0E94DD03939495E0991570 |
:1010600008F07ECF83E00E94D1038BE4A1E0B0E0E2 |
:10107000082E0E946F5EF2CD0E94CA28E8CF0E941F |
:1010800093297ACF0E94452A77CF289816CE8AE3F3 |
:1010900092E09F938F931F920E940E1188EE93E02F |
:1010A0000E9486148C010E94BB180F900F900F9025 |
:1010B000C8010E948F148823D9F38AE592E09F9398 |
:1010C0008F931F920E940E110F900F900F90EACDF8 |
:1010D00087E792E00BCE8BE092E09F938F931F9275 |
:1010E0000E940E110F900F900F90C0CD1F920F9283 |
:1010F0000FB60F9211248F939F93EF93FF938091DC |
:1011000010038823A9F48091E1039091E2030196F2 |
:10111000FC01E355FA4FE081ED3079F08639910515 |
:1011200061F09093E2038093E103E093C6000EC068 |
:101130001092E2031092E10309C01092E2031092B0 |
:10114000E10381E080931003E093C600FF91EF91EB |
:101150009F918F910F900FBE0F901F9018951F9227 |
:101160000F920FB60F9211242F933F934F935F93DB |
:101170008F939F93AF93BF93EF93FF9390E08091F2 |
:10118000C6008093D9035091E703563910F090932D |
:10119000E8038091D9038D3091F02091E803822FEC |
:1011A00099278130910509F46AC0823091050CF4C9 |
:1011B0008CC0029709F47DC01092E803A6C020916C |
:1011C000E803223061F79093E803852F9927865F23 |
:1011D000984FFC01329740812091E3033091E40362 |
:1011E000241B3109DC0111978C91281B3109C9019D |
:1011F0009F709093E4038093E3030024880F991F6A |
:10120000001C880F991F001C892F902D982F935C2C |
:101210009093E5032F733070235C2093E603808165 |
:10122000891709F46CC090E08091D6038F5F80939A |
:10123000D6038091D803882309F067C0992309F465 |
:1012400064C081E08093D803580F5093D503515068 |
:10125000E52FFF27E65FF84F8DE0808380910C0734 |
:10126000823509F052C088E190E02CE00FB6F89486 |
:10127000A895809360000FBE2093600046C02F5F4A |
:101280002093E803E52FFF27E65FF84F8091D9030D |
:1012900080835F5F5093E7032091D9038091E3033C |
:1012A0009091E403820F911D9093E4038093E303F4 |
:1012B0002CC0E52FFF27E65FF84F8091D90380838C |
:1012C000563938F31092E803E7CF892B09F074CF31 |
:1012D0008091D903833259F08091D90380930A0712 |
:1012E00081E08093E7038091D9039927DDCF809136 |
:1012F000D803882389F781E08093E803EDCF8C91B0 |
:10130000821709F090CF91E094CFFF91EF91BF91B8 |
:10131000AF919F918F915F914F913F912F910F903E |
:101320000FBE0F901F901895AC01A0E0B0E09D019A |
:10133000A817B90748F4EDEAF5E08191280F311DAF |
:101340001196A417B507C8F33F70FD01E355FA4F96 |
:10135000C9010024880F991F001C880F991F001CC9 |
:10136000892F902D835C80831196FD01E355FA4F00 |
:101370002F733070822F835C8083A255BA4F8DE02B |
:101380008C93109210038091AD058093C600089550 |
:10139000BF92CF92DF92EF92FF920F931F93CF9362 |
:1013A000DF93CDB7DEB72C859D857E85BB2483E298 |
:1013B0008093AD059F599093AE052093AF0503E050 |
:1013C00010E0772309F4ADC0CF84D88843E1E42E40 |
:1013D000F12CEC0EFD1EA989BA897150109709F401 |
:1013E000A0C0109709F43CC0F601EB0DF11DB394B9 |
:1013F0009081119789F47723A1F1F70122E030E081 |
:10140000E20EF31ED701C080D180E20EF31E0D90D4 |
:10141000BC91A02DBB247150109719F1F601EB0D72 |
:10142000F11DB3944081119709F466C01097D1F073 |
:10143000F601EB0DF11DB39460811197A1F47723B0 |
:1014400091F0F7013296D701CD90DC9032E0E32E97 |
:10145000F12CEE0EFF1EA081B181BB24715003C0A0 |
:1014600090E040E060E0F801E355FA4F892F86955F |
:101470008695835C80830F5F1F4FF801E355FA4F19 |
:10148000892F99278370907082959295907F9827E5 |
:10149000807F982755279A01329522952F70232710 |
:1014A0003F702327822B835C80830F5F1F4FF801DF |
:1014B000E355FA4F4F705070440F551F440F551F9E |
:1014C000862F99270024880F991F001C880F991FC9 |
:1014D000001C892F902D842B835C80830F5F1F4F0E |
:1014E000F801E355FA4F6F73635C60830F5F1F4F22 |
:1014F000109709F076CF15C0772309F4B3CFF70121 |
:10150000A2E0B0E0EA0EFB1ED701C080D18022E04D |
:1015100030E0E20EF31E0D90BC91A02DBB24715063 |
:1015200085CFC8010E949409DF91CF911F910F913F |
:10153000FF90EF90DF90CF90BF900895A3E07A2FB7 |
:101540004091D503465009F45FC0E72FFF27E65FBF |
:10155000F84F80818D537F5FE72FFF27E65FF84FBD |
:1015600020812D537F5FE72FFF27E65FF84F308103 |
:101570003D537F5FE72FFF27E65FF84F60816D5394 |
:101580007F5F9927880F991F880F991F522F5295B7 |
:101590005F70582B822F99278F709070829592954B |
:1015A000907F9827807F9827232F26952695282B94 |
:1015B000832F9927837090700024969587950794C0 |
:1015C000969587950794982F802D682B41504F3F13 |
:1015D000D9F0EA2FFF27E65FF84F5083AF5F415005 |
:1015E0004F3F91F0EA2FFF27E65FF84F2083AF5F70 |
:1015F00041504F3F49F0EA2FFF27E65FF84F6083E5 |
:10160000AF5F442309F0A1CF8DE097E09093D4031E |
:101610008093D303A350A093D2030895CF93DF9375 |
:10162000CDB7DEB722970FB6F894DEBF0FBECDBFA1 |
:101630008091D803882309F4A9C20E949E0A809150 |
:101640000B07823609F471C080910C079927843604 |
:10165000910509F457C08536910584F581369105C9 |
:1016600009F44EC1823691050CF4C2C08236910550 |
:1016700009F49AC183369105C1F48091CE0390910B |
:10168000CF03892B09F049C2A091D303B091D403B1 |
:101690009C91992309F037C29C918AE0989FC001E0 |
:1016A00011249093CF038093CE031092D80310920D |
:1016B000D4031092D3031092D20368C28C369105E2 |
:1016C00009F410C18D3691050CF0B3C08736910531 |
:1016D00009F42BC18836910541F78FEF80930E03F3 |
:1016E000E091D303F091D403808190912C04892B55 |
:1016F00080932C04882311F01092DA0381E0809308 |
:10170000DE03D3CFE091D303F091D40390818AE03C |
:10171000989FC001112490930C0380930B03892B95 |
:1017200021F281E08093DD03C0CF80910C079927DF |
:101730008037910509F4F2C0813791050CF485C01A |
:101740008337910509F45BC1843791050CF03CC1E6 |
:101750008137910509F078CFA091D303B091D403DC |
:101760008C918F3F09F406C28C91882309F0FDC14A |
:1017700081E08C93A091D303B091D4034DE560E652 |
:1017800078E08C910E94B403809110038823E1F3E8 |
:10179000E091D303F091D403808189838BE48A8321 |
:1017A0008DE590E09F938F9380E698E09F938F93D1 |
:1017B00021E030E03F932F93CE0102969F938F93C9 |
:1017C0003F932F93CE01820F931F9F938F9383E0BC |
:1017D0008F9381E08F9381E58F930E94C809ADB705 |
:1017E000BEB71F960FB6F894BEBF0FBEADBF2CCFCD |
:1017F0008B34910509F059CFE091D303F091D403D4 |
:10180000808191819093790480937804209176046B |
:1018100030917704821B930B845E9D4F68E671E0E4 |
:101820000E94125E845B90409093750480937404D0 |
:101830003CCF8437910509F47CC08637910509F0C7 |
:1018400034CF81E08093DC0330CF8D36910529F1D0 |
:101850008E3691050CF093C08B34910509F0F4CECF |
:10186000A091D303B091D4038D919C91909379046E |
:10187000809378042091760430917704821B930B37 |
:10188000845E9D4F68E671E00E94125E845B90402A |
:101890009093750480937404D7CE809110038823AD |
:1018A000E1F3A091D303B091D4039C91913009F45A |
:1018B00039C1198281E090E09F938F93CE01019608 |
:1018C0009F938F9381E08F938F938DE48F930E94EA |
:1018D000C8098DB79EB707960FB6F8949EBF0FBE86 |
:1018E0008DBFB2CE8FEF80930E03E091D303F091C2 |
:1018F000D403808180932D0481E08093DF03D5CED3 |
:10190000E091D303F091D403E081E03258F08FE10D |
:1019100080930F038FEF80930E03C7CE81E08093F7 |
:10192000DB0392CEE0930F03F5CF81E08093E003D9 |
:10193000BCCE8091D503853108F4D4C0E091D303A7 |
:10194000F091D40380E1A5EEB6E001900D928A9566 |
:10195000E1F7809110038823E1F31F9280910D033A |
:101960008F9384E58F930E94C8098AEF8093D003F8 |
:101970008FEF80930E030F900F900F9096CE8E36C0 |
:10198000910509F061CE809110038823E1F38DE485 |
:1019900090E09F938F9380E595E09F938F9381E0F4 |
:1019A0008F938F938EE492CFA091D303B091D40301 |
:1019B0008BE0EDEFF6E00D9001928A95E1F78091D2 |
:1019C00006078093E207A6CF8437910509F03CCE45 |
:1019D0008091D503853108F4B6C0A091D303B091AE |
:1019E000D40380E1E5EEF6E00D9001928A95E1F7EF |
:1019F00080EF8093D0038FEF80930E0325CE20914C |
:101A0000D3033091D403F90180818150853018F4DB |
:101A100081818B34E9F01982809110038823E1F3EE |
:101A200081E090E09F938F93CE0101969F938F93D7 |
:101A300081E08F938F9383E58F930E94C809EDB760 |
:101A4000FEB737960FB6F894FEBF0FBEEDBFFCCDC4 |
:101A500060E678E08DE52E5F3F4FDB01F901982FBE |
:101A600001900D929A95E1F722503040482FD9010C |
:101A70008C910E94DD0380918D089927AA27BB27AE |
:101A8000BC01CD0124EC39E040E050E00E94D35D80 |
:101A9000DC01CB018093A1039093A203A093A30345 |
:101AA000B093A40380918E089927AA27BB27BC0175 |
:101AB000CD010E94D35DDC01CB0180939D03909307 |
:101AC0009E03A0939F03B093A003E091D303F091F2 |
:101AD000D40380810E94D1030E940C0489830E9458 |
:101AE0000A2B9ACFE091D303F091D40380819181A6 |
:101AF000A281B3818093E5069093E606A093E70662 |
:101B0000B093E80626CF8AE0989FC00111240E9476 |
:101B100086149093AC058093AB05A091D303B0914C |
:101B2000D403BACD40E555E08DE4FA01282F0D909D |
:101B300001922A95E1F7A8EEB3E0FA01182E0E946F |
:101B40007B5E9983B7CEA091D303B091D4038D91DE |
:101B50009D910D90BC91A02D8093E5069093E60693 |
:101B6000A093E706B093E80643CF863008F406CE8C |
:101B700085E0FFCD0E940C04E091D303F091D403E3 |
:101B80008083A091D303B091D403EECD22960FB6FB |
:101B9000F894DEBF0FBECDBFDF91CF910895CF93F4 |
:101BA000C82F8A3029F08091C00085FFFCCF04C087 |
:101BB0008DE00E94CF0DF7CFC093C60080E090E08B |
:101BC000CF910895089588E18093C1008091C0006D |
:101BD00082608093C0008091C10080688093C100C2 |
:101BE0008091C10080648093C1008AE28093C40028 |
:101BF00080910B0390910C030E9486149093DA0657 |
:101C00008093D9068CED90E00E948614909309078A |
:101C1000809308071092DB068AE48093DC0683E059 |
:101C20008093DF068AE08093DD0681E08093DE0604 |
:101C30001092D4031092D3031092D2030895EF921E |
:101C4000FF920F931F9380911003882309F478C2A9 |
:101C50008091DE03882309F082C08091DF0388230E |
:101C600029F080911003882309F07FC18091DC0363 |
:101C7000882329F080911003882309F05BC18091AB |
:101C8000E003882329F080911003882309F036C1EE |
:101C900080910807909109070E948F14882329F0EA |
:101CA00080911003882309F0C8C080910B039091A4 |
:101CB0000C03892B09F084C18091DD03882329F06E |
:101CC00080911003882309F00FC28091CE03909178 |
:101CD000CF03892B09F07EC120910F032F3F59F1CB |
:101CE00080E190E09F938F93822F99278295929520 |
:101CF000907F9827807F9827855F9E4F9F938F9333 |
:101D000081E090E09F938F938FE093E09F938F9378 |
:101D100082E08F9381E08F9381E48F930E94C809C2 |
:101D20008FEF80930F038DB79EB70B960FB6F89485 |
:101D30009EBF0FBE8DBF8091E207882329F080915E |
:101D40001003882309F05EC08091DB03882309F427 |
:101D5000F7C180911003882309F4F2C139C0809142 |
:101D60001003882309F479CF0E94371E84E190E0A4 |
:101D70009F938F939091DA0384E1989FC00111247F |
:101D8000875D9C4F9F938F9381E090E09F938F930B |
:101D90008AED93E09F938F9382E08F9381E08F93FE |
:101DA00088E48F930E94C8098091DA038F5F2DB772 |
:101DB0003EB7255F3F4F0FB6F8943EBF0FBE2DBF15 |
:101DC000843008F4B8C11092DA031092DE0345CFD4 |
:101DD00086E190E09F938F938EE298E09F938F939C |
:101DE00081E08F938F9380E58F930E94C8091092B2 |
:101DF000DB038DB79EB707960FB6F8949EBF0FBE54 |
:101E00008DBF9EC181E090E09F938F9382EE97E01B |
:101E10009F938F9381E08F938F9382E48F930E949F |
:101E2000C8091092E2072DB73EB7295F3F4F0FB6A2 |
:101E3000F8943EBF0FBE2DBF87CF809174089927BD |
:101E4000880F991F880F991F7C010027F7FC0095C8 |
:101E5000102F8091B2049091B304A091B404B0917A |
:101E6000B504BC01CD01A80197010E94475E3093E3 |
:101E7000F6062093F5068091AA049091AB04A091F8 |
:101E8000AC04B091AD04BC01CD01A80197010E9442 |
:101E9000475E3093F8062093F70680914E048093B6 |
:101EA000F90680914D048093FA0688E090E09F93B4 |
:101EB0008F9385EF96E09F938F9381E08F9383E0DC |
:101EC0008F9387E78F930E94C8098091FB062DB7F7 |
:101ED0003EB7295F3F4F0FB6F8943EBF0FBE2DBFF0 |
:101EE000853018F086E08093FB0683E690E00E9440 |
:101EF00086149093090780930807D7CE8BE090E073 |
:101F00009F938F938DEF96E09F938F9381E08F93B4 |
:101F100080910D038F9387E48F930E94C8091092DC |
:101F2000E0038DB79EB707960FB6F8949EBF0FBE1D |
:101F30008DBFAECE8AE090E09F938F938BED96E0BD |
:101F40009F938F9381E08F938F9386E58F930E9469 |
:101F5000C8091092DC032DB73EB7295F3F4F0FB67B |
:101F6000F8943EBF0FBE2DBF8ACE0E94371E80E57B |
:101F700090E09F938F9389E293E09F938F9321E06A |
:101F800030E03F932F9388E293E09F938F933F93AA |
:101F90002F938DE294E09F938F9383E08F9381E062 |
:101FA0008F938CE48F930E94C8091092DF038DB742 |
:101FB0009EB70F960FB6F8949EBF0FBE8DBF56CE3C |
:101FC0008091D9069091DA060E948F14882309F037 |
:101FD00077CE72CE8091AB059091AC050E948F14A4 |
:101FE000882309F479CE80911003882309F474CEF4 |
:101FF000809174089927880F991F880F991F7C0179 |
:102000000027F7FC0095102F8091B2049091B30443 |
:10201000A091B404B091B504BC01CD01A801970111 |
:102020000E94475E30939E0520939D058091AA04EF |
:102030009091AB04A091AC04B091AD04BC01CD0172 |
:10204000A80197010E94475E3093A00520939F0549 |
:1020500020912209309123094091240950912509AA |
:10206000DA01C90103E0880F991FAA1FBB1F0A9557 |
:10207000D1F7820F931FA41FB51F820F931FA41FB8 |
:10208000B51F2091850330918603409187035091BD |
:102090008803BC01CD010E94475E3093A2052093C6 |
:1020A000A1058EE090E09F938F938DE995E09F933B |
:1020B0008F9381E08F938F9383E48F930E94C8095D |
:1020C0008091CE039091CF030E9486149093AC052B |
:1020D0008093AB052DB73EB7295F3F4F0FB6F894FD |
:1020E0003EBF0FBE2DBFF8CD82E490E09F938F934B |
:1020F00080EA97E09F938F9381E08F938F9384E49E |
:102100008F930E94C8091092DD038DB79EB7079682 |
:102110000FB6F8949EBF0FBE8DBF80910B039091B8 |
:102120000C03009709F4D1CD0E9486149093DA062F |
:102130008093D906CACD8093DA031092DE038DCD49 |
:102140001F910F91FF90EF900895982F8091E307D2 |
:10215000813031F0892F0E94CF0D282F33270CC0FA |
:1021600080912E04E82FFF27E75DFC4F90838F5F5F |
:1021700080932E0421E030E0C90108950F931F934E |
:10218000CF93DF938C01EB01672B71F0F801819104 |
:102190008F010E94A510219739F0F80181918F01DC |
:1021A0000E94A510219791F7DF91CF911F910F9178 |
:1021B00008950F931F93CF93DF938C01EB01672B4F |
:1021C00081F0F8010F5F1F4F84910E94A5102197A5 |
:1021D00041F0F8010F5F1F4F84910E94A5102197D5 |
:1021E00081F7DF91CF911F910F910895CF93C82F61 |
:1021F000181634F480E20E94A510C1501C16D4F3C6 |
:10220000CF910895CF93C82F181634F480E30E941D |
:10221000A510C1501C16D4F3CF9108952F923F9270 |
:102220004F925F926F927F928F929F92AF92BF92E6 |
:10223000CF92DF92EF92FF920F931F93CF93DF9392 |
:10224000CDB7DEB7E0970FB6F894DEBF0FBECDBFB7 |
:1022500026968FAD26972896EEADFFAD2897882459 |
:10226000992454018093E30748E4C42ED12CCC0E6A |
:10227000DD1E7F01C701F7011491112331F01532E2 |
:1022800021F00894E11CF11CF6CFB701681B790B13 |
:1022900009F095C0112309F43DC20894E11CF11C1A |
:1022A0001FA63FA4232C0FEF39A6F7010894E11CC9 |
:1022B000F11C14911537C9F1812F80628837A9F17B |
:1022C000103209F440C0133209F48DC01A3209F4F7 |
:1022D00079C01D3209F476C01B32C9F11E32C9F132 |
:1022E000103309F48AC0812F8153893008F07EC0F1 |
:1022F00060E070E0CB01880F991F880F991F880F4D |
:10230000991F860F971F680F791F610F711D60530A |
:102310007040F7010894E11CF11C1491812F805347 |
:102320008A3040F3262E153739F630FE3DC0F601CF |
:1023300084E090E0C80ED91E80809180A280B38096 |
:10234000103209F0C0CF89A5882309F0AECF19A7B4 |
:10235000ACCFF7010894E11CF11C14911A3209F476 |
:1023600051C060E070E014C0CB01880F991F880F46 |
:10237000991F880F991F860F971F680F791F610F8C |
:10238000711D60537040F7010894E11CF11C149119 |
:10239000812F80538A3040F3EFEF6F3F7E0714F4B4 |
:1023A0006FEF7FEF062F86CFF60182E090E0C80E38 |
:1023B000D91E808191814C01AA24BB2481CF0E9427 |
:1023C000D91068CF1A3251F4F60182E090E0C80EBD |
:1023D000D91E208022200CF068CF219490E1392A68 |
:1023E000EFED3E2262CF98E0392A5FCF1836C9F070 |
:1023F0001C36D1F481E0382A58CF34FC56CFF0E2B5 |
:102400003F2A53CFF60182E090E0C80ED91E6081CA |
:1024100071819FEF6F3F790714F46FEF7FEF062F05 |
:1024200044CF24E0322A41CF133609F44DC114348D |
:1024300009F41FC1143609F41CC1193609F419C175 |
:102440001F3409F40FC11F3609F40CC1103709F409 |
:10245000F9C0133709F4B2C0153509F4ECC01537CB |
:1024600009F4E9C0183509F444C0183709F441C02B |
:10247000112309F44FC1CE0101969DA78CA71983A2 |
:1024800081E0482E19A6632C7724042D5FA45418EC |
:1024900057FC2DC029A5222331F10F5F050DC30183 |
:1024A00080739070892B09F42FC1222309F027C172 |
:1024B00066FC1BC1C30180739070809709F410C142 |
:1024C000852D0E940211842D992787FD9095BC01CE |
:1024D0008CA59DA50E94BE1064FECCCE822D801BD3 |
:1024E0000E94F610C7CE66FED9CF0E5FD7CF552417 |
:1024F000D1CFE0E1EEA733FE07C081149104A1041F |
:10250000B10411F0F0E43F2A19A60FA707FD02C09D |
:102510002FED3222CE0189969DA78CA781149104BC |
:10252000A104B10419F49FA5992361F1EEA54E2EE3 |
:1025300055246624772418AA84149504A604B704A5 |
:1025400010F0F1E0F8ABC501B401A30192010E94C3 |
:10255000255EDC01CB01082F8A30F0F4005DECA58C |
:10256000FDA50293FDA7ECA7C501B401A30192014B |
:102570000E94255E49015A01F8A9FF23E1F62EA524 |
:10258000283079F0632C7724CE010196482EFCA5E3 |
:102590004F1A28E2420E79CF095A183501F70F7DFC |
:1025A000DECF632C772463FEEFCF003369F380E343 |
:1025B000ECA5FDA58293FDA7ECA7E6CFF60182E08E |
:1025C00090E0C80ED91E0190F081E02DFDA7ECA788 |
:1025D000EF2B81F4FE013196FDA7ECA788E28983F9 |
:1025E0008EE6818385E78B838CE68C838D8389E2FD |
:1025F0008E831F8207FD15C0802F992787FD909538 |
:10260000AC0160E070E08CA59DA50E94EC5C009799 |
:1026100031F0482EFCA54F1A04150CF033CF402E94 |
:1026200031CFECA5FDA501900020E9F731974E2EA2 |
:102630002CA5421A27CF153511F481E0382A9AE0EB |
:102640009EA762CFF60182E090E0C80ED91E80817D |
:1026500091814C01AA24BB2490E19EA7E0E43E2A8C |
:1026600018E752CF1F3411F4E1E03E2AF8E0FEA74C |
:102670004BCF143411F491E0392A30FE18C0F60122 |
:1026800084E090E0C80ED91E80809180A280B38043 |
:10269000B7FE0AC0B094A09490948094811C911CC1 |
:1026A000A11CB11C8DE289A79AE09EA72ECFF6014E |
:1026B00082E090E0C80ED91E808191814C01AA244D |
:1026C00097FCA094BA2CE4CFFE013196FDA7ECA7AD |
:1026D000F60182E090E0C80ED91E80818983D0CEB9 |
:1026E000822D801B0E940211EBCE80E38AA71BA7DC |
:1026F00062E070E0CE018A960E94BE10DBCE61E0FF |
:1027000070E0CE018996F8CF822D801B0E94F610D2 |
:1027100029A5CBCEE0960FB6F894DEBF0FBECDBF95 |
:10272000DF91CF911F910F91FF90EF90DF90CF90AD |
:10273000BF90AF909F908F907F906F905F904F90E1 |
:102740003F902F9008951F920F920FB60F92112471 |
:102750002F933F935F936F937F938F939F93AF9349 |
:10276000BF93EF93FF938091F003882329F080912A |
:10277000F00381508093F0038091F80381508F3FE4 |
:1027800009F493C08093F8038091F1039091F203D0 |
:10279000029700F18091F1039091F20301979093D9 |
:1027A000F2038093F1038091F1039091F203209161 |
:1027B00011033091120382239323892B89F0809196 |
:1027C00001018A3009F48BC0479A8091680883FF21 |
:1027D0008DC010C08FEF9FEF909312038093110371 |
:1027E000809101018A3009F478C047988091680887 |
:1027F00083FF7CC086B19927FC01E071F07084FFF3 |
:102800000AC08091F3039091F40301969093F4032E |
:102810008093F3036BC08091F3039091F403892BB1 |
:1028200049F18091F3039091F4038A56914010F599 |
:102830008091F3039091F40369E270E00E94FE5DE1 |
:102840008091F3039091F403860F971F9093F40304 |
:102850008093F3038091F3039091F4030B9708F4B2 |
:1028600040C08091F3039091F4030A979093790408 |
:102870008093780480917804909179042091760473 |
:1028800030917704821B930B845E9D4F68E671E064 |
:102890000E94125E845B9040909375048093740450 |
:1028A0001092F4031092F30321C089E08093F8039F |
:1028B000809113038F5F817080931303882319F431 |
:1028C00081E08093F5038091F6039091F7030196E0 |
:1028D0009093F7038093F60357CF5A9887CF5A9A6D |
:1028E00085CFF0937904E0937804C4CFFF91EF9102 |
:1028F000BF91AF919F918F917F916F915F913F9128 |
:102900002F910F900FBE0F901F9018952091F603F6 |
:102910003091F703280F391FC901019608952091BE |
:10292000F6033091F703821B930B892F9927869525 |
:10293000807490700895CF93DF930E948614EC0109 |
:10294000CE010E948F148823D9F3DF91CF9108958F |
:102950001F93CF93DF930E948614EC011FEC08C0F5 |
:1029600080911803882321F09093180310937A0024 |
:10297000CE010E948F14982F882391F3DF91CF917D |
:102980001F9108959FB7F894579A5F983E9A469A78 |
:102990008091B0008F708093B0008091B000836010 |
:1029A0008093B0008091B1008B738093B1008091CF |
:1029B000B1008B608093B1001092B2008FEF8093D2 |
:1029C000B3008091B00080688093B0008091700067 |
:1029D0008A7F809370008091700082608093700085 |
:1029E0009FBF08958AE090E00E94861490930004AF |
:1029F0008093FF0382E085BD83EA84BD17BC88E72E |
:102A000088BD86E086BD80916E00816080936E00F7 |
:102A100008951F920F920FB60F9211242F933F9398 |
:102A20004F935F936F937F938F939F93AF93BF93D6 |
:102A3000EF93FF93809101018431C0F48091F903F9 |
:102A4000882309F446C02091FA033091FB0341E04A |
:102A50002F37340708F49CC08FEF8093B3002F5FAB |
:102A600030403093FB032093FA036EC38091F90347 |
:102A7000882349F78091B00086FFADC08091B000F7 |
:102A80008F7B8093B000E091FE03EE2309F0EEC04F |
:102A900080918608282F33278DED96E0289FA0018E |
:102AA000299F500D389F500D1124CA012091FC031D |
:102AB0003091FD03821B930B9093FB038093FA03E9 |
:102AC0001092FD031092FC03469A81E08093F90373 |
:102AD000BACF8091B00086FFA7C08091B0008F7BF5 |
:102AE0008093B00089EA93E09093FB038093FA030C |
:102AF00080911403909115039C01220F331F280F1E |
:102B0000391F809190039927880F991F880F991F6B |
:102B1000280F391F37FD34C2C901959587959595C2 |
:102B2000879590931503809314039093EC038093FF |
:102B3000EB038091AC0880FFDCC080918308682F94 |
:102B40007727882799272091B2043091B3044091C8 |
:102B5000B4045091B50457FDF8C1E7E05595479589 |
:102B600037952795EA95D1F70E94D35D9B01AC017B |
:102B700097FD09C2B6E05595479537952795BA95C3 |
:102B8000D1F78091EB039091EC03820F931FDBC090 |
:102B90002F3F310569F060F0A9014F5F50404F377A |
:102BA000510588F480E88093B3002058304059CF15 |
:102BB0008091FA038093B3001092FB031092FA0302 |
:102BC0001092F903C1C28FEF8093B3005093FB03BF |
:102BD0004093FA03B9C28091B00080648093B00042 |
:102BE0008CEB90E09093FB038093FA038091FC03BD |
:102BF0009091FD0384549F4F9093FD038093FC03B9 |
:102C00008091EF03882329F080916604853B08F0CA |
:102C1000F9C09091FE039F5F80918608891708F0A4 |
:102C2000EEC01092FE0351CF8091B000806480937B |
:102C3000B00080918608282F33278DED96E0289FDD |
:102C4000A001299F500D389F500D1124CA012091D9 |
:102C5000FC033091FD03821B930B9093FB03809345 |
:102C6000FA039C0181E08093F903F1CE89EA93E0B5 |
:102C70009093FB038093FA038E2F9927813091055F |
:102C800009F4C2C0029709F488C1FF27EE0FFF1FA5 |
:102C9000E25DF74F80819181880F991F2091FA039F |
:102CA0003091FB03820F931F9093FB038093FA03F1 |
:102CB0002091FA033091FB0355E02D3D350708F4D0 |
:102CC00050C18CED95E09093FB038093FA039C0137 |
:102CD0002C5B30403093FB032093FA038091FC037C |
:102CE0009091FD03820F931F9093FD038093FC034B |
:102CF000ECCE80918308682F772788279927209129 |
:102D0000B2043091B3044091B4045091B50457FD1E |
:102D100017C1A7E05595479537952795AA95D1F7FF |
:102D20000E94D35D9B01AC0197FD32C1F6E0559541 |
:102D3000479537952795FA95D1F78091EB039091B8 |
:102D4000EC03821B930B9093EC038093EB03809135 |
:102D50008408282F3327220F331F220F331F80911F |
:102D6000EB039091EC03821793077CF08091850828 |
:102D7000282F3327220F331F220F331F8091EB039D |
:102D80009091EC032817390724F43093EC03209337 |
:102D9000EB032091EB033091EC038091FA039091C7 |
:102DA000FB03280F391F205032408091EB03909194 |
:102DB000EC0397FDE3C0959587959595879590933E |
:102DC000EC038093EB038091EB039091EC039093E1 |
:102DD000CB078093CA0745E02D3D340708F4BAC0FD |
:102DE0008CED95E09093FB038093FA032091FA0316 |
:102DF0003091FB033093FD032093FC0333CF90937A |
:102E0000FE0363CE469805CF80911403909115037D |
:102E10009C01220F331F280F391F8091900399279F |
:102E2000880F991F880F991F280F391F37FD66C11A |
:102E3000C9019595879595958795909315038093EE |
:102E400014039093EC038093EB038091AC0880FF14 |
:102E500028C180918308682F772788279927209198 |
:102E6000B2043091B3044091B4045091B50457FDBD |
:102E70005CC1A7E05595479537952795AA95D1F759 |
:102E80000E94D35D9B01AC0197FD4AC1F6E05595C8 |
:102E9000479537952795FA95D1F78091EB03909157 |
:102EA000EC03820F931F9093EC038093EB038091CC |
:102EB0008408282F3327220F331F220F331F8091BE |
:102EC000EB039091EC03821793077CF080918508C7 |
:102ED000282F3327220F331F220F331F8091EB033C |
:102EE0009091EC032817390724F43093EC032093D6 |
:102EF000EB038091EB039091EC032091FA03309166 |
:102F0000FB03820F931F805092409093FB038093AA |
:102F1000FA038091EB039091EC0397FDEDC095953A |
:102F20008795959587959093EC038093EB0380911B |
:102F3000EB039091EC039093CB078093CA07B8CE34 |
:102F400021583F4F4F4F5F4FE4CE21583F4F4F4FD7 |
:102F50005F4F03CE51E02737350758F487E791E0FC |
:102F600041CF81E02737380708F0B2CE87E791E0FC |
:102F7000AACE3093FB032093FA0338CF03961BCFDE |
:102F80002D5F3F4FC9CD215C3F4F4F4F5F4FF2CD7B |
:102F9000215C3F4F4F4F5F4FC9CE809116039091F8 |
:102FA00017039C01220F331F280F391F205C3E4F4F |
:102FB00037FDB3C0C90195958795959587959093F1 |
:102FC0001703809316039093EA038093E9036091BB |
:102FD000AA047091AB048091AC049091AD0497FD6C |
:102FE00097C0F7E09595879577956795FA95D1F70E |
:102FF00028EC30E040E050E00E94D35D97FD81C0B6 |
:10300000272F382F492F552747FD5A958091E903DF |
:103010009091EA03820F931F9093EA038093E90350 |
:1030200080918408282F3327220F331F220F331F4C |
:103030008091E9039091EA03821793077CF08091D5 |
:103040008508282F3327220F331F220F331F80912B |
:10305000E9039091EA032817390724F43093EA032F |
:103060002093E9038091E9039091EA032091FA0308 |
:103070003091FB03820F931F805092409093FB038B |
:103080008093FA038091E9039091EA0397FD3EC093 |
:1030900095958795959587959093EA038093E90395 |
:1030A00007CE80918308682F77278827992720915A |
:1030B000B2043091B3044091B4045091B50457FD6B |
:1030C0003EC0E7E05595479537952795EA95D1F7A6 |
:1030D0000E94D35D9B01AC0197FD2CC066E0559525 |
:1030E0004795379527956A95D1F78091EB03909195 |
:1030F000EC03821B930BD7CE039611CF2D5F3F4F6E |
:1031000097CE61507F4F8F4F9F4F7ACF0396C0CF9E |
:1031100061587F4F8F4F9F4F64CF2D5F3F4F4ACFF6 |
:10312000215C3F4F4F4F5F4FB1CE21583F4F4F4F24 |
:103130005F4F9FCE215C3F4F4F4F5F4FCFCF215806 |
:103140003F4F4F4F5F4FBDCFFF91EF91BF91AF9179 |
:103150009F918F917F916F915F914F913F912F91AF |
:103160000F900FBE0F901F90189510927C008FEC5F |
:1031700080937A000895EF92FF920F931F93CF935D |
:10318000DF9303E010E0D8010E94625E802DC82F1B |
:10319000DD27C531D10508F02A97C7BD1092080474 |
:1031A00084E690E00E94A81480911C0390911D0376 |
:1031B0008255934010F4C0E0D0E0CA3FD105E0F45E |
:1031C00081EBE82E82E0F82EC7BD82E390E00E94FA |
:1031D000A814FF92EF921F920E940E1180911C037F |
:1031E00090911D030F900F900F908255934020F007 |
:1031F0002196CA3FD10540F3D8010C2E0E946F5E84 |
:10320000C093F1078CE291E00E94A814DF91CF9166 |
:103210001F910F91FF90EF900895EF92FF920F93FF |
:103220001F93CF93DF9300E0009303040093020405 |
:103230000093010480ED97E00E948614EC011CE8E5 |
:1032400021E0F22E95EFE92E033009F4ABC000E047 |
:1032500080911404909115048C5F93400CF091C000 |
:1032600080911B03815080931B03809112049091E5 |
:1032700013048C5F93400CF079C080911A03815045 |
:1032800080931A0380911004909111048C5F9340F5 |
:103290000CF04AC08091190381508093190388E093 |
:1032A000809334040E94522680911B038A3008F0D8 |
:1032B00055C0F09203048AE080931B0380911A03A7 |
:1032C0008A3008F043C0F09202048AE080931A0327 |
:1032D000809119038A3098F5F09201048AE0809376 |
:1032E000190380913404882379F0CE010E948F1451 |
:1032F0008823B9F383EB92E09F938F931F920E94F0 |
:103300000E110F900F900F901092EC078FEC80939E |
:103310007A008091EC078823E1F31A3008F447C063 |
:10332000115009F091CF48C0809110049091110480 |
:10333000875094408CF1809119038F5FAECF863F08 |
:1033400080F2F0920104E0921903CBCF863F08F49B |
:10335000BFCFF0920204E0921A03BACF863F08F47E |
:10336000ADCFF0920304E0921B03A8CF809112042A |
:1033700090911304875094408CF080911A038F5FD2 |
:103380007FCF80911404909115048750944044F0AD |
:1033900080911B038F5F67CF0F5F81CF0F5F72CF6D |
:1033A00001E063CF1B3008F452CF19E050CF8AE020 |
:1033B00090E00E94A814B4CF86E490E00E94A81484 |
:1033C000DF91CF911F910F91FF90EF9008951F9281 |
:1033D0000F920FB60F921124EF92FF920F931F934B |
:1033E0002F933F934F935F936F937F938F939F930D |
:1033F000AF93BF93CF93DF93EF93FF9320911D047F |
:10340000822F9927AA27BB272F5FFC01429740F400 |
:10341000E25CFF4FEE0FFF1F0590F491E02D099441 |
:1034200010921D0482E080931C0480911C04809300 |
:103430007C0080911D04882309F4F9C38FEC8093EC |
:103440007A00F5C320931D04809178009091790053 |
:103450002091220430912304820F931F9093230420 |
:103460008093220481E0DFCF20931D0480917800B7 |
:10347000909179002091200430912104820F931FB4 |
:10348000909321048093200484E0CDCF20931D04E9 |
:1034900080917800909179002091C0043091C1040E |
:1034A000821B930B9093F0078093EF078091EF07B7 |
:1034B0009091F00790932B0480932A0482E0B3CF7D |
:1034C00020931D048091BE049091BF042091780048 |
:1034D00030917900821B930B9093E5078093E4076A |
:1034E0008091E4079091E507909329048093280444 |
:1034F00087E099CF20931D04809178009091790006 |
:1035000090931F0480931E0486E08DCF20931D04AA |
:103510002091780030917900309321042093200489 |
:1035200010921C0482CF20931D04209178003091CA |
:103530007900309323042093220481E074CF109209 |
:103540001D0481E080931803809104049091050488 |
:1035500001969093050480930404809178009091E3 |
:1035600079002091F4073091F507820F931F909313 |
:10357000F5078093F4078091EC078F5F8093EC0749 |
:103580008091EC07853008F44DCF8091F40790913D |
:10359000F50797FD36C3959587959093F50780932A |
:1035A000F407809178009091790090931D038093A7 |
:1035B0001C031092EC078091060490910704BC0153 |
:1035C000660F771F62957295707F7627607F7627EA |
:1035D000681B790B80919A03482F55278091080426 |
:1035E000282F332727FD30958FEF90E0289F80010B |
:1035F000299F100D389F100D11248091E80790919C |
:10360000E907800F911F2091F4073091F507821B85 |
:10361000930B20915B0430915C04821B930B489FB9 |
:103620009001499F300D589F300D1124620F731F78 |
:1036300077FDE4C27595679575956795759567955E |
:103640007595679575956795709307046093060463 |
:103650008091F4079091F507EC01EE27D7FDE095F6 |
:10366000FE2F20911E0330911F03409120035091A3 |
:103670002103DA01C90163E0880F991FAA1FBB1F4C |
:103680006A95D1F7821B930BA40BB50BC80FD91FFA |
:10369000EA1FFB1FCE01DF010496A11DB11DB7FD7E |
:1036A000A7C243E0B595A795979587954A95D1F719 |
:1036B00080931E0390931F03A0932003B0932103D4 |
:1036C0008091E8079091E907800F911F20911E03D8 |
:1036D00030911F034091200350912103821B930BD3 |
:1036E00090935C0480935B048091F4079091F507BC |
:1036F00097FD7CC2959587959093F5078093F40785 |
:1037000082E091CE20931D042091780030917900C1 |
:103710008091200490912104280F391F809101018C |
:103720008A3009F44DC2220F331F220F331F30930A |
:10373000210420932004C90137FD51C29595879536 |
:10374000959587959595879590931304809312048A |
:103750008091260490912704820F931F97FD44C205 |
:103760009595879590932704809326042091C8040B |
:103770003091C904821B930B9093230380932203FF |
:103780002091180430911904809122039091230311 |
:10379000280F391F37FD25C2359527953093190419 |
:1037A0002093180483E03FCE20931D0420917800DD |
:1037B000309179008091220490912304280F391FC1 |
:1037C000809101018A3009F4F8C1220F331F220FC2 |
:1037D000331F3093230420932204C90137FDFDC118 |
:1037E00095958795959587959595879590931504CB |
:1037F000809314048091240490912504820F931FD8 |
:1038000097FDE9C1959587959093250480932404AD |
:103810002091CA043091CB04821B930B9093250313 |
:103820008093240320911A0430911B048091240377 |
:1038300090912503280F391F37FDCAC1359527956B |
:1038400030931B0420931A0481E0EDCD20931D04D6 |
:1038500080917800909179002091C0043091C1044A |
:10386000821B930B9093F0078093EF078091EF07F3 |
:103870009091F00720912A0430912B04820F931F1E |
:1038800090930D0480930C0482E0CDCD20931D0411 |
:103890008091BE049091BF0420917800309179000E |
:1038A000821B930B9093E5078093E4078091E407D4 |
:1038B0009091E5072091280430912904820F931FED |
:1038C00090930F0480930E0487E0ADCD20931D04E8 |
:1038D000809101018A3009F462C1843109F493C1F5 |
:1038E000809178009091790020911E0430911F04FE |
:1038F000820F931F909311048093100486E093CD60 |
:1039000020931D04809178009091790020912004EB |
:1039100030912104820F931F9093210480932004FF |
:1039200010921C0482CD20931D0417CE20931D04F9 |
:103930008091780090917900AA2797FDA095BA2FE1 |
:10394000BC01CD010E94595D7B018C018091B804BE |
:103950009091B904A091BA04B091BB049C01AD014F |
:10396000C801B7010E94F95CDC01CB01BC01CD01AB |
:103970000E943C5DDC01CB0190930B0480930A0410 |
:1039800080910A0490910B0402970CF4BAC08091C4 |
:10399000B8049091B904A091BA04B091BB0420E09E |
:1039A00030E84BE354E4BC01CD010E94635D882301 |
:1039B000DCF58091B8049091B904A091BA04B0915B |
:1039C000BB042AE037ED43EA5CE3BC01CD010E9471 |
:1039D000FA5CDC01CB018093B8049093B904A09306 |
:1039E000BA04B093BB0480913B0490913C04845F83 |
:1039F0009140D0F48091B8049091B904A091BA0498 |
:103A0000B091BB042DEC3CEC4CEC5DE3BC01CD0172 |
:103A10000E94FA5CDC01CB018093B8049093B90456 |
:103A2000A093BA04B093BB0481E080930904809111 |
:103A30007800909179009093E7078093E607809152 |
:103A40000A0490910B04AA2797FDA095BA2F209104 |
:103A50007A0430917B0440917C0450917D04820F64 |
:103A6000931FA41FB51F80937A0490937B04A093A7 |
:103A70007C04B0937D0420917A0430917B044091C2 |
:103A80007C0450917D0457FD9EC07AE05595479582 |
:103A9000379527957A95D1F780917A0490917B0498 |
:103AA000A0917C04B0917D04821B930BA40BB50BF9 |
:103AB00080937A0490937B04A0937C04B0937D045C |
:103AC00083E0B1CC20931D048091260390912703BD |
:103AD0009C01220F331F280F391F8091780090918D |
:103AE000790063E070E00E94FE5D260F371F369577 |
:103AF000279536952795309327032093260385E055 |
:103B000092CC80910A0490910B048F5F9F4F0CF030 |
:103B10008BCF8091B8049091B904A091BA04B09170 |
:103B2000BB0420E030E849E054E4BC01CD010E9430 |
:103B3000665D18160CF078CF8091B8049091B904A6 |
:103B4000A091BA04B091BB042AE037ED43EA5CE3EC |
:103B5000BC01CD010E94F95CDC01CB018093B8046B |
:103B60009093B904A093BA04B093BB0480913B0432 |
:103B700090913C04845F914008F056CF8091B80446 |
:103B80009091B904A091BA04B091BB042DEC3CEC27 |
:103B90004CEC5DE3BC01CD010E94F95C3BCF809110 |
:103BA00078009091790020911E0430911F04820FBB |
:103BB000931F0196969587959DCE220F331F09CEB0 |
:103BC000220F331FB4CD21503C4F4F4F5F4F5DCF7D |
:103BD0002F5F3F4F33CE019615CE079601CE079645 |
:103BE000ADCD2F5F3F4FD8CD0196BACD019682CD96 |
:103BF000CE01DF010B96A11DB11D53CD615E7F4F3C |
:103C000019CD0196C8CC80917800909179002091CF |
:103C10001E0430911F04820F931F2FEF37E0281BE3 |
:103C2000390B309311042093100486E0FCCBFF91F4 |
:103C3000EF91DF91CF91BF91AF919F918F917F9144 |
:103C40006F915F914F913F912F911F910F91FF9035 |
:103C5000EF900F900FBE0F901F90189590E2E9E241 |
:103C6000F3E08FE49193815087FFFCCF08951F9379 |
:103C7000CF93DF9380912D0420912803281710F40F |
:103C800020932D0490912C0490FF08C080912D0466 |
:103C9000882309F40CC1815080932D0491FF08C042 |
:103CA00080912D04821709F4AAC18F5F80932D049F |
:103CB000892F992780FF02C081FDF6C00E942E1E29 |
:103CC00090912D049A3008F0ABC081E180932E04CE |
:103CD000892F99279F938F938AEE92E09F938F93DA |
:103CE00081E08F930E940E110F900F900F900F9014 |
:103CF0000F9080912D04C82FDD27C630D10509F41F |
:103D000081C1C730D1050CF095C0C230D10509F48E |
:103D100033C2C330D1050CF4CDC0C430D10509F491 |
:103D200038C525970CF06AC310922E048091320892 |
:103D3000909133089F938F93809130089091310830 |
:103D40009F938F9381EE93E09F938F9311E01F9346 |
:103D50000E940E1184E180932E046DB77EB7695FD7 |
:103D60007F4F0FB6F8947EBF0FBE6DBF80913608AF |
:103D7000909137089F938F938091340890913508E4 |
:103D80009F938F9381EF93E09F938F931F930E9454 |
:103D90000E1188E280932E048DB79EB707960FB65A |
:103DA000F8949EBF0FBE8DBF80913A0890913B085A |
:103DB0009F938F9380913808909139089F938F93A8 |
:103DC00081E094E09F938F931F930E940E118CE3E8 |
:103DD00080932E042DB73EB7295F3F4F0FB6F8945E |
:103DE0003EBF0FBE2DBF80913E0890913F089F932C |
:103DF0008F9380913C0890913D089F938F9381E130 |
:103E000094E09F938F931F930E940E116DB77EB71E |
:103E1000695F7F4F0FB6F8947EBF0FBE6DBF36C788 |
:103E200080E180932E04892F99279F938F938FEEA3 |
:103E300092E054CFCA30D10509F458C1CB30D10536 |
:103E40000CF044C0C830D10509F44EC529970CF0D8 |
:103E50008AC384E180932E048091260390912703E6 |
:103E60009F938F938BE495E09F938F9311E01F9323 |
:103E70000E940E1188E280932E040F900F900F90F5 |
:103E80000F900F908091660499279F938F938AE5F6 |
:103E900095E09F938F931F930E940E110F900F90A8 |
:103EA0000F900F900F90F2C610922D0407CF209321 |
:103EB0002D04F4CE209709F4CAC1219709F49EC3BA |
:103EC00081508093280310922D04E0C6CC30D10598 |
:103ED00009F4E2C3CC30D1050CF432C22D9781F73E |
:103EE00010922E0486E996E09F938F93C1E0CF93C2 |
:103EF0000E940E1184E180932E040F900F900F907A |
:103F00008091250899278D969F938F9380912408FF |
:103F100099278D969F938F938091230899278D964B |
:103F20009F938F938091220899278D969F938F93CB |
:103F300085EA96E09F938F93CF930E940E1188E2BB |
:103F400080932E048DB79EB70B960FB6F8949EBF44 |
:103F50000FBE8DBF8091290899278D969F938F93CF |
:103F60008091280899278D969F938F938091270899 |
:103F700099278D969F938F938091260899278D96E8 |
:103F80009F938F9389EB96E09F938F93CF930E949B |
:103F90000E118CE380932E042DB73EB7255F3F4F63 |
:103FA0000FB6F8943EBF0FBE2DBF80912A08992707 |
:103FB0008D969F938F938DEC96E09F938F93CF93E5 |
:103FC0000E940E110F900F900F900F900F90809104 |
:103FD0002B08882309F02AC680912C08882309F031 |
:103FE00017C680912D08882309F450C688E4809371 |
:103FF0002E0483EE96E09F938F93CF939BC11092F4 |
:104000002D0456CE10922E0481E195E09F938F935C |
:1040100011E01F930E940E1184E180932E040F90F3 |
:104020000F900F908091C0049091C1049F938F9343 |
:1040300080910C0490910D049F938F938EE195E0F5 |
:104040009F938F931F930E940E1188E280932E04FA |
:104050006DB77EB7695F7F4F0FB6F8947EBF0FBE16 |
:104060006DBF8091BE049091BF049F938F93809108 |
:104070000E0490910F049F938F938DE295E09F9390 |
:104080008F931F930E940E118CE380932E048DB7A3 |
:104090009EB707960FB6F8949EBF0FBE8DBF809156 |
:1040A000B8049091B904A091BA04B091BB04BC01CA |
:1040B000CD010E943C5DDC01CB019F938F938091E9 |
:1040C000D9089091DA089F938F938CE395E09F93A2 |
:1040D0008F931F930E940E112DB73EB7295F3F4F5C |
:1040E0000FB6F8943EBF0FBE2DBFD0C510922E0460 |
:1040F00085ED95E09F938F9311E01F930E940E1121 |
:1041000084E180932E040F900F900F908091900384 |
:1041100099279F938F938DED95E09F938F931F9396 |
:104120000E940E1188E280932E040F900F900F9042 |
:104130000F900F908091ED039091EE039F938F93DA |
:104140008BEE95E09F938F931F930E940E118CE34B |
:1041500080932E040F900F900F900F900F908091EE |
:10416000850899279F938F938091840899279F931F |
:104170008F9389EF95E045CE10922E048AEA93E062 |
:104180009F938F93C1E0CF930E940E1184E180939F |
:104190002E040F900F900F908091B2049091B30471 |
:1041A000A091B404B091B504B7FD2DC53AE0B59522 |
:1041B000A795979587953A95D1F7BF93AF939F931E |
:1041C0008F9384EB93E09F938F93CF930E940E1174 |
:1041D00088E280932E048DB79EB707960FB6F894A9 |
:1041E0009EBF0FBE8DBF8091AA049091AB04A09199 |
:1041F000AC04B091AD04B7FD01C52AE0B595A79513 |
:10420000979587952A95D1F7BF93AF939F938F93F7 |
:1042100083EC93E09F938F93CF930E940E118CE3D6 |
:1042200080932E042DB73EB7295F3F4F0FB6F89409 |
:104230003EBF0FBE2DBF80917804909179049F936B |
:104240008F9382ED93E09F938F93CF9325CE10921F |
:104250002E0484EF92E09F938F9311E01F930E94AE |
:104260000E1184E180932E040F900F900F9084E63E |
:1042700090E09F938F938AE490E09F938F93DF93D6 |
:10428000CF93809101016AE00E94F25D892F992706 |
:104290009F938F93809101010E94F25D99279F93D4 |
:1042A0008F9384E093E09F938F931F930E940E114E |
:1042B00088E280932E042DB73EB7235F3F4F0FB6A1 |
:1042C000F8943EBF0FBE2DBF81E595E09F938F937D |
:1042D0000E940C0499279F938F9389E193E09F9309 |
:1042E0008F931F930E940E118091A7039091A803B2 |
:1042F0006DB77EB7695F7F4F0FB6F8947EBF0FBE74 |
:104300006DBF069778F090913104992309F42FC37B |
:104310008CE380932E04892F99279F938F9384E3B6 |
:1043200093E0B7CD8CE380932E0487E293E09F93D4 |
:104330008F931F930E940E110F900F900F90A6C4A1 |
:1043400010922E0487E096E09F938F9311E01F93C5 |
:104350000E940E1184E180932E040F900F900F9015 |
:1043600080910107992787FD90959F938F93809166 |
:104370000007992787FD90959F938F9387E196E09B |
:104380009F938F931F930E940E1188E280932E04B7 |
:104390008DB79EB707960FB6F8949EBF0FBE8DBF20 |
:1043A00080910207992787FD90959F938F93809125 |
:1043B000030799279F938F9387E296E09F938F93AC |
:1043C0001F930E940E118CE380932E042DB73EB7ED |
:1043D000295F3F4F0FB6F8943EBF0FBE2DBF8091AF |
:1043E000070799279F938F9380910407992787FD4B |
:1043F00090959F938F9387E396E003CD10922E04C0 |
:1044000081E694E09F938F93C1E0CF930E940E11B9 |
:10441000809101010F900F900F908A3009F469C3C9 |
:104420008B3009F4BEC2843109F4BBC28D3009F06F |
:104430002DC484E180932E0480911B0399279F93C0 |
:104440008F934091CA045091CB04CA0157FD1CC4FC |
:104450009595879595958795959587959595879544 |
:104460009F938F939A0157FD0CC4359527953595E9 |
:104470002795359527958091140490911504821BFA |
:10448000930B9F938F9385ED94E09F938F93CF939E |
:104490000E940E1188E280932E046DB77EB7675F8D |
:1044A0007F4F0FB6F8947EBF0FBE6DBF80911A0389 |
:1044B00099279F938F934091C8045091C904CA01D2 |
:1044C00057FDDDC395958795959587959595879526 |
:1044D000959587959F938F939A0157FDCDC33595F9 |
:1044E00027953595279535952795809112049091BC |
:1044F0001304821B930B9F938F9389EE94E09F93F9 |
:104500008F93CF930E940E118CE380932E048DB76E |
:104510009EB709960FB6F8949EBF0FBE8DBF8091CF |
:10452000190399279F938F932091C6043091C70454 |
:10453000C90137FD9FC3959587959F938F93809170 |
:10454000100490911104281B390B3F932F938DEF8A |
:1045500094E09F938F93CF930E940E112DB73EB797 |
:10456000275F3F4FBDCD10922E0480916D04909136 |
:104570006E049F938F9385EA95E09F938F9311E04C |
:104580001F930E940E1184E180932E040F900F90D0 |
:104590000F900F900F9080916B0490916C049F93FB |
:1045A0008F9381EB95E09F938F931F930E940E1141 |
:1045B00088E280932E040F900F900F900F900F9031 |
:1045C0008091690490916A049F938F938DEB95E09D |
:1045D0009F938F931F930E940E118CE380932E0460 |
:1045E0000F900F900F900F900F9080916704909113 |
:1045F00068049F938F9389EC95E04BCC8091680879 |
:1046000080FFBBC110922E0480915B0490915C04EA |
:104610009F938F9389E593E09F938F9311E01F936E |
:104620000E940E1184E180932E040F900F900F9042 |
:104630000F900F908091590490915A049F938F93FB |
:1046400088E693E09F938F931F930E940E1188E258 |
:1046500080932E040F900F900F900F900F908091E9 |
:104660001C0390911D039F938F9387E793E09F9383 |
:104670008F931F930E940E118CE380932E040F9052 |
:104680000F900F900F900F908091F10799279F93B3 |
:104690008F9386E893E0FDCB10922E0487E496E09A |
:1046A0009F938F9311E01F930E940E1184E18093DA |
:1046B0002E040F900F900F908091090899279F93D7 |
:1046C0008F938091080899279F938F938091070873 |
:1046D00099279F938F938091060899279F938F9393 |
:1046E00087E596E09F938F931F930E940E1188E2B7 |
:1046F00080932E048DB79EB70B960FB6F8949EBF8D |
:104700000FBE8DBF80910D0899279F938F93809145 |
:104710000C0899279F938F9380910B0899279F935B |
:104720008F9380910A0899279F938F938CE696E048 |
:104730009F938F931F930E940E118CE380932E04FE |
:104740002DB73EB7255F3F4F0FB6F8943EBF0FBE63 |
:104750002DBF8091110899279F938F938091100806 |
:1047600099279F938F9380910F0899279F938F93F9 |
:1047700080910E0899279F938F9381E896E09F93ED |
:104780008F931F930E940E116DB77EB7655F7F4FA9 |
:1047900041CB10922E0480916108E82FFF27EE0F85 |
:1047A000FF1FE25DF74F808191819F938F938091EE |
:1047B0006008E82FFF27EE0FFF1FE25DF74F8081B3 |
:1047C00091819F938F9381E294E09F938F9311E067 |
:1047D0001F930E940E1184E180932E048DB79EB723 |
:1047E00007960FB6F8949EBF0FBE8DBF80916308E9 |
:1047F000E82FFF27EE0FFF1FE25DF74F80819181C9 |
:104800009F938F9380916208E82FFF27EE0FFF1F81 |
:10481000E25DF74F808191819F938F9381E394E0D4 |
:104820009F938F931F930E940E1188E280932E0412 |
:104830002DB73EB7295F3F4F0FB6F8943EBF0FBE6E |
:104840002DBF80916508E82FFF27EE0FFF1FE25D67 |
:10485000F74F808191819F938F9380916408E82F17 |
:10486000FF27EE0FFF1FE25DF74F808191819F933D |
:104870008F9381E494E09F938F931F930E940E1176 |
:104880008CE380932E046DB77EB7695F7F4F0FB6C0 |
:10489000F8947EBF0FBE6DBF80916708E82FFF2799 |
:1048A000EE0FFF1FE25DF74F808191819F938F9301 |
:1048B00080916608E82FFF27EE0FFF1FE25DF74F9C |
:1048C000808191819F938F9381E594E09F938F9353 |
:1048D0001F930E940E118DB79EB707960FB6F894DE |
:1048E0009EBF0FBE8DBFD2C110922E0489E695E007 |
:1048F0009F938F9311E01F930E940E1184E1809388 |
:104900002E040F900F900F90809174049091750475 |
:104910009F938F9388E795E09F938F931F930E94B7 |
:104920000E1188E280932E040F900F900F900F903D |
:104930000F9080917804909179049F938F9387E8EA |
:1049400095E09F938F931F930E940E118CE38093A9 |
:104950002E040F900F900F900F900F90809176047F |
:10496000909177049F938F9386E995E092CA8CE3A8 |
:1049700080932E0489E493E0DACC84E180932E04C2 |
:1049800085E993E09F938F9311E01F930E940E118E |
:1049900088E280932E040F900F900F908CE993E0A3 |
:1049A000C6CC84E180932E044091CA045091CB047C |
:1049B000CA0157FD57C19C01359527953595279517 |
:1049C0003595279535952795C90182959295907FC4 |
:1049D0009827807F9827BA01681B790BCB0177FD58 |
:1049E0003FC1959587959F938F933F932F939A01FE |
:1049F00057FD33C1359527953595279535952795DD |
:104A00008091140490911504821B930B9F938F93B4 |
:104A100082EA94E09F938F93CF930E940E1188E2D5 |
:104A200080932E048DB79EB709960FB6F8949EBF5B |
:104A30000FBE8DBF4091C8045091C904CA0157FDF3 |
:104A40000AC19C013595279535952795359527956C |
:104A500035952795C90182959295907F9827807FFB |
:104A60009827BA01681B790BCB0177FDF2C09595A9 |
:104A700087959F938F933F932F939A0157FDE6C09D |
:104A8000359527953595279535952795809112046D |
:104A900090911304821B930B9F938F9384EB94E06C |
:104AA0009F938F93CF930E940E118CE380932E04DB |
:104AB0008DB79EB709960FB6F8949EBF0FBE8DBFF7 |
:104AC0002091C6043091C704C90137FDBDC095953A |
:104AD00087959F938F938091100490911104281BC8 |
:104AE000390B3F932F9386EC94E09F938F93CF9352 |
:104AF000F1CA84E180932E044091CA045091CB0402 |
:104B00009A0157FDB4C0359527953595279535956C |
:104B10002795C901880F991F880F991F880F991F22 |
:104B2000481B590B5F934F933F932F93809114042D |
:104B300090911504821B930B9F938F938FE694E0C3 |
:104B40009F938F93CF930E940E1188E280932E043F |
:104B50002DB73EB7275F3F4F0FB6F8943EBF0FBE4D |
:104B60002DBF4091C8045091C9049A0157FD7CC0E3 |
:104B7000359527953595279535952795C901880F42 |
:104B8000991F880F991F880F991F481B590B5F9316 |
:104B90004F933F932F938091120490911304821BA3 |
:104BA000930B9F938F9381E894E09F938F93CF9380 |
:104BB0000E940E118CE380932E046DB77EB7675F61 |
:104BC0007F4F0FB6F8947EBF0FBE6DBF8091C604B5 |
:104BD0009091C7049F938F938091C6049091C704CE |
:104BE0002091100430911104821B930B9F938F939B |
:104BF00083E994E09F938F93CF936BCE81509C4F2A |
:104C0000AF4FBF4FFACA81509C4FAF4FBF4FCECA74 |
:104C100084E480932E0480EE96E09F938F93CF934D |
:104C20000E940E110F900F900F90DBC980E48093CB |
:104C30002E048DED96E09F938F93CF930E940E11DB |
:104C40000F900F900F90C8C9019641CF295F3F4F39 |
:104C500017CF01960CCF0F96F4CE295F3F4FCACEE7 |
:104C60000196BFCE0F96A7CE295F3F4F81CF295F18 |
:104C70003F4F49CF01965FCC295F3F4F30CC0F9615 |
:104C800021CC295F3F4FF1CB0F96E2CB10922C0441 |
:104C9000DF91CF911F9108951092B9008AE280931D |
:104CA000B800089585EA8093BC00089584E9809354 |
:104CB000BC0008951092B9008093BB0085E88093F2 |
:104CC000BC0008950E945626109234048091BB00C7 |
:104CD0001092330480E88093BC001092BD001092C3 |
:104CE000BA001092BB001092B9001092B8000E9456 |
:104CF0004C260E94522680E00E945A2608958093F6 |
:104D0000BB0085E88093BC00089585EC8093BC00CF |
:104D1000089585E88093BC0008951F920F920FB606 |
:104D20000F9211242F933F934F935F936F937F9331 |
:104D30008F939F93AF93BF93EF93FF93809134042E |
:104D4000282F3327442755278F5F80933404F90198 |
:104D500027313105C8F4E05BFF4FEE0FFF1F0590D0 |
:104D6000F491E02D099480913204E82FFF27EA5056 |
:104D7000F84F9091BB0090838F5F8C3008F49DC0FA |
:104D8000109232040E94562610923404E0C080E84B |
:104D90000E945A26DCC088E90E945A26D8C00E9488 |
:104DA00056268AE090E09093A8038093A7030E9480 |
:104DB0005226CDC084E10E945A26C9C082E10E94D9 |
:104DC0005A26C5C080911B030E945A26C0C080E1AC |
:104DD0000E945A26BCC080911A030E945A26B7C06E |
:104DE000809119030E945A26B2C080913304E82FA3 |
:104DF000FF27E35FF64F8F5F8093330480810E942B |
:104E00005A26A5C090913304292FE92FFF27EE0FD2 |
:104E1000FF1FEE0FFF1FE05BFA4F858518160CF0A1 |
:104E200054C09C3009F467C0990F892F8E5A0E9494 |
:104E30005A268DC080913204E82FFF27EE5EF74F8F |
:104E40008091BB0080830E94892681C08091B90037 |
:104E5000803409F46EC080913204E82FFF27EE5DA4 |
:104E6000F74F10828F5F8C3068F1109232040E94ED |
:104E700056261092340480913504809331041092A8 |
:104E8000350465C08091B900803309F440C00E94A8 |
:104E900056268AE090E09093A8038093A70310928F |
:104EA00034040E94522653C00E9456268AE090E0A5 |
:104EB0009093A8038093A70367CF809332040E9446 |
:104EC000562662CF80933204D2CF9C3008F0A9CF0F |
:104ED000922F9F5FE92FFF27EE0FFF1FEE0FFF1F9F |
:104EE000E05BFA4F858518161CF0292F9C3080F363 |
:104EF0009093330496CF1092330483E0809334046C |
:104F000080913204880F8D5A0E945A2620C08091C9 |
:104F100035048823C9F49091330490933504E92F24 |
:104F2000FF27EB5FF74F80818F5F09F48FEF80835E |
:104F3000AECF80913204E82FFF27EE5DF74F8C5FF4 |
:104F400080830E94852697CF90913304E8CF80918B |
:104F5000BC0080688093BC00FF91EF91BF91AF913E |
:104F60009F918F917F916F915F914F913F912F9181 |
:104F70000F900FBE0F901F90189583EC80938100C7 |
:104F800080916F00806280936F001092C70410922E |
:104F9000C6041092C9041092C8041092CB04109257 |
:104FA000CA0408951F920F920FB60F921124EF9228 |
:104FB000FF920F931F932F933F934F935F936F93A2 |
:104FC0007F938F939F93AF93BF93CF93DF93EF9391 |
:104FD000FF93209186003091870080913604909154 |
:104FE0003704281B390B809186009091870090939D |
:104FF000370480933604C9018D549440835F9A41ED |
:1050000078F48091380490913904049714F0109248 |
:105010008303C1E0D0E0D0933904C0933804A3C027 |
:10502000C0913804D0913904CA30D1050CF09BC02E |
:10503000C9018B5F9040845B9140A8F0FE013196DE |
:10504000F0933904E0933804E530F10509F46DC0BC |
:105050005D98E630F10509F466C05C98379709F46D |
:1050600060C05B9880C0225D3140FE01EC0FFD1FE7 |
:10507000E25DF74F80819181F901E81BF90BCF01C7 |
:10508000F7FD6DC0069754F480916604883C08F0E3 |
:105090005FC080916604865F80936604FE01EC0F1A |
:1050A000FD1FE25DF74F80819181AC01440F551FD8 |
:1050B000480F591F420F531F57FD4EC07A01F594F8 |
:1050C000E794F594E794C90101968E159F05BCF508 |
:1050D0000894E108F10880916604833C40F18E0158 |
:1050E0000C0F1D1FF801E25DF74F80819181970140 |
:1050F000281B390BC90163E070E00E94125ECB01EE |
:10510000880F991F860F971F0C5B174FF80191832B |
:105110008083FE01EC0FFD1FE25DF74FF182E0821C |
:105120008DCF5B9A20C05C9A99CF5D9A92CFFE0199 |
:10513000EC0FFD1FEC5BF74F11821082EACF21507C |
:105140003040E216F3063CF60894E11CF11CC3CF94 |
:1051500088EC80936604A2CF4D5F5F4FAFCF9095F0 |
:1051600081959F4F8FCFFF91EF91DF91CF91BF91AD |
:10517000AF919F918F917F916F915F914F913F91EF |
:105180002F911F910F91FF90EF900F900FBE0F90F6 |
:105190001F90189581E08093600882E080936108F9 |
:1051A00083E08093620884E08093630885E08093C5 |
:1051B000640886E08093650887E08093660888E04D |
:1051C0008093670808951F9388E6809368083EE1FE |
:1051D000309369088BEF80936B088AE080936C08AA |
:1051E00030936A0830936E08E4E0E0936D085FE066 |
:1051F00050936F08309370081CE01093710878E0AA |
:105200007093720886EE809373083093740880E878 |
:105210008093750880E58093760826E920937708C7 |
:1052200083E0809378088EE58093790883E2809309 |
:105230007A0830937B0810927C0860E260937D08C6 |
:1052400010927E0810927F081092800810928108B8 |
:105250001092920810929308109294081092950858 |
:1052600044E64093820888E2809383081092AC0859 |
:1052700092E3909384082093850885E080938608C4 |
:10528000909387082AE520938808909389081092C4 |
:10529000AB0820938A0883E480938B0810928C08D3 |
:1052A00085E580938D0880938E0880E180938F0838 |
:1052B00060939008409391088FE58093960883EF60 |
:1052C0008093980850939708509399088DEF809396 |
:1052D0009A0840939B0820939C0820939D08209354 |
:1052E0009E088BE480939F088093A0088093A10878 |
:1052F0001092A20886E08093A3087093A4082093DC |
:10530000A5083093A6084093A7084093A808E09307 |
:10531000A908A9EAB3E0E1EBF8E00D9001921A9533 |
:10532000E1F71F9108951F9388E6809368085EE176 |
:10533000509369088BEF80936B088AE080936C0828 |
:1053400050936A0850936E0893E090936D081CE0A8 |
:1053500010936F0880E18093700876E07093710875 |
:1053600068E06093720886EE809373085093740827 |
:1053700080E88093750880E58093760888E78093BD |
:105380007708909378088EE58093790883E280937C |
:105390007A0850937B0810927C0830E230937D08A5 |
:1053A00010927E0810927F08109280081092810857 |
:1053B00010929208109293081092940810929508F7 |
:1053C00044E64093820888E2809383081092AC08F8 |
:1053D00092E39093840886E98093850885E0809322 |
:1053E0008608909387082AE5209388089093890877 |
:1053F0001092AB0820938A0883E480938B088CE397 |
:1054000080938C0885E580938D0880938E08309377 |
:105410008F08309390089BE4909391088FE58093D8 |
:10542000960883EF8093980884E18093970880938F |
:1054300099088DEF80939A0840939B0820939C08CD |
:1054400020939D0820939E0890939F089093A00816 |
:105450009093A1081092A2087093A3086093A408E7 |
:105460002093A5085093A6084093A7084093A80846 |
:1054700084E08093A908A0EBB3E0E1EBF8E00D90A5 |
:1054800001921A95E1F71F91089588EE80936808BC |
:105490003EE1309369088BEF80936B088AE080933C |
:1054A0006C0830936A0830936E0893E090936D080F |
:1054B00058E050936F0820E12093700866E06093F5 |
:1054C00071085093720886EE8093730830937408C5 |
:1054D00080E88093750844E64093760888E78093D7 |
:1054E0007708909378088EE58093790883E280931B |
:1054F0007A0884E180937B0810927C0820937D08D1 |
:1055000010927E0810927F081092800810928108F5 |
:105510001092920810929308109294081092950895 |
:105520004093820888E2809383081092AC0892E34B |
:105530009093840886E98093850885E080938608A7 |
:10554000909387082AE52093880890938908109201 |
:10555000AB0820938A0883E480938B0886E48093C9 |
:105560008C0885E580938D0880938E0880E2809377 |
:105570008F0880939008909391088FE58093960808 |
:1055800083EF8093980830939708309399088DEFB4 |
:1055900080939A0840939B0820939C0820939D0831 |
:1055A00020939E088BE480939F088093A0088093AB |
:1055B000A1081092A2086093A3085093A408209316 |
:1055C000A5083093A6084093A7084093A80884E054 |
:1055D0008093A9088CE0A8EBB3E0E1EBF8E00D9034 |
:1055E00001928A95E1F708956817790744F4680FE6 |
:1055F000791F77FD09C0CB01959587950895681BA4 |
:10560000790B861B970B08956F5F7F4FCB019595A4 |
:10561000879508950F931F93CF93C82FC150CF3F05 |
:1056200081F004E610E080915D04882351F410932A |
:10563000F2030093F1038AEF90E00E949B14C150A3 |
:1056400090F7CF911F910F9108952F923F924F9213 |
:105650005F926F927F928F929F92AF92BF92CF9202 |
:10566000DF92EF92FF920F931F93CF93DF93CDB70B |
:10567000DEB7ED970FB6F894DEBF0FBECDBF209119 |
:10568000C6043091C7048091100490911104281B26 |
:10569000390B3A87298730931C0920931B092091E5 |
:1056A0001A0430911B0437FDD4C7359527953595DD |
:1056B0002795359527953AA729A73C872B87790108 |
:1056C000209118043091190437FDC0C735952795EE |
:1056D00035952795359527953CA72BA73E872D8790 |
:1056E000F092DC08E092DB083093D2082093D108D6 |
:1056F00080910A0990910B09AA2797FDA095BA2FCE |
:105700007C018D01EE0CFF1C001F111FE80EF91E1D |
:105710000A1F1B1F80910C0490910D049C014427CB |
:1057200037FD4095542FDA01C901880F991FAA1F30 |
:10573000BB1F880F991FAA1FBB1F820F931FA41F97 |
:10574000B51F820F931FA41FB51FE80EF91E0A1F75 |
:105750001B1F17FD9CC715950795F794E7941595A2 |
:105760000795F794E794F0920B09E0920A0980916B |
:10577000260990912709AA2797FDA095BA2F7C01A9 |
:105780008D01EE0CFF1C001F111FE80EF91E0A1FF1 |
:105790001B1F80910E0490910F049C01442737FD3C |
:1057A0004095542FDA01C901880F991FAA1FBB1F0A |
:1057B000880F991FAA1FBB1F820F931FA41FB51F1D |
:1057C000820F931FA41FB51FE80EF91E0A1F1B1F8F |
:1057D00017FD54C715950795F794E7941595079508 |
:1057E000F794E794F0922709E09226098091D9086E |
:1057F0009091DA08AA2797FDA095BA2F9C01AD01D8 |
:10580000220F331F441F551F280F391F4A1F5B1FCC |
:1058100080910A0490910B04AA2797FDA095BA2FB6 |
:10582000280F391F4A1F5B1F57FD16C7559547950F |
:105830003795279555954795379527953093DA08ED |
:105840002093D90820910C0430910D04C901880FD0 |
:10585000991F880F991F820F931F820F931FAA27EA |
:1058600097FDA095BA2F2091A2043091A3044091F6 |
:10587000A4045091A504820F931FA41FB51F809309 |
:10588000A2049093A304A093A404B093A504209130 |
:105890000E0430910F04C901880F991F880F991FBA |
:1058A000820F931F820F931FAA2797FDA095BA2FEF |
:1058B00020919E0430919F044091A0045091A10436 |
:1058C000820F931FA41FB51F80939E0490939F0483 |
:1058D000A093A004B093A1048091E4089091E508FE |
:1058E00020910C0430910D04820F931F9093E508D2 |
:1058F0008093E40880911E0990911F0920910E0465 |
:1059000030910F04820F931F90931F0980931E09FB |
:105910008091BC049091BD0401969093BD04809346 |
:10592000BC0480919A0490919B04A0919C04B09136 |
:105930009D04BC01CD010E94595D5B016C01809109 |
:10594000E6079091E707AA2797FDA095BA2FBC011B |
:10595000CD010E94595D7B018C018091B80490912A |
:10596000B904A091BA04B091BB049C01AD01C80177 |
:10597000B7010E94F95CDC01CB019C01AD01C601BD |
:10598000B5010E94FA5CDC01CB01BC01CD010E9493 |
:105990003C5DDC01CB0180939A0490939B04A0931F |
:1059A0009C04B0939D048FEC80937A0010921803AE |
:1059B00020908A0430908B0440908C0450908D0489 |
:1059C00039E423163BE6330631E0430630E0530664 |
:1059D0000CF414C188E49BE6A1E0B0E08D839E83C3 |
:1059E000AF83B88760909204709093048090940481 |
:1059F0009090950439E463163BE6730631E0830624 |
:105A000030E093060CF4DCC488E49BE6A1E0B0E04F |
:105A100089839A83AB83BC8349855A85CA01AA27A7 |
:105A200097FDA095BA2F2091820430918304409174 |
:105A3000840450918504280F391F4A1F5B1F2DA332 |
:105A40003EA34FA358A7A0902209B0902309C0906D |
:105A50002409D0902509A80EB91ECA1EDB1E860196 |
:105A60007501309154043BA3332309F0DAC08091CF |
:105A70005304882309F0C2C4409168084CA346FF30 |
:105A800013C6EBA5FCA5CF01AA2797FDA095BA2FB9 |
:105A9000BC01CD0129813A814B815C810E94D35D9B |
:105AA0009B01AC0197FD2CC7BBE0559547953795F9 |
:105AB0002795BA95D1F780918D03E82EFF24002712 |
:105AC0001127C801B7010E94D35D97FD14C7ACE050 |
:105AD0009595879577956795AA95D1F76F87788B78 |
:105AE000898B9A8B6093D4047093D5048093D604E9 |
:105AF0009093D70429A53AA5C901AA2797FDA09597 |
:105B0000BA2FBC01CD012D813E814F8158850E9465 |
:105B1000D35D9B01AC0197FD01C7FBE0559547950F |
:105B200037952795FA95D1F7C801B7010E94D35D43 |
:105B300097FDEFC6DC01CB01ECE0B595A7959795F5 |
:105B40008795EA95D1F78093D8049093D904A093D0 |
:105B5000DA04B093DB042091D4043091D50430935F |
:105B60005B0820935A082091D8043091D9043093CF |
:105B70005F0820935E082F85388949895A89821BDE |
:105B8000930BA40BB50B8AAF9BAFACAFBDAF8093AB |
:105B9000D8049093D904A093DA04B093DB04A80E40 |
:105BA000B91ECA1EDB1E8601750130918C033DA70C |
:105BB000332309F0A3C58EA79FA7A8ABB9ABB7FD48 |
:105BC00061C62EA53FA548A959A955954795379572 |
:105BD00027958DA19EA1AFA1B8A5821B930BA40B05 |
:105BE000B50B8DA39EA3AFA3B8A780938204909317 |
:105BF0008304A0938404B09385048CC598EB291684 |
:105C000094E939069EEF49069FEF59060CF0F1C35F |
:105C100028EB34E94EEF5FEF2D833E834F835887A7 |
:105C2000E1CE2DA13EA14FA158A52093820430932F |
:105C300083044093840450938504309168083CA306 |
:105C400010925F0810925E0810925B0810925A083A |
:105C50001092D0041092D1041092D2041092D30466 |
:105C60001092CC041092CD041092CE041092CF0466 |
:105C700030918C033DA78091D0049091D104A091E4 |
:105C8000D204B091D304BC01CD0124E630E040E061 |
:105C900050E00E94475EDA01C9014091CC04509166 |
:105CA000CD04481B590B58A34F8F8091CC04909181 |
:105CB000CD04A091CE04B091CF04BC01CD0124E667 |
:105CC00030E040E050E00E94475EDA01C9012091D7 |
:105CD000D0043091D104821B930B9AA389A38091A5 |
:105CE000850390918603A0918703B0918803BC013E |
:105CF000CD0128E631E040E050E00E94D35DE61699 |
:105D0000F7060807190744F057016801A61AB70AF1 |
:105D1000C80AD90A8601750117FDA3C4A0922209F9 |
:105D2000B0922309C0922409D09225092BA53CA545 |
:105D30008F8D98A1280F391F79010027F7FC009556 |
:105D4000102F8091860490918704A0918804B091CF |
:105D50008904E80EF91E0A1F1B1F57016801809174 |
:105D6000570490915804281B390BC901AA2797FDA5 |
:105D7000A095BA2F280E391E4A1E5B1E20919D0346 |
:105D800030919E0340919F035091A003221533054B |
:105D90004405550574F4A8EAEA2EA1E6FA2E012D71 |
:105DA000112DE21AF30A040B150B170128015701F4 |
:105DB000680188279927DC01821B930BA40BB50B84 |
:105DC000281639064A065B060CF0E9C2F8E52F2EC4 |
:105DD000FEE93F2EFFEF4F2EFFEF5F2E220E331E08 |
:105DE000441E551E20928A0430928B0440928C04EB |
:105DF00050928D04820171012092860430928704B2 |
:105E0000409288045092890429A53AA5A9A1BAA173 |
:105E10002A0F3B1FA901662757FD6095762F8091B9 |
:105E20008E0490918F04A0919004B0919104480F3A |
:105E3000591F6A1F7B1F5A016B0180915504909175 |
:105E40005604281B390BC901AA2797FDA095BA2F24 |
:105E5000680E791E8A1E9B1E8091A1039091A20359 |
:105E6000A091A303B091A4038EAB9FABA8AFB9AF31 |
:105E700086159705A805B90564F448EA51E660E07F |
:105E800070E0481B590B6A0B7B0B3A014B015A011E |
:105E90006B018EA99FA9A8ADB9ADB095A0959095BD |
:105EA00081959F4FAF4FBF4F681679068A069B06B4 |
:105EB0000CF064C2E8E56E2EEEE97E2EEFEF8E2E3A |
:105EC000EFEF9E2E2EA93FA948AD59AD620E731E6D |
:105ED000841E951E609292047092930480929404A2 |
:105EE00090929504B401A30160928E0470928F0485 |
:105EF00080929004909291048DA19EA1AFA1B8A52B |
:105F00008093960490939704A0939804B093990477 |
:105F10006092B2047092B3048092B4049092B5047B |
:105F20002092AA043092AB044092AC045092AD048B |
:105F30004093AE045093AF046093B0047093B104E7 |
:105F4000E092A604F092A7040093A8041093A90479 |
:105F5000809124039091250397FDA4C37C01F594BF |
:105F6000E794F594E794F594E794FAA6E9A680916E |
:105F700022039091230397FD93C38C0115950795F8 |
:105F800015950795159507951CA70BA780911404E7 |
:105F9000909115040F9734F458E1E52E5CEFF52E3F |
:105FA000FAA6E9A68091140490911504079734F499 |
:105FB00040E3E42E48EFF42EFAA6E9A62091010171 |
:105FC0002A3009F46BC28091140490911504815D0C |
:105FD00097400CF007C28091140490911504805EE4 |
:105FE000974034F080EDE82E87E0F82EFAA6E9A677 |
:105FF00080911204909113040F9724F408E11CEF90 |
:106000001CA70BA78091120490911304079724F406 |
:1060100000E318EF1CA70BA72A3009F455C28091A2 |
:10602000120490911304815D974024F008EE13E070 |
:106030001CA70BA78091120490911304805E9740D7 |
:1060400024F000ED17E01CA70BA7A0919503AA234D |
:1060500009F497C060912403709125038091DC04BA |
:106060009091DD04681B790B209124033091250366 |
:10607000280F391F37FD3FC3359527953093DD0431 |
:106080002093DC04613871050CF43AC260E870E0DA |
:106090007093E3046093E2048A2F9927869FF001AE |
:1060A000879FF00D969FF00D1124CF01F7FD21C3BE |
:1060B0007C01F594E794F594E794F594E794F594CE |
:1060C000E79429A53AA5E20EF31EFAA6E9A64091A7 |
:1060D0002203509123038091DE049091DF04481B3A |
:1060E000590B2091220330912303280F391F37FDCC |
:1060F000FDC2359527953093DF042093DE044138A7 |
:1061000051050CF4F5C140E850E05093E104409390 |
:10611000E0048A2F9927849FD001859FB00D949F1A |
:10612000B00D1124AD019D01B7FDDDC289011595AA |
:106130000795159507951595079515950795EBA561 |
:10614000FCA50E0F1F1F1CA70BA7869F9001879F02 |
:10615000300D969F300D1124C901209124033091F8 |
:106160002503820F931F909325038093240380912E |
:10617000220390912303480F591F50932303409308 |
:1061800022034D855E85141615060CF0C1C1809161 |
:106190005A0890915B0897FDA2C2AA2797FDA09587 |
:1061A000BA2F6DA5262F332744275527BC01CD01D3 |
:1061B0000E94D35D97FD8EC2E6E095958795779511 |
:1061C0006795EA95D1F7AF8DB8A1A60FB71FB09329 |
:1061D000CD08A093CC084B855C85141615060CF0F1 |
:1061E000C1C180915E0890915F0897FD6FC2AA2798 |
:1061F00097FDA095BA2F6DA5262F33274427552745 |
:10620000BC01CD010E94D35D97FD5BC246E0959530 |
:106210008795779567954A95D1F7A9A1BAA1A60F59 |
:10622000B71FB093C208A093C1083CA137FDC1C1FC |
:106230001093C0080093BF08F092CF08E092CE08F8 |
:1062400080916408E82FFF27EE0FFF1FE25DF74FF4 |
:106250008081918182599F4FA0916D04B0916E040D |
:10626000A817B9070CF0EEC0CD01019690936E040B |
:1062700080936D04DC0180916508E82FFF27EE0F05 |
:10628000FF1FE25DF74F8081918182599F4F60919E |
:106290006B0470916C04681779070CF0C4C0CB01D3 |
:1062A000019690936C0480936B04BC018091660806 |
:1062B000E82FFF27EE0FFF1FE25DF74F80819181EE |
:1062C00082599F4F4091690450916A0448175907B9 |
:1062D0000CF0D5C0CA01019690936A0480936904BA |
:1062E000AC0180916708E82FFF27EE0FFF1FE25DEA |
:1062F000F74F8081918182599F4F2091670430919F |
:106300006804281739070CF0ABC0C90101969093B7 |
:106310006804809367049C01B7FD93C1AF3FB1054A |
:1063200039F034F08FEF90E090936E0480936D0419 |
:1063300077FD76C16F3F710539F034F08FEF90E053 |
:1063400090936C0480936B0457FD70C14F3F5105CF |
:1063500039F034F08FEF90E090936A0480936904F1 |
:1063600037FD6AC12F3F310509F00CF4EEC28FEF03 |
:1063700090E09093680480936704E7C2609292046F |
:10638000709293048092940490929504A0928E044B |
:10639000B0928F04C0929004D0929104ADCD20921F |
:1063A0008A0430928B0440928C0450928D04A09207 |
:1063B0008604B0928704C0928804D092890424CDC8 |
:1063C00098EB691694E979069EEF89069FEF990686 |
:1063D0002CF528EB34E94EEF5FEF29833A834B83AA |
:1063E0005C831ACB98EEE92E93E0F92EFAA6E9A683 |
:1063F000F2CD2D823E824F825886F4CA8DA19EA195 |
:10640000AFA1B8A58093820490938304A0938404E1 |
:10641000B0938504909168089CA312CC69827A821B |
:106420008B829C82F9CA8081918182599F4F861705 |
:1064300097070CF03BCF6115710509F437CFCB01FD |
:1064400001972FCF8081918182599F4F8A179B0797 |
:106450000CF011CF109709F40ECFCD01019706CFA4 |
:106460008081918182599F4F821793070CF054CFFE |
:106470002115310509F450CFC901019748CF80811A |
:10648000918182599F4F841795070CF02ACF4115AF |
:10649000510509F426CFCA0101971ECF809114043B |
:1064A00090911504835F934034F038EEE32E33E08F |
:1064B000F32EFAA6E9A680911404909115048A5F40 |
:1064C00093400CF495CD8ECD8091120490911304DD |
:1064D000835F934024F008EE13E01CA70BA7809184 |
:1064E0001204909113048A5F93400CF4AECDA9CDB1 |
:1064F0003FEF403853070CF008CE40E85FEF05CE81 |
:106500008FEF603878070CF0C3CD60E87FEFC0CD27 |
:1065100080915A0890915B0897FD9BC1AA2797FD2F |
:10652000A095BA2FEDA52E2F332744275527BC0160 |
:10653000CD010E94D35D97FDADC156E0959587953D |
:10654000779567955A95D1F72F8D38A1261B370B74 |
:106550003093CD082093CC084B855C851416150626 |
:106560000CF43FCE80915E0890915F0897FD6DC15D |
:10657000AA2797FDA095BA2FEDA52E2F33274427E4 |
:106580005527BC01CD010E94D35D97FD88C136E03F |
:1065900095958795779567953A95D1F729A13AA171 |
:1065A000261B370B3093C2082093C1083CA137FF4C |
:1065B0003FCE4BA1442309F03BCE80915304882366 |
:1065C00009F036CE8B859C85A1E081309A070CF0CE |
:1065D00044C12B853C854FEF203034070CF0A3C11C |
:1065E00089A59AA5280F391F3C872B8720503F4F3C |
:1065F0003093CF082093CE08AD85BE85E1E0A13071 |
:10660000BE070CF465C12BA53CA5A20FB31FBE8726 |
:10661000AD87A050B140B093C008A093BF0810CE82 |
:1066200010926C0410926B0457FF90CE10926A0483 |
:106630001092690437FF96CE109268041092670496 |
:1066400084C110926E0410926D0472CE295F3F4F88 |
:106650003DC8295F3F4F29C82D5F3F4F4F4F5F4FC8 |
:10666000E5C8E60EF71E081F191FE0922209F092F6 |
:106670002309009324091093250958CB23E030E027 |
:1066800040E050E0E20EF31E041F151FA3C883E094 |
:1066900090E0A0E0B0E0E80EF91E0A1F1B1F5BC8E7 |
:1066A00007966BCC07965ACC2DA13EA14FA158A5B9 |
:1066B0002093820430938304409384045093850490 |
:1066C000BFCA615C7F4F8F4F9F4FA0CD9095819542 |
:1066D0009F4F8DCD615C7F4F8F4F9F4F6DCD9095BC |
:1066E00081959F4F5ACD215F3F4F20CD2F5F3F4F68 |
:1066F00000CD0F96DDCC2F5F3F4FBECC2DA13EA12C |
:106700004FA158A5209382043093830440938404BE |
:106710005093850489859A85AA2797FDA095BA2F5D |
:106720002AAD3BAD4CAD5DAD820F931FA41FB51FCD |
:106730008B8B9C8BAD8BBE8BBC01CD0129813A81AB |
:106740004B815C810E94D35D9B01AC0197FDBBC076 |
:106750006BE055954795379527956A95D1F76091E8 |
:106760008E03862F9927AA27BB278F8B988FA98FF7 |
:10677000BA8FBC01CD010E94D35D97FD9FC02CE074 |
:1067800095958795779567952A95D1F76B8F7C8F2F |
:106790008D8F9E8F6093CC047093CD048093CE0434 |
:1067A0009093CF046B897C898D899E892D813E8150 |
:1067B0004F8158850E94D35D9B01AC0197FD79C044 |
:1067C0008BE055954795379527958A95D1F76F8931 |
:1067D000788D898D9A8D0E94D35D97FD65C0BCE050 |
:1067E0009595879577956795BA95D1F76AAB7BAB09 |
:1067F0008CAB9DAB6093D0047093D1048093D20492 |
:106800009093D30429853A8537FD7FC02134310523 |
:106810000CF431CA6B8D7C8D8D8D9E8D97FD2AC0B9 |
:10682000613871058105910564F46AA97BA98CA979 |
:106830009DA997FD82C061387105810591050CF411 |
:106840001ACA81E08093710416CA909581959F4F72 |
:106850008FCE909581959F4F61CEE9A5FAA58E0FB9 |
:106860009F1F9C878B87805091409093CF08809387 |
:10687000CE08C2CE90958095709561957F4F8F4FD1 |
:106880009F4FCECF0196A11DB11D8EA79FA7A8AB8C |
:10689000B9AB97C9615C7F4F8F4F9F4F4ECE615C04 |
:1068A0007F4F8F4F9F4F73CE6150704F8F4F9F4FD1 |
:1068B00096CF2150384F4F4F5F4F82CF6150704F6E |
:1068C0008F4F9F4F5CCF2150384F4F4F5F4F40CF7E |
:1068D0004D855E856FEF4030560754F58BA59CA51E |
:1068E000480F591F5E874D8740505F4F5093C00837 |
:1068F0004093BF08A5CC6150704F8F4F9F4FE7C8A2 |
:106900002150384F4F4F5F4FCFC8309521953F4FA3 |
:106910007DCF6150704F8F4F9F4F0CC92150384F22 |
:106920004F4F5F4FFAC8F092CF08E092CE0864CE86 |
:106930001093C0080093BF0883CC90958095709504 |
:1069400061957F4F8F4F9F4F76CFED960FB6F8949E |
:10695000DEBF0FBECDBFDF91CF911F910F91FF9092 |
:10696000EF90DF90CF90BF90AF909F908F907F90EF |
:106970006F905F904F903F902F900895809101010C |
:106980008D3009F455C110927A00809114049091D1 |
:1069900015049093CF088093CE08809112049091B3 |
:1069A00013049093C0088093BF08809110049091C5 |
:1069B000110490931C0980931B0980910C04909101 |
:1069C0000D049C01442737FD4095542FDA01C9017D |
:1069D000880F991FAA1FBB1F880F991FAA1FBB1FD3 |
:1069E000820F931FA41FB51F820F931FA41FB51FF3 |
:1069F00090930B0980930A0980910E0490910F04E3 |
:106A00009C01442737FD4095542FDA01C901880FB6 |
:106A1000991FAA1FBB1F880F991FAA1FBB1F820F98 |
:106A2000931FA41FB51F820F931FA41FB51F909320 |
:106A300027098093260980910A0490910B04909372 |
:106A4000DA088093D9088FEC80937A0080916408EB |
:106A5000E82FFF27EE0FFF1FE25DF74F8081918146 |
:106A600082599F4FA0916D04B0916E04A817B90789 |
:106A70000CF085C0CD01019690936E0480936D0457 |
:106A8000DC0180916508E82FFF27EE0FFF1FE25D14 |
:106A9000F74F8081918182599F4F60916B04709173 |
:106AA0006C04681779070CF096C0CB01019690939F |
:106AB0006C0480936B04BC0180916608E82FFF276B |
:106AC000EE0FFF1FE25DF74F8081918182599F4F4A |
:106AD0004091690450916A04481759070CF06CC042 |
:106AE000CA01019690936A0480936904AC01809175 |
:106AF0006708E82FFF27EE0FFF1FE25DF74F808149 |
:106B0000918182599F4F2091670430916804281722 |
:106B100039070CF042C0C901019690936804809334 |
:106B200067049C01B7FD7FC0AF3FB10511F00CF0C9 |
:106B300061C077FD67C06F3F710539F034F08FEFAA |
:106B400090E090936C0480936B0457FD61C04F3FBD |
:106B5000510539F034F08FEF90E090936A04809300 |
:106B6000690437FD5BC02F3F310509F00CF463C0A9 |
:106B70008FEF90E090936804809367045CC08081FD |
:106B8000918182599F4F8A179B070CF07ACF1097FB |
:106B900009F477CFCD0101976FCF80819181825920 |
:106BA0009F4F821793070CF0BDCF2115310509F4D3 |
:106BB000B9CFC9010197B1CF8081918182599F4F8F |
:106BC000841795070CF093CF4115510509F48FCF29 |
:106BD000CA01019787CF8081918182599F4F861783 |
:106BE00097070CF069CF6115710509F465CFCB01EA |
:106BF00001975DCF8FEF90E090936E0480936D04CA |
:106C000077FF99CF10926C0410926B0457FF9FCFBF |
:106C100010926A041092690437FFA5CF109268049D |
:106C20001092670408C010926E0410926D0481CF18 |
:106C30000E940D19A8CE80918D089927AA27BB27FD |
:106C4000BC01CD0124EC39E040E050E00E94D35D6E |
:106C5000DC01CB018093A1039093A203A093A30333 |
:106C6000B093A40380918E089927AA27BB27BC0163 |
:106C7000CD010E94D35DDC01CB0180939D039093F5 |
:106C80009E03A0939F03B093A00308956F927F92F9 |
:106C90008F929F92AF92BF92CF92DF92EF92FF922C |
:106CA0000F931F93CF93DF93C0E0D0E07E016E017E |
:106CB0001092EF03469AD093C104C093C004D093BE |
:106CC000BF04C093BE0480E090E0A0E0B0E08093F9 |
:106CD000B8049093B904A093BA04B093BB04D093C2 |
:106CE000CB04C093CA04D093C904C093C804D09302 |
:106CF000C704C093C604D093EC08C093EB0810926D |
:106D00008E0310928D03109208040E94BE3484E614 |
:106D100090E00E94A8140E94BE348091680880FF11 |
:106D200010C080911C0390911D03875B934008F075 |
:106D30007BC080911C0390911D038E5E924008F4ED |
:106D400073C01FE18AE090E00E94A81480911004B3 |
:106D500090911104C80FD91F8091140490911504CB |
:106D6000E80EF91E8091120490911304C80ED91EEA |
:106D7000115017FFE7CFA701405F5F4F569547952A |
:106D8000569547955093CB044093CA049601205FD3 |
:106D90003F4F36952795369527953093C904209314 |
:106DA000C804CE01409696958795929582958F70EE |
:106DB00089279F7089279093C7048093C604909376 |
:106DC000EC088093EB083093C5042093C4045093DF |
:106DD000C3044093C20444E050E0DA010E94625EC2 |
:106DE000802D853020F1809126099091270997FD0B |
:106DF00053C06CE070E00E94125E7093BF04609319 |
:106E0000BE0480910A0990910B0997FD56C06CE071 |
:106E100070E00E94125E7093C1046093C004809180 |
:106E2000E6079091E7074DC00E94BB188ACFDA01B0 |
:106E30000E94625E802D9927982F8827DA0111968B |
:106E40000E94625E202D820F911D9093C104809359 |
:106E5000C004DA0112960E94625E802D9927982F55 |
:106E60008827DA0113960E94625E202D820F911D01 |
:106E70009093BF048093BE04DA0114960E94625E70 |
:106E8000802D9927982F8827DA0115960E94625E37 |
:106E9000202D820F911D15C0909581959F4F6CE01C |
:106EA00070E00E94125E7093BF046093BE048091F4 |
:106EB0000A0990910B0997FFAACF909581959F4F52 |
:106EC000A6CFAA2797FDA095BA2FBC01CD010E949D |
:106ED000595DDC01CB018093B8049093B904A09371 |
:106EE000BA04B093BB041092CF081092CE0810924F |
:106EF000C0081092BF0810921C0910921B0984E66A |
:106F000090E00E94A81480910C0490910D04AA278F |
:106F100097FDA095BA2F9C01AD01220F331F441F8E |
:106F2000551F220F331F441F551F280F391F4A1F9B |
:106F30005B1F280F391F4A1F5B1F30930B092093DB |
:106F40000A0980910E0490910F04AA2797FDA0953D |
:106F5000BA2F7C018D01EE0CFF1C001F111FEE0CDF |
:106F6000FF1C001F111FE80EF91E0A1F1B1FE80E51 |
:106F7000F91E0A1F1B1FF0922709E0922609809133 |
:106F80007408682E772488249924C9019C01442719 |
:106F900037FD4095542FC401B3010E94D35D5B01BE |
:106FA0006C016093B2047093B3048093B404909323 |
:106FB000B5049701442737FD4095542FC401B30110 |
:106FC0000E94D35DDC01CB018093AA049093AB04B3 |
:106FD000A093AC04B093AD04A0928E04B0928F0441 |
:106FE000C0929004D0929104809386049093870479 |
:106FF000A0938804B09389041092820410928304B1 |
:10700000109284041092850480911E0390911F03B6 |
:10701000A0912003B09121039093E9078093E807A2 |
:10702000109207041092060410927A0410927B04C6 |
:1070300010927C0410927D048091780490917904E0 |
:1070400090937704809376040E944B5682E390E0FD |
:107050009093F2038093F10380918D089927AA27DA |
:10706000BB27BC01CD0124EC39E040E050E00E9498 |
:10707000D35DDC01CB018856954CAF4FBF4F809359 |
:10708000A1039093A203A093A303B093A4038091C0 |
:107090008E089927AA27BB27BC01CD010E94D35D8A |
:1070A000DC01CB018856954CAF4FBF4F80939D03B9 |
:1070B00090939E03A0939F03B093A00310928A0322 |
:1070C000109289038091780490917904AA2797FD02 |
:1070D000A095BA2F209185033091860340918703B4 |
:1070E00050918803BC01CD010E94D35DDC01CB012E |
:1070F0008093220990932309A0932409B093250932 |
:107100001092700410926F0411E0109300010E941D |
:10711000EB5980913A04846080933A048FEF809316 |
:107120008B0910928C0980E280938D09809164080C |
:10713000E82FFF27EE0FFF1FE25DF74F808191815F |
:1071400082599F4F90936E0480936D0480916508DF |
:10715000E82FFF27EE0FFF1FE25DF74F808191813F |
:1071600082599F4F90936C0480936B0480916608C2 |
:10717000E82FFF27EE0FFF1FE25DF74F808191811F |
:1071800082599F4F90936A048093690480916708A5 |
:10719000E82FFF27EE0FFF1FE25DF74F80819181FF |
:1071A00082599F4F90936804809367041093EF0374 |
:1071B00084E680936604DF91CF911F910F91FF9039 |
:1071C000EF90DF90CF90BF90AF909F908F907F9087 |
:1071D0006F90089590915D04992381F580913A0410 |
:1071E0008C7F80933A0410C0A92FBB27FD01EB517F |
:1071F000F94F8083FD01EB51F94F8081A35FB64FBA |
:107200008C939F5F9C3080F48091D003882361F33E |
:10721000A92FBB27FD01EB51F94F8081A35FB64F2A |
:107220008C939F5F9C3080F38091D003882359F02A |
:107230008091D00381508093D00305C080913A049F |
:10724000816080933A0480910D0999279093BB0740 |
:107250008093BA0780910E0999279093BD07809378 |
:10726000BC078091100999279093BF078093BE07B0 |
:1072700080910F0999279093C1078093C0071092BE |
:107280003404109233040E945226089580916B08B2 |
:107290008B3F68F08B3F09F45BC28C3F09F4F1C26D |
:1072A0008D3F09F4B2C28E3F21F480916704809330 |
:1072B000990380916A088B3F08F4EDC18B3F09F474 |
:1072C000E8C18C3F09F4FBC28D3F09F47DC28E3FBB |
:1072D00009F404C380919A03882309F0E1C18093E3 |
:1072E0009A0380916C088B3F08F4E1C18B3F09F44D |
:1072F000DCC18C3F09F4DDC28D3F09F468C28E3FCA |
:1073000009F4E9C280919803882309F0D5C18093DC |
:10731000980380916E088B3F68F08B3F09F424C27C |
:107320008C3F09F4C9C28D3F09F44BC28E3F21F452 |
:107330008091670480939703809175088B3F68F074 |
:107340008B3F09F402C28C3F09F483C28D3F09F4DC |
:1073500035C28E3F21F4809167048093960380911B |
:1073600076088B3F08F4AFC18B3F09F4AAC18C3F6C |
:1073700009F4AEC28D3F09F433C28E3F09F4B7C29F |
:10738000809194038B3008F4A3C18F3F11F4809354 |
:107390009403809177088B3F68F08B3F09F4DBC141 |
:1073A0008C3F09F47DC28D3F09F417C28E3F21F452 |
:1073B0008091670480939303809178088B3F68F0F5 |
:1073C0008B3F09F4CBC18C3F09F467C28D3F09F4B0 |
:1073D000F2C18E3F21F48091670480939503209140 |
:1073E0007D082B3F08F478C12B3F09F473C12C3F73 |
:1073F00009F444C22D3F09F4EDC12E3F09F47AC2CD |
:107400002091910380917E088B3F08F06CC180939E |
:107410004E0480917F088B3F68F08B3F09F4B3C125 |
:107420008C3F09F428C28D3F09F4E9C18E3F21F455 |
:107430008091670480934D04809180088B3F68F0B1 |
:107440008B3F09F4A3C18C3F09F412C28D3F09F4AC |
:10745000E5C18E3F21F48091670480934C048091B4 |
:1074600081088B3F68F08B3F09F45DC18C3F09F4C4 |
:10747000E4C18D3F09F4DBC18E3F21F480916704A4 |
:1074800080934B04809192088B3F68F08B3F09F406 |
:107490004DC18C3F09F4D4C18D3F09F4CBC18E3F5F |
:1074A00021F48091670480934A04809193088B3F74 |
:1074B00068F08B3F09F43DC18C3F09F4C4C18D3F96 |
:1074C00009F4AFC18E3F21F4809167048093490491 |
:1074D000809194088B3F68F08B3F09F42DC18C3F5D |
:1074E00009F4B4C18D3F09F49FC18E3F21F480910E |
:1074F000670480934804809195088B3F68F08B3F28 |
:1075000009F41DC18C3F09F4BFC18D3F09F480C14E |
:107510008E3F21F480916704809347048091820814 |
:107520008B3F68F08B3F09F40DC18C3F09F49DC17E |
:107530008D3F09F470C18E3F21F4809167048093E0 |
:107540009003809187088B3F68F08B3F09F421C13D |
:107550008C3F09F4ABC18D3F09F424C18E3F21F467 |
:107560008091670480938F0380918A088B3F68F035 |
:107570008B3F09F411C18C3F09F489C18D3F09F497 |
:1075800014C18E3F21F48091670480938E03809113 |
:107590008B088B3F68F08B3F09F4E9C08C3F09F4FE |
:1075A0005EC18D3F09F425C18E3F21F480916704AF |
:1075B00080938D0380918C088B3F68F08B3F09F49A |
:1075C000D9C08C3F09F44EC18D3F09F415C18E3FDF |
:1075D00021F48091670480938C03809191088B3F04 |
:1075E00068F08B3F09F4C9C08C3F09F46BC18D3F33 |
:1075F00009F4F9C08E3F21F48091670480938B03D6 |
:10760000809197088B3F08F47EC08B3F09F479C0C6 |
:107610008C3F09F45AC18D3F09F4E8C08E3F09F44C |
:1076200060C18091E608823008F472C08F3F11F487 |
:107630008093E608809199088B3F08F46DC08B3FDA |
:1076400009F468C08C3F09F425C18D3F09F4B0C02E |
:107650008E3F09F449C180911909823008F461C054 |
:107660008F3F11F4809319098091AA088B3F70F025 |
:107670008B3F09F485C08C3F09F415C18D3F09F497 |
:107680008EC08E3F09F039C180916704809329092B |
:1076900034C180916D0480939A03882309F41FCE2E |
:1076A000843608F41ECE84E61ACE80916D04809351 |
:1076B0009803882309F42BCE843608F42ACE84E676 |
:1076C00026CE80916D04809394038B3008F05DCEBC |
:1076D0008AE05DCE20916D042093910380917E0815 |
:1076E0008B3F08F494CE8B3FE1F18C3F09F4B4C09A |
:1076F0008D3F09F487C08E3F09F08BCE80916704DF |
:1077000086CE80916D048093E608823008F08ECF9B |
:1077100081E08ECF80916D0480931909823008F04A |
:107720009FCF81E09FCF80916D04AACE80916D04A0 |
:10773000BACE80916D04CACE80916D04DACE80916C |
:107740006D04EACE80916D04FACE80916D0405CE71 |
:1077500080916D04ACCD80916D042CCE80916D0430 |
:107760003CCE80916D0453CE80916D04E3CD809129 |
:107770006D041ECF80916D042ECF80916D043ECF9D |
:1077800080916D0483CF80916D0454CE80916D04FF |
:1077900064CE80916D04E6CE80916D04F6CE80912A |
:1077A000690474CF80916904DDCE80916904EDCEC7 |
:1077B00080916904B1CF809169040FCE80916904F2 |
:1077C000CCCD80916904B6CD8091690464CF80915D |
:1077D00069046DCF209169047FCF80916904EACD5F |
:1077E0008091690470CF8091690408CF8091690409 |
:1077F0008ACF80916904DCCE80916904ECCE8091BF |
:10780000690418CE8091690402CE809169044FCD3D |
:107810008091690481CE8091690491CE8091690440 |
:107820001CCE8091690452CE8091690462CE809111 |
:10783000690426CE8091690436CE80916B0420CEF7 |
:1078400080916B0430CE80916B0440CE80916B04AC |
:1078500050CE80916B0481CD80916B04D8CD809106 |
:107860006B04A6CE80916B04B6CE80916B0467CE7C |
:1078700080916B04F2CD80916B04DCCD20916B0480 |
:107880002BCF80916B0413CD80916B0445CE8091FA |
:107890006B047BCE80916B043FCF80916B049DCDB8 |
:1078A00080916B0487CD80916B04F0CE80916B0446 |
:1078B00059CE80916B04FBCE80916B043BCD8091BF |
:1078C0006B04E9CE80916B0499CE80916B041BCF41 |
:1078D00080916B04F8CE80916704E9CE80916704B3 |
:1078E000DACE809167040FCF8091670415CF809125 |
:1078F0006704E9CE20916704EFCE33272F5F3F4F17 |
:107900008CE398E2B9010E94125E70939C0360932D |
:107910009B038091730880931A0980917208809369 |
:10792000D30808952F923F924F925F926F927F9269 |
:107930008F929F92AF92BF92CF92DF92EF92FF927F |
:107940000F931F93CF93DF93CDB7DEB7EF970FB6AB |
:10795000F894DEBF0FBECDBF0E94252B2091010100 |
:107960002C3008F0A3C2299AA0905E04B0905F0466 |
:10797000BA82A9828091D30899270A96A816B906D7 |
:1079800014F49A83898380916604843608F090C247 |
:1079900080910E03882309F469C4809100059091B9 |
:1079A0000105009711F40C949D48019790930105EF |
:1079B000809300052A3011F40C94A548243111F469 |
:1079C0000C94A548289880913B0490913C04895ED2 |
:1079D000934010F40C94994880917A08282F33270B |
:1079E0003A83298381E08093730480916008A82FF3 |
:1079F000BB27AA0FBB1FFD01EC5BF74F1182108262 |
:107A000080916108282F3327220F331FC9018C5B17 |
:107A1000974FFC0111821082A25DB74F11961C9204 |
:107A20001E92225D374FD90111961C921E928091B1 |
:107A30006308E82FFF27EE0FFF1FE25DF74F11826B |
:107A4000108280918303815080938303809183030C |
:107A50008F3F31F0F0917304FCA7FF2309F41BC49E |
:107A60000E9446398091110590911205AC01440F96 |
:107A7000551F480F591F00916008A02FBB27AA0F60 |
:107A8000BB1FFD01E25DF74FF0906F08CF2CDD24A6 |
:107A9000808191818C9D50018D9DB00C9C9DB00C7E |
:107AA00011244A0D5B1D57FF02C00C94EA515595F5 |
:107AB000479555954795AC5BB74F80917008682FF7 |
:107AC00077278D919C91869F9001879F300D969F7F |
:107AD000300D1124240F351F30931205209311050A |
:107AE0008091390590913A054091350550913605C0 |
:107AF000840F951F281B390B309365042093640471 |
:107B00008091130590911405AC01440F551F480F47 |
:107B1000591F10916108A12FBB27AA0FBB1FFD01A0 |
:107B2000E25DF74F808191818C9D90018D9D300D9C |
:107B30009C9D300D1124420F531F57FF02C00C941F |
:107B4000E6515595479555954795AC5BB74F8D9147 |
:107B50009C91869F9001879F300D969F300D112438 |
:107B6000240F351F3093140520931305809137059A |
:107B7000909138054091330550913405840F951F3D |
:107B8000281B390B309363042093620480916308AF |
:107B9000E82FFF27EE0FFF1FE25DF74F80819181F5 |
:107BA000909581959F4F8330910514F40C9436483D |
:107BB0000297909361048093600480916208E82F9B |
:107BC000FF27EE0FFF1FE25DF74FC080D18048E72F |
:107BD00050E0C40ED51E809194039927AA2797FDE3 |
:107BE000A095BA2FBC01CD010E94595DDC01CB01EB |
:107BF00020E030E040E251E4BC01CD010E94FA5C9B |
:107C0000DC01CB01BC01CD010E943C5DDC01CB015C |
:107C100080932009609193038093C6086093DD08E8 |
:107C20008091070780FF06C080912909813810F0F4 |
:107C30000C94A848D0925F04C0925E0480915E04C8 |
:107C400090915F0497FF02C00C94EE51B0906808C9 |
:107C5000B9A6B2FC02C00C9480481092ED08409185 |
:107C6000640450916504CA0157FF02C00C948B480C |
:107C7000959587959595879597FF02C00C949448A4 |
:107C800020913F04309140042817390714F00C94D8 |
:107C90003E48CA0157FF02C00C94FF5297FF02C032 |
:107CA0000C94FC52BC017595679575956795653682 |
:107CB000710514F40C94414864E670E0409162044C |
:107CC00050916304CA0157FD02C00C944A480396C0 |
:107CD000959587959595879597FD02C00C94524888 |
:107CE000909581959F4F20913D0430913E04281737 |
:107CF000390714F40C945B48C9010197C0907304D0 |
:107D0000CCA6CC2011F40C9476481092400410922A |
:107D10003F0410923E0410923D04E12FFF27EE0F26 |
:107D2000FF1FE25DF74F40918808242F33278081A1 |
:107D300091812817390734F48091AB0882FF02C083 |
:107D40000C941C49E12FFF27EE0FFF1FE25DF74F58 |
:107D5000842F992720918908821B910920813181E4 |
:107D60002817390714F410925204E12FFF27EE0F61 |
:107D7000FF1FE25DF74F842F992722273327281B07 |
:107D8000390B808191818217930734F48091AB087D |
:107D900083FF02C00C94174980915104882391F00D |
:107DA000E12FFF27EE0FFF1FE25DF74F809189085B |
:107DB0009927841B9109208131818217930714F43C |
:107DC0000C944349E02FFF27EE0FFF1FE25DF74FB2 |
:107DD000242F3327808191812817390734F480912B |
:107DE000AB0880FF02C00C94114950914F045523F9 |
:107DF00099F0E02FFF27EE0FFF1FE25DF74F842F72 |
:107E0000992720918908821B9109208131812817A7 |
:107E1000390714F40C944B49E02FFF27EE0FFF1F96 |
:107E2000E25DF74F842F992722273327281B390B30 |
:107E3000808191818217930734F48091AB0881FF90 |
:107E400002C00C940C4980915004882391F0E02FDB |
:107E5000FF27EE0FFF1FE25DF74F809189089927FA |
:107E6000841B9109208131818217930714F40C94AB |
:107E7000474980915204882331F48091510488232A |
:107E800011F40C94094991E0552331F48091500488 |
:107E9000882311F40C94274981E0809354041092B4 |
:107EA00053041092520410925104F8C129985CCDE9 |
:107EB000809166048D3808F4C4CD109273049091BB |
:107EC0007B0882E3989FC001112490930105809361 |
:107ED0000005E981FA81B99714F00C942C4980913E |
:107EE0003B0490913C048F3F910519F010F00C94E5 |
:107EF000DF511092E4041092E5041092E60410920F |
:107F0000E7041092E8041092E9041092EA04109237 |
:107F1000EB048A3F910511F40C94345430916208BB |
:107F2000E32FFF27EE0FFF1FE25DF74F8081918166 |
:107F3000813591050CF4E9C040915D04442309F0BA |
:107F4000E4C080916308E82FFF27EE0FFF1FE25D7A |
:107F5000F74F808191818C34910514F40C949E53D9 |
:107F6000809102058F5F893C10F40C9492542C3060 |
:107F700010F00C94FB54299810925D0410920205A5 |
:107F800010923C0410923B0400916008E02FFF2700 |
:107F9000EE0FFF1FE25DF74F8081918187349105DD |
:107FA00014F00C94F75410916108E12FFF27EE0FA5 |
:107FB000FF1FE25DF74F808191810190F081E02DFC |
:107FC000F7FF02C00C94F455E734F1050CF470C0CF |
:107FD00021E0A12FBB27AA0FBB1FA25DB74F8D9138 |
:107FE0009C9111978734910544F0E02FFF27EE0F05 |
:107FF000FF1FE25DF74F808191818D919C918734C5 |
:10800000910564F0E02FFF27EE0FFF1FE25DF74FB1 |
:1080100080819181873491050CF022E0E12FFF27C8 |
:10802000EE0FFF1FE25DF74F80819181863491054D |
:1080300064F4E02FFF27EE0FFF1FE25DF74F808112 |
:108040009181873491050CF023E0E12FFF27EE0F9B |
:10805000FF1FE25DF74F808191818A5B9F4F64F43F |
:10806000E02FFF27EE0FFF1FE25DF74F8081918128 |
:10807000873491050CF024E0E12FFF27EE0FFF1F5E |
:10808000E25DF74F808191818A5B9F4F64F4E02F1E |
:10809000FF27EE0FFF1FE25DF74F8081918186344D |
:1080A00091050CF425E0822F0E94D1031091610804 |
:1080B000E12FFF27EE0FFF1FE25DF74F80819181D7 |
:1080C0000190F081E02DF7FF02C00C9486557E9759 |
:1080D00014F00C94C35480916008E82FFF27EE0F32 |
:1080E000FF1FE25DF74F808191818A5B9F4F14F003 |
:1080F0000C94C35481E08093FB0688EE93E0909348 |
:10810000F2038093F10330916208E32FFF27EE0F13 |
:10811000FF1FE25DF74F808191818B5A9F4F0CF0DA |
:1081200090CCD0906308ED2DFF27EE0FFF1FE25D8E |
:10813000F74F80819181855B9F4F14F00C94CE5254 |
:10814000809103058F5F893C10F40C947C5388EC7C |
:108150008093030581E090E090933C0480933B047E |
:1081600081E080935D041092EC041092ED04109273 |
:10817000EE041092EF041092820410928304109285 |
:1081800084041092850410927E0410927F04109251 |
:1081900080041092810480917408E82EFF24002747 |
:1081A000112780910A0990910B099C01442737FD02 |
:1081B0004095542FC801B7010E94D35DDC01CB016B |
:1081C0008093920490939304A0939404B0939504A5 |
:1081D00080912609909127099C01442737FD4095FD |
:1081E000542FC801B7010E94D35DDC01CB018093FD |
:1081F0008A0490938B04A0938C04B0938D04809197 |
:10820000B2049091B304A091B404B091B5048093EA |
:108210008E0490938F04A0939004B0939104809166 |
:10822000AA049091AB04A091AC04B091AD048093EA |
:10823000860490938704A0938804B09389041092D5 |
:10824000E4041092E5041092E6041092E704109200 |
:10825000E8041092E9041092EA041092EB04809171 |
:108260003A04886080933A040C94D05280911103B0 |
:10827000909112038F5F9F4F09F08FCB88E99AE3AB |
:108280009093F2038093F10380E09CE090931203BB |
:108290008093110382CBD0906808D9A60091530433 |
:1082A000098B002321F480915404882369F0809184 |
:1082B0008708992729813A818217930714F49A83B2 |
:1082C000898381E0809371043CA5332309F4CAC6F5 |
:1082D000109261041092600410926504109264047C |
:1082E00010926304109262049AE59093200988E743 |
:1082F0008093ED089093C60888A78093DD081092BC |
:10830000530410925404198A2091E0083091E10836 |
:108310004091E2085091E3088091B2049091B30437 |
:10832000A091B404B091B5048E8B9F8BA88FB98FA8 |
:10833000280F391F4A1F5B1F8091E7089091E808BA |
:10834000A091E908B091EA08A090AA04B090AB040B |
:10835000C090AC04D090AD04ACA2BDA2CEA2DFA26E |
:108360008A0D9B1DAC1DBD1DC090D508D090D608B0 |
:10837000E090D708F090D808CAAADBAAECAAFDAA18 |
:10838000E090AE04F090AF040091B0041091B104FD |
:10839000E8A2F9A20AA31BA3AAA8BBA8CCA8DDA89F |
:1083A000AE0CBF1CC01ED11EAAAABBAACCAADDAAB5 |
:1083B000C090C708D090C808E090C908F090CA08DB |
:1083C000CEA6DFA6E8AAF9AAE090A604F090A7043A |
:1083D0000091A8041091A904EA8AFB8A0C8B1D8BDA |
:1083E000AEA4BFA4C8A8D9A8AE0CBF1CC01ED11E85 |
:1083F000AEA6BFA6C8AAD9AAB0905404BDA6BB20F9 |
:1084000009F0CFC50989002309F0CBC58093E7089F |
:108410009093E808A093E908B093EA082093E00855 |
:108420003093E1084093E2085093E3088091E60717 |
:108430009091E707815092400CF07AC480915D04DE |
:10844000882309F075C480910404909105048F3F3E |
:10845000910509F008F47BC5EDA5EE2309F025C7C9 |
:10846000F989FF2309F021C7009171040A8F0023C5 |
:1084700009F01BC7109190081BA7112309F415C719 |
:108480002AA93BA94CA95DA92093D5083093D60809 |
:108490004093D7085093D8088EA59FA5A8A9B9A93D |
:1084A0008093C7089093C808A093C908B093CA08DE |
:1084B0008091E0089091E108A091E208B091E30872 |
:1084C000B7FF02C00C944155292E3A2E4B2E55244D |
:1084D00047FC5A942092E0083092E1084092E2086A |
:1084E0005092E3088091E7089091E808A091E9088C |
:1084F000B091EA08B7FF02C00C943B55892F9A2F20 |
:10850000AB2FBB27A7FDBA958D839E83AF83B8871A |
:108510008093E7089093E808A093E908B093EA08ED |
:1085200080917408E82EFF24002711272091A204CF |
:108530003091A3044091A4045091A504C801B7014F |
:108540000E94D35D97FF02C00C943555672E782E9C |
:10855000892E992487FC9A9420919E0430919F043F |
:108560004091A0045091A104C801B7010E94D35DBD |
:1085700097FF02C00C942F55A72EB82EC92EDD24CC |
:10858000C7FCDA94D201C10186199709A809B90973 |
:1085900020918F08E22EFF2400271127BC01CD0176 |
:1085A000A80197010E94475E39014A0119012A0179 |
:1085B0008D819E81AF81B8858A199B09AC09BD095F |
:1085C000BC01CD01A80197010E94475ED401C301FF |
:1085D00097FE02C00C944D55892F9A2FAB2FBB27C5 |
:1085E000A7FDBA95BC01DA01C90157FF02C00C947E |
:1085F0004755892F9A2FAB2FBB27A7FDBA956C0142 |
:1086000080913F049091400481349105D4F480918D |
:108610003D0490913E04813491059CF4809163085F |
:10862000E82FFF27EE0FFF1FE25DF74F808191815A |
:108630000190F081E02DF7FF02C00C94D4557A9799 |
:1086400034F080918B098F3F11F40C94E154E8A031 |
:10865000F9A00AA11BA12E893F89488D598DE21AE4 |
:10866000F30A040B150BECAEFDAE0EAF1FAFE0929C |
:10867000F004F092F1040093F2041093F3048A8959 |
:108680009B89AC89BD89ECA0FDA00EA11FA18E190C |
:108690009F09A00BB10B89879A87AB87BC87809312 |
:1086A000F4049093F504A093F604B093F7040CAD92 |
:1086B0001DAD2EAD3FAD0093F8041093F904209347 |
:1086C000FA043093FB048093FC049093FD04A09380 |
:1086D000FE04B093FF0480918E0490918F04A091CA |
:1086E0009004B0919104801B910BA20BB30B80936B |
:1086F0008E0490938F04A0939004B0939104809182 |
:10870000860490918704A0918804B09189042985FA |
:108710003A854B855C85821B930BA40BB50B80932C |
:10872000860490938704A0938804B09389043BA5A2 |
:10873000332371F120916F04309170042138310599 |
:1087400094F08091C6049091C70401969093C70459 |
:108750008093C6048091EB089091EC080196909369 |
:10876000EC088093EB0820583F4F94F48091C604A6 |
:108770009091C70401979093C7048093C604809199 |
:10878000EB089091EC0801979093EC088093EB082C |
:108790001092700410926F0401E0A02EB12C8CADE9 |
:1087A0009DADAEADBFADB7FF02C00C947655815004 |
:1087B0009240A040B0401CF014E0A12EB12C80915A |
:1087C0001B0590911C05A0911D05B0911E05E09020 |
:1087D000E008F090E1080091E2081091E3088E199A |
:1087E0009F09A00BB10B815E914BAF4FBF4F8F53D1 |
:1087F0009C49A040B04010F40C949A54F0918C091C |
:10880000FF8FF93114F40C94FE54B0921605A09227 |
:1088100015058CAD9DADAEADBFAD81509041A04072 |
:10882000B04014F40C94A75480911705882311F4D8 |
:108830000C942A5570935604609355048CAD9DADED |
:10884000AEADBFADB7FF02C00C94D9559C01AD01D0 |
:10885000B7FF02C00C94E855B9E055954795379598 |
:108860002795BA95D1F78091150590911605820F3D |
:10887000931F90931605809315052CAD3DAD4EAD1D |
:108880005FAD57FF02C00C94E25539014A01A3E0E5 |
:108890009594879477946794AA95D1F7130124014E |
:1088A000F9E86F16F3E17F06F0E08F06F0E09F062F |
:1088B00044F0F8E86F2EF3E17F2E812C912C130108 |
:1088C0002401D401C30197FE02C00C94BC55892F2A |
:1088D0009A2FAB2FBB27A7FDBA95680F791F2CAD38 |
:1088E0003DAD4EAD5FAD203080EF38078FEF4807CC |
:1088F0008FEF580714F00C94B75480911805882313 |
:1089000011F40C9460557093560460935504DA0189 |
:10891000C90157FF02C00C9402569C01AD01B7FF7C |
:1089200002C00C94115669E05595479537952795E7 |
:108930006A95D1F78091150590911605820F931FC6 |
:1089400090931605809315052CAD3DAD4EAD5FADF2 |
:1089500057FF02C00C940B5639014A0143E095942D |
:108960008794779467944A95D1F798E769169CEEB7 |
:1089700079069FEF89069FEF990644F438E7632E46 |
:108980003CEE732E3FEF832E3FEF932E609209054E |
:1089900070920A0580920B0590920C05D401C301D8 |
:1089A00097FE02C00C94EE55892F9A2FAB2FBB2750 |
:1089B000A7FDBA956091550470915604680F791F10 |
:1089C000ABA52A2F332780911505909116052817FE |
:1089D000390724F43093160520931505BF8DBB236A |
:1089E00079F02B2F332727FD309580911505909135 |
:1089F00016052817390724F430931605209315051A |
:108A00002CAD3DAD4EAD5FAD213831054105510571 |
:108A100074F08091CA049091CB0420911505309197 |
:108A20001605820F931F9093CB048093CA048CADDC |
:108A30009DADAEADBFAD80589F4FAF4FBF4F74F4EB |
:108A40008091CA049091CB042091150530911605B0 |
:108A5000821B930B9093CB048093CA04B1E0AB2E9E |
:108A6000B12C89859A85AB85BC85B7FF02C00C9473 |
:108A70006D5581509240A040B0401CF0A4E0AA2E59 |
:108A8000B12C20E030E040E050E080911F05909153 |
:108A90002005A0912105B09122056090E708709013 |
:108AA000E8088090E9089090EA0886199709A809D3 |
:108AB000B909815E914BAF4FBF4F8F539C49A04086 |
:108AC000B04028F0FF8DF93114F40C941455B09295 |
:108AD0001605A092150589859A85AB85BC858150C0 |
:108AE0009041A040B04014F40C94AB54809119050F |
:108AF000882311F40C945355D0925804C092570413 |
:108B000089859A85AB85BC85B7FF02C00C94F95561 |
:108B1000B7FF02C00C94CE55F9E0B595A79597958F |
:108B20008795FA95D1F7A80EB91EB0921605A092B6 |
:108B3000150529853A854B855C8557FF02C00C9445 |
:108B4000C855E3E05595479537952795EA95D1F7B0 |
:108B50002938F3E13F07F0E04F07F0E05F0714F436 |
:108B60000C948F5588E893E1A0E0B0E080930D0568 |
:108B700090930E05A0930F05B093100580910D05FD |
:108B800090910E05A0910F05B0911005B7FF02C09E |
:108B90000C94C255892F9A2FAB2FBB27A7FDBA95EE |
:108BA000C0905704D0905804C80ED91E29853A8524 |
:108BB0004B855C85203080EF38078FEF48078FEFBB |
:108BC000580714F00C94A35480911A05882311F4CB |
:108BD0000C947F55D0925804C0925704DA01C90111 |
:108BE00057FF02C00C941D569C01AD01B7FF02C097 |
:108BF0000C941756B9E05595479537952795BA9532 |
:108C0000D1F78091150590911605820F931F9093CF |
:108C100016058093150529853A854B855C8557FF98 |
:108C200002C00C94A355A3E0559547953795279519 |
:108C3000AA95D1F728379CEE39079FEF49079FEF98 |
:108C4000590714F00C94995588E79CEEAFEFBFEFED |
:108C500080930D0590930E05A0930F05B09310051A |
:108C600080910D0590910E05A0910F05B091100512 |
:108C7000B7FF02C00C94AF55892F9A2FAB2FBB279B |
:108C8000A7FDBA95C0905704D0905804C80ED91EBD |
:108C9000ABA52A2F3327809115059091160528172B |
:108CA000390724F43093160520931505BF8DBB2397 |
:108CB00079F02B2F332727FD309580911505909162 |
:108CC00016052817390724F4309316052093150547 |
:108CD00029853A854B855C8521383105410551054B |
:108CE00074F08091C8049091C904209115053091C9 |
:108CF0001605820F931F9093C9048093C804898539 |
:108D00009A85AB85BC8580589F4FAF4FBF4F0CF005 |
:108D1000E2C28091C8049091C90420911505309158 |
:108D20001605821B930B9093C9048093C804D3C289 |
:108D300090908B096FEF961611F40C94F651809178 |
:108D40007408A82EBB24CC24DD246E897F89888DED |
:108D5000998DA60195010E94475E79018A01809153 |
:108D60000A0990910B09AA2797FDA095BA2FE81A36 |
:108D7000F90A0A0B1B0B6CA17DA18EA19FA1A60174 |
:108D800095010E94475E59016A01809126099091E0 |
:108D90002709AA2797FDA095BA2FA81AB90ACA0AC7 |
:108DA000DB0A292C332427FC3094432C532CC2019A |
:108DB000B101A80197010E94D35D97FD71C23B01EB |
:108DC0004C01F9E09594879477946794FA95D1F7DC |
:108DD000C201B101A60195010E94D35D97FF02C0B7 |
:108DE0000C943E535B016C01E9E0D594C794B794B1 |
:108DF000A794EA95D1F780913F0490914004813483 |
:108E000091053CF480913D0490913E04813491059C |
:108E1000C4F0D401C30197FE02C00C942F543C014E |
:108E20004D019594879477946794D601C501D7FE38 |
:108E300002C00C942A545C016D01D594C794B79478 |
:108E4000A79480916308E82FFF27EE0FFF1FE25DD4 |
:108E5000F74F808191810190F081E02DF7FF02C0F2 |
:108E60000C9431537A97A4F0C401B30123E030E0AD |
:108E700040E050E00E94475E39014A01C601B50159 |
:108E800023E030E040E050E00E94475E59016A0173 |
:108E900080918D09282F332727FD3095432F532F9D |
:108EA000261537054805590514F439014A01992753 |
:108EB00087FD9095909581959F4FAA2797FDA09546 |
:108EC000BA2F681679068A069B0614F43C014D01F8 |
:108ED0002A153B054C055D0514F459016A01A816D5 |
:108EE000B906CA06DB0614F45C016D018091920498 |
:108EF00090919304A0919404B091950486199709D8 |
:108F0000A809B9098093920490939304A0939404C0 |
:108F1000B093950480918A0490918B04A0918C0465 |
:108F2000B0918D048A199B09AC09BD0980938A040C |
:108F300090938B04A0938C04B0938D0480910404CF |
:108F4000909105048F3F910511F008F085CAAAA8F9 |
:108F5000BBA8CCA8DDA8A092D508B092D608C09234 |
:108F6000D708D092D808CEA4DFA4E8A8F9A8C09268 |
:108F7000C708D092C808E092C908F092CA08D090F9 |
:108F8000ED08DAA6009171040A8FA0906004B090F9 |
:108F90006104C501B7FE01C2882799278A199B0978 |
:108FA000FCC11092A2041092A3041092A404109287 |
:108FB000A50410929E0410929F041092A004109297 |
:108FC000A1041092E0081092E1081092E2081092B9 |
:108FD000E3081092E7081092E8081092E90810924E |
:108FE000EA081EA61FA618AA19AA20E030E040E051 |
:108FF00050E02AAB3BAB4CAB5DAB809192049091BF |
:109000009304A0919404B091950480938E0490935E |
:109010008F04A0939004B093910480918A0490915E |
:109020008B04A0918C04B0918D048093860490935E |
:109030008704A0938804B0938904109205041092C9 |
:109040000404109256041092550410925804109281 |
:1090500057043DA5332309F0F6C94989442309F093 |
:10906000F2C9E4C94091DD0848A74EC93FEF8E3FE1 |
:1090700093070CF0E6C002960C94D93DB9016150FB |
:1090800070404091620450916304CA0157FF02C0CE |
:109090000C94673E959587959595879597FF02C0A7 |
:1090A0000C94703E20913D0430913E0428173907FE |
:1090B00014F00C947C3ECA0157FF02C00C94F45289 |
:1090C00097FF02C00C94F9529595879595958795D1 |
:1090D0008536910514F40C947E3E84E690E0C090B1 |
:1090E0007304CCA6CC2011F00C94853E90933E04E2 |
:1090F00080933D047093400460933F040C948D3E34 |
:109100006093ED084091640450916504CA0157FDD5 |
:1091100002C00C94383E0396959587959595879552 |
:1091200097FD02C00C94403E909581959F4F0C9402 |
:10913000403E10925D040C94213D10925D0410920B |
:1091400073042A3011F00C94DE3C289A0C94E33C12 |
:1091500080910007992787FD90954F2D5527849F73 |
:10916000D001859FB00D949FB00D1124CD012091A9 |
:10917000640430916504820F931F9093650480937B |
:10918000640480910107992787FD9095849FF001E1 |
:10919000859FF00D949FF00D1124CF012091620462 |
:1091A00030916304820F931F909363048093620451 |
:1091B00080910207992787FD909520916004309156 |
:1091C0006104820F931F90936104809360048091E7 |
:1091D0000407282F332727FD309580916D089927A4 |
:1091E000289F5001299FB00C389FB00C1124B092D9 |
:1091F0008A03A09289038091030799278C159D0506 |
:1092000014F00C941A3E90935F0480935E040C94C7 |
:109210001E3E982F0C94443F81E0809350040C94A0 |
:10922000393F81E080934F04582F0C940C3F81E02C |
:10923000809351040C94E23E81E0809352040C949C |
:10924000B53E10926104109260040C94DD3D909341 |
:1092500053048093540422C880915D04882311F440 |
:109260000C946F3F80913B0490913C04FFEF8F3F43 |
:109270009F0711F40C94733F019690933C048093E4 |
:109280003B040C94733F109251040C94E23E1092F4 |
:1092900050040C94393F10924F0450E00C940C3F52 |
:1092A00061507E4F8F4F9F4F8ACD60E070E06B0121 |
:1092B000109271041A8EE090E008F090E10800919D |
:1092C000E2081091E3086090E7087090E808809049 |
:1092D000E9089090EA08F091ED08FAA7FF2311F051 |
:1092E0000C947D5110925804109257041092560419 |
:1092F00010925504E0921B05F0921C0500931D0589 |
:1093000010931E0560921F05709220058092210522 |
:10931000909222051092A2041092A3041092A40429 |
:109320001092A50410929E0410929F041092A00423 |
:109330001092A10410929A0410929B0410929C0423 |
:1093400010929D041092E0081092E1081092E20839 |
:109350001092E3081092E7081092E8081092E908CA |
:109360001092EA081092D5081092D6081092D708E9 |
:109370001092D8081092C7081092C8081092C90815 |
:109380001092CA081092050410920404A090600480 |
:10939000B0906104C501B7FCFFCD409774F068EE52 |
:1093A000262E63E0362E3092A6032092A50319A53F |
:1093B00014FD03C081E080930805D0907108ED2C66 |
:1093C000FF2400271127B501882777FD8095982F66 |
:1093D0009501B7FCBDC7442737FD4095542F0E9427 |
:1093E000D35D9B01AC01C801B7010E94D35D97FD1D |
:1093F000AAC759E095958795779567955A95D1F7BE |
:109400009B018D2D99278A9DA0018B9D500D9A9DC2 |
:10941000500D1124CA0157FD94C7959587959595D0 |
:109420008795280F391FC901AA2797FDA095BA2F44 |
:109430008093EC049093ED04A093EE04B093EF04BA |
:1094400020918204309183044091840450918504DA |
:10945000281B390B4A0B5B0B213563EC360760E0A8 |
:10946000460760E056070CF423C780E593ECA0E0C4 |
:10947000B0E08093820490938304A0938404B0931B |
:1094800085048091820490918304A0918404B0911A |
:109490008504805B9C43AF4FBF4F64F480EB9CE33B |
:1094A000AFEFBFEF8093820490938304A093840472 |
:1094B000B0938504C0907804D0907904C114D1048D |
:1094C00009F4F3C5F9A5F3FFF0C58E899F89A88D2E |
:1094D000B98DB7FF02C00C94045309E0B595A79568 |
:1094E000979587950A95D1F79DAF8CAF97FF02C0EE |
:1094F0000C9410538CA19DA1AEA1BFA1B7FF02C0D7 |
:109500000C940A5319E0B595A795979587951A95E8 |
:10951000D1F7BC0197FF02C00C942553ECACFDAC15 |
:10952000E616F70614F47DAF6CAF6CAD7DAD77FF3A |
:1095300002C00C9421532B015594479455944794A1 |
:10954000559447940894411C511C0CE112E0C00E44 |
:10955000D11E76010027F7FC0095102F24EE3DEF79 |
:10956000C20ED31E609022097090230980902409B6 |
:10957000909025098091850390918603A09187039F |
:10958000B09188038B8F9C8FAD8FBE8FC401B301C8 |
:109590002B8D3C8D4D8D5E8D0E94475EE21AF30A45 |
:1095A000040B150BC801B70128E631E040E050E09C |
:1095B0000E94475EDC01CB018C01045B1040A0904F |
:1095C0001B09B0901C09C501B7FE02C00C941B53C7 |
:1095D0008138910514F000E010E02090A503309050 |
:1095E000A60321143104A1F4ACADBDAD599784F4A8 |
:1095F00080916F0490917004800F911F909370047C |
:1096000080936F0480910805882311F00C947F5398 |
:10961000C801880F991F880F991F880F991FB201E1 |
:109620000E94125E9B01442737FD4095542F260D62 |
:10963000371D481D591D209322093093230940935B |
:10964000240950932509F09096036F2D7727ECADF0 |
:10965000FDAD6E9FC0016F9F900D7E9F900D1124F8 |
:1096600097FDE7C7959587959595879595958795E6 |
:109670009595879595958795681B790B7DAF6CAF10 |
:1096800077FDE8C72114310409F0F0C700913F04C9 |
:109690001091400480913D0490913E04080F191FE1 |
:1096A00017FF02C00C9474541595079515950795EE |
:1096B00015950795005C1F4FCA01B9012B8D3C8D94 |
:1096C0004D8D5E8D0E94475EDA01C90120917604BE |
:1096D00030917704442737FD4095542F821B930B1C |
:1096E000A40BB50B845E9D4FAF4FBF4FBC01CD01A6 |
:1096F00028E631E040E050E00E94475EDC01CB010B |
:10970000845B90404CAD5DAD849F9001859F300D92 |
:10971000949F300D1124C901B8010E94125E83E0AC |
:10972000F89ED0011124BDAFACAFA617B7070CF05F |
:10973000ABC7BD01CB01AA2797FDA095BA2F2091F9 |
:109740008204309183044091840450918504820FF7 |
:10975000931FA41FB51F8093820490938304A0934A |
:109760008404B09385048091070581508F3F09F4EC |
:10977000A5C480930705BA8DBB2381F01092E8043D |
:109780001092E9041092EA041092EB041092E4049F |
:109790001092E5041092E6041092E704EDA5EE2382 |
:1097A00009F06EC5FAA58F2F9927AA27BB27BC0100 |
:1097B000CD012E893F89488D598D0E94D35DDC01F2 |
:1097C000CB01BC01CD0128EF3AE240E050E00E941D |
:1097D000475E19010989002309F04FC51AA5812F99 |
:1097E0009927AA27BB27BC01CD012CA13DA14EA1E1 |
:1097F0005FA10E94D35DDC01CB01BC01CD0128EF4C |
:109800003AE240E050E00E94475E3C832B83809028 |
:10981000C1089090C20829EC821691040CF422C56C |
:10982000A8EC8A2E912C9092C2088092C1080091D7 |
:10983000CC081091CD08093C11050CF40BC508ECBF |
:1098400010E01093CD080093CC088091CE08909141 |
:10985000CF08AA2797FDA095BA2F20912009C22EE4 |
:10986000DD24EE24FF24BC01CD01A70196010E9456 |
:10987000D35D9B01AC01C401AA2797FDA095BA2F27 |
:10988000E7E0880F991FAA1FBB1FEA95D1F7280FA1 |
:10989000391F4A1F5B1F57FD6EC576E055954795EA |
:1098A000379527957A95D1F74101820E931E2401B1 |
:1098B0008091BF089091C008AA2797FDA095BA2F64 |
:1098C000BC01CD01A70196010E94D35D9B01AC01B3 |
:1098D000C801AA2797FDA095BA2F67E0880F991FA6 |
:1098E000AA1FBB1F6A95D1F7280F391F4A1F5B1F9C |
:1098F00057FD3CC596E055954795379527959A9520 |
:10990000D1F76B807C80620E731E6301AA0CBB1CB6 |
:10991000C501AA2797FDA095BA2F2091C608332725 |
:1099200044275527BC01CD010E94D35D7B018C01EA |
:1099300097FD13C586E015950795F794E7948A95EA |
:10994000D1F7E8A58E2F9927AA27BB272091960447 |
:10995000309197044091980450919904BC01CD0135 |
:109960000E94D35DDC01CB01BC01CD0120EF35E5C8 |
:1099700040E050E00E94475E5701A20EB31EC501B1 |
:10998000F1E08F16F0E49F0624F0812C10E4912E74 |
:10999000240100E0801600EC90060CF074C4812CC9 |
:1099A000B0EC9B2E9092CF088092CE0811E0611609 |
:1099B00010E4710624F0612CA0E47A2E630120E00B |
:1099C000621620EC72060CF068C4612CF0EC7F2E5D |
:1099D0007092C0086092BF0831E0A31630E4B3066D |
:1099E00024F0A12CE0E4BE2EC50140E0A41640EC1A |
:1099F000B4060CF04DC4A12C70ECB72EB0921C092B |
:109A0000A0921B09809131048823C1F080913B040E |
:109A100090913C040297C09788F489819A81181626 |
:109A2000190664F481E090E090933C0480933B0439 |
:109A30008091D308A82FBB27BA83A983E981FA8133 |
:109A4000EE0FFF1FEE0FFF1FFA83E983F9A58F2F9B |
:109A5000992780FFB8C081FF34C480919903823375 |
:109A600008F0A8C48091C20381508F3F09F420C63A |
:109A70008093C20320915B0430915C045CA5552364 |
:109A800021F010925A04109259048901209159042E |
:109A900030915A04201731070CF095C08091720460 |
:109AA000882309F490C0021B130B80919803992717 |
:109AB000089FD001099FB00D189FB00D1124CD0152 |
:109AC000B7FD0CC78C011595079515950795E9818C |
:109AD000FA81E01BF10B8F0180910604909107043D |
:109AE00097FDFAC695958795081B190BC0907A04C7 |
:109AF000D0907B04E0907C04F0907D04F7FCE3C6FA |
:109B000037E0F594E794D794C7943A95D1F78091CC |
:109B10009703282F332744275527C701B6010E94F2 |
:109B2000D35D97FDCBC625E095958795779567958D |
:109B30002A95D1F731E0693173070CF427C568E144 |
:109B400071E0061B170B80910505909106059C019D |
:109B500022953295307F3227207F3227281B390B00 |
:109B6000200F311F37FDA7C6A9015595479555957B |
:109B700047955595479555954795BA018091690840 |
:109B8000282F3327220F331F220F331F421753076B |
:109B90006CF489819A81821793070CF0AAC5A98178 |
:109BA000BA81A217B30714F4AD01BD01E981FA81AE |
:109BB000E417F5070CF0E3C4AF01F0930605E0935A |
:109BC00005055A83498350901A09852D9927880FD6 |
:109BD000991F880F991F80559040C980DA808C1595 |
:109BE0009D0514F49A838983E980FA80F092B10785 |
:109BF000E092B0078091EC049091ED04A091EE0406 |
:109C0000B091EF04880F991FAA1FBB1F880F991FDF |
:109C1000AA1FBB1FA81AB90ABBAEAAAE8701013A98 |
:109C200011050CF403C3C701F7FCDEC395958795B6 |
:109C30002AAD3BAD8217930714F49BAF8AAF909582 |
:109C400081959F4F4AAD5BAD4817590714F49BAF00 |
:109C50008AAF252D3327220F331F220F331FC9014F |
:109C600049815A81841B950BAAADBBAD8A179B070E |
:109C700014F49BAF8AAF69817A81621B730BEAADE2 |
:109C8000FBADE617F70714F47BAF6AAF809164046D |
:109C9000909165048401081B190B1093DF08009351 |
:109CA000DE08FAA5FF2309F4BBC2281A390AC1014C |
:109CB000AA2797FDA095BA2F2091E4043091E504DE |
:109CC0004091E6045091E704820F931FA41FB51F33 |
:109CD0008093E4049093E504A093E604B093E70432 |
:109CE0006091E4047091E5048091E6049091E704AA |
:109CF00061302AEF720720E0820720E0920774F0BB |
:109D000080E09AEFA0E0B0E08093E4049093E50453 |
:109D1000A093E604B093E704BC01CD01603036E0C7 |
:109D200073073FEF83073FEF930774F480E096E0FB |
:109D3000AFEFBFEF8093E4049093E504A093E604B3 |
:109D4000B093E704BC01CD01E0909B03F0909C032D |
:109D50009701442737FD4095542F0E94475E6801C4 |
:109D6000C20ED31EB0908B036B2D772788279927BF |
:109D70002AAD3BAD37FD04C337FD07C335952795A5 |
:109D800049815A81240F351F442737FD4095542FB0 |
:109D90000E94D35D97FD09C326E095958795779539 |
:109DA00067952A95D1F79B016C157D050CF46B0125 |
:109DB00066277727621B730BC616D7060CF46B0158 |
:109DC00080916204909163048301081B190B109326 |
:109DD000BE080093BD085AA5552309F463C2AB81A0 |
:109DE000BC81A81BB90BFD01CF01AA2797FDA09547 |
:109DF000BA2F2091E8043091E9044091EA0450918F |
:109E0000EB04820F931FA41FB51F8093E804909367 |
:109E1000E904A093EA04B093EB046091E804709124 |
:109E2000E9048091EA049091EB046130FAEF7F0736 |
:109E3000F0E08F07F0E09F0774F080E09AEFA0E079 |
:109E4000B0E08093E8049093E904A093EA04B0930F |
:109E5000EB04BC01CD01603026E072072FEF8207D2 |
:109E60002FEF920774F480E096E0AFEFBFEF80939E |
:109E7000E8049093E904A093EA04B093EB04BC01D6 |
:109E8000CD019701442737FD4095542F0E94475E2E |
:109E90007801E20EF31E6B2D7727882799272AADCC |
:109EA0003BAD37FD34C237FD37C235952795498123 |
:109EB0005A81240F351F442737FD4095542F0E94A7 |
:109EC000D35D97FD39C216E095958795779567958F |
:109ED0001A95D1F79B016E157F050CF47B0166275F |
:109EE0007727621B730BE616F7060CF47B01C6019D |
:109EF000AA2797FDA095BA2F8D879E87AF87B88B2D |
:109F00008091D308A82FBB27BFABAEABE52DFF27B1 |
:109F1000F9AFE8AFBDE0CB2EB9E0DB2E00E515E0F0 |
:109F20002701662457FC6094762CEAACFBAC470111 |
:109F3000AA2497FCA094BA2CABE03A2EFEEEEF2EAA |
:109F4000F8E0FF2E06C0FDAFECAFECADD601EC9310 |
:109F50007DC6F801258512160CF08FC049815A8103 |
:109F6000CA01AA2797FDA095BA2F332727FD309560 |
:109F7000432F532FBC01CD010E94D35D97FD80C0BC |
:109F8000E6E09595879577956795EA95D1F77DAF4A |
:109F90006CAFF8018685282F332727FD3095432F96 |
:109FA000532F6D857E858F8598890E94D35D97FD9F |
:109FB00077C056E095958795779567955A95D1F72F |
:109FC0002CAD3DAD260F371F3DAF2CAFF801878577 |
:109FD000282F332727FD3095432F532FC301B2017C |
:109FE0000E94D35D97FD57C046E09595879577957C |
:109FF00067954A95D1F72CAD3DAD260F371F3DAF84 |
:10A000002CAFF8018089282F332727FD3095432F67 |
:10A01000532FC501B4010E94D35DDC01CB01B7FD14 |
:10A0200036C036E0B595A795979587953A95D1F7BF |
:10A03000F701608171812CAD3DAD820F931F0E94AD |
:10A04000F42AD7018D939C9397FD1FC09595879512 |
:10A05000959587959DAF8CAFEEA9FFA98E179F07A9 |
:10A060000CF471CF28AD39AD4CAD5DAD241735077B |
:10A070000CF06BCF3DAF2CAF68CFD6011C92E6C57C |
:10A08000615C7F4F8F4F9F4F7BCF0396DFCFCF9683 |
:10A09000A11DB11DC6CF615C7F4F8F4F9F4FA4CFD5 |
:10A0A000615C7F4F8F4F9F4F84CFA0901B09B09072 |
:10A0B0001C0980910705815008F05BCB88E18093F3 |
:10A0C0000705809174089927880F991F880F991F99 |
:10A0D0007C010027F7FC0095102F6E897F89888D01 |
:10A0E000998DA80197010E94475E3093A3072093A2 |
:10A0F000A2076CA17DA18EA19FA1A80197010E943A |
:10A10000475E3093A5072093A40780910A09909198 |
:10A110000B0997FD67C295958795959587959093BF |
:10A12000A7078093A607809126099091270997FD9C |
:10A1300057C295958795959587959093A907809394 |
:10A14000A807B092AB07A092AA0720915B043091B8 |
:10A150005C043093AD072093AC078091E6079091A3 |
:10A16000E7079093AF078093AE07D092B307C092F2 |
:10A17000B20780912603909127039093B5078093AF |
:10A18000B4078091220990912309A0912409B091EC |
:10A1900025092091850330918603409187035091D2 |
:10A1A0008803BC01CD010E94475E3093B90720931C |
:10A1B000B8078091660499279093B7078093B607F4 |
:10A1C0008091FB0699279093C9078093C8078091D7 |
:10A1D000ED039091EE039093CB078093CA07809193 |
:10A1E0008C09992787FD90959093D9078093D8077C |
:10A1F00080918E0999279093DD078093DC078091E9 |
:10A20000390590913A059093DF078093DE0780919E |
:10A210003705909138059093E1078093E007ABCA2A |
:10A22000C801AA2797FDA095BA2F46CD8AAD9BAD50 |
:10A230008135910524F0A0E5B0E0BBAFAAAFEAAD4F |
:10A24000FBADE05BFF4F0CF004CD20EB3FEF3BAFED |
:10A250002AAFFFCC4FEF083314070CF0F6CA08E31F |
:10A260001FEFEFCA38E383163FEF93060CF0DFCA07 |
:10A27000F8E38F2EFFEF9F2ED6CA1C821B82C7CA1F |
:10A2800022243324A7CA5092CF084092CE088ECB06 |
:10A2900090931C0980931B09B5CBD092C008C09243 |
:10A2A000BF089ACBC801AA2797FDA095BA2FA1CDC8 |
:10A2B0002093820430938304409384045093850454 |
:10A2C000E0C8209199038091890390918A03820FBD |
:10A2D000911D20916D083327829FA001839F500D0F |
:10A2E000929F500D1124CA01449790935A04809371 |
:10A2F000590481E080937204BDCBD0925804C0927F |
:10A30000570470935604609355040C947A49309521 |
:10A3100021953F4F37FFC9CD2F5F3F4F359527958B |
:10A3200049815A81240F351F442737FD4095542F0A |
:10A330000E94D35D97FFC7CD615C7F4F8F4F9F4FCA |
:10A34000C2CD03966AC861507E4F8F4F9F4F51C850 |
:10A35000222733272A193B093EC88FE390E0A0E06B |
:10A36000B0E0E80EF91E0A1F1B1FE4CA215C3F4F34 |
:10A370004F4F5F4FBFCA215C3F4F4F4F5F4F8DCA5A |
:10A38000309521953F4F37FFF9CC2F5F3F4F3595E3 |
:10A39000279549815A81240F351F442737FD409561 |
:10A3A000542F0E94D35D97FFF7CC615C7F4F8F4F96 |
:10A3B0009F4FF2CC81E08093720488EC59CB80915E |
:10A3C0003A04826080933A040C948E3F4D5F5F4F55 |
:10A3D0000C94A13D4D5F5F4F0C94573D10925F046C |
:10A3E00010925E040C94263E019620CC8091740855 |
:10A3F000E82EFF24002711276E897F89888D998D8B |
:10A40000A80197010E94475E39014A0180910A091B |
:10A4100090910B09AA2797FDA095BA2F681A790A7F |
:10A420008A0A9B0A6CA17DA18EA19FA1A801970118 |
:10A430000E94475E59016A0180912609909127097F |
:10A44000AA2797FDA095BA2FA81AB90ACA0ADB0A4B |
:10A45000D401C30197FC44C23C014D0154E09594E2 |
:10A460008794779467945A95D1F7D601C501D7FCA4 |
:10A4700055C25C016D0144E0D594C794B794A7948C |
:10A480004A95D1F780913F04909140048134910521 |
:10A490000CF405C1C401B30123E030E040E050E01A |
:10A4A0000E94475E39014A01C601B50123E030E050 |
:10A4B00040E050E00E94475E59016A0180916308C4 |
:10A4C000E82FFF27EE0FFF1FE25DF74F808191819C |
:10A4D0000190F081E02DF7FD1DC27A97A4F0C40130 |
:10A4E000B30123E030E040E050E00E94475E3901D4 |
:10A4F0004A01C601B50123E030E040E050E00E948F |
:10A50000475E59016A0181E2681671048104910471 |
:10A510002CF030E2632E712C812C912C90EE691678 |
:10A520009FEF79069FEF89069FEF990644F420EE8E |
:10A53000622E2FEF722E2FEF822E2FEF922EA1E29E |
:10A54000AA16B104C104D1042CF090E2A92EB12CBA |
:10A55000C12CD12CB0EEAB16BFEFBB06BFEFCB06C4 |
:10A56000BFEFDB0614F00C94764780EEA82E8FEF39 |
:10A57000B82E8FEFC82E8FEFD82E0C94764770939D |
:10A580000605609305055A8349831DCB4EEF683E4F |
:10A5900074070CF0D6CA68EE7EEFD3CA109203059A |
:10A5A000ED2DFF27EE0FFF1FE25DF74F80819181B8 |
:10A5B0008C3491058CF0809104058F5F893C08F400 |
:10A5C00045C110925D0488EC8093040510923C0410 |
:10A5D00010923B040C94213D109204050C94213DF3 |
:10A5E0000396A7CD039697CD909581959F4F0C9498 |
:10A5F000604803960C94644803960C94523E9095E0 |
:10A6000081959F4F0C944E3E81509E4FAF4FBF4F50 |
:10A610000C946D4A81509E4FAF4FBF4F0C94824AAD |
:10A620005C01B094A194B108B394BDAEACAE0C94EF |
:10A630007A4A4F9617C8882799278A199B090C943C |
:10A64000E84A695F7F4F0C949B4A709561957F4FF4 |
:10A650000C948E4A84EF91E09093A6038093A50317 |
:10A6600082C8F095E195FF4F0C9432470894210879 |
:10A6700031083092A6032092A50375C861507E4F21 |
:10A680008F4F9F4F0C94F2468CAD9DAD9095819568 |
:10A690009F4F681779070CF04DC8BC014BC88091DB |
:10A6A0003D0490913E04813491050CF407CFF2CE25 |
:10A6B00080911C0390911D03895E934008F4E9C0CA |
:10A6C00087B58E3F08F0E5C087B5843F08F01CC20F |
:10A6D000909108049A50909308048091F107891B87 |
:10A6E00087BD8CE291E09093F2038093F1038AEFAF |
:10A6F000BFC9A901B90153CA8093030551CF88ECA2 |
:10A7000090E09093F2038093F103C601AA2797FD8E |
:10A71000A095BA2FBC01CD012B8D3C8D4D8D5E8D4A |
:10A720000E94D35D3B014C010E94475E3093770449 |
:10A7300020937604109208050C94084B8081918137 |
:10A74000855B9F4F0CF0F2C0809102058F5F809374 |
:10A750000205893C10F40C9485402C3008F0DDC1D2 |
:10A760002998A4E0B0E08FEF082E0E946F5E10924F |
:10A770005D041092020510923C0410923B040E946A |
:10A780004636A4E0B0E08091C0049091C10497FDEA |
:10A79000E3C1892F990F990B082E0E946F5EA5E0E7 |
:10A7A000B0E08091C0049091C104082E0E946F5EB9 |
:10A7B000A6E0B0E08091BE049091BF0497FDC9C1AE |
:10A7C000892F990F990B082E0E946F5EA7E0B0E0C9 |
:10A7D0008091BE049091BF04082E0E946F5E08E035 |
:10A7E00010E08091B8049091B904A091BA04B0919E |
:10A7F000BB04BC01CD010E943C5DDC01CB019C018E |
:10A8000097FDB3C1832F992787FD9A95D801082E0C |
:10A810000E946F5E09E010E08091B8049091B90445 |
:10A82000A091BA04B091BB04BC01CD010E943C5D73 |
:10A83000DC01CB01D801082E0E946F5E0E940C043F |
:10A840000E940A2B309162080C9485408093040585 |
:10A850000C94213D0196A11DB11D0C941B4701963E |
:10A86000A11DB11D0C940F4781E080930805109243 |
:10A87000EC041092ED041092EE041092EF0410928A |
:10A8800082041092830410928404109285040C9424 |
:10A890008E3F80911C0390911D038436910540F5F5 |
:10A8A00087B5823028F187B58B3008F434C1909198 |
:10A8B0000804965F10CF215F3F4F56C9615E7F4FFE |
:10A8C0008F4F9F4F30C92FE730E040E050E0C20E7D |
:10A8D000D31EE41EF51E14C9019604C90396F2C8DE |
:10A8E0000F96A11DB11DB8CD095F1F4F0C94544B9D |
:10A8F00020915B0430915C042451304030935A0421 |
:10A90000209359042C5E3F4F1092720481E0809393 |
:10A91000C203B4C8F095E195FF4FDFCD0F96A11D9E |
:10A92000B11DA7CD809302050C948540409302058C |
:10A930000C948540B0921605A092150520918C09C3 |
:10A940002F8F0C94094410921A050C9448461092CB |
:10A9500017050C946F4420930D0530930E0540931A |
:10A960000F0550931005109219050C94D6452092AE |
:10A97000090530920A0540920B0550920C05109281 |
:10A9800018050C94E0440E940C044DE560E678E064 |
:10A990000E94B4038091680880FF10C080911C035E |
:10A9A00090911D03875B934038F480911C03909134 |
:10A9B0001D038E5E924010F40E94BB180E94463622 |
:10A9C0003DCF7093560460935504D0925804C092C2 |
:10A9D0005704CB0177FDCEC0BC0175956795C601C4 |
:10A9E000D7FCC6C06C01D594C7940C942743109132 |
:10A9F00061080C94E83F299A0C94BC3F60920905C9 |
:10AA000070920A0580920B0590920C051092160523 |
:10AA10001092150588EE282E83E0382E3092A6037A |
:10AA20002092A5030C94E04420930D0530930E056D |
:10AA300040930F05509310051092160510921505BE |
:10AA4000E8EE2E2EE3E03E2E3092A6032092A503E0 |
:10AA50000C94484681E0809317050C946F44615034 |
:10AA60007F4F8F4F9F4F0C94BC4261507F4F8F4F51 |
:10AA70009F4F0C94A64281509F4FAF4FBF4F0C94F5 |
:10AA80007E4281509F4FAF4FBF4F0C946442815024 |
:10AA90009F4FAF4FBF4F0C94F94281509F4FAF4F24 |
:10AAA000BF4F0C94EC4220930D0530930E0540935C |
:10AAB0000F055093100581E0809319050C94D6453D |
:10AAC0002092090530920A0540920B0550920C0520 |
:10AAD00081E0809318050C94E044B095A095909582 |
:10AAE00081959F4FAF4FBF4F0C943945B095A095BE |
:10AAF000909581959F4FAF4FBF4F0C94D74381E006 |
:10AB000080931A050C9448468EEFEACDF095E195B6 |
:10AB1000FF4F0C94674081E0E3CD299A22CE209329 |
:10AB20000D0530930E0540930F05509310050C94BE |
:10AB3000BE4520930D0530930E0540930F055093AD |
:10AB400010050C943046295F3F4F4F4F5F4F0C94D8 |
:10AB5000134681509F4F34CE81509F4F1ACE815063 |
:10AB60009F4FAF4FBF4F0C943C4621503F4F4ACEB2 |
:10AB7000019638CF019630CF81509F4FAF4FBF4FD6 |
:10AB80000C94674481509F4FAF4FBF4F0C94CA4500 |
:10AB9000295F3F4F4F4F5F4F0C94A14581509E4F0F |
:10ABA000AF4FBF4F0C948C45F095E195FF4F0C943F |
:10ABB0001F43B095A095909581959F4FAF4FBF4F84 |
:10ABC0000C942644295F3F4F4F4F5F4F0C944544F0 |
:10ABD00021503E4F4F4F5F4F0C942C4481509F4F5C |
:10ABE000AF4FBF4F0C94D444F095E195FF4F0C94B8 |
:10ABF000E43FB095A095909581959F4FAF4FBF4F83 |
:10AC00000C948845B095A095909581959F4FAF4F36 |
:10AC1000BF4F0C948D44295F3F4F4F4F5F4F0C94B3 |
:10AC2000AC4421503E4F4F4F5F4F0C949344215002 |
:10AC30003E4F4F4F5F4F0C94FA45B095A0959095BD |
:10AC400081959F4FAF4FBF4F0C94F4453A94E2E08B |
:10AC5000F0E0EE0EFF1E0C5F1F4F0894C11CD11CCC |
:10AC600037FE77C9EF960FB6F894DEBF0FBECDBFA3 |
:10AC7000DF91CF911F910F91FF90EF90DF90CF90D8 |
:10AC8000BF90AF909F908F907F906F905F904F900C |
:10AC90003F902F90089580912F0590913005A091BD |
:10ACA0003105B09132058093270590932805A09334 |
:10ACB0002905B0932A0580912B0590912C05A09130 |
:10ACC0002D05B0912E058093230590932405A09324 |
:10ACD0002505B0932605089510923A05109239057E |
:10ACE0001092380510923705089584B1806A84B9AE |
:10ACF0003D9A82E58CBD1DBC459A81E080932C096C |
:10AD00008AEA8093300983E8809331098AE080934E |
:10AD100032091092340910923309109236091092B8 |
:10AD2000350910928E0910925209109253098AE443 |
:10AD30008093540983E08093550986E080935609F7 |
:10AD40000895EF92FF920F931F93F89480917408E7 |
:10AD50009927880F991F880F991F7C010027F7FCFE |
:10AD60000095102F8091B2049091B304A091B40487 |
:10AD7000B091B504BC01CD01A80197010E94475EC6 |
:10AD800030933409209333098091AA049091AB0445 |
:10AD9000A091AC04B091AD04BC01CD01A801970114 |
:10ADA0000E94475E3093360920933509209122098D |
:10ADB000309123094091240950912509DA01C901F4 |
:10ADC00073E0880F991FAA1FBB1F7A95D1F7820FD6 |
:10ADD000931FA41FB51F820F931FA41FB51F20919F |
:10ADE0008503309186034091870350918803BC010D |
:10ADF000CD010E94475E30933C0920933B09E091CE |
:10AE0000BC04F091BD048091E4089091E508BF0175 |
:10AE10000E94125ECB019B01220F331F220F331FB2 |
:10AE2000280F391F280F391F37FDF2C03595279598 |
:10AE300035952795309338092093370980911E095D |
:10AE400090911F09BF010E94125E9B01220F331FC8 |
:10AE5000220F331F260F371F260F371F37FDD5C090 |
:10AE6000359527953595279530933A0920933909DB |
:10AE70001092BD041092BC041092E5081092E408F0 |
:10AE800010921F0910921E098091320999278C3067 |
:10AE9000910509F48AC08D3091050CF06AC08A30A2 |
:10AEA000910509F433C10B9709F4B5C078948091EA |
:10AEB0005209882309F4A0C02091580930915909FA |
:10AEC000C90181509E4F8F5F9340C8F440915A0949 |
:10AED00050915B09CA0181509E4F8F5F934078F477 |
:10AEE0008091680885FF0BC030933A05209339059F |
:10AEF00050933805409337058AEF80933C05809145 |
:10AF00005E0990915F0921E0893692070CF0E8C054 |
:10AF10009C019093790480937804809176049091B9 |
:10AF20007704281B390BC901845E9D4F68E671E0E8 |
:10AF30000E94125E845B9040909375048093740429 |
:10AF400020916209309163098091F1039091F2039D |
:10AF50008217930740F48091FB06882321F43093F5 |
:10AF6000F2032093F10380915709873609F055C108 |
:10AF7000BCC08D30910509F404C10E9709F096CF3D |
:10AF80008091530980934309809154098093440927 |
:10AF9000809155098093450980915609809346090F |
:10AFA000809101018093470981CF8091FB06863013 |
:10AFB00018F01092FB0685E08093430980915B04B2 |
:10AFC00090915C0490934609809345098091A9086B |
:10AFD0008093440980919F08809347098091A0083D |
:10AFE000809348098091A1088093490978948091C1 |
:10AFF0005209882309F060CF10923A051092390562 |
:10B00000109238051092370508C12D5F3F4F28CFA9 |
:10B010002D5F3F4F0BCF80916208E82FFF27EE0F87 |
:10B02000FF1FE25DF74F0190F081E02DE038F10560 |
:10B030000CF0D8C02FEFE138F20714F4E1E8FFEF8D |
:10B04000E093430980916308E82FFF27EE0FFF1F6D |
:10B05000E25DF74F0190F081E02DE038F1050CF44E |
:10B06000D4C0EFE7F0E0E093440980916108E82F55 |
:10B07000FF27EE0FFF1FE25DF74F0190F081E02DFB |
:10B08000E038F1050CF4B9C0EFE7F0E0E0934509D2 |
:10B0900080916008E82FFF27EE0FFF1FE25DF74F5A |
:10B0A0000190F081E02DE038F1050CF49EC0EFE74F |
:10B0B000F0E0E093460980916D0480934709809108 |
:10B0C0006B048093480980916904809349098091B9 |
:10B0D000670480934A098091660480934B09E6CE09 |
:10B0E000209178043091790418CF8091640980937D |
:10B0F0008B098091650980938D0980916609809301 |
:10B100008C098091670980938E0987C080914E04D5 |
:10B110008093430980914D048093440980914C04AD |
:10B120008093450980914B048093460980914A049D |
:10B13000809347098091490480934809809148048D |
:10B14000809349098091470480934A0980913A0489 |
:10B1500080934B0980913A04837F80933A048091D5 |
:10B1600026039091270380934C098091790880935E |
:10B170004D09A2E0B0E00E94625E802D80934E09EE |
:10B1800095CE80919A088093430980919B08809383 |
:10B19000440980919C088093450980919D08809383 |
:10B1A000460980919E08809347098091A208809368 |
:10B1B00048098091A308809349098091A40880934D |
:10B1C0004A098091A70880934B098091A508809334 |
:10B1D0004C098091A60880934D098091A80880931E |
:10B1E0004E0964CEEFE7F0E02BCF8FEFE138F807A0 |
:10B1F0000CF05FCFE1E8FFEF5CCF6FEFE138F607CF |
:10B200000CF044CFE1E8FFEF41CF4FEFE138F40716 |
:10B210000CF029CFE1E8FFEF26CF1F910F91FF90AF |
:10B22000EF90089580912C09882309F43BC045983C |
:10B2300080E399E090932E0980932D0980913B053E |
:10B24000E82FFF27ED53FC4F982F9F5F808180935D |
:10B250003209963008F027C090933B0510922C09D4 |
:10B260000E94A15681E080932F0900000000000099 |
:10B2700000000000000000000000000000000000CE |
:10B2800000000000000000000000000000000000BE |
:10B290000000000000000000000080913009809351 |
:10B2A0004F098EBD089510923B05D8CF20912C09EF |
:10B2B000222309F045C00DB407FE42C084E080930C |
:10B2C000F003459A3EB580913D059927813091055F |
:10B2D00009F437C0823091050CF451C0029709F48B |
:10B2E00039C020912F09203208F030C04598000065 |
:10B2F000000000000000000000000000000000004E |
:10B30000000000000000000000000000000000003D |
:10B310000000000000000000000000000000E091BC |
:10B320002D09F0912E09E20FF11D80818EBD8091D3 |
:10B330004F099081890F80934F092F5F20932F0928 |
:10B340000895353551F120933D05CBCF81E08093B1 |
:10B350002C09F3CF80915109E82FFF27EF58F64FC2 |
:10B3600030838F5F809351098A3100F180913E05CF |
:10B37000381711F12093520910923D05B2CF892B55 |
:10B3800009F0AFCF2093510930933E05313809F0D1 |
:10B39000A8CF81E080933D05A4CF80913E05830F27 |
:10B3A00080933E0582E080933D059BCF80913E05D2 |
:10B3B000830F80933E0595CF8AE1E1E7F9E0A7E5A9 |
:10B3C000B9E001900D928A95E1F781E080935209EE |
:10B3D00010923D0586CF87B18C6087B9429843981B |
:10B3E0001092400580E88093CA0310923F05809335 |
:10B3F000C90308958091450581508F3F19F08093CE |
:10B400004505089584E080934505909197089B3FFA |
:10B4100060F49B3FA0F08091E6088A3080F4809130 |
:10B420009608882354F0429A11C08091E608873E1E |
:10B4300080F3809196088823B4F3429807C08091E6 |
:10B44000400581508F3FB9F1809340059091990854 |
:10B450009B3F50F080911909873E30F08091980809 |
:10B46000882364F0439808959B3F50F08091190918 |
:10B470008A3030F4809198088823A4F3439A089581 |
:10B4800080913F0581508F3F19F080933F050895CB |
:10B4900080911909815080933F058091C9038130C3 |
:10B4A000F1F0982F96959093C9038091980889237D |
:10B4B000C9F2439A08958091E6088150809340052F |
:10B4C0008091CA03813069F0982F96959093CA03B2 |
:10B4D00080919608892309F4B0CF429AB7CF90E8BB |
:10B4E000E2CF90E8F3CF8091C9008F778093C900B5 |
:10B4F0008091C9008F7B8093C9008091C9008F7DA6 |
:10B500008093C9005A9A52981092CD0084E190E03D |
:10B510008093CC008091C80082608093C80080E155 |
:10B520008093C9008091CA008F778093CA00809170 |
:10B53000CA008F7B8093CA008091CA008F7D809360 |
:10B54000CA008091CA008F7E8093CA008091CA0091 |
:10B55000877F8093CA008091C9008B7F8093C90048 |
:10B560008091CA0084608093CA008091CA00826082 |
:10B570008093CA008091C80087FF0CC08091CE00E4 |
:10B580008091C800882334F48091CE008091C80057 |
:10B590008823A4F38091C90080688093C90008952E |
:10B5A0001F93CF93DF9380E197E20E948614EC0112 |
:10B5B00010E08091C9008F778093C9008091C90005 |
:10B5C0008F7E8093C9005A9886EE96E09F938F9362 |
:10B5D0001F930E940E110F900F900F90CE010E94AA |
:10B5E0008F14882309F066C04A9BF8CF8AE590E063 |
:10B5F0000E948614EC018CE197E09F938F931F9239 |
:10B600000E940E11529A0F900F900F90CE010E943F |
:10B610008F148823D9F383E690E05A9A019797FF15 |
:10B62000FCCF8FE891E05A98019797FFFCCF89E013 |
:10B6300090E05A9A019797FFFCCF89E090E05A98E2 |
:10B64000019797FFFCCF8FE891E05A9A019797FFF7 |
:10B65000FCCF8FE891E05A98019797FFFCCF89E0E3 |
:10B6600090E05A9A019797FFFCCF89E090E05A98B2 |
:10B67000019797FFFCCF8FE891E05A9A019797FFC7 |
:10B68000FCCF8FE891E05A98019797FFFCCF89E0B3 |
:10B6900090E05A9A019797FFFCCF89E090E05A9882 |
:10B6A000019797FFFCCF8FE891E05A9A019797FF97 |
:10B6B000FCCF0AC082E297E09F938F931F930E9472 |
:10B6C0000E110F900F900F9052985A980E94735A33 |
:10B6D000DF91CF911F9108951F920F920FB60F9295 |
:10B6E0001124EF92FF920F931F932F933F934F9349 |
:10B6F0005F936F937F938F939F93AF93BF93CF93FA |
:10B70000DF93EF93FF930091CE008091CB03909154 |
:10B71000CC03019709F45EC080914E0590914F05CE |
:10B720000E948F14482F5527609146057091470558 |
:10B7300061157105E9F16130710509F4EAC0623003 |
:10B74000710509F4EDC06330710509F45CC081E056 |
:10B7500090E09093CC038093CB0310924905109214 |
:10B76000480510924D0510924C0580914805909126 |
:10B7700049054097A0F080914C0590914D05892B8B |
:10B7800011F410928303109249051092480510920B |
:10B790004D0510924C05109247051092460587E022 |
:10B7A00090E00E94861490934F0580934E05FDC053 |
:10B7B000452BD9F281E090E09093470580934605B0 |
:10B7C0008091480590914905019690934905809391 |
:10B7D0004805CBCF1092CC031092CB0387E090E0CA |
:10B7E0000E94861490934F0580934E051092490550 |
:10B7F00010924805109247051092460510924B058D |
:10B8000010924A05D2C0452B09F0A1CF82E090E00A |
:10B81000909347058093460580914805909149058E |
:10B820000196909349058093480580914A0590912F |
:10B830004B05FC01F695E795F695E795EF70F070EE |
:10B840003196982F8827202F3327822B932B9370A4 |
:10B85000805092400E94125EEB30F10508F085CFD7 |
:10B860007F01EE0EFF1EF701E25DF74F80819181AF |
:10B870009B01281B390BC90137FD90C0069754F472 |
:10B8800080916604883C08F087C080916604865FDA |
:10B8900080936604F701E25DF74F808191819C01FE |
:10B8A000220F331F280F391F260F371F37FD7AC08D |
:10B8B000E901D595C795D595C795CB0101968C170C |
:10B8C0009D070CF05CC0219780916604843B08F4CE |
:10B8D00050C087010C5B174FF701E25DF74F808185 |
:10B8E0009181FE01E81BF90BCF0163E070E00E943B |
:10B8F000125ECB01880F991F860F971FF801918365 |
:10B9000080832EE238E0E20EF31EF701D183C0837C |
:10B910002CCF4115510509F012CF82E090E04CCFB9 |
:10B920004115510509F00FCF802F992790934B05B2 |
:10B9300080934A0520914805309149052230310510 |
:10B9400069F083E090E090934705809346052F5F70 |
:10B950003F4F309349052093480507CF80914A0512 |
:10B9600087FF15C081E090E090934D0580934C05D2 |
:10B97000E8CFF701EC5BF74F11821082C2CF615024 |
:10B980007040C617D7070CF09FCF21969DCF5093DC |
:10B990004D0540934C05D5CF88EC7ACF9095819595 |
:10B9A0009F4F6CCF2D5F3F4F83CFFF91EF91DF9182 |
:10B9B000CF91BF91AF919F918F917F916F915F9147 |
:10B9C0004F913F912F911F910F91FF90EF900F900A |
:10B9D0000FBE0F901F901895FC014150504030F061 |
:10B9E00001900616D1F73197CF010895882799273E |
:10B9F00008955058192EA6D001D08CC0BA176207EE |
:10BA0000730784079507B1F188F40EF410940B2E98 |
:10BA1000BA2FA02D062E622F202D072E732F302D2A |
:10BA2000082E842F402D092E952F502DFF275523AA |
:10BA3000B9F0591B49F0573E98F046953795279530 |
:10BA4000A795F0405395C9F776F0BA0F621F731FA0 |
:10BA5000841F30F4879577956795B795F040939557 |
:10BA600017FA0F2E0895BF1BBB27BA0B620B730B7F |
:10BA7000840BF6CFDEF692C097FB70D09F3738F07C |
:10BA8000FEE9F91B982F872F762F6B2F05C083C0F7 |
:10BA90009695879577956795F150D0F73EF49095F8 |
:10BAA0008095709561957F4F8F4F9F4F0895E894D3 |
:10BAB00003C097FB0EF4F3DFB62F672F782F892F83 |
:10BAC0009EE9002427C00ED05EF004C00BD026F003 |
:10BAD00001C008D019F020F48FEF089580E0089598 |
:10BAE00081E0089597FB092E052600F868942DD073 |
:10BAF000E89407FC07C0621773078407950721F0D5 |
:10BB000008F400940794989408959A95BB0F661FC3 |
:10BB1000771F881F11249923A1F08823B2F79F3F34 |
:10BB200059F0BB0F48F421F4002011F460FF04C069 |
:10BB30006F5F7F4F8F4F9F4F881F9795879597F91E |
:10BB4000089529C0052E092607FA440F551F5F3FA7 |
:10BB500079F0AA27A51708F051E04795880F991F9B |
:10BB60009F3F31F0BB27B91708F091E08795089502 |
:10BB70009F919F91112414C097FB880F991F9F3F9D |
:10BB800031F0BB27B91708F091E0879508959F9190 |
:10BB90009F91112405C06627772788279927089544 |
:10BBA0009FEF80EC0895629FD001739FF001829F08 |
:10BBB000E00DF11D649FE00DF11D929FF00D839F3C |
:10BBC000F00D749FF00D659FF00D9927729FB00DD9 |
:10BBD000E11DF91F639FB00DE11DF91FBD01CF01EC |
:10BBE00011240895991B79E004C0991F961708F055 |
:10BBF000961B881F7A95C9F780950895AA1BBB1BD1 |
:10BC000051E107C0AA1FBB1FA617B70710F0A61B5C |
:10BC1000B70B881F991F5A95A9F780959095BC017D |
:10BC2000CD01089597FB092E07260AD077FD04D091 |
:10BC3000E5DF06D000201AF4709561957F4F0895D6 |
:10BC4000F6F7909581959F4F0895A1E21A2EAA1BB1 |
:10BC5000BB1BFD010DC0AA1FBB1FEE1FFF1FA217BC |
:10BC6000B307E407F50720F0A21BB30BE40BF50BB9 |
:10BC7000661F771F881F991F1A9469F76095709542 |
:10BC8000809590959B01AC01BD01CF01089597FB74 |
:10BC9000092E05260ED057FD04D0D7DF0AD0001C90 |
:10BCA00038F450954095309521953F4F4F4F5F4F59 |
:10BCB0000895F6F790958095709561957F4F8F4F19 |
:10BCC0009F4F0895F999FECFB2BDA1BDF89A119684 |
:10BCD00000B40895F7DF01921A94E1F70895F999F5 |
:10BCE000FECFB2BDA1BD00BC11960FB6F894FA9A72 |
:10BCF000F99A0FBE08950190F2DF1A94E1F70895C2 |
:10BD0000010A0151756164726F0000416E676C65D4 |
:10BD10004E69636B20202020202020416E676C65D7 |
:10BD2000526F6C6C202020202020204163634E69DC |
:10BD3000636B202020202020202020416363526F4D |
:10BD40006C6C2020202020202020204779726F4713 |
:10BD500069657220202020202020204869676874AF |
:10BD60002056616C756520202020204163635A2095 |
:10BD70002020202020202020202020476173202008 |
:10BD80002020202020202020202020436F6D706163 |
:10BD900073732056616C7565202020566F6C74613A |
:10BDA0006765202020202020202020456D706661BE |
:10BDB0006E672020202020202020204779726F20CD |
:10BDC0004B6F6D70617373202020204D6F746F7204 |
:10BDD0002046726F6E7420202020204D6F746F7289 |
:10BDE00020526561722020202020204D6F746F72D8 |
:10BDF000204C6566742020202020204D6F746F72C7 |
:10BE000020526967687420202020202020202020D4 |
:10BE10002020202020202020202020202020202022 |
:10BE20002020202020202020202020202020202012 |
:10BE300020202020202020202020204D4B334D6129 |
:10BE4000672043616C537461746520536572766F2B |
:10BE500020202020202020202020202020202020E2 |
:10BE600020202020202020202020202020202020D2 |
:10BE700020202020202020202020202020202020C2 |
:10BE800020202020202020202020202020202020B2 |
:10BE900020202020202020202020202020202020A2 |
:10BEA0002020202020202020202020202020202092 |
:10BEB00020202020202020202020204B616C6D613C |
:10BEC0006E5F4D61784472696674202020202020C6 |
:10BED00020202020202020202020204E6176692054 |
:10BEE00053657269616C20446174614750535F4EC1 |
:10BEF00069636B20202020202020204750535F5270 |
:10BF00006F6C6C2020202020202020C8000164FFBE |
:10BF100001FFFF01FC01FC0101737373FF03007D4E |
:10BF20000000C409C40964000D48616C6C6F20579F |
:10BF3000656C7400000000000000000000000000BC |
:10BF400000000000000000000000000000000000F1 |
:10BF500000000000000000000000000000000000E1 |
:10BF600000000000000000000000000000000000D1 |
:10BF700000000000000000000001020304050607A5 |
:10BF800008090A01040B050000ECFF6440415A4611 |
:10BF9000640A02969608403A10FB30380190D003AC |
:10BFA0000090D00300F401640053706F72740000BD |
:10BFB0004E6F726D616C0000426567696E6E6572EE |
:0EBFC0000000640A0B0D0B0C0E0101010000C5 |
:00000001FF |
/tags/V0.74d/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 |
/tags/V0.74d/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. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
/tags/V0.74d/Settings.h |
---|
--- V0.74d/Spectrum.c (nonexistent) |
+++ V0.74d/Spectrum.c (revision 1236) |
@@ -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); |
+ } |
+} |
+ |
+ |
/tags/V0.74d/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 |
/tags/V0.74d/_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 |
/tags/V0.74d/analog.c |
---|
0,0 → 1,459 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_ax, Aktuell_ay,Aktuell_az, UBat = 100; |
volatile int AdWertNickFilter = 0, AdWertRollFilter = 0, AdWertGierFilter = 0; |
volatile int HiResNick = 2500, HiResRoll = 2500; |
volatile int AdWertNick = 0, AdWertRoll = 0, AdWertGier = 0; |
volatile int AdWertAccRoll = 0,AdWertAccNick = 0,AdWertAccHoch = 0; |
volatile char messanzahl_AccHoch = 0; |
volatile long Luftdruck = 32000; |
volatile int StartLuftdruck; |
volatile unsigned int MessLuftdruck = 1023; |
unsigned char DruckOffsetSetting; |
signed char ExpandBaro = 0; |
volatile int HoeheD = 0; |
volatile char messanzahl_Druck; |
volatile int tmpLuftdruck; |
volatile unsigned int ZaehlMessungen = 0; |
unsigned char AnalogOffsetNick = 115,AnalogOffsetRoll = 115,AnalogOffsetGier = 115; |
unsigned char GyroDefektN = 0,GyroDefektR = 0,GyroDefektG = 0; |
volatile unsigned char AdReady = 1; |
//####################################################################################### |
// |
void ADC_Init(void) |
//####################################################################################### |
{ |
ADMUX = 0;//Referenz ist extern |
ANALOG_ON; |
} |
void SucheLuftruckOffset(void) |
{ |
unsigned int off; |
off = eeprom_read_byte(&EEPromArray[EEPROM_ADR_LAST_OFFSET]); |
if(off > 20) off -= 10; |
OCR0A = off; |
ExpandBaro = 0; |
Delay_ms_Mess(100); |
if(MessLuftdruck < 850) off = 0; |
for(; off < 250;off++) |
{ |
OCR0A = off; |
Delay_ms_Mess(50); |
printf("."); |
if(MessLuftdruck < 850) break; |
} |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_LAST_OFFSET], off); |
DruckOffsetSetting = off; |
Delay_ms_Mess(300); |
} |
void SucheGyroOffset(void) |
{ |
unsigned char i, ready = 0; |
int timeout; |
GyroDefektN = 0; GyroDefektR = 0; GyroDefektG = 0; |
timeout = SetDelay(2000); |
for(i=140; i != 0; i--) |
{ |
if(ready == 3 && i > 10) i = 9; |
ready = 0; |
if(AdWertNick < 1020) AnalogOffsetNick--; else if(AdWertNick > 1030) AnalogOffsetNick++; else ready++; |
if(AdWertRoll < 1020) AnalogOffsetRoll--; else if(AdWertRoll > 1030) AnalogOffsetRoll++; else ready++; |
if(AdWertGier < 1020) AnalogOffsetGier--; else if(AdWertGier > 1030) AnalogOffsetGier++; else ready++; |
twi_state = 8; |
i2c_start(); |
if(AnalogOffsetNick < 10) { GyroDefektN = 1; AnalogOffsetNick = 10;}; if(AnalogOffsetNick > 245) { GyroDefektN = 1; AnalogOffsetNick = 245;}; |
if(AnalogOffsetRoll < 10) { GyroDefektR = 1; AnalogOffsetRoll = 10;}; if(AnalogOffsetRoll > 245) { GyroDefektR = 1; AnalogOffsetRoll = 245;}; |
if(AnalogOffsetGier < 10) { GyroDefektG = 1; AnalogOffsetGier = 10;}; if(AnalogOffsetGier > 245) { GyroDefektG = 1; AnalogOffsetGier = 245;}; |
while(twi_state) if(CheckDelay(timeout)) {printf("\n\r DAC or I2C ERROR! Check I2C, 3Vref, DAC and BL-Ctrl"); break;} |
messanzahl_Druck = 0; |
ANALOG_ON; |
while(messanzahl_Druck == 0); |
if(i<10) Delay_ms_Mess(10); |
} |
Delay_ms_Mess(70); |
} |
/* |
0 n |
1 r |
2 g |
3 y |
4 x |
5 n |
6 r |
7 u |
8 z |
9 L |
10 n |
11 r |
12 g |
13 y |
14 x |
15 n |
16 r |
17 L |
*/ |
//####################################################################################### |
// |
SIGNAL(SIG_ADC) |
//####################################################################################### |
{ |
static unsigned char kanal=0,state = 0; |
static signed int gier1, roll1, nick1, nick_filter, roll_filter; |
static signed int accy, accx; |
switch(state++) |
{ |
case 0: |
nick1 = ADC; |
kanal = AD_ROLL; |
break; |
case 1: |
roll1 = ADC; |
kanal = AD_GIER; |
break; |
case 2: |
gier1 = ADC; |
kanal = AD_ACC_Y; |
break; |
case 3: |
Aktuell_ay = NeutralAccY - ADC; |
accy = Aktuell_ay; |
kanal = AD_ACC_X; |
break; |
case 4: |
Aktuell_ax = ADC - NeutralAccX; |
accx = Aktuell_ax; |
kanal = AD_NICK; |
break; |
case 5: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 6: |
roll1 += ADC; |
kanal = AD_UBAT; |
break; |
case 7: |
UBat = (3 * UBat + ADC / 3) / 4; |
kanal = AD_ACC_Z; |
break; |
case 8: |
AdWertAccHoch = (signed int) ADC - NeutralAccZ; |
if(AdWertAccHoch > 1) |
{ |
if(NeutralAccZ < 750) |
{ |
NeutralAccZ += 0.02; |
if(modell_fliegt < 500) NeutralAccZ += 0.1; |
} |
} |
else if(AdWertAccHoch < -1) |
{ |
if(NeutralAccZ > 550) |
{ |
NeutralAccZ-= 0.02; |
if(modell_fliegt < 500) NeutralAccZ -= 0.1; |
} |
} |
messanzahl_AccHoch = 1; |
Aktuell_az = ADC; |
Mess_Integral_Hoch += AdWertAccHoch; // Integrieren |
Mess_Integral_Hoch -= Mess_Integral_Hoch / 1024; // dämfen |
kanal = AD_DRUCK; |
break; |
// "case 8:" fehlt hier absichtlich |
case 10: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 11: |
roll1 += ADC; |
kanal = AD_GIER; |
break; |
case 12: |
if(PlatinenVersion == 10) AdWertGier = (ADC + gier1 + 1) / 2; |
else |
if(PlatinenVersion == 20) AdWertGier = 2047 - (ADC + gier1); |
else AdWertGier = (ADC + gier1); |
kanal = AD_ACC_Y; |
break; |
case 13: |
Aktuell_ay = NeutralAccY - ADC; |
AdWertAccRoll = (Aktuell_ay + accy); |
kanal = AD_ACC_X; |
break; |
case 14: |
Aktuell_ax = ADC - NeutralAccX; |
AdWertAccNick = (Aktuell_ax + accx); |
kanal = AD_NICK; |
break; |
case 15: |
nick1 += ADC; |
if(PlatinenVersion == 10) nick1 *= 2; else nick1 *= 4; |
AdWertNick = nick1 / 8; |
nick_filter = (nick_filter + nick1) / 2; |
HiResNick = nick_filter - AdNeutralNick; |
AdWertNickFilter = (AdWertNickFilter + HiResNick) / 2; |
kanal = AD_ROLL; |
break; |
case 16: |
roll1 += ADC; |
if(PlatinenVersion == 10) roll1 *= 2; else roll1 *= 4; |
AdWertRoll = roll1 / 8; |
roll_filter = (roll_filter + roll1) / 2; |
HiResRoll = roll_filter - AdNeutralRoll; |
AdWertRollFilter = (AdWertRollFilter + HiResRoll) / 2; |
kanal = AD_DRUCK; |
break; |
case 17: |
state = 0; |
AdReady = 1; |
ZaehlMessungen++; |
// "break" fehlt hier absichtlich |
case 9: |
tmpLuftdruck += ADC; |
if(++messanzahl_Druck >= 5) |
{ |
tmpLuftdruck /= 2; |
MessLuftdruck = ADC; |
messanzahl_Druck = 0; |
HoeheD = (31 * HoeheD + (int) Parameter_Luftdruck_D * (int)(255 * ExpandBaro + StartLuftdruck - tmpLuftdruck - HoehenWert))/32; // D-Anteil = neuerWert - AlterWert |
Luftdruck = (tmpLuftdruck + 7 * Luftdruck + 4) / 8; |
HoehenWert = 255 * ExpandBaro + StartLuftdruck - Luftdruck; |
tmpLuftdruck /= 2; |
} |
kanal = AD_NICK; |
break; |
default: |
kanal = 0; state = 0; kanal = AD_NICK; |
break; |
} |
ADMUX = kanal; |
if(state != 0) ANALOG_ON; |
} |
/* |
//####################################################################################### |
// |
SIGNAL(SIG_ADC) |
//####################################################################################### |
{ |
static unsigned char kanal=0,state = 0; |
static signed int gier1, roll1, nick1; |
static signed long nick_filter, roll_filter; |
static signed int accy, accx; |
switch(state++) |
{ |
case 0: |
nick1 = ADC; |
kanal = AD_ROLL; |
break; |
case 1: |
roll1 = ADC; |
kanal = AD_GIER; |
break; |
case 2: |
gier1 = ADC; |
kanal = AD_ACC_Y; |
break; |
case 3: |
Aktuell_ay = NeutralAccY - ADC; |
accy = Aktuell_ay; |
kanal = AD_NICK; |
break; |
case 4: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 5: |
roll1 += ADC; |
kanal = AD_ACC_Z; |
break; |
case 6: |
AdWertAccHoch = (signed int) ADC - NeutralAccZ; |
if(AdWertAccHoch > 1) |
{ |
if(NeutralAccZ < 750) |
{ |
NeutralAccZ += 0.02; |
if(modell_fliegt < 500) NeutralAccZ += 0.1; |
} |
} |
else if(AdWertAccHoch < -1) |
{ |
if(NeutralAccZ > 550) |
{ |
NeutralAccZ-= 0.02; |
if(modell_fliegt < 500) NeutralAccZ -= 0.1; |
} |
} |
messanzahl_AccHoch = 1; |
Aktuell_az = ADC; |
Mess_Integral_Hoch += AdWertAccHoch; // Integrieren |
Mess_Integral_Hoch -= Mess_Integral_Hoch / 1024; // dämfen |
kanal = AD_NICK; |
break; |
case 7: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 8: |
roll1 += ADC; |
kanal = AD_ACC_X; |
break; |
case 9: |
Aktuell_ax = ADC - NeutralAccX; |
accx = Aktuell_ax; |
kanal = AD_GIER; |
break; |
case 10: |
gier1 += ADC; |
kanal = AD_NICK; |
break; |
case 11: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 12: |
roll1 += ADC; |
kanal = AD_UBAT; |
break; |
case 13: |
UBat = (3 * UBat + ADC / 3) / 4;//(UBat + ((ADC * 39) / 256) + 19) / 2; |
kanal = AD_ACC_Y; |
break; |
case 14: |
Aktuell_ay = NeutralAccY - ADC; |
accy += Aktuell_ay; |
kanal = AD_NICK; |
break; |
case 15: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 16: |
roll1 += ADC; |
kanal = AD_ACC_X; |
break; |
case 17: |
Aktuell_ax = ADC - NeutralAccX; |
accx += Aktuell_ax; |
kanal = AD_NICK; |
break; |
case 18: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 19: |
roll1 += ADC; |
kanal = AD_GIER; |
break; |
case 20: |
gier1 += ADC; |
kanal = AD_ACC_Y; |
break; |
case 21: |
Aktuell_ay = NeutralAccY - ADC; |
accy += Aktuell_ay; |
kanal = AD_NICK; |
break; |
case 22: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 23: |
roll1 += ADC; |
kanal = AD_DRUCK; |
break; |
case 24: |
tmpLuftdruck += ADC; |
if(++messanzahl_Druck >= 5) |
{ |
MessLuftdruck = ADC; |
messanzahl_Druck = 0; |
HoeheD = (7 * HoeheD + (int) Parameter_Luftdruck_D * (int)(255 * ExpandBaro + StartLuftdruck - tmpLuftdruck - HoehenWert)) / 8; // D-Anteil = neuerWert - AlterWert |
Luftdruck = (tmpLuftdruck + 3 * Luftdruck) / 4; |
HoehenWert = 255 * ExpandBaro + StartLuftdruck - Luftdruck; |
tmpLuftdruck = 0; |
} |
kanal = AD_NICK; |
break; |
case 25: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 26: |
roll1 += ADC; |
kanal = AD_ACC_X; |
break; |
case 27: |
Aktuell_ax = ADC - NeutralAccX; |
accx += Aktuell_ax; |
kanal = AD_GIER; |
break; |
case 28: |
if(PlatinenVersion == 10) AdWertGier = (ADC + gier1 + 2) / 4; |
else |
if(PlatinenVersion == 20) AdWertGier = 2047 - (ADC + gier1 + 1) / 2; |
else AdWertGier = (ADC + gier1 + 1) / 2; |
kanal = AD_NICK; |
break; |
case 29: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 30: |
roll1 += ADC; |
kanal = AD_ACC_Y; |
break; |
case 31: |
Aktuell_ay = NeutralAccY - ADC; |
AdWertAccRoll = (Aktuell_ay + accy); |
kanal = AD_NICK; |
break; |
case 32: |
AdWertNick = (ADC + nick1 + 3) / 5; |
nick_filter = (long) (1 * (long) nick_filter + 4 * (long)(ADC + nick1) + 1) / 2; |
if(PlatinenVersion == 10) { AdWertNick /= 2;nick_filter /=2;} |
HiResNick = nick_filter - 20 * AdNeutralNick; |
AdWertNickFilter = (long)(3L * (long)AdWertNickFilter + HiResNick + 2) / 4; |
DebugOut.Analog[21] = AdWertNickFilter / 4; |
kanal = AD_ROLL; |
break; |
case 33: |
AdWertRoll = (ADC + roll1 + 3) / 5; |
roll_filter = (long)(1 * (long)roll_filter + 4 * (long)(ADC + roll1) + 1) / 2; |
if(PlatinenVersion == 10) { AdWertRoll /= 2;roll_filter /=2;} |
HiResRoll = roll_filter - 20 * AdNeutralRoll; |
AdWertRollFilter = (long)(3L * (long)AdWertRollFilter + HiResRoll + 2) / 4; |
DebugOut.Analog[22] = AdWertRollFilter / 4; |
kanal = AD_ACC_X; |
break; |
case 34: |
Aktuell_ax = ADC - NeutralAccX; |
AdWertAccNick = (Aktuell_ax + accx); |
kanal = AD_NICK; |
state = 0; |
AdReady = 1; |
ZaehlMessungen++; |
break; |
default: |
kanal = 0; |
state = 0; |
break; |
} |
ADMUX = kanal; |
if(state != 0) ANALOG_ON; |
} |
*/ |
/tags/V0.74d/analog.h |
---|
0,0 → 1,45 |
#ifndef _ANALOG_H |
#define _ANALOG_H |
/*####################################################################################### |
#######################################################################################*/ |
extern volatile int UBat; |
extern volatile int AdWertNick, AdWertRoll, AdWertGier; |
extern volatile int AdWertAccRoll,AdWertAccNick,AdWertAccHoch; |
extern volatile int HiResNick, HiResRoll; |
extern volatile int AdWertNickFilter, AdWertRollFilter, AdWertGierFilter; |
extern volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_ax, Aktuell_ay,Aktuell_az; |
extern volatile long Luftdruck; |
extern volatile char messanzahl_Druck; |
extern volatile unsigned int ZaehlMessungen; |
extern unsigned char DruckOffsetSetting; |
extern signed char ExpandBaro; |
extern volatile int HoeheD; |
extern volatile unsigned int MessLuftdruck; |
extern volatile int StartLuftdruck; |
extern volatile char MessanzahlNick; |
extern unsigned char AnalogOffsetNick,AnalogOffsetRoll,AnalogOffsetGier; |
extern volatile unsigned char AdReady; |
unsigned int ReadADC(unsigned char adc_input); |
void ADC_Init(void); |
void SucheLuftruckOffset(void); |
void SucheGyroOffset(void); |
#define AD_GIER 0 |
#define AD_ROLL 1 |
#define AD_NICK 2 |
#define AD_DRUCK 3 |
#define AD_UBAT 4 |
#define AD_ACC_Z 5 |
#define AD_ACC_Y 6 |
#define AD_ACC_X 7 |
#define ANALOG_OFF ADCSRA=0 |
#define ANALOG_ON ADCSRA=(1<<ADEN)|(1<<ADSC)|(0<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADIE) |
//Signle trigger Mode, Interrupt on |
#endif //_ANALOG_H |
/tags/V0.74d/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); |
} |
/tags/V0.74d/fc.c |
---|
0,0 → 1,1417 |
/*####################################################################################### |
Flight Control |
#######################################################################################*/ |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + Nur für den privaten Gebrauch |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-commercial use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be |
// + clearly linked as origin |
// + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
#include "eeprom.c" |
unsigned char h,m,s; |
volatile unsigned int I2CTimeout = 100; |
int MesswertNick,MesswertRoll,MesswertGier,MesswertGierBias, RohMesswertNick,RohMesswertRoll; |
int TrimNick, TrimRoll; |
int AdNeutralGierBias; |
int AdNeutralNick = 0,AdNeutralRoll = 0,AdNeutralGier = 0,StartNeutralRoll = 0,StartNeutralNick = 0; |
int Mittelwert_AccNick, Mittelwert_AccRoll,Mittelwert_AccHoch, NeutralAccX=0, NeutralAccY=0; |
int NaviAccNick, NaviAccRoll,NaviCntAcc = 0; |
volatile float NeutralAccZ = 0; |
unsigned char CosinusNickWinkel = 0, CosinusRollWinkel = 0; |
long IntegralNick = 0,IntegralNick2 = 0; |
long IntegralRoll = 0,IntegralRoll2 = 0; |
long IntegralAccNick = 0,IntegralAccRoll = 0,IntegralAccZ = 0; |
long Integral_Gier = 0; |
long Mess_IntegralNick = 0,Mess_IntegralNick2 = 0; |
long Mess_IntegralRoll = 0,Mess_IntegralRoll2 = 0; |
long Mess_Integral_Gier = 0,Mess_Integral_Gier2 = 0; |
long MittelIntegralNick,MittelIntegralRoll,MittelIntegralNick2,MittelIntegralRoll2; |
volatile long Mess_Integral_Hoch = 0; |
int KompassValue = 0; |
int KompassStartwert = 0; |
int KompassRichtung = 0; |
unsigned int KompassSignalSchlecht = 500; |
unsigned char MAX_GAS,MIN_GAS; |
unsigned char Notlandung = 0; |
unsigned char HoehenReglerAktiv = 0; |
unsigned char TrichterFlug = 0; |
long Umschlag180Nick = 250000L, Umschlag180Roll = 250000L; |
long ErsatzKompass; |
int ErsatzKompassInGrad; // Kompasswert in Grad |
int GierGyroFehler = 0; |
char GyroFaktor,GyroFaktorGier; |
char IntegralFaktor,IntegralFaktorGier; |
int DiffNick,DiffRoll; |
int Poti1 = 0, Poti2 = 0, Poti3 = 0, Poti4 = 0; |
volatile unsigned char SenderOkay = 0; |
int StickNick = 0,StickRoll = 0,StickGier = 0,StickGas = 0; |
char MotorenEin = 0; |
int HoehenWert = 0; |
int SollHoehe = 0; |
int LageKorrekturRoll = 0,LageKorrekturNick = 0; |
//float Ki = FAKTOR_I; |
int Ki = 10300 / 33; |
unsigned char Looping_Nick = 0,Looping_Roll = 0; |
unsigned char Looping_Links = 0, Looping_Rechts = 0, Looping_Unten = 0, Looping_Oben = 0; |
unsigned char Parameter_Luftdruck_D = 48; // Wert : 0-250 |
unsigned char Parameter_MaxHoehe = 251; // Wert : 0-250 |
unsigned char Parameter_Hoehe_P = 16; // Wert : 0-32 |
unsigned char Parameter_Hoehe_ACC_Wirkung = 58; // Wert : 0-250 |
unsigned char Parameter_KompassWirkung = 64; // Wert : 0-250 |
unsigned char Parameter_Gyro_D = 8; // Wert : 0-250 |
unsigned char Parameter_Gyro_P = 150; // Wert : 10-250 |
unsigned char Parameter_Gyro_I = 150; // Wert : 0-250 |
unsigned char Parameter_Gier_P = 2; // Wert : 1-20 |
unsigned char Parameter_I_Faktor = 10; // Wert : 1-20 |
unsigned char Parameter_UserParam1 = 0; |
unsigned char Parameter_UserParam2 = 0; |
unsigned char Parameter_UserParam3 = 0; |
unsigned char Parameter_UserParam4 = 0; |
unsigned char Parameter_UserParam5 = 0; |
unsigned char Parameter_UserParam6 = 0; |
unsigned char Parameter_UserParam7 = 0; |
unsigned char Parameter_UserParam8 = 0; |
unsigned char Parameter_ServoNickControl = 100; |
unsigned char Parameter_LoopGasLimit = 70; |
unsigned char Parameter_AchsKopplung1 = 90; |
unsigned char Parameter_AchsKopplung2 = 65; |
unsigned char Parameter_CouplingYawCorrection = 64; |
//unsigned char Parameter_AchsGegenKopplung1 = 0; |
unsigned char Parameter_DynamicStability = 100; |
unsigned char Parameter_J16Bitmask; // for the J16 Output |
unsigned char Parameter_J16Timing; // for the J16 Output |
unsigned char Parameter_J17Bitmask; // for the J17 Output |
unsigned char Parameter_J17Timing; // for the J17 Output |
unsigned char Parameter_NaviGpsModeControl; // Parameters for the Naviboard |
unsigned char Parameter_NaviGpsGain; |
unsigned char Parameter_NaviGpsP; |
unsigned char Parameter_NaviGpsI; |
unsigned char Parameter_NaviGpsD; |
unsigned char Parameter_NaviGpsACC; |
unsigned char Parameter_NaviOperatingRadius; |
unsigned char Parameter_NaviWindCorrection; |
unsigned char Parameter_NaviSpeedCompensation; |
unsigned char Parameter_ExternalControl; |
struct mk_param_struct EE_Parameter; |
signed int ExternStickNick = 0,ExternStickRoll = 0,ExternStickGier = 0, ExternHoehenValue = -20; |
int MaxStickNick = 0,MaxStickRoll = 0; |
unsigned int modell_fliegt = 0; |
volatile unsigned char MikroKopterFlags = 0; |
long GIER_GRAD_FAKTOR = 1291; |
signed int KopplungsteilNickRoll,KopplungsteilRollNick; |
unsigned char RequiredMotors = 4; |
unsigned char Motor[MAX_MOTORS]; |
signed int tmp_motorwert[MAX_MOTORS]; |
int MotorSmoothing(int neu, int alt) |
{ |
int motor; |
if(neu > alt) motor = (1*(int)alt + neu) / 2; |
else motor = neu - (alt - neu)*1; |
//if(Poti2 < 20) return(neu); |
return(motor); |
} |
void Piep(unsigned char Anzahl) |
{ |
while(Anzahl--) |
{ |
if(MotorenEin) return; //auf keinen Fall im Flug! |
beeptime = 100; |
Delay_ms(250); |
} |
} |
//############################################################################ |
// Nullwerte ermitteln |
void SetNeutral(void) |
//############################################################################ |
{ |
unsigned char i; |
unsigned int gier_neutral=0, nick_neutral=0, roll_neutral=0; |
ServoActive = 0; HEF4017R_ON; |
NeutralAccX = 0; |
NeutralAccY = 0; |
NeutralAccZ = 0; |
AdNeutralNick = 0; |
AdNeutralRoll = 0; |
AdNeutralGier = 0; |
AdNeutralGierBias = 0; |
Parameter_AchsKopplung1 = 0; |
Parameter_AchsKopplung2 = 0; |
ExpandBaro = 0; |
CalibrierMittelwert(); |
Delay_ms_Mess(100); |
CalibrierMittelwert(); |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
{ |
if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
} |
#define NEUTRAL_FILTER 32 |
for(i=0; i<NEUTRAL_FILTER; i++) |
{ |
Delay_ms_Mess(10); |
gier_neutral += AdWertGier; |
nick_neutral += AdWertNick; |
roll_neutral += AdWertRoll; |
} |
AdNeutralNick= (nick_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER / 8); |
AdNeutralRoll= (roll_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER / 8); |
AdNeutralGier= (gier_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER); |
AdNeutralGierBias = AdNeutralGier; |
StartNeutralRoll = AdNeutralRoll; |
StartNeutralNick = AdNeutralNick; |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) > 4) |
{ |
NeutralAccY = abs(Mittelwert_AccRoll) / (2*ACC_AMPLIFY); |
NeutralAccX = abs(Mittelwert_AccNick) / (2*ACC_AMPLIFY); |
NeutralAccZ = Aktuell_az; |
} |
else |
{ |
NeutralAccX = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK+1]); |
NeutralAccY = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL+1]); |
NeutralAccZ = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_Z]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_Z+1]); |
} |
MesswertNick = 0; |
MesswertRoll = 0; |
MesswertGier = 0; |
Delay_ms_Mess(100); |
Mittelwert_AccNick = ACC_AMPLIFY * (long)AdWertAccNick; |
Mittelwert_AccRoll = ACC_AMPLIFY * (long)AdWertAccRoll; |
IntegralNick = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccNick; |
IntegralRoll = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccRoll; |
Mess_IntegralNick2 = IntegralNick; |
Mess_IntegralRoll2 = IntegralRoll; |
Mess_Integral_Gier = 0; |
StartLuftdruck = Luftdruck; |
HoeheD = 0; |
Mess_Integral_Hoch = 0; |
KompassStartwert = KompassValue; |
GPS_Neutral(); |
beeptime = 50; |
Umschlag180Nick = ((long) EE_Parameter.WinkelUmschlagNick * 2500L) + 15000L; |
Umschlag180Roll = ((long) EE_Parameter.WinkelUmschlagRoll * 2500L) + 15000L; |
ExternHoehenValue = 0; |
ErsatzKompass = KompassValue * GIER_GRAD_FAKTOR; |
GierGyroFehler = 0; |
SendVersionToNavi = 1; |
LED_Init(); |
MikroKopterFlags |= FLAG_CALIBRATE; |
FromNaviCtrl_Value.Kalman_K = -1; |
FromNaviCtrl_Value.Kalman_MaxDrift = 0; |
FromNaviCtrl_Value.Kalman_MaxFusion = 32; |
Poti1 = PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110; |
Poti2 = PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110; |
Poti3 = PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110; |
Poti4 = PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110; |
ServoActive = 1; |
SenderOkay = 100; |
} |
//############################################################################ |
// Bearbeitet die Messwerte |
void Mittelwert(void) |
//############################################################################ |
{ |
static signed long tmpl,tmpl2,tmpl3,tmpl4; |
static signed int oldNick, oldRoll, d2Roll, d2Nick; |
signed long winkel_nick, winkel_roll; |
MesswertGier = (signed int) AdNeutralGier - AdWertGier; |
// MesswertGierBias = (signed int) AdNeutralGierBias - AdWertGier; |
MesswertNick = (signed int) AdWertNickFilter / 8; |
MesswertRoll = (signed int) AdWertRollFilter / 8; |
RohMesswertNick = MesswertNick; |
RohMesswertRoll = MesswertRoll; |
//DebugOut.Analog[21] = MesswertNick; |
//DebugOut.Analog[22] = MesswertRoll; |
//DebugOut.Analog[22] = Mess_Integral_Gier; |
//DebugOut.Analog[21] = MesswertNick; |
//DebugOut.Analog[22] = MesswertRoll; |
// Beschleunigungssensor ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mittelwert_AccNick = ((long)Mittelwert_AccNick * 3 + ((ACC_AMPLIFY * (long)AdWertAccNick))) / 4L; |
Mittelwert_AccRoll = ((long)Mittelwert_AccRoll * 3 + ((ACC_AMPLIFY * (long)AdWertAccRoll))) / 4L; |
Mittelwert_AccHoch = ((long)Mittelwert_AccHoch * 3 + ((long)AdWertAccHoch)) / 4L; |
IntegralAccNick += ACC_AMPLIFY * AdWertAccNick; |
IntegralAccRoll += ACC_AMPLIFY * AdWertAccRoll; |
NaviAccNick += AdWertAccNick; |
NaviAccRoll += AdWertAccRoll; |
NaviCntAcc++; |
IntegralAccZ += Aktuell_az - NeutralAccZ; |
//++++++++++++++++++++++++++++++++++++++++++++++++ |
// ADC einschalten |
ANALOG_ON; |
AdReady = 0; |
//++++++++++++++++++++++++++++++++++++++++++++++++ |
if(Mess_IntegralRoll > 93000L) winkel_roll = 93000L; |
else if(Mess_IntegralRoll <-93000L) winkel_roll = -93000L; |
else winkel_roll = Mess_IntegralRoll; |
if(Mess_IntegralNick > 93000L) winkel_nick = 93000L; |
else if(Mess_IntegralNick <-93000L) winkel_nick = -93000L; |
else winkel_nick = Mess_IntegralNick; |
// Gier ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mess_Integral_Gier += MesswertGier; |
ErsatzKompass += MesswertGier; |
// Kopplungsanteil +++++++++++++++++++++++++++++++++++++ |
if(!Looping_Nick && !Looping_Roll && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV)) |
{ |
tmpl3 = (MesswertRoll * winkel_nick) / 2048L; |
tmpl3 *= Parameter_AchsKopplung2; //65 |
tmpl3 /= 4096L; |
tmpl4 = (MesswertNick * winkel_roll) / 2048L; |
tmpl4 *= Parameter_AchsKopplung2; //65 |
tmpl4 /= 4096L; |
KopplungsteilNickRoll = tmpl3; |
KopplungsteilRollNick = tmpl4; |
tmpl4 -= tmpl3; |
ErsatzKompass += tmpl4; |
if(!Parameter_CouplingYawCorrection) Mess_Integral_Gier -= tmpl4/2; // Gier nachhelfen |
tmpl = ((MesswertGier + tmpl4) * winkel_nick) / 2048L; |
tmpl *= Parameter_AchsKopplung1; // 90 |
tmpl /= 4096L; |
tmpl2 = ((MesswertGier + tmpl4) * winkel_roll) / 2048L; |
tmpl2 *= Parameter_AchsKopplung1; |
tmpl2 /= 4096L; |
if(abs(MesswertGier) > 64) if(labs(tmpl) > 128 || labs(tmpl2) > 128) TrichterFlug = 1; |
//MesswertGier += (Parameter_CouplingYawCorrection * tmpl4) / 256; |
} |
else tmpl = tmpl2 = KopplungsteilNickRoll = KopplungsteilRollNick = 0; |
TrimRoll = tmpl - tmpl2 / 100L; |
TrimNick = -tmpl2 + tmpl / 100L; |
// Kompasswert begrenzen ++++++++++++++++++++++++++++++++++++++++++++++++ |
if(ErsatzKompass >= (360L * GIER_GRAD_FAKTOR)) ErsatzKompass -= 360L * GIER_GRAD_FAKTOR; // 360° Umschlag |
if(ErsatzKompass < 0) ErsatzKompass += 360L * GIER_GRAD_FAKTOR; |
// Roll ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mess_IntegralRoll2 += MesswertRoll + TrimRoll; |
Mess_IntegralRoll += MesswertRoll + TrimRoll - LageKorrekturRoll; |
if(Mess_IntegralRoll > Umschlag180Roll) |
{ |
Mess_IntegralRoll = -(Umschlag180Roll - 25000L); |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
} |
if(Mess_IntegralRoll <-Umschlag180Roll) |
{ |
Mess_IntegralRoll = (Umschlag180Roll - 25000L); |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
} |
// Nick ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mess_IntegralNick2 += MesswertNick + TrimNick; |
Mess_IntegralNick += MesswertNick + TrimNick - LageKorrekturNick; |
if(Mess_IntegralNick > Umschlag180Nick) |
{ |
Mess_IntegralNick = -(Umschlag180Nick - 25000L); |
Mess_IntegralNick2 = Mess_IntegralNick; |
} |
if(Mess_IntegralNick <-Umschlag180Nick) |
{ |
Mess_IntegralNick = (Umschlag180Nick - 25000L); |
Mess_IntegralNick2 = Mess_IntegralNick; |
} |
Integral_Gier = Mess_Integral_Gier; |
IntegralNick = Mess_IntegralNick; |
IntegralRoll = Mess_IntegralRoll; |
IntegralNick2 = Mess_IntegralNick2; |
IntegralRoll2 = Mess_IntegralRoll2; |
#define D_LIMIT 128 |
MesswertNick = HiResNick / 8; |
MesswertRoll = HiResRoll / 8; |
if(AdWertNick < 15) MesswertNick = -1000; if(AdWertNick < 7) MesswertNick = -2000; |
if(PlatinenVersion == 10) { if(AdWertNick > 1010) MesswertNick = +1000; if(AdWertNick > 1017) MesswertNick = +2000; } |
else { if(AdWertNick > 2000) MesswertNick = +1000; if(AdWertNick > 2015) MesswertNick = +2000; } |
if(AdWertRoll < 15) MesswertRoll = -1000; if(AdWertRoll < 7) MesswertRoll = -2000; |
if(PlatinenVersion == 10) { if(AdWertRoll > 1010) MesswertRoll = +1000; if(AdWertRoll > 1017) MesswertRoll = +2000; } |
else { if(AdWertRoll > 2000) MesswertRoll = +1000; if(AdWertRoll > 2015) MesswertRoll = +2000; } |
if(Parameter_Gyro_D) |
{ |
d2Nick = HiResNick - oldNick; |
oldNick = (oldNick + HiResNick)/2; |
if(d2Nick > D_LIMIT) d2Nick = D_LIMIT; |
else if(d2Nick < -D_LIMIT) d2Nick = -D_LIMIT; |
MesswertNick += (d2Nick * (signed int) Parameter_Gyro_D) / 16; |
d2Roll = HiResRoll - oldRoll; |
oldRoll = (oldRoll + HiResRoll)/2; |
if(d2Roll > D_LIMIT) d2Roll = D_LIMIT; |
else if(d2Roll < -D_LIMIT) d2Roll = -D_LIMIT; |
MesswertRoll += (d2Roll * (signed int) Parameter_Gyro_D) / 16; |
HiResNick += (d2Nick * (signed int) Parameter_Gyro_D); |
HiResRoll += (d2Roll * (signed int) Parameter_Gyro_D); |
} |
if(RohMesswertRoll > 0) TrimRoll += ((long) abs(KopplungsteilNickRoll) * Parameter_CouplingYawCorrection) / 64L; |
else TrimRoll -= ((long) abs(KopplungsteilNickRoll) * Parameter_CouplingYawCorrection) / 64L; |
if(RohMesswertNick > 0) TrimNick += ((long) abs(KopplungsteilRollNick) * Parameter_CouplingYawCorrection) / 64L; |
else TrimNick -= ((long) abs(KopplungsteilRollNick) * Parameter_CouplingYawCorrection) / 64L; |
if(EE_Parameter.GlobalConfig & CFG_DREHRATEN_BEGRENZER && !Looping_Nick && !Looping_Roll) |
{ |
if(RohMesswertNick > 256) MesswertNick += 1 * (RohMesswertNick - 256); |
else if(RohMesswertNick < -256) MesswertNick += 1 * (RohMesswertNick + 256); |
if(RohMesswertRoll > 256) MesswertRoll += 1 * (RohMesswertRoll - 256); |
else if(RohMesswertRoll < -256) MesswertRoll += 1 * (RohMesswertRoll + 256); |
} |
if(Poti1 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110) Poti1++; else if(Poti1 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110 && Poti1) Poti1--; |
if(Poti2 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110) Poti2++; else if(Poti2 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110 && Poti2) Poti2--; |
if(Poti3 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110) Poti3++; else if(Poti3 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110 && Poti3) Poti3--; |
if(Poti4 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110) Poti4++; else if(Poti4 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110 && Poti4) Poti4--; |
if(Poti1 < 0) Poti1 = 0; else if(Poti1 > 255) Poti1 = 255; |
if(Poti2 < 0) Poti2 = 0; else if(Poti2 > 255) Poti2 = 255; |
if(Poti3 < 0) Poti3 = 0; else if(Poti3 > 255) Poti3 = 255; |
if(Poti4 < 0) Poti4 = 0; else if(Poti4 > 255) Poti4 = 255; |
} |
//############################################################################ |
// Messwerte beim Ermitteln der Nullage |
void CalibrierMittelwert(void) |
//############################################################################ |
{ |
if(PlatinenVersion == 13) SucheGyroOffset(); |
// ADC auschalten, damit die Werte sich nicht während der Berechnung ändern |
ANALOG_OFF; |
MesswertNick = AdWertNick; |
MesswertRoll = AdWertRoll; |
MesswertGier = AdWertGier; |
Mittelwert_AccNick = ACC_AMPLIFY * (long)AdWertAccNick; |
Mittelwert_AccRoll = ACC_AMPLIFY * (long)AdWertAccRoll; |
Mittelwert_AccHoch = (long)AdWertAccHoch; |
// ADC einschalten |
ANALOG_ON; |
if(Poti1 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110) Poti1++; else if(Poti1 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110 && Poti1) Poti1--; |
if(Poti2 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110) Poti2++; else if(Poti2 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110 && Poti2) Poti2--; |
if(Poti3 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110) Poti3++; else if(Poti3 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110 && Poti3) Poti3--; |
if(Poti4 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110) Poti4++; else if(Poti4 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110 && Poti4) Poti4--; |
if(Poti1 < 0) Poti1 = 0; else if(Poti1 > 255) Poti1 = 255; |
if(Poti2 < 0) Poti2 = 0; else if(Poti2 > 255) Poti2 = 255; |
if(Poti3 < 0) Poti3 = 0; else if(Poti3 > 255) Poti3 = 255; |
if(Poti4 < 0) Poti4 = 0; else if(Poti4 > 255) Poti4 = 255; |
Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L; |
Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagRoll * 2500L; |
} |
//############################################################################ |
// Senden der Motorwerte per I2C-Bus |
void SendMotorData(void) |
//############################################################################ |
{ |
unsigned char i; |
if(!MotorenEin) |
{ |
MikroKopterFlags &= ~(FLAG_MOTOR_RUN | FLAG_FLY); |
for(i=0;i<MAX_MOTORS;i++) |
{ |
if(!PC_MotortestActive) MotorTest[i] = 0; |
Motor[i] = MotorTest[i]; |
} |
if(PC_MotortestActive) PC_MotortestActive--; |
} |
else MikroKopterFlags |= FLAG_MOTOR_RUN; |
DebugOut.Analog[12] = Motor[0]; |
DebugOut.Analog[13] = Motor[1]; |
DebugOut.Analog[14] = Motor[3]; |
DebugOut.Analog[15] = Motor[2]; |
//Start I2C Interrupt Mode |
twi_state = 0; |
motor = 0; |
i2c_start(); |
} |
//############################################################################ |
// Trägt ggf. das Poti als Parameter ein |
void ParameterZuordnung(void) |
//############################################################################ |
{ |
#define CHK_POTI_MM(b,a,min,max) { if(a > 250) { if(a == 251) b = Poti1; else if(a == 252) b = Poti2; else if(a == 253) b = Poti3; else if(a == 254) b = Poti4;} else b = a; if(b <= min) b = min; else if(b >= max) b = max;} |
#define CHK_POTI(b,a,min,max) { if(a > 250) { if(a == 251) b = Poti1; else if(a == 252) b = Poti2; else if(a == 253) b = Poti3; else if(a == 254) b = Poti4;} else b = a; } |
CHK_POTI(Parameter_MaxHoehe,EE_Parameter.MaxHoehe,0,255); |
CHK_POTI_MM(Parameter_Luftdruck_D,EE_Parameter.Luftdruck_D,0,100); |
CHK_POTI_MM(Parameter_Hoehe_P,EE_Parameter.Hoehe_P,0,100); |
CHK_POTI(Parameter_Hoehe_ACC_Wirkung,EE_Parameter.Hoehe_ACC_Wirkung,0,255); |
CHK_POTI(Parameter_KompassWirkung,EE_Parameter.KompassWirkung,0,255); |
CHK_POTI_MM(Parameter_Gyro_P,EE_Parameter.Gyro_P,10,255); |
CHK_POTI(Parameter_Gyro_I,EE_Parameter.Gyro_I,0,255); |
CHK_POTI(Parameter_Gyro_D,EE_Parameter.Gyro_D,0,255); |
CHK_POTI(Parameter_I_Faktor,EE_Parameter.I_Faktor,0,255); |
CHK_POTI(Parameter_UserParam1,EE_Parameter.UserParam1,0,255); |
CHK_POTI(Parameter_UserParam2,EE_Parameter.UserParam2,0,255); |
CHK_POTI(Parameter_UserParam3,EE_Parameter.UserParam3,0,255); |
CHK_POTI(Parameter_UserParam4,EE_Parameter.UserParam4,0,255); |
CHK_POTI(Parameter_UserParam5,EE_Parameter.UserParam5,0,255); |
CHK_POTI(Parameter_UserParam6,EE_Parameter.UserParam6,0,255); |
CHK_POTI(Parameter_UserParam7,EE_Parameter.UserParam7,0,255); |
CHK_POTI(Parameter_UserParam8,EE_Parameter.UserParam8,0,255); |
CHK_POTI(Parameter_ServoNickControl,EE_Parameter.ServoNickControl,0,255); |
CHK_POTI(Parameter_LoopGasLimit,EE_Parameter.LoopGasLimit,0,255); |
CHK_POTI(Parameter_AchsKopplung1, EE_Parameter.AchsKopplung1,0,255); |
CHK_POTI(Parameter_AchsKopplung2, EE_Parameter.AchsKopplung2,0,255); |
CHK_POTI(Parameter_CouplingYawCorrection,EE_Parameter.CouplingYawCorrection,0,255); |
// CHK_POTI(Parameter_AchsGegenKopplung1,EE_Parameter.AchsGegenKopplung1,0,255); |
CHK_POTI(Parameter_DynamicStability,EE_Parameter.DynamicStability,0,255); |
CHK_POTI_MM(Parameter_J16Timing,EE_Parameter.J16Timing,1,255); |
CHK_POTI_MM(Parameter_J17Timing,EE_Parameter.J17Timing,1,255); |
CHK_POTI(Parameter_ExternalControl,EE_Parameter.ExternalControl,0,255); |
Ki = 10300 / (Parameter_I_Faktor + 1); |
MAX_GAS = EE_Parameter.Gas_Max; |
MIN_GAS = EE_Parameter.Gas_Min; |
} |
//############################################################################ |
// |
void MotorRegler(void) |
//############################################################################ |
{ |
int pd_ergebnis_nick,pd_ergebnis_roll,h,tmp_int; |
int GierMischanteil,GasMischanteil; |
static long SummeNick=0,SummeRoll=0; |
static long sollGier = 0,tmp_long,tmp_long2; |
static long IntegralFehlerNick = 0; |
static long IntegralFehlerRoll = 0; |
static unsigned int RcLostTimer; |
static unsigned char delay_neutral = 0; |
static unsigned char delay_einschalten = 0,delay_ausschalten = 0; |
static int hoehenregler = 0; |
static char TimerWerteausgabe = 0; |
static char NeueKompassRichtungMerken = 0; |
static long ausgleichNick, ausgleichRoll; |
int IntegralNickMalFaktor,IntegralRollMalFaktor; |
unsigned char i; |
Mittelwert(); |
GRN_ON; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gaswert ermitteln |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
GasMischanteil = StickGas; |
if(GasMischanteil < MIN_GAS + 10) GasMischanteil = MIN_GAS + 10; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Empfang schlecht |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(SenderOkay < 100) |
{ |
if(!PcZugriff) |
{ |
if(BeepMuster == 0xffff) |
{ |
beeptime = 15000; |
BeepMuster = 0x0c00; |
} |
} |
if(RcLostTimer) RcLostTimer--; |
else |
{ |
MotorenEin = 0; |
Notlandung = 0; |
} |
ROT_ON; |
if(modell_fliegt > 1000) // wahrscheinlich in der Luft --> langsam absenken |
{ |
GasMischanteil = EE_Parameter.NotGas; |
Notlandung = 1; |
PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] = 0; |
PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] = 0; |
PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] = 0; |
PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] = 0; |
PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] = 0; |
} |
else MotorenEin = 0; |
} |
else |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Emfang gut |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(SenderOkay > 140) |
{ |
Notlandung = 0; |
RcLostTimer = EE_Parameter.NotGasZeit * 50; |
if(GasMischanteil > 40 && MotorenEin) |
{ |
if(modell_fliegt < 0xffff) modell_fliegt++; |
} |
if((modell_fliegt < 256)) |
{ |
SummeNick = 0; |
SummeRoll = 0; |
if(modell_fliegt == 250) |
{ |
NeueKompassRichtungMerken = 1; |
sollGier = 0; |
Mess_Integral_Gier = 0; |
// Mess_Integral_Gier2 = 0; |
} |
} else MikroKopterFlags |= FLAG_FLY; |
if((PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] > 80) && MotorenEin == 0) |
{ |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// auf Nullwerte kalibrieren |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] > 75) // Neutralwerte |
{ |
if(++delay_neutral > 200) // nicht sofort |
{ |
GRN_OFF; |
MotorenEin = 0; |
delay_neutral = 0; |
modell_fliegt = 0; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70 || abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) > 70) |
{ |
unsigned char setting=1; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < 70) setting = 1; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 2; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 3; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] <-70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 4; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] <-70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < 70) setting = 5; |
SetActiveParamSetNumber(setting); // aktiven Datensatz merken |
} |
// else |
if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) < 30 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < -70) |
{ |
WinkelOut.CalcState = 1; |
beeptime = 1000; |
} |
else |
{ |
ReadParameterSet(GetActiveParamSetNumber(), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
{ |
if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
} |
SetNeutral(); |
Piep(GetActiveParamSetNumber()); |
} |
} |
} |
else |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] < -75) // ACC Neutralwerte speichern |
{ |
if(++delay_neutral > 200) // nicht sofort |
{ |
GRN_OFF; |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_NICK],0xff); // Werte löschen |
MotorenEin = 0; |
delay_neutral = 0; |
modell_fliegt = 0; |
SetNeutral(); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_NICK],NeutralAccX / 256); // ACC-NeutralWerte speichern |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_NICK+1],NeutralAccX % 256); // ACC-NeutralWerte speichern |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL],NeutralAccY / 256); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL+1],NeutralAccY % 256); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_Z],(int)NeutralAccZ / 256); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_Z+1],(int)NeutralAccZ % 256); |
Piep(GetActiveParamSetNumber()); |
} |
} |
else delay_neutral = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gas ist unten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] < 35-120) |
{ |
// Starten |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] < -75) |
{ |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Einschalten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(++delay_einschalten > 200) |
{ |
delay_einschalten = 200; |
modell_fliegt = 1; |
MotorenEin = 1; |
sollGier = 0; |
Mess_Integral_Gier = 0; |
Mess_Integral_Gier2 = 0; |
Mess_IntegralNick = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccNick; |
Mess_IntegralRoll = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccRoll; |
Mess_IntegralNick2 = IntegralNick; |
Mess_IntegralRoll2 = IntegralRoll; |
SummeNick = 0; |
SummeRoll = 0; |
MikroKopterFlags |= FLAG_START; |
} |
} |
else delay_einschalten = 0; |
//Auf Neutralwerte setzen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Auschalten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] > 75) |
{ |
if(++delay_ausschalten > 200) // nicht sofort |
{ |
MotorenEin = 0; |
delay_ausschalten = 200; |
modell_fliegt = 0; |
} |
} |
else delay_ausschalten = 0; |
} |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// neue Werte von der Funke |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!NewPpmData-- || Notlandung) |
{ |
static int stick_nick,stick_roll; |
ParameterZuordnung(); |
stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4; |
stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; |
StickNick = stick_nick - (GPS_Nick + GPS_Nick2); |
stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4; |
stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; |
StickRoll = stick_roll - (GPS_Roll + GPS_Roll2); |
StickGier = -PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]; |
if(StickGier > 2) StickGier -= 2; else |
if(StickGier < -2) StickGier += 2; else StickGier = 0; |
StickGas = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] + 120; |
GyroFaktor = (Parameter_Gyro_P + 10.0); |
IntegralFaktor = Parameter_Gyro_I; |
GyroFaktorGier = (Parameter_Gyro_P + 10.0); |
IntegralFaktorGier = Parameter_Gyro_I; |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//+ Analoge Steuerung per Seriell |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(ExternControl.Config & 0x01 && Parameter_ExternalControl > 128) |
{ |
StickNick += (int) ExternControl.Nick * (int) EE_Parameter.Stick_P; |
StickRoll += (int) ExternControl.Roll * (int) EE_Parameter.Stick_P; |
StickGier += ExternControl.Gier; |
ExternHoehenValue = (int) ExternControl.Hight * (int)EE_Parameter.Hoehe_Verstaerkung; |
if(ExternControl.Gas < StickGas) StickGas = ExternControl.Gas; |
} |
if(StickGas < 0) StickGas = 0; |
if(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) IntegralFaktor = 0; |
if(GyroFaktor < 0) GyroFaktor = 0; |
if(IntegralFaktor < 0) IntegralFaktor = 0; |
if(abs(StickNick/STICK_GAIN) > MaxStickNick) |
{ |
MaxStickNick = abs(StickNick)/STICK_GAIN; |
if(MaxStickNick > 100) MaxStickNick = 100; |
} |
else MaxStickNick--; |
if(abs(StickRoll/STICK_GAIN) > MaxStickRoll) |
{ |
MaxStickRoll = abs(StickRoll)/STICK_GAIN; |
if(MaxStickRoll > 100) MaxStickRoll = 100; |
} |
else MaxStickRoll--; |
if(Notlandung) {MaxStickNick = 0; MaxStickRoll = 0;} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Looping? |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > EE_Parameter.LoopThreshold) && EE_Parameter.BitConfig & CFG_LOOP_LINKS) Looping_Links = 1; |
else |
{ |
{ |
if((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < (EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese))) Looping_Links = 0; |
} |
} |
if((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < -EE_Parameter.LoopThreshold) && EE_Parameter.BitConfig & CFG_LOOP_RECHTS) Looping_Rechts = 1; |
else |
{ |
if(Looping_Rechts) // Hysterese |
{ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > -(EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese)) Looping_Rechts = 0; |
} |
} |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > EE_Parameter.LoopThreshold) && EE_Parameter.BitConfig & CFG_LOOP_OBEN) Looping_Oben = 1; |
else |
{ |
if(Looping_Oben) // Hysterese |
{ |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < (EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese))) Looping_Oben = 0; |
} |
} |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < -EE_Parameter.LoopThreshold) && EE_Parameter.BitConfig & CFG_LOOP_UNTEN) Looping_Unten = 1; |
else |
{ |
if(Looping_Unten) // Hysterese |
{ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > -(EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese)) Looping_Unten = 0; |
} |
} |
if(Looping_Links || Looping_Rechts) Looping_Roll = 1; else Looping_Roll = 0; |
if(Looping_Oben || Looping_Unten) { Looping_Nick = 1; Looping_Roll = 0; Looping_Links = 0; Looping_Rechts = 0;} else Looping_Nick = 0; |
} // Ende neue Funken-Werte |
if(Looping_Roll || Looping_Nick) |
{ |
if(GasMischanteil > EE_Parameter.LoopGasLimit) GasMischanteil = EE_Parameter.LoopGasLimit; |
TrichterFlug = 1; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Bei Empfangsausfall im Flug |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(Notlandung) |
{ |
StickGier = 0; |
StickNick = 0; |
StickRoll = 0; |
GyroFaktor = 90; |
IntegralFaktor = 120; |
GyroFaktorGier = 90; |
IntegralFaktorGier = 120; |
Looping_Roll = 0; |
Looping_Nick = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Integrale auf ACC-Signal abgleichen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define ABGLEICH_ANZAHL 256L |
MittelIntegralNick += IntegralNick; // Für die Mittelwertbildung aufsummieren |
MittelIntegralRoll += IntegralRoll; |
MittelIntegralNick2 += IntegralNick2; |
MittelIntegralRoll2 += IntegralRoll2; |
if(Looping_Nick || Looping_Roll) |
{ |
IntegralAccNick = 0; |
IntegralAccRoll = 0; |
MittelIntegralNick = 0; |
MittelIntegralRoll = 0; |
MittelIntegralNick2 = 0; |
MittelIntegralRoll2 = 0; |
Mess_IntegralNick2 = Mess_IntegralNick; |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
ZaehlMessungen = 0; |
LageKorrekturNick = 0; |
LageKorrekturRoll = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!Looping_Nick && !Looping_Roll && (Aktuell_az > 512 || MotorenEin)) |
{ |
long tmp_long, tmp_long2; |
if(FromNaviCtrl_Value.Kalman_K != -1 /*&& !TrichterFlug*/) |
{ |
tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick); |
tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll); |
tmp_long = (tmp_long * FromNaviCtrl_Value.Kalman_K) / (32 * 16); |
tmp_long2 = (tmp_long2 * FromNaviCtrl_Value.Kalman_K) / (32 * 16); |
if((MaxStickNick > 64) || (MaxStickRoll > 64)) |
{ |
tmp_long /= 2; |
tmp_long2 /= 2; |
} |
if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25) |
{ |
tmp_long /= 3; |
tmp_long2 /= 3; |
} |
if(tmp_long > (long) FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long = (long) FromNaviCtrl_Value.Kalman_MaxFusion; |
if(tmp_long < (long)-FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long = (long)-FromNaviCtrl_Value.Kalman_MaxFusion; |
if(tmp_long2 > (long) FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long2 = (long) FromNaviCtrl_Value.Kalman_MaxFusion; |
if(tmp_long2 < (long)-FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long2 = (long)-FromNaviCtrl_Value.Kalman_MaxFusion; |
} |
else |
{ |
tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick); |
tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll); |
tmp_long /= 16; |
tmp_long2 /= 16; |
if((MaxStickNick > 64) || (MaxStickRoll > 64)) |
{ |
tmp_long /= 3; |
tmp_long2 /= 3; |
} |
if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25) |
{ |
tmp_long /= 3; |
tmp_long2 /= 3; |
} |
#define AUSGLEICH 32 |
if(tmp_long > AUSGLEICH) tmp_long = AUSGLEICH; |
if(tmp_long < -AUSGLEICH) tmp_long =-AUSGLEICH; |
if(tmp_long2 > AUSGLEICH) tmp_long2 = AUSGLEICH; |
if(tmp_long2 <-AUSGLEICH) tmp_long2 =-AUSGLEICH; |
} |
//if(Poti2 > 20) { tmp_long = 0; tmp_long2 = 0;} |
Mess_IntegralNick -= tmp_long; |
Mess_IntegralRoll -= tmp_long2; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(ZaehlMessungen >= ABGLEICH_ANZAHL) |
{ |
static int cnt = 0; |
static char last_n_p,last_n_n,last_r_p,last_r_n; |
static long MittelIntegralNick_Alt,MittelIntegralRoll_Alt; |
if(!Looping_Nick && !Looping_Roll && !TrichterFlug && EE_Parameter.Driftkomp) |
{ |
MittelIntegralNick /= ABGLEICH_ANZAHL; |
MittelIntegralRoll /= ABGLEICH_ANZAHL; |
IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL; |
IntegralAccRoll = (EE_Parameter.GyroAccFaktor * IntegralAccRoll) / ABGLEICH_ANZAHL; |
IntegralAccZ = IntegralAccZ / ABGLEICH_ANZAHL; |
#define MAX_I 0//(Poti2/10) |
// Nick ++++++++++++++++++++++++++++++++++++++++++++++++ |
IntegralFehlerNick = (long)(MittelIntegralNick - (long)IntegralAccNick); |
ausgleichNick = IntegralFehlerNick / EE_Parameter.GyroAccAbgleich; |
// Roll ++++++++++++++++++++++++++++++++++++++++++++++++ |
IntegralFehlerRoll = (long)(MittelIntegralRoll - (long)IntegralAccRoll); |
ausgleichRoll = IntegralFehlerRoll / EE_Parameter.GyroAccAbgleich; |
LageKorrekturNick = ausgleichNick / ABGLEICH_ANZAHL; |
LageKorrekturRoll = ausgleichRoll / ABGLEICH_ANZAHL; |
if(((MaxStickNick > 64) || (MaxStickRoll > 64) || (abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25)) && (FromNaviCtrl_Value.Kalman_K == -1)) |
{ |
LageKorrekturNick /= 2; |
LageKorrekturRoll /= 2; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gyro-Drift ermitteln |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
MittelIntegralNick2 /= ABGLEICH_ANZAHL; |
MittelIntegralRoll2 /= ABGLEICH_ANZAHL; |
tmp_long = IntegralNick2 - IntegralNick; |
tmp_long2 = IntegralRoll2 - IntegralRoll; |
//DebugOut.Analog[25] = MittelIntegralRoll2 / 26; |
IntegralFehlerNick = tmp_long; |
IntegralFehlerRoll = tmp_long2; |
Mess_IntegralNick2 -= IntegralFehlerNick; |
Mess_IntegralRoll2 -= IntegralFehlerRoll; |
// IntegralFehlerNick = (IntegralFehlerNick * 1 + tmp_long) / 2; |
// IntegralFehlerRoll = (IntegralFehlerRoll * 1 + tmp_long2) / 2; |
if(EE_Parameter.Driftkomp) |
{ |
if(GierGyroFehler > ABGLEICH_ANZAHL/2) { AdNeutralGier++; AdNeutralGierBias++; } |
if(GierGyroFehler <-ABGLEICH_ANZAHL/2) { AdNeutralGier--; AdNeutralGierBias--; } |
} |
//DebugOut.Analog[22] = MittelIntegralRoll / 26; |
//DebugOut.Analog[24] = GierGyroFehler; |
GierGyroFehler = 0; |
/*DebugOut.Analog[17] = IntegralAccNick / 26; |
DebugOut.Analog[18] = IntegralAccRoll / 26; |
DebugOut.Analog[19] = IntegralFehlerNick;// / 26; |
DebugOut.Analog[20] = IntegralFehlerRoll;// / 26; |
*/ |
//DebugOut.Analog[21] = MittelIntegralNick / 26; |
//MittelIntegralRoll = MittelIntegralRoll; |
//DebugOut.Analog[28] = ausgleichNick; |
/* |
DebugOut.Analog[29] = ausgleichRoll; |
DebugOut.Analog[30] = LageKorrekturRoll * 10; |
*/ |
#define FEHLER_LIMIT (ABGLEICH_ANZAHL / 2) |
#define FEHLER_LIMIT1 (ABGLEICH_ANZAHL * 2) //4 |
#define FEHLER_LIMIT2 (ABGLEICH_ANZAHL * 16) //16 |
#define BEWEGUNGS_LIMIT 20000 |
// Nick +++++++++++++++++++++++++++++++++++++++++++++++++ |
cnt = 1;// + labs(IntegralFehlerNick) / 4096; |
if(labs(IntegralFehlerNick) > FEHLER_LIMIT1) cnt = 4; |
if(labs(MittelIntegralNick_Alt - MittelIntegralNick) < BEWEGUNGS_LIMIT || (FromNaviCtrl_Value.Kalman_MaxDrift > 3*8)) |
{ |
if(IntegralFehlerNick > FEHLER_LIMIT2) |
{ |
if(last_n_p) |
{ |
cnt += labs(IntegralFehlerNick) / (FEHLER_LIMIT2 / 8); |
ausgleichNick = IntegralFehlerNick / 8; |
if(ausgleichNick > 5000) ausgleichNick = 5000; |
LageKorrekturNick += ausgleichNick / ABGLEICH_ANZAHL; |
} |
else last_n_p = 1; |
} else last_n_p = 0; |
if(IntegralFehlerNick < -FEHLER_LIMIT2) |
{ |
if(last_n_n) |
{ |
cnt += labs(IntegralFehlerNick) / (FEHLER_LIMIT2 / 8); |
ausgleichNick = IntegralFehlerNick / 8; |
if(ausgleichNick < -5000) ausgleichNick = -5000; |
LageKorrekturNick += ausgleichNick / ABGLEICH_ANZAHL; |
} |
else last_n_n = 1; |
} else last_n_n = 0; |
} |
else |
{ |
cnt = 0; |
KompassSignalSchlecht = 1000; |
} |
if(cnt > EE_Parameter.Driftkomp) cnt = EE_Parameter.Driftkomp; |
if(FromNaviCtrl_Value.Kalman_MaxDrift) if(cnt > FromNaviCtrl_Value.Kalman_MaxDrift) cnt = FromNaviCtrl_Value.Kalman_MaxDrift; |
if(IntegralFehlerNick > FEHLER_LIMIT) AdNeutralNick += cnt; |
if(IntegralFehlerNick < -FEHLER_LIMIT) AdNeutralNick -= cnt; |
// Roll +++++++++++++++++++++++++++++++++++++++++++++++++ |
cnt = 1;// + labs(IntegralFehlerNick) / 4096; |
if(labs(IntegralFehlerRoll) > FEHLER_LIMIT1) cnt = 4; |
ausgleichRoll = 0; |
if(labs(MittelIntegralRoll_Alt - MittelIntegralRoll) < BEWEGUNGS_LIMIT || (FromNaviCtrl_Value.Kalman_MaxDrift > 3*8)) |
{ |
if(IntegralFehlerRoll > FEHLER_LIMIT2) |
{ |
if(last_r_p) |
{ |
cnt += labs(IntegralFehlerRoll) / (FEHLER_LIMIT2 / 8); |
ausgleichRoll = IntegralFehlerRoll / 8; |
if(ausgleichRoll > 5000) ausgleichRoll = 5000; |
LageKorrekturRoll += ausgleichRoll / ABGLEICH_ANZAHL; |
} |
else last_r_p = 1; |
} else last_r_p = 0; |
if(IntegralFehlerRoll < -FEHLER_LIMIT2) |
{ |
if(last_r_n) |
{ |
cnt += labs(IntegralFehlerRoll) / (FEHLER_LIMIT2 / 8); |
ausgleichRoll = IntegralFehlerRoll / 8; |
if(ausgleichRoll < -5000) ausgleichRoll = -5000; |
LageKorrekturRoll += ausgleichRoll / ABGLEICH_ANZAHL; |
} |
else last_r_n = 1; |
} else last_r_n = 0; |
} else |
{ |
cnt = 0; |
KompassSignalSchlecht = 1000; |
} |
if(cnt > EE_Parameter.Driftkomp) cnt = EE_Parameter.Driftkomp; |
if(FromNaviCtrl_Value.Kalman_MaxDrift) if(cnt > FromNaviCtrl_Value.Kalman_MaxDrift) cnt = FromNaviCtrl_Value.Kalman_MaxDrift; |
if(IntegralFehlerRoll > FEHLER_LIMIT) AdNeutralRoll += cnt; |
if(IntegralFehlerRoll < -FEHLER_LIMIT) AdNeutralRoll -= cnt; |
} |
else |
{ |
LageKorrekturRoll = 0; |
LageKorrekturNick = 0; |
TrichterFlug = 0; |
} |
if(!IntegralFaktor) { LageKorrekturRoll = 0; LageKorrekturNick = 0;} // z.B. bei HH |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++ |
MittelIntegralNick_Alt = MittelIntegralNick; |
MittelIntegralRoll_Alt = MittelIntegralRoll; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++ |
IntegralAccNick = 0; |
IntegralAccRoll = 0; |
IntegralAccZ = 0; |
MittelIntegralNick = 0; |
MittelIntegralRoll = 0; |
MittelIntegralNick2 = 0; |
MittelIntegralRoll2 = 0; |
ZaehlMessungen = 0; |
} // ZaehlMessungen >= ABGLEICH_ANZAHL |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gieren |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// if(GasMischanteil < 35) { if(StickGier > 10) StickGier = 10; else if(StickGier < -10) StickGier = -10;}; |
if(abs(StickGier) > 15) // war 35 |
{ |
KompassSignalSchlecht = 1000; |
if(!(EE_Parameter.GlobalConfig & CFG_KOMPASS_FIX)) |
{ |
NeueKompassRichtungMerken = 1; |
}; |
} |
tmp_int = (long) EE_Parameter.Gier_P * ((long)StickGier * abs(StickGier)) / 512L; // expo y = ax + bx² |
tmp_int += (EE_Parameter.Gier_P * StickGier) / 4; |
sollGier = tmp_int; |
Mess_Integral_Gier -= tmp_int; |
if(Mess_Integral_Gier > 50000) Mess_Integral_Gier = 50000; // begrenzen |
if(Mess_Integral_Gier <-50000) Mess_Integral_Gier =-50000; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Kompass |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//DebugOut.Analog[16] = KompassSignalSchlecht; |
if(KompassValue && (EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV)) |
{ |
int w,v,r,fehler,korrektur; |
w = abs(IntegralNick /512); // mit zunehmender Neigung den Einfluss drosseln |
v = abs(IntegralRoll /512); |
if(v > w) w = v; // grösste Neigung ermitteln |
korrektur = w / 8 + 1; |
fehler = ((540 + KompassValue - (ErsatzKompass/GIER_GRAD_FAKTOR)) % 360) - 180; |
if(abs(MesswertGier) > 128) |
{ |
fehler = 0; |
} |
if(!KompassSignalSchlecht && w < 25) |
{ |
GierGyroFehler += fehler; |
if(NeueKompassRichtungMerken) |
{ |
beeptime = 200; |
// KompassStartwert = KompassValue; |
ErsatzKompass = KompassValue * GIER_GRAD_FAKTOR; |
KompassStartwert = (ErsatzKompass/GIER_GRAD_FAKTOR); |
NeueKompassRichtungMerken = 0; |
} |
} |
ErsatzKompass += (fehler * 8) / korrektur; |
w = (w * Parameter_KompassWirkung) / 32; // auf die Wirkung normieren |
w = Parameter_KompassWirkung - w; // Wirkung ggf drosseln |
if(w >= 0) |
{ |
if(!KompassSignalSchlecht) |
{ |
v = 64 + ((MaxStickNick + MaxStickRoll)) / 8; |
r = ((540 + (ErsatzKompass/GIER_GRAD_FAKTOR) - KompassStartwert) % 360) - 180; |
// r = KompassRichtung; |
v = (r * w) / v; // nach Kompass ausrichten |
w = 3 * Parameter_KompassWirkung; |
if(v > w) v = w; // Begrenzen |
else |
if(v < -w) v = -w; |
Mess_Integral_Gier += v; |
} |
if(KompassSignalSchlecht) KompassSignalSchlecht--; |
} |
else KompassSignalSchlecht = 500; // so lange das Signal taub stellen --> ca. 1 sek |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Debugwerte zuordnen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!TimerWerteausgabe--) |
{ |
TimerWerteausgabe = 24; |
DebugOut.Analog[0] = IntegralNick / (EE_Parameter.GyroAccFaktor * 4); |
DebugOut.Analog[1] = IntegralRoll / (EE_Parameter.GyroAccFaktor * 4); |
DebugOut.Analog[2] = Mittelwert_AccNick / 4; |
DebugOut.Analog[3] = Mittelwert_AccRoll / 4; |
DebugOut.Analog[4] = MesswertGier; |
DebugOut.Analog[5] = HoehenWert; |
DebugOut.Analog[6] = Aktuell_az;//(Mess_Integral_Hoch / 512);//Aktuell_az; |
DebugOut.Analog[8] = KompassValue; |
DebugOut.Analog[9] = UBat; |
DebugOut.Analog[11] = ErsatzKompass / GIER_GRAD_FAKTOR; |
DebugOut.Analog[10] = SenderOkay; |
//DebugOut.Analog[16] = Mittelwert_AccHoch; |
//DebugOut.Analog[17] = FromNaviCtrl_Value.Distance; |
//DebugOut.Analog[18] = (int)FromNaviCtrl_Value.OsdBar; |
DebugOut.Analog[19] = WinkelOut.CalcState; |
DebugOut.Analog[20] = ServoValue; |
// DebugOut.Analog[24] = MesswertNick/2; |
// DebugOut.Analog[25] = MesswertRoll/2; |
DebugOut.Analog[27] = (int)FromNaviCtrl_Value.Kalman_MaxDrift; |
// DebugOut.Analog[28] = (int)FromNaviCtrl_Value.Kalman_MaxFusion; |
// DebugOut.Analog[29] = (int)FromNaviCtrl_Value.Kalman_K; |
DebugOut.Analog[29] = FromNaviCtrl_Value.SerialDataOkay; |
DebugOut.Analog[30] = GPS_Nick; |
DebugOut.Analog[31] = GPS_Roll; |
// DebugOut.Analog[19] -= DebugOut.Analog[19]/128; |
// if(DebugOut.Analog[19] > 0) DebugOut.Analog[19]--; else DebugOut.Analog[19]++; |
/* DebugOut.Analog[16] = motor_rx[0]; |
DebugOut.Analog[17] = motor_rx[1]; |
DebugOut.Analog[18] = motor_rx[2]; |
DebugOut.Analog[19] = motor_rx[3]; |
DebugOut.Analog[20] = motor_rx[0] + motor_rx[1] + motor_rx[2] + motor_rx[3]; |
DebugOut.Analog[20] /= 14; |
DebugOut.Analog[21] = motor_rx[4]; |
DebugOut.Analog[22] = motor_rx[5]; |
DebugOut.Analog[23] = motor_rx[6]; |
DebugOut.Analog[24] = motor_rx[7]; |
DebugOut.Analog[25] = motor_rx[4] + motor_rx[5] + motor_rx[6] + motor_rx[7]; |
*/ |
// DebugOut.Analog[9] = MesswertNick; |
// DebugOut.Analog[9] = SollHoehe; |
// DebugOut.Analog[10] = Mess_Integral_Gier / 128; |
// DebugOut.Analog[11] = KompassStartwert; |
// DebugOut.Analog[10] = Parameter_Gyro_I; |
// DebugOut.Analog[10] = EE_Parameter.Gyro_I; |
// DebugOut.Analog[9] = KompassRichtung; |
// DebugOut.Analog[10] = GasMischanteil; |
// DebugOut.Analog[3] = HoeheD * 32; |
// DebugOut.Analog[4] = hoehenregler; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Drehgeschwindigkeit und -winkel zu einem Istwert zusammenfassen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(TrichterFlug) { SummeRoll = 0; SummeNick = 0;}; |
if(!Looping_Nick) IntegralNickMalFaktor = (IntegralNick * IntegralFaktor) / (44000 / STICK_GAIN); else IntegralNickMalFaktor = 0; |
if(!Looping_Roll) IntegralRollMalFaktor = (IntegralRoll * IntegralFaktor) / (44000 / STICK_GAIN); else IntegralRollMalFaktor = 0; |
#define TRIM_MAX 200 |
if(TrimNick > TRIM_MAX) TrimNick = TRIM_MAX; else if(TrimNick <-TRIM_MAX) TrimNick =-TRIM_MAX; |
if(TrimRoll > TRIM_MAX) TrimRoll = TRIM_MAX; else if(TrimRoll <-TRIM_MAX) TrimRoll =-TRIM_MAX; |
MesswertNick = IntegralNickMalFaktor + (long)((long)MesswertNick * GyroFaktor + (long)TrimNick * 128L) / (256L / STICK_GAIN); |
MesswertRoll = IntegralRollMalFaktor + (long)((long)MesswertRoll * GyroFaktor + (long)TrimRoll * 128L) / (256L / STICK_GAIN); |
MesswertGier = (long)(MesswertGier * 2 * (long)GyroFaktorGier) / (256L / STICK_GAIN) + (long)(Integral_Gier * IntegralFaktorGier) / (2 * (44000 / STICK_GAIN)); |
// Maximalwerte abfangen |
// #define MAX_SENSOR (4096*STICK_GAIN) |
#define MAX_SENSOR (4096*4) |
if(MesswertNick > MAX_SENSOR) MesswertNick = MAX_SENSOR; |
if(MesswertNick < -MAX_SENSOR) MesswertNick = -MAX_SENSOR; |
if(MesswertRoll > MAX_SENSOR) MesswertRoll = MAX_SENSOR; |
if(MesswertRoll < -MAX_SENSOR) MesswertRoll = -MAX_SENSOR; |
if(MesswertGier > MAX_SENSOR) MesswertGier = MAX_SENSOR; |
if(MesswertGier < -MAX_SENSOR) MesswertGier = -MAX_SENSOR; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// all BL-Ctrl connected? |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(MissingMotor) if(modell_fliegt > 1 && modell_fliegt < 50 && GasMischanteil > 0) |
{ |
modell_fliegt = 1; |
GasMischanteil = MIN_GAS; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Höhenregelung |
// Die Höhenregelung schwächt lediglich das Gas ab, erhöht es allerdings nicht |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
GasMischanteil *= STICK_GAIN; |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung |
{ |
int tmp_int; |
static char delay = 100; |
if(EE_Parameter.GlobalConfig & CFG_HOEHEN_SCHALTER) // Regler wird über Schalter gesteuert |
{ |
if(Parameter_MaxHoehe < 50) |
{ |
if(!delay--) |
{ |
if((MessLuftdruck > 1000) && OCR0A < 254) |
{ |
if(OCR0A < 244) |
{ |
ExpandBaro -= 10; |
OCR0A = DruckOffsetSetting - ExpandBaro; |
} |
else OCR0A = 254; |
beeptime = 300; |
delay = 250; |
} |
else |
if((MessLuftdruck < 100) && OCR0A > 1) |
{ |
if(OCR0A > 10) |
{ |
ExpandBaro += 10; |
OCR0A = DruckOffsetSetting - ExpandBaro; |
} |
else OCR0A = 1; |
beeptime = 300; |
delay = 250; |
} |
else |
{ |
SollHoehe = HoehenWert - 20; // Parameter_MaxHoehe ist der PPM-Wert des Schalters |
HoehenReglerAktiv = 0; |
delay = 1; |
} |
} |
} |
else |
{ |
HoehenReglerAktiv = 1; |
delay = 200; |
} |
} |
else |
{ |
SollHoehe = ((int) ExternHoehenValue + (int) Parameter_MaxHoehe) * (int)EE_Parameter.Hoehe_Verstaerkung - 20; |
HoehenReglerAktiv = 1; |
} |
if(Notlandung) SollHoehe = 0; |
h = HoehenWert; |
if((h > SollHoehe) && HoehenReglerAktiv) // zu hoch --> drosseln |
{ |
h = ((h - SollHoehe) * (int) Parameter_Hoehe_P) / (16 / STICK_GAIN); // Differenz bestimmen --> P-Anteil |
h = GasMischanteil - h; // vom Gas abziehen |
h -= (HoeheD)/(8/STICK_GAIN); // D-Anteil |
tmp_int = ((Mess_Integral_Hoch / 128) * (signed long) Parameter_Hoehe_ACC_Wirkung) / (128 / STICK_GAIN); |
if(tmp_int > 70*STICK_GAIN) tmp_int = 70*STICK_GAIN; |
else if(tmp_int < -(70*STICK_GAIN)) tmp_int = -(70*STICK_GAIN); |
h -= tmp_int; |
hoehenregler = (hoehenregler*15 + h) / 16; |
if(hoehenregler < EE_Parameter.Hoehe_MinGas * STICK_GAIN) // nicht unter MIN |
{ |
if(GasMischanteil >= EE_Parameter.Hoehe_MinGas * STICK_GAIN) hoehenregler = EE_Parameter.Hoehe_MinGas * STICK_GAIN; |
if(GasMischanteil < EE_Parameter.Hoehe_MinGas * STICK_GAIN) hoehenregler = GasMischanteil; |
} |
if(hoehenregler > GasMischanteil) hoehenregler = GasMischanteil; // nicht mehr als Gas |
GasMischanteil = hoehenregler; |
} |
} |
if(GasMischanteil > (MAX_GAS - 20) * STICK_GAIN) GasMischanteil = (MAX_GAS - 20) * STICK_GAIN; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Mischer und PI-Regler |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DebugOut.Analog[7] = GasMischanteil; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gier-Anteil |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define MUL_G 1.0 |
GierMischanteil = MesswertGier - sollGier * STICK_GAIN; // Regler für Gier |
// GierMischanteil = 0; |
#define MIN_GIERGAS (40*STICK_GAIN) // unter diesem Gaswert trotzdem Gieren |
if(GasMischanteil > MIN_GIERGAS) |
{ |
if(GierMischanteil > (GasMischanteil / 2)) GierMischanteil = GasMischanteil / 2; |
if(GierMischanteil < -(GasMischanteil / 2)) GierMischanteil = -(GasMischanteil / 2); |
} |
else |
{ |
if(GierMischanteil > (MIN_GIERGAS / 2)) GierMischanteil = MIN_GIERGAS / 2; |
if(GierMischanteil < -(MIN_GIERGAS / 2)) GierMischanteil = -(MIN_GIERGAS / 2); |
} |
tmp_int = MAX_GAS*STICK_GAIN; |
if(GierMischanteil > ((tmp_int - GasMischanteil))) GierMischanteil = ((tmp_int - GasMischanteil)); |
if(GierMischanteil < -((tmp_int - GasMischanteil))) GierMischanteil = -((tmp_int - GasMischanteil)); |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Nick-Achse |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DiffNick = MesswertNick - StickNick; // Differenz bestimmen |
if(IntegralFaktor) SummeNick += IntegralNickMalFaktor - StickNick; // I-Anteil bei Winkelregelung |
else SummeNick += DiffNick; // I-Anteil bei HH |
if(SummeNick > (STICK_GAIN * 16000L)) SummeNick = (STICK_GAIN * 16000L); |
if(SummeNick < -(16000L * STICK_GAIN)) SummeNick = -(16000L * STICK_GAIN); |
pd_ergebnis_nick = DiffNick + SummeNick / Ki; // PI-Regler für Nick |
// Motor Vorn |
tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
if(pd_ergebnis_nick > tmp_int) pd_ergebnis_nick = tmp_int; |
if(pd_ergebnis_nick < -tmp_int) pd_ergebnis_nick = -tmp_int; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Roll-Achse |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DiffRoll = MesswertRoll - StickRoll; // Differenz bestimmen |
if(IntegralFaktor) SummeRoll += IntegralRollMalFaktor - StickRoll;// I-Anteil bei Winkelregelung |
else SummeRoll += DiffRoll; // I-Anteil bei HH |
if(SummeRoll > (STICK_GAIN * 16000L)) SummeRoll = (STICK_GAIN * 16000L); |
if(SummeRoll < -(16000L * STICK_GAIN)) SummeRoll = -(16000L * STICK_GAIN); |
pd_ergebnis_roll = DiffRoll + SummeRoll / Ki; // PI-Regler für Roll |
tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
if(pd_ergebnis_roll > tmp_int) pd_ergebnis_roll = tmp_int; |
if(pd_ergebnis_roll < -tmp_int) pd_ergebnis_roll = -tmp_int; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Universal Mixer |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
for(i=0; i<MAX_MOTORS; i++) |
{ |
signed int tmp_int; |
if(Mixer.Motor[i][0] > 0) |
{ |
tmp_int = ((long)GasMischanteil * Mixer.Motor[i][0]) / 64L; |
tmp_int += ((long)pd_ergebnis_nick * Mixer.Motor[i][1]) / 64L; |
tmp_int += ((long)pd_ergebnis_roll * Mixer.Motor[i][2]) / 64L; |
tmp_int += ((long)GierMischanteil * Mixer.Motor[i][3]) / 64L; |
tmp_motorwert[i] = MotorSmoothing(tmp_int,tmp_motorwert[i]); // Filter |
tmp_int = tmp_motorwert[i] / STICK_GAIN; |
CHECK_MIN_MAX(tmp_int,MIN_GAS,MAX_GAS); |
Motor[i] = tmp_int; |
} |
else Motor[i] = 0; |
} |
/* |
if(Poti1 > 20) Motor1 = 0; |
if(Poti1 > 90) Motor6 = 0; |
if(Poti1 > 140) Motor2 = 0; |
//if(Poti1 > 200) Motor7 = 0; |
*/ |
} |
/tags/V0.74d/fc.h |
---|
0,0 → 1,182 |
/*####################################################################################### |
Flight Control |
#######################################################################################*/ |
#ifndef _FC_H |
#define _FC_H |
//#define GIER_GRAD_FAKTOR 1291L // Abhängigkeit zwischen GyroIntegral und Winkel |
//#define GIER_GRAD_FAKTOR 1160L |
extern long GIER_GRAD_FAKTOR; // Abhängigkeit zwischen GyroIntegral und Winkel |
#define STICK_GAIN 4 |
#define FLAG_MOTOR_RUN 1 |
#define FLAG_FLY 2 |
#define FLAG_CALIBRATE 4 |
#define FLAG_START 8 |
#define MAX_MOTORS 12 |
#define CHECK_MIN_MAX(wert,min,max) {if(wert < min) wert = min; else if(wert > max) wert = max;} |
extern volatile unsigned char MikroKopterFlags; |
extern volatile unsigned int I2CTimeout; |
extern unsigned char Sekunde,Minute; |
extern long IntegralNick,IntegralNick2; |
extern long IntegralRoll,IntegralRoll2; |
//extern int IntegralNick,IntegralNick2; |
//extern int IntegralRoll,IntegralRoll2; |
extern long Mess_IntegralNick,Mess_IntegralNick2; |
extern long Mess_IntegralRoll,Mess_IntegralRoll2; |
extern long IntegralAccNick,IntegralAccRoll; |
extern volatile long Mess_Integral_Hoch; |
extern long Integral_Gier,Mess_Integral_Gier,Mess_Integral_Gier2; |
extern int KompassValue; |
extern int KompassStartwert; |
extern int KompassRichtung; |
extern int TrimNick, TrimRoll; |
extern long ErsatzKompass; |
extern int ErsatzKompassInGrad; // Kompasswert in Grad |
extern int HoehenWert; |
extern int SollHoehe; |
extern int MesswertNick,MesswertRoll,MesswertGier; |
extern int AdNeutralNick,AdNeutralRoll,AdNeutralGier, Mittelwert_AccNick, Mittelwert_AccRoll; |
extern int NeutralAccX, NeutralAccY,Mittelwert_AccHoch; |
extern unsigned char HoehenReglerAktiv; |
extern volatile float NeutralAccZ; |
extern long Umschlag180Nick, Umschlag180Roll; |
extern signed int ExternStickNick,ExternStickRoll,ExternStickGier; |
extern unsigned char Parameter_UserParam1,Parameter_UserParam2,Parameter_UserParam3,Parameter_UserParam4,Parameter_UserParam5,Parameter_UserParam6,Parameter_UserParam7,Parameter_UserParam8; |
extern int NaviAccNick,NaviAccRoll,NaviCntAcc; |
extern unsigned int modell_fliegt; |
void MotorRegler(void); |
void SendMotorData(void); |
void CalibrierMittelwert(void); |
void Mittelwert(void); |
void SetNeutral(void); |
void Piep(unsigned char Anzahl); |
extern unsigned char h,m,s; |
extern volatile unsigned char Timeout ; |
extern unsigned char CosinusNickWinkel, CosinusRollWinkel; |
extern int DiffNick,DiffRoll; |
extern int Poti1, Poti2, Poti3, Poti4; |
extern volatile unsigned char SenderOkay; |
extern unsigned char RequiredMotors; |
extern int StickNick,StickRoll,StickGier; |
extern char MotorenEin; |
extern void DefaultKonstanten1(void); |
extern void DefaultKonstanten2(void); |
extern void DefaultKonstanten3(void); |
extern void DefaultStickMapping(void); |
#define STRUCT_PARAM_LAENGE sizeof(EE_Parameter) |
struct mk_param_struct |
{ |
unsigned char Kanalbelegung[8]; // GAS[0], GIER[1],NICK[2], ROLL[3], POTI1, POTI2, POTI3 |
unsigned char GlobalConfig; // 0x01=Höhenregler aktiv,0x02=Kompass aktiv, 0x04=GPS aktiv, 0x08=Heading Hold aktiv |
unsigned char Hoehe_MinGas; // Wert : 0-100 |
unsigned char Luftdruck_D; // Wert : 0-250 |
unsigned char MaxHoehe; // Wert : 0-32 |
unsigned char Hoehe_P; // Wert : 0-32 |
unsigned char Hoehe_Verstaerkung; // Wert : 0-50 |
unsigned char Hoehe_ACC_Wirkung; // Wert : 0-250 |
unsigned char Stick_P; // Wert : 1-6 |
unsigned char Stick_D; // Wert : 0-64 |
unsigned char Gier_P; // Wert : 1-20 |
unsigned char Gas_Min; // Wert : 0-32 |
unsigned char Gas_Max; // Wert : 33-250 |
unsigned char GyroAccFaktor; // Wert : 1-64 |
unsigned char KompassWirkung; // Wert : 0-32 |
unsigned char Gyro_P; // Wert : 10-250 |
unsigned char Gyro_I; // Wert : 0-250 |
unsigned char Gyro_D; // Wert : 0-250 |
unsigned char UnterspannungsWarnung; // Wert : 0-250 |
unsigned char NotGas; // Wert : 0-250 //Gaswert bei Empängsverlust |
unsigned char NotGasZeit; // Wert : 0-250 // Zeitbis auf NotGas geschaltet wird, wg. Rx-Problemen |
unsigned char UfoAusrichtung; // X oder + Formation |
unsigned char I_Faktor; // Wert : 0-250 |
unsigned char UserParam1; // Wert : 0-250 |
unsigned char UserParam2; // Wert : 0-250 |
unsigned char UserParam3; // Wert : 0-250 |
unsigned char UserParam4; // Wert : 0-250 |
unsigned char ServoNickControl; // Wert : 0-250 // Stellung des Servos |
unsigned char ServoNickComp; // Wert : 0-250 // Einfluss Gyro/Servo |
unsigned char ServoNickMin; // Wert : 0-250 // Anschlag |
unsigned char ServoNickMax; // Wert : 0-250 // Anschlag |
unsigned char ServoNickRefresh; // |
unsigned char LoopGasLimit; // Wert: 0-250 max. Gas während Looping |
unsigned char LoopThreshold; // Wert: 0-250 Schwelle für Stickausschlag |
unsigned char LoopHysterese; // Wert: 0-250 Hysterese für Stickausschlag |
unsigned char AchsKopplung1; // Wert: 0-250 Faktor, mit dem Gier die Achsen Roll und Nick koppelt (NickRollMitkopplung) |
unsigned char AchsKopplung2; // Wert: 0-250 Faktor, mit dem Nick und Roll verkoppelt werden |
unsigned char CouplingYawCorrection; // Wert: 0-250 Faktor, mit dem Nick und Roll verkoppelt werden |
unsigned char WinkelUmschlagNick; // Wert: 0-250 180°-Punkt |
unsigned char WinkelUmschlagRoll; // Wert: 0-250 180°-Punkt |
unsigned char GyroAccAbgleich; // 1/k (Koppel_ACC_Wirkung) |
unsigned char Driftkomp; |
unsigned char DynamicStability; |
unsigned char UserParam5; // Wert : 0-250 |
unsigned char UserParam6; // Wert : 0-250 |
unsigned char UserParam7; // Wert : 0-250 |
unsigned char UserParam8; // Wert : 0-250 |
//---Output --------------------------------------------- |
unsigned char J16Bitmask; // for the J16 Output |
unsigned char J16Timing; // for the J16 Output |
unsigned char J17Bitmask; // for the J17 Output |
unsigned char J17Timing; // for the J17 Output |
//---NaviCtrl--------------------------------------------- |
unsigned char NaviGpsModeControl; // Parameters for the Naviboard |
unsigned char NaviGpsGain; |
unsigned char NaviGpsP; |
unsigned char NaviGpsI; |
unsigned char NaviGpsD; |
unsigned char NaviGpsPLimit; |
unsigned char NaviGpsILimit; |
unsigned char NaviGpsDLimit; |
unsigned char NaviGpsACC; |
unsigned char NaviGpsMinSat; |
unsigned char NaviStickThreshold; |
unsigned char NaviWindCorrection; |
unsigned char NaviSpeedCompensation; |
unsigned char NaviOperatingRadius; |
unsigned char NaviAngleLimitation; |
unsigned char NaviPH_LoginTime; |
//---Ext.Ctrl--------------------------------------------- |
unsigned char ExternalControl; // for serial Control |
//------------------------------------------------ |
unsigned char BitConfig; // (war Loop-Cfg) Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
unsigned char ServoNickCompInvert; // Wert : 0-250 0 oder 1 // WICHTIG!!! am Ende lassen |
unsigned char Reserved[4]; |
char Name[12]; |
}; |
struct |
{ |
char Revision; |
char Name[12]; |
signed char Motor[16][4]; |
} Mixer; |
extern struct mk_param_struct EE_Parameter; |
extern unsigned char Parameter_Luftdruck_D; |
extern unsigned char Parameter_MaxHoehe; |
extern unsigned char Parameter_Hoehe_P; |
extern unsigned char Parameter_Hoehe_ACC_Wirkung; |
extern unsigned char Parameter_KompassWirkung; |
extern unsigned char Parameter_Gyro_P; |
extern unsigned char Parameter_Gyro_I; |
extern unsigned char Parameter_Gier_P; |
extern unsigned char Parameter_ServoNickControl; |
extern unsigned char Parameter_AchsKopplung1; |
extern unsigned char Parameter_AchsKopplung2; |
//extern unsigned char Parameter_AchsGegenKopplung1; |
extern unsigned char Parameter_J16Bitmask; // for the J16 Output |
extern unsigned char Parameter_J16Timing; // for the J16 Output |
extern unsigned char Parameter_J17Bitmask; // for the J17 Output |
extern unsigned char Parameter_J17Timing; // for the J17 Output |
extern signed char MixerTable[MAX_MOTORS][4]; |
extern unsigned char Motor[MAX_MOTORS]; |
#endif //_FC_H |
/tags/V0.74d/flight.pnproj |
---|
0,0 → 1,0 |
<Project name="Flight-Ctrl"><File path="uart.h"></File><File path="main.c"></File><File path="main.h"></File><File path="makefile"></File><File path="uart.c"></File><File path="printf_P.h"></File><File path="printf_P.c"></File><File path="timer0.c"></File><File path="timer0.h"></File><File path="old_macros.h"></File><File path="twimaster.c"></File><File path="version.txt"></File><File path="twimaster.h"></File><File path="rc.c"></File><File path="rc.h"></File><File path="fc.h"></File><File path="menu.h"></File><File path="menu.c"></File><File path="_Settings.h"></File><File path="analog.c"></File><File path="analog.h"></File><File path="GPS.c"></File><File path="gps.h"></File><File path="License.txt"></File><File path="eeprom.c"></File><File path="spi.h"></File><File path="spi.c"></File><File path="led.h"></File><File path="led.c"></File><File path="fc.c"></File><File path="Spectrum.c"></File><File path="Spectrum.h"></File></Project> |
/tags/V0.74d/flight.pnps |
---|
0,0 → 1,0 |
<pd><ViewState><e p="Flight-Ctrl" x="true"></e></ViewState></pd> |
/tags/V0.74d/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); |
/tags/V0.74d/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; |
} |
} |
} |
/tags/V0.74d/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); |
/tags/V0.74d/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; |
/tags/V0.74d/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 |
/tags/V0.74d/makefile |
---|
0,0 → 1,449 |
#-------------------------------------------------------------------- |
# MCU name |
MCU = atmega644p |
F_CPU = 20000000 |
#------------------------------------------------------------------- |
VERSION_MAJOR = 0 |
VERSION_MINOR = 74 |
VERSION_PATCH = 3 |
VERSION_SERIAL_MAJOR = 10 # Serial Protocol |
VERSION_SERIAL_MINOR = 1 # Serial Protocol |
NC_SPI_COMPATIBLE = 6 # Navi-Kompatibilität |
#------------------------------------------------------------------- |
ifeq ($(MCU), atmega32) |
# FUSE_SETTINGS= -u -U lfuse:w:0xff:m -U hfuse:w:0xcf:m |
HEX_NAME = MEGA32 |
endif |
ifeq ($(MCU), atmega644) |
FUSE_SETTINGS = -u -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
#FUSE_SETTINGS = -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
# -u bei neuen Controllern wieder einspielen |
HEX_NAME = MEGA644 |
endif |
ifeq ($(MCU), atmega644p) |
FUSE_SETTINGS = -u -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
HEX_NAME = MEGA644 |
endif |
ifeq ($(F_CPU), 16000000) |
QUARZ = 16MHZ |
endif |
ifeq ($(F_CPU), 20000000) |
QUARZ = 20MHZ |
endif |
# Output format. (can be srec, ihex, binary) |
FORMAT = ihex |
# Target file name (without extension). |
ifeq ($(VERSION_PATCH), 0) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)a |
endif |
ifeq ($(VERSION_PATCH), 1) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)b |
endif |
ifeq ($(VERSION_PATCH), 2) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)c |
endif |
ifeq ($(VERSION_PATCH), 3) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)d |
endif |
ifeq ($(VERSION_PATCH), 4) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)e |
endif |
ifeq ($(VERSION_PATCH), 5) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)f |
endif |
ifeq ($(VERSION_PATCH), 6) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)g |
endif |
ifeq ($(VERSION_PATCH), 7) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)h |
endif |
ifeq ($(VERSION_PATCH), 8) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)i |
endif |
ifeq ($(VERSION_PATCH), 9) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)j |
endif |
ifeq ($(VERSION_PATCH), 10) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)k |
endif |
ifeq ($(VERSION_PATCH), 11) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)L |
endif |
ifeq ($(VERSION_PATCH), 12) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)m |
endif |
ifeq ($(VERSION_PATCH), 13) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)n |
endif |
ifeq ($(VERSION_PATCH), 14) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)o |
endif |
ifeq ($(VERSION_PATCH), 15) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)p |
endif |
ifeq ($(VERSION_PATCH), 16) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(VERSION_MAJOR)_$(VERSION_MINOR)q |
endif |
# Optimization level, can be [0, 1, 2, 3, s]. 0 turns off optimization. |
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) |
OPT = 2 |
########################################################################################################## |
# List C source files here. (C dependencies are automatically generated.) |
SRC = main.c uart.c printf_P.c timer0.c analog.c menu.c |
SRC += twimaster.c rc.c fc.c GPS.c spi.c led.c Spectrum.c |
########################################################################################################## |
# List Assembler source files here. |
# Make them always end in a capital .S. Files ending in a lowercase .s |
# will not be considered source files but generated files (assembler |
# output from the compiler), and will be deleted upon "make clean"! |
# Even though the DOS/Win* filesystem matches both .s and .S the same, |
# it will preserve the spelling of the filenames, and gcc itself does |
# care about how the name is spelled on its command-line. |
ASRC = |
# List any extra directories to look for include files here. |
# Each directory must be seperated by a space. |
EXTRAINCDIRS = |
# Optional compiler flags. |
# -g: generate debugging information (for GDB, or for COFF conversion) |
# -O*: optimization level |
# -f...: tuning, see gcc manual and avr-libc documentation |
# -Wall...: warning level |
# -Wa,...: tell GCC to pass this to the assembler. |
# -ahlms: create assembler listing |
CFLAGS = -O$(OPT) \ |
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \ |
-Wall -Wstrict-prototypes \ |
-Wa,-adhlns=$(<:.c=.lst) \ |
$(patsubst %,-I%,$(EXTRAINCDIRS)) |
# Set a "language standard" compiler flag. |
# Unremark just one line below to set the language standard to use. |
# gnu99 = C99 + GNU extensions. See GCC manual for more information. |
#CFLAGS += -std=c89 |
#CFLAGS += -std=gnu89 |
#CFLAGS += -std=c99 |
CFLAGS += -std=gnu99 |
CFLAGS += -DVERSION_MAJOR=$(VERSION_MAJOR) -DVERSION_MINOR=$(VERSION_MINOR) -DVERSION_PATCH=$(VERSION_PATCH) -DVERSION_SERIAL_MAJOR=$(VERSION_SERIAL_MAJOR) -DVERSION_SERIAL_MINOR=$(VERSION_SERIAL_MINOR) -DNC_SPI_COMPATIBLE=$(NC_SPI_COMPATIBLE) |
# Optional assembler flags. |
# -Wa,...: tell GCC to pass this to the assembler. |
# -ahlms: create listing |
# -gstabs: have the assembler create line number information; note that |
# for use in COFF files, additional information about filenames |
# and function names needs to be present in the assembler source |
# files -- see avr-libc docs [FIXME: not yet described there] |
ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs |
# Optional linker flags. |
# -Wl,...: tell GCC to pass this to linker. |
# -Map: create map file |
# --cref: add cross reference to map file |
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref |
# Additional libraries |
# Minimalistic printf version |
#LDFLAGS += -Wl,-u,vfprintf -lprintf_min |
# Floating point printf version (requires -lm below) |
#LDFLAGS += -Wl,-u,vfprintf -lprintf_flt |
# -lm = math library |
LDFLAGS += -lm |
##LDFLAGS += -T./linkerfile/avr5.x |
# Programming support using avrdude. Settings and variables. |
# Programming hardware: alf avr910 avrisp bascom bsd |
# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500 |
# |
# Type: avrdude -c ? |
# to get a full listing. |
# |
#AVRDUDE_PROGRAMMER = dt006 |
#AVRDUDE_PROGRAMMER = stk200 |
#AVRDUDE_PROGRAMMER = ponyser |
AVRDUDE_PROGRAMMER = avrispv2 |
#falls Ponyser ausgewählt wird, muss sich unsere avrdude-Configdatei im Bin-Verzeichnis des Compilers befinden |
#AVRDUDE_PORT = com1 # programmer connected to serial device |
#AVRDUDE_PORT = lpt1 # programmer connected to parallel port |
AVRDUDE_PORT = usb # programmer connected to USB |
#AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex |
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex $(FUSE_SETTINGS) |
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep |
#avrdude -c avrispv2 -P usb -p m32 -U flash:w:blink.hex |
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) |
# Uncomment the following if you want avrdude's erase cycle counter. |
# Note that this counter needs to be initialized first using -Yn, |
# see avrdude manual. |
#AVRDUDE_ERASE += -y |
# Uncomment the following if you do /not/ wish a verification to be |
# performed after programming the device. |
AVRDUDE_FLAGS += -V |
# Increase verbosity level. Please use this when submitting bug |
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude> |
# to submit bug reports. |
#AVRDUDE_FLAGS += -v -v |
# --------------------------------------------------------------------------- |
# Define directories, if needed. |
DIRAVR = c:/winavr |
DIRAVRBIN = $(DIRAVR)/bin |
DIRAVRUTILS = $(DIRAVR)/utils/bin |
DIRINC = . |
DIRLIB = $(DIRAVR)/avr/lib |
# Define programs and commands. |
SHELL = sh |
CC = avr-gcc |
OBJCOPY = avr-objcopy |
OBJDUMP = avr-objdump |
SIZE = avr-size |
# Programming support using avrdude. |
AVRDUDE = avrdude |
REMOVE = rm -f |
COPY = cp |
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex |
ELFSIZE = $(SIZE) -A $(TARGET).elf |
# Define Messages |
# English |
MSG_ERRORS_NONE = Errors: none |
MSG_BEGIN = -------- begin -------- |
MSG_END = -------- end -------- |
MSG_SIZE_BEFORE = Size before: |
MSG_SIZE_AFTER = Size after: |
MSG_COFF = Converting to AVR COFF: |
MSG_EXTENDED_COFF = Converting to AVR Extended COFF: |
MSG_FLASH = Creating load file for Flash: |
MSG_EEPROM = Creating load file for EEPROM: |
MSG_EXTENDED_LISTING = Creating Extended Listing: |
MSG_SYMBOL_TABLE = Creating Symbol Table: |
MSG_LINKING = Linking: |
MSG_COMPILING = Compiling: |
MSG_ASSEMBLING = Assembling: |
MSG_CLEANING = Cleaning project: |
# Define all object files. |
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) |
# Define all listing files. |
LST = $(ASRC:.S=.lst) $(SRC:.c=.lst) |
# Combine all necessary flags and optional flags. |
# Add target processor to flags. |
#ALL_CFLAGS = -mmcu=$(MCU) -DF_CPU=$(F_CPU) -I. $(CFLAGS) |
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) |
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) |
# Default target. |
all: begin gccversion sizebefore $(TARGET).elf $(TARGET).hex $(TARGET).eep \ |
$(TARGET).lss $(TARGET).sym sizeafter finished end |
# Eye candy. |
# AVR Studio 3.x does not check make's exit code but relies on |
# the following magic strings to be generated by the compile job. |
begin: |
@echo |
@echo $(MSG_BEGIN) |
finished: |
@echo $(MSG_ERRORS_NONE) |
end: |
@echo $(MSG_END) |
@echo |
# Display size of file. |
# Display size of file. |
sizebefore: |
@if [ -f $(TARGET).elf ]; then echo Size before:; $(ELFSIZE); $(HEXSIZE); echo; fi |
sizeafter: |
@if [ -f $(TARGET).elf ]; then echo Size after:; $(ELFSIZE); $(HEXSIZE); echo; fi |
# Display compiler version information. |
gccversion : |
@$(CC) --version |
# Convert ELF to COFF for use in debugging / simulating in |
# AVR Studio or VMLAB. |
COFFCONVERT=$(OBJCOPY) --debugging \ |
--change-section-address .data-0x800000 \ |
--change-section-address .bss-0x800000 \ |
--change-section-address .noinit-0x800000 \ |
--change-section-address .eeprom-0x810000 |
coff: $(TARGET).elf |
@echo |
@echo $(MSG_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof |
extcoff: $(TARGET).elf |
@echo |
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof |
# Program the device. |
program: $(TARGET).hex $(TARGET).eep |
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) |
# Create final output files (.hex, .eep) from ELF output file. |
%.hex: %.elf |
@echo |
@echo $(MSG_FLASH) $@ |
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ |
%.eep: %.elf |
@echo |
@echo $(MSG_EEPROM) $@ |
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ |
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@ |
# Create extended listing file from ELF output file. |
%.lss: %.elf |
@echo |
@echo $(MSG_EXTENDED_LISTING) $@ |
$(OBJDUMP) -h -S $< > $@ |
# Create a symbol table from ELF output file. |
%.sym: %.elf |
@echo |
@echo $(MSG_SYMBOL_TABLE) $@ |
avr-nm -n $< > $@ |
# Link: create ELF output file from object files. |
.SECONDARY : $(TARGET).elf |
.PRECIOUS : $(OBJ) |
%.elf: $(OBJ) |
@echo |
@echo $(MSG_LINKING) $@ |
$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) |
# Compile: create object files from C source files. |
%.o : %.c |
@echo |
@echo $(MSG_COMPILING) $< |
$(CC) -c $(ALL_CFLAGS) $< -o $@ |
# Compile: create assembler files from C source files. |
%.s : %.c |
$(CC) -S $(ALL_CFLAGS) $< -o $@ |
# Assemble: create object files from assembler source files. |
%.o : %.S |
@echo |
@echo $(MSG_ASSEMBLING) $< |
$(CC) -c $(ALL_ASFLAGS) $< -o $@ |
# Target: clean project. |
clean: begin clean_list finished end |
clean_list : |
@echo |
@echo $(MSG_CLEANING) |
# $(REMOVE) $(TARGET).hex |
$(REMOVE) $(TARGET).eep |
$(REMOVE) $(TARGET).obj |
$(REMOVE) $(TARGET).cof |
$(REMOVE) $(TARGET).elf |
$(REMOVE) $(TARGET).map |
$(REMOVE) $(TARGET).obj |
$(REMOVE) $(TARGET).a90 |
$(REMOVE) $(TARGET).sym |
$(REMOVE) $(TARGET).lnk |
$(REMOVE) $(TARGET).lss |
$(REMOVE) $(OBJ) |
$(REMOVE) $(LST) |
$(REMOVE) $(SRC:.c=.s) |
$(REMOVE) $(SRC:.c=.d) |
# Automatically generate C source code dependencies. |
# (Code originally taken from the GNU make user manual and modified |
# (See README.txt Credits).) |
# |
# Note that this will work with sh (bash) and sed that is shipped with WinAVR |
# (see the SHELL variable defined above). |
# This may not work with other shells or other seds. |
# |
%.d: %.c |
set -e; $(CC) -MM $(ALL_CFLAGS) $< \ |
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > $@; \ |
[ -s $@ ] || rm -f $@ |
# Remove the '-' if you want to see the dependency files generated. |
-include $(SRC:.c=.d) |
# Listing of phony targets. |
.PHONY : all begin finish end sizebefore sizeafter gccversion coff extcoff \ |
clean clean_list program |
/tags/V0.74d/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; |
} |
/tags/V0.74d/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; |
/tags/V0.74d/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 |
/tags/V0.74d/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); |
} |
/tags/V0.74d/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 |
/tags/V0.74d/rc.c |
---|
0,0 → 1,122 |
/*####################################################################################### |
Decodieren eines RC Summen Signals |
#######################################################################################*/ |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "rc.h" |
#include "main.h" |
volatile int PPM_in[11]; |
volatile int PPM_diff[11]; // das diffenzierte Stick-Signal |
volatile unsigned char NewPpmData = 1; |
//############################################################################ |
//zum decodieren des PPM-Signals wird Timer1 mit seiner Input |
//Capture Funktion benutzt: |
void rc_sum_init (void) |
//############################################################################ |
{ |
TCCR1B=(1<<CS11)|(1<<CS10)|(1<<ICES1)|(1<<ICNC1);//|(1 << WGM12); //timer1 prescale 64 |
// TCCR1B=(1<<CS11)|(0<<CS10)|(1<<ICES1)|(1<<ICNC1); //timer1 prescale 64 |
TIMSK1 |= _BV(ICIE1); |
AdNeutralGier = 0; |
AdNeutralRoll = 0; |
AdNeutralNick = 0; |
return; |
} |
//############################################################################ |
//Diese Routine startet und inizialisiert den Timer für RC |
SIGNAL(SIG_INPUT_CAPTURE1) |
//############################################################################ |
{ |
static unsigned int AltICR=0; |
signed int signal = 0,tmp; |
static int index; |
signal = (unsigned int) ICR1 - AltICR; |
AltICR = ICR1; |
//Syncronisationspause? |
if((signal > 1100) && (signal < 8000)) |
{ |
if(index >= 4) NewPpmData = 0; // Null bedeutet: Neue Daten |
index = 1; |
} |
else |
{ |
if(index < 10) |
{ |
if((signal > 250) && (signal < 687)) |
{ |
signal -= 466; |
// Stabiles Signal |
if(abs(signal - PPM_in[index]) < 6) { if(SenderOkay < 200) SenderOkay += 10; else SenderOkay = 200;} |
tmp = (3 * (PPM_in[index]) + signal) / 4; |
if(tmp > signal+1) tmp--; else |
if(tmp < signal-1) tmp++; |
if(SenderOkay >= 195) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; |
else PPM_diff[index] = 0; |
PPM_in[index] = tmp; |
} |
index++; |
if(index == 5) J3High; else J3Low; // Servosignal an J3 anlegen |
if(index == 6) J4High; else J4Low; // Servosignal an J4 anlegen |
if(index == 7) J5High; else J5Low; // Servosignal an J5 anlegen |
} |
} |
} |
/* |
//############################################################################ |
//Diese Routine startet und inizialisiert den Timer für RC |
SIGNAL(SIG_INPUT_CAPTURE1) |
//############################################################################ |
{ |
static unsigned int AltICR=0; |
signed int signal = 0,tmp; |
static int index; |
signal = (unsigned int) ICR1 - AltICR; |
DebugOut.Analog[16] = signal; |
signal /= 2; |
AltICR = ICR1; |
//Syncronisationspause? |
if((signal > 1100*2) && (signal < 8000*2)) |
{ |
if(index >= 4) NewPpmData = 0; // Null bedeutet: Neue Daten |
index = 1; |
} |
else |
{ |
if(index < 10) |
{ |
if((signal > 250) && (signal < 687*2)) |
{ |
signal -= 962; |
// Stabiles Signal |
if(abs(signal - PPM_in[index]) < 6) { if(SenderOkay < 200) SenderOkay += 10;} |
tmp = (3 * (PPM_in[index]) + signal) / 4; |
if(tmp > signal+1) tmp--; else |
if(tmp < signal-1) tmp++; |
if(SenderOkay >= 195) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; |
else PPM_diff[index] = 0; |
PPM_in[index] = tmp; |
} |
index++; |
if(index == 5) J3High; else J3Low; // Servosignal an J3 anlegen |
if(index == 2) J4High; else J4Low; // Servosignal an J4 anlegen |
if(index == 7) J5High; else J5Low; // Servosignal an J5 anlegen |
} |
} |
} |
*/ |
/tags/V0.74d/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 |
/tags/V0.74d/spi.c |
---|
0,0 → 1,281 |
// ######################## SPI - FlightCtrl ################### |
#include "main.h" |
//struct str_ToNaviCtrl_Version ToNaviCtrl_Version; |
//struct str_FromNaviCtrl_Version FromNaviCtrl_Version; |
struct str_ToNaviCtrl ToNaviCtrl; |
struct str_FromNaviCtrl FromNaviCtrl; |
struct str_FromNaviCtrl_Value FromNaviCtrl_Value; |
struct str_SPI_VersionInfo SPI_VersionInfo; |
unsigned char SPI_BufferIndex; |
unsigned char SPI_RxBufferIndex; |
volatile unsigned char SPI_Buffer[sizeof(FromNaviCtrl)]; |
unsigned char *SPI_TX_Buffer; |
unsigned char SPITransferCompleted, SPI_ChkSum; |
unsigned char SPI_RxDataValid,NaviDataOkay = 0; |
unsigned char SPI_CommandSequence[] = { SPI_CMD_USER, SPI_CMD_STICK, SPI_CMD_PARAMETER1, SPI_CMD_STICK, SPI_CMD_MISC, SPI_CMD_VERSION }; |
unsigned char SPI_CommandCounter = 0; |
#ifdef USE_SPI_COMMUNICATION |
//------------------------------------------------------ |
void SPI_MasterInit(void) |
{ |
DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK); // Set MOSI and SCK output, all others input |
SLAVE_SELECT_DDR_PORT |= (1 << SPI_SLAVE_SELECT); |
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(0<<SPR0)|(0<<SPIE); // Enable SPI, Master, set clock rate fck/64 |
SPSR = 0;//(1<<SPI2X); |
SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); |
SPITransferCompleted = 1; |
//SPDR = 0x00; // dummy write |
ToNaviCtrl.Sync1 = 0xAA; |
ToNaviCtrl.Sync2 = 0x83; |
ToNaviCtrl.Command = SPI_CMD_USER; |
ToNaviCtrl.IntegralNick = 0; |
ToNaviCtrl.IntegralRoll = 0; |
FromNaviCtrl_Value.SerialDataOkay = 0; |
SPI_RxDataValid = 0; |
SPI_VersionInfo.Major = VERSION_MAJOR; |
SPI_VersionInfo.Minor = VERSION_MINOR; |
SPI_VersionInfo.Patch = VERSION_PATCH; |
SPI_VersionInfo.Compatible = NC_SPI_COMPATIBLE; |
} |
//------------------------------------------------------ |
void SPI_StartTransmitPacket(void) |
{ |
//if ((SLAVE_SELECT_PORT & (1 << SPI_SLAVE_SELECT)) == 0) return; // transfer of prev. packet not completed |
if (!SPITransferCompleted) return; |
// _delay_us(30); |
SLAVE_SELECT_PORT &= ~(1 << SPI_SLAVE_SELECT); // SelectSlave |
SPI_TX_Buffer = (unsigned char *) &ToNaviCtrl; |
ToNaviCtrl.Command = SPI_CommandSequence[SPI_CommandCounter++]; |
if (SPI_CommandCounter >= sizeof(SPI_CommandSequence)) SPI_CommandCounter = 0; |
SPITransferCompleted = 0; |
UpdateSPI_Buffer(); // update buffer |
SPI_BufferIndex = 1; |
//ebugOut.Analog[16]++; |
// -- Debug-Output --- |
//---- |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
ToNaviCtrl.Chksum = ToNaviCtrl.Sync1; |
SPDR = ToNaviCtrl.Sync1; // Start transmission |
// SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
} |
//------------------------------------------------------ |
//SIGNAL(SIG_SPI) |
void SPI_TransmitByte(void) |
{ |
static unsigned char SPI_RXState = 0; |
unsigned char rxdata; |
static unsigned char rxchksum; |
if (SPITransferCompleted) return; |
if (!(SPSR & (1 << SPIF))) return; |
SendSPI = 4; |
// _delay_us(30); |
SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
rxdata = SPDR; |
switch ( SPI_RXState) |
{ |
case 0: |
SPI_RxBufferIndex = 0; |
//DebugOut.Analog[17]++; |
rxchksum = rxdata; |
if (rxdata == 0x81 ) { SPI_RXState = 1; } // 1. Syncbyte ok |
break; |
case 1: |
if (rxdata == 0x55) { rxchksum += rxdata; SPI_RXState = 2; } // 2. Syncbyte ok |
else SPI_RXState = 0; |
//DebugOut.Analog[18]++; |
break; |
case 2: |
SPI_Buffer[SPI_RxBufferIndex++]= rxdata; // get data |
//DebugOut.Analog[19]++; |
if (SPI_RxBufferIndex >= sizeof(FromNaviCtrl)) |
{ |
if (rxdata == rxchksum) |
{ |
unsigned char *ptr = (unsigned char *)&FromNaviCtrl; |
memcpy(ptr, (unsigned char *) SPI_Buffer, sizeof(SPI_Buffer)); |
SPI_RxDataValid = 1; |
} |
else SPI_RxDataValid = 0; |
SPI_RXState = 0; |
} |
else rxchksum += rxdata; |
break; |
} |
if (SPI_BufferIndex < sizeof(ToNaviCtrl)) |
{ |
SLAVE_SELECT_PORT &= ~(1 << SPI_SLAVE_SELECT); // SelectSlave |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
SPDR = SPI_TX_Buffer[SPI_BufferIndex]; |
ToNaviCtrl.Chksum += SPI_TX_Buffer[SPI_BufferIndex]; |
// SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
} |
else SPITransferCompleted = 1; |
SPI_BufferIndex++; |
} |
//------------------------------------------------------ |
void UpdateSPI_Buffer(void) |
{ |
signed int tmp; |
cli(); |
ToNaviCtrl.IntegralNick = (int) (IntegralNick / (long)(EE_Parameter.GyroAccFaktor * 4)); |
ToNaviCtrl.IntegralRoll = (int) (IntegralRoll / (long)(EE_Parameter.GyroAccFaktor * 4)); |
ToNaviCtrl.GyroCompass = (10 * ErsatzKompass) / GIER_GRAD_FAKTOR; |
ToNaviCtrl.AccNick = ((int) ACC_AMPLIFY * (NaviAccNick / NaviCntAcc))/4; |
ToNaviCtrl.AccRoll = ((int) ACC_AMPLIFY * (NaviAccRoll / NaviCntAcc))/4; |
NaviCntAcc = 0; NaviAccNick = 0; NaviAccRoll = 0; |
// ToNaviCtrl.User8 = Parameter_UserParam8; |
// ToNaviCtrl.CalState = WinkelOut.CalcState; |
switch(ToNaviCtrl.Command) // |
{ |
case SPI_CMD_USER: |
ToNaviCtrl.Param.Byte[0] = Parameter_UserParam1; |
ToNaviCtrl.Param.Byte[1] = Parameter_UserParam2; |
ToNaviCtrl.Param.Byte[2] = Parameter_UserParam3; |
ToNaviCtrl.Param.Byte[3] = Parameter_UserParam4; |
ToNaviCtrl.Param.Byte[4] = Parameter_UserParam5; |
ToNaviCtrl.Param.Byte[5] = Parameter_UserParam6; |
ToNaviCtrl.Param.Byte[6] = Parameter_UserParam7; |
ToNaviCtrl.Param.Byte[7] = Parameter_UserParam8; |
ToNaviCtrl.Param.Byte[8] = (unsigned char) MikroKopterFlags; |
MikroKopterFlags &= ~(FLAG_CALIBRATE | FLAG_START); |
ToNaviCtrl.Param.Byte[9] = (unsigned char) UBat; |
ToNaviCtrl.Param.Byte[10] =(unsigned char) EE_Parameter.UnterspannungsWarnung; |
ToNaviCtrl.Param.Byte[11] =(unsigned char) eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET]); |
break; |
case SPI_CMD_PARAMETER1: |
ToNaviCtrl.Param.Byte[0] = EE_Parameter.NaviGpsModeControl; // Parameters for the Naviboard |
ToNaviCtrl.Param.Byte[1] = EE_Parameter.NaviGpsGain; |
ToNaviCtrl.Param.Byte[2] = EE_Parameter.NaviGpsP; |
ToNaviCtrl.Param.Byte[3] = EE_Parameter.NaviGpsI; |
ToNaviCtrl.Param.Byte[4] = EE_Parameter.NaviGpsD; |
ToNaviCtrl.Param.Byte[5] = EE_Parameter.NaviGpsACC; |
ToNaviCtrl.Param.Byte[6] = EE_Parameter.NaviGpsMinSat; |
ToNaviCtrl.Param.Byte[7] = EE_Parameter.NaviStickThreshold; |
ToNaviCtrl.Param.Byte[8] = EE_Parameter.NaviOperatingRadius; |
ToNaviCtrl.Param.Byte[9] = EE_Parameter.NaviWindCorrection; |
ToNaviCtrl.Param.Byte[10] = EE_Parameter.NaviSpeedCompensation; |
ToNaviCtrl.Param.Byte[11] = EE_Parameter.NaviAngleLimitation; |
break; |
case SPI_CMD_STICK: |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[0] = (char) tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[1] = (char) tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[2] = (char) tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_NICK]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[3] = (char) tmp; |
ToNaviCtrl.Param.Byte[4] = (unsigned char) Poti1; |
ToNaviCtrl.Param.Byte[5] = (unsigned char) Poti2; |
ToNaviCtrl.Param.Byte[6] = (unsigned char) Poti3; |
ToNaviCtrl.Param.Byte[7] = (unsigned char) Poti4; |
ToNaviCtrl.Param.Byte[8] = (unsigned char) SenderOkay; |
break; |
case SPI_CMD_MISC: |
if(WinkelOut.CalcState > 5) |
{ |
WinkelOut.CalcState = 0; |
ToNaviCtrl.Param.Byte[0] = 5; |
} |
else ToNaviCtrl.Param.Byte[0] = WinkelOut.CalcState; |
ToNaviCtrl.Param.Int[1] = HoehenWert; |
ToNaviCtrl.Param.Byte[1] = EE_Parameter.NaviPH_LoginTime; |
ToNaviCtrl.Param.Byte[4] = EE_Parameter.NaviGpsPLimit; |
ToNaviCtrl.Param.Byte[5] = EE_Parameter.NaviGpsILimit; |
ToNaviCtrl.Param.Byte[6] = EE_Parameter.NaviGpsDLimit; |
break; |
case SPI_CMD_VERSION: |
ToNaviCtrl.Param.Byte[0] = SPI_VersionInfo.Major; |
ToNaviCtrl.Param.Byte[1] = SPI_VersionInfo.Minor; |
ToNaviCtrl.Param.Byte[2] = SPI_VersionInfo.Patch; |
ToNaviCtrl.Param.Byte[3] = SPI_VersionInfo.Compatible; |
ToNaviCtrl.Param.Byte[4] = PlatinenVersion; |
break; |
} |
sei(); |
if(SPI_RxDataValid) |
{ |
if(abs(FromNaviCtrl.GPS_Nick) < 512 && abs(FromNaviCtrl.GPS_Roll) < 512 && (EE_Parameter.GlobalConfig & CFG_GPS_AKTIV)) |
{ |
GPS_Nick = FromNaviCtrl.GPS_Nick; |
GPS_Roll = FromNaviCtrl.GPS_Roll; |
NaviDataOkay = 250; |
} |
if(FromNaviCtrl.CompassValue <= 360) KompassValue = FromNaviCtrl.CompassValue; |
KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180; |
if(FromNaviCtrl.BeepTime > beeptime && !WinkelOut.CalcState) beeptime = FromNaviCtrl.BeepTime; |
switch (FromNaviCtrl.Command) |
{ |
case SPI_KALMAN: |
FromNaviCtrl_Value.Kalman_K = FromNaviCtrl.Param.Byte[0]; |
FromNaviCtrl_Value.Kalman_MaxFusion = FromNaviCtrl.Param.Byte[1]; |
FromNaviCtrl_Value.Kalman_MaxDrift = FromNaviCtrl.Param.Byte[2]; |
FromNaviCtrl_Value.SerialDataOkay = FromNaviCtrl.Param.Byte[3]; |
break; |
default: |
break; |
} |
} |
else |
{ |
// KompassValue = 0; |
// KompassRichtung = 0; |
GPS_Nick = 0; |
GPS_Roll = 0; |
} |
} |
#endif |
/tags/V0.74d/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 |
/tags/V0.74d/timer0.c |
---|
0,0 → 1,429 |
#include "main.h" |
volatile unsigned int CountMilliseconds = 0; |
volatile static unsigned int tim_main; |
volatile unsigned char UpdateMotor = 0; |
volatile unsigned int cntKompass = 0; |
volatile unsigned int beeptime = 0; |
volatile unsigned char SendSPI = 0, ServoActive = 0; |
unsigned int BeepMuster = 0xffff; |
int ServoValue = 0; |
volatile int16_t ServoNickValue = 0; |
volatile int16_t ServoRollValue = 0; |
enum { |
STOP = 0, |
CK = 1, |
CK8 = 2, |
CK64 = 3, |
CK256 = 4, |
CK1024 = 5, |
T0_FALLING_EDGE = 6, |
T0_RISING_EDGE = 7 |
}; |
SIGNAL (SIG_OVERFLOW0) // 8kHz |
{ |
static unsigned char cnt_1ms = 1,cnt = 0; |
unsigned char pieper_ein = 0; |
// TCNT0 -= 250;//TIMER_RELOAD_VALUE; |
if(SendSPI) SendSPI--; |
if(!cnt--) |
{ |
cnt = 9; |
cnt_1ms++; |
cnt_1ms %= 2; |
if(!cnt_1ms) UpdateMotor = 1; |
CountMilliseconds++; |
} |
if(beeptime > 1) |
{ |
beeptime--; |
if(beeptime & BeepMuster) |
{ |
pieper_ein = 1; |
} |
else pieper_ein = 0; |
} |
else |
{ |
pieper_ein = 0; |
BeepMuster = 0xffff; |
} |
if(pieper_ein) |
{ |
if(PlatinenVersion == 10) PORTD |= (1<<2); // Speaker an PORTD.2 |
else PORTC |= (1<<7); // Speaker an PORTC.7 |
} |
else |
{ |
if(PlatinenVersion == 10) PORTD &= ~(1<<2); |
else PORTC &= ~(1<<7); |
} |
if(EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV) |
{ |
if(PINC & 0x10) |
{ |
cntKompass++; |
} |
else |
{ |
if((cntKompass) && (cntKompass < 362)) |
{ |
cntKompass += cntKompass / 41; |
if(cntKompass > 10) KompassValue = cntKompass - 10; else KompassValue = 0; |
} |
// if(cntKompass < 10) cntKompass = 10; |
// KompassValue = (unsigned long)((unsigned long)(cntKompass-10)*720L + 1L) / 703L; |
KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180; |
cntKompass = 0; |
} |
} |
} |
// ----------------------------------------------------------------------- |
unsigned int SetDelay (unsigned int t) |
{ |
// TIMSK0 &= ~_BV(TOIE0); |
return(CountMilliseconds + t + 1); |
// TIMSK0 |= _BV(TOIE0); |
} |
// ----------------------------------------------------------------------- |
char CheckDelay(unsigned int t) |
{ |
// TIMSK0 &= ~_BV(TOIE0); |
return(((t - CountMilliseconds) & 0x8000) >> 9); |
// TIMSK0 |= _BV(TOIE0); |
} |
// ----------------------------------------------------------------------- |
void Delay_ms(unsigned int w) |
{ |
unsigned int akt; |
akt = SetDelay(w); |
while (!CheckDelay(akt)); |
} |
void Delay_ms_Mess(unsigned int w) |
{ |
unsigned int akt; |
akt = SetDelay(w); |
while (!CheckDelay(akt)) if(AdReady) {AdReady = 0; ANALOG_ON;} |
} |
/*****************************************************/ |
/* Initialize Timer 2 */ |
/*****************************************************/ |
// The timer 2 is used to generate the PWM at PD7 (J7) |
// to control a camera servo for nick compensation. |
void TIMER2_Init(void) |
{ |
uint8_t sreg = SREG; |
// disable all interrupts before reconfiguration |
cli(); |
// set PD7 as output of the PWM for nick servo |
DDRD |= (1<<DDD7); |
PORTD &= ~(1<<PORTD7); // set PD7 to low |
DDRC |= (1<<DDC6); // set PC6 as output (Reset for HEF4017) |
HEF4017R_ON; |
// Timer/Counter 2 Control Register A |
// Timer Mode is FastPWM with timer reload at OCR2A (Bits: WGM22 = 1, WGM21 = 1, WGM20 = 1) |
// PD7: Normal port operation, OC2A disconnected, (Bits: COM2A1 = 0, COM2A0 = 0) |
// PD6: Normal port operation, OC2B disconnected, (Bits: COM2B1 = 0, COM2B0 = 0) |
TCCR2A &= ~((1<<COM2A1)|(1<<COM2A0)|(1<<COM2B1)|(1<<COM2B0)); |
TCCR2A |= (1<<WGM21)|(1<<WGM20); |
// Timer/Counter 2 Control Register B |
// Set clock divider for timer 2 to SYSKLOCK/32 = 20MHz / 32 = 625 kHz |
// The timer increments from 0x00 to 0xFF with an update rate of 625 kHz or 1.6 us |
// hence the timer overflow interrupt frequency is 625 kHz / 256 = 2.44 kHz or 0.4096 ms |
// divider 32 (Bits: CS022 = 0, CS21 = 1, CS20 = 1) |
TCCR2B &= ~((1<<FOC2A)|(1<<FOC2B)|(1<<CS22)); |
TCCR2B |= (1<<CS21)|(1<<CS20)|(1<<WGM22); |
// Initialize the Timer/Counter 2 Register |
TCNT2 = 0; |
// Initialize the Output Compare Register A used for PWM generation on port PD7. |
OCR2A = 255; |
TCCR2A |= (1<<COM2A1); // set or clear at compare match depends on value of COM2A0 |
// Timer/Counter 2 Interrupt Mask Register |
// Enable timer output compare match A Interrupt only |
TIMSK2 &= ~((1<<OCIE2B)|(1<<TOIE2)); |
TIMSK2 |= (1<<OCIE2A); |
SREG = sreg; |
} |
//---------------------------- |
void Timer_Init(void) |
{ |
tim_main = SetDelay(10); |
TCCR0B = CK8; |
TCCR0A = (1<<COM0A1)|(1<<COM0B1)|3;//fast PWM |
OCR0A = 0; |
OCR0B = 120; |
TCNT0 = (unsigned char)-TIMER_RELOAD_VALUE; // reload |
//OCR1 = 0x00; |
TIMSK0 |= _BV(TOIE0); |
} |
/*****************************************************/ |
/* Control Servo Position */ |
/*****************************************************/ |
ISR(TIMER2_COMPA_vect) |
{ |
// frame len 22.5 ms = 14063 * 1.6 us |
// stop pulse: 0.3 ms = 188 * 1.6 us |
// min servo pulse: 0.6 ms = 375 * 1.6 us |
// max servo pulse: 2.4 ms = 1500 * 1.6 us |
// resolution: 1500 - 375 = 1125 steps |
#define IRS_RUNTIME 127 |
#define PPM_STOPPULSE 188 |
// #define PPM_FRAMELEN (14063 |
#define PPM_FRAMELEN (1757 * EE_Parameter.ServoNickRefresh) |
#define MINSERVOPULSE 375 |
#define MAXSERVOPULSE 1500 |
#define SERVORANGE (MAXSERVOPULSE - MINSERVOPULSE) |
static uint8_t PulseOutput = 0; |
static uint16_t RemainingPulse = 0; |
static uint16_t ServoFrameTime = 0; |
static uint8_t ServoIndex = 0; |
#define MULTIPLYER 4 |
static int16_t ServoNickOffset = (255 / 2) * MULTIPLYER; // initial value near center positon |
static int16_t ServoRollOffset = (255 / 2) * MULTIPLYER; // initial value near center positon |
if(PlatinenVersion < 20) |
{ |
//--------------------------- |
// 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 |
} |
/tags/V0.74d/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; |
/tags/V0.74d/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; |
} |
/tags/V0.74d/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 |
/tags/V0.74d/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; |
} |
} |
/tags/V0.74d/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 |
/tags/V0.74d/version.txt |
---|
0,0 → 1,258 |
------- |
V0.53 27.04.2007 H.Buss |
- erste öffentliche Version |
V0.53b 29.04.2007 H.Buss |
- der FAKTOR_I war versehentlich auf Null, dann liegt der MikroKopter nicht so hart in der Luft |
V0.53c 29.04.2007 H.Buss |
- es gib ein Menü, in dem die Werte der Kanäle nach Nick, Roll, Gas,... sortiert sind. |
Die angezeigten Werte waren nicht die Werte der Funke |
V0.54 01.05.2007 H.Buss |
- die Paramtersätze können jetzt vor dem Start ausgewählt werden |
Dazu wird beim Kalibrieren der Messwerte (Gashebel oben links) der Nick-Rollhebel abgefragt: |
2 3 4 |
1 x 5 |
- - - |
Bedeutet: Nick-Rollhebel Links Mitte = Setting:1 Links Oben = Setting:2 usw. |
- der Faktor_I für den Hauptregler ist hinzugekommen. Im Heading-Hold-Modus sollte er vergössert werden, was Stabilität bringt |
V0.55 14.05.2007 H.Buss |
- es können nun Servos an J3,J4,J5 mit den Kanälen 5-7 gesteuert werden |
V0.56 14.05.2007 H.Buss |
- es gab Probleme mit Funken, die mehr als 8 Kanäle haben, wenn mehrere Kanäle dann auf Null waren |
- Funken, die nicht bis +-120 aussteuern können, sollten jetzt auch gehen |
V0.57 24.05.2007 H.Buss |
- Der Höhenregler kann nun auch mittels Schalter bedient werden |
- Bug im Gier-Algorithmus behoben; Schnelles Gieren fürhrte dazu, dass der MK zu weit gedreht hat |
- Kompass-Einfluss dämpfen bei Neigung |
- Man kann zwischen Kompass FIX (Richtung beim Kalibrieren) und Variabel (einstellbar per Gier) wählen |
- Der Motortest vom Kopter-Tool geht jetzt |
- Man kann den Parametersätzen einen Namen geben |
- Das Kamerasetting ist unter Setting 2 defaultmässig integriert |
V0.58 30.05.2007 H.Buss |
- Der Höhenregler-Algorithmus wird nun umgangen, wenn der Höhenreglerschalter aus ist |
V0.60 17.08.2007 H.Buss |
- "Schwindel-Bug" behoben |
- Die Poti-Werte werden jetzt auf Unterlauf (<0) überprüft |
- Poti4 zugefügt |
- Es werden jetzt 8 Kanäle ausgewertet |
- Kamera-Servo (an J7) |
- Die Settings müssen überschrieben werden |
V0.61 - V0.63 H.Buss 27.09.2007 |
- Poti 4 und Kanal 8 werden im Menü angezeigt |
- ein paar Kleinigkeiten bei den DefaultKonstanten2 bereinigt |
- Analog.c: Aktuell_ax korrigiert |
- auf 32 Debug-Kanäle erweitert |
- Loopings sind jetzt möglich und einzeln im KopterTool freischaltbar |
- leichte Anpassungen im Gier - Geschwindigkeit und Drift |
- die Hardwareversion V1.1 wird erkannt und das Programm stellt sich auf die geänderte Gyroverstärkung und die geänderten Portpins ein |
- die Software startet nach dem Einschalten schneller, weil der Luftdruckoffset schneller gefunden wird |
- die PPM-Ausgänge liegen wieder an den Pins an |
- Details an der Sensordatenverarbeitung -> es fliegt sich geringfügig anders |
- der MK ist bei wenig Gas nicht mehr so giftig -> soll das Landen vereinfachen |
- I2C-Bus läuft jetzt sicher nach einer Störung wieder an |
- Sticksignale werden präziser ausgewertet |
- Stick-Kanäle werden ans Kopter-Tool übertragen |
- Es muss die Version V1.47 des Kopter-Tool verwendet werden |
- Die Settings werden auf Default zurückgesetzt |
- am Piepen kann man die Fehlerart unterscheiden |
1. einzelnes Piepen beim Einschalten und Kalibrieren |
2. langsames Intervall mindestens 1 Sek -> Empfangsausfall |
3. schnelleres Intervall mindestens 1 Sek -> Akku |
4. sehr schnelles Intervall mindestens 1 Sek -> Kommunikation zu den Reglern gestört |
V0.64 H.Buss 30.09.2007 |
- beim Gieren wurden die Achsen nicht hart genug geregelt |
V0.65a H.Buss 15.10.2007 |
- Integral im Mischer wieder integriert |
- Feinabstimmung im ACC/Gyro Abgleich -> 1/32 & 100 |
- ACC/Gyro Abgleich auch bei HH |
V0.66a H.Buss 3.11.2007 |
- Messwertverarbeitung aus dem Analog-Interrupt entfernt |
- Analogmessung hängt jetzt am FC-Timing |
- Looping-Stick-Hysterese eingebaut |
- Looping-180°-Umschlag einstellbar |
- Achsenkopplung: Gierbewegung verkoppelt Nick und Roll |
- Lageregelung nach ACC-Sensor verbessert |
- zusätzlicher I-Anteil in der Lageregelung verbessert die Neutrallage |
- Gyrodriftkompensation überarbeitet |
- Bug in der Gier-Stick-Berechnung behoben |
- Gyro-Messung auf 1kHz beschleunigt |
V0.67a H.Buss 16.11.2007 |
- der Hauptregler-I-Anteil wirkt jetzt nur noch auf den Winkel (ausser im HH-Mode) |
- Gyro-Acc-Abgleich jetzt wieder in jedem Zyklus |
- Feinabstimmung |
- Beim HH-Modus gab es noch Bugs |
V0.67e H.Buss 29.11.2007 |
- Parameter: Dynamic Stability und Driftfaktor eingeführt |
- Die Namen der Analogwerte werden jetzt zum Koptertool übertragen |
- Kompatibilität zum Koptertool erhöht |
V0.67f H.Buss 04.12.2007 |
- Das Integral des Hauptreglers wird jetzt linear entladen und nicht mehr proportional |
- Schub für Gier wird jetzt auf den Gaswert begrenzt, dadurch steigt der MK nicht mehr beim Gieren. Gier ist allerdings nicht mehr so agressiv |
- Die ACC-Nullwerte können jetzt dauerhaft im EEPROM gespeichert werden (Stick:Vollgas und Gier rechts) |
V0.68a I.Busker 28.12.2007 |
- SPI.c & SPI.h ins Projekt aufgenommen |
SPI-Kommuikation kann in SPI.h aktiviert/deaktivert werden |
V0.68c H.Buss 05.01.2008 |
- Stickauswertung verbessert -> träger und präziser |
- Alle Settings angepasst |
V0.69e H.Buss 05.05.2008 |
- kleinere Bugs beseitigt |
- Schneller Sinkflug jetzt möglich |
- Min- und Maxgas in den Settings geändert |
- Lagewinkel wird jetzt in 0,1 Grad an Kompass und Navi gesendet |
- Kalibrierung für MK3Mag -> Nick unten beim Kalibrieren |
- Kompassroutine um den Ersatzkompass (Gyro unterstützt Kompasswert) erweitert |
V0.69h H.Buss 21.05.2008 |
- STICK_GAIN = 4 eingeführt. Das erhöht die Auflösung der Sollwerte. Stick_P und Stick_I müssen nun um Faktor 4 erhöht werden |
- SenderOkay auch an das Naviboard übertragen |
- Bessere Parameter bei Senderausfall |
V0.69j H.Buss 30.05.2008 |
- Höhere Präzision der Achsenkopplung |
V0.69k H.Buss 31.05.2008 |
- Bug in SPI.C behoben |
- in 0.69h war ein Bug, der zu ungewollten Loopings führen konnte |
V0.69L H.Buss 14.06.2008 |
- feinere Cam-Servo-Auflösung |
V0.70a H.Buss 01.07.2008 |
- Unterstützung der V1.3-Hardware mit automatischem Hardware-Gyro-Abgleich |
V0.70b H.Buss 14.07.2008 |
- flexible Einstellungsmöglichkeit von J16 und J17 (Transistorausgänge) |
- eigene Parameter für GPS-Naviboard |
- eigener Parameter für ExternalControl (war vorher UserParameter1 bzw. 8) |
- neue Parameter im EEPROM-Datensatz: J16Bitmask, J16Timing, ExternalControl, Navi... |
- MikroKopterFlags eingeführt, damit das Navi den Status des MKs kennt |
- KopterTool-Kompatibilität auf 8 erhöht |
V0.70c H.Buss 30.07.2008 |
- Parameter der Datenfusion leicht modifiziert |
- EEPROM-Parameter für Looping-Umschlag angepasst (von 100 auf 85) |
- MaxStick wird auf 100 begrenzt |
V0.70d H.Buss 02.08.2008 |
- Transistorausgänge: das oberste Bit der Blinkmaske (im KopterTool linkes Bit) gibt nun den Zustand des Ausgangs im Schalterbetrieb an |
0.71b: H.Buss 19.10.2008 |
Kommunikation zum Navi erweitert: |
- Beeptime jetzt 32Bit |
- Datenfusion und Driftkopensation wird durch NaviBoard unterstützt |
0.71c: H.Buss 20.10.2008 |
- LoopConfig heisst jetzt BitConfig |
- 3-Fach-Schalter für Höhensteuerung möglich -> kann man mit GPS-Schalter zusammenlegen |
- bei den Settings wurde Setting[0] mit abgespeichert, welches es nicht gab. |
- in Zukunft werden bei neuen EEPROM-Settings die Kanäle von Setting 1 übernommen |
- Variablen NaviWindCorrection, NaviSpeedCompensation, NaviOperatingRadius eingeführt |
0.71f: H.Buss 15.11.2008 |
- Ausschalten der Höhenregelung per Schalter um 0,3 sek verzögert |
- bei der seriellen Übertragung hat die FC jetzt als SlaveAdresse die 1 |
- VersionInfo.NaviKompatibel eingeführt |
- wenn manuell gegiert wird, wird der GyroKompass-Wert auf den Kompasswert gesetzt |
- Luftdruckwert wird an das Navi übertragen |
- Der Baro-Offset wird jetzt nachgeführt, um den Messbereich zu erweitern. Geht nur bei Höhenregler mit Schalter |
- Debugdaten können jetzt mit 'f' gepollt werden |
0.71g: Gregor 09.12.2008 |
- Kommunikation überarbeitet |
Infos hier: http://www.mikrokopter.de/ucwiki/en/SerialCommands |
0.71h: H.Buss 15.12.2008 |
- Freigegebene Version |
- NaviAngleLimitation als Parameter zum Navi implementiert |
- Antwort auf CMD: 't' entfernt |
0.72d: H.Buss 22.01.2009 |
- OCTO als Compilerschalter |
- Unterstützung der FC 2.0 (ME) |
- GYRO_D eingeführt |
- Achsenkopplung jetzt auch auf Nick/Roll-Bewegung |
0.72e: H.Buss 27.01.2009 |
- die 0.72d hatte kein Integral im Gier |
- Parameter eingeführt: |
EE_Parameter.NaviGpsPLimit |
EE_Parameter.NaviGpsILimit |
EE_Parameter.NaviGpsDLimit |
EE_Parameter.NaviPH_LoginTime |
EE_Parameter.AchsKopplung2 |
EE_Parameter.CouplingYawCorrection |
0.72f: H.Buss 28.01.2009 |
- Bug im Ersatzkompass entfernt |
0.72h: H.Buss 05.02.2009 |
- Algorithmen beschleunigt -> Floats durch Fixkomma ersetzt |
- Achsentkopplung weiter verbessert |
- Nick- und Roll im Octo-Mischer auf jeweils vier Motoren aufgeteilt |
0.72i: H.Buss 07.02.2009 |
- Abtastrate von 1kHz auf 2kHz erhöht |
0.72j: H.Buss 09.02.2009 |
- neue Implementierung der Servoausgänge |
0.72k: H.Buss 10.02.2009 |
- Abtastrate auf 5kHz erhöht |
0.72L: H.Buss 13.02.2009 |
- Signalfilterung überarbeitet |
- OCTO2 implementiert |
0.72M: H.Buss 13.02.2009 |
- Code Cleanup |
0.72o: H.Buss 24.02.2009 |
- Abtastrate auf 2kHz |
- HW-Version an Navi |
- neuer Datensatz 'c' -> Lagedaten für 3D-Grafik |
- Auswerteroutine für Spectrum-Satteliten implementiert |
- Kanalsettings werden beim Parameterreset nicht mehr gelöscht |
- die Driftkompensation wird jetzt feiner aufgelöst --> EE_Parameter.Driftkomp muss mal 8 genommen werden |
- die Integrale und ACC-Werte werden jetzt im Scope in ca. 0,1° angezeigt (wie beim NaviBrd) |
0.72p: H.Buss 01.03.2009 |
- Octo3 erstellt |
- Analogwerte umbenannt |
0.73a-d: H.Buss 05.04.2009 |
- MixerTabelle implementiert |
- I2C-Bus auf bis zu 12 Motoren erweitert |
- die Busfehler der BL-Regler werden im Menü angezeigt |
- Revision der MixerTabelle eingeführt |
- MixerTabelle wird bei Parameterreset neu initialisiert |
- Motortest auf [12] erweitert |
- Motorschalter nicht mehr 3-Stufig |
0.74a |
- Datenfusion im Flug auch, wenn ACC-Z < 512 |
- Wert für die Luftdruck-Messbereichserweiterung abgefangen |
0.74d |
- Die Driftkompensation ist jetzt dreistufig -> 0,5% pro sekunde zusätzlich eingeführt |
/tags/V0.74d |
---|
Property changes: |
Added: tsvn:logminsize |
+8 |
\ No newline at end of property |