/branches/V0.67g/FlightCtrl.aps |
---|
0,0 → 1,0 |
<AVRStudio><MANAGEMENT><ProjectName>FlightCtrl</ProjectName><Created>15-May-2007 11:20:41</Created><LastEdit>11-Oct-2007 22:58:54</LastEdit><ICON>241</ICON><ProjectType>0</ProjectType><Created>15-May-2007 11:20:41</Created><Version>4</Version><Build>4, 13, 0, 528</Build><ProjectTypeName>AVR GCC</ProjectTypeName></MANAGEMENT><CODE_CREATION><ObjectFile>default\Flight-Ctrl.elf</ObjectFile><EntryFile></EntryFile><SaveFolder>F:\SVN\MikroKopter\FlightCtrl\branches\V0.64_ZeroWarnings\</SaveFolder></CODE_CREATION><DEBUG_TARGET><CURRENT_TARGET>AVR Simulator</CURRENT_TARGET><CURRENT_PART>ATmega644.xml</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND><HIDE>false</HIDE></IO_EXPAND><REGISTERNAMES><Register>R00</Register><Register>R01</Register><Register>R02</Register><Register>R03</Register><Register>R04</Register><Register>R05</Register><Register>R06</Register><Register>R07</Register><Register>R08</Register><Register>R09</Register><Register>R10</Register><Register>R11</Register><Register>R12</Register><Register>R13</Register><Register>R14</Register><Register>R15</Register><Register>R16</Register><Register>R17</Register><Register>R18</Register><Register>R19</Register><Register>R20</Register><Register>R21</Register><Register>R22</Register><Register>R23</Register><Register>R24</Register><Register>R25</Register><Register>R26</Register><Register>R27</Register><Register>R28</Register><Register>R29</Register><Register>R30</Register><Register>R31</Register></REGISTERNAMES><COM>Auto</COM><COMType>0</COMType><WATCHNUM>0</WATCHNUM><WATCHNAMES><Pane0></Pane0><Pane1></Pane1><Pane2></Pane2><Pane3></Pane3></WATCHNAMES><BreakOnTrcaeFull>0</BreakOnTrcaeFull></DEBUG_TARGET><Debugger><Triggers></Triggers></Debugger><AVRGCCPLUGIN><FILES><SOURCEFILE>uart.c</SOURCEFILE><SOURCEFILE>analog.c</SOURCEFILE><SOURCEFILE>eeprom.c</SOURCEFILE><SOURCEFILE>fc.c</SOURCEFILE><SOURCEFILE>GPS.c</SOURCEFILE><SOURCEFILE>main.c</SOURCEFILE><SOURCEFILE>menu.c</SOURCEFILE><SOURCEFILE>printf_P.c</SOURCEFILE><SOURCEFILE>rc.c</SOURCEFILE><SOURCEFILE>timer0.c</SOURCEFILE><SOURCEFILE>twimaster.c</SOURCEFILE><HEADERFILE>uart.h</HEADERFILE><HEADERFILE>_Settings.h</HEADERFILE><HEADERFILE>analog.h</HEADERFILE><HEADERFILE>fc.h</HEADERFILE><HEADERFILE>gps.h</HEADERFILE><HEADERFILE>main.h</HEADERFILE><HEADERFILE>menu.h</HEADERFILE><HEADERFILE>old_macros.h</HEADERFILE><HEADERFILE>printf_P.h</HEADERFILE><HEADERFILE>rc.h</HEADERFILE><HEADERFILE>Settings.h</HEADERFILE><HEADERFILE>timer0.h</HEADERFILE><HEADERFILE>twimaster.h</HEADERFILE></FILES><CONFIGS><CONFIG><NAME>default</NAME><USESEXTERNALMAKEFILE>NO</USESEXTERNALMAKEFILE><EXTERNALMAKEFILE></EXTERNALMAKEFILE><PART>atmega644</PART><HEX>1</HEX><LIST>1</LIST><MAP>1</MAP><OUTPUTFILENAME>Flight-Ctrl.elf</OUTPUTFILENAME><OUTPUTDIR>default\</OUTPUTDIR><ISDIRTY>1</ISDIRTY><OPTIONS><OPTION><FILE>GPS.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>analog.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>eeprom.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>fc.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>main.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>menu.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>printf_P.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>rc.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>timer0.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>twimaster.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>uart.c</FILE><OPTIONLIST></OPTIONLIST></OPTION></OPTIONS><INCDIRS/><LIBDIRS/><LIBS><LIB>libc.a</LIB><LIB>libm.a</LIB></LIBS><LINKOBJECTS/><OPTIONSFORALL>-Wall -gdwarf-2 -Wstrict-prototypes -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -DVERSION_HAUPTVERSION=0 -DVERSION_NEBENVERSION=64 -DVERSION_KOMPATIBEL=5</OPTIONSFORALL><LINKEROPTIONS></LINKEROPTIONS><SEGMENTS/></CONFIG></CONFIGS><LASTCONFIG>default</LASTCONFIG><USES_WINAVR>1</USES_WINAVR><GCC_LOC>C:\Program Files\WinAVR\bin\avr-gcc.exe</GCC_LOC><MAKE_LOC>C:\Program Files\WinAVR\utils\bin\make.exe</MAKE_LOC></AVRGCCPLUGIN><IOView><usergroups/></IOView><Files><File00000><FileId>00000</FileId><FileName>main.c</FileName><Status>1</Status></File00000><File00001><FileId>00001</FileId><FileName>uart.c</FileName><Status>1</Status></File00001><File00002><FileId>00002</FileId><FileName>menu.c</FileName><Status>1</Status></File00002><File00003><FileId>00003</FileId><FileName>timer0.c</FileName><Status>1</Status></File00003><File00004><FileId>00004</FileId><FileName>fc.c</FileName><Status>1</Status></File00004><File00005><FileId>00005</FileId><FileName>fc.h</FileName><Status>1</Status></File00005><File00006><FileId>00006</FileId><FileName>menu.h</FileName><Status>1</Status></File00006><File00007><FileId>00007</FileId><FileName>TWIMASTER.C</FileName><Status>1</Status></File00007><File00008><FileId>00008</FileId><FileName>twimaster.h</FileName><Status>1</Status></File00008><File00009><FileId>00009</FileId><FileName>uart.h</FileName><Status>1</Status></File00009><File00010><FileId>00010</FileId><FileName>_Settings.h</FileName><Status>1</Status></File00010><File00011><FileId>00011</FileId><FileName>analog.h</FileName><Status>1</Status></File00011><File00012><FileId>00012</FileId><FileName>gps.h</FileName><Status>1</Status></File00012><File00013><FileId>00013</FileId><FileName>main.h</FileName><Status>1</Status></File00013><File00014><FileId>00014</FileId><FileName>old_macros.h</FileName><Status>1</Status></File00014><File00015><FileId>00015</FileId><FileName>printf_P.h</FileName><Status>1</Status></File00015><File00016><FileId>00016</FileId><FileName>rc.h</FileName><Status>1</Status></File00016><File00017><FileId>00017</FileId><FileName>Settings.h</FileName><Status>1</Status></File00017><File00018><FileId>00018</FileId><FileName>timer0.h</FileName><Status>1</Status></File00018></Files><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio> |
/branches/V0.67g/GPS.c |
---|
0,0 → 1,30 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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; |
long GpsAktuell_X = 0; |
long GpsAktuell_Y = 0; |
long GpsZiel_X = 0; |
long GpsZiel_Y = 0; |
void GPS_Neutral(void) |
{ |
GpsZiel_X = GpsAktuell_X; |
GpsZiel_Y = GpsAktuell_Y; |
} |
void GPS_BerechneZielrichtung(void) |
{ |
GPS_Nick = 0; |
GPS_Roll = 0; |
} |
/branches/V0.67g/Hex-Files/BootLoader_MEGA644_20MHZ_V0_1.hex |
---|
0,0 → 1,64 |
:10F8000011241FBECFEFD0E1DEBFCDBF11E0A0E0DD |
:10F81000B1E0E0EEFBEF02C005900D92A030B10721 |
:10F82000D9F712E0A0E0B1E001C01D92A230B1070B |
:10F83000E1F70C943B7C0C941D7C0895982F8091EB |
:10F84000C00085FFFCCF9093C60008958091C00052 |
:10F850008823E4F78091C600992708958DE40E94DB |
:10F860001E7C8BE40E941E7C82E40E941E7C8CE441 |
:10F870000E941E7C0895CFEFD0E1DEBFCDBFE0E057 |
:10F88000F0E014915F01772474BE98E10FB6F8940C |
:10F8900090936000109260000FBE7092C5008AE2E3 |
:10F8A0008093C4008091C00082608093C0009093D8 |
:10F8B000C10086E08093C200EF01072D8091C00057 |
:10F8C00087FF0DC0013031F48091C6008A3AB1F152 |
:10F8D00000E005C08091C6008B3109F401E0CE0143 |
:10F8E00021968436910528F11F3F41F0112331F014 |
:10F8F000E0910001F091010109951BC01092C50033 |
:10F900008AE28093C4008AE00E941E7C8DE00E94FF |
:10F910001E7C86E50E941E7C80E30E941E7C8EE297 |
:10F920000E941E7C81E30E941E7C8AE30E941E7C52 |
:10F9300005C080E593EC0197F1F7C0CF0E942E7CC3 |
:10F940000E94267C813611F489E547C1813471F427 |
:10F950000E94267CA82EBB24BA2CAA240E94267CB6 |
:10F960009927A82AB92AB694A79406C1823629F401 |
:10F9700089E50E941E7C81E00BC1823409F083C0BE |
:10F980000E94267C9927D82FCC270E94267C992775 |
:10F99000C82BD92B0E94267C082F12E0812E11E063 |
:10F9A000912EEE24FF2464010894811C911CEC1616 |
:10F9B000FD0618F40E94267C01C08FEFD6018C93BF |
:10F9C0000894E11CF11CBFEFEB16F10461F358F34E |
:10F9D000E4E77E1609F0DEC0063409F03DC0FFEF13 |
:10F9E000AF16F7EFBF0608F033C0DE01A5016627AA |
:10F9F0007727440F551F661F771F6A017B01C2E0FE |
:10FA0000D1E001E08991992729913327322F2227CC |
:10FA1000822B932B0C01FA0100935700E8951124D7 |
:10FA20004E5F5F4F6F4F7F4F129761F785E0F60192 |
:10FA300080935700E89507B600FCFDCF81E18093E5 |
:10FA40005700E89576956795579547955A0194C064 |
:10FA500080E00E941E7C90C0053409F08DC0F50145 |
:10FA60009E01A2E0B1E0E1BD8F2F992782BD8D916B |
:10FA700080BD3196FA9AF99AF999FECF215030401B |
:10FA800091F75F0179C0873609F047C00E94267C54 |
:10FA90009927D82ECC240E94267C9927C82AD92AB7 |
:10FAA0000E94267C863411F5E6016501EE24FF24D0 |
:10FAB000CC0CDD1CEE1CFF1CF60105911491802F6F |
:10FAC0000E941E7C812F99270E941E7C82E090E07C |
:10FAD000A0E0B0E0C80ED91EEA1EFB1E229761F717 |
:10FAE000F694E794D794C79456012ACF853409F049 |
:10FAF00027CF7501E1BC8F2D992782BDF89A089414 |
:10FB0000E11CF11C80B50E941E7C0894C108D1083C |
:10FB1000C114D10479F7570113CF853601F594E765 |
:10FB2000791651F580E090E0A0E0B0E023E0FC0120 |
:10FB300020935700E89507B600FCFDCF80509F4FFB |
:10FB4000AF4FBF4F8F3FE7EF9E07E0E0AE07E0E02B |
:10FB5000BE0768F381E180935700E8950DC08534B6 |
:10FB600069F488E190E02CE00FB6F894A8958093B2 |
:10FB700060000FBE209360008DE02FC08035E1F360 |
:10FB80008C34D1F3803711F483E527C0843721F416 |
:10FB90000E941E7C80E021C0843521F40E94267CD6 |
:10FBA000782EEACF8B3109F4C9CE8A3A09F4C6CE51 |
:10FBB000863529F480E30E941E7C81E30EC08337E2 |
:10FBC00041F489E00E941E7C86E90E941E7C8EE141 |
:10FBD00004C08B3109F4B4CE8FE30E941E7CB0CEFA |
:040000030000F80001 |
:00000001FF |
/branches/V0.67g/Hex-Files/Flight-Ctrl_MEGA644_V0_67g.hex |
---|
0,0 → 1,1994 |
:100000000C9411020C942C020C942C020C942C02D3 |
:100010000C942C020C942C020C942C020C942C02A8 |
:100020000C942C020C94270C0C942C020C942C0293 |
:100030000C9409160C942C020C942C020C942C0297 |
:100040000C942C020C942C020C94200B0C942C027B |
:100050000C948E040C942C020C9458040C942C02D6 |
:100060000C942C0D0C942C020C9433150C942C0233 |
:100070000A0D466C69676874436F6E74726F6C0A20 |
:100080000D48617264776172653A25642E25640AB1 |
:100090000D536F6674776172653A5625642E256438 |
:1000A000256320000A0D3D3D3D3D3D3D3D3D3D3D2F |
:1000B0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D70 |
:1000C0003D3D3D3D000A0D496E69742E2045455069 |
:1000D000524F4D3A2047656E6572696572652044DE |
:1000E000656661756C742D506172616D65746572C1 |
:1000F0002E2E2E000A0D414343206E696368742042 |
:1001000061626765676C696368656E21000A0D420C |
:10011000656E75747A6520506172616D6574657283 |
:100120007361747A202564000A0D4162676C656909 |
:100130006368204C756674647275636B73656E7367 |
:100140006F722E2E004F4B0A0D000A0D5374657509 |
:100150006572756E673A200048656164696E67482C |
:100160006F6C64004E65757472616C000A0A0D0054 |
:100170002E005B25695D002B2B204D696B726F4B48 |
:100180006F70746572202B2B0048573A5625642EE9 |
:1001900025642053573A25642E2564256300536552 |
:1001A0007474696E673A202564200028632920480A |
:1001B0006F6C676572204275737300486F65686580 |
:1001C0003A202020202025356900536F6C6C486F41 |
:1001D0006568653A20253569004C756674647275EA |
:1001E000636B3A20253569004F6666202020202069 |
:1001F000203A20253569004B65696E65200048F678 |
:1002000068656E726567656C756E6700616B742EEC |
:10021000204C616765004E69636B3A2020202020E6 |
:100220002025356900526F6C6C3A20202020202058 |
:10023000253569004B6F6D706173733A202020255E |
:100240003569004B313A25346920204B323A253448 |
:100250006920004B333A25346920204B343A253449 |
:100260006920004B353A25346920204B363A253435 |
:100270006920004B373A25346920204B383A253421 |
:100280006920004E693A2534692020526F3A25349E |
:1002900069200047733A253469202047693A25349C |
:1002A00069200050313A253469202050323A2534F3 |
:1002B00069200050333A253469202050343A2534DF |
:1002C0006920004779726F202D2053656E736F721D |
:1002D000004E69636B202534692028253369290085 |
:1002E000526F6C6C2025346920282533692900471A |
:1002F00069657220253469202825336929004E69F3 |
:10030000636B2025346920282533692900526F6CDE |
:100310006C202534692028253369290047696572D6 |
:100320002025346920282533692900414343202DA5 |
:100330002053656E736F72004E69636B20253469BC |
:1003400020282533692900526F6C6C2025346920E0 |
:10035000282533692900486F6368202534692028DF |
:1003600025336929005370616E6E756E673A2020DF |
:1003700025356900456D70662E506567656C3A25B8 |
:100380003569004B6F6D7061737320202020202031 |
:1003900020005269636874756E673A2020253569BC |
:1003A000004D657373776572743A202025356900B6 |
:1003B00053746172743A2020202020253569005042 |
:1003C0006F7469313A202025336900506F746932A7 |
:1003D0003A202025336900506F7469333A20202574 |
:1003E000336900506F7469343A2020253369005313 |
:1003F0006572766F202000536574706F696E74208B |
:1004000020253369005374656C6C756E673A20253E |
:1004100033690052616E67653A2533692D2533696A |
:10042000000011241FBECFEFD0E1DEBFCDBF13E02F |
:10043000A0E0B1E0EEEDF9E702C005900D92A23A1E |
:10044000B107D9F717E0A2EAB3E001C01D92A43BBF |
:10045000B107E1F70C9467020C940000FB018630B1 |
:1004600008F085E0489FD0011124AC59BF4F842F7C |
:100470009927019724F00E94DB3C0192FACF08955E |
:10048000282FFB01863008F025E0429FD00111247F |
:10049000AC59BF4F842F9927019724F001900E94F7 |
:1004A000E33CFACFA2E0B0E0022E0E94E33C0895C4 |
:1004B000A2E0B0E09D010E94DB3C802D863028F058 |
:1004C00082E0D901082E0E94E33C99270895CFEFDE |
:1004D000D0E1DEBFCDBF14B815B897EEE92E93E09A |
:1004E000F92E8EEC9FEFE80EF91EF7FEFACF88EE9C |
:1004F000E82E83E0F82E189B02C08BE001C08AE052 |
:100500008093000181E887B98FEF88B98BE184B9C6 |
:1005100081E085B98EE38AB9579A87EF8BB984B7A2 |
:10052000877F84BF80916000886180936000109213 |
:10053000600080ED97E09093C0038093BF0310921A |
:100540001304109212041092100710920F071092C9 |
:10055000150410921404109217041092160480913E |
:1005600000018A3011F4289801C0289A0E94D70B04 |
:100570000E948E070E94F4150E94DE0C0E94FC145B |
:10058000789410920E0683E480930F0687E08093A0 |
:10059000100687E690E09F938F9383E490E09F930B |
:1005A0008F931F921F92809100016AE00E946B3C22 |
:1005B000892F99279F938F93809100010E946B3C14 |
:1005C00099279F938F9380E790E09F938F931F923B |
:1005D0000E9496088DB79EB70D960FB6F8949EBFF1 |
:1005E0000FBE8DBF84EA90E09F938F931F920E946D |
:1005F0009608299A0F900F900F9001E010E0D80113 |
:100600000E94DB3C802D843461F185EC90E09F9367 |
:100610008F931F920E9496080E94BE16C0E00F9012 |
:100620000F900F90C23039F0C33019F40E94E117D7 |
:1006300004C0C43010F00E944F1747E467E377E02E |
:100640008C2F0E944002CF5FC63060F3A2E0B0E082 |
:1006500083E0082E0E94E33C84E4D801082E0E9427 |
:10066000E33CA4E0B0E00E94DB3C802D853050F0FC |
:1006700084EF90E09F938F931F920E9496080F90B3 |
:100680000F900F900E94580247E467E377E00E94C2 |
:100690002E020E94580299279F938F938DE091E03C |
:1006A0009F938F931F920E94960880913F070F900F |
:1006B0000F900F900F900F9080FF20C088E291E084 |
:1006C0009F938F931F920E94960888EE93E00E945A |
:1006D000CE0B7C010E94E40C0F900F900F90C7018D |
:1006E0000E94FD0B8823D9F385E491E09F938F93BB |
:1006F0001F920E9496080F900F900F900E94E2198F |
:10070000809100018A3011F4289801C0289A80ED68 |
:1007100097E09093C0038093BF0388EE93E090939B |
:1007200009068093080685E5809303068AE491E034 |
:100730009F938F931F920E94960880913F070F907E |
:100740000F900F9082FF03C088E591E002C084E61D |
:1007500091E09F938F931F920E9496080F900F90A5 |
:100760000F908CE691E09F938F931F920E949608C2 |
:100770000E94041088E893E1909387038093860396 |
:100780000F900F900F908091C303882309F462C0EB |
:100790001092C3030E94BD240E948E21209100016B |
:1007A0002A3011F4289801C0289A809101038823E7 |
:1007B00021F081508093010310C08093A2038093A5 |
:1007C000A3031092F8031092F7031092F60310920D |
:1007D000F5031092F4031092F30380911804882318 |
:1007E00029F0809118048150809318048091860329 |
:1007F00090918703892B01F585E090E09093870322 |
:10080000809386030E94161580910403909105033E |
:100810008F5F9F4FF9F4809111048823D9F080E114 |
:1008200097E29093C0038093BF0380E890E0909399 |
:100830000503809304030EC0809186039091870383 |
:10084000019790938703809386032A3011F42898A8 |
:1008500001C0289A0E94AC070E947806C7010E9436 |
:10086000FD0B882309F48FCF80914F07282F332762 |
:1008700080910E0390910F03821793079CF480914F |
:100880000403909105038F5F9F4F61F480E797E128 |
:100890009093C0038093BF0380E093E0909305039F |
:1008A0008093040384E690E00E94CE0B7C016BCF22 |
:1008B0001F920F920FB60F9211248F939F93EF9375 |
:1008C000FF93809103038823E1F48091B503909115 |
:1008D000B60301969093B6038093B503FC01EB52E7 |
:1008E000FB4FE081ED3019F08639910539F4109213 |
:1008F000B6031092B50381E080930303E093C60032 |
:1009000004C01092B6031092B503FF91EF919F912E |
:100910008F910F900FBE0F901F9018951F920F92FE |
:100920000FB60F9211242F933F934F935F938F93A2 |
:100930009F93AF93BF93EF93FF9390E08091C60096 |
:100940008093B0035091BB03563910F09093BC03D1 |
:100950008091B0038D3009F05FC08091BC0382307C |
:1009600009F05AC09093BC03852F9927885E994F50 |
:10097000FC01329740812091B7033091B803241BCA |
:100980003109DC0111978C91281B3109C9019F7035 |
:100990009093B8038093B70346E0969587954A9560 |
:1009A000E1F7982F935C9093B9032F733070235C19 |
:1009B0002093BA038081981729F48C91281711F499 |
:1009C00091E006C090E08091AD038F5F8093AD030E |
:1009D0008091AF03882309F06EC0992309F46BC09E |
:1009E00081E08093AF035093AC03E52FFF27E85ECF |
:1009F000F94F8DE0808380911A06823509F05BC043 |
:100A000088E190E02CE00FB6F894A8958093600000 |
:100A10000FBE209360004FC02091BC03822F992706 |
:100A200081309105F9F0823091051CF4892B21F079 |
:100A300040C0029711F13DC08091B003833239F478 |
:100A40008091AF03882319F481E08093BC038091E7 |
:100A5000B0038093180681E08093BB038091B003BC |
:100A6000992722C02F5F2093BC03E52FFF27E85E64 |
:100A7000F94F8091B003808309C0E52FFF27E85E1E |
:100A8000F94F8091B0038083563920F45F5F509313 |
:100A9000BB0302C01092BC032091B0038091B70346 |
:100AA0009091B803820F911D9093B8038093B70380 |
:100AB00002C01092BC03FF91EF91BF91AF919F9143 |
:100AC0008F915F914F913F912F910F900FBE0F909B |
:100AD0001F901895AC01A0E0B0E09D01A817B907E0 |
:100AE00048F4E5EDF4E08191280F311D1196A4172B |
:100AF000B507C8F33F70FD01EB52FB4FC90156E04B |
:100B0000969587955A95E1F7835C80831196FD0150 |
:100B1000EB52FB4F2F733070822F835C8083AA527D |
:100B2000BB4F8DE08C93109203038091D50480938A |
:100B3000C60008951F93CF93DF93382FEA01722FD9 |
:100B400010E083E28093D5046093D6043093D704F9 |
:100B5000A3E0B0E0772309F458C0772311F4972F6E |
:100B600007C0FE01E10FF11D1F5F9081715011F46C |
:100B7000472F0EC0FE01E10FF11D1F5F4081715034 |
:100B800039F0FE01E10FF11D1F5F6081715001C05E |
:100B9000672FFD01EB52FB4F892F86958695835C6D |
:100BA00080831196FD01EB52FB4F892F99278370AB |
:100BB000907024E0880F991F2A95E1F755279A0134 |
:100BC00094E0369527959A95E1F7822B835C808394 |
:100BD0001196FD01EB52FB4F4F705070440F551FA3 |
:100BE000440F551F862F992726E0969587952A95BD |
:100BF000E1F7842B835C80831196FD01EB52FB4F60 |
:100C00006F73635C60831196A5CFCD010E946A0566 |
:100C1000DF91CF911F9108951F93CF93DF93EC0144 |
:100C200010E0662309F460C0A22FBB271297E42FBF |
:100C3000FF27E85EF94F30813D534F5FE42FFF27D8 |
:100C4000E85EF94F50815D534F5FE42FFF27E85E68 |
:100C5000F94F70817D534F5FE42FFF27E85EF94F16 |
:100C6000E081ED534F5F842F9927A817B907E4F16E |
:100C7000832F9927880F991F880F991F352F329539 |
:100C80003F70382B852F99278F709070F4E0880F74 |
:100C9000991FFA95E1F7572F56955695582B872FA0 |
:100CA00099278370907076E0880F991F7A95E1F705 |
:100CB0008E2B61506F3FC1F0FE01E10FF11D3083BB |
:100CC0001F5F61506F3F81F0FE01E10FF11D508306 |
:100CD0001F5F61506F3F41F0FE01E10FF11D808306 |
:100CE0001F5F662309F0A3CFDF91CF911F91089575 |
:100CF000CF93DF93CDB7DEB722970FB6F894DEBF60 |
:100D00000FBECDBF8091AF03882309F4ECC08FEFF5 |
:100D10008093010380911A0699278B36910509F477 |
:100D200067C08C36910594F48336910561F1843661 |
:100D3000910524F481369105D1F0D3C08736910511 |
:100D400009F463C08836910589F1CBC081379105DC |
:100D500009F45FC0813791050CF47DC0843791059B |
:100D600009F43FC08637910509F44BC0BAC0209101 |
:100D7000AC0343E062E0CE0101960E940C0689813B |
:100D800080930203AEC02091AC0343E06BE083E0AC |
:100D900096E00E940C068091E70390910506892B4E |
:100DA0008093E70381E08093B2039BC02091AC0362 |
:100DB00043E062E0CE0101960E940C068091E703B9 |
:100DC0009981892B8093E7038A818F3F21F481E009 |
:100DD0008093A90302C01092A90381E08093B3031A |
:100DE00080C02091AC0343E064E085EA93E006C054 |
:100DF0002091AC0343E0642F82EA93E00E940C064A |
:100E000070C081E08093B1036CC081E08093B40333 |
:100E100068C02091AC0343E062E0CE0101960E94DD |
:100E20000C0689818F3F61F0863010F085E0898360 |
:100E300047E467E377E089810E942E02898102C03E |
:100E40000E94580227E447E357E06091D404855B91 |
:100E50000E949A0546C02091AC0343E067E487E313 |
:100E600097E00E940C0680911A0647E467E377E05A |
:100E70008B560E944002A2E0B0E080911A068B5689 |
:100E8000082E0E94E33C809162079927AA27BB277E |
:100E9000BC01CD0124EC39E040E050E00E944C3C24 |
:100EA000DC01CB018093820390938303A09384039E |
:100EB000B0938503809163079927AA27BB27BC01BC |
:100EC000CD010E944C3CDC01CB0180937E039093CA |
:100ED0007F03A0938003B09381030E9458020E9475 |
:100EE00072181092AF0322960FB6F894DEBF0FBEB1 |
:100EF000CDBFDF91CF910895CF93C82F8A3019F4D9 |
:100F00008DE00E947C078091C00085FFFCCFC093DC |
:100F1000C60080E090E0CF910895089588E1809325 |
:100F2000C1008091C00082608093C0008091C100A8 |
:100F300080688093C1008091C10080648093C1006B |
:100F40008AE28093C40088EC90E00E94CE0B9093DC |
:100F5000020680930106089580910303882309F413 |
:100F60008AC08091B403882371F0809103038823A1 |
:100F700051F02BE043E056E06091D40487E40E94F6 |
:100F80009A051092B40380910106909102060E9486 |
:100F9000FD0B882321F48091B2038823B1F0809166 |
:100FA0000303882391F022E44EEA56E06091D404D2 |
:100FB00084E40E949A051092B20384EF91E00E94AB |
:100FC000CE0B9093020680930106609102036F3F5F |
:100FD00091F0862F992734E0880F991F3A95E1F711 |
:100FE0008F5F9E4F605D20E1AC0181E40E949A0515 |
:100FF0008FEF809302038091B303882351F1809196 |
:101000000303882331F10E940D101092B303309135 |
:10101000AA03832F8F5F8093AA03843021F060910D |
:10102000A903662359F026E14BE057E060E084E332 |
:101030000E949A058FEF8093AA030BC024E1829F40 |
:10104000C0011124805F9C4FAC01832F8F5C0E94F4 |
:101050009A058091B103882371F08091030388235E |
:1010600051F02AE04EE056E06091D40486E50E94FB |
:101070009A051092B1030895982F8091F00681305F |
:1010800069F48091E803E82FFF27E05FFC4F90832D |
:101090008F5F8093E80321E030E005C0892F0E9434 |
:1010A0007C07282F3327C90108950F931F93CF93EF |
:1010B000DF938C01EB01672B39F0F80181918F01EF |
:1010C0000E943C082197C9F7DF91CF911F910F91A2 |
:1010D00008950F931F93CF93DF938C01EB01672B40 |
:1010E00041F0F8010F5F1F4F84910E943C08219747 |
:1010F000C1F7DF91CF911F910F910895CF93C82F22 |
:10110000181634F480E20E943C08C1501C16D4F337 |
:10111000CF910895CF93C82F181634F480E30E941E |
:101120003C08C1501C16D4F3CF9108952F923F92E2 |
:101130004F925F926F927F928F929F92AF92BF92E7 |
:10114000CF92DF92EF92FF920F931F93CF93DF9393 |
:10115000CDB7DEB7E0970FB6F894DEBF0FBECDBFB8 |
:1011600026968FAD26972896EEADFFAD28971CA644 |
:101170001DA61EA61FA68093F006A8E46A2E712C59 |
:101180006C0E7D1E5F01C50105C0053239F0089463 |
:10119000A11CB11CF50104910023B9F7B501681B2E |
:1011A000790B11F00E946908002309F430C20894F9 |
:1011B000A11CB11C552458AA252C1FEF59A6F501D6 |
:1011C0000894A11CB11C0491053721F0802F806286 |
:1011D0008837F1F450FE0EC0F30124E030E0620ED7 |
:1011E000731E80819181A281B3818CA79DA7AEA738 |
:1011F000BFA70EC0F301A2E0B0E06A0E7B1E8081A3 |
:1012000091819C01442755272CA73DA74EA75FA796 |
:10121000003221F489A5882391F61BC0033211F412 |
:1012200038E081C00A3211F00D3289F40A3251F4EB |
:10123000F30142E050E0640E751E208022200CF085 |
:10124000BECF219450E1552A8FED5822B8CF0B32F2 |
:1012500011F409A7B4CF0E32C1F5F5010894A11C11 |
:10126000B11C04910A3279F4F301A2E0B0E06A0EF5 |
:101270007B1E60817181BFEF6F3F7B0714F46FEFBE |
:101280007FEF162F9CCF60E070E0802F80538A3074 |
:10129000A0F4CB01F3E0880F991FFA95E1F7860FD0 |
:1012A000971F680F791F600F711D60537040F50123 |
:1012B0000894A11CB11C0491E8CFEFEF6F3F7E07AB |
:1012C00014F46FEF7FEF162F7FCF003329F454FC17 |
:1012D00076CFF0E25F2A73CF802F81538930D8F424 |
:1012E00060E070E0CB01E3E0880F991FEA95E1F739 |
:1012F000860F971F680F791F600F711D6053704034 |
:10130000F5010894A11CB11C0491802F80538A30F0 |
:1013100048F3262E59CF083619F424E0522A4FCF2D |
:101320000C3619F431E0532A4ACF033661F44E01EA |
:101330000894811C911CF30142E050E0640E751E7C |
:10134000808189831BC1043421F0043611F00936F1 |
:10135000B1F5043411F451E0552A50FE0AC0F301EE |
:1013600084E090E0680E791E2081318142815381B2 |
:101370000CC0F30142E050E0640E751E8081918143 |
:101380009C01442737FD4095542F2CA73DA74EA71D |
:101390005FA78CA59DA5AEA5BFA5B7FF0DC0B09555 |
:1013A000A095909581959F4FAF4FBF4F8CA79DA75C |
:1013B000AEA7BFA78DE289A77AE0472E7BC00F3486 |
:1013C00011F00F3639F40F3411F491E0592A68E026 |
:1013D000462E6FC00037A1F4F301A2E0B0E06A0E20 |
:1013E0007B1E808191819C01442755272CA73DA716 |
:1013F0004EA75FA750E1452E30E4532A08E759C0B5 |
:101400000337C1F5F30142E050E0640E751E8080A1 |
:1014100091808114910489F44E010894811C911CDF |
:1014200088E289838EE6F401818385E78B838CE6ED |
:101430008C838D8389E28E831F8217FD13C0812FD9 |
:10144000992787FD9095AC0160E070E0C4010E948F |
:10145000D73A009729F0D82ED8181D150CF090C057 |
:10146000D12E8EC0F40101900020E9F73197DE2ED5 |
:10147000D81886C0053511F0053739F4053511F453 |
:10148000F1E05F2A4AE0442E14C0083519F008370D |
:1014900009F06CC030E1432E53FE0BC02CA53DA5D6 |
:1014A0004EA55FA5211531054105510511F030E428 |
:1014B000532A19A618AB17FD02C04FED542229E29A |
:1014C000822E912C8C0E9D1E8CA59DA5AEA5BFA530 |
:1014D0000097A105B10521F498A9992309F43FC00B |
:1014E000C42CDD24EE24FF2433242CA53DA54EA5D9 |
:1014F0005FA52C153D054E055F0510F091E0392ED6 |
:101500006CA57DA58EA59FA5A70196010E949E3C76 |
:10151000DC01CB01182F8A3010F4105D04C0195A79 |
:10152000083509F41F7DD4011E934D016CA57DA5DE |
:101530008EA59FA5A70196010E949E3C2CA73DA7C2 |
:101540004EA75FA7332081F6B8E04B1641F453FE57 |
:1015500006C0103321F080E3F40182934F01CE01E5 |
:101560000196D82ED818F8E2DF0E0BC0002309F43C |
:101570004EC04E010894811C911C098381E0D82E35 |
:1015800019A61D2DC8A8CD18C7FCCC2489A5882371 |
:1015900011F01F5F02C056FC1E5F1C0DE52CFF24DE |
:1015A000C70180739070892B21F4822D811B0E94CA |
:1015B0007E0889A5882329F061E070E0CE01899634 |
:1015C00009C0E6FE09C080E38AA70BA762E070E0CD |
:1015D000CE018A960E945508C7018073907080974B |
:1015E00021F4822D811B0E948A088C2D0E948A087A |
:1015F0008D2D992787FD9095BC01C4010E94550847 |
:10160000E4FEC1CD822D811B0E947E08BCCDE096F8 |
:101610000FB6F894DEBF0FBECDBFDF91CF911F9103 |
:101620000F91FF90EF90DF90CF90BF90AF909F9081 |
:101630008F907F906F905F904F903F902F90089584 |
:101640001F920F920FB60F9211242F933F935F9327 |
:101650006F937F938F939F93AF93BF938091C603B4 |
:1016600081508093C6038F3FB9F489E08093C6030D |
:10167000809106038F5F817080930603882319F49D |
:1016800081E08093C3038091C4039091C5030196C8 |
:101690009093C5038093C4038091BF039091C003CE |
:1016A0000297C8F08091BF039091C0030197909377 |
:1016B000C0038093BF038091BF039091C00320912A |
:1016C00004033091050382239323892B11F021E039 |
:1016D00009C020E007C020E08FEF9FEF9093050343 |
:1016E0008093040380910001222331F08A3011F4A9 |
:1016F0005A9A07C0479A05C08A3011F45A9801C017 |
:10170000479880913F0783FF3BC0349B0AC080917C |
:10171000C1039091C20301969093C2038093C103C9 |
:101720002FC08091C1039091C203892B79F08091E1 |
:10173000C1039091C203805A9F4040F48091C1033D |
:101740009091C203909328048093270480912704EA |
:10175000909128042091250430912604821B930B3C |
:10176000845E9D4F68E671E00E948B3C845B9040F4 |
:1017700090932404809323041092C2031092C10317 |
:10178000BF91AF919F918F917F916F915F913F91A9 |
:101790002F910F900FBE0F901F9018952091C403AA |
:1017A0003091C503280F391FC901019608958AE0B9 |
:1017B00090E00E94CE0B9093C8038093C70382E011 |
:1017C00085BD83EA84BD17BC88E788BD96E096BDD9 |
:1017D00083EC8093B0009093B100809170008260A0 |
:1017E0008093700080916E00816080936E008AE02B |
:1017F0008093B3001092B20008952091C4033091F9 |
:10180000C503821B930B892F99278695807490704E |
:101810000895CF93DF930E94CE0BEC01CE010E947E |
:10182000FD0B8823D9F3DF91CF910895CF93DF93F8 |
:101830000E94CE0BEC0103C08FEE80937A00CE01A4 |
:101840000E94FD0B8823C1F3DF91CF9108951F9271 |
:101850000F920FB60F9211242F933F934F935F93E4 |
:101860006F937F938F939F93AF93BF93CF93DF93A8 |
:10187000EF93FF93809107038150809307038F3F7D |
:1018800009F085C083E88093B00080917003C82F71 |
:10189000DD27D093BE03C093BD0380916C07609198 |
:1018A000590780FF2AC0772788279927209161044C |
:1018B00030916204409163045091640457FF04C066 |
:1018C00021583F4F4F4F5F4FA7E0559547953795AC |
:1018D0002795AA95D1F70E944C3C97FF04C0615010 |
:1018E0007E4F8F4F9F4FF9E0959587957795679538 |
:1018F000FA95D1F7C60FD71F29C0772788279927D0 |
:101900002091610430916204409163045091640419 |
:1019100057FF04C021583F4F4F4F5F4FE7E05595A9 |
:10192000479537952795EA95D1F70E944C3C97FF4C |
:1019300004C061507E4F8F4F9F4F39E0959587953A |
:10194000779567953A95D1F7C61BD70BD093BE0311 |
:10195000C093BD0380915A0799272091BD03309110 |
:10196000BE032817390734F080915B079927821747 |
:10197000930724F49093BE038093BD038091BD032D |
:101980008093B30080915C078093070304C083E0D9 |
:101990008093B0005F98FF91EF91DF91CF91BF915D |
:1019A000AF919F918F917F916F915F914F913F91F7 |
:1019B0002F910F900FBE0F901F90189510927C00E2 |
:1019C0008FEE80937A0008950F931F93CF93DF9348 |
:1019D00003E010E0D8010E94DB3C802DC82FDD27FA |
:1019E000C531D10508F02A97C7BD84E690E00E9472 |
:1019F000160C80910803909109038255934010F4CE |
:101A0000C0E0D0E0CA3FD105C0F4C7BD82E390E09A |
:101A10000E94160C80E791E09F938F931F920E9483 |
:101A2000960880910803909109030F900F900F90F2 |
:101A30008458934010F02196E5CFD8010C2E0E94D7 |
:101A4000E33CC093FE068CE291E00E94160CDF910D |
:101A5000CF911F910F9108951F920F920FB60F9281 |
:101A60001124EF92FF920F931F932F933F934F9365 |
:101A70005F936F937F938F939F93AF93BF93CF9316 |
:101A8000DF93EF93FF9310927A008091E003682F29 |
:101A900077278F5F8093E0036530710509F48EC06E |
:101AA00066307105BCF46230710509F44AC06330D8 |
:101AB00071053CF46115710531F161307105C1F1B9 |
:101AC0007DC26330710509F446C06430710509F4C4 |
:101AD0005DC074C26830710509F4C3C06930710516 |
:101AE0004CF46630710509F482C06730710509F461 |
:101AF0009BC064C26930710509F4D0C06A307105B9 |
:101B000009F4DCC15BC280917800909179009093D8 |
:101B1000E2038093E10381E08093DF038091C903B6 |
:101B20009091CA0301969093CA038093C9034AC255 |
:101B300080917800909179009093E4038093E3037F |
:101B40008EC080917800909179009093E603809305 |
:101B5000E50384E0B0C180910E0390910F039C01D6 |
:101B6000220F331F280F391F809178009091790040 |
:101B70000E94773C260F371F369527953695279577 |
:101B800030930F0320930E0386E095C180916B0480 |
:101B900090916C042091780030917900821B930B16 |
:101BA0009093F2068093F1068091F1069091F206EF |
:101BB0009093D8038093D70387E07DC1809178000C |
:101BC0009091790020916D0430916E04821B930BEB |
:101BD0009093FD068093FC068091FC069091FD0693 |
:101BE0009093D6038093D5031092DF03EBC18091CD |
:101BF00000012091E1033091E2038A3049F48091A1 |
:101C0000780090917900820F931F9695879506C072 |
:101C10008091780090917900820F931F9093DA035E |
:101C20008093D90381E047C1809100012091E303B3 |
:101C30003091E4038A3049F48091780090917900E2 |
:101C4000820F931F9695879506C08091780090919A |
:101C50007900820F931F9093DC038093DB0382E073 |
:101C60002AC1809100012091E5033091E6038A307A |
:101C700049F48091780090917900820F931F969596 |
:101C8000879506C08091780090917900820F931F0C |
:101C90009093DE038093DD0385E00DC18091780091 |
:101CA00090917900AA2797FDA095BA2FBC01CD018C |
:101CB0000E948A3B7B018C018091670490916804AB |
:101CC000A0916904B0916A049C01AD01C801B701FB |
:101CD0000E94E43ADC01CB01BC01CD010E946D3BC6 |
:101CE000DC01CB019093D4038093D3038091F10660 |
:101CF0009091F2068091F1069091F20697FF03C051 |
:101D0000909581959F4F97FD0396AC01559547950A |
:101D1000559547958091FC069091FD068091FC06B3 |
:101D20009091FD0697FF03C0909581959F4F9C0170 |
:101D300097FF02C02D5F3F4F359527953595279525 |
:101D4000240F351F8091D3039091D403820F931FEA |
:101D50009093D4038093D3038091D3039091D403C1 |
:101D6000029724F18091670490916804A09169041E |
:101D7000B0916A0420E030E048E454E4BC01CD01B5 |
:101D80000E94943B88230CF044C08091670490919A |
:101D90006804A0916904B0916A042AE037ED43EA2F |
:101DA0005CE3BC01CD010E94E53A29C08091D303D8 |
:101DB0009091D4038F5F9F4F64F580916704909159 |
:101DC0006804A0916904B0916A0420E030E046E123 |
:101DD00054E4BC01CD010E94973B1816D4F48091C5 |
:101DE000670490916804A0916904B0916A042AE0A4 |
:101DF00037ED43EA5CE3BC01CD010E94E43ADC012B |
:101E0000CB018093670490936804A0936904B09316 |
:101E10006A0481E08093CD038091780090917900ED |
:101E20009093F4068093F3068091D3039091D403AA |
:101E30009C01442737FD4095542F809129049091AF |
:101E40002A04A0912B04B0912C04820F931FA41F8D |
:101E5000B51F8093290490932A04A0932B04B09378 |
:101E60002C042091290430912A0440912B04509194 |
:101E70002C0457FF04C021503C4F4F4F5F4F7AE076 |
:101E800055954795379527957A95D1F780912904EF |
:101E900090912A04A0912B04B0912C04821B930BE7 |
:101EA000A40BB50B8093290490932A04A0932B04D0 |
:101EB000B0932C0483E08093DF0384C080910107FA |
:101EC000909102072091780030917900820F931F42 |
:101ED00090930207809301078091F9068F5F8093AA |
:101EE000F9068091F906853008F468C08091780081 |
:101EF0009091790090930903809308031092F9065A |
:101F00008091F5069091F606209101073091020725 |
:101F1000821B930B20910F0430911004821B930BB2 |
:101F20009093CC038093CB0380910107909102079B |
:101F3000EC01EE27D7FDE095FE2F20910A033091AA |
:101F40000B0340910C0350910D03DA01C901880F76 |
:101F5000991FAA1FBB1F820F931FA41FB51FC80F75 |
:101F6000D91FEA1FFB1FF7FF03C02396E11DF11DD8 |
:101F700082E0F595E795D795C7958A95D1F7C093F7 |
:101F80000A03D0930B03E0930C03F0930D038091AD |
:101F90000A0390910B03A0910C03B0910D039C01D7 |
:101FA0008091F5069091F606821B930B9093100496 |
:101FB00080930F0410920207109201071092DF0322 |
:101FC0001092E0038091DF0380937C008091E00316 |
:101FD000882319F08FEE80937A00FF91EF91DF91C3 |
:101FE000CF91BF91AF919F918F917F916F915F91B1 |
:101FF0004F913F912F911F910F91FF90EF900F9074 |
:102000000FBE0F901F90189590E2E0E1F3E08FE48F |
:102010009193815087FFFCCF08951F93CF93DF9357 |
:102020008091E70380FF0FC08091EB03882311F0BC |
:10203000815002C080916A038093EB030E940410D8 |
:102040008FEF8093AA038091E70381FF0AC08091FC |
:10205000EB038F5F8093EB030E9404108FEF80935C |
:10206000AA038091E703992780FF04C081FF02C083 |
:102070001092EB0381E18093E8038091EB039927B1 |
:102080009F938F9382E791E09F938F9311E01F932B |
:102090000E9496080F900F900F900F900F908091D4 |
:1020A000EB03C82FDD27C530D10509F45DC2C6306A |
:1020B000D105ACF4C230D10509F4E2C0C330D1057A |
:1020C00034F4209719F1219709F472C08AC4C330FF |
:1020D000D10509F443C1249709F4ABC182C4C830C7 |
:1020E000D10509F496C3C930D10544F4C630D105F1 |
:1020F00009F40BC3279709F46CC373C4C930D10525 |
:1021000009F4C9C32A9709F41AC46BC41092E803EE |
:1021100087E791E09F938F931F930E94960884E135 |
:102120008093E8030F900F900F9087E690E09F93C5 |
:102130008F9383E490E09F938F93DF93CF9380916D |
:1021400000016AE00E946B3C892F99279F938F932F |
:10215000809100010E946B3C99279F938F9389E89F |
:1021600091E09F938F931F930E94960888E280933B |
:10217000E8038DB79EB70D960FB6F8949EBF0FBEBD |
:102180008DBF0E94580299279F938F938EE991E00B |
:102190009F938F931F930E9496088CE38093E8038C |
:1021A0000F900F900F900F900F908BEA91E05FC00F |
:1021B00080913F0780FF49C01092E80380910F048F |
:1021C000909110049F938F938BEB91E09F938F934B |
:1021D0001F930E94960884E18093E8030F900F906C |
:1021E0000F900F900F9080910D0490910E049F938B |
:1021F0008F938AEC91E09F938F931F930E94960890 |
:1022000088E28093E8030F900F900F900F900F904B |
:1022100080910803909109039F938F9389ED91E03A |
:102220009F938F931F930E9496088CE38093E803FB |
:102230000F900F900F900F900F908091FE069927AE |
:102240009F938F9388EE91E06FC384E18093E803BE |
:1022500087EF91E09F938F931F930E94960888E2E7 |
:102260008093E8030F900F900F908EEF91E09F9373 |
:102270008F931F930E9496080F900F900F90B6C3F4 |
:102280001092E8038CE092E09F938F931F930E943B |
:10229000960884E18093E8030F900F900F9080914F |
:1022A000610490916204A0916304B0916404B7FF4B |
:1022B00004C081509C4FAF4FBF4F6AE0B595A795C2 |
:1022C000979587956A95D1F7BF93AF939F938F9317 |
:1022D00086E192E09F938F931F930E94960888E275 |
:1022E0008093E8038DB79EB707960FB6F8949EBF0C |
:1022F0000FBE8DBF8091590490915A04A0915B0448 |
:10230000B0915C04B7FF04C081509C4FAF4FBF4FEA |
:102310005AE0B595A795979587955A95D1F7BF93AC |
:10232000AF939F938F9385E292E09F938F931F9338 |
:102330000E9496088CE38093E8038DB79EB70796BA |
:102340000FB6F8949EBF0FBE8DBF80912704909169 |
:1023500028049F938F9384E392E0E6C21092E803EF |
:1023600080910F07909110079F938F9380910D0795 |
:1023700090910E079F938F9383E492E09F938F93A6 |
:102380001F930E94960884E18093E8038DB79EB75F |
:1023900007960FB6F8949EBF0FBE8DBF80911307AE |
:1023A000909114079F938F9380911107909112073A |
:1023B0009F938F9383E592E09F938F931F930E9447 |
:1023C000960888E28093E8038DB79EB707960FB60C |
:1023D000F8949EBF0FBE8DBF80911707909118078C |
:1023E0009F938F9380911507909116079F938F93DA |
:1023F00083E692E09F938F931F930E9496088CE34D |
:102400008093E8038DB79EB707960FB6F8949EBFEA |
:102410000FBE8DBF80911B0790911C079F938F93D8 |
:102420008091190790911A079F938F9383E792E009 |
:10243000CAC21092E80380913807E82FFF27EE0FF9 |
:10244000FF1FE55FF84F808191819F938F9380916B |
:102450003707E82FFF27EE0FFF1FE55FF84F80815A |
:1024600091819F938F9383E892E09F938F931F9323 |
:102470000E94960884E18093E8038DB79EB7079683 |
:102480000FB6F8949EBF0FBE8DBF80913A07E82F1C |
:10249000FF27EE0FFF1FE55FF84F808191819F932B |
:1024A0008F9380913907E82FFF27EE0FFF1FE55F1D |
:1024B000F84F808191819F938F9383E992E09F935E |
:1024C0008F931F930E94960888E28093E8038DB74C |
:1024D0009EB707960FB6F8949EBF0FBE8DBF809132 |
:1024E0003C07E82FFF27EE0FFF1FE55FF84F8081C5 |
:1024F00091819F938F9380913B07E82FFF27EE0FE9 |
:10250000FF1FE55FF84F808191819F938F9383EA4E |
:1025100092E09F938F931F930E9496088CE3809381 |
:10252000E8038DB79EB707960FB6F8949EBF0FBE0F |
:102530008DBF80913E07E82FFF27EE0FFF1FE55F5D |
:10254000F84F808191819F938F9380913D07E82F71 |
:10255000FF27EE0FFF1FE55FF84F808191819F936A |
:102560008F9383EB92E02FC21092E80383EC92E00A |
:102570009F938F931F930E949608809100010F9064 |
:102580000F900F908A3009F05AC084E18093E803DD |
:1025900080917704909178049F938F938091DD03CD |
:1025A0009091DE032091770430917804821B930B85 |
:1025B0009F938F9381ED92E09F938F931F930E943F |
:1025C000960888E28093E8038DB79EB707960FB60A |
:1025D000F8949EBF0FBE8DBF8091750490917604D4 |
:1025E0009F938F938091DB039091DC03209175047E |
:1025F00030917604821B930B9F938F9380EE92E031 |
:102600009F938F931F930E9496088CE38093E80317 |
:102610008DB79EB707960FB6F8949EBF0FBE8DBFBD |
:1026200080917304909174049F938F938091A60777 |
:102630009091A7079F938F938FEE92E0C4C184E19E |
:102640008093E803809177049091780497FD019638 |
:10265000959587959F938F938091DD039091DE03ED |
:102660002091770430917804821B930B9F938F9372 |
:102670008EEF92E09F938F931F930E94960888E2BB |
:102680008093E8038DB79EB707960FB6F8949EBF68 |
:102690000FBE8DBF809175049091760497FD0196D1 |
:1026A000959587959F938F938091DB039091DC03A1 |
:1026B0002091750430917604821B930B9F938F9326 |
:1026C0008DE093E09F938F931F930E9496088CE375 |
:1026D0008093E8038DB79EB707960FB6F8949EBF18 |
:1026E0000FBE8DBF809173049091740497FD019685 |
:1026F000959587959F938F938091A6079091A707B3 |
:102700009F938F938CE193E05EC11092E8038BE27C |
:1027100093E09F938F931F930E94960884E1809388 |
:10272000E8030F900F900F9080916D0490916E04CC |
:102730009F938F938091D5039091D6039F938F930E |
:1027400088E393E09F938F931F930E94960888E2FB |
:102750008093E8038DB79EB707960FB6F8949EBF97 |
:102760000FBE8DBF80916B0490916C049F938F93EB |
:102770008091D7039091D8039F938F9387E493E040 |
:102780009F938F931F930E9496088CE38093E80396 |
:102790008DB79EB707960FB6F8949EBF0FBE8DBF3C |
:1027A0008091670490916804A0916904B0916A04D3 |
:1027B000BC01CD010E946D3BDC01CB019F938F9347 |
:1027C00080918E0790918F079F938F9386E593E07A |
:1027D000FAC084E18093E80380910E0390910F0387 |
:1027E0009F938F9385E693E09F938F931F930E940F |
:1027F000960888E28093E8030F900F900F900F9057 |
:102800000F908091180499279F938F9384E793E00A |
:102810008BC01092E80383E893E09F938F931F93FC |
:102820000E94960884E18093E8030F900F900F9028 |
:1028300080912304909124049F938F9382E993E0E5 |
:102840009F938F931F930E94960888E28093E803DA |
:102850000F900F900F900F900F9080912704909100 |
:1028600028049F938F9381EA93E09F938F931F9304 |
:102870000E9496088CE38093E8030F900F900F90CE |
:102880000F900F9080912504909126049F938F9331 |
:1028900080EB93E049C01092E80380911F0490916F |
:1028A00020049F938F938FEB93E09F938F931F93BD |
:1028B0000E94960884E18093E8030F900F900F9098 |
:1028C0000F900F9080911D0490911E049F938F9301 |
:1028D0008BEC93E09F938F931F930E94960888E25E |
:1028E0008093E8030F900F900F900F900F908091BE |
:1028F0001B0490911C049F938F9387ED93E09F930B |
:102900008F931F930E9496088CE38093E8030F90A7 |
:102910000F900F900F900F908091190490911A04CE |
:102920009F938F9383EE93E09F938F931F930E94C7 |
:1029300096080F900F900F900F900F9057C0109225 |
:10294000E8038FEE93E09F938F931F930E94960866 |
:1029500084E18093E8030F900F900F9080917003B3 |
:1029600099279F938F9387EF93E09F938F931F9364 |
:102970000E94960888E28093E8030F900F900F90D2 |
:102980000F900F908091BD039091BE039F938F9302 |
:1029900085E094E09F938F931F930E9496088CE3A9 |
:1029A0008093E8030F900F900F900F900F908091FD |
:1029B0005B0799279F938F9380915A0799279F933D |
:1029C0008F9383E194E09F938F931F930E949608C7 |
:1029D0008DB79EB707960FB6F8949EBF0FBE8DBFFA |
:1029E00005C0815080936A031092EB031092E703B5 |
:1029F000DF91CF911F9108951092B9008AE28093E0 |
:102A0000B800089585EA8093BC0080E090E00895C6 |
:102A100084E98093BC0008951092B9008093BB00B4 |
:102A200085E88093BC0080E090E008950E9408153E |
:102A30001092EE038091BB001092ED0380E880932A |
:102A4000BC001092BD001092BA001092BB00109210 |
:102A5000B9001092B8000E94FC140E94021580E098 |
:102A60000E940C1508951F920F920FB60F92112419 |
:102A70002F933F934F935F936F937F938F939F9386 |
:102A8000AF93BF93EF93FF938091EE03282F3327EB |
:102A90008F5F8093EE032330310509F446C0243064 |
:102AA00031054CF421303105D1F0223031057CF56F |
:102AB000232B81F083C025303105E1F1253031052C |
:102AC0000CF441C026303105F1F12730310509F40D |
:102AD0005AC074C08091ED03880F8E5A51C0809106 |
:102AE000ED03282F33278F5F8093ED0321303105CD |
:102AF00009F43EC0223031051CF4232BB1F15EC035 |
:102B000022303105C1F123303105C1F157C00E9497 |
:102B100008158091ED03843018F41092EE0302C082 |
:102B20001092ED030E94021549C08091EC03880FBA |
:102B30008D5A26C08091EC03E82FFF27ED5FF84FF8 |
:102B40008091BB0080838091EC03992781309105AF |
:102B500079F0823091051CF4892B39F02FC0823036 |
:102B6000910549F0039751F029C08091810708C071 |
:102B70008091860705C080919E0702C08091A007C2 |
:102B80000E940C151BC09091EC03E92FFF27ED5F0D |
:102B9000F84F8091BB008483892F8F5F8093EC0373 |
:102BA000843010F01092EC030E9408158AE090E047 |
:102BB00090938703809386031092EE038091BC006C |
:102BC00080688093BC00FF91EF91BF91AF919F917E |
:102BD0008F917F916F915F914F913F912F910F90C6 |
:102BE0000FBE0F901F90189583EC80938100809109 |
:102BF0006F00806280936F001092740410927304CF |
:102C00001092760410927504109278041092770452 |
:102C100008951F920F920FB60F9211242F933F9396 |
:102C20004F935F936F937F938F939F93AF93BF93D4 |
:102C3000EF93FF9340918600509187008091EF03BE |
:102C40009091F003481B590B80918600909187006A |
:102C50009093F0038093EF03CA018D549440209128 |
:102C6000F1033091F203835F9A4160F4243031051F |
:102C700014F010926B0381E090E09093F203809344 |
:102C8000F1036BC02A3031050CF067C0CA018B5FBD |
:102C90009040845B914008F043C0425D5140F9018F |
:102CA000E20FF31FE55FF84F80819181BA01681B45 |
:102CB000790BCB0177FF03C0909581959F4F0697C5 |
:102CC0004CF480911804883C28F480911804865FA5 |
:102CD00080931804F901E20FF31FDF01A55FB84FDD |
:102CE0008D919C9111979C01220F331F280F391F42 |
:102CF000240F351F37FF02C02D5F3F4FC901959547 |
:102D0000879595958795EF5DF84F2D913C9111979B |
:102D1000AC01421B530B5183408311969C938E93BD |
:102D20008091F1039091F20301969093F2038093C6 |
:102D3000F103059711F45D9A01C05D988091F1034C |
:102D40009091F2038630910511F45C9A01C05C9871 |
:102D5000079711F45B9A01C05B98FF91EF91BF91C7 |
:102D6000AF919F918F917F916F915F914F913F9123 |
:102D70002F910F900FBE0F901F90189581E08093B8 |
:102D8000370782E08093380783E08093390734E087 |
:102D900030933A0765E060933B0786E080933C07F9 |
:102DA00087E080933D0798E090933E0780E480930E |
:102DB0003F078EE1809340078BEF809342075AE0F4 |
:102DC0005093430722E32093410720934507309314 |
:102DD000440730934607909347078EE08093480757 |
:102DE0008FE0809349078AEF80934A078AE18093B6 |
:102DF0004B0790E890934C0788E780934D0746E98E |
:102E000040934E078EE580934F0783E280935007EF |
:102E100084E1809351071092520780E28093530718 |
:102E20009093540710925507109256071092570727 |
:102E300010926707109268071092690710926A074C |
:102E400094E69093580788E28093590710926C0794 |
:102E500020935A0740935B0760935C0720935D07BC |
:102E60008AE580935E0720935F0710926B0790932B |
:102E700060075093610790936207909363072093D4 |
:102E800064073093650790936607A1E7B7E0E8E829 |
:102E9000F3E08CE001900D928150E1F7089581E01C |
:102EA0008093370792E09093380783E08093390747 |
:102EB00044E040933A0755E050933B0786E0809307 |
:102EC0003C0787E080933D0788E080933E0780E4DD |
:102ED00080933F078EE1809340078BEF80934207FA |
:102EE0003AE03093430722E32093410720934507BC |
:102EF0009093440740934607109247073093480742 |
:102F00008FE0809349078AEF80934A078AE1809394 |
:102F10004B0780E880934C078FEA80934D0780939E |
:102F20004E078EE580934F0783E28093500784E13C |
:102F3000809351071092520780E28093530780E5F7 |
:102F40008093540710925507109256071092570716 |
:102F500010926707109268071092690710926A072B |
:102F600094E69093580788E28093590710926C0773 |
:102F700020935A0786E980935B0750935C07209360 |
:102F80005D078AE580935E0720935F0710926B07C9 |
:102F90009093600730936107909362079093630763 |
:102FA00090936407409365078BE480936607A1E7DD |
:102FB000B7E0EFE8F3E08CE001900D928150E1F78B |
:102FC000089581E08093370752E05093380743E03B |
:102FD0004093390774E070933A0765E060933B07CC |
:102FE00086E080933C0787E080933D0798E09093CC |
:102FF0003E0780EC80933F078EE1809340078BEF84 |
:10300000809342073AE03093430722E3209341073D |
:103010002093450750934407409346071092470773 |
:10302000909348078FE0809349078AEF80934A077F |
:103030008AE180934B0780E880934C0788EC80936B |
:103040004D078FEA80934E078EE580934F0783E20A |
:103050008093500784E18093510710925207309378 |
:10306000530780E580935407109255071092560736 |
:10307000109257071092670710926807109269071D |
:1030800010926A0794E69093580788E28093590754 |
:1030900010926C0720935A0786E980935B07609330 |
:1030A0005C0720935D078AE580935E0720935F07A6 |
:1030B00010926B07909360073093610790936207BB |
:1030C0009093630790936407709365072093660756 |
:1030D000A1E7B7E0E7E9F3E08CE001900D928150C1 |
:1030E000E1F70895CF93C82FC150CF3F81F0809171 |
:1030F0001104882361F484E690E09093C0038093E8 |
:10310000BF038AEF90E00E94090CC15080F7CF9175 |
:10311000089510927A008091DD039091DE039093E0 |
:103120008807809387078091DB039091DC0390935D |
:10313000800780937F078091D9039091DA03909361 |
:10314000A7078093A6078091D5039091D603AA275D |
:1031500097FDA095BA2FBC01CD012CE030E040E0F6 |
:1031600050E00E944C3CDC01CB019093A40780937B |
:10317000A3078091D7039091D803AA2797FDA09524 |
:10318000BA2FBC01CD010E944C3CDC01CB019093D5 |
:10319000AE078093AD078091D3039091D4039093B1 |
:1031A0008F0780938E078FEE80937A0080913B0784 |
:1031B000E82FFF27EE0FFF1FE55FF84F8081918119 |
:1031C00082599F4F20911F043091200428173907FE |
:1031D0001CF42F5F3F4F0CC08081918182599F4F1B |
:1031E000821793074CF42115310531F021503040FE |
:1031F0003093200420931F0480913C07E82FFF2781 |
:10320000EE0FFF1FE55FF84F8081918182599F4F3C |
:1032100020911D0430911E04281739071CF42F5FDC |
:103220003F4F0CC08081918182599F4F8217930735 |
:103230004CF42115310531F02150304030931E04FB |
:1032400020931D0480913D07E82FFF27EE0FFF1FFD |
:10325000E55FF84F8081918182599F4F20911B0437 |
:1032600030911C04281739071CF42F5F3F4F0CC006 |
:103270008081918182599F4F821793074CF42115C9 |
:10328000310531F02150304030931C0420931B0451 |
:1032900080913E07E82FFF27EE0FFF1FE55FF84FF5 |
:1032A0008081918182599F4F2091190430911A0495 |
:1032B000281739071CF42F5F3F4F0CC08081918184 |
:1032C00082599F4F821793074CF42115310531F035 |
:1032D0002150304030931A042093190480911F0428 |
:1032E0009091200497FF05C01092200410921F04B3 |
:1032F0000AC08F3F910539F034F08FEF90E0909342 |
:10330000200480931F0480911D0490911E0497FF58 |
:1033100005C010921E0410921D040AC08F3F910533 |
:1033200039F034F08FEF90E090931E0480931D04E9 |
:1033300080911B0490911C0497FF05C010921C04FF |
:1033400010921B040AC08F3F910539F034F08FEFC3 |
:1033500090E090931C0480931B0480911904909139 |
:103360001A0497FF05C010921A04109219040AC09B |
:103370008F3F910539F034F08FEF90E090931A046D |
:1033800080931904809162079927AA27BB27BC0163 |
:10339000CD0124EC39E040E050E00E944C3CDC01DF |
:1033A000CB018093820390938303A0938403B09313 |
:1033B000850380937E0390937F03A0938003B09353 |
:1033C0008103089510926E0410926D0410926C04A3 |
:1033D00010926B0480E090E0A0E0B0E0809367047E |
:1033E00090936804A0936904B0936A0410927804DF |
:1033F000109277041092760410927504109274045F |
:10340000109273041092FA031092F9030E94891823 |
:1034100084E690E00E94160C0E94891880913F0774 |
:1034200080FF10C08091080390910903875B93404F |
:1034300038F480910803909109038E5E924010F455 |
:103440000E94E40C8091DD039091DE039093780458 |
:10345000809377048091DB039091DC039093760452 |
:10346000809375048091D9039091DA03909374044A |
:103470008093730480917504909176049093720404 |
:1034800080937104809177049091780490937004F4 |
:1034900080936F0444E050E0DA010E94DB3C802D11 |
:1034A000853078F18091AD079091AE078091AD079E |
:1034B0009091AE0797FF03C0909581959F4F6CE068 |
:1034C00070E00E948B3C70936C0460936B0480915D |
:1034D000A3079091A4078091A3079091A40797FF59 |
:1034E00003C0909581959F4F6CE070E00E948B3CEB |
:1034F00070936E0460936D048091F3069091F406CE |
:1035000034C0DA010E94DB3C802D9927982F882750 |
:10351000DA0111960E94DB3C202D820F911D9093C1 |
:103520006E0480936D04DA0112960E94DB3C802DBC |
:103530009927982F8827DA0113960E94DB3C202DCB |
:10354000820F911D90936C0480936B04DA011496A2 |
:103550000E94DB3C802D9927982F8827DA01159649 |
:103560000E94DB3C202D820F911DAA2797FDA0957C |
:10357000BA2FBC01CD010E948A3BDC01CB018093B4 |
:10358000670490936804A0936904B0936A0410924E |
:103590004104109242041092430410924404109289 |
:1035A0003D0410923E0410923F0410924004109289 |
:1035B000390410923A0410923B0410923C04109289 |
:1035C0003504109236041092370410923804109289 |
:1035D0003104109232041092330410923404109289 |
:1035E0008807109287071092800710927F07109229 |
:1035F000A7071092A60780910A0390910B03A09150 |
:103600000C03B0910D039093F6068093F50610928B |
:10361000CC031092CB031092290410922A0410922A |
:103620002B0410922C0480912704909128049093ED |
:103630002604809325040E94AD3A82E390E09093A3 |
:10364000C0038093BF03809162079927AA27BB27F5 |
:10365000BC01CD0124EC39E040E050E00E944C3C3C |
:10366000DC01CB018093820390938303A0938403B6 |
:10367000B0938503809163079927AA27BB27BC01D4 |
:10368000CD010E944C3CDC01CB0180937E039093E2 |
:103690007F03A0938003B093810310926D03109277 |
:1036A0006C030895AF92BF92CF92DF92EF92FF9298 |
:1036B0000F931F93CF93DF938091730490917404C1 |
:1036C0002091D9033091DA03821B930B9093A707C3 |
:1036D0008093A6078091DB039091DC032091750411 |
:1036E00030917604821B930B9093800780937F0721 |
:1036F0008091DD039091DE0320917704309178046E |
:10370000821B930B90938807809387078091A30770 |
:103710009091A4077C010027F7FC0095102F809161 |
:10372000D5039091D603AA2797FDA095BA2FBC0187 |
:10373000CD012CE030E040E050E00E944C3CDC0148 |
:10374000CB01E80EF91E0A1F1B1F17FF05C00894C6 |
:10375000E11CF11C011D111D15950795F794E794C7 |
:10376000F092A407E092A3078091AD079091AE0775 |
:103770007C010027F7FC0095102F8091D7039091D2 |
:10378000D803AA2797FDA095BA2FBC01CD012CE044 |
:1037900030E040E050E00E944C3CDC01CB01E80E00 |
:1037A000F91E0A1F1B1F17FF05C00894E11CF11C1E |
:1037B000011D111D15950795F794E794F092AE073A |
:1037C000E092AD0780918E0790918F079C0144276E |
:1037D00037FD4095542F8091D3039091D403AA27AD |
:1037E00097FDA095BA2F280F391F4A1F5B1F57FF5F |
:1037F00004C02F5F3F4F4F4F5F4F5595479537950B |
:10380000279530938F0720938E078091D503909151 |
:10381000D6036CE070E0869F9001879F300D969FE5 |
:10382000300D1124C9019C01442737FD4095542FC8 |
:103830008091510490915204A0915304B09154048A |
:10384000820F931FA41FB51F8093510490935204BD |
:10385000A0935304B09354048091D7039091D8035C |
:10386000869F9001879F300D969F300D1124C901CE |
:103870009C01442737FD4095542F80914D04909131 |
:103880004E04A0914F04B0915004820F931FA41FC7 |
:10389000B51F80934D0490934E04A0934F04B093B2 |
:1038A00050048091490490914A04A0914B04B09136 |
:1038B0004C04BC01CD010E948A3B5B016C018091EC |
:1038C000F3069091F406AA2797FDA095BA2FBC01A4 |
:1038D000CD010E948A3B7B018C018091670490910D |
:1038E0006804A0916904B0916A049C01AD01C8010B |
:1038F000B7010E94E43ADC01CB019C01AD01C60195 |
:10390000B5010E94E53ADC01CB01BC01CD010E946A |
:103910006D3BDC01CB018093490490934A04A09352 |
:103920004B04B0934C048091A6079091A7079C018B |
:10393000442737FD4095542F8091310490913204F3 |
:10394000A0913304B0913404820F931FA41FB51FBC |
:103950008093310490933204A0933304B0933404E1 |
:103960008091A6079091A7079C01442737FD4095B9 |
:10397000542F80912D0490912E04A0912F04B0918A |
:103980003004820F931FA41FB51F80932D049093C2 |
:103990002E04A0932F04B0933004A0900804AA2012 |
:1039A00009F0A2C080910704882309F09DC080918E |
:1039B0003F0786FF99C0A0914104B0914204C09195 |
:1039C0004304D0914404D7FF04C0A150B04FCF4F5F |
:1039D000DF4F3CE0D595C795B795A7953A95D1F7B8 |
:1039E0008091A6079091A7079C01442737FD409539 |
:1039F000542FBD01CE010E944C3CDC01CB01209133 |
:103A0000FA03E22EFF2400271127BC01CD01A801F3 |
:103A100097010E944C3CDC01CB0180937904909388 |
:103A20007A04A0937B04B0937C04B7FF04C0815058 |
:103A3000984FAF4FBF4F2BE0B595A79597958795BA |
:103A40002A95D1F78093790490937A04A0937B040C |
:103A5000B0937C04A0913904B0913A04C0913B0426 |
:103A6000D0913C04D7FF04C0A150B04FCF4FDF4FDF |
:103A70008CE0D595C795B795A7958A95D1F7809194 |
:103A8000A6079091A7079C01442737FD4095542F26 |
:103A9000BD01CE010E944C3CDC01CB01BC01CD013B |
:103AA000A80197010E944C3CDC01CB0180937D046E |
:103AB00090937E04A0937F04B0938004B7FF04C06A |
:103AC0008150984FAF4FBF4F1BE0B595A795979585 |
:103AD00087951A95D1F780937D0490937E04A093E7 |
:103AE0007F04B093800410C010927D0410927E0475 |
:103AF00010927F04109280041092790410927A043C |
:103B000010927B0410927C0480917F079091800733 |
:103B10002091790430917A04820F931F909380074B |
:103B200080937F070091F903202F332744275527DF |
:103B300080917D0490917E04A0917F04B0918004D7 |
:103B4000BC01CD010E944C3C9B01AC0197FF04C01D |
:103B500021503E4F4F4F5F4FC9E0559547953795E0 |
:103B60002795CA95D1F780917F0790918007820FA2 |
:103B7000931F9093800780937F0780917F07909198 |
:103B800080079C01442737FD4095542F80913504D0 |
:103B900090913604A0913704B0913804820F931F9E |
:103BA000A41FB51F8093350490933604A093370467 |
:103BB000B093380480917F079091800720910B0487 |
:103BC00030910C04821B930B9C01442737FD4095D8 |
:103BD000542F8091390490913A04A0913B04B09104 |
:103BE0003C04820F931FA41FB51F80933904909348 |
:103BF0003A04A0933B04B0933C0480913904909123 |
:103C00003A04A0913B04B0913C04C0917E03D09152 |
:103C10007F03E0918003F0918103C817D907EA0779 |
:103C2000FB0704F580E197E2A0E0B0E08C1B9D0B60 |
:103C3000AE0BBF0B8093390490933A04A0933B04DE |
:103C4000B0933C048091390490913A04A0913B04D4 |
:103C5000B0913C048093350490933604A0933704CC |
:103C6000B093380422273327A9012C1B3D0B4E0BA0 |
:103C70005F0B8091390490913A04A0913B04B0917C |
:103C80003C0482179307A407B507E4F4C051D74258 |
:103C9000E040F040C0933904D0933A04E0933B04F1 |
:103CA000F0933C048091390490913A04A0913B0434 |
:103CB000B0913C048093350490933604A09337046C |
:103CC000B09338048091DB039091DC030F9734F4B8 |
:103CD00088E19CEF9093800780937F078091DB03BE |
:103CE0009091DC03079734F480E398EF909380077A |
:103CF00080937F07109100011A30A9F48091DB03B3 |
:103D00009091DC03835F934034F088EE93E09093CE |
:103D1000800780937F078091DB039091DC038A5FAB |
:103D20009340DCF014C08091DB039091DC03855E4E |
:103D3000974034F088EE93E09093800780937F075C |
:103D40008091DB039091DC03835F974034F080ED3A |
:103D500097E09093800780937F07809187079091E9 |
:103D6000880720917D0430917E04821B930B9093F1 |
:103D7000880780938707202F332744275527809172 |
:103D8000790490917A04A0917B04B0917C04BC01E9 |
:103D9000CD010E944C3C9B01AC0197FF04C0215017 |
:103DA0003E4F4F4F5F4FB9E0559547953795279553 |
:103DB000BA95D1F78091870790918807821B930B62 |
:103DC0009093880780938707809187079091880751 |
:103DD0009C01442737FD4095542F80913D049091DC |
:103DE0003E04A0913F04B0914004820F931FA41F92 |
:103DF000B51F80933D0490933E04A0933F04B0937D |
:103E000040048091870790918807209109043091A0 |
:103E10000A04821B930B9C01442737FD4095542FC5 |
:103E20008091410490914204A0914304B0914404D4 |
:103E3000820F931FA41FB51F8093410490934204E7 |
:103E4000A0934304B09344048091410490914204B0 |
:103E5000A0914304B0914404C0918203D0918303A4 |
:103E6000E0918403F0918503C817D907EA07FB079F |
:103E700004F580E197E2A0E0B0E08C1B9D0BAE0B57 |
:103E8000BF0B8093410490934204A0934304B093EA |
:103E900044048091410490914204A0914304B09164 |
:103EA000440480933D0490933E04A0933F04B09358 |
:103EB000400422273327A9012C1B3D0B4E0B5F0B1F |
:103EC0008091410490914204A0914304B091440434 |
:103ED00082179307A407B507E4F4C051D742E04026 |
:103EE000F040C0934104D0934204E0934304F09324 |
:103EF00044048091410490914204A0914304B09104 |
:103F0000440480933D0490933E04A0933F04B093F7 |
:103F100040048091DD039091DE030F9734F488E133 |
:103F20009CEF90938807809387078091DD039091A1 |
:103F3000DE03079734F480E398EF9093880780932B |
:103F400087071A30A9F48091DD039091DE03835F27 |
:103F5000934034F088EE93E090938807809387072E |
:103F60008091DD039091DE038A5F9340DCF014C002 |
:103F70008091DD039091DE03855E974034F088EEFA |
:103F800093E090938807809387078091DD03909159 |
:103F9000DE03835F974034F080ED97E090938807CD |
:103FA000809387078FEE80937A00809131049091FF |
:103FB0003204A0913304B09134048093450490936B |
:103FC0004604A0934704B093480480914104909123 |
:103FD0004204A0914304B0914404809361049093FF |
:103FE0006204A0936304B0936404809139049091B7 |
:103FF0003A04A0913B04B0913C04809359049093FF |
:104000005A04A0935B04B0935C0480913D049091AA |
:104010003E04A0913F04B091400480935D049093CE |
:104020005E04A0935F04B093600480913504909186 |
:104030003604A0913704B0913804809355049093CE |
:104040005604A0935704B093580480913F0787FF0C |
:104050006EC0AA2009F06BC080910704882309F084 |
:1040600066C08091870790918807893C91058CF004 |
:104070002091870730918807220F331F220F331FAB |
:104080008091870790918807820F931F80529340F9 |
:1040900017C0809187079091880788539F4FA4F499 |
:1040A0002091870730918807220F331F220F331F7B |
:1040B0008091870790918807820F931F805E9C4FA5 |
:1040C000909388078093870780917F07909180075E |
:1040D000893C91058CF020917F0730918007220F59 |
:1040E000331F220F331F80917F0790918007820F2B |
:1040F000931F8052934017C080917F079091800753 |
:1041000088539F4FA4F420917F0730918007220F9E |
:10411000331F220F331F80917F0790918007820FFA |
:10412000931F805E9C4F9093800780937F078091C0 |
:104130003B07E82FFF27EE0FFF1FE55FF84F808159 |
:10414000918182599F4F20911F043091200428179C |
:1041500039071CF42F5F3F4F0CC080819181825939 |
:104160009F4F821793074CF42115310531F02150F0 |
:1041700030403093200420931F0480913C07E82FA7 |
:10418000FF27EE0FFF1FE55FF84F80819181825975 |
:104190009F4F20911D0430911E04281739071CF4ED |
:1041A0002F5F3F4F0CC08081918182599F4F8217B2 |
:1041B00093074CF42115310531F0215030403093F4 |
:1041C0001E0420931D0480913D07E82FFF27EE0F6A |
:1041D000FF1FE55FF84F8081918182599F4F2091A9 |
:1041E0001B0430911C04281739071CF42F5F3F4F24 |
:1041F0000CC08081918182599F4F821793074CF4A4 |
:104200002115310531F02150304030931C042093AA |
:104210001B0480913E07E82FFF27EE0FFF1FE55F8D |
:10422000F84F8081918182599F4F209119043091DC |
:104230001A04281739071CF42F5F3F4F0CC08081E8 |
:10424000918182599F4F821793074CF421153105B4 |
:1042500031F02150304030931A042093190480919A |
:104260001F049091200497FF05C010922004109223 |
:104270001F040AC08F3F910539F034F08FEF90E0B2 |
:104280009093200480931F0480911D0490911E043C |
:1042900097FF05C010921E0410921D040AC08F3FA4 |
:1042A000910539F034F08FEF90E090931E048093E5 |
:1042B0001D0480911B0490911C0497FF05C010926F |
:1042C0001C0410921B040AC08F3F910539F034F092 |
:1042D0008FEF90E090931C0480931B04809119044D |
:1042E00090911A0497FF05C010921A0410921904B5 |
:1042F0000AC08F3F910539F034F08FEF90E0909332 |
:104300001A0480931904DF91CF911F910F91FF90B0 |
:10431000EF90DF90CF90BF90AF90089580911104FF |
:10432000882301F5809386078093810780939E07F9 |
:104330008093A0078091A503882311F080938107C3 |
:104340008091A603882311F0809386078091A703AC |
:10435000882311F08093A0078091A803882311F08F |
:1043600080939E078091810799279093C906809337 |
:10437000C8068091860799279093CB068093CA063A |
:104380008091A00799279093CD068093CC068091C9 |
:104390009E0799279093CF068093CE061092EE0346 |
:1043A0001092ED030E94021508951F938091420719 |
:1043B0008B3F98F08B3F19F480911F040EC08C3F07 |
:1043C00019F480911D0409C08D3F19F480911B04DC |
:1043D00004C08E3F21F4809119048093780380916A |
:1043E0007803882321F08F3F11F480937803809124 |
:1043F00041078B3F98F08B3F19F480911F040EC04A |
:104400008C3F19F480911D0409C08D3F19F48091EF |
:104410001B0404C08E3F21F480911904809379031A |
:1044200080917903882329F0843618F084E68093FC |
:104430007903809143078B3F98F08B3F19F480916B |
:104440001F040EC08C3F19F480911D0409C08D3FDC |
:1044500019F480911B0404C08E3F21F4809119044B |
:104460008093770380917703882329F0843618F0AE |
:1044700084E680937703809145078B3F98F08B3FCC |
:1044800019F480911F040EC08C3F19F480911D0413 |
:1044900009C08D3F19F480911B0404C08E3F21F4A4 |
:1044A000809119048093760380917603882321F00C |
:1044B0008F3F11F48093760380914C078B3F98F0E7 |
:1044C0008B3F19F480911F040EC08C3F19F480912A |
:1044D0001D0409C08D3F19F480911B0404C08E3F58 |
:1044E00021F48091190480937503809175038823CA |
:1044F00021F08F3F11F48093750380914D078B3F1E |
:1045000098F08B3F19F480911F040EC08C3F19F472 |
:1045100080911D0409C08D3F19F480911B0404C0D3 |
:104520008E3F21F480911904809374038091740369 |
:104530008B3010F48AE002C08F3F11F48093740333 |
:1045400080914E078B3F98F08B3F19F480911F04A8 |
:104550000EC08C3F19F480911D0409C08D3F19F4E1 |
:1045600080911B0404C08E3F21F480911904809334 |
:10457000730380917303882321F08F3F11F480939C |
:104580007303809153078B3F98F08B3F19F4809110 |
:104590001F040EC08C3F19F480911D0409C08D3F8B |
:1045A00019F480911B0404C08E3F21F480911904FA |
:1045B0008093710380917103882321F08F3F11F460 |
:1045C00080937103809154078B3F98F08B3F19F4CF |
:1045D00080911F040EC08C3F19F480911D0409C006 |
:1045E0008D3F19F480911B0404C08E3F21F480910B |
:1045F00019048093020480910204882321F08F3FE4 |
:1046000011F480930204809155078B3F98F08B3F03 |
:1046100019F480911F040EC08C3F19F480911D0481 |
:1046200009C08D3F19F480911B0404C08E3F21F412 |
:10463000809119048093010480910104882321F062 |
:104640008F3F11F480930104809156078B3F98F0BF |
:104650008B3F19F480911F040EC08C3F19F4809198 |
:104660001D0409C08D3F19F480911B0404C08E3FC6 |
:1046700021F4809119048093000480910004882320 |
:1046800021F08F3F11F480930004809157078B3FF6 |
:1046900098F08B3F19F480911F040EC08C3F19F4E1 |
:1046A00080911D0409C08D3F19F480911B0404C042 |
:1046B0008E3F21F4809119048093FF038091FF03C2 |
:1046C000882321F08F3F11F48093FF0380916707C7 |
:1046D0008B3F98F08B3F19F480911F040EC08C3FE4 |
:1046E00019F480911D0409C08D3F19F480911B04B9 |
:1046F00004C08E3F21F4809119048093FE038091C1 |
:10470000FE03882321F08F3F11F48093FE038091F4 |
:1047100068078B3F98F08B3F19F480911F040EC0FF |
:104720008C3F19F480911D0409C08D3F19F48091CC |
:104730001B0404C08E3F21F4809119048093FD0373 |
:104740008091FD03882321F08F3F11F48093FD03B6 |
:10475000809169078B3F98F08B3F19F480911F047B |
:104760000EC08C3F19F480911D0409C08D3F19F4CF |
:1047700080911B0404C08E3F21F480911904809322 |
:10478000FC038091FC03882321F08F3F11F4809378 |
:10479000FC0380916A078B3F98F08B3F19F480915E |
:1047A0001F040EC08C3F19F480911D0409C08D3F79 |
:1047B00019F480911B0404C08E3F21F480911904E8 |
:1047C0008093FB038091FB03882321F08F3F11F43A |
:1047D0008093FB03809158078B3F98F08B3F19F42F |
:1047E00080911F040EC08C3F19F480911D0409C0F4 |
:1047F0008D3F19F480911B0404C08E3F21F48091F9 |
:1048000019048093700380917003882321F08F3FF7 |
:1048100011F48093700380915D078B3F98F08B3F7C |
:1048200019F480911F040EC08C3F19F480911D046F |
:1048300009C08D3F19F480911B0404C08E3F21F400 |
:104840008091190480936F0380916F03882321F076 |
:104850008F3F11F480936F03809160078B3F98F036 |
:104860008B3F19F480911F040EC08C3F19F4809186 |
:104870001D0409C08D3F19F480911B0404C08E3FB4 |
:1048800021F4809119048093FA038091FA0388231C |
:1048900021F08F3F11F48093FA03809161078B3FE1 |
:1048A00098F08B3F19F480911F040EC08C3F19F4CF |
:1048B00080911D0409C08D3F19F480911B0404C030 |
:1048C0008E3F21F4809119048093F9038091F903BC |
:1048D000882321F08F3F11F48093F90380916607BC |
:1048E0008B3F98F08B3F19F480911F040EC08C3FD2 |
:1048F00019F480911D0409C08D3F19F480911B04A7 |
:1049000004C08E3F21F48091190480936E0380913E |
:104910006E03882321F08F3F11F480936E03109172 |
:104920007103812F992787FD9095A92FB92FBC017D |
:10493000CD010E948A3B17FF06C020E030E040E82E |
:1049400053E40E94E53A27E137EB41ED58E30E943A |
:10495000043CDC01CB0180937A0390937B03A0930A |
:104960007C03B0937D0380914A078093A5078091D3 |
:104970004907809389071F9108952F923F924F9284 |
:104980005F926F927F928F929F92AF92BF92CF92DF |
:10499000DF92EF92FF920F931F93CF93DF93CDB7E8 |
:1049A000DEB72B970FB6F894DEBF0FBECDBF0E94C7 |
:1049B000521B299A80913907E82FFF27EE0FFF1F1E |
:1049C000E55FF84F6080718028E730E0620E731E6B |
:1049D0008091A50799274497861597050CF43C010B |
:1049E00077FE02C06624772480911804843608F08C |
:1049F0005EC080910103882399F480910403909113 |
:104A000005038F5F9F4F61F488E99AE39093C00399 |
:104A10008093BF0380E09CE09093050380930403A0 |
:104A200080919D0490919E04009731F0019790939E |
:104A30009E0480939D0404C01092110410922204DD |
:104A4000809100018A3011F4289A01C02898809141 |
:104A5000A2049091A304815D974030F180915007AA |
:104A6000682E772481E08093220480913707E82F15 |
:104A7000FF27EE0FFF1FE55FF84F11821082809134 |
:104A80003807E82FFF27EE0FFF1FE55FF84F118271 |
:104A9000108280913A07E82FFF27EE0FFF1FE55F96 |
:104AA000F84F118210825BC21092110458C280919B |
:104AB00018048D3808F453C21092220490915107C3 |
:104AC00082E3989FC001112490939E0480939D04DB |
:104AD00059E2651671046CF08091A2049091A304D0 |
:104AE0006FEF8F3F960729F001969093A304809370 |
:104AF000A2048091A2049091A304883C910520F027 |
:104B000078E26716710404F5109281041092820411 |
:104B100010928304109284041092850410928604EB |
:104B2000109287041092880410923104109232047B |
:104B3000109233041092340410922D0410922E041B |
:104B400010922F041092300489EC681671040CF452 |
:104B500066C120911104222309F061C180913A07B6 |
:104B6000E82FFF27EE0FFF1FE55FF84F808191814F |
:104B70008C3491050CF4CAC080919F048F5F8093A0 |
:104B80009F04893C08F44BC1299820939F041092FC |
:104B9000A3041092A20430913707E32FFF27EE0FF2 |
:104BA000FF1FE55FF84F8081918187349105B4F450 |
:104BB00080913807E82FFF27EE0FFF1FE55FF84FC2 |
:104BC000808191810190F081E02DF7FF03C0F09585 |
:104BD000E195FF4FE734F1050CF47AC041E02091F4 |
:104BE0003807A22FBB27AA0FBB1FA55FB84F8D9117 |
:104BF0009C9111978734910544F0E32FFF27EE0F26 |
:104C0000FF1FE55FF84F808191818D919C918734E2 |
:104C1000910574F080913707E82FFF27EE0FFF1FF3 |
:104C2000E55FF84F80819181873491050CF042E077 |
:104C3000E22FFF27EE0FFF1FE55FF84F8081918184 |
:104C40008634910574F480913707E82FFF27EE0F23 |
:104C5000FF1FE55FF84F80819181873491050CF04B |
:104C600043E0E22FFF27EE0FFF1FE55FF84F808143 |
:104C700091818A5B9F4F74F480913707E82FFF275B |
:104C8000EE0FFF1FE55FF84F80819181873491051A |
:104C90000CF044E0E22FFF27EE0FFF1FE55FF84F17 |
:104CA000808191818A5B9F4F74F480913707E82F50 |
:104CB000FF27EE0FFF1FE55FF84F8081918186345B |
:104CC00091050CF445E0A2E0B0E0042E0E94E33C24 |
:104CD00080913F0780FF10C08091080390910903E5 |
:104CE000875B934038F480910803909109038E5EAE |
:104CF000924010F40E94E40C0E94580247E467E3DB |
:104D000077E00E942E020E94E21982C08081918188 |
:104D1000855B9F4F0CF081C080919F048F5F8093D3 |
:104D20009F04893C08F47BC02998A4E0B0E08FEF91 |
:104D3000082E0E94E33C2093110420939F041092BC |
:104D4000A3041092A2040E94E219A4E0B0E08091B2 |
:104D50006D0490916E0497FF02C081509F4F892F80 |
:104D6000990F990B082E0E94E33CA5E0B0E08091DA |
:104D70006D0490916E04082E0E94E33CA6E0B0E022 |
:104D800080916B0490916C0497FF02C081509F4FFB |
:104D9000892F990F990B082E0E94E33CA7E0B0E001 |
:104DA00080916B0490916C04082E0E94E33C08E013 |
:104DB00010E08091670490916804A0916904B0911B |
:104DC0006A04BC01CD010E946D3BDC01CB019C015A |
:104DD00097FF02C021503F4F832F992787FD9A9557 |
:104DE000D801082E0E94E33C09E010E0809167049E |
:104DF00090916804A0916904B0916A04BC01CD014E |
:104E00000E946D3BDC01CB01D801082E0E94E33CDF |
:104E10000E9458020E94721802C020939F04B3E2BD |
:104E20006B1671040CF09BC020913A07E22FFF270C |
:104E3000EE0FFF1FE55FF84F80819181855B9F4FEB |
:104E40000CF06DC08091A0048F5F8093A004893C1A |
:104E500008F467C088EC8093A00481E090E0909310 |
:104E6000A3048093A20481E080931104109289042A |
:104E700010928A0410928B0410928C0410923104C8 |
:104E800010923204109233041092340410922D04C4 |
:104E900010922E0410922F041092300410924104AC |
:104EA0001092420410924304109244041092390468 |
:104EB00010923A0410923B0410923C0480916104D9 |
:104EC00090916204A0916304B091640480933D04C6 |
:104ED00090933E04A0933F04B09340048091590402 |
:104EE00090915A04A0915B04B0915C0480933504C6 |
:104EF00090933604A0933704B09338041092810441 |
:104F000010928204109283041092840410928504FB |
:104F100010928604109287041092880402C01092A6 |
:104F2000A004E22FFF27EE0FFF1FE55FF84F8081FF |
:104F300091818C3491058CF08091A1048F5F8093D6 |
:104F4000A104893C60F01092110488EC8093A104C4 |
:104F50001092A3041092A20402C01092A1048091A6 |
:104F60006B03815080936B0380916B038F3F29F01B |
:104F700080912204882309F492C30E94D521E090F5 |
:104F80003707EE2DFF27EE0FFF1FDF01A55FB84F9C |
:104F900000914607602F77278D919C91869F900105 |
:104FA000879F300D969F300D1124EF5DF84F809153 |
:104FB0004707482F552780819181849FD001859F85 |
:104FC000B00D949FB00D11242A0F3B1F309317048E |
:104FD00020931604F0903807EF2DFF27EE0FFF1FE8 |
:104FE000DF01A55FB84F8D919C91869F9001879FAF |
:104FF000300D969F300D1124EF5DF84F8081918127 |
:10500000849FF001859FF00D949FF00D11242E0FC9 |
:105010003F1F309315042093140480913A07E82F22 |
:10502000FF27EE0FFF1FE55FF84F8081918190957C |
:1050300081959F4F909313048093120410917403F1 |
:10504000812F992787FD9095A92FB92FBC01CD01FC |
:105050000E948A3B17FF06C020E030E040E853E49E |
:105060000E94E53A20E030E040E251E40E94E53A57 |
:10507000DC01CB0120E030E040E85BE3BC01CD0186 |
:105080000E94043CDC01CB018093A8079093A90700 |
:10509000A093AA07B093AB0710917303812F9927B0 |
:1050A00087FD9095A92FB92FBC01CD010E948A3BA5 |
:1050B00017FF06C020E030E040E853E40E94E53AE4 |
:1050C00020E030EE4BE257E40E94273BDC01CB01AD |
:1050D00080939A0790939B07A0939C07B0939D079A |
:1050E0006091A303662331F08AE090E09093C003BF |
:1050F0008093BF03462F552742FF09C080910204C9 |
:10510000282F3327220F331F220F331F13C09A017A |
:105110002870307043FF0EC080910204282F33277F |
:105120008CEF9FEF289FA001299F500D389F500DB5 |
:1051300011249A018091F7039091F803AC01A3E048 |
:10514000440F551FAA95E1F7481B590B420F531FF7 |
:1051500057FF02C0495F5F4FF3E055954795FA95B9 |
:10516000E1F75093F8034093F703462F552744FF88 |
:1051700009C080910204282F3327220F331F220FEA |
:10518000331F13C09A012072307045FF0EC080910A |
:105190000204282F33278CEF9FEF289FB001299F0F |
:1051A000700D389F700D11249B018091F503909133 |
:1051B000F603AC0173E0440F551F7A95E1F7481BE5 |
:1051C000590B420F531F57FF02C0495F5F4F63E007 |
:1051D000559547956A95E1F75093F6034093F5038B |
:1051E0004091A203842F992783FF03C082E390E0BC |
:1051F00007C09C012470307082FF07C08EEC9FEFC7 |
:105200009093F4038093F30304C03093F40320934A |
:10521000F303242F332721FF09C080916C03909161 |
:105220006D03019690936D0380936C0324FF09C076 |
:1052300080916C0390916D03019790936D0380931F |
:105240006C038091F7039091F80397FD079653E064 |
:10525000959587955A95E1F7C0901604D09017045C |
:10526000C80ED91ED0921704C09216042091F503DF |
:105270003091F60337FF02C0295F3F4F43E0359579 |
:1052800027954A95E1F78091140490911504820FB7 |
:10529000931F9093150480931404809112049091AD |
:1052A00013042091F3033091F403820F931F909322 |
:1052B00013048093120480913F0782FF0CC080E0AA |
:1052C00090E0A0E0B0E080939A0790939B07A093B2 |
:1052D0009C07B0939D078091A8079091A907A09182 |
:1052E000AA07B091AB0720E030E040E050E0BC01FD |
:1052F000CD010E94943B882364F480E090E0A0E01C |
:10530000B0E08093A8079093A907A093AA07B09351 |
:10531000AB0780919A0790919B07A0919C07B09151 |
:105320009D0720E030E040E050E0BC01CD010E944C |
:10533000943B882364F480E090E0A0E0B0E08093A8 |
:105340009A0790939B07A0939C07B0939D07109199 |
:105350006B07812F992782FDC8C083FDC6C080914D |
:10536000610490916204A0916304B0916404815639 |
:105370009A4EA040B040ECF0602F7727CB0123E09D |
:10538000880F991F2A95E1F79601281B390B309356 |
:105390001704209316048091610490916204A091F7 |
:1053A0006304B091640481589843A140B040A4F1D3 |
:1053B00028C08091610490916204A0916304B0912F |
:1053C0006404805A9541AF4FBF4F34F5602F772763 |
:1053D0009B0103E0220F331F0A95E1F72C0D3D1DC1 |
:1053E0003093170420931604809161049091620415 |
:1053F000A0916304B091640481589843A140B040E7 |
:105400005CF0B4E0660F771FBA95E1F7261B370B07 |
:1054100030931704209316048091590490915A04F4 |
:10542000A0915B04B0915C0481569A4EA040B040BC |
:105430001CF180914607482F5527CA01A3E0880F29 |
:10544000991FAA95E1F72091140430911504281BA7 |
:10545000390B3093150420931404809159049091D2 |
:105460005A04A0915B04B0915C0481589843A14018 |
:10547000B0400CF43AC02EC08091590490915A0467 |
:10548000A0915B04B0915C04805A9541AF4FBF4F2F |
:1054900064F580914607482F5527CA01F3E0880F2D |
:1054A000991FFA95E1F72091140430911504280F03 |
:1054B000391F30931504209314048091590490915E |
:1054C0005A04A0915B04B0915C0481589843A140B8 |
:1054D000B0405CF0E4E0440F551FEA95E1F7241B6F |
:1054E000350B3093150420931404EF2DFF27EE0F96 |
:1054F000FF1FE55FF84F40915E07242F332780811F |
:1055000091812817390734F412FF04C081E0809399 |
:10551000060413C0EF2DFF27EE0FFF1FE55FF84FC6 |
:10552000842F992720915F07821B91092081318167 |
:105530002817390714F41092060440913807E42F15 |
:10554000FF27EE0FFF1FE55FF84F50915E07852F95 |
:10555000992722273327281B390B808191818217B5 |
:10556000930744F480916B0783FF04C081E080932C |
:10557000050416C080910504882391F0E42FFF27CD |
:10558000EE0FFF1FE55FF84F80915F079927851B9E |
:105590009109208131818217930714F41092050438 |
:1055A000EE2DFF27EE0FFF1FE55FF84F40915E07DE |
:1055B000242F3327808191812817390744F4809163 |
:1055C0006B0780FF04C081E08093030417C08091C3 |
:1055D0000304882399F0EE2DFF27EE0FFF1FE55FF0 |
:1055E000F84F842F992720915F07821B9109208112 |
:1055F00031812817390714F41092030440913707BA |
:10560000E42FFF27EE0FFF1FE55FF84F50915E0775 |
:10561000852F992722273327281B390B80819181D9 |
:105620008217930744F480916B0781FF04C081E0E7 |
:105630008093040416C080910404882391F0E42F21 |
:10564000FF27EE0FFF1FE55FF84F80915F07992757 |
:10565000851B9109208131818217930714F41092E0 |
:10566000040480910604882319F4809105048111B3 |
:1056700081E08093070480910304882321F48091C2 |
:105680000404882351F081E08093080410920704F9 |
:10569000109206041092050402C080930804209121 |
:1056A0000704222331F084E690E09093C0038093B6 |
:1056B000BF03222321F480910804882339F08091CC |
:1056C0005D079927861597050CF43C0190902204FC |
:1056D000992041F1109213041092120410921704B1 |
:1056E0001092160410921504109214048DEC9CEC88 |
:1056F000ACECBDE38093A8079093A907A093AA07F9 |
:10570000B093AB078AE097EDA3EABBE380939A07D7 |
:1057100090939B07A0939C07B0939D07109207045A |
:10572000109208048091920790919307A09194079A |
:10573000B091950720916104309162044091630417 |
:1057400050916404820F931FA41FB51F809392078A |
:1057500090939307A0939407B09395078091960731 |
:1057600090919707A0919807B091990720915904BB |
:1057700030915A0440915B0450915C04820F931F56 |
:10578000A41FB51F8093960790939707A09398073F |
:10579000B093990780918A0790918B07A0918C070D |
:1057A000B0918D0720915D0430915E0440915F04BB |
:1057B00050916004820F931FA41FB51F80938A0726 |
:1057C00090938B07A0938C07B0938D0780918207ED |
:1057D00090918307A0918407B0918507209155048B |
:1057E000309156044091570450915804820F931FF2 |
:1057F000A41FB51F8093820790938307A09384070B |
:10580000B093850780900804882029F480910704CC |
:10581000882309F45FC01092510410925204109230 |
:1058200053041092540410924D0410924E0410929E |
:105830004F04109250041092920710929307109206 |
:10584000940710929507109296071092970710925E |
:1058500098071092990710928A0710928B0710925E |
:105860008C0710928D071092820710928307109276 |
:105870008407109285078091410490914204A09181 |
:105880004304B091440480933D0490933E04A0935C |
:105890003F04B09340048091390490913A04A09160 |
:1058A0003B04B0913C048093350490933604A0935C |
:1058B0003704B09338041092CA031092C9031092AF |
:1058C0000A041092090410920C0410920B04882010 |
:1058D00009F0BAC080910704882309F0B5C080910F |
:1058E0004B07A82EBB24CC24DD2480916104909129 |
:1058F0006204A0916304B0916404BC01CD01A601CF |
:1059000095010E94C03C79018A018091A307909182 |
:10591000A407AA2797FDA095BA2FE81AF90A0A0B3F |
:105920001B0BD801C70117FF03C00F96A11DB11DA6 |
:105930007C018D0174E015950795F794E7947A95AD |
:10594000D1F78091590490915A04A0915B04B091D1 |
:105950005C04BC01CD01A60195010E94C03C809170 |
:10596000AD079091AE07AA2797FDA095BA2F281BE7 |
:10597000390B4A0B5B0BDA01C90157FF03C00F96C5 |
:10598000A11DB11D9C01AD0164E05595479537956A |
:1059900027956A95D1F7F1E2EF16F104010511059B |
:1059A0002CF090E2E92EF12C012D112D60EEE6167F |
:1059B0006FEFF6066FEF06076FEF160744F480EE01 |
:1059C000E82E8FEFF82E8FEF082F8FEF182F213250 |
:1059D00031054105510524F020E230E040E050E07F |
:1059E000203E7FEF37077FEF47077FEF570724F40D |
:1059F00020EE3FEF4FEF5FEF809141049091420422 |
:105A0000A0914304B09144048E199F09A00BB10BDF |
:105A10008093410490934204A0934304B0934404C0 |
:105A20008091390490913A04A0913B04B0913C04D8 |
:105A3000821B930BA40BB50B8093390490933A040B |
:105A4000A0933B04B0933C048091C9039091CA0396 |
:105A50008F3F910509F008F4C3C5882009F042C5BD |
:105A600080910704882309F03DC5809192079091A9 |
:105A70009307A0919407B0919507B7FF04C0815098 |
:105A80009F4FAF4FBF4F892F9A2FAB2FBB27A7FD3B |
:105A9000BA958093920790939307A0939407B0933D |
:105AA00095078091960790919707A0919807B091DC |
:105AB0009907B7FF04C081509F4FAF4FBF4F892F49 |
:105AC0009A2FAB2FBB27A7FDBA958093960790938B |
:105AD0009707A0939807B093990780914B07E82EFA |
:105AE000FF24002711272091510430915204409146 |
:105AF000530450915404C801B7010E944C3C97FFD5 |
:105B000004C061507F4F8F4F9F4FBB2797FDBA95C1 |
:105B1000A92F982F872F8093510490935204A0931C |
:105B20005304B093540420914D0430914E0440919D |
:105B30004F0450915004C801B7010E944C3C97FF9C |
:105B400004C061507F4F8F4F9F4FBB2797FDBA9581 |
:105B5000A92F982F872F80934D0490934E04A093E4 |
:105B60004F04B09350048091490490914A04A0914D |
:105B70004B04B0914C04B7FF04C081509F4FAF4F0E |
:105B8000BF4F892F9A2FAB2FBB27A7FDBA958093C4 |
:105B9000490490934A04A0934B04B0934C04209181 |
:105BA0009207309193074091940750919507809107 |
:105BB000510490915204A0915304B0915404281BB5 |
:105BC000390B4A0B5B0B209395043093960440935A |
:105BD00097045093980480916407E82EFF240027CF |
:105BE0001127CA01B901A80197010E94C03CDA013E |
:105BF000C9012093A8043093A9044093AA045093A8 |
:105C0000AB0457FF04C081509F4FAF4FBF4F892F48 |
:105C10009A2FAB2FBB27A7FDBA9590930A048093C8 |
:105C200009048091960790919707A0919807B091E9 |
:105C3000990720914D0430914E0440914F045091AA |
:105C40005004821B930BA40BB50B80939904909383 |
:105C50009A04A0939B04B0939C04BC01CD01A801BD |
:105C600097010E94C03CDA01C9012093AC04309333 |
:105C7000AD044093AE045093AF0457FF04C081506D |
:105C80009F4FAF4FBF4FA92EBA2ECB2EDD24C7FC9E |
:105C9000DA94B0920C04A0920B0480918A07909140 |
:105CA0008B07A0918C07B0918D07B7FF04C081507E |
:105CB0009F4FAF4FBF4F892F9A2FAB2FBB27A7FD09 |
:105CC000BA9580938A0790938B07A0938C07B09323 |
:105CD0008D078091820790918307A0918407B091EE |
:105CE0008507B7FF04C081509F4FAF4FBF4F892F2B |
:105CF0009A2FAB2FBB27A7FDBA958093820790936D |
:105D00008307A0938407B0938507E0905D04F0902B |
:105D10005E0400915F041091600480916104909191 |
:105D20006204A0916304B0916404E81AF90A0A0BB2 |
:105D30001B0BE0928D04F0928E0400938F0410935D |
:105D4000900420915504309156044091570450918D |
:105D500058048091590490915A04A0915B04B09129 |
:105D60005C04281B390B4A0B5B0B20939104309386 |
:105D700092044093930450939404E0929504F0921B |
:105D800096040093970410939804209399043093F9 |
:105D90009A0440939B0450939C0480913D049091FD |
:105DA0003E04A0913F04B09140048E199F09A00BBE |
:105DB000B10B80933D0490933E04A0933F04B093B5 |
:105DC00040048091350490913604A0913704B0913D |
:105DD0003804821B930BA40BB50B8093350490936E |
:105DE0003604A0933704B093380480915104909105 |
:105DF0005204A0915304B0915404BC01CD012AE196 |
:105E000030E040E050E00E94C03C3093D306209345 |
:105E1000D20680914D0490914E04A0914F04B09110 |
:105E20005004BC01CD012AE130E040E050E00E9486 |
:105E3000C03C3093D5062093D40680919504909170 |
:105E400096049093D7068093D606809199049091FA |
:105E50009A049093D9068093D806809192079091E6 |
:105E60009307A0919407B0919507BC01CD012AE159 |
:105E700030E040E050E00E94C03C3093DB062093CD |
:105E8000DA068091960790919707A0919807B091B4 |
:105E90009907BC01CD012AE130E040E050E00E94CA |
:105EA000C03C3093DD062093DC068091AC049091D9 |
:105EB000AD049093EB068093EA06C50143E0880F9A |
:105EC000991F4A95E1F78A0D9B1D8A0D9B1D9093A2 |
:105ED000ED068093EC0681E090E09093B10480930E |
:105EE000B0042091B6043091B7044091B8045091A9 |
:105EF000B9048091920790919307A0919407B09173 |
:105F00009507281B390B4A0B5B0B57FF07C05095B1 |
:105F10004095309521953F4F4F4F5F4F20523E4463 |
:105F2000404050400CF0FEC091E0E91690E1F906C7 |
:105F300090E0090790E019070CF46CC08091B2045E |
:105F4000882309F463C0D801C70117FF07C0882759 |
:105F50009927DC018E199F09A00BB10BB7FF04C074 |
:105F60008150904FAF4FBF4F2CE0B595A7959795B7 |
:105F700087952A95D1F701969093B1048093B00448 |
:105F8000D801C70117FF03C00796A11DB11D13E07B |
:105F9000B595A795979587951A95D1F78093A804FD |
:105FA0009093A904A093AA04B093AB048958934199 |
:105FB000A040B04064F088E893E1A0E0B0E08093B6 |
:105FC000A8049093A904A093AA04B093AB042091D1 |
:105FD000A8043091A9044091AA045091AB0457FF42 |
:105FE00004C021503F4F4F4F5F4F232F342F452F79 |
:105FF000552747FD5A958091090490910A04820F14 |
:10600000931F90930A048093090406C081E0809353 |
:10601000B20402C01092B204E0909504F09096048D |
:106020000091970410919804F0E0EF16F0EFFF064E |
:10603000FFEF0F07FFEF1F070CF071C08091B30453 |
:10604000882309F468C0A801970117FF07C0222719 |
:106050003327A9012E193F09400B510B57FF04C0EC |
:106060002150304F4F4F5F4FECE055954795379596 |
:106070002795EA95D1F78091B0049091B104820FF1 |
:10608000931F9093B1048093B004D801C70117FF08 |
:1060900003C00796A11DB11D73E0B595A79597950F |
:1060A00087957A95D1F78093A8049093A904A0933B |
:1060B000AA04B093AB0488579C4EAF4FBF4F64F413 |
:1060C00088E79CEEAFEFBFEF8093A8049093A904FC |
:1060D000A093AA04B093AB042091A8043091A90422 |
:1060E0004091AA045091AB0457FF04C021503F4F88 |
:1060F0004F4F5F4F232F342F452F552747FD5A957C |
:106100008091090490910A04820F931F90930A04CE |
:10611000809309040BC081E08093B30407C0109200 |
:10612000B30404C01092B1041092B004109165073A |
:10613000212F33278091B0049091B104281739079B |
:1061400024F43093B1042093B0044091950450910D |
:1061500096046091970470919804413034E053079D |
:1061600030E0630730E0730774F08091770490911A |
:1061700078042091B0043091B104820F931F909362 |
:1061800078048093770440505C4F6F4F7F4F74F4D6 |
:1061900080917704909178042091B0043091B104FB |
:1061A000821B930B909378048093770481E090E0B6 |
:1061B0009093B1048093B0041092AC041092AD049B |
:1061C0001092AE041092AF042091BA043091BB0437 |
:1061D0004091BC045091BD0480919607909197071F |
:1061E000A0919807B0919907281B390B4A0B5B0BBC |
:1061F00057FF07C050954095309521953F4F4F4F21 |
:106200005F4F20523E44404050400CF000C1C090CF |
:106210009904D0909A04E0909B04F0909C04A1E033 |
:10622000CA16A0E1DA06A0E0EA06A0E0FA060CF43D |
:106230006CC08091B404882309F463C0D701C601FF |
:10624000F7FE07C088279927DC018C199D09AE0944 |
:10625000BF09B7FF04C08150904FAF4FBF4F3CE024 |
:10626000B595A795979587953A95D1F7019690930F |
:10627000B1048093B004D701C601F7FE03C00796AE |
:10628000A11DB11D23E0B595A795979587952A95F2 |
:10629000D1F78093AC049093AD04A093AE04B09377 |
:1062A000AF0489589341A040B04064F088E893E17E |
:1062B000A0E0B0E08093AC049093AD04A093AE0452 |
:1062C000B093AF042091AC043091AD044091AE0482 |
:1062D0005091AF0457FF04C021503F4F4F4F5F4FC5 |
:1062E000232F342F452F552747FD5A9580910B04B6 |
:1062F00090910C04820F931F90930C0480930B04D5 |
:1063000006C081E08093B40402C01092B404F0E0AF |
:10631000CF16F0EFDF06FFEFEF06FFEFFF060CF002 |
:1063200073C08091B504882309F46AC0D701C601FF |
:10633000F7FE07C088279927DC018C199D09AE0953 |
:10634000BF099C01AD01B7FF04C02150304F4F4F32 |
:106350005F4F8CE055954795379527958A95D1F7EE |
:106360008091B0049091B104820F931F9093B10477 |
:106370008093B004D701C601F7FE03C00796A11DA4 |
:10638000B11D03E0B595A795979587950A95D1F727 |
:106390008093AC049093AD04A093AE04B093AF048B |
:1063A00088579C4EAF4FBF4F64F488E79CEEAFEF29 |
:1063B000BFEF8093AC049093AD04A093AE04B09370 |
:1063C000AF042091AC043091AD044091AE045091E3 |
:1063D000AF0457FF04C021503F4F4F4F5F4F232F53 |
:1063E000342F452F552747FD5A9580910B049091E6 |
:1063F0000C04820F931F90930C0480930B040BC02A |
:1064000081E08093B50407C01092B50404C01092D7 |
:10641000B1041092B0048091AC049091AD049093BB |
:10642000E7068093E606212F33278091B0049091F0 |
:10643000B1042817390724F43093B1042093B00431 |
:106440004091990450919A0460919B0470919C042E |
:10645000413034E0530730E0630730E0730774F0F5 |
:1064600080917504909176042091B0043091B1042C |
:10647000820F931F909376048093750440505C4F75 |
:106480006F4F7F4F74F48091750490917604209142 |
:10649000B0043091B104821B930B909376048093E7 |
:1064A000750480917704909178049093DF0680932F |
:1064B000DE062091750430917604809171049091EC |
:1064C0007204281B390BC901F3E0880F991FFA9554 |
:1064D000E1F7820F931F820F931F9093E106809341 |
:1064E000E00608C010920C0410920B0410920A04EB |
:1064F0001092090480919A0790919B07A0919C07A4 |
:10650000B0919D0720E030E040E050E0BC01CD01BB |
:106510000E94943B882341F410920C0410920B04C7 |
:1065200010920A04109209048091920790919307A7 |
:10653000A0919407B09195078093B6049093B70407 |
:10654000A093B804B093B9048091960790919707EF |
:10655000A0919807B09199078093BA049093BB04D7 |
:10656000A093BC04B093BD04109251041092520445 |
:10657000109253041092540410924D0410924E0441 |
:1065800010924F04109250041092490410924A0441 |
:1065900010924B0410924C041092920710929307A1 |
:1065A00010929407109295071092960710929707F1 |
:1065B000109298071092990710928A0710928B07F1 |
:1065C00010928C0710928D07109282071092830709 |
:1065D00010928407109285071092CA031092C90383 |
:1065E000A0901204B0901304C501B7FE04C0882720 |
:1065F00099278A199B0945973CF080913F0784FDB4 |
:1066000003C081E08093A704D0904807ED2CFF24BD |
:1066100000271127B501882777FD8095982F9501D0 |
:10662000B7FE04C0222733272A193B09442737FD28 |
:106630004095542F0E944C3C9B01AC01C801B7010E |
:106640000E944C3C97FF04C061507E4F8F4F9F4F7C |
:10665000E9E09595879577956795EA95D1F79B0140 |
:106660008D2D99278A9DD0018B9DB00D9A9DB00DDF |
:106670001124CD01B7FD039695958795959587953E |
:10668000280F391FC901AA2797FDA095BA2F80931B |
:10669000890490938A04A0938B04B0938C04209176 |
:1066A0003104309132044091330450913404281B5A |
:1066B000390B4A0B5B0B2093310430933204409327 |
:1066C0003304509334048091310490913204A091AA |
:1066D0003304B09134048155934CA040B04064F031 |
:1066E00080E593ECA0E0B0E0809331049093320415 |
:1066F000A0933304B0933404809131049091320418 |
:10670000A0913304B0913404805B9C43AF4FBF4FE2 |
:1067100064F480EB9CE3AFEFBFEF80933104909380 |
:106720003204A0933304B0933404809127049091F1 |
:106730002804892B09F4AAC080913F0783FFA6C0D3 |
:106740008091610490916204A0916304B09164040B |
:10675000B7FF04C081509E4FAF4FBF4F59E0B59572 |
:10676000A795979587955A95D1F79C0197FF03C0F8 |
:10677000309521953F4F8091590490915A04A091F2 |
:106780005B04B0915C04B7FF04C081509E4FAF4FD3 |
:10679000BF4F49E0B595A795979587954A95D1F74D |
:1067A000BC0197FF03C0709561957F4F261737078F |
:1067B0000CF49B0129313105A4F48091A7048823AE |
:1067C00081F08091BE049091BF04892B51F4809197 |
:1067D0002704909128049093260480932504109216 |
:1067E000A70480917503482F5527249FC001259F3A |
:1067F000900D349F900D112497FDCF969C0186E05B |
:10680000359527958A95E1F7421B530B9A0114168B |
:106810001506B4F58091BE049091BF04009771F500 |
:106820008091230490912404829FA001839F500DA6 |
:10683000929F500D11249A0157FF02C0215E3F4FD5 |
:1068400005E0359527950A95E1F7442737FD4095F2 |
:10685000542F8091310490913204A0913304B0916F |
:106860003404820F931FA41FB51F809331049093AB |
:106870003204A0933304B093340408C0019702C0DB |
:1068800084EF91E09093BF048093BE048091A604AE |
:1068900081508093A6048F3F09F085C088E18093E2 |
:1068A000A60480914B07E82EFF2400271127809132 |
:1068B000610490916204A0916304B0916404BC01EE |
:1068C000CD01A80197010E94C03C3093B1062093EE |
:1068D000B0068091590490915A04A0915B04B09144 |
:1068E0005C04BC01CD01A80197010E94C03C30931B |
:1068F000B3062093B2068091A3079091A4079093CA |
:10690000B5068093B4068091AD079091AE07909341 |
:10691000B7068093B6068091A6079091A70790933B |
:10692000B9068093B80680910F049091100490935B |
:10693000BB068093BA068091290490912A04A09105 |
:106940002B04B0912C04B7FF04C081509E4FAF4F71 |
:10695000BF4F19E0B595A795979587951A95D1F7EB |
:106960009093BD068093BC068091270490912804E3 |
:106970009093C1068093C00680910E0390910F03FF |
:106980009093C3068093C206809118049927909330 |
:10699000C5068093C40680918E0790918F079093CF |
:1069A000D1068093D00680910804A090A807B090EB |
:1069B000A907C090AA07D090AB078823A9F08091BF |
:1069C000870790918807AA2797FDA095BA2FBC0149 |
:1069D000CD010E948A3BDC01CB01A6019501BC01DF |
:1069E000CD010E94043C3AC0809161049091620400 |
:1069F000A0916304B0916404BC01CD010E948A3B64 |
:106A00007B018C0180919A0790919B07A0919C0734 |
:106A1000B0919D079C01AD01C801B7010E94043CE3 |
:106A20007B018C018091870790918807AA2797FDA9 |
:106A3000A095BA2FBC01CD010E948A3BDC01CB019D |
:106A4000A6019501BC01CD010E94043CDC01CB01F3 |
:106A50009C01AD01C801B7010E94E53ADC01CB0100 |
:106A6000BC01CD010E946D3BDC01CB0190938807F6 |
:106A70008093870780910704A090A807B090A9078A |
:106A8000C090AA07D090AB078823A9F080917F0718 |
:106A900090918007AA2797FDA095BA2FBC01CD0140 |
:106AA0000E948A3BDC01CB01A6019501BC01CD010E |
:106AB0000E94043C3AC08091590490915A04A091DC |
:106AC0005B04B0915C04BC01CD010E948A3B7B0158 |
:106AD0008C0180919A0790919B07A0919C07B0919F |
:106AE0009D079C01AD01C801B7010E94043C7B01D8 |
:106AF0008C0180917F0790918007AA2797FDA09530 |
:106B0000BA2FBC01CD010E948A3BDC01CB01A6015A |
:106B10009501BC01CD010E94043CDC01CB019C012C |
:106B2000AD01C801B7010E94E53ADC01CB01BC010F |
:106B3000CD010E946D3BDC01CB01909380078093D7 |
:106B40007F078091A6079091A707AA2797FDA09598 |
:106B5000BA2FBC01CD010E948A3B7B018C01809140 |
:106B6000A8079091A907A091AA07B091AB079C0133 |
:106B7000AD01C801B7010E94043C7B018C018091EA |
:106B8000450490914604A0914704B0914804BC018B |
:106B9000CD010E948A3BDC01CB0120909A07309006 |
:106BA0009B0740909C0750909D07A2019101BC015A |
:106BB000CD010E94043CDC01CB0120E030E040E04C |
:106BC0005FE3BC01CD010E94043CDC01CB019C01D0 |
:106BD000AD01C801B7010E94E53ADC01CB01BC015F |
:106BE000CD010E946D3BDC01CB019093A707809300 |
:106BF000A60780917F07909180079093E906809384 |
:106C0000E8068091590490915A04A0915B04B091D8 |
:106C10005C04BC01CD010E948A3BDC01CB01A201D6 |
:106C20009101BC01CD010E94043CDC01CB01BC01FF |
:106C3000CD010E946D3BDC01CB019093E306809374 |
:106C4000E20660911404709115047A83698370934D |
:106C5000EF066093EE068091870790918807815038 |
:106C6000984034F080E098E09093880780938707FD |
:106C700080918707909188078050984F34F480E086 |
:106C800098EF909388078093870780917F07909172 |
:106C900080078150984034F080E098E0909380071E |
:106CA00080937F0780917F07909180078050984F55 |
:106CB00034F480E098EF9093800780937F07809171 |
:106CC000A6079091A7078150984034F080E098E0A3 |
:106CD0009093A7078093A6078091A6079091A70796 |
:106CE0008050984F34F480E098EF9093A7078093FA |
:106CF000A60780913F07992780FFF1C02091780374 |
:106D000081FF0EC0223310F580910F049091100482 |
:106D1000449790930E0480930D041092210419C09F |
:106D200080916C0390916D03820F911D2091440717 |
:106D30003327829FA001839F500D929F500D1124F5 |
:106D4000CA01449790930E0480930D0481E08093D0 |
:106D50002104992021F010920E0410920D0400914C |
:106D60000F041091100420910D0430910E0420178F |
:106D700031070CF0B4C080912104882309F4AFC01E |
:106D8000021B130B809177039927089FB001099F7D |
:106D9000700D189F700D1124CB0177FD0F968C019B |
:106DA000B4E015950795BA95E1F7C301801B910BE7 |
:106DB0008C0180917903282F33278091CB03909108 |
:106DC000CC03829FD001839FB00D929FB00D112400 |
:106DD000CD01B7FD0796A3E095958795AA95E1F7B4 |
:106DE000081B190BC0902904D0902A04E0902B04B2 |
:106DF000F0902C04F7FE08C02FEF31E040E050E0A7 |
:106E0000C20ED31EE41EF51EF9E0F594E794D79464 |
:106E1000C794FA95D1F780917603282F332744271A |
:106E20005527C701B6010E944C3C97FF04C0615E24 |
:106E30007F4F8F4F9F4FE5E09595879577956795A5 |
:106E4000EA95D1F7633371051CF062E370E006C088 |
:106E50003FEF6E3C730714F46EEC7FEF061B170BCD |
:106E60008091A4049091A5049C0174E0220F331F2B |
:106E70007A95E1F7281B390B200F311F37FF02C02D |
:106E8000215F3F4F64E0359527956A95E1F7309390 |
:106E9000A5042093A40480914007482F5527241768 |
:106EA000350774F46416750624F05093A5044093D6 |
:106EB000A4046416750624F47092A5046092A404D8 |
:106EC0008091A4049091A5046816790624F4709228 |
:106ED000A5046092A4046090A4047090A50470922C |
:106EE000BF066092BE068090A6079090A70780918B |
:106EF000890490918A04881A990AC30177FC019643 |
:106F000095958795881599050CF44C019095819578 |
:106F10009F4F881699060CF44C014091A5074B83AE |
:106F2000242F3327C90186199709881599050CF470 |
:106F30004C01C301821B930B881699060CF44C017B |
:106F400054E16516710414F48824992460911604A0 |
:106F5000709117048091D2049091D304681B790B2F |
:106F60007B876A878091870790918807861B970B9C |
:106F7000909391078093900720E030E040E050E04C |
:106F8000C201B1010E94943B20918104309182049E |
:106F90004091830450918404882309F448C0CA01B5 |
:106FA000B9010E948A3B5B016C0180916104909160 |
:106FB0006204A0916304B0916404BC01CD010E94FD |
:106FC0008A3BDC01CB01A2019101BC01CD010E94F1 |
:106FD000043C7B018C01EA85FB85CF01AA2797FD44 |
:106FE000A095BA2FBC01CD010E948A3BDC01CB01E8 |
:106FF0009C01AD01C801B7010E94E43ADC01CB015C |
:107000009C01AD01C601B5010E94E53ADC01CB014E |
:10701000BC01CD010E946D3BDC01CB01809381045A |
:1070200090938204A0938304B093840414C080914D |
:10703000900790919107AA2797FDA095BA2F280F46 |
:10704000391F4A1F5B1F20938104309382044093B1 |
:107050008304509384048091810490918204A091D0 |
:107060008304B0918404181619061A061B0624F42A |
:107070000297A109B10903C00296A11DB11D809319 |
:10708000810490938204A0938304B093840480913C |
:10709000810490918204A0918304B091840481586A |
:1070A0009E43A040B04064F080E89EE3A0E0B0E0E2 |
:1070B0008093810490938204A0938304B09384040A |
:1070C0008091810490918204A0918304B091840402 |
:1070D0008058914CAF4FBF4F64F480E891ECAFEF14 |
:1070E000BFEF8093810490938204A0938304B093B4 |
:1070F00084048091900790919107AA2797FDA0950D |
:10710000BA2FBC01CD010E948A3B7B018C0180918A |
:10711000810490918204A0918304B0918404BC0105 |
:10712000CD010E948A3BDC01CB0140917A03509152 |
:107130007B0360917C0370917D034C835D836E8340 |
:107140007F839C01AD016C817D818E819F810E9436 |
:10715000043CDC01CB019C01AD01C801B7010E94D8 |
:10716000E53ADC01CB01BC01CD010E946D3BDC01A5 |
:10717000CB018C0150916E035887652F77278827A4 |
:107180009927940197FE04C022273327281939092B |
:1071900037FF02C02F5F3F4F35952795260D371DCE |
:1071A000442737FD4095542F0E944C3C97FF04C064 |
:1071B000615C7F4F8F4F9F4FB6E095958795779590 |
:1071C0006795BA95D1F79B01601771070CF48B0195 |
:1071D00066277727621B730B061717070CF48B01C2 |
:1071E0009301200F311F280D391D37FF03C020E008 |
:1071F00030E007C06B81862F9927821793070CF424 |
:107200009C01709189077987872F9927281739075B |
:107210000CF49C01209381079301201B310B280D56 |
:10722000391D37FF03C020E030E007C08091A5077B |
:107230009927821793070CF49C01A9858A2F992717 |
:10724000281739070CF49C01209386078091D004FD |
:107250009091D104E981FA81E81BF90BFB87EA8759 |
:1072600080917F07909180078E1B9F0B90937E07E4 |
:1072700080937D0720E030E040E050E0C201B101A2 |
:107280000E94943B209185043091860440918704AC |
:1072900050918804882309F448C0CA01B9010E94AA |
:1072A0008A3B5B016C018091590490915A04A09132 |
:1072B0005B04B0915C04BC01CD010E948A3BDC01FF |
:1072C000CB01A2019101BC01CD010E94043C7B01D4 |
:1072D0008C012A853B85C901AA2797FDA095BA2F65 |
:1072E000BC01CD010E948A3BDC01CB019C01AD01B8 |
:1072F000C801B7010E94E43ADC01CB019C01AD0159 |
:10730000C601B5010E94E53ADC01CB01BC01CD010B |
:107310000E946D3BDC01CB01809385049093860431 |
:10732000A0938704B093880414C080917D07909146 |
:107330007E07AA2797FDA095BA2F280F391F4A1F4D |
:107340005B1F2093850430938604409387045093F9 |
:1073500088048091850490918604A0918704B0915F |
:107360008804181619061A061B0624F40297A109A8 |
:10737000B10903C00296A11DB11D809385049093AD |
:107380008604A0938704B09388048091850490912B |
:107390008604A0918704B091880481589E43A04040 |
:1073A000B04064F080E89EE3A0E0B0E08093850404 |
:1073B00090938604A0938704B093880480918504F9 |
:1073C00090918604A0918704B09188048058914CD4 |
:1073D000AF4FBF4F64F480E891ECAFEFBFEF809305 |
:1073E000850490938604A0938704B09388048091C9 |
:1073F0007D0790917E07AA2797FDA095BA2FBC0123 |
:10740000CD010E948A3B7B018C0180918504909183 |
:107410008604A0918704B0918804BC01CD010E942C |
:107420008A3BDC01CB019C01AD016C817D818E81A9 |
:107430009F810E94043CDC01CB019C01AD01C8018D |
:10744000B7010E94E53ADC01CB01BC01CD010E94ED |
:107450006D3BDC01CB018C015885652F7727882790 |
:107460009927940197FE04C0222733272819390948 |
:1074700037FF02C02F5F3F4F35952795260D371DEB |
:10748000442737FD4095542F0E944C3C97FF04C081 |
:10749000615C7F4F8F4F9F4FF6E09595879577956D |
:1074A0006795FA95D1F79B01601771070CF48B0172 |
:1074B00066277727621B730B061717070CF48B01DF |
:1074C0009301200F311F2819390937FF03C020E02D |
:1074D00030E007C08091A5079927821793070CF425 |
:1074E0009C016985862F9927281739070CF49C0180 |
:1074F0002093A0079301201B310B2819390937FF6E |
:1075000003C020E030E007C08091A50799278217CB |
:1075100093070CF49C017985872F99272817390741 |
:107520000CF49C0120939E072B960FB6F894DEBFB7 |
:107530000FBECDBFDF91CF911F910F91FF90EF90C4 |
:10754000DF90CF90BF90AF909F908F907F906F9083 |
:107550005F904F903F902F9008958091CC04909130 |
:10756000CD04A091CE04B091CF048093C404909335 |
:10757000C504A093C604B093C7048091C804909139 |
:10758000C904A091CA04B091CB048093C004909325 |
:10759000C104A093C204B093C30408951092D3040D |
:1075A0001092D2041092D1041092D0040895FC01DC |
:1075B0004150504030F001900616D1F73197CF017D |
:1075C00008958827992708955058192EEFD001D093 |
:1075D000D2C0BA176207730784079507B1F188F420 |
:1075E0000EF410940B2EBA2FA02D062E622F202DF4 |
:1075F000072E732F302D082E842F402D092E952F06 |
:10760000502DFF275523B9F0591B49F0573E98F0EC |
:10761000469537952795A795F0405395C9F776F08D |
:10762000BA0F621F731F841F30F487957795679593 |
:10763000B795F040939517FA0F2E0895BF1BBB27FF |
:10764000BA0B620B730B840BF6CFDEF6DBC0AED049 |
:1076500001D091C0552359F0992369F09F575F5786 |
:10766000951B33F442F4903811F4915805C09BC037 |
:1076700091589F3F09F4C6C0BB27112462177307B6 |
:10768000840730F4660F771F881FBB1F915098F353 |
:1076900011D00F920FD00F920DD0A0E82617370708 |
:1076A00048071B0609F0A048BA2F602D7F918F91E3 |
:1076B00000240895A0E80024621773078407B10529 |
:1076C00028F0621B730B840BB1090A2A660F771F1F |
:1076D000881FBB1FA69581F7089597FB73D09F372E |
:1076E00038F0FEE9F91B982F872F762F6B2F05C0F6 |
:1076F00086C09695879577956795F150D0F73EF4BB |
:1077000090958095709561957F4F8F4F9F4F08950D |
:10771000E89403C097FB0EF4F3DFB62F672F782FA2 |
:10772000892F9EE9002427C00ED05EF004C00BD044 |
:1077300026F001C008D019F020F48FEF089580E002 |
:10774000089581E0089597FB092E052600F86894B6 |
:1077500030D0E89407FC07C06217730784079507C9 |
:1077600021F008F400940794989408959A95BB0F1B |
:10777000661F771F881F11249923A1F08823B2F771 |
:107780009F3F59F0BB0F48F421F4002011F460FF33 |
:1077900004C06F5F7F4F8F4F9F4F881F97958795CE |
:1077A00097F908952CC09FEF80EC0895052E0926C7 |
:1077B00007FA440F551F5F3F79F0AA27A51708F075 |
:1077C00051E04795880F991F9F3F31F0BB27B917AC |
:1077D00008F091E0879508959F919F911124E3CF40 |
:1077E00097FB880F991F9F3F31F0BB27B91708F00F |
:1077F00091E0879508959F919F911124D4CF66279A |
:107800007727882799270895D1DF01D0B4CF99230E |
:1078100039F0552329F09F575F57950F13F49AF1CC |
:10782000F1CF91589F3FE1F3629FA12D0F92BB27AB |
:10783000639FA00DB11DEE27729FA00DB11DEE1F1D |
:10784000AF93AA27649FB00DE11D739FB00DE11D9A |
:10785000AA1F6627829FB00DE11DA61F5527749FA2 |
:10786000E00DA11D551F839FE00DA11D561F849F94 |
:10787000A00D511D852F7A2F6E2F1F900F908823FA |
:107880001AF4939539F48FCF000C111CBB1F661F9F |
:10789000771F881F01280895629FD001739FF00110 |
:1078A000829FE00DF11D649FE00DF11D929FF00D90 |
:1078B000839FF00D749FF00D659FF00D9927729FC7 |
:1078C000B00DE11DF91F639FB00DE11DF91FBD0152 |
:1078D000CF0111240895991B79E004C0991F9617D0 |
:1078E00008F0961B881F7A95C9F780950895AA1B02 |
:1078F000BB1B51E107C0AA1FBB1FA617B70710F09B |
:10790000A61BB70B881F991F5A95A9F780959095CC |
:10791000BC01CD01089597FB092E07260AD077FDFB |
:1079200004D0E5DF06D000201AF4709561957F4FF2 |
:107930000895F6F7909581959F4F0895A1E21A2E2C |
:10794000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1F03 |
:10795000A217B307E407F50720F0A21BB30BE40B53 |
:10796000F50B661F771F881F991F1A9469F760959A |
:107970007095809590959B01AC01BD01CF01089554 |
:1079800097FB092E05260ED057FD04D0D7DF0AD06D |
:10799000001C38F450954095309521953F4F4F4F3E |
:1079A0005F4F0895F6F790958095709561957F4F9C |
:1079B0008F4F9F4F0895F999FECFB2BDA1BDF89AA0 |
:1079C000119600B40895F999FECFB2BDA1BD00BCD7 |
:0E79D00011960FB6F894FA9AF99A0FBE089520 |
:1079DE000A496E74656772616C4E69636B20202074 |
:1079EE0020496E74656772616C526F6C6C2020203A |
:1079FE00204163634E69636B2020202020202020CD |
:107A0E0020416363526F6C6C2020202020202020A8 |
:107A1E00204779726F476965722020202020202030 |
:107A2E0020486F6568656E5765727420202020208F |
:107A3E00204163635A202020202020202020202057 |
:107A4E00204761732020202020202020202020206D |
:107A5E00204B6F6D7061737356616C7565202020BD |
:107A6E00205370616E6E756E6720202020202020BE |
:107A7E0020456D7066616E6720202020202020201A |
:107A8E0020416E616C6F6731312020202020202034 |
:107A9E00204D6F746F725F566F726E6520202020BE |
:107AAE00204D6F746F725F48696E74656E20202072 |
:107ABE00204D6F746F725F4C696E6B7320202020A7 |
:107ACE00204D6F746F725F5265636874732020204F |
:107ADE00204163635F5A2020202020202020202078 |
:107AEE00204D697474656C4163634E69636B20202D |
:107AFE00204D697474656C416363526F6C6C202009 |
:107B0E0020496E74656772616C4572724E69636B63 |
:107B1E0020496E74656772616C457272526F6C6C3F |
:107B2E00204D697474656C496E744E69636B2020C8 |
:107B3E00204D697474656C496E74526F6C6C0920BB |
:107B4E00004E65757472616C4E69636B2020202047 |
:107B5E0020526F6C6C4F6666736574202020202057 |
:107B6E0020496E74526F6C6C2A46616B746F722072 |
:107B7E0020416E616C6F673236202020202020203D |
:107B8E0020446972656B74417573676C526F6C6CCF |
:107B9E00204D65737377657274526F6C6C20202064 |
:107BAE0020417573676C65696368526F6C6C202039 |
:107BBE0020492D4C616765526F6C6C20202020206F |
:107BCE0020537469636B526F6C6C20202020202030 |
:107BDE002064FF01FFFF010AFF03007D0000640027 |
:107BEE0048616C6C6F2057656C74000000000000DB |
:107BFE000000000000000000000000000000000077 |
:107C0E000000000000000000000000000000000066 |
:107C1E000000000000000000000000000000000056 |
:107C2E000000000000000000000000000000000046 |
:107C3E000102030405060708090A0A01ECFF64465F |
:107C4E00640A029696403A10FB3017B7D13890D09E |
:107C5E00030090D00300640053706F727400004EE6 |
:107C6E006F726D616C0000426567696E6E657200C1 |
:027C7E00000004 |
:00000001FF |
/branches/V0.67g/Hex-Files/WasIstWas.txt |
---|
0,0 → 1,15 |
+++++++++++++++++++++++++ |
+ 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 |
Flight-Ctrl SW > 0.62 benötigt das Kopter-Tool >1.47 |
/branches/V0.67g/Kopter-Tool/MikroKopter-Tool_1_48.exe |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/branches/V0.67g/License.txt |
---|
0,0 → 1,52 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + Nur für den privaten Gebrauch |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten und nichtkommerziellen Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt und genannt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-profit use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet, our webpage (http://www.MikroKopter.de) must be |
// + clearly linked and named as origin |
// + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
/branches/V0.67g/Settings.h |
---|
--- branches/V0.67g/_Settings.h (nonexistent) |
+++ branches/V0.67g/_Settings.h (revision 795) |
@@ -0,0 +1,50 @@ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Testmodi |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define MOTOR_OFF 0 |
+#define MOTOR_TEST 0 |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Abstimmung |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define ACC_AMPLIFY 12 |
+#define FAKTOR_P 1 |
+#define FAKTOR_I 0.0001 |
+ |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Debug-Interface |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+#define SIO_DEBUG 1 // Soll der Debugger aktiviert sein? |
+#define MIN_DEBUG_INTERVALL 500 // in diesem Intervall werden Degugdaten ohne Aufforderung gesendet |
+ |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+// Sender |
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
+ #define K_NICK 0 |
+ #define K_ROLL 1 |
+ #define K_GAS 2 |
+ #define K_GIER 3 |
+ #define K_POTI1 4 |
+ #define K_POTI2 5 |
+ #define K_POTI3 6 |
+ #define K_POTI4 7 |
+// +++++++++++++++++++++++++++++++ |
+// + Getestete Settings: |
+// +++++++++++++++++++++++++++++++ |
+// Setting: Kamera |
+// Stick_P:3 |
+// Stick_D:0 |
+// Gyro_P: 175 |
+// Gyro_I: 175 |
+// Ki_Anteil: 10 |
+// +++++++++++++++++++++++++++++++ |
+// + Getestete Settings: |
+// +++++++++++++++++++++++++++++++ |
+// Setting: Normal |
+// Stick_P:2 |
+// Stick_D:8 |
+// Gyro_P: 80 |
+// Gyro_I: 150 |
+// Ki_Anteil: 5 |
+ |
/branches/V0.67g/analog.c |
---|
0,0 → 1,147 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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 AdWertNick = 0, AdWertRoll = 0, AdWertGier = 0; |
volatile int AdWertAccRoll = 0,AdWertAccNick = 0,AdWertAccHoch = 0; |
volatile char MessanzahlNick = 0, MessanzahlRoll = 0, MessanzahlGier = 0; |
volatile char messanzahl_AccNick = 0, messanzahl_AccRoll = 0, messanzahl_AccHoch = 0; |
volatile long Luftdruck = 32000; |
volatile int StartLuftdruck; |
volatile unsigned int MessLuftdruck = 1023; |
unsigned char DruckOffsetSetting; |
volatile int HoeheD = 0; |
volatile char messanzahl_Druck; |
volatile int tmpLuftdruck; |
volatile unsigned int ZaehlMessungen = 0; |
//####################################################################################### |
// |
void ADC_Init(void) |
//####################################################################################### |
{ |
ADMUX = 0;//Referenz ist extern |
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADIE); |
//Free Running Mode, Division Factor 128, Interrupt on |
} |
void SucheLuftruckOffset(void) |
{ |
unsigned int off; |
off = eeprom_read_byte(&EEPromArray[EEPROM_ADR_LAST_OFFSET]); |
if(off > 20) off -= 10; |
OCR0A = off; |
Delay_ms_Mess(100); |
if(MessLuftdruck < 850) off = 0; |
for(; off < 250;off++) |
{ |
OCR0A = off; |
Delay_ms_Mess(50); |
printf("."); |
if(MessLuftdruck < 900) break; |
} |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_LAST_OFFSET], off); |
DruckOffsetSetting = off; |
Delay_ms_Mess(300); |
} |
//####################################################################################### |
// |
SIGNAL(SIG_ADC) |
//####################################################################################### |
{ |
static unsigned char kanal=0,state = 0; |
static unsigned int gier1, roll1, nick1; |
ANALOG_OFF; |
switch(state++) |
{ |
case 0: |
gier1 = ADC; |
kanal = 1; |
ZaehlMessungen++; |
break; |
case 1: |
roll1 = ADC; |
kanal = 2; |
break; |
case 2: |
nick1 = ADC; |
kanal = 4; |
break; |
case 3: |
UBat = (3 * UBat + ADC / 3) / 4;//(UBat + ((ADC * 39) / 256) + 19) / 2; |
kanal = 6; |
break; |
case 4: |
Aktuell_ay = NeutralAccY - ADC; |
AdWertAccRoll = Aktuell_ay; |
kanal = 7; |
break; |
case 5: |
Aktuell_ax = ADC - NeutralAccX; |
AdWertAccNick = Aktuell_ax; |
kanal = 0; |
break; |
case 6: |
if(PlatinenVersion == 10) AdWertGier = (ADC + gier1) / 2; |
else AdWertGier = ADC + gier1; |
kanal = 1; |
break; |
case 7: |
if(PlatinenVersion == 10) AdWertRoll = (ADC + roll1) / 2; |
else AdWertRoll = ADC + roll1; |
kanal = 2; |
break; |
case 8: |
if(PlatinenVersion == 10) AdWertNick = (ADC + nick1) / 2; |
else AdWertNick = ADC + nick1; |
//AdWertNick = 0; |
//AdWertNick += Poti2; |
kanal = 5; |
break; |
case 9: |
AdWertAccHoch = (signed int) ADC - NeutralAccZ; |
AdWertAccHoch += abs(Aktuell_ay) / 4 + abs(Aktuell_ax) / 4; |
if(AdWertAccHoch > 1) |
{ |
if(NeutralAccZ < 800) NeutralAccZ+= 0.02; |
} |
else if(AdWertAccHoch < -1) |
{ |
if(NeutralAccZ > 600) NeutralAccZ-= 0.02; |
} |
messanzahl_AccHoch = 1; |
Aktuell_az = ADC; |
Mess_Integral_Hoch += AdWertAccHoch; // Integrieren |
Mess_Integral_Hoch -= Mess_Integral_Hoch / 1024; // dämfen |
kanal = 3; |
break; |
case 10: |
tmpLuftdruck += ADC; |
if(++messanzahl_Druck >= 5) |
{ |
MessLuftdruck = ADC; |
messanzahl_Druck = 0; |
HoeheD = (int)(StartLuftdruck - tmpLuftdruck - HoehenWert); // D-Anteil = neuerWert - AlterWert |
Luftdruck = (tmpLuftdruck + 3 * Luftdruck) / 4; |
HoehenWert = StartLuftdruck - Luftdruck; |
tmpLuftdruck = 0; |
} |
kanal = 0; |
state = 0; |
break; |
default: |
kanal = 0; |
state = 0; |
break; |
} |
ADMUX = kanal; |
if(state != 0) ANALOG_ON; |
} |
/branches/V0.67g/analog.h |
---|
0,0 → 1,24 |
/*####################################################################################### |
#######################################################################################*/ |
extern volatile int UBat; |
extern volatile int AdWertNick, AdWertRoll, AdWertGier; |
extern volatile int AdWertAccRoll,AdWertAccNick,AdWertAccHoch; |
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 volatile int HoeheD; |
extern volatile unsigned int MessLuftdruck; |
extern volatile int StartLuftdruck; |
extern volatile char MessanzahlNick; |
unsigned int ReadADC(unsigned char adc_input); |
void ADC_Init(void); |
void SucheLuftruckOffset(void); |
#define ANALOG_OFF ADCSRA=0 |
#define ANALOG_ON ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADIE) |
/branches/V0.67g/eeprom.c |
---|
0,0 → 1,182 |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Konstanten |
// + 0-250 -> normale Werte |
// + 251 -> Poti1 |
// + 252 -> Poti2 |
// + 253 -> Poti3 |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
void DefaultKonstanten1(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; |
EE_Parameter.GlobalConfig = CFG_ACHSENKOPPLUNG_AKTIV;//CFG_HOEHENREGELUNG | /*CFG_HOEHEN_SCHALTER |*/ CFG_KOMPASS_AKTIV | CFG_KOMPASS_FIX;//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 = 50; // Wert : 0-250 |
EE_Parameter.Hoehe_ACC_Wirkung = 50; // Wert : 0-250 |
EE_Parameter.Hoehe_Verstaerkung = 4; // Wert : 0-50 |
EE_Parameter.Stick_P = 4; //2 // Wert : 1-6 |
EE_Parameter.Stick_D = 8; //8 // Wert : 0-64 |
EE_Parameter.Gier_P = 14; // Wert : 1-20 |
EE_Parameter.Gas_Min = 15; // Wert : 0-32 |
EE_Parameter.Gas_Max = 250; // Wert : 33-250 |
EE_Parameter.GyroAccFaktor = 26; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
EE_Parameter.Gyro_P = 120; //80 // Wert : 0-250 |
EE_Parameter.Gyro_I = 150; // Wert : 0-250 |
EE_Parameter.UnterspannungsWarnung = 94; // Wert : 0-250 |
EE_Parameter.NotGas = 35; // Wert : 0-250 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 20; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
EE_Parameter.I_Faktor = 32; |
EE_Parameter.UserParam1 = 32 * 4; //zur freien Verwendung |
EE_Parameter.UserParam2 = 0; //zur freien Verwendung |
EE_Parameter.UserParam3 = 0; //zur freien Verwendung |
EE_Parameter.UserParam4 = 0; //zur freien Verwendung |
EE_Parameter.UserParam5 = 0; // zur freien Verwendung |
EE_Parameter.UserParam6 = 0; // zur freien Verwendung |
EE_Parameter.UserParam7 = 0; // zur freien Verwendung |
EE_Parameter.UserParam8 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoNickCompInvert = 0; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 50; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickMax = 150; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickRefresh = 5; |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.LoopConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
EE_Parameter.AchsKopplung1 = 100; |
EE_Parameter.AchsGegenKopplung1 = 10; |
EE_Parameter.WinkelUmschlagNick = 100; |
EE_Parameter.WinkelUmschlagRoll = 100; |
EE_Parameter.GyroAccAbgleich = 50; // 1/k |
EE_Parameter.Driftkomp = 4; |
EE_Parameter.DynamicStability = 100; |
memcpy(EE_Parameter.Name, "Sport\0", 12); |
} |
void DefaultKonstanten2(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; |
EE_Parameter.GlobalConfig = CFG_ACHSENKOPPLUNG_AKTIV;//CFG_HOEHENREGELUNG | /*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 = 50; // Wert : 0-250 |
EE_Parameter.Hoehe_ACC_Wirkung = 50; // Wert : 0-250 |
EE_Parameter.Hoehe_Verstaerkung = 2; // Wert : 0-50 |
EE_Parameter.Stick_P = 4; //2 // Wert : 1-6 |
EE_Parameter.Stick_D = 0; //8 // Wert : 0-64 |
EE_Parameter.Gier_P = 10; // Wert : 1-20 |
EE_Parameter.Gas_Min = 15; // Wert : 0-32 |
EE_Parameter.Gas_Max = 250; // Wert : 33-250 |
EE_Parameter.GyroAccFaktor = 26; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
EE_Parameter.Gyro_P = 175; //80 // Wert : 0-250 |
EE_Parameter.Gyro_I = 175; // Wert : 0-250 |
EE_Parameter.UnterspannungsWarnung = 94; // Wert : 0-250 |
EE_Parameter.NotGas = 35; // Wert : 0-250 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 20; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
EE_Parameter.I_Faktor = 32; |
EE_Parameter.UserParam1 = 20 * 4; // zur freien Verwendung |
EE_Parameter.UserParam2 = 0; // zur freien Verwendung |
EE_Parameter.UserParam3 = 0; // zur freien Verwendung |
EE_Parameter.UserParam4 = 0; // zur freien Verwendung |
EE_Parameter.UserParam5 = 0; // zur freien Verwendung |
EE_Parameter.UserParam6 = 0; // zur freien Verwendung |
EE_Parameter.UserParam7 = 0; // zur freien Verwendung |
EE_Parameter.UserParam8 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoNickCompInvert = 0; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 50; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickMax = 150; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickRefresh = 5; |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.LoopConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts |
EE_Parameter.AchsKopplung1 = 100; // Faktor, mit dem Gier die Achsen Roll und Nick verkoppelt |
EE_Parameter.AchsGegenKopplung1 = 10; |
EE_Parameter.WinkelUmschlagNick = 100; |
EE_Parameter.WinkelUmschlagRoll = 100; |
EE_Parameter.GyroAccAbgleich = 100; // 1/k |
EE_Parameter.Driftkomp = 4; |
EE_Parameter.DynamicStability = 75; |
memcpy(EE_Parameter.Name, "Normal\0", 12); |
} |
void DefaultKonstanten3(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; |
EE_Parameter.GlobalConfig = CFG_DREHRATEN_BEGRENZER | CFG_ACHSENKOPPLUNG_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 = 50; // Wert : 0-250 |
EE_Parameter.Hoehe_ACC_Wirkung = 50; // Wert : 0-250 |
EE_Parameter.Hoehe_Verstaerkung = 2; // Wert : 0-50 |
EE_Parameter.Stick_P = 3; //2 // Wert : 1-6 |
EE_Parameter.Stick_D = 0; //8 // Wert : 0-64 |
EE_Parameter.Gier_P = 8; // Wert : 1-20 |
EE_Parameter.Gas_Min = 15; // Wert : 0-32 |
EE_Parameter.Gas_Max = 250; // Wert : 33-250 |
EE_Parameter.GyroAccFaktor = 26; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
EE_Parameter.Gyro_P = 200; //80 // Wert : 0-250 |
EE_Parameter.Gyro_I = 175; // Wert : 0-250 |
EE_Parameter.UnterspannungsWarnung = 94; // Wert : 0-250 |
EE_Parameter.NotGas = 35; // Wert : 0-250 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 20; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
EE_Parameter.I_Faktor = 10; |
EE_Parameter.UserParam1 = 20 * 4; // zur freien Verwendung |
EE_Parameter.UserParam2 = 0; // zur freien Verwendung |
EE_Parameter.UserParam3 = 0; // zur freien Verwendung |
EE_Parameter.UserParam4 = 0; // zur freien Verwendung |
EE_Parameter.UserParam5 = 0; // zur freien Verwendung |
EE_Parameter.UserParam6 = 0; // zur freien Verwendung |
EE_Parameter.UserParam7 = 0; // zur freien Verwendung |
EE_Parameter.UserParam8 = 0; // zur freien Verwendung |
EE_Parameter.ServoNickControl = 100; // Wert : 0-250 // Stellung des Servos |
EE_Parameter.ServoNickComp = 40; // Wert : 0-250 // Einfluss Gyro/Servo |
EE_Parameter.ServoNickCompInvert = 0; // Wert : 0-250 // Richtung Einfluss Gyro/Servo |
EE_Parameter.ServoNickMin = 50; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickMax = 150; // Wert : 0-250 // Anschlag |
EE_Parameter.ServoNickRefresh = 5; |
EE_Parameter.LoopGasLimit = 50; |
EE_Parameter.LoopThreshold = 90; // Wert: 0-250 Schwelle für Stickausschlag |
EE_Parameter.LoopHysterese = 50; |
EE_Parameter.LoopConfig = 0; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts |
EE_Parameter.AchsKopplung1 = 100; // Faktor, mit dem Gier die Achsen Roll und Nick verkoppelt |
EE_Parameter.AchsGegenKopplung1 = 10; |
EE_Parameter.WinkelUmschlagNick = 100; |
EE_Parameter.WinkelUmschlagRoll = 100; |
EE_Parameter.GyroAccAbgleich = 100; // 1/k |
EE_Parameter.Driftkomp = 4; |
EE_Parameter.DynamicStability = 50; |
memcpy(EE_Parameter.Name, "Beginner\0", 12); |
} |
/branches/V0.67g/fc.c |
---|
0,0 → 1,1113 |
/*####################################################################################### |
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; |
volatile int MesswertNick,MesswertRoll,MesswertGier; |
volatile int AdNeutralNick = 0,AdNeutralRoll = 0,AdNeutralGier = 0,StartNeutralRoll = 0,StartNeutralNick = 0; |
volatile int Mittelwert_AccNick, Mittelwert_AccRoll,Mittelwert_AccHoch, NeutralAccX=0, NeutralAccY=0; |
volatile float NeutralAccZ = 0; |
unsigned char CosinusNickWinkel = 0, CosinusRollWinkel = 0; |
volatile long IntegralNick = 0,IntegralNick2 = 0; |
volatile long IntegralRoll = 0,IntegralRoll2 = 0; |
volatile long IntegralAccNick = 0,IntegralAccRoll = 0,IntegralAccZ = 0; |
volatile long Integral_Gier = 0; |
volatile long Mess_IntegralNick = 0,Mess_IntegralNick2 = 0; |
volatile long Mess_IntegralRoll = 0,Mess_IntegralRoll2 = 0; |
volatile long Mess_Integral_Gier = 0,Mess_Integral_Gier2 = 0; |
volatile long MittelIntegralNick,MittelIntegralRoll,MittelIntegralNick2,MittelIntegralRoll2; |
volatile long Mess_Integral_Hoch = 0; |
volatile int KompassValue = 0; |
volatile int KompassStartwert = 0; |
volatile int KompassRichtung = 0; |
unsigned char MAX_GAS,MIN_GAS; |
unsigned char Notlandung = 0; |
unsigned char HoehenReglerAktiv = 0; |
long Umschlag180Nick = 250000L, Umschlag180Roll = 250000L; |
float GyroFaktor; |
float IntegralFaktor; |
volatile int DiffNick,DiffRoll; |
int Poti1 = 0, Poti2 = 0, Poti3 = 0, Poti4 = 0; |
volatile unsigned char Motor_Vorne,Motor_Hinten,Motor_Rechts,Motor_Links, Count; |
unsigned char MotorWert[5]; |
volatile unsigned char SenderOkay = 0; |
int StickNick = 0,StickRoll = 0,StickGier = 0; |
char MotorenEin = 0; |
int HoehenWert = 0; |
int SollHoehe = 0; |
int LageKorrekturRoll = 0,LageKorrekturNick = 0; |
float Ki = FAKTOR_I; |
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_P = 150; // Wert : 10-250 |
unsigned char Parameter_Gyro_I = 150; // Wert : 0-250 |
unsigned char Parameter_Gier_P = 2; // Wert : 1-20 |
unsigned char Parameter_I_Faktor = 10; // Wert : 1-20 |
unsigned char Parameter_UserParam1 = 0; |
unsigned char Parameter_UserParam2 = 0; |
unsigned char Parameter_UserParam3 = 0; |
unsigned char Parameter_UserParam4 = 0; |
unsigned char Parameter_UserParam5 = 0; |
unsigned char Parameter_UserParam6 = 0; |
unsigned char Parameter_UserParam7 = 0; |
unsigned char Parameter_UserParam8 = 0; |
unsigned char Parameter_ServoNickControl = 100; |
unsigned char Parameter_LoopGasLimit = 70; |
unsigned char Parameter_AchsKopplung1 = 0; |
unsigned char Parameter_AchsGegenKopplung1 = 0; |
unsigned char Parameter_DynamicStability = 100; |
struct mk_param_struct EE_Parameter; |
signed int ExternStickNick = 0,ExternStickRoll = 0,ExternStickGier = 0, ExternHoehenValue = -20; |
void Piep(unsigned char Anzahl) |
{ |
while(Anzahl--) |
{ |
if(MotorenEin) return; //auf keinen Fall im Flug! |
beeptime = 100; |
Delay_ms(250); |
} |
} |
//############################################################################ |
// Nullwerte ermitteln |
void SetNeutral(void) |
//############################################################################ |
{ |
NeutralAccX = 0; |
NeutralAccY = 0; |
NeutralAccZ = 0; |
AdNeutralNick = 0; |
AdNeutralRoll = 0; |
AdNeutralGier = 0; |
Parameter_AchsKopplung1 = 0; |
Parameter_AchsGegenKopplung1 = 0; |
CalibrierMittelwert(); |
Delay_ms_Mess(100); |
CalibrierMittelwert(); |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
{ |
if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
} |
AdNeutralNick= AdWertNick; |
AdNeutralRoll= AdWertRoll; |
AdNeutralGier= AdWertGier; |
StartNeutralRoll = AdNeutralRoll; |
StartNeutralNick = AdNeutralNick; |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) > 4) |
{ |
NeutralAccY = abs(Mittelwert_AccRoll) / ACC_AMPLIFY; |
NeutralAccX = abs(Mittelwert_AccNick) / ACC_AMPLIFY; |
NeutralAccZ = Aktuell_az; |
} |
else |
{ |
NeutralAccX = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_NICK+1]); |
NeutralAccY = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL+1]); |
NeutralAccZ = (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_Z]) * 256 + (int)eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACC_Z+1]); |
} |
Mess_IntegralNick = 0; |
Mess_IntegralNick2 = 0; |
Mess_IntegralRoll = 0; |
Mess_IntegralRoll2 = 0; |
Mess_Integral_Gier = 0; |
MesswertNick = 0; |
MesswertRoll = 0; |
MesswertGier = 0; |
StartLuftdruck = Luftdruck; |
HoeheD = 0; |
Mess_Integral_Hoch = 0; |
KompassStartwert = KompassValue; |
GPS_Neutral(); |
beeptime = 50; |
Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L; |
Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagRoll * 2500L; |
ExternHoehenValue = 0; |
} |
//############################################################################ |
// Bearbeitet die Messwerte |
void Mittelwert(void) |
//############################################################################ |
{ |
static signed long tmpl,tmpl2; |
MesswertGier = (signed int) AdNeutralGier - AdWertGier; |
MesswertRoll = (signed int) AdWertRoll - AdNeutralRoll; |
MesswertNick = (signed int) AdWertNick - AdNeutralNick; |
// Beschleunigungssensor ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mittelwert_AccNick = ((long)Mittelwert_AccNick * 1 + ((ACC_AMPLIFY * (long)AdWertAccNick))) / 2L; |
Mittelwert_AccRoll = ((long)Mittelwert_AccRoll * 1 + ((ACC_AMPLIFY * (long)AdWertAccRoll))) / 2L; |
Mittelwert_AccHoch = ((long)Mittelwert_AccHoch * 1 + ((long)AdWertAccHoch)) / 2L; |
IntegralAccNick += ACC_AMPLIFY * AdWertAccNick; |
IntegralAccRoll += ACC_AMPLIFY * AdWertAccRoll; |
IntegralAccZ += Aktuell_az - NeutralAccZ; |
// Gier ++++++++++++++++++++++++++++++++++++++++++++++++ |
Mess_Integral_Gier += MesswertGier; |
Mess_Integral_Gier2 += MesswertGier; |
// Kopplungsanteil +++++++++++++++++++++++++++++++++++++ |
if(!Looping_Nick && !Looping_Roll && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV)) |
{ |
tmpl = Mess_IntegralNick / 4096L; |
tmpl *= MesswertGier; |
tmpl *= Parameter_AchsKopplung1; //125 |
tmpl /= 2048L; |
tmpl2 = Mess_IntegralRoll / 4096L; |
tmpl2 *= MesswertGier; |
tmpl2 *= Parameter_AchsKopplung1; |
tmpl2 /= 2048L; |
} |
else tmpl = tmpl2 = 0; |
// Roll ++++++++++++++++++++++++++++++++++++++++++++++++ |
MesswertRoll += tmpl; |
MesswertRoll += (tmpl2*Parameter_AchsGegenKopplung1)/512L; //109 |
Mess_IntegralRoll2 += MesswertRoll; |
Mess_IntegralRoll += MesswertRoll - LageKorrekturRoll; |
if(Mess_IntegralRoll > Umschlag180Roll) |
{ |
Mess_IntegralRoll = -(Umschlag180Roll - 10000L); |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
} |
if(Mess_IntegralRoll <-Umschlag180Roll) |
{ |
Mess_IntegralRoll = (Umschlag180Roll - 10000L); |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
} |
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 > 2020) MesswertRoll = +1000; |
if(AdWertRoll > 2034) MesswertRoll = +2000; |
} |
// Nick ++++++++++++++++++++++++++++++++++++++++++++++++ |
MesswertNick -= tmpl2; |
MesswertNick -= (tmpl*Parameter_AchsGegenKopplung1)/512L; |
Mess_IntegralNick2 += MesswertNick; |
Mess_IntegralNick += MesswertNick - LageKorrekturNick; |
if(Mess_IntegralNick > Umschlag180Nick) |
{ |
Mess_IntegralNick = -(Umschlag180Nick - 10000L); |
Mess_IntegralNick2 = Mess_IntegralNick; |
} |
if(Mess_IntegralNick <-Umschlag180Nick) |
{ |
Mess_IntegralNick = (Umschlag180Nick - 10000L); |
Mess_IntegralNick2 = Mess_IntegralNick; |
} |
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 > 2020) MesswertNick = +1000; |
if(AdWertNick > 2034) MesswertNick = +2000; |
} |
//++++++++++++++++++++++++++++++++++++++++++++++++ |
// ADC einschalten |
ANALOG_ON; |
//++++++++++++++++++++++++++++++++++++++++++++++++ |
Integral_Gier = Mess_Integral_Gier; |
IntegralNick = Mess_IntegralNick; |
IntegralRoll = Mess_IntegralRoll; |
IntegralNick2 = Mess_IntegralNick2; |
IntegralRoll2 = Mess_IntegralRoll2; |
if(EE_Parameter.GlobalConfig & CFG_DREHRATEN_BEGRENZER && !Looping_Nick && !Looping_Roll) |
{ |
if(MesswertNick > 200) MesswertNick += 4 * (MesswertNick - 200); |
else if(MesswertNick < -200) MesswertNick += 4 * (MesswertNick + 200); |
if(MesswertRoll > 200) MesswertRoll += 4 * (MesswertRoll - 200); |
else if(MesswertRoll < -200) MesswertRoll += 4 * (MesswertRoll + 200); |
} |
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) |
//############################################################################ |
{ |
// 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.WinkelUmschlagNick * 2500L; |
} |
//############################################################################ |
// Senden der Motorwerte per I2C-Bus |
void SendMotorData(void) |
//############################################################################ |
{ |
if(MOTOR_OFF || !MotorenEin) |
{ |
Motor_Hinten = 0; |
Motor_Vorne = 0; |
Motor_Rechts = 0; |
Motor_Links = 0; |
if(MotorTest[0]) Motor_Vorne = MotorTest[0]; |
if(MotorTest[1]) Motor_Hinten = MotorTest[1]; |
if(MotorTest[2]) Motor_Links = MotorTest[2]; |
if(MotorTest[3]) Motor_Rechts = MotorTest[3]; |
} |
DebugOut.Analog[12] = Motor_Vorne; |
DebugOut.Analog[13] = Motor_Hinten; |
DebugOut.Analog[14] = Motor_Links; |
DebugOut.Analog[15] = Motor_Rechts; |
//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(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;} |
CHK_POTI(Parameter_MaxHoehe,EE_Parameter.MaxHoehe,0,255); |
CHK_POTI(Parameter_Luftdruck_D,EE_Parameter.Luftdruck_D,0,100); |
CHK_POTI(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(Parameter_Gyro_P,EE_Parameter.Gyro_P,10,255); |
CHK_POTI(Parameter_Gyro_I,EE_Parameter.Gyro_I,0,255); |
CHK_POTI(Parameter_I_Faktor,EE_Parameter.I_Faktor,0,255); |
CHK_POTI(Parameter_UserParam1,EE_Parameter.UserParam1,0,255); |
CHK_POTI(Parameter_UserParam2,EE_Parameter.UserParam2,0,255); |
CHK_POTI(Parameter_UserParam3,EE_Parameter.UserParam3,0,255); |
CHK_POTI(Parameter_UserParam4,EE_Parameter.UserParam4,0,255); |
CHK_POTI(Parameter_UserParam5,EE_Parameter.UserParam5,0,255); |
CHK_POTI(Parameter_UserParam6,EE_Parameter.UserParam6,0,255); |
CHK_POTI(Parameter_UserParam7,EE_Parameter.UserParam7,0,255); |
CHK_POTI(Parameter_UserParam8,EE_Parameter.UserParam8,0,255); |
CHK_POTI(Parameter_ServoNickControl,EE_Parameter.ServoNickControl,0,255); |
CHK_POTI(Parameter_LoopGasLimit,EE_Parameter.LoopGasLimit,0,255); |
CHK_POTI(Parameter_AchsKopplung1, EE_Parameter.AchsKopplung1,0,255); |
CHK_POTI(Parameter_AchsGegenKopplung1,EE_Parameter.AchsGegenKopplung1,0,255); |
CHK_POTI(Parameter_DynamicStability,EE_Parameter.DynamicStability,0,255); |
Ki = (float) Parameter_I_Faktor * 0.0001; |
MAX_GAS = EE_Parameter.Gas_Max; |
MIN_GAS = EE_Parameter.Gas_Min; |
} |
//############################################################################ |
// |
void MotorRegler(void) |
//############################################################################ |
{ |
int motorwert,pd_ergebnis,h,tmp_int; |
int GierMischanteil,GasMischanteil; |
static long SummeNick=0,SummeRoll=0; |
static long sollGier = 0,tmp_long,tmp_long2; |
static long IntegralFehlerNick = 0; |
static long IntegralFehlerRoll = 0; |
static unsigned int RcLostTimer; |
static unsigned char delay_neutral = 0; |
static unsigned char delay_einschalten = 0,delay_ausschalten = 0; |
static unsigned int modell_fliegt = 0; |
static int hoehenregler = 0; |
static char TimerWerteausgabe = 0; |
static char NeueKompassRichtungMerken = 0; |
static long ausgleichNick, ausgleichRoll; |
Mittelwert(); |
GRN_ON; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gaswert ermitteln |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
GasMischanteil = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] + 120; |
if(GasMischanteil > MAX_GAS - 20) GasMischanteil = MAX_GAS - 20; |
if(GasMischanteil < 0) GasMischanteil = 0; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Emfang 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 > 2000) // wahrscheinlich in der Luft --> langsam absenken |
{ |
GasMischanteil = EE_Parameter.NotGas; |
Notlandung = 1; |
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) |
{ |
if(modell_fliegt < 0xffff) modell_fliegt++; |
} |
if((modell_fliegt < 200) || (GasMischanteil < 40)) |
{ |
SummeNick = 0; |
SummeRoll = 0; |
Mess_Integral_Gier = 0; |
Mess_Integral_Gier2 = 0; |
} |
if((GasMischanteil > 200) && 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; |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], setting); // aktiven Datensatz merken |
} |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung aktiviert? |
{ |
if((MessLuftdruck > 950) || (MessLuftdruck < 750)) SucheLuftruckOffset(); |
} |
ReadParameterSet(GetActiveParamSetNumber(), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
SetNeutral(); |
Piep(GetActiveParamSetNumber()); |
} |
} |
else |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] < -75) // ACC Neutralwerte speichern |
{ |
if(++delay_neutral > 200) // nicht sofort |
{ |
GRN_OFF; |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_NICK],0xff); // Werte löschen |
MotorenEin = 0; |
delay_neutral = 0; |
modell_fliegt = 0; |
SetNeutral(); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_NICK],NeutralAccX / 256); // ACC-NeutralWerte speichern |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_NICK+1],NeutralAccX % 256); // ACC-NeutralWerte speichern |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL],NeutralAccY / 256); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_ROLL+1],NeutralAccY % 256); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_Z],(int)NeutralAccZ / 256); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACC_Z+1],(int)NeutralAccZ % 256); |
Piep(GetActiveParamSetNumber()); |
} |
} |
else delay_neutral = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gas ist unten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(GasMischanteil < 35) |
{ |
// 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 = 0; |
Mess_IntegralRoll = 0; |
Mess_IntegralNick2 = IntegralNick; |
Mess_IntegralRoll2 = IntegralRoll; |
SummeNick = 0; |
SummeRoll = 0; |
} |
} |
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) |
{ |
int tmp_int; |
ParameterZuordnung(); |
StickNick = PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P; |
StickNick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; |
StickRoll = PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P; |
StickRoll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; |
StickGier = -PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]; |
GyroFaktor = ((float)Parameter_Gyro_P + 10.0) / 256.0; |
IntegralFaktor = ((float) Parameter_Gyro_I) / 44000; |
#define KEY_VALUE (Parameter_UserParam1 * 4) //(Poti3 * 8) |
if(DubWiseKeys[1]) beeptime = 10; |
if(DubWiseKeys[1] & DUB_KEY_UP) tmp_int = KEY_VALUE; else |
if(DubWiseKeys[1] & DUB_KEY_DOWN) tmp_int = -KEY_VALUE; else tmp_int = 0; |
ExternStickNick = (ExternStickNick * 7 + tmp_int) / 8; |
if(DubWiseKeys[1] & DUB_KEY_LEFT) tmp_int = KEY_VALUE; else |
if(DubWiseKeys[1] & DUB_KEY_RIGHT) tmp_int = -KEY_VALUE; else tmp_int = 0; |
ExternStickRoll = (ExternStickRoll * 7 + tmp_int) / 8; |
if(DubWiseKeys[0] & 8) ExternStickGier = 50;else |
if(DubWiseKeys[0] & 4) ExternStickGier =-50;else ExternStickGier = 0; |
if(DubWiseKeys[0] & 2) ExternHoehenValue++; |
if(DubWiseKeys[0] & 16) ExternHoehenValue--; |
StickNick += ExternStickNick / 8; |
StickRoll += ExternStickRoll / 8; |
StickGier += ExternStickGier; |
if(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) IntegralFaktor = 0; |
if(GyroFaktor < 0) GyroFaktor = 0; |
if(IntegralFaktor < 0) IntegralFaktor = 0; |
// greift in den Stick ein, um ungewolltes überschlagen zu verhindern |
if(!(EE_Parameter.LoopConfig & CFG_LOOP_LINKS) && !(EE_Parameter.LoopConfig & CFG_LOOP_RECHTS)) |
{ |
if(IntegralNick > 60000) |
{ |
StickNick -= 8 * EE_Parameter.Stick_P; |
if(IntegralNick > 80000) StickNick -= 16 * EE_Parameter.Stick_P; |
} |
else |
if(IntegralNick < -60000) |
{ |
StickNick += 8 * EE_Parameter.Stick_P; |
if(IntegralNick > 80000) StickNick -= 16 * EE_Parameter.Stick_P; |
} |
if(IntegralRoll > 60000) |
{ |
StickRoll -= 8 * EE_Parameter.Stick_P; |
if(IntegralRoll > 80000) StickRoll -= 16 * EE_Parameter.Stick_P; |
} |
else |
if(IntegralRoll < -60000) |
{ |
StickRoll += 8 * EE_Parameter.Stick_P; |
if(IntegralRoll > 80000) StickRoll -= 16 * EE_Parameter.Stick_P; |
} |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Looping? |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if((PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > EE_Parameter.LoopThreshold) && EE_Parameter.LoopConfig & 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.LoopConfig & 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.LoopConfig & 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.LoopConfig & 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) beeptime = 100; |
if(Looping_Roll || Looping_Nick) |
{ |
if(GasMischanteil > EE_Parameter.LoopGasLimit) GasMischanteil = EE_Parameter.LoopGasLimit; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Bei Empfangsausfall im Flug |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(Notlandung) |
{ |
StickGier = 0; |
StickNick = 0; |
StickRoll = 0; |
GyroFaktor = 0.1; |
IntegralFaktor = 0.005; |
Looping_Roll = 0; |
Looping_Nick = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Integrale auf ACC-Signal abgleichen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define ABGLEICH_ANZAHL 256L |
MittelIntegralNick += IntegralNick; // Für die Mittelwertbildung aufsummieren |
MittelIntegralRoll += IntegralRoll; |
MittelIntegralNick2 += IntegralNick2; |
MittelIntegralRoll2 += IntegralRoll2; |
if(Looping_Nick || Looping_Roll) |
{ |
IntegralAccNick = 0; |
IntegralAccRoll = 0; |
MittelIntegralNick = 0; |
MittelIntegralRoll = 0; |
MittelIntegralNick2 = 0; |
MittelIntegralRoll2 = 0; |
Mess_IntegralNick2 = Mess_IntegralNick; |
Mess_IntegralRoll2 = Mess_IntegralRoll; |
ZaehlMessungen = 0; |
LageKorrekturNick = 0; |
LageKorrekturRoll = 0; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!Looping_Nick && !Looping_Roll) |
{ |
long tmp_long, tmp_long2; |
tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick); |
tmp_long /= 16; |
tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll); |
tmp_long2 /= 16; |
#define AUSGLEICH 32 //(Parameter_UserParam1 / 2) |
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; |
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) |
{ |
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; |
LageKorrekturNick = ausgleichNick / ABGLEICH_ANZAHL; |
// Roll ++++++++++++++++++++++++++++++++++++++++++++++++ |
IntegralFehlerRoll = (long)(MittelIntegralRoll - (long)IntegralAccRoll); |
ausgleichRoll = IntegralFehlerRoll / EE_Parameter.GyroAccAbgleich; |
LageKorrekturRoll = ausgleichRoll / ABGLEICH_ANZAHL; |
// Mess_IntegralNick -= ausgleichNick; |
// Mess_IntegralRoll -= ausgleichRoll; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gyro-Drift ermitteln |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
MittelIntegralNick2 /= ABGLEICH_ANZAHL; |
MittelIntegralRoll2 /= ABGLEICH_ANZAHL; |
// tmp_long = (long)(MittelIntegralNick2 - (long)IntegralAccNick); |
// tmp_long2 = (long)(MittelIntegralRoll2 - (long)IntegralAccRoll); |
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; |
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; |
DebugOut.Analog[22] = MittelIntegralRoll / 26; |
//DebugOut.Analog[28] = ausgleichNick; |
DebugOut.Analog[29] = ausgleichRoll; |
DebugOut.Analog[30] = LageKorrekturRoll * 10; |
#define FEHLER_LIMIT (ABGLEICH_ANZAHL * 4) |
#define FEHLER_LIMIT2 (ABGLEICH_ANZAHL * 16) |
#define BEWEGUNGS_LIMIT 20000 |
// Nick +++++++++++++++++++++++++++++++++++++++++++++++++ |
cnt = 1;// + labs(IntegralFehlerNick) / 4096; |
if(labs(MittelIntegralNick_Alt - MittelIntegralNick) < BEWEGUNGS_LIMIT) |
{ |
if(IntegralFehlerNick > FEHLER_LIMIT2) |
{ |
if(last_n_p) |
{ |
cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2; |
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; |
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; |
if(cnt > EE_Parameter.Driftkomp) cnt = EE_Parameter.Driftkomp; |
if(IntegralFehlerNick > FEHLER_LIMIT) AdNeutralNick += cnt; |
if(IntegralFehlerNick < -FEHLER_LIMIT) AdNeutralNick -= cnt; |
// Roll +++++++++++++++++++++++++++++++++++++++++++++++++ |
cnt = 1;// + labs(IntegralFehlerNick) / 4096; |
ausgleichRoll = 0; |
if(labs(MittelIntegralRoll_Alt - MittelIntegralRoll) < BEWEGUNGS_LIMIT) |
{ |
if(IntegralFehlerRoll > FEHLER_LIMIT2) |
{ |
if(last_r_p) |
{ |
cnt += labs(IntegralFehlerRoll) / FEHLER_LIMIT2; |
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; |
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; |
} |
DebugOut.Analog[27] = ausgleichRoll; |
if(cnt > EE_Parameter.Driftkomp) cnt = EE_Parameter.Driftkomp; |
//if(cnt > 1) beeptime = 50; |
if(IntegralFehlerRoll > FEHLER_LIMIT) AdNeutralRoll += cnt; |
if(IntegralFehlerRoll < -FEHLER_LIMIT) AdNeutralRoll -= cnt; |
DebugOut.Analog[23] = AdNeutralNick;//10*(AdNeutralNick - StartNeutralNick); |
DebugOut.Analog[24] = 10*(AdNeutralRoll - StartNeutralRoll); |
} |
else |
{ |
LageKorrekturRoll = 0; |
LageKorrekturNick = 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; |
} |
//DebugOut.Analog[31] = StickRoll / (26*IntegralFaktor); |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gieren |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(abs(StickGier) > 20) // war 35 |
{ |
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 |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(KompassValue && (EE_Parameter.GlobalConfig & CFG_KOMPASS_AKTIV)) |
{ |
int w,v; |
static int SignalSchlecht = 0; |
w = abs(IntegralNick /512); // mit zunehmender Neigung den Einfluss drosseln |
v = abs(IntegralRoll /512); |
if(v > w) w = v; // grösste Neigung ermitteln |
if(w < 25 && NeueKompassRichtungMerken && !SignalSchlecht) |
{ |
KompassStartwert = KompassValue; |
NeueKompassRichtungMerken = 0; |
} |
w = (w * Parameter_KompassWirkung) / 64; // auf die Wirkung normieren |
w = Parameter_KompassWirkung - w; // Wirkung ggf drosseln |
if(w > 0) |
{ |
if(!SignalSchlecht) Mess_Integral_Gier += (KompassRichtung * w) / 32; // nach Kompass ausrichten |
if(SignalSchlecht) SignalSchlecht--; |
} |
else SignalSchlecht = 500; // so lange das Signal taub stellen --> ca. 1 sek |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Debugwerte zuordnen |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(!TimerWerteausgabe--) |
{ |
TimerWerteausgabe = 24; |
DebugOut.Analog[0] = IntegralNick / EE_Parameter.GyroAccFaktor; |
DebugOut.Analog[1] = IntegralRoll / EE_Parameter.GyroAccFaktor; |
DebugOut.Analog[2] = Mittelwert_AccNick; |
DebugOut.Analog[3] = Mittelwert_AccRoll; |
DebugOut.Analog[4] = MesswertGier; |
DebugOut.Analog[5] = HoehenWert; |
DebugOut.Analog[6] =(Mess_Integral_Hoch / 512); |
DebugOut.Analog[8] = KompassValue; |
DebugOut.Analog[9] = UBat; |
DebugOut.Analog[10] = SenderOkay; |
DebugOut.Analog[16] = Mittelwert_AccHoch; |
/* 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(Looping_Nick) MesswertNick = MesswertNick * GyroFaktor; |
else MesswertNick = IntegralNick * IntegralFaktor + MesswertNick * GyroFaktor; |
if(Looping_Roll) MesswertRoll = MesswertRoll * GyroFaktor; |
else MesswertRoll = IntegralRoll * IntegralFaktor + MesswertRoll * GyroFaktor; |
// MesswertGier = MesswertGier * (GyroFaktor/2) + Integral_Gier * IntegralFaktor; |
MesswertGier = MesswertGier * (GyroFaktor) + Integral_Gier * IntegralFaktor/2; |
DebugOut.Analog[28] = MesswertRoll; |
DebugOut.Analog[25] = IntegralRoll * IntegralFaktor; |
DebugOut.Analog[31] = StickRoll;// / (26*IntegralFaktor); |
// Maximalwerte abfangen |
#define MAX_SENSOR 2048 |
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; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Höhenregelung |
// Die Höhenregelung schwächt lediglich das Gas ab, erhöht es allerdings nicht |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//OCR0B = 180 - (Poti1 + 120) / 4; |
//DruckOffsetSetting = OCR0B; |
if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung |
{ |
int tmp_int; |
if(EE_Parameter.GlobalConfig & CFG_HOEHEN_SCHALTER) // Regler wird über Schalter gesteuert |
{ |
if(Parameter_MaxHoehe < 50) |
{ |
SollHoehe = HoehenWert - 20; // Parameter_MaxHoehe ist der PPM-Wert des Schalters |
HoehenReglerAktiv = 0; |
} |
else |
HoehenReglerAktiv = 1; |
} |
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; // Differenz bestimmen --> P-Anteil |
h = GasMischanteil - h; // vom Gas abziehen |
h -= (HoeheD * Parameter_Luftdruck_D)/8; // D-Anteil |
tmp_int = ((Mess_Integral_Hoch / 512) * (signed long) Parameter_Hoehe_ACC_Wirkung) / 32; |
if(tmp_int > 50) tmp_int = 50; |
else if(tmp_int < -50) tmp_int = -50; |
h -= tmp_int; |
hoehenregler = (hoehenregler*15 + h) / 16; |
if(hoehenregler < EE_Parameter.Hoehe_MinGas) // nicht unter MIN |
{ |
if(GasMischanteil >= EE_Parameter.Hoehe_MinGas) hoehenregler = EE_Parameter.Hoehe_MinGas; |
if(GasMischanteil < EE_Parameter.Hoehe_MinGas) hoehenregler = GasMischanteil; |
} |
if(hoehenregler > GasMischanteil) hoehenregler = GasMischanteil; // nicht mehr als Gas |
GasMischanteil = hoehenregler; |
} |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Mischer und PI-Regler |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DebugOut.Analog[7] = GasMischanteil; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gier-Anteil |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define MUL_G 1.0 |
GierMischanteil = MesswertGier - sollGier; // Regler für Gier |
//GierMischanteil = 0; |
if(GierMischanteil > (GasMischanteil / 2)) GierMischanteil = GasMischanteil / 2; |
if(GierMischanteil < -(GasMischanteil / 2)) GierMischanteil = -(GasMischanteil / 2); |
if(GierMischanteil > ((MAX_GAS - GasMischanteil))) GierMischanteil = ((MAX_GAS - GasMischanteil)); |
if(GierMischanteil < -((MAX_GAS - GasMischanteil))) GierMischanteil = -((MAX_GAS - GasMischanteil)); |
if(GasMischanteil < 20) GierMischanteil = 0; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Nick-Achse |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DiffNick = MesswertNick - (StickNick - GPS_Nick); // Differenz bestimmen |
if(IntegralFaktor) SummeNick += IntegralNick * IntegralFaktor - (StickNick - GPS_Nick); // I-Anteil bei Winkelregelung |
else SummeNick += DiffNick; // I-Anteil bei HH |
if(SummeNick > 0) SummeNick-= 2 ; else SummeNick += 2 ; |
if(SummeNick > 16000) SummeNick = 16000; |
if(SummeNick < -16000) SummeNick = -16000; |
pd_ergebnis = DiffNick + Ki * SummeNick; // PI-Regler für Nick |
// Motor Vorn |
tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
if(pd_ergebnis > tmp_int) pd_ergebnis = tmp_int; |
if(pd_ergebnis < -tmp_int) pd_ergebnis = -tmp_int; |
motorwert = GasMischanteil + pd_ergebnis + GierMischanteil; // Mischer |
if ((motorwert < 0)) motorwert = 0; |
else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
Motor_Vorne = motorwert; |
// Motor Heck |
motorwert = GasMischanteil - pd_ergebnis + GierMischanteil; |
if ((motorwert < 0)) motorwert = 0; |
else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
Motor_Hinten = motorwert; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Roll-Achse |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
DiffRoll = MesswertRoll - (StickRoll - GPS_Roll); // Differenz bestimmen |
if(IntegralFaktor) SummeRoll += IntegralRoll * IntegralFaktor - (StickRoll - GPS_Roll);// I-Anteil bei Winkelregelung |
else SummeRoll += DiffRoll; // I-Anteil bei HH |
if(SummeRoll > 0) SummeRoll-= 2 ; else SummeRoll += 2 ; |
if(SummeRoll > 16000) SummeRoll = 16000; |
if(SummeRoll < -16000) SummeRoll = -16000; |
pd_ergebnis = DiffRoll + Ki * SummeRoll; // PI-Regler für Roll |
tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
if(pd_ergebnis > tmp_int) pd_ergebnis = tmp_int; |
if(pd_ergebnis < -tmp_int) pd_ergebnis = -tmp_int; |
// Motor Links |
motorwert = GasMischanteil + pd_ergebnis - GierMischanteil; |
if ((motorwert < 0)) motorwert = 0; |
else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
Motor_Links = motorwert; |
// Motor Rechts |
motorwert = GasMischanteil - pd_ergebnis - GierMischanteil; |
if ((motorwert < 0)) motorwert = 0; |
else if(motorwert > MAX_GAS) motorwert = MAX_GAS; |
if (motorwert < MIN_GAS) motorwert = MIN_GAS; |
Motor_Rechts = motorwert; |
// +++++++++++++++++++++++++++++++++++++++++++++++ |
} |
/branches/V0.67g/fc.h |
---|
0,0 → 1,144 |
/*####################################################################################### |
Flight Control |
#######################################################################################*/ |
#ifndef _FC_H |
#define _FC_H |
extern volatile unsigned int I2CTimeout; |
extern unsigned char Sekunde,Minute; |
extern volatile long IntegralNick,IntegralNick2; |
extern volatile long IntegralRoll,IntegralRoll2; |
extern volatile long Mess_IntegralNick,Mess_IntegralNick2; |
extern volatile long Mess_IntegralRoll,Mess_IntegralRoll2; |
extern volatile long IntegralAccNick,IntegralAccRoll; |
extern volatile long Mess_Integral_Hoch; |
extern volatile long Integral_Gier,Mess_Integral_Gier,Mess_Integral_Gier2; |
extern volatile int KompassValue; |
extern volatile int KompassStartwert; |
extern volatile int KompassRichtung; |
extern int HoehenWert; |
extern int SollHoehe; |
extern volatile int MesswertNick,MesswertRoll,MesswertGier; |
extern volatile int AdNeutralNick,AdNeutralRoll,AdNeutralGier, Mittelwert_AccNick, Mittelwert_AccRoll; |
extern volatile int NeutralAccX, NeutralAccY,Mittelwert_AccHoch; |
extern volatile float NeutralAccZ; |
extern long Umschlag180Nick, Umschlag180Roll; |
extern signed int ExternStickNick,ExternStickRoll,ExternStickGier; |
extern unsigned char Parameter_UserParam1,Parameter_UserParam2,Parameter_UserParam3,Parameter_UserParam4,Parameter_UserParam5,Parameter_UserParam6,Parameter_UserParam7,Parameter_UserParam8; |
void MotorRegler(void); |
void SendMotorData(void); |
void CalibrierMittelwert(void); |
void Mittelwert(void); |
void SetNeutral(void); |
void Piep(unsigned char Anzahl); |
extern void DefaultKonstanten(void); |
void DefaultKonstanten1(void); |
void DefaultKonstanten2(void); |
extern unsigned char h,m,s; |
extern volatile unsigned char Timeout ; |
extern unsigned char CosinusNickWinkel, CosinusRollWinkel; |
extern volatile long IntegralNick,IntegralNick2; |
extern volatile long IntegralRoll,IntegralRoll2; |
extern volatile long Integral_Gier; |
extern volatile long Mess_IntegralNick,Mess_IntegralNick2; |
extern volatile long Mess_IntegralRoll,Mess_IntegralRoll2; |
extern volatile long Mess_Integral_Gier; |
extern volatile int DiffNick,DiffRoll; |
extern int Poti1, Poti2, Poti3, Poti4; |
extern volatile unsigned char Motor_Vorne,Motor_Hinten,Motor_Rechts,Motor_Links, Count; |
extern unsigned char MotorWert[5]; |
extern volatile unsigned char SenderOkay; |
extern int StickNick,StickRoll,StickGier; |
extern char MotorenEin; |
extern void DefaultKonstanten1(void); |
extern void DefaultKonstanten2(void); |
#define STRUCT_PARAM_LAENGE 71 |
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 UnterspannungsWarnung; // Wert : 0-250 |
unsigned char NotGas; // Wert : 0-250 //Gaswert bei Empängsverlust |
unsigned char NotGasZeit; // Wert : 0-250 // Zeitbis auf NotGas geschaltet wird, wg. Rx-Problemen |
unsigned char UfoAusrichtung; // X oder + Formation |
unsigned char I_Faktor; // Wert : 0-250 |
unsigned char UserParam1; // Wert : 0-250 |
unsigned char UserParam2; // Wert : 0-250 |
unsigned char UserParam3; // Wert : 0-250 |
unsigned char UserParam4; // Wert : 0-250 |
unsigned char ServoNickControl; // Wert : 0-250 // Stellung des Servos |
unsigned char ServoNickComp; // Wert : 0-250 // Einfluss Gyro/Servo |
unsigned char ServoNickMin; // Wert : 0-250 // Anschlag |
unsigned char ServoNickMax; // Wert : 0-250 // Anschlag |
unsigned char ServoNickRefresh; // |
unsigned char LoopGasLimit; // Wert: 0-250 max. Gas während Looping |
unsigned char LoopThreshold; // Wert: 0-250 Schwelle für Stickausschlag |
unsigned char LoopHysterese; // Wert: 0-250 Hysterese für Stickausschlag |
unsigned char AchsKopplung1; // Wert: 0-250 Faktor, mit dem Gier die Achsen Roll und Nick koppelt (NickRollMitkopplung) |
unsigned char AchsGegenKopplung1; // Wert: 0-250 Faktor, mit dem Gier die Achsen Roll und Nick Gegenkoppelt (NickRollGegenkopplung) |
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 |
//------------------------------------------------ |
unsigned char LoopConfig; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
unsigned char ServoNickCompInvert; // Wert : 0-250 0 oder 1 // WICHTIG!!! am Ende lassen |
unsigned char Reserved[4]; |
char Name[12]; |
}; |
/* |
unsigned char ServoNickMax; // 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 LoopConfig; // Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
unsigned char ServoNickCompInvert; // Wert : 0-250 0 oder 1 // WICHTIG!!! am Ende lassen |
unsigned char Reserved[4]; |
char Name[12]; |
*/ |
extern struct mk_param_struct EE_Parameter; |
extern unsigned char Parameter_Luftdruck_D; |
extern unsigned char Parameter_MaxHoehe; |
extern unsigned char Parameter_Hoehe_P; |
extern unsigned char Parameter_Hoehe_ACC_Wirkung; |
extern unsigned char Parameter_KompassWirkung; |
extern unsigned char Parameter_Gyro_P; |
extern unsigned char Parameter_Gyro_I; |
extern unsigned char Parameter_Gier_P; |
extern unsigned char Parameter_ServoNickControl; |
extern unsigned char Parameter_AchsKopplung1; |
extern unsigned char Parameter_AchsGegenKopplung1; |
#endif //_FC_H |
/branches/V0.67g/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="fc.c"></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></Project> |
/branches/V0.67g/flight.pnps |
---|
0,0 → 1,0 |
<pd><ViewState><e p="Flight-Ctrl" x="true"></e></ViewState></pd> |
/branches/V0.67g/gps.h |
---|
0,0 → 1,14 |
extern signed int GPS_Nick; |
extern signed int GPS_Nick; |
extern signed int GPS_Nick; |
extern signed int GPS_Nick; |
extern signed int GPS_Nick; |
extern signed int GPS_Nick; |
extern signed int GPS_Nick; |
extern signed int GPS_Nick; |
extern signed int GPS_Nick; |
extern signed int GPS_Nick; |
extern signed int GPS_Roll; |
void GPS_Neutral(void); |
void GPS_BerechneZielrichtung(void); |
/branches/V0.67g/main.c |
---|
0,0 → 1,246 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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; |
// -- Parametersatz aus EEPROM lesen --- |
// number [0..5] |
void ReadParameterSet(unsigned char number, unsigned char *buffer, unsigned char length) |
{ |
if (number > 5) number = 5; |
eeprom_read_block(buffer, &EEPromArray[EEPROM_ADR_PARAM_BEGIN + length * number], length); |
} |
// -- Parametersatz ins EEPROM schreiben --- |
// number [0..5] |
void WriteParameterSet(unsigned char number, unsigned char *buffer, unsigned char length) |
{ |
if(number > 5) number = 5; |
eeprom_write_block(buffer, &EEPromArray[EEPROM_ADR_PARAM_BEGIN + length * number], length); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], number); // diesen Parametersatz als aktuell merken |
} |
unsigned char GetActiveParamSetNumber(void) |
{ |
unsigned char set; |
set = eeprom_read_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET]); |
if(set > 5) |
{ |
set = 2; |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], set); // diesen Parametersatz als aktuell merken |
} |
return(set); |
} |
//############################################################################ |
//Hauptprogramm |
int main (void) |
//############################################################################ |
{ |
unsigned int timer; |
//unsigned int timer2 = 0; |
DDRB = 0x00; |
PORTB = 0x00; |
for(timer = 0; timer < 1000; timer++); // verzögern |
if(PINB & 0x01) PlatinenVersion = 11; else PlatinenVersion = 10; |
DDRC = 0x81; // SCL |
PORTC = 0xff; // Pullup SDA |
DDRB = 0x1B; // LEDs und Druckoffset |
PORTB = 0x01; // LED_Rot |
DDRD = 0x3E; // Speaker & TXD & J3 J4 J5 |
DDRD |=0x80; // J7 |
PORTD = 0xF7; // LED |
MCUSR &=~(1<<WDRF); |
WDTCSR |= (1<<WDCE)|(1<<WDE); |
WDTCSR = 0; |
beeptime = 2000; |
StickGier = 0; PPM_in[K_GAS] = 0;StickRoll = 0; StickNick = 0; |
ROT_OFF; |
Timer_Init(); |
UART_Init(); |
rc_sum_init(); |
ADC_Init(); |
i2c_init(); |
// SPI_MasterInit(); |
sei(); |
VersionInfo.Hauptversion = VERSION_HAUPTVERSION; |
VersionInfo.Nebenversion = VERSION_NEBENVERSION; |
VersionInfo.PCKompatibel = VERSION_KOMPATIBEL; |
printf("\n\rFlightControl\n\rHardware:%d.%d\n\rSoftware:V%d.%d%c ",PlatinenVersion/10,PlatinenVersion%10, VERSION_HAUPTVERSION, VERSION_NEBENVERSION,VERSION_INDEX + 'a'); |
printf("\n\r=============================="); |
GRN_ON; |
#define EE_DATENREVISION 68 // wird angepasst, wenn sich die EEPROM-Daten geändert haben |
if(eeprom_read_byte(&EEPromArray[EEPROM_ADR_VALID]) != EE_DATENREVISION) |
{ |
printf("\n\rInit. EEPROM: Generiere Default-Parameter..."); |
DefaultKonstanten1(); |
for (unsigned char i=0;i<6;i++) |
{ |
if(i==2) DefaultKonstanten2(); // Kamera |
if(i==3) DefaultKonstanten3(); // Beginner |
if(i>3) DefaultKonstanten2(); // Kamera |
WriteParameterSet(i, (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
} |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], 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 nicht abgeglichen!"); |
} |
ReadParameterSet(GetActiveParamSetNumber(), (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
printf("\n\rBenutze Parametersatz %d", GetActiveParamSetNumber()); |
if(EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) |
{ |
printf("\n\rAbgleich Luftdrucksensor.."); |
timer = SetDelay(1000); |
SucheLuftruckOffset(); |
while (!CheckDelay(timer)); |
printf("OK\n\r"); |
} |
SetNeutral(); |
ROT_OFF; |
beeptime = 2000; |
DebugIn.Analog[1] = 1000; |
DebugIn.Digital[0] = 0x55; |
printf("\n\rSteuerung: "); |
if (EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) printf("HeadingHold"); |
else printf("Neutral"); |
printf("\n\n\r"); |
LcdClear(); |
I2CTimeout = 5000; |
while (1) |
{ |
if (UpdateMotor) // ReglerIntervall |
{ |
// SPI_TransmitByte(); |
UpdateMotor=0; |
//PORTD |= 0x08; |
MotorRegler(); |
//PORTD &= ~0x08; |
SendMotorData(); |
ROT_OFF; |
if(PcZugriff) PcZugriff--; |
else |
{ |
DubWiseKeys[0] = 0; |
DubWiseKeys[1] = 0; |
ExternStickNick = 0; |
ExternStickRoll = 0; |
ExternStickGier = 0; |
} |
if(SenderOkay) SenderOkay--; |
if(!I2CTimeout) |
{ |
I2CTimeout = 5; |
i2c_reset(); |
if((BeepMuster == 0xffff) && MotorenEin) |
{ |
beeptime = 10000; |
BeepMuster = 0x0080; |
} |
} |
else |
{ |
I2CTimeout--; |
ROT_OFF; |
} |
} |
if(SIO_DEBUG) |
{ |
DatenUebertragung(); |
BearbeiteRxDaten(); |
} |
else BearbeiteRxDaten(); |
if(CheckDelay(timer)) |
{ |
if(UBat < EE_Parameter.UnterspannungsWarnung) |
{ |
if(BeepMuster == 0xffff) |
{ |
beeptime = 6000; |
BeepMuster = 0x0300; |
} |
} |
// SPI_StartTransmitPacket(); |
timer = SetDelay(100); |
} |
} |
return (1); |
} |
/branches/V0.67g/main.h |
---|
0,0 → 1,103 |
#ifndef _MAIN_H |
#define _MAIN_H |
//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 |
//#define SYSCLK 16000000L //Quarz Frequenz in Hz |
#endif |
// neue Hardware |
#define ROT_OFF {if(PlatinenVersion == 10) PORTB &=~0x01; else PORTB |= 0x01;} |
#define ROT_ON {if(PlatinenVersion == 10) PORTB |= 0x01; else PORTB &=~0x01;} |
#define ROT_FLASH PORTB ^= 0x01 |
#define GRN_OFF PORTB &=~0x02 |
#define GRN_ON PORTB |= 0x02 |
#define GRN_FLASH PORTB ^= 0x02 |
#define F_CPU SYSCLK |
//#ifndef F_CPU |
//#error ################## F_CPU nicht definiert oder ungültig ############# |
//#endif |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#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_PARAM_BEGIN 100 |
#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 SYSCLK |
//extern unsigned long SYSCLK; |
extern volatile int i_Nick[20],i_Roll[20],DiffNick,DiffRoll; |
extern volatile unsigned char SenderOkay; |
extern unsigned char CosinusNickWinkel, CosinusRollWinkel; |
extern unsigned char PlatinenVersion; |
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); |
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" |
#ifndef EEMEM |
#define EEMEM __attribute__ ((section (".eeprom"))) |
#endif |
#define DEBUG_DISPLAY_INTERVALL 123 // in ms |
#define DELAY_US(x) ((unsigned int)( (x) * 1e-6 * F_CPU )) |
#endif //_MAIN_H |
/branches/V0.67g/makefile |
---|
0,0 → 1,417 |
#-------------------------------------------------------------------- |
# MCU name |
MCU = atmega644 |
F_CPU = 20000000 |
#------------------------------------------------------------------- |
HAUPT_VERSION = 0 |
NEBEN_VERSION = 67 |
VERSION_INDEX = 6 |
VERSION_KOMPATIBEL = 7 # PC-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 ($(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_INDEX), 0) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)a |
endif |
ifeq ($(VERSION_INDEX), 1) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)b |
endif |
ifeq ($(VERSION_INDEX), 2) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)c |
endif |
ifeq ($(VERSION_INDEX), 3) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)d |
endif |
ifeq ($(VERSION_INDEX), 4) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)e |
endif |
ifeq ($(VERSION_INDEX), 5) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)f |
endif |
ifeq ($(VERSION_INDEX), 6) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)g |
endif |
ifeq ($(VERSION_INDEX), 7) |
TARGET = Flight-Ctrl_$(HEX_NAME)_V$(HAUPT_VERSION)_$(NEBEN_VERSION)h |
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 = s |
########################################################################################################## |
# 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 |
########################################################################################################## |
# 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_HAUPTVERSION=$(HAUPT_VERSION) -DVERSION_NEBENVERSION=$(NEBEN_VERSION) -DVERSION_KOMPATIBEL=$(VERSION_KOMPATIBEL) -DVERSION_INDEX=$(VERSION_INDEX) |
# 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 = stk200 |
AVRDUDE_PROGRAMMER = dt006 |
#AVRDUDE_PROGRAMMER = ponyser |
#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_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_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. |
sizebefore: |
@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi |
sizeafter: |
@if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; fi |
# Display compiler version information. |
gccversion : |
@$(CC) --version |
# Convert ELF to COFF for use in debugging / simulating in |
# AVR Studio or VMLAB. |
COFFCONVERT=$(OBJCOPY) --debugging \ |
--change-section-address .data-0x800000 \ |
--change-section-address .bss-0x800000 \ |
--change-section-address .noinit-0x800000 \ |
--change-section-address .eeprom-0x810000 |
coff: $(TARGET).elf |
@echo |
@echo $(MSG_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof |
extcoff: $(TARGET).elf |
@echo |
@echo $(MSG_EXTENDED_COFF) $(TARGET).cof |
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof |
# Program the device. |
program: $(TARGET).hex $(TARGET).eep |
$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) |
# Create final output files (.hex, .eep) from ELF output file. |
%.hex: %.elf |
@echo |
@echo $(MSG_FLASH) $@ |
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ |
%.eep: %.elf |
@echo |
@echo $(MSG_EEPROM) $@ |
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ |
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@ |
# Create extended listing file from ELF output file. |
%.lss: %.elf |
@echo |
@echo $(MSG_EXTENDED_LISTING) $@ |
$(OBJDUMP) -h -S $< > $@ |
# Create a symbol table from ELF output file. |
%.sym: %.elf |
@echo |
@echo $(MSG_SYMBOL_TABLE) $@ |
avr-nm -n $< > $@ |
# Link: create ELF output file from object files. |
.SECONDARY : $(TARGET).elf |
.PRECIOUS : $(OBJ) |
%.elf: $(OBJ) |
@echo |
@echo $(MSG_LINKING) $@ |
$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) |
# Compile: create object files from C source files. |
%.o : %.c |
@echo |
@echo $(MSG_COMPILING) $< |
$(CC) -c $(ALL_CFLAGS) $< -o $@ |
# Compile: create assembler files from C source files. |
%.s : %.c |
$(CC) -S $(ALL_CFLAGS) $< -o $@ |
# Assemble: create object files from assembler source files. |
%.o : %.S |
@echo |
@echo $(MSG_ASSEMBLING) $< |
$(CC) -c $(ALL_ASFLAGS) $< -o $@ |
# Target: clean project. |
clean: begin clean_list finished end |
clean_list : |
@echo |
@echo $(MSG_CLEANING) |
# $(REMOVE) $(TARGET).hex |
$(REMOVE) $(TARGET).eep |
$(REMOVE) $(TARGET).obj |
$(REMOVE) $(TARGET).cof |
$(REMOVE) $(TARGET).elf |
$(REMOVE) $(TARGET).map |
$(REMOVE) $(TARGET).obj |
$(REMOVE) $(TARGET).a90 |
$(REMOVE) $(TARGET).sym |
$(REMOVE) $(TARGET).lnk |
$(REMOVE) $(TARGET).lss |
$(REMOVE) $(OBJ) |
$(REMOVE) $(LST) |
$(REMOVE) $(SRC:.c=.s) |
$(REMOVE) $(SRC:.c=.d) |
# Automatically generate C source code dependencies. |
# (Code originally taken from the GNU make user manual and modified |
# (See README.txt Credits).) |
# |
# Note that this will work with sh (bash) and sed that is shipped with WinAVR |
# (see the SHELL variable defined above). |
# This may not work with other shells or other seds. |
# |
%.d: %.c |
set -e; $(CC) -MM $(ALL_CFLAGS) $< \ |
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > $@; \ |
[ -s $@ ] || rm -f $@ |
# Remove the '-' if you want to see the dependency files generated. |
-include $(SRC:.c=.d) |
# Listing of phony targets. |
.PHONY : all begin finish end sizebefore sizeafter gccversion coff extcoff \ |
clean clean_list program |
/branches/V0.67g/menu.c |
---|
0,0 → 1,127 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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 RemoteTasten = 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) |
{ |
static unsigned char MaxMenue = 10,MenuePunkt=0; |
if(RemoteTasten & KEY1) { if(MenuePunkt) MenuePunkt--; else MenuePunkt = MaxMenue; LcdClear(); RemotePollDisplayLine = -1; } |
if(RemoteTasten & KEY2) { MenuePunkt++; LcdClear(); RemotePollDisplayLine = -1;} |
if((RemoteTasten & KEY1) && (RemoteTasten & KEY2)) MenuePunkt = 0; |
LCD_printfxy(17,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_HAUPTVERSION, VERSION_NEBENVERSION,VERSION_INDEX+'a'); |
LCD_printfxy(0,2,"Setting: %d ",GetActiveParamSetNumber()); |
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)",AdWertNick - AdNeutralNick, AdNeutralNick); |
LCD_printfxy(0,2,"Roll %4i (%3i)",AdWertRoll - AdNeutralRoll, AdNeutralRoll); |
LCD_printfxy(0,3,"Gier %4i (%3i)",MesswertGier, AdNeutralGier); |
} |
else |
{ |
LCD_printfxy(0,1,"Nick %4i (%3i)",AdWertNick - AdNeutralNick, AdNeutralNick/2); |
LCD_printfxy(0,2,"Roll %4i (%3i)",AdWertRoll - AdNeutralRoll, AdNeutralRoll/2); |
LCD_printfxy(0,3,"Gier %4i (%3i)",MesswertGier, AdNeutralGier/2); |
} |
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; |
default: MaxMenue = MenuePunkt - 1; |
MenuePunkt = 0; |
break; |
} |
RemoteTasten = 0; |
} |
/branches/V0.67g/menu.h |
---|
0,0 → 1,6 |
extern void Menu(void); |
extern void LcdClear(void); |
extern char DisplayBuff[80]; |
extern unsigned char DispPtr; |
extern unsigned char RemoteTasten; |
/branches/V0.67g/old_macros.h |
---|
0,0 → 1,47 |
/* |
For backwards compatibility only. |
Ingo Busker ingo@mikrocontroller.com |
*/ |
#ifndef cbi |
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) |
#endif |
#ifndef sbi |
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) |
#endif |
#ifndef inb |
#define inb(sfr) _SFR_BYTE(sfr) |
#endif |
#ifndef outb |
#define outb(sfr, val) (_SFR_BYTE(sfr) = (val)) |
#endif |
#ifndef inw |
#define inw(sfr) _SFR_WORD(sfr) |
#endif |
#ifndef outw |
#define outw(sfr, val) (_SFR_WORD(sfr) = (val)) |
#endif |
#ifndef outp |
#define outp(val, sfr) outb(sfr, val) |
#endif |
#ifndef inp |
#define inp(sfr) inb(sfr) |
#endif |
#ifndef BV |
#define BV(bit) _BV(bit) |
#endif |
#ifndef PRG_RDB |
#define PRG_RDB pgm_read_byte |
#endif |
/branches/V0.67g/printf_P.c |
---|
0,0 → 1,480 |
// Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist nicht von der Lizenz für den MikroKopter-Teil unterstellt |
/* |
Copyright (C) 1993 Free Software Foundation |
This file is part of the GNU IO Library. This library is free |
software; you can redistribute it and/or modify it under the |
terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) |
any later version. |
This library is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this library; see the file COPYING. If not, write to the Free |
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
As a special exception, if you link this library with files |
compiled with a GNU compiler to produce an executable, this does not cause |
the resulting executable to be covered by the GNU General Public License. |
This exception does not however invalidate any other reasons why |
the executable file might be covered by the GNU General Public License. */ |
/* |
* Copyright (c) 1990 Regents of the University of California. |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. [rescinded 22 July 1999] |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
/****************************************************************************** |
This file is a patched version of printf called _printf_P |
It is made to work with avr-gcc for Atmel AVR MCUs. |
There are some differences from standard printf: |
1. There is no floating point support (with fp the code is about 8K!) |
2. Return type is void |
3. Format string must be in program memory (by using macro printf this is |
done automaticaly) |
4. %n is not implemented (just remove the comment around it if you need it) |
5. If LIGHTPRINTF is defined, the code is about 550 bytes smaller and the |
folowing specifiers are disabled : |
space # * . - + p s o O |
6. A function void uart_sendchar(char c) is used for output. The UART must |
be initialized before using printf. |
Alexander Popov |
sasho@vip.orbitel.bg |
******************************************************************************/ |
/* |
* Actual printf innards. |
* |
* This code is large and complicated... |
*/ |
#include <string.h> |
#ifdef __STDC__ |
#include <stdarg.h> |
#else |
#include <varargs.h> |
#endif |
#include "main.h" |
//#define LIGHTPRINTF |
char PrintZiel; |
char Putchar(char zeichen) |
{ |
if(PrintZiel == OUT_LCD) { DisplayBuff[DispPtr++] = zeichen; return(1);} |
else return(uart_putchar(zeichen)); |
} |
void PRINT(const char * ptr, unsigned int len) |
{ |
for(;len;len--) Putchar(*ptr++); |
} |
void PRINTP(const char * ptr, unsigned int len) |
{ |
for(;len;len--) Putchar(pgm_read_byte(ptr++)); |
} |
void PAD_SP(signed char howmany) |
{ |
for(;howmany>0;howmany--) Putchar(' '); |
} |
void PAD_0(signed char howmany) |
{ |
for(;howmany>0;howmany--) Putchar('0'); |
} |
#define BUF 40 |
/* |
* Macros for converting digits to letters and vice versa |
*/ |
#define to_digit(c) ((c) - '0') |
#define is_digit(c) ((c)<='9' && (c)>='0') |
#define to_char(n) ((n) + '0') |
/* |
* Flags used during conversion. |
*/ |
#define LONGINT 0x01 /* long integer */ |
#define LONGDBL 0x02 /* long double; unimplemented */ |
#define SHORTINT 0x04 /* short integer */ |
#define ALT 0x08 /* alternate form */ |
#define LADJUST 0x10 /* left adjustment */ |
#define ZEROPAD 0x20 /* zero (as opposed to blank) pad */ |
#define HEXPREFIX 0x40 /* add 0x or 0X prefix */ |
void _printf_P (char ziel,char const *fmt0, ...) /* Works with string from FLASH */ |
{ |
va_list ap; |
register const char *fmt; /* format string */ |
register char ch; /* character from fmt */ |
register int n; /* handy integer (short term usage) */ |
register char *cp; /* handy char pointer (short term usage) */ |
const char *fmark; /* for remembering a place in fmt */ |
register unsigned char flags; /* flags as above */ |
signed char width; /* width from format (%8d), or 0 */ |
signed char prec; /* precision from format (%.3d), or -1 */ |
char sign; /* sign prefix (' ', '+', '-', or \0) */ |
unsigned long _ulong=0; /* integer arguments %[diouxX] */ |
#define OCT 8 |
#define DEC 10 |
#define HEX 16 |
unsigned char base; /* base for [diouxX] conversion */ |
signed char dprec; /* a copy of prec if [diouxX], 0 otherwise */ |
signed char dpad; /* extra 0 padding needed for integers */ |
signed char fieldsz; /* field size expanded by sign, dpad etc */ |
/* The initialization of 'size' is to suppress a warning that |
'size' might be used unitialized. It seems gcc can't |
quite grok this spaghetti code ... */ |
signed char size = 0; /* size of converted field or string */ |
char buf[BUF]; /* space for %c, %[diouxX], %[eEfgG] */ |
char ox[2]; /* space for 0x hex-prefix */ |
PrintZiel = ziel; // bestimmt, LCD oder UART |
va_start(ap, fmt0); |
fmt = fmt0; |
/* |
* Scan the format for conversions (`%' character). |
*/ |
for (;;) { |
for (fmark = fmt; (ch = pgm_read_byte(fmt)) != '\0' && ch != '%'; fmt++) |
/* void */; |
if ((n = fmt - fmark) != 0) { |
PRINTP(fmark, n); |
} |
if (ch == '\0') |
goto done; |
fmt++; /* skip over '%' */ |
flags = 0; |
dprec = 0; |
width = 0; |
prec = -1; |
sign = '\0'; |
rflag: ch = PRG_RDB(fmt++); |
reswitch: |
#ifdef LIGHTPRINTF |
if (ch=='o' || ch=='u' || (ch|0x20)=='x') { |
#else |
if (ch=='u' || (ch|0x20)=='x') { |
#endif |
if (flags&LONGINT) { |
_ulong=va_arg(ap, unsigned long); |
} else { |
register unsigned int _d; |
_d=va_arg(ap, unsigned int); |
_ulong = flags&SHORTINT ? (unsigned long)(unsigned short)_d : (unsigned long)_d; |
} |
} |
#ifndef LIGHTPRINTF |
if(ch==' ') { |
/* |
* ``If the space and + flags both appear, the space |
* flag will be ignored.'' |
* -- ANSI X3J11 |
*/ |
if (!sign) |
sign = ' '; |
goto rflag; |
} else if (ch=='#') { |
flags |= ALT; |
goto rflag; |
} else if (ch=='*'||ch=='-') { |
if (ch=='*') { |
/* |
* ``A negative field width argument is taken as a |
* - flag followed by a positive field width.'' |
* -- ANSI X3J11 |
* They don't exclude field widths read from args. |
*/ |
if ((width = va_arg(ap, int)) >= 0) |
goto rflag; |
width = -width; |
} |
flags |= LADJUST; |
flags &= ~ZEROPAD; /* '-' disables '0' */ |
goto rflag; |
} else if (ch=='+') { |
sign = '+'; |
goto rflag; |
} else if (ch=='.') { |
if ((ch = PRG_RDB(fmt++)) == '*') { |
n = va_arg(ap, int); |
prec = n < 0 ? -1 : n; |
goto rflag; |
} |
n = 0; |
while (is_digit(ch)) { |
n = n*10 + to_digit(ch); |
ch = PRG_RDB(fmt++); |
} |
prec = n < 0 ? -1 : n; |
goto reswitch; |
} else |
#endif /* LIGHTPRINTF */ |
if (ch=='0') { |
/* |
* ``Note that 0 is taken as a flag, not as the |
* beginning of a field width.'' |
* -- ANSI X3J11 |
*/ |
if (!(flags & LADJUST)) |
flags |= ZEROPAD; /* '-' disables '0' */ |
goto rflag; |
} else if (ch>='1' && ch<='9') { |
n = 0; |
do { |
n = 10 * n + to_digit(ch); |
ch = PRG_RDB(fmt++); |
} while (is_digit(ch)); |
width = n; |
goto reswitch; |
} else if (ch=='h') { |
flags |= SHORTINT; |
goto rflag; |
} else if (ch=='l') { |
flags |= LONGINT; |
goto rflag; |
} else if (ch=='c') { |
*(cp = buf) = va_arg(ap, int); |
size = 1; |
sign = '\0'; |
} else if (ch=='D'||ch=='d'||ch=='i') { |
if(ch=='D') |
flags |= LONGINT; |
if (flags&LONGINT) { |
_ulong=va_arg(ap, long); |
} else { |
register int _d; |
_d=va_arg(ap, int); |
_ulong = flags&SHORTINT ? (long)(short)_d : (long)_d; |
} |
if ((long)_ulong < 0) { |
_ulong = -_ulong; |
sign = '-'; |
} |
base = DEC; |
goto number; |
} else |
/* |
if (ch=='n') { |
if (flags & LONGINT) |
*va_arg(ap, long *) = ret; |
else if (flags & SHORTINT) |
*va_arg(ap, short *) = ret; |
else |
*va_arg(ap, int *) = ret; |
continue; // no output |
} else |
*/ |
#ifndef LIGHTPRINTF |
if (ch=='O'||ch=='o') { |
if (ch=='O') |
flags |= LONGINT; |
base = OCT; |
goto nosign; |
} else if (ch=='p') { |
/* |
* ``The argument shall be a pointer to void. The |
* value of the pointer is converted to a sequence |
* of printable characters, in an implementation- |
* defined manner.'' |
* -- ANSI X3J11 |
*/ |
/* NOSTRICT */ |
_ulong = (unsigned int)va_arg(ap, void *); |
base = HEX; |
flags |= HEXPREFIX; |
ch = 'x'; |
goto nosign; |
} else if (ch=='s') { // print a string from RAM |
if ((cp = va_arg(ap, char *)) == NULL) { |
cp=buf; |
cp[0] = '('; |
cp[1] = 'n'; |
cp[2] = 'u'; |
cp[4] = cp[3] = 'l'; |
cp[5] = ')'; |
cp[6] = '\0'; |
} |
if (prec >= 0) { |
/* |
* can't use strlen; can only look for the |
* NUL in the first `prec' characters, and |
* strlen() will go further. |
*/ |
char *p = (char*)memchr(cp, 0, prec); |
if (p != NULL) { |
size = p - cp; |
if (size > prec) |
size = prec; |
} else |
size = prec; |
} else |
size = strlen(cp); |
sign = '\0'; |
} else |
#endif /* LIGHTPRINTF */ |
if(ch=='U'||ch=='u') { |
if (ch=='U') |
flags |= LONGINT; |
base = DEC; |
goto nosign; |
} else if (ch=='X'||ch=='x') { |
base = HEX; |
/* leading 0x/X only if non-zero */ |
if (flags & ALT && _ulong != 0) |
flags |= HEXPREFIX; |
/* unsigned conversions */ |
nosign: sign = '\0'; |
/* |
* ``... diouXx conversions ... if a precision is |
* specified, the 0 flag will be ignored.'' |
* -- ANSI X3J11 |
*/ |
number: if ((dprec = prec) >= 0) |
flags &= ~ZEROPAD; |
/* |
* ``The result of converting a zero value with an |
* explicit precision of zero is no characters.'' |
* -- ANSI X3J11 |
*/ |
cp = buf + BUF; |
if (_ulong != 0 || prec != 0) { |
register unsigned char _d,notlastdigit; |
do { |
notlastdigit=(_ulong>=base); |
_d = _ulong % base; |
if (_d<10) { |
_d+='0'; |
} else { |
_d+='a'-10; |
if (ch=='X') _d&=~0x20; |
} |
*--cp=_d; |
_ulong /= base; |
} while (notlastdigit); |
#ifndef LIGHTPRINTF |
// handle octal leading 0 |
if (base==OCT && flags & ALT && *cp != '0') |
*--cp = '0'; |
#endif |
} |
size = buf + BUF - cp; |
} else { //default |
/* "%?" prints ?, unless ? is NUL */ |
if (ch == '\0') |
goto done; |
/* pretend it was %c with argument ch */ |
cp = buf; |
*cp = ch; |
size = 1; |
sign = '\0'; |
} |
/* |
* All reasonable formats wind up here. At this point, |
* `cp' points to a string which (if not flags&LADJUST) |
* should be padded out to `width' places. If |
* flags&ZEROPAD, it should first be prefixed by any |
* sign or other prefix; otherwise, it should be blank |
* padded before the prefix is emitted. After any |
* left-hand padding and prefixing, emit zeroes |
* required by a decimal [diouxX] precision, then print |
* the string proper, then emit zeroes required by any |
* leftover floating precision; finally, if LADJUST, |
* pad with blanks. |
*/ |
/* |
* compute actual size, so we know how much to pad. |
*/ |
fieldsz = size; |
dpad = dprec - size; |
if (dpad < 0) |
dpad = 0; |
if (sign) |
fieldsz++; |
else if (flags & HEXPREFIX) |
fieldsz += 2; |
fieldsz += dpad; |
/* right-adjusting blank padding */ |
if ((flags & (LADJUST|ZEROPAD)) == 0) |
PAD_SP(width - fieldsz); |
/* prefix */ |
if (sign) { |
PRINT(&sign, 1); |
} else if (flags & HEXPREFIX) { |
ox[0] = '0'; |
ox[1] = ch; |
PRINT(ox, 2); |
} |
/* right-adjusting zero padding */ |
if ((flags & (LADJUST|ZEROPAD)) == ZEROPAD) |
PAD_0(width - fieldsz); |
/* leading zeroes from decimal precision */ |
PAD_0(dpad); |
/* the string or number proper */ |
PRINT(cp, size); |
/* left-adjusting padding (always blank) */ |
if (flags & LADJUST) |
PAD_SP(width - fieldsz); |
} |
done: |
va_end(ap); |
} |
/branches/V0.67g/printf_P.h |
---|
0,0 → 1,19 |
#ifndef _PRINTF_P_H_ |
#define _PRINTF_P_H_ |
#include <avr/pgmspace.h> |
#define OUT_V24 0 |
#define OUT_LCD 1 |
void _printf_P (char, char const *fmt0, ...); |
extern char PrintZiel; |
#define printf_P(format, args...) _printf_P(OUT_V24,format , ## args) |
#define printf(format, args...) _printf_P(OUT_V24,PSTR(format) , ## args) |
#define LCD_printfxy(x,y,format, args...) { DispPtr = y * 20 + x; _printf_P(OUT_LCD,PSTR(format) , ## args);} |
#define LCD_printf(format, args...) { _printf_P(OUT_LCD,PSTR(format) , ## args);} |
#endif |
/branches/V0.67g/rc.c |
---|
0,0 → 1,84 |
/*####################################################################################### |
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 |
// PWM |
//TCCR1A = (1 << COM1B1) | (1 << WGM11) | (1 << WGM10); |
//TCCR1B |= (1 << WGM12); |
//OCR1B = 55; |
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 > (int) Parameter_UserParam2 * 10) && (signal < 8000)) |
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;} |
tmp = (3 * (PPM_in[index]) + signal) / 4; |
// if(tmp > signal+1) tmp--; else |
// if(tmp < signal-1) tmp++; |
PPM_diff[index] = tmp - PPM_in[index]; |
PPM_in[index] = tmp; |
} |
index++; |
if(index == 5) PORTD |= 0x20; else PORTD &= ~0x20; // Servosignal an J3 anlegen |
if(index == 6) PORTD |= 0x10; else PORTD &= ~0x10; // Servosignal an J4 anlegen |
if(index == 7) PORTD |= 0x08; else PORTD &= ~0x08; // Servosignal an J5 anlegen |
} |
} |
} |
/branches/V0.67g/rc.h |
---|
0,0 → 1,29 |
/*####################################################################################### |
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_TEILER CK64 |
#define TIMER_RELOAD_VALUE 250 |
//#define TIMER_TEILER CK256 // bei 20MHz |
//#define TIMER_RELOAD_VALUE -78 // bei 20MHz |
#endif |
#define GAS PPM_in[2] |
extern void rc_sum_init (void); |
extern volatile int PPM_in[11]; |
extern volatile int PPM_diff[11]; // das diffenzierte Stick-Signal |
extern volatile unsigned char NewPpmData; |
#endif //_RC_H |
/branches/V0.67g/spi.c |
---|
0,0 → 1,86 |
// ######################## SPI - FlightCtrl ################### |
#include "main.h" |
struct str_ToNaviCtrl ToNaviCtrl; |
struct str_FromNaviCtrl FromNaviCtrl; |
unsigned char SPI_BufferIndex; |
volatile unsigned char SPI_Buffer[sizeof(FromNaviCtrl)]; |
unsigned char *Ptr_buffer = (unsigned char *) &ToNaviCtrl; |
//------------------------------------------------------ |
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<<SPIE); // Enable SPI, Master, set clock rate fck/64 |
SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); |
} |
//------------------------------------------------------ |
void SPI_StartTransmitPacket(void) |
{ |
if ((SLAVE_SELECT_PORT & (1 << SPI_SLAVE_SELECT)) == 0) return; // transfer of prev. packet not completed |
SLAVE_SELECT_PORT &= ~(1 << SPI_SLAVE_SELECT); // SelectSlave |
UpdateSPI_Buffer(); // update buffer |
SPI_BufferIndex = 1; |
DebugOut.Analog[16]++; |
// -- Debug-Output --- |
cli(); |
DebugOut.Analog[20] = FromNaviCtrl.Comp; |
DebugOut.Analog[21] = FromNaviCtrl.GPS_Nick; |
DebugOut.Analog[22] = FromNaviCtrl.GPS_Roll; |
DebugOut.Analog[23] = FromNaviCtrl.CompassValue; |
sei(); |
//---- |
SPDR = ToNaviCtrl.Comp; // Start transmission |
} |
//------------------------------------------------------ |
//SIGNAL(SIG_SPI) |
void SPI_TransmitByte(void) |
{ |
if (!(SPSR & (1 << SPIF))) return; |
if (SPI_BufferIndex < sizeof(FromNaviCtrl)) |
{ SPI_Buffer[SPI_BufferIndex]= SPDR; // get data |
//if(SPDR!= 0x00) DebugOut.Analog[19]++; ; |
} |
if (SPI_BufferIndex < sizeof(ToNaviCtrl)) |
{ SPDR = Ptr_buffer[SPI_BufferIndex]; |
} |
else |
{ |
unsigned char *ptr = (unsigned char *)&FromNaviCtrl; |
unsigned char i; |
SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
memcpy(ptr, (unsigned char *) SPI_Buffer, sizeof(SPI_Buffer)); |
} |
SPI_BufferIndex++; |
} |
//------------------------------------------------------ |
void UpdateSPI_Buffer(void) |
{ |
cli(); |
ToNaviCtrl.Comp = SPI_PROTOCOL_COMP; |
ToNaviCtrl.IntegralNick = (int) (IntegralNick >> 4); |
ToNaviCtrl.IntegralRoll = (int) (IntegralRoll >> 4); |
ToNaviCtrl.StickNick = (char) StickNick; |
ToNaviCtrl.StickRoll = (char) StickRoll; |
ToNaviCtrl.StickGier = (char) StickGier; |
sei(); |
} |
/branches/V0.67g/spi.h |
---|
0,0 → 1,46 |
// ######################## SPI - FlightCtrl ################### |
#ifndef _SPI_H |
#define _SPI_H |
#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 |
#define SLAVE_SELECT_DDR_PORT DDRC |
#define SLAVE_SELECT_PORT PORTC |
#define SPI_SLAVE_SELECT PC5 |
struct str_ToNaviCtrl |
{ |
unsigned char Comp; |
int IntegralNick; |
int IntegralRoll; |
char StickNick,StickRoll,StickGier; |
}; |
struct str_FromNaviCtrl |
{ |
unsigned char Comp; |
int GPS_Nick; |
int GPS_Roll; |
int CompassValue; |
}; |
extern struct str_ToNaviCtrl ToNaviCtrl; |
extern struct str_FromNaviCtrl FromNaviCtrl; |
extern void SPI_MasterInit(void); |
extern void SPI_StartTransmitPacket(void); |
extern void UpdateSPI_Buffer(void); |
extern void SPI_TransmitByte(void); |
#endif |
/branches/V0.67g/timer0.c |
---|
0,0 → 1,165 |
#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; |
unsigned int BeepMuster = 0xffff; |
int ServoValue = 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(!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 < 4000)) |
{ |
KompassValue = cntKompass; |
} |
// if(cntKompass < 10) cntKompass = 10; |
// KompassValue = (unsigned long)((unsigned long)(cntKompass-10)*720L + 1L) / 703L; |
KompassRichtung = ((540 + KompassValue - KompassStartwert) % 360) - 180; |
cntKompass = 0; |
} |
} |
} |
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; |
TCCR2A=(1<<COM2A1)|(1<<COM2A0)|3; |
TCCR2B=(0<<CS20)|(1<<CS21)|(1<<CS22); |
// TIMSK2 |= _BV(TOIE2); |
TIMSK2 |= _BV(OCIE2A); |
TIMSK0 |= _BV(TOIE0); |
OCR2A = 10; |
TCNT2 = 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)) ANALOG_ON; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Servo ansteuern |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
SIGNAL(SIG_OUTPUT_COMPARE2A) |
{ |
static unsigned char timer = 10; |
if(!timer--) |
{ |
TCCR2A=(1<<COM2A1)|(0<<COM2A0)|3; |
ServoValue = Parameter_ServoNickControl; |
if(EE_Parameter.ServoNickCompInvert & 0x01) ServoValue += ((long) EE_Parameter.ServoNickComp * (IntegralNick / 128)) / 512; |
else ServoValue -= ((long) EE_Parameter.ServoNickComp * (IntegralNick / 128)) / 512; |
if(ServoValue < EE_Parameter.ServoNickMin) ServoValue = EE_Parameter.ServoNickMin; |
else if(ServoValue > EE_Parameter.ServoNickMax) ServoValue = EE_Parameter.ServoNickMax; |
OCR2A = ServoValue;// + 75; |
timer = EE_Parameter.ServoNickRefresh; |
} |
else |
{ |
TCCR2A =3; |
PORTD&=~0x80; |
} |
} |
/branches/V0.67g/timer0.h |
---|
0,0 → 1,16 |
#define TIMER_TEILER CK8 |
#define TIMER_RELOAD_VALUE 250 |
void Timer_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; |
/branches/V0.67g/twimaster.c |
---|
0,0 → 1,152 |
/*############################################################################ |
############################################################################*/ |
#include "main.h" |
unsigned char twi_state = 0; |
unsigned char motor = 0; |
unsigned char motorread = 0; |
unsigned char motor_rx[8]; |
//############################################################################ |
//Initzialisieren der I2C (TWI) Schnittstelle |
void i2c_init(void) |
//############################################################################ |
{ |
TWSR = 0; |
TWBR = ((SYSCLK/SCL_CLOCK)-16)/2; |
} |
//############################################################################ |
//Start I2C |
char i2c_start(void) |
//############################################################################ |
{ |
TWCR = (1<<TWSTA) | (1<<TWEN) | (1<<TWINT) | (1<<TWIE); |
return(0); |
} |
//############################################################################ |
//Start I2C |
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); |
} |
//############################################################################ |
//Start I2C |
char i2c_write_byte(char byte) |
//############################################################################ |
{ |
TWSR = 0x00; |
TWDR = byte; |
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE); |
return(0); |
} |
//############################################################################ |
//Start I2C |
SIGNAL (TWI_vect) |
//############################################################################ |
{ |
switch (twi_state++) |
{ |
case 0: |
i2c_write_byte(0x52+(motor*2)); |
break; |
case 1: |
switch(motor++) |
{ |
case 0: |
i2c_write_byte(Motor_Vorne); |
break; |
case 1: |
i2c_write_byte(Motor_Hinten); |
break; |
case 2: |
i2c_write_byte(Motor_Rechts); |
break; |
case 3: |
i2c_write_byte(Motor_Links); |
break; |
} |
break; |
case 2: |
i2c_stop(); |
if (motor<4) twi_state = 0; |
else motor = 0; |
i2c_start(); |
break; |
//Liest Daten von Motor |
case 3: |
i2c_write_byte(0x53+(motorread*2)); |
break; |
case 4: |
switch(motorread) |
{ |
case 0: |
i2c_write_byte(Motor_Vorne); |
break; |
case 1: |
i2c_write_byte(Motor_Hinten); |
break; |
case 2: |
i2c_write_byte(Motor_Rechts); |
break; |
case 3: |
i2c_write_byte(Motor_Links); |
break; |
} |
break; |
case 5: //1 Byte vom Motor lesen |
motor_rx[motorread] = TWDR; |
case 6: |
switch(motorread) |
{ |
case 0: |
i2c_write_byte(Motor_Vorne); |
break; |
case 1: |
i2c_write_byte(Motor_Hinten); |
break; |
case 2: |
i2c_write_byte(Motor_Rechts); |
break; |
case 3: |
i2c_write_byte(Motor_Links); |
break; |
} |
break; |
case 7: //2 Byte vom Motor lesen |
motor_rx[motorread+4] = TWDR; |
motorread++; |
if (motorread>3) motorread=0; |
i2c_stop(); |
I2CTimeout = 10; |
twi_state = 0; |
} |
TWCR |= 0x80; |
} |
/branches/V0.67g/twimaster.h |
---|
0,0 → 1,33 |
/*############################################################################ |
############################################################################*/ |
#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 unsigned char twi_state; |
extern unsigned char motor; |
extern unsigned char motorread; |
extern unsigned char motor_rx[8]; |
void i2c_reset(void); |
extern void i2c_init (void); // I2C initialisieren |
extern char i2c_start (void); // Start I2C |
extern void i2c_stop (void); // Stop I2C |
extern char i2c_write_byte (char byte); // 1 Byte schreiben |
extern void i2c_reset(void); |
#endif |
/branches/V0.67g/uart.c |
---|
0,0 → 1,388 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + only for non-profit use |
// + www.MikroKopter.com |
// + see the File "License.txt" for further Informations |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#include "main.h" |
#include "uart.h" |
unsigned char DebugGetAnforderung = 0,DebugDisplayAnforderung = 0,DebugDataAnforderung = 0,GetVersionAnforderung = 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 volatile char PC_DebugTimeout = 0; |
unsigned char RemotePollDisplayLine = 0; |
unsigned char NurKanalAnforderung = 0; |
unsigned char DebugTextAnforderung = 255; |
unsigned char PcZugriff = 100; |
unsigned char MotorTest[4] = {0,0,0,0}; |
unsigned char DubWiseKeys[3] = {0,0,0}; |
unsigned char MeineSlaveAdresse; |
struct str_DebugOut DebugOut; |
struct str_Debug DebugIn; |
struct str_VersionInfo VersionInfo; |
int Debug_Timer; |
const unsigned char ANALOG_TEXT[32][16] = |
{ |
//1234567890123456 |
"IntegralNick ", //0 |
"IntegralRoll ", |
"AccNick ", |
"AccRoll ", |
"GyroGier ", |
"HoehenWert ", //5 |
"AccZ ", |
"Gas ", |
"KompassValue ", |
"Spannung ", |
"Empfang ", //10 |
"Analog11 ", |
"Motor_Vorne ", |
"Motor_Hinten ", |
"Motor_Links ", |
"Motor_Rechts ", //15 |
"Acc_Z ", |
"MittelAccNick ", |
"MittelAccRoll ", |
"IntegralErrNick ", |
"IntegralErrRoll ", //20 |
"MittelIntNick ", |
"MittelIntRoll ", |
"NeutralNick ", |
"RollOffset ", |
"IntRoll*Faktor ", //25 |
"Analog26 ", |
"DirektAusglRoll ", |
"MesswertRoll ", |
"AusgleichRoll ", |
"I-LageRoll ", //30 |
"StickRoll " |
}; |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//++ 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; |
RxdBuffer[buf_ptr] = '\r'; |
if(RxdBuffer[2] == 'R') wdt_enable(WDTO_250MS); // Reset-Commando |
} |
} |
else |
switch(UartState) |
{ |
case 0: |
if(SioTmp == '#' && !NeuerDatensatzEmpfangen) UartState = 1; // Startzeichen und Daten schon verarbeitet |
buf_ptr = 0; |
RxdBuffer[buf_ptr++] = SioTmp; |
crc = SioTmp; |
break; |
case 1: // Adresse auswerten |
UartState++; |
RxdBuffer[buf_ptr++] = SioTmp; |
crc += SioTmp; |
break; |
case 2: // Eingangsdaten sammeln |
RxdBuffer[buf_ptr] = SioTmp; |
if(buf_ptr < MAX_EMPFANGS_BUFF) buf_ptr++; |
else UartState = 0; |
crc += SioTmp; |
break; |
default: |
UartState = 0; |
break; |
} |
} |
// -------------------------------------------------------------------------- |
void AddCRC(unsigned int wieviele) |
{ |
unsigned int tmpCRC = 0,i; |
for(i = 0; i < wieviele;i++) |
{ |
tmpCRC += SendeBuffer[i]; |
} |
tmpCRC %= 4096; |
SendeBuffer[i++] = '=' + tmpCRC / 64; |
SendeBuffer[i++] = '=' + tmpCRC % 64; |
SendeBuffer[i++] = '\r'; |
UebertragungAbgeschlossen = 0; |
UDR = SendeBuffer[0]; |
} |
// -------------------------------------------------------------------------- |
void SendOutData(unsigned char cmd,unsigned char modul, unsigned char *snd, unsigned char len) |
{ |
unsigned int pt = 0; |
unsigned char a,b,c; |
unsigned char ptr = 0; |
SendeBuffer[pt++] = '#'; // Startzeichen |
SendeBuffer[pt++] = modul; // Adresse (a=0; b=1,...) |
SendeBuffer[pt++] = cmd; // Commando |
while(len) |
{ |
if(len) { a = snd[ptr++]; len--;} else a = 0; |
if(len) { b = snd[ptr++]; len--;} else b = 0; |
if(len) { c = snd[ptr++]; len--;} 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); |
} |
AddCRC(pt); |
} |
// -------------------------------------------------------------------------- |
void Decode64(unsigned char *ptrOut, unsigned char len, unsigned char ptrIn,unsigned char max) // Wohin mit den Daten; Wie lang; Wo im RxdBuffer |
{ |
unsigned char a,b,c,d; |
unsigned char ptr = 0; |
unsigned char x,y,z; |
while(len) |
{ |
a = RxdBuffer[ptrIn++] - '='; |
b = RxdBuffer[ptrIn++] - '='; |
c = RxdBuffer[ptrIn++] - '='; |
d = RxdBuffer[ptrIn++] - '='; |
if(ptrIn > max - 2) break; // nicht mehr Daten verarbeiten, als empfangen wurden |
x = (a << 2) | (b >> 4); |
y = ((b & 0x0f) << 4) | (c >> 2); |
z = ((c & 0x03) << 6) | d; |
if(len--) ptrOut[ptr++] = x; else break; |
if(len--) ptrOut[ptr++] = y; else break; |
if(len--) ptrOut[ptr++] = z; else break; |
} |
} |
// -------------------------------------------------------------------------- |
void BearbeiteRxDaten(void) |
{ |
if(!NeuerDatensatzEmpfangen) return; |
// unsigned int tmp_int_arr1[1]; |
// unsigned int tmp_int_arr2[2]; |
// unsigned int tmp_int_arr3[3]; |
unsigned char tmp_char_arr2[2]; |
// unsigned char tmp_char_arr3[3]; |
// unsigned char tmp_char_arr4[4]; |
//if(!MotorenEin) |
PcZugriff = 255; |
switch(RxdBuffer[2]) |
{ |
case 'a':// Texte der Analogwerte |
Decode64((unsigned char *) &tmp_char_arr2[0],sizeof(tmp_char_arr2),3,AnzahlEmpfangsBytes); |
DebugTextAnforderung = tmp_char_arr2[0]; |
break; |
case 'c':// Debugdaten incl. Externe IOs usw |
Decode64((unsigned char *) &DebugIn,sizeof(DebugIn),3,AnzahlEmpfangsBytes); |
/* for(unsigned char i=0; i<4;i++) |
{ |
EE_CheckAndWrite(&EE_Buffer[EE_DEBUGWERTE + i*2], DebugIn.Analog[i]); |
EE_CheckAndWrite(&EE_Buffer[EE_DEBUGWERTE + i*2 + 1], DebugIn.Analog[i] >> 8); |
}*/ |
RemoteTasten |= DebugIn.RemoteTasten; |
DebugDataAnforderung = 1; |
break; |
case 'h':// x-1 Displayzeilen |
Decode64((unsigned char *) &tmp_char_arr2[0],sizeof(tmp_char_arr2),3,AnzahlEmpfangsBytes); |
RemoteTasten |= tmp_char_arr2[0]; |
if(tmp_char_arr2[1] == 255) NurKanalAnforderung = 1; else NurKanalAnforderung = 0; // keine Displaydaten |
DebugDisplayAnforderung = 1; |
break; |
case 't':// Motortest |
Decode64((unsigned char *) &MotorTest[0],sizeof(MotorTest),3,AnzahlEmpfangsBytes); |
break; |
case 'k':// Keys von DubWise |
Decode64((unsigned char *) &DubWiseKeys[0],sizeof(DubWiseKeys),3,AnzahlEmpfangsBytes); |
break; |
case 'v': // Version-Anforderung und Ausbaustufe |
GetVersionAnforderung = 1; |
break; |
case 'g':// "Get"-Anforderung für Debug-Daten |
// Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
DebugGetAnforderung = 1; |
break; |
case 'q':// "Get"-Anforderung für Settings |
// Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
Decode64((unsigned char *) &tmp_char_arr2[0],sizeof(tmp_char_arr2),3,AnzahlEmpfangsBytes); |
if(tmp_char_arr2[0] != 0xff) |
{ |
if(tmp_char_arr2[0] > 5) tmp_char_arr2[0] = 5; |
ReadParameterSet(tmp_char_arr2[0], (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
SendOutData('L' + tmp_char_arr2[0] -1,MeineSlaveAdresse,(unsigned char *) &EE_Parameter.Kanalbelegung[0],STRUCT_PARAM_LAENGE); |
} |
else |
SendOutData('L' + GetActiveParamSetNumber()-1,MeineSlaveAdresse,(unsigned char *) &EE_Parameter.Kanalbelegung[0],STRUCT_PARAM_LAENGE); |
break; |
case 'l': |
case 'm': |
case 'n': |
case 'o': |
case 'p': // Parametersatz speichern |
Decode64((unsigned char *) &EE_Parameter.Kanalbelegung[0],STRUCT_PARAM_LAENGE,3,AnzahlEmpfangsBytes); |
WriteParameterSet(RxdBuffer[2] - 'l' + 1, (unsigned char *) &EE_Parameter.Kanalbelegung[0], STRUCT_PARAM_LAENGE); |
eeprom_write_byte(&EEPromArray[EEPROM_ADR_ACTIVE_SET], RxdBuffer[2] - 'l' + 1); // aktiven Datensatz merken |
Umschlag180Nick = (long) EE_Parameter.WinkelUmschlagNick * 2500L; |
Umschlag180Roll = (long) EE_Parameter.WinkelUmschlagRoll * 2500L; |
Piep(GetActiveParamSetNumber()); |
break; |
} |
// DebugOut.AnzahlZyklen = Debug_Timer_Intervall; |
NeuerDatensatzEmpfangen = 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(200); |
} |
//--------------------------------------------------------------------------------------------- |
void DatenUebertragung(void) |
{ |
if(!UebertragungAbgeschlossen) return; |
if(DebugGetAnforderung && UebertragungAbgeschlossen) // Bei Get werden die vom PC einstellbaren Werte vom PC zurückgelesen |
{ |
SendOutData('G',MeineSlaveAdresse,(unsigned char *) &DebugIn,sizeof(DebugIn)); |
DebugGetAnforderung = 0; |
} |
if((CheckDelay(Debug_Timer) || DebugDataAnforderung) && UebertragungAbgeschlossen) |
{ |
SendOutData('D',MeineSlaveAdresse,(unsigned char *) &DebugOut,sizeof(DebugOut)); |
DebugDataAnforderung = 0; |
Debug_Timer = SetDelay(MIN_DEBUG_INTERVALL); |
} |
if(DebugTextAnforderung != 255) // Texte für die Analogdaten |
{ |
SendOutData('A',DebugTextAnforderung + '0',(unsigned char *) ANALOG_TEXT[DebugTextAnforderung],16); |
DebugTextAnforderung = 255; |
} |
if(DebugDisplayAnforderung && UebertragungAbgeschlossen) |
{ |
Menu(); |
DebugDisplayAnforderung = 0; |
if(++RemotePollDisplayLine == 4 || NurKanalAnforderung) |
{ |
SendOutData('4',0,(unsigned char *)&PPM_in,sizeof(PPM_in)); // DisplayZeile übertragen |
RemotePollDisplayLine = -1; |
} |
else SendOutData('0' + RemotePollDisplayLine,0,(unsigned char *)&DisplayBuff[20 * RemotePollDisplayLine],20); // DisplayZeile übertragen |
} |
if(GetVersionAnforderung && UebertragungAbgeschlossen) |
{ |
SendOutData('V',MeineSlaveAdresse,(unsigned char *) &VersionInfo,sizeof(VersionInfo)); |
GetVersionAnforderung = 0; |
} |
} |
/branches/V0.67g/uart.h |
---|
0,0 → 1,100 |
#ifndef _UART_H |
#define _UART_H |
#define MAX_SENDE_BUFF 150 |
#define MAX_EMPFANGS_BUFF 150 |
#define DUB_KEY_UP 4 |
#define DUB_KEY_DOWN 8 |
#define DUB_KEY_RIGHT 32 |
#define DUB_KEY_LEFT 16 |
#define DUB_KEY_FIRE 64 |
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 char MeineSlaveAdresse; |
extern unsigned char PcZugriff; |
extern unsigned char RemotePollDisplayLine; |
extern int Debug_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 DecodeNMEA(void); |
extern void BearbeiteRxDaten(void); |
extern unsigned char MotorTest[4]; |
extern unsigned char DubWiseKeys[3]; |
struct str_DebugOut |
{ |
unsigned char Digital[2]; |
unsigned int Analog[32]; // Debugwerte |
}; |
extern struct str_DebugOut DebugOut; |
struct str_Debug |
{ |
unsigned char Digital[2]; |
unsigned char RemoteTasten; |
unsigned int Analog[4]; |
}; |
extern struct str_Debug DebugIn; |
struct str_VersionInfo |
{ |
unsigned char Hauptversion; |
unsigned char Nebenversion; |
unsigned char PCKompatibel; |
unsigned char Rserved[7]; |
}; |
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 |
#endif //_UART_H |
/branches/V0.67g/version.txt |
---|
0,0 → 1,107 |
------- |
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 |
- Giersteuerwert im Mischer auf Gas/2 begrenzt |
- Die Analogwerte des ACC-Sensors können dauerhaft im EEPROM gespeichert werden |
- Das Integral des Hauptreglers wird jetzt linear entladen und nicht mehr proportional |