/branches/thjac/V1_13/Dokumentation/Anleitung_V1_13a.doc |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/branches/thjac/V1_13/Dokumentation/Anleitung_V1_13a.pdf |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/branches/thjac/V1_13/FlightCtrl.aps |
---|
0,0 → 1,0 |
<AVRStudio><MANAGEMENT><ProjectName>FlightCtrl</ProjectName><Created>15-May-2007 11:20:41</Created><LastEdit>11-Oct-2007 22:58:54</LastEdit><ICON>241</ICON><ProjectType>0</ProjectType><Created>15-May-2007 11:20:41</Created><Version>4</Version><Build>4, 13, 0, 528</Build><ProjectTypeName>AVR GCC</ProjectTypeName></MANAGEMENT><CODE_CREATION><ObjectFile>default\Flight-Ctrl.elf</ObjectFile><EntryFile></EntryFile><SaveFolder>F:\SVN\MikroKopter\FlightCtrl\branches\V0.64_ZeroWarnings\</SaveFolder></CODE_CREATION><DEBUG_TARGET><CURRENT_TARGET>AVR Simulator</CURRENT_TARGET><CURRENT_PART>ATmega644.xml</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND><HIDE>false</HIDE></IO_EXPAND><REGISTERNAMES><Register>R00</Register><Register>R01</Register><Register>R02</Register><Register>R03</Register><Register>R04</Register><Register>R05</Register><Register>R06</Register><Register>R07</Register><Register>R08</Register><Register>R09</Register><Register>R10</Register><Register>R11</Register><Register>R12</Register><Register>R13</Register><Register>R14</Register><Register>R15</Register><Register>R16</Register><Register>R17</Register><Register>R18</Register><Register>R19</Register><Register>R20</Register><Register>R21</Register><Register>R22</Register><Register>R23</Register><Register>R24</Register><Register>R25</Register><Register>R26</Register><Register>R27</Register><Register>R28</Register><Register>R29</Register><Register>R30</Register><Register>R31</Register></REGISTERNAMES><COM>Auto</COM><COMType>0</COMType><WATCHNUM>0</WATCHNUM><WATCHNAMES><Pane0></Pane0><Pane1></Pane1><Pane2></Pane2><Pane3></Pane3></WATCHNAMES><BreakOnTrcaeFull>0</BreakOnTrcaeFull></DEBUG_TARGET><Debugger><Triggers></Triggers></Debugger><AVRGCCPLUGIN><FILES><SOURCEFILE>uart.c</SOURCEFILE><SOURCEFILE>analog.c</SOURCEFILE><SOURCEFILE>eeprom.c</SOURCEFILE><SOURCEFILE>fc.c</SOURCEFILE><SOURCEFILE>GPS.c</SOURCEFILE><SOURCEFILE>main.c</SOURCEFILE><SOURCEFILE>menu.c</SOURCEFILE><SOURCEFILE>printf_P.c</SOURCEFILE><SOURCEFILE>rc.c</SOURCEFILE><SOURCEFILE>timer0.c</SOURCEFILE><SOURCEFILE>twimaster.c</SOURCEFILE><HEADERFILE>uart.h</HEADERFILE><HEADERFILE>_Settings.h</HEADERFILE><HEADERFILE>analog.h</HEADERFILE><HEADERFILE>fc.h</HEADERFILE><HEADERFILE>gps.h</HEADERFILE><HEADERFILE>main.h</HEADERFILE><HEADERFILE>menu.h</HEADERFILE><HEADERFILE>old_macros.h</HEADERFILE><HEADERFILE>printf_P.h</HEADERFILE><HEADERFILE>rc.h</HEADERFILE><HEADERFILE>Settings.h</HEADERFILE><HEADERFILE>timer0.h</HEADERFILE><HEADERFILE>twimaster.h</HEADERFILE></FILES><CONFIGS><CONFIG><NAME>default</NAME><USESEXTERNALMAKEFILE>NO</USESEXTERNALMAKEFILE><EXTERNALMAKEFILE></EXTERNALMAKEFILE><PART>atmega644</PART><HEX>1</HEX><LIST>1</LIST><MAP>1</MAP><OUTPUTFILENAME>Flight-Ctrl.elf</OUTPUTFILENAME><OUTPUTDIR>default\</OUTPUTDIR><ISDIRTY>1</ISDIRTY><OPTIONS><OPTION><FILE>GPS.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>analog.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>eeprom.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>fc.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>main.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>menu.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>printf_P.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>rc.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>timer0.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>twimaster.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>uart.c</FILE><OPTIONLIST></OPTIONLIST></OPTION></OPTIONS><INCDIRS/><LIBDIRS/><LIBS><LIB>libc.a</LIB><LIB>libm.a</LIB></LIBS><LINKOBJECTS/><OPTIONSFORALL>-Wall -gdwarf-2 -Wstrict-prototypes -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -DVERSION_HAUPTVERSION=0 -DVERSION_NEBENVERSION=64 -DVERSION_KOMPATIBEL=5</OPTIONSFORALL><LINKEROPTIONS></LINKEROPTIONS><SEGMENTS/></CONFIG></CONFIGS><LASTCONFIG>default</LASTCONFIG><USES_WINAVR>1</USES_WINAVR><GCC_LOC>C:\Program Files\WinAVR\bin\avr-gcc.exe</GCC_LOC><MAKE_LOC>C:\Program Files\WinAVR\utils\bin\make.exe</MAKE_LOC></AVRGCCPLUGIN><IOView><usergroups/></IOView><Files><File00000><FileId>00000</FileId><FileName>main.c</FileName><Status>1</Status></File00000><File00001><FileId>00001</FileId><FileName>uart.c</FileName><Status>1</Status></File00001><File00002><FileId>00002</FileId><FileName>menu.c</FileName><Status>1</Status></File00002><File00003><FileId>00003</FileId><FileName>timer0.c</FileName><Status>1</Status></File00003><File00004><FileId>00004</FileId><FileName>fc.c</FileName><Status>1</Status></File00004><File00005><FileId>00005</FileId><FileName>fc.h</FileName><Status>1</Status></File00005><File00006><FileId>00006</FileId><FileName>menu.h</FileName><Status>1</Status></File00006><File00007><FileId>00007</FileId><FileName>TWIMASTER.C</FileName><Status>1</Status></File00007><File00008><FileId>00008</FileId><FileName>twimaster.h</FileName><Status>1</Status></File00008><File00009><FileId>00009</FileId><FileName>uart.h</FileName><Status>1</Status></File00009><File00010><FileId>00010</FileId><FileName>_Settings.h</FileName><Status>1</Status></File00010><File00011><FileId>00011</FileId><FileName>analog.h</FileName><Status>1</Status></File00011><File00012><FileId>00012</FileId><FileName>gps.h</FileName><Status>1</Status></File00012><File00013><FileId>00013</FileId><FileName>main.h</FileName><Status>1</Status></File00013><File00014><FileId>00014</FileId><FileName>old_macros.h</FileName><Status>1</Status></File00014><File00015><FileId>00015</FileId><FileName>printf_P.h</FileName><Status>1</Status></File00015><File00016><FileId>00016</FileId><FileName>rc.h</FileName><Status>1</Status></File00016><File00017><FileId>00017</FileId><FileName>Settings.h</FileName><Status>1</Status></File00017><File00018><FileId>00018</FileId><FileName>timer0.h</FileName><Status>1</Status></File00018></Files><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio> |
/branches/thjac/V1_13/GPS.c |
---|
0,0 → 1,32 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
signed int GPS_Nick = 0; |
signed int GPS_Roll = 0; |
signed int GPS_Nick2 = 0; |
signed int GPS_Roll2 = 0; |
long GpsAktuell_X = 0; |
long GpsAktuell_Y = 0; |
long GpsZiel_X = 0; |
long GpsZiel_Y = 0; |
void GPS_Neutral(void) |
{ |
GpsZiel_X = GpsAktuell_X; |
GpsZiel_Y = GpsAktuell_Y; |
} |
void GPS_BerechneZielrichtung(void) |
{ |
GPS_Nick = 0; |
GPS_Roll = 0; |
} |
/branches/thjac/V1_13/Hex-Files/BootLoader_MEGA644_20MHZ_V0_1.hex |
---|
0,0 → 1,64 |
:10F8000011241FBECFEFD0E1DEBFCDBF11E0A0E0DD |
:10F81000B1E0E0EEFBEF02C005900D92A030B10721 |
:10F82000D9F712E0A0E0B1E001C01D92A230B1070B |
:10F83000E1F70C943B7C0C941D7C0895982F8091EB |
:10F84000C00085FFFCCF9093C60008958091C00052 |
:10F850008823E4F78091C600992708958DE40E94DB |
:10F860001E7C8BE40E941E7C82E40E941E7C8CE441 |
:10F870000E941E7C0895CFEFD0E1DEBFCDBFE0E057 |
:10F88000F0E014915F01772474BE98E10FB6F8940C |
:10F8900090936000109260000FBE7092C5008AE2E3 |
:10F8A0008093C4008091C00082608093C0009093D8 |
:10F8B000C10086E08093C200EF01072D8091C00057 |
:10F8C00087FF0DC0013031F48091C6008A3AB1F152 |
:10F8D00000E005C08091C6008B3109F401E0CE0143 |
:10F8E00021968436910528F11F3F41F0112331F014 |
:10F8F000E0910001F091010109951BC01092C50033 |
:10F900008AE28093C4008AE00E941E7C8DE00E94FF |
:10F910001E7C86E50E941E7C80E30E941E7C8EE297 |
:10F920000E941E7C81E30E941E7C8AE30E941E7C52 |
:10F9300005C080E593EC0197F1F7C0CF0E942E7CC3 |
:10F940000E94267C813611F489E547C1813471F427 |
:10F950000E94267CA82EBB24BA2CAA240E94267CB6 |
:10F960009927A82AB92AB694A79406C1823629F401 |
:10F9700089E50E941E7C81E00BC1823409F083C0BE |
:10F980000E94267C9927D82FCC270E94267C992775 |
:10F99000C82BD92B0E94267C082F12E0812E11E063 |
:10F9A000912EEE24FF2464010894811C911CEC1616 |
:10F9B000FD0618F40E94267C01C08FEFD6018C93BF |
:10F9C0000894E11CF11CBFEFEB16F10461F358F34E |
:10F9D000E4E77E1609F0DEC0063409F03DC0FFEF13 |
:10F9E000AF16F7EFBF0608F033C0DE01A5016627AA |
:10F9F0007727440F551F661F771F6A017B01C2E0FE |
:10FA0000D1E001E08991992729913327322F2227CC |
:10FA1000822B932B0C01FA0100935700E8951124D7 |
:10FA20004E5F5F4F6F4F7F4F129761F785E0F60192 |
:10FA300080935700E89507B600FCFDCF81E18093E5 |
:10FA40005700E89576956795579547955A0194C064 |
:10FA500080E00E941E7C90C0053409F08DC0F50145 |
:10FA60009E01A2E0B1E0E1BD8F2F992782BD8D916B |
:10FA700080BD3196FA9AF99AF999FECF215030401B |
:10FA800091F75F0179C0873609F047C00E94267C54 |
:10FA90009927D82ECC240E94267C9927C82AD92AB7 |
:10FAA0000E94267C863411F5E6016501EE24FF24D0 |
:10FAB000CC0CDD1CEE1CFF1CF60105911491802F6F |
:10FAC0000E941E7C812F99270E941E7C82E090E07C |
:10FAD000A0E0B0E0C80ED91EEA1EFB1E229761F717 |
:10FAE000F694E794D794C79456012ACF853409F049 |
:10FAF00027CF7501E1BC8F2D992782BDF89A089414 |
:10FB0000E11CF11C80B50E941E7C0894C108D1083C |
:10FB1000C114D10479F7570113CF853601F594E765 |
:10FB2000791651F580E090E0A0E0B0E023E0FC0120 |
:10FB300020935700E89507B600FCFDCF80509F4FFB |
:10FB4000AF4FBF4F8F3FE7EF9E07E0E0AE07E0E02B |
:10FB5000BE0768F381E180935700E8950DC08534B6 |
:10FB600069F488E190E02CE00FB6F894A8958093B2 |
:10FB700060000FBE209360008DE02FC08035E1F360 |
:10FB80008C34D1F3803711F483E527C0843721F416 |
:10FB90000E941E7C80E021C0843521F40E94267CD6 |
:10FBA000782EEACF8B3109F4C9CE8A3A09F4C6CE51 |
:10FBB000863529F480E30E941E7C81E30EC08337E2 |
:10FBC00041F489E00E941E7C86E90E941E7C8EE141 |
:10FBD00004C08B3109F4B4CE8FE30E941E7CB0CEFA |
:040000030000F80001 |
:00000001FF |
/branches/thjac/V1_13/Hex-Files/Flight-Ctrl_MEGA644_V1_13a.hex |
---|
0,0 → 1,3309 |
:100000000C94C0030C94DB030C94DB030C94DB0313 |
:100010000C94DB030C94DB030C94DB030C94DB03E8 |
:100020000C94DB030C943E150C94DB030C94DB0363 |
:100030000C947D280C94DB030C94DB030C94DB0301 |
:100040000C94DB030C94DB030C94D8130C94DB03AB |
:100050000C94E1080C94DB030C94A8080C94DB03CB |
:100060000C94441A0C94DB030C9438270C94DB0397 |
:100070000C941E5D0C94DB030C94DB03F01AE31A62 |
:10008000D71ABD1AA31A7F1A911ABF1DF31CF01CB0 |
:100090007F1ADD1CC31CA31C831C311CDF1BFC1A34 |
:1000A000AD27A027ED27D127C5275E276F276F270C |
:1000B000762792278D2772277A27762789279627F2 |
:1000C00072277A27762785279B277227FF270A0D15 |
: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 |
:1006E0003131003132005069746368436F6E747247 |
:1006F0006F6C202020004D6F647573202020202017 |
:10070000202020203A202020253273005374616E6F |
:100710006467617320202825303264293A2020251F |
:1007200033690053636877656265676173202020D1 |
:10073000203A2020253369000A0D506C65617365ED |
:1007400020636F6E6E656374205370656B74727591 |
:100750006D20726563656976657220666F722062CE |
:10076000696E64696E67204E4F572E2E2E006F6B98 |
:100770002E0A0D0054696D656F75742E0A0D000008 |
:1007800011241FBECFEFD0E1DEBFCDBF13E0A0E04C |
:10079000B1E0E8EDFBEC02C005900D92AE3DB10773 |
:1007A000D9F719E0AEEDB3E001C01D92A13CB1074D |
:1007B000E1F70C9483040C9400000E94D35A0E9429 |
:1007C000A15E0E94B95F0895282FFB0181508530FA |
:1007D00008F023E0842F9927332721503040829F4F |
:1007E000D001839FB00D929FB00D1124AC59BF4F23 |
:1007F000019724F00E94CE650192FACF08958630C9 |
:1008000038F085E0A2E0B0E0082E0E94DB65089594 |
:100810008823C1F70895582F863048F155E0842F7A |
:100820009927252F332721503040829FD001839F65 |
:10083000B00D929FB00D1124AC59BF4FFB01019731 |
:1008400024F001900E94DB65FACFA2E6B0E0042E0E |
:100850000E94DB65A0E5B0E088E0FB01182E0E9455 |
:10086000E765852F0E94FF030E94D35A08958823CD |
:10087000B1F60895CF93A2E0B0E00E94CE65802D3E |
:10088000C82F8150853020F0C3E08C2F0E94FF03D9 |
:100890008C2F9927CF91089580919008E82FFF27FA |
:1008A000EE0FFF1FE25AF74F808191818D5E9F4FBF |
:1008B00014F010920201808191818A5B9F4F24F491 |
:1008C00080910201882319F020912B0715C081E047 |
:1008D0008093020120912B07280F20932B072530AE |
:1008E00038F088EE93E0909302048093010404C0F2 |
:1008F000822F0E94B52BE8CF822F99279093F9077A |
:100900008093F8070895CFEFD0E1DEBFCDBF14B8D4 |
:1009100015B807EE13E00253104017FFFCCF08EEA6 |
:1009200013E0189B6DC1199B76C12DE02093010146 |
:1009300081E887B93E9A8FEF88B98BE184B981E06D |
:1009400085B98EE38AB9579A87E48BB9469A84B7FA |
:10095000877F84BF809160008861809360001092DF |
:10096000600080ED97E09093020480930104109260 |
:100970007104109270041092630810926208109231 |
:10098000730410927204109275041092740424314E |
:1009900008F43CC188E894E0A0E0B0E080938503CF |
:1009A00090938603A0938703B09388032A3009F4B9 |
:1009B00062C1243109F45FC1289A0E9427150E9460 |
:1009C000F7140E94180E0E9468280E9412190E94B3 |
:1009D000F7260E94155778948EEC90E09F938F93A2 |
:1009E0001F920E9443110F900F900F9081E690E0AC |
:1009F0009F938F938DE090E09F938F9381E090E0A1 |
:100A00009F938F93809101016AE00E945E65892F18 |
:100A100099279F938F93809101010E945E6599278A |
:100A20009F938F9384EF90E09F938F931F920E94E8 |
:100A300043118091C8002DB73EB7235F3F4F0FB6DB |
:100A4000F8943EBF0FBE2DBF803209F40CC18091D7 |
:100A500001018C3008F0D8C0299A49E060E978E0BB |
:100A600083E00E94E403C8EED3E0DE010E94CE657D |
:100A7000802D813009F4D1C088E291E09F938F935B |
:100A80001F920E9443110F900F900F9020E835E0C5 |
:100A9000F9018FE0158616861786108A81503496E4 |
:100AA00087FFF8CF80E480938D0580938E051092A8 |
:100AB0008F05809390058093910590EC909392051B |
:100AC0001092930580939405809395051092960556 |
:100AD00090939705909398058093990510929A05A5 |
:100AE00080939B0590939C0581E08093800541E86D |
:100AF00055E08BE0E3E0F1E0DA0101900D928A9598 |
:100B0000E1F78DE4DE01F901182E0E94E76580917E |
:100B1000840399279F938F935F934F9389E491E088 |
:100B20009F938F931F920E9443112DB73EB7295F69 |
:100B30003F4F0FB6F8943EBF0FBE2DBF8AE691E03F |
:100B40009F938F931F920E94431110924204109220 |
:100B500005040E9495390F900F900F908091050425 |
:100B60008823E1F310924204EE24FF24ECE7CE2E1A |
:100B7000E1E0DE2E109205040E9495398091050473 |
:100B80008823E1F3F701EE5AF74F8081882309F0BB |
:100B900074C0E70121967E012C9760F3EE24FF24B8 |
:100BA00070E8C72E71E0D72E22C0F701EE0FFF1FAD |
:100BB000EE0FFF1FE058FA4F85851816F4F4E70191 |
:100BC0002196DF93CF93DF92CF929F930E944311A0 |
:100BD0000F900F900F900F900F9086E398E0E80E23 |
:100BE000F91ED7011C927E012C9708F055C0F70121 |
:100BF000EE5AF74F90819923C1F2E7012196EDCF8C |
:100C0000199B2FC024E192CE299827CF8BE095E045 |
:100C1000A0E0B0E0C3CE2BE089CEA1E0B0E00E941E |
:100C2000CE65802D8F3F09F427CF1092840320E8F2 |
:100C300035E08DE4DE01F901182E0E94D665909111 |
:100C40008403F9013D962FE08081349618160CF448 |
:100C50009F5F215027FFF8CF9093840341E855E030 |
:100C600056CF2AE063CE8091CA00863009F0EFCEDD |
:100C70000E94255CECCE2898A0CEE7012196DF9358 |
:100C8000CF93DF92CF921F920E9443110F900F904B |
:100C90000F900F900F907FCF8EE991E09F938F93ED |
:100CA0001F920E9443110F900F900F90A1E0B0E0AF |
:100CB0000E94CE65802D8B3409F057C1A4E0B0E0CE |
:100CC0000E94CE65802D853008F037C20E943A041C |
:100CD0004DE560E978E00E94E4030E943A04992718 |
:100CE0009F938F9382E292E09F938F931F920E9433 |
:100CF0004311809198080F900F900F900F900F90D4 |
:100D000080FDF7C10E94F136809101018A3009F41B |
:100D1000EEC1843109F4EBC1289A80ED97E09093FD |
:100D200002048093010485E580932D078FE592E00E |
:100D30009F938F931F920E944311809198080F9068 |
:100D40000F900F9082FFF6C18BE692E09F938F93F6 |
:100D50001F920E9443110F900F900F9089E892E02C |
:100D60009F938F931F920E9443110E94DD030E9464 |
:100D70008B1E88E893E19093A8038093A70381E0FA |
:100D800080932C070F900F900F908091050488237B |
:100D900009F48EC080911803882309F489C0109249 |
:100DA000050480912B07882309F48AC00E944C0413 |
:100DB0000E949539209101012A3009F48AC024311A |
:100DC00009F487C0289A80910E03882309F487C00C |
:100DD000815080930E0380917604882329F08091BE |
:100DE000760481508093760480914E05882369F0C3 |
:100DF000815080934E05882341F410924C05109247 |
:100E00004B0510924A05109249058091A7039091D5 |
:100E1000A80301979093A8038093A7038091A70349 |
:100E20009091A803892B29F080914104882309F42B |
:100E300065C08091A7039091A803892B09F464C031 |
:100E400080911103909112038F5F9F4F09F46CC042 |
:100E500080910504882321F080916D04882311F48A |
:100E60000E94540E0E94400BC8010E94C4148823A3 |
:100E7000E9F08091A908282F3327809126039091CB |
:100E800027038217930744F4809111039091120372 |
:100E90008F5F9F4F09F45CC00E94B15984E080933A |
:100EA000000484E190E00E94BB148C010E94EA5A85 |
:100EB00080910004882309F068CF0E94F55965CF1E |
:100EC0000E94AF3D0E949539209101012A3009F01E |
:100ED00076CF289880910E03882309F079CF8093EC |
:100EE0003707109256041092550410925404109231 |
:100EF000530410925204109251046DCF2A3031F1F4 |
:100F0000243121F1289AA4CF0E940D2785E090E09A |
:100F10009093A8038093A7038091110390911203EB |
:100F20008F5F9F4F09F094CF80916D04882309F45F |
:100F30008FCF80E197E2909302048093010480E8D0 |
:100F400090E0909312038093110382CF289880CF72 |
:100F500080E797E1909302048093010480E093E09E |
:100F6000909312038093110397CF0E948E2984ECF3 |
:100F700091E09F938F931F920E94431151E0952E11 |
:100F80000F900F900F90C0E5D0E07E010894E11C17 |
:100F9000F11C42E0C42ED12CCC0EDD1E33E0A32E7A |
:100FA000B12CAC0EBD1E24E0622E712C6C0E7D1E89 |
:100FB00095E0492E512C4C0E5D1E86E0282E312CDA |
:100FC0002C0E3D1EE2E09E1609F48BC0F3E09F1646 |
:100FD00009F48AC023E0291508F483C08091010137 |
:100FE000843168F085E08093A8081092C0088BE1F6 |
:100FF0008093A4088EE48093BD088093BE08DE0130 |
:101000000E94CE65802D8C3008F068C0D7010E9408 |
:10101000CE65802D8C3008F061C0D6010E94CE656F |
:10102000802D8C3008F05AC0D5010E94CE65802DED |
:101030008C3008F053C0DE010E94CE65802D809375 |
:101040009008D7010E94CE65802D80939108D6012B |
:101050000E94CE65802D80939208D5010E94CE65B6 |
:10106000802D80939308D3010E94CE65802D8093BC |
:101070009408D2010E94CE65802D80939508D101FD |
:101080000E94CE65802D80939608A7E5B0E00E946F |
:10109000CE65802D8093970831E0931651F483ED4F |
:1010A00091E09F938F931F920E9443110F900F9096 |
:1010B0000F904DE560E978E0892D0E940B04939430 |
:1010C00095E0991508F07ECF83E00E94FF038BE442 |
:1010D000A1E0B0E0082E0E94DB65F0CD0E947529EA |
:1010E000E8CF0E943E2A7ACF0E94F02A77CF289834 |
:1010F00014CE8AE392E09F938F931F920E94431134 |
:1011000088EE93E00E94BB148C010E9418190F9086 |
:101110000F900F90C8010E94C4148823D9F38AE568 |
:1011200092E09F938F931F920E9443110F900F9014 |
:101130000F90E8CD87E792E009CE8BE092E09F9395 |
:101140008F931F920E9443110F900F900F90BECD6E |
:101150001F920F920FB60F9211248F939F93EF93CC |
:10116000FF93809110038823A9F48091F10390915B |
:10117000F2030196FC01E352FA4FE081ED3079F081 |
:101180008639910561F09093F2038093F103E09327 |
:10119000C6000EC01092F2031092F10309C0109223 |
:1011A000F2031092F10381E080931003E093C600F4 |
:1011B000FF91EF919F918F910F900FBE0F901F9015 |
:1011C00018951F920F920FB60F9211242F933F93F1 |
:1011D0004F935F938F939F93AF93BF93EF93FF933F |
:1011E00090E08091C6008093E9035091F70356394F |
:1011F00010F09093F8038091E9038D3091F02091E5 |
:10120000F803822F99278130910509F46AC0823052 |
:1012100091050CF48CC0029709F47DC01092F8037C |
:10122000A6C02091F803223061F79093F803852F30 |
:101230009927865C984FFC01329740812091F303F7 |
:101240003091F403241B3109DC0111978C91281B88 |
:101250003109C9019F709093F4038093F303002434 |
:10126000880F991F001C880F991F001C892F902D33 |
:10127000982F935C9093F5032F733070235C209329 |
:10128000F6038081891709F46CC090E08091E60331 |
:101290008F5F8093E6038091E803882309F067C09D |
:1012A000992309F464C081E08093E803580F5093B8 |
:1012B000E5035150E52FFF27E65CF84F8DE0808372 |
:1012C00080913C07823509F052C088E190E02CE023 |
:1012D0000FB6F894A895809360000FBE209360002D |
:1012E00046C02F5F2093F803E52FFF27E65CF84FF9 |
:1012F0008091E90380835F5F5093F7032091E903B6 |
:101300008091F3039091F403820F911D9093F40365 |
:101310008093F3032CC0E52FFF27E65CF84F809104 |
:10132000E9038083563938F31092F803E7CF892B0D |
:1013300009F074CF8091E903833259F08091E90379 |
:1013400080933A0781E08093F7038091E90399271E |
:10135000DDCF8091E803882389F781E08093F8034B |
:10136000EDCF8C91821709F090CF91E094CFFF914F |
:10137000EF91BF91AF919F918F915F914F913F916D |
:101380002F910F900FBE0F901F901895AC01A0E009 |
:10139000B0E09D01A817B90748F4EDEDF5E08191A3 |
:1013A000280F311D1196A417B507C8F33F70FD0132 |
:1013B000E352FA4FC9010024880F991F001C880FBF |
:1013C000991F001C892F902D835C80831196FD014D |
:1013D000E352FA4F2F733070822F835C8083A252C6 |
:1013E000BA4F8DE08C93109210038091DD058093AD |
:1013F000C6000895BF92CF92DF92EF92FF920F93B3 |
:101400001F93CF93DF93CDB7DEB72C859D857E8567 |
:10141000BB2483E28093DD059F599093DE052093E2 |
:10142000DF0503E010E0772309F4ADC0CF84D8884E |
:1014300043E1E42EF12CEC0EFD1EA989BA8971500E |
:10144000109709F4A0C0109709F43CC0F601EB0D09 |
:10145000F11DB3949081119789F47723A1F1F701DD |
:1014600022E030E0E20EF31ED701C080D180E20E10 |
:10147000F31E0D90BC91A02DBB247150109719F153 |
:10148000F601EB0DF11DB3944081119709F466C08C |
:101490001097D1F0F601EB0DF11DB3946081119717 |
:1014A000A1F4772391F0F7013296D701CD90DC902B |
:1014B00032E0E32EF12CEE0EFF1EA081B181BB24A1 |
:1014C000715003C090E040E060E0F801E352FA4F51 |
:1014D000892F86958695835C80830F5F1F4FF80167 |
:1014E000E352FA4F892F99278370907082959295D5 |
:1014F000907F9827807F982755279A0132952295CB |
:101500002F7023273F702327822B835C80830F5FFC |
:101510001F4FF801E352FA4F4F705070440F551FA0 |
:10152000440F551F862F99270024880F991F001CF0 |
:10153000880F991F001C892F902D842B835C80833A |
:101540000F5F1F4FF801E352FA4F6F73635C6083C4 |
:101550000F5F1F4F109709F076CF15C0772309F45E |
:10156000B3CFF701A2E0B0E0EA0EFB1ED701C080C6 |
:10157000D18022E030E0E20EF31E0D90BC91A02D50 |
:10158000BB24715085CFC8010E94C609DF91CF915D |
:101590001F910F91FF90EF90DF90CF90BF90089533 |
:1015A000A3E07A2F4091E503465009F45FC0E72F8E |
:1015B000FF27E65CF84F80818D537F5FE72FFF2781 |
:1015C000E65CF84F20812D537F5FE72FFF27E65C15 |
:1015D000F84F30813D537F5FE72FFF27E65CF84FE0 |
:1015E00060816D537F5F9927880F991F880F991F1E |
:1015F000522F52955F70582B822F99278F709070C1 |
:1016000082959295907F9827807F9827232F269503 |
:101610002695282B832F9927837090700024969508 |
:1016200087950794969587950794982F802D682B1A |
:1016300041504F3FD9F0EA2FFF27E65CF84F508327 |
:10164000AF5F41504F3F91F0EA2FFF27E65CF84F24 |
:101650002083AF5F41504F3F49F0EA2FFF27E65C00 |
:10166000F84F6083AF5F442309F0A1CF8DE397E08B |
:101670009093E4038093E303A350A093E2030895BF |
:10168000CF93DF93CDB7DEB722970FB6F894DEBFC6 |
:101690000FBECDBF8091E803882309F4ACC20E943D |
:1016A000D00A80913B07823609F471C080913C07D3 |
:1016B00099278436910509F457C08536910584F53C |
:1016C0008136910509F44EC1823691050CF4C2C0F1 |
:1016D0008236910509F49AC183369105C1F480914F |
:1016E000DE039091DF03892B09F04CC2A091E30344 |
:1016F000B091E4039C91992309F03AC29C918AE04D |
:10170000989FC00111249093DF038093DE03109211 |
:10171000E8031092E4031092E3031092E2036BC219 |
:101720008C36910509F410C18D3691050CF0B3C0CB |
:101730008736910509F42BC18836910541F78FEF63 |
:1017400080930E03E091E303F091E4038081909194 |
:101750003C04892B80933C04882311F01092EA0307 |
:1017600081E08093EE03D3CFE091E303F091E403B3 |
:1017700090818AE0989FC001112490930C0380937C |
:101780000B03892B21F281E08093ED03C0CF809180 |
:101790003C0799278037910509F4F2C081379105FC |
:1017A0000CF485C08337910509F45BC1843791053A |
:1017B0000CF03CC18137910509F078CFA091E3038B |
:1017C000B091E4038C918F3F09F409C28C91882376 |
:1017D00009F000C281E08C93A091E303B091E4038F |
:1017E0004DE560E978E08C910E94E403809110035C |
:1017F0008823E1F3E091E303F091E403808189839E |
:101800008BE48A838DE590E09F938F9380E998E045 |
:101810009F938F9321E030E03F932F93CE01029668 |
:101820009F938F933F932F93CE01820F931F9F938C |
:101830008F9383E08F9381E08F9381E58F930E9454 |
:10184000FA09ADB7BEB71F960FB6F894BEBF0FBE6C |
:10185000ADBF2CCF8B34910509F059CFE091E30354 |
:10186000F091E403808191819093890480938804AE |
:101870002091860430918704821B930B845E9D4FD8 |
:1018800068E671E00E947E65845B904090938504D9 |
:10189000809384043CCF8437910509F47CC086375B |
:1018A000910509F034CF81E08093EC0330CF8D3681 |
:1018B000910529F18E3691050CF093C08B3491057A |
:1018C00009F0F4CEA091E303B091E4038D919C91D3 |
:1018D0009093890480938804209186043091870432 |
:1018E000821B930B845E9D4F68E671E00E947E65CB |
:1018F000845B90409093850480938404D7CE80913C |
:1019000010038823E1F3A091E303B091E4039C91D9 |
:10191000913009F43CC1198281E090E09F938F934C |
:10192000CE0101969F938F9381E08F938F938DE4E7 |
:101930008F930E94FA098DB79EB707960FB6F89459 |
:101940009EBF0FBE8DBFB2CE8FEF80930E03E0918E |
:10195000E303F091E403808180933D0481E0809370 |
:10196000EF03D5CEE091E303F091E403E081E032B0 |
:1019700058F08FE180930F038FEF80930E03C7CE53 |
:1019800081E08093EB0392CEE0930F03F5CF81E0EB |
:101990008093F003BCCE8091E503853108F4D7C075 |
:1019A000E091E303F091E40380E1A5E1B7E0019069 |
:1019B0000D928A95E1F7809110038823E1F31F923D |
:1019C00080910D038F9384E58F930E94FA098AEF2B |
:1019D0008093E0038FEF80930E030F900F900F9092 |
:1019E00096CE8E36910509F061CE80911003882342 |
:1019F000E1F38DE490E09F938F9380E895E09F93CF |
:101A00008F9381E08F938F938EE492CFA091E30325 |
:101A1000B091E4038BE0EDE2F7E00D9001928A953E |
:101A2000E1F78091360780931208A6CF843791059D |
:101A300009F03CCE8091E503853108F4B9C0A0914E |
:101A4000E303B091E40380E1E5E1F7E00D9001925A |
:101A50008A95E1F780EF8093E0038FEF80930E0388 |
:101A600025CE2091E3033091E403F9018081815078 |
:101A7000853018F481818B34E9F01982809110034C |
:101A80008823E1F381E090E09F938F93CE0101964C |
:101A90009F938F9381E08F938F9383E58F930E9421 |
:101AA000FA09EDB7FEB737960FB6F894FEBF0FBE32 |
:101AB000EDBFFCCD60E978E08DE52E5F3F4FDB01A7 |
:101AC000F901982F01900D929A95E1F7225030403C |
:101AD000482FD9018C910E940B048091BD08992751 |
:101AE000AA27BB27BC01CD0124EC39E040E050E03F |
:101AF0000E943F65DC01CB018093A1039093A20378 |
:101B0000A093A303B093A4038091BE089927AA27AA |
:101B1000BB27BC01CD010E943F65DC01CB01809356 |
:101B20009D0390939E03A0939F03B093A003E09125 |
:101B3000E303F091E40380810E94FF030E943A04D2 |
:101B400089830E94DD0389810E94B52B97CFE091A4 |
:101B5000E303F091E40380819181A281B3818093BA |
:101B6000150790931607A0931707B093180723CF74 |
:101B70008AE0989FC00111240E94BB149093DC0559 |
:101B80008093DB05A091E303B091E403B7CD40E877 |
:101B900055E08DE4FA01282F0D9001922A95E1F786 |
:101BA000A8EEB3E0FA01182E0E94E7659983B4CE3F |
:101BB000A091E303B091E4038D919D910D90BC91B0 |
:101BC000A02D8093150790931607A0931707B09345 |
:101BD000180740CF863008F403CE85E0FCCD0E9484 |
:101BE0003A04E091E303F091E4038083A091E303DE |
:101BF000B091E403EBCD22960FB6F894DEBF0FBE92 |
:101C0000CDBFDF91CF910895CF93C82F8A3029F0AF |
:101C10008091C00085FFFCCF04C08DE00E94040EBF |
:101C2000F7CFC093C60080E090E0CF91089508956B |
:101C300088E18093C1008091C00082608093C000E1 |
:101C40008091C10080688093C1008091C100806450 |
:101C50008093C1008AE28093C40080910B0390912D |
:101C60000C030E94BB1490930A07809309078CED24 |
:101C700090E00E94BB14909339078093380710922C |
:101C80000B078AE480930C0784E080930F078AE0B7 |
:101C900080930D0781E080930E071092E403109269 |
:101CA000E3031092E2030895EF92FF920F931F93C4 |
:101CB00080911003882309F478C28091EE03882371 |
:101CC00009F082C08091EF03882329F080911003EE |
:101CD000882309F07FC18091EC03882329F080914B |
:101CE0001003882309F05BC18091F003882329F059 |
:101CF00080911003882309F036C1809138079091B4 |
:101D000039070E94C414882329F080911003882386 |
:101D100009F0C8C080910B0390910C03892B09F046 |
:101D200084C18091ED03882329F0809110038823DA |
:101D300009F00FC28091DE039091DF03892B09F037 |
:101D40007EC120910F032F3F59F180E190E09F93D6 |
:101D50008F93822F992782959295907F9827807FE5 |
:101D60009827855F9E4F9F938F9381E090E09F938C |
:101D70008F938FE093E09F938F9382E08F9381E026 |
:101D80008F9381E48F930E94FA098FEF80930F0362 |
:101D90008DB79EB70B960FB6F8949EBF0FBE8DBF42 |
:101DA00080911208882329F080911003882309F07C |
:101DB0005EC08091EB03882309F4F7C18091100382 |
:101DC000882309F4F2C139C080911003882309F4F3 |
:101DD00079CF0E94941E84E190E09F938F9390911D |
:101DE000EA0384E1989FC0011124875D9C4F9F9373 |
:101DF0008F9381E090E09F938F938AEE93E09F937F |
:101E00008F9382E08F9381E08F9388E48F930E9479 |
:101E1000FA098091EA038F5F2DB73EB7255F3F4FE8 |
:101E20000FB6F8943EBF0FBE2DBF843008F4B8C182 |
:101E30001092EA031092EE0345CF86E190E09F9363 |
:101E40008F938EE598E09F938F9381E08F938F938C |
:101E500080E58F930E94FA091092EB038DB79EB72D |
:101E600007960FB6F8949EBF0FBE8DBF9EC181E04E |
:101E700090E09F938F9382E198E09F938F9381E00E |
:101E80008F938F9382E48F930E94FA091092120825 |
:101E90002DB73EB7295F3F4F0FB6F8943EBF0FBE38 |
:101EA0002DBF87CF8091A4089927880F991F880F8D |
:101EB000991F7C010027F7FC0095102F8091C20428 |
:101EC0009091C304A091C404B091C504BC01CD019C |
:101ED000A80197010E94B365309326072093250738 |
:101EE0008091BA049091BB04A091BC04B091BD0450 |
:101EF000BC01CD01A80197010E94B365309328076A |
:101F00002093270780915E048093290780915D04C8 |
:101F100080932A0788E090E09F938F9385E297E073 |
:101F20009F938F9381E08F9383E08F9387E78F93C5 |
:101F30000E94FA0980912B072DB73EB7295F3F4FCA |
:101F40000FB6F8943EBF0FBE2DBF853018F086E067 |
:101F500080932B0783E690E00E94BB14909339078F |
:101F600080933807D7CE8BE090E09F938F938DE2DC |
:101F700097E09F938F9381E08F9380910D038F93D0 |
:101F800087E48F930E94FA091092F0038DB79EB7F1 |
:101F900007960FB6F8949EBF0FBE8DBFAECE8AE0F7 |
:101FA00090E09F938F938BE097E09F938F9381E0D6 |
:101FB0008F938F9386E58F930E94FA091092EC031A |
:101FC0002DB73EB7295F3F4F0FB6F8943EBF0FBE07 |
:101FD0002DBF8ACE0E94941E80E590E09F938F9340 |
:101FE00089E293E09F938F9321E030E03F932F931A |
:101FF00088E293E09F938F933F932F938DE394E038 |
:102000009F938F9383E08F9381E08F938CE48F93E2 |
:102010000E94FA091092EF038DB79EB70F960FB684 |
:10202000F8949EBF0FBE8DBF56CE80910907909148 |
:102030000A070E94C414882309F077CE72CE8091DB |
:10204000DB059091DC050E94C414882309F479CE45 |
:1020500080911003882309F474CE8091A4089927F5 |
:10206000880F991F880F991F7C010027F7FC0095A6 |
:10207000102F8091C2049091C304A091C404B09128 |
:10208000C504BC01CD01A80197010E94B36530933E |
:10209000CE052093CD058091BA049091BB04A09108 |
:1020A000BC04B091BD04BC01CD01A80197010E9400 |
:1020B000B3653093D0052093CF052091540930911A |
:1020C00055094091560950915709DA01C90103E0B9 |
:1020D000880F991FAA1FBB1F0A95D1F7820F931F64 |
:1020E000A41FB51F820F931FA41FB51F2091850346 |
:1020F000309186034091870350918803BC01CD0144 |
:102100000E94B3653093D2052093D1058EE090E014 |
:102110009F938F938DEC95E09F938F9381E08F93A6 |
:102120008F9383E48F930E94FA098091DE0390914C |
:10213000DF030E94BB149093DC058093DB052DB771 |
:102140003EB7295F3F4F0FB6F8943EBF0FBE2DBF7D |
:10215000F8CD82E490E09F938F9380ED97E09F937A |
:102160008F9381E08F938F9384E48F930E94FA0979 |
:102170001092ED038DB79EB707960FB6F8949EBFE9 |
:102180000FBE8DBF80910B0390910C03009709F453 |
:10219000D1CD0E94BB1490930A0780930907CACD42 |
:1021A0008093EA031092EE038DCD1F910F91FF9063 |
:1021B000EF900895982F80911308813031F0892F86 |
:1021C0000E94040E282F33270CC080913E04E82F74 |
:1021D000FF27E75DFC4F90838F5F80933E0421E0F3 |
:1021E00030E0C90108950F931F93CF93DF938C01C3 |
:1021F000EB01672B71F0F80181918F010E94DA10D9 |
:10220000219739F0F80181918F010E94DA1021970E |
:1022100091F7DF91CF911F910F9108950F931F9325 |
:10222000CF93DF938C01EB01672B81F0F8010F5FF7 |
:102230001F4F84910E94DA10219741F0F8010F5F3F |
:102240001F4F84910E94DA10219781F7DF91CF917F |
:102250001F910F910895CF93C82F181634F480E280 |
:102260000E94DA10C1501C16D4F3CF910895CF9379 |
:10227000C82F181634F480E30E94DA10C1501C16DF |
:10228000D4F3CF9108952F923F924F925F926F9225 |
:102290007F928F929F92AF92BF92CF92DF92EF92F6 |
:1022A000FF920F931F93CF93DF93CDB7DEB7E097E5 |
:1022B0000FB6F894DEBF0FBECDBF26968FAD269722 |
:1022C0002896EEADFFAD2897882499245401809379 |
:1022D000130848E4C42ED12CCC0EDD1E7F01C701AB |
:1022E000F7011491112331F0153221F00894E11C0B |
:1022F000F11CF6CFB701681B790B09F095C01123CB |
:1023000009F43DC20894E11CF11C1FA63FA4232C34 |
:102310000FEF39A6F7010894E11CF11C1491153751 |
:10232000C9F1812F80628837A9F1103209F440C0C9 |
:10233000133209F48DC01A3209F479C01D3209F440 |
:1023400076C01B32C9F11E32C9F1103309F48AC0BC |
:10235000812F8153893008F07EC060E070E0CB01AE |
:10236000880F991F880F991F880F991F860F971F35 |
:10237000680F791F610F711D60537040F701089459 |
:10238000E11CF11C1491812F80538A3040F3262EDA |
:10239000153739F630FE3DC0F60184E090E0C80EF6 |
:1023A000D91E80809180A280B380103209F0C0CF06 |
:1023B00089A5882309F0AECF19A7ACCFF7010894FF |
:1023C000E11CF11C14911A3209F451C060E070E074 |
:1023D00014C0CB01880F991F880F991F880F991F70 |
:1023E000860F971F680F791F610F711D6053704032 |
:1023F000F7010894E11CF11C1491812F80538A305D |
:1024000040F3EFEF6F3F7E0714F46FEF7FEF062F7F |
:1024100086CFF60182E090E0C80ED91E80819181BE |
:102420004C01AA24BB2481CF0E940E1168CF1A321E |
:1024300051F4F60182E090E0C80ED91E20802220DF |
:102440000CF068CF219490E1392AEFED3E2262CF63 |
:1024500098E0392A5FCF1836C9F01C36D1F481E0F4 |
:10246000382A58CF34FC56CFF0E23F2A53CFF6013A |
:1024700082E090E0C80ED91E608171819FEF6F3FAE |
:10248000790714F46FEF7FEF062F44CF24E0322A50 |
:1024900041CF133609F44DC1143409F41FC1143669 |
:1024A00009F41CC1193609F419C11F3409F40FC10C |
:1024B0001F3609F40CC1103709F4F9C0133709F4B9 |
:1024C000B2C0153509F4ECC0153709F4E9C0183568 |
:1024D00009F444C0183709F441C0112309F44FC16D |
:1024E000CE0101969DA78CA7198381E0482E19A6DD |
:1024F000632C7724042D5FA4541857FC2DC029A504 |
:10250000222331F10F5F050DC30180739070892B79 |
:1025100009F42FC1222309F027C166FC1BC1C301A6 |
:1025200080739070809709F410C1852D0E94371137 |
:10253000842D992787FD9095BC018CA59DA50E94AF |
:10254000F31064FECCCE822D801B0E942B11C7CECF |
:1025500066FED9CF0E5FD7CF5524D1CFE0E1EEA7ED |
:1025600033FE07C081149104A104B10411F0F0E41A |
:102570003F2A19A60FA707FD02C02FED3222CE0178 |
:1025800089969DA78CA781149104A104B10419F424 |
:102590009FA5992361F1EEA54E2E5524662477243C |
:1025A00018AA84149504A604B70410F0F1E0F8AB5F |
:1025B000C501B401A30192010E949165DC01CB0128 |
:1025C000082F8A30F0F4005DECA5FDA50293FDA76D |
:1025D000ECA7C501B401A30192010E9491654901D4 |
:1025E0005A01F8A9FF23E1F62EA5283079F0632CD3 |
:1025F0007724CE010196482EFCA54F1A28E2420E00 |
:1026000079CF095A183501F70F7DDECF632C772477 |
:1026100063FEEFCF003369F380E3ECA5FDA5829361 |
:10262000FDA7ECA7E6CFF60182E090E0C80ED91E28 |
:102630000190F081E02DFDA7ECA7EF2B81F4FE01C6 |
:102640003196FDA7ECA788E289838EE6818385E732 |
:102650008B838CE68C838D8389E28E831F8207FDBA |
:1026600015C0802F992787FD9095AC0160E070E040 |
:102670008CA59DA50E945864009731F0482EFCA5BA |
:102680004F1A04150CF033CF402E31CFECA5FDA529 |
:1026900001900020E9F731974E2E2CA5421A27CF42 |
:1026A000153511F481E0382A9AE09EA762CFF60131 |
:1026B00082E090E0C80ED91E808191814C01AA244D |
:1026C000BB2490E19EA7E0E43E2A18E752CF1F34D6 |
:1026D00011F4E1E03E2AF8E0FEA74BCF143411F4E8 |
:1026E00091E0392A30FE18C0F60184E090E0C80E6F |
:1026F000D91E80809180A280B380B7FE0AC0B094BA |
:10270000A09490948094811C911CA11CB11C8DE21A |
:1027100089A79AE09EA72ECFF60182E090E0C80E2E |
:10272000D91E808191814C01AA2497FCA094BA2CD7 |
:10273000E4CFFE013196FDA7ECA7F60182E090E020 |
:10274000C80ED91E80818983D0CE822D801B0E9425 |
:102750003711EBCE80E38AA71BA762E070E0CE01C1 |
:102760008A960E94F310DBCE61E070E0CE0189967C |
:10277000F8CF822D801B0E942B1129A5CBCEE0968D |
:102780000FB6F894DEBF0FBECDBFDF91CF911F9182 |
:102790000F91FF90EF90DF90CF90BF90AF909F9000 |
:1027A0008F907F906F905F904F903F902F90089503 |
:1027B0001F920F920FB60F9211242F933F935F93A6 |
:1027C0006F937F938F939F93AF93BF93EF93FF93F9 |
:1027D00080910004882329F0809100048150809327 |
:1027E00000048091080481508F3F09F493C08093C6 |
:1027F00008048091010490910204029700F18091F5 |
:1028000001049091020401979093020480930104C3 |
:1028100080910104909102042091110330911203E0 |
:1028200082239323892B89F0809101018A3009F456 |
:102830008BC0479A8091980883FF8DC010C08FEF9E |
:102840009FEF9093120380931103809101018A30CE |
:1028500009F478C047988091980883FF7CC086B1BE |
:102860009927FC01E071F07084FF0AC08091030495 |
:1028700090910404019690930404809303046BC028 |
:102880008091030490910404892B49F18091030401 |
:10289000909104048A56914010F580910304909120 |
:1028A000040469E270E00E946A65809103049091DB |
:1028B0000404860F971F909304048093030480916F |
:1028C0000304909104040B9708F440C08091030422 |
:1028D000909104040A9790938904809388048091CE |
:1028E0008804909189042091860430918704821B8A |
:1028F000930B845E9D4F68E671E00E947E65845B69 |
:102900009040909385048093840410920404109264 |
:10291000030421C089E080930804809113038F5F32 |
:10292000817080931303882319F481E08093050458 |
:102930008091060490910704019690930704809378 |
:10294000060457CF5A9887CF5A9A85CFF0938904B7 |
:10295000E0938804C4CFFF91EF91BF91AF919F9115 |
:102960008F917F916F915F913F912F910F900FBE4B |
:102970000F901F9018952091060430910704280F9E |
:10298000391FC9010196089520910604309107046A |
:10299000821B930B892F99278695807490700895D8 |
:1029A000CF93DF930E94BB14EC01CE010E94C414AC |
:1029B0008823D9F3DF91CF9108951F93CF93DF93AD |
:1029C0000E94BB14EC011FEC08C0809118038823FF |
:1029D00021F09093180310937A00CE010E94C41442 |
:1029E000982F882391F3DF91CF911F9108959FB77E |
:1029F000F894579A5F983E9A469A8091B0008F70EB |
:102A00008093B0008091B00083608093B00080918B |
:102A1000B1008B738093B1008091B1008B60809383 |
:102A2000B1001092B2008FEF8093B3008091B0009C |
:102A300080688093B000809170008A7F80937000DE |
:102A4000809170008260809370009FBF08958AE03B |
:102A500090E00E94BB149093100480930F0482E0D6 |
:102A600085BD83EA84BD17BC88E788BD86E086BD46 |
:102A700080916E00816080936E0008951F920F9286 |
:102A80000FB60F9211242F933F934F935F936F9341 |
:102A90007F938F939F93AF93BF93CF93DF93EF93E6 |
:102AA000FF93809101018431C0F48091090488234F |
:102AB00009F446C020910A0430910B0441E02F37FD |
:102AC000340708F4CAC08FEF8093B3002F5F304003 |
:102AD00030930B0420930A0492C380910904882345 |
:102AE00049F78091B00086FFDBC08091B0008F7BFA |
:102AF0008093B000E0910E04EE2309F01CC1809198 |
:102B0000B608282F33278DED96E0289FA001299F36 |
:102B1000500D389F500D1124CA0120910C043091A2 |
:102B20000D04821B930B90930B0480930A04109264 |
:102B30000D0410920C04469A81E080930904BACFE8 |
:102B40008091B00086FFD5C08091B0008F7B8093CC |
:102B5000B00089EA93E090930B0480930A0480917B |
:102B6000B4089927880F991F880F991F2091FD039A |
:102B70003091FE032817390754F08091B508992742 |
:102B8000880F991F880F991F8217930724F4909339 |
:102B9000FE038093FD038091C50880FF70C1C09142 |
:102BA000C204D091C304E091C404F091C5048091A3 |
:102BB000BA049091BB04A091BC04B091BD04C81BA1 |
:102BC000D90BEA0BFB0B8091140390911503BC0108 |
:102BD000660F771F680F791F809190039927880FE0 |
:102BE000991F880F991F680F791F77FD21C2CB01AC |
:102BF00095958795959587959093150380931403E4 |
:102C00009093FC038093FB038091DC0880FFD9C084 |
:102C10008091B308682F7727882799279E01AF01F5 |
:102C2000F7FDEDC1A7E05595479537952795AA95EE |
:102C3000D1F70E943F659B01AC0197FD03C2F6E00E |
:102C40005595479537952795FA95D1F78091FB03D0 |
:102C50009091FC03820F931FD8C02F3F310569F07C |
:102C600060F0A9014F5F50404F37510588F480E86C |
:102C70008093B300205830402BCF80910A0480937A |
:102C8000B30010920B0410920A0410920904B7C208 |
:102C90008FEF8093B30050930B0440930A04AFC2AC |
:102CA0008091B00080648093B0008CEB90E09093B2 |
:102CB0000B0480930A0480910C0490910D048454B9 |
:102CC0009F4F90930D0480930C048091FF03882301 |
:102CD00029F080917604853B08F0DAC090910E04CB |
:102CE0009F5F8091B608891708F068C010920E04A3 |
:102CF00023CF8091B00080648093B0008091B608AB |
:102D0000282F33278DED96E0289FA001299F500D95 |
:102D1000389F500D1124CA0120910C0430910D04EC |
:102D2000821B930B90930B0480930A049C0181E017 |
:102D300080930904C3CE89EA93E090930B048093B7 |
:102D40000A048E2F99278130910509F4A3C00297B8 |
:102D500009F47DC1FF27EE0FFF1FE25AF74F808174 |
:102D60009181880F991F20910A0430910B04820FE2 |
:102D7000931F90930B0480930A0420910A043091CE |
:102D80000B0455E02D3D350708F445C18CED95E069 |
:102D900090930B0480930A049C012C5B3040309389 |
:102DA0000B0420930A0480910C0490910D04820F6F |
:102DB000931F90930D0480930C04BECE90930E0449 |
:102DC000BBCE8091B308682F7727882799279E016B |
:102DD000AF01F7FD0FC1E7E055954795379527956A |
:102DE000EA95D1F70E943F659B01AC0197FD25C193 |
:102DF00076E055954795379527957A95D1F7809147 |
:102E0000FB039091FC03821B930B9093FC03809334 |
:102E1000FB032091FB033091FC0380910A04909105 |
:102E20000B04280F391F205032408091FB039091F2 |
:102E3000FC0397FD00C1959587959595879590938F |
:102E4000FC038093FB038091FB039091FC03909320 |
:102E5000FB078093FA0745E02D3D340708F4D4C002 |
:102E60008CED95E090930B0480930A0420910A0462 |
:102E700030910B0430930D0420930C0458CFC09173 |
:102E8000C204D091C304E091C404F091C5049BCE68 |
:102E9000469824CF80911403909115039C01220F32 |
:102EA000331F280F391F809190039927880F991F8E |
:102EB000880F991F280F391F37FD7BC1C9019595D0 |
:102EC0008795959587959093150380931403909318 |
:102ED000FC038093FB038091C50880FF3CC12091D7 |
:102EE000C2043091C3044091C4045091C504809140 |
:102EF000BA049091BB04A091BC04B091BD04281BFE |
:102F0000390B4A0B5B0B8091DC0880FF2DC180914F |
:102F1000B308682F772788279927EA01D90157FD39 |
:102F20005FC127E0D595C795B795A7952A95D1F7A5 |
:102F30009D01AE010E943F659B01AC0197FD4BC115 |
:102F4000F6E05595479537952795FA95D1F78091F5 |
:102F5000FB039091FC03820F931F9093FC038093DB |
:102F6000FB038091B408282F3327220F331F220F31 |
:102F7000331F8091FB039091FC03821793077CF031 |
:102F80008091B508282F3327220F331F220F331FBC |
:102F90008091FB039091FC032817390724F43093A8 |
:102FA000FC032093FB038091FB039091FC03209191 |
:102FB0000A0430910B04820F931F8050924090932B |
:102FC0000B0480930A048091FB039091FC0397FD0E |
:102FD000EEC095958795959587959093FC03809382 |
:102FE000FB038091FB039091FC039093FB0780937C |
:102FF000FA07C3CE21583F4F4F4F5F4FECCE2158B9 |
:103000003F4F4F4F5F4F0ECE51E02737350758F4F3 |
:1030100087E791E027CF81E02737380708F0BDCE5A |
:1030200087E791E0B5CE30930B0420930A041ECFBE |
:103030006D5F7F4FDCCD0396FECE215C3F4F4F4F3F |
:103040005F4FD6CE215C3F4F4F4F5F4FF8CD809101 |
:103050001603909117039C01220F331F280F391F6D |
:10306000205C3E4F37FDB4C0C90195958795959575 |
:10307000879590931703809316039093FA03809398 |
:10308000F9036091BA047091BB048091BC049091E3 |
:10309000BD0497FD98C0F7E095958795779567955E |
:1030A000FA95D1F728EC30E040E050E00E943F650F |
:1030B00097FD84C0272F382F492F552747FD5A9554 |
:1030C0008091F9039091FA03820F931F9093FA0372 |
:1030D0008093F9038091B408282F3327220F331FE0 |
:1030E000220F331F8091F9039091FA0382179307FF |
:1030F0007CF08091B508282F3327220F331F220F31 |
:10310000331F8091F9039091FA032817390724F4AB |
:103110003093FA032093F9038091F9039091FA0315 |
:1031200020910A0430910B04820F931F805092402B |
:1031300090930B0480930A048091F9039091FA0311 |
:1031400097FD3AC095958795959587959093FA0345 |
:103150008093F90312CE2091C2043091C3044091B0 |
:10316000C4045091C504CFCE8091B308682F77274F |
:103170008827992757FD3EC0E7E055954795379535 |
:103180002795EA95D1F70E943F659B01AC0197FD19 |
:103190002CC066E055954795379527956A95D1F7E8 |
:1031A0008091FB039091FC03821B930BD6CE039678 |
:1031B00010CF2D5F3F4F82CE0396C4CF61507F4F1B |
:1031C0008F4F9F4F77CF61587F4F8F4F9F4F63CF68 |
:1031D0002D5F3F4F49CF215C3F4F4F4F5F4FB0CEE8 |
:1031E000A158BF4FCF4FDF4F9CCE215C3F4F4F4F79 |
:1031F0005F4FCFCF21583F4F4F4F5F4FBDCFFF9114 |
:10320000EF91DF91CF91BF91AF919F918F917F917E |
:103210006F915F914F913F912F910F900FBE0F9043 |
:103220001F90189510927C008FEC80937A0008957F |
:10323000EF92FF920F931F93CF93DF9303E010E081 |
:10324000D8010E94CE65802DC82FDD27C531D1055C |
:1032500008F02A97C7BD1092180484E690E00E94F7 |
:10326000DD1480911C0390911D038255934010F44E |
:10327000C0E0D0E0CA3FD105E0F481EBE82E82E067 |
:10328000F82EC7BD82E390E00E94DD14FF92EF921A |
:103290001F920E94431180911C0390911D030F9077 |
:1032A0000F900F908255934020F02196CA3FD10590 |
:1032B00040F3D8010C2E0E94DB65C09321088CE2FC |
:1032C00091E00E94DD14DF91CF911F910F91FF904B |
:1032D000EF900895EF92FF920F931F93CF93DF9398 |
:1032E00000E000931304009312040093110480ED96 |
:1032F00097E00E94BB14EC011CE821E0F22E95EF50 |
:10330000E92E033009F4ABC000E0809124049091D1 |
:1033100025048C5F93400CF091C080911B03815079 |
:1033200080931B0380912204909123048C5F93402F |
:103330000CF079C080911A03815080931A03809118 |
:103340002004909121048C5F93400CF04AC080913E |
:10335000190381508093190388E0809344040E94EC |
:10336000FD2680911B038A3008F055C0F0921304AB |
:103370008AE080931B0380911A038A3008F043C0CF |
:10338000F09212048AE080931A03809119038A3024 |
:1033900098F5F09211048AE0809319038091440417 |
:1033A000882379F0CE010E94C4148823B9F383EBFB |
:1033B00092E09F938F931F920E9443110F900F9062 |
:1033C0000F9010921C088FEC80937A0080911C085B |
:1033D0008823E1F31A3008F447C0115009F091CF67 |
:1033E00048C08091200490912104875094408CF132 |
:1033F000809119038F5FAECF863F80F2F092110467 |
:10340000E0921903CBCF863F08F4BFCFF0921204AD |
:10341000E0921A03BACF863F08F4ADCFF0921304BE |
:10342000E0921B03A8CF809122049091230487503F |
:1034300094408CF080911A038F5F7FCF8091240499 |
:10344000909125048750944044F080911B038F5F36 |
:1034500067CF0F5F81CF0F5F72CF01E063CF1B306B |
:1034600008F452CF19E050CF8AE090E00E94DD14BA |
:10347000B4CF86E490E00E94DD14DF91CF911F91DC |
:103480000F91FF90EF9008951F920F920FB60F9239 |
:103490001124EF92FF920F931F932F933F934F931B |
:1034A0005F936F937F938F939F93AF93BF93CF93CC |
:1034B000DF93EF93FF9320912D04822F9927AA2762 |
:1034C000BB272F5FFC01429740F4E25CFF4FEE0FF9 |
:1034D000FF1F0590F491E02D099410922D0482E0D5 |
:1034E00080932C0480912C0480937C0080912D0487 |
:1034F000882309F4F9C38FEC80937A00F5C32093F5 |
:103500002D048091780090917900209132043091BF |
:103510003304820F931F909333048093320481E02D |
:10352000DFCF20932D048091780090917900209135 |
:10353000300430913104820F931F909331048093B3 |
:10354000300484E0CDCF20932D04809178009091B9 |
:1035500079002091D0043091D104821B930B909379 |
:10356000200880931F0880911F0890912008909355 |
:103570003B0480933A0482E0B3CF20932D048091E2 |
:10358000CE049091CF042091780030917900821B75 |
:10359000930B9093150880931408809114089091D0 |
:1035A0001508909339048093380487E099CF2093CD |
:1035B0002D04809178009091790090932F0480934E |
:1035C0002E0486E08DCF20932D0420917800309139 |
:1035D0007900309331042093300410922C0482CF70 |
:1035E00020932D042091780030917900309333049A |
:1035F0002093320481E074CF10922D0481E08093F7 |
:103600001803809114049091150401969093150469 |
:10361000809314048091780090917900209124087F |
:1036200030912508820F931F9093250880932408DA |
:1036300080911C088F5F80931C0880911C08853046 |
:1036400008F44DCF809124089091250897FD36C34A |
:10365000959587959093250880932408809178000C |
:103660009091790090931D0380931C0310921C0885 |
:103670008091160490911704BC01660F771F629524 |
:103680007295707F7627607F7627681B790B809113 |
:103690009A03482F552780911804282F332727FD98 |
:1036A00030958FEF90E0289F8001299F100D389F63 |
:1036B000100D11248091180890911908800F911F06 |
:1036C0002091240830912508821B930B20916B04D4 |
:1036D00030916C04821B930B489F9001499F300DE1 |
:1036E000589F300D1124620F731F77FDE4C275954A |
:1036F00067957595679575956795759567957595B2 |
:103700006795709317046093160480912408909134 |
:103710002508EC01EE27D7FDE095FE2F20911E0332 |
:1037200030911F034091200350912103DA01C90118 |
:1037300063E0880F991FAA1FBB1F6A95D1F7821BF0 |
:10374000930BA40BB50BC80FD91FEA1FFB1FCE01AB |
:10375000DF010496A11DB11DB7FDA7C243E0B595D9 |
:10376000A795979587954A95D1F780931E039093D7 |
:103770001F03A0932003B093210380911808909118 |
:103780001908800F911F20911E0330911F03409153 |
:10379000200350912103821B930B90936C04809320 |
:1037A0006B04809124089091250897FD7CC2959523 |
:1037B0008795909325088093240882E091CE2093EA |
:1037C0002D042091780030917900809130049091FF |
:1037D0003104280F391F809101018A3009F44DC24C |
:1037E000220F331F220F331F3093310420933004F4 |
:1037F000C90137FD51C29595879595958795959502 |
:1038000087959093230480932204809136049091AD |
:103810003704820F931F97FD44C295958795909327 |
:103820003704809336042091D8043091D904821B48 |
:10383000930B9093230380932203209128043091CB |
:1038400029048091220390912303280F391F37FD0B |
:1038500025C235952795309329042093280483E0C9 |
:103860003FCE20932D0420917800309179008091F3 |
:10387000320490913304280F391F809101018A305E |
:1038800009F4F8C1220F331F220F331F3093330482 |
:1038900020933204C90137FDFDC195958795959513 |
:1038A000879595958795909325048093240480911E |
:1038B000340490913504820F931F97FDE9C19595CB |
:1038C000879590933504809334042091DA043091E5 |
:1038D000DB04821B930B9093250380932403209198 |
:1038E0002A0430912B048091240390912503280F02 |
:1038F000391F37FDCAC13595279530932B04209386 |
:103900002A0481E0EDCD20932D04809178009091E0 |
:1039100079002091D0043091D104821B930B9093B5 |
:10392000200880931F0880911F0890912008209103 |
:103930003A0430913B04820F931F90931D048093AF |
:103940001C0482E0CDCD20932D048091CE04909173 |
:10395000CF042091780030917900821B930B9093D3 |
:1039600015088093140880911408909115082091EF |
:10397000380430913904820F931F90931F04809371 |
:103980001E0487E0ADCD20932D04809101018A3083 |
:1039900009F462C1843109F493C180917800909157 |
:1039A000790020912E0430912F04820F931F909361 |
:1039B00021048093200486E093CD20932D048091F0 |
:1039C0007800909179002091300430913104820F79 |
:1039D000931F909331048093300410922C0482CD75 |
:1039E00020932D0417CE20932D0480917800909180 |
:1039F0007900AA2797FDA095BA2FBC01CD010E949E |
:103A0000C5647B018C018091C8049091C904A09188 |
:103A1000CA04B091CB049C01AD01C801B7010E945A |
:103A20006564DC01CB01BC01CD010E94A864DC010E |
:103A3000CB0190931B0480931A0480911A049091F7 |
:103A40001B0402970CF4BAC08091C8049091C90479 |
:103A5000A091CA04B091CB0420E030E84BE354E4D9 |
:103A6000BC01CD010E94CF648823DCF58091C8049D |
:103A70009091C904A091CA04B091CB042AE037ED1B |
:103A800043EA5CE3BC01CD010E946664DC01CB012A |
:103A90008093C8049093C904A093CA04B093CB0444 |
:103AA00080914B0490914C04845F9140D0F48091BC |
:103AB000C8049091C904A091CA04B091CB042DEC24 |
:103AC0003CEC4CEC5DE3BC01CD010E946664DC0182 |
:103AD000CB018093C8049093C904A093CA04B09307 |
:103AE000CB0481E080931904809178009091790053 |
:103AF000909317088093160880911A0490911B04E4 |
:103B0000AA2797FDA095BA2F20918A0430918B04A3 |
:103B100040918C0450918D04820F931FA41FB51FF8 |
:103B200080938A0490938B04A0938C04B0938D04AB |
:103B300020918A0430918B0440918C0450918D0423 |
:103B400057FD9EC07AE055954795379527957A950C |
:103B5000D1F780918A0490918B04A0918C04B0914C |
:103B60008D04821B930BA40BB50B80938A04909356 |
:103B70008B04A0938C04B0938D0483E0B1CC20938C |
:103B80002D0480912603909127039C01220F331F5F |
:103B9000280F391F809178009091790063E070E0E0 |
:103BA0000E946A65260F371F36952795369527950B |
:103BB000309327032093260385E092CC80911A044A |
:103BC00090911B048F5F9F4F0CF08BCF8091C804A6 |
:103BD0009091C904A091CA04B091CB0420E030E8D0 |
:103BE00049E054E4BC01CD010E94D26418160CF0E7 |
:103BF00078CF8091C8049091C904A091CA04B09173 |
:103C0000CB042AE037ED43EA5CE3BC01CD010E941E |
:103C10006564DC01CB018093C8049093C904A09330 |
:103C2000CA04B093CB0480914B0490914C04845F00 |
:103C3000914008F056CF8091C8049091C904A0919A |
:103C4000CA04B091CB042DEC3CEC4CEC5DE3BC0120 |
:103C5000CD010E9465643BCF8091780090917900FE |
:103C600020912E0430912F04820F931F0196969578 |
:103C700087959DCE220F331F09CE220F331FB4CD5F |
:103C800021503C4F4F4F5F4F5DCF2F5F3F4F33CEA3 |
:103C9000019615CE079601CE0796ADCD2F5F3F4F0B |
:103CA000D8CD0196BACD019682CDCE01DF010B961B |
:103CB000A11DB11D53CD615E7F4F19CD0196C8CCBA |
:103CC000809178009091790020912E0430912F04FA |
:103CD000820F931F2FEF37E0281B390B30932104FD |
:103CE0002093200486E0FCCBFF91EF91DF91CF91F0 |
:103CF000BF91AF919F918F917F916F915F914F9104 |
:103D00003F912F911F910F91FF90EF900F900FBE59 |
:103D10000F901F90189590E2E9E2F3E08FE4919301 |
:103D2000815087FFFCCF08951F9380913D0420911F |
:103D30002803281710F420933D0490913C0490FF31 |
:103D400008C080913D04882309F4E2C0815080932B |
:103D50003D0491FF08C080913D04821709F4D7C14A |
:103D60008F5F80933D04892F992780FF02C081FDDA |
:103D7000CCC00E948B1E90913D049A3008F0A2C0E6 |
:103D800081E180933E04892F99279F938F938AEE38 |
:103D900092E09F938F9381E08F930E9443110F9045 |
:103DA0000F900F900F900F9020913D04822F992734 |
:103DB0008730910509F4AEC1883091050CF08CC0B4 |
:103DC0008330910509F433C2843091050CF0A3C00F |
:103DD0008130910509F499C2823091050CF4FFC23B |
:103DE00010923E048AEA93E09F938F9311E01F9311 |
:103DF0000E94431184E180933E040F900F900F9036 |
:103E00008091C2049091C304A091C404B091C504F0 |
:103E1000B7FD1EC63AE0B595A795979587953A9553 |
:103E2000D1F7BF93AF939F938F9384EB93E09F93CE |
:103E30008F931F930E94431188E280933E048DB7B5 |
:103E40009EB707960FB6F8949EBF0FBE8DBF8091A8 |
:103E5000BA049091BB04A091BC04B091BD04B7FD1D |
:103E6000F2C52AE0B595A795979587952A95D1F73C |
:103E7000BF93AF939F938F9383EC93E09F938F9324 |
:103E80001F930E9443118CE380933E042DB73EB7ED |
:103E9000295F3F4F0FB6F8943EBF0FBE2DBF8091F4 |
:103EA0008804909189049F938F9382ED93E09F9370 |
:103EB0008F931F930E9443110F900F900F900F90BC |
:103EC0000F9091C780E180933E04892F99279F939B |
:103ED0008F938FEE92E05DCF8B30910509F43BC15B |
:103EE0008C3091050CF4C9C08D30910509F41FC5C3 |
:103EF0008D3091050CF42AC30E9709F4AEC52150FC |
:103F00002093280310923D046EC710923D0431CFD8 |
:103F100020933D041ECF8530910509F408C406970F |
:103F20000CF091C310923E0480919108E82FFF2776 |
:103F3000EE0FFF1FE25AF74F808191819F938F937D |
:103F400080919008E82FFF27EE0FFF1FE25AF74FEE |
:103F5000808191819F938F9381E294E09F938F93CF |
:103F600011E01F930E94431184E180933E048DB7BA |
:103F70009EB707960FB6F8949EBF0FBE8DBF809177 |
:103F80009308E82FFF27EE0FFF1FE25AF74F8081BB |
:103F900091819F938F9380919208E82FFF27EE0FD6 |
:103FA000FF1FE25AF74F808191819F938F9381E3A6 |
:103FB00094E09F938F931F930E94431188E2809314 |
:103FC0003E042DB73EB7295F3F4F0FB6F8943EBF72 |
:103FD0000FBE2DBF80919508E82FFF27EE0FFF1F22 |
:103FE000E25AF74F808191819F938F93809194083B |
:103FF000E82FFF27EE0FFF1FE25AF74F80819181D4 |
:104000009F938F9381E494E09F938F931F930E94DB |
:1040100043118CE380933E046DB77EB7695F7F4F99 |
:104020000FB6F8947EBF0FBE6DBF80919708E82F42 |
:10403000FF27EE0FFF1FE25AF74F808191819F9378 |
:104040008F9380919608E82FFF27EE0FFF1FE25A0B |
:10405000F74F808191819F938F9381E594E09F93A7 |
:104060008F931F930E9443118DB79EB707960FB68B |
:10407000F8949EBF0FBE8DBFB6C68930910509F476 |
:104080000BC40A970CF01CC210923E0489E695E01E |
:104090009F938F9311E01F930E94431184E18093BB |
:1040A0003E040F900F900F908091840490918504AE |
:1040B0009F938F9388E795E09F938F931F930E9420 |
:1040C000431188E280933E040F900F900F900F9061 |
:1040D0000F9080918804909189049F938F9387E833 |
:1040E00095E09F938F931F930E9443118CE38093DD |
:1040F0003E040F900F900F900F900F9080918604C8 |
:10410000909187049F938F9386E995E0D0CE10928B |
:104110003D0429CE84E180933E0480912603909152 |
:1041200027039F938F938BE495E09F938F9311E0E8 |
:104130001F930E94431188E280933E040F900F90DA |
:104140000F900F900F908091760499279F938F93F3 |
:104150008AE595E0ACCE10923E0487E096E09F930E |
:104160008F9311E01F930E94431184E180933E04DA |
:104170000F900F900F9080913107992787FD9095B0 |
:104180009F938F9380913007992787FD90959F93F8 |
:104190008F9387E196E09F938F931F930E94431123 |
:1041A00088E280933E048DB79EB707960FB6F894C9 |
:1041B0009EBF0FBE8DBF80913207992787FD9095D6 |
:1041C0009F938F938091330799279F938F9387E2D3 |
:1041D00096E09F938F931F930E9443118CE38093EB |
:1041E0003E042DB73EB7295F3F4F0FB6F8943EBF50 |
:1041F0000FBE2DBF8091370799279F938F93809192 |
:104200003407992787FD90959F938F9387E396E0D6 |
:104210009F938F931F930E9443116DB77EB7695F81 |
:104220007F4F0FB6F8947EBF0FBE6DBFDCC51092F6 |
:104230003E0480916208909163089F938F938091D0 |
:104240006008909161089F938F9381EE93E09F9314 |
:104250008F9311E01F930E94431184E180933E04E9 |
:104260006DB77EB7695F7F4F0FB6F8947EBF0FBE04 |
:104270006DBF80916608909167089F938F9380919E |
:104280006408909165089F938F9381EF93E09F93CB |
:104290008F931F930E94431188E280933E048DB751 |
:1042A0009EB707960FB6F8949EBF0FBE8DBF809144 |
:1042B0006A0890916B089F938F9380916808909102 |
:1042C00069089F938F9381E094E09F938F931F934E |
:1042D0000E9443118CE380933E042DB73EB7295FC3 |
:1042E0003F4F0FB6F8943EBF0FBE2DBF80916E08B2 |
:1042F00090916F089F938F9380916C0890916D08B7 |
:104300009F938F9381E194E083CF8091980880FD03 |
:104310001CC084E180933E0485E993E09F938F93D2 |
:1043200011E01F930E94431188E280933E040F9096 |
:104330000F900F908CE993E09F938F931F930E94AF |
:1043400043110F900F900F904EC510923E04809134 |
:104350006B0490916C049F938F9389E593E09F93F6 |
:104360008F9311E01F930E94431184E180933E04D8 |
:104370000F900F900F900F900F9080916904909183 |
:104380006A049F938F9388E693E09F938F931F9384 |
:104390000E94431188E280933E040F900F900F908B |
:1043A0000F900F9080911C0390911D039F938F930A |
:1043B00087E793E09F938F931F930E9443118CE3B1 |
:1043C00080933E040F900F900F900F900F9080916C |
:1043D000210899279F938F9386E893E068CD892BD6 |
:1043E00009F08DCD10923E0484EF92E09F938F935D |
:1043F00011E01F930E94431184E180933E040F90CB |
:104400000F900F9081E690E09F938F938DE090E066 |
:104410009F938F9381E090E09F938F938091010110 |
:104420006AE00E945E65892F99279F938F93809100 |
:1044300001010E945E6599279F938F9384E093E02A |
:104440009F938F931F930E94431188E280933E04B1 |
:104450002DB73EB7235F3F4F0FB6F8943EBF0FBE58 |
:104460002DBF81E895E09F938F930E943A0499278E |
:104470009F938F9389E193E09F938F931F930E9463 |
:1044800043118091A7039091A8036DB77EB7695F30 |
:104490007F4F0FB6F8947EBF0FBE6DBF069708F42E |
:1044A0007AC490914104992309F46FC48CE38093FA |
:1044B0003E04892F99279F938F9384E393E0F7CC51 |
:1044C00010923E0485ED95E09F938F9311E01F932A |
:1044D0000E94431184E180933E040F900F900F904F |
:1044E0008091900399279F938F938DED95E09F93F3 |
:1044F0008F931F930E94431188E280933E040F9094 |
:104500000F900F900F900F908091FD039091FE03FC |
:104510009F938F938BEE95E09F938F931F930E94B1 |
:1045200043118CE380933E040F900F900F900F90F7 |
:104530000F908091B50899279F938F938091B4082D |
:1045400099279F938F9389EF95E062CE10923E0456 |
:1045500087E496E09F938F9311E01F930E9443118D |
:1045600084E180933E040F900F900F908091390862 |
:1045700099279F938F938091380899279F938F93C2 |
:104580008091370899279F938F93809136089927B8 |
:104590009F938F9387E596E09F938F931F930E943D |
:1045A000431188E280933E048DB79EB70B960FB6F9 |
:1045B000F8949EBF0FBE8DBF80913D0899279F93B1 |
:1045C0008F9380913C0899279F938F9380913B080C |
:1045D00099279F938F9380913A0899279F938F9360 |
:1045E0008CE696E09F938F931F930E9443118CE378 |
:1045F00080933E042DB73EB7255F3F4F0FB6F8942A |
:104600003EBF0FBE2DBF8091410899279F938F9386 |
:104610008091400899279F938F9380913F08992715 |
:104620009F938F9380913E0899279F938F9381E862 |
:1046300096E09F938F931F930E9443116DB77EB7AF |
:10464000655F7F4FEECD10923E0481E195E09F9330 |
:104650008F9311E01F930E94431184E180933E04E5 |
:104660000F900F900F908091D0049091D1049F9360 |
:104670008F9380911C0490911D049F938F938EE1E2 |
:1046800095E09F938F931F930E94431188E280933C |
:104690003E046DB77EB7695F7F4F0FB6F8947EBF5B |
:1046A0000FBE6DBF8091CE049091CF049F938F93E6 |
:1046B00080911E0490911F049F938F938DE295E04B |
:1046C0009F938F931F930E9443118CE380933E042A |
:1046D0008DB79EB707960FB6F8949EBF0FBE8DBFDD |
:1046E0008091C8049091C904A091CA04B091CB04F0 |
:1046F000BC01CD010E94A864DC01CB019F938F9384 |
:104700008091090990910A099F938F938CE395E01A |
:104710009F938F931F930E9443112DB73EB7295F3C |
:104720003F4F0FB6F8943EBF0FBE2DBF5CC3109233 |
:104730003E0481E694E09F938F9311E01F930E94C3 |
:104740004311809101010F900F900F908A3009F46E |
:104750009AC28B3009F4D6C1843109F4D3C18D30AB |
:1047600009F041C384E180933E0480911B039927A3 |
:104770009F938F934091DA045091DB04CA0157FD57 |
:104780002BC395958795959587959595879595953F |
:1047900087959F938F939A0157FD1BC33595279556 |
:1047A000359527953595279580912404909125047A |
:1047B000821B930B9F938F9385ED94E09F938F9330 |
:1047C0001F930E94431188E280933E046DB77EB729 |
:1047D000675F7F4F0FB6F8947EBF0FBE6DBF8091AD |
:1047E0001A0399279F938F934091D8045091D9042D |
:1047F000CA0157FDF6C2959587959595879595952C |
:104800008795959587959F938F939A0157FDE6C25B |
:1048100035952795359527953595279580912204CF |
:1048200090912304821B930B9F938F9389EE94E0C6 |
:104830009F938F931F930E9443118CE380933E04B8 |
:104840008DB79EB709960FB6F8949EBF0FBE8DBF69 |
:104850008091190399279F938F932091D6043091CB |
:10486000D704C90137FDB3C2959587959F938F9360 |
:104870008091200490912104281B390B3F932F93A2 |
:104880008DEF94E09F938F931F930E9443112DB758 |
:104890003EB7275F3F4F45CF10923E0480917D0485 |
:1048A00090917E049F938F9385EA95E09F938F93D9 |
:1048B00011E01F930E94431184E180933E040F9006 |
:1048C0000F900F900F900F9080917B0490917C043B |
:1048D0009F938F9381EB95E09F938F931F930E94FB |
:1048E000431188E280933E040F900F900F900F9039 |
:1048F0000F908091790490917A049F938F938DEB20 |
:1049000095E09F938F931F930E9443118CE38093B4 |
:104910003E040F900F900F900F900F9080917704AE |
:10492000909178049F938F9389EC95E0C0CA109280 |
:104930003E0486E996E09F938F9311E01F930E94B7 |
:10494000431184E180933E040F900F900F9080916B |
:10495000550899278D969F938F9380915408992796 |
:104960008D969F938F938091530899278D969F934F |
:104970008F938091520899278D969F938F9385EA04 |
:1049800096E09F938F931F930E94431188E2809338 |
:104990003E048DB79EB70B960FB6F8949EBF0FBE20 |
:1049A0008DBF8091590899278D969F938F93809101 |
:1049B000580899278D969F938F9380915708992730 |
:1049C0008D969F938F938091560899278D969F93EC |
:1049D0008F9389EB96E09F938F931F930E944311CF |
:1049E0008CE380933E042DB73EB7255F3F4F0FB653 |
:1049F000F8943EBF0FBE2DBF80915A0899278D961F |
:104A00009F938F938DEC96E09F938F931F930E94BB |
:104A100043110F900F900F900F900F9080915B08B3 |
:104A2000882309F022C180915C08882309F00FC116 |
:104A300080915D08882309F4D6C188E480933E0400 |
:104A400083EE96E079CC81509C4FAF4FBF4F09CA9F |
:104A500081509C4FAF4FBF4FDDC910923E0486EE90 |
:104A600096E09F938F9311E01F930E94431184E17E |
:104A700080933E040F900F900F9080916B05E82F6C |
:104A8000FF27EE0FFF1FEB52FC4F808191819F9318 |
:104A90008F9386EF96E09F938F931F930E9443110D |
:104AA0000F900F900F900F900F9080916B058117D2 |
:104AB00009F099C188E280933E0480916D059927A1 |
:104AC0009F938F9380915D0499279F938F938CE0A0 |
:104AD00097E09F938F931F930E9443118CE38093E1 |
:104AE0003E046DB77EB7695F7F4F0FB6F8947EBF07 |
:104AF0000FBE6DBF80916E0599279F938F9383E2C0 |
:104B000097E0D5C984E180933E044091DA04509146 |
:104B1000DB04CA0157FD51C19C0135952795359598 |
:104B200027953595279535952795C90182959295B5 |
:104B3000907F9827807F9827BA01681B790BCB015B |
:104B400077FD39C1959587959F938F933F932F93C9 |
:104B50009A0157FD2DC135952795359527953595A2 |
:104B600027958091240490912504821B930B9F9399 |
:104B70008F9382EA94E09F938F931F930E94431137 |
:104B800088E280933E048DB79EB709960FB6F894DD |
:104B90009EBF0FBE8DBF4091D8045091D904CA0169 |
:104BA00057FD04C19C013595279535952795359579 |
:104BB000279535952795C90182959295907F9827DD |
:104BC000807F9827BA01681B790BCB0177FDECC079 |
:104BD000959587959F938F933F932F939A0157FDB8 |
:104BE000E0C0359527953595279535952795809182 |
:104BF000220490912304821B930B9F938F9384EB49 |
:104C000094E09F938F931F930E9443118CE38093B2 |
:104C10003E048DB79EB709960FB6F8949EBF0FBE9F |
:104C20008DBF2091D6043091D704C90137FDC7C08C |
:104C3000959587959F938F9380912004909121045F |
:104C4000281B390B3F932F9386EC94E061CD84E4CD |
:104C500080933E0480EE96E09F938F931F930E9473 |
:104C600043110F900F900F90E3CE80E480933E04A9 |
:104C70008DED96E09F938F931F930E9443110F90A9 |
:104C80000F900F90D0CE84E180933E044091DA04DF |
:104C90005091DB049A0157FD97C0359527953595BE |
:104CA000279535952795C901880F991F880F991F5A |
:104CB000880F991F481B590B5F934F933F932F9376 |
:104CC0008091240490912504821B930B9F938F93D2 |
:104CD0008FE694E09F938F931F930E94431188E285 |
:104CE00080933E042DB73EB7275F3F4F0FB6F89431 |
:104CF0003EBF0FBE2DBF4091D8045091D9049A01F8 |
:104D000057FD5FC03595279535952795359527959E |
:104D1000C901880F991F880F991F880F991F481B79 |
:104D2000590B5F934F933F932F938091220490915F |
:104D30002304821B930B9F938F9381E894E09F93AE |
:104D40008F931F930E9443118CE380933E046DB7B1 |
:104D50007EB7675F7F4F0FB6F8947EBF0FBE6DBF03 |
:104D60008091D6049091D7049F938F938091D6041D |
:104D70009091D7042091200430912104821B930B41 |
:104D80009F938F9383E994E06AC98CE380933E04F8 |
:104D900089E493E0D1CA8CE380933E0487E293E0F8 |
:104DA000CBCA295F3F4F1DCF019612CF0F96FACE87 |
:104DB000295F3F4FD0CE0196C5CE0F96ADCE01965E |
:104DC00037CF295F3F4F9ECF295F3F4F66CF019678 |
:104DD0004BCD295F3F4FE2CC0F96D3CC295F3F4F9D |
:104DE00017CD0F9608CD10923C041F910895109294 |
:104DF000B9008AE28093B800089585EA8093BC00E8 |
:104E0000089584E98093BC0008951092B9008093BE |
:104E1000BB0085E88093BC0008950E940127109292 |
:104E200044048091BB001092430480E88093BC004E |
:104E30001092BD001092BA001092BB001092B900FF |
:104E40001092B8000E94F7260E94FD2680E00E9482 |
:104E5000052708958093BB0085E88093BC000895E2 |
:104E600085EC8093BC00089585E88093BC0008958C |
:104E70001F920F920FB60F9211242F933F934F93CF |
:104E80005F936F937F938F939F93AF93BF93EF93B2 |
:104E9000FF9380914404282F3327442755278F5FA1 |
:104EA00080934404F90127313105C8F4E05BFF4FDA |
:104EB000EE0FFF1F0590F491E02D099480914204BC |
:104EC000E82FFF27EA5DF74F9091BB0090838F5F3B |
:104ED0008C3008F49DC0109242040E940127109269 |
:104EE0004404E0C080E80E940527DCC088E90E94F5 |
:104EF0000527D8C00E9401278AE090E09093A8037C |
:104F00008093A7030E94FD26CDC084E10E9405275F |
:104F1000C9C082E10E940527C5C080911B030E9481 |
:104F20000527C0C080E10E940527BCC080911A03FC |
:104F30000E940527B7C0809119030E940527B2C0BF |
:104F400080914304E82FFF27E15CF64F8F5F809349 |
:104F5000430480810E940527A5C090914304292F16 |
:104F6000E92FFF27EE0FFF1FEE0FFF1FE058FA4F4C |
:104F7000858518160CF054C09C3009F467C0990F51 |
:104F8000892F8E5A0E9405278DC080914204E82FF8 |
:104F9000FF27EE5BF74F8091BB0080830E94342790 |
:104FA00081C08091B900803409F46EC080914204C0 |
:104FB000E82FFF27EE5AF74F10828F5F8C3068F191 |
:104FC000109242040E9401271092440480914504EB |
:104FD000809341041092450465C08091B9008033EC |
:104FE00009F440C00E9401278AE090E09093A80352 |
:104FF0008093A703109244040E94FD2653C00E9490 |
:1050000001278AE090E09093A8038093A70367CFDD |
:10501000809342040E94012762CF80934204D2CF42 |
:105020009C3008F0A9CF922F9F5FE92FFF27EE0F4A |
:10503000FF1FEE0FFF1FE058FA4F858518161CF072 |
:10504000292F9C3080F39093430496CF1092430411 |
:1050500083E08093440480914204880F8D5A0E941B |
:10506000052720C0809145048823C9F4909143040A |
:1050700090934504E92FFF27EB5CF74F80818F5F0A |
:1050800009F48FEF8083AECF80914204E82FFF2791 |
:10509000EE5AF74F8C5F80830E94302797CF909114 |
:1050A0004304E8CF8091BC0080688093BC00FF91EE |
:1050B000EF91BF91AF919F918F917F916F915F9190 |
:1050C0004F913F912F910F900FBE0F901F90189509 |
:1050D00083EC8093810080916F00806280936F00E9 |
:1050E0001092D7041092D6041092D9041092D804CA |
:1050F0001092DB041092DA0408951F920F920FB6FB |
:105100000F921124EF92FF920F931F932F933F93CF |
:105110004F935F936F937F938F939F93AF93BF93BF |
:10512000CF93DF93EF93FF93209186003091870018 |
:105130008091460490914704281B390B809186008A |
:10514000909187009093470480934604C9018D5441 |
:105150009440835F9A4178F4809148049091490487 |
:10516000049714F010928303C1E0D0E0D093490477 |
:10517000C0934804A3C0C0914804D0914904CA30E8 |
:10518000D1050CF09BC0C9018B5F9040845B9140BE |
:10519000A8F0FE013196F0934904E0934804E5300D |
:1051A000F10509F46DC05D98E630F10509F466C0BB |
:1051B0005C98379709F460C05B9880C0225D3140ED |
:1051C000FE01EC0FFD1FE25AF74F80819181F9013A |
:1051D000E81BF90BCF01F7FD6DC0069754F48091E1 |
:1051E0007604883C08F05FC080917604865F8093E7 |
:1051F0007604FE01EC0FFD1FE25AF74F808191818A |
:10520000AC01440F551F480F591F420F531F57FD44 |
:105210004EC07A01F594E794F594E794C90101969C |
:105220008E159F05BCF50894E108F108809176047D |
:10523000833C40F18E010C0F1D1FF801E25AF74F1D |
:10524000808191819701281B390BC90163E070E0CF |
:105250000E947E65CB01880F991F860F971F0C58FF |
:10526000174FF80191838083FE01EC0FFD1FE25A76 |
:10527000F74FF182E0828DCF5B9A20C05C9A99CF84 |
:105280005D9A92CFFE01EC0FFD1FEC58F74F118293 |
:105290001082EACF21503040E216F3063CF6089423 |
:1052A000E11CF11CC3CF88EC80937604A2CF4D5F44 |
:1052B0005F4FAFCF909581959F4F8FCFFF91EF912B |
:1052C000DF91CF91BF91AF919F918F917F916F911E |
:1052D0005F914F913F912F911F910F91FF90EF9010 |
:1052E0000F900FBE0F901F90189581E0809390084B |
:1052F00082E08093910883E08093920884E0809319 |
:10530000930885E08093940886E08093950887E071 |
:105310008093960888E08093970808951F9388E605 |
:10532000809398083EE1309399088BEF80939B0817 |
:105330008AE080939C0830939A0830939E08E4E0BA |
:10534000E0939D085FE050939F083093A0081CE015 |
:105350001093A10878E07093A20886EE8093A308CA |
:105360003093A40880E88093A50880E58093A60880 |
:1053700026E92093A70883E08093A8088EE5809310 |
:10538000A90883E28093AA083093AB081092AC0876 |
:1053900060E26093AD081092AE081092AF081092D0 |
:1053A000B0081092B1081092C2081092C30810926F |
:1053B000C4081092C50844E64093B20888E280937E |
:1053C000B3081092DC0892E39093B4082093B508D8 |
:1053D00085E08093B6089093B7082AE52093B80833 |
:1053E0009093B9081092DB082093BA0883E4809365 |
:1053F000BB081092BC0885E58093BD088093BE0869 |
:1054000080E18093BF086093C0084093C1088FE596 |
:105410008093C60883EF8093C8085093C7085093C1 |
:10542000C9088DEF8093CA084093CB082093CC081D |
:105430002093CD082093CE088BE48093CF088093EF |
:10544000D0088093D1081092D20886E08093D308C8 |
:105450007093D4082093D5083093D6084093D7088A |
:105460004093D808E093D908A9EAB3E0E1EEF8E068 |
:105470000D9001921A95E1F71F9108951F9388E608 |
:10548000809398085EE1509399088BEF80939B0876 |
:105490008AE080939C0850939A0850939E0893E06A |
:1054A00090939D081CE010939F0880E18093A008D2 |
:1054B00076E07093A10868E06093A20886EE80937E |
:1054C000A3085093A40880E88093A50880E5809302 |
:1054D000A60888E78093A7089093A8088EE5809394 |
:1054E000A90883E28093AA085093AB081092AC08F5 |
:1054F00030E23093AD081092AE081092AF081092CF |
:10550000B0081092B1081092C2081092C30810920D |
:10551000C4081092C50844E64093B20888E280931C |
:10552000B3081092DC0892E39093B40886E9809364 |
:10553000B50885E08093B6089093B7082AE52093D4 |
:10554000B8089093B9081092DB082093BA0883E456 |
:105550008093BB088CE38093BC0885E58093BD08ED |
:105560008093BE083093BF083093C0089BE49093AB |
:10557000C1088FE58093C60883EF8093C80884E153 |
:105580008093C7088093C9088DEF8093CA08409321 |
:10559000CB082093CC082093CD082093CE0890937D |
:1055A000CF089093D0089093D1081092D2087093AE |
:1055B000D3086093D4082093D5085093D60840931D |
:1055C000D7084093D80884E08093D908A0EBB3E0D3 |
:1055D000E1EEF8E00D9001921A95E1F71F91089520 |
:1055E00088EE809398083EE1309399088BEF809382 |
:1055F0009B088AE080939C0830939A0830939E0819 |
:1056000093E090939D0858E050939F0820E12093E9 |
:10561000A00866E06093A1085093A20886EE8093EC |
:10562000A3083093A40880E88093A50844E640933B |
:10563000A60888E78093A7089093A8088EE5809332 |
:10564000A90883E28093AA0884E18093AB081092B2 |
:10565000AC082093AD081092AE081092AF081092DB |
:10566000B0081092B1081092C2081092C3081092AC |
:10567000C4081092C5084093B20888E28093B3082A |
:105680001092DC0892E39093B40886E98093B50801 |
:1056900085E08093B6089093B7082AE52093B80870 |
:1056A0009093B9081092DB082093BA0883E48093A2 |
:1056B000BB0886E48093BC0885E58093BD08809391 |
:1056C000BE0880E28093BF088093C0089093C10811 |
:1056D0008FE58093C60883EF8093C8083093C7088E |
:1056E0003093C9088DEF8093CA084093CB0820936C |
:1056F000CC082093CD082093CE088BE48093CF086C |
:105700008093D0088093D1081092D2086093D30878 |
:105710005093D4082093D5083093D6084093D708E7 |
:105720004093D80884E08093D9088CE0A8EBB3E0DC |
:10573000E1EEF8E00D9001928A95E1F7089568177F |
:10574000790744F4680F791F77FD09C0CB0195955F |
:1057500087950895681B790B861B970B08956F5FDB |
:105760007F4FCB019595879508950F931F93CF9306 |
:10577000C82FC150CF3F81F004E610E080916D0446 |
:10578000882351F410930204009301048AEF90E0FF |
:105790000E94D014C15090F7CF911F910F9108959E |
:1057A0002F923F924F925F926F927F928F929F9231 |
:1057B000AF92BF92CF92DF92EF92FF920F931F931F |
:1057C000CF93DF93CDB7DEB7ED970FB6F894DEBF7A |
:1057D0000FBECDBF2091D6043091D7048091200414 |
:1057E00090912104281B390B3A87298730934E0961 |
:1057F00020934D0920912A0430912B0437FDD4C702 |
:105800003595279535952795359527953AA729A755 |
:105810003C872B877901209128043091290437FD9A |
:10582000C0C73595279535952795359527953CA77C |
:105830002BA73E872D87F0920C09E0920B0930933D |
:1058400002092093010980913C0990913D09AA2702 |
:1058500097FDA095BA2F7C018D01EE0CFF1C001F57 |
:10586000111FE80EF91E0A1F1B1F80911C04909146 |
:105870001D049C01442737FD4095542FDA01C901CE |
:10588000880F991FAA1FBB1F880F991FAA1FBB1F34 |
:10589000820F931FA41FB51F820F931FA41FB51F54 |
:1058A000E80EF91E0A1F1B1F17FD9CC715950795CB |
:1058B000F794E79415950795F794E794F0923D09CE |
:1058C000E0923C098091580990915909AA2797FDC7 |
:1058D000A095BA2F7C018D01EE0CFF1C001F111F3B |
:1058E000E80EF91E0A1F1B1F80911E0490911F04D1 |
:1058F0009C01442737FD4095542FDA01C901880FD8 |
:10590000991FAA1FBB1F880F991FAA1FBB1F820FB9 |
:10591000931FA41FB51F820F931FA41FB51FE80E6E |
:10592000F91E0A1F1B1F17FD54C715950795F794FD |
:10593000E79415950795F794E794F0925909E0924A |
:1059400058098091090990910A09AA2797FDA09505 |
:10595000BA2F9C01AD01220F331F441F551F280F82 |
:10596000391F4A1F5B1F80911A0490911B04AA27BC |
:1059700097FDA095BA2F280F391F4A1F5B1F57FDAF |
:1059800016C755954795379527955595479537955A |
:10599000279530930A092093090920911C0430911E |
:1059A0001D04C901880F991F880F991F820F931F2B |
:1059B000820F931FAA2797FDA095BA2F2091B204BA |
:1059C0003091B3044091B4045091B504820F931FF9 |
:1059D000A41FB51F8093B2049093B304A093B404A2 |
:1059E000B093B50420911E0430911F04C901880FA3 |
:1059F000991F880F991F820F931F820F931FAA2749 |
:105A000097FDA095BA2F2091AE043091AF0440913C |
:105A1000B0045091B104820F931FA41FB51F80934F |
:105A2000AE049093AF04A093B004B093B1048091FE |
:105A300016099091170920911C0430911D04820FC2 |
:105A4000931F9093170980931609809150099091A4 |
:105A5000510920911E0430911F04820F931F9093CF |
:105A60005109809350098091CC049091CD04019606 |
:105A70009093CD048093CC048091AA049091AB04C0 |
:105A8000A091AC04B091AD04BC01CD010E94C564ED |
:105A90005B016C018091160890911708AA2797FD69 |
:105AA000A095BA2FBC01CD010E94C5647B018C0179 |
:105AB0008091C8049091C904A091CA04B091CB040C |
:105AC0009C01AD01C801B7010E946564DC01CB01F6 |
:105AD0009C01AD01C601B5010E946664DC01CB01E9 |
:105AE000BC01CD010E94A864DC01CB018093AA0413 |
:105AF0009093AB04A093AC04B093AD048FEC80936F |
:105B00007A001092180320909A0430909B044090E1 |
:105B10009C0450909D0439E423163BE6330631E0A3 |
:105B2000430630E053060CF414C188E49BE6A1E080 |
:105B3000B0E08D839E83AF83B8876090A20470909D |
:105B4000A3048090A4049090A50439E463163BE676 |
:105B5000730631E0830630E093060CF4DCC488E47D |
:105B60009BE6A1E0B0E089839A83AB83BC8349853F |
:105B70005A85CA01AA2797FDA095BA2F20919204B1 |
:105B8000309193044091940450919504280F391F4B |
:105B90004A1F5B1F2DA33EA34FA358A7A0905409F3 |
:105BA000B0905509C0905609D0905709A80EB91E5B |
:105BB000CA1EDB1E86017501309164043BA33323AA |
:105BC00009F0DAC080916304882309F0C2C44091CF |
:105BD00098084CA346FF13C6EBA5FCA5CF01AA2746 |
:105BE00097FDA095BA2FBC01CD0129813A814B8147 |
:105BF0005C810E943F659B01AC0197FD2CC7BBE017 |
:105C00005595479537952795BA95D1F780918D038E |
:105C1000E82EFF2400271127C801B7010E943F6525 |
:105C200097FD14C7ACE09595879577956795AA95EC |
:105C3000D1F76F87788B898B9A8B6093E40470938C |
:105C4000E5048093E6049093E70429A53AA5C901E9 |
:105C5000AA2797FDA095BA2FBC01CD012D813E81C9 |
:105C60004F8158850E943F659B01AC0197FD01C79C |
:105C7000FBE05595479537952795FA95D1F7C801DB |
:105C8000B7010E943F6597FDEFC6DC01CB01ECE058 |
:105C9000B595A79597958795EA95D1F78093E804F0 |
:105CA0009093E904A093EA04B093EB042091E404F8 |
:105CB0003091E50430938B0820938A082091E80402 |
:105CC0003091E90430938F0820938E082F8538890E |
:105CD00049895A89821B930BA40BB50B8AAF9BAFE2 |
:105CE000ACAFBDAF8093E8049093E904A093EA04BD |
:105CF000B093EB04A80EB91ECA1EDB1E8601750107 |
:105D000030918C033DA7332309F0A3C58EA79FA72D |
:105D1000A8ABB9ABB7FD61C62EA53FA548A959A947 |
:105D200055954795379527958DA19EA1AFA1B8A50B |
:105D3000821B930BA40BB50B8DA39EA3AFA3B8A797 |
:105D40008093920490939304A0939404B093950449 |
:105D50008CC598EB291694E939069EEF49069FEF0A |
:105D600059060CF0F1C328EB34E94EEF5FEF2D83B9 |
:105D70003E834F835887E1CE2DA13EA14FA158A568 |
:105D80002093920430939304409394045093950489 |
:105D9000309198083CA310928F0810928E081092B0 |
:105DA0008B0810928A081092E0041092E10410927D |
:105DB000E2041092E3041092DC041092DD041092CD |
:105DC000DE041092DF0430918C033DA78091E00443 |
:105DD0009091E104A091E204B091E304BC01CD01F3 |
:105DE00024E630E040E050E00E94B365DA01C901EA |
:105DF0004091DC045091DD04481B590B58A34F8F90 |
:105E00008091DC049091DD04A091DE04B091DF0468 |
:105E1000BC01CD0124E630E040E050E00E94B365D3 |
:105E2000DA01C9012091E0043091E104821B930B57 |
:105E30009AA389A38091850390918603A0918703FB |
:105E4000B0918803BC01CD0128E631E040E050E08C |
:105E50000E943F65E616F7060807190744F0570148 |
:105E60006801A61AB70AC80AD90A8601750117FD82 |
:105E7000A3C4A0925409B0925509C0925609D09279 |
:105E800057092BA53CA58F8D98A1280F391F7901A3 |
:105E90000027F7FC0095102F8091960490919704AD |
:105EA000A0919804B0919904E80EF91E0A1F1B1FD7 |
:105EB000570168018091670490916804281B390B91 |
:105EC000C901AA2797FDA095BA2F280E391E4A1E90 |
:105ED0005B1E20919D0330919E0340919F03509142 |
:105EE000A003221533054405550574F4A8EAEA2EEB |
:105EF000A1E6FA2E012D112DE21AF30A040B150B5F |
:105F0000170128015701680188279927DC01821BA6 |
:105F1000930BA40BB50B281639064A065B060CF04A |
:105F2000E9C2F8E52F2EFEE93F2EFFEF4F2EFFEFDF |
:105F30005F2E220E331E441E551E20929A0430926C |
:105F40009B0440929C0450929D0482017101209216 |
:105F5000960430929704409298045092990429A58F |
:105F60003AA5A9A1BAA12A0F3B1FA901662757FD8F |
:105F70006095762F80919E0490919F04A091A0043B |
:105F8000B091A104480F591F6A1F7B1F5A016B0172 |
:105F90008091650490916604281B390BC901AA27DA |
:105FA00097FDA095BA2F680E791E8A1E9B1E8091C0 |
:105FB000A1039091A203A091A303B091A4038EAB7F |
:105FC0009FABA8AFB9AF86159705A805B90564F4CE |
:105FD00048EA51E660E070E0481B590B6A0B7B0B06 |
:105FE0003A014B015A016B018EA99FA9A8ADB9AD29 |
:105FF000B095A095909581959F4FAF4FBF4F681674 |
:1060000079068A069B060CF064C2E8E56E2EEEE97E |
:106010007E2EEFEF8E2EEFEF9E2E2EA93FA948ADDC |
:1060200059AD620E731E841E951E6092A20470927A |
:10603000A3048092A4049092A504B401A3016092E9 |
:106040009E0470929F048092A0049092A1048DA15E |
:106050009EA1AFA1B8A58093A6049093A704A09396 |
:10606000A804B093A9046092C2047092C304809201 |
:10607000C4049092C5042092BA043092BB044092AA |
:10608000BC045092BD044093BE045093BF0460937F |
:10609000C0047093C104E092B604F092B704009378 |
:1060A000B8041093B904809124039091250397FDBF |
:1060B000A4C37C01F594E794F594E794F594E794F0 |
:1060C000FAA6E9A6809122039091230397FD93C33A |
:1060D0008C011595079515950795159507951CA79E |
:1060E0000BA780912404909125040F9734F458E174 |
:1060F000E52E5CEFF52EFAA6E9A680912404909196 |
:106100002504079734F440E3E42E48EFF42EFAA672 |
:10611000E9A6209101012A3009F46BC28091240480 |
:1061200090912504815D97400CF007C28091240472 |
:1061300090912504805E974034F080EDE82E87E052 |
:10614000F82EFAA6E9A680912204909123040F97D5 |
:1061500024F408E11CEF1CA70BA780912204909166 |
:106160002304079724F400E318EF1CA70BA72A3099 |
:1061700009F455C28091220490912304815D9740D7 |
:1061800024F008EE13E01CA70BA780912204909145 |
:106190002304805E974024F000ED17E01CA70BA7B6 |
:1061A000A0919503AA2309F497C0609124037091EC |
:1061B00025038091EC049091ED04681B790B2091EC |
:1061C000240330912503280F391F37FD3FC3359530 |
:1061D00027953093ED042093EC04613871050CF49D |
:1061E0003AC260E870E07093F3046093F2048A2F7F |
:1061F0009927869FF001879FF00D969FF00D11243F |
:10620000CF01F7FD21C37C01F594E794F594E79461 |
:10621000F594E794F594E79429A53AA5E20EF31EC8 |
:10622000FAA6E9A640912203509123038091EE043F |
:106230009091EF04481B590B2091220330912303C6 |
:10624000280F391F37FDFDC2359527953093EF0490 |
:106250002093EE04413851050CF4F5C140E850E0BC |
:106260005093F1044093F0048A2F9927849FD00122 |
:10627000859FB00D949FB00D1124AD019D01B7FD18 |
:10628000DDC2890115950795159507951595079513 |
:1062900015950795EBA5FCA50E0F1F1F1CA70BA7B7 |
:1062A000869F9001879F300D969F300D1124C90164 |
:1062B0002091240330912503820F931F909325038F |
:1062C000809324038091220390912303480F591F48 |
:1062D00050932303409322034D855E8514161506C3 |
:1062E0000CF0C1C180918A0890918B0897FDA2C2E1 |
:1062F000AA2797FDA095BA2F6DA5262F33274427EF |
:106300005527BC01CD010E943F6597FD8EC2E6E096 |
:106310009595879577956795EA95D1F7AF8DB8A153 |
:10632000A60FB71FB093FD08A093FC084B855C85B2 |
:10633000141615060CF0C1C180918E0890918F083B |
:1063400097FD6FC2AA2797FDA095BA2F6DA5262F9E |
:10635000332744275527BC01CD010E943F6597FD97 |
:106360005BC246E095958795779567954A95D1F7F5 |
:10637000A9A1BAA1A60FB71FB093F208A093F10884 |
:106380003CA137FDC1C11093F0080093EF08F092D3 |
:10639000FF08E092FE0880919408E82FFF27EE0F97 |
:1063A000FF1FE25AF74F8081918182599F4FA09140 |
:1063B0007D04B0917E04A817B9070CF0EEC0CD01A2 |
:1063C000019690937E0480937D04DC018091950872 |
:1063D000E82FFF27EE0FFF1FE25AF74F80819181D0 |
:1063E00082599F4F60917B0470917C0468177907F4 |
:1063F0000CF0C4C0CB01019690937C0480937B0485 |
:10640000BC0180919608E82FFF27EE0FFF1FE25A8C |
:10641000F74F8081918182599F4F4091790450912B |
:106420007A04481759070CF0D5C0CA010196909319 |
:106430007A0480937904AC0180919708E82FFF27B4 |
:10644000EE0FFF1FE25AF74F8081918182599F4FD3 |
:106450002091770430917804281739070CF0ABC0ED |
:10646000C901019690937804809377049C01B7FD4D |
:1064700093C1AF3FB10539F034F08FEF90E09093C6 |
:106480007E0480937D0477FD76C16F3F710539F0FE |
:1064900034F08FEF90E090937C0480937B0457FD61 |
:1064A00070C14F3F510539F034F08FEF90E0909379 |
:1064B0007A048093790437FD6AC12F3F310509F0D2 |
:1064C0000CF4EEC28FEF90E0909378048093770401 |
:1064D000E7C26092A2047092A3048092A4049092F6 |
:1064E000A504A0929E04B0929F04C092A004D092F2 |
:1064F000A104ADCD20929A0430929B0440929C045A |
:1065000050929D04A0929604B0929704C092980471 |
:10651000D092990424CD98EB691694E979069EEF00 |
:1065200089069FEF99062CF528EB34E94EEF5FEFD3 |
:1065300029833A834B835C831ACB98EEE92E93E050 |
:10654000F92EFAA6E9A6F2CD2D823E824F82588618 |
:10655000F4CA8DA19EA1AFA1B8A580939204909397 |
:106560009304A0939404B0939504909198089CA3ED |
:1065700012CC69827A828B829C82F9CA8081918155 |
:1065800082599F4F861797070CF03BCF6115710515 |
:1065900009F437CFCB0101972FCF808191818259A8 |
:1065A0009F4F8A179B070CF011CF109709F40ECF5D |
:1065B000CD01019706CF8081918182599F4F82172B |
:1065C00093070CF054CF2115310509F450CFC901C0 |
:1065D000019748CF8081918182599F4F84179507F9 |
:1065E0000CF02ACF4115510509F426CFCA010197B5 |
:1065F0001ECF8091240490912504835F934034F052 |
:1066000038EEE32E33E0F32EFAA6E9A680912404B7 |
:10661000909125048A5F93400CF495CD8ECD8091A6 |
:10662000220490912304835F934024F008EE13E04A |
:106630001CA70BA780912204909123048A5F9340AA |
:106640000CF4AECDA9CD3FEF403853070CF008CE87 |
:1066500040E85FEF05CE8FEF603878070CF0C3CDD0 |
:1066600060E87FEFC0CD80918A0890918B0897FDFC |
:106670009BC1AA2797FDA095BA2FEDA52E2F3327F2 |
:1066800044275527BC01CD010E943F6597FDADC150 |
:1066900056E095958795779567955A95D1F72F8D03 |
:1066A00038A1261B370B3093FD082093FC084B853F |
:1066B0005C85141615060CF43FCE80918E089091DF |
:1066C0008F0897FD6DC1AA2797FDA095BA2FEDA55C |
:1066D0002E2F332744275527BC01CD010E943F654B |
:1066E00097FD88C136E095958795779567953A959A |
:1066F000D1F729A13AA1261B370B3093F20820933A |
:10670000F1083CA137FF3FCE4BA1442309F03BCE1B |
:1067100080916304882309F036CE8B859C85A1E0A7 |
:1067200081309A070CF044C12B853C854FEF203017 |
:1067300034070CF0A3C189A59AA5280F391F3C87FF |
:106740002B8720503F4F3093FF082093FE08AD85E4 |
:10675000BE85E1E0A130BE070CF465C12BA53CA5C8 |
:10676000A20FB31FBE87AD87A050B140B093F00811 |
:10677000A093EF0810CE10927C0410927B0457FF78 |
:1067800090CE10927A041092790437FF96CE109230 |
:1067900078041092770484C110927E0410927D04D4 |
:1067A00072CE295F3F4F3DC8295F3F4F29C82D5FFB |
:1067B0003F4F4F4F5F4FE5C8E60EF71E081F191FEA |
:1067C000E0925409F0925509009356091093570925 |
:1067D00058CB23E030E040E050E0E20EF31E041F0F |
:1067E000151FA3C883E090E0A0E0B0E0E80EF91E1A |
:1067F0000A1F1B1F5BC807966BCC07965ACC2DA1AE |
:106800003EA14FA158A52093920430939304409346 |
:10681000940450939504BFCA615C7F4F8F4F9F4F84 |
:10682000A0CD909581959F4F8DCD615C7F4F8F4F0F |
:106830009F4F6DCD909581959F4F5ACD215F3F4FD2 |
:1068400020CD2F5F3F4F00CD0F96DDCC2F5F3F4F08 |
:10685000BECC2DA13EA14FA158A520939204309308 |
:106860009304409394045093950489859A85AA27AC |
:1068700097FDA095BA2F2AAD3BAD4CAD5DAD820F13 |
:10688000931FA41FB51F8B8B9C8BAD8BBE8BBC0144 |
:10689000CD0129813A814B815C810E943F659B013A |
:1068A000AC0197FDBBC06BE0559547953795279593 |
:1068B0006A95D1F760918E03862F9927AA27BB2767 |
:1068C0008F8B988FA98FBA8FBC01CD010E943F6535 |
:1068D00097FD9FC02CE095958795779567952A95AC |
:1068E000D1F76B8F7C8F8D8F9E8F6093DC047093BC |
:1068F000DD048093DE049093DF046B897C898D89AD |
:106900009E892D813E814F8158850E943F659B0164 |
:10691000AC0197FD79C08BE0559547953795279544 |
:106920008A95D1F76F89788D898D9A8D0E943F6500 |
:1069300097FD65C0BCE09595879577956795BA9565 |
:10694000D1F76AAB7BAB8CAB9DAB6093E0047093EB |
:10695000E1048093E2049093E30429853A8537FDAE |
:106960007FC0213431050CF431CA6B8D7C8D8D8D47 |
:106970009E8D97FD2AC0613871058105910564F4EB |
:106980006AA97BA98CA99DA997FD82C06138710570 |
:10699000810591050CF41ACA81E08093810416CA1E |
:1069A000909581959F4F8FCE909581959F4F61CE09 |
:1069B000E9A5FAA58E0F9F1F9C878B878050914079 |
:1069C0009093FF088093FE08C2CE909580957095B5 |
:1069D00061957F4F8F4F9F4FCECF0196A11DB11D67 |
:1069E0008EA79FA7A8ABB9AB97C9615C7F4F8F4FAC |
:1069F0009F4F4ECE615C7F4F8F4F9F4F73CE615044 |
:106A0000704F8F4F9F4F96CF2150384F4F4F5F4F52 |
:106A100082CF6150704F8F4F9F4F5CCF2150384FC6 |
:106A20004F4F5F4F40CF4D855E856FEF403056072B |
:106A300054F58BA59CA5480F591F5E874D87405084 |
:106A40005F4F5093F0084093EF08A5CC6150704F12 |
:106A50008F4F9F4FE7C82150384F4F4F5F4FCFC8E0 |
:106A6000309521953F4F7DCF6150704F8F4F9F4F95 |
:106A70000CC92150384F4F4F5F4FFAC8F092FF08B2 |
:106A8000E092FE0864CE1093F0080093EF0883CCE8 |
:106A900090958095709561957F4F8F4F9F4F76CFE2 |
:106AA000ED960FB6F894DEBF0FBECDBFDF91CF914C |
:106AB0001F910F91FF90EF90DF90CF90BF90AF901C |
:106AC0009F908F907F906F905F904F903F902F900E |
:106AD0000895809101018D3009F455C110927A001A |
:106AE00080912404909125049093FF088093FE08E0 |
:106AF00080912204909123049093F0088093EF08F2 |
:106B0000809120049091210490934E0980934D0927 |
:106B100080911C0490911D049C01442737FD4095F1 |
:106B2000542FDA01C901880F991FAA1FBB1F880FB4 |
:106B3000991FAA1FBB1F820F931FA41FB51F820F8F |
:106B4000931FA41FB51F90933D0980933C0980912A |
:106B50001E0490911F049C01442737FD4095542F3B |
:106B6000DA01C901880F991FAA1FBB1F880F991F3F |
:106B7000AA1FBB1F820F931FA41FB51F820F931F55 |
:106B8000A41FB51F909359098093580980911A0446 |
:106B900090911B0490930A09809309098FEC8093CC |
:106BA0007A0080919408E82FFF27EE0FFF1FE25A2A |
:106BB000F74F8081918182599F4FA0917D04B091C0 |
:106BC0007E04A817B9070CF085C0CD0101969093FB |
:106BD0007E0480937D04DC0180919508E82FFF27D7 |
:106BE000EE0FFF1FE25AF74F8081918182599F4F2C |
:106BF00060917B0470917C04681779070CF096C053 |
:106C0000CB01019690937C0480937B04BC0180911E |
:106C10009608E82FFF27EE0FFF1FE25AF74F8081FB |
:106C2000918182599F4F4091790450917A0448177D |
:106C300059070CF06CC0CA01019690937A048093B6 |
:106C40007904AC0180919708E82FFF27EE0FFF1F12 |
:106C5000E25AF74F8081918182599F4F20917704AA |
:106C600030917804281739070CF042C0C901019609 |
:106C700090937804809377049C01B7FD7FC0AF3F69 |
:106C8000B10511F00CF061C077FD67C06F3F710571 |
:106C900039F034F08FEF90E090937C0480937B0484 |
:106CA00057FD61C04F3F510539F034F08FEF90E050 |
:106CB00090937A048093790437FD5BC02F3F3105B0 |
:106CC00009F00CF463C08FEF90E090937804809308 |
:106CD00077045CC08081918182599F4F8A179B07FE |
:106CE0000CF07ACF109709F477CFCD0101976FCFD1 |
:106CF0008081918182599F4F821793070CF0BDCFFD |
:106D00002115310509F4B9CFC9010197B1CF8081AF |
:106D1000918182599F4F841795070CF093CF4115AD |
:106D2000510509F48FCFCA01019787CF80819181E6 |
:106D300082599F4F861797070CF069CF611571052F |
:106D400009F465CFCB0101975DCF8FEF90E0909371 |
:106D50007E0480937D0477FF99CF10927C0410927B |
:106D60007B0457FF9FCF10927A041092790437FF6B |
:106D7000A5CF109278041092770408C010927E0478 |
:106D800010927D0481CF0E946A19A8CE8091BD081F |
:106D90009927AA27BB27BC01CD0124EC39E040E0AC |
:106DA00050E00E943F65DC01CB018093A1039093EA |
:106DB000A203A093A303B093A4038091BE089927D4 |
:106DC000AA27BB27BC01CD010E943F65DC01CB0196 |
:106DD00080939D0390939E03A0939F03B093A00381 |
:106DE00008956F927F928F929F92AF92BF92CF92AF |
:106DF000DF92EF92FF920F931F93CF93DF93C0E048 |
:106E0000D0E07E016E011092FF03469AD093D10428 |
:106E1000C093D004D093CF04C093CE0480E090E020 |
:106E2000A0E0B0E08093C8049093C904A093CA0482 |
:106E3000B093CB04D093DB04C093DA04D093D9048D |
:106E4000C093D804D093D704C093D604D0931E091E |
:106E5000C0931D0910928E0310928D031092180496 |
:106E60000E94693584E690E00E94DD140E94693535 |
:106E70008091980880FF10C080911C0390911D03A1 |
:106E8000875B934008F07BC080911C0390911D03A9 |
:106E90008E5E924008F473C01FE18AE090E00E9489 |
:106EA000DD148091200490912104C80FD91F809196 |
:106EB000240490912504E80EF91E809122049091FB |
:106EC0002304C80ED91E115017FFE7CFA701405F5A |
:106ED0005F4F56954795569547955093DB044093E1 |
:106EE000DA049601205F3F4F369527953695279512 |
:106EF0003093D9042093D804CE0140969695879577 |
:106F0000929582958F7089279F7089279093D704D7 |
:106F10008093D60490931E0980931D093093D50465 |
:106F20002093D4045093D3044093D20444E050E01F |
:106F3000DA010E94CE65802D853020F180915809BC |
:106F40009091590997FD53C06CE070E00E947E65F6 |
:106F50007093CF046093CE0480913C0990913D09D9 |
:106F600097FD56C06CE070E00E947E657093D1047E |
:106F70006093D00480911608909117084DC00E942C |
:106F800018198ACFDA010E94CE65802D9927982F93 |
:106F90008827DA0111960E94CE65202D820F911D5F |
:106FA0009093D1048093D004DA0112960E94CE65AA |
:106FB000802D9927982F8827DA0113960E94CE6595 |
:106FC000202D820F911D9093CF048093CE04DA017F |
:106FD00014960E94CE65802D9927982F8827DA0174 |
:106FE00015960E94CE65202D820F911D15C090959B |
:106FF00081959F4F6CE070E00E947E657093CF0496 |
:107000006093CE0480913C0990913D0997FFAACFEF |
:10701000909581959F4FA6CFAA2797FDA095BA2F4F |
:10702000BC01CD010E94C564DC01CB018093C80482 |
:107030009093C904A093CA04B093CB041092FF08A4 |
:107040001092FE081092F0081092EF0810924E096C |
:1070500010924D0984E690E00E94DD1480911C049A |
:1070600090911D04AA2797FDA095BA2F9C01AD0110 |
:10707000220F331F441F551F220F331F441F551F5C |
:10708000280F391F4A1F5B1F280F391F4A1F5B1F1C |
:1070900030933D0920933C0980911E0490911F0478 |
:1070A000AA2797FDA095BA2F7C018D01EE0CFF1C3D |
:1070B000001F111FEE0CFF1C001F111FE80EF91E10 |
:1070C0000A1F1B1FE80EF91E0A1F1B1FF092590909 |
:1070D000E09258098091A408682E77248824992486 |
:1070E000C9019C01442737FD4095542FC401B301C9 |
:1070F0000E943F655B016C016093C2047093C304FE |
:107100008093C4049093C5049701442737FD4095AC |
:10711000542FC401B3010E943F65DC01CB01809371 |
:10712000BA049093BB04A093BC04B093BD04A09296 |
:107130009E04B0929F04C092A004D092A1048093B8 |
:10714000960490939704A0939804B0939904109296 |
:1071500092041092930410929404109295048091DA |
:107160001E0390911F03A0912003B09121039093DF |
:1071700019088093180810921704109216041092A0 |
:107180008A0410928B0410928C0410928D048091CA |
:1071900088049091890490938704809386040E94C8 |
:1071A000EB5682E390E09093020480930104809177 |
:1071B000BD089927AA27BB27BC01CD0124EC39E0E3 |
:1071C00040E050E00E943F65DC01CB018856954CC1 |
:1071D000AF4FBF4F8093A1039093A203A093A3034B |
:1071E000B093A4038091BE089927AA27BB27BC01AE |
:1071F000CD010E943F65DC01CB018856954CAF4F15 |
:10720000BF4F80939D0390939E03A0939F03B093E1 |
:10721000A00310928A0310928903809188049091B0 |
:107220008904AA2797FDA095BA2F20918503309154 |
:1072300086034091870350918803BC01CD010E94D1 |
:107240003F65DC01CB018093540990935509A093CD |
:107250005609B09357091092800410927F0411E0F0 |
:10726000109300010E94D35A80914A048460809355 |
:107270004A048FEF8093BD091092BE0980E280938B |
:10728000BF0980919408E82FFF27EE0FFF1FE25AF5 |
:10729000F74F8081918182599F4F90937E04809314 |
:1072A0007D0480919508E82FFF27EE0FFF1FE25A1B |
:1072B000F74F8081918182599F4F90937C048093F6 |
:1072C0007B0480919608E82FFF27EE0FFF1FE25AFC |
:1072D000F74F8081918182599F4F90937A048093D8 |
:1072E000790480919708E82FFF27EE0FFF1FE25ADD |
:1072F000F74F8081918182599F4F909378048093BA |
:1073000077041093FF0384E680937604DF91CF9196 |
:107310001F910F91FF90EF90DF90CF90BF90AF90B3 |
:107320009F908F907F906F90089580913F0999274B |
:107330009093EB078093EA078091400999279093F7 |
:10734000ED078093EC078091420999279093EF070E |
:107350008093EE078091410999279093F1078093DC |
:10736000F00780916D04882321F08091AE0880FFA2 |
:1073700031C080914A048C7F80934A0490E010C011 |
:10738000A92FBB27FD01EB5EF84F8083FD01EB5E6B |
:10739000F84F8081A15CB64F8C939F5F9C3080F446 |
:1073A0008091E003882361F3A92FBB27FD01EB5EE9 |
:1073B000F84F8081A15CB64F8C939F5F9C3080F327 |
:1073C0008091E003882359F08091E00381508093FD |
:1073D000E00305C080914A04816080934A041092C2 |
:1073E0004404109243040E94FD26089580919B0856 |
:1073F0008B3F68F08B3F09F4B3C28C3F09F431C373 |
:107400008D3F09F401C38E3F21F48091770480936E |
:10741000990380919A088B3F08F40EC28B3F09F4C0 |
:1074200009C28C3F09F435C38D3F09F402C38E3F76 |
:1074300009F46EC380919A03882309F002C28093F5 |
:107440009A0380919C088B3F08F402C28B3F09F499 |
:10745000FDC18C3F09F40BC38D3F09F4EDC28E3F93 |
:1074600009F453C380919803882309F0F6C18093EF |
:10747000980380919E088B3F68F08B3F09F452C2BD |
:107480008C3F09F4F1C28D3F09F4C1C28E3F21F453 |
:1074900080917704809397038091A5088B3F68F0D3 |
:1074A0008B3F09F45AC28C3F09F4EAC28D3F09F4BC |
:1074B000A8C28E3F21F48091770480939603809137 |
:1074C000A6088B3F08F4D0C18B3F09F4CBC18C3F99 |
:1074D00009F4EBC28D3F09F4A0C28E3F09F427C323 |
:1074E000809194038B3008F4C4C18F3F11F48093D2 |
:1074F00094038091A7088B3F68F08B3F09F418C272 |
:107500008C3F09F4CCC28D3F09F48AC28E3F21F42E |
:1075100080917704809393038091A8088B3F68F053 |
:107520008B3F09F408C28C3F09F4BCC28D3F09F4BB |
:1075300071C28E3F21F4809177048093950320914E |
:10754000AD082B3F08F499C12B3F09F494C12C3F9F |
:1075500009F4BDC22D3F09F44BC22E3F09F4D2C23B |
:10756000209191038091AE088B3F08F08DC18093EC |
:107570005E048091AF088B3F68F08B3F09F4E1C156 |
:107580008C3F09F483C28D3F09F42FC28E3F21F452 |
:107590008091770480935D048091B0088B3F68F000 |
:1075A0008B3F09F4D1C18C3F09F46DC28D3F09F4C2 |
:1075B0003AC28E3F21F48091770480935C048091DD |
:1075C000B1088B3F68F08B3F09F4C1C18C3F09F4CF |
:1075D00063C28D3F09F42AC28E3F21F48091770463 |
:1075E00080935B048091C2088B3F08F45CC18B3FA1 |
:1075F00009F4B0C18C3F09F42BC28D3F09F41FC2BE |
:107600008E3F09F488C290915A048091C3088B3F41 |
:1076100008F051C1482F409359048091C4088B3F12 |
:1076200068F08B3F09F4B7C18C3F09F414C28D3F59 |
:1076300009F40BC28E3F21F48091770480935804A3 |
:107640008091C5088B3F68F08B3F09F4A7C18C3F40 |
:1076500009F410C28D3F09F4CEC18E3F21F4809110 |
:107660007704809357048091B2088B3F68F08B3F7A |
:1076700009F497C18C3F09F421C28D3F09F4ACC1D4 |
:107680008E3F21F480917704809390038091B70816 |
:107690008B3F68F08B3F09F466C18C3F09F411C23F |
:1076A0008D3F09F49CC18E3F21F480917704809333 |
:1076B0008F038091BA088B3F68F08B3F09F456C165 |
:1076C0008C3F09F401C28D3F09F48CC18E3F21F437 |
:1076D0008091770480938E038091BB088B3F68F084 |
:1076E0008B3F09F446C18C3F09F4E5C18D3F09F495 |
:1076F00070C18E3F21F48091770480938D03809137 |
:10770000BC088B3F68F08B3F09F436C18C3F09F40D |
:10771000EDC18D3F09F448C18E3F21F4809177047B |
:1077200080938C038091C1088B3F68F08B3F09F4F4 |
:1077300026C18C3F09F4DDC18D3F09F438C18E3F6D |
:1077400021F48091770480938B038091C7088B3F4D |
:1077500008F4C2C08B3F09F4BDC08C3F09F4BAC124 |
:107760008D3F09F427C18E3F09F4DBC180911809D0 |
:10777000823008F4B6C08F3F11F4809318099B3F04 |
:1077800008F4B1C09B3F09F4FDC09C3F09F490C1CF |
:107790009D3F09F41BC19E3F09F4B1C180910D09C1 |
:1077A000882309F0A6C080930D098091C9088B3FFA |
:1077B00008F4A6C08B3F09F4A1C08C3F09F493C123 |
:1077C0008D3F09F4FDC08E3F09F496C180914B09AD |
:1077D000823008F49AC08F3F11F480934B094B3FDD |
:1077E00008F495C04B3F09F4D0C04C3F09F478C170 |
:1077F0004D3F09F4E8C04E3F09F490C18091110952 |
:10780000882309F08AC0809311098091DA088B3FA0 |
:1078100070F08B3F09F489C08C3F09F45EC18D3F45 |
:1078200009F4CBC08E3F09F085C180917704809325 |
:107830005B0980C180917D0480939A03882309F4B9 |
:10784000FECD843608F4FDCD84E6F9CD80917D042B |
:1078500080939803882309F40ACE843608F409CE6D |
:1078600084E605CE80917D04809394038B3008F0EC |
:107870003CCE8AE03CCE20917D0420939103809100 |
:10788000AE088B3F08F473CE8B3F09F457C08C3F92 |
:1078900009F4F3C08D3F09F4B1C08E3F09F069CE01 |
:1078A0008091770464CE982F90935A048091C308F6 |
:1078B0008B3F08F4AFCE8B3F09F46AC08C3F09F4CC |
:1078C000CDC08D3F09F4BEC08E3F09F42DC140915B |
:1078D0005904A3CE80917D0480931809823008F06A |
:1078E0004ACF81E04ACF892F80930D09882309F47C |
:1078F0005ACF8A3F08F459CF8AEF55CF80917D0443 |
:1079000080934B09823008F066CF81E066CF842FE8 |
:1079100080931109882309F476CF8A3F08F475CF44 |
:107920008AEF71CF80917D04B5CD80917D047FCFAA |
:1079300080917D04EFCD80917D04FFCD80917D0409 |
:1079400016CE80917D0426CE80917D0436CE809126 |
:107950007D0446CE90917D04A7CF80917D04ADCD6E |
:1079600080917D0454CD80917D04A1CE80917D04D1 |
:10797000B1CE80917D04C1CE80917D04D1CE809125 |
:107980007D04E1CE80917D04AFCF80917D04C0CF96 |
:1079900040917D0440CE80917D0450CE80917D0445 |
:1079A00060CE80917D0470CE80917904B9CE8091B3 |
:1079B0007904C9CE809179048FCF8091790437CF33 |
:1079C000809179049DCF80917904A2CF8091790430 |
:1079D0008BCF8091790491CE8091790455CE80919E |
:1079E000790465CE8091790475CE80917904D2CDE9 |
:1079F0002091790442CF8091790433CE809179042B |
:107A0000B6CD8091790459CD8091790400CD8091D3 |
:107A1000790440CD8091790490CD8091790424CF70 |
:107A20008091790477CD80917904C7CD80917904D4 |
:107A3000D7CD8091790400CF8091790409CF9091BE |
:107A4000790432CF40917904E6CD80917904F6CD66 |
:107A500090917B0429CF80917B04F0CD40917B04F1 |
:107A6000DACD80917B04D3CC80917B0413CD8091BF |
:107A70007B04EECE80917B04F4CD80917B0477CDA6 |
:107A800080917B041ACD80917B0497CD80917B04FB |
:107A900081CD80917B04D0CE80917B04A1CD80915B |
:107AA0007B0438CD80917B0448CD80917B04DCCE73 |
:107AB00080917B0419CF80917B041FCE80917B0441 |
:107AC000E3CD80917B04F3CD80917B0403CE2091A4 |
:107AD0007B04D3CE80917B04FFCE80917B04A7CE24 |
:107AE00080917B0415CF80917B040ACF80917B0429 |
:107AF00017CE80917B0427CE8091770401CF8091AF |
:107B00007704F2CE20917704B8CE80917704A0CE8E |
:107B10008091770491CE90917704C6CE80917704BE |
:107B2000F7CE80917704D8CE4091770474CD8091C0 |
:107B300077049ACE33272F5F3F4F8CE398E2B90149 |
:107B40000E947E6570939C0360939B038091A308C1 |
:107B500080934C098091A2088093030908952F9285 |
:107B60003F924F925F926F927F928F929F92AF92CD |
:107B7000BF92CF92DF92EF92FF920F931F93CF931A |
:107B8000DF93CDB7DEB7EA970FB6F894DEBF0FBE2E |
:107B9000CDBF0E94D02B209101012C3010F00C940D |
:107BA0006F46299AA0906E04B0906F04BA82A982A1 |
:107BB00080917604843610F00C947C4680910E03FC |
:107BC000882311F40C947948809110059091110547 |
:107BD000009711F40C94954A0197909311058093A6 |
:107BE00010052A3011F40C949D4A243111F40C94A0 |
:107BF0009D4A289880914B0490914C04895E934053 |
:107C000010F40C94914A8091AA08282F33273A83C4 |
:107C1000298381E08093830480919008A82FBB275B |
:107C2000AA0FBB1FFD01EC58F74F11821082809103 |
:107C30009108282F3327220F331FC9018C58974FE3 |
:107C4000FC0111821082A25AB74F11961C921E920B |
:107C5000225A374FD90111961C921E928091930897 |
:107C6000E82FFF27EE0FFF1FE25AF74F1182108215 |
:107C700080918303815080938303809183038F3F9E |
:107C800029F0A0918304AA2309F4D5C20E94F639F1 |
:107C900080919008E82FFF27EE0FFF1FE25AF74F61 |
:107CA000808191814C01AA2497FCA094BA2C8091E8 |
:107CB0009108E82FFF27EE0FFF1FE25AF74F808150 |
:107CC00091816C01EE24D7FCE094FE2C8091C508D4 |
:107CD00080FF77C0F094E094D094C094C11CD11C74 |
:107CE000E11CF11CC501B4012FE93BE140E050E08B |
:107CF0000E943F654B015C01C701B6010E943F65D0 |
:107D00006B017C01D501C4018C199D09AE09BF0925 |
:107D1000BC01CD0120E137E240E050E00E94B365B4 |
:107D20008901C80CD91CEA1CFB1CC701B60120E163 |
:107D300037E240E050E00E94B365DA01C901480132 |
:107D4000AA2497FCA094BA2C909581959F4F6C0122 |
:107D5000EE24D7FCE094FE2C1EE781169104A104CA |
:107D6000B10414F00C94A04A23E882162FEF920677 |
:107D70002FEFA2062FEFB20644F4A3E88A2EAFEF4E |
:107D80009A2EAFEFAA2EAFEFBA2E3EE7C316D1045C |
:107D9000E104F1042CF0FDE7CF2ED12CE12CF12CE5 |
:107DA00043E8C4164FEFD4064FEFE4064FEFF40656 |
:107DB00044F4E3E8CE2EEFEFDE2EEFEFEE2EEFEF02 |
:107DC000FE2E80911F0590912005AA2797FDA09572 |
:107DD000BA2F95018401081B190B2A0B3B0BC90113 |
:107DE000B80123E030E040E050E00E94B365DA01E2 |
:107DF000C901880F991FAA1FBB1F820F931FA41FC1 |
:107E0000B51F8C018091210590912205AA2797FD2D |
:107E1000A095BA2FA7019601281B390B4A0B5B0BC3 |
:107E2000CA01B90123E030E040E050E00E94B365B0 |
:107E3000DA01C901880F991FAA1FBB1F820F931F68 |
:107E4000A41FB51FFC019092200580921F05D092BF |
:107E50002205C092210580912305909124059C0163 |
:107E6000220F331F280F391F80919F08682F772713 |
:107E7000689DC001699D900D789D900D1124280F7B |
:107E8000391F37FF02C00C940B5335952795359554 |
:107E900027958091A008482F5527409FC001419FFA |
:107EA000900D509F900D1124820F931F90932405E5 |
:107EB0008093230520914B0530914C05821B930B39 |
:107EC0009093750480937404809125059091260504 |
:107ED0009C01220F331F280F391F6C9DC0016D9D1F |
:107EE000900D7C9D900D1124280F391F37FF02C083 |
:107EF0000C94075335952795359527954E9FC001CE |
:107F00004F9F900D5E9F900D1124820F931F9093B1 |
:107F10002605809325052091490530914A05821B4D |
:107F2000930B909373048093720480919308E82FCD |
:107F3000FF27EE0FFF1FE25AF74F80819181909546 |
:107F400081959F4F8330910514F40C942F4A02972A |
:107F500090937104809370040E941E608C01809144 |
:107F600094039927AA2797FDA095BA2FBC01CD01AC |
:107F70000E94C564DC01CB0120E030E040E251E426 |
:107F8000BC01CD010E946664DC01CB01BC01CD01C6 |
:107F90000E94A864DC01CB01809352096091930395 |
:107FA0008093F60860930E098091370780FF06C022 |
:107FB00080915B09813810F00C94C54A10936F04CE |
:107FC00000936E0480916E0490916F0497FF02C03D |
:107FD0000C9401538091980882FD02C00C94784A59 |
:107FE00010921F094091740450917504CA0157FF03 |
:107FF00002C00C94834A959587959595879597FF30 |
:1080000002C00C948C4A20914F04309150042817E0 |
:10801000390714F00C94374ACA0157FF02C00C9478 |
:10802000035497FF02C00C940054BC0175956795EA |
:10803000759567956536710514F40C943A4A64E6B3 |
:1080400070E04091720450917304CA0157FD02C060 |
:108050000C94434A0396959587959595879597FD3A |
:1080600002C00C944B4A909581959F4F20914D04EE |
:1080700030914E042817390714F40C94544AC9015E |
:108080000197A0918304AA2311F40C946E4A1092D4 |
:10809000500410924F0410924E0410924D045091CF |
:1080A0009108E52FFF27EE0FFF1FE25AF74F40918F |
:1080B000B808242F3327808191812817390734F499 |
:1080C0008091DB0882FF02C00C94C04AE52FFF2795 |
:1080D000EE0FFF1FE25AF74F842F99272091B9081E |
:1080E000821B9109208131812817390714F41092DD |
:1080F0006204E52FFF27EE0FFF1FE25AF74F842F90 |
:10810000992722273327281B390B808191818217D9 |
:10811000930734F48091DB0883FF02C00C94BB4AC0 |
:1081200080916104882391F0E52FFF27EE0FFF1F58 |
:10813000E25AF74F8091B9089927841B9109208151 |
:1081400031818217930714F40C94474B6091900887 |
:10815000E62FFF27EE0FFF1FE25AF74F242F33279A |
:10816000808191812817390734F48091DB0880FFE2 |
:1081700002C00C94B54A50915F04552399F0E62F44 |
:10818000FF27EE0FFF1FE25AF74F842F9927209108 |
:10819000B908821B9109208131812817390714F40D |
:1081A0000C94424BE62FFF27EE0FFF1FE25AF74FCA |
:1081B000842F992722273327281B390B808191810F |
:1081C0008217930734F48091DB0881FF02C00C947E |
:1081D000B04A80916004882391F0E62FFF27EE0FCC |
:1081E000FF1FE25AF74F8091B9089927841B910924 |
:1081F000208131818217930714F40C944B4B8091AA |
:108200006204882331F480916104882311F40C9472 |
:10821000AD4A91E0552331F480916004882311F434 |
:108220000C94284B81E080936404109263041092B4 |
:10823000620410926104F0916304FF8FFF2321F424 |
:1082400080916404882369F08091B7089927A980F8 |
:10825000BA808A159B0514F49A83898381E0809300 |
:108260008104AA2311F40C942A4A109271041092EA |
:10827000700410927504109274041092730410929A |
:1082800072049AE59093520988E780931F099093AE |
:10829000F6088C8B80930E0910926304109264048C |
:1082A0001F8E2091120930911309409114095091A9 |
:1082B0001509C090C204D090C304E090C404F090AB |
:1082C000C504C88AD98AEA8AFB8A2C0D3D1D4E1D39 |
:1082D0005F1D8091190990911A09A0911B09B09115 |
:1082E0001C09E090BA04F090BB040091BC0410910A |
:1082F000BD04EF8AF88E098F1A8F8E0D9F1DA01F67 |
:10830000B11FA0900509B0900609C0900709D09050 |
:108310000809ADA6BEA6CFA6D8AAC090BE04D0902C |
:10832000BF04E090C004F090C104CB8EDC8EED8ED3 |
:10833000FE8EEDA4FEA40FA518A9AB8CBC8CCD8C31 |
:10834000DE8CEA0CFB1C0C1D1D1DEDA6FEA60FA766 |
:1083500018ABC090F708D090F808E090F908F090BA |
:10836000FA08C9A6DAA6EBA6FCA6E090B604F0903F |
:10837000B7040091B8041091B904EDA2FEA20FA3B6 |
:1083800018A7A9A4BAA4CBA4DCA4AE0CBF1CC01E21 |
:10839000D11EA9A6BAA6CBA6DCA6B0906404BD8A5D |
:1083A000BB2011F00C94C6490F8D002311F00C94E2 |
:1083B000C6498093190990931A09A0931B09B09399 |
:1083C0001C09209312093093130940931409509308 |
:1083D00015098091160890911708815092400CF071 |
:1083E0009FC680916D04882309F09AC68091140479 |
:1083F000909115048F3F910509F008F4A0C7ED890D |
:10840000EE2311F00C94544BFF8DFF2311F00C94CC |
:10841000544B009181040F87002311F00C94544BAE |
:108420001091C0081CA3112311F40C94544B2DA5DA |
:108430003EA54FA558A920930509309306094093FE |
:1084400007095093080989A59AA5ABA5BCA58093F7 |
:10845000F7089093F808A093F908B093FA08809170 |
:10846000120990911309A0911409B0911509B7FF51 |
:1084700002C00C94EA55292E3A2E4B2E552447FC67 |
:108480005A94209212093092130940921409509282 |
:1084900015098091190990911A09A0911B09B091B1 |
:1084A0001C09B7FF02C00C94E455892F9A2FAB2FFB |
:1084B000BB27A7FDBA958B839C83AD83BE83809336 |
:1084C000190990931A09A0931B09B0931C09809174 |
:1084D000A408E82EFF24002711272091B204309130 |
:1084E000B3044091B4045091B504C801B7010E948F |
:1084F0003F6597FF02C00C940256672E782E892E96 |
:10850000992487FC9A942091AE043091AF04409155 |
:10851000B0045091B104C801B7010E943F6597FFB4 |
:1085200002C00C94FC55A72EB82EC92EDD24C7FC22 |
:10853000DA94D201C10186199709A809B9092091D5 |
:10854000BF08E22EFF2400271127BC01CD01A8019E |
:1085500097010E94B36539014A0119012A018B81F3 |
:108560009C81AD81BE818A199B09AC09BD09BC0102 |
:10857000CD01A80197010E94B365D401C30197FE04 |
:1085800002C00C94F655892F9A2FAB2FBB27A7FD5D |
:10859000BA95BC01DA01C90157FF02C00C94F0552D |
:1085A000892F9A2FAB2FBB27A7FDBA956C0180911D |
:1085B0004F049091500481349105D4F480914D047E |
:1085C00090914E04813491059CF480919308E82F9A |
:1085D000FF27EE0FFF1FE25AF74F80819181019034 |
:1085E000F081E02DF7FF02C00C946D567A9734F0BD |
:1085F0008091BD098F3F11F40C948555EB8CFC8C58 |
:108600000D8D1E8D288939894A895B89E21AF30A02 |
:10861000040B150BEFAAF8AE09AF1AAFE0920005F4 |
:10862000F092010500930205109303058DA19EA110 |
:10863000AFA1B8A5EF88F88C098D1A8D8E199F0906 |
:10864000A00BB10B8F839887A987BA878093040505 |
:1086500090930505A0930605B09307050FA918ADE3 |
:1086600029AD3AAD009308051093090520930A053A |
:1086700030930B0580930C0590930D05A0930E0588 |
:10868000B0930F0580919E0490919F04A091A00447 |
:10869000B091A104801B910BA20BB30B80939E049D |
:1086A00090939F04A093A004B093A104809196049A |
:1086B00090919704A0919804B09199042F813885E6 |
:1086C00049855A85821B930BA40BB50B80939604A6 |
:1086D00090939704A0939804B09399043CA13323FA |
:1086E00071F120917F04309180042138310594F09C |
:1086F0008091D6049091D70401969093D7048093EB |
:10870000D60480911D0990911E09019690931E092F |
:1087100080931D0920583F4F94F48091D604909186 |
:10872000D70401979093D7048093D60480911D09B4 |
:1087300090911E09019790931E0980931D09109234 |
:10874000800410927F0401E0A02EB12C8FA998AD77 |
:10875000A9ADBAADB7FF02C00C94CE55815092407E |
:10876000A040B0401CF014E0A12EB12C80912D054A |
:1087700090912E05A0912F05B0913005E09012093F |
:10878000F090130900911409109115098E199F0991 |
:10879000A00BB10B815E914BAF4FBF4F8F539C49E4 |
:1087A000A040B04010F40C943C55F091BE09FE8BF3 |
:1087B000F93114F40C94B855B0922805A09227050D |
:1087C0008FA998ADA9ADBAAD81509041A040B040FD |
:1087D00014F40C94455580912905882311F40C94C8 |
:1087E0001A5670936604609365048FA998ADA9AD7D |
:1087F000BAADB7FF02C00C94B1569C01AD01B7FFF2 |
:1088000002C00C94C056B9E0559547953795279509 |
:10881000BA95D1F78091270590912805820F931F73 |
:1088200090932805809327052FA938AD49AD5AADFF |
:1088300057FF02C00C94BA5639014A01A3E095943F |
:10884000879477946794AA95D1F713012401F9E8E6 |
:108850006F16F3E17F06F0E08F06F0E09F0644F02C |
:10886000F8E86F2EF3E17F2E812C912C1301240167 |
:10887000D401C30197FE02C00C948156892F9A2F10 |
:10888000AB2FBB27A7FDBA95680F791F2FA938AD6D |
:1088900049AD5AAD203080EF38078FEF48078FEF92 |
:1088A000580714F00C94595580912A05882311F427 |
:1088B0000C94D7557093660460936504DA01C9017E |
:1088C00057FF02C00C9464569C01AD01B7FF02C073 |
:1088D0000C949C5669E055954795379527956A9570 |
:1088E000D1F78091270590912805820F931F9093CF |
:1088F0002805809327052FA938AD49AD5AAD57FFFC |
:1089000002C00C94965639014A0143E0959487942D |
:10891000779467944A95D1F798E769169CEE7906A3 |
:108920009FEF89069FEF990644F438E7632E3CEEEB |
:10893000732E3FEF832E3FEF932E609217057092B8 |
:1089400018058092190590921A05D401C30197FE6B |
:1089500002C00C947B56892F9A2FAB2FBB27A7FD03 |
:10896000BA956091650470916604680F791FACA197 |
:108970002A2F33278091270590912805281739073A |
:1089800024F43093280520932705BE89BB2379F072 |
:108990002B2F332727FD30958091270590912805AF |
:1089A0002817390724F430932805209327052FA989 |
:1089B00038AD49AD5AAD213831054105510574F046 |
:1089C0008091DA049091DB042091270530912805ED |
:1089D000820F931F9093DB048093DA048FA998ADE4 |
:1089E000A9ADBAAD80589F4FAF4FBF4F74F480917F |
:1089F000DA049091DB042091270530912805821B31 |
:108A0000930B9093DB048093DA04B1E0AB2EB12C8E |
:108A10008F819885A985BA85B7FF02C00C941F562F |
:108A200081509240A040B0401CF0A4E0AA2EB12C8E |
:108A300020E030E040E050E0809131059091320537 |
:108A4000A0913305B09134056090190970901A090E |
:108A500080901B0990901C0986199709A809B909EB |
:108A6000815E914BAF4FBF4F8F539C49A040B040A8 |
:108A700028F0FE89F93114F40C94A255B09228051F |
:108A8000A09227058F819885A985BA85815090414C |
:108A9000A040B04014F40C944D5580912B058823D0 |
:108AA00011F40C940D56D0926804C09267048F8123 |
:108AB0009885A985BA85B7FF02C00C94A856B7FF60 |
:108AC00002C00C944F56F9E0B595A79597958795F8 |
:108AD000FA95D1F7A80EB91EB0922805A0922705E5 |
:108AE0002F81388549855A8557FF02C00C94495615 |
:108AF000E3E05595479537952795EA95D1F72938BD |
:108B0000F3E13F07F0E04F07F0E05F0714F40C9447 |
:108B1000395688E893E1A0E0B0E080931B0590937C |
:108B20001C05A0931D05B0931E0580911B05909117 |
:108B30001C05A0911D05B0911E05B7FF02C00C9445 |
:108B40004356892F9A2FAB2FBB27A7FDBA95C0900C |
:108B50006704D0906804C80ED91E2F8138854985D6 |
:108B60005A85203080EF38078FEF48078FEF58077E |
:108B700014F00C94495580912C05882311F40C9421 |
:108B80000856D0926804C0926704DA01C90157FF01 |
:108B900002C00C945B569C01AD01B7FF02C00C945F |
:108BA0005556B9E05595479537952795BA95D1F71C |
:108BB0008091270590912805820F931F9093280597 |
:108BC000809327052F81388549855A8557FF02C034 |
:108BD0000C947556A3E05595479537952795AA951A |
:108BE000D1F728379CEE39079FEF49079FEF5907C8 |
:108BF00014F00C942F5688E79CEEAFEFBFEF8093F4 |
:108C00001B0590931C05A0931D05B0931E05809134 |
:108C10001B0590911C05A0911D05B0911E05B7FF85 |
:108C200002C00C948756892F9A2FAB2FBB27A7FD24 |
:108C3000BA95C0906704D0906804C80ED91EACA144 |
:108C40002A2F332780912705909128052817390767 |
:108C500024F43093280520932705BE89BB2379F09F |
:108C60002B2F332727FD30958091270590912805DC |
:108C70002817390724F430932805209327052F81DE |
:108C8000388549855A85213831054105510574F0EB |
:108C90008091D8049091D90420912705309128051E |
:108CA000820F931F9093D9048093D8048F81988565 |
:108CB000A985BA8580589F4FAF4FBF4F0CF00AC5AA |
:108CC0008091D8049091D9042091270530912805EE |
:108CD000821B930B9093D9048093D804FBC42998EA |
:108CE000A0906E04B0906F04BA82A982809176043D |
:108CF000843610F40C94DE3D809176048D3810F4A7 |
:108D00000C94383E109283049091AB0882E3989FB4 |
:108D1000C00111249093110580931005E981FA8117 |
:108D2000B9970CF09BC480914B0490914C048F3FF9 |
:108D3000910519F010F00C94FA521092F40410926C |
:108D4000F5041092F6041092F7041092F8041092B1 |
:108D5000F9041092FA041092FB048A3F910511F471 |
:108D60000C94105530919208E32FFF27EE0FFF1F50 |
:108D7000E25AF74F80819181813591050CF4E9C069 |
:108D800040916D04442309F0E4C080919308E82FDA |
:108D9000FF27EE0FFF1FE25AF74F808191818C343D |
:108DA000910514F40C945E54809112058F5F893CF8 |
:108DB00010F40C9434552C3010F00C949F552998D5 |
:108DC00010926D041092120510924C0410924B04F4 |
:108DD00060919008E62FFF27EE0FFF1FE25AF74F32 |
:108DE000808191818734910514F00C949B555091AA |
:108DF0009108E52FFF27EE0FFF1FE25AF74F808102 |
:108E000091810190F081E02DF7FF02C00C948D5606 |
:108E1000E734F1050CF470C021E0A52FBB27AA0FA1 |
:108E2000BB1FA25AB74F8D919C9111978734910522 |
:108E300044F0E62FFF27EE0FFF1FE25AF74F808125 |
:108E400091818D919C918734910564F0E62FFF27E5 |
:108E5000EE0FFF1FE25AF74F808191818734910511 |
:108E60000CF022E0E52FFF27EE0FFF1FE25AF74F2D |
:108E7000808191818634910564F4E62FFF27EE0FFF |
:108E8000FF1FE25AF74F80819181873491050CF0E2 |
:108E900023E0E52FFF27EE0FFF1FE25AF74F8081F7 |
:108EA00091818A5B9F4F64F4E62FFF27EE0FFF1F2F |
:108EB000E25AF74F80819181873491050CF024E0CC |
:108EC000E52FFF27EE0FFF1FE25AF74F80819181B8 |
:108ED0008A5B9F4F64F4E62FFF27EE0FFF1FE25AD5 |
:108EE000F74F80819181863491050CF425E0822F23 |
:108EF0000E94FF0350919108E52FFF27EE0FFF1FFF |
:108F0000E25AF74F808191810190F081E02DF7FFC7 |
:108F100002C00C9428567E9714F00C9465558091ED |
:108F20009008E82FFF27EE0FFF1FE25AF74F8081CE |
:108F300091818A5B9F4F14F00C94655581E080937A |
:108F40002B0788EE93E09093020480930104309104 |
:108F50009208E32FFF27EE0FFF1FE25AF74F8081A1 |
:108F600091818B5A9F4F14F00C94383ED090930807 |
:108F7000ED2DFF27EE0FFF1FE25AF74F8081918101 |
:108F8000855B9F4F14F00C94DA53809113058F5F2B |
:108F9000893C10F40C94FF5488EC8093130581E015 |
:108FA00090E090934C0480934B0481E080936D0497 |
:108FB0001092FC041092FD041092FE041092FF0423 |
:108FC00010929204109293041092940410929504BB |
:108FD00010928E0410928F041092900410929104BB |
:108FE0008091A408E82EFF240027112780913C09D6 |
:108FF00090913D099C01442737FD4095542FC801AD |
:10900000B7010E943F65DC01CB018093A2049093DD |
:10901000A304A093A404B093A5048091580990914F |
:1090200059099C01442737FD4095542FC801B701C9 |
:109030000E943F65DC01CB0180939A0490939B04CE |
:10904000A0939C04B0939D048091C2049091C304AA |
:10905000A091C404B091C50480939E0490939F0492 |
:10906000A093A004B093A1048091BA049091BB0492 |
:10907000A091BC04B091BD04809396049093970492 |
:10908000A0939804B09399041092F4041092F504FC |
:109090001092F6041092F7041092F8041092F9045A |
:1090A0001092FA041092FB0480914A048860809325 |
:1090B0004A048091C50881FD02C00C94DC53809164 |
:1090C000980880FF10C080911C0390911D03875B5E |
:1090D000934038F480911C0390911D038E5E924062 |
:1090E00010F40E9418190E94F136D09093080C9445 |
:1090F000DC5380911103909112038F5F9F4F11F009 |
:109100000C94E43D88E99AE390930204809301046F |
:1091100080E09CE090931203809311030C94E43D53 |
:109120009090BD096FEF961611F40C941153809135 |
:10913000A408A82EBB24CC24DD24688979898A89D7 |
:109140009B89A60195010E94B36579018A018091EE |
:109150003C0990913D09AA2797FDA095BA2FE81ADE |
:10916000F90A0A0B1B0B6F89788D898D9A8DA601E0 |
:1091700095010E94B36559016A0180915809909147 |
:109180005909AA2797FDA095BA2FA81AB90ACA0AA1 |
:10919000DB0A292C332427FC3094432C532CC201A6 |
:1091A000B101A80197010E943F6597FD78C23B017C |
:1091B0004C01F9E09594879477946794FA95D1F7E8 |
:1091C000C201B101A60195010E943F6597FF02C04F |
:1091D0000C943C545B016C01E9E0D594C794B794BE |
:1091E000A794EA95D1F780914F049091500481346F |
:1091F00091053CF480914D0490914E048134910589 |
:10920000C4F0D401C30197FE02C00C940B553C017D |
:109210004D019594879477946794D601C501D7FE44 |
:1092200002C00C9406555C016D01D594C794B794A7 |
:10923000A79480919308E82FFF27EE0FFF1FE25AB3 |
:10924000F74F808191810190F081E02DF7FF02C0FE |
:109250000C9437547A97A4F0C401B30123E030E0B2 |
:1092600040E050E00E94B36539014A01C601B501F2 |
:1092700023E030E040E050E00E94B36559016A010C |
:109280008091BF09282F332727FD3095432F532F77 |
:10929000261537054805590514F439014A0199275F |
:1092A00087FD9095909581959F4FAA2797FDA09552 |
:1092B000BA2F681679068A069B0614F43C014D0104 |
:1092C0002A153B054C055D0514F459016A01A816E1 |
:1092D000B906CA06DB0614F45C016D018091A20494 |
:1092E0009091A304A091A404B091A50486199709B4 |
:1092F000A809B9098093A2049093A304A093A4049D |
:10930000B093A50480919A0490919B04A0919C0431 |
:10931000B0919D048A199B09AC09BD0980939A04F8 |
:1093200090939B04A0939C04B0939D04809114049B |
:10933000909115048F3F910511F008F060C8ADA41D |
:10934000BEA4CFA4D8A8A0920509B0920609C092E5 |
:109350000709D0920809C9A4DAA4EBA4FCA4C0921E |
:10936000F708D092F808E092F908F092FA08009114 |
:1093700081040F87A0907004B0907104C501B7FEFE |
:1093800009C2882799278A199B0904C21092B2043E |
:109390001092B3041092B4041092B5041092AE046B |
:1093A0001092AF041092B0041092B10410921209FE |
:1093B00010921309109214091092150910921909AC |
:1093C00010921A0910921B0910921C0919A61AA6CC |
:1093D0001BA61CA620E030E040E050E02DA73EA7F1 |
:1093E0004FA758AB8091A2049091A304A091A4042C |
:1093F000B091A50480939E0490939F04A093A00431 |
:10940000B093A10480919A0490919B04A0919C0434 |
:10941000B0919D048093960490939704A093980430 |
:10942000B0939904109215041092140410926604DB |
:109430001092650410926804109267043D893323EA |
:1094400011F00C94F6414F8D442311F00C94F64129 |
:109450000C94E941B0900E09BC8A0C9451413FEF45 |
:109460008E3F93070CF073C002960C94A83FB9018D |
:10947000615070404091720450917304CA0157FFCB |
:1094800002C00C942A40959587959595879597FFEE |
:1094900002C00C94334020914D0430914E042817A3 |
:1094A000390714F00C943F40CA0157FF02C00C94D6 |
:1094B0000B5497FF02C00C94085495958795959589 |
:1094C00087958536910514F40C94414084E690E02C |
:1094D000A0918304AA2311F00C94474090934E046A |
:1094E00080934D047093500460934F040C944F404C |
:1094F00060931F094091740450917504CA0157FD8F |
:1095000002C00C94FB3F039695958795959587959A |
:1095100097FD02C00C940340909581959F4F0C9449 |
:10952000034010926D040C94383E10926D0410921A |
:1095300083042A3011F00C94F53D289A0C94FA3DDE |
:10954000BDE78B2E912CA12CB12C0C94B43E109223 |
:109550007104109270040C94AC3F982F0C940A4143 |
:1095600081E0809360040C94FF4081E080935F046D |
:10957000582F0C94D24081E0809361040C94A64053 |
:1095800081E0809362040C94794080913007282F09 |
:10959000332727FD309580919F08482F5527249F1A |
:1095A000C001259F900D349F900D112420917404CB |
:1095B00030917504820F931F909375048093740407 |
:1095C00080913107992787FD9095849FD001859FD1 |
:1095D000B00D949FB00D1124CD01209172043091F3 |
:1095E0007304820F931F909373048093720480918D |
:1095F0003207992787FD909520917004309171046E |
:10960000820F931F909371048093700480913407AC |
:10961000282F332727FD309580919D089927289F73 |
:10962000F001299FF00D389FF00D1124F0938A036B |
:10963000E09389038091330799278017910714F0ED |
:109640000C94DE3F90936F0480936E040C94E23F81 |
:1096500090936304809364040C941B4180916D0487 |
:10966000882309F460CB80914B0490914C04FFEF68 |
:109670008F3F9F0709F45BCB019690934C04809336 |
:109680004B0455CB10925F0450E00C94D2401092E2 |
:1096900061040C94A640109260040C94FF40615049 |
:1096A0007E4F8F4F9F4F83CD60E070E06B01109233 |
:1096B00081041F86E0901209F090130900911409AB |
:1096C000109115096090190970901A0980901B0972 |
:1096D00090901C0980911F09882309F031C71092CE |
:1096E0006804109267041092660410926504E09278 |
:1096F0002D05F0922E0500932F05109330056092F2 |
:1097000031057092320580923305909234051092A3 |
:10971000B2041092B3041092B4041092B5041092E3 |
:10972000AE041092AF041092B0041092B1041092E3 |
:10973000AA041092AB041092AC041092AD041092E3 |
:10974000120910921309109214091092150910921F |
:10975000190910921A0910921B0910921C091092F3 |
:109760000509109206091092070910920809109233 |
:10977000F7081092F8081092F9081092FA0810925F |
:10978000150410921404A0907004B0907104C501E7 |
:10979000B7FCF7CD40977CF068EE262E63E0362EBE |
:1097A0003092A6032092A5038091980884FD03C0FF |
:1097B00081E080931605D090A108ED2CFF240027AE |
:1097C0001127B501882777FD8095982F9501B7FC63 |
:1097D0000CC7442737FD4095542F0E943F659B01DD |
:1097E000AC01C801B7010E943F6597FDF9C659E079 |
:1097F00095958795779567955A95D1F79B018D2D0E |
:1098000099278A9DA0018B9D500D9A9D500D112482 |
:10981000CA0157FDE3C69595879595958795280FBD |
:10982000391FC901AA2797FDA095BA2F8093FC0480 |
:109830009093FD04A093FE04B093FF042091920442 |
:10984000309193044091940450919504281B390B56 |
:109850004A0B5B0B213563EC360760E0460760E09E |
:1098600056070CF464C680E593ECA0E0B0E080936A |
:10987000920490939304A0939404B09395048091E0 |
:10988000920490919304A0919404B0919504805B0C |
:109890009C43AF4FBF4F64F480EB9CE3AFEFBFEF4F |
:1098A0008093920490939304A0939404B0939504AE |
:1098B00060908804709089046114710409F446C5AD |
:1098C0008091980883FF42C588899989AA89BB89B4 |
:1098D000B7FDADC709E0B595A795979587950A950A |
:1098E000D1F798AF8FAB97FDACC78F89988DA98DB5 |
:1098F000BA8DB7FDA1C719E0B595A795979587953E |
:109900001A95D1F7BC0197FDAEC7CFA8D8ACC61643 |
:10991000D70614F478AF6FAB6FA978AD77FDA0C709 |
:109920002B01559447945594479455944794089423 |
:10993000411C511CACE1EA2EA2E0FA2E6E0C7F1CF9 |
:1099400073010027F7FC0095102F24EE3DEF620E07 |
:10995000731EA0905409B0905509C0905609D0903C |
:1099600057098091850390918603A0918703B09158 |
:10997000880388A399A3AAA3BBA3C601B50128A104 |
:1099800039A14AA15BA10E94B365E21AF30A040B54 |
:10999000150BC801B70128E631E040E050E00E9415 |
:1099A000B365DC01CB018C01045B104080904D0954 |
:1099B00090904E09C40197FC4EC78138910514F070 |
:1099C00000E010E02090A5033090A603211431049C |
:1099D00099F4AFA9B8AD59977CF480917F04909128 |
:1099E0008004800F911F9093800480937F04809166 |
:1099F0001605882309F0EAC7C801880F991F880F48 |
:109A0000991F880F991FB2010E947E659B01442710 |
:109A100037FD4095542F2A0D3B1D4C1D5D1D209395 |
:109A20005409309355094093560950935709F090C3 |
:109A300096036F2D7727EFA9F8AD6E9FC0016F9F3A |
:109A4000900D7E9F900D112497FD03C795958795E6 |
:109A500095958795959587959595879595958795EE |
:109A6000681B790B78AF6FAB77FDDAC62114310430 |
:109A700009F008C700914F041091500480914D04E3 |
:109A800090914E04080F191F17FDE3C71595079510 |
:109A90001595079515950795005C1F4FCA01B901EB |
:109AA00028A139A14AA15BA10E94B365DA01C901CD |
:109AB0002091860430918704442737FD4095542F28 |
:109AC000821B930BA40BB50B845E9D4FAF4FBF4F12 |
:109AD000BC01CD0128E631E040E050E00E94B365D2 |
:109AE000DC01CB01845B9040CFA8D8AC8C9D5001A9 |
:109AF0008D9DB00C9C9DB00C1124C501B8010E9435 |
:109B00007E6583E0F89E8001112418AF0FAB061725 |
:109B100017070CF0BFC6B801CB01AA2797FDA09587 |
:109B2000BA2F209192043091930440919404509163 |
:109B30009504820F931FA41FB51F809392049093E6 |
:109B40009304A0939404B0939504809115058150DB |
:109B50008F3F09F404C4809315051F85112381F0FC |
:109B60001092F8041092F9041092FA041092FB0477 |
:109B70001092F4041092F5041092F6041092F70477 |
:109B80002D89222309F0C4C480911F099927AA278F |
:109B9000BB27BC01CD01288939894A895B890E948C |
:109BA0003F65DC01CB01BC01CD0128EF3AE240E08A |
:109BB00050E00E94B36529013F8D332309F0A5C40D |
:109BC00080911F099927AA27BB27BC01CD012F89A6 |
:109BD000388D498D5A8D0E943F65DC01CB01BC0157 |
:109BE000CD0128EF3AE240E050E00E94B365190150 |
:109BF000A090F108B090F20849ECA416B1040CF45E |
:109C000079C4E8ECAE2EB12CB092F208A092F10823 |
:109C10000091FC081091FD08093C11050CF462C488 |
:109C200008EC10E01093FD080093FC088091FE08FA |
:109C30009091FF08AA2797FDA095BA2F209152096D |
:109C4000C22EDD24EE24FF24BC01CD01A701960124 |
:109C50000E943F659B01AC01C501AA2797FDA09515 |
:109C6000BA2F67E0880F991FAA1FBB1F6A95D1F70B |
:109C7000280F391F4A1F5B1F57FD70C486E055959A |
:109C80004795379527958A95D1F7C201820F931F83 |
:109C900098AF8FAB3C018091EF089091F008AA2714 |
:109CA00097FDA095BA2FBC01CD01A70196010E9496 |
:109CB0003F659B01AC01C801AA2797FDA095BA2F6B |
:109CC00007E0880F991FAA1FBB1F0A95D1F7280F1D |
:109CD000391F4A1F5B1F57FD3CC416E05595479539 |
:109CE000379527951A95D1F75101A20EB31E65013C |
:109CF000880C991CC401AA2797FDA095BA2F209122 |
:109D0000F608332744275527BC01CD010E943F6543 |
:109D10007B018C0197FD40C4B6E015950795F7943B |
:109D2000E794BA95D1F73C89832F9927AA27BB27B7 |
:109D30002091A6043091A7044091A8045091A90451 |
:109D4000BC01CD010E943F65DC01CB01BC01CD010E |
:109D500020EF35E540E050E00E94B3654701820EF8 |
:109D6000931EA40194018FA998AD815090442CF0CA |
:109D7000E0E0F0E4F8AFEFAB3F01F0E06F16F0EC9D |
:109D80007F060CF0A8C380E090EC9093FF088093CE |
:109D9000FE0801E0C01600E4D00624F0A12CA0E4E7 |
:109DA000BA2E650110E0C11610ECD1060CF08EC37E |
:109DB00080E090EC9093F0088093EF08415050447D |
:109DC0001CF020E030E4490180E0881680EC980621 |
:109DD0000CF077C380E090EC90934E0980934D098E |
:109DE000809141048823C1F080914B0490914C04F0 |
:109DF0000297C09788F4A981BA811A161B0664F4E9 |
:109E000081E090E090934C0480934B04809103098F |
:109E1000E82FFF27FA83E983A980BA80AA0CBB1C2C |
:109E2000AA0CBB1CBA82A9820E94EE5EA81AB90ACB |
:109E3000BA82A982A0904C098A2D9927880F991F70 |
:109E4000880F991F80559040C980DA808C159D0538 |
:109E500014F49A838983E980FA80F092E107E09212 |
:109E6000E0078091FC049091FD04A091FE04B09164 |
:109E7000FF04880F991FAA1FBB1F880F991FAA1FD5 |
:109E8000BB1F00914D0910914E09081B190B1EAB09 |
:109E90000DAB9701213A31050CF42CC2C701F7FC38 |
:109EA000BEC3959587954DA95EA98417950714F4AF |
:109EB0009EAB8DAB909581959F4FADA9BEA9A8177C |
:109EC000B9070CF428C22A2D3327220F331F220F83 |
:109ED000331FC901A981BA818A1B9B0BEDA9FEA979 |
:109EE0008E179F0714F49EAB8DAB69817A81621B3C |
:109EF000730BCDA8DEA8C616D70614F47EAB6DABE7 |
:109F00000091FE081091FF088091740490917504EF |
:109F1000081B190B1093100900930F0990901F094B |
:109F2000992009F4F8C2481A590AC201AA2797FDD4 |
:109F3000A095BA2F2091F4043091F5044091F604D5 |
:109F40005091F704820F931FA41FB51F8093F40450 |
:109F50009093F504A093F604B093F7046091F40491 |
:109F60007091F5048091F6049091F70461302AEF26 |
:109F7000720720E0820720E0920774F080E09AEFF9 |
:109F8000A0E0B0E08093F4049093F504A093F6046D |
:109F9000B093F704BC01CD01603036E073073FEFAA |
:109FA00083073FEF930774F480E096E0AFEFBFEFD5 |
:109FB0008093F4049093F504A093F604B093F7040F |
:109FC000BC01CD01E0909B03F0909C0397014427D6 |
:109FD00037FD4095542F0E94B3656801C20ED31E11 |
:109FE000B0908B036B2D7727882799272DA93EA941 |
:109FF00037FDF0C237FDD9C23595279549815A8181 |
:10A00000240F351F442737FD4095542F0E943F658C |
:10A0100097FDDBC226E095958795779567952A95FC |
:10A02000D1F79B016C157D050CF46B016627772732 |
:10A03000621B730BC616D7060CF46B010091EF0878 |
:10A040001091F0088091720490917304081B190B11 |
:10A050001093EE080093ED08992009F462C2281AC3 |
:10A06000390AC101AA2797FDA095BA2F2091F804BB |
:10A070003091F9044091FA045091FB04820F931F30 |
:10A08000A41FB51F8093F8049093F904A093FA04D9 |
:10A09000B093FB046091F8047091F9048091FA0484 |
:10A0A0009091FB0461305AEF750750E0850750E04E |
:10A0B000950774F080E09AEFA0E0B0E08093F80498 |
:10A0C0009093F904A093FA04B093FB04BC01CD0172 |
:10A0D0006030A6E07A07AFEF8A07AFEF9A0774F413 |
:10A0E00080E096E0AFEFBFEF8093F8049093F9041F |
:10A0F000A093FA04B093FB04BC01CD01970144275F |
:10A1000037FD4095542F0E94B3657801E20EF31E8F |
:10A110006B2D7727882799272DA93EA937FD38C2AF |
:10A1200037FD21C235952795E981FA812E0F3F1F12 |
:10A13000442737FD4095542F0E943F6597FD23C269 |
:10A1400016E095958795779567951A95D1F79B01B8 |
:10A150006E157F050CF47B0166277727621B730B56 |
:10A16000E616F7060CF47B018601222717FD2095E1 |
:10A17000322F0B871C872D873E8780910309282F5C |
:10A1800033273AAB29AB4A2D55275CAB4BABBFE32A |
:10A19000CB2EB9E0DB2E00E815E02701662457FC42 |
:10A1A0006094762C8DA99EA94C01AA2497FCA094BA |
:10A1B000BA2CABE03A2EF0E2EF2EF9E0FF2E06C00B |
:10A1C000F8AFEFABEFA9D601EC93E0C5F801258518 |
:10A1D00012160CF0A3C049815A81CA01AA2797FD23 |
:10A1E000A095BA2F332727FD3095432F532FBC015D |
:10A1F000CD010E943F6597FDA2C0E6E09595879549 |
:10A2000077956795EA95D1F778AF6FABF8018685BA |
:10A21000282F332727FD3095432F532F6B857C85BF |
:10A220008D859E850E943F6597FD84C056E095957B |
:10A230008795779567955A95D1F72FA938AD260F51 |
:10A24000371F38AF2FABF8018785282F332727FD1D |
:10A250003095432F532FC301B2010E943F6597FDF4 |
:10A2600064C046E095958795779567954A95D1F7AF |
:10A270002FA938AD260F371F38AF2FABF8018089D3 |
:10A28000282F332727FD3095432F532FC501B401C5 |
:10A290000E943F65DC01CB01B7FD43C036E0B595B8 |
:10A2A000A795979587953A95D1F7F70160817181C8 |
:10A2B0002FA938AD820F931F0E949F2BD7018D933A |
:10A2C0009C9397FD41C0959587959595879598AFF7 |
:10A2D0008FABE9A9FAA98E179F070CF471CF2BA9B0 |
:10A2E0003CA94FA958AD241735070CF06BCF38AFF8 |
:10A2F0002FAB68CFEDA9FEA9E135F10524F000E50B |
:10A3000010E01EAB0DAB2DA93EA9205B3F4F0CF01A |
:10A31000DACD80EB9FEF9EAB8DABD5CDD6011C92F5 |
:10A3200035C5CF96A11DB11DB9CF615C7F4F8F4F51 |
:10A330009F4F97CF615C7F4F8F4F9F4F77CF615C6F |
:10A340007F4F8F4F9F4F59CF0396BDCF80904D09C0 |
:10A3500090904E0980911505815008F0FCCB88E162 |
:10A36000809315058091A4089927880F991F880F5D |
:10A37000991F7C010027F7FC0095102F68897989C7 |
:10A380008A899B89A80197010E94B3653093D307FE |
:10A390002093D2076F89788D898D9A8DA8019701B6 |
:10A3A0000E94B3653093D5072093D40780913C0970 |
:10A3B00090913D0997FD22C2959587959595879532 |
:10A3C0009093D7078093D6078091580990915909A7 |
:10A3D00097FD12C295958795959587959093D90786 |
:10A3E0008093D8079092DB078092DA0780916B0404 |
:10A3F00090916C049093DD078093DC0780911608A0 |
:10A40000909117089093DF078093DE077092E3071F |
:10A410006092E20780912603909127039093E507CD |
:10A420008093E4078091540990915509A0915609B1 |
:10A43000B09157092091850330918603409187039D |
:10A4400050918803BC01CD010E94B3653093E907A8 |
:10A450002093E8078091760499279093E7078093EB |
:10A46000E60780912B0799279093F9078093F807C7 |
:10A470008091FD039091FE039093FB078093FA0770 |
:10A480008091BE09992787FD909590930908809344 |
:10A4900008088091C009992790930D0880930C08B3 |
:10A4A00080914B0590914C0590930F0880930E0876 |
:10A4B0008091490590914A05909311088093100866 |
:10A4C0004CCB30934E0920934D098ACCB092F008C2 |
:10A4D000A092EF0873CCEFA8F8ACF092FF08E092DE |
:10A4E000FE0857CC6FEF083316070CF09FCB08E33C |
:10A4F0001FEF98CB58E3A5165FEFB5060CF088CB9D |
:10A5000078E3A72E7FEFB72E7FCB2224332470CBA6 |
:10A510004424552451CBC801AA2797FDA095BA2FF2 |
:10A5200009CDC801AA2797FDA095BA2F9FCD2093EA |
:10A5300092043093930440939404509395049FC9DC |
:10A54000D0926804C09267047093660460936504B7 |
:10A55000CEC8215C3F4F4F4F5F4FBFCB215C3F4F79 |
:10A560004F4F5F4F8BCB2F5F3F4F35952795E9813D |
:10A57000FA812E0F3F1F442737FD4095542F0E942C |
:10A580003F6597FFDDCD615C7F4F8F4F9F4FD8CDEB |
:10A59000309521953F4FC4CD2FE330E040E050E0AF |
:10A5A000E20EF31E041F151FB7CB2F5F3F4F3595EB |
:10A5B000279549815A81240F351F442737FD40953F |
:10A5C000542F0E943F6597FF25CD615C7F4F8F4FD1 |
:10A5D0009F4F20CD309521953F4F0CCD03961BC941 |
:10A5E00061507E4F8F4F9F4F02C9222733272A1970 |
:10A5F0003B09EFC880914A04826080934A040C941E |
:10A60000B24610926F0410926E040C94EA3F2D5FD4 |
:10A610003F4F0C947A3F2D5F3F4F0C94453F01967E |
:10A6200040CC8091A408E82EFF24002711276889D8 |
:10A6300079898A899B89A80197010E94B3653901AC |
:10A640004A0180913C0990913D09AA2797FDA09568 |
:10A65000BA2F681A790A8A0A9B0A6F89788D898DC0 |
:10A660009A8DA80197010E94B36559016A018091F2 |
:10A67000580990915909AA2797FDA095BA2FA81AB1 |
:10A68000B90ACA0ADB0AD401C30197FCE9C13C013B |
:10A690004D0154E095948794779467945A95D1F737 |
:10A6A000D601C501D7FCD8C15C016D0144E0D59449 |
:10A6B000C794B794A7944A95D1F780914F0490918D |
:10A6C0005004813491050CF4F0C0C401B30123E0BF |
:10A6D00030E040E050E00E94B36539014A01C60114 |
:10A6E000B50123E030E040E050E00E94B36559013D |
:10A6F0006A0180919308E82FFF27EE0FFF1FE25AAF |
:10A70000F74F808191810190F081E02DF7FD9DC18F |
:10A710007A97A4F0C401B30123E030E040E050E0B8 |
:10A720000E94B36539014A01C601B50123E030E05A |
:10A7300040E050E00E94B36559016A0181E2681669 |
:10A740007104810491042CF030E2632E712C812C71 |
:10A75000912C90EE69169FEF79069FEF89069FEF87 |
:10A76000990644F420EE622E2FEF722E2FEF822EE8 |
:10A770002FEF922EA1E2AA16B104C104D1042CF04D |
:10A7800090E2A92EB12CC12CD12CB0EEAB16BFEFAC |
:10A79000BB06BFEFCB06BFEFDB0614F00C946E498F |
:10A7A00080EEA82E8FEFB82E8FEFC82E8FEFD82E09 |
:10A7B0000C946E4910921305ED2DFF27EE0FFF1F2D |
:10A7C000E25AF74F808191818C3491058CF0809111 |
:10A7D00014058F5F893C08F415C110926D0488EC54 |
:10A7E0008093140510924C0410924B040C94383E44 |
:10A7F000109214050C94383E0396ECCD0396DCCDF4 |
:10A8000003960C941540909581959F4F0C941140A0 |
:10A8100003960C945D4A909581959F4F0C94594AEC |
:10A8200084EF91E09093A6038093A5038EC9815095 |
:10A830009E4FAF4FBF4F4EC881509E4FAF4FBF4F3F |
:10A840005AC85C01B094A194B108B394B8AEAFAA51 |
:10A850004CC84F96FBC88827992788199909ADC815 |
:10A86000695F7F4F5DC8709561957F4F4EC8F095C9 |
:10A87000E195FF4F0C942A4961507E4F8F4F9F4FB7 |
:10A880000C94EA480894210831083092A6032092DB |
:10A89000A5035BC98FA998AD909581959F4F6817C7 |
:10A8A00079070CF039C9BC0137C980914D049091EA |
:10A8B0004E04813491050CF41CCF07CF8081918127 |
:10A8C000855B9F4F0CF0D4C0809112058F5F809301 |
:10A8D0001205893C10F40C94A9472C3008F0BDC136 |
:10A8E0002998A4E0B0E08FEF082E0E94DB6510925B |
:10A8F0006D041092120510924C0410924B040E94A9 |
:10A90000F136A4E0B0E08091D0049091D10497FD9D |
:10A910001CC2892F990F990B082E0E94DB65A5E0B8 |
:10A92000B0E08091D0049091D104082E0E94DB65A4 |
:10A93000A6E0B0E08091CE049091CF0497FD02C2D2 |
:10A94000892F990F990B082E0E94DB65A7E0B0E0D4 |
:10A950008091CE049091CF04082E0E94DB6508E020 |
:10A9600010E08091C8049091C904A091CA04B091EC |
:10A97000CB04BC01CD010E94A864DC01CB019C0189 |
:10A9800097FDB0C1832F992787FD9A95D801082E8E |
:10A990000E94DB6509E010E08091C8049091C90431 |
:10A9A000A091CA04B091CB04BC01CD010E94A8645F |
:10A9B000DC01CB01D801082E0E94DB650E943A041D |
:10A9C0000E94B52B309192080C94A947C301AA2785 |
:10A9D00097FDA095BA2FBC01CD0128A139A14AA1AC |
:10A9E0005BA10E943F655B016C010E94B3653093DF |
:10A9F000870420938604109216050C94FC4C8093D7 |
:10AA00001305DACE809314050C94383E0196A11DEF |
:10AA1000B11D0C9413490196A11DB11D0C94074959 |
:10AA200081E0809316051092FC041092FD041092B0 |
:10AA3000FE041092FF04109292041092930410925C |
:10AA40009404109295040C94B246F095E195FF4F52 |
:10AA50005FCE095F1F4F1AC80F96A11DB11D24CEEE |
:10AA60000F96A11DB11D13CE809312050C94A9471A |
:10AA7000409312050C94A947B0922805A09227058F |
:10AA80002091BE092E8B0C94E043109229050C9462 |
:10AA9000464410922C050C941F4620931B053093BE |
:10AAA0001C0540931D0550931E0510922B050C9418 |
:10AAB000AD45209217053092180540921905509225 |
:10AAC0001A0510922A050C94B7440E943A044DE5E9 |
:10AAD00060E978E00E94E4038091980880FF10C04C |
:10AAE00080911C0390911D03875B934038F4809103 |
:10AAF0001C0390911D038E5E924010F40E94181961 |
:10AB00000E94F1360E94DD0359CF70936604609372 |
:10AB10006504D0926804C0926704CB0177FD04C13C |
:10AB2000BC0175956795C601D7FCFCC06C01D59436 |
:10AB3000C7940C94FE42509191080C940C47299AAA |
:10AB40000C94E04620931B0530931C0540931D0593 |
:10AB500050931E051092280510922705E8EE2E2E20 |
:10AB6000E3E03E2E3092A6032092A5030C941F46EC |
:10AB700060921705709218058092190590921A0537 |
:10AB8000109228051092270588EE282E83E0382E93 |
:10AB90003092A6032092A5030C94B744B095A095DB |
:10ABA000909581959F4FAF4FBF4F0C94AE4320922D |
:10ABB0001705309218054092190550921A0581E048 |
:10ABC00080932A050C94B74481509F4FAF4FBF4FDD |
:10ABD0000C94554281509F4FAF4FBF4F0C943B4256 |
:10ABE00081509F4FAF4FBF4F0C94D04281509F4F29 |
:10ABF000AF4FBF4F0C94C34261507F4F8F4F9F4F59 |
:10AC00000C94934261507F4F8F4F9F4F0C947D4225 |
:10AC100081E080932C050C941F4620931B053093F4 |
:10AC20001C0540931D0550931E0581E080932B0564 |
:10AC30000C94AD4581E0809329050C944644B09571 |
:10AC4000A095909581959F4FAF4FBF4F0C941045A5 |
:10AC5000F095E195FF4F0C948B47299A42CE2093B3 |
:10AC60001B0530931C0540931D0550931E050C9445 |
:10AC7000074620931B0530931C0540931D055093F8 |
:10AC80001E050C94954581509F4FAF4FBF4F0C94BC |
:10AC9000A145295F3F4F4F4F5F4F0C94784581503E |
:10ACA0009E4FAF4FBF4F0C94634521503E4F4F4FC7 |
:10ACB0005F4F0C94D145B095A095909581959F4F8D |
:10ACC000AF4FBF4F0C94CB45B095A0959095819513 |
:10ACD0009F4FAF4FBF4F0C946444F095E195FF4FE9 |
:10ACE0000C94F64221503F4F4DCE295F3F4F4F4FBE |
:10ACF0005F4F0C94EA4581509F4FAF4FBF4F0C946C |
:10AD0000AB4481509F4FAF4FBF4F0C943E44815096 |
:10AD10009F4FAF4FBF4F0C941346F095E195FF4FF7 |
:10AD20000C940847019602CF0196FACE295F3F4F57 |
:10AD30004F4F5F4F0C94834421503E4F4F4F5F4F16 |
:10AD40000C946A4481509F4FFBCD81509F4FE1CDC1 |
:10AD5000B095A095909581959F4FAF4FBF4F0C94A4 |
:10AD60005F45B095A095909581959F4FAF4FBF4F90 |
:10AD70000C94FD43295F3F4F4F4F5F4F0C941C4491 |
:10AD800021503E4F4F4F5F4F0C9403443A94E2E002 |
:10AD9000F0E0EE0EFF1E0C5F1F4F0894C11CD11C8B |
:10ADA00037FE14CAEA960FB6F894DEBF0FBECDBFC9 |
:10ADB000DF91CF911F910F91FF90EF90DF90CF9097 |
:10ADC000BF90AF909F908F907F906F905F904F90CB |
:10ADD0003F902F9008958091410590914205A09158 |
:10ADE0004305B09144058093390590933A05A093AB |
:10ADF0003B05B0933C0580913D0590913E05A091A7 |
:10AE00003F05B09140058093350590933605A0939A |
:10AE10003705B0933805089510924C0510924B05F4 |
:10AE200010924A0510924905089584B1806A84B948 |
:10AE30003D9A82E58CBD1DBC459A91E090935E09D8 |
:10AE40008AEA8093620983E8809363098AE08093A9 |
:10AE500064091092660910926509109268091092AF |
:10AE600067091092C00910928409909385098DE0BA |
:10AE7000809386091092870986E080938809089557 |
:10AE8000EF92FF920F931F93F8948091A408992753 |
:10AE9000880F991F880F991F7C010027F7FC0095E8 |
:10AEA000102F8091C2049091C304A091C404B0916A |
:10AEB000C504BC01CD01A80197010E94B365309380 |
:10AEC0006609209365098091BA049091BB04A09112 |
:10AED000BC04B091BD04BC01CD01A80197010E9442 |
:10AEE000B365309368092093670920915409309124 |
:10AEF00055094091560950915709DA01C90173E08B |
:10AF0000880F991FAA1FBB1F7A95D1F7820F931F35 |
:10AF1000A41FB51F820F931FA41FB51F2091850387 |
:10AF2000309186034091870350918803BC01CD0185 |
:10AF30000E94B36530936E0920936D09E091CC04B3 |
:10AF4000F091CD048091160990911709BF010E94DC |
:10AF50007E65CB019B01220F331F220F331F280F69 |
:10AF6000391F280F391F37FDF2C0359527953595C4 |
:10AF7000279530936A09209369098091500990912F |
:10AF80005109BF010E947E659B01220F331F220FD2 |
:10AF9000331F260F371F260F371F37FDD5C03595B6 |
:10AFA00027953595279530936C0920936B0910925E |
:10AFB000CD041092CC041092170910921609109229 |
:10AFC0005109109250098091640999278C3091059C |
:10AFD00009F48AC08D3091050CF06AC08A30910561 |
:10AFE00009F433C10B9709F4B5C0789480918409B2 |
:10AFF000882309F4A0C020918A0930918B09C901E6 |
:10B0000081509E4F8F5F9340C8F440918C095091BE |
:10B010008D09CA0181509E4F8F5F934078F48091D3 |
:10B02000980885FF0BC030934C0520934B05509337 |
:10B030004A05409349058AEF80934E058091900917 |
:10B040009091910921E0893692070CF0E8C09C01AB |
:10B05000909389048093880480918604909187045A |
:10B06000281B390BC901845E9D4F68E671E00E9480 |
:10B070007E65845B90409093850480938404209146 |
:10B0800094093091950980910104909102048217EE |
:10B09000930740F480912B07882321F43093020416 |
:10B0A0002093010480918909873609F055C1BCC0FD |
:10B0B0008D30910509F404C10E9709F096CF809167 |
:10B0C000850980937509809186098093760980911E |
:10B0D0008709809377098091880980937809809106 |
:10B0E00001018093790981CF80912B07863018F078 |
:10B0F00010922B0785E08093750980916B049091E5 |
:10B100006C0490937809809377098091D908809393 |
:10B1100076098091CF08809379098091D008809337 |
:10B120007A098091D10880937B0978948091840971 |
:10B13000882309F060CF10924C0510924B051092B5 |
:10B140004A051092490508C12D5F3F4F28CF2D5F5A |
:10B150003F4F0BCF80919208E82FFF27EE0FFF1F84 |
:10B16000E25AF74F0190F081E02DE038F1050CF044 |
:10B17000D8C02FEFE138F20714F4E1E8FFEFE093D5 |
:10B18000750980919308E82FFF27EE0FFF1FE25A01 |
:10B19000F74F0190F081E02DE038F1050CF4D4C0B8 |
:10B1A000EFE7F0E0E093760980919108E82FFF2720 |
:10B1B000EE0FFF1FE25AF74F0190F081E02DE038CB |
:10B1C000F1050CF4B9C0EFE7F0E0E0937709809166 |
:10B1D0009008E82FFF27EE0FFF1FE25AF74F01906C |
:10B1E000F081E02DE038F1050CF49EC0EFE7F0E0CF |
:10B1F000E093780980917D048093790980917B04A4 |
:10B2000080937A098091790480937B0980917704F7 |
:10B2100080937C098091760480937D09E6CE20910D |
:10B2200088043091890418CF809196098093BD09D4 |
:10B23000809197098093BF09809198098093BE09F6 |
:10B24000809199098093C00987C080915E048093A2 |
:10B25000750980915D048093760980915C048093E8 |
:10B26000770980915B048093780980915A048093D8 |
:10B2700079098091590480937A09809158048093C8 |
:10B280007B098091570480937C0980914A048093C4 |
:10B290007D0980914A04837F80934A04809126032C |
:10B2A0009091270380937E098091A90880937F095C |
:10B2B000A2E0B0E00E94CE65802D8093800995CEFB |
:10B2C0008091CA08809375098091CB088093760994 |
:10B2D0008091CC08809377098091CD08809378097C |
:10B2E0008091CE08809379098091D20880937A0961 |
:10B2F0008091D30880937B098091D40880937C0946 |
:10B300008091D70880937D098091D50880937E092C |
:10B310008091D60880937F098091D8088093800916 |
:10B3200064CEEFE7F0E02BCF8FEFE138F8070CF0B9 |
:10B330005FCFE1E8FFEF5CCF6FEFE138F6070CF08D |
:10B3400044CFE1E8FFEF41CF4FEFE138F4070CF0D5 |
:10B3500029CFE1E8FFEF26CF1F910F91FF90EF90EB |
:10B36000089580915E09882309F43BC0459882E6E0 |
:10B3700099E09093600980935F0980914D05E82FD3 |
:10B38000FF27EE53FC4F982F9F5F808180936409C5 |
:10B39000963008F027C090934D0510925E090E94E8 |
:10B3A000405781E080936109000000000000000028 |
:10B3B000000000000000000000000000000000008D |
:10B3C000000000000000000000000000000000007D |
:10B3D0000000000000000000809162098093810954 |
:10B3E0008EBD089510924D05D8CF20915E0922237D |
:10B3F00009F045C00DB407FE42C084E0809300040C |
:10B40000459A3EB580914F0599278130910509F401 |
:10B4100037C0823091050CF451C0029709F439C04D |
:10B4200020916109203208F030C0459800000000EA |
:10B43000000000000000000000000000000000000C |
:10B4400000000000000000000000000000000000FC |
:10B45000000000000000000000000000E0915F0913 |
:10B46000F0916009E20FF11D80818EBD809181090C |
:10B470009081890F809381092F5F2093610908953E |
:10B48000353551F120934F05CBCF81E080935E0994 |
:10B49000F3CF80918309E82FFF27ED55F64F3083D6 |
:10B4A0008F5F809383098A3100F1809150053817AE |
:10B4B00011F12093840910924F05B2CF892B09F026 |
:10B4C000AFCF2093830930935005313809F0A8CFCE |
:10B4D00081E080934F05A4CF80915005830F809326 |
:10B4E000500582E080934F059BCF80915005830FDC |
:10B4F0008093500595CF8AE1E3EAF9E0A9E8B9E045 |
:10B5000001900D928A95E1F781E080938409109271 |
:10B510004F0586CF20E030E0882321F0809151054F |
:10B52000882381F4809158049927807190709595B3 |
:10B53000879595958795959587952817390791F063 |
:10B54000429A089521E030E0809158049927807153 |
:10B5500090709595879595958795959587952817DA |
:10B56000390771F74298089520E030E0882321F0F0 |
:10B5700080915105882391F4809158049927807215 |
:10B5800090709595879595958795959587959595BF |
:10B5900087952817390729F0439A089521E030E06C |
:10B5A000EBCF4398089587B18C6087B9109252050C |
:10B5B0001092510580E00E948A5A80E00E94B45A9D |
:10B5C0001092580580E88093C90310925505809326 |
:10B5D000C80308958091590581508F3FB9F1809338 |
:10B5E00059053091560540E0332389F09091590573 |
:10B5F00080915705981740F18091A908282F33278B |
:10B60000809126039091270382179307ECF0842FF3 |
:10B610000E948A5A40E080915305882309F411C1A1 |
:10B620009091590580915405981760F08091A90870 |
:10B63000282F3327809126039091270382179307A1 |
:10B640000CF0FFC041E0FDC041E0E1CF89E0809314 |
:10B65000590520915804822F992781FD30C080FF21 |
:10B66000BFC030916D04332371F580919208E82FAB |
:10B67000FF27EE0FFF1FE25AF74F808191818C5A0E |
:10B680009F4F0CF18081918185359105E4F4809183 |
:10B690009308E82FFF27EE0FFF1FE25AF74F808134 |
:10B6A0009181855B9F4F1CF481E0809352058081DE |
:10B6B00091818C3491053CF03093520504C0809107 |
:10B6C0006D0480935205E0915205422F5527BA012F |
:10B6D0006470707042FF19C08091A908282F332729 |
:10B6E00080912603909127038217930774F443FDFA |
:10B6F00079C0E0935105809159056F5F7F4F99277D |
:10B700000E947E656093590502C0E09351059091B7 |
:10B71000C7089B3F08F43FC080911809873ED8F1C5 |
:10B720009091C608392F3078309356058091C9031F |
:10B73000892329F080910D0967E10E945E6580935D |
:10B7400057059091C9089B3FB8F080914B09873EFF |
:10B7500098F09091C808892F8078809353052091A4 |
:10B76000C803892F822329F08091110967E10E9483 |
:10B770005E658093540537CF9B3FE0F080914B0985 |
:10B780008A30C0F480E09091C80897FDE6CF81E050 |
:10B7900080935305E4CF9B3FB8F0809118098A301D |
:10B7A00098F480E09091C60897FF81E0382F30939D |
:10B7B0005605BCCF8091550581508F3FB9F08093DD |
:10B7C00055059091C808CBCF8091580581508F3F87 |
:10B7D00009F1809358059091C60830915605A6CF7F |
:10B7E00081E06FCF81E08093510585CF80914B0937 |
:10B7F0008150809355058091C8038130F1F0869582 |
:10B80000282F8093C8039091C808892F82238093A2 |
:10B810005305A7CF809118098150809358058091D6 |
:10B82000C903813061F086958093C9039091C60861 |
:10B83000392F3823309356057BCF80E8E1CF80E85D |
:10B84000F3CF842F0E94B45A08958091C9008F7756 |
:10B850008093C9008091C9008F7B8093C90080913B |
:10B86000C9008F7D8093C9005A9A52981092CD00DA |
:10B8700084E190E08093CC008091C8008260809346 |
:10B88000C80080E18093C9008091CA008F778093BF |
:10B89000CA008091CA008F7B8093CA008091CA0041 |
:10B8A0008F7D8093CA008091CA008F7E8093CA00EA |
:10B8B0008091CA00877F8093CA008091C9008B7FE6 |
:10B8C0008093C9008091CA0084608093CA008091EF |
:10B8D000CA0082608093CA008091C80087FF0CC0B4 |
:10B8E0008091CE008091C800882334F48091CE00EE |
:10B8F0008091C8008823A4F38091C9008068809358 |
:10B90000C90008951F93CF93DF9380E197E20E94CF |
:10B91000BB14EC0110E08091C9008F778093C900BF |
:10B920008091C9008F7E8093C9005A9888E397E080 |
:10B930009F938F931F930E9443110F900F900F902E |
:10B94000CE010E94C414882309F066C04A9BF8CF38 |
:10B950008AE590E00E94BB14EC018EE697E09F938D |
:10B960008F931F920E944311529A0F900F900F9045 |
:10B97000CE010E94C4148823D9F383E690E05A9A3A |
:10B98000019797FFFCCF8FE891E05A98019797FFB6 |
:10B99000FCCF89E090E05A9A019797FFFCCF89E0AD |
:10B9A00090E05A98019797FFFCCF8FE891E05A9A60 |
:10B9B000019797FFFCCF8FE891E05A98019797FF86 |
:10B9C000FCCF89E090E05A9A019797FFFCCF89E07D |
:10B9D00090E05A98019797FFFCCF8FE891E05A9A30 |
:10B9E000019797FFFCCF8FE891E05A98019797FF56 |
:10B9F000FCCF89E090E05A9A019797FFFCCF89E04D |
:10BA000090E05A98019797FFFCCF8FE891E05A9AFF |
:10BA1000019797FFFCCF0AC084E797E09F938F932D |
:10BA20001F930E9443110F900F900F9052985A98B5 |
:10BA30000E94255CDF91CF911F9108951F920F9274 |
:10BA40000FB60F921124EF92FF920F931F932F9333 |
:10BA50003F934F935F936F937F938F939F93AF9396 |
:10BA6000BF93CF93DF93EF93FF930091CE0080912C |
:10BA7000CA039091CB03019709F45EC080916205DF |
:10BA8000909163050E94C414482F552760915A0570 |
:10BA900070915B0561157105E9F16130710509F47B |
:10BAA000EAC06230710509F4EDC06330710509F434 |
:10BAB0005CC081E090E09093CB038093CA03109226 |
:10BAC0005D0510925C0510926105109260058091F1 |
:10BAD0005C0590915D054097A0F080916005909184 |
:10BAE0006105892B11F41092830310925D05109269 |
:10BAF0005C05109261051092600510925B05109232 |
:10BB00005A0587E090E00E94BB14909363058093F0 |
:10BB10006205FDC0452BD9F281E090E090935B0572 |
:10BB200080935A0580915C0590915D0501969093F4 |
:10BB30005D0580935C05CBCF1092CB031092CA03B6 |
:10BB400087E090E00E94BB149093630580936205A8 |
:10BB500010925D0510925C0510925B0510925A05DB |
:10BB600010925F0510925E05D2C0452B09F0A1CF5F |
:10BB700082E090E090935B0580935A0580915C058C |
:10BB800090915D05019690935D0580935C05809191 |
:10BB90005E0590915F05FC01F695E795F695E795B2 |
:10BBA000EF70F0703196982F8827202F3327822B43 |
:10BBB000932B9370805092400E947E65EB30F1058C |
:10BBC00008F085CF7F01EE0EFF1EF701E25AF74F16 |
:10BBD000808191819B01281B390BC90137FD90C0E1 |
:10BBE000069754F480917604883C08F087C08091D1 |
:10BBF0007604865F80937604F701E25AF74F8081DE |
:10BC000091819C01220F331F280F391F260F371FE8 |
:10BC100037FD7AC0E901D595C795D595C795CB0174 |
:10BC200001968C179D070CF05CC0219780917604DB |
:10BC3000843B08F450C087010C58174FF701E25AB3 |
:10BC4000F74F80819181FE01E81BF90BCF0163E082 |
:10BC500070E00E947E65CB01880F991F860F971FA9 |
:10BC6000F801918380832EE538E0E20EF31EF701A0 |
:10BC7000D183C0832CCF4115510509F012CF82E04A |
:10BC800090E04CCF4115510509F00FCF802F992737 |
:10BC900090935F0580935E0520915C0530915D0572 |
:10BCA0002230310569F083E090E090935B0580934A |
:10BCB0005A052F5F3F4F30935D0520935C0507CFFA |
:10BCC00080915E0587FF15C081E090E0909361054B |
:10BCD00080936005E8CFF701EC58F74F118210828E |
:10BCE000C2CF61507040C617D7070CF09FCF219686 |
:10BCF0009DCF5093610540936005D5CF88EC7ACFF6 |
:10BD0000909581959F4F6CCF2D5F3F4F83CFFF91D3 |
:10BD1000EF91DF91CF91BF91AF919F918F917F91E3 |
:10BD20006F915F914F913F912F911F910F91FF90D4 |
:10BD3000EF900F900FBE0F901F901895109268050E |
:10BD400008950E949E5E089580916B0490916C040A |
:10BD500090936A048093690480918A0490918B0483 |
:10BD6000A0918C04B0918D04B7FF04C081589F4FFF |
:10BD7000AF4FBF4F27E0B595A795979587952A9523 |
:10BD8000D1F7909367058093660508952091690423 |
:10BD900030916A04280F311D30936A04209369049E |
:10BDA00080918A0490918B04A0918C04B0918D04B1 |
:10BDB000B7FF04C081589F4FAF4FBF4F37E0B595D5 |
:10BDC000A795979587953A95D1F7909367058093B6 |
:10BDD0006605089581E0809368050895CF93DF9309 |
:10BDE0004091690450916A045093030840930208FB |
:10BDF00060E070E080916805882321F080918304E1 |
:10BE0000882329F07093650560936405A7C080912D |
:10BE10006B0490916C04841B950B2091980333273D |
:10BE2000289FA001299F500D389F500D11249A0181 |
:10BE300057FD79C0B901759567957595679580919E |
:10BE400016049091170497FD87C095958795860FE6 |
:10BE5000971F9093650580936405C0918A04D091E3 |
:10BE60008B04E0918C04F0918D04F7FD70C067E0C5 |
:10BE7000F595E795D795C7956A95D1F780916605B1 |
:10BE800090916705AA2797FDA095BA2FC81BD90BDB |
:10BE9000EA0BFB0B80919703282F33274427552764 |
:10BEA000BE01CF010E943F6597FD4CC055E09595BE |
:10BEB0008795779567955A95D1F751E06931750760 |
:10BEC000ACF188E191E090936A0580936905209137 |
:10BED0006405309165058091690590916A05280F88 |
:10BEE000391F80915C049927829FA001839F500D88 |
:10BEF000929F500D1124CA0162E370E00E947E659A |
:10BF000080915B049927880F991F880F991F90953E |
:10BF100081959F4F681779070CF074CF9093650552 |
:10BF2000809364051BC02D5F3F4F84CF4EEF683E6A |
:10BF300074071CF488EE9EEFC6CF70936A05609379 |
:10BF40006905C5CF615E7F4F8F4F9F4FAFCFC158FF |
:10BF5000DF4FEF4FFF4F8BCF019677CF8091640576 |
:10BF6000909165059093090880930808DF91CF911F |
:10BF70000895CF93DF938091980880FF12C081E0ED |
:10BF800080936B05E091DB03F091DC03EF3FF1055B |
:10BF900089F080916B059927009751F10197D1F5B0 |
:10BFA0002EC010926B05E091DB03F091DC03EF3FB4 |
:10BFB000F10579F784EF91E00E94BB14EC01CE010A |
:10BFC0000E94C4148823D9F380919208E82FFF2798 |
:10BFD000EE0FFF1FE25AF74F0190F081E02DF09332 |
:10BFE000DC03E093DB0380916B0599270097B1F6A2 |
:10BFF000EC5AFF4F7CF082E080936B050BC0F7FD9D |
:10C0000005C03597C4F70E942E6004C0F095E195F5 |
:10C01000FF4FF7CFDF91CF91089580919208E82FDD |
:10C02000FF27EE0FFF1FE25AF74F80819181909317 |
:10C0300007088093060888589F4F089580916B05E4 |
:10C040009927009729F0019731F080E090E008955A |
:10C050000E940D6008950E944A600895AAE0B0E031 |
:10C060000E94CE65802D992780936E05982F809130 |
:10C070005D04989FC001112464E670E00E947E6513 |
:10C0800060936D05ACE0B0E00E94CE65802D80939A |
:10C090006C050895FF920F931F93CF93DF93F09059 |
:10C0A0009208EF2DFF27EE0FFF1FE25AF74FC081D6 |
:10C0B000D1818091DB039091DC03C81BD90B809167 |
:10C0C0006D04882309F44BC01C161D060CF0F6C045 |
:10C0D0009E01442737FD4095542FCA01B9010E94A3 |
:10C0E0003F65DC01CB01BC01CD0126E930E040E039 |
:10C0F00050E00E94B3658E01020F131F0530110539 |
:10C100000CF46FC0A0917905B0917A05A8014A0F8F |
:10C110005B1F4450504080917B05992789309105E1 |
:10C1200009F474C08A3091050CF096C085309105F1 |
:10C1300009F47BC1863091050CF015C1833091055F |
:10C1400009F414C2843091050CF0CDC250937805E7 |
:10C1500040937705019709F451C2BA0113C01092B8 |
:10C160007605109275051092780510927705109259 |
:10C170007A051092790500E010E081E080937B055C |
:10C18000D801B80120917105309172054091750573 |
:10C1900050917605CB01841B950B281739070CF4B9 |
:10C1A000C901309521953F4F821793070CF4C901BF |
:10C1B00020916F05309170052115310549F4840FE8 |
:10C1C000951F909376058093750525E030E0AC01CE |
:10C1D000215030403093700520936F0557FF55C3B1 |
:10C1E00034C02FEF0C3F12070CF062C0A09179050C |
:10C1F000B0917A05A8014A0F5B1F4C5F5F4F809199 |
:10C200007B0599278930910509F08CCF50937805EB |
:10C2100040937705EF2DFF27EE0FFF1FE25AF74FF0 |
:10C22000808191818C5A9F4F0CF45FC084E690E02E |
:10C2300090937D0580937C052396279708F4F7C19A |
:10C2400060917705709178059DCF109276051092D8 |
:10C25000750540E050E019C38D30910509F4B5C073 |
:10C260008E3091050CF051C08B30910509F459C105 |
:10C270000C970CF06FC220917E0530917F052A0F3C |
:10C280003B1F309378052093770580917C05909132 |
:10C290007D05019790937D0580937C05892B19F48A |
:10C2A00088E080937B0524970CF485C2B9016ACF9E |
:10C2B000A0917905B0917A05AD012DCF9E0144275B |
:10C2C00037FD4095542FCA01B9010E943F65DC013A |
:10C2D000CB01BC01CD0126E930E040E050E00E94F6 |
:10C2E000B3658E01021B130B09CF80917C059091E1 |
:10C2F0007D05019790937D0580937C05892B09F03E |
:10C300009BCF8EE080937B0597CF8F30910509F40A |
:10C310004CC18F3091050CF404C2509378054093C2 |
:10C320007705409709F019CF80916E059927BA01DA |
:10C33000481759077CF024E130E0309372052093D0 |
:10C3400071058CE080937B0584EF91E0909302046B |
:10C3500080930104CE01D7FD93C205970CF412CF50 |
:10C360000E949E5E44C050937805409377058730C5 |
:10C37000910509F4C7C008970CF069C1C530D10513 |
:10C380000CF4FEC180916D05282F332730937A0578 |
:10C3900020937905C135D1054CF08FE080937B0562 |
:10C3A00084EF91E0909302048093010460917705FB |
:10C3B00070917805261737070CF00AC2309378057C |
:10C3C00020937705D901BD01DDCEB0937805A09308 |
:10C3D00077059E01D7FD0EC125303105A4F30E94DB |
:10C3E0009E5E84EF91E0909302048093010420917B |
:10C3F00064053091650537FD10C235952795359553 |
:10C4000027958091790590917A05821B930B9093E3 |
:10C410007A0580937905909378058093770529E0D4 |
:10C4200020937B05DC01BD01ADCE50937805409390 |
:10C43000770520919108E22FFF27EE0FFF1FE25AA8 |
:10C44000F74F808191818C5E9F4F0CF442C0E22FA8 |
:10C45000FF27EE0FFF1FE25AF74F8081918145972A |
:10C46000ACF080916C05882389F0815080936C0535 |
:10C47000ACE0B0E0082E0E94DB6584EF91E0909381 |
:10C4800002048093010484E080937B05209173056E |
:10C4900030917405253031058CF0201B310B8091D3 |
:10C4A0006C059927281739074CF084E080937B05A9 |
:10C4B00084EF91E090930204809301041092780538 |
:10C4C00010927705A0917905B0917A0560E070E04F |
:10C4D00059CE80916C05843108F0B9CF8F5F80937D |
:10C4E0006C05ACE0B0E0082E0E94DB6584EF91E0C3 |
:10C4F000909302048093010484E080937B05209153 |
:10C500009108A5CFC530D1050CF45AC12AE030E01E |
:10C51000309372052093710588E080937B05BA0102 |
:10C5200035CE50937805409377052396279708F0EA |
:10C530000DC180917305909174059801281B390BEA |
:10C54000C9010196039708F001C180917C05909183 |
:10C550007D05019790937D0580937C05892B09F0DB |
:10C56000FCCD8CE080937B05BA010CCE509378050E |
:10C5700040937705BA0150937605409375052A9745 |
:10C580006CF080917305909174059801281B390B0C |
:10C59000C90137FD71C102970CF41CC182E390E020 |
:10C5A00090937D0580937C05EDCD50937805409365 |
:10C5B000770580916D05282F3327BA012417350799 |
:10C5C0002CF43093780520937705B901C430D10558 |
:10C5D00054F4CC5FDF4F1CF48EE080937B05621730 |
:10C5E00073070CF024C125E030E0309372052093EE |
:10C5F0007105CCCD309521953F4FEECE80919108BD |
:10C60000E82FFF27EE0FFF1FE25AF74F808191813D |
:10C61000873491050CF404C183E080937B0584EF9B |
:10C6200091E09093020480930104BA01ABCD0E9483 |
:10C63000A45E89E190E090937D0580937C058BE07A |
:10C6400080937B05A0917905B0917A05F9CDEF2D06 |
:10C65000FF27EE0FFF1FE25AF74F808191818C5A1E |
:10C660009F4F0CF498C084E690E090937D058093F2 |
:10C670007C054091730550917405453051054CF08F |
:10C680009A01201B310B80916C05992728173907D7 |
:10C6900044F4443051050CF0D3CD8091C50882FF9D |
:10C6A000CFCD0E94A45E8091730590917405909304 |
:10C6B0007F0580937E058AE080937B0589E190E089 |
:10C6C00090937D0580937C0524E130E030937205E2 |
:10C6D00020937105A0917905B0917A056091770555 |
:10C6E0007091780553CD04301105A4F48091910820 |
:10C6F000E82FFF27EE0FFF1FE25AF74F808191814D |
:10C700000190F081E02DF7FDB3C034971CF485E073 |
:10C7100080937B05109278051092770560E070E0B9 |
:10C7200031CD22E030E030937205209371051092F4 |
:10C730007A0510927905109278051092770586E0B7 |
:10C7400080937B05A0E0B0E0BD0120CD89E080931F |
:10C750007B0576CD50937805409377055093760509 |
:10C760004093750550937A05409379050E94EA5EDF |
:10C7700084EF91E090930204809301048DE060CFF8 |
:10C7800080916D0599278A179B0709F059CD87E09D |
:10C7900080937B0555CD80917C0590917D05019717 |
:10C7A00090937D0580937C05892B09F062CF8EE004 |
:10C7B00080937B055ECF30937A0520937905D6CFA1 |
:10C7C000CC5FDF4F0CF0C9CC8EE080937B05CCCEE4 |
:10C7D000D901D8CC80917C0590917D0501979093EB |
:10C7E0007D0580937C05892B09F0CCCC80916E056A |
:10C7F00099278617970709F4C5CC80917505809312 |
:10C800006E05AAE0B0E0082E0E94DB6584EF91E09F |
:10C81000909302048093010415CF2D5F3F4FEDCD1F |
:10C82000808191818A5B9F4F7CF684E0F6CE809177 |
:10C830006E05992790937A058093790525E030E07D |
:10C8400030937205209371050E94A45E80919B082D |
:10C850000E94C65E0E94EA5E80E180937B05A09103 |
:10C860007905B0917A056091770570917805BBCE16 |
:10C87000F095E195FF4F49CF909581959F4F8BCED5 |
:10C88000882799278C1B9D0B68CD10937405009306 |
:10C890007305B0930508A09304081093070800934C |
:10C8A0000608CA01DF91CF911F910F91FF90089563 |
:10C8B000FC014150504030F001900616D1F73197FD |
:10C8C000CF0108958827992708955058192EA6D08A |
:10C8D00001D08CC0BA176207730784079507B1F1BE |
:10C8E00088F40EF410940B2EBA2FA02D062E622F72 |
:10C8F000202D072E732F302D082E842F402D092E2A |
:10C90000952F502DFF275523B9F0591B49F0573E5D |
:10C9100098F0469537952795A795F0405395C9F718 |
:10C9200076F0BA0F621F731F841F30F487957795D6 |
:10C930006795B795F040939517FA0F2E0895BF1B92 |
:10C94000BB27BA0B620B730B840BF6CFDEF692C0DB |
:10C9500097FB70D09F3738F0FEE9F91B982F872F8F |
:10C96000762F6B2F05C083C0969587957795679531 |
:10C97000F150D0F73EF490958095709561957F4F7A |
:10C980008F4F9F4F0895E89403C097FB0EF4F3DF99 |
:10C99000B62F672F782F892F9EE9002427C00ED04D |
:10C9A0005EF004C00BD026F001C008D019F020F4CE |
:10C9B0008FEF089580E0089581E0089597FB092E98 |
:10C9C000052600F868942DD0E89407FC07C062178C |
:10C9D00073078407950721F008F40094079498944E |
:10C9E00008959A95BB0F661F771F881F11249923FE |
:10C9F000A1F08823B2F79F3F59F0BB0F48F421F410 |
:10CA0000002011F460FF04C06F5F7F4F8F4F9F4F76 |
:10CA1000881F9795879597F9089529C0052E0926AF |
:10CA200007FA440F551F5F3F79F0AA27A51708F0B2 |
:10CA300051E04795880F991F9F3F31F0BB27B917E9 |
:10CA400008F091E0879508959F919F91112414C05B |
:10CA500097FB880F991F9F3F31F0BB27B91708F04C |
:10CA600091E0879508959F919F91112405C06627B5 |
:10CA700077278827992708959FEF80EC0895629F74 |
:10CA8000D001739FF001829FE00DF11D649FE00DC6 |
:10CA9000F11D929FF00D839FF00D749FF00D659F27 |
:10CAA000F00D9927729FB00DE11DF91F639FB00D26 |
:10CAB000E11DF91FBD01CF0111240895991B79E0F3 |
:10CAC00004C0991F961708F0961B881F7A95C9F71E |
:10CAD00080950895AA1BBB1B51E107C0AA1FBB1F6D |
:10CAE000A617B70710F0A61BB70B881F991F5A95FA |
:10CAF000A9F780959095BC01CD01089597FB092E6B |
:10CB000007260AD077FD04D0E5DF06D000201AF40E |
:10CB1000709561957F4F0895F6F7909581959F4F99 |
:10CB20000895A1E21A2EAA1BBB1BFD010DC0AA1F6E |
:10CB3000BB1FEE1FFF1FA217B307E407F50720F086 |
:10CB4000A21BB30BE40BF50B661F771F881F991F01 |
:10CB50001A9469F760957095809590959B01AC014A |
:10CB6000BD01CF01089597FB092E05260ED057FD74 |
:10CB700004D0D7DF0AD0001C38F45095409530958A |
:10CB800021953F4F4F4F5F4F0895F6F79095809551 |
:10CB9000709561957F4F8F4F9F4F0895F999FECF04 |
:10CBA000B2BDA1BDF89A119600B40895F7DF0192C5 |
:10CBB0001A94E1F70895F999FECFB2BDA1BD00BC6A |
:10CBC00011960FB6F894FA9AF99A0FBE089501904B |
:08CBD000F2DF1A94E1F7089569 |
:10CBD800010A0151756164726F0000416E676C65EE |
:10CBE8004E69636B20202020202020416E676C65F1 |
:10CBF800526F6C6C202020202020204163634E69F6 |
:10CC0800636B202020202020202020416363526F66 |
:10CC18006C6C2020202020202020204779726F472C |
:10CC280069657220202020202020204869676874C8 |
:10CC38002056616C756520202020204163635A20AE |
:10CC48002020202020202020202020476173202021 |
:10CC58002020202020202020202020436F6D70617C |
:10CC680073732056616C7565202020566F6C746153 |
:10CC78006765202020202020202020456D706661D7 |
:10CC88006E672020202020202020204779726F20E6 |
:10CC98004B6F6D70617373202020204D6F746F721D |
:10CCA8002046726F6E7420202020204D6F746F72A2 |
:10CCB80020526561722020202020204D6F746F72F1 |
:10CCC800204C6566742020202020204D6F746F72E0 |
:10CCD80020526967687420202020202020202020EE |
:10CCE800202020202020202020202020202020203C |
:10CCF800202020202020202020202020202020202C |
:10CD080020202020202020202020204D4B334D6142 |
:10CD1800672043616C537461746520536572766F44 |
:10CD280020202020202020202020202020202020FB |
:10CD380020202020202020202020202020202020EB |
:10CD480020202020202020202020202020202020DB |
:10CD58002020202020202020202020536F6C6C4889 |
:10CD68006F65686520202020202020506974636842 |
:10CD78004F66667365742020202020537469636BA6 |
:10CD880056616C75652020202020204B616C6D61F8 |
:10CD98006E5F4D61784472696674202020202020DF |
:10CDA80020202020202020202020204E617669206D |
:10CDB80053657269616C20446174614750535F4EDA |
:10CDC80069636B20202020202020204750535F5289 |
:10CDD8006F6C6C2020202020202020C8000164FFD8 |
:10CDE80001FFFF01FC01FC0101737373FF03007D68 |
:10CDF8000000C409C40964000E48616C6C6F2057B8 |
:10CE0800656C7400000000000000000000000000D5 |
:10CE1800000000000000000000000000000000000A |
:10CE280000000000000000000000000000000000FA |
:10CE380000000000000000000000000000000000EA |
:10CE480000000000000000000001020304050607BE |
:10CE580008090A01040B050000ECFF6440415A462A |
:10CE6800640A02969608403A10FB30380190D003C5 |
:10CE78000090D00300F401640053706F72740000D6 |
:10CE88004E6F726D616C0000426567696E6E657207 |
:10CE980000000A0B0D0B0C0E010101004D4B004D5B |
:0ECEA80044003F3F00CC03CF03D203FF000045 |
:00000001FF |
/branches/thjac/V1_13/Hex-Files/WasIstWas.txt |
---|
0,0 → 1,51 |
+++++++++++++++++++++++++ |
+ Flight-Ctrl: |
+++++++++++++++++++++++++ |
BootLoader_MEGA644_20MHZ_V0_1.hex |
Der Bootloader wird per ISP eingespielt |
Der Bootloader nur dann eingespielt werden, wenn noch nie ein Bootloader eingespielt wurde! |
Danach können Softwareupdates seriell eingespielt werden. |
Flight-Ctrl_MEGA644_Vx_yy.hex |
Aktuelle Firmware |
Wird per serielle Schnittstelle (durch den Bootloader) eingespielt |
//+++++++++++ |
// Quadro: |
// 1 |
// 4 3 |
// 2 |
//+++++++++++ |
// Reverse Props on 1 2 |
//+++++++++++ |
// Octo: |
// 1 2 |
// 8 3 |
// 7 4 |
// 6 5 |
//+++++++++++ |
//+++++++++++ |
// Octo2: |
// 1 |
// 8 2 |
// 7 3 |
// 6 4 |
// 5 |
//+++++++++++ |
//+++++++++++ |
// Octo3: |
// 1 |
// 2 |
// 8 7 3 4 |
// 5 |
// 6 |
//+++++++++++ |
// Reverse Props on octo: 1 3 5 7 |
/branches/thjac/V1_13/License.txt |
---|
0,0 → 1,52 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + Nur für den privaten Gebrauch |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten und nichtkommerziellen Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt und genannt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-profit use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet, our webpage (http://www.MikroKopter.de) must be |
// + clearly linked and named as origin |
// + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
/branches/thjac/V1_13/Settings.h |
---|
--- Spectrum.c (nonexistent) |
+++ Spectrum.c (revision 1263) |
@@ -0,0 +1,310 @@ |
+/*####################################################################################### |
+Decodieren eines RC Summen Signals oder Spektrum Empfänger-Satellit |
+#######################################################################################*/ |
+ |
+#include "Spectrum.h" |
+#include "main.h" |
+ |
+//--------------------------------------------------------------// |
+ |
+//--------------------------------------------------------------// |
+void SpektrumBinding(void) |
+{ |
+ unsigned int timerTimeout = SetDelay(10000); // Timeout 10 sec. |
+ unsigned char connected = 0; |
+ unsigned int delaycounter; |
+ |
+ UCSR1B &= ~(1 << RXCIE1); // disable rx-interrupt |
+ UCSR1B &= ~(1<<RXEN1); // disable Uart-Rx |
+ PORTD &= ~(1 << PORTD2); // disable pull-up |
+ |
+ printf("\n\rPlease connect Spektrum receiver for binding NOW..."); |
+ |
+ while(!CheckDelay(timerTimeout)) |
+ { |
+ if (PIND & (1 << PORTD2)) { timerTimeout = SetDelay(90); connected = 1; break; } |
+ } |
+ |
+ if (connected) |
+ { |
+ |
+ printf("ok.\n\r"); |
+ DDRD |= (1 << DDD2); // Rx as output |
+ |
+ while(!CheckDelay(timerTimeout)); // delay after startup of RX |
+ for (delaycounter = 0; delaycounter < 100; delaycounter++) PORTD |= (1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 400; delaycounter++) PORTD &= ~(1 << PORTD2); |
+ |
+ for (delaycounter = 0; delaycounter < 10; delaycounter++) PORTD |= (1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 10; delaycounter++) PORTD &= ~(1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 400; delaycounter++) PORTD |= (1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 400; delaycounter++) PORTD &= ~(1 << PORTD2); |
+ |
+ for (delaycounter = 0; delaycounter < 10; delaycounter++) PORTD |= (1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 10; delaycounter++) PORTD &= ~(1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 400; delaycounter++) PORTD |= (1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 400; delaycounter++) PORTD &= ~(1 << PORTD2); |
+ |
+ for (delaycounter = 0; delaycounter < 10; delaycounter++) PORTD |= (1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 10; delaycounter++) PORTD &= ~(1 << PORTD2); |
+ for (delaycounter = 0; delaycounter < 400; delaycounter++) PORTD |= (1 << PORTD2); |
+ |
+ } |
+ else |
+ { printf("Timeout.\n\r"); |
+ |
+ |
+ } |
+ |
+ DDRD &= ~(1 << DDD2); // RX as input |
+ PORTD &= ~(1 << PORTD2); |
+ |
+ Uart1Init(); // init Uart again |
+} |
+ |
+//############################################################################ |
+// zum Decodieren des Spektrum Satelliten wird USART1 benutzt. |
+// USART1 initialisation from killagreg |
+void Uart1Init(void) |
+//############################################################################ |
+ { |
+ // -- Start of USART1 initialisation for Spekturm seriell-mode |
+ // USART1 Control and Status Register A, B, C and baud rate register |
+ uint16_t ubrr = (uint16_t) ((uint32_t) SYSCLK/(8 * 115200) - 1); |
+ // disable RX-Interrupt |
+ UCSR1B &= ~(1 << RXCIE1); |
+ // disable TX-Interrupt |
+ UCSR1B &= ~(1 << TXCIE1); |
+ // disable DRE-Interrupt |
+ UCSR1B &= ~(1 << UDRIE1); |
+ // set direction of RXD1 and TXD1 pins |
+ // set RXD1 (PD2) as an input pin |
+ PORTD |= (1 << PORTD2); |
+ DDRD &= ~(1 << DDD2); |
+ // USART0 Baud Rate Register |
+ // set clock divider |
+ |
+ UBRR1H = (uint8_t)(ubrr>>8); |
+ UBRR1L = (uint8_t)ubrr; |
+ // enable double speed operation |
+ UCSR1A |= (1 << U2X1); |
+ // enable receiver and transmitter |
+ //UCSR1B = (1<<RXEN1)|(1<<TXEN1); |
+ |
+ |
+ |
+ |
+ UCSR1B = (1<<RXEN1); |
+ // set asynchronous mode |
+ UCSR1C &= ~(1 << UMSEL11); |
+ UCSR1C &= ~(1 << UMSEL10); |
+ // no parity |
+ UCSR1C &= ~(1 << UPM11); |
+ UCSR1C &= ~(1 << UPM10); |
+ // 1 stop bit |
+ UCSR1C &= ~(1 << USBS1); |
+ // 8-bit |
+ UCSR1B &= ~(1 << UCSZ12); |
+ UCSR1C |= (1 << UCSZ11); |
+ UCSR1C |= (1 << UCSZ10); |
+ // flush receive buffer explicit |
+ while(UCSR1A & (1<<RXC1)) UDR1; |
+ // enable RX-interrupts at the end |
+ UCSR1B |= (1 << RXCIE1); |
+ // -- End of USART1 initialisation |
+ return; |
+ } |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// + Copyright (c) Rainer Walther |
+// + RC-routines from original MK rc.c (c) H&I |
+// + Useful infos from Walter: http://www.rcgroups.com/forums/showthread.php?t=714299&page=2 |
+// + only for non-profit use |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// |
+// 20080808 rw Modified for Spektrum AR6100 (PPM) |
+// 20080823 rw Add Spektrum satellite receiver on USART1 (644P only) |
+// 20081213 rw Add support for Spektrum DS9 Air-Tx-Module (9 channels) |
+// Replace AR6100-coding with original composit-signal routines |
+// |
+// --- |
+// Entweder Summensignal ODER Spektrum-Receiver anschließen. Nicht beides gleichzeitig betreiben! |
+// Binding is not implemented. Bind with external Receiver. |
+// Servo output J3, J4, J5 not serviced |
+// |
+// Anschuß Spektrum Receiver |
+// Orange: 3V von der FC (keinesfalls an 5V anschließen!) |
+// Schwarz: GND |
+// Grau: RXD1 (Pin 3) auf 10-Pol FC-Stecker |
+// |
+// --- |
+// Satellite-Reciever connected on USART1: |
+// |
+// DX7/DX6i: One data-frame at 115200 baud every 22ms. |
+// DX7se: One data-frame at 115200 baud every 11ms. |
+// byte1: unknown |
+// byte2: unknown |
+// byte3: and byte4: channel data (FLT-Mode) |
+// byte5: and byte6: channel data (Roll) |
+// byte7: and byte8: channel data (Nick) |
+// byte9: and byte10: channel data (Gier) |
+// byte11: and byte12: channel data (Gear Switch) |
+// byte13: and byte14: channel data (Gas) |
+// byte15: and byte16: channel data (AUX2) |
+// |
+// DS9 (9 Channel): One data-frame at 115200 baud every 11ms, alternating frame 1/2 for CH1-7 / CH8-9 |
+// 1st Frame: |
+// byte1: unknown |
+// byte2: unknown |
+// byte3: and byte4: channel data |
+// byte5: and byte6: channel data |
+// byte7: and byte8: channel data |
+// byte9: and byte10: channel data |
+// byte11: and byte12: channel data |
+// byte13: and byte14: channel data |
+// byte15: and byte16: channel data |
+// 2nd Frame: |
+// byte1: unknown |
+// byte2: unknown |
+// byte3: and byte4: channel data |
+// byte5: and byte6: channel data |
+// byte7: and byte8: 0xffff |
+// byte9: and byte10: 0xffff |
+// byte11: and byte12: 0xffff |
+// byte13: and byte14: 0xffff |
+// byte15: and byte16: 0xffff |
+// |
+// Each channel data (16 bit= 2byte, first msb, second lsb) is arranged as: |
+// |
+// Bits: F 0 C3 C2 C1 C0 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 |
+// |
+// 0 means a '0' bit |
+// F: 1 = indicates beginning of 2nd frame for CH8-9 (DS9 only) |
+// C3 to C0 is the channel number. 0 to 9 (4 bit, as assigned in the transmitter) |
+// D9 to D0 is the channel data (10 bit) 0xaa..0x200..0x356 for 100% transmitter-travel |
+// |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ |
+//############################################################################ |
+//Diese Routine startet und inizialisiert den USART1 für seriellen Spektrum satellite reciever |
+SIGNAL(USART1_RX_vect) |
+//############################################################################ |
+{ |
+static unsigned int Sync=0, FrameCnt=0, ByteHigh=0, ReSync=1, Frame2=0, FrameTimer; |
+ unsigned int Channel, index; |
+ signed int signal, tmp; |
+ int bCheckDelay; |
+ uint8_t c; |
+ |
+ c = UDR1; // get data byte |
+ |
+ if (ReSync == 1) |
+ { |
+ // wait for beginning of new frame |
+ ReSync = 0; |
+ |
+ FrameTimer = SetDelay(7); // minimum 7ms zwischen den frames |
+ FrameCnt = 0; |
+ Sync = 0; |
+ ByteHigh = 0; |
+ } |
+ else |
+ { |
+ bCheckDelay = CheckDelay(FrameTimer); |
+ if ( Sync == 0 ) |
+ { |
+ if(bCheckDelay) |
+ { |
+ // nach einer Pause von mind. 7ms erstes Sync-Character gefunden |
+ // Zeichen ignorieren, da Bedeutung unbekannt |
+ Sync = 1; |
+ FrameCnt ++; |
+ } |
+ else |
+ { |
+ // Zeichen kam vor Ablauf der 7ms Sync-Pause |
+ // warten auf erstes Sync-Zeichen |
+ } |
+ } |
+ else if((Sync == 1) && !bCheckDelay) |
+ { |
+ // zweites Sync-Character ignorieren, Bedeutung unbekannt |
+ Sync = 2; |
+ FrameCnt ++; |
+ } |
+ else if((Sync == 2) && !bCheckDelay) |
+ { |
+ // Datenbyte high |
+ ByteHigh = c; |
+ |
+ if (FrameCnt == 2) |
+ { |
+ // is 1st Byte of Channel-data |
+ // Frame 1 with Channel 1-7 comming next |
+ Frame2 = 0; |
+ if(ByteHigh & 0x80) |
+ { |
+ // DS9: Frame 2 with Channel 8-9 comming next |
+ Frame2 = 1; |
+ } |
+ } |
+ Sync = 3; |
+ FrameCnt ++; |
+ } |
+ else if((Sync == 3) && !bCheckDelay) |
+ { |
+ // Datenbyte low |
+ |
+ // High-Byte for next channel comes next |
+ Sync = 2; |
+ FrameCnt ++; |
+ |
+ index = (ByteHigh >> 2) & 0x0f; |
+ index ++; |
+ Channel = (ByteHigh << 8) | c; |
+ signal = Channel & 0x3ff; |
+ signal -= 0x200; // Offset, range 0x000..0x3ff? |
+ signal = signal/3; // scaling to fit PPM resolution |
+ |
+ if(index >= 0 && index <= 10) |
+ { |
+ // Stabiles Signal |
+ if(abs(signal - PPM_in[index]) < 6) { if(SenderOkay < 200) SenderOkay += 10; else SenderOkay = 200;} |
+ tmp = (3 * (PPM_in[index]) + signal) / 4; |
+ if(tmp > signal+1) tmp--; else |
+ if(tmp < signal-1) tmp++; |
+ if(SenderOkay >= 180) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; |
+ else PPM_diff[index] = 0; |
+ PPM_in[index] = tmp; |
+ } |
+ } |
+ else |
+ { |
+ // hier stimmt was nicht: neu synchronisieren |
+ ReSync = 1; |
+ FrameCnt = 0; |
+ Frame2 = 0; |
+ } |
+ |
+ // 16 Bytes per frame |
+ if(FrameCnt >= 16) |
+ { |
+ // Frame complete |
+ if(Frame2 == 0) |
+ { |
+ // Null bedeutet: Neue Daten |
+ // nur beim ersten Frame (CH 0-7) setzen |
+ NewPpmData = 0; |
+ } |
+ |
+ // new frame next, nach fruehestens 7ms erwartet |
+ FrameCnt = 0; |
+ Frame2 = 0; |
+ Sync = 0; |
+ } |
+ // Zeit bis zum nächsten Zeichen messen |
+ FrameTimer = SetDelay(7); |
+ } |
+} |
+ |
+ |
/branches/thjac/V1_13/Spectrum.h |
---|
0,0 → 1,9 |
/*####################################################################################### |
Dekodieren eines Spectrum Signals |
#######################################################################################*/ |
#ifndef _SPECTRUM_H |
#define _SPECTRUM_H |
void Uart1Init(void); |
void SpektrumBinding(void); |
#endif //_RC_H |
/branches/thjac/V1_13/_Settings.h |
---|
0,0 → 1,43 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Abstimmung |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define ACC_AMPLIFY 6 |
#define FAKTOR_P 1 |
#define FAKTOR_I 0.0001 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Debug-Interface |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define SIO_DEBUG 1 // Soll der Debugger aktiviert sein? |
#define MIN_DEBUG_INTERVALL 250 // in diesem Intervall werden Degugdaten ohne Aufforderung gesendet |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Sender |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define K_NICK 0 |
#define K_ROLL 1 |
#define K_GAS 2 |
#define K_GIER 3 |
#define K_POTI1 4 |
#define K_POTI2 5 |
#define K_POTI3 6 |
#define K_POTI4 7 |
// +++++++++++++++++++++++++++++++ |
// + Getestete Settings: |
// +++++++++++++++++++++++++++++++ |
// Setting: Kamera |
// Stick_P:3 |
// Stick_D:0 |
// Gyro_P: 175 |
// Gyro_I: 175 |
// Ki_Anteil: 10 |
// +++++++++++++++++++++++++++++++ |
// + Getestete Settings: |
// +++++++++++++++++++++++++++++++ |
// Setting: Normal |
// Stick_P:2 |
// Stick_D:8 |
// Gyro_P: 80 |
// Gyro_I: 150 |
// Ki_Anteil: 5 |
/branches/thjac/V1_13/altcon.c |
---|
0,0 → 1,109 |
/* altcon.c |
* |
* Copyright 2009 Thomas Jachmann |
*/ |
#include "main.h" |
#include "altcon.h" |
#include "parameter.h" |
#include "fc.h" |
static char enabled = 0; |
static int accZOffset = 0; |
static int temp; // Temporäre Werte; wird mehrfach verwendet |
int altconN = 0; |
extern unsigned char Notlandung; // aus fc.c |
extern int airPressure; |
/* |
* Höhenregler initialisieren |
*/ |
void altcon_init( void ) { |
altcon_stop(); |
} |
/* |
* Speichert die aktuelle Höhe als Sollhöhe |
*/ |
void altcon_lock( void ) { |
SollHoehe = analog_airPressure(); |
accZOffset = Mess_Integral_Hoch / 128; |
} |
/* |
* Inkrementiert die aktuelle Höhe um eins |
*/ |
void altcon_inc( unsigned char count ) { |
SollHoehe += count; |
accZOffset = Mess_Integral_Hoch / 128; |
} |
/* |
* Startet den Höhenregler |
*/ |
void altcon_start( void ) { |
enabled = 1; |
} |
/* |
* Stoppt den Höhenregler |
*/ |
void altcon_stop( void ) { |
enabled = 0; |
} |
/* |
* Berechnet den Korrekturwert für die Höhenregelung |
*/ |
int altcon_error( void ) { |
int register error; |
DebugOut.Analog[24] = SollHoehe; |
altconN = 0; |
if( enabled && !Notlandung ) { |
// Fehlerwert für Regler ermitteln |
error = analog_airPressure() - SollHoehe; |
// Proportionalanteil |
altconN = ( PARAM_ALT_P * error ) / 4; // dividiert durch ( 16 / STICK_GAIN ) = 16 / 4 = 4 |
// Differenzialanteil wird in analog.c berechnet |
altconN += analog_airPressureDiff() / 2; |
// ACC-Z-Integral zur Dämpfung einbeziehen |
temp = ( ( ( Mess_Integral_Hoch / 128 ) - accZOffset ) * (signed long) PARAM_ALT_ACC ) / 32; |
// Dämpfung limitieren |
if( temp > ( 70 * STICK_GAIN ) ) |
temp = 70 * STICK_GAIN; |
else if( temp < -( 70 * STICK_GAIN ) ) |
temp = -( 70 * STICK_GAIN ); |
altconN += temp; |
// Verstärkung des Fehlerwertes zur Anpassung des Gewichtes |
altconN = altconN * PARAM_ALT_GAIN / 50L; |
// Limitierung des Korrekturwertes nach oben |
int altMax = PARAM_ALT_MAX * STICK_GAIN; |
if( altconN < -altMax ) |
altconN = -altMax; |
} |
DebugOut.Analog[27] = altconN; |
return altconN; |
} |
/branches/thjac/V1_13/altcon.h |
---|
0,0 → 1,20 |
/* altcon.h |
* |
* Copyright 2009 Thomas Jachmann |
*/ |
#ifndef ALTCON_H |
#define ALTCON_H |
#define altcon_avgerror() altconN |
extern int altconN; |
extern void altcon_init( void ); |
extern void altcon_start( void ); |
extern void altcon_lock( void ); |
extern void altcon_inc( unsigned char count ); |
extern void altcon_stop( void ); |
extern int altcon_error( void ); |
#endif // ALTCON_H |
/branches/thjac/V1_13/analog.c |
---|
0,0 → 1,459 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_ax, Aktuell_ay,Aktuell_az, UBat = 100; |
volatile int AdWertNickFilter = 0, AdWertRollFilter = 0, AdWertGierFilter = 0; |
volatile int HiResNick = 2500, HiResRoll = 2500; |
volatile int AdWertNick = 0, AdWertRoll = 0, AdWertGier = 0; |
volatile int AdWertAccRoll = 0,AdWertAccNick = 0,AdWertAccHoch = 0; |
volatile char messanzahl_AccHoch = 0; |
volatile long Luftdruck = 32000; |
volatile int StartLuftdruck; |
volatile unsigned int MessLuftdruck = 1023; |
unsigned char DruckOffsetSetting; |
signed char ExpandBaro = 0; |
volatile int HoeheD = 0; |
volatile char messanzahl_Druck; |
volatile int tmpLuftdruck; |
volatile unsigned int ZaehlMessungen = 0; |
unsigned char AnalogOffsetNick = 115,AnalogOffsetRoll = 115,AnalogOffsetGier = 115; |
unsigned char GyroDefektN = 0,GyroDefektR = 0,GyroDefektG = 0; |
volatile unsigned char AdReady = 1; |
//####################################################################################### |
// |
void ADC_Init(void) |
//####################################################################################### |
{ |
ADMUX = 0;//Referenz ist extern |
ANALOG_ON; |
} |
void SucheLuftruckOffset(void) |
{ |
unsigned int off; |
off = eeprom_read_byte(&EEPromArray[EEPROM_ADR_LAST_OFFSET]); |
if(off > 20) off -= 10; |
OCR0A = off; |
ExpandBaro = 0; |
Delay_ms_Mess(100); |
if(MessLuftdruck < 850) off = 0; |
for(; off < 250;off++) |
{ |
OCR0A = off; |
Delay_ms_Mess(50); |
printf("."); |
if(MessLuftdruck < 850) break; |
} |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_LAST_OFFSET], off); |
DruckOffsetSetting = off; |
Delay_ms_Mess(300); |
} |
void SucheGyroOffset(void) |
{ |
unsigned char i, ready = 0; |
int timeout; |
GyroDefektN = 0; GyroDefektR = 0; GyroDefektG = 0; |
timeout = SetDelay(2000); |
for(i=140; i != 0; i--) |
{ |
if(ready == 3 && i > 10) i = 9; |
ready = 0; |
if(AdWertNick < 1020) AnalogOffsetNick--; else if(AdWertNick > 1030) AnalogOffsetNick++; else ready++; |
if(AdWertRoll < 1020) AnalogOffsetRoll--; else if(AdWertRoll > 1030) AnalogOffsetRoll++; else ready++; |
if(AdWertGier < 1020) AnalogOffsetGier--; else if(AdWertGier > 1030) AnalogOffsetGier++; else ready++; |
twi_state = 8; |
i2c_start(); |
if(AnalogOffsetNick < 10) { GyroDefektN = 1; AnalogOffsetNick = 10;}; if(AnalogOffsetNick > 245) { GyroDefektN = 1; AnalogOffsetNick = 245;}; |
if(AnalogOffsetRoll < 10) { GyroDefektR = 1; AnalogOffsetRoll = 10;}; if(AnalogOffsetRoll > 245) { GyroDefektR = 1; AnalogOffsetRoll = 245;}; |
if(AnalogOffsetGier < 10) { GyroDefektG = 1; AnalogOffsetGier = 10;}; if(AnalogOffsetGier > 245) { GyroDefektG = 1; AnalogOffsetGier = 245;}; |
while(twi_state) if(CheckDelay(timeout)) {printf("\n\r DAC or I2C ERROR! Check I2C, 3Vref, DAC and BL-Ctrl"); break;} |
messanzahl_Druck = 0; |
ANALOG_ON; |
while(messanzahl_Druck == 0); |
if(i<10) Delay_ms_Mess(10); |
} |
Delay_ms_Mess(70); |
} |
/* |
0 n |
1 r |
2 g |
3 y |
4 x |
5 n |
6 r |
7 u |
8 z |
9 L |
10 n |
11 r |
12 g |
13 y |
14 x |
15 n |
16 r |
17 L |
*/ |
//####################################################################################### |
// |
SIGNAL(SIG_ADC) |
//####################################################################################### |
{ |
static unsigned char kanal=0,state = 0; |
static signed int gier1, roll1, nick1, nick_filter, roll_filter; |
static signed int accy, accx; |
switch(state++) |
{ |
case 0: |
nick1 = ADC; |
kanal = AD_ROLL; |
break; |
case 1: |
roll1 = ADC; |
kanal = AD_GIER; |
break; |
case 2: |
gier1 = ADC; |
kanal = AD_ACC_Y; |
break; |
case 3: |
Aktuell_ay = NeutralAccY - ADC; |
accy = Aktuell_ay; |
kanal = AD_ACC_X; |
break; |
case 4: |
Aktuell_ax = ADC - NeutralAccX; |
accx = Aktuell_ax; |
kanal = AD_NICK; |
break; |
case 5: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 6: |
roll1 += ADC; |
kanal = AD_UBAT; |
break; |
case 7: |
UBat = (3 * UBat + ADC / 3) / 4; |
kanal = AD_ACC_Z; |
break; |
case 8: |
AdWertAccHoch = (signed int) ADC - NeutralAccZ; |
if(AdWertAccHoch > 1) |
{ |
if(NeutralAccZ < 750) |
{ |
NeutralAccZ += 0.02; |
if(modell_fliegt < 500) NeutralAccZ += 0.1; |
} |
} |
else if(AdWertAccHoch < -1) |
{ |
if(NeutralAccZ > 550) |
{ |
NeutralAccZ-= 0.02; |
if(modell_fliegt < 500) NeutralAccZ -= 0.1; |
} |
} |
messanzahl_AccHoch = 1; |
Aktuell_az = ADC; |
Mess_Integral_Hoch += AdWertAccHoch; // Integrieren |
Mess_Integral_Hoch -= Mess_Integral_Hoch / 1024; // dämfen |
kanal = AD_DRUCK; |
break; |
// "case 8:" fehlt hier absichtlich |
case 10: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 11: |
roll1 += ADC; |
kanal = AD_GIER; |
break; |
case 12: |
if(PlatinenVersion == 10) AdWertGier = (ADC + gier1 + 1) / 2; |
else |
if(PlatinenVersion == 20) AdWertGier = 2047 - (ADC + gier1); |
else AdWertGier = (ADC + gier1); |
kanal = AD_ACC_Y; |
break; |
case 13: |
Aktuell_ay = NeutralAccY - ADC; |
AdWertAccRoll = (Aktuell_ay + accy); |
kanal = AD_ACC_X; |
break; |
case 14: |
Aktuell_ax = ADC - NeutralAccX; |
AdWertAccNick = (Aktuell_ax + accx); |
kanal = AD_NICK; |
break; |
case 15: |
nick1 += ADC; |
if(PlatinenVersion == 10) nick1 *= 2; else nick1 *= 4; |
AdWertNick = nick1 / 8; |
nick_filter = (nick_filter + nick1) / 2; |
HiResNick = nick_filter - AdNeutralNick; |
AdWertNickFilter = (AdWertNickFilter + HiResNick) / 2; |
kanal = AD_ROLL; |
break; |
case 16: |
roll1 += ADC; |
if(PlatinenVersion == 10) roll1 *= 2; else roll1 *= 4; |
AdWertRoll = roll1 / 8; |
roll_filter = (roll_filter + roll1) / 2; |
HiResRoll = roll_filter - AdNeutralRoll; |
AdWertRollFilter = (AdWertRollFilter + HiResRoll) / 2; |
kanal = AD_DRUCK; |
break; |
case 17: |
state = 0; |
AdReady = 1; |
ZaehlMessungen++; |
// "break" fehlt hier absichtlich |
case 9: |
tmpLuftdruck += ADC; |
if(++messanzahl_Druck >= 5) |
{ |
tmpLuftdruck /= 2; |
MessLuftdruck = ADC; |
messanzahl_Druck = 0; |
HoeheD = (31 * HoeheD + (int) Parameter_Luftdruck_D * (int)(255 * ExpandBaro + StartLuftdruck - tmpLuftdruck - HoehenWert))/32; // D-Anteil = neuerWert - AlterWert |
Luftdruck = (tmpLuftdruck + 7 * Luftdruck + 4) / 8; |
HoehenWert = 255 * ExpandBaro + StartLuftdruck - Luftdruck; |
tmpLuftdruck /= 2; |
} |
kanal = AD_NICK; |
break; |
default: |
kanal = 0; state = 0; kanal = AD_NICK; |
break; |
} |
ADMUX = kanal; |
if(state != 0) ANALOG_ON; |
} |
/* |
//####################################################################################### |
// |
SIGNAL(SIG_ADC) |
//####################################################################################### |
{ |
static unsigned char kanal=0,state = 0; |
static signed int gier1, roll1, nick1; |
static signed long nick_filter, roll_filter; |
static signed int accy, accx; |
switch(state++) |
{ |
case 0: |
nick1 = ADC; |
kanal = AD_ROLL; |
break; |
case 1: |
roll1 = ADC; |
kanal = AD_GIER; |
break; |
case 2: |
gier1 = ADC; |
kanal = AD_ACC_Y; |
break; |
case 3: |
Aktuell_ay = NeutralAccY - ADC; |
accy = Aktuell_ay; |
kanal = AD_NICK; |
break; |
case 4: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 5: |
roll1 += ADC; |
kanal = AD_ACC_Z; |
break; |
case 6: |
AdWertAccHoch = (signed int) ADC - NeutralAccZ; |
if(AdWertAccHoch > 1) |
{ |
if(NeutralAccZ < 750) |
{ |
NeutralAccZ += 0.02; |
if(modell_fliegt < 500) NeutralAccZ += 0.1; |
} |
} |
else if(AdWertAccHoch < -1) |
{ |
if(NeutralAccZ > 550) |
{ |
NeutralAccZ-= 0.02; |
if(modell_fliegt < 500) NeutralAccZ -= 0.1; |
} |
} |
messanzahl_AccHoch = 1; |
Aktuell_az = ADC; |
Mess_Integral_Hoch += AdWertAccHoch; // Integrieren |
Mess_Integral_Hoch -= Mess_Integral_Hoch / 1024; // dämfen |
kanal = AD_NICK; |
break; |
case 7: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 8: |
roll1 += ADC; |
kanal = AD_ACC_X; |
break; |
case 9: |
Aktuell_ax = ADC - NeutralAccX; |
accx = Aktuell_ax; |
kanal = AD_GIER; |
break; |
case 10: |
gier1 += ADC; |
kanal = AD_NICK; |
break; |
case 11: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 12: |
roll1 += ADC; |
kanal = AD_UBAT; |
break; |
case 13: |
UBat = (3 * UBat + ADC / 3) / 4;//(UBat + ((ADC * 39) / 256) + 19) / 2; |
kanal = AD_ACC_Y; |
break; |
case 14: |
Aktuell_ay = NeutralAccY - ADC; |
accy += Aktuell_ay; |
kanal = AD_NICK; |
break; |
case 15: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 16: |
roll1 += ADC; |
kanal = AD_ACC_X; |
break; |
case 17: |
Aktuell_ax = ADC - NeutralAccX; |
accx += Aktuell_ax; |
kanal = AD_NICK; |
break; |
case 18: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 19: |
roll1 += ADC; |
kanal = AD_GIER; |
break; |
case 20: |
gier1 += ADC; |
kanal = AD_ACC_Y; |
break; |
case 21: |
Aktuell_ay = NeutralAccY - ADC; |
accy += Aktuell_ay; |
kanal = AD_NICK; |
break; |
case 22: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 23: |
roll1 += ADC; |
kanal = AD_DRUCK; |
break; |
case 24: |
tmpLuftdruck += ADC; |
if(++messanzahl_Druck >= 5) |
{ |
MessLuftdruck = ADC; |
messanzahl_Druck = 0; |
HoeheD = (7 * HoeheD + (int) Parameter_Luftdruck_D * (int)(255 * ExpandBaro + StartLuftdruck - tmpLuftdruck - HoehenWert)) / 8; // D-Anteil = neuerWert - AlterWert |
Luftdruck = (tmpLuftdruck + 3 * Luftdruck) / 4; |
HoehenWert = 255 * ExpandBaro + StartLuftdruck - Luftdruck; |
tmpLuftdruck = 0; |
} |
kanal = AD_NICK; |
break; |
case 25: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 26: |
roll1 += ADC; |
kanal = AD_ACC_X; |
break; |
case 27: |
Aktuell_ax = ADC - NeutralAccX; |
accx += Aktuell_ax; |
kanal = AD_GIER; |
break; |
case 28: |
if(PlatinenVersion == 10) AdWertGier = (ADC + gier1 + 2) / 4; |
else |
if(PlatinenVersion == 20) AdWertGier = 2047 - (ADC + gier1 + 1) / 2; |
else AdWertGier = (ADC + gier1 + 1) / 2; |
kanal = AD_NICK; |
break; |
case 29: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 30: |
roll1 += ADC; |
kanal = AD_ACC_Y; |
break; |
case 31: |
Aktuell_ay = NeutralAccY - ADC; |
AdWertAccRoll = (Aktuell_ay + accy); |
kanal = AD_NICK; |
break; |
case 32: |
AdWertNick = (ADC + nick1 + 3) / 5; |
nick_filter = (long) (1 * (long) nick_filter + 4 * (long)(ADC + nick1) + 1) / 2; |
if(PlatinenVersion == 10) { AdWertNick /= 2;nick_filter /=2;} |
HiResNick = nick_filter - 20 * AdNeutralNick; |
AdWertNickFilter = (long)(3L * (long)AdWertNickFilter + HiResNick + 2) / 4; |
DebugOut.Analog[21] = AdWertNickFilter / 4; |
kanal = AD_ROLL; |
break; |
case 33: |
AdWertRoll = (ADC + roll1 + 3) / 5; |
roll_filter = (long)(1 * (long)roll_filter + 4 * (long)(ADC + roll1) + 1) / 2; |
if(PlatinenVersion == 10) { AdWertRoll /= 2;roll_filter /=2;} |
HiResRoll = roll_filter - 20 * AdNeutralRoll; |
AdWertRollFilter = (long)(3L * (long)AdWertRollFilter + HiResRoll + 2) / 4; |
DebugOut.Analog[22] = AdWertRollFilter / 4; |
kanal = AD_ACC_X; |
break; |
case 34: |
Aktuell_ax = ADC - NeutralAccX; |
AdWertAccNick = (Aktuell_ax + accx); |
kanal = AD_NICK; |
state = 0; |
AdReady = 1; |
ZaehlMessungen++; |
break; |
default: |
kanal = 0; |
state = 0; |
break; |
} |
ADMUX = kanal; |
if(state != 0) ANALOG_ON; |
} |
*/ |
/branches/thjac/V1_13/analog.h |
---|
0,0 → 1,48 |
#ifndef _ANALOG_H |
#define _ANALOG_H |
/*####################################################################################### |
#######################################################################################*/ |
extern volatile int UBat; |
extern volatile int AdWertNick, AdWertRoll, AdWertGier; |
extern volatile int AdWertAccRoll,AdWertAccNick,AdWertAccHoch; |
extern volatile int HiResNick, HiResRoll; |
extern volatile int AdWertNickFilter, AdWertRollFilter, AdWertGierFilter; |
extern volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_ax, Aktuell_ay,Aktuell_az; |
extern volatile long Luftdruck; |
extern volatile char messanzahl_Druck; |
extern volatile unsigned int ZaehlMessungen; |
extern unsigned char DruckOffsetSetting; |
extern signed char ExpandBaro; |
extern volatile int HoeheD; |
extern volatile unsigned int MessLuftdruck; |
extern volatile int StartLuftdruck; |
extern volatile char MessanzahlNick; |
extern unsigned char AnalogOffsetNick,AnalogOffsetRoll,AnalogOffsetGier; |
extern volatile unsigned char AdReady; |
unsigned int ReadADC(unsigned char adc_input); |
void ADC_Init(void); |
void SucheLuftruckOffset(void); |
void SucheGyroOffset(void); |
#define analog_airPressure() HoehenWert |
#define analog_airPressureDiff() HoeheD |
#define AD_GIER 0 |
#define AD_ROLL 1 |
#define AD_NICK 2 |
#define AD_DRUCK 3 |
#define AD_UBAT 4 |
#define AD_ACC_Z 5 |
#define AD_ACC_Y 6 |
#define AD_ACC_X 7 |
#define ANALOG_OFF ADCSRA=0 |
#define ANALOG_ON ADCSRA=(1<<ADEN)|(1<<ADSC)|(0<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADIE) |
//Signle trigger Mode, Interrupt on |
#endif //_ANALOG_H |
/branches/thjac/V1_13/eeprom.c |
---|
0,0 → 1,236 |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Konstanten |
// + 0-250 -> normale Werte |
// + 251 -> Poti1 |
// + 252 -> Poti2 |
// + 253 -> Poti3 |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
void DefaultStickMapping(void) |
{ |
EE_Parameter.Kanalbelegung[K_NICK] = 1; |
EE_Parameter.Kanalbelegung[K_ROLL] = 2; |
EE_Parameter.Kanalbelegung[K_GAS] = 3; |
EE_Parameter.Kanalbelegung[K_GIER] = 4; |
EE_Parameter.Kanalbelegung[K_POTI1] = 5; |
EE_Parameter.Kanalbelegung[K_POTI2] = 6; |
EE_Parameter.Kanalbelegung[K_POTI3] = 7; |
EE_Parameter.Kanalbelegung[K_POTI4] = 8; |
} |
void DefaultKonstanten1(void) |
{ |
EE_Parameter.GlobalConfig = CFG_ACHSENKOPPLUNG_AKTIV | CFG_KOMPASS_AKTIV | CFG_GPS_AKTIV;//CFG_HOEHEN_SCHALTER |
EE_Parameter.Hoehe_MinGas = 30; |
EE_Parameter.MaxHoehe = 251; // Wert : 0-250 251 -> Poti1 |
EE_Parameter.Hoehe_P = 10; // Wert : 0-32 |
EE_Parameter.Luftdruck_D = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_ACC_Wirkung = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_Verstaerkung = 4; // Wert : 0-50 |
EE_Parameter.Stick_P = 15; // Wert : 1-6 |
EE_Parameter.Stick_D = 30; // Wert : 0-64 |
EE_Parameter.Gier_P = 12; // Wert : 1-20 |
EE_Parameter.Gas_Min = 8; // Wert : 0-32 |
EE_Parameter.Gas_Max = 230; // Wert : 33-250 |
EE_Parameter.GyroAccFaktor = 30; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
EE_Parameter.Gyro_P = 80; // Wert : 0-250 |
EE_Parameter.Gyro_I = 150; // Wert : 0-250 |
EE_Parameter.Gyro_D = 3; // Wert : 0-250 |
EE_Parameter.UnterspannungsWarnung = 94; // Wert : 0-250 |
EE_Parameter.NotGas = 35; // Wert : 0-250 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 30; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
EE_Parameter.I_Faktor = 32; |
EE_Parameter.UserParam1 = 0; // zur freien Verwendung |
EE_Parameter.UserParam2 = 0; // zur freien Verwendung |
EE_Parameter.UserParam3 = 0; // zur freien Verwendung |
EE_Parameter.UserParam4 = 0; // zur freien Verwendung |
EE_Parameter.UserParam5 = 0; // zur freien Verwendung |
EE_Parameter.UserParam6 = 0; // zur freien Verwendung |
EE_Parameter.UserParam7 = 0; // zur freien Verwendung |
EE_Parameter.UserParam8 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoNickCompInvert = 0; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 50; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickMax = 150; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickRefresh = 5; |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.BitConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
EE_Parameter.AchsKopplung1 = 90; |
EE_Parameter.AchsKopplung2 = 67; |
EE_Parameter.CouplingYawCorrection = 0; |
EE_Parameter.WinkelUmschlagNick = 85; |
EE_Parameter.WinkelUmschlagRoll = 85; |
EE_Parameter.GyroAccAbgleich = 16; // 1/k |
EE_Parameter.Driftkomp = 32; |
EE_Parameter.DynamicStability = 100; |
EE_Parameter.J16Bitmask = 95; |
EE_Parameter.J17Bitmask = 243; |
EE_Parameter.J16Timing = 15; |
EE_Parameter.J17Timing = 15; |
EE_Parameter.NaviGpsModeControl = 253; |
EE_Parameter.NaviGpsGain = 100; |
EE_Parameter.NaviGpsP = 90; |
EE_Parameter.NaviGpsI = 90; |
EE_Parameter.NaviGpsD = 90; |
EE_Parameter.NaviGpsPLimit = 75; |
EE_Parameter.NaviGpsILimit = 75; |
EE_Parameter.NaviGpsDLimit = 75; |
EE_Parameter.NaviGpsACC = 0; |
EE_Parameter.NaviGpsMinSat = 6; |
EE_Parameter.NaviStickThreshold = 8; |
EE_Parameter.NaviWindCorrection = 90; |
EE_Parameter.NaviSpeedCompensation = 30; |
EE_Parameter.NaviOperatingRadius = 100; |
EE_Parameter.NaviAngleLimitation = 100; |
EE_Parameter.NaviPH_LoginTime = 4; |
memcpy(EE_Parameter.Name, "Sport\0", 12); |
} |
void DefaultKonstanten2(void) |
{ |
EE_Parameter.GlobalConfig = CFG_ACHSENKOPPLUNG_AKTIV | CFG_KOMPASS_AKTIV | CFG_GPS_AKTIV;///*CFG_HOEHEN_SCHALTER |*/ CFG_KOMPASS_AKTIV;//0x01; |
EE_Parameter.Hoehe_MinGas = 30; |
EE_Parameter.MaxHoehe = 251; // Wert : 0-250 251 -> Poti1 |
EE_Parameter.Hoehe_P = 10; // Wert : 0-32 |
EE_Parameter.Luftdruck_D = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_ACC_Wirkung = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_Verstaerkung = 3; // Wert : 0-50 |
EE_Parameter.Stick_P = 12; // Wert : 1-6 |
EE_Parameter.Stick_D = 16; // Wert : 0-64 |
EE_Parameter.Gier_P = 6; // Wert : 1-20 |
EE_Parameter.Gas_Min = 8; // Wert : 0-32 |
EE_Parameter.Gas_Max = 230; // Wert : 33-250 |
EE_Parameter.GyroAccFaktor = 30; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
EE_Parameter.Gyro_P = 80; // Wert : 0-250 |
EE_Parameter.Gyro_I = 120; // Wert : 0-250 |
EE_Parameter.Gyro_D = 3; // Wert : 0-250 |
EE_Parameter.UnterspannungsWarnung = 94; // Wert : 0-250 |
EE_Parameter.NotGas = 35; // Wert : 0-250 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 30; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
EE_Parameter.I_Faktor = 32; |
EE_Parameter.UserParam1 = 0; // zur freien Verwendung |
EE_Parameter.UserParam2 = 0; // zur freien Verwendung |
EE_Parameter.UserParam3 = 0; // zur freien Verwendung |
EE_Parameter.UserParam4 = 0; // zur freien Verwendung |
EE_Parameter.UserParam5 = 0; // zur freien Verwendung |
EE_Parameter.UserParam6 = 0; // zur freien Verwendung |
EE_Parameter.UserParam7 = 0; // zur freien Verwendung |
EE_Parameter.UserParam8 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoNickCompInvert = 0; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 50; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickMax = 150; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickRefresh = 5; |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.BitConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts |
EE_Parameter.AchsKopplung1 = 90; |
EE_Parameter.AchsKopplung2 = 67; |
EE_Parameter.CouplingYawCorrection = 60; |
EE_Parameter.WinkelUmschlagNick = 85; |
EE_Parameter.WinkelUmschlagRoll = 85; |
EE_Parameter.GyroAccAbgleich = 32; // 1/k |
EE_Parameter.Driftkomp = 32; |
EE_Parameter.DynamicStability = 75; |
EE_Parameter.J16Bitmask = 95; |
EE_Parameter.J17Bitmask = 243; |
EE_Parameter.J16Timing = 20; |
EE_Parameter.J17Timing = 20; |
EE_Parameter.NaviGpsModeControl = 253; |
EE_Parameter.NaviGpsGain = 100; |
EE_Parameter.NaviGpsP = 90; |
EE_Parameter.NaviGpsI = 90; |
EE_Parameter.NaviGpsD = 90; |
EE_Parameter.NaviGpsPLimit = 75; |
EE_Parameter.NaviGpsILimit = 75; |
EE_Parameter.NaviGpsDLimit = 75; |
EE_Parameter.NaviGpsACC = 0; |
EE_Parameter.NaviGpsMinSat = 6; |
EE_Parameter.NaviStickThreshold = 8; |
EE_Parameter.NaviWindCorrection = 90; |
EE_Parameter.NaviSpeedCompensation = 30; |
EE_Parameter.NaviOperatingRadius = 100; |
EE_Parameter.NaviAngleLimitation = 100; |
EE_Parameter.NaviPH_LoginTime = 4; |
memcpy(EE_Parameter.Name, "Normal\0", 12); |
} |
void DefaultKonstanten3(void) |
{ |
EE_Parameter.GlobalConfig = CFG_DREHRATEN_BEGRENZER | CFG_ACHSENKOPPLUNG_AKTIV | CFG_KOMPASS_AKTIV | CFG_GPS_AKTIV;///*CFG_HOEHEN_SCHALTER |*/ CFG_KOMPASS_AKTIV;//0x01; |
EE_Parameter.Hoehe_MinGas = 30; |
EE_Parameter.MaxHoehe = 251; // Wert : 0-250 251 -> Poti1 |
EE_Parameter.Hoehe_P = 10; // Wert : 0-32 |
EE_Parameter.Luftdruck_D = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_ACC_Wirkung = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_Verstaerkung = 3; // Wert : 0-50 |
EE_Parameter.Stick_P = 8; // Wert : 1-6 |
EE_Parameter.Stick_D = 16; // Wert : 0-64 |
EE_Parameter.Gier_P = 6; // Wert : 1-20 |
EE_Parameter.Gas_Min = 8; // Wert : 0-32 |
EE_Parameter.Gas_Max = 230; // Wert : 33-250 |
EE_Parameter.GyroAccFaktor = 30; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
EE_Parameter.Gyro_P = 100; // Wert : 0-250 |
EE_Parameter.Gyro_I = 120; // Wert : 0-250 |
EE_Parameter.Gyro_D = 3; // Wert : 0-250 |
EE_Parameter.UnterspannungsWarnung = 94; // Wert : 0-250 |
EE_Parameter.NotGas = 35; // Wert : 0-250 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 20; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
EE_Parameter.I_Faktor = 16; |
EE_Parameter.UserParam1 = 0; // zur freien Verwendung |
EE_Parameter.UserParam2 = 0; // zur freien Verwendung |
EE_Parameter.UserParam3 = 0; // zur freien Verwendung |
EE_Parameter.UserParam4 = 0; // zur freien Verwendung |
EE_Parameter.UserParam5 = 0; // zur freien Verwendung |
EE_Parameter.UserParam6 = 0; // zur freien Verwendung |
EE_Parameter.UserParam7 = 0; // zur freien Verwendung |
EE_Parameter.UserParam8 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoNickCompInvert = 0; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 50; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickMax = 150; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickRefresh = 5; |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.BitConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts |
EE_Parameter.AchsKopplung1 = 90; |
EE_Parameter.AchsKopplung2 = 67; |
EE_Parameter.CouplingYawCorrection = 70; |
EE_Parameter.WinkelUmschlagNick = 85; |
EE_Parameter.WinkelUmschlagRoll = 85; |
EE_Parameter.GyroAccAbgleich = 32; // 1/k |
EE_Parameter.Driftkomp = 32; |
EE_Parameter.DynamicStability = 50; |
EE_Parameter.J16Bitmask = 95; |
EE_Parameter.J17Bitmask = 243; |
EE_Parameter.J16Timing = 30; |
EE_Parameter.J17Timing = 30; |
EE_Parameter.NaviGpsModeControl = 253; |
EE_Parameter.NaviGpsGain = 100; |
EE_Parameter.NaviGpsP = 90; |
EE_Parameter.NaviGpsI = 90; |
EE_Parameter.NaviGpsD = 90; |
EE_Parameter.NaviGpsPLimit = 75; |
EE_Parameter.NaviGpsILimit = 75; |
EE_Parameter.NaviGpsDLimit = 75; |
EE_Parameter.NaviGpsACC = 0; |
EE_Parameter.NaviGpsMinSat = 6; |
EE_Parameter.NaviStickThreshold = 8; |
EE_Parameter.NaviWindCorrection = 90; |
EE_Parameter.NaviSpeedCompensation = 30; |
EE_Parameter.NaviOperatingRadius = 100; |
EE_Parameter.NaviAngleLimitation = 100; |
EE_Parameter.NaviPH_LoginTime = 4; |
memcpy(EE_Parameter.Name, "Beginner\0", 12); |
} |
/branches/thjac/V1_13/fc.c |
---|
0,0 → 1,1485 |
/*####################################################################################### |
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 "parameter.h" |
#include "pitch.h" |
#include "altcon.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_J16Brightness; // for the J16 Output |
unsigned char Parameter_J17Bitmask; // for the J17 Output |
unsigned char Parameter_J17Timing; // for the J17 Output |
unsigned char Parameter_J17Brightness; // 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; |
DebugOut.Analog[12] = Motor[0]; |
DebugOut.Analog[13] = Motor[1]; |
DebugOut.Analog[14] = Motor[3]; |
DebugOut.Analog[15] = Motor[2]; |
if (!(MotorenEin && PARAM_ENGINE_ENABLED)) { |
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; |
//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_J16Brightness, PARAM_LED_BRIGHTNESS_J16, 0, 250); |
CHK_POTI_MM(Parameter_J17Timing, EE_Parameter.J17Timing, 1, 255); |
CHK_POTI_MM(Parameter_J17Brightness, PARAM_LED_BRIGHTNESS_J17, 0, 250); |
CHK_POTI(Parameter_ExternalControl,EE_Parameter.ExternalControl,0,255); |
Ki = 10300 / (Parameter_I_Faktor + 1); |
MAX_GAS = EE_Parameter.Gas_Max; |
MIN_GAS = EE_Parameter.Gas_Min; |
} |
//############################################################################ |
// |
void MotorRegler(void) |
//############################################################################ |
{ |
int pd_ergebnis_nick,pd_ergebnis_roll,tmp_int; |
int GierMischanteil,GasMischanteil; |
static long SummeNick=0,SummeRoll=0; |
static long sollGier = 0,tmp_long,tmp_long2; |
static long IntegralFehlerNick = 0; |
static long IntegralFehlerRoll = 0; |
static unsigned int RcLostTimer; |
static unsigned char delay_neutral = 0; |
static unsigned char delay_einschalten = 0,delay_ausschalten = 0; |
static char TimerWerteausgabe = 0; |
static char NeueKompassRichtungMerken = 0; |
static long ausgleichNick, ausgleichRoll; |
int IntegralNickMalFaktor,IntegralRollMalFaktor; |
unsigned char i; |
Mittelwert(); |
GRN_ON; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gaswert ermitteln |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
GasMischanteil = StickGas; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// 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(); |
init(); |
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; |
// Beim Einschalten automatisch kalibrieren |
if (PARAM_CAL_ON_START) { |
if ((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) { |
if ((MessLuftdruck > 950) || (MessLuftdruck < 750)) { |
SucheLuftruckOffset(); |
} |
} |
SetNeutral(); |
} |
} |
} 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 chanNickPrev = 0; |
static int chanRollPrev = 0; |
static int stick_nick,stick_roll; |
ParameterZuordnung(); |
#define MAX_CHAN_VAL 125L |
#define COS45 7071L // cos( -45 ) * 10000 |
long chanNick = PPM_in[EE_Parameter.Kanalbelegung[K_NICK]]; |
long chanRoll = PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]; |
int chanNickDiff; |
int chanRollDiff; |
/* Über Parameter läßt sich zwischen "+" und "X" - Formations |
* umschalten (sh. parameter.h) |
*/ |
if (PARAM_X_FORMATION) { |
chanRoll = -chanRoll; |
// Stick-Koordinatensystem um -45° (rechts) drehen |
chanNick *= COS45; |
chanRoll *= COS45; |
int chanNickTemp = (chanNick - chanRoll) / 10000L; |
int chanRollTemp = (chanRoll + chanNick) / 10000L; |
chanNick = chanNickTemp; |
chanRoll = -chanRollTemp; |
if (chanNick > MAX_CHAN_VAL) |
chanNick = MAX_CHAN_VAL; |
if (chanNick < -MAX_CHAN_VAL) |
chanNick = -MAX_CHAN_VAL; |
if (chanRoll > MAX_CHAN_VAL) |
chanRoll = MAX_CHAN_VAL; |
if (chanRoll < -MAX_CHAN_VAL) |
chanRoll = -MAX_CHAN_VAL; |
} |
chanNickDiff = ((chanNick - chanNickPrev) / 3) * 3; |
chanRollDiff = ((chanRoll - chanRollPrev) / 3) * 3; |
chanNickPrev = chanNick; |
chanRollPrev = chanRoll; |
stick_nick = (stick_nick * 3 + ((int) chanNick) * EE_Parameter.Stick_P) / 4; |
stick_nick += chanNickDiff * EE_Parameter.Stick_D; |
StickNick = stick_nick - GPS_Nick; |
stick_roll = (stick_roll * 3 + ((int) chanRoll) * EE_Parameter.Stick_P) / 4; |
stick_roll += chanRollDiff * EE_Parameter.Stick_D; |
StickRoll = stick_roll - GPS_Roll; |
StickGier = -PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]; |
if(StickGier > 2) StickGier -= 2; else |
if(StickGier < -2) StickGier += 2; else StickGier = 0; |
// Gaswert übernehmen |
// StickGas = pitchValueFP(); |
StickGas = pitch_value(); |
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; |
} |
} |
*/ |
// Fehlerwert der Höhenregelung einmischen |
GasMischanteil -= altcon_error(); |
if(GasMischanteil > (MAX_GAS - 20) * STICK_GAIN) GasMischanteil = (MAX_GAS - 20) * STICK_GAIN; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Mischer und PI-Regler |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DebugOut.Analog[7] = GasMischanteil; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gier-Anteil |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define MUL_G 1.0 |
GierMischanteil = MesswertGier - sollGier * STICK_GAIN; // Regler für Gier |
// GierMischanteil = 0; |
#define MIN_GIERGAS (40*STICK_GAIN) // unter diesem Gaswert trotzdem Gieren |
if(GasMischanteil > MIN_GIERGAS) |
{ |
if(GierMischanteil > (GasMischanteil / 2)) GierMischanteil = GasMischanteil / 2; |
if(GierMischanteil < -(GasMischanteil / 2)) GierMischanteil = -(GasMischanteil / 2); |
} |
else |
{ |
if(GierMischanteil > (MIN_GIERGAS / 2)) GierMischanteil = MIN_GIERGAS / 2; |
if(GierMischanteil < -(MIN_GIERGAS / 2)) GierMischanteil = -(MIN_GIERGAS / 2); |
} |
tmp_int = MAX_GAS*STICK_GAIN; |
if(GierMischanteil > ((tmp_int - GasMischanteil))) GierMischanteil = ((tmp_int - GasMischanteil)); |
if(GierMischanteil < -((tmp_int - GasMischanteil))) GierMischanteil = -((tmp_int - GasMischanteil)); |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Nick-Achse |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DiffNick = MesswertNick - StickNick; // Differenz bestimmen |
if(IntegralFaktor) SummeNick += IntegralNickMalFaktor - StickNick; // I-Anteil bei Winkelregelung |
else SummeNick += DiffNick; // I-Anteil bei HH |
if(SummeNick > (STICK_GAIN * 16000L)) SummeNick = (STICK_GAIN * 16000L); |
if(SummeNick < -(16000L * STICK_GAIN)) SummeNick = -(16000L * STICK_GAIN); |
pd_ergebnis_nick = DiffNick + SummeNick / Ki; // PI-Regler für Nick |
// Motor Vorn |
tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
if(pd_ergebnis_nick > tmp_int) pd_ergebnis_nick = tmp_int; |
if(pd_ergebnis_nick < -tmp_int) pd_ergebnis_nick = -tmp_int; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Roll-Achse |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DiffRoll = MesswertRoll - StickRoll; // Differenz bestimmen |
if(IntegralFaktor) SummeRoll += IntegralRollMalFaktor - StickRoll;// I-Anteil bei Winkelregelung |
else SummeRoll += DiffRoll; // I-Anteil bei HH |
if(SummeRoll > (STICK_GAIN * 16000L)) SummeRoll = (STICK_GAIN * 16000L); |
if(SummeRoll < -(16000L * STICK_GAIN)) SummeRoll = -(16000L * STICK_GAIN); |
pd_ergebnis_roll = DiffRoll + SummeRoll / Ki; // PI-Regler für Roll |
tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
if(pd_ergebnis_roll > tmp_int) pd_ergebnis_roll = tmp_int; |
if(pd_ergebnis_roll < -tmp_int) pd_ergebnis_roll = -tmp_int; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Universal Mixer |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
for(i=0; i<MAX_MOTORS; i++) |
{ |
signed int tmp_int; |
if(Mixer.Motor[i][0] > 0) |
{ |
tmp_int = ((long)GasMischanteil * Mixer.Motor[i][0]) / 64L; |
tmp_int += ((long)pd_ergebnis_nick * Mixer.Motor[i][1]) / 64L; |
tmp_int += ((long)pd_ergebnis_roll * Mixer.Motor[i][2]) / 64L; |
tmp_int += ((long)GierMischanteil * Mixer.Motor[i][3]) / 64L; |
tmp_motorwert[i] = MotorSmoothing(tmp_int,tmp_motorwert[i]); // Filter |
tmp_int = tmp_motorwert[i] / STICK_GAIN; |
CHECK_MIN_MAX(tmp_int,MIN_GAS,MAX_GAS); |
Motor[i] = tmp_int; |
} |
else Motor[i] = 0; |
} |
/* |
if(Poti1 > 20) Motor1 = 0; |
if(Poti1 > 90) Motor6 = 0; |
if(Poti1 > 140) Motor2 = 0; |
//if(Poti1 > 200) Motor7 = 0; |
*/ |
} |
/branches/thjac/V1_13/fc.h |
---|
0,0 → 1,184 |
/*####################################################################################### |
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_J16Brightness; // for the J16 Output |
extern unsigned char Parameter_J17Bitmask; // for the J17 Output |
extern unsigned char Parameter_J17Timing; // for the J17 Output |
extern unsigned char Parameter_J17Brightness; // for the J17 Output |
extern signed char MixerTable[MAX_MOTORS][4]; |
extern unsigned char Motor[MAX_MOTORS]; |
#endif //_FC_H |
/branches/thjac/V1_13/flight.pnproj |
---|
0,0 → 1,0 |
<Project name="Flight-Ctrl"><File path="uart.c"></File><File path="altcon.c"></File><File path="analog.c"></File><File path="eeprom.c"></File><File path="fc.c"></File><File path="GPS.c"></File><File path="led.c"></File><File path="main.c"></File><File path="menu.c"></File><File path="pitch.c"></File><File path="pitch_md.c"></File><File path="printf_P.c"></File><File path="rc.c"></File><File path="Spectrum.c"></File><File path="spi.c"></File><File path="timer0.c"></File><File path="twimaster.c"></File><File path="altcon.h"></File><File path="analog.h"></File><File path="fc.h"></File><File path="gps.h"></File><File path="led.h"></File><File path="main.h"></File><File path="menu.h"></File><File path="old_macros.h"></File><File path="parameter.h"></File><File path="pitch.h"></File><File path="pitch_md.h"></File><File path="printf_P.h"></File><File path="rc.h"></File><File path="Settings.h"></File><File path="Spectrum.h"></File><File path="spi.h"></File><File path="timer0.h"></File><File path="twimaster.h"></File><File path="uart.h"></File><File path="makefile"></File></Project> |
/branches/thjac/V1_13/flight.pnps |
---|
0,0 → 1,0 |
<pd><ViewState><e p="Flight-Ctrl" x="true"></e></ViewState></pd> |
/branches/thjac/V1_13/gps.h |
---|
0,0 → 1,7 |
extern signed int GPS_Nick; |
extern signed int GPS_Roll; |
extern signed int GPS_Nick2; |
extern signed int GPS_Roll2; |
void GPS_Neutral(void); |
void GPS_BerechneZielrichtung(void); |
/branches/thjac/V1_13/led.c |
---|
0,0 → 1,117 |
#include <inttypes.h> |
#include "main.h" |
#include "parameter.h" |
unsigned char J16Blinkcount = 0, J16Mask = 1, J16Brightness = 0, J16 = 0; |
unsigned char J17Blinkcount = 0, J17Mask = 1, J17Brightness = 0, J17 = 0; |
unsigned char lightsEnabled = 0, lightsOn = 0; |
extern char MotorenEin; |
void setJ16(char enabled) { |
if ((enabled && lightsOn) ^ LED_NEGATE_J16) |
J16_ON; |
else |
J16_OFF; |
} |
void setJ17(char enabled) { |
if ((enabled && lightsOn) ^ LED_NEGATE_J17) |
J17_ON; |
else |
J17_OFF; |
} |
// 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); |
lightsOn = lightsEnabled = 0; |
setJ16(0); |
setJ17(0); |
J16Blinkcount = 0; |
J16Mask = 128; |
J17Blinkcount = 0; |
J17Mask = 128; |
} |
static inline void checkLightsEnabled(void) { |
// Die LED's können mit den Motoren ein- ausgeschaltet werden |
if (PARAM_LED_ENGINE_ENABLED) |
lightsEnabled = MotorenEin; |
// Die LED's können mit den Motoren ein- ausgeschaltet werden |
else if (PARAM_LED_STICK_ENABLED) { |
if (!MotorenEin) { |
if (PPM_in[ EE_Parameter.Kanalbelegung[ K_GAS ] ] > 35 - 120 |
&& PPM_in[ EE_Parameter.Kanalbelegung[ K_GAS ] ] < 120 - 35) { |
if (PPM_in[ EE_Parameter.Kanalbelegung[ K_GIER ] ] < -75) |
lightsEnabled = 1; |
if (PPM_in[ EE_Parameter.Kanalbelegung[ K_GIER ] ] > 75) |
lightsEnabled = 0; |
} |
} |
} else |
lightsEnabled = 1; |
lightsOn = lightsEnabled; |
} |
// called in UpdateMotors() every 2ms |
void LED_Update(void) { |
static char delay = 0; |
if (!delay--) { |
delay = 9; // 20ms Intervall |
checkLightsEnabled(); |
// Soll die Unterspannungswarnung zu einem schnelleren Blinken führen? |
// Grenze für Unterspannungswarnung erreicht? |
if (PARAM_LED_WARNING_SPEEDUP && UBat < EE_Parameter.UnterspannungsWarnung) { |
if (PARAM_LED_FORCE_WARNING_ENABLED) // Erzwingt die Aktivierung der Ausgänge |
lightsOn = 1; |
delay /= PARAM_LED_WARNING_SPEEDUP + 1; |
} |
// J16 |
if (EE_Parameter.J16Timing > 250 && Parameter_J16Timing > 230) |
J16 = EE_Parameter.J16Bitmask & 128; |
else if (EE_Parameter.J16Timing > 250 && Parameter_J16Timing < 10) |
J16 = !(EE_Parameter.J16Bitmask & 128); |
else if (!J16Blinkcount--) { |
J16Blinkcount = Parameter_J16Timing - 1; |
J16Mask = (J16Mask == 1 ? 0x80 : J16Mask >> 1); |
J16 = EE_Parameter.J16Bitmask & J16Mask; |
} |
J16Brightness = EE_Parameter.J16Bitmask & J16Mask ? Parameter_J16Brightness / 23 : 0; |
// J17 |
if (EE_Parameter.J17Timing > 250 && Parameter_J17Timing > 230) |
J17 = EE_Parameter.J17Bitmask & 128; |
else if (EE_Parameter.J17Timing > 250 && Parameter_J17Timing < 10) |
J17 = !(EE_Parameter.J17Bitmask & 128); |
else if (!J17Blinkcount--) { |
J17Blinkcount = Parameter_J17Timing - 1; |
J17Mask = (J17Mask == 1 ? 0x80 : J17Mask >> 1); |
J17 = EE_Parameter.J17Bitmask & J17Mask; |
} |
J17Brightness = EE_Parameter.J17Bitmask & J17Mask ? Parameter_J17Brightness / 23 : 0; |
} |
// delay: 0...9 - BRIGHTNESS/23: 0-Aus...10-Max - Bei Unterspannung volle Leuchtkraft |
setJ16(J16 && (delay < J16Brightness || UBat < EE_Parameter.UnterspannungsWarnung)); |
setJ17(J17 && (delay < J17Brightness || UBat < EE_Parameter.UnterspannungsWarnung)); |
} |
/branches/thjac/V1_13/led.h |
---|
0,0 → 1,11 |
#include <avr/io.h> |
#define J16_ON PORTC |= (1<<PORTC2) |
#define J16_OFF PORTC &= ~(1<<PORTC2) |
#define J16_TOGGLE PORTC ^= (1<<PORTC2) |
#define J17_ON PORTC |= (1<<PORTC3) |
#define J17_OFF PORTC &= ~(1<<PORTC3) |
#define J17_TOGGLE PORTC ^= (1<<PORTC3) |
extern void LED_Init(void); |
extern void LED_Update(void); |
/branches/thjac/V1_13/main.c |
---|
0,0 → 1,378 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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" |
#include "altcon.h" |
#include "pitch.h" |
#include "led.h" |
unsigned char EEPromArray[E2END+1] EEMEM; |
unsigned char PlatinenVersion = 10; |
unsigned char SendVersionToNavi = 1; |
// -- Parametersatz aus EEPROM lesen --- |
// number [1..5] |
void init( void ) { |
LED_Init(); |
altcon_init(); |
pitch_init(); |
} |
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); |
} |
// -- 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"); |
// Initialisierung muß nach Einlesen der Konfiguration erfolgen |
init(); |
LcdClear(); |
I2CTimeout = 5000; |
WinkelOut.Orientation = 1; |
while (1) |
{ |
if(UpdateMotor && AdReady) // ReglerIntervall |
{ |
UpdateMotor=0; |
if(WinkelOut.CalcState) CalMk3Mag(); |
else MotorRegler(); |
SendMotorData(); |
ROT_OFF; |
if(PcZugriff) PcZugriff--; |
else |
{ |
ExternControl.Config = 0; |
ExternStickNick = 0; |
ExternStickRoll = 0; |
ExternStickGier = 0; |
} |
if(SenderOkay) SenderOkay--; |
if(NaviDataOkay) |
{ |
if(--NaviDataOkay == 0) |
{ |
GPS_Nick = 0; |
GPS_Roll = 0; |
} |
} |
if(!--I2CTimeout || MissingMotor) |
{ |
if(!I2CTimeout) |
{ |
i2c_reset(); |
I2CTimeout = 5; |
} |
if((BeepMuster == 0xffff) && MotorenEin) |
{ |
beeptime = 10000; |
BeepMuster = 0x0080; |
} |
} |
else |
{ |
ROT_OFF; |
} |
if(SIO_DEBUG && (!UpdateMotor || !MotorenEin)) |
{ |
DatenUebertragung(); |
BearbeiteRxDaten(); |
} |
else BearbeiteRxDaten(); |
if(CheckDelay(timer)) |
{ |
if(UBat < EE_Parameter.UnterspannungsWarnung) |
{ |
if(BeepMuster == 0xffff) |
{ |
beeptime = 6000; |
BeepMuster = 0x0300; |
} |
} |
SPI_StartTransmitPacket(); |
SendSPI = 4; |
timer = SetDelay(20); |
} |
LED_Update(); |
} |
if(!SendSPI) { SPI_TransmitByte(); } |
} |
return (1); |
} |
//if(HoehenReglerAktiv && NaviDataOkay && SenderOkay < 160 && SenderOkay > 10 && FromNaviCtrl_Value.SerialDataOkay > 220) SenderOkay = 160; |
//if(HoehenReglerAktiv && NaviDataOkay && SenderOkay < 101 && SenderOkay > 10 && FromNaviCtrl_Value.SerialDataOkay > 1) SenderOkay = 101; |
/branches/thjac/V1_13/main.h |
---|
0,0 → 1,174 |
#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_PITCH_MD_HOVER 10 |
#define EEPROM_ADR_PITCH_NEUTRAL_DIFF 12 |
#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[]; |
extern void init( void ); |
#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" |
#define DIV_4 2 |
#define DIV_128 7 |
#define MUL_4 2 |
#ifndef EEMEM |
#define EEMEM __attribute__ ((section (".eeprom"))) |
#endif |
#define DEBUG_DISPLAY_INTERVALL 123 // in ms |
#define DELAY_US(x) ((unsigned int)( (x) * 1e-6 * F_CPU )) |
#endif //_MAIN_H |
/branches/thjac/V1_13/makefile |
---|
0,0 → 1,449 |
#-------------------------------------------------------------------- |
# MCU name |
MCU = atmega644p |
F_CPU = 20000000 |
#------------------------------------------------------------------- |
VERSION_MAJOR = 1 |
VERSION_MINOR = 13 |
VERSION_PATCH = 0 |
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 |
SRC += altcon.c pitch.c pitch_md.c |
########################################################################################################## |
# List Assembler source files here. |
# Make them always end in a capital .S. Files ending in a lowercase .s |
# will not be considered source files but generated files (assembler |
# output from the compiler), and will be deleted upon "make clean"! |
# Even though the DOS/Win* filesystem matches both .s and .S the same, |
# it will preserve the spelling of the filenames, and gcc itself does |
# care about how the name is spelled on its command-line. |
ASRC = |
# List any extra directories to look for include files here. |
# Each directory must be seperated by a space. |
EXTRAINCDIRS = |
# Optional compiler flags. |
# -g: generate debugging information (for GDB, or for COFF conversion) |
# -O*: optimization level |
# -f...: tuning, see gcc manual and avr-libc documentation |
# -Wall...: warning level |
# -Wa,...: tell GCC to pass this to the assembler. |
# -ahlms: create assembler listing |
CFLAGS = -O$(OPT) \ |
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \ |
-Wall -Wstrict-prototypes \ |
-Wa,-adhlns=$(<:.c=.lst) \ |
$(patsubst %,-I%,$(EXTRAINCDIRS)) |
# Set a "language standard" compiler flag. |
# Unremark just one line below to set the language standard to use. |
# gnu99 = C99 + GNU extensions. See GCC manual for more information. |
#CFLAGS += -std=c89 |
#CFLAGS += -std=gnu89 |
#CFLAGS += -std=c99 |
CFLAGS += -std=gnu99 |
CFLAGS += -DVERSION_MAJOR=$(VERSION_MAJOR) -DVERSION_MINOR=$(VERSION_MINOR) -DVERSION_PATCH=$(VERSION_PATCH) -DVERSION_SERIAL_MAJOR=$(VERSION_SERIAL_MAJOR) -DVERSION_SERIAL_MINOR=$(VERSION_SERIAL_MINOR) -DNC_SPI_COMPATIBLE=$(NC_SPI_COMPATIBLE) |
# Optional assembler flags. |
# -Wa,...: tell GCC to pass this to the assembler. |
# -ahlms: create listing |
# -gstabs: have the assembler create line number information; note that |
# for use in COFF files, additional information about filenames |
# and function names needs to be present in the assembler source |
# files -- see avr-libc docs [FIXME: not yet described there] |
ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs |
# Optional linker flags. |
# -Wl,...: tell GCC to pass this to linker. |
# -Map: create map file |
# --cref: add cross reference to map file |
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref |
# Additional libraries |
# Minimalistic printf version |
#LDFLAGS += -Wl,-u,vfprintf -lprintf_min |
# Floating point printf version (requires -lm below) |
#LDFLAGS += -Wl,-u,vfprintf -lprintf_flt |
# -lm = math library |
LDFLAGS += -lm |
##LDFLAGS += -T./linkerfile/avr5.x |
# Programming support using avrdude. Settings and variables. |
# Programming hardware: alf avr910 avrisp bascom bsd |
# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500 |
# |
# Type: avrdude -c ? |
# to get a full listing. |
# |
#AVRDUDE_PROGRAMMER = dt006 |
#AVRDUDE_PROGRAMMER = stk200 |
#AVRDUDE_PROGRAMMER = ponyser |
AVRDUDE_PROGRAMMER = avrispv2 |
#falls Ponyser ausgewählt wird, muss sich unsere avrdude-Configdatei im Bin-Verzeichnis des Compilers befinden |
#AVRDUDE_PORT = com1 # programmer connected to serial device |
#AVRDUDE_PORT = lpt1 # programmer connected to parallel port |
AVRDUDE_PORT = usb # programmer connected to USB |
#AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex |
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex $(FUSE_SETTINGS) |
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep |
#avrdude -c avrispv2 -P usb -p m32 -U flash:w:blink.hex |
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) |
# Uncomment the following if you want avrdude's erase cycle counter. |
# Note that this counter needs to be initialized first using -Yn, |
# see avrdude manual. |
#AVRDUDE_ERASE += -y |
# Uncomment the following if you do /not/ wish a verification to be |
# performed after programming the device. |
AVRDUDE_FLAGS += -V |
# Increase verbosity level. Please use this when submitting bug |
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude> |
# to submit bug reports. |
#AVRDUDE_FLAGS += -v -v |
# --------------------------------------------------------------------------- |
# Define directories, if needed. |
DIRAVR = c:/winavr |
DIRAVRBIN = $(DIRAVR)/bin |
DIRAVRUTILS = $(DIRAVR)/utils/bin |
DIRINC = . |
DIRLIB = $(DIRAVR)/avr/lib |
# Define programs and commands. |
SHELL = sh |
CC = avr-gcc |
OBJCOPY = avr-objcopy |
OBJDUMP = avr-objdump |
SIZE = avr-size |
# Programming support using avrdude. |
AVRDUDE = avrdude |
REMOVE = rm -f |
COPY = cp |
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex |
ELFSIZE = $(SIZE) -A $(TARGET).elf |
# Define Messages |
# English |
MSG_ERRORS_NONE = Errors: none |
MSG_BEGIN = -------- begin -------- |
MSG_END = -------- end -------- |
MSG_SIZE_BEFORE = Size before: |
MSG_SIZE_AFTER = Size after: |
MSG_COFF = Converting to AVR COFF: |
MSG_EXTENDED_COFF = Converting to AVR Extended COFF: |
MSG_FLASH = Creating load file for Flash: |
MSG_EEPROM = Creating load file for EEPROM: |
MSG_EXTENDED_LISTING = Creating Extended Listing: |
MSG_SYMBOL_TABLE = Creating Symbol Table: |
MSG_LINKING = Linking: |
MSG_COMPILING = Compiling: |
MSG_ASSEMBLING = Assembling: |
MSG_CLEANING = Cleaning project: |
# Define all object files. |
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) |
# Define all listing files. |
LST = $(ASRC:.S=.lst) $(SRC:.c=.lst) |
# Combine all necessary flags and optional flags. |
# Add target processor to flags. |
#ALL_CFLAGS = -mmcu=$(MCU) -DF_CPU=$(F_CPU) -I. $(CFLAGS) |
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) |
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) |
# Default target. |
all: begin gccversion sizebefore $(TARGET).elf $(TARGET).hex $(TARGET).eep \ |
$(TARGET).lss $(TARGET).sym sizeafter finished end |
# Eye candy. |
# AVR Studio 3.x does not check make's exit code but relies on |
# the following magic strings to be generated by the compile job. |
begin: |
@echo |
@echo $(MSG_BEGIN) |
finished: |
@echo $(MSG_ERRORS_NONE) |
end: |
@echo $(MSG_END) |
@echo |
# Display size of file. |
# Display size of file. |
sizebefore: |
@if [ -f $(TARGET).elf ]; then echo Size before:; $(ELFSIZE); $(HEXSIZE); echo; fi |
sizeafter: |
@if [ -f $(TARGET).elf ]; then echo Size after:; $(ELFSIZE); $(HEXSIZE); echo; fi |
# Display compiler version information. |
gccversion : |
@$(CC) --version |
# Convert ELF to COFF for use in debugging / simulating in |
# AVR Studio or VMLAB. |
COFFCONVERT=$(OBJCOPY) --debugging \ |
--change-section-address .data-0x800000 \ |
--change-section-address .bss-0x800000 \ |
--change-section-address .noinit-0x800000 \ |
--change-section-address .eeprom-0x810000 |
coff: $(TARGET).elf |
@echo |
@echo $(MSG_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof |
extcoff: $(TARGET).elf |
@echo |
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof |
# Program the device. |
program: $(TARGET).hex $(TARGET).eep |
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) |
# Create final output files (.hex, .eep) from ELF output file. |
%.hex: %.elf |
@echo |
@echo $(MSG_FLASH) $@ |
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ |
%.eep: %.elf |
@echo |
@echo $(MSG_EEPROM) $@ |
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ |
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@ |
# Create extended listing file from ELF output file. |
%.lss: %.elf |
@echo |
@echo $(MSG_EXTENDED_LISTING) $@ |
$(OBJDUMP) -h -S $< > $@ |
# Create a symbol table from ELF output file. |
%.sym: %.elf |
@echo |
@echo $(MSG_SYMBOL_TABLE) $@ |
avr-nm -n $< > $@ |
# Link: create ELF output file from object files. |
.SECONDARY : $(TARGET).elf |
.PRECIOUS : $(OBJ) |
%.elf: $(OBJ) |
@echo |
@echo $(MSG_LINKING) $@ |
$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) |
# Compile: create object files from C source files. |
%.o : %.c |
@echo |
@echo $(MSG_COMPILING) $< |
$(CC) -c $(ALL_CFLAGS) $< -o $@ |
# Compile: create assembler files from C source files. |
%.s : %.c |
$(CC) -S $(ALL_CFLAGS) $< -o $@ |
# Assemble: create object files from assembler source files. |
%.o : %.S |
@echo |
@echo $(MSG_ASSEMBLING) $< |
$(CC) -c $(ALL_ASFLAGS) $< -o $@ |
# Target: clean project. |
clean: begin clean_list finished end |
clean_list : |
@echo |
@echo $(MSG_CLEANING) |
# $(REMOVE) $(TARGET).hex |
$(REMOVE) $(TARGET).eep |
$(REMOVE) $(TARGET).obj |
$(REMOVE) $(TARGET).cof |
$(REMOVE) $(TARGET).elf |
$(REMOVE) $(TARGET).map |
$(REMOVE) $(TARGET).obj |
$(REMOVE) $(TARGET).a90 |
$(REMOVE) $(TARGET).sym |
$(REMOVE) $(TARGET).lnk |
$(REMOVE) $(TARGET).lss |
$(REMOVE) $(OBJ) |
$(REMOVE) $(LST) |
$(REMOVE) $(SRC:.c=.s) |
$(REMOVE) $(SRC:.c=.d) |
# Automatically generate C source code dependencies. |
# (Code originally taken from the GNU make user manual and modified |
# (See README.txt Credits).) |
# |
# Note that this will work with sh (bash) and sed that is shipped with WinAVR |
# (see the SHELL variable defined above). |
# This may not work with other shells or other seds. |
# |
%.d: %.c |
set -e; $(CC) -MM $(ALL_CFLAGS) $< \ |
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > $@; \ |
[ -s $@ ] || rm -f $@ |
# Remove the '-' if you want to see the dependency files generated. |
-include $(SRC:.c=.d) |
# Listing of phony targets. |
.PHONY : all begin finish end sizebefore sizeafter gccversion coff extcoff \ |
clean clean_list program |
/branches/thjac/V1_13/menu.c |
---|
0,0 → 1,185 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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" |
#include "altcon.h" |
#include "pitch.h" |
#include "pitch_md.h" |
#include "parameter.h" |
#include "fc.h" |
unsigned int TestInt = 0; |
#define ARRAYGROESSE 10 |
unsigned char Array[ARRAYGROESSE] = {1,2,3,4,5,6,7,8,9,10}; |
char DisplayBuff[80] = "Hallo Welt"; |
unsigned char DispPtr = 0; |
unsigned char MaxMenue = 14; |
unsigned char MenuePunkt = 0; |
unsigned char RemoteKeys = 0; |
#define KEY1 0x01 |
#define KEY2 0x02 |
#define KEY3 0x04 |
#define KEY4 0x08 |
#define KEY5 0x10 |
void LcdClear(void) |
{ |
unsigned char i; |
for(i=0;i<80;i++) DisplayBuff[i] = ' '; |
} |
void Menu(void) |
{ |
if(MenuePunkt > MaxMenue) MenuePunkt = MaxMenue; |
if(RemoteKeys & KEY1) { if(MenuePunkt) MenuePunkt--; else MenuePunkt = MaxMenue;} |
if(RemoteKeys & KEY2) { if(MenuePunkt == MaxMenue) MenuePunkt = 0; else MenuePunkt++;} |
if((RemoteKeys & KEY1) && (RemoteKeys & KEY2)) MenuePunkt = 0; |
LcdClear(); |
if(MenuePunkt < 10) {LCD_printfxy(17,0,"[%i]",MenuePunkt);} |
else {LCD_printfxy(16,0,"[%i]",MenuePunkt);}; |
switch(MenuePunkt) |
{ |
case 0: |
LCD_printfxy(0,0,"+ MikroKopter +"); |
LCD_printfxy(0,1,"HW:V%d.%d SW:%d.%d%c",PlatinenVersion/10,PlatinenVersion%10, VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH +'a'); |
LCD_printfxy(0,2,"Setting:%d %s",GetActiveParamSetNumber(),Mixer.Name); |
if(I2CTimeout < 6) LCD_printfxy(0,3,"I2C ERROR!!!") |
else |
if(MissingMotor) LCD_printfxy(0,3,"Missing BL-Ctrl:%d!!",MissingMotor) |
else LCD_printfxy(0,3,"(c) Holger Buss"); |
// if(RemoteTasten & KEY3) TestInt--; |
// if(RemoteTasten & KEY4) TestInt++; |
break; |
case 1: |
if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
LCD_printfxy(0,0,"Hoehe: %5i",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; |
case 14: |
LCD_printfxy( 0, 0, "PitchControl " ); |
LCD_printfxy( 0, 1, "Modus : %2s", pitchModeStrings[ pitch_currentMode() ] ); |
// MD-Modus |
switch( pitch_currentMode() ) { |
case PARAM_PITCH_MODE_MD: |
LCD_printfxy( 0, 2, "Standgas (%02d): %3i", PARAM_PITCH_HOVER_PERCENT, pitch_standValue() ); |
LCD_printfxy( 0, 3, "Schwebegas : %3i", pitch_hoverValue() ); |
break; |
} |
break; |
default: MaxMenue = MenuePunkt - 1; |
MenuePunkt = 0; |
break; |
} |
RemoteKeys = 0; |
} |
/branches/thjac/V1_13/menu.h |
---|
0,0 → 1,9 |
extern void Menu(void); |
extern void LcdClear(void); |
extern char DisplayBuff[80]; |
extern unsigned char DispPtr; |
extern unsigned char MaxMenue; |
extern unsigned char MenuePunkt; |
extern unsigned char RemoteKeys; |
/branches/thjac/V1_13/old_macros.h |
---|
0,0 → 1,47 |
/* |
For backwards compatibility only. |
Ingo Busker ingo@mikrocontroller.com |
*/ |
#ifndef cbi |
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) |
#endif |
#ifndef sbi |
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) |
#endif |
#ifndef inb |
#define inb(sfr) _SFR_BYTE(sfr) |
#endif |
#ifndef outb |
#define outb(sfr, val) (_SFR_BYTE(sfr) = (val)) |
#endif |
#ifndef inw |
#define inw(sfr) _SFR_WORD(sfr) |
#endif |
#ifndef outw |
#define outw(sfr, val) (_SFR_WORD(sfr) = (val)) |
#endif |
#ifndef outp |
#define outp(val, sfr) outb(sfr, val) |
#endif |
#ifndef inp |
#define inp(sfr) inb(sfr) |
#endif |
#ifndef BV |
#define BV(bit) _BV(bit) |
#endif |
#ifndef PRG_RDB |
#define PRG_RDB pgm_read_byte |
#endif |
/branches/thjac/V1_13/parameter.h |
---|
0,0 → 1,107 |
/* parameter.h |
*/ |
#ifndef PARAMETER_H |
#define PARAMETER_H |
#define PARAM_TIMER_1S 50 // 1 Sekunde |
#define PARAM_TIMER_2S 100 // 2 Sekunden |
#define PITCH_NEUTRAL_TIMER 25 |
#define PITCH_MIN2_TIMER 100 |
#define PARAM_ALT_P Parameter_Hoehe_P |
#define PARAM_ALT_D Parameter_Luftdruck_D |
#define PARAM_ALT_ACC Parameter_Hoehe_ACC_Wirkung |
#define PARAM_ALT_GAIN Parameter_UserParam3 |
#define PARAM_ALT_MAX Parameter_UserParam4 |
/****************************************************************************************** |
* Allgemeine Pitch-Steuerungsparameter |
*/ |
#define PARAM_PITCH_STICK_THRESHOLD 4 |
#define PARAM_PITCH_HOVER_PERCENT Parameter_UserParam2 |
/****************************************************************************************** |
* Parameter für MD-Pitch-Steuerung |
*/ |
#define PARAM_PITCH_MD_DELAY0 2 // Begrenzung der Pitch-Beschleunigung am Boden |
#define PARAM_PITCH_MD_DELAY1 10 // Begrenzung der Pitch-Beschleunigung nach Start |
#define PARAM_PITCH_MD_DELAY2 20 // Begrenzung der Pitch-Beschleunigung im Flug |
#define PARAM_PITCH_MD_DELAY_AUTOSTART 5 // Begrenzung der Pitch-Beschleunigung bei Autostart |
#define PARAM_PITCH_AUTOSTART_ALT EE_Parameter.MaxHoehe // Sollhöhe in 1/20m |
#define PARAM_PITCH_AUTOSTART_DELAY 10 // Steiggeschwindigkeit |
/****************************************************************************************** |
* Parameter für LED-Ansteuerung |
*/ |
/* Helligkeit J16 |
*/ |
#define PARAM_LED_BRIGHTNESS_J16 ( Parameter_UserParam5 ) // 0-250, 25x=PotiX, Wert wird durch 23 geteilt |
/* Helligkeit J17 |
*/ |
#define PARAM_LED_BRIGHTNESS_J17 ( Parameter_UserParam6 ) // 0-250, 25x=PotiX, Wert wird durch 23 geteilt |
/* Die Ausgänge J16/J17 lassen sich wahlweise bei stehenden Motoren üner den Gierstick schalten. |
*/ |
#define PARAM_LED_STICK_ENABLED ( Parameter_UserParam7 & 0x01 ) // 0=deaktiviert 1=aktiviert, wird durch Motorkopplung übersteuert |
/* Die Ausgänge J16/J17 lassen sich wahlweise über die Motoren koppeln, so daß |
* die Ausgänge bei ausgeschalteten Motoren unabhängig vom eingestellten Blink-Muster |
* deaktiviert sind. |
*/ |
#define PARAM_LED_ENGINE_ENABLED ( Parameter_UserParam7 & 0x02 ) // 0=deaktiviert 1=an Motoren gekoppelt |
/* Wenn die Unterspannungswarnung aktiv wird, kann mit diesem Parameter eingestellt |
* werden, daß sich die Blinkfrequenz der LED's verdoppelt. |
*/ |
#define PARAM_LED_WARNING_SPEEDUP ( Parameter_UserParam7 & 0x04 ) // 0=deaktiviert >0=Blinkenbeschleunigung |
/* Erzwingt die Aktivierung der LED-Ausgänge im Fall einer |
* Unterspannungswarnung. |
*/ |
#define PARAM_LED_FORCE_WARNING_ENABLED ( Parameter_UserParam7 & 0x08 ) // 0=deaktiviert 1=aktiviert |
/* Wenn gesetzt, wird der Pegel des Ausgangs J16 vertauscht. |
*/ |
#define PARAM_LED_NEGATE_J16 ( Parameter_UserParam7 & 0x10 ) // 0=normal 1=invertiert |
#define LED_NEGATE_J16 ( PARAM_LED_NEGATE_J16 >> 3 ) |
/* Wenn gesetzt, wird der Pegel des Ausgangs J17 vertauscht. |
*/ |
#define PARAM_LED_NEGATE_J17 ( Parameter_UserParam7 & 0x20 ) // 0=normal 1=invertiert |
#define LED_NEGATE_J17 ( PARAM_LED_NEGATE_J17 >> 4 ) |
/****************************************************************************************** |
* Konfiguration |
*/ |
/* Die Motoren können über diesen Parameter deaktiviert werden. Ein Wert von 1 |
* deaktiviert die Motoren und kann zum Testen verwendet werden. |
*/ |
#define PARAM_ENGINE_ENABLED ( !( EE_Parameter.UserParam1 & 0x01 ) ) // 1=deaktiviert 0=aktiviert |
/* Dieser Parameter legt fest, ob in '+'-Formation (normal) oder 'X'-Formation |
* geflogen werden soll. Zur Umschaltung reicht das Setzen des Parameters. Ein |
* Umbau der FC oder Einstellungen am Sender sind nicht notwendig. |
*/ |
#define PARAM_X_FORMATION ( EE_Parameter.UserParam8 & 0x01 ) // 0=+, 1=X |
/* Steuert, ob beim bzw. vor dem Start der Motoren eine Kalibrierung erfolgen |
* soll. |
*/ |
#define PARAM_CAL_ON_START ( EE_Parameter.UserParam8 & 0x02 ) // 0=deaktiviert 1=aktiviert |
/* Erlaubt das erstmalige Aktivieren der Höhenregelung nach Start ohne Schnippenlassen des Sticks. |
*/ |
#define PARAM_PITCH_SOFT_ACTIVATING ( EE_Parameter.UserParam8 & 0x04 ) |
#endif // PARAMETER_H |
/branches/thjac/V1_13/pitch.c |
---|
0,0 → 1,108 |
/* pitch.c |
* |
* Copyright 2009 Thomas Jachmann |
* |
* Pitch-Steuerung |
*/ |
#include "main.h" |
#include "parameter.h" |
#include "pitch_md.h" |
#include "pitch.h" |
#define UNDEFINED 255 |
int pitchInitialStickValue = UNDEFINED; |
unsigned char pitchMode = PARAM_PITCH_MODE_MK; |
char *pitchModeStrings[] = { |
"MK", |
"MD", |
"??" |
}; |
// Prototypen |
int pitch_mk_value( void ); |
/* |
* Führt die Initialisierung der Pitch-Steuerung durch. Diese Funktion |
* wird nach jeder Setting-Auswahl sowie nach jeder Setting-Änderung |
* aufgerufen. |
*/ |
void pitch_init( void ) { |
// Der Schalter Höhenregelung bestimmt den Pitch-Modus |
if( EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG ) { |
pitchMode = PARAM_PITCH_MODE_MD; |
} else { |
pitchMode = PARAM_PITCH_MODE_MK; |
} |
// Nur beim Einschalten ermitteln, da beim Setting-Wechsel ungültig |
if( pitchInitialStickValue == UNDEFINED ) { |
// Warten, bis ein gültiger Wert von der Fernsteuerung anliegt |
unsigned int timer = SetDelay( 500 ); |
while( !CheckDelay( timer ) ); |
pitchInitialStickValue = PPM_in[ EE_Parameter.Kanalbelegung[ K_GAS ] ]; |
} |
/* Die Stick-Position beim Einschalten muß mit dem im Setting eingestellten |
* Pitch-Modus übereinstimmen. Sonst wird die Pitch-Steuerung aus Sicherheits- |
* gründen deaktiviert. Selbiges gilt, wenn die Höhenregelung deaktiviert wurde. |
*/ |
switch( pitchMode ) { |
// Pitch-Modus mit 0-Gas |
case PARAM_PITCH_MODE_MK: |
if( pitchInitialStickValue > 35 - 120 ) { |
pitchMode = PARAM_PITCH_MODE_INVALID; |
} |
break; |
// Pitch-Modus mit neutralisiertem Gas und Standgas |
case PARAM_PITCH_MODE_MD: |
if( abs( pitchInitialStickValue ) > PARAM_PITCH_STICK_THRESHOLD ) { |
pitchMode = PARAM_PITCH_MODE_INVALID; |
} else { |
pitch_md_init(); |
} |
break; |
} |
} |
int pitch_value( void ) { |
switch( pitchMode ) { |
// Pitch-Modus mit 0-Gas |
case PARAM_PITCH_MODE_MK: |
return pitch_mk_value(); |
// Pitch-Modus mit neutralisiertem Gas und Standgas |
case PARAM_PITCH_MODE_MD: |
return pitch_md_value(); |
default: |
return 0; |
} |
} |
/* |
* Führt eine Pitch-Berechnung aus, die der Original-SW entspricht. |
*/ |
int pitch_mk_value( void ) { |
register int stickValue = PPM_in[ EE_Parameter.Kanalbelegung[ K_GAS ] ]; |
register int pitchCount = stickValue + 120; |
DebugOut.Analog[26] = stickValue; |
return pitchCount; |
} |
/branches/thjac/V1_13/pitch.h |
---|
0,0 → 1,25 |
/* pitch.h |
* |
* copyright 2009 Thoams Jachmann |
*/ |
#ifndef _PITCH_H |
#define _PITCH_H |
#define PARAM_PITCH_MODE_MK 0x00 |
#define PARAM_PITCH_MODE_MD 0x01 |
#define PARAM_PITCH_MODE_INVALID 0x02 |
#define pitch_initialStickValue() pitchInitialStickValue |
#define pitch_currentMode() ( pitchMode ) |
#define pitch_currentModeString() ( pitchModeStrings[ pitchMode ] ) |
extern void pitch_init( void ); |
extern int pitch_value( void ); |
extern int pitchInitialStickValue; |
extern unsigned char pitchMode; |
extern char *pitchModeStrings[]; |
#endif // PITCH_H |
/branches/thjac/V1_13/pitch_md.c |
---|
0,0 → 1,581 |
/* pitch_md.c |
* |
* Copyright 2009 Thomas Jachmann |
* |
* Die in dieser Quelldatei enthaltenen Algorithmen ermöglichen eine MD-ähnliche Pitch-Steuerung |
* für den MK. |
*/ |
#include "main.h" |
#include "parameter.h" |
#include "fc.h" |
#include "pitch.h" |
#include "altcon.h" |
#define STATE_INITIALIZE 0x01 // Anfangszustand nach Einschalten der Motoren |
#define STATE_SETUP 0x02 // Ermittlung von PARAM_PITCH_MD_HOVER |
#define STATE_SETUP_HOVER 0x03 // Konfiguration pitchHover |
#define STATE_SETUP_STICK_DELTA 0x04 // Konfiguration pitchNeutralDiff |
#define STATE_SETUP_STICK_DELTA1 0x05 |
#define STATE_BEGIN 0x06 // Anfangszustand für Flugbetrieb |
#define STATE_BEGIN1 0x07 // Anfangszustand für Flugbetrieb |
#define STATE_READY0 0x08 // Manuelle Kontrolle |
#define STATE_READY 0x09 // Manuelle Kontrolle |
#define STATE_READY1 0x0a |
#define STATE_WAIT 0x0b // Warten auf Einschalten der Höhenregelung |
#define STATE_ACTIVATING 0x0c // Aktivierung der Höhenregelung |
#define STATE_ACTIVE 0x0d // Höhenregelung ist aktiv |
#define STATE_RESTART 0x0e // Neustart |
#define STATE_AUTOSTART0 0x0f // Autostartsequenz 0 |
#define STATE_AUTOSTART1 0x10 // Autostartsequenz 1 |
static int lastStickValue = 0; // Vorheriger Stick-Wert |
static int actualPitchCount = 0; // Soll-Pitch-Wert |
static int targetPitchCount = 0; // Ist-Pitch-Wert |
static int pitchOffset; // Aktueller Grundgaswert in Neutralstellung |
static char state; // Zustand |
static int timer; |
static int delay = 0; |
static int delayCounter = 0; |
static int peakPitchCount; |
unsigned char pitchHover = 0; // Schwebegaswert |
unsigned char pitchStand = 0; // Standgaswert |
unsigned char pitchNeutralDiff = 0; |
void pitch_md_init( void ) { |
pitchHover = eeprom_read_byte( &EEPromArray[ EEPROM_ADR_PITCH_MD_HOVER ] ); |
pitchStand = pitchHover * PARAM_PITCH_HOVER_PERCENT / 100; |
pitchNeutralDiff = eeprom_read_byte( &EEPromArray[ EEPROM_ADR_PITCH_NEUTRAL_DIFF ] ); |
} |
/* |
* Berechnet den aktuellen Pitch-Wert für die Regelung |
* |
* Funktionsweise: |
* |
* 1. Einmalig muß man das Schwebegas einstellen. Schwebegas ist ein neuer Parameter. |
* Dies tut man durch Betätigen des Roll-Sticks nach links (Vollausschlag) und |
* Starten der Motoren. Nun gibt man soviel Gas (in der oberen Hälfte des Stick-Bereichs), bis der MK |
* kurz über dem Boden schwebt (im Bodeneffekt). Man hält diese Stick-Position solange, bis ein |
* Signal ertönt (ca. 1 Sekunde). Das Signal ist die Bestätigung für die Übernahme des aktuellen Gaswertes |
* als Schwebegas. Der Wert wird dauerhaft gespeichert und kann im LCD-Display des MK-Tool im letzten Bild |
* überprüft werden. Diese Kalibrierung muß mit vollem Akku und nach jeder Gewichtsänderung des MK einmal |
* durchgeführt werden. |
* |
* 2. Für den Flug startet man die Motoren und läßt den Stick los. Die Motoren laufen im Leerlaufgas. |
* |
* 3. Man kann nun entweder mit oder ohne Unterstützung der Höhenregelung fliegen. |
* |
* Mit Unterstützung geht man wie folgt vor: |
* |
* Die Startsequenz wird durch Betätigung des Gasknüppels nach oben eingeleitet, bis ein akustisches Signal ertönt. |
* Hierbei drehen die Motoren noch im Leerlauf. Erst nach Rückstellung des Sticks in die Mittelposition beschleunigen |
* die Motoren langsam bis zum unter Punkt 1 eingestellten Schwebegas. Nun schaltet automatisch die Höhenregelung zu |
* und der MK steigt bis auf eine im UserParameter eingestellte Höhe (normalerweise 1 Meter). In Mittelstellung ist |
* nun die Höhenregelung aktiv, im oberen und unteren Stick-Bereich steigt oder sinkt der MK. |
* |
* Ohne Unterstützung geht man wie folgt vor: |
* |
* Man schaltet die Motoren durch Betätigung des Gasknüppels nach oben in das Standgas. Hier reicht ein kurzes Antippen |
* des Sticks. Als Standgas wird 70% des unter Punkt 1 eingestellten Schwebegaswertes angenommen. Nun kann man |
* manuell gesteuert durch Ausnutzung nur der oberen Hälfte des Stick-Bereichs fliegen. Dies entspricht der herkömmlichen |
* Steuerung. Da nur der halbe Stick-Weg zur Verfügung steht, ist der Stick-Weg um die Mittelstellung herum höher aufgelöst. |
* So kann das Gas trotzdem einigermaßen fein gesteuert werden. |
* |
* 4. Nach der Landung drückt man den Stick ganz nach unten, bis ein Signal ertönt. Jetzt laufen die Motoren |
* wieder im Leerlaufgas. Man kann nun neu Starten (ab Punkt 3) oder die Motoren ausschalten. |
*/ |
int pitch_md_value( void ) { |
int register rawStickValue = PPM_in[ EE_Parameter.Kanalbelegung[ K_GAS ] ] - pitch_initialStickValue(); |
int register stickValue; |
// Sind die Motoren eingeschaltet? |
if( MotorenEin ) { |
/* StickValue exponentiell angleichen, da ausgehend von der Neutralstellung |
* nur jeweils die halbe Auflösung nach oben und unten zur Verfügung steht. Bei einer |
* Multiplikation mit 2 ließe sich das Gas im Schwebebereich nicht fein genug einstellen. */ |
if( rawStickValue > 0 ) { |
stickValue = rawStickValue + ( ( (long) rawStickValue * (long) rawStickValue ) / 150L ); |
} else { |
stickValue = rawStickValue - ( ( (long) rawStickValue * (long) rawStickValue ) / 150L ); |
} |
/* Aktuellen Pitch-Wert berechnen. Der Wert ergibt sich aus dem Pitch-Offset |
* zuzüglich dem Stick-Wert. Die folgenden Bedingungen erzeugen einen toten Bereich |
* um die Mittelstellung herum, in dem sich targetPitchCount nicht ändert. So wird |
* ein sanfterer Übergang vom höhengeregelten in den manuell gesteuerten Flug erreicht. |
*/ |
if( stickValue > PARAM_PITCH_STICK_THRESHOLD ) |
targetPitchCount = stickValue - PARAM_PITCH_STICK_THRESHOLD + pitchOffset; |
else if( stickValue < -PARAM_PITCH_STICK_THRESHOLD ) |
targetPitchCount = stickValue + PARAM_PITCH_STICK_THRESHOLD + pitchOffset; |
else |
targetPitchCount = pitchOffset; |
switch( state ) { |
/* Entscheidet über Flugbetrieb oder Setup-Betrieb. Für den Setup-Betrieb |
* muß beim Einschalten der Motoren gleichzeitig der Roll-Stick ganz |
* betätigt werden. Es gilt: |
* |
* Roll-Stick links: Einstellen des Gas-Stick-Deltas |
* Roll-Stick rechts: Einstellen des Schwebegases |
*/ |
case STATE_INITIALIZE: |
if( PPM_in[ EE_Parameter.Kanalbelegung[ K_ROLL ] ] > 70 ) { |
state = STATE_SETUP_HOVER; |
// Signalisieren |
beeptime = 500; |
} else if( PPM_in[ EE_Parameter.Kanalbelegung[ K_ROLL ] ] < -70 ) { |
state = STATE_SETUP_STICK_DELTA; |
// Signalisieren |
beeptime = 500; |
} else { |
state = STATE_RESTART; |
} |
break; |
/* Erlaubt die Ermittlung des Parameters pitchHover. Hierzu wird soviel Gas |
* gegeben, bis der MK kurz vor dem Abheben ist, jedoch noch stabil steht. Um den |
* Gaswert dauerhaft zu speichern, muß der Stick an der Position verweilen, bis |
* der Summer die Übernahme akustisch quittiert. Dann müssen die Motoren wieder |
* ausgeschaltet werden, da dieser Modus nicht für den Flug vorgesehen ist. |
*/ |
case STATE_SETUP_HOVER: |
// Im Setup-Modus soll das Gas spontan reagieren |
actualPitchCount = targetPitchCount; |
if( rawStickValue < 10 || abs( stickValue - lastStickValue ) > 1 ) { |
timer = PARAM_TIMER_1S; |
} |
/* Der Stick befindet sich eindeutig in der oberen Hälfte und wurde |
* seit dem letzten Zyklus nicht bewegt. */ |
else { |
timer--; |
/* Die Verweilzeit ist abgelaufen und der aktuelle Pitch-Wert |
* entspricht nicht dem bereits gespeicherten Wert. */ |
if( !timer && ( pitchHover != actualPitchCount ) ) { |
// Aktuellen Pitch-Wert in Konfiguration übernehmen |
pitchHover = actualPitchCount; |
// Konfiguration dauerhaft speichern |
eeprom_write_byte( &EEPromArray[ EEPROM_ADR_PITCH_MD_HOVER ], pitchHover ); |
// Signalisieren |
beeptime = 500; |
} |
} |
break; |
/* Der Stick-Deltawert kann hier konfiguriert werden. Ein Betätigen des Roll-Sticks nach links |
* erhöht den Deltawert um 1, ein Betätigen nach rechts veringert den Wert um 1. Der eingestellte |
* Wert kann mit dem Gas-Stick getestet werden, indem dieser in den oberen Bereich bewegt und dann |
* losgelassen wird. Ertönt dabei ein Signal, wurde die Bewegung erkannt. Es ist dann der richtige |
* Wert gefunden, wenn das Signal beim Loslassen des Gas-Sticks ertönt, beim gesteuerten Bewegen nach |
* unten jedoch nicht. Durch Ausschalten der Motoren (diese laufen während der Konfiguration nicht |
* wirklich) wird der Konfigurationsmodus beendet. |
*/ |
case STATE_SETUP_STICK_DELTA: |
if( stickValue < PARAM_PITCH_STICK_THRESHOLD && |
abs( PPM_in[ EE_Parameter.Kanalbelegung[ K_ROLL ] ] ) < PARAM_PITCH_STICK_THRESHOLD ) { |
state = STATE_SETUP_STICK_DELTA1; |
} |
// Im Setup immer mit Leerlaufgas |
targetPitchCount = 0; |
break; |
case STATE_SETUP_STICK_DELTA1: |
// Roll-Stick nach links erhöht den Deltawert |
if( PPM_in[ EE_Parameter.Kanalbelegung[ K_ROLL ] ] < -20 ) { |
if( pitchNeutralDiff < 20 ) { |
pitchNeutralDiff++; |
// Konfiguration dauerhaft speichern |
eeprom_write_byte( &EEPromArray[ EEPROM_ADR_PITCH_NEUTRAL_DIFF ], pitchNeutralDiff ); |
// Signalisieren |
beeptime = 500; |
state = STATE_SETUP_STICK_DELTA; |
} |
} |
// Roll-Stick nach rechts verringert den Deltawert |
if( PPM_in[ EE_Parameter.Kanalbelegung[ K_ROLL ] ] > 20 ) { |
if( pitchNeutralDiff > 0 ) { |
pitchNeutralDiff--; |
// Konfiguration dauerhaft speichern |
eeprom_write_byte( &EEPromArray[ EEPROM_ADR_PITCH_NEUTRAL_DIFF ], pitchNeutralDiff ); |
// Signalisieren |
beeptime = 500; |
state = STATE_SETUP_STICK_DELTA; |
} |
} |
if( ( lastStickValue > PARAM_PITCH_STICK_THRESHOLD ) && |
( lastStickValue - stickValue >= pitchNeutralDiff ) ) { |
state = STATE_SETUP_STICK_DELTA; |
// Signalisieren |
beeptime = 500; |
} |
// Im Setup immer mit Leerlaufgas |
targetPitchCount = 0; |
break; |
/* In diesem Zustand steht der MK am Boden und die Motoren laufen auf Leerlaufgas. Ein |
* kurzes Auslenken des Sticks nach oben schaltet in das Standgas über. |
*/ |
case STATE_BEGIN: |
// Stick ist oberhalb der Neutralstellung |
if( rawStickValue > PARAM_PITCH_STICK_THRESHOLD ) { |
pitchOffset = pitchStand; |
// Vollausschlag bedeutet: Einleitung der Autostartsequenz |
if( rawStickValue > 80 ) { |
state = STATE_AUTOSTART0; |
// Signalisieren |
beeptime = 500; |
} |
/* In diesem Zustand darf Standgas nicht überschritten werden, damit |
* der MK nicht aus diesem Status heraus abhebt. |
*/ |
if( targetPitchCount > pitchStand ) { |
targetPitchCount = pitchStand; |
} |
// Erst im Status weitergehen, wenn Stick nicht mehr oberhalb der Neutralstellung |
} else if( pitchOffset == pitchStand ) { |
state = STATE_BEGIN1; |
} |
break; |
// MK soll erst abheben, weil sonst die Höhenregelung am Boden schon greift |
case STATE_BEGIN1: |
// Jetzt kann abgehoben werden |
if( rawStickValue > PARAM_PITCH_STICK_THRESHOLD ) { |
// Begrenzung der Pitch-Beschleunigung nach dem Start |
delay = PARAM_PITCH_MD_DELAY1; |
state = STATE_READY0; |
// Knüppel unterhalb der Neutralstellung bewirkt einen sofortigen Neustart |
} else if( rawStickValue < -PARAM_PITCH_STICK_THRESHOLD ) { |
state = STATE_RESTART; |
} |
break; |
/* Automatischer Start: Warten, bis Standgas erreicht ist, dann auf Schwebegas gehen und |
* die Sollhöhe setzen. |
*/ |
case STATE_AUTOSTART0: |
// Standgas darf in diesem Zustand nicht überschritten werden |
if( targetPitchCount > pitchStand ) { |
targetPitchCount = pitchStand; |
} |
if( rawStickValue < PARAM_PITCH_STICK_THRESHOLD ) { |
// Knüppel unterhalb der Neutralstellung bewirkt einen sofortigen Neustart |
if( rawStickValue < -PARAM_PITCH_STICK_THRESHOLD ) { |
state = STATE_RESTART; |
} |
// Standgas muß erreicht sein, bevor die Startsequenz weiterläuft |
if( targetPitchCount >= pitchStand ) { |
// Jetzt auf Schwebegas übergehen (etwas mehr als eingestellt) |
pitchOffset = pitchHover; |
delay = PARAM_PITCH_MD_DELAY_AUTOSTART; |
// Einstellen der zu erreichenden Flughöhe über Grund |
altcon_lock(); |
altcon_inc( PARAM_PITCH_AUTOSTART_ALT ); |
altcon_start(); |
state = STATE_AUTOSTART1; |
} |
} |
// Begrenzung der Pitch-Beschleunigung beim Autostart |
delay = PARAM_PITCH_MD_DELAY_AUTOSTART; |
break; |
/* Wenn das Schwebegas erreicht wurde, kann davon ausgegangen werden, daß der MK |
* nicht mehr am Boden steht. |
*/ |
case STATE_AUTOSTART1: |
if( targetPitchCount >= pitchHover ) { |
delay = PARAM_PITCH_MD_DELAY2; |
state = STATE_ACTIVATING; |
// Signalisieren |
beeptime = 500; |
} |
// Eine Bewegung des Gasknüppels bricht die Autostartsequenz ab |
if( abs( rawStickValue ) > PARAM_PITCH_STICK_THRESHOLD ) { |
// Höhenregler deaktivieren |
altcon_stop(); |
pitchOffset -= altcon_avgerror() / 4; |
targetPitchCount = pitchOffset; |
state = STATE_READY; |
} |
break; |
/* Die Motoren laufen jetzt mindestens mit Standgas. Der MK ist bereit zum Abheben. |
*/ |
case STATE_READY0: |
/* Wenn der Gashebel ganz unten steht, Timer für Restart der Pitch-Regelung |
* starten. Hierfür wird die Variable pitchNeutralTimer verwendet. */ |
if( PPM_in[ EE_Parameter.Kanalbelegung[ K_GAS ] ] > 35 - 120 ) { |
timer = PITCH_MIN2_TIMER; |
} else { |
timer--; |
/* Gashebel steht seit PITCH_MIN2_TIMER ganz unten; jetzt erfolgt die Initialisierung. */ |
if( !timer ) { |
state = STATE_RESTART; |
} |
} |
/* Übergang in den höhengeregelten Flug durch: |
* 1. Schnelles Bewegen des Sticks in Richtung Mittelstellung |
* oder |
* 2. langsames Bewegen des Sticks in Mittelstellung */ |
if( ( ( lastStickValue > PARAM_PITCH_STICK_THRESHOLD ) && |
( lastStickValue - stickValue >= pitchNeutralDiff ) ) || |
( ( lastStickValue < PARAM_PITCH_STICK_THRESHOLD ) && |
PARAM_PITCH_SOFT_ACTIVATING ) ) { |
// Aktuelle Höhe festhalten (aktiviert noch nicht den Regler) |
altcon_lock(); |
// Höhe vorübergehend merken und beibehalten |
peakPitchCount = lastStickValue; |
state = STATE_READY1; |
timer = PITCH_NEUTRAL_TIMER; |
delay = PARAM_PITCH_MD_DELAY2; |
} |
break; |
case STATE_READY: |
/* Wenn der Gashebel ganz unten steht, Timer für Restart der Pitch-Regelung |
* starten. Hierfür wird die Variable pitchNeutralTimer verwendet. */ |
if( PPM_in[ EE_Parameter.Kanalbelegung[ K_GAS ] ] > 35 - 120 ) { |
timer = PITCH_MIN2_TIMER; |
} else { |
timer--; |
/* Gashebel steht seit PITCH_MIN2_TIMER ganz unten; jetzt erfolgt die Initialisierung. */ |
if( !timer ) { |
state = STATE_RESTART; |
} |
} |
// Stick ist innerhalb der Neutralstellung |
if( abs( rawStickValue ) < PARAM_PITCH_STICK_THRESHOLD ) { |
// Aktuelle Höhe festhalten (aktiviert noch nicht den Regler) |
altcon_lock(); |
// Timer neu setzen |
timer = PITCH_NEUTRAL_TIMER; |
state = STATE_WAIT; |
} |
break; |
/* Hier wird die Zeit gemessen, in der der Stick nach dem Loslassen |
* bis zur Neutralstellung benötigt. Bei Überschreiten der Zeit |
* wird die Höhenregelung nicht aktiviert. |
*/ |
case STATE_READY1: |
// Gas wird konstant gehalten |
targetPitchCount = peakPitchCount + pitchOffset; |
timer--; |
/* Läuft der Timer ab, bevor der Stick die Neutralstellung erreicht, |
* wird die Aktion nicht als "schnelles Bewegen in Neutralstellung" |
* gedeutet. */ |
if( !timer ) { |
state = STATE_READY0; |
} |
// Ist die Neutralstellung erreicht? |
if( rawStickValue < PARAM_PITCH_STICK_THRESHOLD ) { |
pitchOffset = targetPitchCount; |
// Aktivierung des Höhenreglers mit der zuvor gemerkten Sollhöhe |
altcon_start(); |
// Signalisieren |
beeptime = 500; |
state = STATE_ACTIVE; |
} |
break; |
/* Der Stick ist in den für die Neutralstellung gültigen Wertebereich |
* gelangt. Nun darf innerhalb einer bestimmten Zeit keine Stick-Bewegung |
* erfolgen, um die automatische Höhenregelung zu aktivieren. */ |
case STATE_WAIT: |
/* Stick ist innerhalb der Neutralstellung und |
Stick-Differenzial ist < 2 */ |
if( abs( rawStickValue ) < PARAM_PITCH_STICK_THRESHOLD && |
abs( stickValue - lastStickValue ) < 2 ) { |
timer--; |
if( !timer ) { |
state = STATE_ACTIVATING; |
} |
// Aktivierungskriterium nicht erfüllt, zurück in INACTIVE |
} else { |
state = STATE_READY; |
} |
break; |
/* Die automatische Höhenregelung wird jetzt aktiviert. |
*/ |
case STATE_ACTIVATING: |
/* Nach Aktivierung der Höhenregelung soll sich der Gaswert nicht mehr |
* ändern. */ |
actualPitchCount = targetPitchCount; |
pitchOffset = targetPitchCount; |
// Aktivierung des Höhenreglers mit der zuvor gemerkten Sollhöhe |
altcon_start(); |
// Einschalten der Höhenregelung signalisieren |
beeptime = 500; |
state = STATE_ACTIVE; |
break; |
/* Die automatische Höhenregelung ist aktiv. */ |
case STATE_ACTIVE: |
targetPitchCount = pitchOffset; |
// Stick ist außerhalb der Neutralstellung |
if( abs( rawStickValue ) > PARAM_PITCH_STICK_THRESHOLD ) { |
// Höhenregler deaktivieren |
altcon_stop(); |
// Ausschalten der Höhenregelung signalisieren |
beeptime = 500; |
pitchOffset -= altcon_avgerror() / 4; |
targetPitchCount = pitchOffset; |
state = STATE_READY; |
} |
break; |
/* Neustart nach dem Flug oder vor Start. */ |
case STATE_RESTART: |
// Begrenzung der Pitch-Beschleunigung am Boden |
delay = PARAM_PITCH_MD_DELAY0; |
pitchOffset = 0; |
targetPitchCount = 0; |
// Folgezustand |
state = STATE_BEGIN; |
break; |
} |
// Motoren sind aus |
} else { |
/* Nach dem Einschalten der Motoren wird pitchOffset auf PARAM_PITCH_OVER gesetzt. |
*/ |
actualPitchCount = 0; |
targetPitchCount = 0; |
pitchOffset = 0; |
stickValue = 0; |
state = STATE_INITIALIZE; |
} |
/* Durch die Sollwertvorgabe kann hier eine einstellbare Trägheit auf dem Pitch-Wert |
* abgebildet werden. */ |
int pitchDelta = targetPitchCount - actualPitchCount; |
if( pitchDelta > delay ) |
pitchDelta = delay; |
if( pitchDelta < -delay ) |
pitchDelta = -delay; |
if( !delayCounter ) { |
actualPitchCount += pitchDelta; |
delayCounter = 5; |
} |
delayCounter--; |
if( actualPitchCount < 0 ) |
actualPitchCount = 0; |
// Vorigen Stick-Wert merken |
lastStickValue = stickValue; |
DebugOut.Analog[25] = pitchOffset; |
DebugOut.Analog[26] = stickValue; |
return actualPitchCount; |
} |
/branches/thjac/V1_13/pitch_md.h |
---|
0,0 → 1,20 |
/* pitch_md.h |
* |
* Copyright 2009 Thoams Jachmann |
*/ |
#ifndef PITCH_MD_H |
#define PITCH_MD_H |
#define pitch_standValue() pitchStand |
#define pitch_hoverValue() pitchHover |
#define pitch_neutralDiffMD() pitchNeutralDiff |
extern void pitch_md_init( void ); |
extern int pitch_md_value( void ); |
extern char pitchStand; |
extern char pitchHover; |
extern char pitchNeutralDiff; |
#endif // PITCH_MD_H |
/branches/thjac/V1_13/printf_P.c |
---|
0,0 → 1,480 |
// Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist nicht von der Lizenz für den MikroKopter-Teil unterstellt |
/* |
Copyright (C) 1993 Free Software Foundation |
This file is part of the GNU IO Library. This library is free |
software; you can redistribute it and/or modify it under the |
terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) |
any later version. |
This library is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this library; see the file COPYING. If not, write to the Free |
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
As a special exception, if you link this library with files |
compiled with a GNU compiler to produce an executable, this does not cause |
the resulting executable to be covered by the GNU General Public License. |
This exception does not however invalidate any other reasons why |
the executable file might be covered by the GNU General Public License. */ |
/* |
* Copyright (c) 1990 Regents of the University of California. |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. [rescinded 22 July 1999] |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
/****************************************************************************** |
This file is a patched version of printf called _printf_P |
It is made to work with avr-gcc for Atmel AVR MCUs. |
There are some differences from standard printf: |
1. There is no floating point support (with fp the code is about 8K!) |
2. Return type is void |
3. Format string must be in program memory (by using macro printf this is |
done automaticaly) |
4. %n is not implemented (just remove the comment around it if you need it) |
5. If LIGHTPRINTF is defined, the code is about 550 bytes smaller and the |
folowing specifiers are disabled : |
space # * . - + p s o O |
6. A function void uart_sendchar(char c) is used for output. The UART must |
be initialized before using printf. |
Alexander Popov |
sasho@vip.orbitel.bg |
******************************************************************************/ |
/* |
* Actual printf innards. |
* |
* This code is large and complicated... |
*/ |
#include <string.h> |
#ifdef __STDC__ |
#include <stdarg.h> |
#else |
#include <varargs.h> |
#endif |
#include "main.h" |
//#define LIGHTPRINTF |
char PrintZiel; |
char Putchar(char zeichen) |
{ |
if(PrintZiel == OUT_LCD) { DisplayBuff[DispPtr++] = zeichen; return(1);} |
else return(uart_putchar(zeichen)); |
} |
void PRINT(const char * ptr, unsigned int len) |
{ |
for(;len;len--) Putchar(*ptr++); |
} |
void PRINTP(const char * ptr, unsigned int len) |
{ |
for(;len;len--) Putchar(pgm_read_byte(ptr++)); |
} |
void PAD_SP(signed char howmany) |
{ |
for(;howmany>0;howmany--) Putchar(' '); |
} |
void PAD_0(signed char howmany) |
{ |
for(;howmany>0;howmany--) Putchar('0'); |
} |
#define BUF 40 |
/* |
* Macros for converting digits to letters and vice versa |
*/ |
#define to_digit(c) ((c) - '0') |
#define is_digit(c) ((c)<='9' && (c)>='0') |
#define to_char(n) ((n) + '0') |
/* |
* Flags used during conversion. |
*/ |
#define LONGINT 0x01 /* long integer */ |
#define LONGDBL 0x02 /* long double; unimplemented */ |
#define SHORTINT 0x04 /* short integer */ |
#define ALT 0x08 /* alternate form */ |
#define LADJUST 0x10 /* left adjustment */ |
#define ZEROPAD 0x20 /* zero (as opposed to blank) pad */ |
#define HEXPREFIX 0x40 /* add 0x or 0X prefix */ |
void _printf_P (char ziel,char const *fmt0, ...) /* Works with string from FLASH */ |
{ |
va_list ap; |
register const char *fmt; /* format string */ |
register char ch; /* character from fmt */ |
register int n; /* handy integer (short term usage) */ |
register char *cp; /* handy char pointer (short term usage) */ |
const char *fmark; /* for remembering a place in fmt */ |
register unsigned char flags; /* flags as above */ |
signed char width; /* width from format (%8d), or 0 */ |
signed char prec; /* precision from format (%.3d), or -1 */ |
char sign; /* sign prefix (' ', '+', '-', or \0) */ |
unsigned long _ulong=0; /* integer arguments %[diouxX] */ |
#define OCT 8 |
#define DEC 10 |
#define HEX 16 |
unsigned char base; /* base for [diouxX] conversion */ |
signed char dprec; /* a copy of prec if [diouxX], 0 otherwise */ |
signed char dpad; /* extra 0 padding needed for integers */ |
signed char fieldsz; /* field size expanded by sign, dpad etc */ |
/* The initialization of 'size' is to suppress a warning that |
'size' might be used unitialized. It seems gcc can't |
quite grok this spaghetti code ... */ |
signed char size = 0; /* size of converted field or string */ |
char buf[BUF]; /* space for %c, %[diouxX], %[eEfgG] */ |
char ox[2]; /* space for 0x hex-prefix */ |
PrintZiel = ziel; // bestimmt, LCD oder UART |
va_start(ap, fmt0); |
fmt = fmt0; |
/* |
* Scan the format for conversions (`%' character). |
*/ |
for (;;) { |
for (fmark = fmt; (ch = pgm_read_byte(fmt)) != '\0' && ch != '%'; fmt++) |
/* void */; |
if ((n = fmt - fmark) != 0) { |
PRINTP(fmark, n); |
} |
if (ch == '\0') |
goto done; |
fmt++; /* skip over '%' */ |
flags = 0; |
dprec = 0; |
width = 0; |
prec = -1; |
sign = '\0'; |
rflag: ch = PRG_RDB(fmt++); |
reswitch: |
#ifdef LIGHTPRINTF |
if (ch=='o' || ch=='u' || (ch|0x20)=='x') { |
#else |
if (ch=='u' || (ch|0x20)=='x') { |
#endif |
if (flags&LONGINT) { |
_ulong=va_arg(ap, unsigned long); |
} else { |
register unsigned int _d; |
_d=va_arg(ap, unsigned int); |
_ulong = flags&SHORTINT ? (unsigned long)(unsigned short)_d : (unsigned long)_d; |
} |
} |
#ifndef LIGHTPRINTF |
if(ch==' ') { |
/* |
* ``If the space and + flags both appear, the space |
* flag will be ignored.'' |
* -- ANSI X3J11 |
*/ |
if (!sign) |
sign = ' '; |
goto rflag; |
} else if (ch=='#') { |
flags |= ALT; |
goto rflag; |
} else if (ch=='*'||ch=='-') { |
if (ch=='*') { |
/* |
* ``A negative field width argument is taken as a |
* - flag followed by a positive field width.'' |
* -- ANSI X3J11 |
* They don't exclude field widths read from args. |
*/ |
if ((width = va_arg(ap, int)) >= 0) |
goto rflag; |
width = -width; |
} |
flags |= LADJUST; |
flags &= ~ZEROPAD; /* '-' disables '0' */ |
goto rflag; |
} else if (ch=='+') { |
sign = '+'; |
goto rflag; |
} else if (ch=='.') { |
if ((ch = PRG_RDB(fmt++)) == '*') { |
n = va_arg(ap, int); |
prec = n < 0 ? -1 : n; |
goto rflag; |
} |
n = 0; |
while (is_digit(ch)) { |
n = n*10 + to_digit(ch); |
ch = PRG_RDB(fmt++); |
} |
prec = n < 0 ? -1 : n; |
goto reswitch; |
} else |
#endif /* LIGHTPRINTF */ |
if (ch=='0') { |
/* |
* ``Note that 0 is taken as a flag, not as the |
* beginning of a field width.'' |
* -- ANSI X3J11 |
*/ |
if (!(flags & LADJUST)) |
flags |= ZEROPAD; /* '-' disables '0' */ |
goto rflag; |
} else if (ch>='1' && ch<='9') { |
n = 0; |
do { |
n = 10 * n + to_digit(ch); |
ch = PRG_RDB(fmt++); |
} while (is_digit(ch)); |
width = n; |
goto reswitch; |
} else if (ch=='h') { |
flags |= SHORTINT; |
goto rflag; |
} else if (ch=='l') { |
flags |= LONGINT; |
goto rflag; |
} else if (ch=='c') { |
*(cp = buf) = va_arg(ap, int); |
size = 1; |
sign = '\0'; |
} else if (ch=='D'||ch=='d'||ch=='i') { |
if(ch=='D') |
flags |= LONGINT; |
if (flags&LONGINT) { |
_ulong=va_arg(ap, long); |
} else { |
register int _d; |
_d=va_arg(ap, int); |
_ulong = flags&SHORTINT ? (long)(short)_d : (long)_d; |
} |
if ((long)_ulong < 0) { |
_ulong = -_ulong; |
sign = '-'; |
} |
base = DEC; |
goto number; |
} else |
/* |
if (ch=='n') { |
if (flags & LONGINT) |
*va_arg(ap, long *) = ret; |
else if (flags & SHORTINT) |
*va_arg(ap, short *) = ret; |
else |
*va_arg(ap, int *) = ret; |
continue; // no output |
} else |
*/ |
#ifndef LIGHTPRINTF |
if (ch=='O'||ch=='o') { |
if (ch=='O') |
flags |= LONGINT; |
base = OCT; |
goto nosign; |
} else if (ch=='p') { |
/* |
* ``The argument shall be a pointer to void. The |
* value of the pointer is converted to a sequence |
* of printable characters, in an implementation- |
* defined manner.'' |
* -- ANSI X3J11 |
*/ |
/* NOSTRICT */ |
_ulong = (unsigned int)va_arg(ap, void *); |
base = HEX; |
flags |= HEXPREFIX; |
ch = 'x'; |
goto nosign; |
} else if (ch=='s') { // print a string from RAM |
if ((cp = va_arg(ap, char *)) == NULL) { |
cp=buf; |
cp[0] = '('; |
cp[1] = 'n'; |
cp[2] = 'u'; |
cp[4] = cp[3] = 'l'; |
cp[5] = ')'; |
cp[6] = '\0'; |
} |
if (prec >= 0) { |
/* |
* can't use strlen; can only look for the |
* NUL in the first `prec' characters, and |
* strlen() will go further. |
*/ |
char *p = (char*)memchr(cp, 0, prec); |
if (p != NULL) { |
size = p - cp; |
if (size > prec) |
size = prec; |
} else |
size = prec; |
} else |
size = strlen(cp); |
sign = '\0'; |
} else |
#endif /* LIGHTPRINTF */ |
if(ch=='U'||ch=='u') { |
if (ch=='U') |
flags |= LONGINT; |
base = DEC; |
goto nosign; |
} else if (ch=='X'||ch=='x') { |
base = HEX; |
/* leading 0x/X only if non-zero */ |
if (flags & ALT && _ulong != 0) |
flags |= HEXPREFIX; |
/* unsigned conversions */ |
nosign: sign = '\0'; |
/* |
* ``... diouXx conversions ... if a precision is |
* specified, the 0 flag will be ignored.'' |
* -- ANSI X3J11 |
*/ |
number: if ((dprec = prec) >= 0) |
flags &= ~ZEROPAD; |
/* |
* ``The result of converting a zero value with an |
* explicit precision of zero is no characters.'' |
* -- ANSI X3J11 |
*/ |
cp = buf + BUF; |
if (_ulong != 0 || prec != 0) { |
register unsigned char _d,notlastdigit; |
do { |
notlastdigit=(_ulong>=base); |
_d = _ulong % base; |
if (_d<10) { |
_d+='0'; |
} else { |
_d+='a'-10; |
if (ch=='X') _d&=~0x20; |
} |
*--cp=_d; |
_ulong /= base; |
} while (notlastdigit); |
#ifndef LIGHTPRINTF |
// handle octal leading 0 |
if (base==OCT && flags & ALT && *cp != '0') |
*--cp = '0'; |
#endif |
} |
size = buf + BUF - cp; |
} else { //default |
/* "%?" prints ?, unless ? is NUL */ |
if (ch == '\0') |
goto done; |
/* pretend it was %c with argument ch */ |
cp = buf; |
*cp = ch; |
size = 1; |
sign = '\0'; |
} |
/* |
* All reasonable formats wind up here. At this point, |
* `cp' points to a string which (if not flags&LADJUST) |
* should be padded out to `width' places. If |
* flags&ZEROPAD, it should first be prefixed by any |
* sign or other prefix; otherwise, it should be blank |
* padded before the prefix is emitted. After any |
* left-hand padding and prefixing, emit zeroes |
* required by a decimal [diouxX] precision, then print |
* the string proper, then emit zeroes required by any |
* leftover floating precision; finally, if LADJUST, |
* pad with blanks. |
*/ |
/* |
* compute actual size, so we know how much to pad. |
*/ |
fieldsz = size; |
dpad = dprec - size; |
if (dpad < 0) |
dpad = 0; |
if (sign) |
fieldsz++; |
else if (flags & HEXPREFIX) |
fieldsz += 2; |
fieldsz += dpad; |
/* right-adjusting blank padding */ |
if ((flags & (LADJUST|ZEROPAD)) == 0) |
PAD_SP(width - fieldsz); |
/* prefix */ |
if (sign) { |
PRINT(&sign, 1); |
} else if (flags & HEXPREFIX) { |
ox[0] = '0'; |
ox[1] = ch; |
PRINT(ox, 2); |
} |
/* right-adjusting zero padding */ |
if ((flags & (LADJUST|ZEROPAD)) == ZEROPAD) |
PAD_0(width - fieldsz); |
/* leading zeroes from decimal precision */ |
PAD_0(dpad); |
/* the string or number proper */ |
PRINT(cp, size); |
/* left-adjusting padding (always blank) */ |
if (flags & LADJUST) |
PAD_SP(width - fieldsz); |
} |
done: |
va_end(ap); |
} |
/branches/thjac/V1_13/printf_P.h |
---|
0,0 → 1,19 |
#ifndef _PRINTF_P_H_ |
#define _PRINTF_P_H_ |
#include <avr/pgmspace.h> |
#define OUT_V24 0 |
#define OUT_LCD 1 |
void _printf_P (char, char const *fmt0, ...); |
extern char PrintZiel; |
#define printf_P(format, args...) _printf_P(OUT_V24,format , ## args) |
#define printf(format, args...) _printf_P(OUT_V24,PSTR(format) , ## args) |
#define LCD_printfxy(x,y,format, args...) { DispPtr = y * 20 + x; _printf_P(OUT_LCD,PSTR(format) , ## args);} |
#define LCD_printf(format, args...) { _printf_P(OUT_LCD,PSTR(format) , ## args);} |
#endif |
/branches/thjac/V1_13/rc.c |
---|
0,0 → 1,122 |
/*####################################################################################### |
Decodieren eines RC Summen Signals |
#######################################################################################*/ |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "rc.h" |
#include "main.h" |
volatile int PPM_in[11]; |
volatile int PPM_diff[11]; // das diffenzierte Stick-Signal |
volatile unsigned char NewPpmData = 1; |
//############################################################################ |
//zum decodieren des PPM-Signals wird Timer1 mit seiner Input |
//Capture Funktion benutzt: |
void rc_sum_init (void) |
//############################################################################ |
{ |
TCCR1B=(1<<CS11)|(1<<CS10)|(1<<ICES1)|(1<<ICNC1);//|(1 << WGM12); //timer1 prescale 64 |
// TCCR1B=(1<<CS11)|(0<<CS10)|(1<<ICES1)|(1<<ICNC1); //timer1 prescale 64 |
TIMSK1 |= _BV(ICIE1); |
AdNeutralGier = 0; |
AdNeutralRoll = 0; |
AdNeutralNick = 0; |
return; |
} |
//############################################################################ |
//Diese Routine startet und inizialisiert den Timer für RC |
SIGNAL(SIG_INPUT_CAPTURE1) |
//############################################################################ |
{ |
static unsigned int AltICR=0; |
signed int signal = 0,tmp; |
static int index; |
signal = (unsigned int) ICR1 - AltICR; |
AltICR = ICR1; |
//Syncronisationspause? |
if((signal > 1100) && (signal < 8000)) |
{ |
if(index >= 4) NewPpmData = 0; // Null bedeutet: Neue Daten |
index = 1; |
} |
else |
{ |
if(index < 10) |
{ |
if((signal > 250) && (signal < 687)) |
{ |
signal -= 466; |
// Stabiles Signal |
if(abs(signal - PPM_in[index]) < 6) { if(SenderOkay < 200) SenderOkay += 10; else SenderOkay = 200;} |
tmp = (3 * (PPM_in[index]) + signal) / 4; |
if(tmp > signal+1) tmp--; else |
if(tmp < signal-1) tmp++; |
if(SenderOkay >= 195) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; |
else PPM_diff[index] = 0; |
PPM_in[index] = tmp; |
} |
index++; |
if(index == 5) J3High; else J3Low; // Servosignal an J3 anlegen |
if(index == 6) J4High; else J4Low; // Servosignal an J4 anlegen |
if(index == 7) J5High; else J5Low; // Servosignal an J5 anlegen |
} |
} |
} |
/* |
//############################################################################ |
//Diese Routine startet und inizialisiert den Timer für RC |
SIGNAL(SIG_INPUT_CAPTURE1) |
//############################################################################ |
{ |
static unsigned int AltICR=0; |
signed int signal = 0,tmp; |
static int index; |
signal = (unsigned int) ICR1 - AltICR; |
DebugOut.Analog[16] = signal; |
signal /= 2; |
AltICR = ICR1; |
//Syncronisationspause? |
if((signal > 1100*2) && (signal < 8000*2)) |
{ |
if(index >= 4) NewPpmData = 0; // Null bedeutet: Neue Daten |
index = 1; |
} |
else |
{ |
if(index < 10) |
{ |
if((signal > 250) && (signal < 687*2)) |
{ |
signal -= 962; |
// Stabiles Signal |
if(abs(signal - PPM_in[index]) < 6) { if(SenderOkay < 200) SenderOkay += 10;} |
tmp = (3 * (PPM_in[index]) + signal) / 4; |
if(tmp > signal+1) tmp--; else |
if(tmp < signal-1) tmp++; |
if(SenderOkay >= 195) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; |
else PPM_diff[index] = 0; |
PPM_in[index] = tmp; |
} |
index++; |
if(index == 5) J3High; else J3Low; // Servosignal an J3 anlegen |
if(index == 2) J4High; else J4Low; // Servosignal an J4 anlegen |
if(index == 7) J5High; else J5Low; // Servosignal an J5 anlegen |
} |
} |
} |
*/ |
/branches/thjac/V1_13/rc.h |
---|
0,0 → 1,30 |
/*####################################################################################### |
Derkodieren eines RC Summen Signals |
#######################################################################################*/ |
#ifndef _RC_H |
#define _RC_H |
#if defined (__AVR_ATmega32__) |
#define TIMER_TEILER CK64 |
#define TIMER_RELOAD_VALUE 250 |
#endif |
#if defined (__AVR_ATmega644__) |
#define TIMER_RELOAD_VALUE 250 |
#endif |
#if defined (__AVR_ATmega644P__) |
#define TIMER_RELOAD_VALUE 250 |
#endif |
#define GAS PPM_in[2] |
extern void rc_sum_init (void); |
extern volatile int PPM_in[11]; |
extern volatile int PPM_diff[11]; // das diffenzierte Stick-Signal |
extern volatile unsigned char NewPpmData; |
#endif //_RC_H |
/branches/thjac/V1_13/spi.c |
---|
0,0 → 1,281 |
// ######################## SPI - FlightCtrl ################### |
#include "main.h" |
//struct str_ToNaviCtrl_Version ToNaviCtrl_Version; |
//struct str_FromNaviCtrl_Version FromNaviCtrl_Version; |
struct str_ToNaviCtrl ToNaviCtrl; |
struct str_FromNaviCtrl FromNaviCtrl; |
struct str_FromNaviCtrl_Value FromNaviCtrl_Value; |
struct str_SPI_VersionInfo SPI_VersionInfo; |
unsigned char SPI_BufferIndex; |
unsigned char SPI_RxBufferIndex; |
volatile unsigned char SPI_Buffer[sizeof(FromNaviCtrl)]; |
unsigned char *SPI_TX_Buffer; |
unsigned char SPITransferCompleted, SPI_ChkSum; |
unsigned char SPI_RxDataValid,NaviDataOkay = 0; |
unsigned char SPI_CommandSequence[] = { SPI_CMD_USER, SPI_CMD_STICK, SPI_CMD_PARAMETER1, SPI_CMD_STICK, SPI_CMD_MISC, SPI_CMD_VERSION }; |
unsigned char SPI_CommandCounter = 0; |
#ifdef USE_SPI_COMMUNICATION |
//------------------------------------------------------ |
void SPI_MasterInit(void) |
{ |
DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK); // Set MOSI and SCK output, all others input |
SLAVE_SELECT_DDR_PORT |= (1 << SPI_SLAVE_SELECT); |
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(0<<SPR0)|(0<<SPIE); // Enable SPI, Master, set clock rate fck/64 |
SPSR = 0;//(1<<SPI2X); |
SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); |
SPITransferCompleted = 1; |
//SPDR = 0x00; // dummy write |
ToNaviCtrl.Sync1 = 0xAA; |
ToNaviCtrl.Sync2 = 0x83; |
ToNaviCtrl.Command = SPI_CMD_USER; |
ToNaviCtrl.IntegralNick = 0; |
ToNaviCtrl.IntegralRoll = 0; |
FromNaviCtrl_Value.SerialDataOkay = 0; |
SPI_RxDataValid = 0; |
SPI_VersionInfo.Major = VERSION_MAJOR; |
SPI_VersionInfo.Minor = VERSION_MINOR; |
SPI_VersionInfo.Patch = VERSION_PATCH; |
SPI_VersionInfo.Compatible = NC_SPI_COMPATIBLE; |
} |
//------------------------------------------------------ |
void SPI_StartTransmitPacket(void) |
{ |
//if ((SLAVE_SELECT_PORT & (1 << SPI_SLAVE_SELECT)) == 0) return; // transfer of prev. packet not completed |
if (!SPITransferCompleted) return; |
// _delay_us(30); |
SLAVE_SELECT_PORT &= ~(1 << SPI_SLAVE_SELECT); // SelectSlave |
SPI_TX_Buffer = (unsigned char *) &ToNaviCtrl; |
ToNaviCtrl.Command = SPI_CommandSequence[SPI_CommandCounter++]; |
if (SPI_CommandCounter >= sizeof(SPI_CommandSequence)) SPI_CommandCounter = 0; |
SPITransferCompleted = 0; |
UpdateSPI_Buffer(); // update buffer |
SPI_BufferIndex = 1; |
//ebugOut.Analog[16]++; |
// -- Debug-Output --- |
//---- |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
ToNaviCtrl.Chksum = ToNaviCtrl.Sync1; |
SPDR = ToNaviCtrl.Sync1; // Start transmission |
// SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
} |
//------------------------------------------------------ |
//SIGNAL(SIG_SPI) |
void SPI_TransmitByte(void) |
{ |
static unsigned char SPI_RXState = 0; |
unsigned char rxdata; |
static unsigned char rxchksum; |
if (SPITransferCompleted) return; |
if (!(SPSR & (1 << SPIF))) return; |
SendSPI = 4; |
// _delay_us(30); |
SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
rxdata = SPDR; |
switch ( SPI_RXState) |
{ |
case 0: |
SPI_RxBufferIndex = 0; |
//DebugOut.Analog[17]++; |
rxchksum = rxdata; |
if (rxdata == 0x81 ) { SPI_RXState = 1; } // 1. Syncbyte ok |
break; |
case 1: |
if (rxdata == 0x55) { rxchksum += rxdata; SPI_RXState = 2; } // 2. Syncbyte ok |
else SPI_RXState = 0; |
//DebugOut.Analog[18]++; |
break; |
case 2: |
SPI_Buffer[SPI_RxBufferIndex++]= rxdata; // get data |
//DebugOut.Analog[19]++; |
if (SPI_RxBufferIndex >= sizeof(FromNaviCtrl)) |
{ |
if (rxdata == rxchksum) |
{ |
unsigned char *ptr = (unsigned char *)&FromNaviCtrl; |
memcpy(ptr, (unsigned char *) SPI_Buffer, sizeof(SPI_Buffer)); |
SPI_RxDataValid = 1; |
} |
else SPI_RxDataValid = 0; |
SPI_RXState = 0; |
} |
else rxchksum += rxdata; |
break; |
} |
if (SPI_BufferIndex < sizeof(ToNaviCtrl)) |
{ |
SLAVE_SELECT_PORT &= ~(1 << SPI_SLAVE_SELECT); // SelectSlave |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
SPDR = SPI_TX_Buffer[SPI_BufferIndex]; |
ToNaviCtrl.Chksum += SPI_TX_Buffer[SPI_BufferIndex]; |
// SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
} |
else SPITransferCompleted = 1; |
SPI_BufferIndex++; |
} |
//------------------------------------------------------ |
void UpdateSPI_Buffer(void) |
{ |
signed int tmp; |
cli(); |
ToNaviCtrl.IntegralNick = (int) (IntegralNick / (long)(EE_Parameter.GyroAccFaktor * 4)); |
ToNaviCtrl.IntegralRoll = (int) (IntegralRoll / (long)(EE_Parameter.GyroAccFaktor * 4)); |
ToNaviCtrl.GyroCompass = (10 * ErsatzKompass) / GIER_GRAD_FAKTOR; |
ToNaviCtrl.AccNick = ((int) ACC_AMPLIFY * (NaviAccNick / NaviCntAcc))/4; |
ToNaviCtrl.AccRoll = ((int) ACC_AMPLIFY * (NaviAccRoll / NaviCntAcc))/4; |
NaviCntAcc = 0; NaviAccNick = 0; NaviAccRoll = 0; |
// ToNaviCtrl.User8 = Parameter_UserParam8; |
// ToNaviCtrl.CalState = WinkelOut.CalcState; |
switch(ToNaviCtrl.Command) // |
{ |
case SPI_CMD_USER: |
ToNaviCtrl.Param.Byte[0] = Parameter_UserParam1; |
ToNaviCtrl.Param.Byte[1] = Parameter_UserParam2; |
ToNaviCtrl.Param.Byte[2] = Parameter_UserParam3; |
ToNaviCtrl.Param.Byte[3] = Parameter_UserParam4; |
ToNaviCtrl.Param.Byte[4] = Parameter_UserParam5; |
ToNaviCtrl.Param.Byte[5] = Parameter_UserParam6; |
ToNaviCtrl.Param.Byte[6] = Parameter_UserParam7; |
ToNaviCtrl.Param.Byte[7] = Parameter_UserParam8; |
ToNaviCtrl.Param.Byte[8] = (unsigned char) MikroKopterFlags; |
MikroKopterFlags &= ~(FLAG_CALIBRATE | FLAG_START); |
ToNaviCtrl.Param.Byte[9] = (unsigned char) UBat; |
ToNaviCtrl.Param.Byte[10] =(unsigned char) EE_Parameter.UnterspannungsWarnung; |
ToNaviCtrl.Param.Byte[11] =(unsigned char) eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET]); |
break; |
case SPI_CMD_PARAMETER1: |
ToNaviCtrl.Param.Byte[0] = EE_Parameter.NaviGpsModeControl; // Parameters for the Naviboard |
ToNaviCtrl.Param.Byte[1] = EE_Parameter.NaviGpsGain; |
ToNaviCtrl.Param.Byte[2] = EE_Parameter.NaviGpsP; |
ToNaviCtrl.Param.Byte[3] = EE_Parameter.NaviGpsI; |
ToNaviCtrl.Param.Byte[4] = EE_Parameter.NaviGpsD; |
ToNaviCtrl.Param.Byte[5] = EE_Parameter.NaviGpsACC; |
ToNaviCtrl.Param.Byte[6] = EE_Parameter.NaviGpsMinSat; |
ToNaviCtrl.Param.Byte[7] = EE_Parameter.NaviStickThreshold; |
ToNaviCtrl.Param.Byte[8] = EE_Parameter.NaviOperatingRadius; |
ToNaviCtrl.Param.Byte[9] = EE_Parameter.NaviWindCorrection; |
ToNaviCtrl.Param.Byte[10] = EE_Parameter.NaviSpeedCompensation; |
ToNaviCtrl.Param.Byte[11] = EE_Parameter.NaviAngleLimitation; |
break; |
case SPI_CMD_STICK: |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[0] = (char) tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[1] = (char) tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[2] = (char) tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_NICK]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[3] = (char) tmp; |
ToNaviCtrl.Param.Byte[4] = (unsigned char) Poti1; |
ToNaviCtrl.Param.Byte[5] = (unsigned char) Poti2; |
ToNaviCtrl.Param.Byte[6] = (unsigned char) Poti3; |
ToNaviCtrl.Param.Byte[7] = (unsigned char) Poti4; |
ToNaviCtrl.Param.Byte[8] = (unsigned char) SenderOkay; |
break; |
case SPI_CMD_MISC: |
if(WinkelOut.CalcState > 5) |
{ |
WinkelOut.CalcState = 0; |
ToNaviCtrl.Param.Byte[0] = 5; |
} |
else ToNaviCtrl.Param.Byte[0] = WinkelOut.CalcState; |
ToNaviCtrl.Param.Int[1] = HoehenWert; |
ToNaviCtrl.Param.Byte[1] = EE_Parameter.NaviPH_LoginTime; |
ToNaviCtrl.Param.Byte[4] = EE_Parameter.NaviGpsPLimit; |
ToNaviCtrl.Param.Byte[5] = EE_Parameter.NaviGpsILimit; |
ToNaviCtrl.Param.Byte[6] = EE_Parameter.NaviGpsDLimit; |
break; |
case SPI_CMD_VERSION: |
ToNaviCtrl.Param.Byte[0] = SPI_VersionInfo.Major; |
ToNaviCtrl.Param.Byte[1] = SPI_VersionInfo.Minor; |
ToNaviCtrl.Param.Byte[2] = SPI_VersionInfo.Patch; |
ToNaviCtrl.Param.Byte[3] = SPI_VersionInfo.Compatible; |
ToNaviCtrl.Param.Byte[4] = PlatinenVersion; |
break; |
} |
sei(); |
if(SPI_RxDataValid) |
{ |
if(abs(FromNaviCtrl.GPS_Nick) < 512 && abs(FromNaviCtrl.GPS_Roll) < 512 && (EE_Parameter.GlobalConfig & CFG_GPS_AKTIV)) |
{ |
GPS_Nick = FromNaviCtrl.GPS_Nick; |
GPS_Roll = FromNaviCtrl.GPS_Roll; |
NaviDataOkay = 250; |
} |
if(FromNaviCtrl.CompassValue <= 360) KompassValue = FromNaviCtrl.CompassValue; |
KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180; |
if(FromNaviCtrl.BeepTime > beeptime && !WinkelOut.CalcState) beeptime = FromNaviCtrl.BeepTime; |
switch (FromNaviCtrl.Command) |
{ |
case SPI_KALMAN: |
FromNaviCtrl_Value.Kalman_K = FromNaviCtrl.Param.Byte[0]; |
FromNaviCtrl_Value.Kalman_MaxFusion = FromNaviCtrl.Param.Byte[1]; |
FromNaviCtrl_Value.Kalman_MaxDrift = FromNaviCtrl.Param.Byte[2]; |
FromNaviCtrl_Value.SerialDataOkay = FromNaviCtrl.Param.Byte[3]; |
break; |
default: |
break; |
} |
} |
else |
{ |
// KompassValue = 0; |
// KompassRichtung = 0; |
GPS_Nick = 0; |
GPS_Roll = 0; |
} |
} |
#endif |
/branches/thjac/V1_13/spi.h |
---|
0,0 → 1,140 |
// ######################## SPI - FlightCtrl ################### |
#ifndef _SPI_H |
#define _SPI_H |
#include <util/delay.h> |
#define USE_SPI_COMMUNICATION |
#define SPI_PROTOCOL_COMP 1 |
//----------------------------------------- |
#define DDR_SPI DDRB |
#define DD_SS PB4 |
#define DD_SCK PB7 |
#define DD_MOSI PB5 |
#define DD_MISO PB6 |
// for compatibility reasons gcc3.x <-> gcc4.x |
#ifndef SPCR |
#define SPCR SPCR0 |
#endif |
#ifndef SPE |
#define SPE SPE0 |
#endif |
#ifndef MSTR |
#define MSTR MSTR0 |
#endif |
#ifndef SPR1 |
#define SPR1 SPR01 |
#endif |
#ifndef SPR0 |
#define SPR0 SPR00 |
#endif |
#ifndef SPIE |
#define SPIE SPIE0 |
#endif |
#ifndef SPDR |
#define SPDR SPDR0 |
#endif |
#ifndef SPIF |
#define SPIF SPIF0 |
#endif |
#ifndef SPSR |
#define SPSR SPSR0 |
#endif |
// ------------------------- |
#define SLAVE_SELECT_DDR_PORT DDRC |
#define SLAVE_SELECT_PORT PORTC |
#define SPI_SLAVE_SELECT PC5 |
#define SPI_CMD_USER 10 |
#define SPI_CMD_STICK 11 |
#define SPI_CMD_MISC 12 |
#define SPI_CMD_PARAMETER1 13 |
#define SPI_CMD_VERSION 14 |
struct str_ToNaviCtrl |
{ |
unsigned char Sync1, Sync2; |
unsigned char Command; |
signed int IntegralNick; |
signed int IntegralRoll; |
signed int AccNick; |
signed int AccRoll; |
signed int GyroCompass; |
signed int GyroNick; |
signed int GyroRoll; |
signed int GyroGier; |
union |
{ char Byte[12]; |
int Int[6]; |
long Long[3]; |
float Float[3]; |
} Param; |
unsigned char Chksum; |
}; |
#define SPI_KALMAN 103 |
struct str_FromNaviCtrl |
{ |
unsigned char Command; |
signed int GPS_Nick; |
signed int GPS_Roll; |
signed int GPS_Gier; |
signed int CompassValue; |
signed int Status; |
unsigned int BeepTime; |
union |
{ char Byte[12]; |
int Int[6]; |
long Long[3]; |
float Float[3]; |
} Param; |
unsigned char Chksum; |
}; |
struct str_FromNaviCtrl_Value |
{ |
signed char Kalman_K; |
signed char Kalman_MaxDrift; |
signed char Kalman_MaxFusion; |
unsigned char SerialDataOkay; |
}; |
struct str_SPI_VersionInfo |
{ |
unsigned char Major; |
unsigned char Minor; |
unsigned char Patch; |
unsigned char Compatible; |
}; |
#ifdef USE_SPI_COMMUNICATION |
extern struct str_FromNaviCtrl_Value FromNaviCtrl_Value; |
extern struct str_ToNaviCtrl ToNaviCtrl; |
extern struct str_FromNaviCtrl FromNaviCtrl; |
extern unsigned char SPI_CommandCounter,NaviDataOkay; |
//#define SPI_CMD_VALUE 0x03 |
extern void SPI_MasterInit(void); |
extern void SPI_StartTransmitPacket(void); |
extern void UpdateSPI_Buffer(void); |
extern void SPI_TransmitByte(void); |
#else |
// -------------------------------- Dummy ----------------------------------------- |
#define SPI_MasterInit() ; |
#define SPI_StartTransmitPacket() ; |
#define UpdateSPI_Buffer() ; |
#define SPI_TransmitByte() ; |
#endif |
#endif |
/branches/thjac/V1_13/timer0.c |
---|
0,0 → 1,448 |
#include "main.h" |
#include "parameter.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 |
// Min und Max vorverlegt, damit sich diese auf ServoNickControl beziehen und ggf. noch Nick-kompensiert werden |
if (ServoValue < ((int) EE_Parameter.ServoNickMin * MULTIPLYER)) |
ServoValue = (int) EE_Parameter.ServoNickMin * MULTIPLYER; |
else if (ServoValue > ((int) EE_Parameter.ServoNickMax * MULTIPLYER)) |
ServoValue = (int) EE_Parameter.ServoNickMax * MULTIPLYER; |
long integral; |
/* Über Parameter läßt sich zwischen "+" und "X" - Formations |
* umschalten (sh. parameter.h) |
*/ |
if (PARAM_X_FORMATION) { |
integral = IntegralNick - IntegralRoll; |
} else { |
integral = IntegralNick; |
} |
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 * (integral / 128L ) ) / (256L) ); |
} |
else |
{ // non inverting movement of servo |
ServoNickValue -= (int16_t)( ( (int32_t)EE_Parameter.ServoNickComp * MULTIPLYER * (integral / 128L ) ) / (256L) ); |
} |
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 |
{ |
long integral; |
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) |
/* Über Parameter läßt sich zwischen "+" und "X" - Formations |
* umschalten (sh. parameter.h) |
*/ |
if (PARAM_X_FORMATION) |
integral = IntegralNick - IntegralRoll; |
else |
integral = IntegralNick; |
if(EE_Parameter.ServoNickCompInvert & 0x01) |
{ // inverting movement of servo |
ServoNickValue += (int16_t)( ( (int32_t)EE_Parameter.ServoNickComp * MULTIPLYER * (integral / 128L ) ) / (256L) ); |
} |
else |
{ // non inverting movement of servo |
ServoNickValue -= (int16_t)( ( (int32_t)EE_Parameter.ServoNickComp * MULTIPLYER * (integral / 128L ) ) / (256L) ); |
} |
// limit servo value to its parameter range definition |
if(ServoNickValue < ((int16_t)EE_Parameter.ServoNickMin * MULTIPLYER) ) |
{ |
ServoNickValue = (int16_t)EE_Parameter.ServoNickMin * MULTIPLYER; |
} |
else |
if(ServoNickValue > ((int16_t)EE_Parameter.ServoNickMax * MULTIPLYER) ) |
{ |
ServoNickValue = (int16_t)EE_Parameter.ServoNickMax * MULTIPLYER; |
} |
RemainingPulse += ServoNickValue - (256 / 2) * MULTIPLYER; // shift ServoNickValue to center position |
ServoNickValue /= MULTIPLYER; |
DebugOut.Analog[20] = ServoNickValue; |
break; |
case 2: // Roll Compensation Servo |
ServoRollOffset = (ServoRollOffset * 3 + (int16_t) 80 * MULTIPLYER) / 4; // lowpass offset |
ServoRollValue = ServoRollOffset; // offset (Range from 0 to 255 * 3 = 765) |
//if(EE_Parameter.ServoRollCompInvert & 0x01) |
{ // inverting movement of servo |
ServoRollValue += (int16_t)( ( (int32_t) 50 * MULTIPLYER * (IntegralRoll / 128L ) ) / (256L) ); |
} |
/* else |
{ // non inverting movement of servo |
ServoRollValue -= (int16_t)( ( (int32_t) 40 * MULTIPLYER * (IntegralRoll / 128L ) ) / (256L) ); |
} |
*/ // limit servo value to its parameter range definition |
if(ServoRollValue < ((int16_t)EE_Parameter.ServoNickMin * MULTIPLYER) ) |
{ |
ServoRollValue = (int16_t)EE_Parameter.ServoNickMin * MULTIPLYER; |
} |
else |
if(ServoRollValue > ((int16_t)EE_Parameter.ServoNickMax * MULTIPLYER) ) |
{ |
ServoRollValue = (int16_t)EE_Parameter.ServoNickMax * MULTIPLYER; |
} |
RemainingPulse += ServoRollValue - (256 / 2) * MULTIPLYER; // shift ServoNickValue to center position |
ServoRollValue /= MULTIPLYER; |
//DebugOut.Analog[20] = ServoRollValue; |
/* ServoRollOffset = (ServoRollOffset * 3 + (int16_t)Parameter_ServoRollControl * MULTIPLYER) / 4; // lowpass offset |
ServoRollValue = ServoRollOffset; // offset (Range from 0 to 255 * 3 = 765) |
if(EE_Parameter.ServoRollCompInvert & 0x01) |
{ // inverting movement of servo |
ServoRollValue += (int16_t)( ( (int32_t)EE_Parameter.ServoNickComp * MULTIPLYER * (IntegralNick / 128L ) ) / (256L) ); |
} |
else |
{ // non inverting movement of servo |
ServoRollValue -= (int16_t)( ( (int32_t)EE_Parameter.ServoNickComp * MULTIPLYER * (IntegralNick / 128L ) ) / (256L) ); |
} |
// limit servo value to its parameter range definition |
if(ServoRollValue < ((int16_t)EE_Parameter.ServoRollMin * MULTIPLYER) ) |
{ |
ServoRollValue = (int16_t)EE_Parameter.ServoRollMin * MULTIPLYER; |
} |
else |
if(ServoRollValue > ((int16_t)EE_Parameter.ServoRollMax * MULTIPLYER) ) |
{ |
ServoRollValue = (int16_t)EE_Parameter.ServoRollMax * MULTIPLYER; |
} |
RemainingPulse += ServoRollValue - (256 / 2) * MULTIPLYER; // shift ServoNickValue to center position |
ServoRollValue /= MULTIPLYER; |
//DebugOut.Analog[20] = ServoRollValue; |
*/ break; |
default: // other servo channels |
RemainingPulse += 2 * PPM_in[ServoIndex]; // add channel value, factor of 2 because timer 1 increments 3.2µs |
break; |
} |
// range servo pulse width |
if(RemainingPulse > MAXSERVOPULSE ) RemainingPulse = MAXSERVOPULSE; // upper servo pulse limit |
else if(RemainingPulse < MINSERVOPULSE ) RemainingPulse = MINSERVOPULSE; // lower servo pulse limit |
// substract stop pulse width |
RemainingPulse -= PPM_STOPPULSE; |
// accumulate time for correct sync gap |
ServoFrameTime += RemainingPulse; |
} |
} |
else // we had a high pulse |
{ |
TCCR2A |= (1<<COM2A0); // make a low pulse |
// set pulsewidth to stop pulse width |
RemainingPulse = PPM_STOPPULSE; |
// accumulate time for correct sync gap |
ServoFrameTime += RemainingPulse; |
if(ServoActive && SenderOkay > 180) HEF4017R_OFF; // disable HEF4017 reset |
ServoIndex++; // change to next servo channel |
if(ServoIndex > EE_Parameter.ServoNickRefresh) ServoIndex = 0; // reset to the sync gap |
} |
// set pulse output active |
PulseOutput = 1; |
} |
} // EOF PPM state machine |
// General pulse output generator |
if(RemainingPulse > (255 + IRS_RUNTIME)) |
{ |
OCR2A = 255; |
RemainingPulse -= 255; |
} |
else |
{ |
if(RemainingPulse > 255) // this is the 2nd last part |
{ |
if((RemainingPulse - 255) < IRS_RUNTIME) |
{ |
OCR2A = 255 - IRS_RUNTIME; |
RemainingPulse -= 255 - IRS_RUNTIME; |
} |
else // last part > ISR_RUNTIME |
{ |
OCR2A = 255; |
RemainingPulse -= 255; |
} |
} |
else // this is the last part |
{ |
OCR2A = RemainingPulse; |
RemainingPulse = 0; |
PulseOutput = 0; // trigger to stop pulse |
} |
} // EOF general pulse output generator |
} |
/branches/thjac/V1_13/timer0.h |
---|
0,0 → 1,20 |
#define TIMER_TEILER CK8 |
#define TIMER_RELOAD_VALUE 250 |
#define HEF4017R_ON PORTC |= (1<<PORTC6) |
#define HEF4017R_OFF PORTC &= ~(1<<PORTC6) |
void Timer_Init(void); |
void TIMER2_Init(void); |
void Delay_ms(unsigned int); |
void Delay_ms_Mess(unsigned int); |
unsigned int SetDelay (unsigned int t); |
char CheckDelay (unsigned int t); |
extern volatile unsigned int CountMilliseconds; |
extern volatile unsigned char UpdateMotor; |
extern volatile unsigned int beeptime; |
extern volatile unsigned int cntKompass; |
extern int ServoValue; |
extern unsigned int BeepMuster; |
extern volatile unsigned char SendSPI, ServoActive; |
/branches/thjac/V1_13/twimaster.c |
---|
0,0 → 1,216 |
/*############################################################################ |
############################################################################*/ |
#include "main.h" |
volatile unsigned char twi_state = 0; |
unsigned char motor = 0; |
unsigned char motorread = 0,MissingMotor = 0; |
unsigned char motor_rx[16],motor_rx2[16]; |
unsigned char MotorPresent[MAX_MOTORS]; |
unsigned char MotorError[MAX_MOTORS]; |
//############################################################################ |
//Initzialisieren der I2C (TWI) Schnittstelle |
void i2c_init(void) |
//############################################################################ |
{ |
TWSR = 0; |
TWBR = ((SYSCLK/SCL_CLOCK)-16)/2; |
} |
//############################################################################ |
//Start I2C |
void i2c_start(void) |
//############################################################################ |
{ |
TWCR = (1<<TWSTA) | (1<<TWEN) | (1<<TWINT) | (1<<TWIE); |
} |
//############################################################################ |
void i2c_stop(void) |
//############################################################################ |
{ |
TWCR = (1<<TWEN) | (1<<TWSTO) | (1<<TWINT); |
} |
void i2c_reset(void) |
//############################################################################ |
{ |
i2c_stop(); |
twi_state = 0; |
motor = TWDR; |
motor = 0; |
TWCR = 0x80; |
TWAMR = 0; |
TWAR = 0; |
TWDR = 0; |
TWSR = 0; |
TWBR = 0; |
i2c_init(); |
i2c_start(); |
i2c_write_byte(0); |
} |
//############################################################################ |
void i2c_write_byte(char byte) |
//############################################################################ |
{ |
TWSR = 0x00; |
TWDR = byte; |
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE); |
} |
/****************************************/ |
/* Write to I2C */ |
/****************************************/ |
void I2C_WriteByte(int8_t byte) |
{ |
// move byte to send into TWI Data Register |
TWDR = byte; |
// clear interrupt flag (TWINT = 1) |
// enable i2c bus (TWEN = 1) |
// enable interrupt (TWIE = 1) |
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE); |
} |
/****************************************/ |
/* Receive byte and send ACK */ |
/****************************************/ |
void I2C_ReceiveByte(void) |
{ |
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE) | (1<<TWEA); |
} |
/****************************************/ |
/* I2C receive last byte and send no ACK*/ |
/****************************************/ |
void I2C_ReceiveLastByte(void) |
{ |
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE); |
} |
//############################################################################ |
SIGNAL (TWI_vect) |
//############################################################################ |
{ |
static unsigned char missing_motor; |
switch(twi_state++) |
{ |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Writing the Data |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
case 0: |
while(Mixer.Motor[motor][0] <= 0 && motor < MAX_MOTORS) motor++; // skip if not used |
if(motor == MAX_MOTORS) // writing finished -> now read |
{ |
motor = 0; |
twi_state = 3; |
i2c_write_byte(0x53+(motorread*2)); |
} |
else i2c_write_byte(0x52+(motor*2)); |
break; |
case 1: |
i2c_write_byte(Motor[motor++]); |
break; |
case 2: |
if(TWSR == 0x30) { if(!missing_motor) missing_motor = motor; if(++MotorError[motor-1] == 0) MotorError[motor-1] = 255;} |
i2c_stop(); |
I2CTimeout = 10; |
twi_state = 0; |
i2c_start(); |
break; |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Reading Data |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
case 3: |
//Transmit 1st byte for reading |
if(TWSR != 0x40) // Error? |
{ |
MotorPresent[motorread] = 0; |
motorread++; |
if(motorread >= MAX_MOTORS) motorread = 0; |
i2c_stop(); |
twi_state = 0; |
} |
else |
{ |
MotorPresent[motorread] = ('1' - '-') + motorread; |
I2C_ReceiveByte(); |
} |
MissingMotor = missing_motor; |
missing_motor = 0; |
break; |
case 4: //Read 1st byte and transmit 2nd Byte |
motor_rx[motorread] = TWDR; |
I2C_ReceiveLastByte(); //nack |
break; |
case 5: |
//Read 2nd byte |
motor_rx2[motorread++] = TWDR; |
if(motorread >= MAX_MOTORS) motorread = 0; |
i2c_stop(); |
twi_state = 0; |
break; |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// writing Gyro-Offset |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
case 8: |
i2c_write_byte(0x98); // Address of the DAC |
break; |
case 9: |
i2c_write_byte(0x10); // Update Channel A |
break; |
case 10: |
i2c_write_byte(AnalogOffsetNick); // Value |
break; |
case 11: |
i2c_write_byte(0x80); // Value |
break; |
case 12: |
i2c_stop(); |
I2CTimeout = 10; |
i2c_start(); |
break; |
case 13: |
i2c_write_byte(0x98); // Address of the DAC |
break; |
case 14: |
i2c_write_byte(0x12); // Update Channel B |
break; |
case 15: |
i2c_write_byte(AnalogOffsetRoll); // Value |
break; |
case 16: |
i2c_write_byte(0x80); // Value |
break; |
case 17: |
i2c_stop(); |
I2CTimeout = 10; |
i2c_start(); |
break; |
case 18: |
i2c_write_byte(0x98); // Address of the DAC |
break; |
case 19: |
i2c_write_byte(0x14); // Update Channel C |
break; |
case 20: |
i2c_write_byte(AnalogOffsetGier); // Value |
break; |
case 21: |
i2c_write_byte(0x80); // Value |
break; |
case 22: |
i2c_stop(); |
I2CTimeout = 10; |
twi_state = 0; |
break; |
default: twi_state = 0; |
break; |
} |
TWCR |= 0x80; |
} |
/branches/thjac/V1_13/twimaster.h |
---|
0,0 → 1,35 |
/*############################################################################ |
############################################################################*/ |
#ifndef _I2C_MASTER_H |
#define _I2C_MASTER_H |
//############################################################################ |
// I2C Konstanten |
#define SCL_CLOCK 200000L |
#define I2C_TIMEOUT 30000 |
#define I2C_START 0x08 |
#define I2C_REPEATED_START 0x10 |
#define I2C_TX_SLA_ACK 0x18 |
#define I2C_TX_DATA_ACK 0x28 |
#define I2C_RX_SLA_ACK 0x40 |
#define I2C_RX_DATA_ACK 0x50 |
//############################################################################ |
extern volatile unsigned char twi_state; |
extern unsigned char motor,MissingMotor; |
extern unsigned char motorread; |
extern unsigned char motor_rx[]; |
extern unsigned char MotorPresent[]; |
extern unsigned char MotorError[]; |
void i2c_reset(void); |
extern void i2c_init (void); // I2C initialisieren |
extern void i2c_start (void); // Start I2C |
extern void i2c_stop (void); // Stop I2C |
extern void i2c_write_byte (char byte); // 1 Byte schreiben |
extern void i2c_reset(void); |
#endif |
/branches/thjac/V1_13/uart.c |
---|
0,0 → 1,565 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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 |
" ", |
" ", |
" ", |
"SollHoehe ", |
"PitchOffset ", //25 |
"StickValue ", |
"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(); |
init(); |
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 = 0; |
VersionInfo.SWMinor = 74; |
VersionInfo.SWPatch = 4; |
VersionInfo.ProtoMajor = VERSION_SERIAL_MAJOR; |
VersionInfo.ProtoMinor = VERSION_SERIAL_MINOR; |
pRxData = 0; |
RxDataLen = 0; |
} |
//--------------------------------------------------------------------------------------------- |
void DatenUebertragung(void) |
{ |
if(!UebertragungAbgeschlossen) return; |
if(DebugDisplayAnforderung && UebertragungAbgeschlossen) |
{ |
Menu(); |
SendOutData('H', FC_ADDRESS, 2, &DisplayLine, sizeof(DisplayLine), &DisplayBuff[DisplayLine * 20], 20); |
DisplayLine++; |
if(DisplayLine >= 4) DisplayLine = 0; |
DebugDisplayAnforderung = 0; |
} |
if(DebugDisplayAnforderung1 && UebertragungAbgeschlossen) |
{ |
Menu(); |
SendOutData('L', FC_ADDRESS, 3, &MenuePunkt, sizeof(MenuePunkt), &MaxMenue, sizeof(MaxMenue), DisplayBuff, sizeof(DisplayBuff)); |
DebugDisplayAnforderung1 = 0; |
} |
if(GetVersionAnforderung && UebertragungAbgeschlossen) |
{ |
SendOutData('V', FC_ADDRESS, 1, (unsigned char *) &VersionInfo, sizeof(VersionInfo)); |
GetVersionAnforderung = 0; |
} |
if(GetExternalControl && UebertragungAbgeschlossen) // Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
{ |
SendOutData('G',MeineSlaveAdresse, 1, (unsigned char *) &ExternControl, sizeof(ExternControl)); |
GetExternalControl = 0; |
} |
if((CheckDelay(Kompass_Timer)) && UebertragungAbgeschlossen) |
{ |
WinkelOut.Winkel[0] = (int) (IntegralNick / (EE_Parameter.GyroAccFaktor * 4)); // etwa in 0.1 Grad |
WinkelOut.Winkel[1] = (int) (IntegralRoll / (EE_Parameter.GyroAccFaktor * 4)); // etwa in 0.1 Grad |
WinkelOut.UserParameter[0] = Parameter_UserParam1; |
WinkelOut.UserParameter[1] = Parameter_UserParam2; |
SendOutData('w', MK3MAG_ADDRESS, 1, (unsigned char *) &WinkelOut,sizeof(WinkelOut)); |
if(WinkelOut.CalcState > 4) WinkelOut.CalcState = 6; // wird dann in SPI auf Null gesetzt |
Kompass_Timer = SetDelay(99); |
} |
if(((DebugDataIntervall>0 && CheckDelay(Debug_Timer)) || DebugDataAnforderung) && UebertragungAbgeschlossen) |
{ |
SendOutData('D', FC_ADDRESS, 1, (unsigned char *) &DebugOut,sizeof(DebugOut)); |
DebugDataAnforderung = 0; |
if(DebugDataIntervall>0) Debug_Timer = SetDelay(DebugDataIntervall); |
} |
if(Intervall3D > 0 && CheckDelay(Timer3D) && UebertragungAbgeschlossen) |
{ |
Data3D.Winkel[0] = (int) (IntegralNick / (EE_Parameter.GyroAccFaktor * 4)); // etwa in 0.1 Grad |
Data3D.Winkel[1] = (int) (IntegralRoll / (EE_Parameter.GyroAccFaktor * 4)); // etwa in 0.1 Grad |
Data3D.Winkel[2] = (int) ((10 * ErsatzKompass) / GIER_GRAD_FAKTOR); |
SendOutData('C', FC_ADDRESS, 1, (unsigned char *) &Data3D,sizeof(Data3D)); |
Timer3D = SetDelay(Intervall3D); |
} |
if(DebugTextAnforderung != 255) // Texte für die Analogdaten |
{ |
SendOutData('A', FC_ADDRESS, 2, (unsigned char *)&DebugTextAnforderung, sizeof(DebugTextAnforderung),(unsigned char *) ANALOG_TEXT[DebugTextAnforderung], 16); |
DebugTextAnforderung = 255; |
} |
if(ConfirmFrame && UebertragungAbgeschlossen) // Datensatz bestätigen |
{ |
SendOutData('B', FC_ADDRESS, 1, (uint8_t*)&ConfirmFrame, sizeof(ConfirmFrame)); |
ConfirmFrame = 0; |
} |
if(GetPPMChannelAnforderung && UebertragungAbgeschlossen) |
{ |
SendOutData('P', FC_ADDRESS, 1, (unsigned char *) &PPM_in, sizeof(PPM_in)); |
GetPPMChannelAnforderung = 0; |
} |
} |
/branches/thjac/V1_13/uart.h |
---|
0,0 → 1,136 |
#ifndef _UART_H |
#define _UART_H |
#define MAX_SENDE_BUFF 150 |
#define MAX_EMPFANGS_BUFF 150 |
void BearbeiteRxDaten(void); |
extern unsigned char DebugGetAnforderung; |
extern unsigned volatile char SendeBuffer[MAX_SENDE_BUFF]; |
extern unsigned volatile char RxdBuffer[MAX_EMPFANGS_BUFF]; |
extern unsigned volatile char UebertragungAbgeschlossen; |
extern unsigned volatile char PC_DebugTimeout; |
extern unsigned volatile char NeueKoordinateEmpfangen; |
extern unsigned volatile char PC_MotortestActive; |
extern unsigned char MeineSlaveAdresse; |
extern unsigned char PcZugriff; |
extern unsigned char RemotePollDisplayLine; |
extern int Debug_Timer,Kompass_Timer; |
extern void UART_Init (void); |
extern int uart_putchar (char c); |
extern void boot_program_page (uint32_t page, uint8_t *buf); |
extern void DatenUebertragung(void); |
extern void Uart1Init(void); |
extern void BearbeiteRxDaten(void); |
extern unsigned char MotorTest[16]; |
struct str_DebugOut |
{ |
unsigned char Digital[2]; |
signed int Analog[32]; // Debugwerte |
}; |
extern struct str_DebugOut DebugOut; |
struct str_WinkelOut |
{ |
signed int Winkel[2]; |
unsigned char UserParameter[2]; |
unsigned char CalcState; |
unsigned char Orientation; |
}; |
extern struct str_WinkelOut WinkelOut; |
struct str_Data3D |
{ |
signed int Winkel[3]; // nick, roll, compass in 0,1° |
signed char reserve[8]; |
}; |
extern struct str_Data3D Data3D; |
struct str_ExternControl |
{ |
unsigned char Digital[2]; |
unsigned char RemoteTasten; |
signed char Nick; |
signed char Roll; |
signed char Gier; |
unsigned char Gas; |
signed char Hight; |
unsigned char free; |
unsigned char Frame; |
unsigned char Config; |
}; |
extern struct str_ExternControl ExternControl; |
struct str_VersionInfo |
{ |
unsigned char SWMajor; |
unsigned char SWMinor; |
unsigned char ProtoMajor; |
unsigned char ProtoMinor; |
unsigned char SWPatch; |
unsigned char Reserved[5]; |
}; |
extern struct str_VersionInfo VersionInfo; |
//Die Baud_Rate der Seriellen Schnittstelle ist 9600 Baud |
//#define BAUD_RATE 9600 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 14400 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 28800 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 38400 //Baud Rate für die Serielle Schnittstelle |
#define BAUD_RATE 57600 //Baud Rate für die Serielle Schnittstelle |
//Anpassen der seriellen Schnittstellen Register wenn ein ATMega128 benutzt wird |
#if defined (__AVR_ATmega128__) |
# define USR UCSR0A |
# define UCR UCSR0B |
# define UDR UDR0 |
# define UBRR UBRR0L |
# define EICR EICRB |
#endif |
#if defined (__AVR_ATmega32__) |
# define USR UCSRA |
# define UCR UCSRB |
# define UBRR UBRRL |
# define EICR EICRB |
# define INT_VEC_RX SIG_UART_RECV |
# define INT_VEC_TX SIG_UART_TRANS |
#endif |
#if defined (__AVR_ATmega644__) |
# define USR UCSR0A |
# define UCR UCSR0B |
# define UDR UDR0 |
# define UBRR UBRR0L |
# define EICR EICR0B |
# define TXEN TXEN0 |
# define RXEN RXEN0 |
# define RXCIE RXCIE0 |
# define TXCIE TXCIE0 |
# define U2X U2X0 |
# define UCSRB UCSR0B |
# define UDRE UDRE0 |
# define INT_VEC_RX SIG_USART_RECV |
# define INT_VEC_TX SIG_USART_TRANS |
#endif |
#if defined (__AVR_ATmega644P__) |
# define USR UCSR0A |
# define UCR UCSR0B |
# define UDR UDR0 |
# define UBRR UBRR0L |
# define EICR EICR0B |
# define TXEN TXEN0 |
# define RXEN RXEN0 |
# define RXCIE RXCIE0 |
# define TXCIE TXCIE0 |
# define U2X U2X0 |
# define UCSRB UCSR0B |
# define UDRE UDRE0 |
# define INT_VEC_RX SIG_USART_RECV |
# define INT_VEC_TX SIG_USART_TRANS |
#endif |
#endif //_UART_H |
/branches/thjac/V1_13/version.txt |
---|
0,0 → 1,251 |
------- |
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 |
Baseline V0.71h |
V1_10a T. Jachmann |
- Neutralstellung des Gasknüppels mit autom. Aktivierung der Höhenregelung in Neutralstellung |
- Automatische Kalibrierung (Ermittlung der Neutralstellung) des Gas-Sticks beim Einschalten der FC |
- Bleibt der Knüppel für ca. 0,5 in Neutralstellung, wird die autom. Höhenregelung aktiviert |
- UserParam1 regelt die Empfindlichkeit der initialen 'Loslasserkennung' des Gasknüppels (Achtung: Wert mittels 'MK in der Hand' ermitteln!!!) |
- Höhenbegrenzung entfernt und neue Höhenregelung implementiert |
- MaxHoehe dient jetzt der Begrenzung des Fehlerwertes des Reglers |
- Looping-Funktion entfernt |
- Rotation des Nick/Roll-Sticks um 45°, um ohne Hardware-Anpassung in X-Formation zu fliegen |
- Anpassung der Servo-Nick-Kompensation auf X-Formation |
- Einschalten der LED-Ausgänge beim Starten der Motoren |
- Einführung eines zweiten MinGas-Parameters für Leerlaufgas nach Einschalten der Motoren |
V1_10b T. Jachmann |
- MK wird bei eingeschalteten Motoren mit Stick rechts unten nicht kalibriert |
- Die J16/J17-Frequenz kann bei Unterspannungswarnung erhöht werden |
- Die Pegel von J16/J17 lassen sich invertieren |
- Auch bei ausgeschalteten LED's können diese im Unterspannungsfall zwanghaft aktiviert werden |
V1_10c K. Rheinwald |
- User Parameter Defaults werden gem. Doku gesetzt |
- Die Pegel von J16/J17 werden auch im 'Aus'-Zustand invertiert |
- J16/J17 können getrennt voneinander invertiert werden |
- Einfache PWM auf J16/17 (0,20,40,60,80,100%, getrennt voneinander einstellbar) |
V1_10d K. Rheinwald |
- PWM feiner abgestuft (0-100% in 10% Schritten, getrennt voneinander einstellbar) |
- Timing von J16/17 von 10 auf 20ms verdoppelt -> Timings im MK-Tool müssen halbiert werden |
- PWM funktioniert auch für Timing über PotiX |
- Reihenfolge der User Parameters and Bitfields aufgeräumt - Settings checken! |
- User Parameter Defaults werden bei Initialisierung auf 0 gesetzt |
- Einige Warnings bereinigt |
--- |
V1_11a K. Rheinwald |
- Poti-Offset auf +-125 korrigiert |
- Einige Module gePrettyPrinted |
- Gas Modus wird wirklich automatisch geprüft und nicht forciert. |
- Merge with altcon.c added by T. Jachmann |
- picth_XX ausgelagert |
V1_11b T. Jachmann |
- Neuer MD-ähnlicher Pitch-Modus |
- Kalibrierungsfunktion für Standgas |
- Standgas wird im EEProm abgespeichert |
- Neue Display-Seite für Pitch-Steuerung |
- Fehler in Höhenregelung korrigiert |
- Integralanteil in Höhenregelung vorerst stillgelegt |
V1_11c T. Jachmann |
- Setup-Modus für Pitch-Steuerung "neutral" |
- Parameter für "Loslasserkennung" der Pitch-Steuerung "neutral" liegt jetzt im EEProm (Setting-unabhängig) |
- Erweiterung der Display-Seite für Pitch-Steuerung |
- Sicherung des Pitch-Modus über die Einschalt-Gas-Stick-Position und die Höhenregelung im Setting |
V1-12a T. Jachmann |
- Mit Originalversion 0.74d integriert |
V1_13a T. Jachmann |
- Autostartfunktion eingebaut |
- Weicherer Übergang vom höhengeregelten Flug auf manuelle Kontrolle |
- Parameter überarbeitet |