/branches/FC_075b_ACC-HH_MartinR/FlightCtrl.aps |
---|
0,0 → 1,0 |
<AVRStudio><MANAGEMENT><ProjectName>FlightCtrl</ProjectName><Created>15-May-2007 11:20:41</Created><LastEdit>11-Oct-2007 22:58:54</LastEdit><ICON>241</ICON><ProjectType>0</ProjectType><Created>15-May-2007 11:20:41</Created><Version>4</Version><Build>4, 13, 0, 528</Build><ProjectTypeName>AVR GCC</ProjectTypeName></MANAGEMENT><CODE_CREATION><ObjectFile>default\Flight-Ctrl.elf</ObjectFile><EntryFile></EntryFile><SaveFolder>F:\SVN\MikroKopter\FlightCtrl\branches\V0.64_ZeroWarnings\</SaveFolder></CODE_CREATION><DEBUG_TARGET><CURRENT_TARGET>AVR Simulator</CURRENT_TARGET><CURRENT_PART>ATmega644.xml</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND><HIDE>false</HIDE></IO_EXPAND><REGISTERNAMES><Register>R00</Register><Register>R01</Register><Register>R02</Register><Register>R03</Register><Register>R04</Register><Register>R05</Register><Register>R06</Register><Register>R07</Register><Register>R08</Register><Register>R09</Register><Register>R10</Register><Register>R11</Register><Register>R12</Register><Register>R13</Register><Register>R14</Register><Register>R15</Register><Register>R16</Register><Register>R17</Register><Register>R18</Register><Register>R19</Register><Register>R20</Register><Register>R21</Register><Register>R22</Register><Register>R23</Register><Register>R24</Register><Register>R25</Register><Register>R26</Register><Register>R27</Register><Register>R28</Register><Register>R29</Register><Register>R30</Register><Register>R31</Register></REGISTERNAMES><COM>Auto</COM><COMType>0</COMType><WATCHNUM>0</WATCHNUM><WATCHNAMES><Pane0></Pane0><Pane1></Pane1><Pane2></Pane2><Pane3></Pane3></WATCHNAMES><BreakOnTrcaeFull>0</BreakOnTrcaeFull></DEBUG_TARGET><Debugger><Triggers></Triggers></Debugger><AVRGCCPLUGIN><FILES><SOURCEFILE>uart.c</SOURCEFILE><SOURCEFILE>analog.c</SOURCEFILE><SOURCEFILE>eeprom.c</SOURCEFILE><SOURCEFILE>fc.c</SOURCEFILE><SOURCEFILE>GPS.c</SOURCEFILE><SOURCEFILE>main.c</SOURCEFILE><SOURCEFILE>menu.c</SOURCEFILE><SOURCEFILE>printf_P.c</SOURCEFILE><SOURCEFILE>rc.c</SOURCEFILE><SOURCEFILE>timer0.c</SOURCEFILE><SOURCEFILE>twimaster.c</SOURCEFILE><HEADERFILE>uart.h</HEADERFILE><HEADERFILE>_Settings.h</HEADERFILE><HEADERFILE>analog.h</HEADERFILE><HEADERFILE>fc.h</HEADERFILE><HEADERFILE>gps.h</HEADERFILE><HEADERFILE>main.h</HEADERFILE><HEADERFILE>menu.h</HEADERFILE><HEADERFILE>old_macros.h</HEADERFILE><HEADERFILE>printf_P.h</HEADERFILE><HEADERFILE>rc.h</HEADERFILE><HEADERFILE>Settings.h</HEADERFILE><HEADERFILE>timer0.h</HEADERFILE><HEADERFILE>twimaster.h</HEADERFILE></FILES><CONFIGS><CONFIG><NAME>default</NAME><USESEXTERNALMAKEFILE>NO</USESEXTERNALMAKEFILE><EXTERNALMAKEFILE></EXTERNALMAKEFILE><PART>atmega644</PART><HEX>1</HEX><LIST>1</LIST><MAP>1</MAP><OUTPUTFILENAME>Flight-Ctrl.elf</OUTPUTFILENAME><OUTPUTDIR>default\</OUTPUTDIR><ISDIRTY>1</ISDIRTY><OPTIONS><OPTION><FILE>GPS.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>analog.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>eeprom.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>fc.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>main.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>menu.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>printf_P.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>rc.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>timer0.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>twimaster.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>uart.c</FILE><OPTIONLIST></OPTIONLIST></OPTION></OPTIONS><INCDIRS/><LIBDIRS/><LIBS><LIB>libc.a</LIB><LIB>libm.a</LIB></LIBS><LINKOBJECTS/><OPTIONSFORALL>-Wall -gdwarf-2 -Wstrict-prototypes -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -DVERSION_HAUPTVERSION=0 -DVERSION_NEBENVERSION=64 -DVERSION_KOMPATIBEL=5</OPTIONSFORALL><LINKEROPTIONS></LINKEROPTIONS><SEGMENTS/></CONFIG></CONFIGS><LASTCONFIG>default</LASTCONFIG><USES_WINAVR>1</USES_WINAVR><GCC_LOC>C:\Program Files\WinAVR\bin\avr-gcc.exe</GCC_LOC><MAKE_LOC>C:\Program Files\WinAVR\utils\bin\make.exe</MAKE_LOC></AVRGCCPLUGIN><IOView><usergroups/></IOView><Files><File00000><FileId>00000</FileId><FileName>main.c</FileName><Status>1</Status></File00000><File00001><FileId>00001</FileId><FileName>uart.c</FileName><Status>1</Status></File00001><File00002><FileId>00002</FileId><FileName>menu.c</FileName><Status>1</Status></File00002><File00003><FileId>00003</FileId><FileName>timer0.c</FileName><Status>1</Status></File00003><File00004><FileId>00004</FileId><FileName>fc.c</FileName><Status>1</Status></File00004><File00005><FileId>00005</FileId><FileName>fc.h</FileName><Status>1</Status></File00005><File00006><FileId>00006</FileId><FileName>menu.h</FileName><Status>1</Status></File00006><File00007><FileId>00007</FileId><FileName>TWIMASTER.C</FileName><Status>1</Status></File00007><File00008><FileId>00008</FileId><FileName>twimaster.h</FileName><Status>1</Status></File00008><File00009><FileId>00009</FileId><FileName>uart.h</FileName><Status>1</Status></File00009><File00010><FileId>00010</FileId><FileName>_Settings.h</FileName><Status>1</Status></File00010><File00011><FileId>00011</FileId><FileName>analog.h</FileName><Status>1</Status></File00011><File00012><FileId>00012</FileId><FileName>gps.h</FileName><Status>1</Status></File00012><File00013><FileId>00013</FileId><FileName>main.h</FileName><Status>1</Status></File00013><File00014><FileId>00014</FileId><FileName>old_macros.h</FileName><Status>1</Status></File00014><File00015><FileId>00015</FileId><FileName>printf_P.h</FileName><Status>1</Status></File00015><File00016><FileId>00016</FileId><FileName>rc.h</FileName><Status>1</Status></File00016><File00017><FileId>00017</FileId><FileName>Settings.h</FileName><Status>1</Status></File00017><File00018><FileId>00018</FileId><FileName>timer0.h</FileName><Status>1</Status></File00018></Files><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio> |
/branches/FC_075b_ACC-HH_MartinR/GPS.c |
---|
0,0 → 1,32 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
signed int GPS_Nick = 0; |
signed int GPS_Roll = 0; |
signed int GPS_Nick2 = 0; |
signed int GPS_Roll2 = 0; |
long GpsAktuell_X = 0; |
long GpsAktuell_Y = 0; |
long GpsZiel_X = 0; |
long GpsZiel_Y = 0; |
void GPS_Neutral(void) |
{ |
GpsZiel_X = GpsAktuell_X; |
GpsZiel_Y = GpsAktuell_Y; |
} |
void GPS_BerechneZielrichtung(void) |
{ |
GPS_Nick = 0; |
GPS_Roll = 0; |
} |
/branches/FC_075b_ACC-HH_MartinR/Hex-Files/BootLoader_MEGA644_20MHZ_V0_1.hex |
---|
0,0 → 1,64 |
:10F8000011241FBECFEFD0E1DEBFCDBF11E0A0E0DD |
:10F81000B1E0E0EEFBEF02C005900D92A030B10721 |
:10F82000D9F712E0A0E0B1E001C01D92A230B1070B |
:10F83000E1F70C943B7C0C941D7C0895982F8091EB |
:10F84000C00085FFFCCF9093C60008958091C00052 |
:10F850008823E4F78091C600992708958DE40E94DB |
:10F860001E7C8BE40E941E7C82E40E941E7C8CE441 |
:10F870000E941E7C0895CFEFD0E1DEBFCDBFE0E057 |
:10F88000F0E014915F01772474BE98E10FB6F8940C |
:10F8900090936000109260000FBE7092C5008AE2E3 |
:10F8A0008093C4008091C00082608093C0009093D8 |
:10F8B000C10086E08093C200EF01072D8091C00057 |
:10F8C00087FF0DC0013031F48091C6008A3AB1F152 |
:10F8D00000E005C08091C6008B3109F401E0CE0143 |
:10F8E00021968436910528F11F3F41F0112331F014 |
:10F8F000E0910001F091010109951BC01092C50033 |
:10F900008AE28093C4008AE00E941E7C8DE00E94FF |
:10F910001E7C86E50E941E7C80E30E941E7C8EE297 |
:10F920000E941E7C81E30E941E7C8AE30E941E7C52 |
:10F9300005C080E593EC0197F1F7C0CF0E942E7CC3 |
:10F940000E94267C813611F489E547C1813471F427 |
:10F950000E94267CA82EBB24BA2CAA240E94267CB6 |
:10F960009927A82AB92AB694A79406C1823629F401 |
:10F9700089E50E941E7C81E00BC1823409F083C0BE |
:10F980000E94267C9927D82FCC270E94267C992775 |
:10F99000C82BD92B0E94267C082F12E0812E11E063 |
:10F9A000912EEE24FF2464010894811C911CEC1616 |
:10F9B000FD0618F40E94267C01C08FEFD6018C93BF |
:10F9C0000894E11CF11CBFEFEB16F10461F358F34E |
:10F9D000E4E77E1609F0DEC0063409F03DC0FFEF13 |
:10F9E000AF16F7EFBF0608F033C0DE01A5016627AA |
:10F9F0007727440F551F661F771F6A017B01C2E0FE |
:10FA0000D1E001E08991992729913327322F2227CC |
:10FA1000822B932B0C01FA0100935700E8951124D7 |
:10FA20004E5F5F4F6F4F7F4F129761F785E0F60192 |
:10FA300080935700E89507B600FCFDCF81E18093E5 |
:10FA40005700E89576956795579547955A0194C064 |
:10FA500080E00E941E7C90C0053409F08DC0F50145 |
:10FA60009E01A2E0B1E0E1BD8F2F992782BD8D916B |
:10FA700080BD3196FA9AF99AF999FECF215030401B |
:10FA800091F75F0179C0873609F047C00E94267C54 |
:10FA90009927D82ECC240E94267C9927C82AD92AB7 |
:10FAA0000E94267C863411F5E6016501EE24FF24D0 |
:10FAB000CC0CDD1CEE1CFF1CF60105911491802F6F |
:10FAC0000E941E7C812F99270E941E7C82E090E07C |
:10FAD000A0E0B0E0C80ED91EEA1EFB1E229761F717 |
:10FAE000F694E794D794C79456012ACF853409F049 |
:10FAF00027CF7501E1BC8F2D992782BDF89A089414 |
:10FB0000E11CF11C80B50E941E7C0894C108D1083C |
:10FB1000C114D10479F7570113CF853601F594E765 |
:10FB2000791651F580E090E0A0E0B0E023E0FC0120 |
:10FB300020935700E89507B600FCFDCF80509F4FFB |
:10FB4000AF4FBF4F8F3FE7EF9E07E0E0AE07E0E02B |
:10FB5000BE0768F381E180935700E8950DC08534B6 |
:10FB600069F488E190E02CE00FB6F894A8958093B2 |
:10FB700060000FBE209360008DE02FC08035E1F360 |
:10FB80008C34D1F3803711F483E527C0843721F416 |
:10FB90000E941E7C80E021C0843521F40E94267CD6 |
:10FBA000782EEACF8B3109F4C9CE8A3A09F4C6CE51 |
:10FBB000863529F480E30E941E7C81E30EC08337E2 |
:10FBC00041F489E00E941E7C86E90E941E7C8EE141 |
:10FBD00004C08B3109F4B4CE8FE30E941E7CB0CEFA |
:040000030000F80001 |
:00000001FF |
/branches/FC_075b_ACC-HH_MartinR/Hex-Files/Flight-Ctrl_MEGA644_V0_75a.hex |
---|
0,0 → 1,3111 |
:100000000C94B3030C94CE030C94CE030C94CE0347 |
:100010000C94CE030C94CE030C94CE030C94CE031C |
:100020000C94CE030C94C7150C94CE030C94CE0301 |
:100030000C94D6280C94CE030C94CE030C94CE03CF |
:100040000C94CE030C94CE030C9462140C94CE0347 |
:100050000C946B090C94CE030C9432090C94CE03CF |
:100060000C94EB1A0C94CE030C9491270C94CE03B1 |
:100070000C94A95C0C94CE030C94CE03971B8A1BA2 |
:100080007E1B641B4A1B261B381B661E9A1D971D70 |
:10009000261B841D6A1D4A1D2A1DD81C861CA31BF5 |
:1000A0000628F92746282A281E28B727C827C82740 |
:1000B000CF27EB27E627CB27D327CF27E227EF272A |
:1000C000CB27D327CF27DE27F427CB2758280A0DA5 |
: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 |
:1002800043432D4D6F646529000A0D426174743A31 |
:100290000020332043656C6C732020002034204301 |
:1002A000656C6C73202000204C6F77207761726E34 |
:1002B000696E67206C6576656C3A2025642E25642E |
:1002C000000A0D3D3D3D3D3D3D3D3D3D3D3D3D3DFE |
:1002D0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D4E |
:1002E0003D3D3D3D3D3D0A0D002E000A0D2044419F |
:1002F00043206F7220493243204552524F522120F1 |
:10030000436865636B204932432C2033567265661F |
:100310002C2044414320616E6420424C2D43747272 |
:100320006C005B25695D005B25695D002B204D69D4 |
:100330006B726F4B6F70746572202B0048573A5682 |
:1003400025642E25642053573A25642E25642563A1 |
:100350000053657474696E673A25642025730049FB |
:100360003243204552524F52212121004D6973736F |
:10037000696E6720424C2D4374726C3A25642121CA |
:100380000028632920486F6C67657220427573737B |
:1003900000486F6568653A202020202025356900D7 |
:1003A000536F6C6C486F6568653A20253569004C61 |
:1003B000756674647275636B3A20253569004F6603 |
:1003C000662020202020203A20253569004B6569D1 |
:1003D0006E65200048F668656E726567656C756EBF |
:1003E0006700616B742E204C616765004E69636B1A |
:1003F0003A20202020202025356900526F6C6C3A6D |
:10040000202020202020253569004B6F6D706173FE |
:10041000733A202020253569004B313A2534692074 |
:10042000204B323A25346920004B333A2534692079 |
:10043000204B343A25346920004B353A2534692065 |
:10044000204B363A25346920004B373A2534692051 |
:10045000204B383A25346920004E693A253469200A |
:1004600020526F3A253469200047733A25346920B9 |
:100470002047693A253469200050313A25346920F3 |
:100480002050323A253469200050333A253469200F |
:100490002050343A25346920004779726F202D208E |
:1004A00053656E736F72004E69636B20253469204B |
:1004B000282533692E25692900526F6C6C2025345C |
:1004C0006920282533692E2569290047696572202E |
:1004D000253469202825336929004E69636B20255E |
:1004E000346920282533692E25782900526F6C6CD9 |
:1004F0002025346920282533692E2578290047696D |
:10050000657220253469202825336929004E6963E6 |
:100510006B2025346920282533692928253369294A |
:1005200000526F6C6C2025346920282533692928F6 |
:1005300025336929004769657220253469202825FB |
:10054000336929282533692900414343202D20534D |
:10055000656E736F72004E69636B202534692028C5 |
:100560002533692900526F6C6C20253469202825B9 |
:1005700033692900486F63682025346920282533B2 |
:100580006929005370616E6E756E673A20202535BB |
:100590006900456D70662E506567656C3A25356952 |
:1005A000004B6F6D7061737320202020202020008D |
:1005B0005269636874756E673A2020253569004D6D |
:1005C000657373776572743A20202535690053741A |
:1005D0006172743A202020202025356900506F7404 |
:1005E00069313A202025336900506F7469323A200E |
:1005F0002025336900506F7469333A202025336910 |
:1006000000506F7469343A202025336900536572B5 |
:10061000766F202000536574706F696E74202025FA |
:100620003369005374656C6C756E673A20253369C5 |
:100630000052616E67653A2533692D25336900459F |
:10064000787465726E436F6E74726F6C2020004E0A |
:10065000693A2534692020526F3A253469200047D1 |
:10066000733A253469202047693A253469200048C7 |
:10067000693A253469202043663A253469200042CE |
:100680004C2D4374726C204572726F72732000207F |
:100690002533642020253364202025336420202541 |
:1006A0003364200020253364202025336420202556 |
:1006B0003364202025336420002025336420202546 |
:1006C0003364202025336420202533642000424CED |
:1006D0002D4374726C20666F756E64200020256354 |
:1006E0002020202563202020256320202025632032 |
:1006F0000020256320202025632020202563202042 |
:1007000020256320002025632020202D2020202D5F |
:100710002020202D003130003131003132000A0D0F |
:10072000506C6561736520636F6E6E6563742053F2 |
:1007300070656B7472756D2072656365697665723C |
:1007400020666F722062696E64696E67204E4F5733 |
:100750002E2E2E006F6B2E0A0D0054696D656F757D |
:10076000742E0A0D000011241FBECFEFD0E1DEBFB2 |
:10077000CDBF13E0A0E0B1E0E8E8FFEB02C00590D8 |
:100780000D92A03DB107D9F719E0A0EDB3E001C08B |
:100790001D92A539B107E1F70C9473040C94000085 |
:1007A000282FFB018150853008F023E0842F992702 |
:1007B000332721503040829FD001839FB00D929FFC |
:1007C000B00D1124AC59BF4F019724F00E94A65FD1 |
:1007D0000192FACF0E94285B0895863038F085E0B8 |
:1007E000A2E0B0E0082E0E94B35F08958823C1F70D |
:1007F0000895582F863048F155E0842F9927252FEA |
:10080000332721503040829FD001839FB00D929FAB |
:10081000B00D1124AC59BF4FFB01019724F001909A |
:100820000E94B35FFACFA2E6B0E0042E0E94B35F4D |
:10083000A0E5B0E088E0FB01182E0E94BF5F852F85 |
:100840000E94ED030E94285B08958823B1F6089565 |
:10085000CF93A2E0B0E00E94A65F802DC82F815008 |
:10086000853020F0C3E08C2F0E94ED038C2F992758 |
:10087000CF91089580916208E82FFF27EE0FFF1FA8 |
:10088000E05DF74F808191818D5E9F4F14F0109253 |
:100890000301808191818A5B9F4F24F48091030141 |
:1008A000882319F02091FD0617C081E08093030191 |
:1008B0002091FD06280F2093FD06253038F088EEA4 |
:1008C00093E09093F4038093F30306C066E970E02D |
:1008D000822F0E941F2CE6CF822F99279093CB075F |
:1008E0008093CA070895CFEFD0E1DEBFCDBF14B823 |
:1008F00015B8C7EED3E0E297D7FFFDCF189B53C1E1 |
:10090000199B5CC12DE02093020181E887B93E9AD2 |
:100910008FEF88B98BE184B981E085B98EE38AB91C |
:1009200087E48BB9469A84B7877F84BF8091600043 |
:100930008861809360001092600080ED97E0909352 |
:10094000F4038093F30310926304109262041092F4 |
:1009500035081092340810926504109264041092C5 |
:10096000670410926604243108F423C188E894E0F7 |
:10097000A0E0B0E08093860390938703A093880360 |
:10098000B09389032A3009F449C1243109F446C1DE |
:10099000289A0E94B0150E9481150E94A30E0E9401 |
:1009A000C1280E94B9190E9450270E94B357789419 |
:1009B0008EEC90E09F938F931F920E94CD110F9029 |
:1009C0000F900F9081E690E09F938F938BE490E0DF |
:1009D0009F938F931F921F92809102016AE00E9461 |
:1009E000365F892F99279F938F93809102010E94F0 |
:1009F000365F99279F938F9384EF90E09F938F9317 |
:100A00001F920E94CD118091C8002DB73EB7235F81 |
:100A10003F4F0FB6F8943EBF0FBE2DBF803209F492 |
:100A2000F5C0809102018C3008F0C1C0299A49E0DC |
:100A300062E678E083E00E94D003C8EED3E0DE01F6 |
:100A40000E94A65F802D813009F4BAC088E291E04F |
:100A50009F938F931F920E94CD110F900F900F9034 |
:100A600022E535E0F9018FE0158616861786108A93 |
:100A70008150349687FFF8CF80E480935F058093A0 |
:100A8000600510926105809362058093630590EC88 |
:100A900090936405109265058093660580936705C1 |
:100AA000109268059093690590936A0580936B0591 |
:100AB00010926C0580936D0590936E0581E0809394 |
:100AC000520543E555E08BE0E4E0F1E0DA01019006 |
:100AD0000D928A95E1F78DE4DE01F901182E0E944E |
:100AE000BF5F8091850399279F938F935F934F9367 |
:100AF00089E491E09F938F931F920E94CD112DB7AF |
:100B00003EB7295F3F4F0FB6F8943EBF0FBE2DBFD3 |
:100B10008AE691E09F938F931F920E94CD111092CD |
:100B200034041092F7030E94063A0F900F900F9032 |
:100B30008091F7038823E1F31092340480ED97E06D |
:100B40000E944515EC01EE24FF240CE7C02E01E0C5 |
:100B5000D02E1092F7030E94063A8091F703882363 |
:100B6000E1F3F701EE0FFF1FEE0FFF1FEE5AFA4FF2 |
:100B7000858518160CF054C087010C5D174FCE0107 |
:100B80000E944E15882309F04EC0D8018C9188230D |
:100B900009F049C08093F7030E94063A8091F70359 |
:100BA0008823E1F3ECCF199B2FC024E1ACCE299828 |
:100BB0003ECF8BE095E0A0E0B0E0DCCE2BE0A3CE12 |
:100BC000A1E0B0E00E94A65F802D8F3F09F43ECFE8 |
:100BD0001092850322E535E08DE4DE01F901182E3F |
:100BE0000E94AE5F90918503F9013D962FE08081D0 |
:100BF000349618160CF49F5F215027FFF8CF90937E |
:100C0000850343E555E06DCF2AE07DCE8091CA0093 |
:100C1000863009F006CF0E94B05B03CF2898B9CE8A |
:100C200087010C5D174FF80180818823E1F587016A |
:100C30000F5F1F4F78010C30110508F48ACFEE24A6 |
:100C4000FF24B0E8CB2EB1E0DB2E23C0F701EE0F7E |
:100C5000FF1FEE0FFF1FEE5AFA4F85851816FCF4A2 |
:100C600087010F5F1F4F1F930F93DF92CF929F93C8 |
:100C70000E94CD110F900F900F900F900F9028E0D1 |
:100C800038E0E20EF31ED7011C9278010C301105FA |
:100C9000D0F4F701EC5DF74F90819923B9F2870109 |
:100CA0000F5F1F4FECCF87010F5F1F4F1F930F93F5 |
:100CB000DF92CF921F920E94CD110F900F900F9054 |
:100CC0000F900F90B7CF8EE991E09F938F931F9273 |
:100CD0000E94CD110F900F900F90A1E0B0E00E9404 |
:100CE000A65F802D8C3409F090C1A4E0B0E00E9492 |
:100CF000A65F802D853008F04AC20E94280441E694 |
:100D000062E678E00E94D0030E94280499279F930E |
:100D10008F9382E292E09F938F931F920E94CD1156 |
:100D200080916A080F900F900F900F900F9080FDA8 |
:100D300067C20E946637809102018A3009F45EC260 |
:100D4000843109F45BC2289A80ED97E09093F40314 |
:100D50008093F30385E58093FF068FE592E09F93F0 |
:100D60008F931F920E94CD1180916A080F900F906F |
:100D70000F9082FF40C28BE692E09F938F931F9269 |
:100D80000E94CD110F900F900F900E94321F88E8A3 |
:100D900093E19093AA038093A90381E08093FE06D8 |
:100DA00089E892E09F938F931F920E94CD118091CA |
:100DB0007B080F900F900F90823308F4F3C180935B |
:100DC0000001809100016AE00E94365F892F992717 |
:100DD0009F938F93809100010E94365F99279F9384 |
:100DE0008F9387EA92E09F938F931F920E94CD1179 |
:100DF000ADB7BEB717960FB6F894BEBF0FBEADBF66 |
:100E000081EC92E09F938F931F920E94CD110F90DF |
:100E10000F900F908091F703882309F48FC0809181 |
:100E20001903882309F48AC01092F7038091FD0604 |
:100E3000882309F48BC00E943A040E94063A20914C |
:100E400002012A3009F48BC0243109F488C0289AA1 |
:100E500080910F03882309F488C0815080930F0389 |
:100E600080916804882309F493C0809168048150BC |
:100E70008093680480913E05882369F081508093B7 |
:100E80003E05882341F410923C0510923B051092D8 |
:100E90003A05109239058091A9039091AA03019710 |
:100EA0009093AA038093A9038091A9039091AA0328 |
:100EB000892B29F080913304882309F46FC0809135 |
:100EC000A9039091AA03892B09F46EC080911203A3 |
:100ED000909113038F5F9F4F09F476C08091F703C1 |
:100EE000882321F080915F04882311F40E94DE0E94 |
:100EF0000E94CC0BCE010E944E158823E9F0809110 |
:100F00000001282F3327809127039091280382170F |
:100F1000930744F480911203909113038F5F9F4FC6 |
:100F200009F466C00E944F5A84E08093F20384E182 |
:100F300090E00E944515EC010E94375B8091F2031E |
:100F4000882309F067CF0E94935A64CF0E94CA3D5C |
:100F50000E94063A209102012A3009F075CF2898A4 |
:100F600080910F03882309F078CF809309071092AE |
:100F700048041092470410924604109245041092BF |
:100F800044041092430480916804882309F06DCFD3 |
:100F900080916F00806280936F006CCF2A3031F1B6 |
:100FA000243121F1289A9ACF0E94662785E090E0AB |
:100FB0009093AA038093A903809112039091130345 |
:100FC0008F5F9F4F09F08ACF80915F04882309F4D7 |
:100FD00085CF80E197E29093F4038093F30380E858 |
:100FE00090E0909313038093120378CF289876CFE4 |
:100FF00080E797E19093F4038093F30380E093E01C |
:1010000090931303809312038DCF0E94E72984EC01 |
:1010100091E09F938F931F920E94CD11E1E09E2E4D |
:101020000F900F900F9000E510E078010894E11CFC |
:10103000F11C72E0C72ED12CC00ED11E63E0A62E8B |
:10104000B12CA00EB11E54E0652E712C600E711EE5 |
:1010500045E0442E512C400E511E36E0232E312CFB |
:10106000200E311EE2E09E1609F48BC0F3E09F16BD |
:1010700009F48AC023E0291508F483C08091020195 |
:10108000843168F085E080937A08109296088BE1AD |
:10109000809376088EE48093930880939408D80117 |
:1010A0000E94A65F802D8C3008F068C0D7010E9496 |
:1010B000A65F802D8C3008F061C0D6010E94A65F2B |
:1010C000802D8C3008F05AC0D5010E94A65F802D7B |
:1010D0008C3008F053C0D8010E94A65F802D809309 |
:1010E0006208D7010E94A65F802D80936308D60115 |
:1010F0000E94A65F802D80936408D5010E94A65FA0 |
:10110000802D80936508D3010E94A65F802D809377 |
:101110006608D2010E94A65F802D80936708D101E6 |
:101120000E94A65F802D80936808A7E5B0E00E942A |
:10113000A65F802D8093690831E0931651F483ED0A |
:1011400091E09F938F931F920E94CD110F900F906B |
:101150000F9041E662E678E0892D0E94F9039394AE |
:1011600095E0991508F07ECF83E00E94ED038CE4B2 |
:10117000A1E0B0E0082E0E94B35FB7CD0E94CE2957 |
:10118000E8CF0E949F2A7ACF0E94542B77CF8BE022 |
:1011900092E09F938F931F920E94CD110F900F901A |
:1011A0000F90ABCD84EF91E00E944515EC01CE018C |
:1011B0000E944E158823D9F380912703909128032C |
:1011C00082389105F4F580917B0823E0829FC0016D |
:1011D00011248093000168EC70E0822F0E941F2C84 |
:1011E00081E992E09F938F931F920E94CD110F90FF |
:1011F0000F900F90E6CD87E792E0BFCD2898A4CD61 |
:101200008AE392E09F938F931F920E94CD1188EE04 |
:1012100093E00E944515EC010E94BF190F900F90BA |
:101220000F90CE010E944E158823D9F38AE592E0F3 |
:101230009F938F931F920E94CD110F900F900F904C |
:1012400078CD80917B089927880F991F880F991F67 |
:101250008093000168EC70E084E00E941F2C8CE910 |
:1012600092E0C0CF1F920F920FB60F9211248F936E |
:101270009F93EF93FF93809111038823A9F48091AA |
:10128000E3039091E4030196FC01E155FA4FE081FC |
:10129000ED3079F08639910561F09093E403809305 |
:1012A000E303E093C6000EC01092E4031092E30340 |
:1012B00009C01092E4031092E30381E080931103CC |
:1012C000E093C600FF91EF919F918F910F900FBE19 |
:1012D0000F901F9018951F920F920FB60F92112426 |
:1012E0002F933F934F935F938F939F93AF93BF93AE |
:1012F000EF93FF9390E08091C6008093DB035091C1 |
:10130000E903563910F09093EA038091DB038D30A6 |
:1013100091F02091EA03822F99278130910509F4F9 |
:101320006CC0823091050CF48EC0029709F47FC026 |
:101330001092EA03A8C02091EA03223061F790934B |
:10134000EA03852F9927845F984FFC0132974081EB |
:101350002091E5033091E603241B3109DC0111974C |
:101360008C91281B3109C9019F709093E6038093EB |
:10137000E5030024880F991F001C880F991F001C8B |
:10138000892F902D982F935C9093E7032F733070E3 |
:10139000235C2093E8038081891709F46EC090E0F4 |
:1013A0008091D8038F5F8093D8033091DA03332381 |
:1013B00009F069C0992309F466C081E08093DA03DB |
:1013C000580F5093D7035150E52FFF27E45FF84F94 |
:1013D0008DE0808380910E07823509F054C088E14A |
:1013E00090E02CE00FB6F894A895809360000FBEB3 |
:1013F000209360003093F10346C02F5F2093EA03EF |
:10140000E52FFF27E45FF84F8091DB0380835F5F68 |
:101410005093E9032091DB038091E5039091E6036B |
:10142000820F911D9093E6038093E5032CC0E52F76 |
:10143000FF27E45FF84F8091DB038083563938F350 |
:101440001092EA03E7CF892B09F072CF8091DB037A |
:10145000833259F08091DB0380930C0781E0809305 |
:10146000E9038091DB039927DDCF8091DA0388239C |
:1014700089F781E08093EA03EDCF8C91821709F020 |
:101480008ECF91E092CFFF91EF91BF91AF919F915D |
:101490008F915F914F913F912F910F900FBE0F90C1 |
:1014A0001F901895AC01A0E0B0E09D01A817B90706 |
:1014B00048F4EFEAF5E08191280F311D1196A41749 |
:1014C000B507C8F33F70FD01E155FA4FC90100248B |
:1014D000880F991F001C880F991F001C892F902DC1 |
:1014E000835C80831196FD01E155FA4F2F733070B4 |
:1014F000822F835C8083A055BA4F8DE08C9310922D |
:1015000011038091AF058093C6000895BF92CF92DA |
:10151000DF92EF92FF920F931F93CF93DF93CDB79C |
:10152000DEB72C859D857E85BB2483E28093AF0545 |
:101530009F599093B0052093B10503E010E0772305 |
:1015400009F4ADC0CF84D88843E1E42EF12CEC0E31 |
:10155000FD1EA989BA897150109709F4A0C010978F |
:1015600009F43CC0F601EB0DF11DB3949081119785 |
:1015700089F47723A1F1F70122E030E0E20EF31EB7 |
:10158000D701C080D180E20EF31E0D90BC91A02D3A |
:10159000BB247150109719F1F601EB0DF11DB394B6 |
:1015A0004081119709F466C01097D1F0F601EB0D58 |
:1015B000F11DB39460811197A1F4772391F0F701A5 |
:1015C0003296D701CD90DC9032E0E32EF12CEE0E76 |
:1015D000FF1EA081B181BB24715003C090E040E0A8 |
:1015E00060E0F801E155FA4F892F86958695835C76 |
:1015F00080830F5F1F4FF801E155FA4F892F99271C |
:101600008370907082959295907F9827807F98271D |
:1016100055279A01329522952F7023273F70232753 |
:10162000822B835C80830F5F1F4FF801E155FA4FD7 |
:101630004F705070440F551F440F551F862F992728 |
:101640000024880F991F001C880F991F001C892FE8 |
:10165000902D842B835C80830F5F1F4FF801E15531 |
:10166000FA4F6F73635C60830F5F1F4F109709F031 |
:1016700076CF15C0772309F4B3CFF701A2E0B0E02D |
:10168000EA0EFB1ED701C080D18022E030E0E20EDE |
:10169000F31E0D90BC91A02DBB24715085CFC801C5 |
:1016A0000E94520ADF91CF911F910F91FF90EF900E |
:1016B000DF90CF90BF900895A3E07A2F4091D70399 |
:1016C000465009F45FC0E72FFF27E45FF84F8081A1 |
:1016D0008D537F5FE72FFF27E45FF84F20812D5365 |
:1016E0007F5FE72FFF27E45FF84F30813D537F5F37 |
:1016F000E72FFF27E45FF84F60816D537F5F9927E5 |
:10170000880F991F880F991F522F52955F70582B81 |
:10171000822F99278F70907082959295907F98274D |
:10172000807F9827232F26952695282B832F99276E |
:101730008370907000249695879507949695879569 |
:101740000794982F802D682B41504F3FD9F0EA2FF6 |
:10175000FF27E45FF84F5083AF5F41504F3F91F058 |
:10176000EA2FFF27E45FF84F2083AF5F41504F3FE0 |
:1017700049F0EA2FFF27E45FF84F6083AF5F44230F |
:1017800009F0A1CF8FE097E09093D6038093D50323 |
:10179000A350A093D4030895CF93DF93CDB7DEB7C2 |
:1017A00022970FB6F894DEBF0FBECDBF8091DA034B |
:1017B000882309F4ABC20E945C0B80910D0782362E |
:1017C00009F471C080910E0799278436910509F4B8 |
:1017D00057C08536910584F58136910509F44EC1CF |
:1017E000823691050CF4C2C08236910509F49AC183 |
:1017F00083369105C1F48091D0039091D103892B58 |
:1018000009F04BC2A091D503B091D6039C919923C6 |
:1018100009F039C29C918AE0989FC00111249093ED |
:10182000D1038093D0031092DA031092D603109262 |
:10183000D5031092D4036AC28C36910509F410C105 |
:101840008D3691050CF0B3C08736910509F42BC194 |
:101850008836910541F78FEF80930F03E091D50310 |
:10186000F091D603808190912E04892B80932E04D1 |
:10187000882311F01092DC0381E08093E003D3CF42 |
:10188000E091D503F091D60390818AE0989FC00142 |
:10189000112490930D0380930C03892B21F281E096 |
:1018A0008093DF03C0CF80910E0799278037910581 |
:1018B00009F4F2C0813791050CF485C08337910596 |
:1018C00009F45BC1843791050CF03CC18137910567 |
:1018D00009F078CFA091D503B091D6038C918F3FBA |
:1018E00009F408C28C91882309F0FFC181E08C9330 |
:1018F000A091D503B091D60341E662E678E08C91E1 |
:101900000E94D003809111038823E1F3E091D50375 |
:10191000F091D603808189838CE48A8381E690E00C |
:101920009F938F9382E698E09F938F9321E030E01E |
:101930003F932F93CE0102969F938F933F932F93C4 |
:10194000CE01820F931F9F938F9383E08F9381E04B |
:101950008F9381E58F930E94860AADB7BEB71F961D |
:101960000FB6F894BEBF0FBEADBF2CCF8B34910520 |
:1019700009F059CFE091D503F091D6038081918190 |
:1019800090937B0480937A042091780430917904B9 |
:10199000821B930B845E9D4F68E671E00E94565F48 |
:1019A000845B904090937704809376043CCF843797 |
:1019B000910509F47CC08637910509F034CF81E0A8 |
:1019C0008093DE0330CF8D36910529F18E36910557 |
:1019D0000CF093C08B34910509F0F4CEA091D5039F |
:1019E000B091D6038D919C9190937B0480937A045F |
:1019F0002091780430917904821B930B845E9D4F73 |
:101A000068E671E00E94565F845B90409093770493 |
:101A100080937604D7CE809111038823E1F3A091BF |
:101A2000D503B091D6039C91913009F43BC1198242 |
:101A300081E090E09F938F93CE0101969F938F93C7 |
:101A400081E08F938F938DE48F930E94860A8DB7E8 |
:101A50009EB707960FB6F8949EBF0FBE8DBFB2CE4D |
:101A60008FEF80930F03E091D503F091D60380812F |
:101A700080932F0481E08093E103D5CEE091D503DC |
:101A8000F091D603E081E03258F08FE180931003AB |
:101A90008FEF80930F03C7CE81E08093DD0392CE5A |
:101AA000E0931003F5CF81E08093E203BCCE8091F8 |
:101AB000D703853108F4D6C0E091D503F091D60361 |
:101AC00080E1A7EEB6E001900D928A95E1F7809152 |
:101AD00011038823E1F31F9280910E038F9384E515 |
:101AE0008F930E94860A8AEF8093D2038FEF8093B0 |
:101AF0000F030F900F900F9096CE8E36910509F040 |
:101B000061CE809111038823E1F38DE490E09F93EF |
:101B10008F9382E595E09F938F9381E08F938F93CE |
:101B20008EE492CFA091D503B091D6038BE0EFEF76 |
:101B3000F6E00D9001928A95E1F780910807809375 |
:101B4000E407A6CF8437910509F03CCE8091D703F6 |
:101B5000853108F4B8C0A091D503B091D60380E1D7 |
:101B6000E7EEF6E00D9001928A95E1F780EF809321 |
:101B7000D2038FEF80930F0325CE2091D5033091B0 |
:101B8000D603F90180818150853018F481818C342D |
:101B9000E9F01982809111038823E1F381E090E05C |
:101BA0009F938F93CE0101969F938F9381E08F93A4 |
:101BB0008F9383E58F930E94860AEDB7FEB7379621 |
:101BC0000FB6F894FEBF0FBEEDBFFCCD62E678E025 |
:101BD00081E62E5F3F4FDB01F901982F01900D92B6 |
:101BE0009A95E1F722503040482FD9018C910E94FC |
:101BF000F903809193089927AA27BB27BC01CD013F |
:101C000024EC39E040E050E00E94175FDC01CB019A |
:101C10008093A3039093A403A093A503B093A6037A |
:101C2000809194089927AA27BB27BC01CD010E9467 |
:101C3000175FDC01CB0180939F039093A003A093D7 |
:101C4000A103B093A203E091D503F091D603808164 |
:101C50000E94ED030E94280489836EE670E00E94D2 |
:101C60001F2C98CFE091D503F091D603808191810C |
:101C7000A281B3818093E7069093E806A093E906DA |
:101C8000B093EA0624CF8AE0989FC00111240E94F5 |
:101C900045159093AE058093AD05A091D503B09105 |
:101CA000D603B8CD42E555E08DE4FA01282F0D901A |
:101CB00001922A95E1F7A8EEB3E0FA01182E0E94EE |
:101CC000BF5F9983B5CEA091D503B091D6038D9116 |
:101CD0009D910D90BC91A02D8093E7069093E8060E |
:101CE000A093E906B093EA0641CF863008F404CE0B |
:101CF00085E0FDCD0E942804E091D503F091D60344 |
:101D00008083A091D503B091D603ECCD22960FB677 |
:101D1000F894DEBF0FBECDBFDF91CF910895CF9372 |
:101D2000C82F8A3029F08091C00085FFFCCF04C005 |
:101D30008DE00E948F0EF7CFC093C60080E090E048 |
:101D4000CF910895089588E18093C1008091C000EB |
:101D500082608093C0008091C10080688093C10040 |
:101D60008091C10080648093C1008AE28093C400A6 |
:101D700080910C0390910D030E9445159093DC0611 |
:101D80008093DB068CED90E00E94451590930B0745 |
:101D900080930A071092DD068BE48093DE06109292 |
:101DA000E1068AE08093DF0681E08093E0061092EE |
:101DB000D6031092D5031092D4030895EF92FF92A8 |
:101DC0000F931F9380911103882309F478C28091A7 |
:101DD000E003882309F082C08091E103882329F081 |
:101DE00080911103882309F07FC18091DE0388234D |
:101DF00029F080911103882309F05BC18091E203EF |
:101E0000882329F080911103882309F036C180913D |
:101E10000A0790910B070E944E15882329F08091A4 |
:101E20001103882309F0C8C080910C0390910D0321 |
:101E3000892B09F084C18091DF03882329F08091E8 |
:101E40001103882309F00FC28091D0039091D10330 |
:101E5000892B09F07EC1209110032F3F59F180E1B9 |
:101E600090E09F938F93822F992782959295907FF0 |
:101E70009827807F9827845F9E4F9F938F9381E060 |
:101E800090E09F938F9380E193E09F938F9382E004 |
:101E90008F9381E08F9381E48F930E94860A8FEF66 |
:101EA000809310038DB79EB70B960FB6F8949EBF24 |
:101EB0000FBE8DBF8091E407882329F08091110324 |
:101EC000882309F05EC08091DD03882309F4F7C1FF |
:101ED00080911103882309F4F2C139C08091110364 |
:101EE000882309F479CF0E943B1F84E190E09F93FF |
:101EF0008F939091DC0384E1989FC0011124865D4B |
:101F00009C4F9F938F9381E090E09F938F938CEDF4 |
:101F100093E09F938F9382E08F9381E08F9388E487 |
:101F20008F930E94860A8091DC038F5F2DB73EB7A6 |
:101F3000255F3F4F0FB6F8943EBF0FBE2DBF8430D4 |
:101F400008F4B8C11092DC031092E00345CF86E19B |
:101F500090E09F938F9380E398E09F938F9381E02D |
:101F60008F938F9380E58F930E94860A1092DD03F2 |
:101F70008DB79EB707960FB6F8949EBF0FBE8DBF64 |
:101F80009EC181E090E09F938F9384EE97E09F93B2 |
:101F90008F9381E08F938F9382E48F930E94860AC0 |
:101FA0001092E4072DB73EB7295F3F4F0FB6F89464 |
:101FB0003EBF0FBE2DBF87CF809176089927880F2F |
:101FC000991F880F991F7C010027F7FC0095102F9F |
:101FD0008091B4049091B504A091B604B091B70477 |
:101FE000BC01CD01A80197010E948B5F3093F806D8 |
:101FF0002093F7068091AC049091AD04A091AE04BB |
:10200000B091AF04BC01CD01A80197010E948B5F84 |
:102010003093FA062093F906809150048093FB06D2 |
:1020200080914F048093FC0688E090E09F938F930B |
:1020300087EF96E09F938F9381E08F9383E08F9358 |
:1020400087E78F930E94860A8091FD062DB73EB7E1 |
:10205000295F3F4F0FB6F8943EBF0FBE2DBF8530AE |
:1020600018F086E08093FD0683E690E00E94451517 |
:1020700090930B0780930A07D7CE8BE090E09F9355 |
:102080008F938FEF96E09F938F9381E08F93809152 |
:102090000E038F9387E48F930E94860A1092E203C7 |
:1020A0008DB79EB707960FB6F8949EBF0FBE8DBF33 |
:1020B000AECE8AE090E09F938F938DED96E09F9354 |
:1020C0008F9381E08F938F9386E58F930E94860A8A |
:1020D0001092DE032DB73EB7295F3F4F0FB6F8943D |
:1020E0003EBF0FBE2DBF8ACE0E943B1F80E590E011 |
:1020F0009F938F938AE293E09F938F9321E030E048 |
:102100003F932F9389E293E09F938F933F932F9375 |
:102110008FE294E09F938F9383E08F9381E08F937E |
:102120008CE48F930E94860A1092E1038DB79EB7CC |
:102130000F960FB6F8949EBF0FBE8DBF56CE8091FE |
:10214000DB069091DC060E944E15882309F077CEBD |
:1021500072CE8091AD059091AE050E944E158823F8 |
:1021600009F479CE80911103882309F474CE80910B |
:1021700076089927880F991F880F991F7C010027DF |
:10218000F7FC0095102F8091B4049091B504A091B4 |
:10219000B604B091B704BC01CD01A80197010E941B |
:1021A0008B5F3093A00520939F058091AC049091A4 |
:1021B000AD04A091AE04B091AF04BC01CD01A80163 |
:1021C00097010E948B5F3093A2052093A105209177 |
:1021D00028093091290940912A0950912B09DA01E7 |
:1021E000C90103E0880F991FAA1FBB1F0A95D1F7E9 |
:1021F000820F931FA41FB51F820F931FA41FB51F2B |
:102200002091860330918703409188035091890380 |
:10221000BC01CD010E948B5F3093A4052093A305E0 |
:102220008EE090E09F938F938FE995E09F938F933B |
:1022300081E08F938F9383E48F930E94860A80912D |
:10224000D0039091D1030E9445159093AE058093E1 |
:10225000AD052DB73EB7295F3F4F0FB6F8943EBF8F |
:102260000FBE2DBFF8CD82E490E09F938F9382EA5A |
:1022700097E09F938F9381E08F938F9384E48F9364 |
:102280000E94860A1092DF038DB79EB707960FB69D |
:10229000F8949EBF0FBE8DBF80910C0390910D03EB |
:1022A000009709F4D1CD0E9445159093DC068093E8 |
:1022B000DB06CACD8093DC031092E0038DCD1F9125 |
:1022C0000F91FF90EF900895982F8091E50781304E |
:1022D00031F0892F0E948F0E282F33270CC0809158 |
:1022E0003004E82FFF27E65DFC4F90838F5F8093DB |
:1022F000300421E030E0C90108950F931F93CF937C |
:10230000DF938C01EB01672B71F0F80181918F0154 |
:102310000E946411219739F0F80181918F010E9488 |
:102320006411219791F7DF91CF911F910F9108953B |
:102330000F931F93CF93DF938C01EB01672B81F0F9 |
:10234000F8010F5F1F4F84910E946411219741F0A3 |
:10235000F8010F5F1F4F84910E946411219781F74C |
:10236000DF91CF911F910F910895CF93C82F181629 |
:1023700034F480E20E946411C1501C16D4F3CF9152 |
:102380000895CF93C82F181634F480E30E94641187 |
:10239000C1501C16D4F3CF9108952F923F924F92C3 |
:1023A0005F926F927F928F929F92AF92BF92CF92E5 |
:1023B000DF92EF92FF920F931F93CF93DF93CDB7EE |
:1023C000DEB7E0970FB6F894DEBF0FBECDBF2696FE |
:1023D0008FAD26972896EEADFFAD289788249924D7 |
:1023E00054018093E50748E4C42ED12CCC0EDD1EA9 |
:1023F0007F01C701F7011491112331F0153221F04B |
:102400000894E11CF11CF6CFB701681B790B09F0A9 |
:1024100095C0112309F43DC20894E11CF11C1FA6CC |
:102420003FA4232C0FEF39A6F7010894E11CF11CFF |
:1024300014911537C9F1812F80628837A9F11032C4 |
:1024400009F440C0133209F48DC01A3209F479C07E |
:102450001D3209F476C01B32C9F11E32C9F11033A6 |
:1024600009F48AC0812F8153893008F07EC060E072 |
:1024700070E0CB01880F991F880F991F880F991F53 |
:10248000860F971F680F791F610F711D6053704091 |
:10249000F7010894E11CF11C1491812F80538A30BC |
:1024A00040F3262E153739F630FE3DC0F60184E0A4 |
:1024B00090E0C80ED91E80809180A280B380103237 |
:1024C00009F0C0CF89A5882309F0AECF19A7ACCFFA |
:1024D000F7010894E11CF11C14911A3209F451C05F |
:1024E00060E070E014C0CB01880F991F880F991F1E |
:1024F000880F991F860F971F680F791F610F711D35 |
:1025000060537040F7010894E11CF11C1491812F75 |
:1025100080538A3040F3EFEF6F3F7E0714F46FEF84 |
:102520007FEF062F86CFF60182E090E0C80ED91E1D |
:10253000808191814C01AA24BB2481CF0E949811F3 |
:1025400068CF1A3251F4F60182E090E0C80ED91E2D |
:10255000208022200CF068CF219490E1392AEFED01 |
:102560003E2262CF98E0392A5FCF1836C9F01C3678 |
:10257000D1F481E0382A58CF34FC56CFF0E23F2A1C |
:1025800053CFF60182E090E0C80ED91E60817181C0 |
:102590009FEF6F3F790714F46FEF7FEF062F44CF63 |
:1025A00024E0322A41CF133609F44DC1143409F422 |
:1025B0001FC1143609F41CC1193609F419C11F349E |
:1025C00009F40FC11F3609F40CC1103709F4F9C022 |
:1025D000133709F4B2C0153509F4ECC0153709F406 |
:1025E000E9C0183509F444C0183709F441C0112373 |
:1025F00009F44FC1CE0101969DA78CA7198381E0F4 |
:10260000482E19A6632C7724042D5FA4541857FC78 |
:102610002DC029A5222331F10F5F050DC301807361 |
:102620009070892B09F42FC1222309F027C166FC81 |
:102630001BC1C30180739070809709F410C1852D70 |
:102640000E94C111842D992787FD9095BC018CA50E |
:102650009DA50E947D1164FECCCE822D801B0E9420 |
:10266000B511C7CE66FED9CF0E5FD7CF5524D1CFD7 |
:10267000E0E1EEA733FE07C081149104A104B10488 |
:1026800011F0F0E43F2A19A60FA707FD02C02FEDB5 |
:102690003222CE0189969DA78CA781149104A104B2 |
:1026A000B10419F49FA5992361F1EEA54E2E55248E |
:1026B0006624772418AA84149504A604B70410F09D |
:1026C000F1E0F8ABC501B401A30192010E94695F7A |
:1026D000DC01CB01082F8A30F0F4005DECA5FDA5EC |
:1026E0000293FDA7ECA7C501B401A30192010E94CA |
:1026F000695F49015A01F8A9FF23E1F62EA52830A8 |
:1027000079F0632C7724CE010196482EFCA54F1A50 |
:1027100028E2420E79CF095A183501F70F7DDECF36 |
:10272000632C772463FEEFCF003369F380E3ECA5DD |
:10273000FDA58293FDA7ECA7E6CFF60182E090E02D |
:10274000C80ED91E0190F081E02DFDA7ECA7EF2B5C |
:1027500081F4FE013196FDA7ECA788E289838EE61D |
:10276000818385E78B838CE68C838D8389E28E83DE |
:102770001F8207FD15C0802F992787FD9095AC011A |
:1027800060E070E08CA59DA50E94305E009731F05E |
:10279000482EFCA54F1A04150CF033CF402E31CF34 |
:1027A000ECA5FDA501900020E9F731974E2E2CA550 |
:1027B000421A27CF153511F481E0382A9AE09EA7F6 |
:1027C00062CFF60182E090E0C80ED91E808191812F |
:1027D0004C01AA24BB2490E19EA7E0E43E2A18E71E |
:1027E00052CF1F3411F4E1E03E2AF8E0FEA74BCFB0 |
:1027F000143411F491E0392A30FE18C0F60184E057 |
:1028000090E0C80ED91E80809180A280B380B7FE70 |
:102810000AC0B094A09490948094811C911CA11C37 |
:10282000B11C8DE289A79AE09EA72ECFF60182E027 |
:1028300090E0C80ED91E808191814C01AA2497FC9A |
:10284000A094BA2CE4CFFE013196FDA7ECA7F601C7 |
:1028500082E090E0C80ED91E80818983D0CE822D7F |
:10286000801B0E94C111EBCE80E38AA71BA762E008 |
:1028700070E0CE018A960E947D11DBCE61E070E0AF |
:10288000CE018996F8CF822D801B0E94B51129A513 |
:10289000CBCEE0960FB6F894DEBF0FBECDBFDF9172 |
:1028A000CF911F910F91FF90EF90DF90CF90BF904D |
:1028B000AF909F908F907F906F905F904F903F90E0 |
:1028C0002F9008951F920F920FB60F9211242F93FD |
:1028D0003F935F936F937F938F939F93AF93BF9338 |
:1028E000EF93FF938091F203882329F08091F20304 |
:1028F00081508093F2038091FA0381508F3F09F455 |
:1029000093C08093FA038091F3039091F403892B91 |
:1029100001F18091F3039091F40301979093F403F4 |
:102920008093F3038091F3039091F40320911203B9 |
:102930003091130382239323892B89F08091020124 |
:102940008A3009F48BC0479A80916A0883FF8DC052 |
:1029500010C08FEF9FEF9093130380931203809129 |
:1029600002018A3009F478C0479880916A0883FF91 |
:102970007CC086B19927FC01E071F07084FF0AC029 |
:102980008091F5039091F60301969093F60380935E |
:10299000F5036BC08091F5039091F603892B49F103 |
:1029A0008091F5039091F6038A56914010F580913D |
:1029B000F5039091F60369E270E00E94425F809116 |
:1029C000F5039091F603860F971F9093F60380937B |
:1029D000F5038091F5039091F6030B9708F440C03E |
:1029E0008091F5039091F6030A9790937B0480936E |
:1029F0007A0480917A0490917B042091780430913C |
:102A00007904821B930B845E9D4F68E671E00E94FF |
:102A1000565F845B90409093770480937604109285 |
:102A2000F6031092F50321C089E08093FA038091A8 |
:102A300014038F5F817080931403882319F481E05D |
:102A40008093F7038091F8039091F9030196909396 |
:102A5000F9038093F80357CF5A9887CF5A9A85CFB6 |
:102A6000F0937B04E0937A04C4CFFF91EF91BF9180 |
:102A7000AF919F918F917F916F915F913F912F9136 |
:102A80000F900FBE0F901F9018952091F803309172 |
:102A9000F903280F391FC901019608952091F80301 |
:102AA0003091F903821B930B892F992786958074A7 |
:102AB00090700895CF93DF930E944515EC01CE01ED |
:102AC0000E944E158823D9F3DF91CF9108951F936B |
:102AD000CF93DF930E944515EC011FEC08C0809155 |
:102AE0001903882321F09093190310937A00CE01E3 |
:102AF0000E944E15982F882391F3DF91CF911F915B |
:102B000008959FB7F8945F983E9A469A8091B000D6 |
:102B10008F708093B0008091B00083608093B0008C |
:102B20008091B1008B738093B1008091B1008B6074 |
:102B30008093B1001092B2008FEF8093B300809128 |
:102B4000B00080688093B000809170008A7F80938D |
:102B50007000809170008260809370009FBF089524 |
:102B60008AE090E00E94451590930204809301044E |
:102B700082E085BD83EA84BD17BC88E788BD86E016 |
:102B800086BD80916E00816080936E0008951F92D3 |
:102B90000F920FB60F9211242F933F934F935F9391 |
:102BA0006F937F938F939F93AF93BF93EF93FF9315 |
:102BB000809102018431C0F48091FB03882309F4E1 |
:102BC00046C02091FC033091FD0341E02F373407CC |
:102BD00008F49CC08FEF8093B3002F5F3040309398 |
:102BE000FD032093FC03B4C38091FB03882349F7C2 |
:102BF0008091B00086FFADC08091B0008F7B809344 |
:102C0000B000E0910004EE2309F0EFC080918C0841 |
:102C1000282F33278DED96E0289FA001299F500D86 |
:102C2000389F500D1124CA012091FE033091FF03FB |
:102C3000821B930B9093FD038093FC031092FF0380 |
:102C40001092FE03469A81E08093FB03BACF8091F5 |
:102C5000B00086FFA8C08091B0008F7B8093B00049 |
:102C600089EA93E09093FD038093FC038091150320 |
:102C7000909116039C01220F331F280F391F80915A |
:102C800092039927880F991F880F991F280F391FC2 |
:102C900037FD35C2C9019595879595958795909390 |
:102CA0001603809315039093EE038093ED038091B8 |
:102CB000B20880FFDDC080918508682F77278827BC |
:102CC00099272091B4043091B5044091B6045091F5 |
:102CD000B70457FDF9C1A7E0559547953795279556 |
:102CE000AA95D1F70E94175F9B01AC0197FD0AC21C |
:102CF000F6E05595479537952795FA95D1F7809148 |
:102D0000ED039091EE03820F931FDCC02F3F31053E |
:102D100069F060F0A9014F5F50404F37510588F4CA |
:102D200080E88093B3002058304059CF8091FC0355 |
:102D30008093B3001092FD031092FC031092FB03EA |
:102D400007C38FEF8093B3005093FD034093FC03C0 |
:102D5000FFC28091B00080648093B0008CEB90E063 |
:102D60009093FD038093FC038091FE039091FF03F9 |
:102D700084549F4F9093FF038093FE038091F1034F |
:102D8000882329F080916804853B08F0FAC0469AB0 |
:102D9000909100049F5F80918C08891708F0EEC025 |
:102DA0001092000450CF8091B00080648093B000F6 |
:102DB00080918C08282F33278DED96E0289FA00165 |
:102DC000299F500D389F500D1124CA012091FE03F8 |
:102DD0003091FF03821B930B9093FD038093FC03C0 |
:102DE0009C0181E08093FB03F0CE89EA93E090930D |
:102DF000FD038093FC038E2F99278130910509F400 |
:102E0000C2C0029709F488C1FF27EE0FFF1FE05DE3 |
:102E1000F74F80819181880F991F2091FC03309199 |
:102E2000FD03820F931F9093FD038093FC03209179 |
:102E3000FC033091FD0355E02D3D350708F450C1EA |
:102E40008CED95E09093FD038093FC039C012C5B3B |
:102E500030403093FD032093FC038091FE0390915A |
:102E6000FF03820F931F9093FF038093FE03EBCE2B |
:102E700080918508682F7727882799272091B404A7 |
:102E80003091B5044091B6045091B70457FD17C175 |
:102E9000E7E05595479537952795EA95D1F70E9434 |
:102EA000175F9B01AC0197FD32C176E055954795C0 |
:102EB000379527957A95D1F78091ED039091EE03A0 |
:102EC000821B930B9093EE038093ED038091860811 |
:102ED000282F3327220F331F220F331F8091ED033A |
:102EE0009091EE03821793077CF080918708282F3A |
:102EF0003327220F331F220F331F8091ED03909150 |
:102F0000EE032817390724F43093EE032093ED03E2 |
:102F10002091ED033091EE038091FC039091FD032D |
:102F2000280F391F205032408091ED039091EE031D |
:102F300097FDE3C095958795959587959093EE03BA |
:102F40008093ED038091ED039091EE039093CD0774 |
:102F50008093CC0745E02D3D340708F4BAC08CEDD2 |
:102F600095E09093FD038093FC032091FC03309146 |
:102F7000FD033093FF032093FE0333CF90930004AF |
:102F800062CE469805CF80911503909116039C015F |
:102F9000220F331F280F391F809192039927880F22 |
:102FA000991F880F991F280F391F37FDA1C1C9012B |
:102FB000959587959595879590931603809315031E |
:102FC0009093EE038093ED038091B20880FF38C1A7 |
:102FD00080918508682F7727882799272091B40446 |
:102FE0003091B5044091B6045091B70457FD8DC19E |
:102FF000E7E05595479537952795EA95D1F70E94D3 |
:10300000175F9B01AC0197FD7BC1B6E055954795D5 |
:1030100037952795BA95D1F78091ED039091EE03FE |
:10302000820F931F9093EE038093ED0380918608A7 |
:10303000282F3327220F331F220F331F8091ED03D8 |
:103040009091EE03821793077CF080918708282FD8 |
:103050003327220F331F220F331F8091ED039091EE |
:10306000EE032817390724F43093EE032093ED0381 |
:103070008091ED039091EE032091FC033091FD03CC |
:10308000820F931F805092409093FD038093FC0326 |
:103090008091ED039091EE0397FD28C1959587955A |
:1030A000959587959093EE038093ED038091ED03C2 |
:1030B0009091EE039093CD078093CC07B8CE215822 |
:1030C0003F4F4F4F5F4FE4CE21583F4F4F4F5F4F21 |
:1030D00002CE51E02737350758F487E791E041CF1A |
:1030E00081E02737380708F0B2CE87E791E0AACE13 |
:1030F0003093FD032093FC0338CF03961BCF2D5F45 |
:103100003F4FC8CD215C3F4F4F4F5F4FF1CD215C0A |
:103110003F4F4F4F5F4FC9CE8091170390911803D7 |
:103120009C01220F331F280F391F8091910399278B |
:10313000880F991F880F991F280F391F37FDDBC093 |
:10314000C9019595879595958795909318038093D8 |
:1031500017039093EC038093EB038091B20881FFF7 |
:103160009AC080918908682F77278827992720910E |
:10317000AC043091AD044091AE045091AF0457FDC2 |
:10318000E2C0A7E05595479537952795AA95D1F7C1 |
:103190000E94175F9B01AC0197FDD0C0F6E05595EA |
:1031A000479537952795FA95D1F78091EB03909144 |
:1031B000EC03820F931F9093EC038093EB038091B9 |
:1031C0008A08282F3327220F331F220F331F8091A5 |
:1031D000EB039091EC03821793077CF080918B08AE |
:1031E000282F3327220F331F220F331F8091EB0329 |
:1031F0009091EC032817390724F43093EC032093C3 |
:10320000EB038091EB039091EC032091FC03309150 |
:10321000FD03820F931F805092409093FD03809393 |
:10322000FC038091EB039091EC0397FD67C09595AB |
:103230008795959587959093EC038093EB03F7CD55 |
:1032400080918508682F7727882799272091B404D3 |
:103250003091B5044091B6045091B70457FD5FC05A |
:10326000A7E05595479537952795AA95D1F70E94E0 |
:10327000175F9B01AC0197FD4DC0F6E05595479552 |
:1032800037952795FA95D1F78091ED039091EE034C |
:10329000821B930BC7CE80918908682F77278827D8 |
:1032A00099272091AC043091AD044091AE04509127 |
:1032B000AF0457FD3EC0E7E05595479537952795F4 |
:1032C000EA95D1F70E94175F9B01AC0197FD2CC0D6 |
:1032D00066E055954795379527956A95D1F7809182 |
:1032E000EB039091EC03821B930B65CF0396D6CE34 |
:1032F0002D5F3F4F5CCE2D5F3F4F22CF039697CF80 |
:10330000215C3F4F4F4F5F4F80CE21583F4F4F4F73 |
:103310005F4F6ECE215C3F4F4F4F5F4FAECF215876 |
:103320003F4F4F4F5F4F9CCF215C3F4F4F4F5F4F01 |
:10333000CFCF21583F4F4F4F5F4FBDCF215C3F4F05 |
:103340004F4F5F4F2BCF21583F4F4F4F5F4F19CFFC |
:10335000FF91EF91BF91AF919F918F917F916F916D |
:103360005F914F913F912F910F900FBE0F901F9043 |
:10337000189510927C008FEC80937A000895EF925C |
:10338000FF920F931F93CF93DF9303E010E0D801D8 |
:103390000E94A65F802DC82FDD27C531D10508F01A |
:1033A0002A97C7BD10920A0484E690E00E94671530 |
:1033B00080911D0390911E038255934010F4C0E04C |
:1033C000D0E0CA3FD105E0F489EEE82E82E0F82E85 |
:1033D000C7BD82E390E00E946715FF92EF921F92B3 |
:1033E0000E94CD1180911D0390911E030F900F90AC |
:1033F0000F908255934020F02196CA3FD10540F3AB |
:10340000D8010C2E0E94B35FC093F3078CE291E0C9 |
:103410000E946715DF91CF911F910F91FF90EF9060 |
:103420000895EF92FF920F931F93CF93DF9300E0E5 |
:1034300000930504009304040093030480ED97E0D7 |
:103440000E944515EC011CE821E0F22E95EFE92ED3 |
:10345000033009F4ABC000E080911604909117048A |
:103460008C5F93400CF091C080911C03815080933D |
:103470001C0380911404909115048C5F93400CF010 |
:1034800079C080911B03815080931B0380911204AB |
:10349000909113048C5F93400CF04AC080911A0302 |
:1034A000815080931A0388E0809336040E94562747 |
:1034B00080911C038A3008F055C0F09205048AE020 |
:1034C00080931C0380911B038A3008F043C0F09264 |
:1034D00004048AE080931B0380911A038A3098F5D4 |
:1034E000F09203048AE080931A03809136048823C3 |
:1034F00079F0CE010E944E158823B9F38BEE92E04D |
:103500009F938F931F920E94CD110F900F900F9059 |
:103510001092EE078FEC80937A008091EE0788235B |
:10352000E1F31A3008F447C0115009F091CF48C0B8 |
:103530008091120490911304875094408CF18091F3 |
:103540001A038F5FAECF863F80F2F0920304E092C1 |
:103550001A03CBCF863F08F4BFCFF0920404E09269 |
:103560001B03BACF863F08F4ADCFF0920504E0927A |
:103570001C03A8CF809114049091150487509440A7 |
:103580008CF080911B038F5F7FCF80911604909108 |
:1035900017048750944044F080911C038F5F67CFDD |
:1035A0000F5F81CF0F5F72CF01E063CF1B3008F454 |
:1035B00052CF19E050CF8AE090E00E946715B4CF57 |
:1035C00086E490E00E946715DF91CF911F910F91E3 |
:1035D000FF90EF9008951F920F920FB60F92112453 |
:1035E000EF92FF920F931F932F933F934F935F930D |
:1035F0006F937F938F939F93AF93BF93CF93DF93FB |
:10360000EF93FF9320911F04822F9927AA27BB27AE |
:103610002F5FFC01429740F4E25CFF4FEE0FFF1F6B |
:103620000590F491E02D099410921F0482E080939C |
:103630001E0480911E0480937C0080911F048823C7 |
:1036400009F4F9C38FEC80937A00F5C320931F042B |
:103650008091780090917900209124043091250484 |
:10366000820F931F909325048093240481E0DFCF81 |
:1036700020931F048091780090917900209122047A |
:1036800030912304820F931F90932304809322048C |
:1036900084E0CDCF20931F04809178009091790031 |
:1036A0002091C2043091C304821B930B9093F207C4 |
:1036B0008093F1078091F1079091F20790932D0488 |
:1036C00080932C0482E0B3CF20931F048091C00428 |
:1036D0009091C1042091780030917900821B930B66 |
:1036E0009093E7078093E6078091E6079091E707BC |
:1036F00090932B0480932A0487E099CF20931F0492 |
:103700008091780090917900909321048093200417 |
:1037100086E08DCF20931F042091780030917900AE |
:10372000309323042093220410921E0482CF20930E |
:103730001F04209178003091790030932504209364 |
:10374000240481E074CF10921F0481E08093190358 |
:10375000809106049091070401969093070480934A |
:10376000060480917800909179002091F6073091BD |
:10377000F707820F931F9093F7078093F6078091C6 |
:10378000EE078F5F8093EE078091EE07853008F497 |
:103790004DCF8091F6079091F70797FD36C3959529 |
:1037A00087959093F7078093F60780917800909122 |
:1037B000790090931E0380931D031092EE07809171 |
:1037C000080490910904BC01660F771F62957295F9 |
:1037D000707F7627607F7627681B790B80919C032A |
:1037E000482F552780910A04282F332727FD30952D |
:1037F0008FEF90E0289F8001299F100D389F100DBA |
:1038000011248091EA079091EB07800F911F20917E |
:10381000F6073091F707821B930B20915D043091DE |
:103820005E04821B930B489F9001499F300D589F67 |
:10383000300D1124620F731F77FDE4C275956795F3 |
:103840007595679575956795759567957595679560 |
:1038500070930904609308048091F6079091F7072C |
:10386000EC01EE27D7FDE095FE2F20911F0330914C |
:1038700020034091210350912203DA01C90163E042 |
:10388000880F991FAA1FBB1F6A95D1F7821B930B44 |
:10389000A40BB50BC80FD91FEA1FFB1FCE01DF0118 |
:1038A0000496A11DB11DB7FDA7C243E0B595A7952C |
:1038B000979587954A95D1F780931F03909320039E |
:1038C000A0932103B09322038091EA079091EB0724 |
:1038D000800F911F20911F033091200340912103FD |
:1038E00050912203821B930B90935E0480935D049E |
:1038F0008091F6079091F70797FD7CC29595879583 |
:103900009093F7078093F60782E091CE20931F04EF |
:1039100020917800309179008091220490912304C5 |
:10392000280F391F809102018A3009F44DC2220FFD |
:10393000331F220F331F3093230420932204C90125 |
:1039400037FD51C29595879595958795959587955E |
:103950009093150480931404809128049091290475 |
:10396000820F931F97FD44C29595879590932904E4 |
:10397000809328042091CA043091CB04821B930BBE |
:10398000909324038093230320911A0430911B0405 |
:103990008091230390912403280F391F37FD25C2FE |
:1039A0003595279530931B0420931A0483E03FCE6E |
:1039B00020931F0420917800309179008091240495 |
:1039C00090912504280F391F809102018A3009F453 |
:1039D000F8C1220F331F220F331F30932504209389 |
:1039E0002404C90137FDFDC1959587959595879567 |
:1039F00095958795909317048093160480912604DB |
:103A000090912704820F931F97FDE9C195958795A3 |
:103A100090932704809326042091CC043091CD0408 |
:103A2000821B930B909326038093250320911C0403 |
:103A300030911D048091250390912603280F391F92 |
:103A400037FDCAC13595279530931D0420931C047A |
:103A500081E0EDCD20931F04809178009091790052 |
:103A60002091C2043091C304821B930B9093F20700 |
:103A70008093F1078091F1079091F20720912C0437 |
:103A800030912D04820F931F90930F0480930E04A6 |
:103A900082E0CDCD20931F048091C0049091C10499 |
:103AA0002091780030917900821B930B9093E70767 |
:103AB0008093E6078091E6079091E70720912A041A |
:103AC00030912B04820F931F909311048093100464 |
:103AD00087E0ADCD20931F04809102018A3009F464 |
:103AE00062C1843109F493C180917800909179008A |
:103AF0002091200430912104820F931F909313048E |
:103B00008093120486E093CD20931F048091780067 |
:103B1000909179002091220430912304820F931F09 |
:103B2000909323048093220410921E0482CD20934C |
:103B30001F0417CE20931F04809178009091790084 |
:103B4000AA2797FDA095BA2FBC01CD010E949D5ECA |
:103B50007B018C018091BA049091BB04A091BC04BC |
:103B6000B091BD049C01AD01C801B7010E943D5E4A |
:103B7000DC01CB01BC01CD010E94805EDC01CB01E8 |
:103B800090930D0480930C0480910C0490910D048B |
:103B900002970CF4BAC08091BA049091BB04A09132 |
:103BA000BC04B091BD0420E030E84BE354E4BC0118 |
:103BB000CD010E94A75E8823DCF58091BA04909124 |
:103BC000BB04A091BC04B091BD042AE037ED43EAE8 |
:103BD0005CE3BC01CD010E943E5EDC01CB01809321 |
:103BE000BA049093BB04A093BC04B093BD0480912D |
:103BF0003D0490913E04845F9140D0F48091BA04DA |
:103C00009091BB04A091BC04B091BD042DEC3CECA0 |
:103C10004CEC5DE3BC01CD010E943E5EDC01CB01BA |
:103C20008093BA049093BB04A093BC04B093BD04EA |
:103C300081E080930B0480917800909179009093BB |
:103C4000E9078093E80780910C0490910D04AA275E |
:103C500097FDA095BA2F20917C0430917D0440916E |
:103C60007E0450917F04820F931FA41FB51F809381 |
:103C70007C0490937D04A0937E04B0937F042091F4 |
:103C80007C0430917D0440917E0450917F0457FD67 |
:103C90009EC07AE055954795379527957A95D1F747 |
:103CA00080917C0490917D04A0917E04B0917F046A |
:103CB000821B930BA40BB50B80937C0490937D0423 |
:103CC000A0937E04B0937F0483E0B1CC20931F04C3 |
:103CD00080912703909128039C01220F331F280F06 |
:103CE000391F809178009091790063E070E00E9424 |
:103CF000425F260F371F36952795369527953093C7 |
:103D000028032093270385E092CC80910C049091A6 |
:103D10000D048F5F9F4F0CF08BCF8091BA04909170 |
:103D2000BB04A091BC04B091BD0420E030E849E0A0 |
:103D300054E4BC01CD010E94AA5E18160CF078CFA5 |
:103D40008091BA049091BB04A091BC04B091BD04D1 |
:103D50002AE037ED43EA5CE3BC01CD010E943D5E01 |
:103D6000DC01CB018093BA049093BB04A093BC0404 |
:103D7000B093BD0480913D0490913E04845F9140D6 |
:103D800008F056CF8091BA049091BB04A091BC0476 |
:103D9000B091BD042DEC3CEC4CEC5DE3BC01CD01DD |
:103DA0000E943D5E3BCF80917800909179002091F8 |
:103DB000200430912104820F931F019696958795D8 |
:103DC0009DCE220F331F09CE220F331FB4CD2150B9 |
:103DD0003C4F4F4F5F4F5DCF2F5F3F4F33CE01962C |
:103DE00015CE079601CE0796ADCD2F5F3F4FD8CDAC |
:103DF0000196BACD019682CDCE01DF010B96A11DB1 |
:103E0000B11D53CD615E7F4F19CD0196C8CC809115 |
:103E10007800909179002091200430912104820F44 |
:103E2000931F2FEF37E0281B390B30931304209397 |
:103E3000120486E0FCCBFF91EF91DF91CF91BF910F |
:103E4000AF919F918F917F916F915F914F913F9132 |
:103E50002F911F910F91FF90EF900F900FBE0F9039 |
:103E60001F90189590E2EAE2F3E08FE4919381507D |
:103E700087FFFCCF08951F93CF93DF9380912F048A |
:103E800020912903281710F420932F0490912E04D9 |
:103E900090FF08C080912F04882309F40CC1815041 |
:103EA00080932F0491FF08C080912F04821709F49A |
:103EB000AAC18F5F80932F04892F992780FF02C0AA |
:103EC00081FDF6C00E94321F90912F049A3008F0B5 |
:103ED000ABC081E180933004892F99279F938F9302 |
:103EE00082E293E09F938F9381E08F930E94CD11A4 |
:103EF0000F900F900F900F900F9080912F04C82F6C |
:103F0000DD27C630D10509F481C1C730D1050CF0D9 |
:103F100095C0C230D10509F433C2C330D1050CF4C9 |
:103F2000CDC0C430D10509F438C525970CF06AC35B |
:103F30001092300480913408909135089F938F93AC |
:103F400080913208909133089F938F9389E194E098 |
:103F50009F938F9311E01F930E94CD1184E1809372 |
:103F600030046DB77EB7695F7F4F0FB6F8947EBFA0 |
:103F70000FBE6DBF80913808909139089F938F9341 |
:103F800080913608909137089F938F9389E294E04F |
:103F90009F938F931F930E94CD1188E280933004EA |
:103FA0008DB79EB707960FB6F8949EBF0FBE8DBF14 |
:103FB00080913C0890913D089F938F9380913A089F |
:103FC00090913B089F938F9389E394E09F938F9305 |
:103FD0001F930E94CD118CE3809330042DB73EB720 |
:103FE000295F3F4F0FB6F8943EBF0FBE2DBF8091A3 |
:103FF0004008909141089F938F9380913E08909143 |
:104000003F089F938F9389E494E09F938F931F932E |
:104010000E94CD116DB77EB7695F7F4F0FB6F894E0 |
:104020007EBF0FBE6DBF36C780E180933004892FFD |
:1040300099279F938F9387E293E054CFCA30D1059D |
:1040400009F458C1CB30D1050CF044C0C830D105BB |
:1040500009F44EC529970CF08AC384E1809330049B |
:1040600080912703909128039F938F9383E895E095 |
:104070009F938F9311E01F930E94CD1188E280934C |
:1040800030040F900F900F900F900F908091680464 |
:1040900099279F938F9382E995E09F938F931F9326 |
:1040A0000E94CD110F900F900F900F900F90F2C6BD |
:1040B00010922F0407CF20932F04F4CE209709F4F9 |
:1040C000CAC1219709F49EC381508093290310929D |
:1040D0002F04E0C6CC30D10509F4E2C3CC30D105C1 |
:1040E0000CF432C22D9781F7109230048EEC96E0DA |
:1040F0009F938F93C1E0CF930E94CD1184E1809371 |
:1041000030040F900F900F908091270899278D967B |
:104110009F938F938091260899278D969F938F93D5 |
:104120008091250899278D969F938F9380912408DD |
:1041300099278D969F938F938DED96E09F938F9304 |
:10414000CF930E94CD1188E2809330048DB79EB743 |
:104150000B960FB6F8949EBF0FBE8DBF80912B08B3 |
:1041600099278D969F938F9380912A0899278D96F2 |
:104170009F938F938091290899278D969F938F9372 |
:104180008091280899278D969F938F9381EF96E0D1 |
:104190009F938F93CF930E94CD118CE38093300433 |
:1041A0002DB73EB7255F3F4F0FB6F8943EBF0FBE09 |
:1041B0002DBF80912C0899278D969F938F9385E032 |
:1041C00097E09F938F93CF930E94CD110F900F9004 |
:1041D0000F900F900F9080912D08882309F02AC628 |
:1041E00080912E08882309F017C680912F08882314 |
:1041F00009F450C688E4809330048BE197E09F93E4 |
:104200008F93CF939BC110922F0456CE10923004FF |
:1042100089E495E09F938F9311E01F930E94CD1145 |
:1042200084E1809330040F900F900F908091C2042E |
:104230009091C3049F938F9380910E0490910F04EB |
:104240009F938F9386E595E09F938F931F930E9492 |
:10425000CD1188E2809330046DB77EB7695F7F4FE0 |
:104260000FB6F8947EBF0FBE6DBF8091C0049091D1 |
:10427000C1049F938F9380911004909111049F9398 |
:104280008F9385E695E09F938F931F930E94CD11A6 |
:104290008CE3809330048DB79EB707960FB6F894E1 |
:1042A0009EBF0FBE8DBF8091BA049091BB04A091B8 |
:1042B000BC04B091BD04BC01CD010E94805EDC0154 |
:1042C000CB019F938F938091DF089091E0089F939B |
:1042D0008F9384E795E09F938F931F930E94CD1156 |
:1042E0002DB73EB7295F3F4F0FB6F8943EBF0FBEC4 |
:1042F0002DBFD0C5109230048DE096E09F938F9330 |
:1043000011E01F930E94CD1184E1809330040F903F |
:104310000F900F908091920399279F938F9385E13F |
:1043200096E09F938F931F930E94CD1188E2809314 |
:1043300030040F900F900F900F900F908091EF032B |
:104340009091F0039F938F9383E296E09F938F93D6 |
:104350001F930E94CD118CE3809330040F900F9037 |
:104360000F900F900F908091870899279F938F93BC |
:104370008091860899279F938F9381E396E045CE9D |
:104380001092300482EE93E09F938F93C1E0CF931D |
:104390000E94CD1184E1809330040F900F900F9014 |
:1043A0008091B4049091B504A091B604B091B70483 |
:1043B000B7FD2DC53AE0B595A795979587953A95A0 |
:1043C000D1F7BF93AF939F938F938CEE93E09F931E |
:1043D0008F93CF930E94CD1188E2809330048DB7E4 |
:1043E0009EB707960FB6F8949EBF0FBE8DBF809103 |
:1043F000AC049091AD04A091AE04B091AF04B7FDB0 |
:1044000001C52AE0B595A795979587952A95D1F787 |
:10441000BF93AF939F938F938BEF93E09F938F9373 |
:10442000CF930E94CD118CE3809330042DB73EB71B |
:10443000295F3F4F0FB6F8943EBF0FBE2DBF80914E |
:104440007A0490917B049F938F938AE094E09F93EA |
:104450008F93CF9325CE109230048CE293E09F93FC |
:104460008F9311E01F930E94CD1184E1809330045B |
:104470000F900F900F9081E690E09F938F938BE4C5 |
:1044800090E09F938F93DF93CF93809102016AE036 |
:104490000E94365F892F99279F938F938091020105 |
:1044A0000E94365F99279F938F938CE393E09F93AD |
:1044B0008F931F930E94CD1188E2809330042DB713 |
:1044C0003EB7235F3F4F0FB6F8943EBF0FBE2DBFE0 |
:1044D00083E595E09F938F930E94280499279F93EB |
:1044E0008F9381E593E09F938F931F930E94CD114B |
:1044F0008091A9039091AA036DB77EB7695F7F4F42 |
:104500000FB6F8947EBF0FBE6DBF069778F09091FE |
:104510003304992309F42FC38CE380933004892F4B |
:1045200099279F938F938CE693E0B7CD8CE380938C |
:1045300030048FE593E09F938F931F930E94CD11DA |
:104540000F900F900F90A6C4109230048FE396E066 |
:104550009F938F9311E01F930E94CD1184E180936C |
:1045600030040F900F900F9080910307992787FDDB |
:1045700090959F938F9380910207992787FD90953F |
:104580009F938F938FE496E09F938F931F930E9446 |
:10459000CD1188E2809330048DB79EB707960FB691 |
:1045A000F8949EBF0FBE8DBF80910407992787FDA9 |
:1045B00090959F938F938091050799279F938F9351 |
:1045C0008FE596E09F938F931F930E94CD118CE30C |
:1045D000809330042DB73EB7295F3F4F0FB6F89454 |
:1045E0003EBF0FBE2DBF8091090799279F938F93E0 |
:1045F00080910607992787FD90959F938F938FE66B |
:1046000096E003CD1092300489E994E09F938F9354 |
:10461000C1E0CF930E94CD11809102010F900F90C5 |
:104620000F908A3009F469C38B3009F4BEC284311B |
:1046300009F4BBC28D3009F02DC484E180933004AD |
:1046400080911C0399279F938F934091CC045091A4 |
:10465000CD04CA0157FD1CC49595879595958795FE |
:1046600095958795959587959F938F939A0157FD7B |
:104670000CC43595279535952795359527958091C7 |
:10468000160490911704821B930B9F938F938DE0D8 |
:1046900095E09F938F93CF930E94CD1188E28093F2 |
:1046A00030046DB77EB7675F7F4F0FB6F8947EBF5B |
:1046B0000FBE6DBF80911B0399279F938F934091ED |
:1046C000CA045091CB04CA0157FDDDC39595879567 |
:1046D0009595879595958795959587959F938F93B4 |
:1046E0009A0157FDCDC33595279535952795359575 |
:1046F00027958091140490911504821B930B9F932E |
:104700008F9381E295E09F938F93CF930E94CD1179 |
:104710008CE3809330048DB79EB709960FB6F8945A |
:104720009EBF0FBE8DBF80911A0399279F938F93D1 |
:104730002091C8043091C904C90137FD9FC39595E4 |
:1047400087959F938F938091120490911304281B57 |
:10475000390B3F932F9385E395E09F938F93CF93EE |
:104760000E94CD112DB73EB7275F3F4FBDCD1092B0 |
:10477000300480916F04909170049F938F938DED1E |
:1047800095E09F938F9311E01F930E94CD1184E1D8 |
:10479000809330040F900F900F900F900F908091A6 |
:1047A0006D0490916E049F938F9389EE95E09F9393 |
:1047B0008F931F930E94CD1188E2809330040F9055 |
:1047C0000F900F900F900F9080916B0490916C045C |
:1047D0009F938F9385EF95E09F938F931F930E94F4 |
:1047E000CD118CE3809330040F900F900F900F90B9 |
:1047F0000F908091690490916A049F938F9381E058 |
:1048000096E04BCC80916A0880FFBBC110923004C7 |
:1048100080915D0490915E049F938F9381E993E072 |
:104820009F938F9311E01F930E94CD1184E1809399 |
:1048300030040F900F900F900F900F9080915B04B9 |
:1048400090915C049F938F9380EA93E09F938F9362 |
:104850001F930E94CD1188E2809330040F900F9037 |
:104860000F900F900F9080911D0390911E039F93C6 |
:104870008F938FEA93E09F938F931F930E94CD11A4 |
:104880008CE3809330040F900F900F900F900F9057 |
:104890008091F30799279F938F938EEB93E0FDCB45 |
:1048A000109230048FE796E09F938F9311E01F934F |
:1048B0000E94CD1184E1809330040F900F900F90EF |
:1048C00080910B0899279F938F9380910A089927CD |
:1048D0009F938F938091090899279F938F9380913D |
:1048E000080899279F938F938FE896E09F938F9363 |
:1048F0001F930E94CD1188E2809330048DB79EB73C |
:104900000B960FB6F8949EBF0FBE8DBF80910F0817 |
:1049100099279F938F9380910E0899279F938F9348 |
:1049200080910D0899279F938F9380910C08992768 |
:104930009F938F9384EA96E09F938F931F930E9497 |
:10494000CD118CE3809330042DB73EB7255F3F4FE8 |
:104950000FB6F8943EBF0FBE2DBF80911308992764 |
:104960009F938F938091120899279F938F938091A3 |
:10497000110899279F938F938091100899279F93EF |
:104980008F9389EB96E09F938F931F930E94CD1195 |
:104990006DB77EB7655F7F4F41CB10923004809139 |
:1049A0006308E82FFF27EE0FFF1FE05DF74F8081C0 |
:1049B00091819F938F9380916208E82FFF27EE0FDC |
:1049C000FF1FE05DF74F808191819F938F9389E571 |
:1049D00094E09F938F9311E01F930E94CD1184E187 |
:1049E000809330048DB79EB707960FB6F8949EBF9C |
:1049F0000FBE8DBF80916508E82FFF27EE0FFF1FC8 |
:104A0000E05DF74F808191819F938F93809164083F |
:104A1000E82FFF27EE0FFF1FE05DF74F80819181A8 |
:104A20009F938F9389E694E09F938F931F930E94A7 |
:104A3000CD1188E2809330042DB73EB7295F3F4FF8 |
:104A40000FB6F8943EBF0FBE2DBF80916708E82FC8 |
:104A5000FF27EE0FFF1FE05DF74F808191819F934D |
:104A60008F9380916608E82FFF27EE0FFF1FE05D10 |
:104A7000F74F808191819F938F9389E794E09F9373 |
:104A80008F931F930E94CD118CE3809330046DB7F8 |
:104A90007EB7695F7F4F0FB6F8947EBF0FBE6DBFC4 |
:104AA00080916908E82FFF27EE0FFF1FE05DF74FA9 |
:104AB000808191819F938F9380916808E82FFF27D1 |
:104AC000EE0FFF1FE05DF74F808191819F938F93E1 |
:104AD00089E894E09F938F931F930E94CD118DB727 |
:104AE0009EB707960FB6F8949EBF0FBE8DBFD2C17A |
:104AF0001092300481EA95E09F938F9311E01F9309 |
:104B00000E94CD1184E1809330040F900F900F909C |
:104B100080917604909177049F938F9380EB95E03A |
:104B20009F938F931F930E94CD1188E2809330044E |
:104B30000F900F900F900F900F9080917A049091AA |
:104B40007B049F938F938FEB95E09F938F931F939D |
:104B50000E94CD118CE3809330040F900F900F9042 |
:104B60000F900F9080917804909179049F938F9388 |
:104B70008EEC95E092CA8CE38093300481E893E058 |
:104B8000DACC84E1809330048DEC93E09F938F9393 |
:104B900011E01F930E94CD1188E2809330040F90A2 |
:104BA0000F900F9084ED93E0C6CC84E180933004A5 |
:104BB0004091CC045091CD04CA0157FD57C19C01CE |
:104BC00035952795359527953595279535952795CD |
:104BD000C90182959295907F9827807F9827BA0186 |
:104BE000681B790BCB0177FD3FC1959587959F9306 |
:104BF0008F933F932F939A0157FD33C13595279596 |
:104C00003595279535952795809116049091170431 |
:104C1000821B930B9F938F938AED94E09F938F93C6 |
:104C2000CF930E94CD1188E2809330048DB79EB758 |
:104C300009960FB6F8949EBF0FBE8DBF4091CA046F |
:104C40005091CB04CA0157FD0AC19C0135952795A7 |
:104C5000359527953595279535952795C9018295E1 |
:104C60009295907F9827807F9827BA01681B790BCF |
:104C7000CB0177FDF2C0959587959F938F933F93D6 |
:104C80002F939A0157FDE6C03595279535952795C1 |
:104C9000359527958091140490911504821B930BF0 |
:104CA0009F938F938CEE94E09F938F93CF930E946A |
:104CB000CD118CE3809330048DB79EB709960FB663 |
:104CC000F8949EBF0FBE8DBF2091C8043091C904D7 |
:104CD000C90137FDBDC0959587959F938F938091AE |
:104CE000120490911304281B390B3F932F938EEFDE |
:104CF00094E09F938F93CF93F1CA84E18093300423 |
:104D00004091CC045091CD049A0157FDB4C0359523 |
:104D100027953595279535952795C901880F991FB2 |
:104D2000880F991F880F991F481B590B5F934F934A |
:104D30003F932F938091160490911704821B930B3D |
:104D40009F938F9387EA94E09F938F93CF930E94D2 |
:104D5000CD1188E2809330042DB73EB7275F3F4FD7 |
:104D60000FB6F8943EBF0FBE2DBF4091CA045091BC |
:104D7000CB049A0157FD7CC035952795359527952D |
:104D800035952795C901880F991F880F991F880F9E |
:104D9000991F481B590B5F934F933F932F9380911B |
:104DA000140490911504821B930B9F938F9389EBAE |
:104DB00094E09F938F93CF930E94CD118CE38093C7 |
:104DC00030046DB77EB7675F7F4F0FB6F8947EBF34 |
:104DD0000FBE6DBF8091C8049091C9049F938F93BB |
:104DE0008091C8049091C904209112043091130459 |
:104DF000821B930B9F938F938BEC94E09F938F93E5 |
:104E0000CF936BCE81509C4FAF4FBF4FFACA8150AA |
:104E10009C4FAF4FBF4FCECA84E48093300488E1EB |
:104E200097E09F938F93CF930E94CD110F900F9097 |
:104E30000F90DBC980E48093300485E197E09F9375 |
:104E40008F93CF930E94CD110F900F900F90C8C9F0 |
:104E5000019641CF295F3F4F17CF01960CCF0F9698 |
:104E6000F4CE295F3F4FCACE0196BFCE0F96A7CE94 |
:104E7000295F3F4F81CF295F3F4F49CF01965FCCDC |
:104E8000295F3F4F30CC0F9621CC295F3F4FF1CBAC |
:104E90000F96E2CB10922E04DF91CF911F910895CF |
:104EA0001092B9008AE28093B800089585EA809351 |
:104EB000BC00089584E98093BC0008951092B90065 |
:104EC0008093BB0085E88093BC0008950E945A2718 |
:104ED000109236048091BB001092350480E88093D4 |
:104EE000BC001092BD001092BA001092BB0010924C |
:104EF000B9001092B8000E9450270E94562780E007 |
:104F00000E945E2708958093BB0085E88093BC00D3 |
:104F1000089585EC8093BC00089585E88093BC00DB |
:104F200008951F920F920FB60F9211242F933F9363 |
:104F30004F935F936F937F938F939F93AF93BF93A1 |
:104F4000EF93FF9380913604282F3327442755276A |
:104F50008F5F80933604F90127313105C8F4E05B97 |
:104F6000FF4FEE0FFF1F0590F491E02D0994809103 |
:104F70003404E82FFF27E850F84F9091BB0090834E |
:104F80008F5F8C3008F49DC0109234040E945A2721 |
:104F900010923604E0C080E80E945E27DCC088E9F9 |
:104FA0000E945E27D8C00E945A278AE090E0909322 |
:104FB000AA038093A9030E945627CDC084E10E94D2 |
:104FC0005E27C9C082E10E945E27C5C080911C0394 |
:104FD0000E945E27C0C080E10E945E27BCC0809115 |
:104FE0001B030E945E27B7C080911A030E945E27B0 |
:104FF000B2C080913504E82FFF27ED5EF64F8F5F3A |
:105000008093350480810E945E27A5C0909135046D |
:10501000292FE92FFF27EE0FFF1FEE0FFF1FEE5A7C |
:10502000FA4F858518160CF054C09C3009F467C0FF |
:10503000990F892F8E5A0E945E278DC0809134046B |
:10504000E82FFF27EC5EF74F8091BB0080830E9422 |
:105050008D2781C08091B900803409F46EC08091A1 |
:105060003404E82FFF27EC5DF74F10828F5F8C3000 |
:1050700068F1109234040E945A27109236048091ED |
:105080003704809333041092370465C08091B900CF |
:10509000803309F440C00E945A278AE090E0909340 |
:1050A000AA038093A903109236040E94562753C086 |
:1050B0000E945A278AE090E09093AA038093A90364 |
:1050C00067CF809334040E945A2762CF80933404C0 |
:1050D000D2CF9C3008F0A9CF922F9F5FE92FFF27F6 |
:1050E000EE0FFF1FEE0FFF1FEE5AFA4F85851816C1 |
:1050F0001CF0292F9C3080F39093350496CF1092AA |
:10510000350483E08093360480913404880F8D5AEF |
:105110000E945E2720C0809137048823C9F49091B3 |
:10512000350490933704E92FFF27E95FF74F80811B |
:105130008F5F09F48FEF8083AECF80913404E82F26 |
:10514000FF27EC5DF74F8C5F80830E94892797CF04 |
:1051500090913504E8CF8091BC0080688093BC00BA |
:10516000FF91EF91BF91AF919F918F917F916F913F |
:105170005F914F913F912F910F900FBE0F901F9015 |
:10518000189583EC8093810080916F0080628093FA |
:105190006F001092C9041092C8041092CB041092B0 |
:1051A000CA041092CD041092CC0408951F920F925D |
:1051B0000FB60F921124EF92FF920F931F932F932C |
:1051C0003F934F935F936F937F938F939F93AF938F |
:1051D000BF93CF93DF93EF93FF932091860030919D |
:1051E00087008091380490913904281B390B8091F5 |
:1051F0008600909187009093390480933804C90108 |
:105200008D549440835F9A4178F480913A04909150 |
:105210003B04049714F010928403C1E0D0E0D093D3 |
:105220003B04C0933A04A3C0C0913A04D0913B041C |
:10523000CA30D1050CF09BC0C9018B5F9040845BE4 |
:105240009140A8F0FE013196F0933B04E0933A04BC |
:10525000E530F10509F46DC05D98E630F10509F41B |
:1052600066C05C98379709F460C05B9880C0225D87 |
:105270003140FE01EC0FFD1FE05DF74F8081918111 |
:10528000F901E81BF90BCF01F7FD6DC0069754F447 |
:1052900080916804883C08F05FC080916804865F54 |
:1052A00080936804FE01EC0FFD1FE05DF74F8081E5 |
:1052B0009181AC01440F551F480F591F420F531FD6 |
:1052C00057FD4EC07A01F594E794F594E794C9012F |
:1052D00001968E159F05BCF50894E108F1088091B0 |
:1052E0006804833C40F18E010C0F1D1FF801E05D46 |
:1052F000F74F808191819701281B390BC90163E029 |
:1053000070E00E94565FCB01880F991F860F971F90 |
:105310000A5B174FF80191838083FE01EC0FFD1F9C |
:10532000E05DF74FF182E0828DCF5B9A20C05C9AFE |
:1053300099CF5D9A92CFFE01EC0FFD1FEA5BF74F0C |
:1053400011821082EACF21503040E216F3063CF67B |
:105350000894E11CF11CC3CF88EC80936804A2CFB1 |
:105360004D5F5F4FAFCF909581959F4F8FCFFF914E |
:10537000EF91DF91CF91BF91AF919F918F917F91ED |
:105380006F915F914F913F912F911F910F91FF90DE |
:10539000EF900F900FBE0F901F90189581E08093B3 |
:1053A000620882E08093630883E08093640884E06D |
:1053B0008093650885E08093660886E0809367089F |
:1053C00087E08093680888E08093690808951F93B8 |
:1053D00088E680936A084EE140936B088BEF8093D8 |
:1053E0006D088AE080936E0840936C0840937008C3 |
:1053F000F4E0F0936F088EE08093710870E1709391 |
:1054000072081CE010937308E8E0E093740886EEDD |
:10541000809375084093760880E88093770860E56C |
:105420006093780886E98093790853E050937A086E |
:1054300030E230937B0883E280937C0840937D08C0 |
:1054400010927E0830937F08109280081092810895 |
:10545000109282081092830810929808109299086E |
:1054600010929A0810929B0824E62093840898E2F0 |
:10547000909385081092B208109286088AEF809364 |
:10548000870850938C08209388089093890810927D |
:105490008A0880938B0882E380938D089AE5909325 |
:1054A0008E0880938F081092B108909390086093B3 |
:1054B000910881E08093920885E58093930880931A |
:1054C00094087093950830939608209397088FE579 |
:1054D00080939C0883EF80939E088FE080939D08C3 |
:1054E00080939F088DEF8093A0082093A10890934C |
:1054F000A2089093A3089093A4088BE48093A50836 |
:105500008093A6088093A7081092A80886E080934D |
:10551000A908E093AA089093AB084093AC082093A5 |
:10552000AD082093AE08F093AF08ABEAB3E0E7EB29 |
:10553000F8E00D9001921A95E1F71F91089588E621 |
:1055400080936A086EE160936B088BEF80936D081F |
:105550008AE080936E0860936C086093700853E053 |
:1055600050936F088093710880E180937208E6E0A1 |
:10557000E093730878E07093740886EE8093750862 |
:105580006093760880E8809377082AE5209378086E |
:1055900088E78093790850937A0830E230937B084B |
:1055A00083E280937C0860937D0810927E0830939C |
:1055B0007F08109280081092810810928208109241 |
:1055C0008308109298081092990810929A081092E5 |
:1055D0009B0844E64093840898E2909385081092D3 |
:1055E000B208109286088AEF8093870850938C083F |
:1055F000409388089093890810928A0880938B08BA |
:1056000082E380938D0820938E0880938F081092F8 |
:10561000B1082093900880E5809391088CE38093F3 |
:10562000920885E5809393088093940830939508B9 |
:10563000309396089BE4909397088FE580939C089D |
:1056400083EF80939E0884E180939D0880939F0858 |
:105650008DEF8093A0084093A1082093A208209387 |
:10566000A3082093A4089093A5089093A60890936C |
:10567000A7081092A808E093A9087093AA0820939D |
:10568000AB086093AC084093AD084093AE0884E04B |
:105690008093AF088CE0A2EBB3E0E7EBF8E00D906D |
:1056A00001928A95E1F7089588EE80936A083EE1B9 |
:1056B00030936B088BEF80936D088AE080936E08BF |
:1056C00030936C083093700823E020936F0868E0F3 |
:1056D0006093710890E19093720876E0709373087C |
:1056E0006093740886EE809375083093760880E89E |
:1056F0008093770844E64093780888E78093790898 |
:1057000020937A0850E250937B0883E280937C08D0 |
:1057100084E180937D0810927E0890937F08109218 |
:1057200080081092810810928208109283081092CB |
:1057300098081092990810929A0810929B0840932A |
:10574000840898E2909385081092B2081092860817 |
:105750008AEF8093870820938C0840938808909361 |
:10576000890810928A0880938B0892E390938D08A1 |
:105770002AE520938E0890938F081092B108209309 |
:10578000900880E58093910886E48093920885E5EF |
:1057900080939308809394085093950850939608AB |
:1057A000909397088FE580939C0883EF80939E08E1 |
:1057B00030939D0830939F088DEF8093A00840930D |
:1057C000A1082093A2082093A3082093A4088BE4A7 |
:1057D0008093A5088093A6088093A7081092A80834 |
:1057E0007093A9086093AA082093AB083093AC0883 |
:1057F0004093AD084093AE0884E08093AF088CE0FE |
:10580000AAEBB3E0E7EBF8E00D9001928A95E1F79F |
:1058100008956817790744F4680F791F77FD09C068 |
:10582000CB01959587950895681B790B861B970B7F |
:1058300008956F5F7F4FCB01959587950895EF92FF |
:10584000FF920F931F93CF93C82F8B0180915F041A |
:105850008823A9F4C150CF3F91F07B01E60EF71EDB |
:105860001093F4030093F3038091F3039091F403F6 |
:10587000892BD1F7C7010E945A15C15088F7CF91E3 |
:105880001F910F91FF90EF9008952F923F924F92AA |
:105890005F926F927F928F929F92AF92BF92CF92C0 |
:1058A000DF92EF92FF920F931F93CF93DF93CDB7C9 |
:1058B000DEB7ED970FB6F894DEBF0FBECDBF2091D7 |
:1058C000C8043091C9048091120490911304281BDC |
:1058D000390B3A8729873093220920932109209197 |
:1058E0001C0430911D0437FDD4C735952795359597 |
:1058F0002795359527953AA729A73C872B877901C6 |
:1059000020911A0430911B0437FDC0C735952795A7 |
:1059100035952795359527953CA72BA73E872D874D |
:10592000F092E208E092E1083093D8082093D7087B |
:105930008091100990911109AA2797FDA095BA2F7F |
:105940007C018D01EE0CFF1C001F111FE80EF91EDB |
:105950000A1F1B1F80910E0490910F049C01442785 |
:1059600037FD4095542FDA01C901880F991FAA1FEE |
:10597000BB1F880F991FAA1FBB1F820F931FA41F55 |
:10598000B51F820F931FA41FB51FE80EF91E0A1F33 |
:105990001B1F17FD9CC715950795F794E794159560 |
:1059A0000795F794E794F0921109E092100980911D |
:1059B0002C0990912D09AA2797FDA095BA2F7C015B |
:1059C0008D01EE0CFF1C001F111FE80EF91E0A1FAF |
:1059D0001B1F80911004909111049C01442737FDF6 |
:1059E0004095542FDA01C901880F991FAA1FBB1FC8 |
:1059F000880F991FAA1FBB1F820F931FA41FB51FDB |
:105A0000820F931FA41FB51FE80EF91E0A1F1B1F4C |
:105A100017FD54C715950795F794E79415950795C5 |
:105A2000F794E794F0922D09E0922C098091DF0819 |
:105A30009091E008AA2797FDA095BA2F9C01AD018F |
:105A4000220F331F441F551F280F391F4A1F5B1F8A |
:105A500080910C0490910D04AA2797FDA095BA2F70 |
:105A6000280F391F4A1F5B1F57FD16C755954795CD |
:105A70003795279555954795379527953093E008A5 |
:105A80002093DF0820910E0430910F04C901880F84 |
:105A9000991F880F991F820F931F820F931FAA27A8 |
:105AA00097FDA095BA2F2091A4043091A5044091B0 |
:105AB000A6045091A704820F931FA41FB51F8093C3 |
:105AC000A4049093A504A093A604B093A7042091E6 |
:105AD000100430911104C901880F991F880F991F74 |
:105AE000820F931F820F931FAA2797FDA095BA2FAD |
:105AF0002091A0043091A1044091A2045091A304EC |
:105B0000820F931FA41FB51F8093A0049093A1043C |
:105B1000A093A204B093A3048091EA089091EB08AB |
:105B200020910E0430910F04820F931F9093EB0885 |
:105B30008093EA088091240990912509209110040E |
:105B400030911104820F931F9093250980932409AB |
:105B50008091BE049091BF0401969093BF048093FE |
:105B6000BE0480919C0490919D04A0919E04B091EC |
:105B70009F04BC01CD010E949D5E5B016C01809180 |
:105B8000E8079091E907AA2797FDA095BA2FBC01D5 |
:105B9000CD010E949D5E7B018C018091BA049091A1 |
:105BA000BB04A091BC04B091BD049C01AD01C8012F |
:105BB000B7010E943D5EDC01CB019C01AD01C60135 |
:105BC000B5010E943E5EDC01CB01BC01CD010E940B |
:105BD000805EDC01CB0180939C0490939D04A09394 |
:105BE0009E04B0939F048FEC80937A001092190367 |
:105BF00020908C0430908D0440908E0450908F043F |
:105C000039E423163BE6330631E0430630E0530621 |
:105C10000CF414C188E49BE6A1E0B0E08D839E8380 |
:105C2000AF83B88760909404709095048090960438 |
:105C30009090970439E463163BE6730631E08306DF |
:105C400030E093060CF4DCC488E49BE6A1E0B0E00D |
:105C500089839A83AB83BC8349855A85CA01AA2765 |
:105C600097FDA095BA2F209184043091850440912E |
:105C7000860450918704280F391F4A1F5B1F2DA3EC |
:105C80003EA34FA358A7A0902809B0902909C0901F |
:105C90002A09D0902B09A80EB91ECA1EDB1E860148 |
:105CA0007501309156043BA3332309F0DAC080918B |
:105CB0005504882309F0C2C440916A084CA346FFEA |
:105CC00013C6EBA5FCA5CF01AA2797FDA095BA2F77 |
:105CD000BC01CD0129813A814B815C810E94175F13 |
:105CE0009B01AC0197FD2CC7BBE0559547953795B7 |
:105CF0002795BA95D1F780918E03E82EFF240027CF |
:105D00001127C801B7010E94175F97FD14C7ACE0C7 |
:105D10009595879577956795AA95D1F76F87788B35 |
:105D2000898B9A8B6093D6047093D7048093D804A0 |
:105D30009093D90429A53AA5C901AA2797FDA09552 |
:105D4000BA2FBC01CD012D813E814F8158850E9423 |
:105D5000175F9B01AC0197FD01C7FBE05595479587 |
:105D600037952795FA95D1F7C801B7010E94175FBB |
:105D700097FDEFC6DC01CB01ECE0B595A7959795B3 |
:105D80008795EA95D1F78093DA049093DB04A0938A |
:105D9000DC04B093DD042091D6043091D704309315 |
:105DA0005D0820935C082091DA043091DB04309385 |
:105DB0006108209360082F85388949895A89821B98 |
:105DC000930BA40BB50B8AAF9BAFACAFBDAF809369 |
:105DD000DA049093DB04A093DC04B093DD04A80EF6 |
:105DE000B91ECA1EDB1E8601750130918D033DA7C9 |
:105DF000332309F0A3C58EA79FA7A8ABB9ABB7FD06 |
:105E000061C62EA53FA548A959A95595479537952F |
:105E100027958DA19EA1AFA1B8A5821B930BA40BC2 |
:105E2000B50B8DA39EA3AFA3B8A7809384049093D2 |
:105E30008504A0938604B09387048CC598EB29163B |
:105E400094E939069EEF49069FEF59060CF0F1C31D |
:105E500028EB34E94EEF5FEF2D833E834F83588765 |
:105E6000E1CE2DA13EA14FA158A5209384043093EB |
:105E70008504409386045093870430916A083CA3BC |
:105E8000109261081092600810925D0810925C08F0 |
:105E90001092D2041092D3041092D4041092D5041C |
:105EA0001092CE041092CF041092D0041092D1041C |
:105EB00030918D033DA78091D2049091D304A0919D |
:105EC000D404B091D504BC01CD0124E630E040E01B |
:105ED00050E00E948B5FDA01C9014091CE045091DD |
:105EE000CF04481B590B58A34F8F8091CE0490913B |
:105EF000CF04A091D004B091D104BC01CD0124E61F |
:105F000030E040E050E00E948B5FDA01C90120914F |
:105F1000D2043091D304821B930B9AA389A380915E |
:105F2000860390918703A0918803B0918903BC01F7 |
:105F3000CD0128E631E040E050E00E94175FE61610 |
:105F4000F7060807190744F057016801A61AB70AAF |
:105F5000C80AD90A8601750117FDA3C4A0922809B1 |
:105F6000B0922909C0922A09D0922B092BA53CA5F1 |
:105F70008F8D98A1280F391F79010027F7FC009514 |
:105F8000102F8091880490918904A0918A04B09187 |
:105F90008B04E80EF91E0A1F1B1F57016801809130 |
:105FA000590490915A04281B390BC901AA2797FD5F |
:105FB000A095BA2F280E391E4A1E5B1E20919F0302 |
:105FC0003091A0034091A1035091A2032215330503 |
:105FD0004405550574F4A8EAEA2EA1E6FA2E012D2F |
:105FE000112DE21AF30A040B150B170128015701B2 |
:105FF000680188279927DC01821B930BA40BB50B42 |
:10600000281639064A065B060CF0E9C2F8E52F2E81 |
:10601000FEE93F2EFFEF4F2EFFEF5F2E220E331EC5 |
:10602000441E551E20928C0430928D0440928E04A2 |
:1060300050928F0482017101209288043092890469 |
:1060400040928A0450928B0429A53AA5A9A1BAA12D |
:106050002A0F3B1FA901662757FD6095762F809177 |
:10606000900490919104A0919204B0919304480FF0 |
:10607000591F6A1F7B1F5A016B0180915704909131 |
:106080005804281B390BC901AA2797FDA095BA2FE0 |
:10609000680E791E8A1E9B1E8091A3039091A40313 |
:1060A000A091A503B091A6038EAB9FABA8AFB9AFEB |
:1060B00086159705A805B90564F448EA51E660E03D |
:1060C00070E0481B590B6A0B7B0B3A014B015A01DC |
:1060D0006B018EA99FA9A8ADB9ADB095A09590957B |
:1060E00081959F4FAF4FBF4F681679068A069B0672 |
:1060F0000CF064C2E8E56E2EEEE97E2EEFEF8E2EF8 |
:10610000EFEF9E2E2EA93FA948AD59AD620E731E2A |
:10611000841E951E60929404709295048092960459 |
:1061200090929704B401A30160929004709291043C |
:1061300080929204909293048DA19EA1AFA1B8A5E4 |
:106140008093980490939904A0939A04B0939B042D |
:106150006092B4047092B5048092B6049092B70431 |
:106160002092AC043092AD044092AE045092AF0441 |
:106170004093B0045093B1046093B2047093B3049D |
:10618000E092A804F092A9040093AA041093AB042F |
:10619000809125039091260397FDA4C37C01F5947B |
:1061A000E794F594E794F594E794FAA6E9A680912C |
:1061B00023039091240397FD93C38C0115950795B4 |
:1061C00015950795159507951CA70BA780911604A3 |
:1061D000909117040F9734F458E1E52E5CEFF52EFB |
:1061E000FAA6E9A68091160490911704079734F453 |
:1061F00040E3E42E48EFF42EFAA6E9A6209102012E |
:106200002A3009F46BC28091160490911704815DC5 |
:1062100097400CF007C28091160490911704805E9D |
:10622000974034F080EDE82E87E0F82EFAA6E9A634 |
:1062300080911404909115040F9724F408E11CEF49 |
:106240001CA70BA78091140490911504079724F4C0 |
:1062500000E318EF1CA70BA72A3009F455C2809160 |
:10626000140490911504815D974024F008EE13E02A |
:106270001CA70BA78091140490911504805E974091 |
:1062800024F000ED17E01CA70BA7A0919703AA2309 |
:1062900009F497C060912503709126038091DE0474 |
:1062A0009091DF04681B790B209125033091260320 |
:1062B000280F391F37FD3FC3359527953093DF04ED |
:1062C0002093DE04613871050CF43AC260E870E096 |
:1062D0007093E5046093E4048A2F9927869FF00168 |
:1062E000879FF00D969FF00D1124CF01F7FD21C37C |
:1062F0007C01F594E794F594E794F594E794F5948C |
:10630000E79429A53AA5E20EF31EFAA6E9A6409164 |
:106310002303509124038091E0049091E104481BF1 |
:10632000590B2091230330912403280F391F37FD87 |
:10633000FDC2359527953093E1042093E004413860 |
:1063400051050CF4F5C140E850E05093E30440934C |
:10635000E2048A2F9927849FD001859FB00D949FD6 |
:10636000B00D1124AD019D01B7FDDDC28901159568 |
:106370000795159507951595079515950795EBA51F |
:10638000FCA50E0F1F1F1CA70BA7869F9001879FC0 |
:10639000300D969F300D1124C901209125033091B5 |
:1063A0002603820F931F90932603809325038091E9 |
:1063B000230390912403480F591F509324034093C3 |
:1063C00023034D855E85141615060CF0C1C180911E |
:1063D0005C0890915D0897FDA2C2AA2797FDA09541 |
:1063E000BA2F6DA5262F332744275527BC01CD0191 |
:1063F0000E94175F97FD8EC2E6E095958795779589 |
:106400006795EA95D1F7AF8DB8A1A60FB71FB093E6 |
:10641000D308A093D2084B855C85141615060CF0A2 |
:10642000C1C1809160089091610897FD6FC2AA2751 |
:1064300097FDA095BA2F6DA5262F33274427552702 |
:10644000BC01CD010E94175F97FD5BC246E09595A8 |
:106450008795779567954A95D1F7A9A1BAA1A60F17 |
:10646000B71FB093C808A093C7083CA137FDC1C1AE |
:106470001093C6080093C508F092D508E092D4089E |
:1064800080916608E82FFF27EE0FFF1FE05DF74FB2 |
:106490008081918182599F4FA0916F04B0917004C7 |
:1064A000A817B9070CF0EEC0CD01019690937004C7 |
:1064B00080936F04DC0180916708E82FFF27EE0FBF |
:1064C000FF1FE05DF74F8081918182599F4F60915E |
:1064D0006D0470916E04681779070CF0C4C0CB018D |
:1064E000019690936E0480936D04BC0180916808BE |
:1064F000E82FFF27EE0FFF1FE05DF74F80819181AE |
:1065000082599F4F40916B0450916C044817590772 |
:106510000CF0D5C0CA01019690936C0480936B0473 |
:10652000AC0180916908E82FFF27EE0FFF1FE05DA7 |
:10653000F74F8081918182599F4F2091690430915A |
:106540006A04281739070CF0ABC0C9010196909373 |
:106550006A04809369049C01B7FD93C1AF3FB10504 |
:1065600039F034F08FEF90E09093700480936F04D3 |
:1065700077FD76C16F3F710539F034F08FEF90E011 |
:1065800090936E0480936D0457FD70C14F3F510589 |
:1065900039F034F08FEF90E090936C0480936B04AB |
:1065A00037FD6AC12F3F310509F00CF4EEC28FEFC1 |
:1065B00090E090936A0480936904E7C26092940427 |
:1065C000709295048092960490929704A092900401 |
:1065D000B0929104C0929204D0929304ADCD2092D7 |
:1065E0008C0430928D0440928E0450928F04A092BD |
:1065F0008804B0928904C0928A04D0928B0424CD7E |
:1066000098EB691694E979069EEF89069FEF990643 |
:106610002CF528EB34E94EEF5FEF29833A834B8367 |
:106620005C831ACB98EEE92E93E0F92EFAA6E9A640 |
:10663000F2CD2D823E824F825886F4CA8DA19EA152 |
:10664000AFA1B8A58093840490938504A093860499 |
:10665000B093870490916A089CA312CC69827A82D5 |
:106660008B829C82F9CA8081918182599F4F8617C3 |
:1066700097070CF03BCF6115710509F437CFCB01BB |
:1066800001972FCF8081918182599F4F8A179B0755 |
:106690000CF011CF109709F40ECFCD01019706CF62 |
:1066A0008081918182599F4F821793070CF054CFBC |
:1066B0002115310509F450CFC901019748CF8081D8 |
:1066C000918182599F4F841795070CF02ACF41156D |
:1066D000510509F426CFCA0101971ECF80911604F7 |
:1066E00090911704835F934034F038EEE32E33E04B |
:1066F000F32EFAA6E9A680911604909117048A5FFA |
:1067000093400CF495CD8ECD809114049091150496 |
:10671000835F934024F008EE13E01CA70BA7809141 |
:106720001404909115048A5F93400CF4AECDA9CD6A |
:106730003FEF403853070CF008CE40E85FEF05CE3E |
:106740008FEF603878070CF0C3CD60E87FEFC0CDE5 |
:1067500080915C0890915D0897FD9BC1AA2797FDE9 |
:10676000A095BA2FEDA52E2F332744275527BC011E |
:10677000CD010E94175F97FDADC156E095958795B5 |
:10678000779567955A95D1F72F8D38A1261B370B32 |
:106790003093D3082093D2084B855C8514161506D8 |
:1067A0000CF43FCE809160089091610897FD6DC117 |
:1067B000AA2797FDA095BA2FEDA52E2F33274427A2 |
:1067C0005527BC01CD010E94175F97FD88C136E0B7 |
:1067D00095958795779567953A95D1F729A13AA12F |
:1067E000261B370B3093C8082093C7083CA137FFFE |
:1067F0003FCE4BA1442309F03BCE80915504882322 |
:1068000009F036CE8B859C85A1E081309A070CF08B |
:1068100044C12B853C854FEF203034070CF0A3C1D9 |
:1068200089A59AA5280F391F3C872B8720503F4FF9 |
:106830003093D5082093D408AD85BE85E1E0A13022 |
:10684000BE070CF465C12BA53CA5A20FB31FBE87E4 |
:10685000AD87A050B140B093C608A093C50810CE34 |
:1068600010926E0410926D0457FF90CE10926C043B |
:1068700010926B0437FF96CE10926A04109269044E |
:1068800084C11092700410926F0472CE295F3F4F42 |
:106890003DC8295F3F4F29C82D5F3F4F4F4F5F4F86 |
:1068A000E5C8E60EF71E081F191FE0922809F092AE |
:1068B000290900932A0910932B0958CB23E030E0D3 |
:1068C00040E050E0E20EF31E041F151FA3C883E052 |
:1068D00090E0A0E0B0E0E80EF91E0A1F1B1F5BC8A5 |
:1068E00007966BCC07965ACC2DA13EA14FA158A577 |
:1068F0002093840430938504409386045093870446 |
:10690000BFCA615C7F4F8F4F9F4FA0CD90958195FF |
:106910009F4F8DCD615C7F4F8F4F9F4F6DCD909579 |
:1069200081959F4F5ACD215F3F4F20CD2F5F3F4F25 |
:1069300000CD0F96DDCC2F5F3F4FBECC2DA13EA1E9 |
:106940004FA158A520938404309385044093860476 |
:106950005093870489859A85AA2797FDA095BA2F19 |
:106960002AAD3BAD4CAD5DAD820F931FA41FB51F8B |
:106970008B8B9C8BAD8BBE8BBC01CD0129813A8169 |
:106980004B815C810E94175F9B01AC0197FDBBC0EE |
:106990006BE055954795379527956A95D1F76091A6 |
:1069A0008F03862F9927AA27BB278F8B988FA98FB4 |
:1069B000BA8FBC01CD010E94175F97FD9FC02CE0EC |
:1069C00095958795779567952A95D1F76B8F7C8FED |
:1069D0008D8F9E8F6093CE047093CF048093D004EC |
:1069E0009093D1046B897C898D899E892D813E810C |
:1069F0004F8158850E94175F9B01AC0197FD79C0BC |
:106A00008BE055954795379527958A95D1F76F89EE |
:106A1000788D898D9A8D0E94175F97FD65C0BCE0C7 |
:106A20009595879577956795BA95D1F76AAB7BABC6 |
:106A30008CAB9DAB6093D2047093D3048093D40449 |
:106A40009093D50429853A8537FD7FC021343105DF |
:106A50000CF431CA6B8D7C8D8D8D9E8D97FD2AC077 |
:106A6000613871058105910564F46AA97BA98CA937 |
:106A70009DA997FD82C061387105810591050CF4CF |
:106A80001ACA81E08093730416CA909581959F4F2E |
:106A90008FCE909581959F4F61CEE9A5FAA58E0F77 |
:106AA0009F1F9C878B87805091409093D50880933F |
:106AB000D408C2CE90958095709561957F4F8F4F89 |
:106AC0009F4FCECF0196A11DB11D8EA79FA7A8AB4A |
:106AD000B9AB97C9615C7F4F8F4F9F4F4ECE615CC2 |
:106AE0007F4F8F4F9F4F73CE6150704F8F4F9F4F8F |
:106AF00096CF2150384F4F4F5F4F82CF6150704F2C |
:106B00008F4F9F4F5CCF2150384F4F4F5F4F40CF3B |
:106B10004D855E856FEF4030560754F58BA59CA5DB |
:106B2000480F591F5E874D8740505F4F5093C608EE |
:106B30004093C508A5CC6150704F8F4F9F4FE7C859 |
:106B40002150384F4F4F5F4FCFC8309521953F4F61 |
:106B50007DCF6150704F8F4F9F4F0CC92150384FE0 |
:106B60004F4F5F4FFAC8F092D508E092D40864CE38 |
:106B70001093C6080093C50883CC909580957095B6 |
:106B800061957F4F8F4F9F4F76CFED960FB6F8945C |
:106B9000DEBF0FBECDBFDF91CF911F910F91FF9050 |
:106BA000EF90DF90CF90BF90AF909F908F907F90AD |
:106BB0006F905F904F903F902F90089580910201C9 |
:106BC0008D3009F455C110927A008091160490918D |
:106BD00017049093D5088093D40880911404909161 |
:106BE00015049093C6088093C50880911204909173 |
:106BF0001304909322098093210980910E049091AF |
:106C00000F049C01442737FD4095542FDA01C90138 |
:106C1000880F991FAA1FBB1F880F991FAA1FBB1F90 |
:106C2000820F931FA41FB51F820F931FA41FB51FB0 |
:106C30009093110980931009809110049091110490 |
:106C40009C01442737FD4095542FDA01C901880F74 |
:106C5000991FAA1FBB1F880F991FAA1FBB1F820F56 |
:106C6000931FA41FB51F820F931FA41FB51F9093DE |
:106C70002D0980932C0980910C0490910D04909320 |
:106C8000E0088093DF088FEC80937A00809166089B |
:106C9000E82FFF27EE0FFF1FE05DF74F8081918106 |
:106CA00082599F4FA0916F04B0917004A817B90743 |
:106CB0000CF085C0CD0101969093700480936F0411 |
:106CC000DC0180916708E82FFF27EE0FFF1FE05DD2 |
:106CD000F74F8081918182599F4F60916D0470912F |
:106CE0006E04681779070CF096C0CB01019690935B |
:106CF0006E0480936D04BC0180916808E82FFF2723 |
:106D0000EE0FFF1FE05DF74F8081918182599F4F09 |
:106D100040916B0450916C04481759070CF06CC0FB |
:106D2000CA01019690936C0480936B04AC0180912E |
:106D30006908E82FFF27EE0FFF1FE05DF74F808106 |
:106D4000918182599F4F2091690430916A042817DC |
:106D500039070CF042C0C901019690936A048093F0 |
:106D600069049C01B7FD7FC0AF3FB10511F00CF085 |
:106D700061C077FD67C06F3F710539F034F08FEF68 |
:106D800090E090936E0480936D0457FD61C04F3F77 |
:106D9000510539F034F08FEF90E090936C048093BC |
:106DA0006B0437FD5BC02F3F310509F00CF463C065 |
:106DB0008FEF90E090936A04809369045CC08081B7 |
:106DC000918182599F4F8A179B070CF07ACF1097B9 |
:106DD00009F477CFCD0101976FCF808191818259DE |
:106DE0009F4F821793070CF0BDCF2115310509F491 |
:106DF000B9CFC9010197B1CF8081918182599F4F4D |
:106E0000841795070CF093CF4115510509F48FCFE6 |
:106E1000CA01019787CF8081918182599F4F861740 |
:106E200097070CF069CF6115710509F465CFCB01A7 |
:106E300001975DCF8FEF90E09093700480936F0483 |
:106E400077FF99CF10926E0410926D0457FF9FCF79 |
:106E500010926C0410926B0437FFA5CF10926A0455 |
:106E60001092690408C01092700410926F0481CFD0 |
:106E70000E94111AA8CE809193089927AA27BB27B0 |
:106E8000BC01CD0124EC39E040E050E00E94175FE6 |
:106E9000DC01CB018093A3039093A403A093A503EB |
:106EA000B093A603809194089927AA27BB27BC0119 |
:106EB000CD010E94175FDC01CB0180939F0390936B |
:106EC000A003A093A103B093A20308956F927F92B1 |
:106ED0008F929F92AF92BF92CF92DF92EF92FF92EA |
:106EE0000F931F93CF9300E010E078016801109298 |
:106EF000F103469A1093C3040093C2041093C10493 |
:106F00000093C00480E090E0A0E0B0E08093BA0479 |
:106F10009093BB04A093BC04B093BD041093CD0424 |
:106F20000093CC041093CB040093CA041093C904BB |
:106F30000093C8041093F2080093F10810928F0395 |
:106F400010928E0310920A040E94DE3584E690E0CF |
:106F50000E9467150E94DE3580916A0880FF10C08C |
:106F600080911D0390911E03875B934008F07BC0C6 |
:106F700080911D0390911E038E5E924008F473C0B1 |
:106F8000CFE18AE090E00E94671580911204909111 |
:106F90001304080F191F8091160490911704E80E2E |
:106FA000F91E8091140490911504C80ED91EC15089 |
:106FB000C7FFE7CFA701405F5F4F569547955695AE |
:106FC00047955093CD044093CC049601205F3F4FEA |
:106FD00036952795369527953093CB042093CA0490 |
:106FE000C801409696958795929582958F708927CE |
:106FF0009F7089279093C9048093C8049093F208E6 |
:107000008093F1083093C7042093C6045093C504BD |
:107010004093C40444E050E0DA010E94A65F802D52 |
:10702000853020F180912C0990912D0997FD53C056 |
:107030006CE070E00E94565F7093C1046093C004DE |
:10704000809110099091110997FD56C06CE070E095 |
:107050000E94565F7093C3046093C2048091E80756 |
:107060009091E9074DC00E94BF198ACFDA010E94B2 |
:10707000A65F802D9927982F8827DA0111960E9404 |
:10708000A65F202D820F911D9093C3048093C204AC |
:10709000DA0112960E94A65F802D9927982F8827E3 |
:1070A000DA0113960E94A65F202D820F911D909306 |
:1070B000C1048093C004DA0114960E94A65F802D5B |
:1070C0009927982F8827DA0115960E94A65F202D10 |
:1070D000820F911D15C0909581959F4F6CE070E0D7 |
:1070E0000E94565F7093C1046093C00480911009A0 |
:1070F0009091110997FFAACF909581959F4FA6CFA8 |
:10710000AA2797FDA095BA2FBC01CD010E949D5ED4 |
:10711000DC01CB018093BA049093BB04A093BC0420 |
:10712000B093BD041092D5081092D4081092C608EE |
:107130001092C508109222091092210984E690E06D |
:107140000E94671580910E0490910F04AA2797FD65 |
:10715000A095BA2F9C01AD01220F331F441F551F6C |
:10716000220F331F441F551F280F391F4A1F5B1F53 |
:10717000280F391F4A1F5B1F3093110920931009F4 |
:107180008091100490911104AA2797FDA095BA2F21 |
:107190007C018D01EE0CFF1C001F111FEE0CFF1C6B |
:1071A000001F111FE80EF91E0A1F1B1FE80EF91E13 |
:1071B0000A1F1B1FF0922D09E0922C09809176087E |
:1071C000682E772488249924C9019C01442737FD1F |
:1071D0004095542FC401B3010E94175F5B016C01FD |
:1071E0006093B4047093B5048093B6049093B7048D |
:1071F0009701442737FD4095542FC401B3010E94E5 |
:10720000175FDC01CB018093AC049093AD04A09395 |
:10721000AE04B093AF04A0929004B0929104C092D7 |
:107220009204D09293048093880490938904A0934D |
:107230008A04B0938B0410928404109285041092F7 |
:1072400086041092870480911F0390912003A091DF |
:107250002103B09122039093EB078093EA071092E9 |
:1072600009041092080410927C0410927D0410927C |
:107270007E0410927F0480917A0490917B04909315 |
:107280007904809378040E94895782E390E0909378 |
:10729000F4038093F303809193089927AA27BB27CF |
:1072A000BC01CD0124EC39E040E050E00E94175FC2 |
:1072B000DC01CB018856954CAF4FBF4F8093A303A1 |
:1072C0009093A403A093A503B093A6038091940880 |
:1072D0009927AA27BB27BC01CD010E94175FDC01BB |
:1072E000CB018856954CAF4FBF4F80939F0390932F |
:1072F000A003A093A103B093A20310928B0310925A |
:107300008A0380917A0490917B04AA2797FDA09527 |
:10731000BA2F2091860330918703409188035091C2 |
:107320008903BC01CD010E94175FDC01CB01809372 |
:10733000280990932909A0932A09B0932B09109248 |
:1073400072041092710481E0809301010E94285B15 |
:1073500080913C04846080933C048FEF809391097A |
:107360001092920980E28093930980916608E82F39 |
:10737000FF27EE0FFF1FE05DF74F8081918182595B |
:107380009F4F9093700480936F0480916708E82F5B |
:10739000FF27EE0FFF1FE05DF74F8081918182593B |
:1073A0009F4F90936E0480936D0480916808E82F3E |
:1073B000FF27EE0FFF1FE05DF74F8081918182591B |
:1073C0009F4F90936C0480936B0480916908E82F21 |
:1073D000FF27EE0FFF1FE05DF74F808191818259FB |
:1073E0009F4F90936A048093690484E680936804B5 |
:1073F000CF911F910F91FF90EF90DF90CF90BF90B2 |
:10740000AF909F908F907F906F90089590915F04C0 |
:10741000992381F580913C048C7F80933C0410C0BB |
:10742000A92FBB27FD01E951F94F8083FD01E951E7 |
:10743000F94F8081AD5EB64F8C939F5F9C3080F496 |
:107440008091D203882361F3A92FBB27FD01E95165 |
:10745000F94F8081AD5EB64F8C939F5F9C3080F377 |
:107460008091D203882359F08091D2038150809378 |
:10747000D20305C080913C04816080933C048091DC |
:10748000130999279093BD078093BC078091140935 |
:1074900099279093BF078093BE078091160999277B |
:1074A0009093C1078093C007809115099927909305 |
:1074B000C3078093C20710923604109235040E94CD |
:1074C0005627089580916D088B3F68F08B3F09F433 |
:1074D00077C28C3F09F4F8C28D3F09F4D1C28E3FC8 |
:1074E00021F48091690480939B0380916C088B3F09 |
:1074F00008F400C28B3F09F4FBC18C3F09F408C3B8 |
:107500008D3F09F4B1C28E3F09F41DC380919C03E5 |
:10751000882309F0F4C180939C0380916E088B3F0F |
:1075200008F4F4C18B3F09F4EFC18C3F09F4E4C2C5 |
:107530008D3F09F49CC28E3F09F408C380919A03E1 |
:10754000882309F0E8C180939A03809170088B3FEB |
:1075500068F08B3F09F42EC28C3F09F4CAC28D3FFC |
:1075600009F488C28E3F21F48091690480939903C5 |
:10757000809177088B3F68F08B3F09F41EC28C3FE7 |
:1075800009F49FC28D3F09F478C28E3F21F48091A7 |
:10759000690480939803809178088B3F08F4C2C1F6 |
:1075A0008B3F09F4BDC18C3F09F488C28D3F09F4BB |
:1075B0006AC28E3F09F4D6C2809196038B3008F4DC |
:1075C000B6C18F3F11F480939603809179088B3F69 |
:1075D00068F08B3F09F4EBC18C3F09F466C28D3F24 |
:1075E00009F454C28E3F21F480916904809395037D |
:1075F00080917A088B3F68F08B3F09F4D5C18C3FAE |
:1076000009F456C28D3F09F447C28E3F21F48091A0 |
:1076100069048093970320917F082B3F08F48BC166 |
:107620002B3F09F486C12C3F09F445C22D3F09F4D4 |
:1076300009C22E3F09F493C22091930380918008E0 |
:107640008B3F08F07FC180935004809181088B3F6D |
:1076500068F08B3F09F4A5C18C3F09F471C28D3FDE |
:1076600009F4F6C18E3F21F48091690480934F04A0 |
:10767000809182088B3F68F08B3F09F4ADC18C3F4D |
:1076800009F43DC28D3F09F4E6C18E3F21F480919B |
:10769000690480934E04809183088B3F68F08B3F90 |
:1076A00009F49DC18C3F09F42DC28D3F09F4D6C168 |
:1076B0008E3F21F48091690480934D048091980855 |
:1076C0008B3F68F08B3F09F481C18C3F09F4EAC11C |
:1076D0008D3F09F4E4C18E3F21F4809169048093C9 |
:1076E0004C04809199088B3F68F08B3F09F471C17D |
:1076F0008C3F09F41FC28D3F09F4CBC18E3F21F4AA |
:107700008091690480934B0480919A088B3F68F0C4 |
:107710008B3F09F473C18C3F09F40FC28D3F09F40C |
:1077200094C18E3F21F48091690480934A04809132 |
:107730009B088B3F68F08B3F09F445C18C3F09F4EF |
:10774000EDC18D3F09F472C18E3F21F4809169042F |
:1077500080934904809184088B3F68F08B3F09F443 |
:1077600047C18C3F09F4DDC18D3F09F462C18E3FF2 |
:1077700021F48091690480939203809188088B3F63 |
:1077800068F08B3F09F437C18C3F09F4AFC18D3FDE |
:1077900009F446C18E3F21F48091690480939103DE |
:1077A00080918D088B3F68F08B3F09F4F1C08C3FCE |
:1077B00009F4B1C18D3F09F436C18E3F21F48091A7 |
:1077C000690480939003809190088B3F68F08B3F11 |
:1077D00009F4E1C08C3F09F4A7C18D3F09F42CC125 |
:1077E0008E3F21F48091690480938F0380919108EA |
:1077F0008B3F68F08B3F09F4C5C08C3F09F497C1FB |
:107800008D3F09F41CC18E3F21F48091690480935F |
:107810008E03809192088B3F68F08B3F09F4B5C0CE |
:107820008C3F09F454C18D3F09F4EBC08E3F21F425 |
:107830008091690480938D03809197088B3F68F055 |
:107840008B3F09F4D2C08C3F09F444C18D3F09F449 |
:10785000DBC08E3F21F48091690480938C0380917A |
:107860009D088B3F08F47EC08B3F09F479C08C3FA4 |
:1078700009F433C18D3F09F4CAC08E3F09F469C1D0 |
:107880008091EC08823008F472C08F3F11F480932D |
:10789000EC0880919F088B3F08F46DC08B3F09F482 |
:1078A00068C08C3F09F41FC18D3F09F4B3C08E3FFF |
:1078B00009F452C180911F09823008F461C08F3FE2 |
:1078C00011F480931F098091B0088B3F70F08B3FBB |
:1078D00009F488C08C3F09F403C18D3F09F49DC0B1 |
:1078E0008E3F09F042C18091690480932F093DC108 |
:1078F00080916F0480939C03882309F40CCE843616 |
:1079000008F40BCE84E607CE80916F0480939A032F |
:10791000882309F418CE843608F417CE84E613CEF3 |
:1079200080916F04809396038B3008F04ACE8AE0F2 |
:107930004ACE20916F0420939303809180088B3F5F |
:1079400008F481CE8B3F51F18C3F09F4DEC08D3FAE |
:1079500009F487C08E3F09F078CE8091690473CE18 |
:1079600080916F048093EC08823008F08ECF81E024 |
:107970008ECF80916F0480931F09823008F09FCFD3 |
:1079800081E09FCF80916F0442CF80916F0452CFEE |
:1079900080916F0416CF80916F0426CF80916F0481 |
:1079A00052CE80916F0462CE80916F0432CE80916E |
:1079B0006F041CCE80916F04D9CD80916F04E9CD06 |
:1079C00080916F0490CD80916F04C2CE80916F043E |
:1079D00086CE80916F0496CE80916F045ACE8091AE |
:1079E0006F046ACE80916F0480CF80916F0435CF91 |
:1079F00080916F04C0CE80916F04D0CE80916F04CF |
:107A000094CE80916B0416CF80916B0426CF809129 |
:107A10006B04A8CF80916B04AECF80916B0465CFCF |
:107A200080916B04BBCE80916B04CBCE80916B04B4 |
:107A30008FCE80916B049FCE80916B04D5CE8091C8 |
:107A40006B04E5CE20916B0476CF80916B046DCEF4 |
:107A500080916B040BCE80916B041BCE80916B04E4 |
:107A60002BCE80916B04EFCD80916B0443CF80913E |
:107A70006B044CCF80916B0479CD80916B0489CDE0 |
:107A800080916B0430CD80916B044CCF80916B045E |
:107A9000ADCD80916B0436CE80916B04BACD8091D0 |
:107AA0006B041DCE80916D041ACE80916D049ECD25 |
:107AB00080916D04AECD20916D043DCF80916D0419 |
:107AC00031CF80916D0465CD80916D040CCD809196 |
:107AD0006D04B0CE80916D04C0CE80916D0442CF14 |
:107AE00080916D0402CF80916D0445CF80916D042B |
:107AF00055CE80916D043ACD80916D0407CF809171 |
:107B00006D04C7CD80916D04D7CD80916D049BCD60 |
:107B100080916D04EFCE80916D0453CE80916D0401 |
:107B200017CE80916D0427CE80916D045DCE80913B |
:107B30006D046DCE80916D04E5CD80916D04F5CD21 |
:107B400080916D0493CD80916904D4CE80916904B5 |
:107B5000DDCE8091690406CF809169040CCF20911D |
:107B60006904E9CE80916904DDCE33272F5F3F4F52 |
:107B70008CE398E2B9010E94565F70939E03609374 |
:107B80009D038091750880932009809174088093EB |
:107B9000D90808952F923F924F925F926F927F92F1 |
:107BA0008F929F92AF92BF92CF92DF92EF92FF920D |
:107BB0000F931F93CF93DF93CDB7DEB7EF970FB639 |
:107BC000F894DEBF0FBECDBF0E94452C209102016C |
:107BD0002C3008F0A3C2299AA0906004B0906104F0 |
:107BE000BA82A9828091D90899270A96A816B9065F |
:107BF00014F49A83898380916804843608F090C2D3 |
:107C000080910F03882309F469C480910205909143 |
:107C10000305009711F40C94D5490197909303053F |
:107C2000809302052A3011F40C94DD49243111F4BB |
:107C30000C94DD49289880913D0490913E04895E22 |
:107C4000934010F40C94D14980917C08282F33275D |
:107C50003A83298381E08093750480916208A82F7C |
:107C6000BB27AA0FBB1FFD01EA5BF74F11821082F1 |
:107C700080916308282F3327220F331FC9018A5BA5 |
:107C8000974FFC0111821082A05DB74F11961C9294 |
:107C90001E92205D374FD90111961C921E92809141 |
:107CA0006508E82FFF27EE0FFF1FE05DF74F1182F9 |
:107CB0001082809184038150809384038091840397 |
:107CC0008F3F31F0F0917504F98BFF2309F41BC449 |
:107CD0000E94623A8091130590911405AC01440F03 |
:107CE000551F480F591F00916208A02FBB27AA0FEC |
:107CF000BB1FFD01E05DF74FF0907108CF2CDD2434 |
:107D0000808191818C9D50018D9DB00C9C9DB00C0B |
:107D100011244A0D5B1D57FF02C00C942253559548 |
:107D2000479555954795AA5BB74F80917208682F84 |
:107D300077278D919C91869F9001879F300D969F0C |
:107D4000300D1124240F351F309314052093130593 |
:107D500080913B0590913C05409137055091380545 |
:107D6000840F951F281B390B3093670420936604FA |
:107D70008091150590911605AC01440F551F480FD1 |
:107D8000591F10916308A12FBB27AA0FBB1FFD012C |
:107D9000E05DF74F808191818C9D90018D9D300D2C |
:107DA0009C9D300D1124420F531F57FF02C00C94AD |
:107DB0001E535595479555954795AA5BB74F8D919D |
:107DC0009C91869F9001879F300D969F300D1124C6 |
:107DD000240F351F30931605209315058091390522 |
:107DE00090913A054091350550913605840F951FC5 |
:107DF000281B390B30936504209364048091650837 |
:107E0000E82FFF27EE0FFF1FE05DF74F8081918184 |
:107E1000909581959F4F8330910514F40C946E4991 |
:107E20000297909363048093620480916408E82F22 |
:107E3000FF27EE0FFF1FE05DF74FC080D18048E7BE |
:107E400050E0C40ED51E809196039927AA2797FD6E |
:107E5000A095BA2FBC01CD010E949D5EDC01CB0133 |
:107E600020E030E040E251E4BC01CD010E943E5EE2 |
:107E7000DC01CB01BC01CD010E94805EDC01CB01A5 |
:107E800080932609609195038093CC086093E30862 |
:107E90008091090780FF06C080912F09813810F07A |
:107EA0000C94E049D0926104C09260048091600417 |
:107EB0009091610497FF02C00C942653B0906A0819 |
:107EC000B98EB2FC02C00C94B8491092F3084091EC |
:107ED000660450916704CA0157FF02C00C94C3495D |
:107EE000959587959595879597FF02C00C94CC49F9 |
:107EF00020914104309142042817390714F00C9462 |
:107F00007649CA0157FF02C00C94375497FF02C04C |
:107F10000C943454BC0175956795759567956536D5 |
:107F2000710514F40C94794964E670E0409164049E |
:107F300050916504CA0157FD02C00C948249039612 |
:107F4000959587959595879597FD02C00C948A49DC |
:107F5000909581959F4F20913F04309140042817C0 |
:107F6000390714F40C949349C9010197C090750422 |
:107F7000C98ACC2011F40C94AE491092420410929C |
:107F800041041092400410923F04E12FFF27EE0FAE |
:107F9000FF1FE05DF74F40918E08242F332780812B |
:107FA00091812817390734F48091B10882FF02C00B |
:107FB0000C94544AE12FFF27EE0FFF1FE05DF74FAF |
:107FC000842F992720918F08821B9109208131816C |
:107FD0002817390714F410925404E12FFF27EE0FED |
:107FE000FF1FE05DF74F842F992722273327281B97 |
:107FF000390B808191818217930734F48091B10805 |
:1080000083FF02C00C944F4A80915304882391F05F |
:10801000E12FFF27EE0FFF1FE05DF74F80918F08E4 |
:108020009927841B9109208131818217930714F4C9 |
:108030000C947B4AE02FFF27EE0FFF1FE05DF74F08 |
:10804000242F3327808191812817390734F48091B8 |
:10805000B10880FF02C00C94494A50915104552345 |
:1080600099F0E02FFF27EE0FFF1FE05DF74F842F01 |
:10807000992720918F08821B91092081318128172F |
:10808000390714F40C94834AE02FFF27EE0FFF1FEB |
:10809000E05DF74F842F992722273327281B390BC0 |
:1080A000808191818217930734F48091B10881FF18 |
:1080B00002C00C94444A80915204882391F0E02F2E |
:1080C000FF27EE0FFF1FE05DF74F80918F08992784 |
:1080D000841B9109208131818217930714F40C9439 |
:1080E0007F4A80915404882331F48091530488237B |
:1080F00011F40C94414A91E0552331F480915204DB |
:10810000882311F40C945F4A81E080935604109206 |
:1081100055041092540410925304F8C129985CCD70 |
:10812000809168048D3808F4C4CD10927504909144 |
:108130007D0882E3989FC0011124909303058093EA |
:108140000205E981FA81B99714F00C94644A809190 |
:108150003D0490913E048F3F910519F010F00C946E |
:1081600017531092E6041092E7041092E80410925C |
:10817000E9041092EA041092EB041092EC041092BD |
:10818000ED048A3F910511F40C946E55309164080A |
:10819000E32FFF27EE0FFF1FE05DF74F80819181F6 |
:1081A000813591050CF4E9C040915F04442309F046 |
:1081B000E4C080916508E82FFF27EE0FFF1FE05D08 |
:1081C000F74F808191818C34910514F40C94D6542E |
:1081D000809104058F5F893C10F40C94CC552C30B1 |
:1081E00010F00C943956299810925F0410920405EF |
:1081F00010923E0410923D0400916208E02FFF2788 |
:10820000EE0FFF1FE05DF74F80819181873491056C |
:1082100014F00C94355610916308E12FFF27EE0FF0 |
:10822000FF1FE05DF74F808191810190F081E02D8B |
:10823000F7FF02C00C943257E734F1050CF470C01C |
:1082400021E0A12FBB27AA0FBB1FA05DB74F8D91C7 |
:108250009C9111978734910544F0E02FFF27EE0F92 |
:10826000FF1FE05DF74F808191818D919C91873454 |
:10827000910564F0E02FFF27EE0FFF1FE05DF74F41 |
:1082800080819181873491050CF022E0E12FFF2756 |
:10829000EE0FFF1FE05DF74F8081918186349105DD |
:1082A00064F4E02FFF27EE0FFF1FE05DF74F8081A2 |
:1082B0009181873491050CF023E0E12FFF27EE0F29 |
:1082C000FF1FE05DF74F808191818A5B9F4F64F4CF |
:1082D000E02FFF27EE0FFF1FE05DF74F80819181B8 |
:1082E000873491050CF024E0E12FFF27EE0FFF1FEC |
:1082F000E05DF74F808191818A5B9F4F64F4E02FAE |
:10830000FF27EE0FFF1FE05DF74F808191818634DC |
:1083100091050CF425E0822F0E94ED031091630873 |
:10832000E12FFF27EE0FFF1FE05DF74F8081918166 |
:108330000190F081E02DF7FF02C00C94C4567E97A7 |
:1083400014F00C94FD5580916208E82FFF27EE0F82 |
:10835000FF1FE05DF74F808191818A5B9F4F14F092 |
:108360000C94FD5581E08093FD0688EE93E0909398 |
:10837000F4038093F30330916408E32FFF27EE0F9B |
:10838000FF1FE05DF74F808191818B5A9F4F0CF06A |
:1083900090CCD0906508ED2DFF27EE0FFF1FE05D1C |
:1083A000F74F80819181855B9F4F14F00C940654A8 |
:1083B000809105058F5F893C10F40C94B45488ECCF |
:1083C0008093050581E090E090933E0480933D0406 |
:1083D00081E080935F041092EE041092EF041092FB |
:1083E000F0041092F104109284041092850410920B |
:1083F00086041092870410928004109281041092D7 |
:1084000082041092830480917608E82EFF240027CE |
:10841000112780911009909111099C01442737FD83 |
:108420004095542FC801B7010E94175FDC01CB01B2 |
:108430008093940490939504A0939604B09397042A |
:1084400080912C0990912D099C01442737FD40957E |
:10845000542FC801B7010E94175FDC01CB01809344 |
:108460008C0490938D04A0938E04B0938F0480911C |
:10847000B4049091B504A091B604B091B704809370 |
:10848000900490939104A0939204B09393048091EC |
:10849000AC049091AD04A091AE04B091AF04809370 |
:1084A000880490938904A0938A04B0938B0410925B |
:1084B000E6041092E7041092E8041092E904109286 |
:1084C000EA041092EB041092EC041092ED048091F7 |
:1084D0003C04886080933C040C94085480911203FF |
:1084E000909113038F5F9F4F09F08FCB88E99AE338 |
:1084F0009093F4038093F30380E09CE09093130344 |
:108500008093120382CBD0906A08D98E00915504D3 |
:108510000B8B002321F480915604882369F080910D |
:108520008D08992729813A818217930714F49A8339 |
:10853000898381E0809373043989332309F4CAC69F |
:108540001092630410926204109267041092660401 |
:1085500010926504109264049AE59093260988E7C6 |
:108560008093F3089093CC0888A38093E30810923B |
:108570005504109256041B8A2091E6083091E708B2 |
:108580004091E8085091E9088091B4049091B504B5 |
:10859000A091B604B091B7048DA39EA3AFA3B8A7D2 |
:1085A000280F391F4A1F5B1F8091ED089091EE083C |
:1085B000A091EF08B091F008A090AC04B090AD0489 |
:1085C000C090AE04D090AF04A9A2BAA2CBA2DCA204 |
:1085D0008A0D9B1DAC1DBD1DC090DB08D090DC0832 |
:1085E000E090DD08F090DE08CAAADBAAECAAFDAA9A |
:1085F000E090B004F090B1040091B2041091B30483 |
:10860000EC8EFD8E0E8F1F8FAAA8BBA8CCA8DDA86C |
:10861000AE0CBF1CC01ED11EAAAABBAACCAADDAA42 |
:10862000C090CD08D090CE08E090CF08F090D00850 |
:10863000CEA6DFA6E8AAF9AAE090A804F090A904C3 |
:108640000091AA041091AB04EAA6FBA60CA71DA7F3 |
:10865000AEA4BFA4C8A8D9A8AE0CBF1CC01ED11E12 |
:10866000AEA6BFA6C8AAD9AAB0905604B88EBB20A1 |
:1086700009F0CFC50B89002309F0CBC58093ED0825 |
:108680009093EE08A093EF08B093F0082093E608CB |
:108690003093E7084093E8085093E9088091E80791 |
:1086A0009091E907815092400CF07AC480915F0468 |
:1086B000882309F075C480910604909107048F3FC8 |
:1086C000910509F008F47BC5E88DEE2309F025C774 |
:1086D000FB89FF2309F021C70091730409A7002338 |
:1086E00009F01BC7109196081B8F112309F415C7B9 |
:1086F0002AA93BA94CA95DA92093DB083093DC088B |
:108700004093DD085093DE088EA59FA5A8A9B9A9BE |
:108710008093CD089093CE08A093CF08B093D00853 |
:108720008091E6089091E708A091E808B091E908E7 |
:10873000B7FF02C00C947F56292E3A2E4B2E55249B |
:1087400047FC5A942092E6083092E7084092E808E5 |
:108750005092E9088091ED089091EE08A091EF0801 |
:10876000B091F008B7FF02C00C947956892F9A2F68 |
:10877000AB2FBB27A7FDBA958D839E83AF83B887A8 |
:108780008093ED089093EE08A093EF08B093F00863 |
:1087900080917608E82EFF24002711272091A40459 |
:1087A0003091A5044091A6045091A704C801B701D7 |
:1087B0000E94175F97FF02C00C947356672E782EA5 |
:1087C000892E992487FC9A942091A0043091A104C9 |
:1087D0004091A2045091A304C801B7010E94175F01 |
:1087E00097FF02C00C946D56A72EB82EC92EDD241B |
:1087F000C7FCDA94D201C10186199709A809B90901 |
:1088000020919508E22EFF2400271127BC01CD01FD |
:10881000A80197010E948B5F39014A0119012A01C1 |
:108820008D819E81AF81B8858A199B09AC09BD09EC |
:10883000BC01CD01A80197010E948B5FD401C30147 |
:1088400097FE02C00C948B56892F9A2FAB2FBB2713 |
:10885000A7FDBA95BC01DA01C90157FF02C00C940B |
:108860008556892F9A2FAB2FBB27A7FDBA956C0190 |
:10887000809141049091420481349105D4F4809117 |
:108880003F0490914004813491059CF480916508E7 |
:10889000E82FFF27EE0FFF1FE05DF74F80819181EA |
:1088A0000190F081E02DF7FF02C00C9412577A97E7 |
:1088B00034F0809191098F3F11F40C941F56EC8C89 |
:1088C000FD8C0E8D1F8D2DA13EA14FA158A5E21A42 |
:1088D000F30A040B150BECAEFDAE0EAF1FAFE0922A |
:1088E000F204F092F3040093F4041093F5048AA5C3 |
:1088F0009BA5ACA5BDA5E9A0FAA00BA11CA18E1952 |
:108900009F09A00BB10B89879A87AB87BC8780939F |
:10891000F6049093F704A093F804B093F9040CAD17 |
:108920001DAD2EAD3FAD0093FA041093FB042093D0 |
:10893000FC043093FD048093FE049093FF04A09305 |
:108940000005B09301058091900490919104A0914D |
:108950009204B0919304801B910BA20BB30B8093F4 |
:10896000900490939104A0939204B0939304809107 |
:10897000880490918904A0918A04B0918B04298580 |
:108980003A854B855C85821B930BA40BB50B8093BA |
:10899000880490938904A0938A04B0938B043B8D40 |
:1089A000332371F120917104309172042138310523 |
:1089B00094F08091C8049091C90401969093C904E1 |
:1089C0008093C8048091F1089091F20801969093E9 |
:1089D000F2088093F10820583F4F94F48091C80426 |
:1089E0009091C90401979093C9048093C804809121 |
:1089F000F1089091F20801979093F2088093F108A2 |
:108A0000109272041092710401E0A02EB12C8CAD72 |
:108A10009DADAEADBFADB7FF02C00C94B456815052 |
:108A20009240A040B0401CF014E0A12EB12C8091E7 |
:108A30001D0590911E05A0911F05B0912005E090A5 |
:108A4000E608F090E7080091E8081091E9088E190F |
:108A50009F09A00BB10B815E914BAF4FBF4F8F535E |
:108A60009C49A040B04010F40C94D455F091920968 |
:108A7000FA8FF93114F40C943C56B0921805A09278 |
:108A800017058CAD9DADAEADBFAD81509041A040FE |
:108A9000B04014F40C94E15580911905882311F429 |
:108AA0000C94685670935804609357048CAD9DAD38 |
:108AB000AEADBFADB7FF02C00C9417579C01AD011E |
:108AC000B7FF02C00C942657B9E0559547953795E6 |
:108AD0002795BA95D1F78091170590911805820FC7 |
:108AE000931F90931805809317052CAD3DAD4EADA7 |
:108AF0005FAD57FF02C00C94205739014A01A3E033 |
:108B00009594879477946794AA95D1F713012401DB |
:108B1000F9E86F16F3E17F06F0E08F06F0E09F06BC |
:108B200044F0F8E86F2EF3E17F2E812C912C130195 |
:108B30002401D401C30197FE02C00C94FA56892F78 |
:108B40009A2FAB2FBB27A7FDBA95680F791F2CADC5 |
:108B50003DAD4EAD5FAD203080EF38078FEF480759 |
:108B60008FEF580714F00C94F15580911A05882363 |
:108B700011F40C949E567093580460935704DA01D4 |
:108B8000C90157FF02C00C9440579C01AD01B7FFCB |
:108B900002C00C944F5769E0559547953795279536 |
:108BA0006A95D1F78091170590911805820F931F50 |
:108BB00090931805809317052CAD3DAD4EAD5FAD7C |
:108BC00057FF02C00C94495739014A0143E095947C |
:108BD0008794779467944A95D1F798E769169CEE45 |
:108BE00079069FEF89069FEF990644F438E7632ED4 |
:108BF0003CEE732E3FEF832E3FEF932E60920B05DA |
:108C000070920C0580920D0590920E05D401C3015F |
:108C100097FE02C00C942C57892F9A2FAB2FBB279D |
:108C2000A7FDBA956091570470915804680F791F99 |
:108C3000AB8D2A2F3327809117059091180528179F |
:108C4000390724F43093180520931705BA8DBB23F8 |
:108C500079F02B2F332727FD3095809117059091C0 |
:108C600018052817390724F43093180520931705A1 |
:108C70002CAD3DAD4EAD5FAD2138310541055105FF |
:108C800074F08091CC049091CD042091170530911F |
:108C90001805820F931F9093CD048093CC048CAD64 |
:108CA0009DADAEADBFAD80589F4FAF4FBF4F74F479 |
:108CB0008091CC049091CD04209117053091180536 |
:108CC000821B930B9093CD048093CC04B1E0AB2E28 |
:108CD000B12C89859A85AB85BC85B7FF02C00C9401 |
:108CE000AB5681509240A040B0401CF0A4E0AA2EA8 |
:108CF000B12C20E030E040E050E0809121059091DF |
:108D00002205A0912305B09124056090ED08709094 |
:108D1000EE088090EF089090F00886199709A8094E |
:108D2000B909815E914BAF4FBF4F8F539C49A04013 |
:108D3000B04028F0FA8DF93114F40C945256B092E8 |
:108D40001805A092170589859A85AB85BC85815049 |
:108D50009041A040B04014F40C94E55580911B055F |
:108D6000882311F40C949156D0925A04C09259045D |
:108D700089859A85AB85BC85B7FF02C00C943757AF |
:108D8000B7FF02C00C940C57F9E0B595A7959795DD |
:108D90008795FA95D1F7A80EB91EB0921805A09242 |
:108DA000170529853A854B855C8557FF02C00C94D1 |
:108DB0000657E3E05595479537952795EA95D1F7FE |
:108DC0002938F3E13F07F0E04F07F0E05F0714F4C4 |
:108DD0000C94CD5688E893E1A0E0B0E080930F05B5 |
:108DE00090931005A0931105B093120580910F0583 |
:108DF00090911005A0911105B0911205B7FF02C026 |
:108E00000C940057892F9A2FAB2FBB27A7FDBA953B |
:108E1000C0905904D0905A04C80ED91E29853A85AD |
:108E20004B855C85203080EF38078FEF48078FEF48 |
:108E3000580714F00C94DD5580911C05882311F41B |
:108E40000C94BD56D0925A04C0925904DA01C9015B |
:108E500057FF02C00C945B579C01AD01B7FF02C0E5 |
:108E60000C945557B9E05595479537952795BA9580 |
:108E7000D1F78091170590911805820F931F909359 |
:108E800018058093170529853A854B855C8557FF22 |
:108E900002C00C94E156A3E0559547953795279568 |
:108EA000AA95D1F728379CEE39079FEF49079FEF26 |
:108EB000590714F00C94D75688E79CEEAFEFBFEF3C |
:108EC00080930F0590931005A0931105B0931205A0 |
:108ED00080910F0590911005A0911105B091120598 |
:108EE000B7FF02C00C94ED56892F9A2FAB2FBB27EA |
:108EF000A7FDBA95C0905904D0905A04C80ED91E47 |
:108F0000AB8D2A2F332780911705909118052817CC |
:108F1000390724F43093180520931705BA8DBB2325 |
:108F200079F02B2F332727FD3095809117059091ED |
:108F300018052817390724F43093180520931705CE |
:108F400029853A854B855C852138310541055105D8 |
:108F500074F08091CA049091CB0420911705309150 |
:108F60001805820F931F9093CB048093CA048985C0 |
:108F70009A85AB85BC8580589F4FAF4FBF4F0CF093 |
:108F8000E2C28091CA049091CB04209117053091E0 |
:108F90001805821B930B9093CB048093CA04D3C211 |
:108FA000909091096FEF961611F40C942E538091C6 |
:108FB0007608A82EBB24CC24DD246DA17EA18FA130 |
:108FC00098A5A60195010E948B5F79018A01809185 |
:108FD000100990911109AA2797FDA095BA2FE81AB8 |
:108FE000F90A0A0B1B0B69A17AA18BA19CA1A6010E |
:108FF00095010E948B5F59016A0180912C09909123 |
:109000002D09AA2797FDA095BA2FA81AB90ACA0A4E |
:10901000DB0A292C332427FC3094432C532CC20127 |
:10902000B101A80197010E94175F97FD71C23B0132 |
:109030004C01F9E09594879477946794FA95D1F769 |
:10904000C201B101A60195010E94175F97FF02C0FE |
:109050000C9476545B016C01E9E0D594C794B79405 |
:10906000A794EA95D1F7809141049091420481340C |
:1090700091053CF480913F04909140048134910526 |
:10908000C4F0D401C30197FE02C00C9469553C01A1 |
:109090004D019594879477946794D601C501D7FEC6 |
:1090A00002C00C9464555C016D01D594C794B794CB |
:1090B000A79480916508E82FFF27EE0FFF1FE05D62 |
:1090C000F74F808191810190F081E02DF7FF02C080 |
:1090D0000C9469547A97A4F0C401B30123E030E002 |
:1090E00040E050E00E948B5F39014A01C601B501A2 |
:1090F00023E030E040E050E00E948B5F59016A01BC |
:1091000080919309282F332727FD3095432F532F24 |
:10911000261537054805590514F439014A019927E0 |
:1091200087FD9095909581959F4FAA2797FDA095D3 |
:10913000BA2F681679068A069B0614F43C014D0185 |
:109140002A153B054C055D0514F459016A01A81662 |
:10915000B906CA06DB0614F45C016D018091940423 |
:1091600090919504A0919604B0919704861997095F |
:10917000A809B9098093940490939504A093960448 |
:10918000B093970480918C0490918D04A0918E04EB |
:10919000B0918F048A199B09AC09BD0980938C0496 |
:1091A00090938D04A0938E04B0938F048091060455 |
:1091B000909107048F3F910511F008F085CAAAA885 |
:1091C000BBA8CCA8DDA8A092DB08B092DC08C092B6 |
:1091D000DD08D092DE08CEA4DFA4E8A8F9A8C092EA |
:1091E000CD08D092CE08E092CF08F092D008D0906F |
:1091F000F308DA8A0091730409A7A0906204B09082 |
:109200006304C501B7FE01C2882799278A199B0903 |
:10921000FCC11092A4041092A5041092A60410920E |
:10922000A7041092A0041092A1041092A20410921C |
:10923000A3041092E6081092E7081092E808109232 |
:10924000E9081092ED081092EE081092EF081092C3 |
:10925000F0081EA61FA618AA19AA20E030E040E0D8 |
:1092600050E02AAB3BAB4CAB5DAB8091940490914A |
:109270009504A0919604B0919704809390049093E4 |
:109280009104A0939204B093930480918C049091E4 |
:109290008D04A0918E04B0918F04809388049093E4 |
:1092A0008904A0938A04B0938B041092070410924F |
:1092B0000604109258041092570410925A04109207 |
:1092C0005904388D332309F0F6C94B89442309F03A |
:1092D000F2C9E4C94091E30848A34EC93FEF8E3F6D |
:1092E00093070CF0E6C002960C94113FB90161504F |
:1092F00070404091640450916504CA0157FF02C058 |
:109300000C949F3F959587959595879597FF02C0FB |
:109310000C94A83F20913F0430914004281739074E |
:1093200014F00C94B43FCA0157FF02C00C942C54A3 |
:1093300097FF02C00C943154959587959595879524 |
:109340008536910514F40C94B63F84E690E0C09005 |
:109350007504C98ACC2011F00C94BD3F9093400451 |
:1093600080933F0470934204609341040C94C53F82 |
:109370006093F3084091660450916704CA0157FD59 |
:1093800002C00C94703F03969595879595958795A7 |
:1093900097FD02C00C94783F909581959F4F0C9457 |
:1093A000783F10925F040C94593E10925F04109223 |
:1093B00075042A3011F00C94163E289A0C941B3E2A |
:1093C00080910207992787FD90954F2D5527849FFF |
:1093D000D001859FB00D949FB00D1124CD01209137 |
:1093E000660430916704820F931F90936704809303 |
:1093F000660480910307992787FD9095849FF0016B |
:10940000859FF00D949FF00D1124CF0120916404ED |
:1094100030916504820F931F9093650480936404D8 |
:1094200080910407992787FD9095209162043091DF |
:109430006304820F931F909363048093620480916E |
:109440000607282F332727FD309580916F0899272D |
:10945000289F5001299FB00C389FB00C1124B09266 |
:109460008B03A0928A038091050799278C159D058F |
:1094700014F00C94523F90936104809360040C9418 |
:10948000563F982F0C947C4081E0809352040C94BA |
:10949000714081E080935104582F0C94444081E046 |
:1094A000809353040C941A4081E0809354040C94EC |
:1094B000ED3F10926304109262040C94153F909358 |
:1094C00055048093560422C880915F04882311F4C8 |
:1094D0000C94A74080913D0490913E04FFEF8F3F94 |
:1094E0009F0711F40C94AB40019690933E04809337 |
:1094F0003D040C94AB40109253040C941A4010920B |
:1095000052040C9471401092510450E00C94444069 |
:1095100061507E4F8F4F9F4F8ACD60E070E06B01AE |
:109520001092730419A6E090E608F090E708009105 |
:10953000E8081091E9086090ED087090EE088090BE |
:10954000EF089090F008F091F308FA8BFF2311F0E8 |
:109550000C94B55210925A04109259041092580467 |
:1095600010925704E0921D05F0921E0500931F050E |
:1095700010932005609221057092220580922305A8 |
:10958000909224051092A4041092A5041092A604AF |
:109590001092A7041092A0041092A1041092A204A9 |
:1095A0001092A30410929C0410929D0410929E04A9 |
:1095B00010929F041092E6081092E7081092E808B3 |
:1095C0001092E9081092ED081092EE081092EF0840 |
:1095D0001092F0081092DB081092DC081092DD085F |
:1095E0001092DE081092CD081092CE081092CF088B |
:1095F0001092D0081092070410920604A090620402 |
:10960000B0906304C501B7FCFFCD409774F068EEDD |
:10961000262E63E0362E3092A8032092A703198DE0 |
:1096200014FD03C081E080930A05D0907308ED2CEF |
:10963000FF2400271127B501882777FD8095982FF3 |
:109640009501B7FCBDC7442737FD4095542F0E94B4 |
:10965000175F9B01AC01C801B7010E94175F97FD1E |
:10966000AAC759E095958795779567955A95D1F74B |
:109670009B018D2D99278A9DA0018B9D500D9A9D50 |
:10968000500D1124CA0157FD94C79595879595955E |
:109690008795280F391FC901AA2797FDA095BA2FD2 |
:1096A0008093EE049093EF04A093F004B093F10440 |
:1096B0002091840430918504409186045091870460 |
:1096C000281B390B4A0B5B0B213563EC360760E036 |
:1096D000460760E056070CF423C780E593ECA0E052 |
:1096E000B0E08093840490938504A0938604B093A3 |
:1096F00087048091840490918504A0918604B091A0 |
:109700008704805B9C43AF4FBF4F64F480EB9CE3C6 |
:10971000AFEFBFEF8093840490938504A0938604F9 |
:10972000B0938704C0907A04D0907B04C114D10414 |
:1097300009F4F3C5F98DF3FFF0C58DA19EA1AFA18A |
:10974000B8A5B7FF02C00C943C5409E0B595A795A5 |
:10975000979587950A95D1F79DAF8CAF97FF02C07B |
:109760000C94485489A19AA1ABA1BCA1B7FF02C037 |
:109770000C94425419E0B595A795979587951A953D |
:10978000D1F7BC0197FF02C00C945D54ECACFDAC6A |
:10979000E616F70614F47DAF6CAF6CAD7DAD77FFC8 |
:1097A00002C00C9459542B015594479455944794F6 |
:1097B000559447940894411C511C0CE112E0C00ED2 |
:1097C000D11E76010027F7FC0095102F24EE3DEF07 |
:1097D000C20ED31E609028097090290980902A0932 |
:1097E00090902B098091860390918703A091880324 |
:1097F000B09189038C8B9D8BAE8BBF8BC401B30161 |
:109800002C893D894E895F890E948B5FE21AF30A99 |
:10981000040B150BC801B70128E631E040E050E029 |
:109820000E948B5FDC01CB018C01045B1040A09097 |
:109830002109B0902209C501B7FE02C00C9453540F |
:109840008138910514F000E010E02090A7033090DB |
:10985000A80321143104A1F4ACADBDAD599784F433 |
:109860008091710490917204800F911F9093720403 |
:109870008093710480910A05882311F00C94B754E9 |
:10988000C801880F991F880F991F880F991FB2016F |
:109890000E94565F9B01442737FD4095542F260DAB |
:1098A000371D481D591D20932809309329094093DD |
:1098B0002A0950932B09F09098036F2D7727ECAD70 |
:1098C000FDAD6E9FC0016F9F900D7E9F900D112486 |
:1098D00097FDE7C795958795959587959595879574 |
:1098E0009595879595958795681B790B7DAF6CAF9E |
:1098F00077FDE8C72114310409F0F0C70091410455 |
:109900001091420480913F0490914004080F191F68 |
:1099100017FF02C00C94AE55159507951595079540 |
:1099200015950795005C1F4FCA01B9012C893D8927 |
:109930004E895F890E948B5FDA01C901209178040A |
:1099400030917904442737FD4095542F821B930BA7 |
:10995000A40BB50B845E9D4FAF4FBF4FBC01CD0133 |
:1099600028E631E040E050E00E948B5FDC01CB0153 |
:10997000845B90404CAD5DAD849F9001859F300D20 |
:10998000949F300D1124C901B8010E94565F83E0F5 |
:10999000F89ED0011124BDAFACAFA617B7070CF0ED |
:1099A000ABC7BD01CB01AA2797FDA095BA2F209187 |
:1099B0008404309185044091860450918704820F7D |
:1099C000931FA41FB51F8093840490938504A093D4 |
:1099D0008604B09387048091090581508F3F09F474 |
:1099E000A5C480930905B9A5BB2381F01092EA04B0 |
:1099F0001092EB041092EC041092ED041092E60425 |
:109A00001092E7041092E8041092E904E88DEE2326 |
:109A100009F06EC5FA898F2F9927AA27BB27BC01A9 |
:109A2000CD012DA13EA14FA158A50E94175FDC01D9 |
:109A3000CB01BC01CD0128EF3AE240E050E00E94AA |
:109A40008B5F19010B89002309F04FC51A89812FFB |
:109A50009927AA27BB27BC01CD0129A13AA14BA177 |
:109A60005CA10E94175FDC01CB01BC01CD0128EF96 |
:109A70003AE240E050E00E948B5F3C832B83809071 |
:109A8000C7089090C80829EC821691040CF422C5EE |
:109A9000A8EC8A2E912C9092C8088092C708009159 |
:109AA000D2081091D308093C11050CF40BC508EC41 |
:109AB00010E01093D3080093D2088091D4089091BD |
:109AC000D508AA2797FDA095BA2F20912609C22E66 |
:109AD000DD24EE24FF24BC01CD01A70196010E94E4 |
:109AE000175F9B01AC01C401AA2797FDA095BA2F6F |
:109AF000E7E0880F991FAA1FBB1FEA95D1F7280F2F |
:109B0000391F4A1F5B1F57FD6EC576E05595479577 |
:109B1000379527957A95D1F74101820E931E24013E |
:109B20008091C5089091C608AA2797FDA095BA2FE5 |
:109B3000BC01CD01A70196010E94175F9B01AC01FA |
:109B4000C801AA2797FDA095BA2F67E0880F991F33 |
:109B5000AA1FBB1F6A95D1F7280F391F4A1F5B1F29 |
:109B600057FD3CC596E055954795379527959A95AD |
:109B7000D1F76B807C80620E731E6301AA0CBB1C44 |
:109B8000C501AA2797FDA095BA2F2091CC083327AD |
:109B900044275527BC01CD010E94175F7B018C0132 |
:109BA00097FD13C586E015950795F794E7948A9578 |
:109BB000D1F7E8A18E2F9927AA27BB2720919804D7 |
:109BC0003091990440919A0450919B04BC01CD01BD |
:109BD0000E94175FDC01CB01BC01CD0120EF35E510 |
:109BE00040E050E00E948B5F5701A20EB31EC501FA |
:109BF000F1E08F16F0E49F0624F0812C10E4912E02 |
:109C0000240100E0801600EC90060CF074C4812C56 |
:109C1000B0EC9B2E9092D5088092D40811E061168A |
:109C200010E4710624F0612CA0E47A2E630120E098 |
:109C3000621620EC72060CF068C4612CF0EC7F2EEA |
:109C40007092C6086092C50831E0A31630E4B306EE |
:109C500024F0A12CE0E4BE2EC50140E0A41640ECA7 |
:109C6000B4060CF04DC4A12C70ECB72EB0922209B2 |
:109C7000A0922109809133048823C1F080913D0492 |
:109C800090913E040297C09788F489819A811816B2 |
:109C9000190664F481E090E090933E0480933D04C3 |
:109CA0008091D908A82FBB27BA83A983E981FA81BB |
:109CB000EE0FFF1FEE0FFF1FFA83E983F98D8F2F41 |
:109CC000992780FFB8C081FF34C480919B03823301 |
:109CD00008F0A8C48091C40381508F3F09F420C6C6 |
:109CE0008093C40320915D0430915E04598955230B |
:109CF00021F010925C0410925B04890120915B04B6 |
:109D000030915C04201731070CF095C080917404E9 |
:109D1000882309F490C0021B130B80919A039927A2 |
:109D2000089FD001099FB00D189FB00D1124CD01DF |
:109D3000B7FD0EC78C011595079515950795E98117 |
:109D4000FA81E01BF10B8F018091080490910904C6 |
:109D500097FDFCC695958795081B190BC0907C0450 |
:109D6000D0907D04E0907E04F0907F04F7FCE5C67F |
:109D700037E0F594E794D794C7943A95D1F780915A |
:109D80009903282F332744275527C701B6010E947E |
:109D9000175F97FDCDC625E09595879577956795D3 |
:109DA0002A95D1F731E0693173070CF427C568E1D2 |
:109DB00071E0061B170B80910705909108059C0127 |
:109DC00022953295307F3227207F3227281B390B8E |
:109DD000200F311F37FDA9C6A90155954795559507 |
:109DE00047955595479555954795BA0180916B08CC |
:109DF000282F3327220F331F220F331F42175307F9 |
:109E00006CF489819A81821793070CF0AAC5A98105 |
:109E1000BA81A217B30714F4AD01BD01E981FA813B |
:109E2000E417F5070CF0E3C4AF01F0930805E093E5 |
:109E300007055A83498350902009852D9927880F5B |
:109E4000991F880F991F80559040C980DA808C1522 |
:109E50009D0514F49A838983E980FA80F092B30710 |
:109E6000E092B2078091EE049091EF04A091F0048B |
:109E7000B091F104880F991FAA1FBB1F880F991F6B |
:109E8000AA1FBB1FA81AB90ABBAEAAAE8701013A26 |
:109E900011050CF403C3C701F7FCDEC39595879544 |
:109EA0002AAD3BAD8217930714F49BAF8AAF909510 |
:109EB00081959F4F4AAD5BAD4817590714F49BAF8E |
:109EC0008AAF252D3327220F331F220F331FC901DD |
:109ED00049815A81841B950BAAADBBAD8A179B079C |
:109EE00014F49BAF8AAF69817A81621B730BEAAD70 |
:109EF000FBADE617F70714F47BAF6AAF80916604F9 |
:109F0000909167048401081B190B1093E5080093D6 |
:109F1000E408FA89FF2309F4BBC2281A390AC101EF |
:109F2000AA2797FDA095BA2F2091E6043091E70467 |
:109F30004091E8045091E904820F931FA41FB51FBC |
:109F40008093E6049093E704A093E804B093E904B7 |
:109F50006091E6047091E7048091E8049091E9042F |
:109F600061302AEF720720E0820720E0920774F048 |
:109F700080E09AEFA0E0B0E08093E6049093E704DD |
:109F8000A093E804B093E904BC01CD01603036E051 |
:109F900073073FEF83073FEF930774F480E096E089 |
:109FA000AFEFBFEF8093E6049093E704A093E8043B |
:109FB000B093E904BC01CD01E0909D03F0909E03B5 |
:109FC0009701442737FD4095542F0E948B5F68010D |
:109FD000C20ED31EB0908C036B2D7727882799274C |
:109FE0002AAD3BAD37FD04C337FD07C33595279533 |
:109FF00049815A81240F351F442737FD4095542F3E |
:10A000000E94175F97FD09C326E095958795779580 |
:10A0100067952A95D1F79B016C157D050CF46B01B2 |
:10A0200066277727621B730BC616D7060CF46B01E5 |
:10A0300080916404909165048301081B190B1093AF |
:10A04000C4080093C3085A89552309F463C2AB813D |
:10A05000BC81A81BB90BFD01CF01AA2797FDA095D4 |
:10A06000BA2F2091EA043091EB044091EC04509116 |
:10A07000ED04820F931FA41FB51F8093EA049093F1 |
:10A08000EB04A093EC04B093ED046091EA047091AA |
:10A09000EB048091EC049091ED046130FAEF7F07BE |
:10A0A000F0E08F07F0E09F0774F080E09AEFA0E007 |
:10A0B000B0E08093EA049093EB04A093EC04B09397 |
:10A0C000ED04BC01CD01603026E072072FEF82075E |
:10A0D0002FEF920774F480E096E0AFEFBFEF80932C |
:10A0E000EA049093EB04A093EC04B093ED04BC015C |
:10A0F000CD019701442737FD4095542F0E948B5F77 |
:10A100007801E20EF31E6B2D7727882799272AAD59 |
:10A110003BAD37FD34C237FD37C2359527954981B0 |
:10A120005A81240F351F442737FD4095542F0E9434 |
:10A13000175F97FD39C216E09595879577956795D6 |
:10A140001A95D1F79B016E157F050CF47B016627EC |
:10A150007727621B730BE616F7060CF47B01C6012A |
:10A16000AA2797FDA095BA2F8D879E87AF87B88BBA |
:10A170008091D908A82FBB27BFABAEABE52DFF2739 |
:10A18000F9AFE8AFB3E1CB2EB9E0DB2E02E515E085 |
:10A190002701662457FC6094762CEAACFBAC47019F |
:10A1A000AA2497FCA094BA2CABE03A2EF4EFEF2E41 |
:10A1B000F8E0FF2E06C0FDAFECAFECADD601EC939E |
:10A1C00083C6F801258512160CF08FC049815A818B |
:10A1D000CA01AA2797FDA095BA2F332727FD3095EE |
:10A1E000432F532FBC01CD010E94175F97FD80C004 |
:10A1F000E6E09595879577956795EA95D1F77DAFD8 |
:10A200006CAFF8018685282F332727FD3095432F23 |
:10A21000532F6D857E858F8598890E94175F97FDE6 |
:10A2200077C056E095958795779567955A95D1F7BC |
:10A230002CAD3DAD260F371F3DAF2CAFF801878504 |
:10A24000282F332727FD3095432F532FC301B20109 |
:10A250000E94175F97FD57C046E0959587957795C3 |
:10A2600067954A95D1F72CAD3DAD260F371F3DAF11 |
:10A270002CAFF8018089282F332727FD3095432FF5 |
:10A28000532FC501B4010E94175FDC01CB01B7FD5C |
:10A2900036C036E0B595A795979587953A95D1F74D |
:10A2A000F701608171812CAD3DAD820F931F0E943B |
:10A2B000092CD7018D939C9397FD1FC09595879589 |
:10A2C000959587959DAF8CAFEEA9FFA98E179F0737 |
:10A2D0000CF471CF28AD39AD4CAD5DAD2417350709 |
:10A2E0000CF06BCF3DAF2CAF68CFD6011C92ECC504 |
:10A2F000615C7F4F8F4F9F4F7BCF0396DFCFCF9611 |
:10A30000A11DB11DC6CF615C7F4F8F4F9F4FA4CF62 |
:10A31000615C7F4F8F4F9F4F84CFA0902109B090F9 |
:10A32000220980910905815008F05BCB88E1809378 |
:10A330000905809176089927880F991F880F991F22 |
:10A340007C010027F7FC0095102F6DA17EA18FA145 |
:10A3500098A5A80197010E948B5F3093A5072093D1 |
:10A36000A40769A17AA18BA19CA1A80197010E94D1 |
:10A370008B5F3093A7072093A607809110099091D7 |
:10A38000110997FD67C29595879595958795909347 |
:10A39000A9078093A80780912C0990912D0997FD1A |
:10A3A00057C295958795959587959093AB07809320 |
:10A3B000AA07B092AD07A092AC0720915D0430913E |
:10A3C0005E043093AF072093AE078091E807909129 |
:10A3D000E9079093B1078093B007D092B507C09278 |
:10A3E000B40780912703909128039093B707809337 |
:10A3F000B6078091280990912909A0912A09B09166 |
:10A400002B09209186033091870340918803509156 |
:10A410008903BC01CD010E948B5F3093BB07209361 |
:10A42000BA078091680499279093B9078093B80779 |
:10A430008091FD0699279093CB078093CA0780915E |
:10A44000EF039091F0039093CD078093CC07809118 |
:10A450009209992787FD90959093DB078093DA07FF |
:10A460008091940999279093DF078093DE0780916C |
:10A470003B0590913C059093E1078093E007809124 |
:10A48000390590913A059093E3078093E207ABCAB0 |
:10A49000C801AA2797FDA095BA2F46CD8AAD9BADDE |
:10A4A0008135910524F0A0E5B0E0BBAFAAAFEAADDD |
:10A4B000FBADE05BFF4F0CF004CD20EB3FEF3BAF7B |
:10A4C0002AAFFFCC4FEF083314070CF0F6CA08E3AD |
:10A4D0001FEFEFCA38E383163FEF93060CF0DFCA95 |
:10A4E000F8E38F2EFFEF9F2ED6CA1C821B82C7CAAD |
:10A4F00022243324A7CA5092D5084092D4088ECB88 |
:10A500009093220980932109B5CBD092C608C092BE |
:10A51000C5089ACBC801AA2797FDA095BA2FA1CD4F |
:10A5200020938404309385044093860450938704D9 |
:10A53000E0C820919B0380918A0390918B03820F46 |
:10A54000911D20916F083327829FA001839F500D9A |
:10A55000929F500D1124CA01449790935C048093FC |
:10A560005B0481E080937404BDCBD0925A04C09206 |
:10A57000590470935804609357040C94B24A309570 |
:10A5800021953F4F37FFC9CD2F5F3F4F3595279519 |
:10A5900049815A81240F351F442737FD4095542F98 |
:10A5A0000E94175F97FFC7CD615C7F4F8F4F9F4F12 |
:10A5B000C2CD03966AC861507E4F8F4F9F4F51C8DE |
:10A5C000222733272A193B093EC88FE390E0A0E0F9 |
:10A5D000B0E0E80EF91E0A1F1B1FE4CA215C3F4FC2 |
:10A5E0004F4F5F4FBFCA215C3F4F4F4F5F4F8DCAE8 |
:10A5F000309521953F4F37FFF9CC2F5F3F4F359571 |
:10A60000279549815A81240F351F442737FD4095EE |
:10A61000542F0E94175F97FFF7CC615C7F4F8F4FDD |
:10A620009F4FF2CC81E08093740488EC59CB8091E9 |
:10A630003C04826080933C040C94C6404D5F5F4FA5 |
:10A640000C94D93E4D5F5F4F0C948F3E1092610485 |
:10A65000109260040C945E3F019620CC80917608A5 |
:10A66000E82EFF24002711276DA17EA18FA198A5B8 |
:10A67000A80197010E948B5F39014A01809110095E |
:10A6800090911109AA2797FDA095BA2F681A790A07 |
:10A690008A0A9B0A69A17AA18BA19CA1A8019701B2 |
:10A6A0000E948B5F59016A0180912C0990912D09BC |
:10A6B000AA2797FDA095BA2FA81AB90ACA0ADB0AD9 |
:10A6C000D401C30197FC46C23C014D0154E095946E |
:10A6D0008794779467945A95D1F7D601C501D7FC32 |
:10A6E00057C25C016D0144E0D594C794B794A79418 |
:10A6F0004A95D1F7809141049091420481349105AB |
:10A700000CF405C1C401B30123E030E040E050E0A7 |
:10A710000E948B5F39014A01C601B50123E030E098 |
:10A7200040E050E00E948B5F59016A01809165080A |
:10A73000E82FFF27EE0FFF1FE05DF74F808191812B |
:10A740000190F081E02DF7FD1FC27A97A4F0C401BB |
:10A75000B30123E030E040E050E00E948B5F39011C |
:10A760004A01C601B50123E030E040E050E00E941C |
:10A770008B5F59016A0181E26816710481049104BA |
:10A780002CF030E2632E712C812C912C90EE691606 |
:10A790009FEF79069FEF89069FEF990644F420EE1C |
:10A7A000622E2FEF722E2FEF822E2FEF922EA1E22C |
:10A7B000AA16B104C104D1042CF090E2A92EB12C48 |
:10A7C000C12CD12CB0EEAB16BFEFBB06BFEFCB0652 |
:10A7D000BFEFDB0614F00C94AE4880EEA82E8FEF8E |
:10A7E000B82E8FEFC82E8FEFD82E0C94AE487093F2 |
:10A7F0000805609307055A8349831DCB4EEF683ED9 |
:10A8000074070CF0D6CA68EE7EEFD3CA1092050525 |
:10A81000ED2DFF27EE0FFF1FE05DF74F8081918147 |
:10A820008C3491058CF0809106058F5F893C08F48B |
:10A8300047C110925F0488EC8093060510923E0495 |
:10A8400010923D040C94593E109206050C94593E0A |
:10A850000396A7CD039697CD909581959F4F0C9425 |
:10A86000984903960C949C4903960C948A3F9095C2 |
:10A8700081959F4F0C94863F81509E4FAF4FBF4FA5 |
:10A880000C94A54B81509E4FAF4FBF4F0C94BA4BC9 |
:10A890005C01B094A194B108B394BDAEACAE0C947D |
:10A8A000B24B4F9617C8882799278A199B090C9491 |
:10A8B000204C695F7F4F0C94D34B709561957F4F0F |
:10A8C0000C94C64B84EF91E09093A8038093A70368 |
:10A8D00082C8F095E195FF4F0C946A4808942108CE |
:10A8E00031083092A8032092A70375C861507E4FAB |
:10A8F0008F4F9F4F0C942A488CAD9DAD90958195BC |
:10A900009F4F681779070CF04DC8BC014BC8809168 |
:10A910003F0490914004813491050CF407CFF2CEAE |
:10A9200080911D0390911E03895E934008F4EBC053 |
:10A9300087B58E3F08F0E7C087B5843F08F022C294 |
:10A9400090910A049A5090930A048091F307891B0E |
:10A9500087BD8CE291E09093F4038093F3038AEF38 |
:10A96000BFC9A901B90153CA8093050551CF88EC2D |
:10A9700090E09093F4038093F303C601AA2797FD18 |
:10A98000A095BA2FBC01CD012C893D894E895F89E4 |
:10A990000E94175F3B014C010E948B5F309379044A |
:10A9A0002093780410920A050C94404C8081918188 |
:10A9B000855B9F4F0CF0F4C0809104058F5F8093FE |
:10A9C0000405893C10F40C94BD412C3008F0E3C11F |
:10A9D0002998A4E0B0E08FEF082E0E94B35F109298 |
:10A9E0005F041092040510923E0410923D040E94F0 |
:10A9F0006637A4E0B0E08091C2049091C30497FD53 |
:10AA0000E9C1892F990F990B082E0E94B35FA5E029 |
:10AA1000B0E08091C2049091C304082E0E94B35FFD |
:10AA2000A6E0B0E08091C0049091C10497FDCFC131 |
:10AA3000892F990F990B082E0E94B35FA7E0B0E011 |
:10AA40008091C0049091C104082E0E94B35F08E079 |
:10AA500010E08091BA049091BB04A091BC04B09125 |
:10AA6000BD04BC01CD010E94805EDC01CB019C01D4 |
:10AA700097FDB9C1832F992787FD9A95D801082E94 |
:10AA80000E94B35F09E010E08091BA049091BB048A |
:10AA9000A091BC04B091BD04BC01CD010E94805EB8 |
:10AAA000DC01CB01D801082E0E94B35F0E9428046C |
:10AAB00068E770E00E941F2C309164080C94BD413F |
:10AAC000809306050C94593E0196A11DB11D0C946E |
:10AAD00053480196A11DB11D0C94474881E0809315 |
:10AAE0000A051092EE041092EF041092F0041092F6 |
:10AAF000F10410928404109285041092860410923E |
:10AB000087040C94C64080911D0390911E038436E7 |
:10AB1000910540F587B5823028F187B58B3008F470 |
:10AB200038C190910A04965F0ECF215F3F4F54C900 |
:10AB3000615E7F4F8F4F9F4F2EC92FE730E040E07F |
:10AB400050E0C20ED31EE41EF51E12C9019602C9C2 |
:10AB50000396F0C80F96A11DB11DB6CD095F1F4F1A |
:10AB60000C948C4C20915D0430915E042451304053 |
:10AB700030935C0420935B042C5E3F4F109274046E |
:10AB800081E08093C403B2C8F095E195FF4FDDCD1D |
:10AB90000F96A11DB11DA5CD809304050C94BD4158 |
:10ABA000409304050C94BD41B0921805A09217057E |
:10ABB000209192092A8F0C94414510921C050C9407 |
:10ABC0008047109219050C94A74520930F053093E8 |
:10ABD0001005409311055093120510921B050C941B |
:10ABE0000E4720920B0530920C0540920D055092B5 |
:10ABF0000E0510921A050C9418460E94280441E68E |
:10AC000062E678E00E94D00380916A0880FF10C05D |
:10AC100080911D0390911E03875B934038F48091CF |
:10AC20001D0390911E038E5E924010F40E94BF1986 |
:10AC30000E94663781E08093F103579A37CF709373 |
:10AC4000580460935704D0925A04C0925904CB011F |
:10AC500077FDCEC0BC0175956795C601D7FCC6C00F |
:10AC60006C01D594C7940C945F44109163080C94C4 |
:10AC70002041299A0C94F44060920B0570920C05C7 |
:10AC800080920D0590920E051092180510921705EE |
:10AC900088EE282E83E0382E3092A8032092A70356 |
:10ACA0000C94184620930F0530931005409311051E |
:10ACB000509312051092180510921705E8EE2E2EEB |
:10ACC000E3E03E2E3092A8032092A7030C94804725 |
:10ACD00081E0809319050C94A74561507F4F8F4FF9 |
:10ACE0009F4F0C94F44361507F4F8F4F9F4F0C94B4 |
:10ACF000DE4381509F4FAF4FBF4F0C94B6438150FE |
:10AD00009F4FAF4FBF4F0C949C4381509F4FAF4F0D |
:10AD1000BF4F0C94314481509F4FAF4FBF4F0C94A5 |
:10AD2000244420930F053093100540931105509350 |
:10AD3000120581E080931B050C940E4720920B05B1 |
:10AD400030920C0540920D0550920E0581E08093E3 |
:10AD50001A050C941846B095A095909581959F4F33 |
:10AD6000AF4FBF4F0C947146B095A09590958195CB |
:10AD70009F4FAF4FBF4F0C940F4581E080931C0550 |
:10AD80000C9480478EEFE4CDF095E195FF4F0C9445 |
:10AD90009F4181E0DDCD299A1CCE20930F05309391 |
:10ADA000100540931105509312050C94F64620931C |
:10ADB0000F053093100540931105509312050C9424 |
:10ADC0006847295F3F4F4F4F5F4F0C944B4781506F |
:10ADD0009F4F2ECE81509F4F14CE81509F4FAF4F2B |
:10ADE000BF4F0C94744721503F4F44CE019638CF4B |
:10ADF000019630CF81509F4FAF4FBF4F0C949F456E |
:10AE000081509F4FAF4FBF4F0C940247295F3F4F78 |
:10AE10004F4F5F4F0C94D94681509E4FAF4FBF4F5D |
:10AE20000C94C446F095E195FF4F0C945744B095AF |
:10AE3000A095909581959F4FAF4FBF4F0C945E4565 |
:10AE4000295F3F4F4F4F5F4F0C947D4521503E4F40 |
:10AE50004F4F5F4F0C94644581509F4FAF4FBF4F92 |
:10AE60000C940C46F095E195FF4F0C941C41B09565 |
:10AE7000A095909581959F4FAF4FBF4F0C94C046C2 |
:10AE8000B095A095909581959F4FAF4FBF4F0C9473 |
:10AE9000C545295F3F4F4F4F5F4F0C94E44521500C |
:10AEA0003E4F4F4F5F4F0C94CB4521503E4F4F4F7D |
:10AEB0005F4F0C943247B095A095909581959F4F28 |
:10AEC000AF4FBF4F0C942C473A94E2E0F0E0EE0E07 |
:10AED000FF1E0C5F1F4F0894C11CD11C37FE71C9A7 |
:10AEE000EF960FB6F894DEBF0FBECDBFDF91CF91C6 |
:10AEF0001F910F91FF90EF90DF90CF90BF90AF9098 |
:10AF00009F908F907F906F905F904F903F902F9089 |
:10AF100008958091310590913205A0913305B0914B |
:10AF200034058093290590932A05A0932B05B093AF |
:10AF30002C0580912D0590912E05A0912F05B091A3 |
:10AF400030058093250590932605A0932705B0939F |
:10AF50002805089510923C0510923B0510923A0581 |
:10AF600010923905089584B1806A84B93D9A82E5CA |
:10AF70008CBD1DBC459A81E0809332098AEA80939A |
:10AF8000360983E8809337098AE080933809109264 |
:10AF90003A091092390910923C0910923B0910921B |
:10AFA000940910925809109259098BE480935A0918 |
:10AFB00010925B0986E080935C090895EF92FF92FE |
:10AFC0000F931F93F894809176089927880F991F03 |
:10AFD000880F991F7C010027F7FC0095102F8091A6 |
:10AFE000B4049091B504A091B604B091B704BC012B |
:10AFF000CD01A80197010E948B5F30933A092093FD |
:10B0000039098091AC049091AD04A091AE04B09147 |
:10B01000AF04BC01CD01A80197010E948B5F309362 |
:10B020003C0920933B09209128093091290940913E |
:10B030002A0950912B09DA01C90173E0880F991F81 |
:10B04000AA1FBB1F7A95D1F7820F931FA41FB51FAC |
:10B05000820F931FA41FB51F209186033091870391 |
:10B060004091880350918903BC01CD010E948B5F00 |
:10B070003093420920934109E091BE04F091BF044E |
:10B080008091EA089091EB08BF010E94565FCB01C6 |
:10B090009B01220F331F220F331F280F391F280F48 |
:10B0A000391F37FDF2C03595279535952795309393 |
:10B0B0003E0920933D098091240990912509BF0103 |
:10B0C0000E94565F9B01220F331F220F331F260F52 |
:10B0D000371F260F371F37FDD5C035952795359576 |
:10B0E00027953093400920933F091092BF04109296 |
:10B0F000BE041092EB081092EA08109225091092F3 |
:10B1000024098091380999278C30910509F48AC067 |
:10B110008D3091050CF06AC08A30910509F433C175 |
:10B120000B9709F4B5C0789480915809882309F4E5 |
:10B13000A0C020915E0930915F09C90181509E4FE6 |
:10B140008F5F9340C8F44091600950916109CA0132 |
:10B1500081509E4F8F5F934078F480916A0885FFFD |
:10B160000BC030933C0520933B0550933A05409328 |
:10B1700039058AEF80933E058091640990916509B5 |
:10B1800021E0893692070CF0E8C09C0190937B0483 |
:10B1900080937A048091780490917904281B390B6C |
:10B1A000C901845E9D4F68E671E00E94565F845B32 |
:10B1B00090409093770480937604209168093091B1 |
:10B1C00069098091F3039091F4038217930740F487 |
:10B1D0008091FD06882321F43093F4032093F30338 |
:10B1E00080915D09873609F055C1BCC08D3091054D |
:10B1F00009F404C10E9709F096CF80915909809304 |
:10B20000490980915A0980934A0980915B0980938A |
:10B210004B0980915C0980934C09809102018093D5 |
:10B220004D0981CF8091FD06863018F01092FD0601 |
:10B2300085E08093490980915D0490915E0490932C |
:10B240004C0980934B098091AF0880934A09809103 |
:10B25000A50880934D098091A60880934E0980919E |
:10B26000A70880934F09789480915809882309F0A2 |
:10B2700060CF10923C0510923B0510923A05109257 |
:10B28000390508C12D5F3F4F28CF2D5F3F4F0BCFB2 |
:10B2900080916408E82FFF27EE0FFF1FE05DF74F56 |
:10B2A0000190F081E02DE038F1050CF0D8C02FEFCF |
:10B2B000E138F20714F4E1E8FFEFE09349098091E7 |
:10B2C0006508E82FFF27EE0FFF1FE05DF74F0190A5 |
:10B2D000F081E02DE038F1050CF4D4C0EFE7F0E0A8 |
:10B2E000E0934A0980916308E82FFF27EE0FFF1FC4 |
:10B2F000E05DF74F0190F081E02DE038F1050CF4AE |
:10B30000B9C0EFE7F0E0E0934B0980916208E82FC5 |
:10B31000FF27EE0FFF1FE05DF74F0190F081E02D5A |
:10B32000E038F1050CF49EC0EFE7F0E0E0934C0943 |
:10B3300080916F0480934D0980916D0480934E0934 |
:10B3400080916B0480934F09809169048093500928 |
:10B350008091680480935109E6CE20917A0430915F |
:10B360007B0418CF80916A098093910980916B09C1 |
:10B370008093930980916C098093920980916D0963 |
:10B380008093940987C080915004809349098091EB |
:10B390004F0480934A0980914E0480934B09809119 |
:10B3A0004D0480934C0980914C0480934D09809109 |
:10B3B0004B0480934E0980914A0480934F098091F9 |
:10B3C00049048093500980913C04809351098091F5 |
:10B3D0003C04837F80933C04809127039091280351 |
:10B3E0008093520980917B0880935309A2E0B0E0DA |
:10B3F0000E94A65F802D8093540995CE8091A0086D |
:10B40000809349098091A10880934A098091A208FC |
:10B4100080934B098091A30880934C098091A408E4 |
:10B4200080934D098091A80880934E098091A908C6 |
:10B4300080934F098091AA08809350098091AD08AC |
:10B44000809351098091AB08809352098091AC0898 |
:10B45000809353098091AE088093540964CEEFE73E |
:10B46000F0E02BCF8FEFE138F8070CF05FCFE1E889 |
:10B47000FFEF5CCF6FEFE138F6070CF044CFE1E867 |
:10B48000FFEF41CF4FEFE138F4070CF029CFE1E8AF |
:10B49000FFEF26CF1F910F91FF90EF9008958091BD |
:10B4A0003209882309F43BC0459886E399E09093DC |
:10B4B00034098093330980913D05E82FFF27EB5332 |
:10B4C000FC4F982F9F5F808180933809963008F059 |
:10B4D00027C090933D05109232090E94DE5781E00B |
:10B4E000809335090000000000000000000000000B |
:10B4F000000000000000000000000000000000004C |
:10B50000000000000000000000000000000000003B |
:10B510000000000080913609809355098EBD089582 |
:10B5200010923D05D8CF20913209222309F045C061 |
:10B530000DB407FE42C084E08093F203459A3EB505 |
:10B5400080913F0599278130910509F437C08230F9 |
:10B5500091050CF451C0029709F439C020913509C6 |
:10B56000203208F030C045980000000000000000C4 |
:10B5700000000000000000000000000000000000CB |
:10B5800000000000000000000000000000000000BB |
:10B590000000000000000000E0913309F091340940 |
:10B5A000E20FF11D80818EBD809155099081890F38 |
:10B5B000809355092F5F209335090895353551F152 |
:10B5C00020933F05CBCF81E080933209F3CF809168 |
:10B5D0005709E82FFF27E958F64F30838F5F809394 |
:10B5E00057098A3100F180914005381711F12093F5 |
:10B5F000580910923F05B2CF892B09F0AFCF2093A5 |
:10B60000570930934005313809F0A8CF81E0809385 |
:10B610003F05A4CF80914005830F8093400582E0D1 |
:10B6200080933F059BCF80914005830F8093400519 |
:10B6300095CF8AE1E7E7F9E0ADE5B9E001900D9239 |
:10B640008A95E1F781E08093580910923F0586CFF3 |
:10B6500087B18C6087B9429843981092420580E880 |
:10B660008093CC03109241058093CB030895809181 |
:10B67000470581508F3F19F080934705089584E076 |
:10B680008093470590919D089B3F60F49B3FA0F0FD |
:10B690008091EC088A3080F480919C08882354F0D3 |
:10B6A000429A11C08091EC08873E80F380919C08FB |
:10B6B0008823B4F3429807C08091420581508F3FA0 |
:10B6C000B9F18093420590919F089B3F50F0809183 |
:10B6D0001F09873E30F080919E08882364F04398CC |
:10B6E00008959B3F50F080911F098A3030F480917B |
:10B6F0009E088823A4F3439A0895809141058150C0 |
:10B700008F3F19F080934105089580911F09815062 |
:10B71000809341058091CB038130F1F0982F96956D |
:10B720009093CB0380919E088923C9F2439A089590 |
:10B730008091EC088150809342058091CC03813048 |
:10B7400069F0982F96959093CC0380919C0889235B |
:10B7500009F4B0CF429AB7CF90E8E2CF90E8F3CFA8 |
:10B760008091C9008F778093C9008091C9008F7B39 |
:10B770008093C9008091C9008F7D8093C9005A9A37 |
:10B7800052981092CD0084E190E08093CC0080919B |
:10B79000C80082608093C80080E18093C9008091D6 |
:10B7A000CA008F778093CA008091CA008F7B8093F4 |
:10B7B000CA008091CA008F7D8093CA008091CA0020 |
:10B7C0008F7E8093CA008091CA00877F8093CA00D1 |
:10B7D0008091C9008B7F8093C9008091CA008460EA |
:10B7E0008093CA008091CA0082608093CA008091D1 |
:10B7F000C80087FF0CC08091CE008091C8008823CC |
:10B8000034F48091CE008091C8008823A4F3809105 |
:10B81000C90080688093C90008951F93CF93DF9378 |
:10B8200080E197E20E944515EC0110E08091C9008B |
:10B830008F778093C9008091C9008F7E8093C90063 |
:10B840005A988EE197E09F938F931F930E94CD119A |
:10B850000F900F900F90CE010E944E15882309F093 |
:10B8600066C04A9BF8CF8AE590E00E944515EC013E |
:10B8700084E597E09F938F931F920E94CD11529A77 |
:10B880000F900F900F90CE010E944E158823D9F390 |
:10B8900083E690E05A9A019797FFFCCF8FE891E0FA |
:10B8A0005A98019797FFFCCF89E090E05A9A019748 |
:10B8B00097FFFCCF89E090E05A98019797FFFCCF63 |
:10B8C0008FE891E05A9A019797FFFCCF8FE891E0BB |
:10B8D0005A98019797FFFCCF89E090E05A9A019718 |
:10B8E00097FFFCCF89E090E05A98019797FFFCCF33 |
:10B8F0008FE891E05A9A019797FFFCCF8FE891E08B |
:10B900005A98019797FFFCCF89E090E05A9A0197E7 |
:10B9100097FFFCCF89E090E05A98019797FFFCCF02 |
:10B920008FE891E05A9A019797FFFCCF0AC08AE509 |
:10B9300097E09F938F931F930E94CD110F900F90CC |
:10B940000F9052985A980E94B05BDF91CF911F914F |
:10B9500008951F920F920FB60F921124EF92FF924B |
:10B960000F931F932F933F934F935F936F937F9307 |
:10B970008F939F93AF93BF93CF93DF93EF93FF93F7 |
:10B980000091CE008091CD039091CE03019709F4F0 |
:10B990005EC080915005909151050E944E15482F30 |
:10B9A0005527609148057091490561157105E9F1C8 |
:10B9B0006130710509F4EAC06230710509F4EDC027 |
:10B9C0006330710509F45CC081E090E09093CE0390 |
:10B9D0008093CD0310924B0510924A0510924F05AB |
:10B9E00010924E0580914A0590914B054097A0F02A |
:10B9F00080914E0590914F05892B11F4109284038C |
:10BA000010924B0510924A0510924F0510924E0568 |
:10BA1000109249051092480587E090E00E94451574 |
:10BA2000909351058093500504C1452BD9F281E0D4 |
:10BA300090E0909349058093480580914A05909144 |
:10BA40004B05019690934B0580934A05CBCF1092FE |
:10BA5000CE031092CD0387E090E00E9445159093AD |
:10BA600051058093500510924B0510924A05109293 |
:10BA700049051092480510924D0510924C05D9C009 |
:10BA8000452B09F0A1CF82E090E090934905809387 |
:10BA9000480580914A0590914B05019690934B057E |
:10BAA00080934A0580914C0590914D05FC01F695D7 |
:10BAB000E795F695E795EF70F0703196982F882707 |
:10BAC000202F3327822B932B9370805092400E941B |
:10BAD000565FEB30F10508F085CF7F01EE0EFF1EBB |
:10BAE000F701E05DF74F808191819B01281B390BA5 |
:10BAF000C90137FD97C0069754F480916804883CCB |
:10BB000008F087C080916804865F80936804F7011D |
:10BB1000E05DF74F808191819C01220F331F280F38 |
:10BB2000391F260F371F37FD81C0E901D595C7950D |
:10BB3000D595C795CB0101968C179D070CF05CC07D |
:10BB4000219780916804843B08F450C087010A5B08 |
:10BB5000174FF701E05DF74F80819181FE01E81BEF |
:10BB6000F90BCF0163E070E00E94565FCB01880FB4 |
:10BB7000991F860F971FF8019183808320E338E097 |
:10BB8000E20EF31EF701D183C0832CCF411551057E |
:10BB900009F012CF82E090E04CCF4115510509F039 |
:10BBA0000FCF802F992790934D0580934C052091BE |
:10BBB0004A0530914B052230310569F083E090E071 |
:10BBC00090934905809348052F5F3F4F30934B0575 |
:10BBD00020934A0507CF80914C0587FF15C081E06F |
:10BBE00090E090934F0580934E05E8CFF701EA5B14 |
:10BBF000F74F11821082C2CF61507040C617D7072D |
:10BC00000CF09FCF21969DCF50934F0540934E054A |
:10BC1000D5CF88EC8093680480916F008F7D8093EE |
:10BC20006F0075CF909581959F4F65CF2D5F3F4FEA |
:10BC30007CCFFF91EF91DF91CF91BF91AF919F9119 |
:10BC40008F917F916F915F914F913F912F911F91B4 |
:10BC50000F91FF90EF900F900FBE0F901F901895CF |
:10BC6000FC014150504030F001900616D1F7319759 |
:10BC7000CF0108958827992708955058192EA6D0E6 |
:10BC800001D08CC0BA176207730784079507B1F11A |
:10BC900088F40EF410940B2EBA2FA02D062E622FCE |
:10BCA000202D072E732F302D082E842F402D092E86 |
:10BCB000952F502DFF275523B9F0591B49F0573EBA |
:10BCC00098F0469537952795A795F0405395C9F775 |
:10BCD00076F0BA0F621F731F841F30F48795779533 |
:10BCE0006795B795F040939517FA0F2E0895BF1BEF |
:10BCF000BB27BA0B620B730B840BF6CFDEF692C038 |
:10BD000097FB70D09F3738F0FEE9F91B982F872FEB |
:10BD1000762F6B2F05C083C096958795779567958D |
:10BD2000F150D0F73EF490958095709561957F4FD6 |
:10BD30008F4F9F4F0895E89403C097FB0EF4F3DFF5 |
:10BD4000B62F672F782F892F9EE9002427C00ED0A9 |
:10BD50005EF004C00BD026F001C008D019F020F42A |
:10BD60008FEF089580E0089581E0089597FB092EF4 |
:10BD7000052600F868942DD0E89407FC07C06217E8 |
:10BD800073078407950721F008F4009407949894AA |
:10BD900008959A95BB0F661F771F881F112499235A |
:10BDA000A1F08823B2F79F3F59F0BB0F48F421F46C |
:10BDB000002011F460FF04C06F5F7F4F8F4F9F4FD3 |
:10BDC000881F9795879597F9089529C0052E09260C |
:10BDD00007FA440F551F5F3F79F0AA27A51708F00F |
:10BDE00051E04795880F991F9F3F31F0BB27B91746 |
:10BDF00008F091E0879508959F919F91112414C0B8 |
:10BE000097FB880F991F9F3F31F0BB27B91708F0A8 |
:10BE100091E0879508959F919F91112405C0662711 |
:10BE200077278827992708959FEF80EC0895629FD0 |
:10BE3000D001739FF001829FE00DF11D649FE00D22 |
:10BE4000F11D929FF00D839FF00D749FF00D659F83 |
:10BE5000F00D9927729FB00DE11DF91F639FB00D82 |
:10BE6000E11DF91FBD01CF0111240895991B79E04F |
:10BE700004C0991F961708F0961B881F7A95C9F77A |
:10BE800080950895AA1BBB1B51E107C0AA1FBB1FC9 |
:10BE9000A617B70710F0A61BB70B881F991F5A9556 |
:10BEA000A9F780959095BC01CD01089597FB092EC7 |
:10BEB00007260AD077FD04D0E5DF06D000201AF46B |
:10BEC000709561957F4F0895F6F7909581959F4FF6 |
:10BED0000895A1E21A2EAA1BBB1BFD010DC0AA1FCB |
:10BEE000BB1FEE1FFF1FA217B307E407F50720F0E3 |
:10BEF000A21BB30BE40BF50B661F771F881F991F5E |
:10BF00001A9469F760957095809590959B01AC01A6 |
:10BF1000BD01CF01089597FB092E05260ED057FDD0 |
:10BF200004D0D7DF0AD0001C38F4509540953095E6 |
:10BF300021953F4F4F4F5F4F0895F6F790958095AD |
:10BF4000709561957F4F8F4F9F4F0895F999FECF60 |
:10BF5000B2BDA1BDF89A119600B40895F7DF019221 |
:10BF60001A94E1F70895F999FECFB2BDA1BD00BCC6 |
:10BF700011960FB6F894FA9AF99A0FBE08950190A7 |
:08BF8000F2DF1A94E1F70895C5 |
:10BF88005E010A0151756164726F0000416E676C51 |
:10BF9800654E69636B20202020202020416E676C4D |
:10BFA80065526F6C6C202020202020204163634E56 |
:10BFB80069636B20202020202020202041636352C9 |
:10BFC8006F6C6C2020202020202020204779726F61 |
:10BFD8004769657220202020202020204869676852 |
:10BFE800742056616C756520202020204163635AB7 |
:10BFF800202020202020202020202020476173207E |
:10C00800202020202020202020202020436F6D7019 |
:10C018006173732056616C7565202020566F6C74AF |
:10C02800616765202020202020202020456D706633 |
:10C03800616E672020202020202020204779726F01 |
:10C04800204B6F6D70617373202020204D6F746FCB |
:10C05800722046726F6E7420202020204D6F746FFE |
:10C068007220526561722020202020204D6F746F4D |
:10C0780072204C6566742020202020204D6F746F3C |
:10C0880072205269676874202020202020202020F8 |
:10C098002020202020202020202020202020202098 |
:10C0A8002020202020202020202020202020202088 |
:10C0B8002020202020202020202020204D4B334DE0 |
:10C0C80061672043616C53746174652053657276AF |
:10C0D8006F20202020202020202020202020202009 |
:10C0E8002020202020202020202020202020202048 |
:10C0F8002020202020202020202020202020202038 |
:10C108002020202020202020202020202020202027 |
:10C118002020202020202020202020202020202017 |
:10C128002020202020202020202020202020202007 |
:10C138002020202020202020202020204B616C6DF2 |
:10C14800616E5F4D617844726966742020202020FA |
:10C158002020202020202020202020204E617669C9 |
:10C168002053657269616C20446174614750535F64 |
:10C178004E69636B20202020202020204750535FE9 |
:10C18800526F6C6C2020202020202020C8000164E1 |
:10C19800FF01FFFF01FC01FC0101737373FF030042 |
:10C1A8007D0000C409C40964000D48616C6C6F20EF |
:10C1B80057656C74000000000000000000000000DB |
:10C1C8000000000000000000000000000000000067 |
:10C1D8000000000000000000000000000000000057 |
:10C1E8000000000000000000000000000000000047 |
:10C1F8000000000000000000000001020304050622 |
:10C208000708090A01040B050000ECFF6440415AC5 |
:10C218004664640A02969608403A10FB303801904A |
:10C22800D0030090D00300F401640053706F72745F |
:10C2380000004E6F726D616C0000426567696E6E3A |
:10C2480065720000640A0B0D0B0C0E010101000061 |
:00000001FF |
/branches/FC_075b_ACC-HH_MartinR/Hex-Files/WasIstWas.txt |
---|
0,0 → 1,51 |
+++++++++++++++++++++++++ |
+ Flight-Ctrl: |
+++++++++++++++++++++++++ |
BootLoader_MEGA644_20MHZ_V0_1.hex |
Der Bootloader wird per ISP eingespielt |
Der Bootloader nur dann eingespielt werden, wenn noch nie ein Bootloader eingespielt wurde! |
Danach können Softwareupdates seriell eingespielt werden. |
Flight-Ctrl_MEGA644_Vx_yy.hex |
Aktuelle Firmware |
Wird per serielle Schnittstelle (durch den Bootloader) eingespielt |
//+++++++++++ |
// Quadro: |
// 1 |
// 4 3 |
// 2 |
//+++++++++++ |
// Reverse Props on 1 2 |
//+++++++++++ |
// Octo: |
// 1 2 |
// 8 3 |
// 7 4 |
// 6 5 |
//+++++++++++ |
//+++++++++++ |
// Octo2: |
// 1 |
// 8 2 |
// 7 3 |
// 6 4 |
// 5 |
//+++++++++++ |
//+++++++++++ |
// Octo3: |
// 1 |
// 2 |
// 8 7 3 4 |
// 5 |
// 6 |
//+++++++++++ |
// Reverse Props on octo: 1 3 5 7 |
/branches/FC_075b_ACC-HH_MartinR/License.txt |
---|
0,0 → 1,52 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + Nur für den privaten Gebrauch |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten und nichtkommerziellen Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt und genannt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-profit use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet, our webpage (http://www.MikroKopter.de) must be |
// + clearly linked and named as origin |
// + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
/branches/FC_075b_ACC-HH_MartinR/Settings.h |
---|
--- FC_075b_ACC-HH_MartinR/Spectrum.c (nonexistent) |
+++ FC_075b_ACC-HH_MartinR/Spectrum.c (revision 1247) |
@@ -0,0 +1,318 @@ |
+/*####################################################################################### |
+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; |
+ TIMSK1 &= ~_BV(ICIE1); // disable PPM-Input |
+ } |
+ } |
+ tmp = (3 * (PPM_in[index]) + signal) / 4; |
+ if(tmp > signal+1) tmp--; else |
+ if(tmp < signal-1) tmp++; |
+ if(SenderOkay >= 180) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; |
+ else PPM_diff[index] = 0; |
+ PPM_in[index] = tmp; |
+ } |
+ } |
+ else |
+ { |
+ // 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/FC_075b_ACC-HH_MartinR/Spectrum.h |
---|
0,0 → 1,9 |
/*####################################################################################### |
Dekodieren eines Spectrum Signals |
#######################################################################################*/ |
#ifndef _SPECTRUM_H |
#define _SPECTRUM_H |
void Uart1Init(void); |
void SpektrumBinding(void); |
#endif //_RC_H |
/branches/FC_075b_ACC-HH_MartinR/_Settings.h |
---|
0,0 → 1,43 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Abstimmung |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define ACC_AMPLIFY 6 |
#define FAKTOR_P 1 |
#define FAKTOR_I 0.0001 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Debug-Interface |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define SIO_DEBUG 1 // Soll der Debugger aktiviert sein? |
#define MIN_DEBUG_INTERVALL 250 // in diesem Intervall werden Degugdaten ohne Aufforderung gesendet |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Sender |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define K_NICK 0 |
#define K_ROLL 1 |
#define K_GAS 2 |
#define K_GIER 3 |
#define K_POTI1 4 |
#define K_POTI2 5 |
#define K_POTI3 6 |
#define K_POTI4 7 |
// +++++++++++++++++++++++++++++++ |
// + Getestete Settings: |
// +++++++++++++++++++++++++++++++ |
// Setting: Kamera |
// Stick_P:3 |
// Stick_D:0 |
// Gyro_P: 175 |
// Gyro_I: 175 |
// Ki_Anteil: 10 |
// +++++++++++++++++++++++++++++++ |
// + Getestete Settings: |
// +++++++++++++++++++++++++++++++ |
// Setting: Normal |
// Stick_P:2 |
// Stick_D:8 |
// Gyro_P: 80 |
// Gyro_I: 150 |
// Ki_Anteil: 5 |
/branches/FC_075b_ACC-HH_MartinR/analog.c |
---|
0,0 → 1,675 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_ax, Aktuell_ay,Aktuell_az, UBat = 100; |
volatile int AdWertNickFilter = 0, AdWertRollFilter = 0, AdWertGierFilter = 0; |
volatile int HiResNick = 2500, HiResRoll = 2500; |
volatile int AdWertNick = 0, AdWertRoll = 0, AdWertGier = 0; |
volatile int AdWertAccRoll = 0,AdWertAccNick = 0,AdWertAccHoch = 0; |
volatile char messanzahl_AccHoch = 0; |
volatile long Luftdruck = 32000; |
volatile int StartLuftdruck; |
volatile unsigned int MessLuftdruck = 1023; |
unsigned char DruckOffsetSetting; |
signed char ExpandBaro = 0; |
volatile int HoeheD = 0; |
volatile char messanzahl_Druck; |
volatile int tmpLuftdruck; |
volatile unsigned int ZaehlMessungen = 0; |
unsigned char AnalogOffsetNick = 115,AnalogOffsetRoll = 115,AnalogOffsetGier = 115; |
unsigned char GyroDefektN = 0,GyroDefektR = 0,GyroDefektG = 0; |
volatile unsigned char AdReady = 1; |
//####################################################################################### |
// |
void ADC_Init(void) |
//####################################################################################### |
{ |
ADMUX = 0;//Referenz ist extern |
ANALOG_ON; |
} |
void SucheLuftruckOffset(void) |
{ |
unsigned int off; |
off = eeprom_read_byte(&EEPromArray[EEPROM_ADR_LAST_OFFSET]); |
if(off > 20) off -= 10; |
OCR0A = off; |
ExpandBaro = 0; |
Delay_ms_Mess(100); |
if(MessLuftdruck < 850) off = 0; |
for(; off < 250;off++) |
{ |
OCR0A = off; |
Delay_ms_Mess(50); |
printf("."); |
if(MessLuftdruck < 850) break; |
} |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_LAST_OFFSET], off); |
DruckOffsetSetting = off; |
Delay_ms_Mess(300); |
} |
void SucheGyroOffset(void) |
{ |
unsigned char i, ready = 0; |
int timeout; |
GyroDefektN = 0; GyroDefektR = 0; GyroDefektG = 0; |
timeout = SetDelay(2000); |
for(i=140; i != 0; i--) |
{ |
if(ready == 3 && i > 10) i = 9; |
ready = 0; |
if(AdWertNick < 1020) AnalogOffsetNick--; else if(AdWertNick > 1030) AnalogOffsetNick++; else ready++; |
if(AdWertRoll < 1020) AnalogOffsetRoll--; else if(AdWertRoll > 1030) AnalogOffsetRoll++; else ready++; |
if(AdWertGier < 1020) AnalogOffsetGier--; else if(AdWertGier > 1030) AnalogOffsetGier++; else ready++; |
twi_state = 8; |
i2c_start(); |
if(AnalogOffsetNick < 10) { GyroDefektN = 1; AnalogOffsetNick = 10;}; if(AnalogOffsetNick > 245) { GyroDefektN = 1; AnalogOffsetNick = 245;}; |
if(AnalogOffsetRoll < 10) { GyroDefektR = 1; AnalogOffsetRoll = 10;}; if(AnalogOffsetRoll > 245) { GyroDefektR = 1; AnalogOffsetRoll = 245;}; |
if(AnalogOffsetGier < 10) { GyroDefektG = 1; AnalogOffsetGier = 10;}; if(AnalogOffsetGier > 245) { GyroDefektG = 1; AnalogOffsetGier = 245;}; |
while(twi_state) if(CheckDelay(timeout)) {printf("\n\r DAC or I2C ERROR! Check I2C, 3Vref, DAC and BL-Ctrl"); break;} |
messanzahl_Druck = 0; |
ANALOG_ON; |
while(messanzahl_Druck == 0); |
if(i<10) Delay_ms_Mess(10); |
} |
Delay_ms_Mess(70); |
} |
/* // MartinR: so war es |
0 n |
1 r |
2 g |
3 y |
4 x |
5 n |
6 r |
7 u |
8 z |
9 L |
10 n |
11 r |
12 g |
13 y |
14 x |
15 n |
16 r |
17 L |
*/ |
/* MartinR : geändert |
0 n |
1 r |
2 g |
3 L |
4 n |
5 r |
6 y |
7 x |
8 n |
9 r |
10 g |
11 L |
12 n |
13 r |
14 u |
15 z |
*/ |
//####################################################################################### |
// |
SIGNAL(SIG_ADC) |
//####################################################################################### |
{ |
static unsigned char kanal=0,state = 0; |
static signed int gier1, roll1, nick1, nick_filter, roll_filter; |
static signed int roll_alt1, roll_alt2, roll_alt3, nick_alt1, nick_alt2, nick_alt3; // MartinR: 4x Mittelung |
//static signed int roll_alt1, nick_alt1; // MartinR: 2x Mittelung |
static signed int accy, accx; |
/* // MartinR : so war es Anfang |
switch(state++) |
{ |
case 0: |
nick1 = ADC; |
kanal = AD_ROLL; |
break; |
case 1: |
roll1 = ADC; |
kanal = AD_GIER; |
break; |
case 2: |
gier1 = ADC; |
kanal = AD_ACC_Y; |
break; |
case 3: |
Aktuell_ay = NeutralAccY - ADC; |
accy = Aktuell_ay; |
kanal = AD_ACC_X; |
break; |
case 4: |
Aktuell_ax = ADC - NeutralAccX; |
accx = Aktuell_ax; |
kanal = AD_NICK; |
break; |
case 5: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 6: |
roll1 += ADC; |
kanal = AD_UBAT; |
break; |
case 7: |
UBat = (3 * UBat + ADC / 3) / 4; |
kanal = AD_ACC_Z; |
break; |
case 8: |
AdWertAccHoch = (signed int) ADC - NeutralAccZ; |
if(AdWertAccHoch > 1) |
{ |
if(NeutralAccZ < 750) |
{ |
NeutralAccZ += 0.02; |
if(modell_fliegt < 500) NeutralAccZ += 0.1; |
} |
} |
else if(AdWertAccHoch < -1) |
{ |
if(NeutralAccZ > 550) |
{ |
NeutralAccZ-= 0.02; |
if(modell_fliegt < 500) NeutralAccZ -= 0.1; |
} |
} |
messanzahl_AccHoch = 1; |
Aktuell_az = ADC; |
Mess_Integral_Hoch += AdWertAccHoch; // Integrieren |
Mess_Integral_Hoch -= Mess_Integral_Hoch / 1024; // dämfen |
kanal = AD_DRUCK; |
break; |
// "case 8:" fehlt hier absichtlich |
case 10: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 11: |
roll1 += ADC; |
kanal = AD_GIER; |
break; |
case 12: |
if(PlatinenVersion == 10) AdWertGier = (ADC + gier1 + 1) / 2; |
else |
if(PlatinenVersion == 20) AdWertGier = 2047 - (ADC + gier1); |
else AdWertGier = (ADC + gier1); |
kanal = AD_ACC_Y; |
break; |
case 13: |
Aktuell_ay = NeutralAccY - ADC; |
AdWertAccRoll = (Aktuell_ay + accy); |
kanal = AD_ACC_X; |
break; |
case 14: |
Aktuell_ax = ADC - NeutralAccX; |
AdWertAccNick = (Aktuell_ax + accx); |
kanal = AD_NICK; |
break; |
case 15: |
nick1 += ADC; |
if(PlatinenVersion == 10) nick1 *= 2; else nick1 *= 4; |
AdWertNick = nick1 / 8; |
nick_filter = (nick_filter + nick1) / 2; |
HiResNick = nick_filter - AdNeutralNick; |
AdWertNickFilter = (AdWertNickFilter + HiResNick) / 2; |
kanal = AD_ROLL; |
break; |
case 16: |
roll1 += ADC; |
if(PlatinenVersion == 10) roll1 *= 2; else roll1 *= 4; |
AdWertRoll = roll1 / 8; |
roll_filter = (roll_filter + roll1) / 2; |
HiResRoll = roll_filter - AdNeutralRoll; |
AdWertRollFilter = (AdWertRollFilter + HiResRoll) / 2; |
kanal = AD_DRUCK; |
break; |
case 17: |
state = 0; |
AdReady = 1; |
ZaehlMessungen++; |
// "break" fehlt hier absichtlich |
case 9: |
tmpLuftdruck += ADC; |
if(++messanzahl_Druck >= 5) |
{ |
tmpLuftdruck /= 2; |
MessLuftdruck = ADC; |
messanzahl_Druck = 0; |
HoeheD = (31 * HoeheD + (int) Parameter_Luftdruck_D * (int)(255 * ExpandBaro + StartLuftdruck - tmpLuftdruck - HoehenWert))/32; // D-Anteil = neuerWert - AlterWert |
Luftdruck = (tmpLuftdruck + 7 * Luftdruck + 4) / 8; |
HoehenWert = 255 * ExpandBaro + StartLuftdruck - Luftdruck; |
tmpLuftdruck /= 2; |
} |
kanal = AD_NICK; |
break; |
default: |
kanal = 0; state = 0; kanal = AD_NICK; |
break; |
} |
*/ // MartinR : so war es Ende |
// MartinR : geändert Anfang |
switch(state++) |
{ |
case 0: |
nick1 = ADC; |
kanal = AD_ROLL; |
break; |
case 1: |
roll1 = ADC; |
kanal = AD_GIER; |
break; |
case 2: |
gier1 = ADC; |
kanal = AD_DRUCK; |
break; |
case 3: |
tmpLuftdruck = ADC; |
kanal = AD_NICK; |
break; |
case 4: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 5: |
roll1 += ADC; |
kanal = AD_ACC_Y; |
break; |
case 6: |
Aktuell_ay = NeutralAccY - ADC; |
AdWertAccRoll = (Aktuell_ay + accy); |
accy = Aktuell_ay; |
kanal = AD_ACC_X; |
break; |
case 7: |
Aktuell_ax = ADC - NeutralAccX; |
AdWertAccNick = (Aktuell_ax + accx); |
accx = Aktuell_ax; |
kanal = AD_NICK; |
break; |
case 8: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 9: |
roll1 += ADC; |
kanal = AD_GIER; |
break; |
case 10: |
if(PlatinenVersion == 10) AdWertGier = (ADC + gier1 + 1) / 2; |
else |
if(PlatinenVersion == 20) AdWertGier = 2047 - (ADC + gier1); |
else AdWertGier = (ADC + gier1); |
kanal = AD_DRUCK; |
break; |
case 11: |
/* MartinR: so war es Anfang |
HoeheD = (31 * HoeheD + (int) Parameter_Luftdruck_D * (int)(255 * ExpandBaro + StartLuftdruck - tmpLuftdruck - HoehenWert))/32; // D-Anteil = neuerWert - AlterWert |
*/ //MartinR: so war es Ende |
// MartinR: Änderungen Anfang : |
/* |
HoehenWertSumme += HoehenWert ; |
if (++ iHoehe >= 40) // MartinR: Wartezeit um auch kleine Änderungsgeschwindigkeiten erkennen zu können |
{ |
HoehenWertSumme = HoehenWertSumme / iHoehe ; // MartinR: Mittelwert während der Wartezeit |
HoeheD = (int) Parameter_Luftdruck_D * (HoehenWert - HoehenWertalt) ; |
if (HoeheD < 0) HoeheD += Parameter_Luftdruck_D ; // MartinR: Digitalisierungsrauschen abmindern |
if (HoeheD > 0) HoeheD -= Parameter_Luftdruck_D ; // MartinR: entspricht - 1 Bit vom Höhenwert |
iHoehe = 0 ; |
HoehenWertalt = HoehenWertSumme ; |
HoehenWertSumme = 0 ; |
} |
*/ |
// MartinR: neu |
tmpLuftdruck += ADC; |
MessLuftdruck = tmpLuftdruck / 2; |
Luftdruck = (MessLuftdruck + 7 * Luftdruck + 4) / 8; |
// HoehenWert = 255 * ExpandBaro + StartLuftdruck - Luftdruck; // MartinR: zu Höhenregler |
kanal = AD_NICK; |
break; |
case 12: |
nick1 += ADC; |
//if(PlatinenVersion == 10) nick1 *= 2; else nick1 *= 4; // MartinR: so war es |
//if(PlatinenVersion == 10) ; else nick1 *= 2; // MartinR: 2x Mittelung |
if(PlatinenVersion == 10) nick1 /= 2; //else nick1 *= 1; // MartinR: 4x Mittelung |
//AdWertNick = nick1 / 8; // MartinR: so war es |
//AdWertNick = nick1 / 4; // MartinR: 2x Mittelung |
AdWertNick = nick1 / 2; // MartinR: 4x Mittelung |
// nick_filter = (nick_filter + nick1) / 2; // MartinR: so war es |
//nick_filter = (nick_alt1 + nick1); // MartinR: anderer Nick-Filter: 2x Mittelung |
nick_filter = (nick_alt3 +nick_alt2 +nick_alt1 + nick1); // MartinR: anderer Nick-Filter: 4x Mittelung |
nick_alt3 = nick_alt2; // MartinR: anderer Nick-Filter |
nick_alt2 = nick_alt1; // MartinR: anderer Nick-Filter |
nick_alt1 = nick1; // MartinR: anderer Nick-Filter |
HiResNick = nick_filter - AdNeutralNick; |
//AdWertNickFilter = (AdWertNickFilter + HiResNick) / 2; // MartinR: so war es |
AdWertNickFilter = HiResNick; // MartinR: Filter deaktiviert |
kanal = AD_ROLL; |
break; |
case 13: |
roll1 += ADC; |
// if(PlatinenVersion == 10) roll1 *= 2; else roll1 *= 4; // MartinR: so war es |
//if(PlatinenVersion == 10) ; else roll1 *= 2; // MartinR: 2x Mittelung |
if(PlatinenVersion == 10) roll1 /= 2; //else roll1 *= 1; // MartinR: 4x Mittelung |
// AdWertRoll = roll1 / 8; // MartinR: so war es |
//AdWertRoll = roll1 / 4; // MartinR: 2x Mittelung |
AdWertRoll = roll1 / 2; // MartinR: 4x Mittelung |
//roll_filter = (roll_filter + roll1) / 2; // MartinR: so war es |
//roll_filter = (roll_alt1 + roll1); // MartinR: anderer Nick-Filter: 2x Mittelung |
roll_filter = (roll_alt3 + roll_alt2 + roll_alt1 + roll1); // MartinR: anderer Nick-Filter: 4x Mittelung |
roll_alt3 = roll_alt2; // MartinR: anderer Nick-Filter |
roll_alt2 = roll_alt1; // MartinR: anderer Nick-Filter |
roll_alt1 = roll1; // MartinR: anderer Nick-Filter |
HiResRoll = roll_filter - AdNeutralRoll; |
//AdWertRollFilter = (AdWertRollFilter + HiResRoll) / 2; // MartinR: so war es |
AdWertRollFilter = HiResRoll; // MartinR: Filter deaktiviert |
kanal = AD_UBAT; |
break; |
case 14: |
UBat = (3 * UBat + ADC / 3) / 4; |
kanal = AD_ACC_Z; |
break; |
case 15: |
// AdWertAccHoch = (signed int) ADC - NeutralAccZ; // MartinR : so war es |
//AdWertAccHoch = ADC - NeutralAccZ; // MartinR: modifiziert für Tests |
/* // MartinR: deaktiviert |
if(AdWertAccHoch > 1) |
{ |
if(NeutralAccZ < 750) |
{ |
NeutralAccZ += 0.02; |
if(modell_fliegt < 500) NeutralAccZ += 0.1; |
} |
} |
else if(AdWertAccHoch < -1) |
{ |
if(NeutralAccZ > 550) |
{ |
NeutralAccZ -= 0.02; |
if(modell_fliegt < 500) NeutralAccZ -= 0.1; |
} |
} |
*/ // MartinR: deaktiviert Ende |
// messanzahl_AccHoch = 1; MartinR: deaktiviert, da nicht verwendet |
Aktuell_az = (Aktuell_az + ADC) / 2; |
AdWertAccHoch = Aktuell_az - NeutralAccZ; // MartinR: modifiziert für Tests |
//Mess_Integral_Hoch += AdWertAccHoch; // Integrieren // MartinR: zu Höhenregler in fc.c verschoben |
//Mess_Integral_Hoch -= Mess_Integral_Hoch / 1024; // dämfen // MartinR: zu Höhenregler in fc.c verschoben |
AdReady = 1; |
state = 0; |
kanal = AD_NICK; |
break; |
default: |
kanal = 0; state = 0; kanal = AD_NICK; |
break; |
} |
// MartinR : geändert Ende |
ADMUX = kanal; |
// if(state != 0) ANALOG_ON; // MartinR : so war es |
// if(state != 0) ANALOG_START; // MartinR verschoben zu timer0 |
} |
/* |
//####################################################################################### |
// |
SIGNAL(SIG_ADC) |
//####################################################################################### |
{ |
static unsigned char kanal=0,state = 0; |
static signed int gier1, roll1, nick1; |
static signed long nick_filter, roll_filter; |
static signed int accy, accx; |
switch(state++) |
{ |
case 0: |
nick1 = ADC; |
kanal = AD_ROLL; |
break; |
case 1: |
roll1 = ADC; |
kanal = AD_GIER; |
break; |
case 2: |
gier1 = ADC; |
kanal = AD_ACC_Y; |
break; |
case 3: |
Aktuell_ay = NeutralAccY - ADC; |
accy = Aktuell_ay; |
kanal = AD_NICK; |
break; |
case 4: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 5: |
roll1 += ADC; |
kanal = AD_ACC_Z; |
break; |
case 6: |
AdWertAccHoch = (signed int) ADC - NeutralAccZ; |
if(AdWertAccHoch > 1) |
{ |
if(NeutralAccZ < 750) |
{ |
NeutralAccZ += 0.02; |
if(modell_fliegt < 500) NeutralAccZ += 0.1; |
} |
} |
else if(AdWertAccHoch < -1) |
{ |
if(NeutralAccZ > 550) |
{ |
NeutralAccZ-= 0.02; |
if(modell_fliegt < 500) NeutralAccZ -= 0.1; |
} |
} |
messanzahl_AccHoch = 1; |
Aktuell_az = ADC; |
Mess_Integral_Hoch += AdWertAccHoch; // Integrieren |
Mess_Integral_Hoch -= Mess_Integral_Hoch / 1024; // dämfen |
kanal = AD_NICK; |
break; |
case 7: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 8: |
roll1 += ADC; |
kanal = AD_ACC_X; |
break; |
case 9: |
Aktuell_ax = ADC - NeutralAccX; |
accx = Aktuell_ax; |
kanal = AD_GIER; |
break; |
case 10: |
gier1 += ADC; |
kanal = AD_NICK; |
break; |
case 11: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 12: |
roll1 += ADC; |
kanal = AD_UBAT; |
break; |
case 13: |
UBat = (3 * UBat + ADC / 3) / 4;//(UBat + ((ADC * 39) / 256) + 19) / 2; |
kanal = AD_ACC_Y; |
break; |
case 14: |
Aktuell_ay = NeutralAccY - ADC; |
accy += Aktuell_ay; |
kanal = AD_NICK; |
break; |
case 15: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 16: |
roll1 += ADC; |
kanal = AD_ACC_X; |
break; |
case 17: |
Aktuell_ax = ADC - NeutralAccX; |
accx += Aktuell_ax; |
kanal = AD_NICK; |
break; |
case 18: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 19: |
roll1 += ADC; |
kanal = AD_GIER; |
break; |
case 20: |
gier1 += ADC; |
kanal = AD_ACC_Y; |
break; |
case 21: |
Aktuell_ay = NeutralAccY - ADC; |
accy += Aktuell_ay; |
kanal = AD_NICK; |
break; |
case 22: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 23: |
roll1 += ADC; |
kanal = AD_DRUCK; |
break; |
case 24: |
tmpLuftdruck += ADC; |
if(++messanzahl_Druck >= 5) |
{ |
MessLuftdruck = ADC; |
messanzahl_Druck = 0; |
HoeheD = (7 * HoeheD + (int) Parameter_Luftdruck_D * (int)(255 * ExpandBaro + StartLuftdruck - tmpLuftdruck - HoehenWert)) / 8; // D-Anteil = neuerWert - AlterWert |
Luftdruck = (tmpLuftdruck + 3 * Luftdruck) / 4; |
HoehenWert = 255 * ExpandBaro + StartLuftdruck - Luftdruck; |
tmpLuftdruck = 0; |
} |
kanal = AD_NICK; |
break; |
case 25: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 26: |
roll1 += ADC; |
kanal = AD_ACC_X; |
break; |
case 27: |
Aktuell_ax = ADC - NeutralAccX; |
accx += Aktuell_ax; |
kanal = AD_GIER; |
break; |
case 28: |
if(PlatinenVersion == 10) AdWertGier = (ADC + gier1 + 2) / 4; |
else |
if(PlatinenVersion == 20) AdWertGier = 2047 - (ADC + gier1 + 1) / 2; |
else AdWertGier = (ADC + gier1 + 1) / 2; |
kanal = AD_NICK; |
break; |
case 29: |
nick1 += ADC; |
kanal = AD_ROLL; |
break; |
case 30: |
roll1 += ADC; |
kanal = AD_ACC_Y; |
break; |
case 31: |
Aktuell_ay = NeutralAccY - ADC; |
AdWertAccRoll = (Aktuell_ay + accy); |
kanal = AD_NICK; |
break; |
case 32: |
AdWertNick = (ADC + nick1 + 3) / 5; |
nick_filter = (long) (1 * (long) nick_filter + 4 * (long)(ADC + nick1) + 1) / 2; |
if(PlatinenVersion == 10) { AdWertNick /= 2;nick_filter /=2;} |
HiResNick = nick_filter - 20 * AdNeutralNick; |
AdWertNickFilter = (long)(3L * (long)AdWertNickFilter + HiResNick + 2) / 4; |
DebugOut.Analog[21] = AdWertNickFilter / 4; |
kanal = AD_ROLL; |
break; |
case 33: |
AdWertRoll = (ADC + roll1 + 3) / 5; |
roll_filter = (long)(1 * (long)roll_filter + 4 * (long)(ADC + roll1) + 1) / 2; |
if(PlatinenVersion == 10) { AdWertRoll /= 2;roll_filter /=2;} |
HiResRoll = roll_filter - 20 * AdNeutralRoll; |
AdWertRollFilter = (long)(3L * (long)AdWertRollFilter + HiResRoll + 2) / 4; |
DebugOut.Analog[22] = AdWertRollFilter / 4; |
kanal = AD_ACC_X; |
break; |
case 34: |
Aktuell_ax = ADC - NeutralAccX; |
AdWertAccNick = (Aktuell_ax + accx); |
kanal = AD_NICK; |
state = 0; |
AdReady = 1; |
ZaehlMessungen++; |
break; |
default: |
kanal = 0; |
state = 0; |
break; |
} |
ADMUX = kanal; |
if(state != 0) ANALOG_ON; |
} |
*/ |
/branches/FC_075b_ACC-HH_MartinR/analog.h |
---|
0,0 → 1,48 |
#ifndef _ANALOG_H |
#define _ANALOG_H |
/*####################################################################################### |
#######################################################################################*/ |
extern volatile int UBat; |
extern volatile int AdWertNick, AdWertRoll, AdWertGier; |
extern volatile int AdWertAccRoll,AdWertAccNick,AdWertAccHoch; |
extern volatile int HiResNick, HiResRoll; |
extern volatile int AdWertNickFilter, AdWertRollFilter, AdWertGierFilter; |
extern volatile int Aktuell_Nick,Aktuell_Roll,Aktuell_Gier,Aktuell_ax, Aktuell_ay,Aktuell_az; |
extern volatile long Luftdruck; |
extern volatile char messanzahl_Druck; |
extern volatile unsigned int ZaehlMessungen; |
extern unsigned char DruckOffsetSetting; |
extern signed char ExpandBaro; |
extern volatile int HoeheD; |
extern volatile unsigned int MessLuftdruck; |
extern volatile int StartLuftdruck; |
extern volatile char MessanzahlNick; |
extern unsigned char AnalogOffsetNick,AnalogOffsetRoll,AnalogOffsetGier; |
extern volatile unsigned char AdReady; |
unsigned int ReadADC(unsigned char adc_input); |
void ADC_Init(void); |
void SucheLuftruckOffset(void); |
void SucheGyroOffset(void); |
#define AD_GIER 0 |
#define AD_ROLL 1 |
#define AD_NICK 2 |
#define AD_DRUCK 3 |
#define AD_UBAT 4 |
#define AD_ACC_Z 5 |
#define AD_ACC_Y 6 |
#define AD_ACC_X 7 |
#define ANALOG_OFF ADCSRA=0 |
#define ANALOG_ON ADCSRA=(1<<ADEN)|(1<<ADSC)|(0<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADIE) |
//Signle trigger Mode, Interrupt on |
#define ANALOG_START ADCSRA |= (1<<ADSC) // MartinR |
#endif //_ANALOG_H |
/branches/FC_075b_ACC-HH_MartinR/eeprom.c |
---|
0,0 → 1,248 |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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 = 14; // Wert : 1-6 |
EE_Parameter.Stick_D = 16; // Wert : 0-64 |
EE_Parameter.Gier_P = 12; // Wert : 1-20 |
EE_Parameter.Gas_Min = 8; // Wert : 0-32 |
EE_Parameter.Gas_Max = 230; // Wert : 33-250 |
EE_Parameter.GyroAccFaktor = 30; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
EE_Parameter.Gyro_P = 80; // Wert : 0-250 |
EE_Parameter.Gyro_I = 150; // Wert : 0-250 |
EE_Parameter.Gyro_D = 3; // Wert : 0-250 |
EE_Parameter.UnterspannungsWarnung = 32; // Wert : 0-250 ( Automatische Zellenerkennung bei < 50) |
EE_Parameter.NotGas = 35; // Wert : 0-250 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 30; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
EE_Parameter.I_Faktor = 32; |
EE_Parameter.UserParam1 = 0; // zur freien Verwendung |
EE_Parameter.UserParam2 = 0; // zur freien Verwendung |
EE_Parameter.UserParam3 = 0; // zur freien Verwendung |
EE_Parameter.UserParam4 = 0; // zur freien Verwendung |
EE_Parameter.UserParam5 = 0; // zur freien Verwendung |
EE_Parameter.UserParam6 = 0; // zur freien Verwendung |
EE_Parameter.UserParam7 = 0; // zur freien Verwendung |
EE_Parameter.UserParam8 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoCompInvert = 0; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 0; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickMax = 250; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickRefresh = 3; |
EE_Parameter.ServoRollControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoRollComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoRollMin = 0; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoRollMax = 250; // Wert : 0-250 // Anschlag |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.BitConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
EE_Parameter.AchsKopplung1 = 90; |
EE_Parameter.AchsKopplung2 = 80; |
EE_Parameter.CouplingYawCorrection = 1; |
EE_Parameter.WinkelUmschlagNick = 85; |
EE_Parameter.WinkelUmschlagRoll = 85; |
EE_Parameter.GyroAccAbgleich = 16; // 1/k |
EE_Parameter.Driftkomp = 32; |
EE_Parameter.DynamicStability = 100; |
EE_Parameter.J16Bitmask = 95; |
EE_Parameter.J17Bitmask = 243; |
EE_Parameter.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 = 10; // Wert : 1-6 |
EE_Parameter.Stick_D = 16; // Wert : 0-64 |
EE_Parameter.Gier_P = 6; // Wert : 1-20 |
EE_Parameter.Gas_Min = 8; // Wert : 0-32 |
EE_Parameter.Gas_Max = 230; // Wert : 33-250 |
EE_Parameter.GyroAccFaktor = 30; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
EE_Parameter.Gyro_P = 90; // Wert : 0-250 |
EE_Parameter.Gyro_I = 120; // Wert : 0-250 |
EE_Parameter.Gyro_D = 3; // Wert : 0-250 |
EE_Parameter.UnterspannungsWarnung = 32; // Wert : 0-250 ( Automatische Zellenerkennung bei < 50) |
EE_Parameter.NotGas = 35; // Wert : 0-250 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 30; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
EE_Parameter.I_Faktor = 32; |
EE_Parameter.UserParam1 = 0; // zur freien Verwendung |
EE_Parameter.UserParam2 = 0; // zur freien Verwendung |
EE_Parameter.UserParam3 = 0; // zur freien Verwendung |
EE_Parameter.UserParam4 = 0; // zur freien Verwendung |
EE_Parameter.UserParam5 = 0; // zur freien Verwendung |
EE_Parameter.UserParam6 = 0; // zur freien Verwendung |
EE_Parameter.UserParam7 = 0; // zur freien Verwendung |
EE_Parameter.UserParam8 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoCompInvert = 0; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 0; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickMax = 250; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickRefresh = 3; |
EE_Parameter.ServoRollControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoRollComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoRollMin = 0; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoRollMax = 250; // Wert : 0-250 // Anschlag |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.BitConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts |
EE_Parameter.AchsKopplung1 = 90; |
EE_Parameter.AchsKopplung2 = 80; |
EE_Parameter.CouplingYawCorrection = 60; |
EE_Parameter.WinkelUmschlagNick = 85; |
EE_Parameter.WinkelUmschlagRoll = 85; |
EE_Parameter.GyroAccAbgleich = 32; // 1/k |
EE_Parameter.Driftkomp = 32; |
EE_Parameter.DynamicStability = 75; |
EE_Parameter.J16Bitmask = 95; |
EE_Parameter.J17Bitmask = 243; |
EE_Parameter.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 = 32; // Wert : 0-250 ( Automatische Zellenerkennung bei < 50) |
EE_Parameter.NotGas = 35; // Wert : 0-250 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 20; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
EE_Parameter.I_Faktor = 16; |
EE_Parameter.UserParam1 = 0; // zur freien Verwendung |
EE_Parameter.UserParam2 = 0; // zur freien Verwendung |
EE_Parameter.UserParam3 = 0; // zur freien Verwendung |
EE_Parameter.UserParam4 = 0; // zur freien Verwendung |
EE_Parameter.UserParam5 = 0; // zur freien Verwendung |
EE_Parameter.UserParam6 = 0; // zur freien Verwendung |
EE_Parameter.UserParam7 = 0; // zur freien Verwendung |
EE_Parameter.UserParam8 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoCompInvert = 0; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 0; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickMax = 250; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickRefresh = 3; |
EE_Parameter.ServoRollControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoRollComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoRollMin = 0; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoRollMax = 250; // Wert : 0-250 // Anschlag |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.BitConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts |
EE_Parameter.AchsKopplung1 = 90; |
EE_Parameter.AchsKopplung2 = 80; |
EE_Parameter.CouplingYawCorrection = 70; |
EE_Parameter.WinkelUmschlagNick = 85; |
EE_Parameter.WinkelUmschlagRoll = 85; |
EE_Parameter.GyroAccAbgleich = 32; // 1/k |
EE_Parameter.Driftkomp = 32; |
EE_Parameter.DynamicStability = 50; |
EE_Parameter.J16Bitmask = 95; |
EE_Parameter.J17Bitmask = 243; |
EE_Parameter.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/FC_075b_ACC-HH_MartinR/fc.c |
---|
0,0 → 1,1840 |
/*####################################################################################### |
Flight Control |
#######################################################################################*/ |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + Nur für den privaten Gebrauch |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-commercial use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be |
// + clearly linked as origin |
// + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
#include "eeprom.c" |
unsigned char h,m,s; |
volatile unsigned int I2CTimeout = 100; |
int MesswertNick,MesswertRoll,MesswertGier,MesswertGierBias, RohMesswertNick,RohMesswertRoll; |
int TrimNick, TrimRoll; |
int AdNeutralGierBias; |
int AdNeutralNick = 0,AdNeutralRoll = 0,AdNeutralGier = 0,StartNeutralRoll = 0,StartNeutralNick = 0; |
int Mittelwert_AccNick, Mittelwert_AccRoll,Mittelwert_AccHoch, NeutralAccX=0, NeutralAccY=0; |
int NaviAccNick, NaviAccRoll,NaviCntAcc = 0; |
//volatile float NeutralAccZ = 0; // MartinR : so war es |
volatile int NeutralAccZ = 0; // MartinR geändert |
volatile int NeutralAccZ2 = 0; // MartinR: für HP-Filter |
signed int h_p,h_d,h_delta,Ziel_d; // MartinR: P,D Anteil beim eigenen Höhenregler |
signed int SchwebeGas; // MartinR: für neuen Höhenregler |
unsigned char CosinusNickWinkel = 0, CosinusRollWinkel = 0; |
long IntegralNick = 0,IntegralNick2 = 0; |
long IntegralRoll = 0,IntegralRoll2 = 0; |
long IntegralAccNick = 0,IntegralAccRoll = 0,IntegralAccZ = 0; |
long Integral_Gier = 0; |
long Mess_IntegralNick = 0,Mess_IntegralNick2 = 0; |
long Mess_IntegralRoll = 0,Mess_IntegralRoll2 = 0; |
long Mess_Integral_Gier = 0,Mess_Integral_Gier2 = 0; |
long MittelIntegralNick,MittelIntegralRoll,MittelIntegralNick2,MittelIntegralRoll2; |
volatile long Mess_Integral_Hoch = 0; |
int KompassValue = 0; |
int KompassStartwert = 0; |
int KompassRichtung = 0; |
unsigned int KompassSignalSchlecht = 500; |
unsigned char MAX_GAS,MIN_GAS; |
unsigned char Notlandung = 0; |
unsigned char HoehenReglerAktiv = 0; |
unsigned char TrichterFlug = 0; |
unsigned char delay_Hoehenregler = 0; // MartinR: zur Begrenzung der Sinkgeschwindigkeit |
signed int delay_SchwebeGas = 0; // MartinR: zur Begrenzung der Sinkgeschwindigkeit |
long Umschlag180Nick = 250000L, Umschlag180Roll = 250000L; |
long ErsatzKompass; |
int ErsatzKompassInGrad; // Kompasswert in Grad |
int GierGyroFehler = 0; |
char GyroFaktor,GyroFaktorGier; |
char IntegralFaktor,IntegralFaktorGier; |
int DiffNick,DiffRoll; |
int Poti1 = 0, Poti2 = 0, Poti3 = 0, Poti4 = 0; |
volatile unsigned char SenderOkay = 0; |
int StickNick = 0,StickRoll = 0,StickGier = 0,StickGas = 0; |
char MotorenEin = 0; |
int HoehenWert = 0; |
int HoehenWertalt = 0; //MartinR: Test |
unsigned char iHoehe; // MartinR: Zähler für HoeheD |
signed long HoehenWertSumme = 0; // MartinR: für neuen Höhenregler D-Anteil |
int SollHoehe = 0; |
int LageKorrekturRoll = 0,LageKorrekturNick = 0; |
//float Ki = FAKTOR_I; |
int Ki = 10300 / 33; |
int KiHH = 10300 / 33; // MartinR : für Ki bei HH über Schalter |
unsigned char Looping_Nick = 0,Looping_Roll = 0; |
unsigned char Looping_Links = 0, Looping_Rechts = 0, Looping_Unten = 0, Looping_Oben = 0; |
unsigned char Parameter_Luftdruck_D = 48; // Wert : 0-250 |
unsigned char Parameter_MaxHoehe = 251; // Wert : 0-250 |
unsigned char Parameter_Hoehe_P = 16; // Wert : 0-32 |
unsigned char Parameter_Hoehe_ACC_Wirkung = 58; // Wert : 0-250 |
unsigned char Parameter_KompassWirkung = 64; // Wert : 0-250 |
unsigned char Parameter_Gyro_D = 8; // Wert : 0-250 |
unsigned char Parameter_Gyro_P = 150; // Wert : 10-250 |
unsigned char Parameter_Gyro_I = 150; // Wert : 0-250 |
unsigned char Parameter_Gier_P = 2; // Wert : 1-20 |
unsigned char Parameter_I_Faktor = 10; // Wert : 1-20 |
unsigned char Parameter_UserParam1 = 0; |
unsigned char Parameter_UserParam2 = 0; |
unsigned char Parameter_UserParam3 = 0; |
unsigned char Parameter_UserParam4 = 0; |
unsigned char Parameter_UserParam5 = 0; |
unsigned char Parameter_UserParam6 = 0; |
unsigned char Parameter_UserParam7 = 0; |
unsigned char Parameter_UserParam8 = 0; |
unsigned char Parameter_ServoNickControl = 100; |
unsigned char Parameter_ServoRollControl = 100; |
unsigned char Parameter_LoopGasLimit = 70; |
unsigned char Parameter_AchsKopplung1 = 90; |
unsigned char Parameter_AchsKopplung2 = 65; |
unsigned char Parameter_CouplingYawCorrection = 64; |
//unsigned char Parameter_AchsGegenKopplung1 = 0; |
unsigned char Parameter_DynamicStability = 100; |
unsigned char Parameter_J16Bitmask; // for the J16 Output |
unsigned char Parameter_J16Timing; // for the J16 Output |
unsigned char Parameter_J17Bitmask; // for the J17 Output |
unsigned char Parameter_J17Timing; // for the J17 Output |
unsigned char Parameter_NaviGpsModeControl; // Parameters for the Naviboard |
unsigned char Parameter_NaviGpsGain; |
unsigned char Parameter_NaviGpsP; |
unsigned char Parameter_NaviGpsI; |
unsigned char Parameter_NaviGpsD; |
unsigned char Parameter_NaviGpsACC; |
unsigned char Parameter_NaviOperatingRadius; |
unsigned char Parameter_NaviWindCorrection; |
unsigned char Parameter_NaviSpeedCompensation; |
unsigned char Parameter_ExternalControl; |
struct mk_param_struct EE_Parameter; |
signed int ExternStickNick = 0,ExternStickRoll = 0,ExternStickGier = 0, ExternHoehenValue = -20; |
//int MaxStickNick = 0,MaxStickRoll = 0;MartinR: so war es |
int MaxStickNick = 0,MaxStickRoll = 0,stick_nick_neutral = 0,stick_roll_neutral = 0; // MartinR: stick_.._neutral hinzugefügt |
unsigned int modell_fliegt = 0; |
volatile unsigned char MikroKopterFlags = 0; |
long GIER_GRAD_FAKTOR = 1291; |
signed int KopplungsteilNickRoll,KopplungsteilRollNick; |
unsigned char RequiredMotors = 4; |
unsigned char Motor[MAX_MOTORS]; |
signed int tmp_motorwert[MAX_MOTORS]; |
int MotorSmoothing(int neu, int alt) |
{ |
int motor; |
if(neu > alt) motor = (1*(int)alt + neu) / 2; |
//else motor = neu - (alt - neu)*1; // MartinR: so war es |
else motor = neu; // MartinR: Entsprechen Vorschlag von MartinW geändert |
//if(Poti2 < 20) return(neu); |
return(motor); |
} |
void Piep(unsigned char Anzahl, unsigned int dauer) |
{ |
if(MotorenEin) return; //auf keinen Fall im Flug! |
while(Anzahl--) |
{ |
beeptime = dauer; |
while(beeptime); |
Delay_ms(dauer * 2); |
} |
} |
//############################################################################ |
// Nullwerte ermitteln |
void SetNeutral(void) |
//############################################################################ |
{ |
unsigned char i; |
unsigned int gier_neutral=0, nick_neutral=0, roll_neutral=0; |
ServoActive = 0; HEF4017R_ON; |
NeutralAccX = 0; |
NeutralAccY = 0; |
NeutralAccZ = 0; |
NeutralAccZ2 = 0; // MartinR |
AdNeutralNick = 0; |
AdNeutralRoll = 0; |
AdNeutralGier = 0; |
AdNeutralGierBias = 0; |
Parameter_AchsKopplung1 = 0; |
Parameter_AchsKopplung2 = 0; |
ExpandBaro = 0; |
CalibrierMittelwert(); |
Delay_ms_Mess(100); |
CalibrierMittelwert(); |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
{ |
if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
} |
#define NEUTRAL_FILTER 32 |
for(i=0; i<NEUTRAL_FILTER; i++) |
{ |
Delay_ms_Mess(10); |
gier_neutral += AdWertGier; |
nick_neutral += AdWertNick; |
roll_neutral += AdWertRoll; |
} |
AdNeutralNick= (nick_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER / 8); |
AdNeutralRoll= (roll_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER / 8); |
AdNeutralGier= (gier_neutral+NEUTRAL_FILTER/2) / (NEUTRAL_FILTER); |
AdNeutralGierBias = AdNeutralGier; |
StartNeutralRoll = AdNeutralRoll; |
StartNeutralNick = AdNeutralNick; |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) > 4) |
{ |
NeutralAccY = abs(Mittelwert_AccRoll) / (2*ACC_AMPLIFY); |
NeutralAccX = abs(Mittelwert_AccNick) / (2*ACC_AMPLIFY); |
NeutralAccZ = Aktuell_az; |
NeutralAccZ2 = NeutralAccZ; // MartinR |
} |
else |
{ |
NeutralAccX = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK+1]); |
NeutralAccY = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL+1]); |
NeutralAccZ = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_Z]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_Z+1]); |
} |
MesswertNick = 0; |
MesswertRoll = 0; |
MesswertGier = 0; |
Delay_ms_Mess(100); |
Mittelwert_AccNick = ACC_AMPLIFY * (long)AdWertAccNick; |
Mittelwert_AccRoll = ACC_AMPLIFY * (long)AdWertAccRoll; |
IntegralNick = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccNick; |
IntegralRoll = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccRoll; |
Mess_IntegralNick2 = IntegralNick; |
Mess_IntegralRoll2 = IntegralRoll; |
Mess_Integral_Gier = 0; |
StartLuftdruck = Luftdruck; |
HoeheD = 0; |
Mess_Integral_Hoch = 0; |
KompassStartwert = KompassValue; |
GPS_Neutral(); |
beeptime = 50; |
Umschlag180Nick = ((long) EE_Parameter.WinkelUmschlagNick * 2500L) + 15000L; |
Umschlag180Roll = ((long) EE_Parameter.WinkelUmschlagRoll * 2500L) + 15000L; |
ExternHoehenValue = 0; |
ErsatzKompass = KompassValue * GIER_GRAD_FAKTOR; |
GierGyroFehler = 0; |
SendVersionToNavi = 1; |
LED_Init(); |
MikroKopterFlags |= FLAG_CALIBRATE; |
FromNaviCtrl_Value.Kalman_K = -1; |
FromNaviCtrl_Value.Kalman_MaxDrift = 0; |
FromNaviCtrl_Value.Kalman_MaxFusion = 32; |
Poti1 = PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110; |
Poti2 = PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110; |
Poti3 = PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110; |
Poti4 = PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110; |
// ServoActive = 1; |
SenderOkay = 100; |
} |
//############################################################################ |
// Bearbeitet die Messwerte |
void Mittelwert(void) |
//############################################################################ |
{ |
static signed long tmpl,tmpl2,tmpl3,tmpl4; |
static signed int oldNick, oldRoll, d2Roll, d2Nick; |
static signed int oldNick2, oldRoll2 ; //MartinR : für geänderte d2* Ermittlung |
signed long winkel_nick, winkel_roll; |
MesswertGier = (signed int) AdNeutralGier - AdWertGier; |
// MesswertGierBias = (signed int) AdNeutralGierBias - AdWertGier; |
MesswertNick = (signed int) AdWertNickFilter / 8; |
MesswertRoll = (signed int) AdWertRollFilter / 8; |
RohMesswertNick = MesswertNick; |
RohMesswertRoll = MesswertRoll; |
//DebugOut.Analog[21] = MesswertNick; |
//DebugOut.Analog[22] = MesswertRoll; |
//DebugOut.Analog[22] = Mess_Integral_Gier; |
//DebugOut.Analog[21] = MesswertNick; |
//DebugOut.Analog[22] = MesswertRoll; |
// Beschleunigungssensor ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mittelwert_AccNick = ((long)Mittelwert_AccNick * 3 + ((ACC_AMPLIFY * (long)AdWertAccNick))) / 4L; |
Mittelwert_AccRoll = ((long)Mittelwert_AccRoll * 3 + ((ACC_AMPLIFY * (long)AdWertAccRoll))) / 4L; |
Mittelwert_AccHoch = ((long)Mittelwert_AccHoch * 3 + ((long)AdWertAccHoch)) / 4L; |
IntegralAccNick += ACC_AMPLIFY * AdWertAccNick; |
IntegralAccRoll += ACC_AMPLIFY * AdWertAccRoll; |
NaviAccNick += AdWertAccNick; |
NaviAccRoll += AdWertAccRoll; |
NaviCntAcc++; |
IntegralAccZ += Aktuell_az - NeutralAccZ; |
//++++++++++++++++++++++++++++++++++++++++++++++++ |
// ADC einschalten |
//ANALOG_ON; // MartinR : so war es |
// ANALOG_START; // MartinR verschoben zu timer0 |
AdReady = 0; |
//++++++++++++++++++++++++++++++++++++++++++++++++ |
if(Mess_IntegralRoll > 93000L) winkel_roll = 93000L; |
else if(Mess_IntegralRoll <-93000L) winkel_roll = -93000L; |
else winkel_roll = Mess_IntegralRoll; |
if(Mess_IntegralNick > 93000L) winkel_nick = 93000L; |
else if(Mess_IntegralNick <-93000L) winkel_nick = -93000L; |
else winkel_nick = Mess_IntegralNick; |
// Gier ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mess_Integral_Gier += MesswertGier; |
ErsatzKompass += MesswertGier; |
// Kopplungsanteil +++++++++++++++++++++++++++++++++++++ |
if((EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) || (Parameter_UserParam1 > 140)) IntegralFaktor = 0; // MartinR: zusätzlich |
//if(!Looping_Nick && !Looping_Roll && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV)) // MartinR : so war es |
if(!Looping_Nick && !Looping_Roll && IntegralFaktor && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV)) // MartinR: zusätzlich "&& IntegralFaktor" |
{ |
tmpl3 = (MesswertRoll * winkel_nick) / 2048L; |
tmpl3 *= Parameter_AchsKopplung2; //65 |
tmpl3 /= 4096L; |
tmpl4 = (MesswertNick * winkel_roll) / 2048L; |
tmpl4 *= Parameter_AchsKopplung2; //65 |
tmpl4 /= 4096L; |
KopplungsteilNickRoll = tmpl3; |
KopplungsteilRollNick = tmpl4; |
tmpl4 -= tmpl3; |
ErsatzKompass += tmpl4; |
if(!Parameter_CouplingYawCorrection) Mess_Integral_Gier -= tmpl4/2; // Gier nachhelfen |
tmpl = ((MesswertGier + tmpl4) * winkel_nick) / 2048L; |
tmpl *= Parameter_AchsKopplung1; // 90 |
tmpl /= 4096L; |
tmpl2 = ((MesswertGier + tmpl4) * winkel_roll) / 2048L; |
tmpl2 *= Parameter_AchsKopplung1; |
tmpl2 /= 4096L; |
if(abs(MesswertGier) > 64) if(labs(tmpl) > 128 || labs(tmpl2) > 128) TrichterFlug = 1; |
//MesswertGier += (Parameter_CouplingYawCorrection * tmpl4) / 256; |
} |
else tmpl = tmpl2 = KopplungsteilNickRoll = KopplungsteilRollNick = 0; |
TrimRoll = tmpl - tmpl2 / 100L; |
TrimNick = -tmpl2 + tmpl / 100L; |
// Kompasswert begrenzen ++++++++++++++++++++++++++++++++++++++++++++++++ |
if(ErsatzKompass >= (360L * GIER_GRAD_FAKTOR)) ErsatzKompass -= 360L * GIER_GRAD_FAKTOR; // 360° Umschlag |
if(ErsatzKompass < 0) ErsatzKompass += 360L * GIER_GRAD_FAKTOR; |
// Roll ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mess_IntegralRoll2 += MesswertRoll + TrimRoll; |
Mess_IntegralRoll += MesswertRoll + TrimRoll - LageKorrekturRoll; |
if(Mess_IntegralRoll > Umschlag180Roll) |
{ |
Mess_IntegralRoll = -(Umschlag180Roll - 25000L); |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
} |
if(Mess_IntegralRoll <-Umschlag180Roll) |
{ |
Mess_IntegralRoll = (Umschlag180Roll - 25000L); |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
} |
// Nick ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mess_IntegralNick2 += MesswertNick + TrimNick; |
Mess_IntegralNick += MesswertNick + TrimNick - LageKorrekturNick; |
if(Mess_IntegralNick > Umschlag180Nick) |
{ |
Mess_IntegralNick = -(Umschlag180Nick - 25000L); |
Mess_IntegralNick2 = Mess_IntegralNick; |
} |
if(Mess_IntegralNick <-Umschlag180Nick) |
{ |
Mess_IntegralNick = (Umschlag180Nick - 25000L); |
Mess_IntegralNick2 = Mess_IntegralNick; |
} |
Integral_Gier = Mess_Integral_Gier; |
IntegralNick = Mess_IntegralNick; |
IntegralRoll = Mess_IntegralRoll; |
IntegralNick2 = Mess_IntegralNick2; |
IntegralRoll2 = Mess_IntegralRoll2; |
#define D_LIMIT 128 |
//MesswertNick = HiResNick / 8;// MartinR : so war es |
//MesswertRoll = HiResRoll / 8;// MartinR : so war es |
MesswertNick = AdWertNickFilter / 8;// MartinR : anstelle HiResNick : AdWertNickFilter |
MesswertRoll = AdWertRollFilter / 8;// MartinR : ist im vergleich zu HiRes.. eimal mehr gemittelt |
// MartinR : so war es Anfang |
/* |
if(AdWertNick < 15) MesswertNick = -1000; if(AdWertNick < 7) MesswertNick = -2000; |
if(PlatinenVersion == 10) { if(AdWertNick > 1010) MesswertNick = +1000; if(AdWertNick > 1017) MesswertNick = +2000; } |
else { if(AdWertNick > 2000) MesswertNick = +1000; if(AdWertNick > 2015) MesswertNick = +2000; } |
if(AdWertRoll < 15) MesswertRoll = -1000; if(AdWertRoll < 7) MesswertRoll = -2000; |
if(PlatinenVersion == 10) { if(AdWertRoll > 1010) MesswertRoll = +1000; if(AdWertRoll > 1017) MesswertRoll = +2000; } |
else { if(AdWertRoll > 2000) MesswertRoll = +1000; if(AdWertRoll > 2015) MesswertRoll = +2000; } |
// MartinR : FC 1.0: Sprung von 500 auf 2000 !! FC-ME: Sprung von 1000 auf 2000 |
*/ |
// MartinR : so war es Ende |
// MartinR : Neu Anfang |
if(PlatinenVersion == 10) |
{ |
if(AdWertNick > 1010) MesswertNick = +600; |
if(AdWertNick > 1017) MesswertNick = +800; |
if(AdWertNick < 15) MesswertNick = -600; |
if(AdWertNick < 7) MesswertNick = -800; |
if(AdWertRoll > 1010) MesswertRoll = +600; |
if(AdWertRoll > 1017) MesswertRoll = +800; |
if(AdWertRoll < 15) MesswertRoll = -600; |
if(AdWertRoll < 7) MesswertRoll = -800; |
} |
else |
{ |
if(AdWertNick > 2000) MesswertNick = +1200; |
if(AdWertNick > 2015) MesswertNick = +1600; |
if(AdWertNick < 15) MesswertNick = -1200; |
if(AdWertNick < 7) MesswertNick = -1600; |
if(AdWertRoll > 2000) MesswertRoll = +1200; |
if(AdWertRoll > 2015) MesswertRoll = +1600; |
if(AdWertRoll < 15) MesswertRoll = -1200; |
if(AdWertRoll < 7) MesswertRoll = -1600; |
} |
// MartinR : Neu Ende |
if(Parameter_Gyro_D) |
{ |
/* MartinR: so war es Anfang |
d2Nick = HiResNick - oldNick; |
oldNick = (oldNick + HiResNick)/2; |
if(d2Nick > D_LIMIT) d2Nick = D_LIMIT; |
else if(d2Nick < -D_LIMIT) d2Nick = -D_LIMIT; |
MesswertNick += (d2Nick * (signed int) Parameter_Gyro_D) / 16; |
d2Roll = HiResRoll - oldRoll; |
oldRoll = (oldRoll + HiResRoll)/2; |
if(d2Roll > D_LIMIT) d2Roll = D_LIMIT; |
else if(d2Roll < -D_LIMIT) d2Roll = -D_LIMIT; |
MesswertRoll += (d2Roll * (signed int) Parameter_Gyro_D) / 16; |
HiResNick += (d2Nick * (signed int) Parameter_Gyro_D); |
HiResRoll += (d2Roll * (signed int) Parameter_Gyro_D); |
*/ //MartinR: so war es Ende |
// MartinR :neu Anfang |
d2Nick = MesswertNick - oldNick2; |
oldNick2 = oldNick; |
oldNick = MesswertNick; |
if(d2Nick > D_LIMIT) d2Nick = D_LIMIT; |
else if(d2Nick < -D_LIMIT) d2Nick = -D_LIMIT; |
if(d2Nick > 0) d2Nick --; |
if(d2Nick < 0) d2Nick ++; |
MesswertNick += (d2Nick * (signed int) Parameter_Gyro_D) / 16; |
d2Roll = MesswertRoll - oldRoll2; |
oldRoll2 = oldRoll; |
oldRoll = MesswertRoll; |
if(d2Roll > D_LIMIT) d2Roll = D_LIMIT; |
else if(d2Roll < -D_LIMIT) d2Roll = -D_LIMIT; |
if(d2Roll > 0) d2Roll --; |
if(d2Roll < 0) d2Roll ++; |
MesswertRoll += (d2Roll * (signed int) Parameter_Gyro_D) / 16; |
// MartinR :neu Ende |
} |
if(RohMesswertRoll > 0) TrimRoll += ((long) abs(KopplungsteilNickRoll) * Parameter_CouplingYawCorrection) / 64L; |
else TrimRoll -= ((long) abs(KopplungsteilNickRoll) * Parameter_CouplingYawCorrection) / 64L; |
if(RohMesswertNick > 0) TrimNick += ((long) abs(KopplungsteilRollNick) * Parameter_CouplingYawCorrection) / 64L; |
else TrimNick -= ((long) abs(KopplungsteilRollNick) * Parameter_CouplingYawCorrection) / 64L; |
if(EE_Parameter.GlobalConfig & CFG_DREHRATEN_BEGRENZER && !Looping_Nick && !Looping_Roll) |
{ |
if(RohMesswertNick > 256) MesswertNick += 1 * (RohMesswertNick - 256); |
else if(RohMesswertNick < -256) MesswertNick += 1 * (RohMesswertNick + 256); |
if(RohMesswertRoll > 256) MesswertRoll += 1 * (RohMesswertRoll - 256); |
else if(RohMesswertRoll < -256) MesswertRoll += 1 * (RohMesswertRoll + 256); |
} |
if(Poti1 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110) Poti1++; else if(Poti1 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110 && Poti1) Poti1--; |
if(Poti2 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110) Poti2++; else if(Poti2 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110 && Poti2) Poti2--; |
if(Poti3 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110) Poti3++; else if(Poti3 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110 && Poti3) Poti3--; |
if(Poti4 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110) Poti4++; else if(Poti4 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110 && Poti4) Poti4--; |
if(Poti1 < 0) Poti1 = 0; else if(Poti1 > 255) Poti1 = 255; |
if(Poti2 < 0) Poti2 = 0; else if(Poti2 > 255) Poti2 = 255; |
if(Poti3 < 0) Poti3 = 0; else if(Poti3 > 255) Poti3 = 255; |
if(Poti4 < 0) Poti4 = 0; else if(Poti4 > 255) Poti4 = 255; |
} |
//############################################################################ |
// Messwerte beim Ermitteln der Nullage |
void CalibrierMittelwert(void) |
//############################################################################ |
{ |
if(PlatinenVersion == 13) SucheGyroOffset(); |
// ADC auschalten, damit die Werte sich nicht während der Berechnung ändern |
ANALOG_OFF; |
MesswertNick = AdWertNick; |
MesswertRoll = AdWertRoll; |
MesswertGier = AdWertGier; |
Mittelwert_AccNick = ACC_AMPLIFY * (long)AdWertAccNick; |
Mittelwert_AccRoll = ACC_AMPLIFY * (long)AdWertAccRoll; |
Mittelwert_AccHoch = (long)AdWertAccHoch; |
// ADC einschalten |
ANALOG_ON; |
if(Poti1 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110) Poti1++; else if(Poti1 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]] + 110 && Poti1) Poti1--; |
if(Poti2 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110) Poti2++; else if(Poti2 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]] + 110 && Poti2) Poti2--; |
if(Poti3 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110) Poti3++; else if(Poti3 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]] + 110 && Poti3) Poti3--; |
if(Poti4 < PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110) Poti4++; else if(Poti4 > PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]] + 110 && Poti4) Poti4--; |
if(Poti1 < 0) Poti1 = 0; else if(Poti1 > 255) Poti1 = 255; |
if(Poti2 < 0) Poti2 = 0; else if(Poti2 > 255) Poti2 = 255; |
if(Poti3 < 0) Poti3 = 0; else if(Poti3 > 255) Poti3 = 255; |
if(Poti4 < 0) Poti4 = 0; else if(Poti4 > 255) Poti4 = 255; |
Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L; |
Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagRoll * 2500L; |
} |
//############################################################################ |
// Senden der Motorwerte per I2C-Bus |
void SendMotorData(void) |
//############################################################################ |
{ |
unsigned char i; |
if(!MotorenEin) |
{ |
MikroKopterFlags &= ~(FLAG_MOTOR_RUN | FLAG_FLY); |
for(i=0;i<MAX_MOTORS;i++) |
{ |
if(!PC_MotortestActive) MotorTest[i] = 0; |
Motor[i] = MotorTest[i]; |
} |
if(PC_MotortestActive) PC_MotortestActive--; |
} |
else MikroKopterFlags |= FLAG_MOTOR_RUN; |
DebugOut.Analog[12] = Motor[0]; |
DebugOut.Analog[13] = Motor[1]; |
DebugOut.Analog[14] = Motor[3]; |
DebugOut.Analog[15] = Motor[2]; |
//Start I2C Interrupt Mode |
twi_state = 0; |
motor = 0; |
i2c_start(); |
} |
//############################################################################ |
// Trägt ggf. das Poti als Parameter ein |
void ParameterZuordnung(void) |
//############################################################################ |
{ |
#define CHK_POTI_MM(b,a,min,max) { if(a > 250) { if(a == 251) b = Poti1; else if(a == 252) b = Poti2; else if(a == 253) b = Poti3; else if(a == 254) b = Poti4;} else b = a; if(b <= min) b = min; else if(b >= max) b = max;} |
#define CHK_POTI(b,a,min,max) { if(a > 250) { if(a == 251) b = Poti1; else if(a == 252) b = Poti2; else if(a == 253) b = Poti3; else if(a == 254) b = Poti4;} else b = a; } |
CHK_POTI(Parameter_MaxHoehe,EE_Parameter.MaxHoehe,0,255); |
CHK_POTI_MM(Parameter_Luftdruck_D,EE_Parameter.Luftdruck_D,0,100); |
CHK_POTI_MM(Parameter_Hoehe_P,EE_Parameter.Hoehe_P,0,100); |
CHK_POTI(Parameter_Hoehe_ACC_Wirkung,EE_Parameter.Hoehe_ACC_Wirkung,0,255); |
CHK_POTI(Parameter_KompassWirkung,EE_Parameter.KompassWirkung,0,255); |
CHK_POTI_MM(Parameter_Gyro_P,EE_Parameter.Gyro_P,10,255); |
CHK_POTI(Parameter_Gyro_I,EE_Parameter.Gyro_I,0,255); |
CHK_POTI(Parameter_Gyro_D,EE_Parameter.Gyro_D,0,255); |
CHK_POTI(Parameter_I_Faktor,EE_Parameter.I_Faktor,0,255); |
CHK_POTI(Parameter_UserParam1,EE_Parameter.UserParam1,0,255); |
CHK_POTI(Parameter_UserParam2,EE_Parameter.UserParam2,0,255); |
CHK_POTI(Parameter_UserParam3,EE_Parameter.UserParam3,0,255); |
CHK_POTI(Parameter_UserParam4,EE_Parameter.UserParam4,0,255); |
CHK_POTI(Parameter_UserParam5,EE_Parameter.UserParam5,0,255); |
CHK_POTI(Parameter_UserParam6,EE_Parameter.UserParam6,0,255); |
CHK_POTI(Parameter_UserParam7,EE_Parameter.UserParam7,0,255); |
CHK_POTI(Parameter_UserParam8,EE_Parameter.UserParam8,0,255); |
CHK_POTI(Parameter_ServoNickControl,EE_Parameter.ServoNickControl,0,255); |
CHK_POTI(Parameter_ServoRollControl,EE_Parameter.ServoRollControl,0,255); |
CHK_POTI(Parameter_LoopGasLimit,EE_Parameter.LoopGasLimit,0,255); |
CHK_POTI(Parameter_AchsKopplung1, EE_Parameter.AchsKopplung1,0,255); |
CHK_POTI(Parameter_AchsKopplung2, EE_Parameter.AchsKopplung2,0,255); |
CHK_POTI(Parameter_CouplingYawCorrection,EE_Parameter.CouplingYawCorrection,0,255); |
// CHK_POTI(Parameter_AchsGegenKopplung1,EE_Parameter.AchsGegenKopplung1,0,255); |
CHK_POTI(Parameter_DynamicStability,EE_Parameter.DynamicStability,0,255); |
CHK_POTI_MM(Parameter_J16Timing,EE_Parameter.J16Timing,1,255); |
CHK_POTI_MM(Parameter_J17Timing,EE_Parameter.J17Timing,1,255); |
CHK_POTI(Parameter_ExternalControl,EE_Parameter.ExternalControl,0,255); |
Ki = 10300 / (Parameter_I_Faktor + 1); |
if(Parameter_UserParam1 > 140) KiHH = 10300 / (Parameter_UserParam2 + 1); else KiHH = Ki; // MartinR : für HH über Schalter |
Parameter_NaviGpsModeControl = EE_Parameter.NaviGpsModeControl; //MartinR: Standard: EE_Parameter.NaviGpsModeControl wird übertragen |
if(!IntegralFaktor) Parameter_NaviGpsModeControl= 0; // MartinR: wenn HH dann GPS auf free- Mode |
// 0 = AID; 100 = free; 200 = coming home //so war es |
// 0 = free; 100 = AID; 200 = coming home //neu |
MAX_GAS = EE_Parameter.Gas_Max; |
MIN_GAS = EE_Parameter.Gas_Min; |
} |
//############################################################################ |
// |
void MotorRegler(void) |
//############################################################################ |
{ |
int pd_ergebnis_nick,pd_ergebnis_roll,h,tmp_int; |
int GierMischanteil,GasMischanteil; |
static long SummeNick=0,SummeRoll=0; |
static long SummeNickHH=0,SummeRollHH=0; // MartinR: Für ACC-HH Umschaltung |
static long sollGier = 0,tmp_long,tmp_long2; |
static long IntegralFehlerNick = 0; |
static long IntegralFehlerRoll = 0; |
static unsigned int RcLostTimer; |
static unsigned char delay_neutral = 0; |
static unsigned char delay_einschalten = 0,delay_ausschalten = 0; |
static int hoehenregler = 0; |
static char TimerWerteausgabe = 0; |
static char NeueKompassRichtungMerken = 0; |
static long ausgleichNick, ausgleichRoll; |
int IntegralNickMalFaktor,IntegralRollMalFaktor; |
unsigned char i; |
Mittelwert(); |
GRN_ON; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gaswert ermitteln |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
GasMischanteil = StickGas; |
if(GasMischanteil < MIN_GAS + 10) GasMischanteil = MIN_GAS + 10; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Empfang schlecht |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(SenderOkay < 100) |
{ |
if(!PcZugriff) |
{ |
if(BeepMuster == 0xffff) |
{ |
beeptime = 15000; |
BeepMuster = 0x0c00; |
} |
} |
if(RcLostTimer) RcLostTimer--; |
else |
{ |
MotorenEin = 0; |
Notlandung = 0; |
} |
ROT_ON; |
if(modell_fliegt > 1000) // wahrscheinlich in der Luft --> langsam absenken |
{ |
GasMischanteil = EE_Parameter.NotGas; |
Notlandung = 1; |
PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] = 0; |
PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] = 0; |
PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] = 0; |
PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] = 0; |
PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] = 0; |
} |
else MotorenEin = 0; |
} |
else |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Emfang gut |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(SenderOkay > 140) |
{ |
Notlandung = 0; |
RcLostTimer = EE_Parameter.NotGasZeit * 50; |
if(GasMischanteil > 40 && MotorenEin) |
{ |
if(modell_fliegt < 0xffff) modell_fliegt++; |
} |
if((modell_fliegt < 256)) |
{ |
SummeNick = 0; |
SummeRoll = 0; |
if(modell_fliegt == 250) |
{ |
NeueKompassRichtungMerken = 1; |
sollGier = 0; |
Mess_Integral_Gier = 0; |
// Mess_Integral_Gier2 = 0; |
} |
} else MikroKopterFlags |= FLAG_FLY; |
if((PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] > 80) && MotorenEin == 0) |
{ |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// auf Nullwerte kalibrieren |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] > 75) // Neutralwerte |
{ |
if(++delay_neutral > 200) // nicht sofort |
{ |
GRN_OFF; |
MotorenEin = 0; |
delay_neutral = 0; |
modell_fliegt = 0; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70 || abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) > 70) |
{ |
unsigned char setting=1; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < 70) setting = 1; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 2; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 3; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] <-70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 4; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] <-70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < 70) setting = 5; |
SetActiveParamSetNumber(setting); // aktiven Datensatz merken |
} |
// else |
if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) < 30 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < -70) |
{ |
WinkelOut.CalcState = 1; |
beeptime = 1000; |
} |
else |
{ |
ReadParameterSet(GetActiveParamSetNumber(), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
{ |
if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
} |
SetNeutral(); |
ServoActive = 1; |
DDRD |=0x80; // enable J7 -> Servo signal |
Piep(GetActiveParamSetNumber(),120); |
} |
} |
} |
else |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] < -75) // ACC Neutralwerte speichern |
{ |
if(++delay_neutral > 200) // nicht sofort |
{ |
GRN_OFF; |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_NICK],0xff); // Werte löschen |
MotorenEin = 0; |
delay_neutral = 0; |
modell_fliegt = 0; |
SetNeutral(); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_NICK],NeutralAccX / 256); // ACC-NeutralWerte speichern |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_NICK+1],NeutralAccX % 256); // ACC-NeutralWerte speichern |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL],NeutralAccY / 256); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL+1],NeutralAccY % 256); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_Z],(int)NeutralAccZ / 256); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_Z+1],(int)NeutralAccZ % 256); |
Piep(GetActiveParamSetNumber(),120); |
} |
} |
else delay_neutral = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gas ist unten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] < 35-120) |
{ |
// Starten |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] < -75) |
{ |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Einschalten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(++delay_einschalten > 200) |
{ |
delay_einschalten = 200; |
modell_fliegt = 1; |
MotorenEin = 1; |
sollGier = 0; |
Mess_Integral_Gier = 0; |
Mess_Integral_Gier2 = 0; |
Mess_IntegralNick = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccNick; |
Mess_IntegralRoll = EE_Parameter.GyroAccFaktor * (long)Mittelwert_AccRoll; |
Mess_IntegralNick2 = IntegralNick; |
Mess_IntegralRoll2 = IntegralRoll; |
SummeNick = 0; |
SummeRoll = 0; |
SchwebeGas = 0; // MartinR: für neuen Höhenregler |
MikroKopterFlags |= FLAG_START; |
} |
} |
else delay_einschalten = 0; |
//Auf Neutralwerte setzen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Auschalten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] > 75) |
{ |
if(++delay_ausschalten > 200) // nicht sofort |
{ |
MotorenEin = 0; |
delay_ausschalten = 200; |
modell_fliegt = 0; |
} |
} |
else delay_ausschalten = 0; |
} |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// neue Werte von der Funke |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!NewPpmData-- || Notlandung) |
{ |
static int stick_nick,stick_roll; |
ParameterZuordnung(); |
// MartinR: original: |
/* |
stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4; |
stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; |
StickNick = stick_nick - (GPS_Nick + GPS_Nick2); |
stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4; |
stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; |
StickRoll = stick_roll - (GPS_Roll + GPS_Roll2); |
*/ |
// MartinR: geändert Anfang |
if(Parameter_UserParam1 > 140) // MartinR: zweiter Stick_P Wert nur, wenn HH über Schalter aktiv ist |
{ |
stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * Parameter_UserParam3 - stick_nick_neutral) / 4; |
stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * Parameter_UserParam3 - stick_roll_neutral) / 4 ; |
} |
else |
stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4; |
stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4; |
if(IntegralFaktor) |
{ |
stick_nick_neutral = stick_nick; // beim Umschalten auf HH wird derletzte Stickwert als Neutralposition verwendet, MartinR |
stick_roll_neutral = stick_roll; // beim Umschalten auf HH wird derletzte Stickwert als Neutralposition verwendet, MartinR |
stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; |
stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; |
StickNick = stick_nick - (GPS_Nick + GPS_Nick2); // MartinR: GPS nur im ACC-Mode wirksam |
StickRoll = stick_roll - (GPS_Roll + GPS_Roll2); // MartinR: GPS nur im ACC-Mode wirksam |
} |
else // wenn HH , MartinR |
{ |
stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; // MartinR: eventuell vor if verschieben |
stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; // MartinR: eventuell vor if verschieben |
StickNick = stick_nick; // MartinR: GPS nur im ACC-Mode wirksam |
StickRoll = stick_roll; // MartinR: GPS nur im ACC-Mode wirksam |
} |
// MartinR: geändert Ende |
StickGier = -PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]; |
if(StickGier > 2) StickGier -= 2; else |
if(StickGier < -2) StickGier += 2; else StickGier = 0; |
StickGas = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] + 120; |
GyroFaktor = (Parameter_Gyro_P + 10.0); |
IntegralFaktor = Parameter_Gyro_I; |
GyroFaktorGier = (Parameter_Gyro_P + 10.0); |
IntegralFaktorGier = Parameter_Gyro_I; |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//+ Analoge Steuerung per Seriell |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// MartinR: ToDo: eventuell die Kombination HH und Steuerung per Seriell nicht zulassen?? |
if(ExternControl.Config & 0x01 && Parameter_ExternalControl > 128) |
{ |
StickNick += (int) ExternControl.Nick * (int) EE_Parameter.Stick_P; |
StickRoll += (int) ExternControl.Roll * (int) EE_Parameter.Stick_P; |
StickGier += ExternControl.Gier; |
ExternHoehenValue = (int) ExternControl.Hight * (int)EE_Parameter.Hoehe_Verstaerkung; |
if(ExternControl.Gas < StickGas) StickGas = ExternControl.Gas; |
} |
if(StickGas < 0) StickGas = 0; |
//if(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) IntegralFaktor = 0; // MartinR: Original |
if((EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) || (Parameter_UserParam1 > 140)) IntegralFaktor = 0; // MartinR |
if(GyroFaktor < 0) GyroFaktor = 0; |
if(IntegralFaktor < 0) IntegralFaktor = 0; |
if(abs(StickNick/STICK_GAIN) > MaxStickNick) |
{ |
MaxStickNick = abs(StickNick)/STICK_GAIN; |
if(MaxStickNick > 100) MaxStickNick = 100; |
} |
else MaxStickNick--; |
if(abs(StickRoll/STICK_GAIN) > MaxStickRoll) |
{ |
MaxStickRoll = abs(StickRoll)/STICK_GAIN; |
if(MaxStickRoll > 100) MaxStickRoll = 100; |
} |
else MaxStickRoll--; |
if(Notlandung) {MaxStickNick = 0; MaxStickRoll = 0;} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Looping? |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > EE_Parameter.LoopThreshold) && EE_Parameter.BitConfig & CFG_LOOP_LINKS) Looping_Links = 1; |
else |
{ |
{ |
if((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < (EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese))) Looping_Links = 0; |
} |
} |
if((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < -EE_Parameter.LoopThreshold) && EE_Parameter.BitConfig & CFG_LOOP_RECHTS) Looping_Rechts = 1; |
else |
{ |
if(Looping_Rechts) // Hysterese |
{ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > -(EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese)) Looping_Rechts = 0; |
} |
} |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > EE_Parameter.LoopThreshold) && EE_Parameter.BitConfig & CFG_LOOP_OBEN) Looping_Oben = 1; |
else |
{ |
if(Looping_Oben) // Hysterese |
{ |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < (EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese))) Looping_Oben = 0; |
} |
} |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < -EE_Parameter.LoopThreshold) && EE_Parameter.BitConfig & CFG_LOOP_UNTEN) Looping_Unten = 1; |
else |
{ |
if(Looping_Unten) // Hysterese |
{ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > -(EE_Parameter.LoopThreshold - EE_Parameter.LoopHysterese)) Looping_Unten = 0; |
} |
} |
if(Looping_Links || Looping_Rechts) Looping_Roll = 1; else Looping_Roll = 0; |
if(Looping_Oben || Looping_Unten) { Looping_Nick = 1; Looping_Roll = 0; Looping_Links = 0; Looping_Rechts = 0;} else Looping_Nick = 0; |
} // Ende neue Funken-Werte |
if(Looping_Roll || Looping_Nick) |
{ |
if(GasMischanteil > EE_Parameter.LoopGasLimit) GasMischanteil = EE_Parameter.LoopGasLimit; |
TrichterFlug = 1; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Bei Empfangsausfall im Flug |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(Notlandung) |
{ |
StickGier = 0; |
StickNick = 0; |
StickRoll = 0; |
GyroFaktor = 90; |
IntegralFaktor = 120; |
GyroFaktorGier = 90; |
IntegralFaktorGier = 120; |
Looping_Roll = 0; |
Looping_Nick = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Integrale auf ACC-Signal abgleichen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define ABGLEICH_ANZAHL 256L |
MittelIntegralNick += IntegralNick; // Für die Mittelwertbildung aufsummieren |
MittelIntegralRoll += IntegralRoll; |
MittelIntegralNick2 += IntegralNick2; |
MittelIntegralRoll2 += IntegralRoll2; |
//if(Looping_Nick || Looping_Roll) // MartinR: so war es |
if(Looping_Nick || Looping_Roll || !IntegralFaktor) // MartinR: "|| !IntegralFaktor" hinzugefügt |
{ |
IntegralAccNick = 0; |
IntegralAccRoll = 0; |
MittelIntegralNick = 0; |
MittelIntegralRoll = 0; |
MittelIntegralNick2 = 0; |
MittelIntegralRoll2 = 0; |
IntegralNick = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 |
IntegralRoll = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 |
Mess_IntegralNick = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 |
Mess_IntegralRoll = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 |
Mess_Integral_Gier = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 |
Mess_Integral_Gier2 = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 |
Mess_IntegralNick2 = Mess_IntegralNick; |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
ZaehlMessungen = 0; |
LageKorrekturNick = 0; |
LageKorrekturRoll = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!Looping_Nick && !Looping_Roll && (Aktuell_az > 512 || MotorenEin) && IntegralFaktor) // MartinR: "&& IntegralFaktor" hinzugefügt |
{ |
long tmp_long, tmp_long2; |
if(FromNaviCtrl_Value.Kalman_K != -1 /*&& !TrichterFlug*/) |
{ |
tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick); |
tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll); |
tmp_long = (tmp_long * FromNaviCtrl_Value.Kalman_K) / (32 * 16); |
tmp_long2 = (tmp_long2 * FromNaviCtrl_Value.Kalman_K) / (32 * 16); |
if((MaxStickNick > 64) || (MaxStickRoll > 64)) |
{ |
tmp_long /= 2; |
tmp_long2 /= 2; |
} |
if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25) |
{ |
tmp_long /= 3; |
tmp_long2 /= 3; |
} |
if(tmp_long > (long) FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long = (long) FromNaviCtrl_Value.Kalman_MaxFusion; |
if(tmp_long < (long)-FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long = (long)-FromNaviCtrl_Value.Kalman_MaxFusion; |
if(tmp_long2 > (long) FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long2 = (long) FromNaviCtrl_Value.Kalman_MaxFusion; |
if(tmp_long2 < (long)-FromNaviCtrl_Value.Kalman_MaxFusion) tmp_long2 = (long)-FromNaviCtrl_Value.Kalman_MaxFusion; |
} |
else |
{ |
tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick); |
tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll); |
tmp_long /= 16; |
tmp_long2 /= 16; |
if((MaxStickNick > 64) || (MaxStickRoll > 64)) |
{ |
tmp_long /= 3; |
tmp_long2 /= 3; |
} |
if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25) |
{ |
tmp_long /= 3; |
tmp_long2 /= 3; |
} |
#define AUSGLEICH 32 |
if(tmp_long > AUSGLEICH) tmp_long = AUSGLEICH; |
if(tmp_long < -AUSGLEICH) tmp_long =-AUSGLEICH; |
if(tmp_long2 > AUSGLEICH) tmp_long2 = AUSGLEICH; |
if(tmp_long2 <-AUSGLEICH) tmp_long2 =-AUSGLEICH; |
} |
//if(Poti2 > 20) { tmp_long = 0; tmp_long2 = 0;} |
Mess_IntegralNick -= tmp_long; |
Mess_IntegralRoll -= tmp_long2; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(ZaehlMessungen >= ABGLEICH_ANZAHL) |
{ |
static int cnt = 0; |
static char last_n_p,last_n_n,last_r_p,last_r_n; |
static long MittelIntegralNick_Alt,MittelIntegralRoll_Alt; |
if(!Looping_Nick && !Looping_Roll && !TrichterFlug && EE_Parameter.Driftkomp && IntegralFaktor) // MartinR: "&& IntegralFaktor" hinzugefügt |
{ |
MittelIntegralNick /= ABGLEICH_ANZAHL; |
MittelIntegralRoll /= ABGLEICH_ANZAHL; |
IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL; |
IntegralAccRoll = (EE_Parameter.GyroAccFaktor * IntegralAccRoll) / ABGLEICH_ANZAHL; |
IntegralAccZ = IntegralAccZ / ABGLEICH_ANZAHL; |
#define MAX_I 0//(Poti2/10) |
// Nick ++++++++++++++++++++++++++++++++++++++++++++++++ |
IntegralFehlerNick = (long)(MittelIntegralNick - (long)IntegralAccNick); |
ausgleichNick = IntegralFehlerNick / EE_Parameter.GyroAccAbgleich; |
// Roll ++++++++++++++++++++++++++++++++++++++++++++++++ |
IntegralFehlerRoll = (long)(MittelIntegralRoll - (long)IntegralAccRoll); |
ausgleichRoll = IntegralFehlerRoll / EE_Parameter.GyroAccAbgleich; |
LageKorrekturNick = ausgleichNick / ABGLEICH_ANZAHL; |
LageKorrekturRoll = ausgleichRoll / ABGLEICH_ANZAHL; |
if(((MaxStickNick > 64) || (MaxStickRoll > 64) || (abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25)) && (FromNaviCtrl_Value.Kalman_K == -1)) |
{ |
LageKorrekturNick /= 2; |
LageKorrekturRoll /= 2; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gyro-Drift ermitteln |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
MittelIntegralNick2 /= ABGLEICH_ANZAHL; |
MittelIntegralRoll2 /= ABGLEICH_ANZAHL; |
tmp_long = IntegralNick2 - IntegralNick; |
tmp_long2 = IntegralRoll2 - IntegralRoll; |
//DebugOut.Analog[25] = MittelIntegralRoll2 / 26; |
IntegralFehlerNick = tmp_long; |
IntegralFehlerRoll = tmp_long2; |
Mess_IntegralNick2 -= IntegralFehlerNick; |
Mess_IntegralRoll2 -= IntegralFehlerRoll; |
// IntegralFehlerNick = (IntegralFehlerNick * 1 + tmp_long) / 2; |
// IntegralFehlerRoll = (IntegralFehlerRoll * 1 + tmp_long2) / 2; |
if(EE_Parameter.Driftkomp) |
{ |
if(GierGyroFehler > ABGLEICH_ANZAHL/2) { AdNeutralGier++; AdNeutralGierBias++; } |
if(GierGyroFehler <-ABGLEICH_ANZAHL/2) { AdNeutralGier--; AdNeutralGierBias--; } |
} |
//DebugOut.Analog[22] = MittelIntegralRoll / 26; |
//DebugOut.Analog[24] = GierGyroFehler; |
GierGyroFehler = 0; |
/*DebugOut.Analog[17] = IntegralAccNick / 26; |
DebugOut.Analog[18] = IntegralAccRoll / 26; |
DebugOut.Analog[19] = IntegralFehlerNick;// / 26; |
DebugOut.Analog[20] = IntegralFehlerRoll;// / 26; |
*/ |
//DebugOut.Analog[21] = MittelIntegralNick / 26; |
//MittelIntegralRoll = MittelIntegralRoll; |
//DebugOut.Analog[28] = ausgleichNick; |
/* |
DebugOut.Analog[29] = ausgleichRoll; |
DebugOut.Analog[30] = LageKorrekturRoll * 10; |
*/ |
#define FEHLER_LIMIT (ABGLEICH_ANZAHL / 2) |
#define FEHLER_LIMIT1 (ABGLEICH_ANZAHL * 2) //4 |
#define FEHLER_LIMIT2 (ABGLEICH_ANZAHL * 16) //16 |
#define BEWEGUNGS_LIMIT 20000 |
// Nick +++++++++++++++++++++++++++++++++++++++++++++++++ |
cnt = 1;// + labs(IntegralFehlerNick) / 4096; |
if(labs(IntegralFehlerNick) > FEHLER_LIMIT1) cnt = 4; |
if(labs(MittelIntegralNick_Alt - MittelIntegralNick) < BEWEGUNGS_LIMIT || (FromNaviCtrl_Value.Kalman_MaxDrift > 3*8)) |
{ |
if(IntegralFehlerNick > FEHLER_LIMIT2) |
{ |
if(last_n_p) |
{ |
cnt += labs(IntegralFehlerNick) / (FEHLER_LIMIT2 / 8); |
ausgleichNick = IntegralFehlerNick / 8; |
if(ausgleichNick > 5000) ausgleichNick = 5000; |
LageKorrekturNick += ausgleichNick / ABGLEICH_ANZAHL; |
} |
else last_n_p = 1; |
} else last_n_p = 0; |
if(IntegralFehlerNick < -FEHLER_LIMIT2) |
{ |
if(last_n_n) |
{ |
cnt += labs(IntegralFehlerNick) / (FEHLER_LIMIT2 / 8); |
ausgleichNick = IntegralFehlerNick / 8; |
if(ausgleichNick < -5000) ausgleichNick = -5000; |
LageKorrekturNick += ausgleichNick / ABGLEICH_ANZAHL; |
} |
else last_n_n = 1; |
} else last_n_n = 0; |
} |
else |
{ |
cnt = 0; |
KompassSignalSchlecht = 1000; |
} |
if(cnt > EE_Parameter.Driftkomp) cnt = EE_Parameter.Driftkomp; |
if(FromNaviCtrl_Value.Kalman_MaxDrift) if(cnt > FromNaviCtrl_Value.Kalman_MaxDrift) cnt = FromNaviCtrl_Value.Kalman_MaxDrift; |
if(IntegralFehlerNick > FEHLER_LIMIT) AdNeutralNick += cnt; |
if(IntegralFehlerNick < -FEHLER_LIMIT) AdNeutralNick -= cnt; |
// Roll +++++++++++++++++++++++++++++++++++++++++++++++++ |
cnt = 1;// + labs(IntegralFehlerNick) / 4096; |
if(labs(IntegralFehlerRoll) > FEHLER_LIMIT1) cnt = 4; |
ausgleichRoll = 0; |
if(labs(MittelIntegralRoll_Alt - MittelIntegralRoll) < BEWEGUNGS_LIMIT || (FromNaviCtrl_Value.Kalman_MaxDrift > 3*8)) |
{ |
if(IntegralFehlerRoll > FEHLER_LIMIT2) |
{ |
if(last_r_p) |
{ |
cnt += labs(IntegralFehlerRoll) / (FEHLER_LIMIT2 / 8); |
ausgleichRoll = IntegralFehlerRoll / 8; |
if(ausgleichRoll > 5000) ausgleichRoll = 5000; |
LageKorrekturRoll += ausgleichRoll / ABGLEICH_ANZAHL; |
} |
else last_r_p = 1; |
} else last_r_p = 0; |
if(IntegralFehlerRoll < -FEHLER_LIMIT2) |
{ |
if(last_r_n) |
{ |
cnt += labs(IntegralFehlerRoll) / (FEHLER_LIMIT2 / 8); |
ausgleichRoll = IntegralFehlerRoll / 8; |
if(ausgleichRoll < -5000) ausgleichRoll = -5000; |
LageKorrekturRoll += ausgleichRoll / ABGLEICH_ANZAHL; |
} |
else last_r_n = 1; |
} else last_r_n = 0; |
} else |
{ |
cnt = 0; |
KompassSignalSchlecht = 1000; |
} |
if(cnt > EE_Parameter.Driftkomp) cnt = EE_Parameter.Driftkomp; |
if(FromNaviCtrl_Value.Kalman_MaxDrift) if(cnt > FromNaviCtrl_Value.Kalman_MaxDrift) cnt = FromNaviCtrl_Value.Kalman_MaxDrift; |
if(IntegralFehlerRoll > FEHLER_LIMIT) AdNeutralRoll += cnt; |
if(IntegralFehlerRoll < -FEHLER_LIMIT) AdNeutralRoll -= cnt; |
} |
else |
{ |
LageKorrekturRoll = 0; |
LageKorrekturNick = 0; |
TrichterFlug = 0; |
} |
if(!IntegralFaktor) { LageKorrekturRoll = 0; LageKorrekturNick = 0;} // z.B. bei HH |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++ |
MittelIntegralNick_Alt = MittelIntegralNick; |
MittelIntegralRoll_Alt = MittelIntegralRoll; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++ |
IntegralAccNick = 0; |
IntegralAccRoll = 0; |
IntegralAccZ = 0; |
MittelIntegralNick = 0; |
MittelIntegralRoll = 0; |
MittelIntegralNick2 = 0; |
MittelIntegralRoll2 = 0; |
ZaehlMessungen = 0; |
} // ZaehlMessungen >= ABGLEICH_ANZAHL |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gieren |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// if(GasMischanteil < 35) { if(StickGier > 10) StickGier = 10; else if(StickGier < -10) StickGier = -10;}; |
if(abs(StickGier) > 15) // war 35 |
{ |
KompassSignalSchlecht = 1000; |
if(!(EE_Parameter.GlobalConfig & CFG_KOMPASS_FIX)) |
{ |
NeueKompassRichtungMerken = 1; |
}; |
} |
tmp_int = (long) EE_Parameter.Gier_P * ((long)StickGier * abs(StickGier)) / 512L; // expo y = ax + bx² |
tmp_int += (EE_Parameter.Gier_P * StickGier) / 4; |
sollGier = tmp_int; |
Mess_Integral_Gier -= tmp_int; |
if(Mess_Integral_Gier > 50000) Mess_Integral_Gier = 50000; // begrenzen |
if(Mess_Integral_Gier <-50000) Mess_Integral_Gier =-50000; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Kompass |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//DebugOut.Analog[16] = KompassSignalSchlecht; |
if(KompassValue && (EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV)) |
{ |
int w,v,r,fehler,korrektur; |
w = abs(IntegralNick /512); // mit zunehmender Neigung den Einfluss drosseln |
v = abs(IntegralRoll /512); |
if(v > w) w = v; // grösste Neigung ermitteln |
korrektur = w / 8 + 1; |
fehler = ((540 + KompassValue - (ErsatzKompass/GIER_GRAD_FAKTOR)) % 360) - 180; |
if(abs(MesswertGier) > 128) |
{ |
fehler = 0; |
} |
if(!KompassSignalSchlecht && w < 25) |
{ |
GierGyroFehler += fehler; |
if(NeueKompassRichtungMerken) |
{ |
beeptime = 200; |
// KompassStartwert = KompassValue; |
ErsatzKompass = KompassValue * GIER_GRAD_FAKTOR; |
KompassStartwert = (ErsatzKompass/GIER_GRAD_FAKTOR); |
NeueKompassRichtungMerken = 0; |
} |
} |
ErsatzKompass += (fehler * 8) / korrektur; |
w = (w * Parameter_KompassWirkung) / 32; // auf die Wirkung normieren |
w = Parameter_KompassWirkung - w; // Wirkung ggf drosseln |
if(w >= 0) |
{ |
if(!KompassSignalSchlecht) |
{ |
v = 64 + ((MaxStickNick + MaxStickRoll)) / 8; |
r = ((540 + (ErsatzKompass/GIER_GRAD_FAKTOR) - KompassStartwert) % 360) - 180; |
// r = KompassRichtung; |
v = (r * w) / v; // nach Kompass ausrichten |
w = 3 * Parameter_KompassWirkung; |
if(v > w) v = w; // Begrenzen |
else |
if(v < -w) v = -w; |
Mess_Integral_Gier += v; |
} |
if(KompassSignalSchlecht) KompassSignalSchlecht--; |
} |
else KompassSignalSchlecht = 500; // so lange das Signal taub stellen --> ca. 1 sek |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Debugwerte zuordnen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!TimerWerteausgabe--) |
{ |
TimerWerteausgabe = 24; |
DebugOut.Analog[0] = IntegralNick / (EE_Parameter.GyroAccFaktor * 4); |
DebugOut.Analog[1] = IntegralRoll / (EE_Parameter.GyroAccFaktor * 4); |
DebugOut.Analog[2] = Mittelwert_AccNick / 4; |
DebugOut.Analog[3] = Mittelwert_AccRoll / 4; |
DebugOut.Analog[4] = MesswertGier; |
DebugOut.Analog[5] = HoehenWert; |
DebugOut.Analog[6] = Aktuell_az;//(Mess_Integral_Hoch / 512);//Aktuell_az; |
DebugOut.Analog[8] = KompassValue; |
DebugOut.Analog[9] = UBat; |
DebugOut.Analog[11] = ErsatzKompass / GIER_GRAD_FAKTOR; |
DebugOut.Analog[10] = SenderOkay; |
//DebugOut.Analog[16] = Mittelwert_AccHoch; |
//DebugOut.Analog[17] = FromNaviCtrl_Value.Distance; |
//DebugOut.Analog[18] = (int)FromNaviCtrl_Value.OsdBar; |
DebugOut.Analog[19] = WinkelOut.CalcState; |
// DebugOut.Analog[20] = ServoValue; // MartinR: DebugOut.Analog[20] wird in timer0.c ausgegeben!! |
// DebugOut.Analog[24] = MesswertNick/2; |
// DebugOut.Analog[25] = MesswertRoll/2; |
DebugOut.Analog[27] = (int)FromNaviCtrl_Value.Kalman_MaxDrift; |
// DebugOut.Analog[28] = (int)FromNaviCtrl_Value.Kalman_MaxFusion; |
// DebugOut.Analog[29] = (int)FromNaviCtrl_Value.Kalman_K; |
DebugOut.Analog[29] = FromNaviCtrl_Value.SerialDataOkay; |
DebugOut.Analog[30] = GPS_Nick; |
DebugOut.Analog[31] = GPS_Roll; |
// DebugOut.Analog[19] -= DebugOut.Analog[19]/128; |
// if(DebugOut.Analog[19] > 0) DebugOut.Analog[19]--; else DebugOut.Analog[19]++; |
/* DebugOut.Analog[16] = motor_rx[0]; |
DebugOut.Analog[17] = motor_rx[1]; |
DebugOut.Analog[18] = motor_rx[2]; |
DebugOut.Analog[19] = motor_rx[3]; |
DebugOut.Analog[20] = motor_rx[0] + motor_rx[1] + motor_rx[2] + motor_rx[3]; |
DebugOut.Analog[20] /= 14; |
DebugOut.Analog[21] = motor_rx[4]; |
DebugOut.Analog[22] = motor_rx[5]; |
DebugOut.Analog[23] = motor_rx[6]; |
DebugOut.Analog[24] = motor_rx[7]; |
DebugOut.Analog[25] = motor_rx[4] + motor_rx[5] + motor_rx[6] + motor_rx[7]; |
*/ |
// DebugOut.Analog[9] = MesswertNick; |
// DebugOut.Analog[9] = SollHoehe; |
// DebugOut.Analog[10] = Mess_Integral_Gier / 128; |
// DebugOut.Analog[11] = KompassStartwert; |
// DebugOut.Analog[10] = Parameter_Gyro_I; |
// DebugOut.Analog[10] = EE_Parameter.Gyro_I; |
// DebugOut.Analog[9] = KompassRichtung; |
// DebugOut.Analog[10] = GasMischanteil; |
// DebugOut.Analog[3] = HoeheD * 32; |
// DebugOut.Analog[4] = hoehenregler; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Drehgeschwindigkeit und -winkel zu einem Istwert zusammenfassen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(TrichterFlug) { SummeRoll = 0; SummeNick = 0;}; |
if(!Looping_Nick) IntegralNickMalFaktor = (IntegralNick * IntegralFaktor) / (44000 / STICK_GAIN); else IntegralNickMalFaktor = 0; |
if(!Looping_Roll) IntegralRollMalFaktor = (IntegralRoll * IntegralFaktor) / (44000 / STICK_GAIN); else IntegralRollMalFaktor = 0; |
#define TRIM_MAX 200 |
if(TrimNick > TRIM_MAX) TrimNick = TRIM_MAX; else if(TrimNick <-TRIM_MAX) TrimNick =-TRIM_MAX; |
if(TrimRoll > TRIM_MAX) TrimRoll = TRIM_MAX; else if(TrimRoll <-TRIM_MAX) TrimRoll =-TRIM_MAX; |
if(!IntegralFaktor) // MartinR : hinzugefügt |
{ |
MesswertNick = (long) ((long)MesswertNick * GyroFaktor) / (256L / STICK_GAIN) ; // MartinR : hinzugefügt |
MesswertRoll = (long) ((long)MesswertRoll * GyroFaktor) / (256L / STICK_GAIN) ; // MartinR : hinzugefügt |
} |
else // MartinR so war es |
{ |
MesswertNick = IntegralNickMalFaktor + (long)((long)MesswertNick * GyroFaktor + (long)TrimNick * 128L) / (256L / STICK_GAIN); |
MesswertRoll = IntegralRollMalFaktor + (long)((long)MesswertRoll * GyroFaktor + (long)TrimRoll * 128L) / (256L / STICK_GAIN); |
} |
MesswertGier = (long)(MesswertGier * 2 * (long)GyroFaktorGier) / (256L / STICK_GAIN) + (long)(Integral_Gier * IntegralFaktorGier) / (2 * (44000 / STICK_GAIN)); |
// Maximalwerte abfangen |
// MartinR : Prüfen ob Unterscheidung nach Platinenversion erforderlich? |
// #define MAX_SENSOR (4096*STICK_GAIN) |
#define MAX_SENSOR (4096*4) |
if(MesswertNick > MAX_SENSOR) MesswertNick = MAX_SENSOR; |
if(MesswertNick < -MAX_SENSOR) MesswertNick = -MAX_SENSOR; |
if(MesswertRoll > MAX_SENSOR) MesswertRoll = MAX_SENSOR; |
if(MesswertRoll < -MAX_SENSOR) MesswertRoll = -MAX_SENSOR; |
if(MesswertGier > MAX_SENSOR) MesswertGier = MAX_SENSOR; |
if(MesswertGier < -MAX_SENSOR) MesswertGier = -MAX_SENSOR; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// all BL-Ctrl connected? |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(MissingMotor) if(modell_fliegt > 1 && modell_fliegt < 50 && GasMischanteil > 0) |
{ |
modell_fliegt = 1; |
GasMischanteil = MIN_GAS; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Höhenregelung |
// Die Höhenregelung schwächt lediglich das Gas ab, erhöht es allerdings nicht |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
GasMischanteil *= STICK_GAIN; |
Mess_Integral_Hoch += AdWertAccHoch; // Integrieren // MartinR: zu Höhenregler in fc.c verschoben |
Mess_Integral_Hoch -= Mess_Integral_Hoch / 1024; // dämfen // MartinR: zu Höhenregler in fc.c verschoben |
// MartinR: Änderungen HoheD Anfang : |
HoehenWert = 255 * ExpandBaro + StartLuftdruck - Luftdruck; |
HoehenWertSumme += HoehenWert ; |
if (++ iHoehe >= 40) // MartinR: Wartezeit um auch kleine Änderungsgeschwindigkeiten erkennen zu können |
{ |
HoehenWertSumme = HoehenWertSumme / iHoehe ; // MartinR: Mittelwert während der Wartezeit |
HoeheD = (int) Parameter_Luftdruck_D * (HoehenWert - HoehenWertalt) ; |
if (HoeheD < 0) HoeheD += Parameter_Luftdruck_D ; // MartinR: Digitalisierungsrauschen abmindern |
if (HoeheD > 0) HoeheD -= Parameter_Luftdruck_D ; // MartinR: entspricht - 1 Bit vom Höhenwert |
iHoehe = 0 ; |
HoehenWertalt = HoehenWertSumme ; |
HoehenWertSumme = 0 ; |
} |
// MartinR: Änderungen HoheD Ende |
// MartinR: bisheriger Höhenregler |
/* |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung |
{ |
int tmp_int; |
static char delay = 100; |
if(EE_Parameter.GlobalConfig & CFG_HOEHEN_SCHALTER) // Regler wird über Schalter gesteuert |
{ |
if(Parameter_MaxHoehe < 50) |
{ |
if(!delay--) |
{ |
if((MessLuftdruck > 1000) && OCR0A < 254) |
{ |
if(OCR0A < 244) |
{ |
ExpandBaro -= 10; |
OCR0A = DruckOffsetSetting - ExpandBaro; |
} |
else OCR0A = 254; |
beeptime = 300; |
delay = 250; |
} |
else |
if((MessLuftdruck < 100) && OCR0A > 1) |
{ |
if(OCR0A > 10) |
{ |
ExpandBaro += 10; |
OCR0A = DruckOffsetSetting - ExpandBaro; |
} |
else OCR0A = 1; |
beeptime = 300; |
delay = 250; |
} |
else |
{ |
SollHoehe = HoehenWert - 20; // Parameter_MaxHoehe ist der PPM-Wert des Schalters |
HoehenReglerAktiv = 0; |
delay = 1; |
} |
} |
} |
else |
{ |
HoehenReglerAktiv = 1; |
delay = 200; |
} |
} |
else |
{ |
SollHoehe = ((int) ExternHoehenValue + (int) Parameter_MaxHoehe) * (int)EE_Parameter.Hoehe_Verstaerkung - 20; |
HoehenReglerAktiv = 1; |
} |
if(Notlandung) SollHoehe = 0; |
h = HoehenWert; |
if((h > SollHoehe) && HoehenReglerAktiv) // zu hoch --> drosseln |
{ |
h = ((h - SollHoehe) * (int) Parameter_Hoehe_P) / (16 / STICK_GAIN); // Differenz bestimmen --> P-Anteil |
h = GasMischanteil - h; // vom Gas abziehen |
h -= (HoeheD)/(8/STICK_GAIN); // D-Anteil |
tmp_int = ((Mess_Integral_Hoch / 128) * (signed long) Parameter_Hoehe_ACC_Wirkung) / (128 / STICK_GAIN); |
if(tmp_int > 70*STICK_GAIN) tmp_int = 70*STICK_GAIN; |
else if(tmp_int < -(70*STICK_GAIN)) tmp_int = -(70*STICK_GAIN); |
h -= tmp_int; |
hoehenregler = (hoehenregler*15 + h) / 16; |
if(hoehenregler < EE_Parameter.Hoehe_MinGas * STICK_GAIN) // nicht unter MIN |
{ |
if(GasMischanteil >= EE_Parameter.Hoehe_MinGas * STICK_GAIN) hoehenregler = EE_Parameter.Hoehe_MinGas * STICK_GAIN; |
if(GasMischanteil < EE_Parameter.Hoehe_MinGas * STICK_GAIN) hoehenregler = GasMischanteil; |
} |
if(hoehenregler > GasMischanteil) hoehenregler = GasMischanteil; // nicht mehr als Gas |
GasMischanteil = hoehenregler; |
} |
} |
if(GasMischanteil > (MAX_GAS - 20) * STICK_GAIN) GasMischanteil = (MAX_GAS - 20) * STICK_GAIN; |
*/ |
// MartinR: Ende bisheriger Höhenregler |
// MartinR: Neuer Höhenregler von MartinR: Anfang |
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) // MartinR :so war es |
if(Parameter_MaxHoehe < 50 || (Parameter_UserParam1 > 140) ) // MartinR: Schalter aus oder HH über UsererParam1 an |
{ |
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 // MartinR : so war es |
SollHoehe = HoehenWert; // MartinR : geändert |
HoehenReglerAktiv = 0; |
delay = 1; |
} |
} |
SollHoehe = HoehenWert; // MartinR: SollHoehe wird nachgeführt bis HoehenreglerAktiv = 1 |
SchwebeGas = GasMischanteil; // MartinR: SchwebeGas wird nachgeführt bis HoehenreglerAktiv = 1 |
HoehenReglerAktiv = 0; // MartinR: zur Sicherheit |
} |
else // Schalter an und kein HH über Schalter |
{ |
HoehenReglerAktiv = 1; |
// Schwebegas ist der letzte GasMischanteil vor dem Aktivieren der Höhenregelung |
delay = 200; |
} |
} |
else // Sollhöhe über Poti |
{ |
//SollHoehe = ((int) ExternHoehenValue + (int) Parameter_MaxHoehe) * (int)EE_Parameter.Hoehe_Verstaerkung - 20; // MartinR : so war es |
//HoehenReglerAktiv = 1; // MartinR : so war es |
if(Parameter_UserParam1 > 140) // HH über Schalter: Höhenregler abgeschaltet, Nachführen von Parametern |
{ |
SollHoehe = HoehenWert; // SollHoehe wird nachgeführt bis HoehenreglerAktiv = 1 |
HoehenReglerAktiv = 0; |
} |
else // Höhenregler mit Sollhöhe über Poti aktiv |
{ |
SchwebeGas = GasMischanteil; // SchwebeGas zunächst = Gasmischanteil bis bessere Lösung |
HoehenReglerAktiv = 1; |
// MartinR: Versuch Höhenregler zu verlangsamen. Steig- / Sinkrate im MK-Tool über UserParam4 einstellbar |
if (((int) ExternHoehenValue + (int) Parameter_MaxHoehe) * (int)EE_Parameter.Hoehe_Verstaerkung - 20 > SollHoehe) |
{ |
if(++delay_Hoehenregler > (Parameter_UserParam4 / 4)) |
{ |
delay_Hoehenregler = 0; |
SollHoehe ++ ; //MartinR: Höhenänderung begrenzen. |
} |
} |
else |
{ |
if (((int) ExternHoehenValue + (int) Parameter_MaxHoehe) * (int)EE_Parameter.Hoehe_Verstaerkung - 20 < SollHoehe) |
{ |
if(++delay_Hoehenregler > (Parameter_UserParam4 / 4)) |
{ |
delay_Hoehenregler = 0; |
SollHoehe -- ; //MartinR: Höhenänderung begrenzen. |
} |
} |
} |
} |
} |
if(Notlandung) SollHoehe = 0; |
// MartinR: so war es Anfang |
/* |
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; |
} |
} |
*/ // MartinR: so war es Ende |
// MartinR: neuer Höhenregler Anfang |
if(HoehenReglerAktiv && !(Parameter_UserParam1 > 140)) // kein HH |
{ |
h_delta = (int) SollHoehe - (int) HoehenWert; // positiver Wert: MK ist unterhalb der Sollhöhe |
h_p = (h_delta * (int) Parameter_Hoehe_P) / (16 / STICK_GAIN); // Differenz bestimmen --> P-Anteil |
h_d = (int) (HoeheD)/(64/STICK_GAIN); // D-Anteil (8*8=64) |
// ACC-D-Anteil |
tmp_int = ((Mess_Integral_Hoch / 128) * (signed long) Parameter_Hoehe_ACC_Wirkung) / (128 / STICK_GAIN); |
if(tmp_int > 50*STICK_GAIN) tmp_int = 50*STICK_GAIN; |
else if(tmp_int < -(50*STICK_GAIN)) tmp_int = -(50*STICK_GAIN); |
h_d += tmp_int; // positiver D-Anteil bedeutet Steigen |
h = SchwebeGas + h_p - h_d ; |
hoehenregler = (hoehenregler*7 + h) / 8; |
if(hoehenregler < EE_Parameter.Hoehe_MinGas * STICK_GAIN) // nicht unter MIN |
{ |
if(GasMischanteil >= EE_Parameter.Hoehe_MinGas * STICK_GAIN) hoehenregler = EE_Parameter.Hoehe_MinGas * STICK_GAIN; |
if(GasMischanteil < EE_Parameter.Hoehe_MinGas * STICK_GAIN) hoehenregler = GasMischanteil; |
} |
if(hoehenregler > GasMischanteil) hoehenregler = GasMischanteil; // nicht mehr als Gas |
//else hoehenregler += (GasMischanteil-hoehenregler)/16 ; // um die Höhe noch leicht mit Gas korrigieren zu können |
//if(SchwebeGas < 20) SchwebeGas = 20; // nicht unter 20 |
GasMischanteil = hoehenregler; |
} |
else // Integratoren auf Null halten |
{ |
Mess_Integral_Hoch = 0; |
hoehenregler = GasMischanteil; |
h_p = 0 ; |
h_d = 0 ; |
} |
} |
// MartinR: neuer Höhenregler Ende |
if(GasMischanteil > (MAX_GAS - 20) * STICK_GAIN) GasMischanteil = (MAX_GAS - 20) * STICK_GAIN; |
// MartinR: Ende neuer Höhenregler |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Mischer und PI-Regler |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DebugOut.Analog[7] = GasMischanteil; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gier-Anteil |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define MUL_G 1.0 |
GierMischanteil = MesswertGier - sollGier * STICK_GAIN; // Regler für Gier |
// GierMischanteil = 0; |
#define MIN_GIERGAS (40*STICK_GAIN) // unter diesem Gaswert trotzdem Gieren |
if(GasMischanteil > MIN_GIERGAS) |
{ |
if(GierMischanteil > (GasMischanteil / 2)) GierMischanteil = GasMischanteil / 2; |
if(GierMischanteil < -(GasMischanteil / 2)) GierMischanteil = -(GasMischanteil / 2); |
} |
else |
{ |
if(GierMischanteil > (MIN_GIERGAS / 2)) GierMischanteil = MIN_GIERGAS / 2; |
if(GierMischanteil < -(MIN_GIERGAS / 2)) GierMischanteil = -(MIN_GIERGAS / 2); |
} |
tmp_int = MAX_GAS*STICK_GAIN; |
if(GierMischanteil > ((tmp_int - GasMischanteil))) GierMischanteil = ((tmp_int - GasMischanteil)); |
if(GierMischanteil < -((tmp_int - GasMischanteil))) GierMischanteil = -((tmp_int - GasMischanteil)); |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Nick-Achse |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DiffNick = MesswertNick - StickNick; // Differenz bestimmen |
// MartinR : so war es Anfang |
/* |
if(IntegralFaktor) SummeNick += IntegralNickMalFaktor - StickNick; // I-Anteil bei Winkelregelung |
else SummeNick += DiffNick; // I-Anteil bei HH |
if(SummeNick > (STICK_GAIN * 16000L)) SummeNick = (STICK_GAIN * 16000L); |
if(SummeNick < -(16000L * STICK_GAIN)) SummeNick = -(16000L * STICK_GAIN); |
pd_ergebnis_nick = DiffNick + SummeNick / Ki; // PI-Regler für Nick |
// Motor Vorn |
*/ |
// MartinR : so war es Ende |
// MartinR : geändert Anfang |
if(IntegralFaktor) // MartinR : ACC-Mode |
{ |
SummeNick += IntegralNickMalFaktor - StickNick; // I-Anteil bei Winkelregelung |
if(SummeNick > (STICK_GAIN * 8000L)) SummeNick = (STICK_GAIN * 8000L); // MartinR : von 16000 auf 8000, da überlauf |
if(SummeNick < -(8000L * STICK_GAIN)) SummeNick = -(8000L * STICK_GAIN); // MartinR : von 16000 auf 8000, da überlauf |
pd_ergebnis_nick = DiffNick + (SummeNick / Ki); |
SummeNickHH = 0 ; |
} |
else // MartinR : HH-Mode |
{ |
SummeNickHH += DiffNick; // I-Anteil bei HH |
if(SummeNickHH > (STICK_GAIN * 8000L)) SummeNickHH = (STICK_GAIN * 8000L); // MartinR : von 16000 auf 8000, da überlauf |
if(SummeNickHH < -(8000L * STICK_GAIN)) SummeNickHH = -(8000L * STICK_GAIN); // MartinR : von 16000 auf 8000, da überlauf |
pd_ergebnis_nick = DiffNick + SummeNickHH / KiHH; // MartinR: PI-Regler für Nick bei HH |
SummeNick = 0; |
} |
// MartinR : geändert Ende |
tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
if(pd_ergebnis_nick > tmp_int) pd_ergebnis_nick = tmp_int; |
if(pd_ergebnis_nick < -tmp_int) pd_ergebnis_nick = -tmp_int; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Roll-Achse |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DiffRoll = MesswertRoll - StickRoll; // Differenz bestimmen |
// MartinR : so war es Anfang |
/* |
if(IntegralFaktor) SummeRoll += IntegralRollMalFaktor - StickRoll;// I-Anteil bei Winkelregelung |
else SummeRoll += DiffRoll; // I-Anteil bei HH |
if(SummeRoll > (STICK_GAIN * 16000L)) SummeRoll = (STICK_GAIN * 16000L); |
if(SummeRoll < -(16000L * STICK_GAIN)) SummeRoll = -(16000L * STICK_GAIN); |
pd_ergebnis_roll = DiffRoll + SummeRoll / Ki; // PI-Regler für Roll |
*/ |
// MartinR : so war es Ende |
// MartinR : geändert Anfang |
if(IntegralFaktor) // MartinR : ACC-Mode |
{ |
SummeRoll += IntegralRollMalFaktor - StickRoll; |
if(SummeRoll > (STICK_GAIN * 8000L)) SummeRoll = (STICK_GAIN * 8000L);// MartinR : von 16000 auf 8000, da überlauf |
if(SummeRoll < -(8000L * STICK_GAIN)) SummeRoll = -(8000L * STICK_GAIN);// MartinR : von 16000 auf 8000, da überlauf |
tmp_int = SummeRoll / Ki; |
pd_ergebnis_roll = DiffRoll + tmp_int; // MartinR: PI-Regler im ACC-Mode |
//SummeRollHH = (IntegralRollMalFaktor + tmp_int - stick_roll_neutral + (TrimRoll * STICK_GAIN / 2)) * KiHH;// MartinR: Startwert von SummeRollHH bei Umschaltung auf HH |
// MartinR: Hintergrund: pd_ergebnis_xx soll sich beim Umschalten nicht ändern! |
SummeRollHH = 0; |
} |
else // MartinR : HH-Mode |
{ |
SummeRollHH += DiffRoll; // I-Anteil bei HH |
if(SummeRollHH > (STICK_GAIN * 8000L)) SummeRollHH = (STICK_GAIN * 8000L);// MartinR : von 16000 auf 8000, da überlauf |
if(SummeRollHH < -(8000L * STICK_GAIN)) SummeRollHH = -(8000L * STICK_GAIN);// MartinR : von 16000 auf 8000, da überlauf |
pd_ergebnis_roll = DiffRoll + SummeRollHH / KiHH; // MartinR: PI-Regler für Roll bei HH |
SummeRoll = 0; |
} |
// MartinR : geändert Ende |
tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
if(pd_ergebnis_roll > tmp_int) pd_ergebnis_roll = tmp_int; |
if(pd_ergebnis_roll < -tmp_int) pd_ergebnis_roll = -tmp_int; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Universal Mixer |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
for(i=0; i<MAX_MOTORS; i++) |
{ |
signed int tmp_int; |
if(Mixer.Motor[i][0] > 0) |
{ |
tmp_int = ((long)GasMischanteil * Mixer.Motor[i][0]) / 64L; |
tmp_int += ((long)pd_ergebnis_nick * Mixer.Motor[i][1]) / 64L; |
tmp_int += ((long)pd_ergebnis_roll * Mixer.Motor[i][2]) / 64L; |
tmp_int += ((long)GierMischanteil * Mixer.Motor[i][3]) / 64L; |
tmp_motorwert[i] = MotorSmoothing(tmp_int,tmp_motorwert[i]); // Filter |
tmp_int = tmp_motorwert[i] / STICK_GAIN; |
CHECK_MIN_MAX(tmp_int,MIN_GAS,MAX_GAS); |
Motor[i] = tmp_int; |
} |
else Motor[i] = 0; |
} |
/* |
if(Poti1 > 20) Motor1 = 0; |
if(Poti1 > 90) Motor6 = 0; |
if(Poti1 > 140) Motor2 = 0; |
//if(Poti1 > 200) Motor7 = 0; |
*/ |
} |
/branches/FC_075b_ACC-HH_MartinR/fc.h |
---|
0,0 → 1,194 |
/*####################################################################################### |
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; // MartinR : so war es |
extern volatile int NeutralAccZ; // MartinR : geändert |
extern long Umschlag180Nick, Umschlag180Roll; |
extern signed int ExternStickNick,ExternStickRoll,ExternStickGier; |
extern unsigned char Parameter_UserParam1,Parameter_UserParam2,Parameter_UserParam3,Parameter_UserParam4,Parameter_UserParam5,Parameter_UserParam6,Parameter_UserParam7,Parameter_UserParam8; |
extern int NaviAccNick,NaviAccRoll,NaviCntAcc; |
extern unsigned int modell_fliegt; |
void MotorRegler(void); |
void SendMotorData(void); |
void CalibrierMittelwert(void); |
void Mittelwert(void); |
void SetNeutral(void); |
void Piep(unsigned char Anzahl, unsigned int dauer); |
extern unsigned char h,m,s; |
extern volatile unsigned char Timeout ; |
extern unsigned char CosinusNickWinkel, CosinusRollWinkel; |
extern int DiffNick,DiffRoll; |
extern int Poti1, Poti2, Poti3, Poti4; |
extern volatile unsigned char SenderOkay; |
extern 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 |
//--- Seit V0.75 |
unsigned char ServoRollControl; // Wert : 0-250 // Stellung des Servos |
unsigned char ServoRollComp; // Wert : 0-250 |
unsigned char ServoRollMin; // Wert : 0-250 |
unsigned char ServoRollMax; // Wert : 0-250 |
//--- |
unsigned char ServoNickRefresh; // |
unsigned char LoopGasLimit; // Wert: 0-250 max. Gas während Looping |
unsigned char LoopThreshold; // Wert: 0-250 Schwelle für Stickausschlag |
unsigned char LoopHysterese; // Wert: 0-250 Hysterese für Stickausschlag |
unsigned char AchsKopplung1; // Wert: 0-250 Faktor, mit dem Gier die Achsen Roll und Nick koppelt (NickRollMitkopplung) |
unsigned char AchsKopplung2; // Wert: 0-250 Faktor, mit dem Nick und Roll verkoppelt werden |
unsigned char CouplingYawCorrection; // Wert: 0-250 Faktor, mit dem Nick und Roll verkoppelt werden |
unsigned char WinkelUmschlagNick; // Wert: 0-250 180°-Punkt |
unsigned char WinkelUmschlagRoll; // Wert: 0-250 180°-Punkt |
unsigned char GyroAccAbgleich; // 1/k (Koppel_ACC_Wirkung) |
unsigned char Driftkomp; |
unsigned char DynamicStability; |
unsigned char UserParam5; // Wert : 0-250 |
unsigned char UserParam6; // Wert : 0-250 |
unsigned char UserParam7; // Wert : 0-250 |
unsigned char UserParam8; // Wert : 0-250 |
//---Output --------------------------------------------- |
unsigned char J16Bitmask; // for the J16 Output |
unsigned char J16Timing; // for the J16 Output |
unsigned char J17Bitmask; // for the J17 Output |
unsigned char J17Timing; // for the J17 Output |
//---NaviCtrl--------------------------------------------- |
unsigned char NaviGpsModeControl; // Parameters for the Naviboard |
unsigned char NaviGpsGain; |
unsigned char NaviGpsP; |
unsigned char NaviGpsI; |
unsigned char NaviGpsD; |
unsigned char NaviGpsPLimit; |
unsigned char NaviGpsILimit; |
unsigned char NaviGpsDLimit; |
unsigned char NaviGpsACC; |
unsigned char NaviGpsMinSat; |
unsigned char NaviStickThreshold; |
unsigned char NaviWindCorrection; |
unsigned char NaviSpeedCompensation; |
unsigned char NaviOperatingRadius; |
unsigned char NaviAngleLimitation; |
unsigned char NaviPH_LoginTime; |
//---Ext.Ctrl--------------------------------------------- |
unsigned char ExternalControl; // for serial Control |
//------------------------------------------------ |
unsigned char BitConfig; // (war Loop-Cfg) Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
unsigned char ServoCompInvert; // // 0x01 = Nick, 0x02 = Roll 0 oder 1 // WICHTIG!!! am Ende lassen |
unsigned char 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_ServoRollControl; |
extern unsigned char Parameter_AchsKopplung1; |
extern unsigned char Parameter_AchsKopplung2; |
//extern unsigned char Parameter_AchsGegenKopplung1; |
extern unsigned char Parameter_J16Bitmask; // for the J16 Output |
extern unsigned char Parameter_J16Timing; // for the J16 Output |
extern unsigned char Parameter_J17Bitmask; // for the J17 Output |
extern unsigned char Parameter_J17Timing; // for the J17 Output |
extern unsigned char Parameter_NaviGpsModeControl; // MartinR: wird wiederverwendet für GPS free bei HH |
extern signed char MixerTable[MAX_MOTORS][4]; |
extern unsigned char Motor[MAX_MOTORS]; |
#endif //_FC_H |
/branches/FC_075b_ACC-HH_MartinR/flight.pnproj |
---|
0,0 → 1,0 |
<Project name="Flight-Ctrl"><File path="uart.h"></File><File path="main.c"></File><File path="main.h"></File><File path="makefile"></File><File path="uart.c"></File><File path="printf_P.h"></File><File path="printf_P.c"></File><File path="timer0.c"></File><File path="timer0.h"></File><File path="old_macros.h"></File><File path="twimaster.c"></File><File path="version.txt"></File><File path="twimaster.h"></File><File path="rc.c"></File><File path="rc.h"></File><File path="fc.h"></File><File path="menu.h"></File><File path="menu.c"></File><File path="_Settings.h"></File><File path="analog.c"></File><File path="analog.h"></File><File path="GPS.c"></File><File path="gps.h"></File><File path="License.txt"></File><File path="eeprom.c"></File><File path="spi.h"></File><File path="spi.c"></File><File path="led.h"></File><File path="led.c"></File><File path="fc.c"></File><File path="Spectrum.c"></File><File path="Spectrum.h"></File></Project> |
/branches/FC_075b_ACC-HH_MartinR/flight.pnps |
---|
0,0 → 1,0 |
<pd><ViewState><e p="Flight-Ctrl" x="true"></e></ViewState></pd> |
/branches/FC_075b_ACC-HH_MartinR/gps.h |
---|
0,0 → 1,7 |
extern signed int GPS_Nick; |
extern signed int GPS_Roll; |
extern signed int GPS_Nick2; |
extern signed int GPS_Roll2; |
void GPS_Neutral(void); |
void GPS_BerechneZielrichtung(void); |
/branches/FC_075b_ACC-HH_MartinR/led.c |
---|
0,0 → 1,49 |
#include <inttypes.h> |
#include "main.h" |
uint16_t LED1_Timing = 0; |
uint16_t LED2_Timing = 0; |
unsigned char J16Blinkcount = 0, J16Mask = 1; |
unsigned char J17Blinkcount = 0, J17Mask = 1; |
// initializes the LED control outputs J16, J17 |
void LED_Init(void) |
{ |
// set PC2 & PC3 as output (control of J16 & J17) |
DDRC |= (1<<DDC2)|(1<<DDC3); |
J16_OFF; |
J17_OFF; |
J16Blinkcount = 0; J16Mask = 128; |
J17Blinkcount = 0; J17Mask = 128; |
} |
// called in UpdateMotors() every 2ms |
void LED_Update(void) |
{ |
static char delay = 0; |
if(!delay--) // 10ms Intervall |
{ |
delay = 4; |
if((EE_Parameter.J16Timing > 250) && (Parameter_J16Timing > 230)) {if(EE_Parameter.J16Bitmask & 128) J16_ON; else J16_OFF;} |
else |
if((EE_Parameter.J16Timing > 250) && (Parameter_J16Timing < 10)) {if(EE_Parameter.J16Bitmask & 128) J16_OFF; else J16_ON;} |
else |
if(!J16Blinkcount--) |
{ |
J16Blinkcount = Parameter_J16Timing-1; |
if(J16Mask == 1) J16Mask = 128; else J16Mask /= 2; |
if(J16Mask & EE_Parameter.J16Bitmask) J16_ON; else J16_OFF; |
} |
if((EE_Parameter.J17Timing > 250) && (Parameter_J17Timing > 230)) {if(EE_Parameter.J17Bitmask & 128) J17_ON; else J17_OFF;} |
else |
if((EE_Parameter.J17Timing > 250) && (Parameter_J17Timing < 10)) {if(EE_Parameter.J17Bitmask & 128) J17_OFF; else J17_ON;} |
else |
if(!J17Blinkcount--) |
{ |
J17Blinkcount = Parameter_J17Timing-1; |
if(J17Mask == 1) J17Mask = 128; else J17Mask /= 2; |
if(J17Mask & EE_Parameter.J17Bitmask) J17_ON; else J17_OFF; |
} |
} |
} |
/branches/FC_075b_ACC-HH_MartinR/led.h |
---|
0,0 → 1,11 |
#include <avr/io.h> |
#define J16_ON PORTC |= (1<<PORTC2) |
#define J16_OFF PORTC &= ~(1<<PORTC2) |
#define J16_TOGGLE PORTC ^= (1<<PORTC2) |
#define J17_ON PORTC |= (1<<PORTC3) |
#define J17_OFF PORTC &= ~(1<<PORTC3) |
#define J17_TOGGLE PORTC ^= (1<<PORTC3) |
extern void LED_Init(void); |
extern void LED_Update(void); |
/branches/FC_075b_ACC-HH_MartinR/main.c |
---|
0,0 → 1,393 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + Nur für den privaten Gebrauch |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten und nicht-kommerziellen Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt und genannt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-commercial use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be |
// + clearly linked as origin |
// + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
unsigned char EEPromArray[E2END+1] EEMEM; |
unsigned char PlatinenVersion = 10; |
unsigned char SendVersionToNavi = 1; |
unsigned char BattLowVoltageWarning = 94; |
// -- Parametersatz aus EEPROM lesen --- |
// number [1..5] |
void ReadParameterSet(unsigned char number, unsigned char *buffer, unsigned char length) |
{ |
if((number > 5)||(number < 1)) number = 3; |
eeprom_read_block(buffer, &EEPromArray[EEPROM_ADR_PARAM_BEGIN + length * (number - 1)], length); |
LED_Init(); |
} |
// -- Parametersatz ins EEPROM schreiben --- |
// number [1..5] |
void WriteParameterSet(unsigned char number, unsigned char *buffer, unsigned char length) |
{ |
if(number > 5) number = 5; |
if(number < 1) return; |
eeprom_write_block(buffer, &EEPromArray[EEPROM_ADR_PARAM_BEGIN + length * (number - 1)], length); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_PARAM_LENGTH], length); // Länge der Datensätze merken |
eeprom_write_block(buffer, &EEPromArray[EEPROM_ADR_CHANNELS], 8); // 8 Kanäle merken |
SetActiveParamSetNumber(number); |
LED_Init(); |
} |
unsigned char GetActiveParamSetNumber(void) |
{ |
unsigned char set; |
set = eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET]); |
if((set > 5) || (set < 1)) |
{ |
set = 3; |
SetActiveParamSetNumber(set); // diesen Parametersatz als aktuell merken |
} |
return(set); |
} |
void SetActiveParamSetNumber(unsigned char number) |
{ |
if(number > 5) number = 5; |
if(number < 1) return; |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], number); // diesen Parametersatz als aktuell merken |
} |
void CalMk3Mag(void) |
{ |
static unsigned char stick = 1; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > -20) stick = 0; |
if((PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < -70) && !stick) |
{ |
stick = 1; |
WinkelOut.CalcState++; |
if(WinkelOut.CalcState > 4) |
{ |
// WinkelOut.CalcState = 0; // in Uart.c |
beeptime = 1000; |
} |
else Piep(WinkelOut.CalcState,150); |
} |
DebugOut.Analog[19] = WinkelOut.CalcState; |
} |
//############################################################################ |
//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 |
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 |
timer = SetDelay(2000); |
for(i=0; i < MAX_MOTORS; i++) |
{ |
UpdateMotor = 0; |
SendMotorData(); |
while(!UpdateMotor); |
if(Mixer.Motor[i][0] > 0) // wait max 2 sec for the BL-Ctrls to wake up |
{ |
while(!CheckDelay(timer) && !MotorPresent[i]) {UpdateMotor = 0; SendMotorData(); while(!UpdateMotor);}; |
} |
if(MotorPresent[i]) printf("%d ",i+1); |
} |
for(i=0; i < MAX_MOTORS; i++) |
{ |
if(!MotorPresent[i] && Mixer.Motor[i][0] > 0) printf("\n\r\n\r!! MISSING BL-CTRL: %d !!",i+1); |
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)"); |
LcdClear(); |
I2CTimeout = 5000; |
WinkelOut.Orientation = 1; |
printf("\n\rBatt:"); |
if(EE_Parameter.UnterspannungsWarnung < 50) // automatische Zellenerkennung |
{ |
timer = SetDelay(500); |
while (!CheckDelay(timer)); |
if(UBat < 130) |
{ |
BattLowVoltageWarning = 3 * EE_Parameter.UnterspannungsWarnung; |
Piep(3,200); |
printf(" 3 Cells "); |
} |
else |
{ |
BattLowVoltageWarning = 4 * EE_Parameter.UnterspannungsWarnung; |
Piep(4,200); |
printf(" 4 Cells "); |
} |
} |
else BattLowVoltageWarning = EE_Parameter.UnterspannungsWarnung; |
printf(" Low warning level: %d.%d",BattLowVoltageWarning/10,BattLowVoltageWarning%10); |
printf("\n\r===================================\n\r"); |
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--; |
else |
{ |
TIMSK1 |= _BV(ICIE1); // enable PPM-Input |
} |
//if(HoehenReglerAktiv && NaviDataOkay && SenderOkay < 160 && SenderOkay > 10 && FromNaviCtrl_Value.SerialDataOkay > 220) SenderOkay = 160; |
//if(HoehenReglerAktiv && NaviDataOkay && SenderOkay < 101 && SenderOkay > 10 && FromNaviCtrl_Value.SerialDataOkay > 1) SenderOkay = 101; |
if(NaviDataOkay) |
{ |
if(--NaviDataOkay == 0) |
{ |
GPS_Nick = 0; |
GPS_Roll = 0; |
} |
} |
if(!--I2CTimeout || MissingMotor) |
{ |
if(!I2CTimeout) |
{ |
i2c_reset(); |
I2CTimeout = 5; |
} |
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 < BattLowVoltageWarning) |
{ |
if(BeepMuster == 0xffff) |
{ |
beeptime = 6000; |
BeepMuster = 0x0300; |
} |
} |
SPI_StartTransmitPacket(); |
SendSPI = 4; |
timer = SetDelay(20); |
} |
LED_Update(); |
} |
if(!SendSPI) { SPI_TransmitByte(); } |
} |
return (1); |
} |
/branches/FC_075b_ACC-HH_MartinR/main.h |
---|
0,0 → 1,127 |
#ifndef _MAIN_H |
#define _MAIN_H |
#define QUADRO |
//Hier die Quarz Frequenz einstellen |
#if defined (__AVR_ATmega32__) |
#define SYSCLK 20000000L //Quarz Frequenz in Hz |
#endif |
#if defined (__AVR_ATmega644__) |
#define SYSCLK 20000000L //Quarz Frequenz in Hz |
#endif |
#if defined (__AVR_ATmega644P__) |
#define SYSCLK 20000000L //Quarz Frequenz in Hz |
#endif |
// neue Hardware |
#define ROT_OFF {if((PlatinenVersion == 10)||(PlatinenVersion == 20)) PORTB &=~0x01; else PORTB |= 0x01;} |
#define ROT_ON {if((PlatinenVersion == 10)||(PlatinenVersion == 20)) PORTB |= 0x01; else PORTB &=~0x01;} |
#define ROT_FLASH PORTB ^= 0x01 |
#define GRN_OFF {if((PlatinenVersion < 12)) PORTB &=~0x02; else PORTB |= 0x02;} |
#define GRN_ON {if((PlatinenVersion < 12)) PORTB |= 0x02; else PORTB &=~0x02;} |
#define GRN_FLASH PORTB ^= 0x02 |
#define F_CPU SYSCLK |
//#ifndef F_CPU |
//#error ################## F_CPU nicht definiert oder ungültig ############# |
//#endif |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define EE_DATENREVISION 76 // wird angepasst, wenn sich die EEPROM-Daten geändert haben |
#define MIXER_REVISION 1 // wird angepasst, wenn sich die Mixer-Daten geändert haben |
#define EEPROM_ADR_VALID 1 |
#define EEPROM_ADR_ACTIVE_SET 2 |
#define EEPROM_ADR_LAST_OFFSET 3 |
#define EEPROM_ADR_ACC_NICK 4 |
#define EEPROM_ADR_ACC_ROLL 6 |
#define EEPROM_ADR_ACC_Z 8 |
#define EEPROM_ADR_CHANNELS 80 |
#define EEPROM_ADR_PARAM_LENGTH 98 |
#define EEPROM_ADR_PARAM_BEGIN 100 |
#define EEPROM_ADR_MIXER_TABLE 1000 // 1001 - 1100 |
#define CFG_HOEHENREGELUNG 0x01 |
#define CFG_HOEHEN_SCHALTER 0x02 |
#define CFG_HEADING_HOLD 0x04 |
#define CFG_KOMPASS_AKTIV 0x08 |
#define CFG_KOMPASS_FIX 0x10 |
#define CFG_GPS_AKTIV 0x20 |
#define CFG_ACHSENKOPPLUNG_AKTIV 0x40 |
#define CFG_DREHRATEN_BEGRENZER 0x80 |
#define CFG_LOOP_OBEN 0x01 |
#define CFG_LOOP_UNTEN 0x02 |
#define CFG_LOOP_LINKS 0x04 |
#define CFG_LOOP_RECHTS 0x08 |
#define CFG_RES1 0x10 |
#define CFG_RES2 0x20 |
#define CFG_RES3 0x40 |
#define CFG_RES4 0x80 |
#define J3High PORTD |= 0x20 |
#define J3Low PORTD &= ~0x20 |
#define J4High PORTD |= 0x10 |
#define J4Low PORTD &= ~0x10 |
#define J5High PORTD |= 0x08 |
#define J5Low PORTD &= ~0x08 |
//#define SYSCLK |
//extern unsigned long SYSCLK; |
extern volatile unsigned char SenderOkay; |
extern unsigned char CosinusNickWinkel, CosinusRollWinkel; |
extern unsigned char PlatinenVersion; |
extern unsigned char SendVersionToNavi; |
void ReadParameterSet (unsigned char number, unsigned char *buffer, unsigned char length); |
void WriteParameterSet(unsigned char number, unsigned char *buffer, unsigned char length); |
extern unsigned char GetActiveParamSetNumber(void); |
void SetActiveParamSetNumber(unsigned char number); |
extern unsigned char EEPromArray[]; |
#include <stdlib.h> |
#include <string.h> |
#include <avr/io.h> |
#include <avr/pgmspace.h> |
#include <avr/interrupt.h> |
#include <avr/eeprom.h> |
#include <avr/boot.h> |
#include <avr/wdt.h> |
#include "old_macros.h" |
#include "_Settings.h" |
#include "printf_P.h" |
#include "timer0.h" |
#include "uart.h" |
#include "analog.h" |
#include "twimaster.h" |
#include "menu.h" |
#include "rc.h" |
#include "fc.h" |
#include "gps.h" |
#include "spi.h" |
#include "led.h" |
#ifndef EEMEM |
#define EEMEM __attribute__ ((section (".eeprom"))) |
#endif |
#define DEBUG_DISPLAY_INTERVALL 123 // in ms |
#define DELAY_US(x) ((unsigned int)( (x) * 1e-6 * F_CPU )) |
#endif //_MAIN_H |
/branches/FC_075b_ACC-HH_MartinR/makefile |
---|
0,0 → 1,452 |
#-------------------------------------------------------------------- |
# MCU name |
MCU = atmega644p |
F_CPU = 20000000 |
#------------------------------------------------------------------- |
VERSION_MAJOR = 0 |
VERSION_MINOR = 75 |
VERSION_PATCH = 1 |
VERSION_SERIAL_MAJOR = 10 # Serial Protocol |
VERSION_SERIAL_MINOR = 1 # Serial Protocol |
NC_SPI_COMPATIBLE = 7 # 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_MartinR |
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 MartinR: so war es |
# MartinR: mit meinen Änderungen ist der Compiler mit OPT 2 nicht mehr durchgelaufen. Daher OPT = 1 |
OPT = 1 |
########################################################################################################## |
# List C source files here. (C dependencies are automatically generated.) |
SRC = main.c uart.c printf_P.c timer0.c analog.c menu.c |
SRC += twimaster.c rc.c fc.c GPS.c spi.c led.c Spectrum.c |
########################################################################################################## |
# List Assembler source files here. |
# Make them always end in a capital .S. Files ending in a lowercase .s |
# will not be considered source files but generated files (assembler |
# output from the compiler), and will be deleted upon "make clean"! |
# Even though the DOS/Win* filesystem matches both .s and .S the same, |
# it will preserve the spelling of the filenames, and gcc itself does |
# care about how the name is spelled on its command-line. |
ASRC = |
# List any extra directories to look for include files here. |
# Each directory must be seperated by a space. |
EXTRAINCDIRS = |
# Optional compiler flags. |
# -g: generate debugging information (for GDB, or for COFF conversion) |
# -O*: optimization level |
# -f...: tuning, see gcc manual and avr-libc documentation |
# -Wall...: warning level |
# -Wa,...: tell GCC to pass this to the assembler. |
# -ahlms: create assembler listing |
CFLAGS = -O$(OPT) \ |
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \ |
-Wall -Wstrict-prototypes \ |
-Wa,-adhlns=$(<:.c=.lst) \ |
$(patsubst %,-I%,$(EXTRAINCDIRS)) |
# Set a "language standard" compiler flag. |
# Unremark just one line below to set the language standard to use. |
# gnu99 = C99 + GNU extensions. See GCC manual for more information. |
#CFLAGS += -std=c89 |
#CFLAGS += -std=gnu89 |
#CFLAGS += -std=c99 |
CFLAGS += -std=gnu99 |
CFLAGS += -DVERSION_MAJOR=$(VERSION_MAJOR) -DVERSION_MINOR=$(VERSION_MINOR) -DVERSION_PATCH=$(VERSION_PATCH) -DVERSION_SERIAL_MAJOR=$(VERSION_SERIAL_MAJOR) -DVERSION_SERIAL_MINOR=$(VERSION_SERIAL_MINOR) -DNC_SPI_COMPATIBLE=$(NC_SPI_COMPATIBLE) |
# Optional assembler flags. |
# -Wa,...: tell GCC to pass this to the assembler. |
# -ahlms: create listing |
# -gstabs: have the assembler create line number information; note that |
# for use in COFF files, additional information about filenames |
# and function names needs to be present in the assembler source |
# files -- see avr-libc docs [FIXME: not yet described there] |
ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs |
# Optional linker flags. |
# -Wl,...: tell GCC to pass this to linker. |
# -Map: create map file |
# --cref: add cross reference to map file |
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref |
# Additional libraries |
# Minimalistic printf version |
#LDFLAGS += -Wl,-u,vfprintf -lprintf_min |
# Floating point printf version (requires -lm below) |
#LDFLAGS += -Wl,-u,vfprintf -lprintf_flt |
# -lm = math library |
LDFLAGS += -lm |
##LDFLAGS += -T./linkerfile/avr5.x |
# Programming support using avrdude. Settings and variables. |
# Programming hardware: alf avr910 avrisp bascom bsd |
# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500 |
# |
# Type: avrdude -c ? |
# to get a full listing. |
# |
#AVRDUDE_PROGRAMMER = dt006 |
#AVRDUDE_PROGRAMMER = stk200 |
#AVRDUDE_PROGRAMMER = ponyser |
AVRDUDE_PROGRAMMER = avrispv2 |
#falls Ponyser ausgewählt wird, muss sich unsere avrdude-Configdatei im Bin-Verzeichnis des Compilers befinden |
#AVRDUDE_PORT = com1 # programmer connected to serial device |
#AVRDUDE_PORT = lpt1 # programmer connected to parallel port |
AVRDUDE_PORT = usb # programmer connected to USB |
#AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex |
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex $(FUSE_SETTINGS) |
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep |
#avrdude -c avrispv2 -P usb -p m32 -U flash:w:blink.hex |
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) |
# Uncomment the following if you want avrdude's erase cycle counter. |
# Note that this counter needs to be initialized first using -Yn, |
# see avrdude manual. |
#AVRDUDE_ERASE += -y |
# Uncomment the following if you do /not/ wish a verification to be |
# performed after programming the device. |
AVRDUDE_FLAGS += -V |
# Increase verbosity level. Please use this when submitting bug |
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude> |
# to submit bug reports. |
#AVRDUDE_FLAGS += -v -v |
# --------------------------------------------------------------------------- |
# Define directories, if needed. |
DIRAVR = c:/winavr |
DIRAVRBIN = $(DIRAVR)/bin |
DIRAVRUTILS = $(DIRAVR)/utils/bin |
DIRINC = . |
DIRLIB = $(DIRAVR)/avr/lib |
# Define programs and commands. |
SHELL = sh |
CC = avr-gcc |
OBJCOPY = avr-objcopy |
OBJDUMP = avr-objdump |
SIZE = avr-size |
# Programming support using avrdude. |
AVRDUDE = avrdude |
REMOVE = rm -f |
COPY = cp |
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex |
ELFSIZE = $(SIZE) -A $(TARGET).elf |
# Define Messages |
# English |
MSG_ERRORS_NONE = Errors: none |
MSG_BEGIN = -------- begin -------- |
MSG_END = -------- end -------- |
MSG_SIZE_BEFORE = Size before: |
MSG_SIZE_AFTER = Size after: |
MSG_COFF = Converting to AVR COFF: |
MSG_EXTENDED_COFF = Converting to AVR Extended COFF: |
MSG_FLASH = Creating load file for Flash: |
MSG_EEPROM = Creating load file for EEPROM: |
MSG_EXTENDED_LISTING = Creating Extended Listing: |
MSG_SYMBOL_TABLE = Creating Symbol Table: |
MSG_LINKING = Linking: |
MSG_COMPILING = Compiling: |
MSG_ASSEMBLING = Assembling: |
MSG_CLEANING = Cleaning project: |
# Define all object files. |
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) |
# Define all listing files. |
LST = $(ASRC:.S=.lst) $(SRC:.c=.lst) |
# Combine all necessary flags and optional flags. |
# Add target processor to flags. |
#ALL_CFLAGS = -mmcu=$(MCU) -DF_CPU=$(F_CPU) -I. $(CFLAGS) |
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) |
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) |
# Default target. |
all: begin gccversion sizebefore $(TARGET).elf $(TARGET).hex $(TARGET).eep \ |
$(TARGET).lss $(TARGET).sym sizeafter finished end |
# Eye candy. |
# AVR Studio 3.x does not check make's exit code but relies on |
# the following magic strings to be generated by the compile job. |
begin: |
@echo |
@echo $(MSG_BEGIN) |
finished: |
@echo $(MSG_ERRORS_NONE) |
end: |
@echo $(MSG_END) |
@echo |
# Display size of file. |
# Display size of file. |
sizebefore: |
@if [ -f $(TARGET).elf ]; then echo Size before:; $(ELFSIZE); $(HEXSIZE); echo; fi |
sizeafter: |
@if [ -f $(TARGET).elf ]; then echo Size after:; $(ELFSIZE); $(HEXSIZE); echo; fi |
# Display compiler version information. |
gccversion : |
@$(CC) --version |
# Convert ELF to COFF for use in debugging / simulating in |
# AVR Studio or VMLAB. |
COFFCONVERT=$(OBJCOPY) --debugging \ |
--change-section-address .data-0x800000 \ |
--change-section-address .bss-0x800000 \ |
--change-section-address .noinit-0x800000 \ |
--change-section-address .eeprom-0x810000 |
coff: $(TARGET).elf |
@echo |
@echo $(MSG_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof |
extcoff: $(TARGET).elf |
@echo |
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof |
# Program the device. |
program: $(TARGET).hex $(TARGET).eep |
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) |
# Create final output files (.hex, .eep) from ELF output file. |
%.hex: %.elf |
@echo |
@echo $(MSG_FLASH) $@ |
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ |
%.eep: %.elf |
@echo |
@echo $(MSG_EEPROM) $@ |
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ |
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@ |
# Create extended listing file from ELF output file. |
%.lss: %.elf |
@echo |
@echo $(MSG_EXTENDED_LISTING) $@ |
$(OBJDUMP) -h -S $< > $@ |
# Create a symbol table from ELF output file. |
%.sym: %.elf |
@echo |
@echo $(MSG_SYMBOL_TABLE) $@ |
avr-nm -n $< > $@ |
# Link: create ELF output file from object files. |
.SECONDARY : $(TARGET).elf |
.PRECIOUS : $(OBJ) |
%.elf: $(OBJ) |
@echo |
@echo $(MSG_LINKING) $@ |
$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) |
# Compile: create object files from C source files. |
%.o : %.c |
@echo |
@echo $(MSG_COMPILING) $< |
$(CC) -c $(ALL_CFLAGS) $< -o $@ |
# Compile: create assembler files from C source files. |
%.s : %.c |
$(CC) -S $(ALL_CFLAGS) $< -o $@ |
# Assemble: create object files from assembler source files. |
%.o : %.S |
@echo |
@echo $(MSG_ASSEMBLING) $< |
$(CC) -c $(ALL_ASFLAGS) $< -o $@ |
# Target: clean project. |
clean: begin clean_list finished end |
clean_list : |
@echo |
@echo $(MSG_CLEANING) |
# $(REMOVE) $(TARGET).hex |
$(REMOVE) $(TARGET).eep |
$(REMOVE) $(TARGET).obj |
$(REMOVE) $(TARGET).cof |
$(REMOVE) $(TARGET).elf |
$(REMOVE) $(TARGET).map |
$(REMOVE) $(TARGET).obj |
$(REMOVE) $(TARGET).a90 |
$(REMOVE) $(TARGET).sym |
$(REMOVE) $(TARGET).lnk |
$(REMOVE) $(TARGET).lss |
$(REMOVE) $(OBJ) |
$(REMOVE) $(LST) |
$(REMOVE) $(SRC:.c=.s) |
$(REMOVE) $(SRC:.c=.d) |
# Automatically generate C source code dependencies. |
# (Code originally taken from the GNU make user manual and modified |
# (See README.txt Credits).) |
# |
# Note that this will work with sh (bash) and sed that is shipped with WinAVR |
# (see the SHELL variable defined above). |
# This may not work with other shells or other seds. |
# |
%.d: %.c |
set -e; $(CC) -MM $(ALL_CFLAGS) $< \ |
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > $@; \ |
[ -s $@ ] || rm -f $@ |
# Remove the '-' if you want to see the dependency files generated. |
-include $(SRC:.c=.d) |
# Listing of phony targets. |
.PHONY : all begin finish end sizebefore sizeafter gccversion coff extcoff \ |
clean clean_list program |
/branches/FC_075b_ACC-HH_MartinR/menu.c |
---|
0,0 → 1,168 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
unsigned int TestInt = 0; |
#define ARRAYGROESSE 10 |
unsigned char Array[ARRAYGROESSE] = {1,2,3,4,5,6,7,8,9,10}; |
char DisplayBuff[80] = "Hallo Welt"; |
unsigned char DispPtr = 0; |
unsigned char MaxMenue = 13; |
unsigned char MenuePunkt = 0; |
unsigned char RemoteKeys = 0; |
#define KEY1 0x01 |
#define KEY2 0x02 |
#define KEY3 0x04 |
#define KEY4 0x08 |
#define KEY5 0x10 |
void LcdClear(void) |
{ |
unsigned char i; |
for(i=0;i<80;i++) DisplayBuff[i] = ' '; |
} |
void Menu(void) |
{ |
if(MenuePunkt > MaxMenue) MenuePunkt = MaxMenue; |
if(RemoteKeys & KEY1) { if(MenuePunkt) MenuePunkt--; else MenuePunkt = MaxMenue;} |
if(RemoteKeys & KEY2) { if(MenuePunkt == MaxMenue) MenuePunkt = 0; else MenuePunkt++;} |
if((RemoteKeys & KEY1) && (RemoteKeys & KEY2)) MenuePunkt = 0; |
LcdClear(); |
if(MenuePunkt < 10) {LCD_printfxy(17,0,"[%i]",MenuePunkt);} |
else {LCD_printfxy(16,0,"[%i]",MenuePunkt);}; |
switch(MenuePunkt) |
{ |
case 0: |
LCD_printfxy(0,0,"+ MikroKopter +"); |
LCD_printfxy(0,1,"HW:V%d.%d SW:%d.%d%c",PlatinenVersion/10,PlatinenVersion%10, VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH +'a'); |
LCD_printfxy(0,2,"Setting:%d %s",GetActiveParamSetNumber(),Mixer.Name); |
if(I2CTimeout < 6) LCD_printfxy(0,3,"I2C ERROR!!!") |
else |
if(MissingMotor) LCD_printfxy(0,3,"Missing BL-Ctrl:%d!!",MissingMotor) |
else LCD_printfxy(0,3,"(c) Holger Buss"); |
// if(RemoteTasten & KEY3) TestInt--; |
// if(RemoteTasten & KEY4) TestInt++; |
break; |
case 1: |
if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
LCD_printfxy(0,0,"Hoehe: %5i",HoehenWert); |
LCD_printfxy(0,1,"SollHoehe: %5i",SollHoehe); |
LCD_printfxy(0,2,"Luftdruck: %5i",MessLuftdruck); |
LCD_printfxy(0,3,"Off : %5i",DruckOffsetSetting); |
} |
else |
{ |
LCD_printfxy(0,1,"Keine "); |
LCD_printfxy(0,2,"Höhenregelung"); |
} |
break; |
case 2: |
LCD_printfxy(0,0,"akt. Lage"); |
LCD_printfxy(0,1,"Nick: %5i",IntegralNick/1024); |
LCD_printfxy(0,2,"Roll: %5i",IntegralRoll/1024); |
LCD_printfxy(0,3,"Kompass: %5i",KompassValue); |
break; |
case 3: |
LCD_printfxy(0,0,"K1:%4i K2:%4i ",PPM_in[1],PPM_in[2]); |
LCD_printfxy(0,1,"K3:%4i K4:%4i ",PPM_in[3],PPM_in[4]); |
LCD_printfxy(0,2,"K5:%4i K6:%4i ",PPM_in[5],PPM_in[6]); |
LCD_printfxy(0,3,"K7:%4i K8:%4i ",PPM_in[7],PPM_in[8]); |
break; |
case 4: |
LCD_printfxy(0,0,"Ni:%4i Ro:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_NICK]],PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]); |
LCD_printfxy(0,1,"Gs:%4i Gi:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_GAS]],PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]); |
LCD_printfxy(0,2,"P1:%4i P2:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_POTI1]],PPM_in[EE_Parameter.Kanalbelegung[K_POTI2]]); |
LCD_printfxy(0,3,"P3:%4i P4:%4i ",PPM_in[EE_Parameter.Kanalbelegung[K_POTI3]],PPM_in[EE_Parameter.Kanalbelegung[K_POTI4]]); |
break; |
case 5: |
LCD_printfxy(0,0,"Gyro - Sensor"); |
if(PlatinenVersion == 10) |
{ |
LCD_printfxy(0,1,"Nick %4i (%3i.%i)",AdWertNick - AdNeutralNick/8, AdNeutralNick/8, AdNeutralNick%8); |
LCD_printfxy(0,2,"Roll %4i (%3i.%i)",AdWertRoll - AdNeutralRoll/8, AdNeutralRoll/8, AdNeutralRoll%8); |
LCD_printfxy(0,3,"Gier %4i (%3i)",AdNeutralGier - AdWertGier, AdNeutralGier); |
} |
else |
if((PlatinenVersion == 11) || (PlatinenVersion == 20)) |
{ |
LCD_printfxy(0,1,"Nick %4i (%3i.%x)",AdWertNick - AdNeutralNick/8, AdNeutralNick/16, (AdNeutralNick%16)/2); |
LCD_printfxy(0,2,"Roll %4i (%3i.%x)",AdWertRoll - AdNeutralRoll/8, AdNeutralRoll/16, (AdNeutralRoll%16)/2); |
LCD_printfxy(0,3,"Gier %4i (%3i)",AdNeutralGier - AdWertGier, AdNeutralGier/2); |
} |
else |
if(PlatinenVersion == 13) |
{ |
LCD_printfxy(0,1,"Nick %4i (%3i)(%3i)",AdWertNick - AdNeutralNick/8, AdNeutralNick/16,AnalogOffsetNick); |
LCD_printfxy(0,2,"Roll %4i (%3i)(%3i)",AdWertRoll - AdNeutralRoll/8, AdNeutralRoll/16,AnalogOffsetRoll); |
LCD_printfxy(0,3,"Gier %4i (%3i)(%3i)",AdNeutralGier - AdWertGier, AdNeutralGier/2,AnalogOffsetGier); |
} |
break; |
case 6: |
LCD_printfxy(0,0,"ACC - Sensor"); |
LCD_printfxy(0,1,"Nick %4i (%3i)",AdWertAccNick,NeutralAccX); |
LCD_printfxy(0,2,"Roll %4i (%3i)",AdWertAccRoll,NeutralAccY); |
LCD_printfxy(0,3,"Hoch %4i (%3i)",Mittelwert_AccHoch/*accumulate_AccHoch / messanzahl_AccHoch*/,(int)NeutralAccZ); |
break; |
case 7: |
LCD_printfxy(0,1,"Spannung: %5i",UBat); |
LCD_printfxy(0,2,"Empf.Pegel:%5i",SenderOkay); |
break; |
case 8: |
LCD_printfxy(0,0,"Kompass "); |
LCD_printfxy(0,1,"Richtung: %5i",KompassRichtung); |
LCD_printfxy(0,2,"Messwert: %5i",KompassValue); |
LCD_printfxy(0,3,"Start: %5i",KompassStartwert); |
break; |
case 9: |
LCD_printfxy(0,0,"Poti1: %3i",Poti1); |
LCD_printfxy(0,1,"Poti2: %3i",Poti2); |
LCD_printfxy(0,2,"Poti3: %3i",Poti3); |
LCD_printfxy(0,3,"Poti4: %3i",Poti4); |
break; |
case 10: |
LCD_printfxy(0,0,"Servo " ); |
LCD_printfxy(0,1,"Setpoint %3i",Parameter_ServoNickControl); |
LCD_printfxy(0,2,"Stellung: %3i",ServoValue); |
LCD_printfxy(0,3,"Range:%3i-%3i",EE_Parameter.ServoNickMin,EE_Parameter.ServoNickMax); |
break; |
case 11: |
LCD_printfxy(0,0,"ExternControl " ); |
LCD_printfxy(0,1,"Ni:%4i Ro:%4i ",ExternControl.Nick,ExternControl.Roll); |
LCD_printfxy(0,2,"Gs:%4i Gi:%4i ",ExternControl.Gas,ExternControl.Gier); |
LCD_printfxy(0,3,"Hi:%4i Cf:%4i ",ExternControl.Hight,ExternControl.Config); |
break; |
case 12: |
LCD_printfxy(0,0,"BL-Ctrl Errors " ); |
LCD_printfxy(0,1," %3d %3d %3d %3d ",MotorError[0],MotorError[1],MotorError[2],MotorError[3]); |
LCD_printfxy(0,2," %3d %3d %3d %3d ",MotorError[4],MotorError[5],MotorError[6],MotorError[7]); |
LCD_printfxy(0,3," %3d %3d %3d %3d ",MotorError[8],MotorError[9],MotorError[10],MotorError[11]); |
break; |
case 13: |
LCD_printfxy(0,0,"BL-Ctrl found " ); |
LCD_printfxy(0,1," %c %c %c %c ",MotorPresent[0] + '-',MotorPresent[1] + '-',MotorPresent[2] + '-',MotorPresent[3] + '-'); |
LCD_printfxy(0,2," %c %c %c %c ",MotorPresent[4] + '-',MotorPresent[5] + '-',MotorPresent[6] + '-',MotorPresent[7] + '-'); |
LCD_printfxy(0,3," %c - - -",MotorPresent[8] + '-'); |
if(MotorPresent[9]) LCD_printfxy(4,3,"10"); |
if(MotorPresent[10]) LCD_printfxy(8,3,"11"); |
if(MotorPresent[11]) LCD_printfxy(12,3,"12"); |
break; |
default: MaxMenue = MenuePunkt - 1; |
MenuePunkt = 0; |
break; |
} |
RemoteKeys = 0; |
} |
/branches/FC_075b_ACC-HH_MartinR/menu.h |
---|
0,0 → 1,9 |
extern void Menu(void); |
extern void LcdClear(void); |
extern char DisplayBuff[80]; |
extern unsigned char DispPtr; |
extern unsigned char MaxMenue; |
extern unsigned char MenuePunkt; |
extern unsigned char RemoteKeys; |
/branches/FC_075b_ACC-HH_MartinR/old_macros.h |
---|
0,0 → 1,47 |
/* |
For backwards compatibility only. |
Ingo Busker ingo@mikrocontroller.com |
*/ |
#ifndef cbi |
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) |
#endif |
#ifndef sbi |
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) |
#endif |
#ifndef inb |
#define inb(sfr) _SFR_BYTE(sfr) |
#endif |
#ifndef outb |
#define outb(sfr, val) (_SFR_BYTE(sfr) = (val)) |
#endif |
#ifndef inw |
#define inw(sfr) _SFR_WORD(sfr) |
#endif |
#ifndef outw |
#define outw(sfr, val) (_SFR_WORD(sfr) = (val)) |
#endif |
#ifndef outp |
#define outp(val, sfr) outb(sfr, val) |
#endif |
#ifndef inp |
#define inp(sfr) inb(sfr) |
#endif |
#ifndef BV |
#define BV(bit) _BV(bit) |
#endif |
#ifndef PRG_RDB |
#define PRG_RDB pgm_read_byte |
#endif |
/branches/FC_075b_ACC-HH_MartinR/printf_P.c |
---|
0,0 → 1,480 |
// Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist nicht von der Lizenz für den MikroKopter-Teil unterstellt |
/* |
Copyright (C) 1993 Free Software Foundation |
This file is part of the GNU IO Library. This library is free |
software; you can redistribute it and/or modify it under the |
terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) |
any later version. |
This library is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this library; see the file COPYING. If not, write to the Free |
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
As a special exception, if you link this library with files |
compiled with a GNU compiler to produce an executable, this does not cause |
the resulting executable to be covered by the GNU General Public License. |
This exception does not however invalidate any other reasons why |
the executable file might be covered by the GNU General Public License. */ |
/* |
* Copyright (c) 1990 Regents of the University of California. |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. [rescinded 22 July 1999] |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
/****************************************************************************** |
This file is a patched version of printf called _printf_P |
It is made to work with avr-gcc for Atmel AVR MCUs. |
There are some differences from standard printf: |
1. There is no floating point support (with fp the code is about 8K!) |
2. Return type is void |
3. Format string must be in program memory (by using macro printf this is |
done automaticaly) |
4. %n is not implemented (just remove the comment around it if you need it) |
5. If LIGHTPRINTF is defined, the code is about 550 bytes smaller and the |
folowing specifiers are disabled : |
space # * . - + p s o O |
6. A function void uart_sendchar(char c) is used for output. The UART must |
be initialized before using printf. |
Alexander Popov |
sasho@vip.orbitel.bg |
******************************************************************************/ |
/* |
* Actual printf innards. |
* |
* This code is large and complicated... |
*/ |
#include <string.h> |
#ifdef __STDC__ |
#include <stdarg.h> |
#else |
#include <varargs.h> |
#endif |
#include "main.h" |
//#define LIGHTPRINTF |
char PrintZiel; |
char Putchar(char zeichen) |
{ |
if(PrintZiel == OUT_LCD) { DisplayBuff[DispPtr++] = zeichen; return(1);} |
else return(uart_putchar(zeichen)); |
} |
void PRINT(const char * ptr, unsigned int len) |
{ |
for(;len;len--) Putchar(*ptr++); |
} |
void PRINTP(const char * ptr, unsigned int len) |
{ |
for(;len;len--) Putchar(pgm_read_byte(ptr++)); |
} |
void PAD_SP(signed char howmany) |
{ |
for(;howmany>0;howmany--) Putchar(' '); |
} |
void PAD_0(signed char howmany) |
{ |
for(;howmany>0;howmany--) Putchar('0'); |
} |
#define BUF 40 |
/* |
* Macros for converting digits to letters and vice versa |
*/ |
#define to_digit(c) ((c) - '0') |
#define is_digit(c) ((c)<='9' && (c)>='0') |
#define to_char(n) ((n) + '0') |
/* |
* Flags used during conversion. |
*/ |
#define LONGINT 0x01 /* long integer */ |
#define LONGDBL 0x02 /* long double; unimplemented */ |
#define SHORTINT 0x04 /* short integer */ |
#define ALT 0x08 /* alternate form */ |
#define LADJUST 0x10 /* left adjustment */ |
#define ZEROPAD 0x20 /* zero (as opposed to blank) pad */ |
#define HEXPREFIX 0x40 /* add 0x or 0X prefix */ |
void _printf_P (char ziel,char const *fmt0, ...) /* Works with string from FLASH */ |
{ |
va_list ap; |
register const char *fmt; /* format string */ |
register char ch; /* character from fmt */ |
register int n; /* handy integer (short term usage) */ |
register char *cp; /* handy char pointer (short term usage) */ |
const char *fmark; /* for remembering a place in fmt */ |
register unsigned char flags; /* flags as above */ |
signed char width; /* width from format (%8d), or 0 */ |
signed char prec; /* precision from format (%.3d), or -1 */ |
char sign; /* sign prefix (' ', '+', '-', or \0) */ |
unsigned long _ulong=0; /* integer arguments %[diouxX] */ |
#define OCT 8 |
#define DEC 10 |
#define HEX 16 |
unsigned char base; /* base for [diouxX] conversion */ |
signed char dprec; /* a copy of prec if [diouxX], 0 otherwise */ |
signed char dpad; /* extra 0 padding needed for integers */ |
signed char fieldsz; /* field size expanded by sign, dpad etc */ |
/* The initialization of 'size' is to suppress a warning that |
'size' might be used unitialized. It seems gcc can't |
quite grok this spaghetti code ... */ |
signed char size = 0; /* size of converted field or string */ |
char buf[BUF]; /* space for %c, %[diouxX], %[eEfgG] */ |
char ox[2]; /* space for 0x hex-prefix */ |
PrintZiel = ziel; // bestimmt, LCD oder UART |
va_start(ap, fmt0); |
fmt = fmt0; |
/* |
* Scan the format for conversions (`%' character). |
*/ |
for (;;) { |
for (fmark = fmt; (ch = pgm_read_byte(fmt)) != '\0' && ch != '%'; fmt++) |
/* void */; |
if ((n = fmt - fmark) != 0) { |
PRINTP(fmark, n); |
} |
if (ch == '\0') |
goto done; |
fmt++; /* skip over '%' */ |
flags = 0; |
dprec = 0; |
width = 0; |
prec = -1; |
sign = '\0'; |
rflag: ch = PRG_RDB(fmt++); |
reswitch: |
#ifdef LIGHTPRINTF |
if (ch=='o' || ch=='u' || (ch|0x20)=='x') { |
#else |
if (ch=='u' || (ch|0x20)=='x') { |
#endif |
if (flags&LONGINT) { |
_ulong=va_arg(ap, unsigned long); |
} else { |
register unsigned int _d; |
_d=va_arg(ap, unsigned int); |
_ulong = flags&SHORTINT ? (unsigned long)(unsigned short)_d : (unsigned long)_d; |
} |
} |
#ifndef LIGHTPRINTF |
if(ch==' ') { |
/* |
* ``If the space and + flags both appear, the space |
* flag will be ignored.'' |
* -- ANSI X3J11 |
*/ |
if (!sign) |
sign = ' '; |
goto rflag; |
} else if (ch=='#') { |
flags |= ALT; |
goto rflag; |
} else if (ch=='*'||ch=='-') { |
if (ch=='*') { |
/* |
* ``A negative field width argument is taken as a |
* - flag followed by a positive field width.'' |
* -- ANSI X3J11 |
* They don't exclude field widths read from args. |
*/ |
if ((width = va_arg(ap, int)) >= 0) |
goto rflag; |
width = -width; |
} |
flags |= LADJUST; |
flags &= ~ZEROPAD; /* '-' disables '0' */ |
goto rflag; |
} else if (ch=='+') { |
sign = '+'; |
goto rflag; |
} else if (ch=='.') { |
if ((ch = PRG_RDB(fmt++)) == '*') { |
n = va_arg(ap, int); |
prec = n < 0 ? -1 : n; |
goto rflag; |
} |
n = 0; |
while (is_digit(ch)) { |
n = n*10 + to_digit(ch); |
ch = PRG_RDB(fmt++); |
} |
prec = n < 0 ? -1 : n; |
goto reswitch; |
} else |
#endif /* LIGHTPRINTF */ |
if (ch=='0') { |
/* |
* ``Note that 0 is taken as a flag, not as the |
* beginning of a field width.'' |
* -- ANSI X3J11 |
*/ |
if (!(flags & LADJUST)) |
flags |= ZEROPAD; /* '-' disables '0' */ |
goto rflag; |
} else if (ch>='1' && ch<='9') { |
n = 0; |
do { |
n = 10 * n + to_digit(ch); |
ch = PRG_RDB(fmt++); |
} while (is_digit(ch)); |
width = n; |
goto reswitch; |
} else if (ch=='h') { |
flags |= SHORTINT; |
goto rflag; |
} else if (ch=='l') { |
flags |= LONGINT; |
goto rflag; |
} else if (ch=='c') { |
*(cp = buf) = va_arg(ap, int); |
size = 1; |
sign = '\0'; |
} else if (ch=='D'||ch=='d'||ch=='i') { |
if(ch=='D') |
flags |= LONGINT; |
if (flags&LONGINT) { |
_ulong=va_arg(ap, long); |
} else { |
register int _d; |
_d=va_arg(ap, int); |
_ulong = flags&SHORTINT ? (long)(short)_d : (long)_d; |
} |
if ((long)_ulong < 0) { |
_ulong = -_ulong; |
sign = '-'; |
} |
base = DEC; |
goto number; |
} else |
/* |
if (ch=='n') { |
if (flags & LONGINT) |
*va_arg(ap, long *) = ret; |
else if (flags & SHORTINT) |
*va_arg(ap, short *) = ret; |
else |
*va_arg(ap, int *) = ret; |
continue; // no output |
} else |
*/ |
#ifndef LIGHTPRINTF |
if (ch=='O'||ch=='o') { |
if (ch=='O') |
flags |= LONGINT; |
base = OCT; |
goto nosign; |
} else if (ch=='p') { |
/* |
* ``The argument shall be a pointer to void. The |
* value of the pointer is converted to a sequence |
* of printable characters, in an implementation- |
* defined manner.'' |
* -- ANSI X3J11 |
*/ |
/* NOSTRICT */ |
_ulong = (unsigned int)va_arg(ap, void *); |
base = HEX; |
flags |= HEXPREFIX; |
ch = 'x'; |
goto nosign; |
} else if (ch=='s') { // print a string from RAM |
if ((cp = va_arg(ap, char *)) == NULL) { |
cp=buf; |
cp[0] = '('; |
cp[1] = 'n'; |
cp[2] = 'u'; |
cp[4] = cp[3] = 'l'; |
cp[5] = ')'; |
cp[6] = '\0'; |
} |
if (prec >= 0) { |
/* |
* can't use strlen; can only look for the |
* NUL in the first `prec' characters, and |
* strlen() will go further. |
*/ |
char *p = (char*)memchr(cp, 0, prec); |
if (p != NULL) { |
size = p - cp; |
if (size > prec) |
size = prec; |
} else |
size = prec; |
} else |
size = strlen(cp); |
sign = '\0'; |
} else |
#endif /* LIGHTPRINTF */ |
if(ch=='U'||ch=='u') { |
if (ch=='U') |
flags |= LONGINT; |
base = DEC; |
goto nosign; |
} else if (ch=='X'||ch=='x') { |
base = HEX; |
/* leading 0x/X only if non-zero */ |
if (flags & ALT && _ulong != 0) |
flags |= HEXPREFIX; |
/* unsigned conversions */ |
nosign: sign = '\0'; |
/* |
* ``... diouXx conversions ... if a precision is |
* specified, the 0 flag will be ignored.'' |
* -- ANSI X3J11 |
*/ |
number: if ((dprec = prec) >= 0) |
flags &= ~ZEROPAD; |
/* |
* ``The result of converting a zero value with an |
* explicit precision of zero is no characters.'' |
* -- ANSI X3J11 |
*/ |
cp = buf + BUF; |
if (_ulong != 0 || prec != 0) { |
register unsigned char _d,notlastdigit; |
do { |
notlastdigit=(_ulong>=base); |
_d = _ulong % base; |
if (_d<10) { |
_d+='0'; |
} else { |
_d+='a'-10; |
if (ch=='X') _d&=~0x20; |
} |
*--cp=_d; |
_ulong /= base; |
} while (notlastdigit); |
#ifndef LIGHTPRINTF |
// handle octal leading 0 |
if (base==OCT && flags & ALT && *cp != '0') |
*--cp = '0'; |
#endif |
} |
size = buf + BUF - cp; |
} else { //default |
/* "%?" prints ?, unless ? is NUL */ |
if (ch == '\0') |
goto done; |
/* pretend it was %c with argument ch */ |
cp = buf; |
*cp = ch; |
size = 1; |
sign = '\0'; |
} |
/* |
* All reasonable formats wind up here. At this point, |
* `cp' points to a string which (if not flags&LADJUST) |
* should be padded out to `width' places. If |
* flags&ZEROPAD, it should first be prefixed by any |
* sign or other prefix; otherwise, it should be blank |
* padded before the prefix is emitted. After any |
* left-hand padding and prefixing, emit zeroes |
* required by a decimal [diouxX] precision, then print |
* the string proper, then emit zeroes required by any |
* leftover floating precision; finally, if LADJUST, |
* pad with blanks. |
*/ |
/* |
* compute actual size, so we know how much to pad. |
*/ |
fieldsz = size; |
dpad = dprec - size; |
if (dpad < 0) |
dpad = 0; |
if (sign) |
fieldsz++; |
else if (flags & HEXPREFIX) |
fieldsz += 2; |
fieldsz += dpad; |
/* right-adjusting blank padding */ |
if ((flags & (LADJUST|ZEROPAD)) == 0) |
PAD_SP(width - fieldsz); |
/* prefix */ |
if (sign) { |
PRINT(&sign, 1); |
} else if (flags & HEXPREFIX) { |
ox[0] = '0'; |
ox[1] = ch; |
PRINT(ox, 2); |
} |
/* right-adjusting zero padding */ |
if ((flags & (LADJUST|ZEROPAD)) == ZEROPAD) |
PAD_0(width - fieldsz); |
/* leading zeroes from decimal precision */ |
PAD_0(dpad); |
/* the string or number proper */ |
PRINT(cp, size); |
/* left-adjusting padding (always blank) */ |
if (flags & LADJUST) |
PAD_SP(width - fieldsz); |
} |
done: |
va_end(ap); |
} |
/branches/FC_075b_ACC-HH_MartinR/printf_P.h |
---|
0,0 → 1,19 |
#ifndef _PRINTF_P_H_ |
#define _PRINTF_P_H_ |
#include <avr/pgmspace.h> |
#define OUT_V24 0 |
#define OUT_LCD 1 |
void _printf_P (char, char const *fmt0, ...); |
extern char PrintZiel; |
#define printf_P(format, args...) _printf_P(OUT_V24,format , ## args) |
#define printf(format, args...) _printf_P(OUT_V24,PSTR(format) , ## args) |
#define LCD_printfxy(x,y,format, args...) { DispPtr = y * 20 + x; _printf_P(OUT_LCD,PSTR(format) , ## args);} |
#define LCD_printf(format, args...) { _printf_P(OUT_LCD,PSTR(format) , ## args);} |
#endif |
/branches/FC_075b_ACC-HH_MartinR/rc.c |
---|
0,0 → 1,123 |
/*####################################################################################### |
Decodieren eines RC Summen Signals |
#######################################################################################*/ |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "rc.h" |
#include "main.h" |
volatile int PPM_in[11]; |
volatile int PPM_diff[11]; // das diffenzierte Stick-Signal |
volatile unsigned char NewPpmData = 1; |
//############################################################################ |
//zum decodieren des PPM-Signals wird Timer1 mit seiner Input |
//Capture Funktion benutzt: |
void rc_sum_init (void) |
//############################################################################ |
{ |
TCCR1B=(1<<CS11)|(1<<CS10)|(1<<ICES1)|(1<<ICNC1);//|(1 << WGM12); //timer1 prescale 64 |
// TCCR1B=(1<<CS11)|(0<<CS10)|(1<<ICES1)|(1<<ICNC1); //timer1 prescale 64 |
TIMSK1 |= _BV(ICIE1); |
AdNeutralGier = 0; |
AdNeutralRoll = 0; |
AdNeutralNick = 0; |
return; |
} |
//############################################################################ |
//Diese Routine startet und inizialisiert den Timer für RC |
SIGNAL(SIG_INPUT_CAPTURE1) |
//############################################################################ |
{ |
static unsigned int AltICR=0; |
signed int signal = 0,tmp; |
static int index; |
signal = (unsigned int) ICR1 - AltICR; |
AltICR = ICR1; |
//Syncronisationspause? |
if((signal > 1100) && (signal < 8000)) |
{ |
if(index >= 4) NewPpmData = 0; // Null bedeutet: Neue Daten |
index = 1; |
} |
else |
{ |
if(index < 10) |
{ |
if((signal > 250) && (signal < 687)) |
{ |
signal -= 466; |
// Stabiles Signal |
if(abs(signal - PPM_in[index]) < 6) { if(SenderOkay < 200) SenderOkay += 10; else SenderOkay = 200;} |
tmp = (3 * (PPM_in[index]) + signal) / 4; |
if(tmp > signal+1) tmp--; else |
if(tmp < signal-1) tmp++; |
//if(SenderOkay >= 195) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; // MartinR: so war es |
if(SenderOkay >= 195) PPM_diff[index] = (tmp - PPM_in[index]); // MartinR: Optimiert |
else PPM_diff[index] = 0; |
PPM_in[index] = tmp; |
} |
index++; |
if(index == 5) J3High; else J3Low; // Servosignal an J3 anlegen |
if(index == 6) J4High; else J4Low; // Servosignal an J4 anlegen |
if(index == 7) J5High; else J5Low; // Servosignal an J5 anlegen |
} |
} |
} |
/* |
//############################################################################ |
//Diese Routine startet und inizialisiert den Timer für RC |
SIGNAL(SIG_INPUT_CAPTURE1) |
//############################################################################ |
{ |
static unsigned int AltICR=0; |
signed int signal = 0,tmp; |
static int index; |
signal = (unsigned int) ICR1 - AltICR; |
DebugOut.Analog[16] = signal; |
signal /= 2; |
AltICR = ICR1; |
//Syncronisationspause? |
if((signal > 1100*2) && (signal < 8000*2)) |
{ |
if(index >= 4) NewPpmData = 0; // Null bedeutet: Neue Daten |
index = 1; |
} |
else |
{ |
if(index < 10) |
{ |
if((signal > 250) && (signal < 687*2)) |
{ |
signal -= 962; |
// Stabiles Signal |
if(abs(signal - PPM_in[index]) < 6) { if(SenderOkay < 200) SenderOkay += 10;} |
tmp = (3 * (PPM_in[index]) + signal) / 4; |
if(tmp > signal+1) tmp--; else |
if(tmp < signal-1) tmp++; |
if(SenderOkay >= 195) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; |
else PPM_diff[index] = 0; |
PPM_in[index] = tmp; |
} |
index++; |
if(index == 5) J3High; else J3Low; // Servosignal an J3 anlegen |
if(index == 2) J4High; else J4Low; // Servosignal an J4 anlegen |
if(index == 7) J5High; else J5Low; // Servosignal an J5 anlegen |
} |
} |
} |
*/ |
/branches/FC_075b_ACC-HH_MartinR/rc.h |
---|
0,0 → 1,30 |
/*####################################################################################### |
Derkodieren eines RC Summen Signals |
#######################################################################################*/ |
#ifndef _RC_H |
#define _RC_H |
#if defined (__AVR_ATmega32__) |
#define TIMER_TEILER CK64 |
#define TIMER_RELOAD_VALUE 250 |
#endif |
#if defined (__AVR_ATmega644__) |
#define TIMER_RELOAD_VALUE 250 |
#endif |
#if defined (__AVR_ATmega644P__) |
#define TIMER_RELOAD_VALUE 250 |
#endif |
#define GAS PPM_in[2] |
extern void rc_sum_init (void); |
extern volatile int PPM_in[11]; |
extern volatile int PPM_diff[11]; // das diffenzierte Stick-Signal |
extern volatile unsigned char NewPpmData; |
#endif //_RC_H |
/branches/FC_075b_ACC-HH_MartinR/spi.c |
---|
0,0 → 1,298 |
// ######################## SPI - FlightCtrl ################### |
#include "main.h" |
//struct str_ToNaviCtrl_Version ToNaviCtrl_Version; |
//struct str_FromNaviCtrl_Version FromNaviCtrl_Version; |
struct str_ToNaviCtrl ToNaviCtrl; |
struct str_FromNaviCtrl FromNaviCtrl; |
struct str_FromNaviCtrl_Value FromNaviCtrl_Value; |
struct str_SPI_VersionInfo SPI_VersionInfo; |
unsigned char SPI_BufferIndex; |
unsigned char SPI_RxBufferIndex; |
volatile unsigned char SPI_Buffer[sizeof(FromNaviCtrl)]; |
unsigned char *SPI_TX_Buffer; |
unsigned char SPITransferCompleted, SPI_ChkSum; |
unsigned char SPI_RxDataValid,NaviDataOkay = 0; |
unsigned char SPI_CommandSequence[] = { SPI_CMD_USER, SPI_CMD_STICK, SPI_CMD_PARAMETER1, SPI_CMD_STICK, SPI_CMD_MISC, SPI_CMD_VERSION }; |
unsigned char SPI_CommandCounter = 0; |
#ifdef USE_SPI_COMMUNICATION |
//------------------------------------------------------ |
void SPI_MasterInit(void) |
{ |
DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK); // Set MOSI and SCK output, all others input |
SLAVE_SELECT_DDR_PORT |= (1 << SPI_SLAVE_SELECT); |
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(0<<SPR0)|(0<<SPIE); // Enable SPI, Master, set clock rate fck/64 |
SPSR = 0;//(1<<SPI2X); |
SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); |
SPITransferCompleted = 1; |
//SPDR = 0x00; // dummy write |
ToNaviCtrl.Sync1 = 0xAA; |
ToNaviCtrl.Sync2 = 0x83; |
ToNaviCtrl.Command = SPI_CMD_USER; |
ToNaviCtrl.IntegralNick = 0; |
ToNaviCtrl.IntegralRoll = 0; |
FromNaviCtrl_Value.SerialDataOkay = 0; |
SPI_RxDataValid = 0; |
SPI_VersionInfo.Major = VERSION_MAJOR; |
SPI_VersionInfo.Minor = VERSION_MINOR; |
SPI_VersionInfo.Patch = VERSION_PATCH; |
SPI_VersionInfo.Compatible = NC_SPI_COMPATIBLE; |
} |
//------------------------------------------------------ |
void SPI_StartTransmitPacket(void) |
{ |
//if ((SLAVE_SELECT_PORT & (1 << SPI_SLAVE_SELECT)) == 0) return; // transfer of prev. packet not completed |
if (!SPITransferCompleted) return; |
// _delay_us(30); |
SLAVE_SELECT_PORT &= ~(1 << SPI_SLAVE_SELECT); // SelectSlave |
SPI_TX_Buffer = (unsigned char *) &ToNaviCtrl; |
ToNaviCtrl.Command = SPI_CommandSequence[SPI_CommandCounter++]; |
if (SPI_CommandCounter >= sizeof(SPI_CommandSequence)) SPI_CommandCounter = 0; |
SPITransferCompleted = 0; |
UpdateSPI_Buffer(); // update buffer |
SPI_BufferIndex = 1; |
//ebugOut.Analog[16]++; |
// -- Debug-Output --- |
//---- |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
ToNaviCtrl.Chksum = ToNaviCtrl.Sync1; |
SPDR = ToNaviCtrl.Sync1; // Start transmission |
// SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
} |
//------------------------------------------------------ |
//SIGNAL(SIG_SPI) |
void SPI_TransmitByte(void) |
{ |
static unsigned char SPI_RXState = 0; |
unsigned char rxdata; |
static unsigned char rxchksum; |
if (SPITransferCompleted) return; |
if (!(SPSR & (1 << SPIF))) return; |
SendSPI = 4; |
// _delay_us(30); |
SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
rxdata = SPDR; |
switch ( SPI_RXState) |
{ |
case 0: |
SPI_RxBufferIndex = 0; |
//DebugOut.Analog[17]++; |
rxchksum = rxdata; |
if (rxdata == 0x81 ) { SPI_RXState = 1; } // 1. Syncbyte ok |
break; |
case 1: |
if (rxdata == 0x55) { rxchksum += rxdata; SPI_RXState = 2; } // 2. Syncbyte ok |
else SPI_RXState = 0; |
//DebugOut.Analog[18]++; |
break; |
case 2: |
SPI_Buffer[SPI_RxBufferIndex++]= rxdata; // get data |
//DebugOut.Analog[19]++; |
if (SPI_RxBufferIndex >= sizeof(FromNaviCtrl)) |
{ |
if (rxdata == rxchksum) |
{ |
unsigned char *ptr = (unsigned char *)&FromNaviCtrl; |
memcpy(ptr, (unsigned char *) SPI_Buffer, sizeof(SPI_Buffer)); |
SPI_RxDataValid = 1; |
} |
else SPI_RxDataValid = 0; |
SPI_RXState = 0; |
} |
else rxchksum += rxdata; |
break; |
} |
if (SPI_BufferIndex < sizeof(ToNaviCtrl)) |
{ |
SLAVE_SELECT_PORT &= ~(1 << SPI_SLAVE_SELECT); // SelectSlave |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
SPDR = SPI_TX_Buffer[SPI_BufferIndex]; |
ToNaviCtrl.Chksum += SPI_TX_Buffer[SPI_BufferIndex]; |
// SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
} |
else SPITransferCompleted = 1; |
SPI_BufferIndex++; |
} |
//------------------------------------------------------ |
void UpdateSPI_Buffer(void) |
{ |
signed int tmp; |
// cli(); // MartinR: Interrupt wird zu lange abgeschaltet (130us). Daher deaktiviert |
ToNaviCtrl.IntegralNick = (int) (IntegralNick / (long)(EE_Parameter.GyroAccFaktor * 4)); |
ToNaviCtrl.IntegralRoll = (int) (IntegralRoll / (long)(EE_Parameter.GyroAccFaktor * 4)); |
ToNaviCtrl.GyroCompass = (10 * ErsatzKompass) / GIER_GRAD_FAKTOR; |
ToNaviCtrl.AccNick = ((int) ACC_AMPLIFY * (NaviAccNick / NaviCntAcc))/4; |
ToNaviCtrl.AccRoll = ((int) ACC_AMPLIFY * (NaviAccRoll / NaviCntAcc))/4; |
NaviCntAcc = 0; NaviAccNick = 0; NaviAccRoll = 0; |
// ToNaviCtrl.User8 = Parameter_UserParam8; |
// ToNaviCtrl.CalState = WinkelOut.CalcState; |
switch(ToNaviCtrl.Command) // |
{ |
case SPI_CMD_USER: |
ToNaviCtrl.Param.Byte[0] = Parameter_UserParam1; |
ToNaviCtrl.Param.Byte[1] = Parameter_UserParam2; |
ToNaviCtrl.Param.Byte[2] = Parameter_UserParam3; |
ToNaviCtrl.Param.Byte[3] = Parameter_UserParam4; |
ToNaviCtrl.Param.Byte[4] = Parameter_UserParam5; |
ToNaviCtrl.Param.Byte[5] = Parameter_UserParam6; |
ToNaviCtrl.Param.Byte[6] = Parameter_UserParam7; |
ToNaviCtrl.Param.Byte[7] = Parameter_UserParam8; |
ToNaviCtrl.Param.Byte[8] = (unsigned char) MikroKopterFlags; |
MikroKopterFlags &= ~(FLAG_CALIBRATE | FLAG_START); |
ToNaviCtrl.Param.Byte[9] = (unsigned char) UBat; |
ToNaviCtrl.Param.Byte[10] =(unsigned char) EE_Parameter.UnterspannungsWarnung; |
ToNaviCtrl.Param.Byte[11] =(unsigned char) eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET]); |
break; |
case SPI_CMD_PARAMETER1: |
//ToNaviCtrl.Param.Byte[0] = EE_Parameter.NaviGpsModeControl; // Parameters for the Naviboard // MartinR: so war es |
ToNaviCtrl.Param.Byte[0] = Parameter_NaviGpsModeControl; // MartinR: wird wiederverwendet für GPS free bei HH |
ToNaviCtrl.Param.Byte[1] = EE_Parameter.NaviGpsGain; |
ToNaviCtrl.Param.Byte[2] = EE_Parameter.NaviGpsP; |
ToNaviCtrl.Param.Byte[3] = EE_Parameter.NaviGpsI; |
ToNaviCtrl.Param.Byte[4] = EE_Parameter.NaviGpsD; |
ToNaviCtrl.Param.Byte[5] = EE_Parameter.NaviGpsACC; |
ToNaviCtrl.Param.Byte[6] = EE_Parameter.NaviGpsMinSat; |
ToNaviCtrl.Param.Byte[7] = EE_Parameter.NaviStickThreshold; |
ToNaviCtrl.Param.Byte[8] = EE_Parameter.NaviOperatingRadius; |
ToNaviCtrl.Param.Byte[9] = EE_Parameter.NaviWindCorrection; |
ToNaviCtrl.Param.Byte[10] = EE_Parameter.NaviSpeedCompensation; |
ToNaviCtrl.Param.Byte[11] = EE_Parameter.NaviAngleLimitation; |
break; |
case SPI_CMD_STICK: |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[0] = (char) tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[1] = (char) tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[2] = (char) tmp; |
tmp = PPM_in[EE_Parameter.Kanalbelegung[K_NICK]]; if(tmp > 127) tmp = 127; else if(tmp < -127) tmp = -127; |
ToNaviCtrl.Param.Byte[3] = (char) tmp; |
ToNaviCtrl.Param.Byte[4] = (unsigned char) Poti1; |
ToNaviCtrl.Param.Byte[5] = (unsigned char) Poti2; |
ToNaviCtrl.Param.Byte[6] = (unsigned char) Poti3; |
ToNaviCtrl.Param.Byte[7] = (unsigned char) Poti4; |
ToNaviCtrl.Param.Byte[8] = (unsigned char) SenderOkay; |
break; |
case SPI_CMD_MISC: |
if(WinkelOut.CalcState > 5) |
{ |
WinkelOut.CalcState = 0; |
ToNaviCtrl.Param.Byte[0] = 5; |
} |
else ToNaviCtrl.Param.Byte[0] = WinkelOut.CalcState; |
ToNaviCtrl.Param.Int[1] = HoehenWert; |
ToNaviCtrl.Param.Byte[1] = EE_Parameter.NaviPH_LoginTime; |
ToNaviCtrl.Param.Byte[4] = EE_Parameter.NaviGpsPLimit; |
ToNaviCtrl.Param.Byte[5] = EE_Parameter.NaviGpsILimit; |
ToNaviCtrl.Param.Byte[6] = EE_Parameter.NaviGpsDLimit; |
break; |
case SPI_CMD_VERSION: |
ToNaviCtrl.Param.Byte[0] = SPI_VersionInfo.Major; |
ToNaviCtrl.Param.Byte[1] = SPI_VersionInfo.Minor; |
ToNaviCtrl.Param.Byte[2] = SPI_VersionInfo.Patch; |
ToNaviCtrl.Param.Byte[3] = SPI_VersionInfo.Compatible; |
ToNaviCtrl.Param.Byte[4] = PlatinenVersion; |
break; |
} |
//sei(); // MartinR: Interrupt wird zu lange abgeschaltet (130us). Daher deaktiviert |
if(SPI_RxDataValid) |
{ |
if(abs(FromNaviCtrl.GPS_Nick) < 512 && abs(FromNaviCtrl.GPS_Roll) < 512 && (EE_Parameter.GlobalConfig & CFG_GPS_AKTIV)) |
{ |
GPS_Nick = FromNaviCtrl.GPS_Nick; |
GPS_Roll = FromNaviCtrl.GPS_Roll; |
NaviDataOkay = 250; |
} |
if(FromNaviCtrl.CompassValue <= 360) KompassValue = FromNaviCtrl.CompassValue; |
KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180; |
if(FromNaviCtrl.BeepTime > beeptime && !WinkelOut.CalcState) beeptime = FromNaviCtrl.BeepTime; |
switch (FromNaviCtrl.Command) |
{ |
case SPI_KALMAN: |
FromNaviCtrl_Value.Kalman_K = FromNaviCtrl.Param.sByte[0]; |
FromNaviCtrl_Value.Kalman_MaxFusion = FromNaviCtrl.Param.sByte[1]; |
FromNaviCtrl_Value.Kalman_MaxDrift = FromNaviCtrl.Param.sByte[2]; |
FromNaviCtrl_Value.SerialDataOkay = FromNaviCtrl.Param.Byte[3]; |
break; |
case SPI_EXTCTRL: |
ExternControl.Digital[0] = FromNaviCtrl.Param.Byte[0]; |
ExternControl.Digital[1] = FromNaviCtrl.Param.Byte[1]; |
ExternControl.RemoteTasten = FromNaviCtrl.Param.Byte[2]; |
ExternControl.Nick = FromNaviCtrl.Param.sByte[3]; |
ExternControl.Roll = FromNaviCtrl.Param.sByte[4]; |
ExternControl.Gier = FromNaviCtrl.Param.sByte[5]; |
ExternControl.Gas = FromNaviCtrl.Param.Byte[6]; |
ExternControl.Hight = FromNaviCtrl.Param.sByte[7]; |
ExternControl.free = FromNaviCtrl.Param.Byte[8]; |
ExternControl.Frame = FromNaviCtrl.Param.Byte[9]; |
ExternControl.Config = FromNaviCtrl.Param.Byte[10]; |
break; |
default: |
break; |
} |
} |
else |
{ |
// KompassValue = 0; |
// KompassRichtung = 0; |
GPS_Nick = 0; |
GPS_Roll = 0; |
} |
} |
#endif |
/branches/FC_075b_ACC-HH_MartinR/spi.h |
---|
0,0 → 1,144 |
// ######################## SPI - FlightCtrl ################### |
#ifndef _SPI_H |
#define _SPI_H |
#include <util/delay.h> |
#define USE_SPI_COMMUNICATION |
#define 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 sByte[12]; |
unsigned char Byte[12]; |
int Int[6]; |
long Long[3]; |
float Float[3]; |
} Param; |
unsigned char Chksum; |
}; |
#define SPI_KALMAN 103 |
#define SPI_EXTCTRL 104 |
struct str_FromNaviCtrl |
{ |
unsigned char Command; |
signed int GPS_Nick; |
signed int GPS_Roll; |
signed int GPS_Gier; |
signed int CompassValue; |
signed int Status; |
unsigned int BeepTime; |
union |
{ |
char sByte[12]; |
unsigned char Byte[12]; |
int Int[6]; |
long Long[3]; |
float Float[3]; |
} Param; |
unsigned char Chksum; |
}; |
struct str_FromNaviCtrl_Value |
{ |
signed char Kalman_K; |
signed char Kalman_MaxDrift; |
signed char Kalman_MaxFusion; |
unsigned char SerialDataOkay; |
}; |
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/FC_075b_ACC-HH_MartinR/timer0.c |
---|
0,0 → 1,405 |
#include "main.h" |
volatile unsigned int CountMilliseconds = 0; |
volatile static unsigned int tim_main; |
volatile unsigned char UpdateMotor = 0; |
volatile unsigned int cntKompass = 0; |
volatile unsigned int beeptime = 0; |
volatile unsigned char SendSPI = 0, ServoActive = 0; |
unsigned int BeepMuster = 0xffff; |
int ServoValue = 0; |
volatile int16_t ServoNickValue = 0; |
volatile int16_t ServoRollValue = 0; |
enum { |
STOP = 0, |
CK = 1, |
CK8 = 2, |
CK64 = 3, |
CK256 = 4, |
CK1024 = 5, |
T0_FALLING_EDGE = 6, |
T0_RISING_EDGE = 7 |
}; |
SIGNAL (SIG_OVERFLOW0) // 8kHz |
{ |
static unsigned char cnt_1ms = 1,cnt = 0; |
unsigned char pieper_ein = 0; |
// TCNT0 -= 250;//TIMER_RELOAD_VALUE; |
if(SendSPI) SendSPI--; |
ANALOG_START; // MartinR: um Start AD zu steuern. 16 AD-Wandlungen mit 8kHz= 500 Hz |
if(!cnt--) |
{ |
cnt = 9; |
cnt_1ms++; |
cnt_1ms %= 2; |
if(!cnt_1ms) UpdateMotor = 1; |
CountMilliseconds++; |
} |
if(beeptime >= 1) |
{ |
beeptime--; |
if(beeptime & BeepMuster) |
{ |
pieper_ein = 1; |
} |
else pieper_ein = 0; |
} |
else |
{ |
pieper_ein = 0; |
BeepMuster = 0xffff; |
} |
if(pieper_ein) |
{ |
if(PlatinenVersion == 10) PORTD |= (1<<2); // Speaker an PORTD.2 |
else PORTC |= (1<<7); // Speaker an PORTC.7 |
} |
else |
{ |
if(PlatinenVersion == 10) PORTD &= ~(1<<2); |
else PORTC &= ~(1<<7); |
} |
if(EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV) |
{ |
if(PINC & 0x10) |
{ |
cntKompass++; |
} |
else |
{ |
if((cntKompass) && (cntKompass < 362)) |
{ |
cntKompass += cntKompass / 41; |
if(cntKompass > 10) KompassValue = cntKompass - 10; else KompassValue = 0; |
} |
// if(cntKompass < 10) cntKompass = 10; |
// KompassValue = (unsigned long)((unsigned long)(cntKompass-10)*720L + 1L) / 703L; |
KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180; |
cntKompass = 0; |
} |
} |
} |
// ----------------------------------------------------------------------- |
unsigned int SetDelay (unsigned int t) |
{ |
// TIMSK0 &= ~_BV(TOIE0); |
return(CountMilliseconds + t + 1); |
// TIMSK0 |= _BV(TOIE0); |
} |
// ----------------------------------------------------------------------- |
char CheckDelay(unsigned int t) |
{ |
// TIMSK0 &= ~_BV(TOIE0); |
return(((t - CountMilliseconds) & 0x8000) >> 9); |
// TIMSK0 |= _BV(TOIE0); |
} |
// ----------------------------------------------------------------------- |
void Delay_ms(unsigned int w) |
{ |
unsigned int akt; |
akt = SetDelay(w); |
while (!CheckDelay(akt)); |
} |
void Delay_ms_Mess(unsigned int w) |
{ |
unsigned int akt; |
akt = SetDelay(w); |
while (!CheckDelay(akt)) if(AdReady) {AdReady = 0; ANALOG_ON;} |
} |
/*****************************************************/ |
/* Initialize Timer 2 */ |
/*****************************************************/ |
// The timer 2 is used to generate the PWM at PD7 (J7) |
// to control a camera servo for nick compensation. |
void TIMER2_Init(void) |
{ |
uint8_t sreg = SREG; |
// disable all interrupts before reconfiguration |
cli(); |
PORTD &= ~(1<<PORTD7); // set PD7 to low |
DDRC |= (1<<DDC6); // set PC6 as output (Reset for HEF4017) |
HEF4017R_ON; |
// Timer/Counter 2 Control Register A |
// Timer Mode is FastPWM with timer reload at OCR2A (Bits: WGM22 = 1, WGM21 = 1, WGM20 = 1) |
// PD7: Normal port operation, OC2A disconnected, (Bits: COM2A1 = 0, COM2A0 = 0) |
// PD6: Normal port operation, OC2B disconnected, (Bits: COM2B1 = 0, COM2B0 = 0) |
TCCR2A &= ~((1<<COM2A1)|(1<<COM2A0)|(1<<COM2B1)|(1<<COM2B0)); |
TCCR2A |= (1<<WGM21)|(1<<WGM20); |
// Timer/Counter 2 Control Register B |
// Set clock divider for timer 2 to SYSKLOCK/32 = 20MHz / 32 = 625 kHz |
// The timer increments from 0x00 to 0xFF with an update rate of 625 kHz or 1.6 us |
// hence the timer overflow interrupt frequency is 625 kHz / 256 = 2.44 kHz or 0.4096 ms |
// divider 32 (Bits: CS022 = 0, CS21 = 1, CS20 = 1) |
TCCR2B &= ~((1<<FOC2A)|(1<<FOC2B)|(1<<CS22)); |
TCCR2B |= (1<<CS21)|(1<<CS20)|(1<<WGM22); |
// Initialize the Timer/Counter 2 Register |
TCNT2 = 0; |
// Initialize the Output Compare Register A used for PWM generation on port PD7. |
OCR2A = 255; |
TCCR2A |= (1<<COM2A1); // set or clear at compare match depends on value of COM2A0 |
// Timer/Counter 2 Interrupt Mask Register |
// Enable timer output compare match A Interrupt only |
TIMSK2 &= ~((1<<OCIE2B)|(1<<TOIE2)); |
TIMSK2 |= (1<<OCIE2A); |
SREG = sreg; |
} |
//---------------------------- |
void Timer_Init(void) |
{ |
tim_main = SetDelay(10); |
TCCR0B = CK8; |
TCCR0A = (1<<COM0A1)|(1<<COM0B1)|3;//fast PWM |
OCR0A = 0; |
OCR0B = 120; |
TCNT0 = (unsigned char)-TIMER_RELOAD_VALUE; // reload |
//OCR1 = 0x00; |
TIMSK0 |= _BV(TOIE0); |
} |
/*****************************************************/ |
/* Control Servo Position */ |
/*****************************************************/ |
ISR(TIMER2_COMPA_vect) |
{ |
// frame len 22.5 ms = 14063 * 1.6 us |
// stop pulse: 0.3 ms = 188 * 1.6 us |
// min servo pulse: 0.6 ms = 375 * 1.6 us |
// max servo pulse: 2.4 ms = 1500 * 1.6 us |
// resolution: 1500 - 375 = 1125 steps |
#define IRS_RUNTIME 127 |
#define PPM_STOPPULSE 188 |
// #define PPM_FRAMELEN (14063 |
#define PPM_FRAMELEN (1757 * EE_Parameter.ServoNickRefresh) |
#define MINSERVOPULSE 375 |
#define MAXSERVOPULSE 1500 |
#define SERVORANGE (MAXSERVOPULSE - MINSERVOPULSE) |
static uint8_t PulseOutput = 0; |
static uint16_t RemainingPulse = 0; |
static uint16_t ServoFrameTime = 0; |
static uint8_t ServoIndex = 0; |
#define MULTIPLYER 4 |
static int16_t ServoNickOffset = (255 / 2) * MULTIPLYER; // initial value near center positon |
static int16_t ServoRollOffset = (255 / 2) * MULTIPLYER; // initial value near center positon |
if(PlatinenVersion < 20) |
{ |
//--------------------------- |
// Nick servo state machine |
//--------------------------- |
if(!PulseOutput) // pulse output complete |
{ |
if(TCCR2A & (1<<COM2A0)) // we had a low pulse |
{ |
TCCR2A &= ~(1<<COM2A0);// make a high pulse |
RemainingPulse = MINSERVOPULSE + SERVORANGE/2; // center position ~ 1.5ms |
ServoNickOffset = (ServoNickOffset * 3 + (int16_t)Parameter_ServoNickControl * MULTIPLYER) / 4; // lowpass offset |
ServoNickValue = ServoNickOffset; // offset (Range from 0 to 255 * 3 = 765) |
if(EE_Parameter.ServoCompInvert & 0x01) |
{ // inverting movement of servo |
ServoNickValue += (int16_t)( ( (int32_t)EE_Parameter.ServoNickComp * MULTIPLYER * (IntegralNick / 128L ) ) / (256L) ); |
} |
else |
{ // non inverting movement of servo |
ServoNickValue -= (int16_t)( ( (int32_t)EE_Parameter.ServoNickComp * MULTIPLYER * (IntegralNick / 128L ) ) / (256L) ); |
} |
// limit servo value to its parameter range definition |
if(ServoNickValue < ((int16_t)EE_Parameter.ServoNickMin * MULTIPLYER) ) |
{ |
ServoNickValue = (int16_t)EE_Parameter.ServoNickMin * MULTIPLYER; |
} |
else |
if(ServoNickValue > ((int16_t)EE_Parameter.ServoNickMax * MULTIPLYER) ) |
{ |
ServoNickValue = (int16_t)EE_Parameter.ServoNickMax * MULTIPLYER; |
} |
RemainingPulse += ServoNickValue - (256 / 2) * MULTIPLYER; // shift ServoNickValue to center position |
ServoNickValue /= MULTIPLYER; |
DebugOut.Analog[20] = ServoNickValue; |
// range servo pulse width |
if(RemainingPulse > MAXSERVOPULSE ) RemainingPulse = MAXSERVOPULSE; // upper servo pulse limit |
else if(RemainingPulse < MINSERVOPULSE ) RemainingPulse = MINSERVOPULSE; // lower servo pulse limit |
// accumulate time for correct update rate |
ServoFrameTime = RemainingPulse; |
} |
else // we had a high pulse |
{ |
TCCR2A |= (1<<COM2A0); // make a low pulse |
RemainingPulse = PPM_FRAMELEN - ServoFrameTime; |
} |
// set pulse output active |
PulseOutput = 1; |
} |
} // EOF Nick servo state machine |
else |
{ |
//----------------------------------------------------- |
// PPM state machine, onboard demultiplexed by HEF4017 |
//----------------------------------------------------- |
if(!PulseOutput) // pulse output complete |
{ |
if(TCCR2A & (1<<COM2A0)) // we had a low pulse |
{ |
TCCR2A &= ~(1<<COM2A0);// make a high pulse |
if(ServoIndex == 0) // if we are at the sync gap |
{ |
RemainingPulse = PPM_FRAMELEN - ServoFrameTime; // generate sync gap by filling time to full frame time |
ServoFrameTime = 0; // reset servo frame time |
HEF4017R_ON; // enable HEF4017 reset |
} |
else // servo channels |
{ |
RemainingPulse = MINSERVOPULSE + SERVORANGE/2; // center position ~ 1.5ms |
switch(ServoIndex) // map servo channels |
{ |
case 1: // Nick Compensation Servo |
ServoNickOffset = (ServoNickOffset * 3 + (int16_t)Parameter_ServoNickControl * MULTIPLYER) / 4; // lowpass offset |
ServoNickValue = ServoNickOffset; // offset (Range from 0 to 255 * 3 = 765) |
if(EE_Parameter.ServoCompInvert & 0x01) |
{ // inverting movement of servo |
ServoNickValue += (int16_t)( ( (int32_t)EE_Parameter.ServoNickComp * MULTIPLYER * (IntegralNick / 128L ) ) / (256L) ); |
} |
else |
{ // non inverting movement of servo |
ServoNickValue -= (int16_t)( ( (int32_t)EE_Parameter.ServoNickComp * MULTIPLYER * (IntegralNick / 128L ) ) / (256L) ); |
} |
// limit servo value to its parameter range definition |
if(ServoNickValue < ((int16_t)EE_Parameter.ServoNickMin * MULTIPLYER) ) |
{ |
ServoNickValue = (int16_t)EE_Parameter.ServoNickMin * MULTIPLYER; |
} |
else |
if(ServoNickValue > ((int16_t)EE_Parameter.ServoNickMax * MULTIPLYER) ) |
{ |
ServoNickValue = (int16_t)EE_Parameter.ServoNickMax * MULTIPLYER; |
} |
RemainingPulse += ServoNickValue - (256 / 2) * MULTIPLYER; // shift ServoNickValue to center position |
ServoNickValue /= MULTIPLYER; |
DebugOut.Analog[20] = ServoNickValue; |
break; |
case 2: // Roll Compensation Servo |
ServoRollOffset = (ServoRollOffset * 3 + (int16_t) Parameter_ServoRollControl * MULTIPLYER) / 4; // lowpass offset |
ServoRollValue = ServoRollOffset; // offset (Range from 0 to 255 * 3 = 765) |
if(EE_Parameter.ServoCompInvert & 0x02) |
{ // inverting movement of servo |
ServoRollValue += (int16_t)( ( (int32_t) EE_Parameter.ServoRollComp * MULTIPLYER * (IntegralRoll / 128L ) ) / (256L) ); |
} |
else |
{ // non inverting movement of servo |
ServoRollValue -= (int16_t)( ( (int32_t) EE_Parameter.ServoRollComp * MULTIPLYER * (IntegralRoll / 128L ) ) / (256L) ); |
} |
// limit servo value to its parameter range definition |
if(ServoRollValue < ((int16_t)EE_Parameter.ServoRollMin * MULTIPLYER) ) |
{ |
ServoRollValue = (int16_t)EE_Parameter.ServoRollMin * MULTIPLYER; |
} |
else |
if(ServoRollValue > ((int16_t)EE_Parameter.ServoRollMax * MULTIPLYER) ) |
{ |
ServoRollValue = (int16_t)EE_Parameter.ServoRollMax * MULTIPLYER; |
} |
RemainingPulse += ServoRollValue - (256 / 2) * MULTIPLYER; // shift ServoNickValue to center position |
ServoRollValue /= MULTIPLYER; |
//DebugOut.Analog[20] = ServoRollValue; |
break; |
default: // other servo channels |
RemainingPulse += 2 * PPM_in[ServoIndex]; // add channel value, factor of 2 because timer 1 increments 3.2µs |
break; |
} |
// range servo pulse width |
if(RemainingPulse > MAXSERVOPULSE ) RemainingPulse = MAXSERVOPULSE; // upper servo pulse limit |
else if(RemainingPulse < MINSERVOPULSE ) RemainingPulse = MINSERVOPULSE; // lower servo pulse limit |
// substract stop pulse width |
RemainingPulse -= PPM_STOPPULSE; |
// accumulate time for correct sync gap |
ServoFrameTime += RemainingPulse; |
} |
} |
else // we had a high pulse |
{ |
TCCR2A |= (1<<COM2A0); // make a low pulse |
// set pulsewidth to stop pulse width |
RemainingPulse = PPM_STOPPULSE; |
// accumulate time for correct sync gap |
ServoFrameTime += RemainingPulse; |
if(ServoActive && SenderOkay > 180) HEF4017R_OFF; // disable HEF4017 reset |
else HEF4017R_ON; |
ServoIndex++; // change to next servo channel |
if(ServoIndex > EE_Parameter.ServoNickRefresh) ServoIndex = 0; // reset to the sync gap |
} |
// set pulse output active |
PulseOutput = 1; |
} |
} // EOF PPM state machine |
// General pulse output generator |
if(RemainingPulse > (255 + IRS_RUNTIME)) |
{ |
OCR2A = 255; |
RemainingPulse -= 255; |
} |
else |
{ |
if(RemainingPulse > 255) // this is the 2nd last part |
{ |
if((RemainingPulse - 255) < IRS_RUNTIME) |
{ |
OCR2A = 255 - IRS_RUNTIME; |
RemainingPulse -= 255 - IRS_RUNTIME; |
} |
else // last part > ISR_RUNTIME |
{ |
OCR2A = 255; |
RemainingPulse -= 255; |
} |
} |
else // this is the last part |
{ |
OCR2A = RemainingPulse; |
RemainingPulse = 0; |
PulseOutput = 0; // trigger to stop pulse |
} |
} // EOF general pulse output generator |
} |
/branches/FC_075b_ACC-HH_MartinR/timer0.h |
---|
0,0 → 1,20 |
#define TIMER_TEILER CK8 |
#define TIMER_RELOAD_VALUE 250 |
#define HEF4017R_ON PORTC |= (1<<PORTC6) |
#define HEF4017R_OFF PORTC &= ~(1<<PORTC6) |
void Timer_Init(void); |
void TIMER2_Init(void); |
void Delay_ms(unsigned int); |
void Delay_ms_Mess(unsigned int); |
unsigned int SetDelay (unsigned int t); |
char CheckDelay (unsigned int t); |
extern volatile unsigned int CountMilliseconds; |
extern volatile unsigned char UpdateMotor; |
extern volatile unsigned int beeptime; |
extern volatile unsigned int cntKompass; |
extern int ServoValue; |
extern unsigned int BeepMuster; |
extern volatile unsigned char SendSPI, ServoActive; |
/branches/FC_075b_ACC-HH_MartinR/twimaster.c |
---|
0,0 → 1,216 |
/*############################################################################ |
############################################################################*/ |
#include "main.h" |
volatile unsigned char twi_state = 0; |
unsigned char motor = 0; |
unsigned char motorread = 0,MissingMotor = 0; |
unsigned char motor_rx[16],motor_rx2[16]; |
unsigned char MotorPresent[MAX_MOTORS]; |
unsigned char MotorError[MAX_MOTORS]; |
//############################################################################ |
//Initzialisieren der I2C (TWI) Schnittstelle |
void i2c_init(void) |
//############################################################################ |
{ |
TWSR = 0; |
TWBR = ((SYSCLK/SCL_CLOCK)-16)/2; |
} |
//############################################################################ |
//Start I2C |
void i2c_start(void) |
//############################################################################ |
{ |
TWCR = (1<<TWSTA) | (1<<TWEN) | (1<<TWINT) | (1<<TWIE); |
} |
//############################################################################ |
void i2c_stop(void) |
//############################################################################ |
{ |
TWCR = (1<<TWEN) | (1<<TWSTO) | (1<<TWINT); |
} |
void i2c_reset(void) |
//############################################################################ |
{ |
i2c_stop(); |
twi_state = 0; |
motor = TWDR; |
motor = 0; |
TWCR = 0x80; |
TWAMR = 0; |
TWAR = 0; |
TWDR = 0; |
TWSR = 0; |
TWBR = 0; |
i2c_init(); |
i2c_start(); |
i2c_write_byte(0); |
} |
//############################################################################ |
void i2c_write_byte(char byte) |
//############################################################################ |
{ |
TWSR = 0x00; |
TWDR = byte; |
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE); |
} |
/****************************************/ |
/* Write to I2C */ |
/****************************************/ |
void I2C_WriteByte(int8_t byte) |
{ |
// move byte to send into TWI Data Register |
TWDR = byte; |
// clear interrupt flag (TWINT = 1) |
// enable i2c bus (TWEN = 1) |
// enable interrupt (TWIE = 1) |
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE); |
} |
/****************************************/ |
/* Receive byte and send ACK */ |
/****************************************/ |
void I2C_ReceiveByte(void) |
{ |
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE) | (1<<TWEA); |
} |
/****************************************/ |
/* I2C receive last byte and send no ACK*/ |
/****************************************/ |
void I2C_ReceiveLastByte(void) |
{ |
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE); |
} |
//############################################################################ |
SIGNAL (TWI_vect) |
//############################################################################ |
{ |
static unsigned char missing_motor; |
switch(twi_state++) |
{ |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Writing the Data |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
case 0: |
while(Mixer.Motor[motor][0] <= 0 && motor < MAX_MOTORS) motor++; // skip if not used |
if(motor == MAX_MOTORS) // writing finished -> now read |
{ |
motor = 0; |
twi_state = 3; |
i2c_write_byte(0x53+(motorread*2)); |
} |
else i2c_write_byte(0x52+(motor*2)); |
break; |
case 1: |
i2c_write_byte(Motor[motor++]); |
break; |
case 2: |
if(TWSR == 0x30) { if(!missing_motor) missing_motor = motor; if(++MotorError[motor-1] == 0) MotorError[motor-1] = 255;} |
i2c_stop(); |
I2CTimeout = 10; |
twi_state = 0; |
i2c_start(); |
break; |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Reading Data |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
case 3: |
//Transmit 1st byte for reading |
if(TWSR != 0x40) // Error? |
{ |
MotorPresent[motorread] = 0; |
motorread++; |
if(motorread >= MAX_MOTORS) motorread = 0; |
i2c_stop(); |
twi_state = 0; |
} |
else |
{ |
MotorPresent[motorread] = ('1' - '-') + motorread; |
I2C_ReceiveByte(); |
} |
MissingMotor = missing_motor; |
missing_motor = 0; |
break; |
case 4: //Read 1st byte and transmit 2nd Byte |
motor_rx[motorread] = TWDR; |
I2C_ReceiveLastByte(); //nack |
break; |
case 5: |
//Read 2nd byte |
motor_rx2[motorread++] = TWDR; |
if(motorread >= MAX_MOTORS) motorread = 0; |
i2c_stop(); |
twi_state = 0; |
break; |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// writing Gyro-Offset |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
case 8: |
i2c_write_byte(0x98); // Address of the DAC |
break; |
case 9: |
i2c_write_byte(0x10); // Update Channel A |
break; |
case 10: |
i2c_write_byte(AnalogOffsetNick); // Value |
break; |
case 11: |
i2c_write_byte(0x80); // Value |
break; |
case 12: |
i2c_stop(); |
I2CTimeout = 10; |
i2c_start(); |
break; |
case 13: |
i2c_write_byte(0x98); // Address of the DAC |
break; |
case 14: |
i2c_write_byte(0x12); // Update Channel B |
break; |
case 15: |
i2c_write_byte(AnalogOffsetRoll); // Value |
break; |
case 16: |
i2c_write_byte(0x80); // Value |
break; |
case 17: |
i2c_stop(); |
I2CTimeout = 10; |
i2c_start(); |
break; |
case 18: |
i2c_write_byte(0x98); // Address of the DAC |
break; |
case 19: |
i2c_write_byte(0x14); // Update Channel C |
break; |
case 20: |
i2c_write_byte(AnalogOffsetGier); // Value |
break; |
case 21: |
i2c_write_byte(0x80); // Value |
break; |
case 22: |
i2c_stop(); |
I2CTimeout = 10; |
twi_state = 0; |
break; |
default: twi_state = 0; |
break; |
} |
TWCR |= 0x80; |
} |
/branches/FC_075b_ACC-HH_MartinR/twimaster.h |
---|
0,0 → 1,35 |
/*############################################################################ |
############################################################################*/ |
#ifndef _I2C_MASTER_H |
#define _I2C_MASTER_H |
//############################################################################ |
// I2C Konstanten |
#define SCL_CLOCK 200000L |
#define I2C_TIMEOUT 30000 |
#define I2C_START 0x08 |
#define I2C_REPEATED_START 0x10 |
#define I2C_TX_SLA_ACK 0x18 |
#define I2C_TX_DATA_ACK 0x28 |
#define I2C_RX_SLA_ACK 0x40 |
#define I2C_RX_DATA_ACK 0x50 |
//############################################################################ |
extern volatile unsigned char twi_state; |
extern unsigned char motor,MissingMotor; |
extern unsigned char motorread; |
extern unsigned char motor_rx[]; |
extern unsigned char MotorPresent[]; |
extern unsigned char MotorError[]; |
void i2c_reset(void); |
extern void i2c_init (void); // I2C initialisieren |
extern void i2c_start (void); // Start I2C |
extern void i2c_stop (void); // Stop I2C |
extern void i2c_write_byte (char byte); // 1 Byte schreiben |
extern void i2c_reset(void); |
#endif |
/branches/FC_075b_ACC-HH_MartinR/uart.c |
---|
0,0 → 1,568 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include <stdarg.h> |
#include <string.h> |
#include "main.h" |
#include "uart.h" |
#define FC_ADDRESS 1 |
#define NC_ADDRESS 2 |
#define MK3MAG_ADDRESS 3 |
unsigned char GetExternalControl = 0,DebugDisplayAnforderung1 = 0, DebugDisplayAnforderung = 0,DebugDataAnforderung = 0,GetVersionAnforderung = 0, GetPPMChannelAnforderung = 0; |
unsigned char DisplayLine = 0; |
unsigned volatile char SioTmp = 0; |
unsigned volatile char SendeBuffer[MAX_SENDE_BUFF]; |
unsigned volatile char RxdBuffer[MAX_EMPFANGS_BUFF]; |
unsigned volatile char NMEABuffer[MAX_EMPFANGS_BUFF]; |
unsigned volatile char NeuerDatensatzEmpfangen = 0; |
unsigned volatile char NeueKoordinateEmpfangen = 0; |
unsigned volatile char UebertragungAbgeschlossen = 1; |
unsigned volatile char CntCrcError = 0; |
unsigned volatile char AnzahlEmpfangsBytes = 0; |
unsigned char *pRxData = 0; |
unsigned char RxDataLen = 0; |
unsigned volatile char PC_DebugTimeout = 0; |
unsigned volatile char PC_MotortestActive = 0; |
unsigned char DebugTextAnforderung = 255; |
unsigned char PcZugriff = 100; |
unsigned char MotorTest[16]; |
unsigned char MeineSlaveAdresse = 1; // Flight-Ctrl |
unsigned char ConfirmFrame; |
struct str_DebugOut DebugOut; |
struct str_ExternControl ExternControl; |
struct str_VersionInfo VersionInfo; |
struct str_WinkelOut WinkelOut; |
struct str_Data3D Data3D; |
int Debug_Timer,Kompass_Timer,Timer3D; |
unsigned int DebugDataIntervall = 200, Intervall3D = 0; |
const unsigned char ANALOG_TEXT[32][16] = |
{ |
//1234567890123456 |
"AngleNick ", //0 |
"AngleRoll ", |
"AccNick ", |
"AccRoll ", |
"GyroGier ", |
"Hight Value ", //5 |
"AccZ ", |
"Gas ", |
"Compass Value ", |
"Voltage ", |
"Empfang ", //10 |
"Gyro Kompass ", |
"Motor Front ", |
"Motor Rear ", |
"Motor Left ", |
"Motor Right ", //15 |
" ", |
" ", |
" ", |
"MK3Mag CalState ", |
"Servo ", //20 |
" ", |
" ", |
" ", |
" ", |
" ", //25 |
" ", |
"Kalman_MaxDrift ", |
" ", |
"Navi Serial Data", |
"GPS_Nick ", //30 |
"GPS_Roll " |
}; |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ Sende-Part der Datenübertragung |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
SIGNAL(INT_VEC_TX) |
{ |
static unsigned int ptr = 0; |
unsigned char tmp_tx; |
if(!UebertragungAbgeschlossen) |
{ |
ptr++; // die [0] wurde schon gesendet |
tmp_tx = SendeBuffer[ptr]; |
if((tmp_tx == '\r') || (ptr == MAX_SENDE_BUFF)) |
{ |
ptr = 0; |
UebertragungAbgeschlossen = 1; |
} |
UDR = tmp_tx; |
} |
else ptr = 0; |
} |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ Empfangs-Part der Datenübertragung, incl. CRC-Auswertung |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
SIGNAL(INT_VEC_RX) |
{ |
static unsigned int crc; |
static unsigned char crc1,crc2,buf_ptr; |
static unsigned char UartState = 0; |
unsigned char CrcOkay = 0; |
SioTmp = UDR; |
if(buf_ptr >= MAX_EMPFANGS_BUFF) UartState = 0; |
if(SioTmp == '\r' && UartState == 2) |
{ |
UartState = 0; |
crc -= RxdBuffer[buf_ptr-2]; |
crc -= RxdBuffer[buf_ptr-1]; |
crc %= 4096; |
crc1 = '=' + crc / 64; |
crc2 = '=' + crc % 64; |
CrcOkay = 0; |
if((crc1 == RxdBuffer[buf_ptr-2]) && (crc2 == RxdBuffer[buf_ptr-1])) CrcOkay = 1; else { CrcOkay = 0; CntCrcError++;}; |
if(!NeuerDatensatzEmpfangen && CrcOkay) // Datensatz schon verarbeitet |
{ |
NeuerDatensatzEmpfangen = 1; |
AnzahlEmpfangsBytes = buf_ptr + 1; |
RxdBuffer[buf_ptr] = '\r'; |
if(RxdBuffer[2] == 'R') |
{ |
wdt_enable(WDTO_250MS); // Reset-Commando |
ServoActive = 0; |
} |
} |
} |
else |
switch(UartState) |
{ |
case 0: |
if(SioTmp == '#' && !NeuerDatensatzEmpfangen) UartState = 1; // Startzeichen und Daten schon verarbeitet |
buf_ptr = 0; |
RxdBuffer[buf_ptr++] = SioTmp; |
crc = SioTmp; |
break; |
case 1: // Adresse auswerten |
UartState++; |
RxdBuffer[buf_ptr++] = SioTmp; |
crc += SioTmp; |
break; |
case 2: // Eingangsdaten sammeln |
RxdBuffer[buf_ptr] = SioTmp; |
if(buf_ptr < MAX_EMPFANGS_BUFF) buf_ptr++; |
else UartState = 0; |
crc += SioTmp; |
break; |
default: |
UartState = 0; |
break; |
} |
} |
// -------------------------------------------------------------------------- |
void AddCRC(unsigned int wieviele) |
{ |
unsigned int tmpCRC = 0,i; |
for(i = 0; i < wieviele;i++) |
{ |
tmpCRC += SendeBuffer[i]; |
} |
tmpCRC %= 4096; |
SendeBuffer[i++] = '=' + tmpCRC / 64; |
SendeBuffer[i++] = '=' + tmpCRC % 64; |
SendeBuffer[i++] = '\r'; |
UebertragungAbgeschlossen = 0; |
UDR = SendeBuffer[0]; |
} |
// -------------------------------------------------------------------------- |
void SendOutData(unsigned char cmd,unsigned char address, unsigned char BufferAnzahl, ...) //unsigned char *snd, unsigned char len) |
{ |
va_list ap; |
unsigned int pt = 0; |
unsigned char a,b,c; |
unsigned char ptr = 0; |
unsigned char *snd = 0; |
int len = 0; |
SendeBuffer[pt++] = '#'; // Startzeichen |
SendeBuffer[pt++] = 'a' + address; // Adresse (a=0; b=1,...) |
SendeBuffer[pt++] = cmd; // Commando |
va_start(ap, BufferAnzahl); |
if(BufferAnzahl) |
{ |
snd = va_arg(ap, unsigned char*); |
len = va_arg(ap, int); |
ptr = 0; |
BufferAnzahl--; |
} |
while(len) |
{ |
if(len) |
{ |
a = snd[ptr++]; |
len--; |
if((!len) && BufferAnzahl) |
{ |
snd = va_arg(ap, unsigned char*); |
len = va_arg(ap, int); |
ptr = 0; |
BufferAnzahl--; |
} |
} |
else a = 0; |
if(len) |
{ |
b = snd[ptr++]; |
len--; |
if((!len) && BufferAnzahl) |
{ |
snd = va_arg(ap, unsigned char*); |
len = va_arg(ap, int); |
ptr = 0; |
BufferAnzahl--; |
} |
} |
else b = 0; |
if(len) |
{ |
c = snd[ptr++]; |
len--; |
if((!len) && BufferAnzahl) |
{ |
snd = va_arg(ap, unsigned char*); |
len = va_arg(ap, int); |
ptr = 0; |
BufferAnzahl--; |
} |
} |
else c = 0; |
SendeBuffer[pt++] = '=' + (a >> 2); |
SendeBuffer[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4)); |
SendeBuffer[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6)); |
SendeBuffer[pt++] = '=' + ( c & 0x3f); |
} |
va_end(ap); |
AddCRC(pt); |
} |
// -------------------------------------------------------------------------- |
void Decode64(void) // die daten werden im rx buffer dekodiert, das geht nur, weil aus 4 byte immer 3 gemacht werden. |
{ |
unsigned char a,b,c,d; |
unsigned char x,y,z; |
unsigned char ptrIn = 3; // start at begin of data block |
unsigned char ptrOut = 3; |
unsigned char len = AnzahlEmpfangsBytes - 6; // von der Gesamtbytezahl eines Frames gehen 3 Bytes des Headers ('#',Addr, Cmd) und 3 Bytes des Footers (CRC1, CRC2, '\r') ab. |
while(len) |
{ |
a = RxdBuffer[ptrIn++] - '='; |
b = RxdBuffer[ptrIn++] - '='; |
c = RxdBuffer[ptrIn++] - '='; |
d = RxdBuffer[ptrIn++] - '='; |
x = (a << 2) | (b >> 4); |
y = ((b & 0x0f) << 4) | (c >> 2); |
z = ((c & 0x03) << 6) | d; |
if(len--) RxdBuffer[ptrOut++] = x; else break; |
if(len--) RxdBuffer[ptrOut++] = y; else break; |
if(len--) RxdBuffer[ptrOut++] = z; else break; |
} |
pRxData = (unsigned char*)&RxdBuffer[3]; // decodierte Daten beginnen beim 4. Byte |
RxDataLen = ptrOut - 3; // wie viele Bytes wurden dekodiert? |
} |
// -------------------------------------------------------------------------- |
void BearbeiteRxDaten(void) |
{ |
if(!NeuerDatensatzEmpfangen) return; |
unsigned char tempchar1, tempchar2; |
Decode64(); // dekodiere datenblock im Empfangsbuffer |
switch(RxdBuffer[1]-'a') // check for Slave Address |
{ |
case FC_ADDRESS: // FC special commands |
switch(RxdBuffer[2]) |
{ |
case 'K':// Kompasswert |
memcpy((unsigned char *)&KompassValue , (unsigned char *)pRxData, sizeof(KompassValue)); |
KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180; |
break; |
case 't':// Motortest |
if(AnzahlEmpfangsBytes > 20) memcpy(&MotorTest[0], (unsigned char *)pRxData, sizeof(MotorTest)); |
else memcpy(&MotorTest[0], (unsigned char *)pRxData, 4); |
PC_MotortestActive = 240; |
//while(!UebertragungAbgeschlossen); |
//SendOutData('T', MeineSlaveAdresse, 0); |
PcZugriff = 255; |
break; |
case 'n':// "Get Mixer |
while(!UebertragungAbgeschlossen); |
SendOutData('N', FC_ADDRESS, 1, (unsigned char *) &Mixer,sizeof(Mixer)); |
break; |
case 'm':// "Write Mixer |
while(!UebertragungAbgeschlossen); |
if(pRxData[0] == MIXER_REVISION) |
{ |
memcpy(&Mixer, (unsigned char *)pRxData, sizeof(Mixer)); |
eeprom_write_block(&Mixer, &EEPromArray[EEPROM_ADR_MIXER_TABLE], sizeof(Mixer)); |
tempchar1 = 1; |
} |
else tempchar1 = 0; |
SendOutData('M', FC_ADDRESS, 1, &tempchar1, sizeof(tempchar1)); |
break; |
case 'p': // get PPM Channels |
GetPPMChannelAnforderung = 1; |
break; |
case 'q':// "Get"-Anforderung für Settings |
// Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
if(pRxData[0] == 0xFF) |
{ |
pRxData[0] = GetActiveParamSetNumber(); |
} |
// limit settings range |
if(pRxData[0] < 1) pRxData[0] = 1; // limit to 5 |
else if(pRxData[0] > 5) pRxData[0] = 5; // limit to 5 |
// load requested parameter set |
ReadParameterSet(pRxData[0], (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
while(!UebertragungAbgeschlossen); |
tempchar1 = pRxData[0]; |
tempchar2 = EE_DATENREVISION; |
SendOutData('Q', FC_ADDRESS, 3, &tempchar1, sizeof(tempchar1), &tempchar2, sizeof(tempchar2), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
break; |
case 's': // Parametersatz speichern |
if((1 <= pRxData[0]) && (pRxData[0] <= 5) && (pRxData[1] == EE_DATENREVISION)) // check for setting to be in range |
{ |
memcpy((unsigned char *) &EE_Parameter.Kanalbelegung[0], (unsigned char *)&pRxData[2], STRUCT_PARAM_LAENGE); |
WriteParameterSet(pRxData[0], (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L; |
Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagRoll * 2500L; |
SetActiveParamSetNumber(pRxData[0]); |
tempchar1 = GetActiveParamSetNumber(); |
Piep(tempchar1,110); |
} |
else |
{ |
tempchar1 = 0; // mark in response an invlid setting |
} |
while(!UebertragungAbgeschlossen); |
SendOutData('S', FC_ADDRESS, 1, &tempchar1, sizeof(tempchar1)); |
break; |
} // case FC_ADDRESS: |
default: // any Slave Address |
switch(RxdBuffer[2]) |
{ |
// 't' comand placed here only for compatibility to BL |
case 't':// Motortest |
if(AnzahlEmpfangsBytes > 20) memcpy(&MotorTest[0], (unsigned char *)pRxData, sizeof(MotorTest)); |
else memcpy(&MotorTest[0], (unsigned char *)pRxData, 4); |
while(!UebertragungAbgeschlossen); |
SendOutData('T', MeineSlaveAdresse, 0); |
PC_MotortestActive = 250; |
PcZugriff = 255; |
break; |
// 'K' comand placed here only for compatibility to old MK3MAG software, that does not send the right Slave Address |
case 'K':// Kompasswert |
memcpy((unsigned char *)&KompassValue , (unsigned char *)pRxData, sizeof(KompassValue)); |
KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180; |
break; |
case 'a':// Texte der Analogwerte |
DebugTextAnforderung = pRxData[0]; |
if (DebugTextAnforderung > 31) DebugTextAnforderung = 31; |
PcZugriff = 255; |
break; |
case 'b': |
memcpy((unsigned char *)&ExternControl, (unsigned char *)pRxData, sizeof(ExternControl)); |
ConfirmFrame = ExternControl.Frame; |
PcZugriff = 255; |
break; |
case 'c': // Poll the 3D-Data |
if(!Intervall3D) { if(pRxData[0]) Timer3D = SetDelay(pRxData[0] * 10);} |
Intervall3D = pRxData[0] * 10; |
break; |
case 'd': // Poll the debug data |
DebugDataIntervall = pRxData[0] * 10; |
if(DebugDataIntervall > 0) DebugDataAnforderung = 1; |
break; |
case 'h':// x-1 Displayzeilen |
PcZugriff = 255; |
RemoteKeys |= pRxData[0]; |
if(RemoteKeys) DisplayLine = 0; |
DebugDisplayAnforderung = 1; |
break; |
case 'l':// x-1 Displayzeilen |
PcZugriff = 255; |
MenuePunkt = pRxData[0]; |
DebugDisplayAnforderung1 = 1; |
break; |
case 'v': // Version-Anforderung und Ausbaustufe |
GetVersionAnforderung = 1; |
break; |
case 'g':// |
GetExternalControl = 1; |
break; |
} |
break; // default: |
} |
NeuerDatensatzEmpfangen = 0; |
pRxData = 0; |
RxDataLen = 0; |
} |
//############################################################################ |
//Routine für die Serielle Ausgabe |
int uart_putchar (char c) |
//############################################################################ |
{ |
if (c == '\n') |
uart_putchar('\r'); |
//Warten solange bis Zeichen gesendet wurde |
loop_until_bit_is_set(USR, UDRE); |
//Ausgabe des Zeichens |
UDR = c; |
return (0); |
} |
// -------------------------------------------------------------------------- |
void WriteProgramData(unsigned int pos, unsigned char wert) |
{ |
//if (ProgramLocation == IN_RAM) Buffer[pos] = wert; |
// else eeprom_write_byte(&EE_Buffer[pos], wert); |
// Buffer[pos] = wert; |
} |
//############################################################################ |
//INstallation der Seriellen Schnittstelle |
void UART_Init (void) |
//############################################################################ |
{ |
//Enable TXEN im Register UCR TX-Data Enable & RX Enable |
UCR=(1 << TXEN) | (1 << RXEN); |
// UART Double Speed (U2X) |
USR |= (1<<U2X); |
// RX-Interrupt Freigabe |
UCSRB |= (1<<RXCIE); |
// TX-Interrupt Freigabe |
UCSRB |= (1<<TXCIE); |
//Teiler wird gesetzt |
UBRR=(SYSCLK / (BAUD_RATE * 8L) - 1); |
//UBRR = 33; |
//öffnet einen Kanal für printf (STDOUT) |
//fdevopen (uart_putchar, 0); |
//sbi(PORTD,4); |
Debug_Timer = SetDelay(DebugDataIntervall); |
Kompass_Timer = SetDelay(220); |
VersionInfo.SWMajor = VERSION_MAJOR; |
VersionInfo.SWMinor = VERSION_MINOR; |
VersionInfo.SWPatch = VERSION_PATCH; |
VersionInfo.ProtoMajor = VERSION_SERIAL_MAJOR; |
VersionInfo.ProtoMinor = VERSION_SERIAL_MINOR; |
pRxData = 0; |
RxDataLen = 0; |
} |
//--------------------------------------------------------------------------------------------- |
void DatenUebertragung(void) |
{ |
if(!UebertragungAbgeschlossen) return; |
if(DebugDisplayAnforderung && UebertragungAbgeschlossen) |
{ |
Menu(); |
SendOutData('H', FC_ADDRESS, 2, &DisplayLine, sizeof(DisplayLine), &DisplayBuff[DisplayLine * 20], 20); |
DisplayLine++; |
if(DisplayLine >= 4) DisplayLine = 0; |
DebugDisplayAnforderung = 0; |
} |
if(DebugDisplayAnforderung1 && UebertragungAbgeschlossen) |
{ |
Menu(); |
SendOutData('L', FC_ADDRESS, 3, &MenuePunkt, sizeof(MenuePunkt), &MaxMenue, sizeof(MaxMenue), DisplayBuff, sizeof(DisplayBuff)); |
DebugDisplayAnforderung1 = 0; |
} |
if(GetVersionAnforderung && UebertragungAbgeschlossen) |
{ |
SendOutData('V', FC_ADDRESS, 1, (unsigned char *) &VersionInfo, sizeof(VersionInfo)); |
GetVersionAnforderung = 0; |
} |
if(GetExternalControl && UebertragungAbgeschlossen) // Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
{ |
SendOutData('G',MeineSlaveAdresse, 1, (unsigned char *) &ExternControl, sizeof(ExternControl)); |
GetExternalControl = 0; |
} |
if((CheckDelay(Kompass_Timer)) && UebertragungAbgeschlossen) |
{ |
WinkelOut.Winkel[0] = (int) (IntegralNick / (EE_Parameter.GyroAccFaktor * 4)); // etwa in 0.1 Grad |
WinkelOut.Winkel[1] = (int) (IntegralRoll / (EE_Parameter.GyroAccFaktor * 4)); // etwa in 0.1 Grad |
WinkelOut.UserParameter[0] = Parameter_UserParam1; |
WinkelOut.UserParameter[1] = Parameter_UserParam2; |
SendOutData('w', MK3MAG_ADDRESS, 1, (unsigned char *) &WinkelOut,sizeof(WinkelOut)); |
if(WinkelOut.CalcState > 4) WinkelOut.CalcState = 6; // wird dann in SPI auf Null gesetzt |
Kompass_Timer = SetDelay(99); |
} |
if(((DebugDataIntervall>0 && CheckDelay(Debug_Timer)) || DebugDataAnforderung) && UebertragungAbgeschlossen) |
{ |
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/FC_075b_ACC-HH_MartinR/uart.h |
---|
0,0 → 1,136 |
#ifndef _UART_H |
#define _UART_H |
#define MAX_SENDE_BUFF 150 |
#define MAX_EMPFANGS_BUFF 150 |
void BearbeiteRxDaten(void); |
extern unsigned char DebugGetAnforderung; |
extern unsigned volatile char SendeBuffer[MAX_SENDE_BUFF]; |
extern unsigned volatile char RxdBuffer[MAX_EMPFANGS_BUFF]; |
extern unsigned volatile char UebertragungAbgeschlossen; |
extern unsigned volatile char PC_DebugTimeout; |
extern unsigned volatile char NeueKoordinateEmpfangen; |
extern unsigned volatile char PC_MotortestActive; |
extern unsigned char MeineSlaveAdresse; |
extern unsigned char PcZugriff; |
extern unsigned char RemotePollDisplayLine; |
extern int Debug_Timer,Kompass_Timer; |
extern void UART_Init (void); |
extern int uart_putchar (char c); |
extern void boot_program_page (uint32_t page, uint8_t *buf); |
extern void DatenUebertragung(void); |
extern void Uart1Init(void); |
extern void BearbeiteRxDaten(void); |
extern unsigned char MotorTest[16]; |
struct str_DebugOut |
{ |
unsigned char Digital[2]; |
signed int Analog[32]; // Debugwerte |
}; |
extern struct str_DebugOut DebugOut; |
struct str_WinkelOut |
{ |
signed int Winkel[2]; |
unsigned char UserParameter[2]; |
unsigned char CalcState; |
unsigned char Orientation; |
}; |
extern struct str_WinkelOut WinkelOut; |
struct str_Data3D |
{ |
signed int Winkel[3]; // nick, roll, compass in 0,1° |
signed char reserve[8]; |
}; |
extern struct str_Data3D Data3D; |
struct str_ExternControl |
{ |
unsigned char Digital[2]; |
unsigned char RemoteTasten; |
signed char Nick; |
signed char Roll; |
signed char Gier; |
unsigned char Gas; |
signed char Hight; |
unsigned char free; |
unsigned char Frame; |
unsigned char Config; |
}; |
extern struct str_ExternControl ExternControl; |
struct str_VersionInfo |
{ |
unsigned char SWMajor; |
unsigned char SWMinor; |
unsigned char ProtoMajor; |
unsigned char ProtoMinor; |
unsigned char SWPatch; |
unsigned char Reserved[5]; |
}; |
extern struct str_VersionInfo VersionInfo; |
//Die Baud_Rate der Seriellen Schnittstelle ist 9600 Baud |
//#define BAUD_RATE 9600 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 14400 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 28800 //Baud Rate für die Serielle Schnittstelle |
//#define BAUD_RATE 38400 //Baud Rate für die Serielle Schnittstelle |
#define BAUD_RATE 57600 //Baud Rate für die Serielle Schnittstelle |
//Anpassen der seriellen Schnittstellen Register wenn ein ATMega128 benutzt wird |
#if defined (__AVR_ATmega128__) |
# define USR UCSR0A |
# define UCR UCSR0B |
# define UDR UDR0 |
# define UBRR UBRR0L |
# define EICR EICRB |
#endif |
#if defined (__AVR_ATmega32__) |
# define USR UCSRA |
# define UCR UCSRB |
# define UBRR UBRRL |
# define EICR EICRB |
# define INT_VEC_RX SIG_UART_RECV |
# define INT_VEC_TX SIG_UART_TRANS |
#endif |
#if defined (__AVR_ATmega644__) |
# define USR UCSR0A |
# define UCR UCSR0B |
# define UDR UDR0 |
# define UBRR UBRR0L |
# define EICR EICR0B |
# define TXEN TXEN0 |
# define RXEN RXEN0 |
# define RXCIE RXCIE0 |
# define TXCIE TXCIE0 |
# define U2X U2X0 |
# define UCSRB UCSR0B |
# define UDRE UDRE0 |
# define INT_VEC_RX SIG_USART_RECV |
# define INT_VEC_TX SIG_USART_TRANS |
#endif |
#if defined (__AVR_ATmega644P__) |
# define USR UCSR0A |
# define UCR UCSR0B |
# define UDR UDR0 |
# define UBRR UBRR0L |
# define EICR EICR0B |
# define TXEN TXEN0 |
# define RXEN RXEN0 |
# define RXCIE RXCIE0 |
# define TXCIE TXCIE0 |
# define U2X U2X0 |
# define UCSRB UCSR0B |
# define UDRE UDRE0 |
# define INT_VEC_RX SIG_USART_RECV |
# define INT_VEC_TX SIG_USART_TRANS |
#endif |
#endif //_UART_H |
/branches/FC_075b_ACC-HH_MartinR/version.txt |
---|
0,0 → 1,324 |
------- |
V0.53 27.04.2007 H.Buss |
- erste öffentliche Version |
V0.53b 29.04.2007 H.Buss |
- der FAKTOR_I war versehentlich auf Null, dann liegt der MikroKopter nicht so hart in der Luft |
V0.53c 29.04.2007 H.Buss |
- es gib ein Menü, in dem die Werte der Kanäle nach Nick, Roll, Gas,... sortiert sind. |
Die angezeigten Werte waren nicht die Werte der Funke |
V0.54 01.05.2007 H.Buss |
- die Paramtersätze können jetzt vor dem Start ausgewählt werden |
Dazu wird beim Kalibrieren der Messwerte (Gashebel oben links) der Nick-Rollhebel abgefragt: |
2 3 4 |
1 x 5 |
- - - |
Bedeutet: Nick-Rollhebel Links Mitte = Setting:1 Links Oben = Setting:2 usw. |
- der Faktor_I für den Hauptregler ist hinzugekommen. Im Heading-Hold-Modus sollte er vergössert werden, was Stabilität bringt |
V0.55 14.05.2007 H.Buss |
- es können nun Servos an J3,J4,J5 mit den Kanälen 5-7 gesteuert werden |
V0.56 14.05.2007 H.Buss |
- es gab Probleme mit Funken, die mehr als 8 Kanäle haben, wenn mehrere Kanäle dann auf Null waren |
- Funken, die nicht bis +-120 aussteuern können, sollten jetzt auch gehen |
V0.57 24.05.2007 H.Buss |
- Der Höhenregler kann nun auch mittels Schalter bedient werden |
- Bug im Gier-Algorithmus behoben; Schnelles Gieren fürhrte dazu, dass der MK zu weit gedreht hat |
- Kompass-Einfluss dämpfen bei Neigung |
- Man kann zwischen Kompass FIX (Richtung beim Kalibrieren) und Variabel (einstellbar per Gier) wählen |
- Der Motortest vom Kopter-Tool geht jetzt |
- Man kann den Parametersätzen einen Namen geben |
- Das Kamerasetting ist unter Setting 2 defaultmässig integriert |
V0.58 30.05.2007 H.Buss |
- Der Höhenregler-Algorithmus wird nun umgangen, wenn der Höhenreglerschalter aus ist |
V0.60 17.08.2007 H.Buss |
- "Schwindel-Bug" behoben |
- Die Poti-Werte werden jetzt auf Unterlauf (<0) überprüft |
- Poti4 zugefügt |
- Es werden jetzt 8 Kanäle ausgewertet |
- Kamera-Servo (an J7) |
- Die Settings müssen überschrieben werden |
V0.61 - V0.63 H.Buss 27.09.2007 |
- Poti 4 und Kanal 8 werden im Menü angezeigt |
- ein paar Kleinigkeiten bei den DefaultKonstanten2 bereinigt |
- Analog.c: Aktuell_ax korrigiert |
- auf 32 Debug-Kanäle erweitert |
- Loopings sind jetzt möglich und einzeln im KopterTool freischaltbar |
- leichte Anpassungen im Gier - Geschwindigkeit und Drift |
- die Hardwareversion V1.1 wird erkannt und das Programm stellt sich auf die geänderte Gyroverstärkung und die geänderten Portpins ein |
- die Software startet nach dem Einschalten schneller, weil der Luftdruckoffset schneller gefunden wird |
- die PPM-Ausgänge liegen wieder an den Pins an |
- Details an der Sensordatenverarbeitung -> es fliegt sich geringfügig anders |
- der MK ist bei wenig Gas nicht mehr so giftig -> soll das Landen vereinfachen |
- I2C-Bus läuft jetzt sicher nach einer Störung wieder an |
- Sticksignale werden präziser ausgewertet |
- Stick-Kanäle werden ans Kopter-Tool übertragen |
- Es muss die Version V1.47 des Kopter-Tool verwendet werden |
- Die Settings werden auf Default zurückgesetzt |
- am Piepen kann man die Fehlerart unterscheiden |
1. einzelnes Piepen beim Einschalten und Kalibrieren |
2. langsames Intervall mindestens 1 Sek -> Empfangsausfall |
3. schnelleres Intervall mindestens 1 Sek -> Akku |
4. sehr schnelles Intervall mindestens 1 Sek -> Kommunikation zu den Reglern gestört |
V0.64 H.Buss 30.09.2007 |
- beim Gieren wurden die Achsen nicht hart genug geregelt |
V0.65a H.Buss 15.10.2007 |
- Integral im Mischer wieder integriert |
- Feinabstimmung im ACC/Gyro Abgleich -> 1/32 & 100 |
- ACC/Gyro Abgleich auch bei HH |
V0.66a H.Buss 3.11.2007 |
- Messwertverarbeitung aus dem Analog-Interrupt entfernt |
- Analogmessung hängt jetzt am FC-Timing |
- Looping-Stick-Hysterese eingebaut |
- Looping-180°-Umschlag einstellbar |
- Achsenkopplung: Gierbewegung verkoppelt Nick und Roll |
- Lageregelung nach ACC-Sensor verbessert |
- zusätzlicher I-Anteil in der Lageregelung verbessert die Neutrallage |
- Gyrodriftkompensation überarbeitet |
- Bug in der Gier-Stick-Berechnung behoben |
- Gyro-Messung auf 1kHz beschleunigt |
V0.67a H.Buss 16.11.2007 |
- der Hauptregler-I-Anteil wirkt jetzt nur noch auf den Winkel (ausser im HH-Mode) |
- Gyro-Acc-Abgleich jetzt wieder in jedem Zyklus |
- Feinabstimmung |
- Beim HH-Modus gab es noch Bugs |
V0.67e H.Buss 29.11.2007 |
- Parameter: Dynamic Stability und Driftfaktor eingeführt |
- Die Namen der Analogwerte werden jetzt zum Koptertool übertragen |
- Kompatibilität zum Koptertool erhöht |
V0.67f H.Buss 04.12.2007 |
- Das Integral des Hauptreglers wird jetzt linear entladen und nicht mehr proportional |
- Schub für Gier wird jetzt auf den Gaswert begrenzt, dadurch steigt der MK nicht mehr beim Gieren. Gier ist allerdings nicht mehr so agressiv |
- Die ACC-Nullwerte können jetzt dauerhaft im EEPROM gespeichert werden (Stick:Vollgas und Gier rechts) |
V0.68a I.Busker 28.12.2007 |
- SPI.c & SPI.h ins Projekt aufgenommen |
SPI-Kommuikation kann in SPI.h aktiviert/deaktivert werden |
V0.68c H.Buss 05.01.2008 |
- Stickauswertung verbessert -> träger und präziser |
- Alle Settings angepasst |
V0.69e H.Buss 05.05.2008 |
- kleinere Bugs beseitigt |
- Schneller Sinkflug jetzt möglich |
- Min- und Maxgas in den Settings geändert |
- Lagewinkel wird jetzt in 0,1 Grad an Kompass und Navi gesendet |
- Kalibrierung für MK3Mag -> Nick unten beim Kalibrieren |
- Kompassroutine um den Ersatzkompass (Gyro unterstützt Kompasswert) erweitert |
V0.69h H.Buss 21.05.2008 |
- STICK_GAIN = 4 eingeführt. Das erhöht die Auflösung der Sollwerte. Stick_P und Stick_I müssen nun um Faktor 4 erhöht werden |
- SenderOkay auch an das Naviboard übertragen |
- Bessere Parameter bei Senderausfall |
V0.69j H.Buss 30.05.2008 |
- Höhere Präzision der Achsenkopplung |
V0.69k H.Buss 31.05.2008 |
- Bug in SPI.C behoben |
- in 0.69h war ein Bug, der zu ungewollten Loopings führen konnte |
V0.69L H.Buss 14.06.2008 |
- feinere Cam-Servo-Auflösung |
V0.70a H.Buss 01.07.2008 |
- Unterstützung der V1.3-Hardware mit automatischem Hardware-Gyro-Abgleich |
V0.70b H.Buss 14.07.2008 |
- flexible Einstellungsmöglichkeit von J16 und J17 (Transistorausgänge) |
- eigene Parameter für GPS-Naviboard |
- eigener Parameter für ExternalControl (war vorher UserParameter1 bzw. 8) |
- neue Parameter im EEPROM-Datensatz: J16Bitmask, J16Timing, ExternalControl, Navi... |
- MikroKopterFlags eingeführt, damit das Navi den Status des MKs kennt |
- KopterTool-Kompatibilität auf 8 erhöht |
V0.70c H.Buss 30.07.2008 |
- Parameter der Datenfusion leicht modifiziert |
- EEPROM-Parameter für Looping-Umschlag angepasst (von 100 auf 85) |
- MaxStick wird auf 100 begrenzt |
V0.70d H.Buss 02.08.2008 |
- Transistorausgänge: das oberste Bit der Blinkmaske (im KopterTool linkes Bit) gibt nun den Zustand des Ausgangs im Schalterbetrieb an |
0.71b: H.Buss 19.10.2008 |
Kommunikation zum Navi erweitert: |
- Beeptime jetzt 32Bit |
- Datenfusion und Driftkopensation wird durch NaviBoard unterstützt |
0.71c: H.Buss 20.10.2008 |
- LoopConfig heisst jetzt BitConfig |
- 3-Fach-Schalter für Höhensteuerung möglich -> kann man mit GPS-Schalter zusammenlegen |
- bei den Settings wurde Setting[0] mit abgespeichert, welches es nicht gab. |
- in Zukunft werden bei neuen EEPROM-Settings die Kanäle von Setting 1 übernommen |
- Variablen NaviWindCorrection, NaviSpeedCompensation, NaviOperatingRadius eingeführt |
0.71f: H.Buss 15.11.2008 |
- Ausschalten der Höhenregelung per Schalter um 0,3 sek verzögert |
- bei der seriellen Übertragung hat die FC jetzt als SlaveAdresse die 1 |
- VersionInfo.NaviKompatibel eingeführt |
- wenn manuell gegiert wird, wird der GyroKompass-Wert auf den Kompasswert gesetzt |
- Luftdruckwert wird an das Navi übertragen |
- Der Baro-Offset wird jetzt nachgeführt, um den Messbereich zu erweitern. Geht nur bei Höhenregler mit Schalter |
- Debugdaten können jetzt mit 'f' gepollt werden |
0.71g: Gregor 09.12.2008 |
- Kommunikation überarbeitet |
Infos hier: http://www.mikrokopter.de/ucwiki/en/SerialCommands |
0.71h: H.Buss 15.12.2008 |
- Freigegebene Version |
- NaviAngleLimitation als Parameter zum Navi implementiert |
- Antwort auf CMD: 't' entfernt |
0.72d: H.Buss 22.01.2009 |
- OCTO als Compilerschalter |
- Unterstützung der FC 2.0 (ME) |
- GYRO_D eingeführt |
- Achsenkopplung jetzt auch auf Nick/Roll-Bewegung |
0.72e: H.Buss 27.01.2009 |
- die 0.72d hatte kein Integral im Gier |
- Parameter eingeführt: |
EE_Parameter.NaviGpsPLimit |
EE_Parameter.NaviGpsILimit |
EE_Parameter.NaviGpsDLimit |
EE_Parameter.NaviPH_LoginTime |
EE_Parameter.AchsKopplung2 |
EE_Parameter.CouplingYawCorrection |
0.72f: H.Buss 28.01.2009 |
- Bug im Ersatzkompass entfernt |
0.72h: H.Buss 05.02.2009 |
- Algorithmen beschleunigt -> Floats durch Fixkomma ersetzt |
- Achsentkopplung weiter verbessert |
- Nick- und Roll im Octo-Mischer auf jeweils vier Motoren aufgeteilt |
0.72i: H.Buss 07.02.2009 |
- Abtastrate von 1kHz auf 2kHz erhöht |
0.72j: H.Buss 09.02.2009 |
- neue Implementierung der Servoausgänge |
0.72k: H.Buss 10.02.2009 |
- Abtastrate auf 5kHz erhöht |
0.72L: H.Buss 13.02.2009 |
- Signalfilterung überarbeitet |
- OCTO2 implementiert |
0.72M: H.Buss 13.02.2009 |
- Code Cleanup |
0.72o: H.Buss 24.02.2009 |
- Abtastrate auf 2kHz |
- HW-Version an Navi |
- neuer Datensatz 'c' -> Lagedaten für 3D-Grafik |
- Auswerteroutine für Spectrum-Satteliten implementiert |
- Kanalsettings werden beim Parameterreset nicht mehr gelöscht |
- die Driftkompensation wird jetzt feiner aufgelöst --> EE_Parameter.Driftkomp muss mal 8 genommen werden |
- die Integrale und ACC-Werte werden jetzt im Scope in ca. 0,1° angezeigt (wie beim NaviBrd) |
0.72p: H.Buss 01.03.2009 |
- Octo3 erstellt |
- Analogwerte umbenannt |
0.73a-d: H.Buss 05.04.2009 |
- MixerTabelle implementiert |
- I2C-Bus auf bis zu 12 Motoren erweitert |
- die Busfehler der BL-Regler werden im Menü angezeigt |
- Revision der MixerTabelle eingeführt |
- MixerTabelle wird bei Parameterreset neu initialisiert |
- Motortest auf [12] erweitert |
- Motorschalter nicht mehr 3-Stufig |
0.74a |
- Datenfusion im Flug auch, wenn ACC-Z < 512 |
- Wert für die Luftdruck-Messbereichserweiterung abgefangen |
0.74d |
- Die Driftkompensation ist jetzt dreistufig -> 0,5% pro sekunde zusätzlich eingeführt |
0.75a G.Stobrawa 22.5.2009 |
- Extern Control also received from NC via SPI |
0.75b H.Buss 27.05.2009 |
- Spektrum-Singale schalten den PPM-Eingang aus |
- max. 2 Sekunden nach dem Start auf die BL-Regler warten |
- Automatische Zellenerkennung, wenn Spannungswarnung < 5,0V |
- Bei automatischer Zellenerkennung piept es je nach Zellenzahl |
- EE_DATENREVISION auf 76 erhöht |
- Servo: |
- Roll-Servo für FC ME implementiert |
- Update-Cmd stoppt Servos |
- Servos werden erst nach dem ersten Kalibrieren aktiviert |
V0.75b_MartinR 20.06.2009 |
ACC-HH Umschaltung im Flug: |
- Diverse Änderungen in der fc.c und spi.c um im Flug zwischen ACC-Mode und HH- Mode umschalten zu können. |
- WICHTIG !!!! über UserParameter1 (>180, per Schalter) kann im ACC- Modus auf HH umgeschaltet werden. |
- WICHTIG !!!! UserParameter2 ist dann der I-Faktor im HH-Mode. Hier unbedingt den für HH erforderlichen Wert eitragen! |
- WICHTIG !!!! UserParameter3 ist dann Stick-P-Wert im HH-Mode. Hier unbedingt den für HH erforderlichen Wert eitragen! |
Wird der HH-Mode über UserParameter1 aktiviert, so ist die Stick-Position im Moment des Umschaltens die Neutralposition |
für den HH-Mode. Hierdurch bleibt der ACC-Mode trimmbar. |
Der Nick- und Roll-Knüppel muß daher aber beim Umschalten von ACC auf HH in Mittelstellung stehen. |
Der Höhenregler ist beim HH-Mode über UserParameter1 deaktiviert. |
Beim normalen HH kann der Höhenregler verwendet werden. |
- HH-Mode wurde reduziert auf die Regler-Grundfunktionen! |
keine Driftkompensation, Gierfunktion nur mit P-Regler, keine GPS- oder Kompass Funktion. |
- Zu beachten: die anwählbare Drehratenbegrenzung wird derzeit im HH-Modus nicht abgeschaltet |
- Begrenzung von SummeNick SummeRoll reduziert, da Überlauf beobachtet wurde |
- Die Progression von MesswetNick MesswertRoll, wenn der Gyro an die Grenzen kommt wurde Hardwareabhängig geändert (Sprung bei V1.0 war für HH zu groß) |
Höhenregler modifiziert: |
- Überarbeiteter Höhenregler. Die verwendeten Parameter im MK-Tool haben sich nicht geändert. |
Änderungen in der fc.c , fc.h , analog.c , analog.h |
Beim Höhenregler über Schalter gibt es nun keinen Offset mehr. |
Die Auflösung von HoeheD wurde verbessert. |
Die Höhenänderungsgeschwindigkeit im Poti-Modus wurde begrenzt. |
- WICHTIG !!!! Die Höhenänderungsgeschwindigkeit ist im MK-Tool über UserParam4 einstellbar. |
- WICHTIG !!!! Die Höhenregler- Einstellungen müssen neu erflogen werden |
Optimierungen um den MK zitterunempfindlicher zu machen: |
- Diverse Änderungen, um die AD-Wandlung und Weiterverarbeitung der Analogkanäle zu Optimieren: |
(Ziel war es, den MK Zitterunempfindlicher zu machen) |
- diverse Änderungen / Optimierungen bei den Interrupts (kürzere Interrupts) |
- spi.c: Interrupt- Abschaltung (cli(), sei()) wurde deaktiviert, da der Interrupt zu lange abgeschaltet wurde. |
- A/D- Wandlung wird nun über Timer gestartet, 16 Wandlungen je Reglerzyklus, Nick und Roll werden 4x je Zyklus(500Hz) abgetastet (=2kHz) |
- Gyro-D wurde geändert, hier sind nun höhere werte sinnvoll (40..60) |
- Motorsmooting wurde wie von MartinK vorgeschlagen geändert (nur Filter bei mehr Gas9 |
Hardware- Änderungen: |
Hier meine derzeitigen Modifikatonen an der Hardware. Die Wirkung dieser Änderungen ist aber noch unklar! |
- C59,C60,C61: von 3,3 auf 10 nF erhöht, um hochfrequente Anteile besser zu filtern. |
- R8, R12 von 33k auf 10K geändert, um das Phasenverhalten der Gyros zu verbessern |
- C49, C29 Eingebaut (haben bei mir gefehlt) Wirkung ?? |
- C5,C6: von 1uF auf 100nF verringert, wegen Phasenversatz zwischen Gyro und ACC, keine Veränderung im Zittern |
Probleme: |
- ich kontte die SW nicht mehr fehlerfrei über das an der NC eingesteckte Bluetooth-Modul auf die FC überspielen. |
Wenn ich das Bluetooth oder Sercon für den SW update direkt an die FC anschliesse hat alles funktioniert. |
Ob das Problem auch mit der Original FC 0.75b auftritt, kann ich nicht sagen. |
Der Rest (Setup etc.) hat alles wie gewohnt funktioniert. |
Bisher getestet auf FC V1.0 und V2.0 ME Hardware, aber keine Gewähr!! |
/branches/FC_075b_ACC-HH_MartinR |
---|
Property changes: |
Added: tsvn:logminsize |
+8 |
\ No newline at end of property |