/tags/V0.68d/FlightCtrl.aps |
---|
0,0 → 1,0 |
<AVRStudio><MANAGEMENT><ProjectName>FlightCtrl</ProjectName><Created>15-May-2007 11:20:41</Created><LastEdit>11-Oct-2007 22:58:54</LastEdit><ICON>241</ICON><ProjectType>0</ProjectType><Created>15-May-2007 11:20:41</Created><Version>4</Version><Build>4, 13, 0, 528</Build><ProjectTypeName>AVR GCC</ProjectTypeName></MANAGEMENT><CODE_CREATION><ObjectFile>default\Flight-Ctrl.elf</ObjectFile><EntryFile></EntryFile><SaveFolder>F:\SVN\MikroKopter\FlightCtrl\branches\V0.64_ZeroWarnings\</SaveFolder></CODE_CREATION><DEBUG_TARGET><CURRENT_TARGET>AVR Simulator</CURRENT_TARGET><CURRENT_PART>ATmega644.xml</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND><HIDE>false</HIDE></IO_EXPAND><REGISTERNAMES><Register>R00</Register><Register>R01</Register><Register>R02</Register><Register>R03</Register><Register>R04</Register><Register>R05</Register><Register>R06</Register><Register>R07</Register><Register>R08</Register><Register>R09</Register><Register>R10</Register><Register>R11</Register><Register>R12</Register><Register>R13</Register><Register>R14</Register><Register>R15</Register><Register>R16</Register><Register>R17</Register><Register>R18</Register><Register>R19</Register><Register>R20</Register><Register>R21</Register><Register>R22</Register><Register>R23</Register><Register>R24</Register><Register>R25</Register><Register>R26</Register><Register>R27</Register><Register>R28</Register><Register>R29</Register><Register>R30</Register><Register>R31</Register></REGISTERNAMES><COM>Auto</COM><COMType>0</COMType><WATCHNUM>0</WATCHNUM><WATCHNAMES><Pane0></Pane0><Pane1></Pane1><Pane2></Pane2><Pane3></Pane3></WATCHNAMES><BreakOnTrcaeFull>0</BreakOnTrcaeFull></DEBUG_TARGET><Debugger><Triggers></Triggers></Debugger><AVRGCCPLUGIN><FILES><SOURCEFILE>uart.c</SOURCEFILE><SOURCEFILE>analog.c</SOURCEFILE><SOURCEFILE>eeprom.c</SOURCEFILE><SOURCEFILE>fc.c</SOURCEFILE><SOURCEFILE>GPS.c</SOURCEFILE><SOURCEFILE>main.c</SOURCEFILE><SOURCEFILE>menu.c</SOURCEFILE><SOURCEFILE>printf_P.c</SOURCEFILE><SOURCEFILE>rc.c</SOURCEFILE><SOURCEFILE>timer0.c</SOURCEFILE><SOURCEFILE>twimaster.c</SOURCEFILE><HEADERFILE>uart.h</HEADERFILE><HEADERFILE>_Settings.h</HEADERFILE><HEADERFILE>analog.h</HEADERFILE><HEADERFILE>fc.h</HEADERFILE><HEADERFILE>gps.h</HEADERFILE><HEADERFILE>main.h</HEADERFILE><HEADERFILE>menu.h</HEADERFILE><HEADERFILE>old_macros.h</HEADERFILE><HEADERFILE>printf_P.h</HEADERFILE><HEADERFILE>rc.h</HEADERFILE><HEADERFILE>Settings.h</HEADERFILE><HEADERFILE>timer0.h</HEADERFILE><HEADERFILE>twimaster.h</HEADERFILE></FILES><CONFIGS><CONFIG><NAME>default</NAME><USESEXTERNALMAKEFILE>NO</USESEXTERNALMAKEFILE><EXTERNALMAKEFILE></EXTERNALMAKEFILE><PART>atmega644</PART><HEX>1</HEX><LIST>1</LIST><MAP>1</MAP><OUTPUTFILENAME>Flight-Ctrl.elf</OUTPUTFILENAME><OUTPUTDIR>default\</OUTPUTDIR><ISDIRTY>1</ISDIRTY><OPTIONS><OPTION><FILE>GPS.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>analog.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>eeprom.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>fc.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>main.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>menu.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>printf_P.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>rc.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>timer0.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>twimaster.c</FILE><OPTIONLIST></OPTIONLIST></OPTION><OPTION><FILE>uart.c</FILE><OPTIONLIST></OPTIONLIST></OPTION></OPTIONS><INCDIRS/><LIBDIRS/><LIBS><LIB>libc.a</LIB><LIB>libm.a</LIB></LIBS><LINKOBJECTS/><OPTIONSFORALL>-Wall -gdwarf-2 -Wstrict-prototypes -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -DVERSION_HAUPTVERSION=0 -DVERSION_NEBENVERSION=64 -DVERSION_KOMPATIBEL=5</OPTIONSFORALL><LINKEROPTIONS></LINKEROPTIONS><SEGMENTS/></CONFIG></CONFIGS><LASTCONFIG>default</LASTCONFIG><USES_WINAVR>1</USES_WINAVR><GCC_LOC>C:\Program Files\WinAVR\bin\avr-gcc.exe</GCC_LOC><MAKE_LOC>C:\Program Files\WinAVR\utils\bin\make.exe</MAKE_LOC></AVRGCCPLUGIN><IOView><usergroups/></IOView><Files><File00000><FileId>00000</FileId><FileName>main.c</FileName><Status>1</Status></File00000><File00001><FileId>00001</FileId><FileName>uart.c</FileName><Status>1</Status></File00001><File00002><FileId>00002</FileId><FileName>menu.c</FileName><Status>1</Status></File00002><File00003><FileId>00003</FileId><FileName>timer0.c</FileName><Status>1</Status></File00003><File00004><FileId>00004</FileId><FileName>fc.c</FileName><Status>1</Status></File00004><File00005><FileId>00005</FileId><FileName>fc.h</FileName><Status>1</Status></File00005><File00006><FileId>00006</FileId><FileName>menu.h</FileName><Status>1</Status></File00006><File00007><FileId>00007</FileId><FileName>TWIMASTER.C</FileName><Status>1</Status></File00007><File00008><FileId>00008</FileId><FileName>twimaster.h</FileName><Status>1</Status></File00008><File00009><FileId>00009</FileId><FileName>uart.h</FileName><Status>1</Status></File00009><File00010><FileId>00010</FileId><FileName>_Settings.h</FileName><Status>1</Status></File00010><File00011><FileId>00011</FileId><FileName>analog.h</FileName><Status>1</Status></File00011><File00012><FileId>00012</FileId><FileName>gps.h</FileName><Status>1</Status></File00012><File00013><FileId>00013</FileId><FileName>main.h</FileName><Status>1</Status></File00013><File00014><FileId>00014</FileId><FileName>old_macros.h</FileName><Status>1</Status></File00014><File00015><FileId>00015</FileId><FileName>printf_P.h</FileName><Status>1</Status></File00015><File00016><FileId>00016</FileId><FileName>rc.h</FileName><Status>1</Status></File00016><File00017><FileId>00017</FileId><FileName>Settings.h</FileName><Status>1</Status></File00017><File00018><FileId>00018</FileId><FileName>timer0.h</FileName><Status>1</Status></File00018></Files><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio> |
/tags/V0.68d/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; |
} |
/tags/V0.68d/Hex-Files/BootLoader_MEGA644_20MHZ_V0_1.hex |
---|
0,0 → 1,64 |
:10F8000011241FBECFEFD0E1DEBFCDBF11E0A0E0DD |
:10F81000B1E0E0EEFBEF02C005900D92A030B10721 |
:10F82000D9F712E0A0E0B1E001C01D92A230B1070B |
:10F83000E1F70C943B7C0C941D7C0895982F8091EB |
:10F84000C00085FFFCCF9093C60008958091C00052 |
:10F850008823E4F78091C600992708958DE40E94DB |
:10F860001E7C8BE40E941E7C82E40E941E7C8CE441 |
:10F870000E941E7C0895CFEFD0E1DEBFCDBFE0E057 |
:10F88000F0E014915F01772474BE98E10FB6F8940C |
:10F8900090936000109260000FBE7092C5008AE2E3 |
:10F8A0008093C4008091C00082608093C0009093D8 |
:10F8B000C10086E08093C200EF01072D8091C00057 |
:10F8C00087FF0DC0013031F48091C6008A3AB1F152 |
:10F8D00000E005C08091C6008B3109F401E0CE0143 |
:10F8E00021968436910528F11F3F41F0112331F014 |
:10F8F000E0910001F091010109951BC01092C50033 |
:10F900008AE28093C4008AE00E941E7C8DE00E94FF |
:10F910001E7C86E50E941E7C80E30E941E7C8EE297 |
:10F920000E941E7C81E30E941E7C8AE30E941E7C52 |
:10F9300005C080E593EC0197F1F7C0CF0E942E7CC3 |
:10F940000E94267C813611F489E547C1813471F427 |
:10F950000E94267CA82EBB24BA2CAA240E94267CB6 |
:10F960009927A82AB92AB694A79406C1823629F401 |
:10F9700089E50E941E7C81E00BC1823409F083C0BE |
:10F980000E94267C9927D82FCC270E94267C992775 |
:10F99000C82BD92B0E94267C082F12E0812E11E063 |
:10F9A000912EEE24FF2464010894811C911CEC1616 |
:10F9B000FD0618F40E94267C01C08FEFD6018C93BF |
:10F9C0000894E11CF11CBFEFEB16F10461F358F34E |
:10F9D000E4E77E1609F0DEC0063409F03DC0FFEF13 |
:10F9E000AF16F7EFBF0608F033C0DE01A5016627AA |
:10F9F0007727440F551F661F771F6A017B01C2E0FE |
:10FA0000D1E001E08991992729913327322F2227CC |
:10FA1000822B932B0C01FA0100935700E8951124D7 |
:10FA20004E5F5F4F6F4F7F4F129761F785E0F60192 |
:10FA300080935700E89507B600FCFDCF81E18093E5 |
:10FA40005700E89576956795579547955A0194C064 |
:10FA500080E00E941E7C90C0053409F08DC0F50145 |
:10FA60009E01A2E0B1E0E1BD8F2F992782BD8D916B |
:10FA700080BD3196FA9AF99AF999FECF215030401B |
:10FA800091F75F0179C0873609F047C00E94267C54 |
:10FA90009927D82ECC240E94267C9927C82AD92AB7 |
:10FAA0000E94267C863411F5E6016501EE24FF24D0 |
:10FAB000CC0CDD1CEE1CFF1CF60105911491802F6F |
:10FAC0000E941E7C812F99270E941E7C82E090E07C |
:10FAD000A0E0B0E0C80ED91EEA1EFB1E229761F717 |
:10FAE000F694E794D794C79456012ACF853409F049 |
:10FAF00027CF7501E1BC8F2D992782BDF89A089414 |
:10FB0000E11CF11C80B50E941E7C0894C108D1083C |
:10FB1000C114D10479F7570113CF853601F594E765 |
:10FB2000791651F580E090E0A0E0B0E023E0FC0120 |
:10FB300020935700E89507B600FCFDCF80509F4FFB |
:10FB4000AF4FBF4F8F3FE7EF9E07E0E0AE07E0E02B |
:10FB5000BE0768F381E180935700E8950DC08534B6 |
:10FB600069F488E190E02CE00FB6F894A8958093B2 |
:10FB700060000FBE209360008DE02FC08035E1F360 |
:10FB80008C34D1F3803711F483E527C0843721F416 |
:10FB90000E941E7C80E021C0843521F40E94267CD6 |
:10FBA000782EEACF8B3109F4C9CE8A3A09F4C6CE51 |
:10FBB000863529F480E30E941E7C81E30EC08337E2 |
:10FBC00041F489E00E941E7C86E90E941E7C8EE141 |
:10FBD00004C08B3109F4B4CE8FE30E941E7CB0CEFA |
:040000030000F80001 |
:00000001FF |
/tags/V0.68d/Hex-Files/Flight-Ctrl_MEGA644_V0_68d.hex |
---|
0,0 → 1,2062 |
:100000000C9432020C944D020C944D020C944D024F |
:100010000C944D020C944D020C944D020C944D0224 |
:100020000C944D020C94860C0C944D020C944D02D1 |
:100030000C94E6160C944D020C944D020C944D0257 |
:100040000C944D020C944D020C947F0B0C944D02B9 |
:100050000C94B4040C944D020C947E040C944D0248 |
:100060000C948B0D0C944D020C9410160C944D02B4 |
:100070000A0D466C69676874436F6E74726F6C0A20 |
:100080000D48617264776172653A25642E25640AB1 |
:100090000D536F6674776172653A5625642E256438 |
:1000A000256320000A0D3D3D3D3D3D3D3D3D3D3D2F |
:1000B0003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D70 |
:1000C0003D3D3D3D000A0D496E69742E2045455069 |
:1000D000524F4D3A2047656E6572696572652044DE |
:1000E000656661756C742D506172616D65746572C1 |
:1000F0002E2E2E000A0D414343206E696368742042 |
:1001000061626765676C696368656E21000A0D420C |
:10011000656E75747A6520506172616D6574657283 |
:100120007361747A202564000A0D4162676C656909 |
:100130006368204C756674647275636B73656E7367 |
:100140006F722E2E004F4B0A0D000A0D5374657509 |
:100150006572756E673A200048656164696E67482C |
:100160006F6C64004E65757472616C000A0A0D0054 |
:100170002E005B25695D005B25695D002B204D69C4 |
:100180006B726F4B6F70746572202B0048573A5634 |
:1001900025642E25642053573A25642E2564256353 |
:1001A0000053657474696E673A20256420002863E3 |
:1001B0002920486F6C676572204275737300486F21 |
:1001C0006568653A202020202025356900536F6C32 |
:1001D0006C486F6568653A20253569004C75667412 |
:1001E000647275636B3A20253569004F666620207E |
:1001F000202020203A20253569004B65696E652056 |
:100200000048F668656E726567656C756E670061BB |
:100210006B742E204C616765004E69636B3A202039 |
:100220002020202025356900526F6C6C3A20202058 |
:10023000202020253569004B6F6D706173733A2063 |
:100240002020253569004B313A25346920204B3276 |
:100250003A25346920004B333A25346920204B3449 |
:100260003A25346920004B353A25346920204B3635 |
:100270003A25346920004B373A25346920204B3821 |
:100280003A25346920004E693A2534692020526F9E |
:100290003A253469200047733A253469202047699C |
:1002A0003A253469200050313A25346920205032F3 |
:1002B0003A253469200050333A25346920205034DF |
:1002C0003A25346920004779726F202D2053656EDE |
:1002D000736F72004E69636B2025346920282533C3 |
:1002E000692900526F6C6C202534692028253369F8 |
:1002F000290047696572202534692028253369293A |
:10030000004E69636B202534692028253369290054 |
:10031000526F6C6C202534692028253369290047E9 |
:1003200069657220253469202825336929004143F5 |
:1003300043202D2053656E736F72004E69636B20EE |
:1003400025346920282533692900526F6C6C2025DB |
:10035000346920282533692900486F6368202534D3 |
:1003600069202825336929005370616E6E756E67A8 |
:100370003A202025356900456D70662E5065676509 |
:100380006C3A253569004B6F6D70617373202020C6 |
:1003900020202020005269636874756E673A20201F |
:1003A000253569004D657373776572743A20202591 |
:1003B00035690053746172743A202020202025355D |
:1003C0006900506F7469313A202025336900506FFD |
:1003D0007469323A202025336900506F7469333ACA |
:1003E000202025336900506F7469343A202025336A |
:1003F0006900536572766F202000536574706F69D1 |
:100400006E742020253369005374656C6C756E67BB |
:100410003A202533690052616E67653A2533692DAC |
:100420002533690045787465726E436F6E74726F20 |
:100430006C2020004E693A2534692020526F3A25FD |
:100440003469200047733A253469202047693A25EA |
:100450003469200048693A253469202043663A25EA |
:100460003469200011241FBECFEFD0E1DEBFCDBF25 |
:1004700013E0A0E0B1E0EEE1FEE702C005900D92CE |
:10048000A43AB107D9F717E0A4EAB3E001C01D927E |
:10049000A13EB107E1F70C9488020C940000FB0127 |
:1004A000863008F085E0489FD0011124AC59BF4F39 |
:1004B000842F9927019724F00E94FB3E0192FACFE6 |
:1004C0000895282FFB01863008F025E0429FD001D7 |
:1004D0001124AC59BF4F842F9927019724F0019024 |
:1004E0000E94033FFACFA2E0B0E0022E0E94033F39 |
:1004F0000895A2E0B0E09D010E94FB3E802D863071 |
:1005000028F082E0D901082E0E94033F9927089520 |
:10051000CFEFD0E1DEBFCDBF14B815B897EEE92E0E |
:1005200093E0F92E8EEC9FEFE80EF91EF7FEFACF5E |
:1005300088EEE82E83E0F82E189B02C08BE001C005 |
:100540008AE08093000181E887B98FEF88B98BE159 |
:1005500084B981E085B98EE38AB9579A87EF8BB960 |
:1005600084B7877F84BF809160008861809360003A |
:100570001092600080ED97E09093C3038093C203D4 |
:1005800010921C0410921B0410921F0710921E0759 |
:1005900010921E0410921D041092200410921F0449 |
:1005A000809100018A3011F4289801C0289A0E9495 |
:1005B000360C0E94D5070E94D1160E943D0D0E9464 |
:1005C000D9150E94663C78941092110684E48093B9 |
:1005D000120687E08093130684E690E09F938F9342 |
:1005E00084E490E09F938F931F921F92809100016B |
:1005F0006AE00E948B3E892F99279F938F93809169 |
:1006000000010E948B3E99279F938F9380E790E093 |
:100610009F938F931F920E94F5088DB79EB70D96FA |
:100620000FB6F8949EBF0FBE8DBF84EA90E09F93F3 |
:100630008F931F920E94F508299A0F900F900F90A8 |
:1006400001E010E0D8010E94FB3E802D853461F16D |
:1006500085EC90E09F938F931F920E94F5080E9473 |
:10066000D017C0E00F900F900F90C23039F0C33018 |
:1006700019F40E94F11804C0C43010F00E946018F0 |
:1006800047E466E477E08C2F0E946102CF5FC630BA |
:1006900060F3A2E0B0E083E0082E0E94033F85E40F |
:1006A000D801082E0E94033FA4E0B0E00E94FB3E68 |
:1006B000802D853050F084EF90E09F938F931F92B0 |
:1006C0000E94F5080F900F900F900E94790247E466 |
:1006D00066E477E00E944F020E94790299279F9377 |
:1006E0008F938DE091E09F938F931F920E94F50866 |
:1006F00080914E070F900F900F900F900F9080FFFA |
:1007000020C088E291E09F938F931F920E94F5088A |
:1007100088EE93E00E942D0C7C010E94430D0F9007 |
:100720000F900F90C7010E945C0C8823D9F385E4D9 |
:1007300091E09F938F931F920E94F5080F900F9066 |
:100740000F900E94F21A809100018A3011F42898CB |
:1007500001C0289A80ED97E09093C3038093C20371 |
:1007600085E580931B068AE491E09F938F931F9207 |
:100770000E94F50880914E070F900F900F9082FF16 |
:1007800003C088E591E002C084E691E09F938F93D7 |
:100790001F920E94F5080F900F900F908CE691E049 |
:1007A0009F938F931F920E94F5080E94631088E820 |
:1007B00093E190938703809386030F900F900F909F |
:1007C0008091C6038823E1F30E94C53C1092C603C2 |
:1007D0000E94D5250E94A622209100012A3011F402 |
:1007E000289801C0289A80910103882321F0815024 |
:1007F0008093010312C08093A4038093A503809388 |
:1008000025061092FF031092FE031092FD03109232 |
:10081000FC031092FB031092FA03809121048823B9 |
:1008200029F08091210481508093210480918603D6 |
:1008300090918703892B01F585E090E090938703E1 |
:10084000809386030E94F315809104039091050321 |
:100850008F5F9F4FF9F4809118048823D9F080E1CD |
:1008600097E29093C3038093C20380E890E0909353 |
:100870000503809304030EC0809186039091870343 |
:10088000019790938703809386032A3011F4289868 |
:1008900001C0289A8091C603882311F40E94F307AF |
:1008A0000E949E06C7010E945C0C882309F488CF31 |
:1008B00080915E07282F332780910E0390910F03BC |
:1008C000821793079CF480910403909105038F5F36 |
:1008D0009F4F61F480E797E19093C3038093C20335 |
:1008E00080E093E090930503809304030E94AC3C66 |
:1008F00084E690E00E942D0C7C0162CF1F920F9243 |
:100900000FB60F9211248F939F93EF93FF938091D3 |
:1009100003038823E1F48091B8039091B903019611 |
:100920009093B9038093B803FC01ED51FB4FE08134 |
:10093000ED3019F08639910539F41092B90310920F |
:10094000B80381E080930303E093C60004C01092D3 |
:10095000B9031092B803FF91EF919F918F910F907F |
:100960000FBE0F901F9018951F920F920FB60F9207 |
:1009700011242F933F934F935F938F939F93AF9344 |
:10098000BF93EF93FF9390E08091C6008093B303F1 |
:100990005091BE03563910F09093BF038091B3037A |
:1009A0008D3009F05FC08091BF03823009F05AC0DA |
:1009B0009093BF03852F99278A5D994FFC01329749 |
:1009C00040812091BA033091BB03241B3109DC0123 |
:1009D00011978C91281B3109C9019F709093BB031B |
:1009E0008093BA0346E0969587954A95E1F7982F4C |
:1009F000935C9093BC032F733070235C2093BD03F2 |
:100A00008081981729F48C91281711F491E006C081 |
:100A100090E08091B0038F5F8093B0038091B20328 |
:100A2000882309F06EC0992309F46BC081E080939C |
:100A3000B2035093AF03E52FFF27EA5DF94F8DE036 |
:100A4000808380912806823509F05BC088E190E0C0 |
:100A50002CE00FB6F894A895809360000FBE209309 |
:100A600060004FC02091BF03822F992781309105EC |
:100A7000F9F0823091051CF4892B21F040C00297D7 |
:100A800011F13DC08091B303833239F48091B203F8 |
:100A9000882319F481E08093BF038091B30380938E |
:100AA000260681E08093BE038091B303992722C07C |
:100AB0002F5F2093BF03E52FFF27EA5DF94F809159 |
:100AC000B303808309C0E52FFF27EA5DF94F8091CA |
:100AD000B3038083563920F45F5F5093BE0302C096 |
:100AE0001092BF032091B3038091BA039091BB038E |
:100AF000820F911D9093BB038093BA0302C01092A2 |
:100B0000BF03FF91EF91BF91AF919F918F915F9143 |
:100B10004F913F912F910F900FBE0F901F901895FE |
:100B2000AC01A0E0B0E09D01A817B90748F4E3EEDE |
:100B3000F4E08191280F311D1196A417B507C8F371 |
:100B40003F70FD01ED51FB4FC90156E09695879529 |
:100B50005A95E1F7835C80831196FD01ED51FB4FBF |
:100B60002F733070822F835C8083AC51BB4F8DE03C |
:100B70008C93109203038091E3048093C600089540 |
:100B80001F93CF93DF93382FEA01722F10E083E297 |
:100B90008093E3046093E4043093E504A3E0B0E0C1 |
:100BA000772309F458C0772311F4972F07C0FE016B |
:100BB000E10FF11D1F5F9081715011F4472F0EC09E |
:100BC000FE01E10FF11D1F5F4081715039F0FE0100 |
:100BD000E10FF11D1F5F6081715001C0672FFD01A2 |
:100BE000ED51FB4F892F86958695835C8083119606 |
:100BF000FD01ED51FB4F892F99278370907024E000 |
:100C0000880F991F2A95E1F755279A0194E03695A8 |
:100C100027959A95E1F7822B835C80831196FD01DD |
:100C2000ED51FB4F4F705070440F551F440F551F2F |
:100C3000862F992726E0969587952A95E1F7842BAC |
:100C4000835C80831196FD01ED51FB4F6F73635CF4 |
:100C500060831196A5CFCD010E949005DF91CF91C1 |
:100C60001F9108951F93CF93DF93EC0110E066234B |
:100C700009F460C0A22FBB271297E42FFF27EA5D7B |
:100C8000F94F30813D534F5FE42FFF27EA5DF94F65 |
:100C900050815D534F5FE42FFF27EA5DF94F70816C |
:100CA0007D534F5FE42FFF27EA5DF94FE081ED535D |
:100CB0004F5F842F9927A817B907E4F1832F99274D |
:100CC000880F991F880F991F352F32953F70382B49 |
:100CD000852F99278F709070F4E0880F991FFA95EF |
:100CE000E1F7572F56955695582B872F99278370E4 |
:100CF000907076E0880F991F7A95E1F78E2B6150FE |
:100D00006F3FC1F0FE01E10FF11D30831F5F6150A5 |
:100D10006F3F81F0FE01E10FF11D50831F5F6150B5 |
:100D20006F3F41F0FE01E10FF11D80831F5F6623DD |
:100D300009F0A3CFDF91CF911F910895CF93DF9357 |
:100D4000CDB7DEB722970FB6F894DEBF0FBECDBF8A |
:100D50008091B203882309F40DC18FEF80930103C2 |
:100D60008091280699278B36910509F484C08C362A |
:100D70009105BCF48336910509F442C0843691058F |
:100D80003CF481369105F1F08236910539F1F0C0DD |
:100D90008736910509F480C08836910509F447C06B |
:100DA000E7C08137910509F47BC0813791050CF4C8 |
:100DB00099C08437910509F455C08637910509F427 |
:100DC00067C0D6C02091AF0343E062E0CE01019638 |
:100DD0000E943206898180930203CAC02091AF032A |
:100DE00043E06BE08BE196E00E9432068091EA03DB |
:100DF00090911D06892B8093EA038091240645C0BB |
:100E00002091AF0343E06BE08BE196E00E94320655 |
:100E10008091EA0390911D06892B8093EA038091CB |
:100E200024068093FE0681E08093B503A1C0209143 |
:100E3000AF0343E062E0CE0101960E94320680914A |
:100E4000EA039981892B8093EA038A818F3F21F4F9 |
:100E500081E08093AC0302C01092AC0381E08093E8 |
:100E6000B60386C02091AF0343E064E088EA93E0D4 |
:100E70000E9432067DC02091AF0343E064E084EA23 |
:100E800093E00E9432068091A7038093FE0670C013 |
:100E900081E08093B4036CC081E08093B70368C0A5 |
:100EA0002091AF0343E062E0CE0101960E9432063A |
:100EB00089818F3F61F0863010F085E0898347E4B7 |
:100EC00066E477E089810E944F02898102C00E9416 |
:100ED000790227E446E457E06091E204855B0E94D2 |
:100EE000C00546C02091AF0343E067E486E497E085 |
:100EF0000E9432068091280647E466E477E08B562C |
:100F00000E946102A2E0B0E0809128068B56082E74 |
:100F10000E94033F809171079927AA27BB27BC0134 |
:100F2000CD0124EC39E040E050E00E946C3EDC0151 |
:100F3000CB018093820390938303A0938403B093A7 |
:100F40008503809172079927AA27BB27BC01CD0191 |
:100F50000E946C3EDC01CB0180937E0390937F0363 |
:100F6000A0938003B09381030E9479020E948219AA |
:100F70001092B20322960FB6F894DEBF0FBECDBF1B |
:100F8000DF91CF910895CF93C82F8A3019F48DE067 |
:100F90000E94C3078091C00085FFFCCFC093C600AC |
:100FA00080E090E0CF910895089588E18093C1009A |
:100FB0008091C00082608093C0008091C1008068F1 |
:100FC0008093C1008091C10080648093C1008AE257 |
:100FD0008093C40088EC90E00E942D0C9093100642 |
:100FE00080930F06089580910303882309F4A2C01B |
:100FF0008091B703882371F080910303882351F017 |
:101000002BE04BE156E06091E20487E40E94C005CA |
:101010001092B70380910F06909110060E945C0C0D |
:10102000882321F48091B5038823B1F080910303D4 |
:10103000882391F022E44CEB56E06091E20484E4D2 |
:101040000E94C0051092B50384EF91E00E942D0C20 |
:101050009093100680930F06609102036F3F91F00A |
:10106000862F992734E0880F991F3A95E1F78F5F13 |
:101070009E4F605D20E1AC0181E40E94C0058FEFCE |
:10108000809302039091FE069923A1F080910303BF |
:10109000882381F083E28093E3049093E4048DE05D |
:1010A0008093E504109203031092FE068091E304FE |
:1010B0008093C6008091B603882351F18091030389 |
:1010C000882331F10E946C101092B6033091AD0369 |
:1010D000832F8F5F8093AD03843021F06091AC0348 |
:1010E000662359F026E14AE157E060E084E30E947C |
:1010F000C0058FEF8093AD030BC024E1829FC00138 |
:101100001124805F9C4FAC01832F8F5C0E94C0052F |
:101110008091B403882371F080910303882351F0F8 |
:101120002AE041E156E06091E20486E50E94C005B4 |
:101130001092B4030895982F8091FF06813069F4CE |
:101140008091EB03E82FFF27E05FFC4F90838F5FD8 |
:101150008093EB0321E030E005C0892F0E94C30794 |
:10116000282F3327C90108950F931F93CF93DF933F |
:101170008C01EB01672B39F0F80181918F010E94FE |
:101180009B082197C9F7DF91CF911F910F91089587 |
:101190000F931F93CF93DF938C01EB01672B41F0EB |
:1011A000F8010F5F1F4F84910E949B082197C1F7A0 |
:1011B000DF91CF911F910F910895CF93C82F1816EB |
:1011C00034F480E20E949B08C1501C16D4F3CF91E6 |
:1011D0000895CF93C82F181634F480E30E949B081B |
:1011E000C1501C16D4F3CF9108952F923F924F9285 |
:1011F0005F926F927F928F929F92AF92BF92CF92A7 |
:10120000DF92EF92FF920F931F93CF93DF93CDB7AF |
:10121000DEB7E0970FB6F894DEBF0FBECDBF2696BF |
:101220008FAD26972896EEADFFAD28971CA61DA67C |
:101230001EA61FA68093FF06A8E46A2E712C6C0ED2 |
:101240007D1E5F01C50105C0053239F00894A11C5F |
:10125000B11CF50104910023B9F7B501681B790BA6 |
:1012600011F00E94C808002309F430C20894A11CA0 |
:10127000B11C552458AA252C1FEF59A6F501089436 |
:10128000A11CB11C0491053721F0802F80628837A2 |
:10129000F1F450FE0EC0F30124E030E0620E731E44 |
:1012A00080819181A281B3818CA79DA7AEA7BFA7A2 |
:1012B0000EC0F301A2E0B0E06A0E7B1E8081918136 |
:1012C0009C01442755272CA73DA74EA75FA70032B6 |
:1012D00021F489A5882391F61BC0033211F438E06C |
:1012E00081C00A3211F00D3289F40A3251F4F3014F |
:1012F00042E050E0640E751E208022200CF0BECF2C |
:10130000219450E1552A8FED5822B8CF0B3211F4B9 |
:1013100009A7B4CF0E32C1F5F5010894A11CB11C88 |
:1013200004910A3279F4F301A2E0B0E06A0E7B1E68 |
:1013300060817181BFEF6F3F7B0714F46FEF7FEF28 |
:10134000162F9CCF60E070E0802F80538A30A0F48D |
:10135000CB01F3E0880F991FFA95E1F7860F971FED |
:10136000680F791F600F711D60537040F50108947C |
:10137000A11CB11C0491E8CFEFEF6F3F7E0714F47E |
:101380006FEF7FEF162F7FCF003329F454FC76CF19 |
:10139000F0E25F2A73CF802F81538930D8F460E068 |
:1013A00070E0CB01E3E0880F991FEA95E1F7860F23 |
:1013B000971F680F791F600F711D60537040F50112 |
:1013C0000894A11CB11C0491802F80538A3048F3EB |
:1013D000262E59CF083619F424E0522A4FCF0C3666 |
:1013E00019F431E0532A4ACF033661F44E010894D0 |
:1013F000811C911CF30142E050E0640E751E808157 |
:1014000089831BC1043421F0043611F00936B1F58B |
:10141000043411F451E0552A50FE0AC0F30184E06F |
:1014200090E0680E791E20813181428153810CC089 |
:10143000F30142E050E0640E751E808191819C01B1 |
:10144000442737FD4095542F2CA73DA74EA75FA7F3 |
:101450008CA59DA5AEA5BFA5B7FF0DC0B095A09565 |
:10146000909581959F4FAF4FBF4F8CA79DA7AEA77B |
:10147000BFA78DE289A77AE0472E7BC00F3411F019 |
:101480000F3639F40F3411F491E0592A68E0462EF2 |
:101490006FC00037A1F4F301A2E0B0E06A0E7B1E3A |
:1014A000808191819C01442755272CA73DA74EA7F9 |
:1014B0005FA750E1452E30E4532A08E759C00337AF |
:1014C000C1F5F30142E050E0640E751E808091800A |
:1014D0008114910489F44E010894811C911C88E2C6 |
:1014E00089838EE6F401818385E78B838CE68C8388 |
:1014F0008D8389E28E831F8217FD13C0812F992768 |
:1015000087FD9095AC0160E070E0C4010E94F73C5B |
:10151000009729F0D82ED8181D150CF090C0D12EA8 |
:101520008EC0F40101900020E9F73197DE2ED81823 |
:1015300086C0053511F0053739F4053511F4F1E0B1 |
:101540005F2A4AE0442E14C0083519F0083709F024 |
:101550006CC030E1432E53FE0BC02CA53DA54EA51B |
:101560005FA5211531054105510511F030E4532ADD |
:1015700019A618AB17FD02C04FED542229E2822EA6 |
:10158000912C8C0E9D1E8CA59DA5AEA5BFA5009788 |
:10159000A105B10521F498A9992309F43FC0C42CF1 |
:1015A000DD24EE24FF2433242CA53DA54EA55FA504 |
:1015B0002C153D054E055F0510F091E0392E6CA508 |
:1015C0007DA58EA59FA5A70196010E94BE3EDC01C8 |
:1015D000CB01182F8A3010F4105D04C0195A083559 |
:1015E00009F41F7DD4011E934D016CA57DA58EA528 |
:1015F0009FA5A70196010E94BE3E2CA73DA74EA71E |
:101600005FA7332081F6B8E04B1641F453FE06C0C5 |
:10161000103321F080E3F40182934F01CE01019653 |
:10162000D82ED818F8E2DF0E0BC0002309F44EC004 |
:101630004E010894811C911C098381E0D82E19A6C3 |
:101640001D2DC8A8CD18C7FCCC2489A5882311F06E |
:101650001F5F02C056FC1E5F1C0DE52CFF24C70156 |
:1016600080739070892B21F4822D811B0E94DD08EC |
:1016700089A5882329F061E070E0CE01899609C030 |
:10168000E6FE09C080E38AA70BA762E070E0CE0106 |
:101690008A960E94B408C70180739070809721F4E5 |
:1016A000822D811B0E94E9088C2D0E94E9088D2D56 |
:1016B000992787FD9095BC01C4010E94B408E4FEFF |
:1016C000C1CD822D811B0E94DD08BCCDE0960FB6F6 |
:1016D000F894DEBF0FBECDBFDF91CF911F910F9168 |
:1016E000FF90EF90DF90CF90BF90AF909F908F9042 |
:1016F0007F906F905F904F903F902F9008951F9232 |
:101700000F920FB60F9211242F933F935F936F9315 |
:101710007F938F939F93AF93BF938091C903815021 |
:101720008093C9038F3FB9F489E08093C903809106 |
:1017300006038F5F817080930603882319F481E08C |
:101740008093C6038091C7039091C803019690933C |
:10175000C8038093C7038091C2039091C30302978B |
:10176000C8F08091C2039091C30301979093C30383 |
:101770008093C2038091C2039091C303209104031C |
:101780003091050382239323892B11F021E009C0B6 |
:1017900020E007C020E08FEF9FEF90930503809338 |
:1017A000040380910001222331F08A3011F45A9A07 |
:1017B00007C0479A05C08A3011F45A9801C047986B |
:1017C00080914E0783FF3BC0349B0AC08091C403C5 |
:1017D0009091C50301969093C5038093C4032FC0D5 |
:1017E0008091C4039091C503892B79F08091C40343 |
:1017F0009091C503805A9F4040F48091C40390911A |
:10180000C50390933104809330048091300490910B |
:10181000310420912E0430912F04821B930B845E9F |
:101820009D4F68E671E00E94AB3E845B90409093D0 |
:101830002D0480932C041092C5031092C403BF9111 |
:10184000AF919F918F917F916F915F913F912F9178 |
:101850000F900FBE0F901F9018952091C7033091E5 |
:10186000C803280F391FC901019608958AE090E046 |
:101870000E942D0C9093CB038093CA0382E085BD18 |
:1018800083EA84BD17BC88E788BD96E096BD83ECEB |
:101890008093B0009093B10080917000826080933B |
:1018A000700080916E00816080936E008AE080936A |
:1018B000B3001092B20008952091C7033091C8037D |
:1018C000821B930B892F99278695807490700895B9 |
:1018D000CF93DF930E942D0CEC01CE010E945C0C93 |
:1018E0008823D9F3DF91CF910895CF93DF930E949E |
:1018F0002D0CEC0103C08FEE80937A00CE010E9484 |
:101900005C0C8823C1F3DF91CF9108951F920F9251 |
:101910000FB60F9211242F933F934F935F936F93C2 |
:101920007F938F939F93AF93BF93CF93DF93EF9367 |
:10193000FF93809107038150809307038F3F09F045 |
:1019400085C083E88093B00080917003C82FDD27A5 |
:10195000D093C103C093C00380917B076091680757 |
:1019600080FF2AC077278827992720916A04309121 |
:101970006B0440916C0450916D0457FF04C02158D2 |
:101980003F4F4F4F5F4FA7E05595479537952795A8 |
:10199000AA95D1F70E946C3E97FF04C061507E4F1C |
:1019A0008F4F9F4FF9E09595879577956795FA95B5 |
:1019B000D1F7C60FD71F29C07727882799272091ED |
:1019C0006A0430916B0440916C0450916D0457FF90 |
:1019D00004C021583F4F4F4F5F4FE7E05595479563 |
:1019E00037952795EA95D1F70E946C3E97FF04C082 |
:1019F00061507E4F8F4F9F4F39E095958795779532 |
:101A000067953A95D1F7C61BD70BD093C103C09306 |
:101A1000C0038091690799272091C0033091C103C9 |
:101A20002817390734F080916A079927821793079E |
:101A300024F49093C1038093C0038091C0038093EA |
:101A4000B30080916B078093070304C083E0809309 |
:101A5000B0005F98FF91EF91DF91CF91BF91AF916F |
:101A60009F918F917F916F915F914F913F912F91B6 |
:101A70000F900FBE0F901F90189510927C008FEE64 |
:101A800080937A0008950F931F93CF93DF9303E021 |
:101A900010E0D8010E94FB3E802DC82FDD27C53104 |
:101AA000D10508F02A97C7BD84E690E00E94750C26 |
:101AB00080910803909109038255934010F4C0E08F |
:101AC000D0E0CA3FD105C0F4C7BD82E390E00E94D8 |
:101AD000750C80E791E09F938F931F920E94F50809 |
:101AE00080910803909109030F900F900F908458F4 |
:101AF000934010F02196E5CFD8010C2E0E94033FB1 |
:101B0000C0930D078CE291E00E94750CDF91CF919C |
:101B10001F910F9108951F920F920FB60F921124EB |
:101B2000EF92FF920F931F932F933F934F935F93E7 |
:101B30006F937F938F939F93AF93BF93CF93DF93D5 |
:101B4000EF93FF9310927A008091E303682F772739 |
:101B50008F5F8093E3036530710509F48EC06630B2 |
:101B60007105BCF46230710509F44AC06330710537 |
:101B70003CF46115710531F161307105C1F17DC22F |
:101B80006330710509F446C06430710509F45DC025 |
:101B900074C26830710509F4C3C0693071054CF432 |
:101BA0006630710509F482C06730710509F49BC085 |
:101BB00064C26930710509F4D0C06A30710509F456 |
:101BC000DCC15BC280917800909179009093E5032D |
:101BD0008093E40381E08093E2038091CC039091B1 |
:101BE000CD0301969093CD038093CC034AC280919C |
:101BF0007800909179009093E7038093E6038EC07C |
:101C000080917800909179009093E9038093E803A4 |
:101C100084E0B0C180910E0390910F039C01220FCC |
:101C2000331F280F391F80917800909179000E940E |
:101C3000973E260F371F3695279536952795309373 |
:101C40000F0320930E0386E095C180917404909158 |
:101C500075042091780030917900821B930B90934A |
:101C600001078093000780910007909101079093EE |
:101C7000DB038093DA0387E07DC180917800909147 |
:101C800079002091760430917704821B930B909316 |
:101C90000C0780930B0780910B0790910C07909392 |
:101CA000D9038093D8031092E203EBC18091000125 |
:101CB0002091E4033091E5038A3049F48091780063 |
:101CC00090917900820F931F9695879506C0809119 |
:101CD000780090917900820F931F9093DD03809399 |
:101CE000DC0381E047C1809100012091E60330913F |
:101CF000E7038A3049F48091780090917900820F4F |
:101D0000931F9695879506C08091780090917900F1 |
:101D1000820F931F9093DF038093DE0382E02AC13A |
:101D2000809100012091E8033091E9038A3049F461 |
:101D30008091780090917900820F931F96958795F6 |
:101D400006C08091780090917900820F931F909344 |
:101D5000E1038093E00385E00DC1809178009091CC |
:101D60007900AA2797FDA095BA2FBC01CD010E944A |
:101D7000AA3D7B018C018091700490917104A09127 |
:101D80007204B09173049C01AD01C801B7010E94B7 |
:101D9000043DDC01CB01BC01CD010E948D3DDC0185 |
:101DA000CB019093D7038093D60380910007909145 |
:101DB0000107809100079091010797FF03C090955C |
:101DC00081959F4F97FD0396AC0155954795559585 |
:101DD000479580910B0790910C0780910B0790918C |
:101DE0000C0797FF03C0909581959F4F9C0197FF2B |
:101DF00002C02D5F3F4F3595279535952795240FC8 |
:101E0000351F8091D6039091D703820F931F909333 |
:101E1000D7038093D6038091D6039091D70302977E |
:101E200024F18091700490917104A0917204B0919A |
:101E3000730420E030E048E454E4BC01CD010E948A |
:101E4000B43D88230CF044C08091700490917104DB |
:101E5000A0917204B09173042AE037ED43EA5CE389 |
:101E6000BC01CD010E94053D29C08091D60390910F |
:101E7000D7038F5F9F4F64F5809170049091710438 |
:101E8000A0917204B091730420E030E046E154E484 |
:101E9000BC01CD010E94B73D1816D4F480917004A6 |
:101EA00090917104A0917204B09173042AE037ED0F |
:101EB00043EA5CE3BC01CD010E94043DDC01CB019F |
:101EC0008093700490937104A0937204B093730490 |
:101ED00081E08093D0038091780090917900909375 |
:101EE0000307809302078091D6039091D7039C014A |
:101EF000442737FD4095542F80913204909133044C |
:101F0000A0913404B0913504820F931FA41FB51F14 |
:101F10008093320490933304A0933404B093350437 |
:101F200020913204309133044091340450913504AF |
:101F300057FF04C021503C4F4F4F5F4F7AE05595FB |
:101F40004795379527957A95D1F7809132049091EE |
:101F50003304A0913404B0913504821B930BA40B7D |
:101F6000B50B8093320490933304A0933404B09360 |
:101F7000350483E08093E20384C080911007909140 |
:101F800011072091780030917900820F931F909370 |
:101F9000110780931007809108078F5F80930807CF |
:101FA00080910807853008F468C08091780090918E |
:101FB0007900909309038093080310920807809199 |
:101FC0000407909105072091100730911107821B9B |
:101FD000930B2091160430911704821B930B90935E |
:101FE000CF038093CE038091100790911107EC01ED |
:101FF000EE27D7FDE095FE2F20910A0330910B03C9 |
:1020000040910C0350910D03DA01C901880F991F0B |
:10201000AA1FBB1F820F931FA41FB51FC80FD91F74 |
:10202000EA1FFB1FF7FF03C02396E11DF11D82E0AD |
:10203000F595E795D795C7958A95D1F7C0930A038B |
:10204000D0930B03E0930C03F0930D0380910A03EC |
:1020500090910B03A0910C03B0910D039C01809112 |
:10206000040790910507821B930B909317048093AC |
:10207000160410921107109210071092E2031092AA |
:10208000E3038091E20380937C008091E303882343 |
:1020900019F08FEE80937A00FF91EF91DF91CF914D |
:1020A000BF91AF919F918F917F916F915F914F9170 |
:1020B0003F912F911F910F91FF90EF900F900FBEC6 |
:1020C0000F901F90189590E2E0E1F3E08FE4919378 |
:1020D000815087FFFCCF08951F93CF93DF938091AA |
:1020E000EA0380FF0FC08091EE03882311F0815036 |
:1020F00002C080916A038093EE030E9463108FEF09 |
:102100008093AD038091EA0381FF0AC08091EE03C2 |
:102110008F5F8093EE030E9463108FEF8093AD0377 |
:102120008091EA03992780FF04C081FF02C01092CA |
:10213000EE038091EE03282F33278A3040F481E1AB |
:102140008093EB033F932F9382E791E007C080E1F8 |
:102150008093EB033F932F9387E791E09F938F93B7 |
:1021600081E08F930E94F5080F900F900F900F90D1 |
:102170000F908091EE03C82FDD27C530D10509F4FB |
:102180006AC2C630D105ACF4C230D10509F4E9C049 |
:10219000C330D10534F4209739F1219709F477C081 |
:1021A000FDC4C330D10509F44EC1249709F4B7C169 |
:1021B000F5C4C830D10509F4A9C3C930D10544F428 |
:1021C000C630D10509F41CC3279709F47EC3E6C4C1 |
:1021D000CA30D10509F432C4CA30D1050CF4D9C3D0 |
:1021E0002B9709F471C4DAC41092EB038CE791E0E9 |
:1021F0009F938F9311E01F930E94F50884E18093D1 |
:10220000EB030F900F900F9084E690E09F938F93D5 |
:1022100084E490E09F938F93DF93CF9380910001AC |
:102220006AE00E948B3E892F99279F938F9380911C |
:1022300000010E948B3E99279F938F938CE891E039 |
:102240009F938F931F930E94F50888E28093EB037E |
:102250008DB79EB70D960FB6F8949EBF0FBE8DBF7B |
:102260000E94790299279F938F9381EA91E09F932F |
:102270008F931F930E94F5088CE38093EB030F90DC |
:102280000F900F900F900F908EEA91E061C08091B7 |
:102290004E0780FF4AC01092EB0380911604909184 |
:1022A00017049F938F938EEB91E09F938F9311E090 |
:1022B0001F930E94F50884E18093EB030F900F9029 |
:1022C0000F900F900F9080911404909115049F939C |
:1022D0008F938DEC91E09F938F931F930E94F5084D |
:1022E00088E28093EB030F900F900F900F900F9068 |
:1022F00080910803909109039F938F938CED91E057 |
:102300009F938F931F930E94F5088CE38093EB03B8 |
:102310000F900F900F900F900F9080910D079927BD |
:102320009F938F938BEE91E07EC384E18093EB03C8 |
:102330008AEF91E09F938F9311E01F930E94F5081D |
:1023400088E28093EB030F900F900F9081E092E072 |
:102350009F938F931F930E94F5080F900F900F90FB |
:1023600022C41092EB038FE092E09F938F93C1E021 |
:10237000CF930E94F50884E18093EB030F900F90B8 |
:102380000F9080916A0490916B04A0916C04B091BD |
:102390006D04B7FF04C081509C4FAF4FBF4F6AE040 |
:1023A000B595A795979587956A95D1F7BF93AF9304 |
:1023B0009F938F9389E192E09F938F93CF930E9495 |
:1023C000F50888E28093EB038DB79EB707960FB6AA |
:1023D000F8949EBF0FBE8DBF8091620490916304FC |
:1023E000A0916404B0916504B7FF04C081509C4F74 |
:1023F000AF4FBF4F5AE0B595A795979587955A95DA |
:10240000D1F7BF93AF939F938F9388E292E09F930E |
:102410008F93CF930E94F5088CE38093EB038DB7E5 |
:102420009EB707960FB6F8949EBF0FBE8DBF8091E2 |
:102430003004909131049F938F9387E392E09F93B0 |
:102440008F93CF93F3C21092EB0380911E0790916C |
:102450001F079F938F9380911C0790911D079F9357 |
:102460008F9386E492E09F938F9311E01F930E94D5 |
:10247000F50884E18093EB038DB79EB707960FB6FE |
:10248000F8949EBF0FBE8DBF8091220790912307C5 |
:102490009F938F9380912007909121079F938F9313 |
:1024A00086E592E09F938F931F930E94F50888E240 |
:1024B0008093EB038DB79EB707960FB6F8949EBF37 |
:1024C0000FBE8DBF80912607909127079F938F9312 |
:1024D00080912407909125079F938F9386E692E041 |
:1024E0009F938F931F930E94F5088CE38093EB03D7 |
:1024F0008DB79EB707960FB6F8949EBF0FBE8DBFDF |
:1025000080912A0790912B079F938F9380912807A2 |
:10251000909129079F938F9386E792E031C31092A1 |
:10252000EB0380914707E82FFF27EE0FFF1FE65EC2 |
:10253000F84F808191819F938F9380914607E82F78 |
:10254000FF27EE0FFF1FE65EF84F808191819F937A |
:102550008F9386E892E09F938F9311E01F930E94E0 |
:10256000F50884E18093EB038DB79EB707960FB60D |
:10257000F8949EBF0FBE8DBF80914907E82FFF27BB |
:10258000EE0FFF1FE65EF84F808191819F938F933E |
:1025900080914807E82FFF27EE0FFF1FE65EF84FF8 |
:1025A000808191819F938F9386E992E09F938F938F |
:1025B0001F930E94F50888E28093EB038DB79EB7C6 |
:1025C00007960FB6F8949EBF0FBE8DBF80914B0744 |
:1025D000E82FFF27EE0FFF1FE65EF84F8081918105 |
:1025E0009F938F9380914A07E82FFF27EE0FFF1FDD |
:1025F000E65EF84F808191819F938F9386EA92E007 |
:102600009F938F931F930E94F5088CE38093EB03B5 |
:102610008DB79EB707960FB6F8949EBF0FBE8DBFBD |
:1026200080914D07E82FFF27EE0FFF1FE65EF84F62 |
:10263000808191819F938F9380914C07E82FFF2792 |
:10264000EE0FFF1FE65EF84F808191819F938F937D |
:1026500086EB92E095C21092EB0386EC92E09F939A |
:102660008F93C1E0CF930E94F508809100010F90F5 |
:102670000F900F908A3009F05AC084E18093EB03E9 |
:1026800080918004909181049F938F938091E003C7 |
:102690009091E1032091800430918104821B930B7F |
:1026A0009F938F9384ED92E09F938F93CF930E949B |
:1026B000F50888E28093EB038DB79EB707960FB6B7 |
:1026C000F8949EBF0FBE8DBF80917E0490917F04D1 |
:1026D0009F938F938091DE039091DF0320917E047E |
:1026E00030917F04821B930B9F938F9383EE92E034 |
:1026F0009F938F93CF930E94F5088CE38093EB0315 |
:102700008DB79EB707960FB6F8949EBF0FBE8DBFCC |
:1027100080917C0490917D049F938F938091B50765 |
:102720009091B6079F938F9382EF92E065C084E10A |
:102730008093EB03809180049091810497FD019632 |
:10274000959587959F938F938091E0039091E103F6 |
:102750002091800430918104821B930B9F938F936F |
:1027600081E093E09F938F93CF930E94F50888E2D6 |
:102770008093EB038DB79EB707960FB6F8949EBF74 |
:102780000FBE8DBF80917E0490917F0497FD0196CE |
:10279000959587959F938F938091DE039091DF03AA |
:1027A00020917E0430917F04821B930B9F938F9323 |
:1027B00080E193E09F938F93CF930E94F5088CE381 |
:1027C0008093EB038DB79EB707960FB6F8949EBF24 |
:1027D0000FBE8DBF80917C0490917D0497FD019682 |
:1027E000959587959F938F938091B5079091B607A4 |
:1027F0009F938F938FE193E09F938F93CF93C3C168 |
:102800001092EB038EE293E09F938F9311E01F935E |
:102810000E94F50884E18093EB030F900F900F90D6 |
:1028200080917604909177049F938F938091D80341 |
:102830009091D9039F938F938BE393E09F938F9312 |
:102840001F930E94F50888E28093EB038DB79EB733 |
:1028500007960FB6F8949EBF0FBE8DBF809174048B |
:10286000909175049F938F938091DA039091DB038D |
:102870009F938F938AE493E09F938F931F930E947B |
:10288000F5088CE38093EB038DB79EB707960FB6E0 |
:10289000F8949EBF0FBE8DBF80917004909171041B |
:1028A000A0917204B0917304BC01CD010E948D3DD2 |
:1028B000DC01CB019F938F9380919D0790919E07A0 |
:1028C0009F938F9389E593E05BC184E18093EB0351 |
:1028D00080910E0390910F039F938F9388E693E06E |
:1028E0009F938F9311E01F930E94F50888E28093D5 |
:1028F000EB030F900F900F900F900F908091210499 |
:1029000099279F938F9387E793E08DC01092EB03F5 |
:1029100086E893E09F938F9311E01F930E94F50840 |
:1029200084E18093EB030F900F900F9080912C0423 |
:1029300090912D049F938F9385E993E09F938F93BC |
:102940001F930E94F50888E28093EB030F900F908D |
:102950000F900F900F9080913004909131049F93CD |
:102960008F9384EA93E09F938F931F930E94F508BF |
:102970008CE38093EB030F900F900F900F900F90CC |
:1029800080912E0490912F049F938F9383EB93E07B |
:102990004AC01092EB0380912804909129049F93E0 |
:1029A0008F9382EC93E09F938F9311E01F930E948B |
:1029B000F50884E18093EB030F900F900F900F9038 |
:1029C0000F9080912604909127049F938F938EEC13 |
:1029D00093E09F938F931F930E94F50888E2809362 |
:1029E000EB030F900F900F900F900F9080912404A5 |
:1029F000909125049F938F938AED93E09F938F93FB |
:102A00001F930E94F5088CE38093EB030F900F90C7 |
:102A10000F900F900F9080912204909123049F9328 |
:102A20008F9386EE93E09F938F931F930E94F508F8 |
:102A30000F900F900F900F900F90B5C01092EB0376 |
:102A400082EF93E09F938F9311E01F930E94F5080C |
:102A500084E18093EB030F900F900F9080917003AF |
:102A600099279F938F938AEF93E09F938F931F9360 |
:102A70000E94F50888E28093EB030F900F900F906F |
:102A80000F900F908091C0039091C1039F938F93FB |
:102A900088E094E09F938F931F930E94F5088CE346 |
:102AA0008093EB030F900F900F900F900F908091F9 |
:102AB0006A0799279F938F938091690799279F931E |
:102AC0008F9386E194E05CC01092EB0384E294E083 |
:102AD0009F938F9311E01F930E94F50884E18093E8 |
:102AE000EB030F900F900F9080911F06992787FDA1 |
:102AF00090959F938F9380911E06992787FD9095BF |
:102B00009F938F9384E394E09F938F931F930E94EE |
:102B1000F50888E28093EB038DB79EB707960FB652 |
:102B2000F8949EBF0FBE8DBF80912006992787FD28 |
:102B300090959F938F938091210699279F938F93D0 |
:102B400084E494E09F938F931F930E94F5088CE395 |
:102B50008093EB038DB79EB707960FB6F8949EBF90 |
:102B60000FBE8DBF8091250699279F938F938091EB |
:102B70002206992787FD90959F938F9384E594E093 |
:102B80009F938F931F930E94F5088DB79EB707966A |
:102B90000FB6F8949EBF0FBE8DBF05C081508093C5 |
:102BA0006A031092EE031092EA03DF91CF911F9116 |
:102BB00008951092B9008AE28093B800089585EADA |
:102BC0008093BC0080E090E0089584E98093BC008D |
:102BD00008951092B9008093BB0085E88093BC00F3 |
:102BE00080E090E008950E94E5151092F103809135 |
:102BF000BB001092F00380E88093BC001092BD00EF |
:102C00001092BA001092BB001092B9001092B80056 |
:102C10000E94D9150E94DF1580E00E94E9150895F1 |
:102C20001F920F920FB60F9211242F933F934F9341 |
:102C30005F936F937F938F939F93AF93BF93EF9324 |
:102C4000FF938091F103282F33278F5F8093F10347 |
:102C50002330310509F446C0243031054CF42130CD |
:102C60003105D1F0223031057CF5232B81F083C072 |
:102C700025303105E1F1253031050CF441C0263015 |
:102C80003105F1F12730310509F45AC074C0809143 |
:102C9000F003880F8E5A51C08091F003282F3327FC |
:102CA0008F5F8093F0032130310509F43EC022305C |
:102CB00031051CF4232BB1F15EC022303105C1F186 |
:102CC00023303105C1F157C00E94E5158091F00312 |
:102CD000843018F41092F10302C01092F0030E94A5 |
:102CE000DF1549C08091EF03880F8D5A26C080916F |
:102CF000EF03E82FFF27EE5EF84F8091BB00808343 |
:102D00008091EF0399278130910579F08230910508 |
:102D10001CF4892B39F02FC08230910549F00397BC |
:102D200051F029C08091900708C08091950705C097 |
:102D30008091AD0702C08091AF070E94E9151BC0CA |
:102D40009091EF03E92FFF27EE5EF84F8091BB00D3 |
:102D50008483892F8F5F8093EF03843010F010926B |
:102D6000EF030E94E5158AE090E09093870380933B |
:102D700086031092F1038091BC0080688093BC00B0 |
:102D8000FF91EF91BF91AF919F918F917F916F9143 |
:102D90005F914F913F912F910F900FBE0F901F9019 |
:102DA000189583EC8093810080916F0080628093FE |
:102DB0006F0010927D0410927C0410927F04109298 |
:102DC0007E04109281041092800408951F920F9245 |
:102DD0000FB60F9211240F931F932F933F934F938E |
:102DE0005F936F937F938F939F93AF93BF93CF9393 |
:102DF000DF93EF93FF93409186005091870080917D |
:102E0000F2039091F303481B590B80918600909137 |
:102E100087009093F3038093F203CA018D5494408A |
:102E2000A091F403B091F503835F9A4158F414978D |
:102E300014F010926B0381E090E09093F50380937F |
:102E4000F40399C0AA30B1050CF095C0CA018B5F9C |
:102E50009040845B914008F071C0425D5140FD019B |
:102E6000EA0FFB1FE65EF84F80819181FA01E81BB3 |
:102E7000F90BCF01F7FF03C0909581959F4F0697FF |
:102E80004CF480912104883C28F480912104865FD1 |
:102E900080932104FD01EA0FFB1FE65EF84F80815D |
:102EA00091819C01220F331F280F391F240F351FDA |
:102EB00037FF02C02D5F3F4FE901D595C795D595E6 |
:102EC000C795CA0101968C179D0714F4219706C077 |
:102ED00041505040C417D5070CF42196809121042D |
:102EE000833CD8F08D010A0F1B1FF801E65EF84FF6 |
:102EF000808191819E01281B390BC90163E070E03C |
:102F00000E94AB3ECB01880F991F860F971F005D73 |
:102F1000184FF8019183808307C0AA0FBB1FA05DE3 |
:102F2000B84F11961C921E92E091F403F091F503B4 |
:102F3000EE0FFF1FE65EF84FD183C0838091F4034C |
:102F40009091F50301969093F5038093F403059710 |
:102F500011F45D9A01C05D988091F4039091F5039E |
:102F60008630910511F45C9A01C05C98079711F4C2 |
:102F70005B9A01C05B98FF91EF91DF91CF91BF9178 |
:102F8000AF919F918F917F916F915F914F913F9101 |
:102F90002F911F910F910F900FBE0F901F901895BA |
:102FA00081E08093460782E08093470783E0809327 |
:102FB000480734E03093490745E040934A0786E0EC |
:102FC00080934B0787E080934C0728E020934D07C0 |
:102FD00080E480934E079EE190934F078BEF8093A0 |
:102FE00051078AE0809352079093500790935407BB |
:102FF0003093530730935507209356076CE0609346 |
:1030000057078FE0809358078AEF80935907909372 |
:103010005A0790E890935B0780E580935C0756E938 |
:1030200050935D078EE580935E0783E280935F0790 |
:1030300084E1809360071092610780E280936207C9 |
:1030400090936307109264071092650710926607C9 |
:1030500010927607109277071092780710927907EE |
:1030600024E62093670788E28093680710927B0725 |
:1030700082E38093690750936A0740936B078093BC |
:103080006C079AE590936D0780936E0710927A070C |
:1030900090936F07409370072093710720937207F6 |
:1030A00080E1809373073093740720937507A0E83D |
:1030B000B7E0E8E8F3E001900D926150E1F7089580 |
:1030C00081E08093460782E08093470723E02093C6 |
:1030D000480754E05093490745E040934A0736E0DB |
:1030E00030934B0787E080934C0788E080934D072F |
:1030F00080E480934E079EE190934F078BEF80937F |
:1031000051078AE080935207909350079093540799 |
:103110002093530720935507509356073093570732 |
:103120008FE0809358078AEF8093590790935A074E |
:1031300080E880935B0790E590935C0788E7809335 |
:103140005D078EE580935E0783E280935F0784E1ED |
:10315000809360071092610730E23093620790938A |
:103160006307109264071092650710926607109229 |
:10317000760710927707109278071092790724E665 |
:103180002093670788E28093680710927B0792E399 |
:103190009093690786E980936A0740936B07909341 |
:1031A0006C078AE580936D0790936E0710927A07FB |
:1031B00080936F07409370072093710720937207E5 |
:1031C00030937307509374078BE480937507A0E8DE |
:1031D000B7E0EFE8F3E08CE001900D928150E1F769 |
:1031E000089581E08093460722E02093470783E01B |
:1031F0008093480754E05093490745E040934A07BD |
:1032000036E030934B0787E080934C0788E080934B |
:103210004D0780EC80934E079EE190934F078BEF14 |
:10322000809351078AE080935207909350079093C0 |
:103230005407209353072093550750935607309314 |
:1032400057078FE0809358078AEF80935907909330 |
:103250005A0780E880935B0724E620935C078CE89C |
:1032600080935D078EE580935E0783E280935F071E |
:1032700084E1809360071092610780E18093620788 |
:1032800080E580936307109264071092650710929F |
:1032900066071092760710927707109278071092BF |
:1032A00079072093670788E28093680710927B076D |
:1032B00092E39093690786E980936A0740936B07CE |
:1032C00090936C078AE580936D0790936E07109238 |
:1032D0007A0780936F0740937007209371072093BC |
:1032E000720780E280937307509374079093750779 |
:1032F000A0E8B7E0E7E9F3E08CE001900D9281509F |
:10330000E1F70895CF93C82FC150CF3F81F080914E |
:103310001804882361F484E690E09093C3038093BB |
:10332000C2038AEF90E00E94680CC15080F7CF91F1 |
:10333000089510927A008091E0039091E1039093B8 |
:103340009707809396078091DE039091DF03909317 |
:103350008F0780938E078091DC039091DD0390931B |
:10336000B6078093B5078091D8039091D903AA2717 |
:1033700097FDA095BA2FBC01CD012CE030E040E0D4 |
:1033800050E00E946C3EDC01CB019093B307809328 |
:10339000B2078091DA039091DB03AA2797FDA095ED |
:1033A000BA2FBC01CD010E946C3EDC01CB01909391 |
:1033B000BD078093BC078091D6039091D70390936B |
:1033C0009E0780939D078FEE80937A0080914A0735 |
:1033D000E82FFF27EE0FFF1FE65EF84F80819181F7 |
:1033E00082599F4F209128043091290428173907CA |
:1033F0001CF42F5F3F4F0CC08081918182599F4FF9 |
:10340000821793074CF42115310531F021503040DB |
:10341000309329042093280480914B07E82FFF273D |
:10342000EE0FFF1FE65EF84F8081918182599F4F1A |
:103430002091260430912704281739071CF42F5FA8 |
:103440003F4F0CC08081918182599F4F8217930713 |
:103450004CF42115310531F02150304030932704D0 |
:103460002093260480914C07E82FFF27EE0FFF1FC3 |
:10347000E65EF84F8081918182599F4F209124040C |
:1034800030912504281739071CF42F5F3F4F0CC0DB |
:103490008081918182599F4F821793074CF42115A7 |
:1034A000310531F02150304030932504209324041D |
:1034B00080914D07E82FFF27EE0FFF1FE65EF84FC4 |
:1034C0008081918182599F4F209122043091230461 |
:1034D000281739071CF42F5F3F4F0CC08081918162 |
:1034E00082599F4F821793074CF42115310531F013 |
:1034F00021503040309323042093220480912804EB |
:103500009091290497FF05C0109229041092280475 |
:103510000AC08F3F910539F034F08FEF90E090931F |
:10352000290480932804809126049091270497FF12 |
:1035300005C010922704109226040AC08F3F9105FF |
:1035400039F034F08FEF90E09093270480932604B5 |
:10355000809124049091250497FF05C010922504C2 |
:10356000109224040AC08F3F910539F034F08FEF98 |
:1035700090E09093250480932404809122049091FC |
:10358000230497FF05C010922304109222040AC05E |
:103590008F3F910539F034F08FEF90E09093230442 |
:1035A00080932204809171079927AA27BB27BC0129 |
:1035B000CD0124EC39E040E050E00E946C3EDC019B |
:1035C000CB018093820390938303A0938403B093F1 |
:1035D000850380937E0390937F03A0938003B09331 |
:1035E0008103089510927704109276041092750466 |
:1035F0001092740480E090E0A0E0B0E0809370044A |
:1036000090937104A0937204B09373041092810498 |
:103610001092800410927F0410927E0410927D0418 |
:1036200010927C0410920104109200040E949919D7 |
:1036300084E690E00E94750C0E94991980914E07D3 |
:1036400080FF10C08091080390910903875B93402D |
:1036500038F480910803909109038E5E924010F433 |
:103660000E94430D8091E0039091E10390938104C7 |
:10367000809380048091DE039091DF0390937F0418 |
:1036800080937E048091DC039091DD0390937D0410 |
:1036900080937C0480917E0490917F0490937B04BE |
:1036A00080937A04809180049091810490937904AE |
:1036B0008093780444E050E0DA010E94FB3E802DC4 |
:1036C000853078F18091BC079091BD078091BC074F |
:1036D0009091BD0797FF03C0909581959F4F6CE037 |
:1036E00070E00E94AB3E7093750460937404809107 |
:1036F000B2079091B3078091B2079091B30797FFFB |
:1037000003C0909581959F4F6CE070E00E94AB3EA6 |
:103710007093770460937604809102079091030779 |
:1037200034C0DA010E94FB3E802D9927982F88270C |
:10373000DA0111960E94FB3E202D820F911D90937D |
:10374000770480937604DA0112960E94FB3E802D66 |
:103750009927982F8827DA0113960E94FB3E202D87 |
:10376000820F911D9093750480937404DA0114966E |
:103770000E94FB3E802D9927982F8827DA01159605 |
:103780000E94FB3E202D820F911DAA2797FDA09538 |
:10379000BA2FBC01CD010E94AA3DDC01CB01809370 |
:1037A000700490937104A0937204B0937304109208 |
:1037B0004A0410924B0410924C0410924D04109243 |
:1037C0004604109247041092480410924904109243 |
:1037D0004204109243041092440410924504109243 |
:1037E0003E0410923F041092400410924104109243 |
:1037F0003A0410923B0410923C0410923D04109243 |
:1038000097071092960710928F0710928E071092CA |
:10381000B6071092B50780910A0390910B03A0910F |
:103820000C03B0910D039093050780930407109249 |
:10383000CF031092CE0310923204109233041092F0 |
:1038400034041092350480913004909131049093A7 |
:103850002F0480932E040E943C3C82E390E09093DE |
:10386000C3038093C203809171079927AA27BB27BE |
:10387000BC01CD0124EC39E040E050E00E946C3EF8 |
:10388000DC01CB018093820390938303A093840394 |
:10389000B0938503809172079927AA27BB27BC01A3 |
:1038A000CD010E946C3EDC01CB0180937E0390939E |
:1038B0007F03A0938003B093810310926D03109255 |
:1038C0006C030895AF92BF92CF92DF92EF92FF9276 |
:1038D0000F931F93CF93DF9380917C0490917D048D |
:1038E0002091DC033091DD03821B930B9093B6078C |
:1038F0008093B5078091DE039091DF0320917E04D1 |
:1039000030917F04821B930B90938F0780938E07D7 |
:103910008091E0039091E103209180043091810433 |
:10392000821B930B909397078093960780918E0745 |
:1039300090918F079093F7068093F6068091B207D7 |
:103940009091B3077C010027F7FC0095102F809120 |
:10395000D8039091D903AA2797FDA095BA2FBC014F |
:10396000CD012CE030E040E050E00E946C3EDC01F4 |
:10397000CB01E80EF91E0A1F1B1F17FF05C0089494 |
:10398000E11CF11C011D111D15950795F794E79495 |
:10399000F092B307E092B2078091BC079091BD0707 |
:1039A0007C010027F7FC0095102F8091DA0390919D |
:1039B000DB03AA2797FDA095BA2FBC01CD012CE00F |
:1039C00030E040E050E00E946C3EDC01CB01E80EAC |
:1039D000F91E0A1F1B1F17FF05C00894E11CF11CEC |
:1039E000011D111D15950795F794E794F092BD07F9 |
:1039F000E092BC0780919D0790919E079C0144270F |
:103A000037FD4095542F8091D6039091D703AA2774 |
:103A100097FDA095BA2F280F391F4A1F5B1F57FF2C |
:103A200004C02F5F3F4F4F4F5F4F559547953795D8 |
:103A3000279530939E0720939D078091D8039091FE |
:103A4000D9036CE070E0869F9001879F300D969FB0 |
:103A5000300D1124C9019C01442737FD4095542F96 |
:103A600080915A0490915B04A0915C04B0915D0434 |
:103A7000820F931FA41FB51F80935A0490935B0479 |
:103A8000A0935C04B0935D048091DA039091DB0312 |
:103A9000869F9001879F300D969F300D1124C9019C |
:103AA0009C01442737FD4095542F809156049091F6 |
:103AB0005704A0915804B0915904820F931FA41F7A |
:103AC000B51F8093560490935704A0935804B09365 |
:103AD00059048091520490915304A0915404B091E0 |
:103AE0005504BC01CD010E94AA3D5B016C0180918F |
:103AF000020790910307AA2797FDA095BA2FBC0152 |
:103B0000CD010E94AA3D7B018C01809170049091AF |
:103B10007104A0917204B09173049C01AD01C801BD |
:103B2000B7010E94043DDC01CB019C01AD01C6013F |
:103B3000B5010E94053DDC01CB01BC01CD010E9415 |
:103B40008D3DDC01CB018093520490935304A093EC |
:103B50005404B09355048091B5079091B6079C0129 |
:103B6000442737FD4095542F80913A0490913B04AF |
:103B7000A0913C04B0913D04820F931FA41FB51F78 |
:103B800080933A0490933B04A0933C04B0933D048B |
:103B90008091B5079091B6079C01442737FD409569 |
:103BA000542F8091360490913704A0913804B0913D |
:103BB0003904820F931FA41FB51F8093360490937E |
:103BC0003704A0933804B0933904A0900F04AA20BE |
:103BD00009F0A2C080910E04882309F09DC0809155 |
:103BE0004E0786FF99C0A0914A04B0914B04C09142 |
:103BF0004C04D0914D04D7FF04C0A150B04FCF4F1B |
:103C0000DF4F3CE0D595C795B795A7953A95D1F785 |
:103C10008091B5079091B6079C01442737FD4095E8 |
:103C2000542FBD01CE010E946C3EDC01CB012091DE |
:103C30000104E22EFF2400271127BC01CD01A801B9 |
:103C400097010E946C3EDC01CB018093820490932B |
:103C50008304A0938404B0938504B7FF04C081500B |
:103C6000984FAF4FBF4F2BE0B595A7959795879588 |
:103C70002A95D1F78093820490938304A0938404BF |
:103C8000B0938504A0914204B0914304C0914404D0 |
:103C9000D0914504D7FF04C0A150B04FCF4FDF4FA4 |
:103CA0008CE0D595C795B795A7958A95D1F7809162 |
:103CB000B5079091B6079C01442737FD4095542FD6 |
:103CC000BD01CE010E946C3EDC01CB01BC01CD01E7 |
:103CD000A80197010E946C3EDC01CB018093860411 |
:103CE00090938704A0938804B0938904B7FF04C01D |
:103CF0008150984FAF4FBF4F1BE0B595A795979553 |
:103D000087951A95D1F78093860490938704A093A2 |
:103D10008804B093890410C010928604109287041E |
:103D200010928804109289041092820410928304E5 |
:103D3000109284041092850480918E0790918F07D1 |
:103D40002091820430918304820F931F90938F07F8 |
:103D500080938E0700910004202F33274427552796 |
:103D60008091860490918704A0918804B091890481 |
:103D7000BC01CD010E946C3E9B01AC0197FF04C0C9 |
:103D800021503E4F4F4F5F4FC9E0559547953795AE |
:103D90002795CA95D1F780918E0790918F07820F52 |
:103DA000931F90938F0780938E0780918E07909139 |
:103DB0008F079C01442737FD4095542F80913E0486 |
:103DC00090913F04A0914004B0914104820F931F51 |
:103DD000A41FB51F80933E0490933F04A09340041A |
:103DE000B093410480918E0790918F072091120427 |
:103DF00030911304821B930B9C01442737FD40959F |
:103E0000542F8091420490914304A0914404B091B6 |
:103E10004504820F931FA41FB51F80934204909303 |
:103E20004304A0934404B0934504809142049091CC |
:103E30004304A0914404B0914504C0917E03D09105 |
:103E40007F03E0918003F0918103C817D907EA0747 |
:103E5000FB0704F580E197E2A0E0B0E08C1B9D0B2E |
:103E6000AE0BBF0B8093420490934304A093440491 |
:103E7000B09345048091420490914304A09144047E |
:103E8000B091450480933E0490933F04A093400476 |
:103E9000B093410422273327A9012C1B3D0B4E0B65 |
:103EA0005F0B8091420490914304A0914404B0912F |
:103EB000450482179307A407B507E4F4C051D7421D |
:103EC000E040F040C0934204D0934304E0934404A4 |
:103ED000F09345048091420490914304A0914404DE |
:103EE000B091450480933E0490933F04A093400416 |
:103EF000B09341048091DE039091DF030F9734F477 |
:103F000088E19CEF90938F0780938E078091DE036A |
:103F10009091DF03079734F480E398EF90938F0735 |
:103F200080938E07109100011A30A9F48091DE036E |
:103F30009091DF03835F934034F088EE93E0909399 |
:103F40008F0780938E078091DE039091DF038A5F55 |
:103F50009340DCF014C08091DE039091DF03855E16 |
:103F6000974034F088EE93E090938F0780938E070C |
:103F70008091DE039091DF03835F974034F080ED02 |
:103F800097E090938F0780938E078091960790918A |
:103F900097072091860430918704821B930B90939E |
:103FA000970780939607202F332744275527809122 |
:103FB000820490918304A0918404B0918504BC0193 |
:103FC000CD010E946C3E9B01AC0197FF04C02150C3 |
:103FD0003E4F4F4F5F4FB9E0559547953795279521 |
:103FE000BA95D1F78091960790919707821B930B12 |
:103FF00090939707809396078091960790919707E3 |
:104000009C01442737FD4095542F809146049091A0 |
:104010004704A0914804B0914904820F931FA41F44 |
:10402000B51F8093460490934704A0934804B0932F |
:104030004904809196079091970720911004309140 |
:104040001104821B930B9C01442737FD4095542F8C |
:1040500080914A0490914B04A0914C04B0914D047E |
:10406000820F931FA41FB51F80934A0490934B04A3 |
:10407000A0934C04B0934D0480914A0490914B045A |
:10408000A0914C04B0914D04C0918203D091830360 |
:10409000E0918403F0918503C817D907EA07FB076D |
:1040A00004F580E197E2A0E0B0E08C1B9D0BAE0B25 |
:1040B000BF0B80934A0490934B04A0934C04B0939D |
:1040C0004D0480914A0490914B04A0914C04B0910E |
:1040D0004D048093460490934704A0934804B09302 |
:1040E000490422273327A9012C1B3D0B4E0B5F0BE4 |
:1040F00080914A0490914B04A0914C04B0914D04DE |
:1041000082179307A407B507E4F4C051D742E040F3 |
:10411000F040C0934A04D0934B04E0934C04F093D6 |
:104120004D0480914A0490914B04A0914C04B091AD |
:104130004D048093460490934704A0934804B093A1 |
:1041400049048091E0039091E1030F9734F488E1F2 |
:104150009CEF90939707809396078091E00390914E |
:10416000E103079734F480E398EF909397078093E7 |
:1041700096071A30A9F48091E0039091E103835FE0 |
:10418000934034F088EE93E09093970780939607DE |
:104190008091E0039091E1038A5F9340DCF014C0CA |
:1041A0008091E0039091E103855E974034F088EEC2 |
:1041B00093E090939707809396078091E003909106 |
:1041C000E103835F974034F080ED97E09093970789 |
:1041D000809396078FEE80937A0080913A049091B5 |
:1041E0003B04A0913C04B0913D0480934E04909315 |
:1041F0004F04A0935004B093510480914A049091CD |
:104200004B04A0914C04B0914D0480936A049093A8 |
:104210006B04A0936C04B0936D0480914204909160 |
:104220004304A0914404B0914504809362049093A8 |
:104230006304A0936404B093650480914604909154 |
:104240004704A0914804B091490480936604909378 |
:104250006704A0936804B093690480913E04909130 |
:104260003F04A0914004B091410480935E04909378 |
:104270005F04A0936004B093610480914E0787FFB0 |
:104280006EC0AA2009F06BC080910E04882309F04B |
:1042900066C08091960790919707893C91058CF0B4 |
:1042A0002091960730919707220F331F220F331F5B |
:1042B0008091960790919707820F931F80529340A9 |
:1042C00017C0809196079091970788539F4FA4F449 |
:1042D0002091960730919707220F331F220F331F2B |
:1042E0008091960790919707820F931F805E9C4F55 |
:1042F000909397078093960780918E0790918F07F0 |
:10430000893C91058CF020918E0730918F07220F08 |
:10431000331F220F331F80918E0790918F07820FDA |
:10432000931F8052934017C080918E0790918F0702 |
:1043300088539F4FA4F420918E0730918F07220F4E |
:10434000331F220F331F80918E0790918F07820FAA |
:10435000931F805E9C4F90938F0780938E07809170 |
:104360004A07E82FFF27EE0FFF1FE65EF84F808118 |
:10437000918182599F4F2091280430912904281758 |
:1043800039071CF42F5F3F4F0CC080819181825907 |
:104390009F4F821793074CF42115310531F02150BE |
:1043A0003040309329042093280480914B07E82F54 |
:1043B000FF27EE0FFF1FE65EF84F80819181825943 |
:1043C0009F4F2091260430912704281739071CF4A9 |
:1043D0002F5F3F4F0CC08081918182599F4F821780 |
:1043E00093074CF42115310531F0215030403093C2 |
:1043F00027042093260480914C07E82FFF27EE0F17 |
:10440000FF1FE65EF84F8081918182599F4F209176 |
:10441000240430912504281739071CF42F5F3F4FDF |
:104420000CC08081918182599F4F821793074CF471 |
:104430002115310531F0215030403093250420936F |
:10444000240480914D07E82FFF27EE0FFF1FE65E43 |
:10445000F84F8081918182599F4F209122043091A1 |
:104460002304281739071CF42F5F3F4F0CC08081AD |
:10447000918182599F4F821793074CF42115310582 |
:1044800031F0215030403093230420932204809156 |
:1044900028049091290497FF05C0109229041092D6 |
:1044A00028040AC08F3F910539F034F08FEF90E077 |
:1044B00090932904809328048091260490912704E6 |
:1044C00097FF05C010922704109226040AC08F3F60 |
:1044D000910539F034F08FEF90E0909327048093AA |
:1044E0002604809124049091250497FF05C0109222 |
:1044F0002504109224040AC08F3F910539F034F04E |
:104500008FEF90E0909325048093240480912204FF |
:104510009091230497FF05C0109223041092220467 |
:104520000AC08F3F910539F034F08FEF90E09093FF |
:10453000230480932204DF91CF911F910F91FF906C |
:10454000EF90DF90CF90BF90AF90089580911804C6 |
:10455000882301F580939507809390078093AD079A |
:104560008093AF078091A803882311F08093900770 |
:104570008091A903882311F0809395078091AA0365 |
:10458000882311F08093AF078091AB03882311F04B |
:104590008093AD078091900799279093D7068093D9 |
:1045A000D6068091950799279093D9068093D806CF |
:1045B0008091AF0799279093DB068093DA0680916C |
:1045C000AD0799279093DD068093DC061092F103E6 |
:1045D0001092F0030E94DF1508951F9380915107F8 |
:1045E0008B3F98F08B3F19F4809128040EC08C3FCC |
:1045F00019F48091260409C08D3F19F48091240498 |
:1046000004C08E3F21F4809122048093780380912E |
:104610007803882321F08F3F11F4809378038091F1 |
:1046200050078B3F98F08B3F19F4809128040EC0FF |
:104630008C3F19F48091260409C08D3F19F48091B4 |
:10464000240404C08E3F21F48091220480937903D6 |
:1046500080917903882329F0843618F084E68093CA |
:104660007903809152078B3F98F08B3F19F480912A |
:1046700028040EC08C3F19F48091260409C08D3F98 |
:1046800019F48091240404C08E3F21F48091220407 |
:104690008093770380917703882329F0843618F07C |
:1046A00084E680937703809154078B3F98F08B3F8B |
:1046B00019F4809128040EC08C3F19F480912604CF |
:1046C00009C08D3F19F48091240404C08E3F21F469 |
:1046D000809122048093760380917603882321F0D1 |
:1046E0008F3F11F48093760380915B078B3F98F0A6 |
:1046F0008B3F19F4809128040EC08C3F19F48091EF |
:10470000260409C08D3F19F48091240404C08E3F13 |
:1047100021F480912204809375038091750388238E |
:1047200021F08F3F11F48093750380915C078B3FDC |
:1047300098F08B3F19F4809128040EC08C3F19F437 |
:104740008091260409C08D3F19F48091240404C08F |
:104750008E3F21F48091220480937403809174032E |
:104760008B3010F48AE002C08F3F11F48093740301 |
:1047700080915D078B3F98F08B3F19F4809128045E |
:104780000EC08C3F19F48091260409C08D3F19F4A6 |
:104790008091240404C08E3F21F4809122048093F0 |
:1047A000730380917303882321F08F3F11F480936A |
:1047B0007303809162078B3F98F08B3F19F48091CF |
:1047C00028040EC08C3F19F48091260409C08D3F47 |
:1047D00019F48091240404C08E3F21F480912204B6 |
:1047E0008093710380917103882321F08F3F11F42E |
:1047F00080937103809163078B3F98F08B3F19F48E |
:10480000809128040EC08C3F19F48091260409C0C1 |
:104810008D3F19F48091240404C08E3F21F48091CF |
:1048200022048093090480910904882321F08F3F9A |
:1048300011F480930904809164078B3F98F08B3FBB |
:1048400019F4809128040EC08C3F19F4809126043D |
:1048500009C08D3F19F48091240404C08E3F21F4D7 |
:10486000809122048093080480910804882321F019 |
:104870008F3F11F480930804809165078B3F98F077 |
:104880008B3F19F4809128040EC08C3F19F480915D |
:10489000260409C08D3F19F48091240404C08E3F82 |
:1048A00021F48091220480930704809107048823D7 |
:1048B00021F08F3F11F480930704809166078B3FAE |
:1048C00098F08B3F19F4809128040EC08C3F19F4A6 |
:1048D0008091260409C08D3F19F48091240404C0FE |
:1048E0008E3F21F480912204809306048091060477 |
:1048F000882321F08F3F11F480930604809176077E |
:104900008B3F98F08B3F19F4809128040EC08C3FA8 |
:1049100019F48091260409C08D3F19F48091240474 |
:1049200004C08E3F21F4809122048093050480917D |
:104930000504882321F08F3F11F4809305048091B2 |
:1049400077078B3F98F08B3F19F4809128040EC0B5 |
:104950008C3F19F48091260409C08D3F19F4809191 |
:10496000240404C08E3F21F4809122048093040427 |
:1049700080910404882321F08F3F11F48093040474 |
:10498000809178078B3F98F08B3F19F48091280431 |
:104990000EC08C3F19F48091260409C08D3F19F494 |
:1049A0008091240404C08E3F21F4809122048093DE |
:1049B000030480910304882321F08F3F11F4809336 |
:1049C0000304809179078B3F98F08B3F19F4809115 |
:1049D00028040EC08C3F19F48091260409C08D3F35 |
:1049E00019F48091240404C08E3F21F480912204A4 |
:1049F0008093020480910204882321F08F3F11F4F8 |
:104A000080930204809167078B3F98F08B3F19F4E5 |
:104A1000809128040EC08C3F19F48091260409C0AF |
:104A20008D3F19F48091240404C08E3F21F48091BD |
:104A300022048093700380917003882321F08F3FBC |
:104A400011F48093700380916C078B3F98F08B3F3B |
:104A500019F4809128040EC08C3F19F4809126042B |
:104A600009C08D3F19F48091240404C08E3F21F4C5 |
:104A70008091220480936F0380916F03882321F03B |
:104A80008F3F11F480936F0380916F078B3F98F0F5 |
:104A90008B3F19F4809128040EC08C3F19F480914B |
:104AA000260409C08D3F19F48091240404C08E3F70 |
:104AB00021F48091220480930104809101048823D1 |
:104AC00021F08F3F11F480930104809170078B3F98 |
:104AD00098F08B3F19F4809128040EC08C3F19F494 |
:104AE0008091260409C08D3F19F48091240404C0EC |
:104AF0008E3F21F480912204809300048091000471 |
:104B0000882321F08F3F11F4809300048091750772 |
:104B10008B3F98F08B3F19F4809128040EC08C3F96 |
:104B200019F48091260409C08D3F19F48091240462 |
:104B300004C08E3F21F48091220480936E03809103 |
:104B40006E03882321F08F3F11F480936E03109140 |
:104B50007103812F992787FD9095A92FB92FBC014B |
:104B6000CD010E94AA3D17FF06C020E030E040E8DA |
:104B700053E40E94053D27E137EB41ED58E30E94E5 |
:104B8000243EDC01CB0180937A0390937B03A093B6 |
:104B90007C03B0937D03809159078093B407809183 |
:104BA0005807809398071F9108952F923F924F9234 |
:104BB0005F926F927F928F929F92AF92BF92CF92AD |
:104BC000DF92EF92FF920F931F93CF93DF93CDB7B6 |
:104BD000DEB72B970FB6F894DEBF0FBECDBF0E9495 |
:104BE000621C299A2090190430901A0437FE02C0E2 |
:104BF0002224332480912104843608F05EC0809101 |
:104C00000103882399F480910403909105038F5F39 |
:104C10009F4F61F488E99AE39093C3038093C203A2 |
:104C200080E09CE090930503809304038091A604A8 |
:104C30009091A704009731F001979093A704809377 |
:104C4000A60404C01092180410922B048091000155 |
:104C50008A3011F4289A01C028988091AB04909171 |
:104C6000AC04815D974030F180915F07282E33249A |
:104C700081E080932B0480914607E82FFF27EE0FF9 |
:104C8000FF1FE65EF84F1182108280914707E82FE0 |
:104C9000FF27EE0FFF1FE65EF84F11821082809112 |
:104CA0004907E82FFF27EE0FFF1FE65EF84F11823E |
:104CB00010826DC2109218046AC2809121048D384E |
:104CC00008F465C210922B049091600782E3989FCC |
:104CD000C00111249093A7048093A60449E22416EE |
:104CE00031046CF08091AB049091AC045FEF8F3F86 |
:104CF000950729F001969093AC048093AB048091C2 |
:104D0000AB049091AC04883C910520F068E2261633 |
:104D1000310404F510928A0410928B0410928C04D2 |
:104D200010928D0410928E0410928F0410929004B1 |
:104D30001092910410923A0410923B0410923C0499 |
:104D400010923D04109236041092370410923804E9 |
:104D50001092390480914807E82FFF27EE0FFF1FBC |
:104D6000E65EF84F80819181813591050CF466C132 |
:104D700020911804222309F061C180914907E82F8E |
:104D8000FF27EE0FFF1FE65EF84F808191818C3484 |
:104D900091050CF4CAC08091A8048F5F8093A80489 |
:104DA000893C08F44BC129982093A8041092AC04C4 |
:104DB0001092AB0430914607E32FFF27EE0FFF1F41 |
:104DC000E65EF84F8081918187349105B4F480913B |
:104DD0004707E82FFF27EE0FFF1FE65EF84F8081A1 |
:104DE00091810190F081E02DF7FF03C0F095E195EE |
:104DF000FF4FE734F1050CF47AC041E020914707FA |
:104E0000A22FBB27AA0FBB1FA65EB84F8D919C9106 |
:104E100011978734910544F0E32FFF27EE0FFF1F12 |
:104E2000E65EF84F808191818D919C918734910548 |
:104E300074F080914607E82FFF27EE0FFF1FE65E14 |
:104E4000F84F80819181873491050CF042E0E22F88 |
:104E5000FF27EE0FFF1FE65EF84F808191818634B9 |
:104E6000910574F480914607E82FFF27EE0FFF1F8E |
:104E7000E65EF84F80819181873491050CF043E024 |
:104E8000E22FFF27EE0FFF1FE65EF84F8081918132 |
:104E90008A5B9F4F74F480914607E82FFF27EE0F3F |
:104EA000FF1FE65EF84F80819181873491050CF0F9 |
:104EB00044E0E22FFF27EE0FFF1FE65EF84F8081F0 |
:104EC00091818A5B9F4F74F480914607E82FFF27FA |
:104ED000EE0FFF1FE65EF84F8081918186349105C9 |
:104EE0000CF445E0A2E0B0E0042E0E94033F809164 |
:104EF0004E0780FF10C08091080390910903875BE3 |
:104F0000934038F480910803909109038E5E92409B |
:104F100010F40E94430D0E94790247E466E477E0B2 |
:104F20000E944F020E94F21A82C080819181855BAB |
:104F30009F4F0CF081C08091A8048F5F8093A804DC |
:104F4000893C08F47BC02998A4E0B0E08FEF082EDC |
:104F50000E94033F209318042093A8041092AC04ED |
:104F60001092AB040E94F21AA4E0B0E080917604A3 |
:104F70009091770497FF02C081509F4F892F990F1E |
:104F8000990B082E0E94033FA5E0B0E080917604C3 |
:104F900090917704082E0E94033FA6E0B0E0809134 |
:104FA00074049091750497FF02C081509F4F892F20 |
:104FB000990F990B082E0E94033FA7E0B0E0809163 |
:104FC000740490917504082E0E94033F08E010E0DD |
:104FD0008091700490917104A0917204B091730457 |
:104FE000BC01CD010E948D3DDC01CB019C0197FFEE |
:104FF00002C021503F4F832F992787FD9A95D801F2 |
:10500000082E0E94033F09E010E080917004909107 |
:105010007104A0917204B0917304BC01CD010E948F |
:105020008D3DDC01CB01D801082E0E94033F0E9478 |
:1050300079020E94821902C02093A8048091480737 |
:10504000E82FFF27EE0FFF1FE65EF84F808191816A |
:105050008B5A9F4F0CF09BC020914907E22FFF27EE |
:10506000EE0FFF1FE65EF84F80819181855B9F4FB9 |
:105070000CF06DC08091A9048F5F8093A904893CD6 |
:1050800008F467C088EC8093A90481E090E09093D5 |
:10509000AC048093AB0481E08093180410929204D6 |
:1050A00010929304109294041092950410923A0472 |
:1050B00010923B0410923C0410923D04109236046E |
:1050C00010923704109238041092390410924A0456 |
:1050D00010924B0410924C0410924D041092420412 |
:1050E00010924304109244041092450480916A0483 |
:1050F00090916B04A0916C04B0916D048093460470 |
:1051000090934704A0934804B093490480916204AB |
:1051100090916304A0916404B091650480933E046F |
:1051200090933F04A0934004B093410410928A04EA |
:1051300010928B0410928C0410928D0410928E04A5 |
:1051400010928F04109290041092910402C0109259 |
:10515000A904E22FFF27EE0FFF1FE65EF84F8081C4 |
:1051600091818C3491058CF08091AA048F5F80939B |
:10517000AA04893C60F01092180488EC8093AA0479 |
:105180001092AC041092AB0402C01092AA04809159 |
:105190006B03815080936B0380916B038F3F29F0E9 |
:1051A00080912B04882309F4AEC30E94ED228091E4 |
:1051B0001F04909120049C01220F331F280F391FD8 |
:1051C000F0904607EF2DFF27EE0FFF1F9AE1C92E43 |
:1051D00097E0D92ECE0EDF1EE09055076E2D772773 |
:1051E000D6018D919C91869FA001879F500D969F1F |
:1051F000500D1124240F351F37FF02C02D5F3F4F84 |
:105200003595279535952795E05DF84F80915607A0 |
:10521000482F552780819181849FD001859FB00DB3 |
:10522000949FB00D11242A0F3B1F3093200420932C |
:105230001F0480911D0490911E049C01220F331FB6 |
:10524000280F391F00914707A02FBB27AA0FBB1FAC |
:10525000FD01E65EF84F80819181869FF001879F76 |
:10526000F00D969FF00D11242E0F3F1F37FF02C047 |
:105270002D5F3F4F3595279535952795A05DB84F04 |
:105280008D919C91849FB001859F700D949F700DAE |
:105290001124260F371F30931E0420931D04809184 |
:1052A0004907E82FFF27EE0FFF1FE65EF84F8081CA |
:1052B0009181909581959F4F90931C0480931B043E |
:1052C00080914807E82FFF27EE0FFF1FE65EF84F9B |
:1052D0008081918188589F4F90931A04809319047C |
:1052E000D6018D919C9111972D913C9137FF03C070 |
:1052F000309521953F4F8091F8039091F9038217E3 |
:1053000093075CF4F601808191818081918197FF00 |
:1053100005C0909581959F4F01C001979093F90327 |
:105320008093F803E02FFF27EE0FFF1FE65EF84F94 |
:10533000808191812081318137FF03C03095219593 |
:105340003F4F8091F6039091F7038217930754F42F |
:10535000808191818081918197FF05C09095819591 |
:105360009F4F01C001979093F7038093F6038091BC |
:105370002B04882341F01092F9031092F803109245 |
:10538000F7031092F60310917403812F992787FD7C |
:105390009095A92FB92FBC01CD010E94AA3D17FFFE |
:1053A00006C020E030E040E853E40E94053D20E0E4 |
:1053B00030E040E251E40E94053DDC01CB0120E0F9 |
:1053C00030E040E85BE3BC01CD010E94243EDC01FB |
:1053D000CB018093B7079093B807A093B907B09318 |
:1053E000BA0710917303812F992787FD9095A92FF4 |
:1053F000B92FBC01CD010E94AA3D17FF06C020E0D5 |
:1054000030E040E853E40E94053D20E030EE4BE2FE |
:1054100057E40E94473DDC01CB018093A90790939C |
:10542000AA07A093AB07B093AC076091A5036623CE |
:1054300031F08AE090E09093C3038093C203462F3B |
:10544000552742FF09C080910904282F3327220FD6 |
:10545000331F220F331F13C09A012870307043FF8F |
:105460000EC080910904282F33278CEF9FEF289FCF |
:10547000A001299F500D389F500D11249A01809151 |
:10548000FE039091FF03AC01F3E0440F551FFA9522 |
:10549000E1F7481B590B420F531F57FF02C0495FEA |
:1054A0005F4FE3E055954795EA95E1F75093FF0389 |
:1054B0004093FE03462F552744FF09C080910904FD |
:1054C000282F3327220F331F220F331F13C09A01B7 |
:1054D0002072307045FF0EC080910904282F3327B9 |
:1054E0008CEF9FEF289FB001299F700D389F700DA2 |
:1054F00011249B018091FC039091FD03AC0163E0BA |
:10550000440F551F6A95E1F7481B590B420F531F73 |
:1055100057FF02C0495F5F4F83E0559547958A95D5 |
:10552000E1F75093FD034093FC034091A403842FC3 |
:10553000992783FF03C082E390E007C09C01247099 |
:10554000307082FF07C08EEC9FEF9093FB03809337 |
:10555000FA0304C03093FB032093FA03242F33276C |
:1055600021FF09C080916C0390916D030196909387 |
:105570006D0380936C0324FF09C080916C039091AC |
:105580006D03019790936D0380936C038091FE03EC |
:105590009091FF0397FD079613E0959587951A95CF |
:1055A000E1F7E0911F04F0912004E80FF91FF09358 |
:1055B0002004E0931F048091FC039091FD0397FD6C |
:1055C0000796B3E095958795BA95E1F740911D044C |
:1055D00050911E04480F591F50931E0440931D0400 |
:1055E00060911B0470911C048091FA039091FB035D |
:1055F000680F791F70931C0460931B04809125062B |
:1056000080FF59C080910904813808F454C080910A |
:105610001E06992787FD90952E2D3327829FD00156 |
:10562000839FB00D929FB00D1124EA0FFB1FF093E2 |
:105630002004E0931F0480911F06992787FD909511 |
:10564000829FF001839FF00D929FF00D11244E0F69 |
:105650005F1F50931E0440931D04809120069927DC |
:1056600087FD9095680F791F70931C0460931B044D |
:1056700080912206282F332727FD309580915307EC |
:105680009927289FA001299F500D389F500D112464 |
:1056900050936D0340936C0380912106282F33278C |
:1056A0008091190490911A042817390724F4309333 |
:1056B0001A042093190480914E0782FF0CC080E0E9 |
:1056C00090E0A0E0B0E08093A9079093AA07A09390 |
:1056D000AB07B093AC078091B7079091B807A09142 |
:1056E000B907B091BA0720E030E040E050E0BC01DB |
:1056F000CD010E94B43D882364F480E090E0A0E0F6 |
:10570000B0E08093B7079093B807A093B907B09320 |
:10571000BA078091A9079091AA07A091AB07B09111 |
:10572000AC0720E030E040E050E0BC01CD010E9439 |
:10573000B43D882364F480E090E0A0E0B0E0809382 |
:10574000A9079093AA07A093AB07B093AC07E02FEB |
:10575000FF27EE0FFF1FE65EF84F40916D07242FE5 |
:105760003327808191812817390744F480917A0783 |
:1057700082FF04C081E080930D0413C0E02FFF2757 |
:10578000EE0FFF1FE65EF84F842F992720916E07DA |
:10579000821B9109208131812817390714F4109256 |
:1057A0000D0440914707E42FFF27EE0FFF1FE65E31 |
:1057B000F84F50916D07852F992722273327281BF3 |
:1057C000390B808191818217930744F480917A0785 |
:1057D00083FF04C081E080930C0416C080910C0408 |
:1057E000882391F0E42FFF27EE0FFF1FE65EF84FAE |
:1057F00080916E079927851B91092081318182173D |
:10580000930714F410920C04EF2DFF27EE0FFF1FE7 |
:10581000E65EF84F40916D07242F332780819181F8 |
:105820002817390744F480917A0780FF04C081E08B |
:1058300080930A0417C080910A04882399F0EF2D01 |
:10584000FF27EE0FFF1FE65EF84F842F9927209168 |
:105850006E07821B9109208131812817390714F4C2 |
:1058600010920A0440914607E42FFF27EE0FFF1F16 |
:10587000E65EF84F50916D07852F99272227332731 |
:10588000281B390B808191818217930744F4809102 |
:105890007A0781FF04C081E080930B0416C08091D9 |
:1058A0000B04882391F0E42FFF27EE0FFF1FE65E25 |
:1058B000F84F80916E079927851B910920813181CE |
:1058C0008217930714F410920B0480910D0488231F |
:1058D00019F480910C04811181E080930E04809171 |
:1058E0000A04882321F480910B04882351F081E07D |
:1058F00080930F0410920E0410920D0410920C0469 |
:1059000002C080930F0420910E04222331F084E61C |
:1059100090E09093C3038093C203222321F48091EB |
:105920000F04882339F080916C079927821593051D |
:105930000CF41C0190902B04992041F110921C044E |
:1059400010921B041092200410921F0410921E0447 |
:1059500010921D048DEC9CECACECBDE38093B7077A |
:105960009093B807A093B907B093BA078AE097ED70 |
:10597000A3EABBE38093A9079093AA07A093AB0780 |
:10598000B093AC0710920E0410920F048091A107FF |
:105990009091A207A091A307B091A40720916A0457 |
:1059A00030916B0440916C0450916D04820F931FF1 |
:1059B000A41FB51F8093A1079093A207A093A307EC |
:1059C000B093A4078091A5079091A607A091A7077F |
:1059D000B091A8072091620430916304409164045F |
:1059E00050916504820F931FA41FB51F8093A507D4 |
:1059F0009093A607A093A707B093A8078091990753 |
:105A000090919A07A0919B07B0919C072091660402 |
:105A1000309167044091680450916904820F931F8C |
:105A2000A41FB51F8093990790939A07A0939B0793 |
:105A3000B0939C078091910790919207A091930752 |
:105A4000B091940720915E0430915F04409160040E |
:105A500050916104820F931FA41FB51F809391077B |
:105A600090939207A0939307B093940780900F04AC |
:105A7000882029F480910E04882309F45FC01092D5 |
:105A80005A0410925B0410925C0410925D04109210 |
:105A90005604109257041092580410925904109210 |
:105AA000A1071092A2071092A3071092A4071092C8 |
:105AB000A5071092A6071092A7071092A8071092A8 |
:105AC000990710929A0710929B0710929C071092C8 |
:105AD0009107109292071092930710929407809169 |
:105AE0004A0490914B04A0914C04B0914D048093D2 |
:105AF000460490934704A0934804B09349048091CE |
:105B0000420490914304A0914404B09145048093D1 |
:105B10003E0490933F04A0934004B093410410923C |
:105B2000CD031092CC031092110410921004109225 |
:105B3000130410921204882009F00BC180910E0406 |
:105B4000882309F006C180915A07E82EFF24002718 |
:105B5000112780916A0490916B04A0916C04B0911C |
:105B60006D04BC01CD01A80197010E94E03E5901DE |
:105B70006A018091B2079091B307AA2797FDA0957B |
:105B8000BA2FA81AB90ACA0ADB0A80916204909156 |
:105B90006304A0916404B0916504BC01CD01A80127 |
:105BA00097010E94E03E79018A018091BC079091A3 |
:105BB000BD07AA2797FDA095BA2FE81AF90A0A0B84 |
:105BC0001B0BD601C501D7FE03C00F96A11DB11D49 |
:105BD0005C016D01A4E0D594C794B794A794AA95ED |
:105BE000D1F7D801C70117FF03C00F96A11DB11D42 |
:105BF0007C018D01F4E015950795F794E794FA95EB |
:105C0000D1F78091F8039091F903409734F4809193 |
:105C1000F6039091F7034097A4F0C601B50123E085 |
:105C200030E040E050E00E94E03E59016A01C801C6 |
:105C3000B70123E030E040E050E00E94E03E79010F |
:105C40008A0180914907E82FFF27EE0FFF1FE65ECC |
:105C5000F84F808191810190F081E02DF7FF03C022 |
:105C6000F095E195FF4F7A97A4F0C601B50123E0C6 |
:105C700030E040E050E00E94E03E59016A01C80176 |
:105C8000B70123E030E040E050E00E94E03E7901BF |
:105C90008A0151E2A516B104C104D1042CF0E0E25E |
:105CA000AE2EB12CC12CD12C60EEA6166FEFB6062D |
:105CB0006FEFC6066FEFD60644F470EEA72E7FEFA7 |
:105CC000B72E7FEFC72E7FEFD72E71E2E716F104D4 |
:105CD000010511052CF060E2E62EF12C012D112DAD |
:105CE00080EEE8168FEFF8068FEF08078FEF1807A2 |
:105CF00044F450EEE52E5FEFF52E5FEF052F5FEFDA |
:105D0000152F80914A0490914B04A0914C04B091BE |
:105D10004D048A199B09AC09BD0980934A049093EC |
:105D20004B04A0934C04B0934D0480914204909195 |
:105D30004304A0914404B09145048E199F09A00B1F |
:105D4000B10B8093420490934304A0934404B09316 |
:105D500045048091CC039091CD038F3F910509F0CC |
:105D600008F4F7C5882009F076C580910E048823D1 |
:105D700009F071C58091A1079091A207A091A30796 |
:105D8000B091A407B7FF04C081509F4FAF4FBF4FE2 |
:105D9000892F9A2FAB2FBB27A7FDBA958093A10718 |
:105DA0009093A207A093A307B093A4078091A5079F |
:105DB0009091A607A091A707B091A807B7FF04C0CC |
:105DC00081509F4FAF4FBF4F892F9A2FAB2FBB27CB |
:105DD000A7FDBA958093A5079093A607A093A70760 |
:105DE000B093A80780915A07E82EFF2400271127B7 |
:105DF00020915A0430915B0440915C0450915D0401 |
:105E0000C801B7010E946C3E97FF04C061507F4FEC |
:105E10008F4F9F4FBB2797FDBA95A92F982F872F9C |
:105E200080935A0490935B04A0935C04B0935D0448 |
:105E300020915604309157044091580450915904D0 |
:105E4000C801B7010E946C3E97FF04C061507F4FAC |
:105E50008F4F9F4FBB2797FDBA95A92F982F872F5C |
:105E60008093560490935704A0935804B093590418 |
:105E70008091520490915304A0915404B091550420 |
:105E8000B7FF04C081509F4FAF4FBF4F892F9A2F4C |
:105E9000AB2FBB27A7FDBA95809352049093530470 |
:105EA000A0935404B09355042091A1073091A20708 |
:105EB0004091A3075091A40780915A0490915B04EC |
:105EC000A0915C04B0915D04281B390B4A0B5B0B5D |
:105ED00020939E0430939F044093A0045093A10408 |
:105EE00080917307E82EFF2400271127CA01B9010A |
:105EF000A80197010E94E03E59016A012093B10474 |
:105F00003093B2044093B3045093B4048091A50736 |
:105F10009091A607A091A707B091A80720915604D9 |
:105F2000309157044091580450915904821B930BAF |
:105F3000A40BB50B8093A2049093A304A093A40494 |
:105F4000B093A504BC01CD01A80197010E94E03ED9 |
:105F50002093B5043093B6044093B7045093B8042B |
:105F6000D601C501D7FE04C081509F4FAF4FBF4F30 |
:105F7000892F9A2FAB2FBB27A7FDBA9590931104B9 |
:105F80008093100457FF04C021503F4F4F4F5F4F85 |
:105F9000BB2757FDBA95A52F942F832F90931304F9 |
:105FA000809312048091F8039091F9034097D4F400 |
:105FB0008091F6039091F7034097A4F480914907EC |
:105FC000E82FFF27EE0FFF1FE65EF84F80819181DB |
:105FD0000190F081E02DF7FF03C0F095E195FF4FB0 |
:105FE0007A97A4F0809110049091110497FD019686 |
:105FF00095958795909311048093100497FD0196D1 |
:10600000959587959093110480931004809199073A |
:1060100090919A07A0919B07B0919C07B7FF04C08D |
:1060200081509F4FAF4FBF4F892F9A2FAB2FBB2768 |
:10603000A7FDBA958093990790939A07A0939B0721 |
:10604000B0939C078091910790919207A09193073C |
:10605000B0919407B7FF04C081509F4FAF4FBF4F1F |
:10606000892F9A2FAB2FBB27A7FDBA958093910755 |
:1060700090939207A0939307B0939407E0906604DF |
:10608000F0906704009168041091690480916A049B |
:1060900090916B04A0916C04B0916D04E81AF90A18 |
:1060A0000A0B1B0BE0929604F0929704009398045D |
:1060B0001093990420915E0430915F044091600434 |
:1060C000509161048091620490916304A0916404F2 |
:1060D000B0916504281B390B4A0B5B0B20939A0483 |
:1060E00030939B0440939C0450939D04E0929E0443 |
:1060F000F0929F040093A0041093A1042093A204A3 |
:106100003093A3044093A4045093A50480914604C3 |
:1061100090914704A0914804B09149048E199F09B9 |
:10612000A00BB10B8093460490934704A0934804BE |
:10613000B093490480913E0490913F04A0914004A3 |
:10614000B0914104821B930BA40BB50B80933E04CA |
:1061500090933F04A0934004B093410480915A046B |
:1061600090915B04A0915C04B0915D04BC01CD01F1 |
:106170002AE130E040E050E00E94E03E3093E1064A |
:106180002093E0068091560490915704A091580402 |
:10619000B0915904BC01CD012AE130E040E050E06B |
:1061A0000E94E03E3093E3062093E20680919E0435 |
:1061B00090919F049093E5068093E4068091A20459 |
:1061C0009091A3049093E7068093E6068091A1073F |
:1061D0009091A207A091A307B091A407BC01CD01A3 |
:1061E0002AE130E040E050E00E94E03E3093E906D2 |
:1061F0002093E8068091A5079091A607A091A70794 |
:10620000B091A807BC01CD012AE130E040E050E0A8 |
:106210000E94E03E3093EB062093EA068091B5049D |
:106220009091B6049093F9068093F806C0901204FA |
:10623000D0901304C60133E0880F991F3A95E1F717 |
:106240008C0D9D1D8C0D9D1D9093FB068093FA0671 |
:1062500081E090E09093BE048093BD042091C3043C |
:106260003091C4044091C5045091C6048091A107A7 |
:106270009091A207A091A307B091A407281B390B06 |
:106280004A0B5B0B57FF07C0509540953095219501 |
:106290003F4F4F4F5F4F20523E44404050400CF024 |
:1062A000FEC0A1E0EA16A0E1FA06A0E00A07A0E01D |
:1062B0001A070CF46CC08091BF04882309F463C0F2 |
:1062C000D801C70117FF07C088279927DC018E195D |
:1062D0009F09A00BB10BB7FF04C08150904FAF4F87 |
:1062E000BF4F2CE0B595A795979587952A95D1F73F |
:1062F00001969093BE048093BD04D801C70117FF97 |
:1063000003C00796A11DB11D13E0B595A7959795FC |
:1063100087951A95D1F78093B1049093B204A09316 |
:10632000B304B093B40489589341A040B04064F0E2 |
:1063300088E893E1A0E0B0E08093B1049093B204C8 |
:10634000A093B304B093B4042091B1043091B2048B |
:106350004091B3045091B40457FF04C021503F4F03 |
:106360004F4F5F4F232F342F452F552747FD5A9509 |
:106370008091100490911104820F931F9093110447 |
:106380008093100406C081E08093BF0402C0109285 |
:10639000BF04E0909E04F0909F040091A00410912F |
:1063A000A104F0E0EF16F0EFFF06FFEF0F07FFEF9D |
:1063B0001F070CF071C08091C004882309F468C0E5 |
:1063C000A801970117FF07C022273327A9012E191B |
:1063D0003F09400B510B57FF04C02150304F4F4F26 |
:1063E0005F4FECE05595479537952795EA95D1F79E |
:1063F0008091BD049091BE04820F931F9093BE04C0 |
:106400008093BD04D801C70117FF03C00796A11DE3 |
:10641000B11D73E0B595A795979587957A95D1F7B6 |
:106420008093B1049093B204A093B304B093B404E6 |
:1064300088579C4EAF4FBF4F64F488E79CEEAFEF98 |
:10644000BFEF8093B1049093B204A093B304B093D0 |
:10645000B4042091B1043091B2044091B30450913E |
:10646000B40457FF04C021503F4F4F4F5F4F232FBD |
:10647000342F452F552747FD5A9580911004909150 |
:106480001104820F931F90931104809310040BC08A |
:1064900081E08093C00407C01092C00404C0109231 |
:1064A000BE041092BD0410917407212F33278091F0 |
:1064B000BD049091BE042817390724F43093BE041C |
:1064C0002093BD0440919E0450919F046091A004CC |
:1064D0007091A104413034E0530730E0630730E0AD |
:1064E000730774F080918004909181042091BD0421 |
:1064F0003091BE04820F931F909381048093800497 |
:1065000040505C4F6F4F7F4F74F4809180049091A6 |
:1065100081042091BD043091BE04821B930B9093A3 |
:1065200081048093800481E090E09093BE04809386 |
:10653000BD041092B5041092B6041092B7041092E4 |
:10654000B8042091C7043091C8044091C904509107 |
:10655000CA048091A5079091A607A091A707B091C2 |
:10656000A807281B390B4A0B5B0B57FF07C0509538 |
:106570004095309521953F4F4F4F5F4F20523E44FD |
:10658000404050400CF0FCC04090A2045090A30446 |
:106590006090A4047090A504A1E04A16A0E15A06F8 |
:1065A000A0E06A06A0E07A060CF468C08091C104FD |
:1065B000882309F45FC0D301C20177FE07C0882792 |
:1065C0009927DC0184199509A609B709B7FF04C00A |
:1065D0008150904FAF4FBF4F4CE0B595A795979521 |
:1065E00087954A95D1F701969093BE048093BD0498 |
:1065F000D301C20177FE03C00796A11DB11D33E090 |
:10660000B595A795979587953A95D1F78093B50459 |
:106610009093B604A093B704B093B80489589341FB |
:10662000A040B04064F088E893E1A0E0B0E080933F |
:10663000B5049093B604A093B704B093B8048091C6 |
:10664000B5049091B604A091B704B091B804B7FF17 |
:1066500004C081509F4FAF4FBF4F892F9A2FAB2F50 |
:10666000BB27A7FDBA95C80ED91ED0921304C092BD |
:10667000120406C081E08093C10402C01092C104DC |
:10668000F0E04F16F0EF5F06FFEF6F06FFEF7F06BB |
:106690000CF073C08091C204882309F46AC0D3014E |
:1066A000C20177FE07C088279927DC018419950964 |
:1066B000A609B7099C01AD01B7FF04C02150304FB6 |
:1066C0004F4F5F4F8CE055954795379527958A95A5 |
:1066D000D1F78091BD049091BE04820F931F9093D7 |
:1066E000BE048093BD04D301C20177FE03C00796A8 |
:1066F000A11DB11D03E0B595A795979587950A95BE |
:10670000D1F78093B5049093B604A093B704B093E7 |
:10671000B80488579C4EAF4FBF4F64F488E79CEE97 |
:10672000AFEFBFEF8093B5049093B604A093B70486 |
:10673000B093B8042091B5043091B6044091B704E9 |
:106740005091B80457FF04C021503F4F4F4F5F4F47 |
:10675000232F342F452F552747FD5A95809112043A |
:1067600090911304820F931F90931304809312044B |
:106770000BC081E08093C20407C01092C20404C021 |
:106780001092BE041092BD04212F33278091BD04C6 |
:106790009091BE042817390724F43093BE04209347 |
:1067A000BD044091A2045091A3046091A40470918F |
:1067B000A504413034E0530730E0630730E073074D |
:1067C00074F080917E0490917F042091BD043091FB |
:1067D000BE04820F931F90937F0480937E044050E9 |
:1067E0005C4F6F4F7F4F74F480917E0490917F04D3 |
:1067F0002091BD043091BE04821B930B90937F04C3 |
:1068000080937E048091B5049091B6049093F50630 |
:106810008093F40680918004909181049093ED061A |
:106820008093EC0620917E0430917F0480917A045D |
:1068300090917B04281B390BC901F3E0880F991F45 |
:10684000FA95E1F7820F931F820F931F9093EF0643 |
:106850008093EE0608C01092130410921204109256 |
:106860001104109210048091A9079091AA07A09199 |
:10687000AB07B091AC0720E030E040E050E0BC0155 |
:10688000CD010E94B43D882341F41092130410926C |
:10689000120410921104109210048091A10790919B |
:1068A000A207A091A307B091A4078093C30490937B |
:1068B000C404A093C504B093C6048091A507909129 |
:1068C000A607A091A707B091A8078093C70490934B |
:1068D000C804A093C904B093CA0410925A04109239 |
:1068E0005B0410925C0410925D04109256041092A6 |
:1068F00057041092580410925904109252041092A6 |
:10690000530410925404109255041092A10710924F |
:10691000A2071092A3071092A4071092A507109245 |
:10692000A6071092A7071092A80710929907109235 |
:106930009A0710929B0710929C0710929107109251 |
:10694000920710929307109294071092CD03109221 |
:10695000CC03A0901B04B0901C04C501B7FE04C07A |
:10696000882799278A199B0945973CF080914E0703 |
:1069700084FD03C081E08093B004D0905707ED2CD4 |
:10698000FF2400271127B501882777FD8095982FD0 |
:106990009501B7FE04C0222733272A193B09442753 |
:1069A00037FD4095542F0E946C3E9B01AC01C801FD |
:1069B000B7010E946C3E97FF04C061507E4F8F4F1D |
:1069C0009F4FE9E09595879577956795EA95D1F77B |
:1069D0009B018D2D99278A9DD0018B9DB00D9A9D8D |
:1069E000B00D1124CD01B7FD03969595879595952A |
:1069F0008795280F391FC901AA2797FDA095BA2F9F |
:106A00008093920490939304A0939404B09395047C |
:106A100020913A0430913B0440913C0450913D0454 |
:106A2000281B390B4A0B5B0B20933A0430933B0431 |
:106A300040933C0450933D0480913A0490913B0470 |
:106A4000A0913C04B0913D048155934CA040B040CE |
:106A500064F080E593ECA0E0B0E080933A0490937A |
:106A60003B04A0933C04B0933D0480913A04909180 |
:106A70003B04A0913C04B0913D04805B9C43AF4F2C |
:106A8000BF4F64F480EB9CE3AFEFBFEF80933A0419 |
:106A900090933B04A0933C04B0933D048091300458 |
:106AA00090913104892B09F4AAC080914E0783FF8D |
:106AB000A6C080916A0490916B04A0916C04B0917F |
:106AC0006D04B7FF04C081509E4FAF4FBF4F59E0D8 |
:106AD000B595A795979587955A95D1F79C0197FFFE |
:106AE00003C0309521953F4F8091620490916304DB |
:106AF000A0916404B0916504B7FF04C081509E4F1B |
:106B0000AF4FBF4F49E0B595A795979587954A95A3 |
:106B1000D1F7BC0197FF03C0709561957F4F261791 |
:106B200037070CF49B0129313105A4F48091B0049E |
:106B3000882381F08091CB049091CC04892B51F46F |
:106B4000809130049091310490932F0480932E040F |
:106B50001092B00480917503482F5527249FC001DF |
:106B6000259F900D349F900D112497FDCF969C0189 |
:106B700086E0359527958A95E1F7421B530B9A01DC |
:106B800014161506B4F58091CB049091CC040097AF |
:106B900071F580912C0490912D04829FA001839F18 |
:106BA000500D929F500D11249A0157FF02C0215E93 |
:106BB0003F4F05E0359527950A95E1F7442737FDC6 |
:106BC0004095542F80913A0490913B04A0913C044D |
:106BD000B0913D04820F931FA41FB51F80933A0408 |
:106BE00090933B04A0933C04B0933D0408C00197EC |
:106BF00002C084EF91E09093CC048093CB04809109 |
:106C0000AF0481508093AF048F3F09F085C088E1C5 |
:106C10008093AF0480915A07E82EFF2400271127A4 |
:106C200080916A0490916B04A0916C04B0916D0402 |
:106C3000BC01CD01A80197010E94E03E3093BF0640 |
:106C40002093BE068091620490916304A091640435 |
:106C5000B0916504BC01CD01A80197010E94E03EFE |
:106C60003093C1062093C0068091B2079091B3077C |
:106C70009093C3068093C2068091BC079091BD0794 |
:106C80009093C5068093C4068091B5079091B6078E |
:106C90009093C7068093C6068091160490911704BE |
:106CA0009093C9068093C806809132049091330472 |
:106CB000A0913404B0913504B7FF04C081509E4FB9 |
:106CC000AF4FBF4F19E0B595A795979587951A9542 |
:106CD000D1F79093CB068093CA06809130049091AF |
:106CE00031049093CF068093CE0680910E0390914D |
:106CF0000F039093D1068093D006809121049927A9 |
:106D00009093D3068093D20680919D0790919E0721 |
:106D10009093DF068093DE0680910F04A090B70762 |
:106D2000B090B807C090B907D090BA078823A9F0EF |
:106D30008091960790919707AA2797FDA095BA2F63 |
:106D4000BC01CD010E94AA3DDC01CB01A601950149 |
:106D5000BC01CD010E94243E3AC080916A0490910A |
:106D60006B04A0916C04B0916D04BC01CD010E9434 |
:106D7000AA3D7B018C018091A9079091AA07A0915F |
:106D8000AB07B091AC079C01AD01C801B7010E94EF |
:106D9000243E7B018C018091960790919707AA274A |
:106DA00097FDA095BA2FBC01CD010E94AA3DDC0140 |
:106DB000CB01A6019501BC01CD010E94243EDC015E |
:106DC000CB019C01AD01C801B7010E94053DDC016A |
:106DD000CB01BC01CD010E948D3DDC01CB01909324 |
:106DE00097078093960780910E04A090B707B09004 |
:106DF000B807C090B907D090BA078823A9F080914E |
:106E00008E0790918F07AA2797FDA095BA2FBC01F6 |
:106E1000CD010E94AA3DDC01CB01A6019501BC0178 |
:106E2000CD010E94243E3AC0809162049091630497 |
:106E3000A0916404B0916504BC01CD010E94AA3DFB |
:106E40007B018C018091A9079091AA07A091AB07C3 |
:106E5000B091AC079C01AD01C801B7010E94243E6E |
:106E60007B018C0180918E0790918F07AA2797FD57 |
:106E7000A095BA2FBC01CD010E94AA3DDC01CB0137 |
:106E8000A6019501BC01CD010E94243EDC01CB018D |
:106E90009C01AD01C801B7010E94053DDC01CB0199 |
:106EA000BC01CD010E948D3DDC01CB0190938F0789 |
:106EB00080938E078091B5079091B607AA2797FD1A |
:106EC000A095BA2FBC01CD010E94AA3D7B018C0187 |
:106ED0008091B7079091B807A091B907B091BA0710 |
:106EE0009C01AD01BC01CD010E94053DDC01CB013F |
:106EF0009C01AD01C801B7010E94243E7B018C01B9 |
:106F000080914E0490914F04A0915004B09151048F |
:106F1000BC01CD010E94AA3DDC01CB014090A90734 |
:106F20005090AA076090AB077090AC07A301920144 |
:106F3000BC01CD010E94243EDC01CB0120E030E009 |
:106F400040E05FE3BC01CD010E94243EDC01CB01A7 |
:106F50009C01AD01C801B7010E94053DDC01CB01D8 |
:106F6000BC01CD010E948D3DDC01CB019093B607A1 |
:106F70008093B5078091620490916304A0916404AA |
:106F8000B0916504BC01CD010E94AA3DDC01CB019A |
:106F9000A3019201BC01CD010E94243EDC01CB0182 |
:106FA000BC01CD010E948D3DDC01CB019093F10627 |
:106FB0008093F00660911D0470911E047A836983AA |
:106FC0007093FD066093FC0680918E0790918F0769 |
:106FD0009093F7068093F606809196079091970715 |
:106FE0008150984034F080E098E090939707809328 |
:106FF000960780919607909197078050984F34F4A8 |
:1070000080E098EF909397078093960780918E0782 |
:1070100090918F078150984034F080E098E09093F1 |
:107020008F0780938E0780918E0790918F078050F5 |
:10703000984F34F480E098EF90938F0780938E07F9 |
:107040008091B5079091B6078150984034F080E068 |
:1070500098E09093B6078093B5078091B50790911B |
:10706000B6078050984F34F480E098EF9093B607BD |
:107070008093B50780914E07992780FFF1C020913A |
:10708000780381FF0EC0223310F580911604909191 |
:1070900017044497909315048093140410922A04C3 |
:1070A00019C080916C0390916D03820F911D209106 |
:1070B00053073327829FA001839F500D929F500D4D |
:1070C0001124CA014497909315048093140481E01D |
:1070D00080932A04992021F0109215041092140430 |
:1070E0000091160410911704209114043091150496 |
:1070F000201731070CF0B4C080912A04882309F4CA |
:10710000AFC0021B130B809177039927089FB00132 |
:10711000099F700D189F700D1124CB0177FD0F96FC |
:107120008C01B4E015950795BA95E1F7C101801B74 |
:10713000910B8C0180917903282F33278091CE0306 |
:107140009091CF03829FD001839FB00D929FB00D8D |
:107150001124CD01B7FD0796A3E095958795AA95D3 |
:10716000E1F7081B190BC0903204D0903304E09073 |
:107170003404F0903504F7FE08C02FEF31E040E012 |
:1071800050E0C20ED31EE41EF51EF9E0F594E7941C |
:10719000D794C794FA95D1F780917603282F332797 |
:1071A00044275527C701B6010E946C3E97FF04C0D3 |
:1071B000615E7F4F8F4F9F4FE5E09595879577955F |
:1071C0006795EA95D1F7633371051CF062E370E0CF |
:1071D00006C03FEF6E3C730714F46EEC7FEF061BA6 |
:1071E000170B8091AD049091AE049C0174E0220FC6 |
:1071F000331F7A95E1F7281B390B200F311F37FF1A |
:1072000002C0215F3F4F64E0359527956A95E1F70D |
:107210003093AE042093AD0480914F07482F55273B |
:107220002417350774F42416350624F05093AE0461 |
:107230004093AD042416350624F43092AE04209217 |
:10724000AD048091AD049091AE042816390624F463 |
:107250003092AE042092AD042090AD043090AE0484 |
:107260004091B4074B83242F3327C90144978215DB |
:1072700093050CF41C013092CD062092CC06809030 |
:10728000B5079090B6078091920490919304881A64 |
:10729000990AC10137FC019695958795881599053E |
:1072A0000CF44C01909581959F4F881699060CF42B |
:1072B0004C01C90182199309881599050CF44C01F8 |
:1072C000C101821B930B881699060CF44C0154E102 |
:1072D0002516310414F48824992460911F047091B8 |
:1072E00020048091DF049091E004681B790B7B8778 |
:1072F0006A878091960790919707861B970B9093CA |
:10730000A00780939F0720E030E040E050E0C301F9 |
:10731000B2010E94B43D20918A0430918B044091C7 |
:107320008C0450918D04882309F448C0CA01B90126 |
:107330000E94AA3D5B016C0180916A0490916B04EC |
:10734000A0916C04B0916D04BC01CD010E94AA3DD6 |
:10735000DC01CB01A3019201BC01CD010E94243EBE |
:107360007B018C01EA85FB85CF01AA2797FDA095BB |
:10737000BA2FBC01CD010E94AA3DDC01CB019C01CA |
:10738000AD01C801B7010E94043DDC01CB019C01A5 |
:10739000AD01C601B5010E94053DDC01CB01BC0178 |
:1073A000CD010E948D3DDC01CB0180938A04909336 |
:1073B0008B04A0938C04B0938D0414C080919F071C |
:1073C0009091A007AA2797FDA095BA2F280F391FE3 |
:1073D0004A1F5B1F20938A0430938B0440938C04D4 |
:1073E00050938D0480918A0490918B04A0918C0419 |
:1073F000B0918D0481589E43A040B04064F080E875 |
:107400009EE3A0E0B0E080938A0490938B04A09365 |
:107410008C04B0938D0480918A0490918B04A09188 |
:107420008C04B0918D048058914CAF4FBF4F64F4E1 |
:1074300080E891ECAFEFBFEF80938A0490938B04C8 |
:10744000A0938C04B0938D0480919F079091A00726 |
:10745000AA2797FDA095BA2FBC01CD010E94AA3D95 |
:107460007B018C0180918A0490918B04A0918C0403 |
:10747000B0918D04BC01CD010E94AA3DDC01CB017D |
:1074800040917A0350917B0360917C0370917D035E |
:107490004C835D836E837F839C01AD016C817D8114 |
:1074A0008E819F810E94243EDC01CB019C01AD01B5 |
:1074B000C801B7010E94053DDC01CB01BC01CD0133 |
:1074C0000E948D3DDC01CB018C0150916E035887E9 |
:1074D000652F772788279927940197FE04C02227D4 |
:1074E00033272819390937FF02C02F5F3F4F3595E1 |
:1074F0002795220D331D442737FD4095542F0E94B8 |
:107500006C3E97FF04C0615C7F4F8F4F9F4FB6E08A |
:107510009595879577956795BA95D1F79B016017F3 |
:1075200071070CF48B0166277727621B730B061714 |
:1075300017070CF48B019101200F311F280D391D05 |
:1075400037FF03C020E030E007C06B81862F99270A |
:10755000821793070CF49C01709198077987872F05 |
:107560009927281739070CF49C0120939007910163 |
:10757000201B310B280D391D37FF03C020E030E000 |
:1075800007C08091B4079927821793070CF49C01D8 |
:10759000A9858A2F9927281739070CF49C01209375 |
:1075A00095078091DD049091DE04E981FA81E81B62 |
:1075B000F90BFB87EA8780918E0790918F078E1BCE |
:1075C0009F0B90938D0780938C0720E030E040E084 |
:1075D00050E0C301B2010E94B43D20918E0430916D |
:1075E0008F044091900450919104882309F448C07D |
:1075F000CA01B9010E94AA3D5B016C01809162043D |
:1076000090916304A0916404B0916504BC01CD0124 |
:107610000E94AA3DDC01CB01A3019201BC01CD0176 |
:107620000E94243E7B018C012A853B85C901AA2743 |
:1076300097FDA095BA2FBC01CD010E94AA3DDC01A7 |
:10764000CB019C01AD01C801B7010E94043DDC01E2 |
:10765000CB019C01AD01C601B5010E94053DDC01D5 |
:10766000CB01BC01CD010E948D3DDC01CB0180939B |
:107670008E0490938F04A0939004B093910414C04F |
:1076800080918C0790918D07AA2797FDA095BA2F1E |
:10769000280F391F4A1F5B1F20938E0430938F04DD |
:1076A000409390045093910480918E0490918F04A4 |
:1076B000A0919004B091910481589E43A040B040A5 |
:1076C00064F080E89EE3A0E0B0E080938E049093A5 |
:1076D0008F04A0939004B093910480918E049091B4 |
:1076E0008F04A0919004B09191048058914CAF4FB9 |
:1076F000BF4F64F480E891ECAFEFBFEF80938E044E |
:1077000090938F04A0939004B093910480918C0780 |
:1077100090918D07AA2797FDA095BA2FBC01CD01A6 |
:107720000E94AA3D7B018C0180918E0490918F0470 |
:10773000A0919004B0919104BC01CD010E94AA3D9A |
:10774000DC01CB019C01AD016C817D818E819F812B |
:107750000E94243EDC01CB019C01AD01C801B701B0 |
:107760000E94053DDC01CB01BC01CD010E948D3D95 |
:10777000DC01CB018C015885652F77278827992755 |
:10778000940197FE04C0222733272819390937FFAF |
:1077900002C02F5F3F4F35952795220D331D44279B |
:1077A00037FD4095542F0E946C3E97FF04C0615CEA |
:1077B0007F4F8F4F9F4FF6E095958795779567950B |
:1077C000FA95D1F79B01601771070CF48B016627BE |
:1077D0007727621B730B061717070CF48B019101B7 |
:1077E000200F311F2819390937FF03C020E030E08E |
:1077F00007C08091B4079927821793070CF49C0166 |
:107800006985862F9927281739070CF49C01209346 |
:10781000AF079101201B310B2819390937FF03C02D |
:1078200020E030E007C08091B407992782179307C2 |
:107830000CF49C017985872F9927281739070CF4B8 |
:107840009C012093AD072B960FB6F894DEBF0FBEB8 |
:10785000CDBFDF91CF911F910F91FF90EF90DF90FF |
:10786000CF90BF90AF909F908F907F906F905F90E0 |
:107870004F903F902F9008958091D9049091DA0411 |
:10788000A091DB04B091DC048093D1049093D204E6 |
:10789000A093D304B093D4048091D5049091D604DE |
:1078A000A091D704B091D8048093CD049093CE04D6 |
:1078B000A093CF04B093D00408951092E0041092E6 |
:1078C000DF041092DE041092DD04089584B1806A12 |
:1078D00084B93D9A82E58CBD459A81E08093C307C7 |
:1078E00081E88093C50785E58093C6070895F894DD |
:1078F00081E08093C70780916A0490916B04A09106 |
:107900006C04B0916D0434E0B595A7959795879573 |
:107910003A95D1F79093C9078093C8078091620484 |
:1079200090916304A0916404B091650424E0B5953E |
:10793000A795979587952A95D1F79093CB07809334 |
:10794000CA0784E08093CC0785E08093CD0786E06A |
:107950008093CE07789408958091C3078823A1F07F |
:1079600045981092C3070E94773C81E08093C4073A |
:107970008091DE069091DF0601969093DF0680935A |
:10798000DE068091C5078EBD08950DB407FE2EC09A |
:10799000459A9091C407993030F4E92FFF27E852B7 |
:1079A000F84F8EB580839A3090F4000000000000FC |
:1079B000000045980000000000000000E091A103D5 |
:1079C000F091A203E90FF11D80818EBD0CC081E012 |
:1079D0008093C307AFECB7E0E8EDF7E089E00190F2 |
:1079E0000D928150E1F79F5F9093C4070895FC01C9 |
:1079F0004150504030F001900616D1F73197CF0139 |
:107A000008958827992708955058192EEFD001D04E |
:107A1000D2C0BA176207730784079507B1F188F4DB |
:107A20000EF410940B2EBA2FA02D062E622F202DAF |
:107A3000072E732F302D082E842F402D092E952FC1 |
:107A4000502DFF275523B9F0591B49F0573E98F0A8 |
:107A5000469537952795A795F0405395C9F776F049 |
:107A6000BA0F621F731F841F30F48795779567954F |
:107A7000B795F040939517FA0F2E0895BF1BBB27BB |
:107A8000BA0B620B730B840BF6CFDEF6DBC0AED005 |
:107A900001D091C0552359F0992369F09F575F5742 |
:107AA000951B33F442F4903811F4915805C09BC0F3 |
:107AB00091589F3F09F4C6C0BB2711246217730772 |
:107AC000840730F4660F771F881FBB1F915098F30F |
:107AD00011D00F920FD00F920DD0A0E826173707C4 |
:107AE00048071B0609F0A048BA2F602D7F918F919F |
:107AF00000240895A0E80024621773078407B105E5 |
:107B000028F0621B730B840BB1090A2A660F771FDA |
:107B1000881FBB1FA69581F7089597FB73D09F37E9 |
:107B200038F0FEE9F91B982F872F762F6B2F05C0B1 |
:107B300086C09695879577956795F150D0F73EF476 |
:107B400090958095709561957F4F8F4F9F4F0895C9 |
:107B5000E89403C097FB0EF4F3DFB62F672F782F5E |
:107B6000892F9EE9002427C00ED05EF004C00BD000 |
:107B700026F001C008D019F020F48FEF089580E0BE |
:107B8000089581E0089597FB092E052600F8689472 |
:107B900030D0E89407FC07C0621773078407950785 |
:107BA00021F008F400940794989408959A95BB0FD7 |
:107BB000661F771F881F11249923A1F08823B2F72D |
:107BC0009F3F59F0BB0F48F421F4002011F460FFEF |
:107BD00004C06F5F7F4F8F4F9F4F881F979587958A |
:107BE00097F908952CC09FEF80EC0895052E092683 |
:107BF00007FA440F551F5F3F79F0AA27A51708F031 |
:107C000051E04795880F991F9F3F31F0BB27B91767 |
:107C100008F091E0879508959F919F911124E3CFFB |
:107C200097FB880F991F9F3F31F0BB27B91708F0CA |
:107C300091E0879508959F919F911124D4CF662755 |
:107C40007727882799270895D1DF01D0B4CF9923CA |
:107C500039F0552329F09F575F57950F13F49AF188 |
:107C6000F1CF91589F3FE1F3629FA12D0F92BB2767 |
:107C7000639FA00DB11DEE27729FA00DB11DEE1FD9 |
:107C8000AF93AA27649FB00DE11D739FB00DE11D56 |
:107C9000AA1F6627829FB00DE11DA61F5527749F5E |
:107CA000E00DA11D551F839FE00DA11D561F849F50 |
:107CB000A00D511D852F7A2F6E2F1F900F908823B6 |
:107CC0001AF4939539F48FCF000C111CBB1F661F5B |
:107CD000771F881F01280895629FD001739FF001CC |
:107CE000829FE00DF11D649FE00DF11D929FF00D4C |
:107CF000839FF00D749FF00D659FF00D9927729F83 |
:107D0000B00DE11DF91F639FB00DE11DF91FBD010D |
:107D1000CF0111240895991B79E004C0991F96178B |
:107D200008F0961B881F7A95C9F780950895AA1BBD |
:107D3000BB1B51E107C0AA1FBB1FA617B70710F056 |
:107D4000A61BB70B881F991F5A95A9F78095909588 |
:107D5000BC01CD01089597FB092E07260AD077FDB7 |
:107D600004D0E5DF06D000201AF4709561957F4FAE |
:107D70000895F6F7909581959F4F0895A1E21A2EE8 |
:107D8000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1FBF |
:107D9000A217B307E407F50720F0A21BB30BE40B0F |
:107DA000F50B661F771F881F991F1A9469F7609556 |
:107DB0007095809590959B01AC01BD01CF01089510 |
:107DC00097FB092E05260ED057FD04D0D7DF0AD029 |
:107DD000001C38F450954095309521953F4F4F4FFA |
:107DE0005F4F0895F6F790958095709561957F4F58 |
:107DF0008F4F9F4F0895F999FECFB2BDA1BDF89A5C |
:107E0000119600B40895F999FECFB2BDA1BD00BC92 |
:0E7E100011960FB6F894FA9AF99A0FBE0895DB |
:107E1E000A496E74656772616C4E69636B2020202F |
:107E2E0020496E74656772616C526F6C6C202020F5 |
:107E3E00204163634E69636B202020202020202088 |
:107E4E0020416363526F6C6C202020202020202064 |
:107E5E00204779726F4769657220202020202020EC |
:107E6E0020486F6568656E5765727420202020204B |
:107E7E00204163635A202020202020202020202013 |
:107E8E002047617320202020202020202020202029 |
:107E9E00204B6F6D7061737356616C756520202079 |
:107EAE00205370616E6E756E67202020202020207A |
:107EBE0020456D7066616E672020202020202020D6 |
:107ECE0020416E616C6F67313120202020202020F0 |
:107EDE00204D6F746F725F566F726E65202020207A |
:107EEE00204D6F746F725F48696E74656E2020202E |
:107EFE00204D6F746F725F4C696E6B732020202063 |
:107F0E00204D6F746F725F5265636874732020200A |
:107F1E00204163635F5A2020202020202020202033 |
:107F2E00204D697474656C4163634E69636B2020E8 |
:107F3E00204D697474656C416363526F6C6C2020C4 |
:107F4E0020496E74656772616C4572724E69636B1F |
:107F5E0020496E74656772616C457272526F6C6CFB |
:107F6E00204D697474656C496E744E69636B202084 |
:107F7E00204D697474656C496E74526F6C6C092077 |
:107F8E00004E65757472616C4E69636B2020202003 |
:107F9E0020526F6C6C4F6666736574202020202013 |
:107FAE0020496E74526F6C6C2A46616B746F72202E |
:107FBE0020416E616C6F67323620202020202020F9 |
:107FCE0020446972656B74417573676C526F6C6C8B |
:107FDE00204D65737377657274526F6C6C20202020 |
:107FEE0020417573676C65696368526F6C6C2020F5 |
:107FFE0020492D4C616765526F6C6C20202020202B |
:10800E0020537469636B526F6C6C202020202020EB |
:10801E002064FF01FFFF010AFF03007D00006400E2 |
:10802E0048616C6C6F2057656C7400000000000096 |
:10803E000000000000000000000000000000000032 |
:10804E000000000000000000000000000000000022 |
:10805E000000000000000000000000000000000012 |
:10806E000000000000000000000000000000000002 |
:10807E000102030405060708090A0B01ECFF64461A |
:10808E00640A029696403A10FB3017B7D13890D05A |
:10809E00030090D00300640053706F727400004EA2 |
:1080AE006F726D616C0000426567696E6E6572007D |
:0480BE0000C50700F2 |
:00000001FF |
/tags/V0.68d/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 |
/tags/V0.68d/Kopter-Tool/MikroKopter-Tool.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 |
/tags/V0.68d/License.txt |
---|
0,0 → 1,52 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Copyright (c) 04.2007 Holger Buss |
// + Nur für den privaten Gebrauch |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten und nichtkommerziellen Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
// + Verkauf von Luftbildaufnahmen, usw. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht, |
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts |
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de" |
// + eindeutig als Ursprung verlinkt und genannt werden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion |
// + Benutzung auf eigene Gefahr |
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur |
// + mit unserer Zustimmung zulässig |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Redistributions of source code (with or without modifications) must retain the above copyright notice, |
// + this list of conditions and the following disclaimer. |
// + * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived |
// + from this software without specific prior written permission. |
// + * The use of this project (hardware, software, binary files, sources and documentation) is only permittet |
// + for non-profit use (directly or indirectly) |
// + Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted |
// + with our written permission |
// + * If sources or documentations are redistributet, our webpage (http://www.MikroKopter.de) must be |
// + clearly linked and named as origin |
// + * porting to systems other than hardware from www.mikrokopter.de is not allowed |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
// + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
// + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
// + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
// + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
// + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
// + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
// + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
// + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
// + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
/tags/V0.68d/Settings.h |
---|
--- V0.68d/_Settings.h (nonexistent) |
+++ V0.68d/_Settings.h (revision 638) |
@@ -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 |
+ |
/tags/V0.68d/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; |
} |
/tags/V0.68d/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) |
/tags/V0.68d/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 = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_ACC_Wirkung = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_Verstaerkung = 4; // Wert : 0-50 |
EE_Parameter.Stick_P = 4; //2 // Wert : 1-6 |
EE_Parameter.Stick_D = 8; //8 // Wert : 0-64 |
EE_Parameter.Gier_P = 12; // Wert : 1-20 |
EE_Parameter.Gas_Min = 15; // Wert : 0-32 |
EE_Parameter.Gas_Max = 250; // Wert : 33-250 |
EE_Parameter.GyroAccFaktor = 30; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
EE_Parameter.Gyro_P = 80; // Wert : 0-250 |
EE_Parameter.Gyro_I = 150; // Wert : 0-250 |
EE_Parameter.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 = 90; |
EE_Parameter.AchsGegenKopplung1 = 5; |
EE_Parameter.WinkelUmschlagNick = 100; |
EE_Parameter.WinkelUmschlagRoll = 100; |
EE_Parameter.GyroAccAbgleich = 16; // 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 = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_ACC_Wirkung = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_Verstaerkung = 3; // Wert : 0-50 |
EE_Parameter.Stick_P = 3; //2 // Wert : 1-6 |
EE_Parameter.Stick_D = 4; //8 // Wert : 0-64 |
EE_Parameter.Gier_P = 6; // Wert : 1-20 |
EE_Parameter.Gas_Min = 15; // Wert : 0-32 |
EE_Parameter.Gas_Max = 250; // Wert : 33-250 |
EE_Parameter.GyroAccFaktor = 30; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
EE_Parameter.Gyro_P = 80; // Wert : 0-250 |
EE_Parameter.Gyro_I = 120; // Wert : 0-250 |
EE_Parameter.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 = 90; // Faktor, mit dem Gier die Achsen Roll und Nick verkoppelt |
EE_Parameter.AchsGegenKopplung1 = 5; |
EE_Parameter.WinkelUmschlagNick = 100; |
EE_Parameter.WinkelUmschlagRoll = 100; |
EE_Parameter.GyroAccAbgleich = 32; // 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 = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_ACC_Wirkung = 30; // Wert : 0-250 |
EE_Parameter.Hoehe_Verstaerkung = 2; // Wert : 0-50 |
EE_Parameter.Stick_P = 2; //2 // Wert : 1-6 |
EE_Parameter.Stick_D = 4; //8 // Wert : 0-64 |
EE_Parameter.Gier_P = 6; // Wert : 1-20 |
EE_Parameter.Gas_Min = 15; // Wert : 0-32 |
EE_Parameter.Gas_Max = 250; // Wert : 33-250 |
EE_Parameter.GyroAccFaktor = 30; // Wert : 1-64 |
EE_Parameter.KompassWirkung = 128; // Wert : 0-250 |
EE_Parameter.Gyro_P = 100; // Wert : 0-250 |
EE_Parameter.Gyro_I = 140; // Wert : 0-250 |
EE_Parameter.UnterspannungsWarnung = 94; // Wert : 0-250 |
EE_Parameter.NotGas = 35; // Wert : 0-250 // Gaswert bei Empangsverlust |
EE_Parameter.NotGasZeit = 20; // Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
EE_Parameter.UfoAusrichtung = 0; // X oder + Formation |
EE_Parameter.I_Faktor = 16; |
EE_Parameter.UserParam1 = 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 = 90; // Faktor, mit dem Gier die Achsen Roll und Nick verkoppelt |
EE_Parameter.AchsGegenKopplung1 = 5; |
EE_Parameter.WinkelUmschlagNick = 100; |
EE_Parameter.WinkelUmschlagRoll = 100; |
EE_Parameter.GyroAccAbgleich = 32; // 1/k |
EE_Parameter.Driftkomp = 4; |
EE_Parameter.DynamicStability = 50; |
memcpy(EE_Parameter.Name, "Beginner\0", 12); |
} |
/tags/V0.68d/fc.c |
---|
0,0 → 1,1133 |
/*####################################################################################### |
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,StickGas = 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; |
int MaxStickNick = 0,MaxStickRoll = 0; |
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; |
//DebugOut.Analog[26] = MesswertNick; |
DebugOut.Analog[28] = MesswertRoll; |
// 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 = StickGas; |
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((PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] > 80) && MotorenEin == 0) |
{ |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// auf Nullwerte kalibrieren |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] > 75) // Neutralwerte |
{ |
if(++delay_neutral > 200) // nicht sofort |
{ |
GRN_OFF; |
MotorenEin = 0; |
delay_neutral = 0; |
modell_fliegt = 0; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70 || abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) > 70) |
{ |
unsigned char setting=1; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < 70) setting = 1; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] > 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 2; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] < 70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 3; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] <-70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] > 70) setting = 4; |
if(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] <-70 && PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] < 70) setting = 5; |
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(PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] < 35-120) |
{ |
// Starten |
if(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]] < -75) |
{ |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Einschalten |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(++delay_einschalten > 200) |
{ |
delay_einschalten = 200; |
modell_fliegt = 1; |
MotorenEin = 1; |
sollGier = 0; |
Mess_Integral_Gier = 0; |
Mess_Integral_Gier2 = 0; |
Mess_IntegralNick = 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; |
static int stick_nick,stick_roll; |
ParameterZuordnung(); |
StickNick = (StickNick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4; |
StickNick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; |
StickRoll = (StickRoll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4; |
StickRoll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; |
StickGier = -PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]; |
StickGas = PPM_in[EE_Parameter.Kanalbelegung[K_GAS]] + 120; |
if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]]) > MaxStickNick) |
MaxStickNick = abs(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]]); else MaxStickNick--; |
if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) > MaxStickRoll) |
MaxStickRoll = abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]); else MaxStickRoll--; |
if(Notlandung) {MaxStickNick = 0; MaxStickRoll = 0;} |
GyroFaktor = ((float)Parameter_Gyro_P + 10.0) / 256.0; |
IntegralFaktor = ((float) Parameter_Gyro_I) / 44000; |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//+ Digitale Steuerung per DubWise |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#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; |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//+ Analoge Steuerung per Seriell |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
if(ExternControl.Config & 0x01 && Parameter_UserParam1 > 128) |
{ |
StickNick += (int) ExternControl.Nick * (int) EE_Parameter.Stick_P; |
StickRoll += (int) ExternControl.Roll * (int) EE_Parameter.Stick_P; |
StickGier += ExternControl.Gier; |
ExternHoehenValue = (int) ExternControl.Hight * (int)EE_Parameter.Hoehe_Verstaerkung; |
if(ExternControl.Gas < StickGas) StickGas = ExternControl.Gas; |
} |
if(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) IntegralFaktor = 0; |
if(GyroFaktor < 0) GyroFaktor = 0; |
if(IntegralFaktor < 0) IntegralFaktor = 0; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// 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_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll); |
tmp_long /= 16; |
tmp_long2 /= 16; |
if((MaxStickNick > 15) || (MaxStickRoll > 15)) |
{ |
tmp_long /= 3; |
tmp_long2 /= 3; |
} |
if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25) |
{ |
tmp_long /= 3; |
tmp_long2 /= 3; |
} |
#define AUSGLEICH 32 |
if(tmp_long > AUSGLEICH) tmp_long = AUSGLEICH; |
if(tmp_long < -AUSGLEICH) tmp_long =-AUSGLEICH; |
if(tmp_long2 > AUSGLEICH) tmp_long2 = AUSGLEICH; |
if(tmp_long2 <-AUSGLEICH) tmp_long2 =-AUSGLEICH; |
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; |
// Roll ++++++++++++++++++++++++++++++++++++++++++++++++ |
IntegralFehlerRoll = (long)(MittelIntegralRoll - (long)IntegralAccRoll); |
ausgleichRoll = IntegralFehlerRoll / EE_Parameter.GyroAccAbgleich; |
LageKorrekturNick = ausgleichNick / ABGLEICH_ANZAHL; |
LageKorrekturRoll = ausgleichRoll / ABGLEICH_ANZAHL; |
if((MaxStickNick > 15) || (MaxStickRoll > 15) || (abs(PPM_in[EE_Parameter.Kanalbelegung[K_GIER]]) > 25)) |
{ |
LageKorrekturNick /= 2; |
LageKorrekturNick /= 2; |
} |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// Gyro-Drift ermitteln |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
MittelIntegralNick2 /= ABGLEICH_ANZAHL; |
MittelIntegralRoll2 /= ABGLEICH_ANZAHL; |
tmp_long = IntegralNick2 - IntegralNick; |
tmp_long2 = IntegralRoll2 - IntegralRoll; |
//DebugOut.Analog[25] = MittelIntegralRoll2 / 26; |
IntegralFehlerNick = tmp_long; |
IntegralFehlerRoll = tmp_long2; |
Mess_IntegralNick2 -= IntegralFehlerNick; |
Mess_IntegralRoll2 -= IntegralFehlerRoll; |
// IntegralFehlerNick = (IntegralFehlerNick * 1 + tmp_long) / 2; |
// IntegralFehlerRoll = (IntegralFehlerRoll * 1 + tmp_long2) / 2; |
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; |
} |
if(cnt > EE_Parameter.Driftkomp) cnt = EE_Parameter.Driftkomp; |
if(IntegralFehlerRoll > FEHLER_LIMIT) AdNeutralRoll += cnt; |
if(IntegralFehlerRoll < -FEHLER_LIMIT) AdNeutralRoll -= cnt; |
DebugOut.Analog[27] = ausgleichRoll; |
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 |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
//DebugOut.Analog[26] = MesswertNick; |
//DebugOut.Analog[28] = MesswertRoll; |
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 * (2 * GyroFaktor) + Integral_Gier * IntegralFaktor / 2; |
DebugOut.Analog[25] = IntegralRoll * IntegralFaktor; |
DebugOut.Analog[31] = StickRoll;// / (26*IntegralFaktor); |
DebugOut.Analog[28] = MesswertRoll; |
// 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; |
} |
} |
if(GasMischanteil > MAX_GAS - 20) GasMischanteil = MAX_GAS - 20; |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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 > 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 > 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; |
#define GRENZE Poti1 |
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; |
// +++++++++++++++++++++++++++++++++++++++++++++++ |
} |
/tags/V0.68d/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 |
/tags/V0.68d/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><File path="spi.h"></File><File path="spi.c"></File></Project> |
/tags/V0.68d/flight.pnps |
---|
0,0 → 1,0 |
<pd><ViewState><e p="Flight-Ctrl" x="true"></e></ViewState></pd> |
/tags/V0.68d/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); |
/tags/V0.68d/main.c |
---|
0,0 → 1,248 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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 69 // 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; |
ExternControl.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; |
ExternControl.Config = 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 && !UpdateMotor) |
{ |
DatenUebertragung(); |
BearbeiteRxDaten(); |
} |
else BearbeiteRxDaten(); |
if(CheckDelay(timer)) |
{ |
if(UBat < EE_Parameter.UnterspannungsWarnung) |
{ |
if(BeepMuster == 0xffff) |
{ |
beeptime = 6000; |
BeepMuster = 0x0300; |
} |
} |
SPI_StartTransmitPacket();//# |
timer = SetDelay(100); |
} |
//if(UpdateMotor) DebugOut.Analog[26]++; |
} |
} |
return (1); |
} |
/tags/V0.68d/main.h |
---|
0,0 → 1,105 |
#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 |
/tags/V0.68d/makefile |
---|
0,0 → 1,422 |
#-------------------------------------------------------------------- |
# MCU name |
MCU = atmega644 |
F_CPU = 20000000 |
#------------------------------------------------------------------- |
HAUPT_VERSION = 0 |
NEBEN_VERSION = 68 |
VERSION_INDEX = 3 |
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 ($(MCU), atmega644p) |
FUSE_SETTINGS = -u -U lfuse:w:0xff:m -U hfuse:w:0xdf:m |
HEX_NAME = MEGA644 |
endif |
ifeq ($(F_CPU), 16000000) |
QUARZ = 16MHZ |
endif |
ifeq ($(F_CPU), 20000000) |
QUARZ = 20MHZ |
endif |
# Output format. (can be srec, ihex, binary) |
FORMAT = ihex |
# Target file name (without extension). |
ifeq ($(VERSION_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 = dt006 |
#AVRDUDE_PROGRAMMER = stk200 |
#AVRDUDE_PROGRAMMER = ponyser |
AVRDUDE_PROGRAMMER = avrispv2 |
#falls Ponyser ausgewählt wird, muss sich unsere avrdude-Configdatei im Bin-Verzeichnis des Compilers befinden |
#AVRDUDE_PORT = com1 # programmer connected to serial device |
#AVRDUDE_PORT = lpt1 # programmer connected to parallel port |
AVRDUDE_PORT = usb # programmer connected to USB |
#AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex |
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex $(FUSE_SETTINGS) |
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep |
#avrdude -c avrispv2 -P usb -p m32 -U flash:w:blink.hex |
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) |
# Uncomment the following if you want avrdude's erase cycle counter. |
# Note that this counter needs to be initialized first using -Yn, |
# see avrdude manual. |
#AVRDUDE_ERASE += -y |
# Uncomment the following if you do /not/ wish a verification to be |
# performed after programming the device. |
AVRDUDE_FLAGS += -V |
# Increase verbosity level. Please use this when submitting bug |
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude> |
# to submit bug reports. |
#AVRDUDE_FLAGS += -v -v |
# --------------------------------------------------------------------------- |
# Define directories, if needed. |
DIRAVR = c:/winavr |
DIRAVRBIN = $(DIRAVR)/bin |
DIRAVRUTILS = $(DIRAVR)/utils/bin |
DIRINC = . |
DIRLIB = $(DIRAVR)/avr/lib |
# Define programs and commands. |
SHELL = sh |
CC = avr-gcc |
OBJCOPY = avr-objcopy |
OBJDUMP = avr-objdump |
SIZE = avr-size |
# Programming support using avrdude. |
AVRDUDE = avrdude |
REMOVE = rm -f |
COPY = cp |
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex |
ELFSIZE = $(SIZE) -A $(TARGET).elf |
# Define Messages |
# English |
MSG_ERRORS_NONE = Errors: none |
MSG_BEGIN = -------- begin -------- |
MSG_END = -------- end -------- |
MSG_SIZE_BEFORE = Size before: |
MSG_SIZE_AFTER = Size after: |
MSG_COFF = Converting to AVR COFF: |
MSG_EXTENDED_COFF = Converting to AVR Extended COFF: |
MSG_FLASH = Creating load file for Flash: |
MSG_EEPROM = Creating load file for EEPROM: |
MSG_EXTENDED_LISTING = Creating Extended Listing: |
MSG_SYMBOL_TABLE = Creating Symbol Table: |
MSG_LINKING = Linking: |
MSG_COMPILING = Compiling: |
MSG_ASSEMBLING = Assembling: |
MSG_CLEANING = Cleaning project: |
# Define all object files. |
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) |
# Define all listing files. |
LST = $(ASRC:.S=.lst) $(SRC:.c=.lst) |
# Combine all necessary flags and optional flags. |
# Add target processor to flags. |
#ALL_CFLAGS = -mmcu=$(MCU) -DF_CPU=$(F_CPU) -I. $(CFLAGS) |
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) |
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) |
# Default target. |
all: begin gccversion sizebefore $(TARGET).elf $(TARGET).hex $(TARGET).eep \ |
$(TARGET).lss $(TARGET).sym sizeafter finished end |
# Eye candy. |
# AVR Studio 3.x does not check make's exit code but relies on |
# the following magic strings to be generated by the compile job. |
begin: |
@echo |
@echo $(MSG_BEGIN) |
finished: |
@echo $(MSG_ERRORS_NONE) |
end: |
@echo $(MSG_END) |
@echo |
# Display size of file. |
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 |
/tags/V0.68d/menu.c |
---|
0,0 → 1,133 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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 = 11,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; |
if(MenuePunkt < 10) {LCD_printfxy(17,0,"[%i]",MenuePunkt);} else {LCD_printfxy(16,0,"[%i]",MenuePunkt);}; |
switch(MenuePunkt) |
{ |
case 0: |
LCD_printfxy(0,0,"+ MikroKopter +"); |
LCD_printfxy(0,1,"HW:V%d.%d SW:%d.%d%c",PlatinenVersion/10,PlatinenVersion%10,VERSION_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; |
case 11: |
LCD_printfxy(0,0,"ExternControl " ); |
LCD_printfxy(0,1,"Ni:%4i Ro:%4i ",ExternControl.Nick,ExternControl.Roll); |
LCD_printfxy(0,2,"Gs:%4i Gi:%4i ",ExternControl.Gas,ExternControl.Gier); |
LCD_printfxy(0,3,"Hi:%4i Cf:%4i ",ExternControl.Hight,ExternControl.Config); |
break; |
default: MaxMenue = MenuePunkt - 1; |
MenuePunkt = 0; |
break; |
} |
RemoteTasten = 0; |
} |
/tags/V0.68d/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; |
/tags/V0.68d/old_macros.h |
---|
0,0 → 1,47 |
/* |
For backwards compatibility only. |
Ingo Busker ingo@mikrocontroller.com |
*/ |
#ifndef cbi |
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) |
#endif |
#ifndef sbi |
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) |
#endif |
#ifndef inb |
#define inb(sfr) _SFR_BYTE(sfr) |
#endif |
#ifndef outb |
#define outb(sfr, val) (_SFR_BYTE(sfr) = (val)) |
#endif |
#ifndef inw |
#define inw(sfr) _SFR_WORD(sfr) |
#endif |
#ifndef outw |
#define outw(sfr, val) (_SFR_WORD(sfr) = (val)) |
#endif |
#ifndef outp |
#define outp(val, sfr) outb(sfr, val) |
#endif |
#ifndef inp |
#define inp(sfr) inb(sfr) |
#endif |
#ifndef BV |
#define BV(bit) _BV(bit) |
#endif |
#ifndef PRG_RDB |
#define PRG_RDB pgm_read_byte |
#endif |
/tags/V0.68d/printf_P.c |
---|
0,0 → 1,480 |
// Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist nicht von der Lizenz für den MikroKopter-Teil unterstellt |
/* |
Copyright (C) 1993 Free Software Foundation |
This file is part of the GNU IO Library. This library is free |
software; you can redistribute it and/or modify it under the |
terms of the GNU General Public License as published by the |
Free Software Foundation; either version 2, or (at your option) |
any later version. |
This library is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this library; see the file COPYING. If not, write to the Free |
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
As a special exception, if you link this library with files |
compiled with a GNU compiler to produce an executable, this does not cause |
the resulting executable to be covered by the GNU General Public License. |
This exception does not however invalidate any other reasons why |
the executable file might be covered by the GNU General Public License. */ |
/* |
* Copyright (c) 1990 Regents of the University of California. |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. [rescinded 22 July 1999] |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
/****************************************************************************** |
This file is a patched version of printf called _printf_P |
It is made to work with avr-gcc for Atmel AVR MCUs. |
There are some differences from standard printf: |
1. There is no floating point support (with fp the code is about 8K!) |
2. Return type is void |
3. Format string must be in program memory (by using macro printf this is |
done automaticaly) |
4. %n is not implemented (just remove the comment around it if you need it) |
5. If LIGHTPRINTF is defined, the code is about 550 bytes smaller and the |
folowing specifiers are disabled : |
space # * . - + p s o O |
6. A function void uart_sendchar(char c) is used for output. The UART must |
be initialized before using printf. |
Alexander Popov |
sasho@vip.orbitel.bg |
******************************************************************************/ |
/* |
* Actual printf innards. |
* |
* This code is large and complicated... |
*/ |
#include <string.h> |
#ifdef __STDC__ |
#include <stdarg.h> |
#else |
#include <varargs.h> |
#endif |
#include "main.h" |
//#define LIGHTPRINTF |
char PrintZiel; |
char Putchar(char zeichen) |
{ |
if(PrintZiel == OUT_LCD) { DisplayBuff[DispPtr++] = zeichen; return(1);} |
else return(uart_putchar(zeichen)); |
} |
void PRINT(const char * ptr, unsigned int len) |
{ |
for(;len;len--) Putchar(*ptr++); |
} |
void PRINTP(const char * ptr, unsigned int len) |
{ |
for(;len;len--) Putchar(pgm_read_byte(ptr++)); |
} |
void PAD_SP(signed char howmany) |
{ |
for(;howmany>0;howmany--) Putchar(' '); |
} |
void PAD_0(signed char howmany) |
{ |
for(;howmany>0;howmany--) Putchar('0'); |
} |
#define BUF 40 |
/* |
* Macros for converting digits to letters and vice versa |
*/ |
#define to_digit(c) ((c) - '0') |
#define is_digit(c) ((c)<='9' && (c)>='0') |
#define to_char(n) ((n) + '0') |
/* |
* Flags used during conversion. |
*/ |
#define LONGINT 0x01 /* long integer */ |
#define LONGDBL 0x02 /* long double; unimplemented */ |
#define SHORTINT 0x04 /* short integer */ |
#define ALT 0x08 /* alternate form */ |
#define LADJUST 0x10 /* left adjustment */ |
#define ZEROPAD 0x20 /* zero (as opposed to blank) pad */ |
#define HEXPREFIX 0x40 /* add 0x or 0X prefix */ |
void _printf_P (char ziel,char const *fmt0, ...) /* Works with string from FLASH */ |
{ |
va_list ap; |
register const char *fmt; /* format string */ |
register char ch; /* character from fmt */ |
register int n; /* handy integer (short term usage) */ |
register char *cp; /* handy char pointer (short term usage) */ |
const char *fmark; /* for remembering a place in fmt */ |
register unsigned char flags; /* flags as above */ |
signed char width; /* width from format (%8d), or 0 */ |
signed char prec; /* precision from format (%.3d), or -1 */ |
char sign; /* sign prefix (' ', '+', '-', or \0) */ |
unsigned long _ulong=0; /* integer arguments %[diouxX] */ |
#define OCT 8 |
#define DEC 10 |
#define HEX 16 |
unsigned char base; /* base for [diouxX] conversion */ |
signed char dprec; /* a copy of prec if [diouxX], 0 otherwise */ |
signed char dpad; /* extra 0 padding needed for integers */ |
signed char fieldsz; /* field size expanded by sign, dpad etc */ |
/* The initialization of 'size' is to suppress a warning that |
'size' might be used unitialized. It seems gcc can't |
quite grok this spaghetti code ... */ |
signed char size = 0; /* size of converted field or string */ |
char buf[BUF]; /* space for %c, %[diouxX], %[eEfgG] */ |
char ox[2]; /* space for 0x hex-prefix */ |
PrintZiel = ziel; // bestimmt, LCD oder UART |
va_start(ap, fmt0); |
fmt = fmt0; |
/* |
* Scan the format for conversions (`%' character). |
*/ |
for (;;) { |
for (fmark = fmt; (ch = pgm_read_byte(fmt)) != '\0' && ch != '%'; fmt++) |
/* void */; |
if ((n = fmt - fmark) != 0) { |
PRINTP(fmark, n); |
} |
if (ch == '\0') |
goto done; |
fmt++; /* skip over '%' */ |
flags = 0; |
dprec = 0; |
width = 0; |
prec = -1; |
sign = '\0'; |
rflag: ch = PRG_RDB(fmt++); |
reswitch: |
#ifdef LIGHTPRINTF |
if (ch=='o' || ch=='u' || (ch|0x20)=='x') { |
#else |
if (ch=='u' || (ch|0x20)=='x') { |
#endif |
if (flags&LONGINT) { |
_ulong=va_arg(ap, unsigned long); |
} else { |
register unsigned int _d; |
_d=va_arg(ap, unsigned int); |
_ulong = flags&SHORTINT ? (unsigned long)(unsigned short)_d : (unsigned long)_d; |
} |
} |
#ifndef LIGHTPRINTF |
if(ch==' ') { |
/* |
* ``If the space and + flags both appear, the space |
* flag will be ignored.'' |
* -- ANSI X3J11 |
*/ |
if (!sign) |
sign = ' '; |
goto rflag; |
} else if (ch=='#') { |
flags |= ALT; |
goto rflag; |
} else if (ch=='*'||ch=='-') { |
if (ch=='*') { |
/* |
* ``A negative field width argument is taken as a |
* - flag followed by a positive field width.'' |
* -- ANSI X3J11 |
* They don't exclude field widths read from args. |
*/ |
if ((width = va_arg(ap, int)) >= 0) |
goto rflag; |
width = -width; |
} |
flags |= LADJUST; |
flags &= ~ZEROPAD; /* '-' disables '0' */ |
goto rflag; |
} else if (ch=='+') { |
sign = '+'; |
goto rflag; |
} else if (ch=='.') { |
if ((ch = PRG_RDB(fmt++)) == '*') { |
n = va_arg(ap, int); |
prec = n < 0 ? -1 : n; |
goto rflag; |
} |
n = 0; |
while (is_digit(ch)) { |
n = n*10 + to_digit(ch); |
ch = PRG_RDB(fmt++); |
} |
prec = n < 0 ? -1 : n; |
goto reswitch; |
} else |
#endif /* LIGHTPRINTF */ |
if (ch=='0') { |
/* |
* ``Note that 0 is taken as a flag, not as the |
* beginning of a field width.'' |
* -- ANSI X3J11 |
*/ |
if (!(flags & LADJUST)) |
flags |= ZEROPAD; /* '-' disables '0' */ |
goto rflag; |
} else if (ch>='1' && ch<='9') { |
n = 0; |
do { |
n = 10 * n + to_digit(ch); |
ch = PRG_RDB(fmt++); |
} while (is_digit(ch)); |
width = n; |
goto reswitch; |
} else if (ch=='h') { |
flags |= SHORTINT; |
goto rflag; |
} else if (ch=='l') { |
flags |= LONGINT; |
goto rflag; |
} else if (ch=='c') { |
*(cp = buf) = va_arg(ap, int); |
size = 1; |
sign = '\0'; |
} else if (ch=='D'||ch=='d'||ch=='i') { |
if(ch=='D') |
flags |= LONGINT; |
if (flags&LONGINT) { |
_ulong=va_arg(ap, long); |
} else { |
register int _d; |
_d=va_arg(ap, int); |
_ulong = flags&SHORTINT ? (long)(short)_d : (long)_d; |
} |
if ((long)_ulong < 0) { |
_ulong = -_ulong; |
sign = '-'; |
} |
base = DEC; |
goto number; |
} else |
/* |
if (ch=='n') { |
if (flags & LONGINT) |
*va_arg(ap, long *) = ret; |
else if (flags & SHORTINT) |
*va_arg(ap, short *) = ret; |
else |
*va_arg(ap, int *) = ret; |
continue; // no output |
} else |
*/ |
#ifndef LIGHTPRINTF |
if (ch=='O'||ch=='o') { |
if (ch=='O') |
flags |= LONGINT; |
base = OCT; |
goto nosign; |
} else if (ch=='p') { |
/* |
* ``The argument shall be a pointer to void. The |
* value of the pointer is converted to a sequence |
* of printable characters, in an implementation- |
* defined manner.'' |
* -- ANSI X3J11 |
*/ |
/* NOSTRICT */ |
_ulong = (unsigned int)va_arg(ap, void *); |
base = HEX; |
flags |= HEXPREFIX; |
ch = 'x'; |
goto nosign; |
} else if (ch=='s') { // print a string from RAM |
if ((cp = va_arg(ap, char *)) == NULL) { |
cp=buf; |
cp[0] = '('; |
cp[1] = 'n'; |
cp[2] = 'u'; |
cp[4] = cp[3] = 'l'; |
cp[5] = ')'; |
cp[6] = '\0'; |
} |
if (prec >= 0) { |
/* |
* can't use strlen; can only look for the |
* NUL in the first `prec' characters, and |
* strlen() will go further. |
*/ |
char *p = (char*)memchr(cp, 0, prec); |
if (p != NULL) { |
size = p - cp; |
if (size > prec) |
size = prec; |
} else |
size = prec; |
} else |
size = strlen(cp); |
sign = '\0'; |
} else |
#endif /* LIGHTPRINTF */ |
if(ch=='U'||ch=='u') { |
if (ch=='U') |
flags |= LONGINT; |
base = DEC; |
goto nosign; |
} else if (ch=='X'||ch=='x') { |
base = HEX; |
/* leading 0x/X only if non-zero */ |
if (flags & ALT && _ulong != 0) |
flags |= HEXPREFIX; |
/* unsigned conversions */ |
nosign: sign = '\0'; |
/* |
* ``... diouXx conversions ... if a precision is |
* specified, the 0 flag will be ignored.'' |
* -- ANSI X3J11 |
*/ |
number: if ((dprec = prec) >= 0) |
flags &= ~ZEROPAD; |
/* |
* ``The result of converting a zero value with an |
* explicit precision of zero is no characters.'' |
* -- ANSI X3J11 |
*/ |
cp = buf + BUF; |
if (_ulong != 0 || prec != 0) { |
register unsigned char _d,notlastdigit; |
do { |
notlastdigit=(_ulong>=base); |
_d = _ulong % base; |
if (_d<10) { |
_d+='0'; |
} else { |
_d+='a'-10; |
if (ch=='X') _d&=~0x20; |
} |
*--cp=_d; |
_ulong /= base; |
} while (notlastdigit); |
#ifndef LIGHTPRINTF |
// handle octal leading 0 |
if (base==OCT && flags & ALT && *cp != '0') |
*--cp = '0'; |
#endif |
} |
size = buf + BUF - cp; |
} else { //default |
/* "%?" prints ?, unless ? is NUL */ |
if (ch == '\0') |
goto done; |
/* pretend it was %c with argument ch */ |
cp = buf; |
*cp = ch; |
size = 1; |
sign = '\0'; |
} |
/* |
* All reasonable formats wind up here. At this point, |
* `cp' points to a string which (if not flags&LADJUST) |
* should be padded out to `width' places. If |
* flags&ZEROPAD, it should first be prefixed by any |
* sign or other prefix; otherwise, it should be blank |
* padded before the prefix is emitted. After any |
* left-hand padding and prefixing, emit zeroes |
* required by a decimal [diouxX] precision, then print |
* the string proper, then emit zeroes required by any |
* leftover floating precision; finally, if LADJUST, |
* pad with blanks. |
*/ |
/* |
* compute actual size, so we know how much to pad. |
*/ |
fieldsz = size; |
dpad = dprec - size; |
if (dpad < 0) |
dpad = 0; |
if (sign) |
fieldsz++; |
else if (flags & HEXPREFIX) |
fieldsz += 2; |
fieldsz += dpad; |
/* right-adjusting blank padding */ |
if ((flags & (LADJUST|ZEROPAD)) == 0) |
PAD_SP(width - fieldsz); |
/* prefix */ |
if (sign) { |
PRINT(&sign, 1); |
} else if (flags & HEXPREFIX) { |
ox[0] = '0'; |
ox[1] = ch; |
PRINT(ox, 2); |
} |
/* right-adjusting zero padding */ |
if ((flags & (LADJUST|ZEROPAD)) == ZEROPAD) |
PAD_0(width - fieldsz); |
/* leading zeroes from decimal precision */ |
PAD_0(dpad); |
/* the string or number proper */ |
PRINT(cp, size); |
/* left-adjusting padding (always blank) */ |
if (flags & LADJUST) |
PAD_SP(width - fieldsz); |
} |
done: |
va_end(ap); |
} |
/tags/V0.68d/printf_P.h |
---|
0,0 → 1,19 |
#ifndef _PRINTF_P_H_ |
#define _PRINTF_P_H_ |
#include <avr/pgmspace.h> |
#define OUT_V24 0 |
#define OUT_LCD 1 |
void _printf_P (char, char const *fmt0, ...); |
extern char PrintZiel; |
#define printf_P(format, args...) _printf_P(OUT_V24,format , ## args) |
#define printf(format, args...) _printf_P(OUT_V24,PSTR(format) , ## args) |
#define LCD_printfxy(x,y,format, args...) { DispPtr = y * 20 + x; _printf_P(OUT_LCD,PSTR(format) , ## args);} |
#define LCD_printf(format, args...) { _printf_P(OUT_LCD,PSTR(format) , ## args);} |
#endif |
/tags/V0.68d/rc.c |
---|
0,0 → 1,86 |
/*####################################################################################### |
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 = (7 * (PPM_in[index]) + signal) / 8; |
tmp = (3 * (PPM_in[index]) + signal) / 4; |
if(tmp > signal+1) tmp--; else |
if(tmp < signal-1) tmp++; |
if(SenderOkay >= 195) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; |
else PPM_diff[index] = 0; |
PPM_in[index] = tmp; |
} |
index++; |
if(index == 5) 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 |
} |
} |
} |
/tags/V0.68d/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 |
/tags/V0.68d/spi.c |
---|
0,0 → 1,113 |
// ######################## 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; |
unsigned char SPITransferCompleted, SPI_ChkSum; |
#ifdef USE_SPI_COMMUNICATION |
//------------------------------------------------------ |
void SPI_MasterInit(void) |
{ |
DDR_SPI |= (1<<DD_MOSI)|(1<<DD_SCK); // Set MOSI and SCK output, all others input |
SLAVE_SELECT_DDR_PORT |= (1 << SPI_SLAVE_SELECT); |
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(0<<SPIE); // Enable SPI, Master, set clock rate fck/64 |
SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); |
SPITransferCompleted = 1; |
ToNaviCtrl.Sync1 = 0x81; |
ToNaviCtrl.Sync2 = 0x55; |
ToNaviCtrl.Comp = 12; |
ToNaviCtrl.IntegralNick = 12345; |
ToNaviCtrl.IntegralRoll = 56789; |
ToNaviCtrl.StickNick = 100; |
ToNaviCtrl.StickRoll = 150;//(char) StickRoll; |
ToNaviCtrl.StickGier = 200;//(char) StickGier; |
} |
//------------------------------------------------------ |
void SPI_StartTransmitPacket(void) |
{ |
//if ((SLAVE_SELECT_PORT & (1 << SPI_SLAVE_SELECT)) == 0) return; // transfer of prev. packet not completed |
if (!SPITransferCompleted) return; |
SLAVE_SELECT_PORT &= ~(1 << SPI_SLAVE_SELECT); // SelectSlave |
SPITransferCompleted = 0; |
UpdateSPI_Buffer(); // update buffer |
SPI_BufferIndex = 1; |
DebugOut.Analog[16]++; |
// -- Debug-Output --- |
/* DebugOut.Analog[20] = FromNaviCtrl.Comp; |
DebugOut.Analog[21] = FromNaviCtrl.GPS_Nick; |
DebugOut.Analog[22] = FromNaviCtrl.GPS_Roll; |
DebugOut.Analog[23] = FromNaviCtrl.CompassValue; |
*/ |
//---- |
SPDR = ToNaviCtrl.Sync1; // Start transmission |
ToNaviCtrl.ChkSum = ToNaviCtrl.Sync1; |
} |
//------------------------------------------------------ |
//SIGNAL(SIG_SPI) |
void SPI_TransmitByte(void) |
{ |
if (!(SPSR & (1 << SPIF))) return; |
SLAVE_SELECT_PORT |= (1 << SPI_SLAVE_SELECT); // DeselectSlave |
if (SPI_BufferIndex < sizeof(FromNaviCtrl)) |
{ |
SPI_Buffer[SPI_BufferIndex]= SPDR; // get data |
// if (SPI_BufferIndex < 32 ) DebugOut.Analog[26+SPI_BufferIndex] = SPI_Buffer[SPI_BufferIndex]; |
//if(SPDR!= 0x00) DebugOut.Analog[19]++; ; |
} |
if (SPI_BufferIndex < sizeof(ToNaviCtrl)) |
{ |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
SLAVE_SELECT_PORT &= ~(1 << SPI_SLAVE_SELECT); // SelectSlave |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); asm volatile ("nop"); |
SPDR = Ptr_buffer[SPI_BufferIndex]; |
ToNaviCtrl.ChkSum += Ptr_buffer[SPI_BufferIndex]; |
} |
else |
{ |
unsigned char *ptr = (unsigned char *)&FromNaviCtrl; |
SPITransferCompleted = 1; |
memcpy(ptr, (unsigned char *) SPI_Buffer, sizeof(SPI_Buffer)); |
} |
SPI_BufferIndex++; |
} |
//------------------------------------------------------ |
void UpdateSPI_Buffer(void) |
{ |
/*static unsigned char i =0; |
cli(); |
ToNaviCtrl.Comp = SPI_PROTOCOL_COMP; |
ToNaviCtrl.IntegralNick = (int) (IntegralNick >> 4); |
ToNaviCtrl.IntegralRoll = (int) (IntegralRoll >> 4); |
ToNaviCtrl.StickNick = 4; |
ToNaviCtrl.StickRoll = 5;//(char) StickRoll; |
ToNaviCtrl.StickGier = 6;//(char) StickGier; |
sei(); |
*/ |
} |
#endif |
/tags/V0.68d/spi.h |
---|
0,0 → 1,89 |
// ######################## SPI - FlightCtrl ################### |
#ifndef _SPI_H |
#define _SPI_H |
//#define USE_SPI_COMMUNICATION |
#define SPI_PROTOCOL_COMP 1 |
//----------------------------------------- |
#define DDR_SPI DDRB |
#define DD_SS PB4 |
#define DD_SCK PB7 |
#define DD_MOSI PB5 |
#define DD_MISO PB6 |
// for compatibility reasons gcc3.x <-> gcc4.x |
#ifndef SPCR |
#define SPCR SPCR0 |
#endif |
#ifndef SPE |
#define SPE SPE0 |
#endif |
#ifndef MSTR |
#define MSTR MSTR0 |
#endif |
#ifndef SPR1 |
#define SPR1 SPR01 |
#endif |
#ifndef SPR0 |
#define SPR0 SPR00 |
#endif |
#ifndef SPIE |
#define SPIE SPIE0 |
#endif |
#ifndef SPDR |
#define SPDR SPDR0 |
#endif |
#ifndef SPIF |
#define SPIF SPIF0 |
#endif |
#ifndef SPSR |
#define SPSR SPSR0 |
#endif |
// ------------------------- |
#define SLAVE_SELECT_DDR_PORT DDRC |
#define SLAVE_SELECT_PORT PORTC |
#define SPI_SLAVE_SELECT PC5 |
struct str_ToNaviCtrl |
{ |
unsigned char Sync1, Sync2; |
unsigned char Comp; |
int IntegralNick; |
int IntegralRoll; |
char StickNick,StickRoll,StickGier; |
unsigned char ChkSum; |
}; |
struct str_FromNaviCtrl |
{ |
unsigned int Dummy; |
unsigned char Comp; |
int GPS_Nick; |
int GPS_Roll; |
int CompassValue; |
}; |
#ifdef USE_SPI_COMMUNICATION |
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); |
#else |
// -------------------------------- Dummy ----------------------------------------- |
#define SPI_MasterInit() ; |
#define SPI_StartTransmitPacket() ; |
#define UpdateSPI_Buffer() ; |
#define SPI_TransmitByte() ; |
#endif |
#endif |
/tags/V0.68d/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; |
} |
} |
/tags/V0.68d/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; |
/tags/V0.68d/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; |
} |
/tags/V0.68d/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 |
/tags/V0.68d/uart.c |
---|
0,0 → 1,399 |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + 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[4] = {0,0,0,0}; |
unsigned char MeineSlaveAdresse; |
unsigned char ConfirmFrame; |
struct str_DebugOut DebugOut; |
struct str_ExternControl ExternControl; |
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 'b': |
Decode64((unsigned char *) &ExternControl,sizeof(ExternControl),3,AnzahlEmpfangsBytes); |
RemoteTasten |= ExternControl.RemoteTasten; |
ConfirmFrame = ExternControl.Frame; |
break; |
case 'c': |
Decode64((unsigned char *) &ExternControl,sizeof(ExternControl),3,AnzahlEmpfangsBytes); |
RemoteTasten |= ExternControl.RemoteTasten; |
ConfirmFrame = ExternControl.Frame; |
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); |
ConfirmFrame = DubWiseKeys[3]; |
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 *) &ExternControl,sizeof(ExternControl)); |
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(ConfirmFrame && UebertragungAbgeschlossen) // Datensatz ohne CRC bestätigen |
{ |
SendeBuffer[0] = '#'; |
SendeBuffer[1] = ConfirmFrame; |
SendeBuffer[2] = '\r'; |
UebertragungAbgeschlossen = 0; |
ConfirmFrame = 0; |
UDR = SendeBuffer[0]; |
} |
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; |
} |
} |
/tags/V0.68d/uart.h |
---|
0,0 → 1,107 |
#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[4]; |
struct str_DebugOut |
{ |
unsigned char Digital[2]; |
unsigned int Analog[32]; // Debugwerte |
}; |
extern struct str_DebugOut DebugOut; |
struct str_ExternControl |
{ |
unsigned char Digital[2]; |
unsigned char RemoteTasten; |
signed char Nick; |
signed char Roll; |
signed char Gier; |
unsigned char Gas; |
signed char Hight; |
unsigned char free; |
unsigned char Frame; |
unsigned char Config; |
}; |
extern struct str_ExternControl ExternControl; |
struct str_VersionInfo |
{ |
unsigned char 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 |
/tags/V0.68d/version.txt |
---|
0,0 → 1,116 |
------- |
V0.53 27.04.2007 H.Buss |
- erste öffentliche Version |
V0.53b 29.04.2007 H.Buss |
- der FAKTOR_I war versehentlich auf Null, dann liegt der MikroKopter nicht so hart in der Luft |
V0.53c 29.04.2007 H.Buss |
- es gib ein Menü, in dem die Werte der Kanäle nach Nick, Roll, Gas,... sortiert sind. |
Die angezeigten Werte waren nicht die Werte der Funke |
V0.54 01.05.2007 H.Buss |
- die Paramtersätze können jetzt vor dem Start ausgewählt werden |
Dazu wird beim Kalibrieren der Messwerte (Gashebel oben links) der Nick-Rollhebel abgefragt: |
2 3 4 |
1 x 5 |
- - - |
Bedeutet: Nick-Rollhebel Links Mitte = Setting:1 Links Oben = Setting:2 usw. |
- der Faktor_I für den Hauptregler ist hinzugekommen. Im Heading-Hold-Modus sollte er vergössert werden, was Stabilität bringt |
V0.55 14.05.2007 H.Buss |
- es können nun Servos an J3,J4,J5 mit den Kanälen 5-7 gesteuert werden |
V0.56 14.05.2007 H.Buss |
- es gab Probleme mit Funken, die mehr als 8 Kanäle haben, wenn mehrere Kanäle dann auf Null waren |
- Funken, die nicht bis +-120 aussteuern können, sollten jetzt auch gehen |
V0.57 24.05.2007 H.Buss |
- Der Höhenregler kann nun auch mittels Schalter bedient werden |
- Bug im Gier-Algorithmus behoben; Schnelles Gieren fürhrte dazu, dass der MK zu weit gedreht hat |
- Kompass-Einfluss dämpfen bei Neigung |
- Man kann zwischen Kompass FIX (Richtung beim Kalibrieren) und Variabel (einstellbar per Gier) wählen |
- Der Motortest vom Kopter-Tool geht jetzt |
- Man kann den Parametersätzen einen Namen geben |
- Das Kamerasetting ist unter Setting 2 defaultmässig integriert |
V0.58 30.05.2007 H.Buss |
- Der Höhenregler-Algorithmus wird nun umgangen, wenn der Höhenreglerschalter aus ist |
V0.60 17.08.2007 H.Buss |
- "Schwindel-Bug" behoben |
- Die Poti-Werte werden jetzt auf Unterlauf (<0) überprüft |
- Poti4 zugefügt |
- Es werden jetzt 8 Kanäle ausgewertet |
- Kamera-Servo (an J7) |
- Die Settings müssen überschrieben werden |
V0.61 - V0.63 H.Buss 27.09.2007 |
- Poti 4 und Kanal 8 werden im Menü angezeigt |
- ein paar Kleinigkeiten bei den DefaultKonstanten2 bereinigt |
- Analog.c: Aktuell_ax korrigiert |
- auf 32 Debug-Kanäle erweitert |
- Loopings sind jetzt möglich und einzeln im KopterTool freischaltbar |
- leichte Anpassungen im Gier - Geschwindigkeit und Drift |
- die Hardwareversion V1.1 wird erkannt und das Programm stellt sich auf die geänderte Gyroverstärkung und die geänderten Portpins ein |
- die Software startet nach dem Einschalten schneller, weil der Luftdruckoffset schneller gefunden wird |
- die PPM-Ausgänge liegen wieder an den Pins an |
- Details an der Sensordatenverarbeitung -> es fliegt sich geringfügig anders |
- der MK ist bei wenig Gas nicht mehr so giftig -> soll das Landen vereinfachen |
- I2C-Bus läuft jetzt sicher nach einer Störung wieder an |
- Sticksignale werden präziser ausgewertet |
- Stick-Kanäle werden ans Kopter-Tool übertragen |
- Es muss die Version V1.47 des Kopter-Tool verwendet werden |
- Die Settings werden auf Default zurückgesetzt |
- am Piepen kann man die Fehlerart unterscheiden |
1. einzelnes Piepen beim Einschalten und Kalibrieren |
2. langsames Intervall mindestens 1 Sek -> Empfangsausfall |
3. schnelleres Intervall mindestens 1 Sek -> Akku |
4. sehr schnelles Intervall mindestens 1 Sek -> Kommunikation zu den Reglern gestört |
V0.64 H.Buss 30.09.2007 |
- beim Gieren wurden die Achsen nicht hart genug geregelt |
V0.65a H.Buss 15.10.2007 |
- Integral im Mischer wieder integriert |
- Feinabstimmung im ACC/Gyro Abgleich -> 1/32 & 100 |
- ACC/Gyro Abgleich auch bei HH |
V0.66a H.Buss 3.11.2007 |
- Messwertverarbeitung aus dem Analog-Interrupt entfernt |
- Analogmessung hängt jetzt am FC-Timing |
- Looping-Stick-Hysterese eingebaut |
- Looping-180°-Umschlag einstellbar |
- Achsenkopplung: Gierbewegung verkoppelt Nick und Roll |
- Lageregelung nach ACC-Sensor verbessert |
- zusätzlicher I-Anteil in der Lageregelung verbessert die Neutrallage |
- Gyrodriftkompensation überarbeitet |
- Bug in der Gier-Stick-Berechnung behoben |
- Gyro-Messung auf 1kHz beschleunigt |
V0.67a H.Buss 16.11.2007 |
- der Hauptregler-I-Anteil wirkt jetzt nur noch auf den Winkel (ausser im HH-Mode) |
- Gyro-Acc-Abgleich jetzt wieder in jedem Zyklus |
- Feinabstimmung |
- Beim HH-Modus gab es noch Bugs |
V0.67e H.Buss 29.11.2007 |
- Parameter: Dynamic Stability und Driftfaktor eingeführt |
- Die Namen der Analogwerte werden jetzt zum Koptertool übertragen |
- Kompatibilität zum Koptertool erhöht |
V0.67f H.Buss 04.12.2007 |
- Das Integral des Hauptreglers wird jetzt linear entladen und nicht mehr proportional |
- Schub für Gier wird jetzt auf den Gaswert begrenzt, dadurch steigt der MK nicht mehr beim Gieren. Gier ist allerdings nicht mehr so agressiv |
- Die ACC-Nullwerte können jetzt dauerhaft im EEPROM gespeichert werden (Stick:Vollgas und Gier rechts) |
V0.68a I.Busker 28.12.2007 |
- SPI.c & SPI.h ins Projekt aufgenommen |
SPI-Kommuikation kann in SPI.h aktiviert/deaktivert werden |
V0.68c H.Buss 05.01.2008 |
- Stickauswertung verbessert -> träger und präziser |
- Alle Settings angepasst |